netdir(3N) netdir(3N)
NAME
netdirgetbyname, netdirgetbyaddr, netdirfree, netdirmergeaddr,
taddr2uaddr, uaddr2taddr, netdirperror, netdirsperror - generic
transport name-to-address translation
SYNOPSIS
#include <netdir.h>
int
netdirgetbyname(config, service, addrs)
struct netconfig *config;
struct ndhostserv *service;
struct ndaddrlist **addrs;
int
netdirgetbyaddr(config, service, netaddr)
struct netconfig *config;
struct ndhostservlist **service;
struct netbuf *netaddr;
void
netdirfree(ptr, ident)
void *ptr;
int ident;
int
netdirmergeaddr(config, mrguaddr, suaddr, cuaddr)
struct netconfig *config;
char **mrguaddr, *suaddr, *cuaddr;
char *
taddr2uaddr(config, addr)
struct netconfig *config;
struct netbuf *addr;
struct netbuf *
uaddr2taddr(config, uaddr)
struct netconfig *config;
char *uaddr;
int
netdiroptions(netconfig, option, fd, pointertoargs)
struct netconfig *netconfig;
int option;
int fd;
char *pointtoargs;
void
netdirperror(s)
char *s;
char *
netdirsperror()
DESCRIPTION
These routines provide a generic interface for name-to-address
mapping that will work with all transport protocols. This interface
provides a generic way for programs to convert transport specific
addresses into common structures and back again.
8/91 Page 1
netdir(3N) netdir(3N)
The netdirgetbyname() routine maps the machine name and service name
in the ndhostserv structure to a collection of addresses of the type
understood by the transport identified in the netconfig structure.
This routine returns all addresses that are valid for that transport
in the ndaddrlist structure. The ndhostserv and ndaddrlist
structures have the following elements. The netconfig structure is
described on the netconfig(4) manual page.
struct ndaddrlist {
int ncnt;
struct netbuf *naddrs;
}
struct ndhostserv {
char *hhost;
char *hserv;
]
netdirgetbyname() accepts some special-case host names. These host
names are hints to the underlying mapping routines that define the
intent of the request. This information is required for some
transport provider developers to provide the correct information back
to the caller. The host names are defined in /usr/include/netdir.h.
The currently defined host names are:
HOSTSELF Represents the address to which local programs will bind
their endpoints. HOSTSELF differs from the host name
provided by gethostname(3), which represents the address
to which remote programs will bind their endpoints.
HOSTANY Represents any host accessible by this transport
provider. HOSTANY allows applications to specify a
required service without specifying a particular host
name.
HOSTBROADCAST
Represents the address for all hosts accessible by this
transport provider. Network requests to this address
will be received by all machines.
All fields of the ndhostserv structure must be initialized.
To find all available transports, call the netdirgetbyname() routine
with each struct netconfig structure returned by the getnetpath(3N)
call.
The netdirgetbyaddr() routine maps addresses to service names. This
routine returns a list of host and service pairs that would yield
this address. If more than one tuple of host and service name is
returned then the first tuple contains the preferred host and service
names.
struct ndhostservlist {
int *hcnt;
Page 2 8/91
netdir(3N) netdir(3N)
struct hostserv *hhostservs;
}
The netdirfree() structure is used to free the structures allocated
by the name to address translation routines.
The netdirmergeaddr() routine is used by a network service to return
an optimized network addresses to a client. This routine takes the
universal address of the endpoint that the service has bound to,
which is pointed to by the s_uaddr parameter, and the address of the
endpoint that a request came in on, which is pointed to by the
c_uaddr paramter, to create an optimized address for communication
with the service. The service address should be an address returned
by the netdirgetbyname() call, specified with the special host name
HOSTSELF.
The taddr2uaddr() and uaddr2taddr() routines support translation
between universal addresses and TLI type netbufs. The take and
return character string pointers. The taddr2uaddr() routine returns
a pointer to a string that contains the universal address and returns
NULL if the conversion is not possible. This is not a fatal
condition as some transports may not suppose a universal address
form.
option, fd, and pointer_to_args are passed to the netdiroptions
routine for the transport specified in netconfigp. There are four
values for option:
NDSETBROADCAST
NDSETRESERVEDPORT
NDCHECKRESERVEDPORT
NDMERGEADDR
If a transport provider does not support an option, netdiroptions
returns -1 and sets nderror to NDNOCTRL.
The specific actions of each option follow.
NDSETBROADCAST Sets the transport provider up to allow
broadcast, if the transport supports broadcast.
fd is a file descriptor into the transport (i.e.,
the result of a topen of /dev/udp).
pointer_to_args is not used. If this completes,
broadcast operations may be performed on file
descriptor fd.
NDSETRESERVEDPORT Allows the application to bind to a reserved
port, if that concept exists for the transport
provider. fd is a file descriptor into the
transport (it must not be bound to an address).
If pointer_to_args is NULL, fd will be bound to a
reserved port. If pointer_to_args is a pointer
to a netbuf structure, an attempt will be made to
8/91 Page 3
netdir(3N) netdir(3N)
bind to a reserved port on the specified address.
NDCHECKRESERVEDPORT
Used to verify that an address corresponds to a
reserved port, if that concept exists for the
transport provider. fd is not used.
pointer_to_args is a pointer to a netbuf
structure that contains an address. This option
returns 0 only if the address specified in
pointer_to_args is reserved.
NDMERGEADDR Used to take a ``local address'' (like the
0.0.0.0 address that TCP uses) and return a
``real address'' that client machines can connect
to. fd is not used. pointer_to_args is a
pointer to a struct ndmergearg, which has the
following form:
struct ndmergearg {
char *suaddr; /* server's universal address */
char *cuaddr; /* client's universal address */
char *muaddr; /* the result */
}
suaddr is something like 0.0.0.0.1.12, and, if
the call is successful, muaddr will be set to
something like 192.11.109.89.1.12. For most
transports, muaddr is exactly what suaddr is.
The netdirperror() routine prints an error message on the standard
output stating why one of the name-to-address mapping routines
failed. The error message is preceded by the string given as an
argument.
The netdirsperror() routine returns a string containing an error
message stating why one of the name-to-address mapping routines
failed.
SEE ALSO
getnetpath(3N)
Page 4 8/91