class: Socket
authorStefan Vogel <sv@exept.de>
Thu, 03 Apr 2014 15:23:44 +0200
changeset 3217 6950d2d3aecf
parent 3216 fdbf3212c1e9
child 3218 70593adb6c03
class: Socket fix error processing
Socket.st
--- a/Socket.st	Thu Apr 03 15:21:31 2014 +0200
+++ b/Socket.st	Thu Apr 03 15:23:44 2014 +0200
@@ -44,7 +44,6 @@
 // linger.onoff=off linger.time= *irrelevant*
 //# define SET_LINGER_WHEN_CREATING_SOCKET
 
-
 # ifdef __MINGW__
 extern HANDLE _get_osfhandle();
 # endif
@@ -678,7 +677,7 @@
     "create a socket for a specific type
      and bind it to aSocketAddress.
      Type must be:
-        #stream, #datagram or #raw
+	#stream, #datagram or #raw
 
      Neither connect nor connect-wait is done."
 
@@ -686,16 +685,16 @@
 
     newSock := self domain:aSocketAddress domain type:aTypeSymbol.
     [
-        newSock bindTo:aSocketAddress reuseAddress:true.
+	newSock bindTo:aSocketAddress reuseAddress:true.
     ] ifCurtailed:[
-        newSock close.
+	newSock close.
     ].
     ^ newSock
 
 
     "
-        Socket bindTo:(IPSocketAddress anyHost port:8081) type:#stream.
-        Socket bindTo:(IPv6SocketAddress anyHost port:8081) type:#datagram.
+	Socket bindTo:(IPSocketAddress anyHost port:8081) type:#stream.
+	Socket bindTo:(IPv6SocketAddress anyHost port:8081) type:#datagram.
     "
 !
 
@@ -703,9 +702,9 @@
     "create a socket for domain and type -
      neither any connect nor binding is done.
      Domain must be one of the symbols:
-        #inet, #unix, #appletalk, #decnet, #xns, ...;
+	#inet, #unix, #appletalk, #decnet, #xns, ...;
      Type must be:
-        #stream, #datagram or #raw
+	#stream, #datagram or #raw
 
      XXX: currently only the #AF_INET and #AF_INET6 and #AF_UNIX domains are supported"
 
@@ -739,21 +738,21 @@
 
     newSock := self newTCP.
     (newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
-        [
-            socketAddressClass := newSock socketAddressClass.
-            socketAddress := socketAddressClass hostName:nil serviceName:aServiceOrNil type:#stream.
-            socketAddress hostAddress:socketAddressClass anyAddress.
-            newSock bindTo:socketAddress reuseAddress:true.
-        ] ifCurtailed:[
-            newSock close.
-        ]
+	[
+	    socketAddressClass := newSock socketAddressClass.
+	    socketAddress := socketAddressClass hostName:nil serviceName:aServiceOrNil type:#stream.
+	    socketAddress hostAddress:socketAddressClass anyAddress.
+	    newSock bindTo:socketAddress reuseAddress:true.
+	] ifCurtailed:[
+	    newSock close.
+	]
     ].
     ^ newSock
 
 
     "
-        Socket newTCP:'http-alt'.
-        Socket newTCP:9996.
+	Socket newTCP:'http-alt'.
+	Socket newTCP:9996.
     "
 !
 
@@ -776,18 +775,18 @@
     |port socketAddress|
 
     aService isString ifTrue:[
-        port := self portOfService:aService protocol:#tcp.
+	port := self portOfService:aService protocol:#tcp.
     ] ifFalse:[
-        port := aService.
+	port := aService.
     ].
-    socketAddress := aSocketAddressOrByteArray isSocketAddress 
-                        ifTrue:[aSocketAddressOrByteArray]
-                        ifFalse:[
-                            "Passing ByteArrays is obsolete and only supported for IPv4"
-                            IPSocketAddress hostAddress:aSocketAddressOrByteArray
-                        ].
+    socketAddress := aSocketAddressOrByteArray isSocketAddress
+			ifTrue:[aSocketAddressOrByteArray]
+			ifFalse:[
+			    "Passing ByteArrays is obsolete and only supported for IPv4"
+			    IPSocketAddress hostAddress:aSocketAddressOrByteArray
+			].
     port notNil ifTrue:[
-        socketAddress port:port.
+	socketAddress port:port.
     ].
     ^ self newTCPclientToAddress:socketAddress withTimeout:millis
 !
@@ -802,13 +801,13 @@
 
     socket := self domain:aSocketAddress domain type:#stream.
     (socket connectTo:aSocketAddress withTimeout:millis) ifFalse:[
-        socket close.
-        ^ nil
+	socket close.
+	^ nil
     ].
     ^ socket.
 
     "
-        self newTCPclientToAddress:(IPv6SocketAddress hostName:'www.exept.de' port:80) withTimeout:nil
+	self newTCPclientToAddress:(IPv6SocketAddress hostName:'www.exept.de' port:80) withTimeout:nil
     "
 !
 
@@ -842,34 +841,34 @@
     |socket addressInfoList|
 
     hostNameOrAddress isString ifFalse:[
-        ^ self newTCPclientToAddress:hostNameOrAddress port:aPortOrServiceName withTimeout:millis.
+	^ self newTCPclientToAddress:hostNameOrAddress port:aPortOrServiceName withTimeout:millis.
     ].
 
-    addressInfoList := SocketAddress 
-                            getAddressInfo:hostNameOrAddress 
-                            serviceName:aPortOrServiceName 
-                            domain:aDomainSymbolOrNil 
-                            type:#stream
-                            protocol:nil 
-                            flags:0.
+    addressInfoList := SocketAddress
+			    getAddressInfo:hostNameOrAddress
+			    serviceName:aPortOrServiceName
+			    domain:aDomainSymbolOrNil
+			    type:#stream
+			    protocol:nil
+			    flags:0.
 
     addressInfoList do:[:eachAddressInfo|
-        |domainSymbol lastDomainSymbol|
-
-        domainSymbol := eachAddressInfo domain.
-        domainSymbol ~~ lastDomainSymbol ifTrue:[
-            socket notNil ifTrue:[
-                socket close.
-            ].
-            socket := self new domain:domainSymbol type:#stream.
-            lastDomainSymbol := domainSymbol.
-        ].
-        (socket connectTo:eachAddressInfo socketAddress withTimeout:millis) ifTrue:[
-            ^ socket.
-        ].
+	|domainSymbol lastDomainSymbol|
+
+	domainSymbol := eachAddressInfo domain.
+	domainSymbol ~~ lastDomainSymbol ifTrue:[
+	    socket notNil ifTrue:[
+		socket close.
+	    ].
+	    socket := self new domain:domainSymbol type:#stream.
+	    lastDomainSymbol := domainSymbol.
+	].
+	(socket connectTo:eachAddressInfo socketAddress withTimeout:millis) ifTrue:[
+	    ^ socket.
+	].
     ].
     socket notNil ifTrue:[
-        socket close.
+	socket close.
     ].
     ^ nil.
 
@@ -883,19 +882,19 @@
     "Modified: / 16.1.1998 / 09:47:06 / stefan"
 !
 
-newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName withTimeout:millis 
+newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName withTimeout:millis
     "create a new TCP client socket connecting to a service on hostNameOrAddress.
      If hostNameOrAddress is a string, try all the resolved adresses regardless
      whether fpr IPv4 or IPv6.
      Return a socket instance if ok, nil on failure.
      If the millis arg is nonNil, stop trying to connect after that many milliseconds
      and return nil."
-    
-    ^ self 
-        newTCPclientToHost:hostNameOrAddress
-        port:aPortOrServiceName
-        domain:self defaultIpDomainForConnect
-        withTimeout:millis
+
+    ^ self
+	newTCPclientToHost:hostNameOrAddress
+	port:aPortOrServiceName
+	domain:self defaultIpDomainForConnect
+	withTimeout:millis
 !
 
 newTCPserverAtAnonymousPort
@@ -929,20 +928,20 @@
 
     newSock := self newUDP.
     (newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
-        [
-            socketAddressClass := newSock socketAddressClass.
-            socketAddress := socketAddressClass hostName:nil serviceName:aServiceOrNil type:#stream.
-            socketAddress hostAddress:socketAddressClass anyAddress.
-            newSock bindTo:socketAddress reuseAddress:true.
-        ] ifCurtailed:[
-            newSock close.
-        ]
+	[
+	    socketAddressClass := newSock socketAddressClass.
+	    socketAddress := socketAddressClass hostName:nil serviceName:aServiceOrNil type:#stream.
+	    socketAddress hostAddress:socketAddressClass anyAddress.
+	    newSock bindTo:socketAddress reuseAddress:true.
+	] ifCurtailed:[
+	    newSock close.
+	]
     ].
     ^ newSock
 
     "
-        Socket newUDP:4444.
-        Socket newUDP:'activesync'.
+	Socket newUDP:4444.
+	Socket newUDP:'activesync'.
     "
 !
 
@@ -990,15 +989,15 @@
 
     newSock := self newUNIX.
     newSock notNil ifTrue:[
-        (newSock connectTo:(UDSocketAddress name:pathName) withTimeout:millis) ifFalse:[
-            newSock close.
-            ^ nil
-        ]
+	(newSock connectTo:(UDSocketAddress name:pathName) withTimeout:millis) ifFalse:[
+	    newSock close.
+	    ^ nil
+	]
     ].
     ^ newSock
 
     "
-        Socket newUNIXclientTo:'/tmp/foo'
+	Socket newUNIXclientTo:'/tmp/foo'
     "
 !
 
@@ -1115,9 +1114,9 @@
 
 defaultIpDomainForConnect
     "answer the domain used to look up host names for connect:
-        #AF_INET    use only IPv4
-        #AF_INET6   use only IPv6
-        nil         use both IPv4 and IPv6"
+	#AF_INET    use only IPv4
+	#AF_INET6   use only IPv6
+	nil         use both IPv4 and IPv6"
 
     ^ #AF_INET
 ! !
@@ -1711,9 +1710,9 @@
      A free port will be allocated"
 
     ^ self
-        bindTo:0
-        address:aSocketAddress
-        reuseAddress:false
+	bindTo:0
+	address:aSocketAddress
+	reuseAddress:false
 
     "
       self newTCP bindAnonymouslyToAddress:IPSocketAddress localHost; listenFor:1; yourself
@@ -1733,15 +1732,15 @@
      - returns true if ok, false otherwise.
 
      The interpretation of hostOrPathNameOrSocketAddrOrNil portNrOrName depends on the domain:
-        Best use a SocketAddress
-        For backward compatibility:
-            AF_INET domain can also use (4byte) byteArray like internet numbers,
-            AF_UNIX domain cab use pathname strings."
+	Best use a SocketAddress
+	For backward compatibility:
+	    AF_INET domain can also use (4byte) byteArray like internet numbers,
+	    AF_UNIX domain cab use pathname strings."
 
     ^ self
-        bindTo:portNrOrNameString
-        address:addressString
-        reuseAddress:true
+	bindTo:portNrOrNameString
+	address:addressString
+	reuseAddress:true
 !
 
 bindTo:portNrOrNameOrNil address:hostOrPathNameOrSocketAddrOrNil reuseAddress:reuse
@@ -1749,10 +1748,10 @@
      - returns true if ok, false otherwise.
 
      The interpretation of hostOrPathNameOrSocketAddrOrNil portNrOrName depends on the domain:
-        Best use a SocketAddress
-        For backward compatibility:
-            AF_INET domain can also use (4byte) byteArray like internet numbers,
-            AF_UNIX domain can use pathname strings.
+	Best use a SocketAddress
+	For backward compatibility:
+	    AF_INET domain can also use (4byte) byteArray like internet numbers,
+	    AF_UNIX domain can use pathname strings.
 
      The reuse boolean argument controls if the SO_REUSEADDR socket option
      is to be set (to avoid the 'bind: address in use' error).
@@ -1761,35 +1760,35 @@
     |socketAddress|
 
     handle isNil ifTrue:[
-        ^ self errorNotOpen
+	^ self errorNotOpen
     ].
 
     hostOrPathNameOrSocketAddrOrNil isNil ifTrue:[
-        socketAddress := self socketAddressClass anyHost.
+	socketAddress := self socketAddressClass anyHost.
     ] ifFalse:[
-        (hostOrPathNameOrSocketAddrOrNil isSocketAddress) ifTrue:[
-            socketAddress := hostOrPathNameOrSocketAddrOrNil.
-        ] ifFalse:[
-            "backward compatibility: support for byteArray and string arg"
-            hostOrPathNameOrSocketAddrOrNil isString ifTrue:[
-                socketAddress := self socketAddressClass hostName:hostOrPathNameOrSocketAddrOrNil.
-            ] ifFalse:[
-                hostOrPathNameOrSocketAddrOrNil isByteCollection ifFalse:[
-                    ^ self error:'bindTo: bad host (socketAddress) argument'
-                ].
-                socketAddress := self socketAddressClass hostAddress:hostOrPathNameOrSocketAddrOrNil.
-            ].
-        ].
+	(hostOrPathNameOrSocketAddrOrNil isSocketAddress) ifTrue:[
+	    socketAddress := hostOrPathNameOrSocketAddrOrNil.
+	] ifFalse:[
+	    "backward compatibility: support for byteArray and string arg"
+	    hostOrPathNameOrSocketAddrOrNil isString ifTrue:[
+		socketAddress := self socketAddressClass hostName:hostOrPathNameOrSocketAddrOrNil.
+	    ] ifFalse:[
+		hostOrPathNameOrSocketAddrOrNil isByteCollection ifFalse:[
+		    ^ self error:'bindTo: bad host (socketAddress) argument'
+		].
+		socketAddress := self socketAddressClass hostAddress:hostOrPathNameOrSocketAddrOrNil.
+	    ].
+	].
     ].
     portNrOrNameOrNil notNil ifTrue:[
-        socketAddress port:portNrOrNameOrNil.
+	socketAddress port:portNrOrNameOrNil.
     ].
 
     ^ self bindTo:socketAddress reuseAddress:reuse.
 
     "
      (Socket domain:#'AF_INET' type:#stream)
-         bindTo:2144 address:nil; yourself
+	 bindTo:2144 address:nil; yourself
     "
 !
 
@@ -1804,13 +1803,13 @@
     |ok error socketAddress|
 
     handle isNil ifTrue:[
-        ^ self errorNotOpen
+	^ self errorNotOpen
     ].
     socketAddress := aSocketAddress.
     socketAddress isNil ifTrue:[
-        "ok, get a all zero socket address, so it is for anyHost
-         and the port will be assigned"
-        socketAddress := self socketAddressClass new.
+	"ok, get a all zero socket address, so it is for anyHost
+	 and the port will be assigned"
+	socketAddress := self socketAddressClass new.
     ].
     ok := false.
 
@@ -1824,52 +1823,52 @@
     int sockAddrOffs;
 
     if (fp == nil) {
-        goto getOutOfHere;
+	goto getOutOfHere;
     }
 
     if (! __isBytes(socketAddress)) {
-        error = __mkSmallInteger(-1);
-        goto getOutOfHere;
+	error = __mkSmallInteger(-1);
+	goto getOutOfHere;
     }
     /* get the socket-address */
     if (__isNonNilObject(socketAddress)){
-        int nIndex;
-        OBJ cls = __qClass(socketAddress);
-
-        sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
-        nIndex = __qSize(socketAddress) - OHDR_SIZE;
-        sockaddr_size = nIndex - sockAddrOffs;
-        if (sockaddr_size > sizeof(sa)) {
-            error=__mkSmallInteger(-2);
-            goto getOutOfHere;
-        }
-        memcpy(&sa, __byteArrayVal(socketAddress) + sockAddrOffs, sockaddr_size);
+	int nIndex;
+	OBJ cls = __qClass(socketAddress);
+
+	sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
+	nIndex = __qSize(socketAddress) - OHDR_SIZE;
+	sockaddr_size = nIndex - sockAddrOffs;
+	if (sockaddr_size > sizeof(sa)) {
+	    error=__mkSmallInteger(-2);
+	    goto getOutOfHere;
+	}
+	memcpy(&sa, __byteArrayVal(socketAddress) + sockAddrOffs, sockaddr_size);
     }
 
     sock = SOCKET_FROM_FILE_OBJECT(fp);
 
 # ifdef SO_REUSEADDR
     if (reuse == true) {
-        int on = 1;
-        if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
-            DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR failed\n"));
-        }
+	int on = 1;
+	if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
+	    DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR failed\n"));
+	}
     }
 # endif /* SO_REUSEADDR */
 
 # ifdef BIND_BLOCKS
 #  ifdef DO_WRAP_CALLS
     do {
-        __threadErrno = 0;
-        ret = STX_WSA_NOINT_CALL3("bind", bind, sock, &sa, sockaddr_size);
+	__threadErrno = 0;
+	ret = STX_WSA_NOINT_CALL3("bind", bind, sock, &sa, sockaddr_size);
     } while ((ret < 0) && (__threadErrno == EINTR));
     if (ret < 0) {
-        errno = __threadErrno;
+	errno = __threadErrno;
     }
 #  else
     __BEGIN_INTERRUPTABLE__
     do {
-        ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
+	ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
     } while ((ret < 0) && (errno == EINTR));
     __END_INTERRUPTABLE__
 #  endif
@@ -1879,68 +1878,68 @@
 # endif
     if (ret < 0) {
 # ifdef WIN32
-        if (errno == 0) {
-            errno = WSAGetLastError();
-        }
+	if (errno == 0) {
+	    errno = WSAGetLastError();
+	}
 # endif
-        DBGPRINTF(("SOCKET: bind failed errno=%d\n", errno));
-        error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
-        goto getOutOfHere;
+	DBGPRINTF(("SOCKET: bind failed errno=%d\n", errno));
+	error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
+	goto getOutOfHere;
     } else {
-        ok = true;
+	ok = true;
     }
 #endif /* NO_SOCKET */
 
 getOutOfHere: ;
 %}.
     ok ~~ true ifTrue:[
-        |errorHolder errorString|
-
-        error isInteger ifTrue:[
-            errorHolder := OperatingSystem errorHolderForNumber:error.
-            errorString := errorHolder errorString.
-        ] ifFalse:[
-            errorString := error.
-        ].
-        OpenError newException
-            errorString:('cannot bind socket to address: %1 (%2)' 
-                            bindWith:socketAddress 
-                            with:errorString);
-            errorCode:error;
-            osErrorHolder:errorHolder;
-            parameter:self;
-            raiseRequest.
-        "maybe someone catches the error and binds to some other port..."
-        ^ true.
+	|errorHolder errorString|
+
+	error isInteger ifTrue:[
+	    errorHolder := OperatingSystem errorHolderForNumber:error.
+	    errorString := errorHolder errorString.
+	] ifFalse:[
+	    errorString := error.
+	].
+	OpenError newException
+	    errorString:('cannot bind socket to address: %1 (%2)'
+			    bindWith:socketAddress
+			    with:errorString);
+	    errorCode:error;
+	    osErrorHolder:errorHolder;
+	    parameter:self;
+	    raiseRequest.
+	"maybe someone catches the error and binds to some other port..."
+	^ true.
     ].
 
     port := socketAddress port.
     port == 0 ifTrue:[
-        "this is a bind to a random port, now we can get the real port"
-        port := self getFullSocketAddress port.
+	"this is a bind to a random port, now we can get the real port"
+	port := self getFullSocketAddress port.
     ].
     ^ true
 
     "
      (Socket domain:#'AF_INET' type:#stream)
-        bindTo:(IPSocketAddress anyHost port:445) reuseAddress:false;
-        yourself.
+	bindTo:(IPSocketAddress anyHost port:445) reuseAddress:false;
+	yourself.
 
      (Socket domain:#'AF_INET' type:#stream)
-        bindTo:139 reuseAddress:false;
-        yourself.
+	bindTo:139 reuseAddress:false;
+	yourself.
 
      (Socket domain:#'AF_INET6' type:#stream)
-        bindTo:nil reuseAddress:false;
-        yourself.
+	bindTo:nil reuseAddress:false;
+	yourself.
 
      (Socket domain:#'AF_INET' type:#stream)
-        bindTo:(IPSocketAddress localHost port:2122) reuseAddress:false;
-        yourself.
+	bindTo:(IPSocketAddress localHost port:2122) reuseAddress:false;
+	yourself.
 
      (Socket domain:#'AF_UNIX' type:#stream)
-        bindTo:nil reuseAddress:false;
-        yourself.
+	bindTo:nil reuseAddress:false;
+	yourself.
     "
 !
 
@@ -1949,7 +1948,7 @@
      aNumber is the number of connect requests, that may be queued on the socket"
 
     handle isNil ifTrue:[
-        ^ self errorNotOpen
+	^ self errorNotOpen
     ].
 %{
 #ifndef NO_SOCKET
@@ -1958,8 +1957,8 @@
     int ret;
 
     if (! __isSmallInteger(aNumber)) {
-        DBGPRINTF(("SOCKET: invalid arg\n"));
-        RETURN (false);
+	DBGPRINTF(("SOCKET: invalid arg\n"));
+	RETURN (false);
     }
 
     sock = SOCKET_FROM_FILE_OBJECT(fp);
@@ -1967,16 +1966,16 @@
 #ifdef LISTEN_BLOCKS
 # ifdef DO_WRAP_CALLS
     do {
-        __threadErrno = 0;
-        ret = STX_WSA_NOINT_CALL2("listen", listen, sock, __intVal(aNumber));
+	__threadErrno = 0;
+	ret = STX_WSA_NOINT_CALL2("listen", listen, sock, __intVal(aNumber));
     } while ((ret < 0) && (__threadErrno == EINTR));
     if (ret < 0) {
-        errno = __threadErrno;
+	errno = __threadErrno;
     }
 # else
     __BEGIN_INTERRUPTABLE__
     do {
-        ret = listen(sock, __intVal(aNumber));
+	ret = listen(sock, __intVal(aNumber));
     } while ((ret < 0) && (errno == EINTR));
     __END_INTERRUPTABLE__
 # endif
@@ -1987,13 +1986,13 @@
 
     if (ret < 0) {
 # ifdef WIN32
-        if (errno == 0) {
-            errno = WSAGetLastError();
-        }
+	if (errno == 0) {
+	    errno = WSAGetLastError();
+	}
 # endif
-        DBGPRINTF(("SOCKET: listen call failed errno=%d\n", errno));
-        __INST(lastErrorNumber) = __MKSMALLINT(errno);
-        RETURN (false);
+	DBGPRINTF(("SOCKET: listen call failed errno=%d\n", errno));
+	__INST(lastErrorNumber) = __MKSMALLINT(errno);
+	RETURN (false);
     }
 #else
     RETURN (false);
@@ -2060,26 +2059,26 @@
     |domainClass socketAddress|
 
     (hostOrPathNameOrSocketAddr isSocketAddress) ifTrue:[
-        socketAddress := hostOrPathNameOrSocketAddr.
-        portNrOrNameOrNil notNil ifTrue:[
-            socketAddress port:portNrOrNameOrNil.
-        ].
+	socketAddress := hostOrPathNameOrSocketAddr.
+	portNrOrNameOrNil notNil ifTrue:[
+	    socketAddress port:portNrOrNameOrNil.
+	].
     ] ifFalse:[
-        "backward compatibility: support for byteArray and string arg"
-        domainClass := self class socketAddressClassForDomain:domain.
-        domainClass isNil ifTrue:[
-            ^ self error:'invalid (unsupported) domain'.
-        ].
-
-        hostOrPathNameOrSocketAddr isString ifTrue:[
-            socketAddress := domainClass hostName:hostOrPathNameOrSocketAddr serviceName:portNrOrNameOrNil type:#SOCK_STREAM.
-            peerName := hostOrPathNameOrSocketAddr.
-        ] ifFalse:[
-            hostOrPathNameOrSocketAddr isByteCollection ifFalse:[
-                ^ self error:'connectTo: bad host (socketAddress) argument'
-            ].
-            socketAddress := domainClass hostAddress:hostOrPathNameOrSocketAddr port:portNrOrNameOrNil.
-        ].
+	"backward compatibility: support for byteArray and string arg"
+	domainClass := self class socketAddressClassForDomain:domain.
+	domainClass isNil ifTrue:[
+	    ^ self error:'invalid (unsupported) domain'.
+	].
+
+	hostOrPathNameOrSocketAddr isString ifTrue:[
+	    socketAddress := domainClass hostName:hostOrPathNameOrSocketAddr serviceName:portNrOrNameOrNil type:#SOCK_STREAM.
+	    peerName := hostOrPathNameOrSocketAddr.
+	] ifFalse:[
+	    hostOrPathNameOrSocketAddr isByteCollection ifFalse:[
+		^ self error:'connectTo: bad host (socketAddress) argument'
+	    ].
+	    socketAddress := domainClass hostAddress:hostOrPathNameOrSocketAddr port:portNrOrNameOrNil.
+	].
     ].
 
     ^ self connectTo:socketAddress withTimeout:timeout.
@@ -2107,7 +2106,7 @@
     |isAsync err|
 
     handle isNil ifTrue:[
-        ^ self errorNotOpen
+	^ self errorNotOpen
     ].
 
 %{  /* STACK: 100000 */
@@ -2123,25 +2122,25 @@
     int sockaddr_size;
 
     if (!__isNonNilObject(aSocketAddress) || !__isBytes(aSocketAddress)) {
-        DBGPRINTF(("SOCKET: invalid socketAddress\n"));
-        err = @symbol(argumentError);
-        goto out;
+	DBGPRINTF(("SOCKET: invalid socketAddress\n"));
+	err = @symbol(argumentError);
+	goto out;
     }
 
     {
-        int sockAddrOffs = 0;
-        int nIndex =__byteArraySize(aSocketAddress);
-        OBJ cls = __qClass(aSocketAddress);
-
-        //if (cls != @global(ByteArray))
-        //    sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
-        sockaddr_size = nIndex - sockAddrOffs;
-        if (sockaddr_size > sizeof(sa)) {
-            DBGPRINTF(("SOCKET: invalid (short) socketAddress\n"));
-            err = @symbol(argumentError);
-            goto out;
-        }
-        memcpy(&sa, __byteArrayVal(aSocketAddress) + sockAddrOffs, sockaddr_size);
+	int sockAddrOffs = 0;
+	int nIndex =__byteArraySize(aSocketAddress);
+	OBJ cls = __qClass(aSocketAddress);
+
+	//if (cls != @global(ByteArray))
+	//    sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
+	sockaddr_size = nIndex - sockAddrOffs;
+	if (sockaddr_size > sizeof(sa)) {
+	    DBGPRINTF(("SOCKET: invalid (short) socketAddress\n"));
+	    err = @symbol(argumentError);
+	    goto out;
+	}
+	memcpy(&sa, __byteArrayVal(aSocketAddress) + sockAddrOffs, sockaddr_size);
     }
 
     sock = SOCKET_FROM_FILE_OBJECT(fp);
@@ -2160,22 +2159,22 @@
      */
 
 # if defined(DO_WRAP_CALLS)
-    // __setWrapCallDebugging(1,1); 
+    // __setWrapCallDebugging(1,1);
 
 
     do {
-        DBGFPRINTF((stderr, "SOCKET: (sock=%d) connect...\n", sock));
-        ret = STX_WSA_NOINT_CALL3("connect", connect, sock, &sa, (INT)sockaddr_size);
-        DBGFPRINTF((stderr, "SOCKET: connect(%d) -> %"_ld_" (%d)\n", sock, (INT)ret, __threadErrno));
+	DBGFPRINTF((stderr, "SOCKET: (sock=%d) connect...\n", sock));
+	ret = STX_WSA_NOINT_CALL3("connect", connect, sock, &sa, (INT)sockaddr_size);
+	DBGFPRINTF((stderr, "SOCKET: connect(%d) -> %"_ld_" (%d)\n", sock, (INT)ret, __threadErrno));
     } while ((ret < 0) && (__threadErrno == EINTR));
 
     if (ret < 0) {
-        int optLen = sizeof(errno);
-        errno = __threadErrno;
+	int optLen = sizeof(errno);
+	errno = __threadErrno;
 #if 0
-        if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &errno, &optLen) == SOCKET_ERROR) {
-            DBGFPRINTF((stderr, "SOCKET: getsockopt(SO_ERROR) failed: %d\n", WSAGetLastError()));
-        }
+	if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &errno, &optLen) == SOCKET_ERROR) {
+	    DBGFPRINTF((stderr, "SOCKET: getsockopt(SO_ERROR) failed: %d\n", WSAGetLastError()));
+	}
 #endif
     }
 
@@ -2183,50 +2182,50 @@
 # else
     __BEGIN_INTERRUPTABLE__
     do {
-        ret = connect(sock, (struct sockaddr *)&sa, sockaddr_size);
+	ret = connect(sock, (struct sockaddr *)&sa, sockaddr_size);
     } while ((ret < 0)
-             && ((errno == EINTR)
+	     && ((errno == EINTR)
 # ifdef EAGAIN
-                 || (errno == EAGAIN)
+		 || (errno == EAGAIN)
 # endif
-                ));
+		));
     __END_INTERRUPTABLE__
 #endif
 
     if (ret < 0) {
 # if defined(EINPROGRESS) || defined(EALREADY)
-        if (0
+	if (0
 #  ifdef EINPROGRESS
-            || (errno == EINPROGRESS)
+	    || (errno == EINPROGRESS)
 #  endif
 #  ifdef EALREADY
-            || (errno == EALREADY)
+	    || (errno == EALREADY)
 #  endif
-        ) {
-            /*
-             * This was a nonblocking operation that will take some time.
-             * Do a select on read to get informed when the operation is ready.
-             */
-            DBGFPRINTF((stderr, "SOCKET: isAsync is true\n"));
-            isAsync = true;
-        } else
+	) {
+	    /*
+	     * This was a nonblocking operation that will take some time.
+	     * Do a select on read to get informed when the operation is ready.
+	     */
+	    DBGFPRINTF((stderr, "SOCKET: isAsync is true\n"));
+	    isAsync = true;
+	} else
 # endif /* EINPROGRESS or EALREADY */
-        {
-            DBGFPRINTF((stderr, "SOCKET: connect failed ret=%"_ld_" errno=%d __threadErrno=%d\n",
-                        (INT)ret, errno, __threadErrno ));
+	{
+	    DBGFPRINTF((stderr, "SOCKET: connect failed ret=%"_ld_" errno=%d __threadErrno=%d\n",
+			(INT)ret, errno, __threadErrno ));
 # ifdef DUMP_ADDRESS
-            {
-                unsigned char *cp = (unsigned char *)(&sa);
-                int i;
-
-                console_printf("address data:\n");
-                for (i=0; i<sockaddr_size; i++) {
-                    console_printf(" %02x\n", *cp++);
-                }
-            }
+	    {
+		unsigned char *cp = (unsigned char *)(&sa);
+		int i;
+
+		console_printf("address data:\n");
+		for (i=0; i<sockaddr_size; i++) {
+		    console_printf(" %02x\n", *cp++);
+		}
+	    }
 # endif
-            err = __MKSMALLINT(errno);
-        }
+	    err = __MKSMALLINT(errno);
+	}
     }
 
 # if defined(O_NONBLOCK) && !defined(WIN32)
@@ -2238,35 +2237,35 @@
 # endif /* NO_SOCKET */
 out:;
 %}.
-    
+
     err notNil ifTrue:[
-        err isSymbol ifTrue:[
-            self primitiveFailed:err.
-        ].
-        lastErrorNumber := err.
-        ^ false.
-        "/ Once we will raise an exception instead of returning false (and have to change some code above):
+	err isSymbol ifTrue:[
+	    self primitiveFailed:err.
+	].
+	lastErrorNumber := err.
+	^ false.
+	"/ Once we will raise an exception instead of returning false (and have to change some code above):
 "/        (OperatingSystem errorHolderForNumber:err) reportError.
     ].
     isAsync == true ifTrue:[
-        (self writeWaitWithTimeoutMs:timeout) ifTrue:[
-            "/ a timeout occured
-            "/ should I cancel the connect?
-            ^ false.
-        ].
-        err := self getSocketError.
-        err ~~ 0 ifTrue:[
-            lastErrorNumber := err.
-            ^ false.
-        ].
+	(self writeWaitWithTimeoutMs:timeout) ifTrue:[
+	    "/ a timeout occured
+	    "/ should I cancel the connect?
+	    ^ false.
+	].
+	err := self getSocketError.
+	err ~~ 0 ifTrue:[
+	    lastErrorNumber := err.
+	    ^ false.
+	].
     ].
 
 
     peer := aSocketAddress.
     port isNil ifTrue:[
-        "socket has not been explicitly bound,
-         after connect it has been bound implicitly - fetch the port"
-        port := self getFullSocketAddress port.
+	"socket has not been explicitly bound,
+	 after connect it has been bound implicitly - fetch the port"
+	port := self getFullSocketAddress port.
     ].
     ^ true
 
@@ -2300,69 +2299,69 @@
     OBJ fp = __INST(handle);
 
     if (fp != nil) {
-        SOCKET sock;
-        INT objSize, offs;
-        INT n;
-        char *extPtr;
-        unsigned char *buffer;
-        unsigned char *allocatedBuffer = NULL;
-        INT flags = 0;
-
-        sock = SOCKET_FROM_FILE_OBJECT(fp);
-
-        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
-        if (__isSmallInteger(nBytes)) {
-            if (__intVal(nBytes) < objSize) {
-                objSize = __intVal(nBytes);
-            }
-        }
+	SOCKET sock;
+	INT objSize, offs;
+	INT n;
+	char *extPtr;
+	unsigned char *buffer;
+	unsigned char *allocatedBuffer = NULL;
+	INT flags = 0;
+
+	sock = SOCKET_FROM_FILE_OBJECT(fp);
+
+	if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
+	if (__isSmallInteger(nBytes)) {
+	    if (__intVal(nBytes) < objSize) {
+		objSize = __intVal(nBytes);
+	    }
+	}
 
 # ifdef DO_WRAP_CALLS
-        if (extPtr) {
-            buffer = extPtr + offs;
-        } else {
-            allocatedBuffer = buffer = (char *)malloc(objSize);
-        }
-
-        do {
-            __threadErrno = 0;
-            n = (INT)STX_WSA_NOINT_CALL4("recv", recv, sock, buffer, objSize, flags);
-        } while ((n < 0) && (__threadErrno == EINTR));
-        if (n < 0) {
-            errno = __threadErrno;
-        }
-        
-        if (allocatedBuffer) {
-            if (n > 0) {
-                bcopy(allocatedBuffer, (char *)__InstPtr(aDataBuffer) + offs, n);
-            }
-            free(allocatedBuffer);
-        }
+	if (extPtr) {
+	    buffer = extPtr + offs;
+	} else {
+	    allocatedBuffer = buffer = (char *)malloc(objSize);
+	}
+
+	do {
+	    __threadErrno = 0;
+	    n = (INT)STX_WSA_NOINT_CALL4("recv", recv, sock, buffer, objSize, flags);
+	} while ((n < 0) && (__threadErrno == EINTR));
+	if (n < 0) {
+	    errno = __threadErrno;
+	}
+
+	if (allocatedBuffer) {
+	    if (n > 0) {
+		bcopy(allocatedBuffer, (char *)__InstPtr(aDataBuffer) + offs, n);
+	    }
+	    free(allocatedBuffer);
+	}
 # else
-        __BEGIN_INTERRUPTABLE__
-        do {
-            if (extPtr) {
-                n = recv(sock, extPtr + offs, objSize, flags);
-            } else {
-                n = recv(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, flags);
-            }
-        } while ((n < 0) && (errno == EINTR));
-        __END_INTERRUPTABLE__
+	__BEGIN_INTERRUPTABLE__
+	do {
+	    if (extPtr) {
+		n = recv(sock, extPtr + offs, objSize, flags);
+	    } else {
+		n = recv(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, flags);
+	    }
+	} while ((n < 0) && (errno == EINTR));
+	__END_INTERRUPTABLE__
 # endif
 
-        if (n < 0) {
-            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
-        } else {
-            RETURN(__MKSMALLINT(n));
-        }        
+	if (n < 0) {
+	    error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
+	} else {
+	    RETURN(__MKSMALLINT(n));
+	}
     }
 #endif
 bad: ;
 %}.
     error notNil ifTrue:[
-        ^ ReadError
-            raiseRequestWith:self
-            errorString:(' : ' , OperatingSystem errorTextForNumber:error)
+	^ ReadError
+	    raiseRequestWith:self
+	    errorString:(' : ' , OperatingSystem errorTextForNumber:error)
     ].
     "
      arrive here if you try to receive into an invalid buffer (i.e. not ByteArray-like)
@@ -2398,17 +2397,17 @@
 
     domainClass := self class socketAddressClassForDomain:domain.
     domainClass isNil ifTrue:[
-        ^ self error:'invalid (unsupported) domain'.
+	^ self error:'invalid (unsupported) domain'.
     ].
     (anAddressBuffer isKindOf:SocketAddress) ifTrue:[
-        anAddressBuffer class == domainClass ifFalse:[
-            ^ self error:'addressBuffer class mismatch (domain)'.
-        ].
-        addr := anAddressBuffer.
+	anAddressBuffer class == domainClass ifFalse:[
+	    ^ self error:'addressBuffer class mismatch (domain)'.
+	].
+	addr := anAddressBuffer.
     ] ifFalse:[
-        anAddressBuffer notNil ifTrue:[
-            addr := domainClass new.
-        ].
+	anAddressBuffer notNil ifTrue:[
+	    addr := domainClass new.
+	].
     ].
 
 %{
@@ -2416,106 +2415,106 @@
     OBJ fp = __INST(handle);
 
     if (fp != nil) {
-        SOCKET sock;
-        INT objSize;
-        union sockaddr_u sa;
-        unsigned INT alen = 0;
-        INT n, offs;
-        INT flags = 0;
-        char *extPtr;
-        unsigned char *allocatedBuffer = NULL;
-        unsigned char *buffer = NULL;
-
-        sock = SOCKET_FROM_FILE_OBJECT(fp);
-
-        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
-        if (__isSmallInteger(nBytes)) {
-            if (__intVal(nBytes) < objSize) {
-                objSize = __intVal(nBytes);
-            }
-        }
+	SOCKET sock;
+	INT objSize;
+	union sockaddr_u sa;
+	unsigned INT alen = 0;
+	INT n, offs;
+	INT flags = 0;
+	char *extPtr;
+	unsigned char *allocatedBuffer = NULL;
+	unsigned char *buffer = NULL;
+
+	sock = SOCKET_FROM_FILE_OBJECT(fp);
+
+	if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
+	if (__isSmallInteger(nBytes)) {
+	    if (__intVal(nBytes) < objSize) {
+		objSize = __intVal(nBytes);
+	    }
+	}
 # ifdef DO_WRAP_CALLS
-        if (extPtr) {
-            buffer = extPtr + offs;
-        } else {
-            allocatedBuffer = buffer = (char *)malloc(objSize);
-        }
-
-        do {
-            __threadErrno = 0;
-            alen = sizeof(sa);
-            n = (INT)STX_WSA_NOINT_CALL6("recvfrom", recvfrom, sock, buffer, objSize, flags, (struct sockaddr *)&sa, &alen);
-        } while ((n < 0) && (__threadErrno == EINTR));
-        if (n < 0) {
-            errno = __threadErrno;
-        }
-
-        if (allocatedBuffer) {
-            if (n > 0) {
-                memcpy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, n);
-            }
-            free(allocatedBuffer);
-        }
+	if (extPtr) {
+	    buffer = extPtr + offs;
+	} else {
+	    allocatedBuffer = buffer = (char *)malloc(objSize);
+	}
+
+	do {
+	    __threadErrno = 0;
+	    alen = sizeof(sa);
+	    n = (INT)STX_WSA_NOINT_CALL6("recvfrom", recvfrom, sock, buffer, objSize, flags, (struct sockaddr *)&sa, &alen);
+	} while ((n < 0) && (__threadErrno == EINTR));
+	if (n < 0) {
+	    errno = __threadErrno;
+	}
+
+	if (allocatedBuffer) {
+	    if (n > 0) {
+		memcpy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, n);
+	    }
+	    free(allocatedBuffer);
+	}
 # else
-        __BEGIN_INTERRUPTABLE__
-        do {
-            alen = sizeof(sa);
-            if (extPtr) {
-                n = recvfrom(sock, extPtr + offs, objSize, flags, (struct sockaddr *) &sa, &alen);
-            } else {
-                n = recvfrom(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, flags, (struct sockaddr *) &sa, &alen);
-            }
-        } while ((n < 0) && (errno == EINTR));
-        __END_INTERRUPTABLE__
+	__BEGIN_INTERRUPTABLE__
+	do {
+	    alen = sizeof(sa);
+	    if (extPtr) {
+		n = recvfrom(sock, extPtr + offs, objSize, flags, (struct sockaddr *) &sa, &alen);
+	    } else {
+		n = recvfrom(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, flags, (struct sockaddr *) &sa, &alen);
+	    }
+	} while ((n < 0) && (errno == EINTR));
+	__END_INTERRUPTABLE__
 # endif
 
-        if (n >= 0) {
-            if (__isNonNilObject(addr)) {
-                char *addrPtr;
-                OBJ oClass;
-                int nInstVars, nInstBytes, objSize;
-
-                oClass = __qClass(addr);
-                if (! __isBytes(addr) )
-                    goto bad;
-                nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
-                nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ));
-                objSize = __qSize(addr) - nInstBytes;
-                addrPtr = (char *)__InstPtr(addr) + nInstBytes;
-                if (objSize < alen)
-                    goto bad;
-
-                /*
-                 * extract the datagrams address
-                 */
-                memcpy(addrPtr, (char *)&sa, alen);
-                addrLen = __MKSMALLINT(alen);
-            }
-        }
-        if (n < 0) {
-            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
-        }
-        nReceived = __MKSMALLINT(n);
+	if (n >= 0) {
+	    if (__isNonNilObject(addr)) {
+		char *addrPtr;
+		OBJ oClass;
+		int nInstVars, nInstBytes, objSize;
+
+		oClass = __qClass(addr);
+		if (! __isBytes(addr) )
+		    goto bad;
+		nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
+		nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ));
+		objSize = __qSize(addr) - nInstBytes;
+		addrPtr = (char *)__InstPtr(addr) + nInstBytes;
+		if (objSize < alen)
+		    goto bad;
+
+		/*
+		 * extract the datagrams address
+		 */
+		memcpy(addrPtr, (char *)&sa, alen);
+		addrLen = __MKSMALLINT(alen);
+	    }
+	}
+	if (n < 0) {
+	    error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
+	}
+	nReceived = __MKSMALLINT(n);
     }
 #endif
 bad: ;
 %}.
     error notNil ifTrue:[
-        ^ ReadError
-            raiseRequestWith:self
-            errorString:(' : ' , OperatingSystem errorTextForNumber:error)
+	^ ReadError
+	    raiseRequestWith:self
+	    errorString:(' : ' , OperatingSystem errorTextForNumber:error)
     ].
 
     nReceived notNil ifTrue:[
-        addrLen notNil ifTrue:[
-            (addr == anAddressBuffer) ifFalse:[
-                self obsoleteFeatureWarning:'please use a socketAddress argument'.
-
-                "can be a ByteArray for backward compatibility"
-                anAddressBuffer replaceFrom:1 to:addrLen with:(addr hostAddress).
-            ].
-        ].
-        ^ nReceived
+	addrLen notNil ifTrue:[
+	    (addr == anAddressBuffer) ifFalse:[
+		self obsoleteFeatureWarning:'please use a socketAddress argument'.
+
+		"can be a ByteArray for backward compatibility"
+		anAddressBuffer replaceFrom:1 to:addrLen with:(addr hostAddress).
+	    ].
+	].
+	^ nReceived
     ].
     "
      arrive here if you try to receive into an invalid buffer
@@ -2543,73 +2542,73 @@
     if ((fp != nil)
      && __isSmallInteger(startIndex)
      && __isSmallInteger(nBytes)) {
-        SOCKET sock;
-        INT objSize;
-        INT n;
-        char *extPtr;
-        INT _flags = 0;
-        INT offs;
-        unsigned long norder;
-        unsigned char *buffer;
-        unsigned char *allocatedBuffer = NULL;
-
-        _flags = __longIntVal(flags);
-
-        sock = SOCKET_FROM_FILE_OBJECT(fp);
-
-        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
-        if (__isSmallInteger(nBytes)) {
-            if (__intVal(nBytes) < objSize) {
-                objSize = __intVal(nBytes);
-            }
-        }
+	SOCKET sock;
+	INT objSize;
+	INT n;
+	char *extPtr;
+	INT _flags = 0;
+	INT offs;
+	unsigned long norder;
+	unsigned char *buffer;
+	unsigned char *allocatedBuffer = NULL;
+
+	_flags = __longIntVal(flags);
+
+	sock = SOCKET_FROM_FILE_OBJECT(fp);
+
+	if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
+	if (__isSmallInteger(nBytes)) {
+	    if (__intVal(nBytes) < objSize) {
+		objSize = __intVal(nBytes);
+	    }
+	}
 
 # ifdef DGRAM_DEBUG
-        console_printf("sending %d bytes ...\n", nBytes);
+	console_printf("sending %d bytes ...\n", nBytes);
 # endif
 
 #ifdef DO_WRAP_CALLS
-        if (extPtr) {
-            buffer = extPtr + offs;
-        } else {
-            allocatedBuffer = buffer = (char *)malloc(objSize);
-            bcopy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, objSize);
-        }
-
-        do {
-            __threadErrno = 0;
-            n = (INT)STX_WSA_NOINT_CALL4("send", send, sock, buffer, objSize, _flags);
-        } while ((n < 0) && (__threadErrno == EINTR));
-        if (n < 0) {
-            errno = __threadErrno;
-        }
-
-        if (allocatedBuffer) {
-            free(allocatedBuffer);
-        }
+	if (extPtr) {
+	    buffer = extPtr + offs;
+	} else {
+	    allocatedBuffer = buffer = (char *)malloc(objSize);
+	    bcopy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, objSize);
+	}
+
+	do {
+	    __threadErrno = 0;
+	    n = (INT)STX_WSA_NOINT_CALL4("send", send, sock, buffer, objSize, _flags);
+	} while ((n < 0) && (__threadErrno == EINTR));
+	if (n < 0) {
+	    errno = __threadErrno;
+	}
+
+	if (allocatedBuffer) {
+	    free(allocatedBuffer);
+	}
 #else
-        __BEGIN_INTERRUPTABLE__
-        do {
-            if (extPtr) {
-                n = send(sock, extPtr + offs, objSize, _flags);
-            } else {
-                n = send(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags);
-            }
-        } while ((n < 0) && (errno == EINTR));
-        __END_INTERRUPTABLE__
+	__BEGIN_INTERRUPTABLE__
+	do {
+	    if (extPtr) {
+		n = send(sock, extPtr + offs, objSize, _flags);
+	    } else {
+		n = send(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags);
+	    }
+	} while ((n < 0) && (errno == EINTR));
+	__END_INTERRUPTABLE__
 #endif
 
-        if (n < 0) {
-            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
-        } else {
-            RETURN (__MKSMALLINT(n));
-        }            
+	if (n < 0) {
+	    error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
+	} else {
+	    RETURN (__MKSMALLINT(n));
+	}
     }
 #endif
 bad: ;
 %}.
     error notNil ifTrue:[
-        self writeError:error.
+	self writeError:error.
     ].
 
     "
@@ -2657,16 +2656,16 @@
     |domainClass addr error|
 
     (anAddressBuffer isKindOf:SocketAddress) ifTrue:[
-        addr := anAddressBuffer.
+	addr := anAddressBuffer.
     ] ifFalse:[
-        anAddressBuffer isByteArray ifFalse:[
-            ^ self error:'bad socketAddress argument'
-        ].
-        domainClass := self class socketAddressClassForDomain:domain.
-        domainClass isNil ifTrue:[
-            ^ self error:'invalid (unsupported) domain'.
-        ].
-        addr := domainClass hostAddress:anAddressBuffer.
+	anAddressBuffer isByteArray ifFalse:[
+	    ^ self error:'bad socketAddress argument'
+	].
+	domainClass := self class socketAddressClassForDomain:domain.
+	domainClass isNil ifTrue:[
+	    ^ self error:'invalid (unsupported) domain'.
+	].
+	addr := domainClass hostAddress:anAddressBuffer.
     ].
 %{
 #ifndef NO_SOCKET
@@ -2675,92 +2674,92 @@
     if ((fp != nil)
      && __isSmallInteger(startIndex)
      && __isSmallInteger(nBytes)) {
-        SOCKET sock;
-        INT objSize;
-        struct sockaddr *sockaddr_ptr;
-        union sockaddr_u sa;
-        INT alen = 0;
-        INT sockAddrOffs, sockaddr_size;
-        INT n;
-        char *extPtr;
-        INT _flags = 0;
-        INT offs;
-        unsigned long norder;
-        unsigned char *buffer;
-        unsigned char *allocatedBuffer = NULL;
-
-        _flags = __longIntVal(flags);
-        sock = SOCKET_FROM_FILE_OBJECT(fp);
-
-        if (! __isBytes(addr)) {
-            sockaddr_size = 0;
-            sockaddr_ptr = (struct sockaddr *)0;
-        } else {
-            int nIndex;
-            OBJ cls;
-
-            sockAddrOffs = 0;
-            if ((cls = __qClass(addr)) != @global(ByteArray))
-                sockAddrOffs += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
-            nIndex = __qSize(addr) - OHDR_SIZE;
-            sockaddr_size = nIndex - sockAddrOffs;
-            if (sockaddr_size > sizeof(sa)) {
-                console_fprintf(stderr, "Socket [warning]: bad socketAddr\n");
-                goto bad;
-            }
-            memcpy(&sa, (__byteArrayVal(addr) + sockAddrOffs), sockaddr_size);
-            sockaddr_ptr = (struct sockaddr *)(&sa);
-        }
-
-        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
-        if (__isSmallInteger(nBytes)) {
-            if (__intVal(nBytes) < objSize) {
-                objSize = __intVal(nBytes);
-            }
-        }
+	SOCKET sock;
+	INT objSize;
+	struct sockaddr *sockaddr_ptr;
+	union sockaddr_u sa;
+	INT alen = 0;
+	INT sockAddrOffs, sockaddr_size;
+	INT n;
+	char *extPtr;
+	INT _flags = 0;
+	INT offs;
+	unsigned long norder;
+	unsigned char *buffer;
+	unsigned char *allocatedBuffer = NULL;
+
+	_flags = __longIntVal(flags);
+	sock = SOCKET_FROM_FILE_OBJECT(fp);
+
+	if (! __isBytes(addr)) {
+	    sockaddr_size = 0;
+	    sockaddr_ptr = (struct sockaddr *)0;
+	} else {
+	    int nIndex;
+	    OBJ cls;
+
+	    sockAddrOffs = 0;
+	    if ((cls = __qClass(addr)) != @global(ByteArray))
+		sockAddrOffs += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
+	    nIndex = __qSize(addr) - OHDR_SIZE;
+	    sockaddr_size = nIndex - sockAddrOffs;
+	    if (sockaddr_size > sizeof(sa)) {
+		console_fprintf(stderr, "Socket [warning]: bad socketAddr\n");
+		goto bad;
+	    }
+	    memcpy(&sa, (__byteArrayVal(addr) + sockAddrOffs), sockaddr_size);
+	    sockaddr_ptr = (struct sockaddr *)(&sa);
+	}
+
+	if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
+	if (__isSmallInteger(nBytes)) {
+	    if (__intVal(nBytes) < objSize) {
+		objSize = __intVal(nBytes);
+	    }
+	}
 
 #ifdef DO_WRAP_CALLS
-        if (extPtr) {
-            buffer = extPtr + offs;
-        } else {
-            allocatedBuffer = buffer = (char *)malloc(objSize);
-            bcopy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, objSize);
-        }
-
-        do {
-            __threadErrno = 0;
-            n = (INT)STX_WSA_NOINT_CALL6("sendto", sendto, sock, buffer, objSize, _flags, sockaddr_ptr, sockaddr_size);
-        } while ((n < 0) && (__threadErrno == EINTR));
-        if (n < 0) {
-            errno = __threadErrno;
-        }
-
-        if (allocatedBuffer) {
-            free(allocatedBuffer);
-        }
+	if (extPtr) {
+	    buffer = extPtr + offs;
+	} else {
+	    allocatedBuffer = buffer = (char *)malloc(objSize);
+	    bcopy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, objSize);
+	}
+
+	do {
+	    __threadErrno = 0;
+	    n = (INT)STX_WSA_NOINT_CALL6("sendto", sendto, sock, buffer, objSize, _flags, sockaddr_ptr, sockaddr_size);
+	} while ((n < 0) && (__threadErrno == EINTR));
+	if (n < 0) {
+	    errno = __threadErrno;
+	}
+
+	if (allocatedBuffer) {
+	    free(allocatedBuffer);
+	}
 #else
-        __BEGIN_INTERRUPTABLE__
-        do {
-            if (extPtr) {
-                n = sendto(sock, extPtr + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
-            } else {
-                n = sendto(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
-            }
-        } while ((n < 0) && (errno == EINTR));
-        __END_INTERRUPTABLE__
+	__BEGIN_INTERRUPTABLE__
+	do {
+	    if (extPtr) {
+		n = sendto(sock, extPtr + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
+	    } else {
+		n = sendto(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
+	    }
+	} while ((n < 0) && (errno == EINTR));
+	__END_INTERRUPTABLE__
 #endif
 
-        if (n < 0) {
-            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
-        } else {
-            RETURN (__MKSMALLINT(n));
-        }            
+	if (n < 0) {
+	    error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
+	} else {
+	    RETURN (__MKSMALLINT(n));
+	}
     }
 #endif
 bad: ;
 %}.
     error notNil ifTrue:[
-        self writeError:error.
+	self writeError:error.
     ].
 
     "
@@ -2783,44 +2782,44 @@
 
     t = __INST(handle);
     if (t != nil) {
-        FILE *fp = __FILEVal(t);
-        int fd  = fileno(fp);
-        SOCKET sock = SOCKET_FROM_FD(fd);
-
-        __INST(handle) = nil;
+	FILE *fp = __FILEVal(t);
+	int fd  = fileno(fp);
+	SOCKET sock = SOCKET_FROM_FD(fd);
+
+	__INST(handle) = nil;
 
 # ifdef DO_WRAP_CALLS
-        {
-          INT ret;
-          // __setWrapCallDebugging(1,1);
-
-          if (__INST(buffered) == true){
-              /* do a fflush() first, so that fclose() doesn't block
-               * we suspect, that EINTR causes problems in fclose()
-               */
-              do {
-                  __threadErrno = 0;
-                  ret = (INT)__STX_C_CALL1("fflush", fflush, fp);
-              } while((ret < 0) && (__threadErrno == EINTR));
-          }
-
-          do {
-            __threadErrno = 0;
-            ret = (INT)STX_C_NOINT_CALL1("fclose", fclose, fp);
-          } while ((ret < 0) && (__threadErrno == EINTR));
-
-          // __setWrapCallDebugging(1,0);
-        }
+	{
+	  INT ret;
+	  // __setWrapCallDebugging(1,1);
+
+	  if (__INST(buffered) == true){
+	      /* do a fflush() first, so that fclose() doesn't block
+	       * we suspect, that EINTR causes problems in fclose()
+	       */
+	      do {
+		  __threadErrno = 0;
+		  ret = (INT)__STX_C_CALL1("fflush", fflush, fp);
+	      } while((ret < 0) && (__threadErrno == EINTR));
+	  }
+
+	  do {
+	    __threadErrno = 0;
+	    ret = (INT)STX_C_NOINT_CALL1("fclose", fclose, fp);
+	  } while ((ret < 0) && (__threadErrno == EINTR));
+
+	  // __setWrapCallDebugging(1,0);
+	}
 # else /* !DO_WRAP_CALLS */
-        if (__INST(buffered) == true){
-            DBGFPRINTF((stderr, "SOCKET: fflush %"_lx_" (%d %d)\n", (INT)fp, fileno(fp), sock));
-            fflush(fp);
-        }
-
-        if ((@global(FileOpenTrace) == true) || __debugging__) {
-            console_fprintf(stderr, "SOCKET: fclose %"_lx_" (%d %d)\n", (INT)fp, fileno(fp), sock);
-        }
-        fclose(fp);
+	if (__INST(buffered) == true){
+	    DBGFPRINTF((stderr, "SOCKET: fflush %"_lx_" (%d %d)\n", (INT)fp, fileno(fp), sock));
+	    fflush(fp);
+	}
+
+	if ((@global(FileOpenTrace) == true) || __debugging__) {
+	    console_fprintf(stderr, "SOCKET: fclose %"_lx_" (%d %d)\n", (INT)fp, fileno(fp), sock);
+	}
+	fclose(fp);
 # endif /* !DO_WRAP_CALLS */
     }
 #endif /* NO_SOCKET */
@@ -2884,22 +2883,22 @@
     |serverSocketFd addr domainClass|
 
     handle notNil ifTrue:[
-        ^ self errorAlreadyOpen
+	^ self errorAlreadyOpen
     ].
 
     domain := aSocket domain.
     socketType := aSocket type.
     serverSocketFd := aSocket fileDescriptor.
     serverSocketFd isNil ifTrue:[
-        ^ self error:'invalid server socket'
+	^ self error:'invalid server socket'
     ].
     (serverSocketFd isMemberOf:SmallInteger) ifFalse:[
-        ^ 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.
 
@@ -2915,25 +2914,25 @@
 
     if (blocking == false) {
 # if defined(O_NONBLOCK) && defined(SET_NDELAY)
-        flags = fcntl(sock, F_GETFL);
-        fcntl(sock, F_SETFL, flags | O_NONBLOCK);
+	flags = fcntl(sock, F_GETFL);
+	fcntl(sock, F_SETFL, flags | O_NONBLOCK);
 # endif
     }
 
 # ifdef DO_WRAP_CALLS
     do {
-        __threadErrno = 0;
-        alen = sizeof(sa);
-        newSock = (SOCKET)STX_WSA_CALL3("accept", accept, sock, &sa, &alen);
+	__threadErrno = 0;
+	alen = sizeof(sa);
+	newSock = (SOCKET)STX_WSA_CALL3("accept", accept, sock, &sa, &alen);
     } while ((newSock < 0) && (__threadErrno == EINTR));
     if (newSock < 0) {
-        errno = __threadErrno;
+	errno = __threadErrno;
     }
 # else
     __BEGIN_INTERRUPTABLE__
     do {
-        alen = sizeof(sa);
-        newSock = accept(sock, (struct sockaddr *) &sa, &alen);
+	alen = sizeof(sa);
+	newSock = accept(sock, (struct sockaddr *) &sa, &alen);
     } while ((newSock < 0) && (errno == EINTR));
     __END_INTERRUPTABLE__
 # endif
@@ -2941,41 +2940,41 @@
 
     if (blocking == false) {
 # if defined(O_NDELAY) && defined(SET_NDELAY)
-        fcntl(sock, F_SETFL, flags);
+	fcntl(sock, F_SETFL, flags);
 # endif
     }
 
     if (newSock < 0) {
-        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);
     }
 
     /*
@@ -2983,51 +2982,51 @@
      */
 # ifdef WIN32
     {
-        int _fd;
-        __stxWrapApiEnterCritical();
+	int _fd;
+	__stxWrapApiEnterCritical();
 #  if defined( __BORLANDC__ ) || defined( __MINGW__ )
-        _fd = _open_osfhandle((long)newSock, 0);
+	_fd = _open_osfhandle((long)newSock, 0);
 #  else
-        _fd = (int)newSock;
+	_fd = (int)newSock;
 #  endif
-        fp = fdopen(_fd, "r+");
-        __stxWrapApiLeaveCritical();
-        DBGPRINTF(("SOCKET: sock=%d fd=%d fp=%"_lx_"\n",newSock, _fd, (INT)fp));
+	fp = fdopen(_fd, "r+");
+	__stxWrapApiLeaveCritical();
+	DBGPRINTF(("SOCKET: sock=%d fd=%d fp=%"_lx_"\n",newSock, _fd, (INT)fp));
     }
 # else
     fp = fdopen(newSock, "r+");
 # endif
 
     if (! fp) {
-        DBGPRINTF(("SOCKET: fdopen call failed\n"));
-        __INST(lastErrorNumber) = __MKSMALLINT(errno);
+	DBGPRINTF(("SOCKET: fdopen call failed\n"));
+	__INST(lastErrorNumber) = __MKSMALLINT(errno);
 #  ifdef DO_WRAP_CALLS
-        {
-          INT ret;
-          do {
-              __threadErrno = 0;
-              ret = (INT)STX_WSA_CALL1("closesocket", closesocket, newSock);
-          } while ((ret < 0) && (__threadErrno == EINTR));
-        }
+	{
+	  INT ret;
+	  do {
+	      __threadErrno = 0;
+	      ret = (INT)STX_WSA_CALL1("closesocket", closesocket, newSock);
+	  } while ((ret < 0) && (__threadErrno == EINTR));
+	}
 #  else
-        closesocket(newSock);
+	closesocket(newSock);
 #  endif
-        DBGFPRINTF((stderr, "SOCKET: close (fdopen failed) (%d)\n", newSock));
-        RETURN (false);
+	DBGFPRINTF((stderr, "SOCKET: close (fdopen failed) (%d)\n", newSock));
+	RETURN (false);
     }
     __INST(handleType) = @symbol(socketFilePointer);
 
     if ((@global(FileOpenTrace) == true) || __debugging__) {
 # ifdef WIN32
-        {
-            HANDLE h;
-
-            int _fd = fileno(fp);
-            h = (HANDLE)_get_osfhandle(_fd);
-            console_fprintf(stderr, "fdopen [Socket] -> %"_lx_" (fd: %d) (H: %"_lx_")\n", (INT)fp, _fd, (INT)h);
-        }
+	{
+	    HANDLE h;
+
+	    int _fd = fileno(fp);
+	    h = (HANDLE)_get_osfhandle(_fd);
+	    console_fprintf(stderr, "fdopen [Socket] -> %"_lx_" (fd: %d) (H: %"_lx_")\n", (INT)fp, _fd, (INT)h);
+	}
 # else
-        console_fprintf(stderr, "fdopen [Socket] -> %"_lx_" (fd: %d)\n", (INT)fp, newSock);
+	console_fprintf(stderr, "fdopen [Socket] -> %"_lx_" (fd: %d)\n", (INT)fp, newSock);
 # endif
     }
 
@@ -3045,11 +3044,11 @@
     // object.
 # endif
     {
-        OBJ t;
-
-        t = __MKEXTERNALADDRESS(fp);
-        __INST(handle) = t;
-        __STORE(self, t);
+	OBJ t;
+
+	t = __MKEXTERNALADDRESS(fp);
+	__INST(handle) = t;
+	__STORE(self, t);
     }
 #endif /* not NO_SOCKET */
 %}.
@@ -3366,12 +3365,12 @@
     |error domainClass addr|
 
     handle isNil ifTrue:[
-        ^ self errorNotOpen
+	^ self errorNotOpen
     ].
 
     domainClass := self class socketAddressClassForDomain:domain.
     domainClass isNil ifTrue:[
-        ^ self error:'invalid (unsupported) domain'.
+	^ self error:'invalid (unsupported) domain'.
     ].
     addr := domainClass new.
 
@@ -3388,9 +3387,9 @@
     int nAddrInstVars;
 
     if (!__isNonNilObject(addr) || !__isBytes(addr)) {
-        DBGPRINTF(("SOCKET: bad addr\n"));
-        error = @symbol(badArgument);
-        goto err;
+	DBGPRINTF(("SOCKET: bad addr\n"));
+	error = @symbol(badArgument);
+	goto err;
     }
 
     addrClass = __qClass(addr);
@@ -3402,17 +3401,17 @@
     ret = getpeername(sock, (struct sockaddr *)&sa, &alen);
     if (ret < 0) {
 # ifdef WIN32
-        errno = WSAGetLastError();
+	errno = WSAGetLastError();
 # endif
-        DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
-        error = __MKSMALLINT(errno);
-        goto err;
+	DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
+	error = __MKSMALLINT(errno);
+	goto err;
     }
 
     if (addrObjSize < alen) {
-        DBGPRINTF(("SOCKET: bad addr\n"));
-        error = @symbol(badArgument);
-        goto err;
+	DBGPRINTF(("SOCKET: bad addr\n"));
+	error = @symbol(badArgument);
+	goto err;
     }
 
     addrP = (char *)__InstPtr(addr) + nAddrInstBytes;
@@ -3424,7 +3423,7 @@
 #endif /* NO_SOCKET */
 %}.
     error notNil ifTrue:[
-        ^ self errorReporter reportOn:error
+	^ self errorReporter reportOn:error
     ].
     ^ addr
 !
@@ -3437,12 +3436,12 @@
     |error domainClass addr|
 
     handle isNil ifTrue:[
-        ^ self errorNotOpen
+	^ self errorNotOpen
     ].
 
     domainClass := self class socketAddressClassForDomain:domain.
     domainClass isNil ifTrue:[
-        ^ self error:'invalid (unsupported) domain'.
+	^ self error:'invalid (unsupported) domain'.
     ].
     addr := domainClass new.
 
@@ -3457,36 +3456,36 @@
     int addrObjSize, nAddrInstBytes;
 
     if (!__isNonNilObject(addr) || !__isBytes(addr)) {
-        DBGPRINTF(("SOCKET: bad addr\n"));
-        error = @symbol(badArgument);
-        goto err;
+	DBGPRINTF(("SOCKET: bad addr\n"));
+	error = @symbol(badArgument);
+	goto err;
     }
 
     {
-        OBJ addrClass;
-        int nAddrInstVars;
-
-        addrClass = __qClass(addr);
-        nAddrInstVars = __intVal(__ClassInstPtr(addrClass)->c_ninstvars);
-        nAddrInstBytes = OHDR_SIZE + (nAddrInstVars * sizeof(OBJ));
-        addrObjSize = __qSize(addr) - nAddrInstBytes;
+	OBJ addrClass;
+	int nAddrInstVars;
+
+	addrClass = __qClass(addr);
+	nAddrInstVars = __intVal(__ClassInstPtr(addrClass)->c_ninstvars);
+	nAddrInstBytes = OHDR_SIZE + (nAddrInstVars * sizeof(OBJ));
+	addrObjSize = __qSize(addr) - nAddrInstBytes;
     }
 
     sock = SOCKET_FROM_FILE_OBJECT(fp);
     ret = getsockname(sock, (struct sockaddr *)&sa, &alen);
     if (ret < 0) {
 # ifdef WIN32
-        errno = WSAGetLastError();
+	errno = WSAGetLastError();
 # endif
-        DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
-        error = __MKSMALLINT(errno);
-        goto err;
+	DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
+	error = __MKSMALLINT(errno);
+	goto err;
     }
 
     if (addrObjSize < alen) {
-        DBGPRINTF(("SOCKET: bad addr\n"));
-        error = @symbol(badArgument);
-        goto err;
+	DBGPRINTF(("SOCKET: bad addr\n"));
+	error = @symbol(badArgument);
+	goto err;
     }
 
     addrP = (char *)__InstPtr(addr) + nAddrInstBytes;
@@ -3498,7 +3497,7 @@
 #endif /* NO_SOCKET */
 %}.
     error notNil ifTrue:[
-        ^ self errorReporter reportOn:error
+	^ self errorReporter reportOn:error
     ].
     ^ addr
 !
@@ -3566,7 +3565,7 @@
 
     domainClass := self class socketAddressClassForDomain:domain.
     domainClass isNil ifTrue:[
-        ^ self error:'invalid (unsupported) domain'.
+	^ self error:'invalid (unsupported) domain'.
     ].
     ^ domainClass.
 !
@@ -3597,7 +3596,7 @@
     |domainName domainCode typeCode error|
 
     handle notNil ifTrue:[
-        ^ self errorAlreadyOpen
+	^ self errorAlreadyOpen
     ].
     domainName := SocketAddress domainCodeFromName:domainArg.
     domainCode := OperatingSystem domainCodeOf:domainName.
@@ -3617,19 +3616,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);
     }
 
 
@@ -3642,110 +3641,110 @@
 # 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));
-        __INST(lastErrorNumber) = __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 a FILE *
-         */
-        {
-            int _fd;
-            __stxWrapApiEnterCritical();
+	/*
+	 * make it blocking
+	 */
+	{
+	    unsigned long zero = 0;
+	    ioctlsocket(sock, FIONBIO, &zero);
+	}
+	/*
+	 * make it a FILE *
+	 */
+	{
+	    int _fd;
+	    __stxWrapApiEnterCritical();
 #  if defined( __BORLANDC__ ) || defined( __MINGW__ )
-            _fd = _open_osfhandle((long)sock, 0);
+	    _fd = _open_osfhandle((long)sock, 0);
 #  else
-            _fd = (int)sock;
+	    _fd = (int)sock;
 #  endif
-            fp = fdopen(_fd, "r+");
-            __stxWrapApiLeaveCritical();
-            DBGPRINTF(("SOCKET: sock=%d fd=%d fp=%"_lx_"\n",sock, _fd, (INT)fp));
-        }
+	    fp = fdopen(_fd, "r+");
+	    __stxWrapApiLeaveCritical();
+	    DBGPRINTF(("SOCKET: sock=%d fd=%d fp=%"_lx_"\n",sock, _fd, (INT)fp));
+	}
 # else
-        fp = fdopen(sock, "r+");
+	fp = fdopen(sock, "r+");
 # endif
-        if (! fp) {
-            DBGPRINTF(("SOCKET: fdopen call failed\n"));
-            __INST(lastErrorNumber) = __MKSMALLINT(errno);
+	if (! fp) {
+	    DBGPRINTF(("SOCKET: fdopen call failed\n"));
+	    error = __MKSMALLINT(errno);
 # ifdef DO_WRAP_CALLS
-            {
-                INT ret;
-
-                do {
-                  __threadErrno = 0;
-                  ret = (INT)STX_WSA_NOINT_CALL1("closesocket", closesocket, sock);
-                } while ((ret < 0) && (__threadErrno == EINTR));
-            }
+	    {
+		INT ret;
+
+		do {
+		  __threadErrno = 0;
+		  ret = (INT)STX_WSA_NOINT_CALL1("closesocket", closesocket, sock);
+		} while ((ret < 0) && (__threadErrno == EINTR));
+	    }
 # else
-            __BEGIN_INTERRUPTABLE__
-            closesocket(sock);
-            DBGFPRINTF((stderr, "SOCKET: fdopen failed (%d)\n", sock));
-            __END_INTERRUPTABLE__
+	    __BEGIN_INTERRUPTABLE__
+	    closesocket(sock);
+	    DBGFPRINTF((stderr, "SOCKET: fdopen failed (%d)\n", sock));
+	    __END_INTERRUPTABLE__
 # endif
-        } else {
-            __INST(handleType) = @symbol(socketFilePointer);
-
-            if ((@global(FileOpenTrace) == true) || __debugging__) {
-                console_fprintf(stderr, "fdopen [Socket] -> %"_lx_"\n", (INT)fp);
-            }
+	} else {
+	    __INST(handleType) = @symbol(socketFilePointer);
+
+	    if ((@global(FileOpenTrace) == true) || __debugging__) {
+		console_fprintf(stderr, "fdopen [Socket] -> %"_lx_"\n", (INT)fp);
+	    }
 
 # if 0
-            // The original code was:
-            __INST(handle) = __MKEXTERNALADDRESS(fp); __STORESELF(handle);
-            // but for that, gcc generates wrong code, which loads self (volatile) into
-            // a register (bp), then calls __MKEXTERNALADDRESS, then stores indirect bp.
-            // That is wrong if a scavenge occurs in __MKEXTERNALADDRESS, as bp is now still pointing to the old
-            // object.
+	    // The original code was:
+	    __INST(handle) = __MKEXTERNALADDRESS(fp); __STORESELF(handle);
+	    // but for that, gcc generates wrong code, which loads self (volatile) into
+	    // a register (bp), then calls __MKEXTERNALADDRESS, then stores indirect bp.
+	    // That is wrong if a scavenge occurs in __MKEXTERNALADDRESS, as bp is now still pointing to the old
+	    // object.
 # endif
-            {
-                OBJ t;
-
-                t = __MKEXTERNALADDRESS(fp);
-                __INST(handle) = t;
-                __STORE(self, t);
-            }
-        }
+	    {
+		OBJ t;
+
+		t = __MKEXTERNALADDRESS(fp);
+		__INST(handle) = t;
+		__STORE(self, t);
+	    }
+	}
     }
 #endif
 out:;
@@ -3753,15 +3752,16 @@
 
     "all ok?"
     handle notNil ifTrue:[
-        domain := domainArg.
-        socketType := typeArg.
-        Lobby register:self.
-    ] ifFalse:[
-        error notNil ifTrue:[
-            ^ self primitiveFailed:error.
-        ].
-        ^ self openError:lastErrorNumber.
+	domain := domainArg.
+	socketType := typeArg.
+	Lobby register:self.
+	^ self.
     ].
+    error isInteger ifTrue:[
+	lastErrorNumber := error.
+	^ self openError:error.
+    ].
+    ^ self primitiveFailed:error.
 
     "
      Socket new domain:#AF_INET type:#stream
@@ -4126,10 +4126,10 @@
 !Socket class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.298 2014-03-28 08:00:39 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.299 2014-04-03 13:23:44 stefan Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.298 2014-03-28 08:00:39 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.299 2014-04-03 13:23:44 stefan Exp $'
 ! !