| Index: tpmd/unix/tpmd.c
|
| diff --git a/tpmd/tpmd.c b/tpmd/unix/tpmd.c
|
| similarity index 89%
|
| rename from tpmd/tpmd.c
|
| rename to tpmd/unix/tpmd.c
|
| index aa220e992078053fc1b7ed5e57bfdd0b9a4aaaa1..061ef48057d7d77ea09637564056369e71cc31ba 100644
|
| --- a/tpmd/tpmd.c
|
| +++ b/tpmd/unix/tpmd.c
|
| @@ -1,6 +1,5 @@
|
| -/* Software-Based Trusted Platform Module (TPM) Emulator for Linux
|
| - * Copyright (C) 2006 Mario Strasser <mast@gmx.net>,
|
| - * Swiss Federal Institute of Technology (ETH) Zurich
|
| +/* Software-based Trusted Platform Module (TPM) Emulator
|
| + * Copyright (C) 2004-2010 Mario Strasser <mast@gmx.net>
|
| *
|
| * This program is free software; you can redistribute it and/or modify
|
| * it under the terms of the GNU General Public License as published
|
| @@ -12,7 +11,7 @@
|
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
| * GNU General Public License for more details.
|
| *
|
| - * $Id$
|
| + * $Id: tpmd.c 405 2010-02-18 23:11:31Z mast $
|
| */
|
|
|
| #include <stdio.h>
|
| @@ -42,10 +41,10 @@ static int opt_debug = 0;
|
| static int opt_foreground = 0;
|
| static const char *opt_socket_name = TPM_SOCKET_NAME;
|
| static const char *opt_storage_file = TPM_STORAGE_NAME;
|
| -
|
| static uid_t opt_uid = 0;
|
| static gid_t opt_gid = 0;
|
| static int tpm_startup = 2;
|
| +static uint32_t tpm_config = 0;
|
| static int rand_fh;
|
|
|
| void *tpm_malloc(size_t size)
|
| @@ -63,10 +62,21 @@ void tpm_log(int priority, const char *fmt, ...)
|
| va_list ap, bp;
|
| va_start(ap, fmt);
|
| va_copy(bp, ap);
|
| - vsyslog(priority, fmt, ap);
|
| + switch (priority) {
|
| + case TPM_LOG_DEBUG:
|
| + vsyslog(LOG_DEBUG, fmt, ap);
|
| + break;
|
| + case TPM_LOG_ERROR:
|
| + vsyslog(LOG_ERR, fmt, ap);
|
| + break;
|
| + case TPM_LOG_INFO:
|
| + default:
|
| + vsyslog(LOG_INFO, fmt, ap);
|
| + break;
|
| + }
|
| va_end(ap);
|
| - if (!is_daemon && (priority != LOG_DEBUG || opt_debug)) {
|
| - vprintf(fmt, bp);
|
| + if (!is_daemon && (priority != TPM_LOG_DEBUG || opt_debug)) {
|
| + vprintf(fmt, bp);
|
| }
|
| va_end(bp);
|
| }
|
| @@ -103,12 +113,12 @@ int tpm_write_to_storage(uint8_t *data, size_t data_length)
|
| if (fh < 0) return -1;
|
| while (data_length > 0) {
|
| res = write(fh, data, data_length);
|
| - if (res < 0) {
|
| - close(fh);
|
| - return -1;
|
| - }
|
| - data_length -= res;
|
| - data += res;
|
| + if (res < 0) {
|
| + close(fh);
|
| + return -1;
|
| + }
|
| + data_length -= res;
|
| + data += res;
|
| }
|
| close(fh);
|
| return 0;
|
| @@ -131,13 +141,14 @@ int tpm_read_from_storage(uint8_t **data, size_t *data_length)
|
| *data_length = 0;
|
| while (total_length > 0) {
|
| res = read(fh, &(*data)[*data_length], total_length);
|
| - if (res < 0) {
|
| - close(fh);
|
| - tpm_free(*data);
|
| - return -1;
|
| - }
|
| + if (res < 0) {
|
| + close(fh);
|
| + tpm_free(*data);
|
| + return -1;
|
| + }
|
| + if (res == 0) break;
|
| *data_length += res;
|
| - total_length -= res;
|
| + total_length -= res;
|
| }
|
| close(fh);
|
| return 0;
|
| @@ -166,7 +177,7 @@ static void parse_options(int argc, char **argv)
|
| opt_uid = getuid();
|
| opt_gid = getgid();
|
| info("parsing options");
|
| - while ((c = getopt (argc, argv, "dfs:u:o:g:h")) != -1) {
|
| + while ((c = getopt (argc, argv, "dfs:u:o:g:c:h")) != -1) {
|
| debug("handling option '-%c'", c);
|
| switch (c) {
|
| case 'd':
|
| @@ -202,6 +213,9 @@ static void parse_options(int argc, char **argv)
|
| }
|
| opt_gid = grp->gr_gid;
|
| break;
|
| + case 'c':
|
| + tpm_config = strtol(optarg, NULL, 0);
|
| + break;
|
| case '?':
|
| error("unknown option '-%c'", optopt);
|
| print_usage(argv[0]);
|
| @@ -379,8 +393,8 @@ static void main_loop(void)
|
| if (sock < 0) exit(EXIT_FAILURE);
|
| /* init tpm emulator */
|
| mkdirs(opt_storage_file);
|
| - debug("initializing TPM emulator: %d", tpm_startup);
|
| - tpm_emulator_init(tpm_startup);
|
| + debug("initializing TPM emulator");
|
| + tpm_emulator_init(tpm_startup, tpm_config);
|
| /* start command processing */
|
| while (!stopflag) {
|
| /* wait for incomming connections */
|
| @@ -433,13 +447,15 @@ static void main_loop(void)
|
| error("tpm_handle_command() failed");
|
| } else {
|
| debug("sending %d bytes", out_len);
|
| - while (out_len > 0) {
|
| - res = write(fh, out, out_len);
|
| + uint32_t len = 0;
|
| + while (len < out_len) {
|
| + res = write(fh, &out[len], out_len - len);
|
| if (res < 0) {
|
| - error("write(%d) failed: %s", out_len, strerror(errno));
|
| + error("write(%d) failed: %s",
|
| + out_len - len, strerror(errno));
|
| break;
|
| }
|
| - out_len -= res;
|
| + len += res;
|
| }
|
| tpm_free(out);
|
| }
|
| @@ -465,15 +481,16 @@ int main(int argc, char **argv)
|
| parse_options(argc, argv);
|
| /* switch uid/gid if required */
|
| switch_uid_gid();
|
| - /* open random device */
|
| - init_random();
|
| /* init signal handlers */
|
| init_signal_handler();
|
| /* unless requested otherwiese, fork and daemonize process */
|
| if (!opt_foreground) daemonize();
|
| + /* open random device */
|
| + init_random();
|
| /* start main processing loop */
|
| main_loop();
|
| info("stopping TPM Emulator daemon");
|
| + close(rand_fh);
|
| closelog();
|
| - return 0;
|
| + return EXIT_SUCCESS;
|
| }
|
|
|