X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fgetsockopt.c;h=22176649d95e1c8fce1f663cbc8ef97a6f9b4ea0;hb=9be7a7f2520e9d3dd7ff625823b0ca77de1137e6;hp=128edd6df893e09c8216adb0f46e468997a88a0b;hpb=6aebe8304ac5fcc50de5042107fada53612d552e;p=gnulib.git diff --git a/lib/getsockopt.c b/lib/getsockopt.c index 128edd6df..22176649d 100644 --- a/lib/getsockopt.c +++ b/lib/getsockopt.c @@ -1,6 +1,6 @@ /* getsockopt.c --- wrappers for Windows getsockopt function - Copyright (C) 2008-2009 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 @@ -37,31 +37,43 @@ int rpl_getsockopt (int fd, int level, int optname, void *optval, socklen_t *optlen) { - int r; SOCKET sock = FD_TO_SOCKET (fd); - if (level == SOL_SOCKET && (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO)) + if (sock == INVALID_SOCKET) { - 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; + errno = EBADF; + return -1; } else { - r = getsockopt (sock, level, optname, optval, optlen); - } + int r; + + if (level == SOL_SOCKET + && (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO)) + { + int milliseconds; + int milliseconds_len = sizeof (int); + struct timeval tv; + size_t n; - if (r < 0) - set_winsock_errno (); + r = getsockopt (sock, level, optname, (char *) &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); + } - return r; + if (r < 0) + set_winsock_errno (); + + return r; + } }