[Pcsclite-cvs-commit] r5373 - in /trunk/PCSC/src: winscard_clnt.c winscard_msg.c

rousseau at users.alioth.debian.org rousseau at users.alioth.debian.org
Thu Nov 4 09:50:06 UTC 2010


Author: rousseau
Date: Thu Nov  4 09:49:59 2010
New Revision: 5373

URL: http://svn.debian.org/wsvn/pcsclite/?sc=1&rev=5373
Log:
It is now possible to configure the local socket name to use using the
environment variable PCSCLITE_CSOCK_NAME

This is used by Estobuntu LTSP to redirect the smart card reader on the
light terminal display to the application running on the server.
They use a patched SSH version to redirect /var/run/pcscd/pcscd.comm on
the client to ~/.pcscd.comm on the server.

Modified:
    trunk/PCSC/src/winscard_clnt.c
    trunk/PCSC/src/winscard_msg.c

Modified: trunk/PCSC/src/winscard_clnt.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/winscard_clnt.c?rev=5373&op=diff
==============================================================================
--- trunk/PCSC/src/winscard_clnt.c (original)
+++ trunk/PCSC/src/winscard_clnt.c Thu Nov  4 09:49:59 2010
@@ -3650,13 +3650,15 @@
 	LONG rv;
 	struct stat statBuffer;
 	int need_restart = 0;
-
-	rv = stat(PCSCLITE_CSOCK_NAME, &statBuffer);
+	char *socketName;
+
+	socketName = getSocketName();
+	rv = stat(socketName, &statBuffer);
 
 	if (rv != 0)
 	{
-		Log2(PCSC_LOG_INFO, "PCSC Not Running: " PCSCLITE_CSOCK_NAME ": %s",
-			strerror(errno));
+		Log3(PCSC_LOG_INFO, "PCSC Not Running: %s: %s",
+			socketName, strerror(errno));
 		return SCARD_E_NO_SERVICE;
 	}
 

Modified: trunk/PCSC/src/winscard_msg.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/winscard_msg.c?rev=5373&op=diff
==============================================================================
--- trunk/PCSC/src/winscard_msg.c (original)
+++ trunk/PCSC/src/winscard_msg.c Thu Nov  4 09:49:59 2010
@@ -33,6 +33,7 @@
 #include <stdio.h>
 #include <time.h>
 #include <string.h>
+#include <stdlib.h>
 #ifdef HAVE_SYS_FILIO_H
 #include <sys/filio.h>
 #endif
@@ -44,6 +45,7 @@
 #include "winscard_msg.h"
 #include "sys_generic.h"
 #include "utils.h"
+#include "strlcpycat.h"
 
 #ifdef PCSCD
 
@@ -67,6 +69,25 @@
 #else
 
 /* functions used by libpcsclite only */
+
+char *getSocketName(void)
+{
+	static char socketName[sizeof(struct sockaddr_un)];
+
+	if ('\0' == socketName[0])
+	{
+		/* socket name not yet initialized */
+		char *socketNameEnv;
+
+		socketNameEnv = getenv("PCSCLITE_CSOCK_NAME");
+		if (socketNameEnv)
+			strlcpy(socketName, socketNameEnv, sizeof(socketName));
+		else
+			strlcpy(socketName, PCSCLITE_CSOCK_NAME, sizeof(socketName));
+	}
+
+	return socketName;
+}
 
 /**
  * @brief Prepares a communication channel for the client to talk to the server.
@@ -86,6 +107,7 @@
 	struct sockaddr_un svc_addr;
 	int one;
 	int ret;
+	char *socketName;
 
 	ret = socket(PF_UNIX, SOCK_STREAM, 0);
 	if (ret < 0)
@@ -96,15 +118,15 @@
 	}
 	*pdwClientID = ret;
 
+	socketName = getSocketName();
 	svc_addr.sun_family = AF_UNIX;
-	strncpy(svc_addr.sun_path, PCSCLITE_CSOCK_NAME,
-		sizeof(svc_addr.sun_path));
+	strncpy(svc_addr.sun_path, socketName, sizeof(svc_addr.sun_path));
 
 	if (connect(*pdwClientID, (struct sockaddr *) &svc_addr,
 			sizeof(svc_addr.sun_family) + strlen(svc_addr.sun_path) + 1) < 0)
 	{
 		Log3(PCSC_LOG_CRITICAL, "Error: connect to client socket %s: %s",
-			PCSCLITE_CSOCK_NAME, strerror(errno));
+			socketName, strerror(errno));
 		(void)close(*pdwClientID);
 		return -1;
 	}
@@ -113,7 +135,7 @@
 	if (ioctl(*pdwClientID, FIONBIO, &one) < 0)
 	{
 		Log3(PCSC_LOG_CRITICAL, "Error: cannot set socket %s nonblocking: %s",
-			PCSCLITE_CSOCK_NAME, strerror(errno));
+			socketName, strerror(errno));
 		(void)close(*pdwClientID);
 		return -1;
 	}




More information about the Pcsclite-cvs-commit mailing list