X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fsetsockopt.c;h=08afdae25d56c3fa0afeca11ec8ae2e31575d456;hb=46f5f314f34a08c9305758482d7d2fdb0e999d09;hp=96a00cc2e7492e19265eae172e6175fc0befb53a;hpb=6aebe8304ac5fcc50de5042107fada53612d552e;p=gnulib.git diff --git a/lib/setsockopt.c b/lib/setsockopt.c index 96a00cc2e..08afdae25 100644 --- a/lib/setsockopt.c +++ b/lib/setsockopt.c @@ -1,6 +1,6 @@ /* setsockopt.c --- wrappers for Windows setsockopt function - Copyright (C) 2008-2009 Free Software Foundation, Inc. + Copyright (C) 2008-2014 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 @@ -34,22 +34,32 @@ int rpl_setsockopt (int fd, int level, int optname, const void *optval, socklen_t optlen) { - int r; SOCKET sock = FD_TO_SOCKET (fd); + int r; - if (level == SOL_SOCKET && (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO)) + if (sock == INVALID_SOCKET) { - const struct timeval *tv = optval; - int milliseconds = tv->tv_sec * 1000 + tv->tv_usec / 1000; - r = setsockopt (sock, level, optname, &milliseconds, sizeof (int)); + errno = EBADF; + return -1; } else { - 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 (); + if (r < 0) + set_winsock_errno (); - return r; + return r; + } }