int WSACleanup(void)
{
- guint32 i;
-
#ifdef DEBUG
g_message ("%s: cleaning up", __func__);
#endif
{
gpointer handle = GUINT_TO_POINTER (fd);
int ret;
-
+ struct timeval tv;
+ void *tmp_val;
+
if (startup_count == 0) {
WSASetLastError (WSANOTINITIALISED);
return(SOCKET_ERROR);
WSASetLastError (WSAENOTSOCK);
return(SOCKET_ERROR);
}
-
- ret = getsockopt (fd, level, optname, optval, optlen);
+
+ tmp_val = optval;
+ if (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO) {
+ tmp_val = &tv;
+ *optlen = sizeof (tv);
+ }
+
+ ret = getsockopt (fd, level, optname, tmp_val, optlen);
if (ret == -1) {
gint errnum = errno;
#ifdef DEBUG
return(SOCKET_ERROR);
}
+
+ if (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO) {
+ *((int *) optval) = tv.tv_sec * 1000 + tv.tv_usec;
+ *optlen = sizeof (int);
+ }
return(ret);
}
{
gpointer handle = GUINT_TO_POINTER (fd);
int ret;
+ const void *tmp_val;
+ struct timeval tv;
if (startup_count == 0) {
WSASetLastError (WSANOTINITIALISED);
WSASetLastError (WSAENOTSOCK);
return(SOCKET_ERROR);
}
-
- ret = setsockopt (fd, level, optname, optval, optlen);
+
+ tmp_val = optval;
+ if (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO) {
+ int ms = *((int *) optval);
+ tv.tv_sec = ms / 1000;
+ tv.tv_usec = ms % 1000;
+ tmp_val = &tv;
+ optlen = sizeof (tv);
+ }
+
+ ret = setsockopt (fd, level, optname, tmp_val, optlen);
if (ret == -1) {
gint errnum = errno;
#ifdef DEBUG