comparison lib/setsockopt.c @ 15727:144db791c6fa

Ensure EBADF returns for socket functions on mingw. * lib/accept.c (rpl_accept): Fail with error EBADF if the file descriptor is invalid. * lib/bind.c (rpl_bind): Likewise. * lib/connect.c (rpl_connect): Likewise. * lib/getpeername.c (rpl_getpeername): Likewise. * lib/getsockname.c (rpl_getsockname): Likewise. * lib/getsockopt.c (rpl_getsockopt): Likewise. * lib/listen.c (rpl_listen): Likewise. * lib/recv.c (rpl_recv): Likewise. * lib/recvfrom.c (rpl_recvfrom): Likewise. * lib/send.c (rpl_send): Likewise. * lib/sendto.c (rpl_sendto): Likewise. * lib/setsockopt.c (rpl_setsockopt): Likewise. * lib/shutdown.c (rpl_shutdown): Likewise.
author Bruno Haible <bruno@clisp.org>
date Wed, 21 Sep 2011 00:20:59 +0200
parents 97fc9a21a8fb
children 8250f2777afc
comparison
equal deleted inserted replaced
15726:1a3894d5ce47 15727:144db791c6fa
32 #undef setsockopt 32 #undef setsockopt
33 33
34 int 34 int
35 rpl_setsockopt (int fd, int level, int optname, const void *optval, socklen_t optlen) 35 rpl_setsockopt (int fd, int level, int optname, const void *optval, socklen_t optlen)
36 { 36 {
37 SOCKET sock = FD_TO_SOCKET (fd);
37 int r; 38 int r;
38 SOCKET sock = FD_TO_SOCKET (fd);
39 39
40 if (level == SOL_SOCKET && (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO)) 40 if (sock == INVALID_SOCKET)
41 { 41 {
42 const struct timeval *tv = optval; 42 errno = EBADF;
43 int milliseconds = tv->tv_sec * 1000 + tv->tv_usec / 1000; 43 return -1;
44 optval = &milliseconds;
45 r = setsockopt (sock, level, optname, optval, sizeof (int));
46 } 44 }
47 else 45 else
48 { 46 {
49 r = setsockopt (sock, level, optname, optval, optlen); 47 if (level == SOL_SOCKET
48 && (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO))
49 {
50 const struct timeval *tv = optval;
51 int milliseconds = tv->tv_sec * 1000 + tv->tv_usec / 1000;
52 optval = &milliseconds;
53 r = setsockopt (sock, level, optname, optval, sizeof (int));
54 }
55 else
56 {
57 r = setsockopt (sock, level, optname, optval, optlen);
58 }
59
60 if (r < 0)
61 set_winsock_errno ();
62
63 return r;
50 } 64 }
51
52 if (r < 0)
53 set_winsock_errno ();
54
55 return r;
56 } 65 }