UnixOperatingSystem.st
changeset 23940 be2963fcf719
parent 23836 8b734f62058f
child 24001 d0293bbca0af
--- a/UnixOperatingSystem.st	Mon Mar 18 11:48:04 2019 +0100
+++ b/UnixOperatingSystem.st	Tue Mar 19 13:01:47 2019 +0100
@@ -8322,6 +8322,9 @@
 	#freeMemory       -> ? - read pstat documentation
 	#realMemory       -> ? (amount of memory left to user programs)
 	#virtualRam       -> ? - read pstat documentation
+
+      extendedInstructionInfo includes CPU dependent symbols:
+	x86/x86_64:  (see cpuid documentation)
     "
 
     |sys node rel ver mach dom mtyp brel info arch cpuType cpuSpeed
@@ -13456,103 +13459,103 @@
     |result domain type proto encodedHostName|
 
     domainArg notNil ifTrue:[
-        domain := OperatingSystem domainCodeOf:domainArg.
+	domain := OperatingSystem domainCodeOf:domainArg.
     ].
     typeArg notNil ifTrue:[
-        type := OperatingSystem socketTypeCodeOf:typeArg.
+	type := OperatingSystem socketTypeCodeOf:typeArg.
     ].
     protoArg notNil ifTrue:[
-        proto := self protocolCodeOf:protoArg.
+	proto := self protocolCodeOf:protoArg.
     ].
 
     hostName isNil ifTrue:[
-        encodedHostName := nil.
+	encodedHostName := nil.
     ] ifFalse:[
-        encodedHostName := hostName utf8Encoded.
+	encodedHostName := hostName utf8Encoded.
     ].
     (encodedHostName ~~ hostName and:[OperatingSystem getCodeset ~~ #utf8]) ifTrue:[
-        "hostName is not plain ASCII - so this is an IDN domain name. Have to ensure, that the locale is UTF-8.
-         Block interrupt to not affect other ST/X processes while the locale is changed."
-        |interruptsBlocked oldLocale|
-
-        interruptsBlocked := OperatingSystem blockInterrupts.
-        oldLocale := OperatingSystem setLocale:#'LC_CTYPE' to:nil.
-        OperatingSystem setLocale:#'LC_CTYPE' to:'en_US.UTF-8'.
-        result := self primGetAddressInfo:encodedHostName serviceName:serviceName domainCode:domain socketTypeCode:type protocolCode:proto flags:flags.
-        OperatingSystem setLocale:#'LC_CTYPE' to:oldLocale.
-        interruptsBlocked ifFalse:[
-            OperatingSystem unblockInterrupts.
-        ].
+	"hostName is not plain ASCII - so this is an IDN domain name. Have to ensure, that the locale is UTF-8.
+	 Block interrupt to not affect other ST/X processes while the locale is changed."
+	|interruptsBlocked oldLocale|
+
+	interruptsBlocked := OperatingSystem blockInterrupts.
+	oldLocale := OperatingSystem setLocale:#'LC_CTYPE' to:nil.
+	OperatingSystem setLocale:#'LC_CTYPE' to:'en_US.UTF-8'.
+	result := self primGetAddressInfo:encodedHostName serviceName:serviceName domainCode:domain socketTypeCode:type protocolCode:proto flags:flags.
+	OperatingSystem setLocale:#'LC_CTYPE' to:oldLocale.
+	interruptsBlocked ifFalse:[
+	    OperatingSystem unblockInterrupts.
+	].
     ] ifFalse:[
-        result := self primGetAddressInfo:encodedHostName serviceName:serviceName domainCode:domain socketTypeCode:type protocolCode:proto flags:flags.
+	result := self primGetAddressInfo:encodedHostName serviceName:serviceName domainCode:domain socketTypeCode:type protocolCode:proto flags:flags.
     ].
     result isArray ifFalse:[
-        |request|
-        request := SocketAddressInfo new
-            domain:domainArg;
-            type:typeArg;
-            protocol:protoArg;
-            canonicalName:hostName;
-            serviceName:serviceName.
-        ^ (HostNameLookupError new
-                parameter:result;
-                messageText:' - ', (result printString);
-                request:request) raiseRequest.
+	|request|
+	request := SocketAddressInfo new
+	    domain:domainArg;
+	    type:typeArg;
+	    protocol:protoArg;
+	    canonicalName:hostName;
+	    serviceName:serviceName.
+	^ (HostNameLookupError new
+		parameter:result;
+		messageText:' - ', (result printString);
+		request:request) raiseRequest.
     ].
     1 to:result size do:[:i |
-        |entry dom info|
-
-        entry := result at:i.
-
-        info := SocketAddressInfo new.
-        info
-            flags:(entry at:1);
-            domain:(dom := OperatingSystem domainSymbolOf:(entry at:2));
-            type:(OperatingSystem socketTypeSymbolOf:(entry at:3));
-            protocol:(self protocolSymbolOf:(entry at:4));
-            socketAddress:((SocketAddress newDomain:dom) fromBytes:(entry at:5));
-            canonicalName:(entry at:6).
-
-        result at:i put:info.
+	|entry dom info|
+
+	entry := result at:i.
+
+	info := SocketAddressInfo new.
+	info
+	    flags:(entry at:1);
+	    domain:(dom := OperatingSystem domainSymbolOf:(entry at:2));
+	    type:(OperatingSystem socketTypeSymbolOf:(entry at:3));
+	    protocol:(self protocolSymbolOf:(entry at:4));
+	    socketAddress:((SocketAddress newDomain:dom) fromBytes:(entry at:5));
+	    canonicalName:(entry at:6).
+
+	result at:i put:info.
     ].
     ^ result.
 
 
     "
      self getAddressInfo:'localhost' serviceName:nil
-            domain:nil type:nil protocol:nil flags:nil
+	    domain:nil type:nil protocol:nil flags:nil
      self getAddressInfo:nil serviceName:22
-            domain:nil type:nil protocol:nil flags:nil
+	    domain:nil type:nil protocol:nil flags:nil
      self getAddressInfo:'' serviceName:22
-            domain:nil type:nil protocol:nil flags:nil
+	    domain:nil type:nil protocol:nil flags:nil
      self getAddressInfo:'localhost' serviceName:nil
-            domain:nil type:#stream protocol:nil flags:nil
+	    domain:nil type:#stream protocol:nil flags:nil
      self getAddressInfo:'localhost' serviceName:nil
-            domain:#inet type:#stream protocol:#tcp flags:nil
+	    domain:#inet type:#stream protocol:#tcp flags:nil
      self getAddressInfo:'blurb.exept.de' serviceName:nil
-            domain:#inet type:nil protocol:nil flags:nil
+	    domain:#inet type:nil protocol:nil flags:nil
      self getAddressInfo:'1.2.3.4' serviceName:'bla'
-            domain:#inet type:nil protocol:nil flags:nil
+	    domain:#inet type:nil protocol:nil flags:nil
      self getAddressInfo:'localhost' serviceName:'echo'
-            domain:#inet type:nil protocol:nil flags:nil
+	    domain:#inet type:nil protocol:nil flags:nil
      self getAddressInfo:nil serviceName:'echo'
-            domain:#inet type:nil protocol:nil flags:nil
+	    domain:#inet type:nil protocol:nil flags:nil
      self getAddressInfo:nil serviceName:nil
-            domain:#inet type:nil protocol:nil flags:nil
+	    domain:#inet type:nil protocol:nil flags:nil
      self getAddressInfo:'www.google.de' serviceName:80
-            domain:nil type:nil protocol:nil flags:nil
+	    domain:nil type:nil protocol:nil flags:nil
      self getAddressInfo:'www.exept.de' serviceName:nil
-            domain:nil type:nil protocol:nil flags:nil
+	    domain:nil type:nil protocol:nil flags:nil
      self getAddressInfo:'www.exept.de' serviceName:'https'
-            domain:#'AF_INET' type:nil protocol:nil flags:nil
+	    domain:#'AF_INET' type:nil protocol:nil flags:nil
      self getAddressInfo:'www.exept.de' serviceName:'https'
-            domain:#'AF_UNSPEC' type:nil protocol:nil flags:nil
+	    domain:#'AF_UNSPEC' type:nil protocol:nil flags:nil
      self getAddressInfo:'www.exept.de' serviceName:nil
-            domain:#'AF_INET6' type:nil protocol:nil flags:nil
+	    domain:#'AF_INET6' type:nil protocol:nil flags:nil
      self getAddressInfo:'www.baden-württemberg.de' serviceName:nil
-            domain:#'AF_INET' type:#stream protocol:nil flags:nil
+	    domain:#'AF_INET' type:#stream protocol:nil flags:nil
      self getAddressInfo:'www.baden-württemberg.de' serviceName:nil
-            domain:#'AF_INET6' type:#stream protocol:nil flags:nil
+	    domain:#'AF_INET6' type:#stream protocol:nil flags:nil
     "
 
     "Modified: / 03-03-2019 / 11:23:38 / Claus Gittinger"
@@ -13584,229 +13587,229 @@
     int ret, __flags;
     int nInstBytes, sockAddrSize;
     union {
-        struct sockaddr addr;
-        char enoughBytesForBigAddresses[1024];
+	struct sockaddr addr;
+	char enoughBytesForBigAddresses[1024];
     } sav_sockaddr;
     struct sockaddr *sav_sockaddrp;
 
     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));
     sockAddrSize = __byteArraySize(socketAddress) - 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;
     }
 
     if (sockAddrSize <= sizeof(sav_sockaddr)) {
-        sav_sockaddrp = &sav_sockaddr.addr;
+	sav_sockaddrp = &sav_sockaddr.addr;
     } else {
-        fprintf(stderr, "OS: sockAddr buffer size too small\n");
-        sav_sockaddrp = (struct sockaddr *)malloc(sockAddrSize + 32);
+	fprintf(stderr, "OS: sockAddr buffer size too small\n");
+	sav_sockaddrp = (struct sockaddr *)malloc(sockAddrSize + 32);
     }
 
     {
-        // when we run this interruptable (or even in a separate thread),
-        // we cannot pass ST/X objects to it
-        // (some other ST/X thread might trigger a GC)
-        memcpy(sav_sockaddrp, __byteArrayVal(socketAddress)+nInstBytes, sockAddrSize);
-
-        __BEGIN_INTERRUPTABLE__
-        ret = getnameinfo(sav_sockaddrp, sockAddrSize, hp, hsz, sp, ssz, __flags);
-        __END_INTERRUPTABLE__
+	// when we run this interruptable (or even in a separate thread),
+	// we cannot pass ST/X objects to it
+	// (some other ST/X thread might trigger a GC)
+	memcpy(sav_sockaddrp, __byteArrayVal(socketAddress)+nInstBytes, sockAddrSize);
+
+	__BEGIN_INTERRUPTABLE__
+	ret = getnameinfo(sav_sockaddrp, sockAddrSize, hp, hsz, sp, ssz, __flags);
+	__END_INTERRUPTABLE__
     } while (ret == EAI_SYSTEM && errno == EINTR);
 
     if (sav_sockaddrp != &sav_sockaddr.addr) {
-        free(sav_sockaddrp);
+	free(sav_sockaddrp);
     }
 
     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;
+	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;
 #ifdef EAI_ADDRFAMILY
-        case EAI_ADDRFAMILY :
-            error = @symbol(unknownHostForProtocol);
-            break;
+	case EAI_ADDRFAMILY :
+	    error = @symbol(unknownHostForProtocol);
+	    break;
 #endif
 #ifdef EAI_NODATA
-        case EAI_NODATA:
-            error = @symbol(noAddress);
-            break;
-#endif
-        case EAI_MEMORY:
-            error = @symbol(allocationFailure);
-            break;
-        case EAI_FAIL:
-            error = @symbol(permanentFailure);
-            break;
-        case EAI_AGAIN:
-            error = @symbol(tryAgain);
-            break;
-        case EAI_SYSTEM:
-            error = @symbol(systemError);
-            break;
-        default:
-            error = @symbol(unknownError);
-        }
-        errorString = __MKSTRING(gai_strerror(ret));
-        goto err;
+	case EAI_NODATA:
+	    error = @symbol(noAddress);
+	    break;
+#endif
+	case EAI_MEMORY:
+	    error = @symbol(allocationFailure);
+	    break;
+	case EAI_FAIL:
+	    error = @symbol(permanentFailure);
+	    break;
+	case EAI_AGAIN:
+	    error = @symbol(tryAgain);
+	    break;
+	case EAI_SYSTEM:
+	    error = @symbol(systemError);
+	    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;
-        }
-
-        if (sp) {
-            char *__proto = (useDatagram == true ? "udp" : "tcp");
-            struct servent *servp = getservbyport(sa->sin_port, __proto);
-            if (servp) {
-                sp = servp->s_name;
-            }
-        }
-        if (hp) {
-            struct hostent *hostp;
+	/*
+	 * Do it using gethostbyaddr()
+	 */
+	struct sockaddr_in *sa;
+
+	if (sockAddrSize < sizeof(*sa)) {
+	    error = @symbol(badArgument1);
+	    goto err;
+	}
+
+	if (sp) {
+	    char *__proto = (useDatagram == true ? "udp" : "tcp");
+	    struct servent *servp = getservbyport(sa->sin_port, __proto);
+	    if (servp) {
+		sp = servp->s_name;
+	    }
+	}
+	if (hp) {
+	    struct hostent *hostp;
 #  ifdef USE_H_ERRNO
-            do {
-                sa = (struct sockaddr_in *)(__byteArrayVal(socketAddress) + nInstBytes);
-
-                /* __BEGIN_INTERRUPTABLE__ is dangerous, because gethostbyname uses a static data area
-                                                         and sa points to possible grabage collected memory
-                 */
-                hostp = gethostbyaddr((char *)&sa->sin_addr, sockAddrSize, sa->sin_family);
-                /* __END_INTERRUPTABLE__ */
-            } while ((hostp == NULL)
-                      && ((h_errno == TRY_AGAIN)
-                          || errno == EINTR
+	    do {
+		sa = (struct sockaddr_in *)(__byteArrayVal(socketAddress) + nInstBytes);
+
+		/* __BEGIN_INTERRUPTABLE__ is dangerous, because gethostbyname uses a static data area
+							 and sa points to possible grabage collected memory
+		 */
+		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)
+			  || (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;
-            }
+			 )
+	    );
+	    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(sa->sin_addr, sockAddrSize, sa->sin_family);
-            if (hostp == 0) {
-                errorString = @symbol(unknownHost);
-                error = __mkSmallInteger(-1);
-                goto err;
-            }
+	    hostp = gethostbyaddr(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;
-        }
+	    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.
+	^ (HostAddressLookupError new
+		parameter:error;
+		messageText:' - ', errorString;
+		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:#inet type:#stream protocol:nil flags:nil) first socketAddress
+	 wantHostName:true wantServiceName:true datagram:false flags:0
 
      self getNameInfo:
-        (self getAddressInfo:'localhost' serviceName:'echo'
-                domain:#AF_UNSPEC type:#stream protocol:nil flags:nil) first socketAddress
-         wantHostName:true wantServiceName:true datagram:false flags:0
+	(self getAddressInfo:'localhost' serviceName:'echo'
+		domain:#AF_UNSPEC type:#stream protocol:nil flags:nil) first socketAddress
+	 wantHostName:true wantServiceName:true datagram:false flags:0
 
      self getNameInfo:
-        (self getAddressInfo:'exept.de' serviceName:'echo'
-                domain:#inet type:#stream protocol:nil flags:nil) first socketAddress
-         wantHostName:true wantServiceName:true datagram:false flags:0
+	(self getAddressInfo:'exept.de' serviceName:'echo'
+		domain:#inet type:#stream protocol:nil flags:nil) first socketAddress
+	 wantHostName:true wantServiceName:true datagram:false flags:0
 
      self getNameInfo:
-        (self getAddressInfo:'exept.de' serviceName:'echo'
-                domain:#AF_UNSPEC type:#stream protocol:nil flags:nil) first socketAddress
-         wantHostName:true wantServiceName:true datagram:false flags:0
-         
-     self getNameInfo:
-        (self getAddressInfo:'217.172.183.25' serviceName:'22'
-                domain:#inet type:#stream protocol:nil flags:nil) first socketAddress
-         wantHostName:true wantServiceName:true datagram:false flags:0
+	(self getAddressInfo:'exept.de' serviceName:'echo'
+		domain:#AF_UNSPEC type:#stream protocol:nil flags:nil) first socketAddress
+	 wantHostName:true wantServiceName:true datagram:false flags:0
 
      self getNameInfo:
-        (self getAddressInfo:'1.2.3.4' serviceName:'22'
-                domain:#inet type:#stream protocol:nil flags:nil) first socketAddress
-         wantHostName:true wantServiceName:true datagram:false flags:0
+	(self getAddressInfo:'217.172.183.25' serviceName:'22'
+		domain:#inet type:#stream protocol:nil flags:nil) first socketAddress
+	 wantHostName:true wantServiceName:true datagram:false flags:0
+
+     self getNameInfo:
+	(self getAddressInfo:'1.2.3.4' serviceName:'22'
+		domain:#inet type:#stream protocol:nil flags:nil) first socketAddress
+	 wantHostName:true wantServiceName:true datagram:false flags:0
     "
 
     "Modified: / 21-03-2018 / 10:03:30 / stefan"