# Define Solaris-specific device paths. # Add error message if path can't be opened. # This change was implemented in-house. # Except for the open() error message, it is not suitable for upstream use. # --- src/tddl/tddl.c 2014-04-24 11:05:44.000000000 -0700 +++ src/tddl/tddl.c 2016-06-20 11:45:31.929095585 -0700 @@ -18,13 +18,17 @@ #include "trousers/tss.h" #include "trousers_types.h" +#ifndef SOLARIS #include "linux/tpm.h" +#endif #include "tcslog.h" #include "tddl.h" struct tpm_device_node tpm_device_nodes[] = { +#ifndef SOLARIS {"/dev/tpm0", TDDL_UNDEF, TDDL_UNDEF}, {"/udev/tpm0", TDDL_UNDEF, TDDL_UNDEF}, +#endif {"/dev/tpm", TDDL_UNDEF, TDDL_UNDEF}, {NULL, 0, 0} }; @@ -42,6 +46,18 @@ #include #include +#ifdef SOLARIS +int +get_device_fd(void) +{ + if (opened_device != NULL) { + return (opened_device->fd); + } else { + LogDebug("No opened TPM device"); + return (-1); + } +} +#endif int open_device() @@ -55,7 +71,7 @@ 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"; + un_socket_device_path = TCSD_DEFAULT_SOCKET; if ((tcp_device_port_string = getenv("TCSD_TCP_DEVICE_PORT")) != NULL) tcp_device_port = atoi(tcp_device_port_string); else @@ -63,7 +79,7 @@ fd = socket(AF_INET, SOCK_STREAM, 0); - if (fd > 0) { + if (fd >= 0) { struct hostent *host = gethostbyname(tcp_device_hostname); if (host != NULL) { struct sockaddr_in addr; @@ -105,12 +121,16 @@ /* 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) + if ((fd = open(tpm_device_nodes[i].path, O_RDWR)) >= 0) { break; + } else { + fprintf(stderr, "Error opening %s: %s\n", + tpm_device_nodes[i].path, strerror(errno)); + } } } - - if (fd > 0) { + + if (fd >= 0) { opened_device = &(tpm_device_nodes[i]); tpm_device_nodes[i].fd = fd; } @@ -181,11 +201,13 @@ /* fall through */ case TDDL_TRANSMIT_IOCTL: errno = 0; +#ifndef SOLARIS if ((sizeResult = ioctl(opened_device->fd, TPMIOC_TRANSMIT, txBuffer)) != -1) { opened_device->transmit = TDDL_TRANSMIT_IOCTL; break; } LogWarn("ioctl: (%d) %s", errno, strerror(errno)); +#endif LogInfo("Falling back to Read/Write device support."); /* fall through */ case TDDL_TRANSMIT_RW: @@ -255,6 +277,7 @@ TSS_RESULT Tddli_Cancel(void) { +#ifndef SOLARIS int rc; if (opened_device->transmit == TDDL_TRANSMIT_IOCTL) { @@ -270,4 +293,7 @@ } else { return TDDLERR(TSS_E_NOTIMPL); } +#else + return TDDLERR(TSS_E_NOTIMPL); +#endif /* SOLARIS */ }