#ifndef KIT_SOCKETS_H #define KIT_SOCKETS_H #include "status.h" #ifndef KIT_DISABLE_SYSTEM_SOCKETS # ifdef __GNUC__ # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wunused-function" # pragma GCC diagnostic ignored "-Wunknown-pragmas" # endif # ifdef __cplusplus extern "C" { # endif # if defined(_WIN32) && !defined(__CYGWIN__) # define WIN32_LEAN_AND_MEAN # include # include # define socket_t SOCKET # define socklen_t i32 static kit_status_t kit_sockets_init(void) { WSADATA data; memset(&data, 0, sizeof data); WORD version = MAKEWORD(2, 2); return WSAStartup(version, &data) == ERROR_SUCCESS ? KIT_OK : KIT_ERROR_SOCKETS_STARTUP_FAILED; } static kit_status_t kit_sockets_cleanup(void) { WSACleanup(); return KIT_OK; } static i32 kit_socket_set_blocking(socket_t s) { u_long flag = 0; return ioctlsocket(s, FIONBIO, &flag) == 0 ? KIT_OK : KIT_ERROR_SOCKET_CONTROL_FAILED; } static i32 kit_socket_set_nonblocking(socket_t s) { u_long flag = 1; return ioctlsocket(s, FIONBIO, &flag) == 0 ? KIT_OK : KIT_ERROR_SOCKET_CONTROL_FAILED; } # else # include # include # include # include # include # include # include # include # include # include # define socket_t i32 # define closesocket close # define INVALID_SOCKET -1 static kit_status_t kit_sockets_init(void) { signal(SIGPIPE, SIG_IGN); return KIT_OK; } static kit_status_t kit_sockets_cleanup(void) { return KIT_OK; } static i32 kit_socket_set_blocking(socket_t s) { i32 flags = fcntl(s, F_GETFL, 0); return fcntl(s, F_SETFL, flags & ~O_NONBLOCK) == 0 ? KIT_OK : KIT_ERROR_SOCKET_CONTROL_FAILED; } static i32 kit_socket_set_nonblocking(socket_t s) { i32 flags = fcntl(s, F_GETFL, 0); return fcntl(s, F_SETFL, flags | O_NONBLOCK) == 0 ? KIT_OK : KIT_ERROR_SOCKET_CONTROL_FAILED; } # endif # ifdef __cplusplus } # endif # ifdef __GNUC__ # pragma GCC diagnostic pop # endif #endif #endif