Socket.st
branchjv
changeset 3623 8d9865be083a
parent 3619 ae55ba1cd11e
parent 3620 c648d063bccc
child 3634 d702e00e8533
--- 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.