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. Note that netdir_getbyname(3NSL), netdir_getbyaddr(3NSL), and taddr2uaddr(3NSL) return pointers to data that must be freed by calls to netdir_free(3NSL).
int netdir_getbyname(struct netconfig *nconf, struct nd_hostserv *service, struct nd_addrlist **addrs);
netdir_getbyname(3NSL) maps the host and service name specified in service to a set of addresses that are consistent with the transport identified in nconf. The nd_hostserv and nd_addrlist structures are defined in the netdir(3NSL) 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(3NSL) with each netconfig(4) structure returned by either getnetpath(3NSL) or getnetconfig(3NSL).
int netdir_getbyaddr(struct netconfig *nconf, struct nd_hostservlist **service, struct netbuf *netaddr);
netdir_getbyaddr(3NSL) 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. The nd_hostservlist structure is defined in netdir(3NSL).
void netdir_free(void *ptr, int struct_type);
The netdir_free(3NSL) routine frees structures allocated by the name-to-address translation routines. The parameters can take the values that are shown in the following table.
Table 8–2 netdir_free(3NSL) Routines|
struct_type |
ptr |
|---|---|
|
ND_HOSTSERV |
Pointer to an nd_hostserv structure |
|
ND_HOSTSERVLIST |
Pointer to an nd_hostservlist structure |
|
ND_ADDR |
Pointer to a netbuf structure |
|
ND_ADDRLIST |
Pointer to an nd_addrlist structure |
char *taddr2uaddr(struct netconfig *nconf, struct netbuf *addr);
taddr2uaddr(3NSL) 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 nconf specifies the transport for which the address is valid. The universal address can be freed by free(3C).
struct netbuf *uaddr2taddr(struct netconfig *nconf, char *uaddr);
The universal address pointed to by uaddr is translated into a netbuf structure. nconf specifies the transport for which the address is valid.
int netdir_options(const struct netconfig *config, const int option, const int fildes, char *point_to_args);
netdir_options(3NSL) provides interfaces to transport-specific capabilities, such as the broadcast address and reserved port facilities of TCP and UDP. The value of nconf 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.
The following table shows the values used for option.
Table 8–3 Values for netdir_options|
Option |
Description |
|---|---|
|
ND_SET_BROADCAST |
Sets the transport for broadcast if the transport supports broadcast |
|
ND_SET_RESERVEDPORT |
Enables application binding to reserved ports if allowed by the transport |
|
ND_CHECK_RESERVEDPORT |
Verifies that an address corresponds to a reserved port if the transport supports reserved ports |
|
ND_MERGEADDR |
Transforms a locally meaningful address into an address to which client hosts can connect |
The netdir_perror(3NSL) routine displays a message stating why one of the routines that map name-to-address failed on stderr.
void netdir_perror(char *s);
The netdir_sperror(3NSL) routine returns a string containing the error message stating why one of the routines that map name-to-address failed.
char *netdir_sperror(void);
The following example shows 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 *nconf; /* 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 ((nconf = 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", nconf->nc_netid);
printf("Transport protocol family: %s\n", nconf->nc_protofmly);
printf("The transport device file: %s\n", nconf->nc_device);
printf("Transport provider semantics: ");
switch (nconf->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(nconf, &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(nconf,netbufp);
printf("%s\n",uaddr);
free(uaddr);
}
netdir_free( nd_addrlistp, ND_ADDRLIST );
}
endnetconfig(handlep);