diff --git a/src/xpdev/sockwrap.c b/src/xpdev/sockwrap.c index 75b01ff9b27a476cd36a4b979ff450a3f78627db..7d7ad4b0185699fd69054d0a7665818aeb4f6a5a 100644 --- a/src/xpdev/sockwrap.c +++ b/src/xpdev/sockwrap.c @@ -51,9 +51,9 @@ static socket_option_t socket_options[] = { #endif #endif - { "REUSEADDR", 0, SOL_SOCKET, SO_REUSEADDR }, + { "REUSEADDR", 0, SOL_SOCKET, SO_REUSEADDR }, #ifdef SO_REUSEPORT /* BSD */ - { "REUSEPORT", 0, SOL_SOCKET, SO_REUSEPORT }, + { "REUSEPORT", 0, SOL_SOCKET, SO_REUSEPORT }, #endif #ifdef SO_EXCLUSIVEADDRUSE /* WinSock */ { "EXCLUSIVEADDRUSE", 0, SOL_SOCKET, SO_EXCLUSIVEADDRUSE }, @@ -63,7 +63,7 @@ static socket_option_t socket_options[] = { { "BROADCAST", SOCK_DGRAM, SOL_SOCKET, SO_BROADCAST }, { "OOBINLINE", SOCK_STREAM, SOL_SOCKET, SO_OOBINLINE }, -#ifdef SO_ACCEPTCONN +#ifdef SO_ACCEPTCONN { "ACCEPTCONN", SOCK_STREAM, SOL_SOCKET, SO_ACCEPTCONN }, #endif #ifdef SO_PRIORITY /* Linux */ @@ -84,44 +84,44 @@ static socket_option_t socket_options[] = { /* IPPROTO-level socket options */ { "TCP_NODELAY", SOCK_STREAM, IPPROTO_TCP, TCP_NODELAY }, - /* The following are platform-specific */ -#ifdef TCP_MAXSEG + /* The following are platform-specific */ +#ifdef TCP_MAXSEG { "TCP_MAXSEG", SOCK_STREAM, IPPROTO_TCP, TCP_MAXSEG }, -#endif -#ifdef TCP_CORK +#endif +#ifdef TCP_CORK { "TCP_CORK", SOCK_STREAM, IPPROTO_TCP, TCP_CORK }, -#endif -#ifdef TCP_KEEPIDLE +#endif +#ifdef TCP_KEEPIDLE { "TCP_KEEPIDLE", SOCK_STREAM, IPPROTO_TCP, TCP_KEEPIDLE }, -#endif -#ifdef TCP_KEEPINTVL +#endif +#ifdef TCP_KEEPINTVL { "TCP_KEEPINTVL", SOCK_STREAM, IPPROTO_TCP, TCP_KEEPINTVL }, -#endif -#ifdef TCP_KEEPCNT +#endif +#ifdef TCP_KEEPCNT { "TCP_KEEPCNT", SOCK_STREAM, IPPROTO_TCP, TCP_KEEPCNT }, -#endif +#endif #ifdef TCP_KEEPALIVE /* SunOS */ { "TCP_KEEPALIVE", SOCK_STREAM, IPPROTO_TCP, TCP_KEEPALIVE }, -#endif -#ifdef TCP_SYNCNT +#endif +#ifdef TCP_SYNCNT { "TCP_SYNCNT", SOCK_STREAM, IPPROTO_TCP, TCP_SYNCNT }, -#endif -#ifdef TCP_LINGER2 +#endif +#ifdef TCP_LINGER2 { "TCP_LINGER2", SOCK_STREAM, IPPROTO_TCP, TCP_LINGER2 }, -#endif -#ifdef TCP_DEFER_ACCEPT +#endif +#ifdef TCP_DEFER_ACCEPT { "TCP_DEFER_ACCEPT", SOCK_STREAM, IPPROTO_TCP, TCP_DEFER_ACCEPT }, -#endif -#ifdef TCP_WINDOW_CLAMP +#endif +#ifdef TCP_WINDOW_CLAMP { "TCP_WINDOW_CLAMP", SOCK_STREAM, IPPROTO_TCP, TCP_WINDOW_CLAMP }, -#endif -#ifdef TCP_QUICKACK +#endif +#ifdef TCP_QUICKACK { "TCP_QUICKACK", SOCK_STREAM, IPPROTO_TCP, TCP_QUICKACK }, -#endif -#ifdef TCP_NOPUSH +#endif +#ifdef TCP_NOPUSH { "TCP_NOPUSH", SOCK_STREAM, IPPROTO_TCP, TCP_NOPUSH }, -#endif -#ifdef TCP_NOOPT +#endif +#ifdef TCP_NOOPT { "TCP_NOOPT", SOCK_STREAM, IPPROTO_TCP, TCP_NOOPT }, #endif #if defined(IPV6_V6ONLY) && defined(IPPROTO_IPV6) @@ -231,7 +231,7 @@ off_t recvfilesocket(int sock, int file, off_t *offset, off_t count) * returns number ob bytes written and sets offset * to the new offset */ - + char* buf; ssize_t rd; ssize_t wr; @@ -240,7 +240,7 @@ off_t recvfilesocket(int sock, int file, off_t *offset, off_t count) errno=ERANGE; return(-1); } - + if((buf=(char*)malloc((size_t)count))==NULL) { errno=ENOMEM; return(-1); @@ -388,7 +388,7 @@ BOOL socket_check(SOCKET sock, BOOL* rd_p, BOOL* wr_p, DWORD timeout) if(i==SOCKET_ERROR) return(FALSE); - if(i==0) + if(i==0) return(TRUE); if(wr_p!=NULL && FD_ISSET(sock,wr_set_p)) { @@ -399,7 +399,7 @@ BOOL socket_check(SOCKET sock, BOOL* rd_p, BOOL* wr_p, DWORD timeout) if(rd_p !=NULL || wr_p==NULL) { rd=recv(sock,&ch,1,MSG_PEEK); - if(rd==1 + if(rd==1 || (rd==SOCKET_ERROR && ERROR_VALUE==EMSGSIZE)) { if(rd_p!=NULL) *rd_p=TRUE; @@ -616,7 +616,7 @@ union xp_sockaddr* inet_ptoaddr(const char *addr_str, union xp_sockaddr *addr, s hints.ai_flags = AI_NUMERICHOST|AI_PASSIVE; if(getaddrinfo(addr_str, NULL, &hints, &res)) return NULL; - + for(cur = res; cur; cur = cur->ai_next) { if(cur->ai_addr->sa_family == AF_INET6) break; @@ -731,6 +731,16 @@ DLLEXPORT void set_socket_errno(int err) #endif } +DLLEXPORT int get_socket_errrno(void) +{ +#if defined(_WINSOCKAPI_) + int wsa_error = WSAGetLastError(); + return wsa_error >= WSABASEERR ? wsa_error - WSABASEERR : wsa_error; +#else + return errno; +#endif +} + DLLEXPORT int xp_inet_pton(int af, const char *src, void *dst) { struct addrinfo hints = {0}; diff --git a/src/xpdev/sockwrap.h b/src/xpdev/sockwrap.h index 4e449c8e6e534971c48a50971ff185a21e65cbbb..515c5ee17c5faf6fe85a82942f8a4912511fc94d 100644 --- a/src/xpdev/sockwrap.h +++ b/src/xpdev/sockwrap.h @@ -105,7 +105,7 @@ union xp_sockaddr { #define xp_sockaddr_len(a) ((((struct sockaddr *)a)->sa_family == AF_INET6) ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)) - + /**********************************/ /* Socket Implementation-specific */ @@ -239,6 +239,7 @@ DLLEXPORT void inet_setaddrport(union xp_sockaddr *addr, uint16_t port); DLLEXPORT BOOL inet_addrmatch(union xp_sockaddr* addr1, union xp_sockaddr* addr2); DLLEXPORT char* socket_strerror(int, char*, size_t); DLLEXPORT void set_socket_errno(int); +DLLEXPORT int get_socket_errno(void); DLLEXPORT int xp_inet_pton(int af, const char *src, void *dst); #if defined(_WIN32) // mingw and WinXP's WS2_32.DLL don't have inet_pton(): #define inet_pton xp_inet_pton