Socket.st
changeset 3843 fbced69597a7
parent 3742 a12020350fa0
child 3844 69a954c0be09
child 3985 f4df11cffecf
equal deleted inserted replaced
3842:11e10753a2a9 3843:fbced69597a7
    28 #ifdef __MINGW__
    28 #ifdef __MINGW__
    29 # include <stdio.h>
    29 # include <stdio.h>
    30 #endif
    30 #endif
    31 #include "stxOSDefs.h"
    31 #include "stxOSDefs.h"
    32 
    32 
    33 #ifdef WIN32
    33 #ifdef __win32__
    34 //#define DEBUG 1
    34 //#define DEBUG 1
    35 /* this is to catch uses of those - there should be none */
    35 /* this is to catch uses of those - there should be none */
    36 # undef __BEGIN_INTERRUPTABLE__
    36 # undef __BEGIN_INTERRUPTABLE__
    37 # undef __END_INTERRUPTABLE__
    37 # undef __END_INTERRUPTABLE__
    38 # ifdef __TCC__
    38 # ifdef __TCC__
    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__
   114 # define TRUE   1
   114 # define TRUE   1
   115 #endif
   115 #endif
   116 #ifndef FALSE
   116 #ifndef FALSE
   117 # define FALSE  0
   117 # define FALSE  0
   118 #endif
   118 #endif
   119 #ifndef WIN32
   119 #ifndef __win32__
   120 typedef int BOOL;
   120 typedef int BOOL;
   121 #endif
   121 #endif
   122 
   122 
   123 #ifdef WIN32
   123 #ifdef __win32__
   124 # undef stdout
   124 # undef stdout
   125 # undef stderr
   125 # undef stderr
   126 # define stdout __win32_stdout()
   126 # define stdout __win32_stdout()
   127 # define stderr __win32_stderr()
   127 # define stderr __win32_stderr()
   128 #endif
   128 #endif
  1881 # else
  1881 # else
  1882     errno = 0;
  1882     errno = 0;
  1883     ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
  1883     ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
  1884 # endif
  1884 # endif
  1885     if (ret < 0) {
  1885     if (ret < 0) {
  1886 # ifdef WIN32
  1886 # ifdef __win32__
  1887 	if (errno == 0) {
  1887 	if (errno == 0) {
  1888 	    errno = WSAGetLastError();
  1888 	    errno = WSAGetLastError();
  1889 	}
  1889 	}
  1890 # endif
  1890 # endif
  1891 	DBGPRINTF(("SOCKET: bind failed errno=%d\n", errno));
  1891 	DBGPRINTF(("SOCKET: bind failed errno=%d\n", errno));
  1989     errno = 0;
  1989     errno = 0;
  1990     ret = listen(sock, __intVal(aNumber));
  1990     ret = listen(sock, __intVal(aNumber));
  1991 #endif
  1991 #endif
  1992 
  1992 
  1993     if (ret < 0) {
  1993     if (ret < 0) {
  1994 # ifdef WIN32
  1994 # ifdef __win32__
  1995 	if (errno == 0) {
  1995 	if (errno == 0) {
  1996 	    errno = WSAGetLastError();
  1996 	    errno = WSAGetLastError();
  1997 	}
  1997 	}
  1998 # endif
  1998 # endif
  1999 	DBGPRINTF(("SOCKET: listen call failed errno=%d\n", errno));
  1999 	DBGPRINTF(("SOCKET: listen call failed errno=%d\n", errno));
  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
  2263 # endif
  2263 # endif
  2264 	    err = __MKSMALLINT(errno);
  2264 	    err = __MKSMALLINT(errno);
  2265 	}
  2265 	}
  2266     }
  2266     }
  2267 
  2267 
  2268 # ifdef WIN32
  2268 # ifdef __win32__
  2269     {
  2269     {
  2270 	int off = 0;
  2270 	int off = 0;
  2271 	ioctlsocket(sock, FIONBIO, &off);
  2271 	ioctlsocket(sock, FIONBIO, &off);
  2272     }
  2272     }
  2273 # elif defined(O_NONBLOCK) // Linux / Unix
  2273 # elif defined(O_NONBLOCK) // Linux / Unix
  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));
  2908 	SOCKET sock;
  2908 	SOCKET sock;
  2909 
  2909 
  2910 	sock = SOCKET_FROM_FILE_OBJECT(fp);
  2910 	sock = SOCKET_FROM_FILE_OBJECT(fp);
  2911 	sz = sizeof(err);
  2911 	sz = sizeof(err);
  2912 	if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (char *)(&err), &sz) < 0) {
  2912 	if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (char *)(&err), &sz) < 0) {
  2913 # ifdef WIN32
  2913 # ifdef __win32__
  2914 	    errno = WSAGetLastError();
  2914 	    errno = WSAGetLastError();
  2915 # endif
  2915 # endif
  2916 	    err = errno;
  2916 	    err = errno;
  2917 	}
  2917 	}
  2918     }
  2918     }
  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;
  3685     int dom, typ, proto = 0;
  3683     int dom, typ, proto = 0;
  3686     int on = 1;
  3684     int on = 1;
  3687     SOCKET sock;
  3685     SOCKET sock;
  3688     int _fd;
  3686     int _fd;
  3689 
  3687 
  3690 # ifdef WIN32
  3688 # ifdef __win32__
  3691 #  ifndef WSA_FLAG_NO_HANDLE_INHERIT
  3689 #  ifndef WSA_FLAG_NO_HANDLE_INHERIT
  3692 #   define WSA_FLAG_NO_HANDLE_INHERIT 0x80
  3690 #   define WSA_FLAG_NO_HANDLE_INHERIT 0x80
  3693 #  endif
  3691 #  endif
  3694     static int noInheritFlag = WSA_FLAG_NO_HANDLE_INHERIT;
  3692     static int noInheritFlag = WSA_FLAG_NO_HANDLE_INHERIT;
  3695 # endif
  3693 # endif
  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)
  3754 	    l.l_onoff = 1;
  3752 	    l.l_onoff = 1;
  3755 	    l.l_linger = 30;
  3753 	    l.l_linger = 30;
  3756 	    setsockopt( sock, SOL_SOCKET, SO_LINGER, &l, sizeof(l));
  3754 	    setsockopt( sock, SOL_SOCKET, SO_LINGER, &l, sizeof(l));
  3757 	}
  3755 	}
  3758 # endif
  3756 # endif
  3759 # ifdef WIN32
  3757 # ifdef __win32__
  3760 	/*
  3758 	/*
  3761 	 * make it blocking
  3759 	 * make it blocking
  3762 	 */
  3760 	 */
  3763 	{
  3761 	{
  3764 	    unsigned long zero = 0;
  3762 	    unsigned long zero = 0;
  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);