61 # if 0 && (defined( __BORLANDC__ ) || defined( __MINGW__ )) |
61 # if 0 && (defined( __BORLANDC__ ) || defined( __MINGW__ )) |
62 # define SOCKET_FROM_FD(fd) (SOCKET)(_get_osfhandle(fd)) |
62 # define SOCKET_FROM_FD(fd) (SOCKET)(_get_osfhandle(fd)) |
63 # else |
63 # else |
64 # define SOCKET_FROM_FD(fd) (SOCKET)(fd) |
64 # define SOCKET_FROM_FD(fd) (SOCKET)(fd) |
65 # endif |
65 # endif |
66 #else /* not WIN32 */ |
66 #else /* not __win32__ */ |
67 # define SOCKET_FROM_FD(fd) (fd) |
67 # define SOCKET_FROM_FD(fd) (fd) |
68 # define closesocket(sock) close(sock) |
68 # define closesocket(sock) close(sock) |
69 # define SOCKET int |
69 # define SOCKET int |
70 #endif /* ! WIN32 */ |
70 #endif /* ! __win32__ */ |
71 |
71 |
72 #define SOCKET_FROM_FILE(f) (SOCKET_FROM_FD(fileno(f))) |
72 #define SOCKET_FROM_FILE(f) (SOCKET_FROM_FD(fileno(f))) |
73 #define SOCKET_FROM_FILE_OBJECT(f) (__INST(handleType) == @symbol(socketHandle) ? SOCKET_FROM_FD(__FILEVal(f)) : SOCKET_FROM_FILE(__FILEVal(f))) |
73 #define SOCKET_FROM_FILE_OBJECT(f) (__INST(handleType) == @symbol(socketHandle) ? SOCKET_FROM_FD(__FILEVal(f)) : SOCKET_FROM_FILE(__FILEVal(f))) |
74 |
74 |
75 #ifndef __MINGW__ |
75 #ifndef __MINGW__ |
2160 memcpy(&sa, __byteArrayVal(aSocketAddress) + sockAddrOffs, sockaddr_size); |
2160 memcpy(&sa, __byteArrayVal(aSocketAddress) + sockAddrOffs, sockaddr_size); |
2161 } |
2161 } |
2162 |
2162 |
2163 sock = SOCKET_FROM_FILE_OBJECT(fp); |
2163 sock = SOCKET_FROM_FILE_OBJECT(fp); |
2164 |
2164 |
2165 #ifdef WIN32 |
2165 #ifdef __win32__ |
2166 ioctlsocket(sock, FIONBIO, &on); |
2166 ioctlsocket(sock, FIONBIO, &on); |
2167 #elif defined(O_NONBLOCK) |
2167 #elif defined(O_NONBLOCK) |
2168 /* |
2168 /* |
2169 * set to non-blocking and wait later |
2169 * set to non-blocking and wait later |
2170 */ |
2170 */ |
2200 } |
2200 } |
2201 |
2201 |
2202 // __setWrapCallDebugging(1,0); |
2202 // __setWrapCallDebugging(1,0); |
2203 # else // !DO_WRAP_CALLS |
2203 # else // !DO_WRAP_CALLS |
2204 |
2204 |
2205 # if !defined(WIN32) && !defined(O_NONBLOCK) |
2205 # if !defined(__win32__) && !defined(O_NONBLOCK) |
2206 __BEGIN_INTERRUPTABLE__ |
2206 __BEGIN_INTERRUPTABLE__ |
2207 # endif |
2207 # endif |
2208 do { |
2208 do { |
2209 ret = connect(sock, (struct sockaddr *)&sa, sockaddr_size); |
2209 ret = connect(sock, (struct sockaddr *)&sa, sockaddr_size); |
2210 } while ((ret < 0) |
2210 } while ((ret < 0) |
2211 # ifdef WIN32 |
2211 # ifdef __win32__ |
2212 && (errno = WSAGetLastError()) |
2212 && (errno = WSAGetLastError()) |
2213 # endif |
2213 # endif |
2214 && ((errno == EINTR) |
2214 && ((errno == EINTR) |
2215 # ifdef EAGAIN |
2215 # ifdef EAGAIN |
2216 || (errno == EAGAIN) |
2216 || (errno == EAGAIN) |
2217 # endif |
2217 # endif |
2218 )); |
2218 )); |
2219 # if !defined(WIN32) && !defined(O_NONBLOCK) |
2219 # if !defined(__win32__) && !defined(O_NONBLOCK) |
2220 __END_INTERRUPTABLE__ |
2220 __END_INTERRUPTABLE__ |
2221 # endif |
2221 # endif |
2222 #endif |
2222 #endif |
2223 |
2223 |
2224 #if defined(WIN32) && !defined(EINPROGRESS) |
2224 #if defined(__win32__) && !defined(EINPROGRESS) |
2225 # define EINPROGRESSS WSAEINPROGRESSS |
2225 # define EINPROGRESSS WSAEINPROGRESSS |
2226 # define EALREADY WSAEALREADY |
2226 # define EALREADY WSAEALREADY |
2227 #endif |
2227 #endif |
2228 |
2228 |
2229 if (ret < 0) { |
2229 if (ret < 0) { |
2230 # if defined(EINPROGRESS) || defined(EALREADY) |
2230 # if defined(EINPROGRESS) || defined(EALREADY) |
2231 if (0 |
2231 if (0 |
2232 # ifdef WIN32 |
2232 # ifdef __win32__ |
2233 || (errno == WSAEWOULDBLOCK) |
2233 || (errno == WSAEWOULDBLOCK) |
2234 # endif |
2234 # endif |
2235 # ifdef EINPROGRESS |
2235 # ifdef EINPROGRESS |
2236 || (errno == EINPROGRESS) |
2236 || (errno == EINPROGRESS) |
2237 # endif |
2237 # endif |
2840 } |
2840 } |
2841 |
2841 |
2842 // whether the close() will be successful or not - the handle is invalid now! |
2842 // whether the close() will be successful or not - the handle is invalid now! |
2843 __INST(handle) = nil; |
2843 __INST(handle) = nil; |
2844 do { |
2844 do { |
2845 #ifdef WIN32 |
2845 #ifdef __win32__ |
2846 rslt = __STX_WSA_NOINT_CALL1("closesocket", closesocket, socket); |
2846 rslt = __STX_WSA_NOINT_CALL1("closesocket", closesocket, socket); |
2847 #else |
2847 #else |
2848 rslt = close(socket); |
2848 rslt = close(socket); |
2849 #endif |
2849 #endif |
2850 } while((rslt < 0) && (__threadErrno == EINTR)); |
2850 } while((rslt < 0) && (__threadErrno == EINTR)); |
2965 SOCKET serverSocket, newSock; |
2965 SOCKET serverSocket, newSock; |
2966 int _fd; |
2966 int _fd; |
2967 union sockaddr_u sa; |
2967 union sockaddr_u sa; |
2968 unsigned int alen; |
2968 unsigned int alen; |
2969 |
2969 |
2970 #ifdef WIN32 |
2970 # ifdef __win32__ |
2971 serverSocket = SOCKET_FROM_FILE_OBJECT(serverSocketHandle); |
2971 serverSocket = SOCKET_FROM_FILE_OBJECT(serverSocketHandle); |
2972 #else |
2972 # else |
2973 serverSocket = __intVal(serverSocketHandle); |
2973 serverSocket = __intVal(serverSocketHandle); |
2974 #endif |
2974 # endif |
2975 |
2975 |
2976 # if defined(O_NONBLOCK) && defined(SET_NDELAY) |
2976 # if defined(O_NONBLOCK) && defined(SET_NDELAY) |
2977 if (blocking == false) { |
2977 if (blocking == false) { |
2978 flags = fcntl(serverSocket, F_GETFL); |
2978 flags = fcntl(serverSocket, F_GETFL); |
2979 fcntl(serverSocket, F_SETFL, flags | O_NONBLOCK); |
2979 fcntl(serverSocket, F_SETFL, flags | O_NONBLOCK); |
3039 } |
3039 } |
3040 |
3040 |
3041 /* |
3041 /* |
3042 * make it a FILE * |
3042 * make it a FILE * |
3043 */ |
3043 */ |
3044 # ifdef WIN32 |
3044 # ifdef __win32__ |
3045 # if 0 && (defined( __BORLANDC__ ) || defined( __MINGW__ )) |
3045 # if 0 && (defined( __BORLANDC__ ) || defined( __MINGW__ )) |
3046 __stxWrapApiEnterCritical(); |
3046 __stxWrapApiEnterCritical(); |
3047 _fd = _open_osfhandle((long)newSock, 0); |
3047 _fd = _open_osfhandle((long)newSock, 0); |
3048 __stxWrapApiLeaveCritical(); |
3048 __stxWrapApiLeaveCritical(); |
3049 DBGPRINTF(("SOCKET: sock=%d fd=%d\n", newSock, _fd)); |
3049 DBGPRINTF(("SOCKET: sock=%d fd=%d\n", newSock, _fd)); |
3050 # else |
3050 # else |
3051 _fd = (int)newSock; |
3051 _fd = (int)newSock; |
3052 # endif |
3052 # endif |
3053 # else // ! WIN32 |
3053 # else // ! __win32__ |
3054 fp = fdopen(newSock, "r+"); |
3054 fp = fdopen(newSock, "r+"); |
3055 if (! fp) { |
3055 if (! fp) { |
3056 DBGPRINTF(("SOCKET: fdopen call failed\n")); |
3056 DBGPRINTF(("SOCKET: fdopen call failed\n")); |
3057 __INST(lastErrorNumber) = __MKSMALLINT(errno); |
3057 __INST(lastErrorNumber) = __MKSMALLINT(errno); |
3058 closesocket(newSock); |
3058 closesocket(newSock); |
3059 DBGFPRINTF((stderr, "SOCKET: close (fdopen failed) (%d)\n", newSock)); |
3059 DBGFPRINTF((stderr, "SOCKET: close (fdopen failed) (%d)\n", newSock)); |
3060 RETURN (false); |
3060 RETURN (false); |
3061 } |
3061 } |
3062 # endif // ! WIN32 |
3062 # endif // ! __win32__ |
3063 |
3063 |
3064 if ((@global(FileOpenTrace) == true) || __debugging__) { |
3064 if ((@global(FileOpenTrace) == true) || __debugging__) { |
3065 # ifdef WIN32 |
3065 # ifdef __win32__ |
3066 console_fprintf(stderr, "fdopen [Socket accept] -> fd: %d (H: %"_lx_")\n", _fd, (INT)newSock); |
3066 console_fprintf(stderr, "fdopen [Socket accept] -> fd: %d (H: %"_lx_")\n", _fd, (INT)newSock); |
3067 # else |
3067 # else |
3068 console_fprintf(stderr, "fdopen [Socket accept] -> %"_lx_" (fd: %d)\n", (INT)fp, newSock); |
3068 console_fprintf(stderr, "fdopen [Socket accept] -> %"_lx_" (fd: %d)\n", (INT)fp, newSock); |
3069 # endif |
3069 # endif |
3070 } |
3070 } |
3071 |
3071 |
3072 # ifdef WIN32 |
3072 # ifdef __win32__ |
3073 __externalAddressVal(newHandle) = _fd; |
3073 __externalAddressVal(newHandle) = _fd; |
3074 __INST(handleType) = @symbol(socketHandle); |
3074 __INST(handleType) = @symbol(socketHandle); |
3075 # else |
3075 # else |
3076 __externalAddressVal(newHandle) = fp; |
3076 __externalAddressVal(newHandle) = fp; |
3077 __INST(handleType) = @symbol(socketFilePointer); |
3077 __INST(handleType) = @symbol(socketFilePointer); |
3330 u.u_tv.tv_usec = __intVal(arg2); |
3330 u.u_tv.tv_usec = __intVal(arg2); |
3331 usize = sizeof(u.u_tv); |
3331 usize = sizeof(u.u_tv); |
3332 } |
3332 } |
3333 # endif /* SO_SNDTIMEO */ |
3333 # endif /* SO_SNDTIMEO */ |
3334 |
3334 |
3335 # if !defined(IPV6_V6ONLY) && defined(WIN32) |
3335 # if !defined(IPV6_V6ONLY) && defined(__win32__) |
3336 # define IPPROTO_IPV6 41 |
3336 # define IPPROTO_IPV6 41 |
3337 # define IPV6_V6ONLY 27 |
3337 # define IPV6_V6ONLY 27 |
3338 # endif |
3338 # endif |
3339 |
3339 |
3340 # if defined(IPV6_V6ONLY) |
3340 # if defined(IPV6_V6ONLY) |
3343 level = IPPROTO_IPV6; |
3343 level = IPPROTO_IPV6; |
3344 usize = sizeof(u.u_bool); |
3344 usize = sizeof(u.u_bool); |
3345 if (arg1 == true) u.u_bool = TRUE; |
3345 if (arg1 == true) u.u_bool = TRUE; |
3346 else if (arg1 == false) u.u_bool = FALSE; |
3346 else if (arg1 == false) u.u_bool = FALSE; |
3347 else goto argError; |
3347 else goto argError; |
3348 # ifdef WIN32 |
3348 # ifdef __win32__ |
3349 console_fprintf(stderr, "%d %d %d %d\n", level, opt, usize, u.u_int); |
3349 console_fprintf(stderr, "%d %d %d %d\n", level, opt, usize, u.u_int); |
3350 # endif |
3350 # endif |
3351 } |
3351 } |
3352 # endif /* IPV6_V6ONLY */ |
3352 # endif /* IPV6_V6ONLY */ |
3353 |
3353 |
3354 if (usize == -1) goto argError; |
3354 if (usize == -1) goto argError; |
3355 |
3355 |
3356 ok = (setsockopt(sock, level, opt, (char *)&u, usize) >= 0) ? true : false; |
3356 ok = (setsockopt(sock, level, opt, (char *)&u, usize) >= 0) ? true : false; |
3357 # ifdef WIN32 |
|
3358 if (ok == false) { |
3357 if (ok == false) { |
3359 # ifdef WIN32 |
3358 # ifdef __win32__ |
3360 error = __mkSmallInteger(WSAGetLastError()); |
3359 error = __mkSmallInteger(WSAGetLastError()); |
3361 # else |
3360 # else |
3362 error = __mkSmallInteger(errno); |
3361 error = __mkSmallInteger(errno); |
3363 # endif |
|
3364 } |
|
3365 # endif |
3362 # endif |
|
3363 } |
3366 |
3364 |
3367 } |
3365 } |
3368 argError: ; |
3366 argError: ; |
3369 #endif /* NO_SOCKET */ |
3367 #endif /* NO_SOCKET */ |
3370 %}. |
3368 %}. |
3475 addrObjSize = __qSize(addr) - nAddrInstBytes; |
3473 addrObjSize = __qSize(addr) - nAddrInstBytes; |
3476 |
3474 |
3477 sock = SOCKET_FROM_FILE_OBJECT(fp); |
3475 sock = SOCKET_FROM_FILE_OBJECT(fp); |
3478 ret = getpeername(sock, (struct sockaddr *)&sa, &alen); |
3476 ret = getpeername(sock, (struct sockaddr *)&sa, &alen); |
3479 if (ret < 0) { |
3477 if (ret < 0) { |
3480 # ifdef WIN32 |
3478 # ifdef __win32__ |
3481 errno = WSAGetLastError(); |
3479 errno = WSAGetLastError(); |
3482 # endif |
3480 # endif |
3483 DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno)); |
3481 DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno)); |
3484 error = __MKSMALLINT(errno); |
3482 error = __MKSMALLINT(errno); |
3485 goto err; |
3483 goto err; |
3549 } |
3547 } |
3550 |
3548 |
3551 sock = SOCKET_FROM_FILE_OBJECT(fp); |
3549 sock = SOCKET_FROM_FILE_OBJECT(fp); |
3552 ret = getsockname(sock, (struct sockaddr *)&sa, &alen); |
3550 ret = getsockname(sock, (struct sockaddr *)&sa, &alen); |
3553 if (ret < 0) { |
3551 if (ret < 0) { |
3554 # ifdef WIN32 |
3552 # ifdef __win32__ |
3555 errno = WSAGetLastError(); |
3553 errno = WSAGetLastError(); |
3556 # endif |
3554 # endif |
3557 DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno)); |
3555 DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno)); |
3558 error = __MKSMALLINT(errno); |
3556 error = __MKSMALLINT(errno); |
3559 goto err; |
3557 goto err; |
3714 * get address and protocol-family |
3712 * get address and protocol-family |
3715 */ |
3713 */ |
3716 dom = __intVal(domainCode); |
3714 dom = __intVal(domainCode); |
3717 typ = __intVal(typeCode); |
3715 typ = __intVal(typeCode); |
3718 |
3716 |
3719 # ifdef WIN32 |
3717 # ifdef __win32__ |
3720 sock = WSASocket(dom, typ, proto, 0, 0, noInheritFlag); |
3718 sock = WSASocket(dom, typ, proto, 0, 0, noInheritFlag); |
3721 if (sock == INVALID_SOCKET && noInheritFlag) { |
3719 if (sock == INVALID_SOCKET && noInheritFlag) { |
3722 // tried to open socket with WSA_FLAG_NO_HANDLE_INHERIT |
3720 // tried to open socket with WSA_FLAG_NO_HANDLE_INHERIT |
3723 // This fails on older windows versions, e.g. Windows XP |
3721 // This fails on older windows versions, e.g. Windows XP |
3724 sock = WSASocket(dom, typ, proto, 0, 0, 0); |
3722 sock = WSASocket(dom, typ, proto, 0, 0, 0); |
3729 } |
3727 } |
3730 } |
3728 } |
3731 if (sock == INVALID_SOCKET) { |
3729 if (sock == INVALID_SOCKET) { |
3732 errno = WSAGetLastError(); |
3730 errno = WSAGetLastError(); |
3733 |
3731 |
3734 # else // !WIN32 |
3732 # else // !__win32__ |
3735 |
3733 |
3736 sock = socket(dom, typ, proto); |
3734 sock = socket(dom, typ, proto); |
3737 # if defined(EPROTONOSUPPORT) /* for SGI */ |
3735 # if defined(EPROTONOSUPPORT) /* for SGI */ |
3738 if ((sock < 0) && (proto != 0) && (errno == EPROTONOSUPPORT)) { |
3736 if ((sock < 0) && (proto != 0) && (errno == EPROTONOSUPPORT)) { |
3739 DBGPRINTF(("SOCKET: retry with UNSPEC protocol\n")); |
3737 DBGPRINTF(("SOCKET: retry with UNSPEC protocol\n")); |
3740 proto = 0; |
3738 proto = 0; |
3741 sock = socket(dom, typ, 0); |
3739 sock = socket(dom, typ, 0); |
3742 } |
3740 } |
3743 # endif |
3741 # endif |
3744 if (sock < 0) { |
3742 if (sock < 0) { |
3745 # endif // !WIN32 |
3743 # endif // !__win32__ |
3746 |
3744 |
3747 DBGPRINTF(("SOCKET: socket(dom=%d typ=%d proto=%d) call failed errno=%d\n", dom, typ, proto, errno)); |
3745 DBGPRINTF(("SOCKET: socket(dom=%d typ=%d proto=%d) call failed errno=%d\n", dom, typ, proto, errno)); |
3748 error = __MKSMALLINT(errno); |
3746 error = __MKSMALLINT(errno); |
3749 } else { |
3747 } else { |
3750 # if defined(SET_LINGER_WHEN_CREATING_SOCKET) && defined(SO_LINGER) |
3748 # if defined(SET_LINGER_WHEN_CREATING_SOCKET) && defined(SO_LINGER) |
3775 # else |
3773 # else |
3776 _fd = (int)sock; |
3774 _fd = (int)sock; |
3777 # endif |
3775 # endif |
3778 DBGPRINTF(("SOCKET: sock=%d fd=%d\n", sock, _fd)); |
3776 DBGPRINTF(("SOCKET: sock=%d fd=%d\n", sock, _fd)); |
3779 } |
3777 } |
3780 # else // !WIN32 |
3778 # else // !__win32__ |
3781 fp = fdopen(sock, "r+"); |
3779 fp = fdopen(sock, "r+"); |
3782 if (! fp) { |
3780 if (! fp) { |
3783 DBGPRINTF(("SOCKET: fdopen call failed\n")); |
3781 DBGPRINTF(("SOCKET: fdopen call failed\n")); |
3784 error = __MKSMALLINT(errno); |
3782 error = __MKSMALLINT(errno); |
3785 __BEGIN_INTERRUPTABLE__ |
3783 __BEGIN_INTERRUPTABLE__ |
3786 closesocket(sock); |
3784 closesocket(sock); |
3787 DBGFPRINTF((stderr, "SOCKET: fdopen failed (%d)\n", sock)); |
3785 DBGFPRINTF((stderr, "SOCKET: fdopen failed (%d)\n", sock)); |
3788 __END_INTERRUPTABLE__ |
3786 __END_INTERRUPTABLE__ |
3789 goto out; |
3787 goto out; |
3790 } |
3788 } |
3791 # endif // !WIN32 |
3789 # endif // !__win32__ |
3792 |
3790 |
3793 if (@global(FileOpenTrace) == true) { |
3791 if (@global(FileOpenTrace) == true) { |
3794 # ifdef WIN32 |
3792 # ifdef __win32__ |
3795 console_fprintf(stderr, "fdopen [Socket create] -> fd: %d (H: %"_lx_")\n", (INT)_fd, (INT)sock); |
3793 console_fprintf(stderr, "fdopen [Socket create] -> fd: %d (H: %"_lx_")\n", (INT)_fd, (INT)sock); |
3796 # else |
3794 # else |
3797 console_fprintf(stderr, "fdopen [Socket] -> %"_lx_" (fd: %d)\n", (INT)fp, sock); |
3795 console_fprintf(stderr, "fdopen [Socket] -> %"_lx_" (fd: %d)\n", (INT)fp, sock); |
3798 # endif |
3796 # endif |
3799 } |
3797 } |
3800 |
3798 |
3801 # ifdef WIN32 |
3799 # ifdef __win32__ |
3802 __externalAddressVal(newHandle) = _fd; |
3800 __externalAddressVal(newHandle) = _fd; |
3803 __INST(handleType) = @symbol(socketHandle); |
3801 __INST(handleType) = @symbol(socketHandle); |
3804 # else |
3802 # else |
3805 __externalAddressVal(newHandle) = fp; |
3803 __externalAddressVal(newHandle) = fp; |
3806 __INST(handleType) = @symbol(socketFilePointer); |
3804 __INST(handleType) = @symbol(socketFilePointer); |