### 16.13 Networks Database

Many systems come with a database that records a list of networks known to the system developer. This is usually kept either in the file `/etc/networks` or in an equivalent from a name server. This data base is useful for routing programs such as `route`, but it is not useful for programs that simply communicate over the network. We provide functions to access this database, which are declared in `netdb.h`.

— Data Type: struct netent

> This data type is used to represent information about entries in the networks database. It has the following members:

> `char *n_name`
>   This is the “official” name of the network.
> `char **n_aliases`
>   These are alternative names for the network, represented as a vector of strings. A null pointer terminates the array.
> `int n_addrtype`
>   This is the type of the network number; this is always equal to `AF_INET` for Internet networks.
> `unsigned long int n_net`
>   This is the network number. Network numbers are returned in host byte order; see Byte Order.

Use the `getnetbyname` or `getnetbyaddr` functions to search the networks database for information about a specific network. The information is returned in a statically-allocated structure; you must copy the information if you need to save it.

— Function: struct netent * getnetbyname (const char *name)

> Preliminary: | MT-Unsafe race:netbyname env locale | AS-Unsafe dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem | See POSIX Safety Concepts.

> The `getnetbyname` function returns information about the network named name. It returns a null pointer if there is no such network.

— Function: struct netent * getnetbyaddr (uint32_t net, int type)

> Preliminary: | MT-Unsafe race:netbyaddr locale | AS-Unsafe dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem | See POSIX Safety Concepts.

> The `getnetbyaddr` function returns information about the network of type type with number net. You should specify a value of `AF_INET` for the type argument for Internet networks.

> `getnetbyaddr` returns a null pointer if there is no such network.

You can also scan the networks database using `setnetent`, `getnetent` and `endnetent`. Be careful when using these functions because they are not reentrant.

— Function: void setnetent (int stayopen)

> Preliminary: | MT-Unsafe race:netent env locale | AS-Unsafe dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem | See POSIX Safety Concepts.

> This function opens and rewinds the networks database.

> If the stayopen argument is nonzero, this sets a flag so that subsequent calls to `getnetbyname` or `getnetbyaddr` will not close the database (as they usually would). This makes for more efficiency if you call those functions several times, by avoiding reopening the database for each call.

— Function: struct netent * getnetent (void)

> Preliminary: | MT-Unsafe race:netent race:netentbuf env locale | AS-Unsafe dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem | See POSIX Safety Concepts.

> This function returns the next entry in the networks database. It returns a null pointer if there are no more entries.

— Function: void endnetent (void)

> Preliminary: | MT-Unsafe race:netent env locale | AS-Unsafe dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem | See POSIX Safety Concepts.

> This function closes the networks database.