%% options copyright owner = Dirk Krause copyright year = 2015-xxxx license = bsd %% module #include "dk4sock.h" #include #if DK4_HAVE_ERRNO_H #ifndef ERRNO_H_INCLUDED #include #define ERRNO_H_INCLUDED 1 #endif #endif #if DK4_HAVE_FCNTL_H #ifndef FCNTL_H_INCLUDED #include #define FCNTL_H_INCLUDED 1 #endif #endif #if DK4_HAVE_UNISTD_H #ifndef UNISTD_H_INCLUDED #include #define UNISTD_H_INCLUDED 1 #endif #endif #if DK4_HAVE_IO_H #ifndef IO_H_INCLUDED #include #define IO_H_INCLUDED 1 #endif #endif $!trace-include int dk4socket_option_set_nonblock( dk4_socket_t sock, int val, dk4_er_t *erp ) { #if DK4_ON_WINDOWS unsigned long xv = 0UL; int back = DK4_SOCKET_RESULT_FAILED; if (INVALID_SOCKET != sock) { if (0 != val) { xv = 0x11111111UL; } WSASetLastError(0); if (0 == ioctlsocket(sock, FIONBIO, &xv)) { back = DK4_SOCKET_RESULT_SUCCESS; } else { dk4error_set_idetails(erp, DK4_E_SOCKET_IOCTLSOCKET, WSAGetLastError()); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; #else int back = DK4_SOCKET_RESULT_FAILED; int om; if (INVALID_SOCKET != sock) { om = fcntl(sock, F_GETFL); if (0 != val) { if (0 != (om & O_NONBLOCK)) { back = DK4_SOCKET_RESULT_SUCCESS; } else { om |= O_NONBLOCK; errno = 0; if (-1 != fcntl(sock, F_SETFL, om)) { back = DK4_SOCKET_RESULT_SUCCESS; } else { dk4error_set_idetails(erp, DK4_E_SOCKET_FCNTL, errno); } } } else { if (0 == (om & O_NONBLOCK)) { back = DK4_SOCKET_RESULT_SUCCESS; } else { om &= (~(O_NONBLOCK)); errno = 0; if (-1 != fcntl(sock, F_SETFL, om)) { back = DK4_SOCKET_RESULT_SUCCESS; } else { dk4error_set_idetails(erp, DK4_E_SOCKET_FCNTL, errno); } } } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; #endif }