1 /* setsockopt.c --- wrappers for Windows setsockopt function 2 3 Copyright (C) 2008-2014 Free Software Foundation, Inc. 4 5 This program is free software: you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17 18 /* Written by Paolo Bonzini */ 19 20 #include <config.h> 21 22 #define WIN32_LEAN_AND_MEAN 23 /* Get winsock2.h. */ 24 #include <sys/socket.h> 25 26 /* Get struct timeval. */ 27 #include <sys/time.h> 28 29 /* Get set_winsock_errno, FD_TO_SOCKET etc. */ 30 #include "w32sock.h" 31 32 #undef setsockopt 33 34 int 35 rpl_setsockopt (int fd, int level, int optname, const void *optval, socklen_t optlen) 36 { 37 SOCKET sock = FD_TO_SOCKET (fd); 38 int r; 39 40 if (sock == INVALID_SOCKET) 41 { 42 errno = EBADF; 43 return -1; 44 } 45 else 46 { 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; 64 } 65 } 66