#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/un.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include "config.h"
#ifdef PCSC_TARGET_SOLARIS
#include <sys/filio.h>
#endif
#include "wintypes.h"
#include "pcsclite.h"
#include "winscard.h"
#include "winscard_msg.h"
#include "sys_generic.h"
#include "debuglog.h"
int MSGSendData(int filedes, int blockAmount, const void *data,
unsigned int dataSize)
{
int retval = 0;
time_t start = time(0);
unsigned char *buffer = (unsigned char *) data;
size_t remaining = dataSize;
while (remaining > 0)
{
fd_set write_fd;
struct timeval timeout;
int selret;
FD_ZERO(&write_fd);
FD_SET(filedes, &write_fd);
timeout.tv_usec = 0;
if ((timeout.tv_sec = start + blockAmount - time(0)) < 0)
{
retval = -1;
break;
}
selret = select(filedes + 1, NULL, &write_fd, NULL, &timeout);
if (selret > 0)
{
int written;
if (!FD_ISSET(filedes, &write_fd))
{
retval = -1;
break;
}
written = write(filedes, buffer, remaining);
if (written > 0)
{
buffer += written;
remaining -= written;
} else if (written == 0)
{
retval = -1;
break;
} else
{
if (errno != EINTR && errno != EAGAIN)
{
retval = -1;
break;
}
}
} else if (selret == 0)
{
retval = -1;
break;
} else
{
if (errno != EINTR)
{
DebugLogB
("MSGServerProcessEvents: Select returns with failure: %s",
strerror(errno));
retval = -1;
break;
}
}
}
return retval;
}
int MSGRecieveData(int filedes, int blockAmount, void *data,
unsigned int dataSize)
{
int retval = 0;
time_t start = time(0);
unsigned char *buffer = (unsigned char *) data;
size_t remaining = dataSize;
while (remaining > 0)
{
fd_set read_fd;
struct timeval timeout;
int selret;
FD_ZERO(&read_fd);
FD_SET(filedes, &read_fd);
timeout.tv_usec = 0;
if ((timeout.tv_sec = start + blockAmount - time(0)) < 0)
{
retval = -1;
break;
}
selret = select(filedes + 1, &read_fd, NULL, NULL, &timeout);
if (selret > 0)
{
int readed;
if (!FD_ISSET(filedes, &read_fd))
{
retval = -1;
break;
}
readed = read(filedes, buffer, remaining);
if (readed > 0)
{
buffer += readed;
remaining -= readed;
} else if (readed == 0)
{
retval = -1;
break;
} else
{
if (errno != EINTR && errno != EAGAIN)
{
retval = -1;
break;
}
}
} else if (selret == 0)
{
retval = -1;
break;
} else
{
if (errno != EINTR)
{
DebugLogB
("MSGServerProcessEvents: Select returns with failure: %s",
strerror(errno));
retval = -1;
break;
}
}
}
return retval;
}