diff -r ae55ba1cd11e -r 8d9865be083a Socket.st --- a/Socket.st Wed Sep 30 07:05:19 2015 +0200 +++ b/Socket.st Thu Oct 01 06:52:27 2015 +0200 @@ -53,6 +53,11 @@ extern HANDLE _get_osfhandle(); # endif +# if defined(__BORLANDC__) +// not defined in borland headers +typedef unsigned int socklen_t; +# endif + # if 0 && (defined( __BORLANDC__ ) || defined( __MINGW__ )) # define SOCKET_FROM_FD(fd) (SOCKET)(_get_osfhandle(fd)) # else @@ -2911,7 +2916,7 @@ |serverSocketHandle addr domainClass newHandle| handle notNil ifTrue:[ - ^ self errorAlreadyOpen + ^ self errorAlreadyOpen ]. domain := aServerSocket domain. @@ -2919,12 +2924,12 @@ handleType := aServerSocket handleType. serverSocketHandle := aServerSocket fileHandle. serverSocketHandle isNil ifTrue:[ - ^ self error:'invalid server socket' + ^ self error:'invalid server socket' ]. "unix domain sockets do not return a valid peer name on accept" domainClass := self class socketAddressClassForDomain:domain. domainClass isNil ifTrue:[ - ^ self error:'invalid (unsupported) domain'. + ^ self error:'invalid (unsupported) domain'. ]. addr := domainClass new. newHandle := OperatingSystem socketAccessor new. @@ -2946,25 +2951,25 @@ # if defined(O_NONBLOCK) && defined(SET_NDELAY) if (blocking == false) { - flags = fcntl(serverSocket, F_GETFL); - fcntl(serverSocket, F_SETFL, flags | O_NONBLOCK); + flags = fcntl(serverSocket, F_GETFL); + fcntl(serverSocket, F_SETFL, flags | O_NONBLOCK); } # endif # ifdef DO_WRAP_CALLS do { - __threadErrno = 0; - alen = sizeof(sa); - newSock = (SOCKET)STX_WSA_CALL3("accept", accept, serverSocket, &sa, &alen); + __threadErrno = 0; + alen = sizeof(sa); + newSock = (SOCKET)STX_WSA_CALL3("accept", accept, serverSocket, &sa, &alen); } while ((newSock < 0) && (__threadErrno == EINTR)); if (newSock < 0) { - errno = __threadErrno; + errno = __threadErrno; } # else __BEGIN_INTERRUPTABLE__ do { - alen = sizeof(sa); - newSock = accept(serverSocket, (struct sockaddr *) &sa, &alen); + alen = sizeof(sa); + newSock = accept(serverSocket, (struct sockaddr *) &sa, &alen); } while ((newSock < 0) && (errno == EINTR)); __END_INTERRUPTABLE__ # endif @@ -2972,41 +2977,41 @@ # if defined(O_NDELAY) && defined(SET_NDELAY) if (blocking == false) { - fcntl(serverSocket, F_SETFL, flags); + fcntl(serverSocket, F_SETFL, flags); } # endif if (newSock == -1) { - DBGPRINTF(("SOCKET: accept call failed errno=%d\n", errno)); - __INST(lastErrorNumber) = __MKSMALLINT(errno); - RETURN (false); + DBGPRINTF(("SOCKET: accept call failed errno=%d\n", errno)); + __INST(lastErrorNumber) = __MKSMALLINT(errno); + RETURN (false); } if (__isNonNilObject(addr)) { - OBJ oClass = __qClass(addr); - int nInstVars, nInstBytes, objSize; - char *addrP; - - if (! __isBytes(addr) ) { - DBGPRINTF(("SOCKET: bad addr\n")); - closesocket(newSock); - RETURN (false); - } - - nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars); - nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ)); - objSize = __qSize(addr) - nInstBytes; - addrP = (char *)__InstPtr(addr) + nInstBytes; - if (objSize < alen) { - DBGPRINTF(("SOCKET: bad addr\n")); - closesocket(newSock); - RETURN (false); - } - - /* - * extract the partners address - */ - memcpy(addrP, (char *)&sa, alen); + OBJ oClass = __qClass(addr); + int nInstVars, nInstBytes, objSize; + char *addrP; + + if (! __isBytes(addr) ) { + DBGPRINTF(("SOCKET: bad addr\n")); + closesocket(newSock); + RETURN (false); + } + + nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars); + nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ)); + objSize = __qSize(addr) - nInstBytes; + addrP = (char *)__InstPtr(addr) + nInstBytes; + if (objSize < alen) { + DBGPRINTF(("SOCKET: bad addr\n")); + closesocket(newSock); + RETURN (false); + } + + /* + * extract the partners address + */ + memcpy(addrP, (char *)&sa, alen); } /* @@ -3024,19 +3029,19 @@ # else // ! WIN32 fp = fdopen(newSock, "r+"); if (! fp) { - DBGPRINTF(("SOCKET: fdopen call failed\n")); - __INST(lastErrorNumber) = __MKSMALLINT(errno); - closesocket(newSock); - DBGFPRINTF((stderr, "SOCKET: close (fdopen failed) (%d)\n", newSock)); - RETURN (false); + DBGPRINTF(("SOCKET: fdopen call failed\n")); + __INST(lastErrorNumber) = __MKSMALLINT(errno); + closesocket(newSock); + DBGFPRINTF((stderr, "SOCKET: close (fdopen failed) (%d)\n", newSock)); + RETURN (false); } # endif // ! WIN32 if ((@global(FileOpenTrace) == true) || __debugging__) { # ifdef WIN32 - console_fprintf(stderr, "fdopen [Socket accept] -> fd: %d (H: %"_lx_")\n", _fd, (INT)newSock); + console_fprintf(stderr, "fdopen [Socket accept] -> fd: %d (H: %"_lx_")\n", _fd, (INT)newSock); # else - console_fprintf(stderr, "fdopen [Socket accept] -> %"_lx_" (fd: %d)\n", (INT)fp, newSock); + console_fprintf(stderr, "fdopen [Socket accept] -> %"_lx_" (fd: %d)\n", (INT)fp, newSock); # endif } @@ -3054,7 +3059,7 @@ buffered := false. mode := #readwrite. binary := false. - Lobby register:self. + self registerForFinalization. peer := addr. port := aServerSocket port. @@ -3644,7 +3649,7 @@ |domainName domainCode typeCode error newHandle| handle notNil ifTrue:[ - ^ self errorAlreadyOpen + ^ self errorAlreadyOpen ]. domainName := SocketAddress domainCodeFromName:domainArg. domainCode := OperatingSystem domainCodeOf:domainName. @@ -3666,19 +3671,19 @@ # endif if (! __isSmallInteger(domainCode)) { - error = @symbol(badArgument1); - goto out; + error = @symbol(badArgument1); + goto out; } if (! __isSmallInteger(typeCode)) { - error = @symbol(badArgument2); - goto out; + error = @symbol(badArgument2); + goto out; } if (protocolNumber != nil) { - if (!__isSmallInteger(protocolNumber)) { - error = @symbol(badArgument3); - goto out; - } - proto = __intVal(protocolNumber); + if (!__isSmallInteger(protocolNumber)) { + error = @symbol(badArgument3); + goto out; + } + proto = __intVal(protocolNumber); } /* @@ -3690,91 +3695,91 @@ # ifdef WIN32 sock = WSASocket(dom, typ, proto, 0, 0, noInheritFlag); if (sock == INVALID_SOCKET && noInheritFlag) { - // tried to open socket with WSA_FLAG_NO_HANDLE_INHERIT - // This fails on older windows versions, e.g. Windows XP - sock = WSASocket(dom, typ, proto, 0, 0, 0); - if (sock != INVALID_SOCKET) { - // no error without WSA_FLAG_NO_HANDLE_INHERIT, - // never use this flag again! - noInheritFlag = 0; - } + // tried to open socket with WSA_FLAG_NO_HANDLE_INHERIT + // This fails on older windows versions, e.g. Windows XP + sock = WSASocket(dom, typ, proto, 0, 0, 0); + if (sock != INVALID_SOCKET) { + // no error without WSA_FLAG_NO_HANDLE_INHERIT, + // never use this flag again! + noInheritFlag = 0; + } } if (sock == INVALID_SOCKET) { - errno = WSAGetLastError(); + errno = WSAGetLastError(); # else // !WIN32 sock = socket(dom, typ, proto); # if defined(EPROTONOSUPPORT) /* for SGI */ if ((sock < 0) && (proto != 0) && (errno == EPROTONOSUPPORT)) { - DBGPRINTF(("SOCKET: retry with UNSPEC protocol\n")); - proto = 0; - sock = socket(dom, typ, 0); + DBGPRINTF(("SOCKET: retry with UNSPEC protocol\n")); + proto = 0; + sock = socket(dom, typ, 0); } # endif if (sock < 0) { # endif // !WIN32 - DBGPRINTF(("SOCKET: socket(dom=%d typ=%d proto=%d) call failed errno=%d\n", dom, typ, proto, errno)); - error = __MKSMALLINT(errno); + DBGPRINTF(("SOCKET: socket(dom=%d typ=%d proto=%d) call failed errno=%d\n", dom, typ, proto, errno)); + error = __MKSMALLINT(errno); } else { # if defined(SET_LINGER_WHEN_CREATING_SOCKET) && defined(SO_LINGER) - { - struct linger l; - - l.l_onoff = 1; - l.l_linger = 30; - setsockopt( sock, SOL_SOCKET, SO_LINGER, &l, sizeof(l)); - } + { + struct linger l; + + l.l_onoff = 1; + l.l_linger = 30; + setsockopt( sock, SOL_SOCKET, SO_LINGER, &l, sizeof(l)); + } # endif # ifdef WIN32 - /* - * make it blocking - */ - { - unsigned long zero = 0; - ioctlsocket(sock, FIONBIO, &zero); - } - { + /* + * make it blocking + */ + { + unsigned long zero = 0; + ioctlsocket(sock, FIONBIO, &zero); + } + { # if 0 && (defined( __BORLANDC__ ) || defined( __MINGW__ )) - /* - * make it a FILE * - */ - __stxWrapApiEnterCritical(); - _fd = _open_osfhandle((long)sock, 0); - __stxWrapApiLeaveCritical(); + /* + * make it a FILE * + */ + __stxWrapApiEnterCritical(); + _fd = _open_osfhandle((long)sock, 0); + __stxWrapApiLeaveCritical(); # else - _fd = (int)sock; + _fd = (int)sock; # endif - DBGPRINTF(("SOCKET: sock=%d fd=%d\n", sock, _fd)); - } + DBGPRINTF(("SOCKET: sock=%d fd=%d\n", sock, _fd)); + } # else // !WIN32 - fp = fdopen(sock, "r+"); - if (! fp) { - DBGPRINTF(("SOCKET: fdopen call failed\n")); - error = __MKSMALLINT(errno); - __BEGIN_INTERRUPTABLE__ - closesocket(sock); - DBGFPRINTF((stderr, "SOCKET: fdopen failed (%d)\n", sock)); - __END_INTERRUPTABLE__ - goto out; - } + fp = fdopen(sock, "r+"); + if (! fp) { + DBGPRINTF(("SOCKET: fdopen call failed\n")); + error = __MKSMALLINT(errno); + __BEGIN_INTERRUPTABLE__ + closesocket(sock); + DBGFPRINTF((stderr, "SOCKET: fdopen failed (%d)\n", sock)); + __END_INTERRUPTABLE__ + goto out; + } # endif // !WIN32 - if (@global(FileOpenTrace) == true) { + if (@global(FileOpenTrace) == true) { # ifdef WIN32 - console_fprintf(stderr, "fdopen [Socket create] -> fd: %d (H: %"_lx_")\n", (INT)_fd, (INT)sock); + console_fprintf(stderr, "fdopen [Socket create] -> fd: %d (H: %"_lx_")\n", (INT)_fd, (INT)sock); # else - console_fprintf(stderr, "fdopen [Socket] -> %"_lx_" (fd: %d)\n", (INT)fp, sock); + console_fprintf(stderr, "fdopen [Socket] -> %"_lx_" (fd: %d)\n", (INT)fp, sock); # endif - } + } # ifdef WIN32 - __externalAddressVal(newHandle) = _fd; - __INST(handleType) = @symbol(socketHandle); + __externalAddressVal(newHandle) = _fd; + __INST(handleType) = @symbol(socketHandle); # else - __externalAddressVal(newHandle) = fp; - __INST(handleType) = @symbol(socketFilePointer); + __externalAddressVal(newHandle) = fp; + __INST(handleType) = @symbol(socketFilePointer); # endif } #endif @@ -3783,15 +3788,15 @@ "all ok?" handleType notNil ifTrue:[ - handle := newHandle. - domain := domainArg. - socketType := typeArg. - Lobby register:self. - ^ self. + handle := newHandle. + domain := domainArg. + socketType := typeArg. + self registerForFinalization. + ^ self. ]. error isInteger ifTrue:[ - lastErrorNumber := error. - ^ self openError:error. + lastErrorNumber := error. + ^ self openError:error. ]. ^ self primitiveFailed:error.