Win32OperatingSystem.st
branchjv
changeset 18084 ab5b38bd8f81
parent 18080 9ae1db7ef04a
parent 15604 86e0ba23123f
child 18105 3a3a3e0ac47f
--- a/Win32OperatingSystem.st	Mon Aug 19 23:30:27 2013 +0100
+++ b/Win32OperatingSystem.st	Tue Aug 20 00:07:19 2013 +0100
@@ -16880,29 +16880,26 @@
     }
 
     if (__hostName) {
+        int err;
+
         do {
-# ifdef DO_WRAP_CALLS
+# if 0 && defined(DO_WRAP_CALLS)
+            /* This does not work - the structure is allocated in thread local storage */
             hp = STX_WSA_NOINT_CALL1("gethostbyname", gethostbyname, __hostName);
             if ((INT)hp < 0) hp = NULL;
 # else
             /* __BEGIN_INTERRUPTABLE__ is dangerous, because gethostbyname
-             * uses a static data area
+             * uses a static data area, but allocates it in thread local storage
              */
-            __BEGIN_INTERRUPTABLE__
+            // __BEGIN_INTERRUPTABLE__
             hp = gethostbyname(__hostName);
-            __END_INTERRUPTABLE__
-#endif
-        } while ((hp == NULL)
-                  && (
-                        (h_errno == TRY_AGAIN)
-                      || errno == EINTR
-#   ifdef IRIX5_3
-                      || (errno == ECONNREFUSED)
-#   endif
-                     )
-        );
+            // __END_INTERRUPTABLE__
+#endif
+        } while ((hp == NULL 
+                  && (err = WSAGetLastError()) == EINTR
+                      || err == TRY_AGAIN));
         if (hp == 0) {
-            switch (h_errno) {
+            switch (err) {
             case HOST_NOT_FOUND:
                 errorString = @symbol(unknownHost);
                 break;
@@ -16919,7 +16916,7 @@
                 errorString = @symbol(unknownError);
                 break;
             }
-            error = __mkSmallInteger(h_errno);
+            error = __mkSmallInteger(err);
             goto err;
         }
 
@@ -16997,6 +16994,9 @@
 %}.
     error notNil ifTrue:[
         |request|
+        error isSymbol ifTrue:[
+            self primitiveFailed:error.
+        ].
         request := SocketAddressInfo new
             domain:domainArg;
             type:typeArg;
@@ -17027,23 +17027,23 @@
      self getAddressInfo:'localhost' serviceName:nil
             domain:nil type:nil protocol:nil flags:nil
      self getAddressInfo:'localhost' serviceName:nil
-            domain:#inet type:#stream protocol:nil flags:nil
+            domain:#AF_INET type:#stream protocol:nil flags:nil
      self getAddressInfo:'localhost' serviceName:nil
-            domain:#inet type:#stream protocol:#tcp flags:nil
+            domain:#AF_INET type:#stream protocol:#tcp flags:nil
      self getAddressInfo:'localhost' serviceName:10
-            domain:#inet type:#stream protocol:#tcp flags:nil
+            domain:#AF_INET type:#stream protocol:#tcp flags:nil
      self getAddressInfo:'localhost' serviceName:'10'
-            domain:#inet type:#stream protocol:#tcp flags:nil
+            domain:#AF_INET type:#stream protocol:#tcp flags:nil
      self getAddressInfo:'blurb.exept.de' serviceName:nil
-            domain:#inet type:nil protocol:nil flags:nil
+            domain:#AF_INET type:nil protocol:nil flags:nil
      self getAddressInfo:'1.2.3.4' serviceName:'bla'
-            domain:#inet type:nil protocol:nil flags:nil
+            domain:#AF_INET type:nil protocol:nil flags:nil
      self getAddressInfo:'localhost' serviceName:'echo'
-            domain:#inet type:nil protocol:nil flags:nil
+            domain:#AF_INET type:nil protocol:nil flags:nil
      self getAddressInfo:nil serviceName:'echo'
-            domain:#inet type:nil protocol:nil flags:nil
+            domain:#AF_INET type:nil protocol:nil flags:nil
      self getAddressInfo:nil serviceName:nil
-            domain:#inet type:nil protocol:nil flags:nil
+            domain:#AF_INET type:nil protocol:nil flags:nil
      self getAddressInfo:'www.google.de' serviceName:nil
             domain:nil type:nil protocol:nil flags:nil
      self getAddressInfo:'smc1' serviceName:nil
@@ -17078,20 +17078,20 @@
     int nInstBytes, sockAddrSize;
 
     if (wantHostName == true) {
-	hp = host;
-	hsz = sizeof(host);
+        hp = host;
+        hsz = sizeof(host);
     }
     if (wantServiceName == true) {
-	sp = service;
-	ssz = sizeof(service);
+        sp = service;
+        ssz = sizeof(service);
     }
     if (hp == 0 && sp == 0) {
-	error = @symbol(badArgument);
-	goto err;
+        error = @symbol(badArgument);
+        goto err;
     }
     if (!__isBytes(socketAddress)) {
-	error = @symbol(badArgument1);
-	goto err;
+        error = @symbol(badArgument1);
+        goto err;
     }
 
     nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(__qClass(socketAddress))->c_ninstvars));
@@ -17099,177 +17099,170 @@
     sockAddrSize -= nInstBytes;
 
     if (!__isSmallInteger(flags)) {
-	error = @symbol(badArgument5);
-	goto err;
+        error = @symbol(badArgument5);
+        goto err;
     }
     __flags = __intVal(flags);
 
 #if defined(NI_NUMERICHOST)
     if (useDatagram == true) {
-	__flags |= NI_DGRAM;
+        __flags |= NI_DGRAM;
     }
 
     {
-	extern getnameinfo();
-	bp = (char *)(__byteArrayVal(socketAddress));
-	bp += nInstBytes;
+        extern getnameinfo();
+        bp = (char *)(__byteArrayVal(socketAddress));
+        bp += nInstBytes;
 # ifdef DO_WRAP_CALLS
-	do {
-	    __threadErrno = 0;
-	    // do not cast to INT - will loose sign bit then!
-	    ret = STX_WSA_NOINT_CALL7( "getnameinfo", getnameinfo, (struct sockaddr *)bp, sockAddrSize, hp, hsz, sp, ssz, __flags);
-	} while ((ret < 0) && (__threadErrno == EINTR));
+        do {
+            __threadErrno = 0;
+            // do not cast to INT - will loose sign bit then!
+            ret = STX_WSA_NOINT_CALL7( "getnameinfo", getnameinfo, (struct sockaddr *)bp, sockAddrSize, hp, hsz, sp, ssz, __flags);
+        } while ((ret < 0) && (__threadErrno == EINTR));
 # else
-	__BEGIN_INTERRUPTABLE__
-	ret = getnameinfo((struct sockaddr *)bp, sockAddrSize,
-			  hp, hsz, sp, ssz, __flags);
-	__END_INTERRUPTABLE__
+        __BEGIN_INTERRUPTABLE__
+        ret = getnameinfo((struct sockaddr *)bp, sockAddrSize,
+                          hp, hsz, sp, ssz, __flags);
+        __END_INTERRUPTABLE__
 # endif
     } while (ret != 0 && __threadErrno == EINTR);
 
     if (ret != 0) {
-	switch (ret) {
-	    case EAI_FAMILY:
-		error = @symbol(badProtocol);
-		break;
-	    case EAI_SOCKTYPE:
-		error = @symbol(badSocketType);
-		break;
-	    case EAI_BADFLAGS:
-		error = @symbol(badFlags);
-		break;
-	    case EAI_NONAME:
-		error = @symbol(unknownHost);
-		break;
-	    case EAI_SERVICE:
-		error = @symbol(unknownService);
-		break;
-	    case EAI_MEMORY:
-		error = @symbol(allocationFailure);
-		break;
-	    case EAI_FAIL:
-		error = @symbol(permanentFailure);
-		break;
-	    case EAI_AGAIN:
-		error = @symbol(tryAgain);
-		break;
-	    default:
-		error = @symbol(unknownError);
-	}
-	errorString = __MKSTRING(gai_strerror(ret));
-	goto err;
+        switch (ret) {
+            case EAI_FAMILY:
+                error = @symbol(badProtocol);
+                break;
+            case EAI_SOCKTYPE:
+                error = @symbol(badSocketType);
+                break;
+            case EAI_BADFLAGS:
+                error = @symbol(badFlags);
+                break;
+            case EAI_NONAME:
+                error = @symbol(unknownHost);
+                break;
+            case EAI_SERVICE:
+                error = @symbol(unknownService);
+                break;
+            case EAI_MEMORY:
+                error = @symbol(allocationFailure);
+                break;
+            case EAI_FAIL:
+                error = @symbol(permanentFailure);
+                break;
+            case EAI_AGAIN:
+                error = @symbol(tryAgain);
+                break;
+            default:
+                error = @symbol(unknownError);
+        }
+        errorString = __MKSTRING(gai_strerror(ret));
+        goto err;
     }
 # else /* ! NI_NUMERICHOST */
     {
-	/*
-	 * Do it using gethostbyaddr()
-	 */
-	struct sockaddr_in *sa;
-
-	if (sockAddrSize < sizeof(*sa)) {
-	    error = @symbol(badArgument1);
-	    goto err;
-	}
-	bp = (char *)(__byteArrayVal(socketAddress));
-	bp += nInstBytes;
-	sa = (struct sockaddr_in *)bp;
-
-	if (sp) {
-	    struct servent *servp;
-	    char *__proto = 0;
-
-	    __proto = (useDatagram == true ? "udp" : "tcp");
-
-	    servp = getservbyport(sa->sin_port, __proto);
-	    if (servp) {
-		sp = servp->s_name;
-	    }
-	}
-	if (hp) {
-	    struct hostent *hostp;
-#  ifdef USE_H_ERRNO
-	    do {
-		/* must refetch in loop */
-		bp = (char *)(__byteArrayVal(socketAddress));
-		bp += nInstBytes;
-		sa = (struct sockaddr_in *)bp;
-		/* __BEGIN_INTERRUPTABLE__ is dangerous, because gethostbyname uses a static data area
-		 */
-		hostp = gethostbyaddr((char *)&sa->sin_addr, sockAddrSize, sa->sin_family);
-		/* __END_INTERRUPTABLE__ */
-	    } while ((hostp == NULL)
-		      && ((h_errno == TRY_AGAIN)
-			  || errno == EINTR
-#   ifdef IRIX5_3
-			  || (errno == ECONNREFUSED)
-#   endif
-			 )
-	    );
-	    if (hostp == 0) {
-		switch (h_errno) {
-		case HOST_NOT_FOUND:
-		    errorString = @symbol(unknownHost);
-		    break;
-		case NO_ADDRESS:
-		    errorString = @symbol(noAddress);
-		    break;
-		case NO_RECOVERY:
-		    errorString = @symbol(permanentFailure);
-		    break;
-		case TRY_AGAIN:
-		    errorString = @symbol(tryAgain);
-		    break;
-		default:
-		    errorString = @symbol(unknownError);
-		    break;
-		}
-		error = __mkSmallInteger(h_errno);
-		goto err;
-	    }
-#  else /* !USE_H_ERRNO */
-	    hostp = gethostbyaddr((char *)&sa->sin_addr, sockAddrSize, sa->sin_family);
-	    if (hostp == 0) {
-		errorString = @symbol(unknownHost);
-		error = __mkSmallInteger(-1);
-		goto err;
-	    }
-#  endif /* !USE_H_ERRNO*/
-	    hp = hostp->h_name;
-	}
+        /*
+         * Do it using gethostbyaddr()
+         */
+        struct sockaddr_in *sa;
+
+        if (sockAddrSize < sizeof(*sa)) {
+            error = @symbol(badArgument1);
+            goto err;
+        }
+        bp = (char *)(__byteArrayVal(socketAddress));
+        bp += nInstBytes;
+        sa = (struct sockaddr_in *)bp;
+
+        if (sp) {
+            struct servent *servp;
+            char *__proto = 0;
+
+            __proto = (useDatagram == true ? "udp" : "tcp");
+
+            servp = getservbyport(sa->sin_port, __proto);
+            if (servp) {
+                sp = servp->s_name;
+            }
+        }
+        if (hp) {
+            struct hostent *hostp;
+            int err;
+
+            do {
+                /* must refetch in loop */
+                bp = (char *)(__byteArrayVal(socketAddress));
+                bp += nInstBytes;
+                sa = (struct sockaddr_in *)bp;
+                /* __BEGIN_INTERRUPTABLE__ is dangerous, because gethostbyname uses a static data area
+                 */
+                hostp = gethostbyaddr((char *)&sa->sin_addr, sockAddrSize, sa->sin_family);
+                /* __END_INTERRUPTABLE__ */
+            } while ((hostp == NULL)
+                      && ((err = WSAGetLastError()) == TRY_AGAIN
+                          || err == EINTR
+                         )
+            );
+            if (hostp == 0) {
+                switch (err) {
+                case HOST_NOT_FOUND:
+                    errorString = @symbol(unknownHost);
+                    break;
+                case NO_ADDRESS:
+                    errorString = @symbol(noAddress);
+                    break;
+                case NO_RECOVERY:
+                    errorString = @symbol(permanentFailure);
+                    break;
+                case TRY_AGAIN:
+                    errorString = @symbol(tryAgain);
+                    break;
+                default:
+                    errorString = @symbol(unknownError);
+                    break;
+                }
+                error = __mkSmallInteger(err);
+                goto err;
+            }
+            hp = hostp->h_name;
+        }
     }
 # endif /* ! NI_NUMERICHOST */
 
     if (hp)
-	hostName = __MKSTRING(hp);
+        hostName = __MKSTRING(hp);
     if (sp)
-	serviceName = __MKSTRING(sp);
+        serviceName = __MKSTRING(sp);
 err:;
 #else
     error = @symbol(notImplemented);
 #endif
 %}.
     error notNil ifTrue:[
-	^ (HostAddressLookupError new
-		parameter:error;
-		messageText:' - ', errorString;
-		request:thisContext message) raiseRequest.
+        error isSymbol ifTrue:[
+            self primitiveFailed:error.
+        ].
+        ^ (HostAddressLookupError new
+                parameter:error;
+                messageText:' - ', (errorString ? error printString);
+                request:thisContext message) raiseRequest.
     ].
 
     ^ Array with:hostName with:serviceName
 
     "
      self getNameInfo:
-	(self getAddressInfo:'localhost' serviceName:'echo'
-		domain:#inet type:#stream protocol:nil flags:nil) first socketAddress
-	 wantHostName:true wantServiceName:true datagram:false flags:0
+        (self getAddressInfo:'localhost' serviceName:'echo'
+                domain:#AF_INET type:#stream protocol:nil flags:nil) first socketAddress
+         wantHostName:true wantServiceName:true datagram:false flags:0
 
      self getNameInfo:
-	(self getAddressInfo:'exept.exept.de' serviceName:'echo'
-		domain:#inet type:#stream protocol:nil flags:nil) first socketAddress
-	 wantHostName:true wantServiceName:true datagram:false flags:0
-
-     self getNameInfo:#[1 2 3 4]
-	 wantHostName:true wantServiceName:true datagram:false flags:0
+        (self getAddressInfo:'exept.exept.de' serviceName:'echo'
+                domain:#AF_INET type:#stream protocol:nil flags:nil) first socketAddress
+         wantHostName:true wantServiceName:true datagram:false flags:0
+
+     self getNameInfo:(IPSocketAddress hostAddress:#[1 2 3 4])
+         wantHostName:true wantServiceName:true datagram:false flags:0
     "
 ! !
 
@@ -17338,15 +17331,15 @@
 !Win32OperatingSystem class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.477 2013-08-02 15:31:19 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.478 2013-08-09 14:30:12 cg Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.477 2013-08-02 15:31:19 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.478 2013-08-09 14:30:12 cg Exp $'
 !
 
 version_SVN
-    ^ '$Id: Win32OperatingSystem.st,v 1.477 2013-08-02 15:31:19 stefan Exp $'
+    ^ '$Id: Win32OperatingSystem.st,v 1.478 2013-08-09 14:30:12 cg Exp $'
 
 ! !