X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fsetsockopt.c;h=08afdae25d56c3fa0afeca11ec8ae2e31575d456;hb=cd56634a4a8179fd5a4419fbb3e27211b042ab1c;hp=a31a10ee92aea53449f3b602eecaa68b39b40f61;hpb=d60f3b0c6b0f93a601acd1cfd3923f94ca05abb0;p=gnulib.git diff --git a/lib/setsockopt.c b/lib/setsockopt.c index a31a10ee9..08afdae25 100644 --- a/lib/setsockopt.c +++ b/lib/setsockopt.c @@ -1,6 +1,6 @@ /* setsockopt.c --- wrappers for Windows setsockopt function - Copyright (C) 2008-2011 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,23 +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; - optval = &milliseconds; - r = setsockopt (sock, level, optname, optval, 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; + } }