X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fgetsockopt.c;h=c136772a85d15b40bb5c6b09ebfc9bae3e5da3be;hb=52feca2cda2edd985d76117836e2a522178e9ab3;hp=7be8bed51b86c0fedfb560186b256e3868dd7661;hpb=11ee0e1340f95ccb9954e522f6e003b3125eb109;p=gnulib.git diff --git a/lib/getsockopt.c b/lib/getsockopt.c index 7be8bed51..c136772a8 100644 --- a/lib/getsockopt.c +++ b/lib/getsockopt.c @@ -1,6 +1,6 @@ /* getsockopt.c --- wrappers for Windows getsockopt function - Copyright (C) 2008 Free Software Foundation, Inc. + Copyright (C) 2008-2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,16 +23,43 @@ /* Get winsock2.h. */ #include +/* Get struct timeval. */ +#include + +/* Get memcpy. */ +#include + /* Get set_winsock_errno, FD_TO_SOCKET etc. */ #include "w32sock.h" #undef getsockopt int -rpl_getsockopt (int fd, int level, int optname, void *optval, int *optlen) +rpl_getsockopt (int fd, int level, int optname, void *optval, socklen_t *optlen) { + int r; SOCKET sock = FD_TO_SOCKET (fd); - int r = getsockopt (sock, level, optname, optval, optlen); + + if (level == SOL_SOCKET && (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO)) + { + int milliseconds; + int milliseconds_len = sizeof (int); + struct timeval tv; + size_t n; + r = getsockopt (sock, level, optname, &milliseconds, &milliseconds_len); + tv.tv_sec = milliseconds / 1000; + tv.tv_usec = (milliseconds - 1000 * tv.tv_sec) * 1000; + n = sizeof (struct timeval); + if (n > *optlen) + n = *optlen; + memcpy (optval, &tv, n); + *optlen = n; + } + else + { + r = getsockopt (sock, level, optname, optval, optlen); + } + if (r < 0) set_winsock_errno ();