UnixOperatingSystem.st
changeset 23940 be2963fcf719
parent 23836 8b734f62058f
child 24001 d0293bbca0af
equal deleted inserted replaced
23939:3ec50a9816fd 23940:be2963fcf719
  8320 	#activeRealMemory -> ? - read pstat documentation
  8320 	#activeRealMemory -> ? - read pstat documentation
  8321 	#activeVirtualRam -> ? - read pstat documentation
  8321 	#activeVirtualRam -> ? - read pstat documentation
  8322 	#freeMemory       -> ? - read pstat documentation
  8322 	#freeMemory       -> ? - read pstat documentation
  8323 	#realMemory       -> ? (amount of memory left to user programs)
  8323 	#realMemory       -> ? (amount of memory left to user programs)
  8324 	#virtualRam       -> ? - read pstat documentation
  8324 	#virtualRam       -> ? - read pstat documentation
       
  8325 
       
  8326       extendedInstructionInfo includes CPU dependent symbols:
       
  8327 	x86/x86_64:  (see cpuid documentation)
  8325     "
  8328     "
  8326 
  8329 
  8327     |sys node rel ver mach dom mtyp brel info arch cpuType cpuSpeed
  8330     |sys node rel ver mach dom mtyp brel info arch cpuType cpuSpeed
  8328      physicalRam availableRam totalRam sharedRam bufferRam swapSize freeSwap
  8331      physicalRam availableRam totalRam sharedRam bufferRam swapSize freeSwap
  8329      numberOfCPUs numberOfPhysicalCPUs pageSize physicalPages availablePages dCacheSize iCacheSize
  8332      numberOfCPUs numberOfPhysicalCPUs pageSize physicalPages availablePages dCacheSize iCacheSize
 13454      tweaked for a particular system by editing /etc/gai.conf"
 13457      tweaked for a particular system by editing /etc/gai.conf"
 13455 
 13458 
 13456     |result domain type proto encodedHostName|
 13459     |result domain type proto encodedHostName|
 13457 
 13460 
 13458     domainArg notNil ifTrue:[
 13461     domainArg notNil ifTrue:[
 13459         domain := OperatingSystem domainCodeOf:domainArg.
 13462 	domain := OperatingSystem domainCodeOf:domainArg.
 13460     ].
 13463     ].
 13461     typeArg notNil ifTrue:[
 13464     typeArg notNil ifTrue:[
 13462         type := OperatingSystem socketTypeCodeOf:typeArg.
 13465 	type := OperatingSystem socketTypeCodeOf:typeArg.
 13463     ].
 13466     ].
 13464     protoArg notNil ifTrue:[
 13467     protoArg notNil ifTrue:[
 13465         proto := self protocolCodeOf:protoArg.
 13468 	proto := self protocolCodeOf:protoArg.
 13466     ].
 13469     ].
 13467 
 13470 
 13468     hostName isNil ifTrue:[
 13471     hostName isNil ifTrue:[
 13469         encodedHostName := nil.
 13472 	encodedHostName := nil.
 13470     ] ifFalse:[
 13473     ] ifFalse:[
 13471         encodedHostName := hostName utf8Encoded.
 13474 	encodedHostName := hostName utf8Encoded.
 13472     ].
 13475     ].
 13473     (encodedHostName ~~ hostName and:[OperatingSystem getCodeset ~~ #utf8]) ifTrue:[
 13476     (encodedHostName ~~ hostName and:[OperatingSystem getCodeset ~~ #utf8]) ifTrue:[
 13474         "hostName is not plain ASCII - so this is an IDN domain name. Have to ensure, that the locale is UTF-8.
 13477 	"hostName is not plain ASCII - so this is an IDN domain name. Have to ensure, that the locale is UTF-8.
 13475          Block interrupt to not affect other ST/X processes while the locale is changed."
 13478 	 Block interrupt to not affect other ST/X processes while the locale is changed."
 13476         |interruptsBlocked oldLocale|
 13479 	|interruptsBlocked oldLocale|
 13477 
 13480 
 13478         interruptsBlocked := OperatingSystem blockInterrupts.
 13481 	interruptsBlocked := OperatingSystem blockInterrupts.
 13479         oldLocale := OperatingSystem setLocale:#'LC_CTYPE' to:nil.
 13482 	oldLocale := OperatingSystem setLocale:#'LC_CTYPE' to:nil.
 13480         OperatingSystem setLocale:#'LC_CTYPE' to:'en_US.UTF-8'.
 13483 	OperatingSystem setLocale:#'LC_CTYPE' to:'en_US.UTF-8'.
 13481         result := self primGetAddressInfo:encodedHostName serviceName:serviceName domainCode:domain socketTypeCode:type protocolCode:proto flags:flags.
 13484 	result := self primGetAddressInfo:encodedHostName serviceName:serviceName domainCode:domain socketTypeCode:type protocolCode:proto flags:flags.
 13482         OperatingSystem setLocale:#'LC_CTYPE' to:oldLocale.
 13485 	OperatingSystem setLocale:#'LC_CTYPE' to:oldLocale.
 13483         interruptsBlocked ifFalse:[
 13486 	interruptsBlocked ifFalse:[
 13484             OperatingSystem unblockInterrupts.
 13487 	    OperatingSystem unblockInterrupts.
 13485         ].
 13488 	].
 13486     ] ifFalse:[
 13489     ] ifFalse:[
 13487         result := self primGetAddressInfo:encodedHostName serviceName:serviceName domainCode:domain socketTypeCode:type protocolCode:proto flags:flags.
 13490 	result := self primGetAddressInfo:encodedHostName serviceName:serviceName domainCode:domain socketTypeCode:type protocolCode:proto flags:flags.
 13488     ].
 13491     ].
 13489     result isArray ifFalse:[
 13492     result isArray ifFalse:[
 13490         |request|
 13493 	|request|
 13491         request := SocketAddressInfo new
 13494 	request := SocketAddressInfo new
 13492             domain:domainArg;
 13495 	    domain:domainArg;
 13493             type:typeArg;
 13496 	    type:typeArg;
 13494             protocol:protoArg;
 13497 	    protocol:protoArg;
 13495             canonicalName:hostName;
 13498 	    canonicalName:hostName;
 13496             serviceName:serviceName.
 13499 	    serviceName:serviceName.
 13497         ^ (HostNameLookupError new
 13500 	^ (HostNameLookupError new
 13498                 parameter:result;
 13501 		parameter:result;
 13499                 messageText:' - ', (result printString);
 13502 		messageText:' - ', (result printString);
 13500                 request:request) raiseRequest.
 13503 		request:request) raiseRequest.
 13501     ].
 13504     ].
 13502     1 to:result size do:[:i |
 13505     1 to:result size do:[:i |
 13503         |entry dom info|
 13506 	|entry dom info|
 13504 
 13507 
 13505         entry := result at:i.
 13508 	entry := result at:i.
 13506 
 13509 
 13507         info := SocketAddressInfo new.
 13510 	info := SocketAddressInfo new.
 13508         info
 13511 	info
 13509             flags:(entry at:1);
 13512 	    flags:(entry at:1);
 13510             domain:(dom := OperatingSystem domainSymbolOf:(entry at:2));
 13513 	    domain:(dom := OperatingSystem domainSymbolOf:(entry at:2));
 13511             type:(OperatingSystem socketTypeSymbolOf:(entry at:3));
 13514 	    type:(OperatingSystem socketTypeSymbolOf:(entry at:3));
 13512             protocol:(self protocolSymbolOf:(entry at:4));
 13515 	    protocol:(self protocolSymbolOf:(entry at:4));
 13513             socketAddress:((SocketAddress newDomain:dom) fromBytes:(entry at:5));
 13516 	    socketAddress:((SocketAddress newDomain:dom) fromBytes:(entry at:5));
 13514             canonicalName:(entry at:6).
 13517 	    canonicalName:(entry at:6).
 13515 
 13518 
 13516         result at:i put:info.
 13519 	result at:i put:info.
 13517     ].
 13520     ].
 13518     ^ result.
 13521     ^ result.
 13519 
 13522 
 13520 
 13523 
 13521     "
 13524     "
 13522      self getAddressInfo:'localhost' serviceName:nil
 13525      self getAddressInfo:'localhost' serviceName:nil
 13523             domain:nil type:nil protocol:nil flags:nil
 13526 	    domain:nil type:nil protocol:nil flags:nil
 13524      self getAddressInfo:nil serviceName:22
 13527      self getAddressInfo:nil serviceName:22
 13525             domain:nil type:nil protocol:nil flags:nil
 13528 	    domain:nil type:nil protocol:nil flags:nil
 13526      self getAddressInfo:'' serviceName:22
 13529      self getAddressInfo:'' serviceName:22
 13527             domain:nil type:nil protocol:nil flags:nil
 13530 	    domain:nil type:nil protocol:nil flags:nil
 13528      self getAddressInfo:'localhost' serviceName:nil
 13531      self getAddressInfo:'localhost' serviceName:nil
 13529             domain:nil type:#stream protocol:nil flags:nil
 13532 	    domain:nil type:#stream protocol:nil flags:nil
 13530      self getAddressInfo:'localhost' serviceName:nil
 13533      self getAddressInfo:'localhost' serviceName:nil
 13531             domain:#inet type:#stream protocol:#tcp flags:nil
 13534 	    domain:#inet type:#stream protocol:#tcp flags:nil
 13532      self getAddressInfo:'blurb.exept.de' serviceName:nil
 13535      self getAddressInfo:'blurb.exept.de' serviceName:nil
 13533             domain:#inet type:nil protocol:nil flags:nil
 13536 	    domain:#inet type:nil protocol:nil flags:nil
 13534      self getAddressInfo:'1.2.3.4' serviceName:'bla'
 13537      self getAddressInfo:'1.2.3.4' serviceName:'bla'
 13535             domain:#inet type:nil protocol:nil flags:nil
 13538 	    domain:#inet type:nil protocol:nil flags:nil
 13536      self getAddressInfo:'localhost' serviceName:'echo'
 13539      self getAddressInfo:'localhost' serviceName:'echo'
 13537             domain:#inet type:nil protocol:nil flags:nil
 13540 	    domain:#inet type:nil protocol:nil flags:nil
 13538      self getAddressInfo:nil serviceName:'echo'
 13541      self getAddressInfo:nil serviceName:'echo'
 13539             domain:#inet type:nil protocol:nil flags:nil
 13542 	    domain:#inet type:nil protocol:nil flags:nil
 13540      self getAddressInfo:nil serviceName:nil
 13543      self getAddressInfo:nil serviceName:nil
 13541             domain:#inet type:nil protocol:nil flags:nil
 13544 	    domain:#inet type:nil protocol:nil flags:nil
 13542      self getAddressInfo:'www.google.de' serviceName:80
 13545      self getAddressInfo:'www.google.de' serviceName:80
 13543             domain:nil type:nil protocol:nil flags:nil
 13546 	    domain:nil type:nil protocol:nil flags:nil
 13544      self getAddressInfo:'www.exept.de' serviceName:nil
 13547      self getAddressInfo:'www.exept.de' serviceName:nil
 13545             domain:nil type:nil protocol:nil flags:nil
 13548 	    domain:nil type:nil protocol:nil flags:nil
 13546      self getAddressInfo:'www.exept.de' serviceName:'https'
 13549      self getAddressInfo:'www.exept.de' serviceName:'https'
 13547             domain:#'AF_INET' type:nil protocol:nil flags:nil
 13550 	    domain:#'AF_INET' type:nil protocol:nil flags:nil
 13548      self getAddressInfo:'www.exept.de' serviceName:'https'
 13551      self getAddressInfo:'www.exept.de' serviceName:'https'
 13549             domain:#'AF_UNSPEC' type:nil protocol:nil flags:nil
 13552 	    domain:#'AF_UNSPEC' type:nil protocol:nil flags:nil
 13550      self getAddressInfo:'www.exept.de' serviceName:nil
 13553      self getAddressInfo:'www.exept.de' serviceName:nil
 13551             domain:#'AF_INET6' type:nil protocol:nil flags:nil
 13554 	    domain:#'AF_INET6' type:nil protocol:nil flags:nil
 13552      self getAddressInfo:'www.baden-württemberg.de' serviceName:nil
 13555      self getAddressInfo:'www.baden-württemberg.de' serviceName:nil
 13553             domain:#'AF_INET' type:#stream protocol:nil flags:nil
 13556 	    domain:#'AF_INET' type:#stream protocol:nil flags:nil
 13554      self getAddressInfo:'www.baden-württemberg.de' serviceName:nil
 13557      self getAddressInfo:'www.baden-württemberg.de' serviceName:nil
 13555             domain:#'AF_INET6' type:#stream protocol:nil flags:nil
 13558 	    domain:#'AF_INET6' type:#stream protocol:nil flags:nil
 13556     "
 13559     "
 13557 
 13560 
 13558     "Modified: / 03-03-2019 / 11:23:38 / Claus Gittinger"
 13561     "Modified: / 03-03-2019 / 11:23:38 / Claus Gittinger"
 13559 !
 13562 !
 13560 
 13563 
 13582     char *hp = 0, *sp = 0;
 13585     char *hp = 0, *sp = 0;
 13583     int hsz = 0, ssz = 0;
 13586     int hsz = 0, ssz = 0;
 13584     int ret, __flags;
 13587     int ret, __flags;
 13585     int nInstBytes, sockAddrSize;
 13588     int nInstBytes, sockAddrSize;
 13586     union {
 13589     union {
 13587         struct sockaddr addr;
 13590 	struct sockaddr addr;
 13588         char enoughBytesForBigAddresses[1024];
 13591 	char enoughBytesForBigAddresses[1024];
 13589     } sav_sockaddr;
 13592     } sav_sockaddr;
 13590     struct sockaddr *sav_sockaddrp;
 13593     struct sockaddr *sav_sockaddrp;
 13591 
 13594 
 13592     if (wantHostName == true) {
 13595     if (wantHostName == true) {
 13593         hp = host;
 13596 	hp = host;
 13594         hsz = sizeof(host);
 13597 	hsz = sizeof(host);
 13595     }
 13598     }
 13596     if (wantServiceName == true) {
 13599     if (wantServiceName == true) {
 13597         sp = service;
 13600 	sp = service;
 13598         ssz = sizeof(service);
 13601 	ssz = sizeof(service);
 13599     }
 13602     }
 13600     if (hp == 0 && sp == 0) {
 13603     if (hp == 0 && sp == 0) {
 13601         error = @symbol(badArgument);
 13604 	error = @symbol(badArgument);
 13602         goto err;
 13605 	goto err;
 13603     }
 13606     }
 13604     if (!__isBytes(socketAddress)) {
 13607     if (!__isBytes(socketAddress)) {
 13605         error = @symbol(badArgument1);
 13608 	error = @symbol(badArgument1);
 13606         goto err;
 13609 	goto err;
 13607     }
 13610     }
 13608 
 13611 
 13609     nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(__qClass(socketAddress))->c_ninstvars));
 13612     nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(__qClass(socketAddress))->c_ninstvars));
 13610     sockAddrSize = __byteArraySize(socketAddress) - nInstBytes;
 13613     sockAddrSize = __byteArraySize(socketAddress) - nInstBytes;
 13611 
 13614 
 13612     if (!__isSmallInteger(flags)) {
 13615     if (!__isSmallInteger(flags)) {
 13613         error = @symbol(badArgument5);
 13616 	error = @symbol(badArgument5);
 13614         goto err;
 13617 	goto err;
 13615     }
 13618     }
 13616     __flags = __intVal(flags);
 13619     __flags = __intVal(flags);
 13617 
 13620 
 13618 #if defined(NI_NUMERICHOST)
 13621 #if defined(NI_NUMERICHOST)
 13619     if (useDatagram == true) {
 13622     if (useDatagram == true) {
 13620         __flags |= NI_DGRAM;
 13623 	__flags |= NI_DGRAM;
 13621     }
 13624     }
 13622 
 13625 
 13623     if (sockAddrSize <= sizeof(sav_sockaddr)) {
 13626     if (sockAddrSize <= sizeof(sav_sockaddr)) {
 13624         sav_sockaddrp = &sav_sockaddr.addr;
 13627 	sav_sockaddrp = &sav_sockaddr.addr;
 13625     } else {
 13628     } else {
 13626         fprintf(stderr, "OS: sockAddr buffer size too small\n");
 13629 	fprintf(stderr, "OS: sockAddr buffer size too small\n");
 13627         sav_sockaddrp = (struct sockaddr *)malloc(sockAddrSize + 32);
 13630 	sav_sockaddrp = (struct sockaddr *)malloc(sockAddrSize + 32);
 13628     }
 13631     }
 13629 
 13632 
 13630     {
 13633     {
 13631         // when we run this interruptable (or even in a separate thread),
 13634 	// when we run this interruptable (or even in a separate thread),
 13632         // we cannot pass ST/X objects to it
 13635 	// we cannot pass ST/X objects to it
 13633         // (some other ST/X thread might trigger a GC)
 13636 	// (some other ST/X thread might trigger a GC)
 13634         memcpy(sav_sockaddrp, __byteArrayVal(socketAddress)+nInstBytes, sockAddrSize);
 13637 	memcpy(sav_sockaddrp, __byteArrayVal(socketAddress)+nInstBytes, sockAddrSize);
 13635 
 13638 
 13636         __BEGIN_INTERRUPTABLE__
 13639 	__BEGIN_INTERRUPTABLE__
 13637         ret = getnameinfo(sav_sockaddrp, sockAddrSize, hp, hsz, sp, ssz, __flags);
 13640 	ret = getnameinfo(sav_sockaddrp, sockAddrSize, hp, hsz, sp, ssz, __flags);
 13638         __END_INTERRUPTABLE__
 13641 	__END_INTERRUPTABLE__
 13639     } while (ret == EAI_SYSTEM && errno == EINTR);
 13642     } while (ret == EAI_SYSTEM && errno == EINTR);
 13640 
 13643 
 13641     if (sav_sockaddrp != &sav_sockaddr.addr) {
 13644     if (sav_sockaddrp != &sav_sockaddr.addr) {
 13642         free(sav_sockaddrp);
 13645 	free(sav_sockaddrp);
 13643     }
 13646     }
 13644 
 13647 
 13645     if (ret != 0) {
 13648     if (ret != 0) {
 13646         switch (ret) {
 13649 	switch (ret) {
 13647         case EAI_FAMILY:
 13650 	case EAI_FAMILY:
 13648             error = @symbol(badProtocol);
 13651 	    error = @symbol(badProtocol);
 13649             break;
 13652 	    break;
 13650         case EAI_SOCKTYPE:
 13653 	case EAI_SOCKTYPE:
 13651             error = @symbol(badSocketType);
 13654 	    error = @symbol(badSocketType);
 13652             break;
 13655 	    break;
 13653         case EAI_BADFLAGS:
 13656 	case EAI_BADFLAGS:
 13654             error = @symbol(badFlags);
 13657 	    error = @symbol(badFlags);
 13655             break;
 13658 	    break;
 13656         case EAI_NONAME:
 13659 	case EAI_NONAME:
 13657             error = @symbol(unknownHost);
 13660 	    error = @symbol(unknownHost);
 13658             break;
 13661 	    break;
 13659         case EAI_SERVICE:
 13662 	case EAI_SERVICE:
 13660             error = @symbol(unknownService);
 13663 	    error = @symbol(unknownService);
 13661             break;
 13664 	    break;
 13662 #ifdef EAI_ADDRFAMILY
 13665 #ifdef EAI_ADDRFAMILY
 13663         case EAI_ADDRFAMILY :
 13666 	case EAI_ADDRFAMILY :
 13664             error = @symbol(unknownHostForProtocol);
 13667 	    error = @symbol(unknownHostForProtocol);
 13665             break;
 13668 	    break;
 13666 #endif
 13669 #endif
 13667 #ifdef EAI_NODATA
 13670 #ifdef EAI_NODATA
 13668         case EAI_NODATA:
 13671 	case EAI_NODATA:
 13669             error = @symbol(noAddress);
 13672 	    error = @symbol(noAddress);
 13670             break;
 13673 	    break;
 13671 #endif
 13674 #endif
 13672         case EAI_MEMORY:
 13675 	case EAI_MEMORY:
 13673             error = @symbol(allocationFailure);
 13676 	    error = @symbol(allocationFailure);
 13674             break;
 13677 	    break;
 13675         case EAI_FAIL:
 13678 	case EAI_FAIL:
 13676             error = @symbol(permanentFailure);
 13679 	    error = @symbol(permanentFailure);
 13677             break;
 13680 	    break;
 13678         case EAI_AGAIN:
 13681 	case EAI_AGAIN:
 13679             error = @symbol(tryAgain);
 13682 	    error = @symbol(tryAgain);
 13680             break;
 13683 	    break;
 13681         case EAI_SYSTEM:
 13684 	case EAI_SYSTEM:
 13682             error = @symbol(systemError);
 13685 	    error = @symbol(systemError);
 13683             break;
 13686 	    break;
 13684         default:
 13687 	default:
 13685             error = @symbol(unknownError);
 13688 	    error = @symbol(unknownError);
 13686         }
 13689 	}
 13687         errorString = __MKSTRING(gai_strerror(ret));
 13690 	errorString = __MKSTRING(gai_strerror(ret));
 13688         goto err;
 13691 	goto err;
 13689     }
 13692     }
 13690 # else /* ! NI_NUMERICHOST */
 13693 # else /* ! NI_NUMERICHOST */
 13691     {
 13694     {
 13692         /*
 13695 	/*
 13693          * Do it using gethostbyaddr()
 13696 	 * Do it using gethostbyaddr()
 13694          */
 13697 	 */
 13695         struct sockaddr_in *sa;
 13698 	struct sockaddr_in *sa;
 13696 
 13699 
 13697         if (sockAddrSize < sizeof(*sa)) {
 13700 	if (sockAddrSize < sizeof(*sa)) {
 13698             error = @symbol(badArgument1);
 13701 	    error = @symbol(badArgument1);
 13699             goto err;
 13702 	    goto err;
 13700         }
 13703 	}
 13701 
 13704 
 13702         if (sp) {
 13705 	if (sp) {
 13703             char *__proto = (useDatagram == true ? "udp" : "tcp");
 13706 	    char *__proto = (useDatagram == true ? "udp" : "tcp");
 13704             struct servent *servp = getservbyport(sa->sin_port, __proto);
 13707 	    struct servent *servp = getservbyport(sa->sin_port, __proto);
 13705             if (servp) {
 13708 	    if (servp) {
 13706                 sp = servp->s_name;
 13709 		sp = servp->s_name;
 13707             }
 13710 	    }
 13708         }
 13711 	}
 13709         if (hp) {
 13712 	if (hp) {
 13710             struct hostent *hostp;
 13713 	    struct hostent *hostp;
 13711 #  ifdef USE_H_ERRNO
 13714 #  ifdef USE_H_ERRNO
 13712             do {
 13715 	    do {
 13713                 sa = (struct sockaddr_in *)(__byteArrayVal(socketAddress) + nInstBytes);
 13716 		sa = (struct sockaddr_in *)(__byteArrayVal(socketAddress) + nInstBytes);
 13714 
 13717 
 13715                 /* __BEGIN_INTERRUPTABLE__ is dangerous, because gethostbyname uses a static data area
 13718 		/* __BEGIN_INTERRUPTABLE__ is dangerous, because gethostbyname uses a static data area
 13716                                                          and sa points to possible grabage collected memory
 13719 							 and sa points to possible grabage collected memory
 13717                  */
 13720 		 */
 13718                 hostp = gethostbyaddr((char *)&sa->sin_addr, sockAddrSize, sa->sin_family);
 13721 		hostp = gethostbyaddr((char *)&sa->sin_addr, sockAddrSize, sa->sin_family);
 13719                 /* __END_INTERRUPTABLE__ */
 13722 		/* __END_INTERRUPTABLE__ */
 13720             } while ((hostp == NULL)
 13723 	    } while ((hostp == NULL)
 13721                       && ((h_errno == TRY_AGAIN)
 13724 		      && ((h_errno == TRY_AGAIN)
 13722                           || errno == EINTR
 13725 			  || errno == EINTR
 13723 #   ifdef IRIX5_3
 13726 #   ifdef IRIX5_3
 13724                           || (errno == ECONNREFUSED)
 13727 			  || (errno == ECONNREFUSED)
 13725 #   endif
 13728 #   endif
 13726                          )
 13729 			 )
 13727             );
 13730 	    );
 13728             if (hostp == 0) {
 13731 	    if (hostp == 0) {
 13729                 switch (h_errno) {
 13732 		switch (h_errno) {
 13730                 case HOST_NOT_FOUND:
 13733 		case HOST_NOT_FOUND:
 13731                     errorString = @symbol(unknownHost);
 13734 		    errorString = @symbol(unknownHost);
 13732                     break;
 13735 		    break;
 13733                 case NO_ADDRESS:
 13736 		case NO_ADDRESS:
 13734                     errorString = @symbol(noAddress);
 13737 		    errorString = @symbol(noAddress);
 13735                     break;
 13738 		    break;
 13736                 case NO_RECOVERY:
 13739 		case NO_RECOVERY:
 13737                     errorString = @symbol(permanentFailure);
 13740 		    errorString = @symbol(permanentFailure);
 13738                     break;
 13741 		    break;
 13739                 case TRY_AGAIN:
 13742 		case TRY_AGAIN:
 13740                     errorString = @symbol(tryAgain);
 13743 		    errorString = @symbol(tryAgain);
 13741                     break;
 13744 		    break;
 13742                 default:
 13745 		default:
 13743                     errorString = @symbol(unknownError);
 13746 		    errorString = @symbol(unknownError);
 13744                     break;
 13747 		    break;
 13745                 }
 13748 		}
 13746                 error = __mkSmallInteger(h_errno);
 13749 		error = __mkSmallInteger(h_errno);
 13747                 goto err;
 13750 		goto err;
 13748             }
 13751 	    }
 13749 #  else /* !USE_H_ERRNO */
 13752 #  else /* !USE_H_ERRNO */
 13750             hostp = gethostbyaddr(sa->sin_addr, sockAddrSize, sa->sin_family);
 13753 	    hostp = gethostbyaddr(sa->sin_addr, sockAddrSize, sa->sin_family);
 13751             if (hostp == 0) {
 13754 	    if (hostp == 0) {
 13752                 errorString = @symbol(unknownHost);
 13755 		errorString = @symbol(unknownHost);
 13753                 error = __mkSmallInteger(-1);
 13756 		error = __mkSmallInteger(-1);
 13754                 goto err;
 13757 		goto err;
 13755             }
 13758 	    }
 13756 #  endif /* !USE_H_ERRNO*/
 13759 #  endif /* !USE_H_ERRNO*/
 13757             hp = hostp->h_name;
 13760 	    hp = hostp->h_name;
 13758         }
 13761 	}
 13759     }
 13762     }
 13760 # endif /* ! NI_NUMERICHOST */
 13763 # endif /* ! NI_NUMERICHOST */
 13761 
 13764 
 13762     if (hp)
 13765     if (hp)
 13763         hostName = __MKSTRING(hp);
 13766 	hostName = __MKSTRING(hp);
 13764     if (sp)
 13767     if (sp)
 13765         serviceName = __MKSTRING(sp);
 13768 	serviceName = __MKSTRING(sp);
 13766 err:;
 13769 err:;
 13767 #else
 13770 #else
 13768     error = @symbol(notImplemented);
 13771     error = @symbol(notImplemented);
 13769 #endif
 13772 #endif
 13770 %}.
 13773 %}.
 13771     error notNil ifTrue:[
 13774     error notNil ifTrue:[
 13772         ^ (HostAddressLookupError new
 13775 	^ (HostAddressLookupError new
 13773                 parameter:error;
 13776 		parameter:error;
 13774                 messageText:' - ', errorString;
 13777 		messageText:' - ', errorString;
 13775                 request:thisContext message) raiseRequest.
 13778 		request:thisContext message) raiseRequest.
 13776     ].
 13779     ].
 13777 
 13780 
 13778     ^ Array with:hostName with:serviceName
 13781     ^ Array with:hostName with:serviceName
 13779 
 13782 
 13780     "
 13783     "
 13781      self getNameInfo:
 13784      self getNameInfo:
 13782         (self getAddressInfo:'localhost' serviceName:'echo'
 13785 	(self getAddressInfo:'localhost' serviceName:'echo'
 13783                 domain:#inet type:#stream protocol:nil flags:nil) first socketAddress
 13786 		domain:#inet type:#stream protocol:nil flags:nil) first socketAddress
 13784          wantHostName:true wantServiceName:true datagram:false flags:0
 13787 	 wantHostName:true wantServiceName:true datagram:false flags:0
 13785 
 13788 
 13786      self getNameInfo:
 13789      self getNameInfo:
 13787         (self getAddressInfo:'localhost' serviceName:'echo'
 13790 	(self getAddressInfo:'localhost' serviceName:'echo'
 13788                 domain:#AF_UNSPEC type:#stream protocol:nil flags:nil) first socketAddress
 13791 		domain:#AF_UNSPEC type:#stream protocol:nil flags:nil) first socketAddress
 13789          wantHostName:true wantServiceName:true datagram:false flags:0
 13792 	 wantHostName:true wantServiceName:true datagram:false flags:0
 13790 
 13793 
 13791      self getNameInfo:
 13794      self getNameInfo:
 13792         (self getAddressInfo:'exept.de' serviceName:'echo'
 13795 	(self getAddressInfo:'exept.de' serviceName:'echo'
 13793                 domain:#inet type:#stream protocol:nil flags:nil) first socketAddress
 13796 		domain:#inet type:#stream protocol:nil flags:nil) first socketAddress
 13794          wantHostName:true wantServiceName:true datagram:false flags:0
 13797 	 wantHostName:true wantServiceName:true datagram:false flags:0
 13795 
 13798 
 13796      self getNameInfo:
 13799      self getNameInfo:
 13797         (self getAddressInfo:'exept.de' serviceName:'echo'
 13800 	(self getAddressInfo:'exept.de' serviceName:'echo'
 13798                 domain:#AF_UNSPEC type:#stream protocol:nil flags:nil) first socketAddress
 13801 		domain:#AF_UNSPEC type:#stream protocol:nil flags:nil) first socketAddress
 13799          wantHostName:true wantServiceName:true datagram:false flags:0
 13802 	 wantHostName:true wantServiceName:true datagram:false flags:0
 13800          
 13803 
 13801      self getNameInfo:
 13804      self getNameInfo:
 13802         (self getAddressInfo:'217.172.183.25' serviceName:'22'
 13805 	(self getAddressInfo:'217.172.183.25' serviceName:'22'
 13803                 domain:#inet type:#stream protocol:nil flags:nil) first socketAddress
 13806 		domain:#inet type:#stream protocol:nil flags:nil) first socketAddress
 13804          wantHostName:true wantServiceName:true datagram:false flags:0
 13807 	 wantHostName:true wantServiceName:true datagram:false flags:0
 13805 
 13808 
 13806      self getNameInfo:
 13809      self getNameInfo:
 13807         (self getAddressInfo:'1.2.3.4' serviceName:'22'
 13810 	(self getAddressInfo:'1.2.3.4' serviceName:'22'
 13808                 domain:#inet type:#stream protocol:nil flags:nil) first socketAddress
 13811 		domain:#inet type:#stream protocol:nil flags:nil) first socketAddress
 13809          wantHostName:true wantServiceName:true datagram:false flags:0
 13812 	 wantHostName:true wantServiceName:true datagram:false flags:0
 13810     "
 13813     "
 13811 
 13814 
 13812     "Modified: / 21-03-2018 / 10:03:30 / stefan"
 13815     "Modified: / 21-03-2018 / 10:03:30 / stefan"
 13813     "Modified: / 04-03-2019 / 12:40:46 / Claus Gittinger"
 13816     "Modified: / 04-03-2019 / 12:40:46 / Claus Gittinger"
 13814 !
 13817 !