X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fsetsockopt.c;h=a31a10ee92aea53449f3b602eecaa68b39b40f61;hb=64ee293cdac319d0f38cd0d31e758a823b7163ad;hp=09f048e48a7e1a3b28a6a639c0812ae00124ab82;hpb=11ee0e1340f95ccb9954e522f6e003b3125eb109;p=gnulib.git diff --git a/lib/setsockopt.c b/lib/setsockopt.c index 09f048e48..a31a10ee9 100644 --- a/lib/setsockopt.c +++ b/lib/setsockopt.c @@ -1,6 +1,6 @@ /* setsockopt.c --- wrappers for Windows setsockopt 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,32 @@ /* Get winsock2.h. */ #include +/* Get struct timeval. */ +#include + /* Get set_winsock_errno, FD_TO_SOCKET etc. */ #include "w32sock.h" #undef setsockopt int -rpl_setsockopt (int fd, int level, int optname, const void *optval, int optlen) +rpl_setsockopt (int fd, int level, int optname, const void *optval, socklen_t optlen) { + int r; SOCKET sock = FD_TO_SOCKET (fd); - int r = setsockopt (sock, level, optname, optval, optlen); + + if (level == SOL_SOCKET && (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO)) + { + const struct timeval *tv = optval; + int milliseconds = tv->tv_sec * 1000 + tv->tv_usec / 1000; + optval = &milliseconds; + r = setsockopt (sock, level, optname, optval, sizeof (int)); + } + else + { + r = setsockopt (sock, level, optname, optval, optlen); + } + if (r < 0) set_winsock_errno ();