Comtrol eCos User Manual

Page 524

Advertising
background image

Chapter 38. TCP/IP Library Reference

listed in the current Assigned Numbers RFC.

The final argument is a flag that changes the default actions of this

function.

By default the fully-qualified domain name (FQDN) for the host

is looked up in the DNS and returned.

If the flag bit NI_NOFQDN is set,

only the nodename portion of the FQDN is returned for local hosts.

If the flag bit NI_NUMERICHOST is set, or if the host’s name cannot be

located in the DNS, the numeric form of the host’s address is returned

instead of its name (e.g., by calling inet_ntop() instead of

gethostbyaddr()).

If the flag bit NI_NAMEREQD is set, an error is

returned if the host’s name cannot be located in the DNS.

If the flag bit NI_NUMERICSERV is set, the numeric form of the service

address is returned (e.g., its port number) instead of its name.

The two

NI_NUMERICxxx flags are required to support the -n flag that many com-

mands provide.

A fifth flag bit, NI_DGRAM, specifies that the service is a datagram ser-

vice, and causes getservbyport() to be called with a second argument of

"udp" instead of its default of "tcp".

This is required for the few

ports (512-514) that have different services for UDP and TCP.

These NI_xxx flags are defined in

<

netdb.h>.

Extension for scoped IPv6 address

The implementation allows experimental numeric IPv6 address notation with

scope identifier.

IPv6 link-local address will appear as string like

“fe80::1%ne0”, if NI_WITHSCOPEID bit is enabled in flags argument.

Refer to getaddrinfo(3) for the notation.

EXAMPLES

The following code tries to get numeric hostname, and service name, for

given socket address.

Observe that there is no hardcoded reference to

particular address family.

struct sockaddr *sa;

/* input */

char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];

if (getnameinfo(sa, sa->sa_len, hbuf, sizeof(hbuf), sbuf,

sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV)) {

errx(1, "could not get numeric hostname");

/*NOTREACHED*/

}

printf("host=%s, serv=%s\n", hbuf, sbuf);

The following version checks if the socket address has reverse address

mapping.

struct sockaddr *sa;

/* input */

char hbuf[NI_MAXHOST];

if (getnameinfo(sa, sa->sa_len, hbuf, sizeof(hbuf), NULL, 0,

NI_NAMEREQD)) {

errx(1, "could not resolve hostname");

420

Advertising