diff options
author | Andy Wingo <wingo@pobox.com> | 2011-10-27 13:45:04 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2011-10-27 13:45:04 +0200 |
commit | 4938d3cb742de2a356586c55e5af32e193c5990b (patch) | |
tree | b4bfe0fd26e102c5fa38ca9965bc4ebdbae8e3b4 /lib/getsockopt.c | |
parent | 9d013330154852bc2309947adaa30b32418642c0 (diff) | |
parent | 2be3feb17e5456bba71749e0e97adf45c32c4e0e (diff) | |
download | guile-4938d3cb742de2a356586c55e5af32e193c5990b.tar.gz |
Merge remote-tracking branch 'origin/stable-2.0'
Conflicts:
GUILE-VERSION
libguile/deprecated.c
libguile/gc-malloc.c
module/language/tree-il/peval.scm
Diffstat (limited to 'lib/getsockopt.c')
-rw-r--r-- | lib/getsockopt.c | 51 |
1 files changed, 31 insertions, 20 deletions
diff --git a/lib/getsockopt.c b/lib/getsockopt.c index 8433ab921..1d0fe980c 100644 --- a/lib/getsockopt.c +++ b/lib/getsockopt.c @@ -37,32 +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, (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; + 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; + } } |