| Index: src/tddl/tddl.c
|
| diff --git a/src/tddl/tddl.c b/src/tddl/tddl.c
|
| index a8fafd1aba663533d57489f83274d65abe9098de..b4f95b23c62b23d7f162006c2bb60b7364c5c2e4 100644
|
| --- a/src/tddl/tddl.c
|
| +++ b/src/tddl/tddl.c
|
| @@ -32,23 +32,89 @@ struct tpm_device_node tpm_device_nodes[] = {
|
| struct tpm_device_node *opened_device = NULL;
|
|
|
| BYTE txBuffer[TDDL_TXBUF_SIZE];
|
| +TSS_BOOL use_in_socket = FALSE;
|
| +struct tcsd_config *_tcsd_options = NULL;
|
| +
|
| +#include <sys/socket.h>
|
| +#include <sys/un.h>
|
| +#include <netinet/in.h>
|
| +#include <sys/types.h>
|
| +#include <netdb.h>
|
| +#include <fcntl.h>
|
| +
|
|
|
| int
|
| -open_device(void)
|
| +open_device()
|
| {
|
| - int i;
|
| -
|
| - /* tpm_device_paths is filled out in tddl.h */
|
| - for (i = 0; tpm_device_nodes[i].path != NULL; i++) {
|
| - errno = 0;
|
| - if ((tpm_device_nodes[i].fd = open(tpm_device_nodes[i].path, O_RDWR)) < 0)
|
| - continue;
|
| -
|
| + int i = 0, fd = -1, tcp_device_port;
|
| + char *tcp_device_hostname = NULL;
|
| + char *un_socket_device_path = NULL;
|
| + char *tcp_device_port_string = NULL;
|
| +
|
| + if (getenv("TCSD_USE_TCP_DEVICE")) {
|
| + if ((tcp_device_hostname = getenv("TCSD_TCP_DEVICE_HOSTNAME")) == NULL)
|
| + tcp_device_hostname = "localhost";
|
| + if ((un_socket_device_path = getenv("TCSD_UN_SOCKET_DEVICE_PATH")) == NULL)
|
| + un_socket_device_path = "/var/run/tpm/tpmd_socket:0";
|
| + if ((tcp_device_port_string = getenv("TCSD_TCP_DEVICE_PORT")) != NULL)
|
| + tcp_device_port = atoi(tcp_device_port_string);
|
| + else
|
| + tcp_device_port = 6545;
|
| +
|
| +
|
| + fd = socket(AF_INET, SOCK_STREAM, 0);
|
| + if (fd > 0) {
|
| + struct hostent *host = gethostbyname(tcp_device_hostname);
|
| + if (host != NULL) {
|
| + struct sockaddr_in addr;
|
| + memset(&addr, 0x0, sizeof(addr));
|
| + addr.sin_family = host->h_addrtype;
|
| + addr.sin_port = htons(tcp_device_port);
|
| + memcpy(&addr.sin_addr,
|
| + host->h_addr,
|
| + host->h_length);
|
| + if (connect(fd, (struct sockaddr *)&addr,
|
| + sizeof(addr)) < 0) {
|
| + close(fd);
|
| + fd = -1;
|
| + } else
|
| + use_in_socket = TRUE;
|
| + } else {
|
| + close (fd);
|
| + fd = -1;
|
| + }
|
| + }
|
| +
|
| + if (fd < 0) {
|
| + struct sockaddr_un addr;
|
| +
|
| + fd = socket(AF_UNIX, SOCK_STREAM, 0);
|
| + if (fd >= 0) {
|
| + addr.sun_family = AF_UNIX;
|
| + strncpy(addr.sun_path, un_socket_device_path,
|
| + sizeof(addr.sun_path));
|
| + if (connect(fd, (void *)&addr, sizeof(addr)) < 0) {
|
| + close(fd);
|
| + fd = -1;
|
| + }
|
| + }
|
| + }
|
| + }
|
| +
|
| + if (fd < 0) {
|
| + /* tpm_device_paths is filled out in tddl.h */
|
| + for (i = 0; tpm_device_nodes[i].path != NULL; i++) {
|
| + errno = 0;
|
| + if ((fd = open(tpm_device_nodes[i].path, O_RDWR)) >= 0)
|
| + break;
|
| + }
|
| + }
|
| +
|
| + if (fd > 0) {
|
| opened_device = &(tpm_device_nodes[i]);
|
| - return opened_device->fd;
|
| + tpm_device_nodes[i].fd = fd;
|
| }
|
| -
|
| - return -1;
|
| + return fd;
|
| }
|
|
|
| TSS_RESULT
|
| @@ -104,6 +170,12 @@ Tddli_TransmitData(BYTE * pTransmitBuf, UINT32 TransmitBufLen, BYTE * pReceiveBu
|
| memcpy(txBuffer, pTransmitBuf, TransmitBufLen);
|
| LogDebug("Calling write to driver");
|
|
|
| + if (use_in_socket) {
|
| + Tddli_Close();
|
| + if (Tddli_Open())
|
| + return TDDLERR(TDDL_E_IOERROR);
|
| + }
|
| +
|
| switch (opened_device->transmit) {
|
| case TDDL_UNDEF:
|
| /* fall through */
|
|
|