26 #include <sys/types.h>
28 #include <sys/socket.h>
31 #include <sys/ioctl.h>
37 #ifdef HAVE_SYS_FILIO_H
38 #include <sys/filio.h>
58 char *getSocketName(
void)
60 static char socketName[
sizeof(
struct sockaddr_un)];
62 if (
'\0' == socketName[0])
67 socketNameEnv = getenv(
"PCSCLITE_CSOCK_NAME");
69 strlcpy(socketName, socketNameEnv,
sizeof(socketName));
71 strlcpy(socketName, PCSCLITE_CSOCK_NAME,
sizeof(socketName));
92 struct sockaddr_un svc_addr;
97 ret = socket(PF_UNIX, SOCK_STREAM, 0);
100 Log2(PCSC_LOG_CRITICAL,
"Error: create on client socket: %s",
106 socketName = getSocketName();
107 svc_addr.sun_family = AF_UNIX;
108 strncpy(svc_addr.sun_path, socketName,
sizeof(svc_addr.sun_path));
110 if (connect(*pdwClientID, (
struct sockaddr *) &svc_addr,
111 sizeof(svc_addr.sun_family) + strlen(svc_addr.sun_path) + 1) < 0)
113 Log3(PCSC_LOG_CRITICAL,
"Error: connect to client socket %s: %s",
114 socketName, strerror(errno));
115 (void)close(*pdwClientID);
120 if (ioctl(*pdwClientID, FIONBIO, &one) < 0)
122 Log3(PCSC_LOG_CRITICAL,
"Error: cannot set socket %s nonblocking: %s",
123 socketName, strerror(errno));
124 (void)close(*pdwClientID);
140 return close(dwClientID);
160 uint64_t buffer_size, int32_t filedes,
long timeOut)
162 char *buffer = buffer_void;
168 struct timeval start;
171 size_t remaining = buffer_size;
173 gettimeofday(&start, NULL);
176 while (remaining > 0)
179 struct timeval timeout, now;
183 gettimeofday(&now, NULL);
186 if (delta > timeOut*1000)
194 delta = timeOut*1000 - delta;
197 FD_SET(filedes, &read_fd);
199 timeout.tv_sec = delta/1000000;
200 timeout.tv_usec = delta - timeout.tv_sec*1000000;
202 selret = select(filedes + 1, &read_fd, NULL, NULL, &timeout);
209 if (!FD_ISSET(filedes, &read_fd))
215 readed = read(filedes, buffer, remaining);
222 }
else if (readed == 0)
231 if (errno != EINTR && errno != EAGAIN)
237 }
else if (selret == 0)
250 Log2(PCSC_LOG_INFO,
"Command 0x%X not yet finished", command);
256 Log2(PCSC_LOG_ERROR,
"select returns with failure: %s",
282 uint64_t size,
void *data_void)
290 ret =
MessageSend(&header,
sizeof(header), dwClientID);
317 INTERNAL LONG
MessageSend(
void *buffer_void, uint64_t buffer_size,
320 char *buffer = buffer_void;
326 size_t remaining = buffer_size;
329 while (remaining > 0)
335 FD_SET(filedes, &write_fd);
337 selret = select(filedes + 1, NULL, &write_fd, NULL, NULL);
344 if (!FD_ISSET(filedes, &write_fd))
355 written = send(filedes, buffer, remaining, MSG_NOSIGNAL);
358 written = write(filedes, buffer, remaining);
365 remaining -= written;
366 }
else if (written == 0)
375 if (errno != EINTR && errno != EAGAIN)
381 }
else if (selret == 0)
391 Log2(PCSC_LOG_ERROR,
"select returns with failure: %s",
418 char *buffer = buffer_void;
424 size_t remaining = buffer_size;
427 while (remaining > 0)
433 FD_SET(filedes, &read_fd);
435 selret = select(filedes + 1, &read_fd, NULL, NULL, NULL);
442 if (!FD_ISSET(filedes, &read_fd))
448 readed = read(filedes, buffer, remaining);
455 }
else if (readed == 0)
464 if (errno != EINTR && errno != EAGAIN)
476 Log2(PCSC_LOG_ERROR,
"select returns with failure: %s",