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