Using the Name-to-Address Mapping Routines
This section is an overview of the mapping routines that are available for use. The routines return or convert the network names to their respective network addresses. netdir_getbyname
(), netdir_getbyaddr
(), and taddr2uaddr
() return pointers to data that must be freed by calls to netdir_free
(). For more information, see the
netdir_getbyname
(3C),
netdir_getbyaddr
(3C),
taddr2uaddr
(3C), and
netdir_free
(3C) man pages.
int netdir_getbyname(struct netconfig *config, struct nd_hostserv *service, struct nd_addrlist **addrs);
netdir_getbyname
() maps the host and service name specified in service to a set of addresses that are consistent with the transport identified in config. For more information about the nd_hostserv
and nd_addrlist
structures, see the
netdir
(3C) man page. A pointer to the addresses is returned in addrs.
To find all addresses of a host and service on all available transports, call netdir_getbyname
() with each netconfig
structure returned by either getnetpath
() or getnetconfig
(). For more information, see the
netdir_getbyname
(3C),
netconfig
(5),
getnetpath
(3C), and
getnetconfig
(3C) man pages.
int netdir_getbyaddr(struct netconfig *config, struct nd_hostservlist **service, struct netbuf *netaddr);
netdir_getbyaddr
() maps addresses into host and service names. The interface is called with an address in netaddr and returns a list of host-name and service-name pairs in service. For information about the nd_hostservlist
structure, see the
netdir
(3C) man page.
void netdir_free(void *ptr, int struct_type);
The netdir_free
() routine frees structures allocated by the name-to-address translation routines. For more information, see the
netdir_free
(3C) man page. The parameters can take the values that are shown in the following table.
Table 10-2
netdir_free
() Routines
struct_type | ptr |
---|---|
|
Pointer to an |
|
Pointer to an |
|
Pointer to a |
|
Pointer to an |
char *taddr2uaddr(struct netconfig *config, struct netbuf *addr);
taddr2uaddr
() translates the address pointed to by addr and returns a transport-independent character representation of the address. This character representation is called a universal address. The value that is given in config specifies the transport for which the address is valid. The universal address can be freed by free
(). For more information, see the
taddr2uaddr
(3C) and
free
(3C) man pages.
struct netbuf *uaddr2taddr(struct netconfig *config, char *uaddr);
The universal address pointed to by uaddr is translated into a netbuf
structure. config specifies the transport for which the address is valid.
int netdir_options(struct netconfig *config, int option, int fildes, char *point_to_args);
netdir_options
() provides interfaces to transport-specific capabilities, such as the broadcast address and reserved port facilities of TCP and UDP. The value of config specifies a transport, while option specifies the transport-specific action to take. The value in option might disable consideration of the value in fd. The fourth argument points to operation-specific data. For more information, see the
netdir_options
(3C) man page.
The following table shows the values used for option
.
Table 10-3 Values for netdir_options
()
Option | Description |
---|---|
|
Sets the transport for broadcast if the transport supports broadcast |
|
Enables application binding to reserved ports if allowed by the transport |
|
Verifies that an address corresponds to a reserved port if the transport supports reserved ports |
|
Transforms a locally meaningful address into an address to which client hosts can connect |
The netdir_perror
() routine displays a message stating why one of the routines that map name-to-address failed on stderr
. For more information, see the
netdir_perror
(3C) man page.
void netdir_perror(char *s);
The netdir_sperror
() routine returns a string containing the error message stating why one of the routines that map name-to-address failed. For more information, see the
netdir_sperror
(3C) man page.
char *netdir_sperror(void);
The following example shows network selection and name-to-address mapping.
Example 10-1 Showing Network Selection and Name-to-Address Mapping
#include <netconfig.h> #include <netdir.h> #include <sys/tiuser.h> struct nd_hostserv nd_hostserv; /* host and service information */ struct nd_addrlist *nd_addrlistp; /* addresses for the service */ struct netbuf *netbufp; /* the address of the service */ struct netconfig *config; /* transport information*/ int i; /* the number of addresses */ char *uaddr; /* service universal address */ void *handlep; /* a handle into network selection */ /* * Set the host structure to reference the "date" * service on host "gandalf" */ nd_hostserv.h_host = "gandalf"; nd_hostserv.h_serv = "date"; /* * Initialize the network selection mechanism. */ if ((handlep = setnetpath()) == (void *)NULL) { nc_perror(argv[0]); exit(1); } /* * Loop through the transport providers. */ while ((config = getnetpath(handlep)) != (struct netconfig *)NULL) { /* * Print out the information associated with the * transport provider described in the "netconfig" * structure. */ printf("Transport provider name: %s\n", config->nc_netid); printf("Transport protocol family: %s\n", config->nc_protofmly); printf("The transport device file: %s\n", config->nc_device); printf("Transport provider semantics: "); switch (config->nc_semantics) { case NC_TPI_COTS: printf("virtual circuit\n"); break; case NC_TPI_COTS_ORD: printf("virtual circuit with orderly release\n"); break; case NC_TPI_CLTS: printf("datagram\n"); break; } /* * Get the address for service "date" on the host * named "gandalf" over the transport provider * specified in the netconfig structure. */ if (netdir_getbyname(config, &nd_hostserv, &nd_addrlistp) != ND_OK) { printf("Cannot determine address for service\n"); netdir_perror(argv[0]); continue; } printf("<%d> addresses of date service on gandalf:\n", nd_addrlistp->n_cnt); /* * Print out all addresses for service "date" on * host "gandalf" on current transport provider. */ netbufp = nd_addrlistp->n_addrs; for (i = 0; i < nd_addrlistp->n_cnt; i++, netbufp++) { uaddr = taddr2uaddr(config,netbufp); printf("%s\n",uaddr); free(uaddr); } netdir_free( nd_addrlistp, ND_ADDRLIST ); } endnetconfig(handlep);