aboutsummaryrefslogtreecommitdiff
path: root/manual/socket.texi
diff options
context:
space:
mode:
Diffstat (limited to 'manual/socket.texi')
-rw-r--r--manual/socket.texi3761
1 files changed, 0 insertions, 3761 deletions
diff --git a/manual/socket.texi b/manual/socket.texi
deleted file mode 100644
index 21b672badc..0000000000
--- a/manual/socket.texi
+++ /dev/null
@@ -1,3761 +0,0 @@
-@node Sockets, Low-Level Terminal Interface, Pipes and FIFOs, Top
-@c %MENU% A more complicated IPC mechanism, with networking support
-@chapter Sockets
-
-This chapter describes the GNU facilities for interprocess
-communication using sockets.
-
-@cindex socket
-@cindex interprocess communication, with sockets
-A @dfn{socket} is a generalized interprocess communication channel.
-Like a pipe, a socket is represented as a file descriptor. Unlike pipes
-sockets support communication between unrelated processes, and even
-between processes running on different machines that communicate over a
-network. Sockets are the primary means of communicating with other
-machines; @code{telnet}, @code{rlogin}, @code{ftp}, @code{talk} and the
-other familiar network programs use sockets.
-
-Not all operating systems support sockets. In @theglibc{}, the
-header file @file{sys/socket.h} exists regardless of the operating
-system, and the socket functions always exist, but if the system does
-not really support sockets these functions always fail.
-
-@strong{Incomplete:} We do not currently document the facilities for
-broadcast messages or for configuring Internet interfaces. The
-reentrant functions and some newer functions that are related to IPv6
-aren't documented either so far.
-
-@menu
-* Socket Concepts:: Basic concepts you need to know about.
-* Communication Styles::Stream communication, datagrams and other styles.
-* Socket Addresses:: How socket names (``addresses'') work.
-* Interface Naming:: Identifying specific network interfaces.
-* Local Namespace:: Details about the local namespace.
-* Internet Namespace:: Details about the Internet namespace.
-* Misc Namespaces:: Other namespaces not documented fully here.
-* Open/Close Sockets:: Creating sockets and destroying them.
-* Connections:: Operations on sockets with connection state.
-* Datagrams:: Operations on datagram sockets.
-* Inetd:: Inetd is a daemon that starts servers on request.
- The most convenient way to write a server
- is to make it work with Inetd.
-* Socket Options:: Miscellaneous low-level socket options.
-* Networks Database:: Accessing the database of network names.
-@end menu
-
-@node Socket Concepts
-@section Socket Concepts
-
-@cindex communication style (of a socket)
-@cindex style of communication (of a socket)
-When you create a socket, you must specify the style of communication
-you want to use and the type of protocol that should implement it.
-The @dfn{communication style} of a socket defines the user-level
-semantics of sending and receiving data on the socket. Choosing a
-communication style specifies the answers to questions such as these:
-
-@itemize @bullet
-@item
-@cindex packet
-@cindex byte stream
-@cindex stream (sockets)
-@strong{What are the units of data transmission?} Some communication
-styles regard the data as a sequence of bytes with no larger
-structure; others group the bytes into records (which are known in
-this context as @dfn{packets}).
-
-@item
-@cindex loss of data on sockets
-@cindex data loss on sockets
-@strong{Can data be lost during normal operation?} Some communication
-styles guarantee that all the data sent arrives in the order it was
-sent (barring system or network crashes); other styles occasionally
-lose data as a normal part of operation, and may sometimes deliver
-packets more than once or in the wrong order.
-
-Designing a program to use unreliable communication styles usually
-involves taking precautions to detect lost or misordered packets and
-to retransmit data as needed.
-
-@item
-@strong{Is communication entirely with one partner?} Some
-communication styles are like a telephone call---you make a
-@dfn{connection} with one remote socket and then exchange data
-freely. Other styles are like mailing letters---you specify a
-destination address for each message you send.
-@end itemize
-
-@cindex namespace (of socket)
-@cindex domain (of socket)
-@cindex socket namespace
-@cindex socket domain
-You must also choose a @dfn{namespace} for naming the socket. A socket
-name (``address'') is meaningful only in the context of a particular
-namespace. In fact, even the data type to use for a socket name may
-depend on the namespace. Namespaces are also called ``domains'', but we
-avoid that word as it can be confused with other usage of the same
-term. Each namespace has a symbolic name that starts with @samp{PF_}.
-A corresponding symbolic name starting with @samp{AF_} designates the
-address format for that namespace.
-
-@cindex network protocol
-@cindex protocol (of socket)
-@cindex socket protocol
-@cindex protocol family
-Finally you must choose the @dfn{protocol} to carry out the
-communication. The protocol determines what low-level mechanism is used
-to transmit and receive data. Each protocol is valid for a particular
-namespace and communication style; a namespace is sometimes called a
-@dfn{protocol family} because of this, which is why the namespace names
-start with @samp{PF_}.
-
-The rules of a protocol apply to the data passing between two programs,
-perhaps on different computers; most of these rules are handled by the
-operating system and you need not know about them. What you do need to
-know about protocols is this:
-
-@itemize @bullet
-@item
-In order to have communication between two sockets, they must specify
-the @emph{same} protocol.
-
-@item
-Each protocol is meaningful with particular style/namespace
-combinations and cannot be used with inappropriate combinations. For
-example, the TCP protocol fits only the byte stream style of
-communication and the Internet namespace.
-
-@item
-For each combination of style and namespace there is a @dfn{default
-protocol}, which you can request by specifying 0 as the protocol
-number. And that's what you should normally do---use the default.
-@end itemize
-
-Throughout the following description at various places
-variables/parameters to denote sizes are required. And here the trouble
-starts. In the first implementations the type of these variables was
-simply @code{int}. On most machines at that time an @code{int} was 32
-bits wide, which created a @emph{de facto} standard requiring 32-bit
-variables. This is important since references to variables of this type
-are passed to the kernel.
-
-Then the POSIX people came and unified the interface with the words "all
-size values are of type @code{size_t}". On 64-bit machines
-@code{size_t} is 64 bits wide, so pointers to variables were no longer
-possible.
-
-The Unix98 specification provides a solution by introducing a type
-@code{socklen_t}. This type is used in all of the cases that POSIX
-changed to use @code{size_t}. The only requirement of this type is that
-it be an unsigned type of at least 32 bits. Therefore, implementations
-which require that references to 32-bit variables be passed can be as
-happy as implementations which use 64-bit values.
-
-
-@node Communication Styles
-@section Communication Styles
-
-@Theglibc{} includes support for several different kinds of sockets,
-each with different characteristics. This section describes the
-supported socket types. The symbolic constants listed here are
-defined in @file{sys/socket.h}.
-@pindex sys/socket.h
-
-@comment sys/socket.h
-@comment BSD
-@deftypevr Macro int SOCK_STREAM
-The @code{SOCK_STREAM} style is like a pipe (@pxref{Pipes and FIFOs}).
-It operates over a connection with a particular remote socket and
-transmits data reliably as a stream of bytes.
-
-Use of this style is covered in detail in @ref{Connections}.
-@end deftypevr
-
-@comment sys/socket.h
-@comment BSD
-@deftypevr Macro int SOCK_DGRAM
-The @code{SOCK_DGRAM} style is used for sending
-individually-addressed packets unreliably.
-It is the diametrical opposite of @code{SOCK_STREAM}.
-
-Each time you write data to a socket of this kind, that data becomes
-one packet. Since @code{SOCK_DGRAM} sockets do not have connections,
-you must specify the recipient address with each packet.
-
-The only guarantee that the system makes about your requests to
-transmit data is that it will try its best to deliver each packet you
-send. It may succeed with the sixth packet after failing with the
-fourth and fifth packets; the seventh packet may arrive before the
-sixth, and may arrive a second time after the sixth.
-
-The typical use for @code{SOCK_DGRAM} is in situations where it is
-acceptable to simply re-send a packet if no response is seen in a
-reasonable amount of time.
-
-@xref{Datagrams}, for detailed information about how to use datagram
-sockets.
-@end deftypevr
-
-@ignore
-@c This appears to be only for the NS domain, which we aren't
-@c discussing and probably won't support either.
-@comment sys/socket.h
-@comment BSD
-@deftypevr Macro int SOCK_SEQPACKET
-This style is like @code{SOCK_STREAM} except that the data are
-structured into packets.
-
-A program that receives data over a @code{SOCK_SEQPACKET} socket
-should be prepared to read the entire message packet in a single call
-to @code{read}; if it only reads part of the message, the remainder of
-the message is simply discarded instead of being available for
-subsequent calls to @code{read}.
-
-Many protocols do not support this communication style.
-@end deftypevr
-@end ignore
-
-@ignore
-@comment sys/socket.h
-@comment BSD
-@deftypevr Macro int SOCK_RDM
-This style is a reliable version of @code{SOCK_DGRAM}: it sends
-individually addressed packets, but guarantees that each packet sent
-arrives exactly once.
-
-@strong{Warning:} It is not clear this is actually supported
-by any operating system.
-@end deftypevr
-@end ignore
-
-@comment sys/socket.h
-@comment BSD
-@deftypevr Macro int SOCK_RAW
-This style provides access to low-level network protocols and
-interfaces. Ordinary user programs usually have no need to use this
-style.
-@end deftypevr
-
-@node Socket Addresses
-@section Socket Addresses
-
-@cindex address of socket
-@cindex name of socket
-@cindex binding a socket address
-@cindex socket address (name) binding
-The name of a socket is normally called an @dfn{address}. The
-functions and symbols for dealing with socket addresses were named
-inconsistently, sometimes using the term ``name'' and sometimes using
-``address''. You can regard these terms as synonymous where sockets
-are concerned.
-
-A socket newly created with the @code{socket} function has no
-address. Other processes can find it for communication only if you
-give it an address. We call this @dfn{binding} the address to the
-socket, and the way to do it is with the @code{bind} function.
-
-You need only be concerned with the address of a socket if other processes
-are to find it and start communicating with it. You can specify an
-address for other sockets, but this is usually pointless; the first time
-you send data from a socket, or use it to initiate a connection, the
-system assigns an address automatically if you have not specified one.
-
-Occasionally a client needs to specify an address because the server
-discriminates based on address; for example, the rsh and rlogin
-protocols look at the client's socket address and only bypass password
-checking if it is less than @code{IPPORT_RESERVED} (@pxref{Ports}).
-
-The details of socket addresses vary depending on what namespace you are
-using. @xref{Local Namespace}, or @ref{Internet Namespace}, for specific
-information.
-
-Regardless of the namespace, you use the same functions @code{bind} and
-@code{getsockname} to set and examine a socket's address. These
-functions use a phony data type, @code{struct sockaddr *}, to accept the
-address. In practice, the address lives in a structure of some other
-data type appropriate to the address format you are using, but you cast
-its address to @code{struct sockaddr *} when you pass it to
-@code{bind}.
-
-@menu
-* Address Formats:: About @code{struct sockaddr}.
-* Setting Address:: Binding an address to a socket.
-* Reading Address:: Reading the address of a socket.
-@end menu
-
-@node Address Formats
-@subsection Address Formats
-
-The functions @code{bind} and @code{getsockname} use the generic data
-type @code{struct sockaddr *} to represent a pointer to a socket
-address. You can't use this data type effectively to interpret an
-address or construct one; for that, you must use the proper data type
-for the socket's namespace.
-
-Thus, the usual practice is to construct an address of the proper
-namespace-specific type, then cast a pointer to @code{struct sockaddr *}
-when you call @code{bind} or @code{getsockname}.
-
-The one piece of information that you can get from the @code{struct
-sockaddr} data type is the @dfn{address format designator}. This tells
-you which data type to use to understand the address fully.
-
-@pindex sys/socket.h
-The symbols in this section are defined in the header file
-@file{sys/socket.h}.
-
-@comment sys/socket.h
-@comment BSD
-@deftp {Data Type} {struct sockaddr}
-The @code{struct sockaddr} type itself has the following members:
-
-@table @code
-@item short int sa_family
-This is the code for the address format of this address. It
-identifies the format of the data which follows.
-
-@item char sa_data[14]
-This is the actual socket address data, which is format-dependent. Its
-length also depends on the format, and may well be more than 14. The
-length 14 of @code{sa_data} is essentially arbitrary.
-@end table
-@end deftp
-
-Each address format has a symbolic name which starts with @samp{AF_}.
-Each of them corresponds to a @samp{PF_} symbol which designates the
-corresponding namespace. Here is a list of address format names:
-
-@vtable @code
-@comment sys/socket.h
-@comment POSIX
-@item AF_LOCAL
-This designates the address format that goes with the local namespace.
-(@code{PF_LOCAL} is the name of that namespace.) @xref{Local Namespace
-Details}, for information about this address format.
-
-@comment sys/socket.h
-@comment BSD, Unix98
-@item AF_UNIX
-This is a synonym for @code{AF_LOCAL}. Although @code{AF_LOCAL} is
-mandated by POSIX.1g, @code{AF_UNIX} is portable to more systems.
-@code{AF_UNIX} was the traditional name stemming from BSD, so even most
-POSIX systems support it. It is also the name of choice in the Unix98
-specification. (The same is true for @code{PF_UNIX}
-vs. @code{PF_LOCAL}).
-
-@comment sys/socket.h
-@comment GNU
-@item AF_FILE
-This is another synonym for @code{AF_LOCAL}, for compatibility.
-(@code{PF_FILE} is likewise a synonym for @code{PF_LOCAL}.)
-
-@comment sys/socket.h
-@comment BSD
-@item AF_INET
-This designates the address format that goes with the Internet
-namespace. (@code{PF_INET} is the name of that namespace.)
-@xref{Internet Address Formats}.
-
-@comment sys/socket.h
-@comment IPv6 Basic API
-@item AF_INET6
-This is similar to @code{AF_INET}, but refers to the IPv6 protocol.
-(@code{PF_INET6} is the name of the corresponding namespace.)
-
-@comment sys/socket.h
-@comment BSD
-@item AF_UNSPEC
-This designates no particular address format. It is used only in rare
-cases, such as to clear out the default destination address of a
-``connected'' datagram socket. @xref{Sending Datagrams}.
-
-The corresponding namespace designator symbol @code{PF_UNSPEC} exists
-for completeness, but there is no reason to use it in a program.
-@end vtable
-
-@file{sys/socket.h} defines symbols starting with @samp{AF_} for many
-different kinds of networks, most or all of which are not actually
-implemented. We will document those that really work as we receive
-information about how to use them.
-
-@node Setting Address
-@subsection Setting the Address of a Socket
-
-@pindex sys/socket.h
-Use the @code{bind} function to assign an address to a socket. The
-prototype for @code{bind} is in the header file @file{sys/socket.h}.
-For examples of use, see @ref{Local Socket Example}, or see @ref{Inet Example}.
-
-@comment sys/socket.h
-@comment BSD
-@deftypefun int bind (int @var{socket}, struct sockaddr *@var{addr}, socklen_t @var{length})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
-@c Direct syscall, except on Hurd.
-The @code{bind} function assigns an address to the socket
-@var{socket}. The @var{addr} and @var{length} arguments specify the
-address; the detailed format of the address depends on the namespace.
-The first part of the address is always the format designator, which
-specifies a namespace, and says that the address is in the format of
-that namespace.
-
-The return value is @code{0} on success and @code{-1} on failure. The
-following @code{errno} error conditions are defined for this function:
-
-@table @code
-@item EBADF
-The @var{socket} argument is not a valid file descriptor.
-
-@item ENOTSOCK
-The descriptor @var{socket} is not a socket.
-
-@item EADDRNOTAVAIL
-The specified address is not available on this machine.
-
-@item EADDRINUSE
-Some other socket is already using the specified address.
-
-@item EINVAL
-The socket @var{socket} already has an address.
-
-@item EACCES
-You do not have permission to access the requested address. (In the
-Internet domain, only the super-user is allowed to specify a port number
-in the range 0 through @code{IPPORT_RESERVED} minus one; see
-@ref{Ports}.)
-@end table
-
-Additional conditions may be possible depending on the particular namespace
-of the socket.
-@end deftypefun
-
-@node Reading Address
-@subsection Reading the Address of a Socket
-
-@pindex sys/socket.h
-Use the function @code{getsockname} to examine the address of an
-Internet socket. The prototype for this function is in the header file
-@file{sys/socket.h}.
-
-@comment sys/socket.h
-@comment BSD
-@deftypefun int getsockname (int @var{socket}, struct sockaddr *@var{addr}, socklen_t *@var{length-ptr})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsmem{/hurd}}}
-@c Direct syscall, except on Hurd, where it seems like it might leak
-@c VM if cancelled.
-The @code{getsockname} function returns information about the
-address of the socket @var{socket} in the locations specified by the
-@var{addr} and @var{length-ptr} arguments. Note that the
-@var{length-ptr} is a pointer; you should initialize it to be the
-allocation size of @var{addr}, and on return it contains the actual
-size of the address data.
-
-The format of the address data depends on the socket namespace. The
-length of the information is usually fixed for a given namespace, so
-normally you can know exactly how much space is needed and can provide
-that much. The usual practice is to allocate a place for the value
-using the proper data type for the socket's namespace, then cast its
-address to @code{struct sockaddr *} to pass it to @code{getsockname}.
-
-The return value is @code{0} on success and @code{-1} on error. The
-following @code{errno} error conditions are defined for this function:
-
-@table @code
-@item EBADF
-The @var{socket} argument is not a valid file descriptor.
-
-@item ENOTSOCK
-The descriptor @var{socket} is not a socket.
-
-@item ENOBUFS
-There are not enough internal buffers available for the operation.
-@end table
-@end deftypefun
-
-You can't read the address of a socket in the file namespace. This is
-consistent with the rest of the system; in general, there's no way to
-find a file's name from a descriptor for that file.
-
-@node Interface Naming
-@section Interface Naming
-
-Each network interface has a name. This usually consists of a few
-letters that relate to the type of interface, which may be followed by a
-number if there is more than one interface of that type. Examples
-might be @code{lo} (the loopback interface) and @code{eth0} (the first
-Ethernet interface).
-
-Although such names are convenient for humans, it would be clumsy to
-have to use them whenever a program needs to refer to an interface. In
-such situations an interface is referred to by its @dfn{index}, which is
-an arbitrarily-assigned small positive integer.
-
-The following functions, constants and data types are declared in the
-header file @file{net/if.h}.
-
-@comment net/if.h
-@deftypevr Constant size_t IFNAMSIZ
-This constant defines the maximum buffer size needed to hold an
-interface name, including its terminating zero byte.
-@end deftypevr
-
-@comment net/if.h
-@comment IPv6 basic API
-@deftypefun {unsigned int} if_nametoindex (const char *@var{ifname})
-@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{}}}
-@c It opens a socket to use ioctl on the fd to get the index.
-@c opensock may call socket and access multiple times until it finds a
-@c socket family that works. The Linux implementation has a potential
-@c concurrency issue WRT last_type and last_family not being updated
-@c atomically, but it is harmless; the generic implementation, OTOH,
-@c takes a lock, which makes all callers AS- and AC-Unsafe.
-@c opensock @asulock @aculock @acsfd
-This function yields the interface index corresponding to a particular
-name. If no interface exists with the name given, it returns 0.
-@end deftypefun
-
-@comment net/if.h
-@comment IPv6 basic API
-@deftypefun {char *} if_indextoname (unsigned int @var{ifindex}, char *@var{ifname})
-@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{}}}
-@c It opens a socket with opensock to use ioctl on the fd to get the
-@c name from the index.
-This function maps an interface index to its corresponding name. The
-returned name is placed in the buffer pointed to by @code{ifname}, which
-must be at least @code{IFNAMSIZ} bytes in length. If the index was
-invalid, the function's return value is a null pointer, otherwise it is
-@code{ifname}.
-@end deftypefun
-
-@comment net/if.h
-@comment IPv6 basic API
-@deftp {Data Type} {struct if_nameindex}
-This data type is used to hold the information about a single
-interface. It has the following members:
-
-@table @code
-@item unsigned int if_index;
-This is the interface index.
-
-@item char *if_name
-This is the null-terminated index name.
-
-@end table
-@end deftp
-
-@comment net/if.h
-@comment IPv6 basic API
-@deftypefun {struct if_nameindex *} if_nameindex (void)
-@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{/hurd}}@acunsafe{@aculock{/hurd} @acsfd{} @acsmem{}}}
-@c if_nameindex @ascuheap @asulock/hurd @aculock/hurd @acsfd @acsmem
-@c [linux]
-@c netlink_open @acsfd @acsmem/hurd
-@c socket dup @acsfd
-@c memset dup ok
-@c bind dup ok
-@c netlink_close dup @acsfd
-@c getsockname dup @acsmem/hurd
-@c netlink_request @ascuheap @acsmem
-@c getpagesize dup ok
-@c malloc dup @ascuheap @acsmem
-@c netlink_sendreq ok
-@c memset dup ok
-@c sendto dup ok
-@c recvmsg dup ok
-@c memcpy dup ok
-@c free dup @ascuheap @acsmem
-@c netlink_free_handle @ascuheap @acsmem
-@c free dup @ascuheap @acsmem
-@c netlink_close @acsfd
-@c close dup @acsfd
-@c malloc dup @asuheap @acsmem
-@c strndup @ascuheap @acsmem
-@c if_freenameindex @ascuheap @acsmem
-@c [hurd]
-@c opensock dup @asulock @aculock @acsfd
-@c hurd_socket_server ok
-@c pfinet_siocgifconf ok
-@c malloc @ascuheap @acsmem
-@c strdup @ascuheap @acsmem
-@c ioctl dup ok
-@c free @ascuheap @acsmem
-This function returns an array of @code{if_nameindex} structures, one
-for every interface that is present. The end of the list is indicated
-by a structure with an interface of 0 and a null name pointer. If an
-error occurs, this function returns a null pointer.
-
-The returned structure must be freed with @code{if_freenameindex} after
-use.
-@end deftypefun
-
-@comment net/if.h
-@comment IPv6 basic API
-@deftypefun void if_freenameindex (struct if_nameindex *@var{ptr})
-@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
-@c if_freenameindex @ascuheap @acsmem
-@c free dup @ascuheap @acsmem
-This function frees the structure returned by an earlier call to
-@code{if_nameindex}.
-@end deftypefun
-
-@node Local Namespace
-@section The Local Namespace
-@cindex local namespace, for sockets
-
-This section describes the details of the local namespace, whose
-symbolic name (required when you create a socket) is @code{PF_LOCAL}.
-The local namespace is also known as ``Unix domain sockets''. Another
-name is file namespace since socket addresses are normally implemented
-as file names.
-
-@menu
-* Concepts: Local Namespace Concepts. What you need to understand.
-* Details: Local Namespace Details. Address format, symbolic names, etc.
-* Example: Local Socket Example. Example of creating a socket.
-@end menu
-
-@node Local Namespace Concepts
-@subsection Local Namespace Concepts
-
-In the local namespace socket addresses are file names. You can specify
-any file name you want as the address of the socket, but you must have
-write permission on the directory containing it.
-@c XXX The following was said to be wrong.
-@c In order to connect to a socket you must have read permission for it.
-It's common to put these files in the @file{/tmp} directory.
-
-One peculiarity of the local namespace is that the name is only used
-when opening the connection; once open the address is not meaningful and
-may not exist.
-
-Another peculiarity is that you cannot connect to such a socket from
-another machine--not even if the other machine shares the file system
-which contains the name of the socket. You can see the socket in a
-directory listing, but connecting to it never succeeds. Some programs
-take advantage of this, such as by asking the client to send its own
-process ID, and using the process IDs to distinguish between clients.
-However, we recommend you not use this method in protocols you design,
-as we might someday permit connections from other machines that mount
-the same file systems. Instead, send each new client an identifying
-number if you want it to have one.
-
-After you close a socket in the local namespace, you should delete the
-file name from the file system. Use @code{unlink} or @code{remove} to
-do this; see @ref{Deleting Files}.
-
-The local namespace supports just one protocol for any communication
-style; it is protocol number @code{0}.
-
-@node Local Namespace Details
-@subsection Details of Local Namespace
-
-@pindex sys/socket.h
-To create a socket in the local namespace, use the constant
-@code{PF_LOCAL} as the @var{namespace} argument to @code{socket} or
-@code{socketpair}. This constant is defined in @file{sys/socket.h}.
-
-@comment sys/socket.h
-@comment POSIX
-@deftypevr Macro int PF_LOCAL
-This designates the local namespace, in which socket addresses are local
-names, and its associated family of protocols. @code{PF_LOCAL} is the
-macro used by POSIX.1g.
-@end deftypevr
-
-@comment sys/socket.h
-@comment BSD
-@deftypevr Macro int PF_UNIX
-This is a synonym for @code{PF_LOCAL}, for compatibility's sake.
-@end deftypevr
-
-@comment sys/socket.h
-@comment GNU
-@deftypevr Macro int PF_FILE
-This is a synonym for @code{PF_LOCAL}, for compatibility's sake.
-@end deftypevr
-
-The structure for specifying socket names in the local namespace is
-defined in the header file @file{sys/un.h}:
-@pindex sys/un.h
-
-@comment sys/un.h
-@comment BSD
-@deftp {Data Type} {struct sockaddr_un}
-This structure is used to specify local namespace socket addresses. It has
-the following members:
-
-@table @code
-@item short int sun_family
-This identifies the address family or format of the socket address.
-You should store the value @code{AF_LOCAL} to designate the local
-namespace. @xref{Socket Addresses}.
-
-@item char sun_path[108]
-This is the file name to use.
-
-@strong{Incomplete:} Why is 108 a magic number? RMS suggests making
-this a zero-length array and tweaking the following example to use
-@code{alloca} to allocate an appropriate amount of storage based on
-the length of the filename.
-@end table
-@end deftp
-
-You should compute the @var{length} parameter for a socket address in
-the local namespace as the sum of the size of the @code{sun_family}
-component and the string length (@emph{not} the allocation size!) of
-the file name string. This can be done using the macro @code{SUN_LEN}:
-
-@comment sys/un.h
-@comment BSD
-@deftypefn {Macro} int SUN_LEN (@emph{struct sockaddr_un *} @var{ptr})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
-This macro computes the length of the socket address in the local namespace.
-@end deftypefn
-
-@node Local Socket Example
-@subsection Example of Local-Namespace Sockets
-
-Here is an example showing how to create and name a socket in the local
-namespace.
-
-@smallexample
-@include mkfsock.c.texi
-@end smallexample
-
-@node Internet Namespace
-@section The Internet Namespace
-@cindex Internet namespace, for sockets
-
-This section describes the details of the protocols and socket naming
-conventions used in the Internet namespace.
-
-Originally the Internet namespace used only IP version 4 (IPv4). With
-the growing number of hosts on the Internet, a new protocol with a
-larger address space was necessary: IP version 6 (IPv6). IPv6
-introduces 128-bit addresses (IPv4 has 32-bit addresses) and other
-features, and will eventually replace IPv4.
-
-To create a socket in the IPv4 Internet namespace, use the symbolic name
-@code{PF_INET} of this namespace as the @var{namespace} argument to
-@code{socket} or @code{socketpair}. For IPv6 addresses you need the
-macro @code{PF_INET6}. These macros are defined in @file{sys/socket.h}.
-@pindex sys/socket.h
-
-@comment sys/socket.h
-@comment BSD
-@deftypevr Macro int PF_INET
-This designates the IPv4 Internet namespace and associated family of
-protocols.
-@end deftypevr
-
-@comment sys/socket.h
-@comment X/Open
-@deftypevr Macro int PF_INET6
-This designates the IPv6 Internet namespace and associated family of
-protocols.
-@end deftypevr
-
-A socket address for the Internet namespace includes the following components:
-
-@itemize @bullet
-@item
-The address of the machine you want to connect to. Internet addresses
-can be specified in several ways; these are discussed in @ref{Internet
-Address Formats}, @ref{Host Addresses} and @ref{Host Names}.
-
-@item
-A port number for that machine. @xref{Ports}.
-@end itemize
-
-You must ensure that the address and port number are represented in a
-canonical format called @dfn{network byte order}. @xref{Byte Order},
-for information about this.
-
-@menu
-* Internet Address Formats:: How socket addresses are specified in the
- Internet namespace.
-* Host Addresses:: All about host addresses of Internet host.
-* Ports:: Internet port numbers.
-* Services Database:: Ports may have symbolic names.
-* Byte Order:: Different hosts may use different byte
- ordering conventions; you need to
- canonicalize host address and port number.
-* Protocols Database:: Referring to protocols by name.
-* Inet Example:: Putting it all together.
-@end menu
-
-@node Internet Address Formats
-@subsection Internet Socket Address Formats
-
-In the Internet namespace, for both IPv4 (@code{AF_INET}) and IPv6
-(@code{AF_INET6}), a socket address consists of a host address
-and a port on that host. In addition, the protocol you choose serves
-effectively as a part of the address because local port numbers are
-meaningful only within a particular protocol.
-
-The data types for representing socket addresses in the Internet namespace
-are defined in the header file @file{netinet/in.h}.
-@pindex netinet/in.h
-
-@comment netinet/in.h
-@comment BSD
-@deftp {Data Type} {struct sockaddr_in}
-This is the data type used to represent socket addresses in the
-Internet namespace. It has the following members:
-
-@table @code
-@item sa_family_t sin_family
-This identifies the address family or format of the socket address.
-You should store the value @code{AF_INET} in this member.
-@xref{Socket Addresses}.
-
-@item struct in_addr sin_addr
-This is the Internet address of the host machine. @xref{Host
-Addresses}, and @ref{Host Names}, for how to get a value to store
-here.
-
-@item unsigned short int sin_port
-This is the port number. @xref{Ports}.
-@end table
-@end deftp
-
-When you call @code{bind} or @code{getsockname}, you should specify
-@code{sizeof (struct sockaddr_in)} as the @var{length} parameter if
-you are using an IPv4 Internet namespace socket address.
-
-@deftp {Data Type} {struct sockaddr_in6}
-This is the data type used to represent socket addresses in the IPv6
-namespace. It has the following members:
-
-@table @code
-@item sa_family_t sin6_family
-This identifies the address family or format of the socket address.
-You should store the value of @code{AF_INET6} in this member.
-@xref{Socket Addresses}.
-
-@item struct in6_addr sin6_addr
-This is the IPv6 address of the host machine. @xref{Host
-Addresses}, and @ref{Host Names}, for how to get a value to store
-here.
-
-@item uint32_t sin6_flowinfo
-This is a currently unimplemented field.
-
-@item uint16_t sin6_port
-This is the port number. @xref{Ports}.
-
-@end table
-@end deftp
-
-@node Host Addresses
-@subsection Host Addresses
-
-Each computer on the Internet has one or more @dfn{Internet addresses},
-numbers which identify that computer among all those on the Internet.
-Users typically write IPv4 numeric host addresses as sequences of four
-numbers, separated by periods, as in @samp{128.52.46.32}, and IPv6
-numeric host addresses as sequences of up to eight numbers separated by
-colons, as in @samp{5f03:1200:836f:c100::1}.
-
-Each computer also has one or more @dfn{host names}, which are strings
-of words separated by periods, as in @samp{www.gnu.org}.
-
-Programs that let the user specify a host typically accept both numeric
-addresses and host names. To open a connection a program needs a
-numeric address, and so must convert a host name to the numeric address
-it stands for.
-
-@menu
-* Abstract Host Addresses:: What a host number consists of.
-* Data type: Host Address Data Type. Data type for a host number.
-* Functions: Host Address Functions. Functions to operate on them.
-* Names: Host Names. Translating host names to host numbers.
-@end menu
-
-@node Abstract Host Addresses
-@subsubsection Internet Host Addresses
-@cindex host address, Internet
-@cindex Internet host address
-
-@ifinfo
-Each computer on the Internet has one or more Internet addresses,
-numbers which identify that computer among all those on the Internet.
-@end ifinfo
-
-@cindex network number
-@cindex local network address number
-An IPv4 Internet host address is a number containing four bytes of data.
-Historically these are divided into two parts, a @dfn{network number} and a
-@dfn{local network address number} within that network. In the
-mid-1990s classless addresses were introduced which changed this
-behavior. Since some functions implicitly expect the old definitions,
-we first describe the class-based network and will then describe
-classless addresses. IPv6 uses only classless addresses and therefore
-the following paragraphs don't apply.
-
-The class-based IPv4 network number consists of the first one, two or
-three bytes; the rest of the bytes are the local address.
-
-IPv4 network numbers are registered with the Network Information Center
-(NIC), and are divided into three classes---A, B and C. The local
-network address numbers of individual machines are registered with the
-administrator of the particular network.
-
-Class A networks have single-byte numbers in the range 0 to 127. There
-are only a small number of Class A networks, but they can each support a
-very large number of hosts. Medium-sized Class B networks have two-byte
-network numbers, with the first byte in the range 128 to 191. Class C
-networks are the smallest; they have three-byte network numbers, with
-the first byte in the range 192-255. Thus, the first 1, 2, or 3 bytes
-of an Internet address specify a network. The remaining bytes of the
-Internet address specify the address within that network.
-
-The Class A network 0 is reserved for broadcast to all networks. In
-addition, the host number 0 within each network is reserved for broadcast
-to all hosts in that network. These uses are obsolete now but for
-compatibility reasons you shouldn't use network 0 and host number 0.
-
-The Class A network 127 is reserved for loopback; you can always use
-the Internet address @samp{127.0.0.1} to refer to the host machine.
-
-Since a single machine can be a member of multiple networks, it can
-have multiple Internet host addresses. However, there is never
-supposed to be more than one machine with the same host address.
-
-@c !!! this section could document the IN_CLASS* macros in <netinet/in.h>.
-@c No, it shouldn't since they're obsolete.
-
-@cindex standard dot notation, for Internet addresses
-@cindex dot notation, for Internet addresses
-There are four forms of the @dfn{standard numbers-and-dots notation}
-for Internet addresses:
-
-@table @code
-@item @var{a}.@var{b}.@var{c}.@var{d}
-This specifies all four bytes of the address individually and is the
-commonly used representation.
-
-@item @var{a}.@var{b}.@var{c}
-The last part of the address, @var{c}, is interpreted as a 2-byte quantity.
-This is useful for specifying host addresses in a Class B network with
-network address number @code{@var{a}.@var{b}}.
-
-@item @var{a}.@var{b}
-The last part of the address, @var{b}, is interpreted as a 3-byte quantity.
-This is useful for specifying host addresses in a Class A network with
-network address number @var{a}.
-
-@item @var{a}
-If only one part is given, this corresponds directly to the host address
-number.
-@end table
-
-Within each part of the address, the usual C conventions for specifying
-the radix apply. In other words, a leading @samp{0x} or @samp{0X} implies
-hexadecimal radix; a leading @samp{0} implies octal; and otherwise decimal
-radix is assumed.
-
-@subsubheading Classless Addresses
-
-IPv4 addresses (and IPv6 addresses also) are now considered classless;
-the distinction between classes A, B and C can be ignored. Instead an
-IPv4 host address consists of a 32-bit address and a 32-bit mask. The
-mask contains set bits for the network part and cleared bits for the
-host part. The network part is contiguous from the left, with the
-remaining bits representing the host. As a consequence, the netmask can
-simply be specified as the number of set bits. Classes A, B and C are
-just special cases of this general rule. For example, class A addresses
-have a netmask of @samp{255.0.0.0} or a prefix length of 8.
-
-Classless IPv4 network addresses are written in numbers-and-dots
-notation with the prefix length appended and a slash as separator. For
-example the class A network 10 is written as @samp{10.0.0.0/8}.
-
-@subsubheading IPv6 Addresses
-
-IPv6 addresses contain 128 bits (IPv4 has 32 bits) of data. A host
-address is usually written as eight 16-bit hexadecimal numbers that are
-separated by colons. Two colons are used to abbreviate strings of
-consecutive zeros. For example, the IPv6 loopback address
-@samp{0:0:0:0:0:0:0:1} can just be written as @samp{::1}.
-
-@node Host Address Data Type
-@subsubsection Host Address Data Type
-
-IPv4 Internet host addresses are represented in some contexts as integers
-(type @code{uint32_t}). In other contexts, the integer is
-packaged inside a structure of type @code{struct in_addr}. It would
-be better if the usage were made consistent, but it is not hard to extract
-the integer from the structure or put the integer into a structure.
-
-You will find older code that uses @code{unsigned long int} for
-IPv4 Internet host addresses instead of @code{uint32_t} or @code{struct
-in_addr}. Historically @code{unsigned long int} was a 32-bit number but
-with 64-bit machines this has changed. Using @code{unsigned long int}
-might break the code if it is used on machines where this type doesn't
-have 32 bits. @code{uint32_t} is specified by Unix98 and guaranteed to have
-32 bits.
-
-IPv6 Internet host addresses have 128 bits and are packaged inside a
-structure of type @code{struct in6_addr}.
-
-The following basic definitions for Internet addresses are declared in
-the header file @file{netinet/in.h}:
-@pindex netinet/in.h
-
-@comment netinet/in.h
-@comment BSD
-@deftp {Data Type} {struct in_addr}
-This data type is used in certain contexts to contain an IPv4 Internet
-host address. It has just one field, named @code{s_addr}, which records
-the host address number as an @code{uint32_t}.
-@end deftp
-
-@comment netinet/in.h
-@comment BSD
-@deftypevr Macro {uint32_t} INADDR_LOOPBACK
-You can use this constant to stand for ``the address of this machine,''
-instead of finding its actual address. It is the IPv4 Internet address
-@samp{127.0.0.1}, which is usually called @samp{localhost}. This
-special constant saves you the trouble of looking up the address of your
-own machine. Also, the system usually implements @code{INADDR_LOOPBACK}
-specially, avoiding any network traffic for the case of one machine
-talking to itself.
-@end deftypevr
-
-@comment netinet/in.h
-@comment BSD
-@deftypevr Macro {uint32_t} INADDR_ANY
-You can use this constant to stand for ``any incoming address'' when
-binding to an address. @xref{Setting Address}. This is the usual
-address to give in the @code{sin_addr} member of @w{@code{struct
-sockaddr_in}} when you want to accept Internet connections.
-@end deftypevr
-
-@comment netinet/in.h
-@comment BSD
-@deftypevr Macro {uint32_t} INADDR_BROADCAST
-This constant is the address you use to send a broadcast message.
-@c !!! broadcast needs further documented
-@end deftypevr
-
-@comment netinet/in.h
-@comment BSD
-@deftypevr Macro {uint32_t} INADDR_NONE
-This constant is returned by some functions to indicate an error.
-@end deftypevr
-
-@comment netinet/in.h
-@comment IPv6 basic API
-@deftp {Data Type} {struct in6_addr}
-This data type is used to store an IPv6 address. It stores 128 bits of
-data, which can be accessed (via a union) in a variety of ways.
-@end deftp
-
-@comment netinet/in.h
-@comment IPv6 basic API
-@deftypevr Constant {struct in6_addr} in6addr_loopback
-This constant is the IPv6 address @samp{::1}, the loopback address. See
-above for a description of what this means. The macro
-@code{IN6ADDR_LOOPBACK_INIT} is provided to allow you to initialize your
-own variables to this value.
-@end deftypevr
-
-@comment netinet/in.h
-@comment IPv6 basic API
-@deftypevr Constant {struct in6_addr} in6addr_any
-This constant is the IPv6 address @samp{::}, the unspecified address. See
-above for a description of what this means. The macro
-@code{IN6ADDR_ANY_INIT} is provided to allow you to initialize your
-own variables to this value.
-@end deftypevr
-
-@node Host Address Functions
-@subsubsection Host Address Functions
-
-@pindex arpa/inet.h
-@noindent
-These additional functions for manipulating Internet addresses are
-declared in the header file @file{arpa/inet.h}. They represent Internet
-addresses in network byte order, and network numbers and
-local-address-within-network numbers in host byte order. @xref{Byte
-Order}, for an explanation of network and host byte order.
-
-@comment arpa/inet.h
-@comment BSD
-@deftypefun int inet_aton (const char *@var{name}, struct in_addr *@var{addr})
-@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
-@c inet_aton @mtslocale
-@c isdigit dup @mtslocale
-@c strtoul dup @mtslocale
-@c isascii dup @mtslocale
-@c isspace dup @mtslocale
-@c htonl dup ok
-This function converts the IPv4 Internet host address @var{name}
-from the standard numbers-and-dots notation into binary data and stores
-it in the @code{struct in_addr} that @var{addr} points to.
-@code{inet_aton} returns nonzero if the address is valid, zero if not.
-@end deftypefun
-
-@comment arpa/inet.h
-@comment BSD
-@deftypefun {uint32_t} inet_addr (const char *@var{name})
-@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
-@c inet_addr @mtslocale
-@c inet_aton dup @mtslocale
-This function converts the IPv4 Internet host address @var{name} from the
-standard numbers-and-dots notation into binary data. If the input is
-not valid, @code{inet_addr} returns @code{INADDR_NONE}. This is an
-obsolete interface to @code{inet_aton}, described immediately above. It
-is obsolete because @code{INADDR_NONE} is a valid address
-(255.255.255.255), and @code{inet_aton} provides a cleaner way to
-indicate error return.
-@end deftypefun
-
-@comment arpa/inet.h
-@comment BSD
-@deftypefun {uint32_t} inet_network (const char *@var{name})
-@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
-@c inet_network @mtslocale
-@c isdigit dup @mtslocale
-@c isxdigit dup @mtslocale
-@c tolower dup @mtslocale
-@c isspace dup @mtslocale
-This function extracts the network number from the address @var{name},
-given in the standard numbers-and-dots notation. The returned address is
-in host order. If the input is not valid, @code{inet_network} returns
-@code{-1}.
-
-The function works only with traditional IPv4 class A, B and C network
-types. It doesn't work with classless addresses and shouldn't be used
-anymore.
-@end deftypefun
-
-@comment arpa/inet.h
-@comment BSD
-@deftypefun {char *} inet_ntoa (struct in_addr @var{addr})
-@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asurace{}}@acsafe{}}
-@c inet_ntoa @mtslocale @asurace
-@c writes to a thread-local static buffer
-@c snprintf @mtslocale [no @ascuheap or @acsmem]
-This function converts the IPv4 Internet host address @var{addr} to a
-string in the standard numbers-and-dots notation. The return value is
-a pointer into a statically-allocated buffer. Subsequent calls will
-overwrite the same buffer, so you should copy the string if you need
-to save it.
-
-In multi-threaded programs each thread has its own statically-allocated
-buffer. But still subsequent calls of @code{inet_ntoa} in the same
-thread will overwrite the result of the last call.
-
-Instead of @code{inet_ntoa} the newer function @code{inet_ntop} which is
-described below should be used since it handles both IPv4 and IPv6
-addresses.
-@end deftypefun
-
-@comment arpa/inet.h
-@comment BSD
-@deftypefun {struct in_addr} inet_makeaddr (uint32_t @var{net}, uint32_t @var{local})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
-@c inet_makeaddr ok
-@c htonl dup ok
-This function makes an IPv4 Internet host address by combining the network
-number @var{net} with the local-address-within-network number
-@var{local}.
-@end deftypefun
-
-@comment arpa/inet.h
-@comment BSD
-@deftypefun uint32_t inet_lnaof (struct in_addr @var{addr})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
-@c inet_lnaof ok
-@c ntohl dup ok
-@c IN_CLASSA ok
-@c IN_CLASSB ok
-This function returns the local-address-within-network part of the
-Internet host address @var{addr}.
-
-The function works only with traditional IPv4 class A, B and C network
-types. It doesn't work with classless addresses and shouldn't be used
-anymore.
-@end deftypefun
-
-@comment arpa/inet.h
-@comment BSD
-@deftypefun uint32_t inet_netof (struct in_addr @var{addr})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
-@c inet_netof ok
-@c ntohl dup ok
-@c IN_CLASSA ok
-@c IN_CLASSB ok
-This function returns the network number part of the Internet host
-address @var{addr}.
-
-The function works only with traditional IPv4 class A, B and C network
-types. It doesn't work with classless addresses and shouldn't be used
-anymore.
-@end deftypefun
-
-@comment arpa/inet.h
-@comment IPv6 basic API
-@deftypefun int inet_pton (int @var{af}, const char *@var{cp}, void *@var{buf})
-@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
-@c inet_pton @mtslocale
-@c inet_pton4 ok
-@c memcpy dup ok
-@c inet_pton6 @mtslocale
-@c memset dup ok
-@c tolower dup @mtslocale
-@c strchr dup ok
-@c inet_pton4 dup ok
-@c memcpy dup ok
-This function converts an Internet address (either IPv4 or IPv6) from
-presentation (textual) to network (binary) format. @var{af} should be
-either @code{AF_INET} or @code{AF_INET6}, as appropriate for the type of
-address being converted. @var{cp} is a pointer to the input string, and
-@var{buf} is a pointer to a buffer for the result. It is the caller's
-responsibility to make sure the buffer is large enough.
-@end deftypefun
-
-@comment arpa/inet.h
-@comment IPv6 basic API
-@deftypefun {const char *} inet_ntop (int @var{af}, const void *@var{cp}, char *@var{buf}, socklen_t @var{len})
-@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
-@c inet_ntop @mtslocale
-@c inet_ntop4 @mtslocale
-@c sprintf dup @mtslocale [no @ascuheap or @acsmem]
-@c strcpy dup ok
-@c inet_ntop6 @mtslocale
-@c memset dup ok
-@c inet_ntop4 dup @mtslocale
-@c sprintf dup @mtslocale [no @ascuheap or @acsmem]
-@c strcpy dup ok
-This function converts an Internet address (either IPv4 or IPv6) from
-network (binary) to presentation (textual) form. @var{af} should be
-either @code{AF_INET} or @code{AF_INET6}, as appropriate. @var{cp} is a
-pointer to the address to be converted. @var{buf} should be a pointer
-to a buffer to hold the result, and @var{len} is the length of this
-buffer. The return value from the function will be this buffer address.
-@end deftypefun
-
-@node Host Names
-@subsubsection Host Names
-@cindex hosts database
-@cindex converting host name to address
-@cindex converting host address to name
-
-Besides the standard numbers-and-dots notation for Internet addresses,
-you can also refer to a host by a symbolic name. The advantage of a
-symbolic name is that it is usually easier to remember. For example,
-the machine with Internet address @samp{158.121.106.19} is also known as
-@samp{alpha.gnu.org}; and other machines in the @samp{gnu.org}
-domain can refer to it simply as @samp{alpha}.
-
-@pindex /etc/hosts
-@pindex netdb.h
-Internally, the system uses a database to keep track of the mapping
-between host names and host numbers. This database is usually either
-the file @file{/etc/hosts} or an equivalent provided by a name server.
-The functions and other symbols for accessing this database are declared
-in @file{netdb.h}. They are BSD features, defined unconditionally if
-you include @file{netdb.h}.
-
-@comment netdb.h
-@comment BSD
-@deftp {Data Type} {struct hostent}
-This data type is used to represent an entry in the hosts database. It
-has the following members:
-
-@table @code
-@item char *h_name
-This is the ``official'' name of the host.
-
-@item char **h_aliases
-These are alternative names for the host, represented as a null-terminated
-vector of strings.
-
-@item int h_addrtype
-This is the host address type; in practice, its value is always either
-@code{AF_INET} or @code{AF_INET6}, with the latter being used for IPv6
-hosts. In principle other kinds of addresses could be represented in
-the database as well as Internet addresses; if this were done, you
-might find a value in this field other than @code{AF_INET} or
-@code{AF_INET6}. @xref{Socket Addresses}.
-
-@item int h_length
-This is the length, in bytes, of each address.
-
-@item char **h_addr_list
-This is the vector of addresses for the host. (Recall that the host
-might be connected to multiple networks and have different addresses on
-each one.) The vector is terminated by a null pointer.
-
-@item char *h_addr
-This is a synonym for @code{h_addr_list[0]}; in other words, it is the
-first host address.
-@end table
-@end deftp
-
-As far as the host database is concerned, each address is just a block
-of memory @code{h_length} bytes long. But in other contexts there is an
-implicit assumption that you can convert IPv4 addresses to a
-@code{struct in_addr} or an @code{uint32_t}. Host addresses in
-a @code{struct hostent} structure are always given in network byte
-order; see @ref{Byte Order}.
-
-You can use @code{gethostbyname}, @code{gethostbyname2} or
-@code{gethostbyaddr} to search the hosts database for information about
-a particular host. The information is returned in a
-statically-allocated structure; you must copy the information if you
-need to save it across calls. You can also use @code{getaddrinfo} and
-@code{getnameinfo} to obtain this information.
-
-@comment netdb.h
-@comment BSD
-@deftypefun {struct hostent *} gethostbyname (const char *@var{name})
-@safety{@prelim{}@mtunsafe{@mtasurace{:hostbyname} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @asucorrupt{} @ascuheap{} @asulock{}}@acunsafe{@aculock{} @acucorrupt{} @acsmem{} @acsfd{}}}
-@c gethostbyname @mtasurace:hostbyname @mtsenv @mtslocale @ascudlopen @ascuplugin @asucorrupt @ascuheap @asulock @aculock @acucorrupt @acsmem @acsfd
-@c libc_lock_lock dup @asulock @aculock
-@c malloc dup @ascuheap @acsmem
-@c nss_hostname_digits_dots @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd
-@c res_maybe_init(!preinit) @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd
-@c res_iclose @acsuheap @acsmem @acsfd
-@c close_not_cancel_no_status dup @acsfd
-@c free dup @acsuheap @acsmem
-@c res_vinit @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd
-@c res_randomid ok
-@c getpid dup ok
-@c getenv dup @mtsenv
-@c strncpy dup ok
-@c fopen dup @ascuheap @asulock @acsmem @acsfd @aculock
-@c fsetlocking dup ok [no concurrent uses]
-@c fgets_unlocked dup ok [no concurrent uses]
-@c MATCH ok
-@c strncmp dup ok
-@c strpbrk dup ok
-@c strchr dup ok
-@c inet_aton dup @mtslocale
-@c htons dup
-@c inet_pton dup @mtslocale
-@c malloc dup @ascuheap @acsmem
-@c IN6_IS_ADDR_LINKLOCAL ok
-@c htonl dup ok
-@c IN6_IS_ADDR_MC_LINKLOCAL ok
-@c if_nametoindex dup @asulock @aculock @acsfd
-@c strtoul dup @mtslocale
-@c ISSORTMASK ok
-@c strchr dup ok
-@c isascii dup @mtslocale
-@c isspace dup @mtslocale
-@c net_mask ok
-@c ntohl dup ok
-@c IN_CLASSA dup ok
-@c htonl dup ok
-@c IN_CLASSB dup ok
-@c res_setoptions @mtslocale
-@c strncmp dup ok
-@c atoi dup @mtslocale
-@c fclose dup @ascuheap @asulock @aculock @acsmem @acsfd
-@c inet_makeaddr dup ok
-@c gethostname dup ok
-@c strcpy dup ok
-@c rawmemchr dup ok
-@c res_ninit @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd
-@c res_vinit dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd
-@c isdigit dup @mtslocale
-@c isxdigit dup @mtslocale
-@c strlen dup ok
-@c realloc dup @ascuheap @acsmem
-@c free dup @ascuheap @acsmem
-@c memset dup ok
-@c inet_aton dup @mtslocale
-@c inet_pton dup @mtslocale
-@c strcpy dup ok
-@c memcpy dup ok
-@c strchr dup ok
-@c gethostbyname_r dup @mtsenv @mtslocale @ascudlopen @ascuplugin @asucorrupt @ascuheap @asulock @aculock @acucorrupt @acsmem @acsfd
-@c realloc dup @ascuheap @acsmem
-@c free dup @ascuheap @acsmem
-@c libc_lock_unlock dup @aculock
-@c set_h_errno ok
-The @code{gethostbyname} function returns information about the host
-named @var{name}. If the lookup fails, it returns a null pointer.
-@end deftypefun
-
-@comment netdb.h
-@comment IPv6 Basic API
-@deftypefun {struct hostent *} gethostbyname2 (const char *@var{name}, int @var{af})
-@safety{@prelim{}@mtunsafe{@mtasurace{:hostbyname2} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @asucorrupt{} @ascuheap{} @asulock{}}@acunsafe{@aculock{} @acucorrupt{} @acsmem{} @acsfd{}}}
-@c gethostbyname2 @mtasurace:hostbyname2 @mtsenv @mtslocale @ascudlopen @ascuplugin @asucorrupt @ascuheap @asulock @aculock @acucorrupt @acsmem @acsfd
-@c libc_lock_lock dup @asulock @aculock
-@c malloc dup @ascuheap @acsmem
-@c nss_hostname_digits_dots dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd
-@c gethostbyname2_r dup @mtsenv @mtslocale @ascudlopen @ascuplugin @asucorrupt @ascuheap @asulock @aculock @acucorrupt @acsmem @acsfd
-@c realloc dup @ascuheap @acsmem
-@c free dup @ascuheap @acsmem
-@c libc_lock_unlock dup @aculock
-@c set_h_errno dup ok
-The @code{gethostbyname2} function is like @code{gethostbyname}, but
-allows the caller to specify the desired address family (e.g.@:
-@code{AF_INET} or @code{AF_INET6}) of the result.
-@end deftypefun
-
-@comment netdb.h
-@comment BSD
-@deftypefun {struct hostent *} gethostbyaddr (const void *@var{addr}, socklen_t @var{length}, int @var{format})
-@safety{@prelim{}@mtunsafe{@mtasurace{:hostbyaddr} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @asucorrupt{} @ascuheap{} @asulock{}}@acunsafe{@aculock{} @acucorrupt{} @acsmem{} @acsfd{}}}
-@c gethostbyaddr @mtasurace:hostbyaddr @mtsenv @mtslocale @ascudlopen @ascuplugin @asucorrupt @ascuheap @asulock @aculock @acucorrupt @acsmem @acsfd
-@c libc_lock_lock dup @asulock @aculock
-@c malloc dup @ascuheap @acsmem
-@c gethostbyaddr_r dup @mtsenv @mtslocale @ascudlopen @ascuplugin @asucorrupt @ascuheap @asulock @aculock @acucorrupt @acsmem @acsfd
-@c realloc dup @ascuheap @acsmem
-@c free dup @ascuheap @acsmem
-@c libc_lock_unlock dup @aculock
-@c set_h_errno dup ok
-The @code{gethostbyaddr} function returns information about the host
-with Internet address @var{addr}. The parameter @var{addr} is not
-really a pointer to char - it can be a pointer to an IPv4 or an IPv6
-address. The @var{length} argument is the size (in bytes) of the address
-at @var{addr}. @var{format} specifies the address format; for an IPv4
-Internet address, specify a value of @code{AF_INET}; for an IPv6
-Internet address, use @code{AF_INET6}.
-
-If the lookup fails, @code{gethostbyaddr} returns a null pointer.
-@end deftypefun
-
-@vindex h_errno
-If the name lookup by @code{gethostbyname} or @code{gethostbyaddr}
-fails, you can find out the reason by looking at the value of the
-variable @code{h_errno}. (It would be cleaner design for these
-functions to set @code{errno}, but use of @code{h_errno} is compatible
-with other systems.)
-
-Here are the error codes that you may find in @code{h_errno}:
-
-@vtable @code
-@comment netdb.h
-@comment BSD
-@item HOST_NOT_FOUND
-No such host is known in the database.
-
-@comment netdb.h
-@comment BSD
-@item TRY_AGAIN
-This condition happens when the name server could not be contacted. If
-you try again later, you may succeed then.
-
-@comment netdb.h
-@comment BSD
-@item NO_RECOVERY
-A non-recoverable error occurred.
-
-@comment netdb.h
-@comment BSD
-@item NO_ADDRESS
-The host database contains an entry for the name, but it doesn't have an
-associated Internet address.
-@end vtable
-
-The lookup functions above all have one thing in common: they are not
-reentrant and therefore unusable in multi-threaded applications.
-Therefore provides @theglibc{} a new set of functions which can be
-used in this context.
-
-@comment netdb.h
-@comment GNU
-@deftypefun int gethostbyname_r (const char *restrict @var{name}, struct hostent *restrict @var{result_buf}, char *restrict @var{buf}, size_t @var{buflen}, struct hostent **restrict @var{result}, int *restrict @var{h_errnop})
-@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @asucorrupt{} @ascuheap{} @asulock{}}@acunsafe{@aculock{} @acucorrupt{} @acsmem{} @acsfd{}}}
-@c gethostbyname_r @mtsenv @mtslocale @ascudlopen @ascuplugin @asucorrupt @ascuheap @asulock @aculock @acucorrupt @acsmem @acsfd
-@c nss_hostname_digits_dots dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd
-@c nscd_gethostbyname_r @mtsenv @ascuheap @acsfd @acsmem
-@c nscd_gethst_r @mtsenv @ascuheap @acsfd @acsmem
-@c getenv dup @mtsenv
-@c nscd_get_map_ref dup @ascuheap @acsfd @acsmem
-@c nscd_cache_search dup ok
-@c memcpy dup ok
-@c nscd_open_socket dup @acsfd
-@c readvall dup ok
-@c readall dup ok
-@c close_not_cancel_no_status dup @acsfd
-@c nscd_drop_map_ref dup @ascuheap @acsmem
-@c nscd_unmap dup @ascuheap @acsmem
-@c res_maybe_init(!preinit) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd
-@c res_hconf_init @mtsenv @mtslocale @asucorrupt @ascuheap @aculock @acucorrupt @acsmem [no @asuinit:reshconf @acuinit:reshconf, conditionally called]
-@c res_hconf.c:do_init @mtsenv @mtslocale @asucorrupt @ascuheap @aculock @acucorrupt @acsmem
-@c memset dup ok
-@c getenv dup @mtsenv
-@c fopen dup @ascuheap @asulock @acsmem @acsfd @aculock
-@c fsetlocking dup ok [no concurrent uses]
-@c fgets_unlocked dup ok [no concurrent uses]
-@c strchrnul dup ok
-@c res_hconf.c:parse_line @mtslocale @asucorrupt @ascuheap @aculock @acucorrupt @acsmem
-@c skip_ws dup @mtslocale
-@c skip_string dup @mtslocale
-@c strncasecmp dup @mtslocale
-@c strlen dup ok
-@c asprintf dup @mtslocale @ascuheap @acsmem
-@c fxprintf dup @asucorrupt @aculock @acucorrupt
-@c free dup @ascuheap @acsmem
-@c arg_trimdomain_list dup @mtslocale @asucorrupt @ascuheap @aculock @acucorrupt @acsmem
-@c arg_spoof dup @mtslocale
-@c arg_bool dup @mtslocale @asucorrupt @ascuheap @aculock @acucorrupt @acsmem
-@c isspace dup @mtslocale
-@c fclose dup @ascuheap @asulock @acsmem @acsfd @aculock
-@c arg_spoof @mtslocale
-@c skip_string @mtslocale
-@c isspace dup @mtslocale
-@c strncasecmp dup @mtslocale
-@c arg_bool @mtslocale @asucorrupt @ascuheap @aculock @acucorrupt @acsmem
-@c strncasecmp dup @mtslocale
-@c asprintf dup @mtslocale @ascuheap @acsmem
-@c fxprintf dup @asucorrupt @aculock @acucorrupt
-@c free dup @ascuheap @acsmem
-@c arg_trimdomain_list @mtslocale @asucorrupt @ascuheap @aculock @acucorrupt @acsmem
-@c skip_string dup @mtslocale
-@c asprintf dup @mtslocale @ascuheap @acsmem
-@c fxprintf dup @asucorrupt @aculock @acucorrupt
-@c free dup @ascuheap @acsmem
-@c strndup dup @ascuheap @acsmem
-@c skip_ws @mtslocale
-@c isspace dup @mtslocale
-@c nss_hosts_lookup2 @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c nss_database_lookup dup @mtslocale @ascuheap @asulock @acucorrupt @acsmem @acsfd @aculock
-@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.l -> _nss_*_gethostbyname_r @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c res_hconf_reorder_addrs @asulock @ascuheap @aculock @acsmem @acsfd
-@c socket dup @acsfd
-@c libc_lock_lock dup @asulock @aculock
-@c ifreq @ascuheap @acsmem
-@c malloc dup @ascuheap @acsmem
-@c if_nextreq dup ok
-@c ioctl dup ok
-@c realloc dup @ascuheap @acsmem
-@c if_freereq dup @acsmem
-@c libc_lock_unlock dup @aculock
-@c close dup @acsfd
-The @code{gethostbyname_r} function returns information about the host
-named @var{name}. The caller must pass a pointer to an object of type
-@code{struct hostent} in the @var{result_buf} parameter. In addition
-the function may need extra buffer space and the caller must pass a
-pointer and the size of the buffer in the @var{buf} and @var{buflen}
-parameters.
-
-A pointer to the buffer, in which the result is stored, is available in
-@code{*@var{result}} after the function call successfully returned. The
-buffer passed as the @var{buf} parameter can be freed only once the caller
-has finished with the result hostent struct, or has copied it including all
-the other memory that it points to. If an error occurs or if no entry is
-found, the pointer @code{*@var{result}} is a null pointer. Success is
-signalled by a zero return value. If the function failed the return value
-is an error number. In addition to the errors defined for
-@code{gethostbyname} it can also be @code{ERANGE}. In this case the call
-should be repeated with a larger buffer. Additional error information is
-not stored in the global variable @code{h_errno} but instead in the object
-pointed to by @var{h_errnop}.
-
-Here's a small example:
-@smallexample
-struct hostent *
-gethostname (char *host)
-@{
- struct hostent *hostbuf, *hp;
- size_t hstbuflen;
- char *tmphstbuf;
- int res;
- int herr;
-
- hostbuf = malloc (sizeof (struct hostent));
- hstbuflen = 1024;
- tmphstbuf = malloc (hstbuflen);
-
- while ((res = gethostbyname_r (host, hostbuf, tmphstbuf, hstbuflen,
- &hp, &herr)) == ERANGE)
- @{
- /* Enlarge the buffer. */
- hstbuflen *= 2;
- tmphstbuf = realloc (tmphstbuf, hstbuflen);
- @}
-
- free (tmphstbuf);
- /* Check for errors. */
- if (res || hp == NULL)
- return NULL;
- return hp;
-@}
-@end smallexample
-@end deftypefun
-
-@comment netdb.h
-@comment GNU
-@deftypefun int gethostbyname2_r (const char *@var{name}, int @var{af}, struct hostent *restrict @var{result_buf}, char *restrict @var{buf}, size_t @var{buflen}, struct hostent **restrict @var{result}, int *restrict @var{h_errnop})
-@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @asucorrupt{} @ascuheap{} @asulock{}}@acunsafe{@aculock{} @acucorrupt{} @acsmem{} @acsfd{}}}
-@c gethostbyname2_r @mtsenv @mtslocale @ascudlopen @ascuplugin @asucorrupt @ascuheap @asulock @aculock @acucorrupt @acsmem @acsfd
-@c nss_hostname_digits_dots dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd
-@c nscd_gethostbyname2_r @mtsenv @ascuheap @asulock @aculock @acsfd @acsmem
-@c nscd_gethst_r dup @mtsenv @ascuheap @asulock @aculock @acsfd @acsmem
-@c res_maybe_init(!preinit) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd
-@c res_hconf_init dup @mtsenv @mtslocale @asucorrupt @ascuheap @aculock @acucorrupt @acsmem [no @asuinit:reshconf @acuinit:reshconf, conditionally called]
-@c nss_hosts_lookup2 dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.l -> _nss_*_gethostbyname2_r @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c res_hconf_reorder_addrs dup @asulock @ascuheap @aculock @acsmem @acsfd
-The @code{gethostbyname2_r} function is like @code{gethostbyname_r}, but
-allows the caller to specify the desired address family (e.g.@:
-@code{AF_INET} or @code{AF_INET6}) for the result.
-@end deftypefun
-
-@comment netdb.h
-@comment GNU
-@deftypefun int gethostbyaddr_r (const void *@var{addr}, socklen_t @var{length}, int @var{format}, struct hostent *restrict @var{result_buf}, char *restrict @var{buf}, size_t @var{buflen}, struct hostent **restrict @var{result}, int *restrict @var{h_errnop})
-@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @asucorrupt{} @ascuheap{} @asulock{}}@acunsafe{@aculock{} @acucorrupt{} @acsmem{} @acsfd{}}}
-@c gethostbyaddr_r @mtsenv @mtslocale @ascudlopen @ascuplugin @asucorrupt @ascuheap @asulock @aculock @acucorrupt @acsmem @acsfd
-@c memcmp dup ok
-@c nscd_gethostbyaddr_r @mtsenv @ascuheap @asulock @aculock @acsfd @acsmem
-@c nscd_gethst_r dup @mtsenv @ascuheap @asulock @aculock @acsfd @acsmem
-@c res_maybe_init(!preinit) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd
-@c res_hconf_init dup @mtsenv @mtslocale @asucorrupt @ascuheap @aculock @acucorrupt @acsmem [no @asuinit:reshconf @acuinit:reshconf, conditionally called]
-@c nss_hosts_lookup2 dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.l -> _nss_*_gethostbyaddr_r @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c res_hconf_reorder_addrs dup @asulock @ascuheap @aculock @acsmem @acsfd
-@c res_hconf_trim_domains @mtslocale
-@c res_hconf_trim_domain @mtslocale
-@c strlen dup ok
-@c strcasecmp dup @mtslocale
-The @code{gethostbyaddr_r} function returns information about the host
-with Internet address @var{addr}. The parameter @var{addr} is not
-really a pointer to char - it can be a pointer to an IPv4 or an IPv6
-address. The @var{length} argument is the size (in bytes) of the address
-at @var{addr}. @var{format} specifies the address format; for an IPv4
-Internet address, specify a value of @code{AF_INET}; for an IPv6
-Internet address, use @code{AF_INET6}.
-
-Similar to the @code{gethostbyname_r} function, the caller must provide
-buffers for the result and memory used internally. In case of success
-the function returns zero. Otherwise the value is an error number where
-@code{ERANGE} has the special meaning that the caller-provided buffer is
-too small.
-@end deftypefun
-
-You can also scan the entire hosts database one entry at a time using
-@code{sethostent}, @code{gethostent} and @code{endhostent}. Be careful
-when using these functions because they are not reentrant.
-
-@comment netdb.h
-@comment BSD
-@deftypefun void sethostent (int @var{stayopen})
-@safety{@prelim{}@mtunsafe{@mtasurace{:hostent} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
-@c sethostent @mtasurace:hostent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock dup @asulock @aculock
-@c nss_setent(nss_hosts_lookup2) @mtasurace:hostent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c res_maybe_init(!preinit) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd
-@c set_h_errno dup ok
-@c setup(nss_hosts_lookup2) @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *lookup_fct = nss_hosts_lookup2 dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.f @mtasurace:hostent @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_unlock dup @aculock
-This function opens the hosts database to begin scanning it. You can
-then call @code{gethostent} to read the entries.
-
-@c There was a rumor that this flag has different meaning if using the DNS,
-@c but it appears this description is accurate in that case also.
-If the @var{stayopen} argument is nonzero, this sets a flag so that
-subsequent calls to @code{gethostbyname} or @code{gethostbyaddr} 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.
-@end deftypefun
-
-@comment netdb.h
-@comment BSD
-@deftypefun {struct hostent *} gethostent (void)
-@safety{@prelim{}@mtunsafe{@mtasurace{:hostent} @mtasurace{:hostentbuf} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
-@c gethostent @mtasurace:hostent @mtasurace:hostentbuf @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock dup @asulock @aculock
-@c nss_getent(gethostent_r) @mtasurace:hostent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c malloc dup @ascuheap @acsmem
-@c *func = gethostent_r dup @mtasurace:hostent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c realloc dup @ascuheap @acsmem
-@c free dup @ascuheap @acsmem
-@c libc_lock_unlock dup @aculock
-@c
-@c gethostent_r @mtasurace:hostent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock dup @asulock @aculock
-@c nss_getent_r(nss_hosts_lookup2) @mtasurace:hostent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c res_maybe_init(!preinit) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd
-@c setup(nss_hosts_lookup2) dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.f @mtasurace:hostent @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *sfct.f @mtasurace:hostent @ascuplugin
-@c libc_lock_unlock dup @aculock
-
-This function returns the next entry in the hosts database. It
-returns a null pointer if there are no more entries.
-@end deftypefun
-
-@comment netdb.h
-@comment BSD
-@deftypefun void endhostent (void)
-@safety{@prelim{}@mtunsafe{@mtasurace{:hostent} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
-@c endhostent @mtasurace:hostent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock @asulock @aculock
-@c nss_endent(nss_hosts_lookup2) @mtasurace:hostent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c res_maybe_init(!preinit) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd
-@c setup(nss_passwd_lookup2) dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.f @mtasurace:hostent @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_unlock @aculock
-This function closes the hosts database.
-@end deftypefun
-
-@node Ports
-@subsection Internet Ports
-@cindex port number
-
-A socket address in the Internet namespace consists of a machine's
-Internet address plus a @dfn{port number} which distinguishes the
-sockets on a given machine (for a given protocol). Port numbers range
-from 0 to 65,535.
-
-Port numbers less than @code{IPPORT_RESERVED} are reserved for standard
-servers, such as @code{finger} and @code{telnet}. There is a database
-that keeps track of these, and you can use the @code{getservbyname}
-function to map a service name onto a port number; see @ref{Services
-Database}.
-
-If you write a server that is not one of the standard ones defined in
-the database, you must choose a port number for it. Use a number
-greater than @code{IPPORT_USERRESERVED}; such numbers are reserved for
-servers and won't ever be generated automatically by the system.
-Avoiding conflicts with servers being run by other users is up to you.
-
-When you use a socket without specifying its address, the system
-generates a port number for it. This number is between
-@code{IPPORT_RESERVED} and @code{IPPORT_USERRESERVED}.
-
-On the Internet, it is actually legitimate to have two different
-sockets with the same port number, as long as they never both try to
-communicate with the same socket address (host address plus port
-number). You shouldn't duplicate a port number except in special
-circumstances where a higher-level protocol requires it. Normally,
-the system won't let you do it; @code{bind} normally insists on
-distinct port numbers. To reuse a port number, you must set the
-socket option @code{SO_REUSEADDR}. @xref{Socket-Level Options}.
-
-@pindex netinet/in.h
-These macros are defined in the header file @file{netinet/in.h}.
-
-@comment netinet/in.h
-@comment BSD
-@deftypevr Macro int IPPORT_RESERVED
-Port numbers less than @code{IPPORT_RESERVED} are reserved for
-superuser use.
-@end deftypevr
-
-@comment netinet/in.h
-@comment BSD
-@deftypevr Macro int IPPORT_USERRESERVED
-Port numbers greater than or equal to @code{IPPORT_USERRESERVED} are
-reserved for explicit use; they will never be allocated automatically.
-@end deftypevr
-
-@node Services Database
-@subsection The Services Database
-@cindex services database
-@cindex converting service name to port number
-@cindex converting port number to service name
-
-@pindex /etc/services
-The database that keeps track of ``well-known'' services is usually
-either the file @file{/etc/services} or an equivalent from a name server.
-You can use these utilities, declared in @file{netdb.h}, to access
-the services database.
-@pindex netdb.h
-
-@comment netdb.h
-@comment BSD
-@deftp {Data Type} {struct servent}
-This data type holds information about entries from the services database.
-It has the following members:
-
-@table @code
-@item char *s_name
-This is the ``official'' name of the service.
-
-@item char **s_aliases
-These are alternate names for the service, represented as an array of
-strings. A null pointer terminates the array.
-
-@item int s_port
-This is the port number for the service. Port numbers are given in
-network byte order; see @ref{Byte Order}.
-
-@item char *s_proto
-This is the name of the protocol to use with this service.
-@xref{Protocols Database}.
-@end table
-@end deftp
-
-To get information about a particular service, use the
-@code{getservbyname} or @code{getservbyport} functions. The information
-is returned in a statically-allocated structure; you must copy the
-information if you need to save it across calls.
-
-@comment netdb.h
-@comment BSD
-@deftypefun {struct servent *} getservbyname (const char *@var{name}, const char *@var{proto})
-@safety{@prelim{}@mtunsafe{@mtasurace{:servbyname} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
-@c getservbyname =~ getpwuid @mtasurace:servbyname @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock dup @asulock @aculock
-@c malloc dup @ascuheap @acsmem
-@c getservbyname_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c realloc dup @ascuheap @acsmem
-@c free dup @ascuheap @acsmem
-@c libc_lock_unlock dup @aculock
-@c
-@c getservbyname_r =~ getpwuid_r @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c nscd_getservbyname_r @ascuheap @acsfd @acsmem
-@c nscd_getserv_r @ascuheap @acsfd @acsmem
-@c nscd_get_map_ref dup @ascuheap @acsfd @acsmem
-@c strlen dup ok
-@c malloc dup @ascuheap @acsmem
-@c mempcpy dup ok
-@c memcpy dup ok
-@c nscd_cache_search dup ok
-@c nscd_open_socket dup @acsfd
-@c readvall dup ok
-@c readall dup ok
-@c close_not_cancel_no_status dup @acsfd
-@c nscd_drop_map_ref dup @ascuheap @acsmem
-@c nscd_unmap dup @ascuheap @acsmem
-@c free dup @ascuheap @acsmem
-@c nss_services_lookup2 =~ nss_passwd_lookup2 @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.l -> _nss_*_getservbyname_r @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-The @code{getservbyname} function returns information about the
-service named @var{name} using protocol @var{proto}. If it can't find
-such a service, it returns a null pointer.
-
-This function is useful for servers as well as for clients; servers
-use it to determine which port they should listen on (@pxref{Listening}).
-@end deftypefun
-
-@comment netdb.h
-@comment BSD
-@deftypefun {struct servent *} getservbyport (int @var{port}, const char *@var{proto})
-@safety{@prelim{}@mtunsafe{@mtasurace{:servbyport} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
-@c getservbyport =~ getservbyname @mtasurace:servbyport @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock dup @asulock @aculock
-@c malloc dup @ascuheap @acsmem
-@c getservbyport_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c realloc dup @ascuheap @acsmem
-@c free dup @ascuheap @acsmem
-@c libc_lock_unlock dup @aculock
-@c
-@c getservbyport_r =~ getservbyname_r @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c nscd_getservbyport_r @ascuheap @acsfd @acsmem
-@c nscd_getserv_r dup @ascuheap @acsfd @acsmem
-@c nss_services_lookup2 =~ nss_passwd_lookup2 @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.l -> _nss_*_getservbyport_r @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-The @code{getservbyport} function returns information about the
-service at port @var{port} using protocol @var{proto}. If it can't
-find such a service, it returns a null pointer.
-@end deftypefun
-
-@noindent
-You can also scan the services database using @code{setservent},
-@code{getservent} and @code{endservent}. Be careful when using these
-functions because they are not reentrant.
-
-@comment netdb.h
-@comment BSD
-@deftypefun void setservent (int @var{stayopen})
-@safety{@prelim{}@mtunsafe{@mtasurace{:servent} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
-@c setservent @mtasurace:servent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock dup @asulock @aculock
-@c nss_setent(nss_services_lookup2) @mtasurace:servenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c setup(nss_services_lookup2) @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *lookup_fct = nss_services_lookup2 dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.f @mtasurace:servent @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_unlock dup @aculock
-This function opens the services database to begin scanning it.
-
-If the @var{stayopen} argument is nonzero, this sets a flag so that
-subsequent calls to @code{getservbyname} or @code{getservbyport} 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.
-@end deftypefun
-
-@comment netdb.h
-@comment BSD
-@deftypefun {struct servent *} getservent (void)
-@safety{@prelim{}@mtunsafe{@mtasurace{:servent} @mtasurace{:serventbuf} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
-@c getservent @mtasurace:servent @mtasurace:serventbuf @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock dup @asulock @aculock
-@c nss_getent(getservent_r) @mtasurace:servent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c malloc dup @ascuheap @acsmem
-@c *func = getservent_r dup @mtasurace:servent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c realloc dup @ascuheap @acsmem
-@c free dup @ascuheap @acsmem
-@c libc_lock_unlock dup @aculock
-@c
-@c getservent_r @mtasurace:servent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock dup @asulock @aculock
-@c nss_getent_r(nss_services_lookup2) @mtasurace:servent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c setup(nss_services_lookup2) dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.f @mtasurace:servent @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *sfct.f @mtasurace:servent @ascuplugin
-@c libc_lock_unlock dup @aculock
-This function returns the next entry in the services database. If
-there are no more entries, it returns a null pointer.
-@end deftypefun
-
-@comment netdb.h
-@comment BSD
-@deftypefun void endservent (void)
-@safety{@prelim{}@mtunsafe{@mtasurace{:servent} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
-@c endservent @mtasurace:servent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock @asulock @aculock
-@c nss_endent(nss_services_lookup2) @mtasurace:servent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c setup(nss_services_lookup2) dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.f @mtasurace:servent @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_unlock @aculock
-This function closes the services database.
-@end deftypefun
-
-@node Byte Order
-@subsection Byte Order Conversion
-@cindex byte order conversion, for socket
-@cindex converting byte order
-
-@cindex big-endian
-@cindex little-endian
-Different kinds of computers use different conventions for the
-ordering of bytes within a word. Some computers put the most
-significant byte within a word first (this is called ``big-endian''
-order), and others put it last (``little-endian'' order).
-
-@cindex network byte order
-So that machines with different byte order conventions can
-communicate, the Internet protocols specify a canonical byte order
-convention for data transmitted over the network. This is known
-as @dfn{network byte order}.
-
-When establishing an Internet socket connection, you must make sure that
-the data in the @code{sin_port} and @code{sin_addr} members of the
-@code{sockaddr_in} structure are represented in network byte order.
-If you are encoding integer data in the messages sent through the
-socket, you should convert this to network byte order too. If you don't
-do this, your program may fail when running on or talking to other kinds
-of machines.
-
-If you use @code{getservbyname} and @code{gethostbyname} or
-@code{inet_addr} to get the port number and host address, the values are
-already in network byte order, and you can copy them directly into
-the @code{sockaddr_in} structure.
-
-Otherwise, you have to convert the values explicitly. Use @code{htons}
-and @code{ntohs} to convert values for the @code{sin_port} member. Use
-@code{htonl} and @code{ntohl} to convert IPv4 addresses for the
-@code{sin_addr} member. (Remember, @code{struct in_addr} is equivalent
-to @code{uint32_t}.) These functions are declared in
-@file{netinet/in.h}.
-@pindex netinet/in.h
-
-@comment netinet/in.h
-@comment BSD
-@deftypefun {uint16_t} htons (uint16_t @var{hostshort})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
-@c htons ok
-@c bswap_16 ok
-@c bswap_constant_16 ok
-
-This function converts the @code{uint16_t} integer @var{hostshort} from
-host byte order to network byte order.
-@end deftypefun
-
-@comment netinet/in.h
-@comment BSD
-@deftypefun {uint16_t} ntohs (uint16_t @var{netshort})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
-@c Alias to htons.
-This function converts the @code{uint16_t} integer @var{netshort} from
-network byte order to host byte order.
-@end deftypefun
-
-@comment netinet/in.h
-@comment BSD
-@deftypefun {uint32_t} htonl (uint32_t @var{hostlong})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
-@c htonl ok
-@c bswap_32 dup ok
-This function converts the @code{uint32_t} integer @var{hostlong} from
-host byte order to network byte order.
-
-This is used for IPv4 Internet addresses.
-@end deftypefun
-
-@comment netinet/in.h
-@comment BSD
-@deftypefun {uint32_t} ntohl (uint32_t @var{netlong})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
-@c Alias to htonl.
-This function converts the @code{uint32_t} integer @var{netlong} from
-network byte order to host byte order.
-
-This is used for IPv4 Internet addresses.
-@end deftypefun
-
-@node Protocols Database
-@subsection Protocols Database
-@cindex protocols database
-
-The communications protocol used with a socket controls low-level
-details of how data are exchanged. For example, the protocol implements
-things like checksums to detect errors in transmissions, and routing
-instructions for messages. Normal user programs have little reason to
-mess with these details directly.
-
-@cindex TCP (Internet protocol)
-The default communications protocol for the Internet namespace depends on
-the communication style. For stream communication, the default is TCP
-(``transmission control protocol''). For datagram communication, the
-default is UDP (``user datagram protocol''). For reliable datagram
-communication, the default is RDP (``reliable datagram protocol'').
-You should nearly always use the default.
-
-@pindex /etc/protocols
-Internet protocols are generally specified by a name instead of a
-number. The network protocols that a host knows about are stored in a
-database. This is usually either derived from the file
-@file{/etc/protocols}, or it may be an equivalent provided by a name
-server. You look up the protocol number associated with a named
-protocol in the database using the @code{getprotobyname} function.
-
-Here are detailed descriptions of the utilities for accessing the
-protocols database. These are declared in @file{netdb.h}.
-@pindex netdb.h
-
-@comment netdb.h
-@comment BSD
-@deftp {Data Type} {struct protoent}
-This data type is used to represent entries in the network protocols
-database. It has the following members:
-
-@table @code
-@item char *p_name
-This is the official name of the protocol.
-
-@item char **p_aliases
-These are alternate names for the protocol, specified as an array of
-strings. The last element of the array is a null pointer.
-
-@item int p_proto
-This is the protocol number (in host byte order); use this member as the
-@var{protocol} argument to @code{socket}.
-@end table
-@end deftp
-
-You can use @code{getprotobyname} and @code{getprotobynumber} to search
-the protocols database for a specific protocol. The information is
-returned in a statically-allocated structure; you must copy the
-information if you need to save it across calls.
-
-@comment netdb.h
-@comment BSD
-@deftypefun {struct protoent *} getprotobyname (const char *@var{name})
-@safety{@prelim{}@mtunsafe{@mtasurace{:protobyname} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
-@c getprotobyname =~ getpwuid @mtasurace:protobyname @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock dup @asulock @aculock
-@c malloc dup @ascuheap @acsmem
-@c getprotobyname_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c realloc dup @ascuheap @acsmem
-@c free dup @ascuheap @acsmem
-@c libc_lock_unlock dup @aculock
-@c
-@c getprotobyname_r =~ getpwuid_r @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c no nscd support
-@c nss_protocols_lookup2 =~ nss_passwd_lookup2 @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.l -> _nss_*_getprotobyname_r @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-The @code{getprotobyname} function returns information about the
-network protocol named @var{name}. If there is no such protocol, it
-returns a null pointer.
-@end deftypefun
-
-@comment netdb.h
-@comment BSD
-@deftypefun {struct protoent *} getprotobynumber (int @var{protocol})
-@safety{@prelim{}@mtunsafe{@mtasurace{:protobynumber} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
-@c getprotobynumber =~ getpwuid @mtasurace:protobynumber @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock dup @asulock @aculock
-@c malloc dup @ascuheap @acsmem
-@c getprotobynumber_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c realloc dup @ascuheap @acsmem
-@c free dup @ascuheap @acsmem
-@c libc_lock_unlock dup @aculock
-@c
-@c getprotobynumber_r =~ getpwuid_r @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c no nscd support
-@c nss_protocols_lookup2 =~ nss_passwd_lookup2 @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.l -> _nss_*_getprotobynumber_r @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-The @code{getprotobynumber} function returns information about the
-network protocol with number @var{protocol}. If there is no such
-protocol, it returns a null pointer.
-@end deftypefun
-
-You can also scan the whole protocols database one protocol at a time by
-using @code{setprotoent}, @code{getprotoent} and @code{endprotoent}.
-Be careful when using these functions because they are not reentrant.
-
-@comment netdb.h
-@comment BSD
-@deftypefun void setprotoent (int @var{stayopen})
-@safety{@prelim{}@mtunsafe{@mtasurace{:protoent} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
-@c setprotoent @mtasurace:protoent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock dup @asulock @aculock
-@c nss_setent(nss_protocols_lookup2) @mtasurace:protoent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c setup(nss_protocols_lookup2) @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *lookup_fct = nss_protocols_lookup2 dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.f @mtasurace:protoent @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_unlock dup @aculock
-This function opens the protocols database to begin scanning it.
-
-If the @var{stayopen} argument is nonzero, this sets a flag so that
-subsequent calls to @code{getprotobyname} or @code{getprotobynumber} 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.
-@end deftypefun
-
-@comment netdb.h
-@comment BSD
-@deftypefun {struct protoent *} getprotoent (void)
-@safety{@prelim{}@mtunsafe{@mtasurace{:protoent} @mtasurace{:protoentbuf} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
-@c getprotoent @mtasurace:protoent @mtasurace:protoentbuf @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock dup @asulock @aculock
-@c nss_getent(getprotoent_r) @mtasurace:protoent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c malloc dup @ascuheap @acsmem
-@c *func = getprotoent_r dup @mtasurace:protoent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c realloc dup @ascuheap @acsmem
-@c free dup @ascuheap @acsmem
-@c libc_lock_unlock dup @aculock
-@c
-@c getprotoent_r @mtasurace:protoent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock dup @asulock @aculock
-@c nss_getent_r(nss_protocols_lookup2) @mtasurace:protoent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c setup(nss_protocols_lookup2) dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.f @mtasurace:servent @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *sfct.f @mtasurace:protoent @ascuplugin
-@c libc_lock_unlock dup @aculock
-This function returns the next entry in the protocols database. It
-returns a null pointer if there are no more entries.
-@end deftypefun
-
-@comment netdb.h
-@comment BSD
-@deftypefun void endprotoent (void)
-@safety{@prelim{}@mtunsafe{@mtasurace{:protoent} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
-@c endprotoent @mtasurace:protoent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock @asulock @aculock
-@c nss_endent(nss_protocols_lookup2) @mtasurace:protoent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c setup(nss_protocols_lookup2) dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.f @mtasurace:protoent @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_unlock @aculock
-This function closes the protocols database.
-@end deftypefun
-
-@node Inet Example
-@subsection Internet Socket Example
-
-Here is an example showing how to create and name a socket in the
-Internet namespace. The newly created socket exists on the machine that
-the program is running on. Rather than finding and using the machine's
-Internet address, this example specifies @code{INADDR_ANY} as the host
-address; the system replaces that with the machine's actual address.
-
-@smallexample
-@include mkisock.c.texi
-@end smallexample
-
-Here is another example, showing how you can fill in a @code{sockaddr_in}
-structure, given a host name string and a port number:
-
-@smallexample
-@include isockad.c.texi
-@end smallexample
-
-@node Misc Namespaces
-@section Other Namespaces
-
-@vindex PF_NS
-@vindex PF_ISO
-@vindex PF_CCITT
-@vindex PF_IMPLINK
-@vindex PF_ROUTE
-Certain other namespaces and associated protocol families are supported
-but not documented yet because they are not often used. @code{PF_NS}
-refers to the Xerox Network Software protocols. @code{PF_ISO} stands
-for Open Systems Interconnect. @code{PF_CCITT} refers to protocols from
-CCITT. @file{socket.h} defines these symbols and others naming protocols
-not actually implemented.
-
-@code{PF_IMPLINK} is used for communicating between hosts and Internet
-Message Processors. For information on this and @code{PF_ROUTE}, an
-occasionally-used local area routing protocol, see the GNU Hurd Manual
-(to appear in the future).
-
-@node Open/Close Sockets
-@section Opening and Closing Sockets
-
-This section describes the actual library functions for opening and
-closing sockets. The same functions work for all namespaces and
-connection styles.
-
-@menu
-* Creating a Socket:: How to open a socket.
-* Closing a Socket:: How to close a socket.
-* Socket Pairs:: These are created like pipes.
-@end menu
-
-@node Creating a Socket
-@subsection Creating a Socket
-@cindex creating a socket
-@cindex socket, creating
-@cindex opening a socket
-
-The primitive for creating a socket is the @code{socket} function,
-declared in @file{sys/socket.h}.
-@pindex sys/socket.h
-
-@comment sys/socket.h
-@comment BSD
-@deftypefun int socket (int @var{namespace}, int @var{style}, int @var{protocol})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}}
-This function creates a socket and specifies communication style
-@var{style}, which should be one of the socket styles listed in
-@ref{Communication Styles}. The @var{namespace} argument specifies
-the namespace; it must be @code{PF_LOCAL} (@pxref{Local Namespace}) or
-@code{PF_INET} (@pxref{Internet Namespace}). @var{protocol}
-designates the specific protocol (@pxref{Socket Concepts}); zero is
-usually right for @var{protocol}.
-
-The return value from @code{socket} is the file descriptor for the new
-socket, or @code{-1} in case of error. The following @code{errno} error
-conditions are defined for this function:
-
-@table @code
-@item EPROTONOSUPPORT
-The @var{protocol} or @var{style} is not supported by the
-@var{namespace} specified.
-
-@item EMFILE
-The process already has too many file descriptors open.
-
-@item ENFILE
-The system already has too many file descriptors open.
-
-@item EACCES
-The process does not have the privilege to create a socket of the specified
-@var{style} or @var{protocol}.
-
-@item ENOBUFS
-The system ran out of internal buffer space.
-@end table
-
-The file descriptor returned by the @code{socket} function supports both
-read and write operations. However, like pipes, sockets do not support file
-positioning operations.
-@end deftypefun
-
-For examples of how to call the @code{socket} function,
-see @ref{Local Socket Example}, or @ref{Inet Example}.
-
-
-@node Closing a Socket
-@subsection Closing a Socket
-@cindex socket, closing
-@cindex closing a socket
-@cindex shutting down a socket
-@cindex socket shutdown
-
-When you have finished using a socket, you can simply close its
-file descriptor with @code{close}; see @ref{Opening and Closing Files}.
-If there is still data waiting to be transmitted over the connection,
-normally @code{close} tries to complete this transmission. You
-can control this behavior using the @code{SO_LINGER} socket option to
-specify a timeout period; see @ref{Socket Options}.
-
-@pindex sys/socket.h
-You can also shut down only reception or transmission on a
-connection by calling @code{shutdown}, which is declared in
-@file{sys/socket.h}.
-
-@comment sys/socket.h
-@comment BSD
-@deftypefun int shutdown (int @var{socket}, int @var{how})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
-The @code{shutdown} function shuts down the connection of socket
-@var{socket}. The argument @var{how} specifies what action to
-perform:
-
-@table @code
-@item 0
-Stop receiving data for this socket. If further data arrives,
-reject it.
-
-@item 1
-Stop trying to transmit data from this socket. Discard any data
-waiting to be sent. Stop looking for acknowledgement of data already
-sent; don't retransmit it if it is lost.
-
-@item 2
-Stop both reception and transmission.
-@end table
-
-The return value is @code{0} on success and @code{-1} on failure. The
-following @code{errno} error conditions are defined for this function:
-
-@table @code
-@item EBADF
-@var{socket} is not a valid file descriptor.
-
-@item ENOTSOCK
-@var{socket} is not a socket.
-
-@item ENOTCONN
-@var{socket} is not connected.
-@end table
-@end deftypefun
-
-@node Socket Pairs
-@subsection Socket Pairs
-@cindex creating a socket pair
-@cindex socket pair
-@cindex opening a socket pair
-
-@pindex sys/socket.h
-A @dfn{socket pair} consists of a pair of connected (but unnamed)
-sockets. It is very similar to a pipe and is used in much the same
-way. Socket pairs are created with the @code{socketpair} function,
-declared in @file{sys/socket.h}. A socket pair is much like a pipe; the
-main difference is that the socket pair is bidirectional, whereas the
-pipe has one input-only end and one output-only end (@pxref{Pipes and
-FIFOs}).
-
-@comment sys/socket.h
-@comment BSD
-@deftypefun int socketpair (int @var{namespace}, int @var{style}, int @var{protocol}, int @var{filedes}@t{[2]})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}}
-This function creates a socket pair, returning the file descriptors in
-@code{@var{filedes}[0]} and @code{@var{filedes}[1]}. The socket pair
-is a full-duplex communications channel, so that both reading and writing
-may be performed at either end.
-
-The @var{namespace}, @var{style} and @var{protocol} arguments are
-interpreted as for the @code{socket} function. @var{style} should be
-one of the communication styles listed in @ref{Communication Styles}.
-The @var{namespace} argument specifies the namespace, which must be
-@code{AF_LOCAL} (@pxref{Local Namespace}); @var{protocol} specifies the
-communications protocol, but zero is the only meaningful value.
-
-If @var{style} specifies a connectionless communication style, then
-the two sockets you get are not @emph{connected}, strictly speaking,
-but each of them knows the other as the default destination address,
-so they can send packets to each other.
-
-The @code{socketpair} function returns @code{0} on success and @code{-1}
-on failure. The following @code{errno} error conditions are defined
-for this function:
-
-@table @code
-@item EMFILE
-The process has too many file descriptors open.
-
-@item EAFNOSUPPORT
-The specified namespace is not supported.
-
-@item EPROTONOSUPPORT
-The specified protocol is not supported.
-
-@item EOPNOTSUPP
-The specified protocol does not support the creation of socket pairs.
-@end table
-@end deftypefun
-
-@node Connections
-@section Using Sockets with Connections
-
-@cindex connection
-@cindex client
-@cindex server
-The most common communication styles involve making a connection to a
-particular other socket, and then exchanging data with that socket
-over and over. Making a connection is asymmetric; one side (the
-@dfn{client}) acts to request a connection, while the other side (the
-@dfn{server}) makes a socket and waits for the connection request.
-
-@iftex
-@itemize @bullet
-@item
-@ref{Connecting}, describes what the client program must do to
-initiate a connection with a server.
-
-@item
-@ref{Listening} and @ref{Accepting Connections} describe what the
-server program must do to wait for and act upon connection requests
-from clients.
-
-@item
-@ref{Transferring Data}, describes how data are transferred through the
-connected socket.
-@end itemize
-@end iftex
-
-@menu
-* Connecting:: What the client program must do.
-* Listening:: How a server program waits for requests.
-* Accepting Connections:: What the server does when it gets a request.
-* Who is Connected:: Getting the address of the
- other side of a connection.
-* Transferring Data:: How to send and receive data.
-* Byte Stream Example:: An example program: a client for communicating
- over a byte stream socket in the Internet namespace.
-* Server Example:: A corresponding server program.
-* Out-of-Band Data:: This is an advanced feature.
-@end menu
-
-@node Connecting
-@subsection Making a Connection
-@cindex connecting a socket
-@cindex socket, connecting
-@cindex socket, initiating a connection
-@cindex socket, client actions
-
-In making a connection, the client makes a connection while the server
-waits for and accepts the connection. Here we discuss what the client
-program must do with the @code{connect} function, which is declared in
-@file{sys/socket.h}.
-
-@comment sys/socket.h
-@comment BSD
-@deftypefun int connect (int @var{socket}, struct sockaddr *@var{addr}, socklen_t @var{length})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
-The @code{connect} function initiates a connection from the socket
-with file descriptor @var{socket} to the socket whose address is
-specified by the @var{addr} and @var{length} arguments. (This socket
-is typically on another machine, and it must be already set up as a
-server.) @xref{Socket Addresses}, for information about how these
-arguments are interpreted.
-
-Normally, @code{connect} waits until the server responds to the request
-before it returns. You can set nonblocking mode on the socket
-@var{socket} to make @code{connect} return immediately without waiting
-for the response. @xref{File Status Flags}, for information about
-nonblocking mode.
-@c !!! how do you tell when it has finished connecting? I suspect the
-@c way you do it is select for writing.
-
-The normal return value from @code{connect} is @code{0}. If an error
-occurs, @code{connect} returns @code{-1}. The following @code{errno}
-error conditions are defined for this function:
-
-@table @code
-@item EBADF
-The socket @var{socket} is not a valid file descriptor.
-
-@item ENOTSOCK
-File descriptor @var{socket} is not a socket.
-
-@item EADDRNOTAVAIL
-The specified address is not available on the remote machine.
-
-@item EAFNOSUPPORT
-The namespace of the @var{addr} is not supported by this socket.
-
-@item EISCONN
-The socket @var{socket} is already connected.
-
-@item ETIMEDOUT
-The attempt to establish the connection timed out.
-
-@item ECONNREFUSED
-The server has actively refused to establish the connection.
-
-@item ENETUNREACH
-The network of the given @var{addr} isn't reachable from this host.
-
-@item EADDRINUSE
-The socket address of the given @var{addr} is already in use.
-
-@item EINPROGRESS
-The socket @var{socket} is non-blocking and the connection could not be
-established immediately. You can determine when the connection is
-completely established with @code{select}; @pxref{Waiting for I/O}.
-Another @code{connect} call on the same socket, before the connection is
-completely established, will fail with @code{EALREADY}.
-
-@item EALREADY
-The socket @var{socket} is non-blocking and already has a pending
-connection in progress (see @code{EINPROGRESS} above).
-@end table
-
-This function is defined as a cancellation point in multi-threaded
-programs, so one has to be prepared for this and make sure that
-allocated resources (like memory, file descriptors, semaphores or
-whatever) are freed even if the thread is canceled.
-@c @xref{pthread_cleanup_push}, for a method how to do this.
-@end deftypefun
-
-@node Listening
-@subsection Listening for Connections
-@cindex listening (sockets)
-@cindex sockets, server actions
-@cindex sockets, listening
-
-Now let us consider what the server process must do to accept
-connections on a socket. First it must use the @code{listen} function
-to enable connection requests on the socket, and then accept each
-incoming connection with a call to @code{accept} (@pxref{Accepting
-Connections}). Once connection requests are enabled on a server socket,
-the @code{select} function reports when the socket has a connection
-ready to be accepted (@pxref{Waiting for I/O}).
-
-The @code{listen} function is not allowed for sockets using
-connectionless communication styles.
-
-You can write a network server that does not even start running until a
-connection to it is requested. @xref{Inetd Servers}.
-
-In the Internet namespace, there are no special protection mechanisms
-for controlling access to a port; any process on any machine
-can make a connection to your server. If you want to restrict access to
-your server, make it examine the addresses associated with connection
-requests or implement some other handshaking or identification
-protocol.
-
-In the local namespace, the ordinary file protection bits control who has
-access to connect to the socket.
-
-@comment sys/socket.h
-@comment BSD
-@deftypefun int listen (int @var{socket}, int @var{n})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}}
-The @code{listen} function enables the socket @var{socket} to accept
-connections, thus making it a server socket.
-
-The argument @var{n} specifies the length of the queue for pending
-connections. When the queue fills, new clients attempting to connect
-fail with @code{ECONNREFUSED} until the server calls @code{accept} to
-accept a connection from the queue.
-
-The @code{listen} function returns @code{0} on success and @code{-1}
-on failure. The following @code{errno} error conditions are defined
-for this function:
-
-@table @code
-@item EBADF
-The argument @var{socket} is not a valid file descriptor.
-
-@item ENOTSOCK
-The argument @var{socket} is not a socket.
-
-@item EOPNOTSUPP
-The socket @var{socket} does not support this operation.
-@end table
-@end deftypefun
-
-@node Accepting Connections
-@subsection Accepting Connections
-@cindex sockets, accepting connections
-@cindex accepting connections
-
-When a server receives a connection request, it can complete the
-connection by accepting the request. Use the function @code{accept}
-to do this.
-
-A socket that has been established as a server can accept connection
-requests from multiple clients. The server's original socket
-@emph{does not become part of the connection}; instead, @code{accept}
-makes a new socket which participates in the connection.
-@code{accept} returns the descriptor for this socket. The server's
-original socket remains available for listening for further connection
-requests.
-
-The number of pending connection requests on a server socket is finite.
-If connection requests arrive from clients faster than the server can
-act upon them, the queue can fill up and additional requests are refused
-with an @code{ECONNREFUSED} error. You can specify the maximum length of
-this queue as an argument to the @code{listen} function, although the
-system may also impose its own internal limit on the length of this
-queue.
-
-@comment sys/socket.h
-@comment BSD
-@deftypefun int accept (int @var{socket}, struct sockaddr *@var{addr}, socklen_t *@var{length_ptr})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}}
-This function is used to accept a connection request on the server
-socket @var{socket}.
-
-The @code{accept} function waits if there are no connections pending,
-unless the socket @var{socket} has nonblocking mode set. (You can use
-@code{select} to wait for a pending connection, with a nonblocking
-socket.) @xref{File Status Flags}, for information about nonblocking
-mode.
-
-The @var{addr} and @var{length-ptr} arguments are used to return
-information about the name of the client socket that initiated the
-connection. @xref{Socket Addresses}, for information about the format
-of the information.
-
-Accepting a connection does not make @var{socket} part of the
-connection. Instead, it creates a new socket which becomes
-connected. The normal return value of @code{accept} is the file
-descriptor for the new socket.
-
-After @code{accept}, the original socket @var{socket} remains open and
-unconnected, and continues listening until you close it. You can
-accept further connections with @var{socket} by calling @code{accept}
-again.
-
-If an error occurs, @code{accept} returns @code{-1}. The following
-@code{errno} error conditions are defined for this function:
-
-@table @code
-@item EBADF
-The @var{socket} argument is not a valid file descriptor.
-
-@item ENOTSOCK
-The descriptor @var{socket} argument is not a socket.
-
-@item EOPNOTSUPP
-The descriptor @var{socket} does not support this operation.
-
-@item EWOULDBLOCK
-@var{socket} has nonblocking mode set, and there are no pending
-connections immediately available.
-@end table
-
-This function is defined as a cancellation point in multi-threaded
-programs, so one has to be prepared for this and make sure that
-allocated resources (like memory, file descriptors, semaphores or
-whatever) are freed even if the thread is canceled.
-@c @xref{pthread_cleanup_push}, for a method how to do this.
-@end deftypefun
-
-The @code{accept} function is not allowed for sockets using
-connectionless communication styles.
-
-@node Who is Connected
-@subsection Who is Connected to Me?
-
-@comment sys/socket.h
-@comment BSD
-@deftypefun int getpeername (int @var{socket}, struct sockaddr *@var{addr}, socklen_t *@var{length-ptr})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
-The @code{getpeername} function returns the address of the socket that
-@var{socket} is connected to; it stores the address in the memory space
-specified by @var{addr} and @var{length-ptr}. It stores the length of
-the address in @code{*@var{length-ptr}}.
-
-@xref{Socket Addresses}, for information about the format of the
-address. In some operating systems, @code{getpeername} works only for
-sockets in the Internet domain.
-
-The return value is @code{0} on success and @code{-1} on error. The
-following @code{errno} error conditions are defined for this function:
-
-@table @code
-@item EBADF
-The argument @var{socket} is not a valid file descriptor.
-
-@item ENOTSOCK
-The descriptor @var{socket} is not a socket.
-
-@item ENOTCONN
-The socket @var{socket} is not connected.
-
-@item ENOBUFS
-There are not enough internal buffers available.
-@end table
-@end deftypefun
-
-
-@node Transferring Data
-@subsection Transferring Data
-@cindex reading from a socket
-@cindex writing to a socket
-
-Once a socket has been connected to a peer, you can use the ordinary
-@code{read} and @code{write} operations (@pxref{I/O Primitives}) to
-transfer data. A socket is a two-way communications channel, so read
-and write operations can be performed at either end.
-
-There are also some I/O modes that are specific to socket operations.
-In order to specify these modes, you must use the @code{recv} and
-@code{send} functions instead of the more generic @code{read} and
-@code{write} functions. The @code{recv} and @code{send} functions take
-an additional argument which you can use to specify various flags to
-control special I/O modes. For example, you can specify the
-@code{MSG_OOB} flag to read or write out-of-band data, the
-@code{MSG_PEEK} flag to peek at input, or the @code{MSG_DONTROUTE} flag
-to control inclusion of routing information on output.
-
-@menu
-* Sending Data:: Sending data with @code{send}.
-* Receiving Data:: Reading data with @code{recv}.
-* Socket Data Options:: Using @code{send} and @code{recv}.
-@end menu
-
-@node Sending Data
-@subsubsection Sending Data
-
-@pindex sys/socket.h
-The @code{send} function is declared in the header file
-@file{sys/socket.h}. If your @var{flags} argument is zero, you can just
-as well use @code{write} instead of @code{send}; see @ref{I/O
-Primitives}. If the socket was connected but the connection has broken,
-you get a @code{SIGPIPE} signal for any use of @code{send} or
-@code{write} (@pxref{Miscellaneous Signals}).
-
-@comment sys/socket.h
-@comment BSD
-@deftypefun ssize_t send (int @var{socket}, const void *@var{buffer}, size_t @var{size}, int @var{flags})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
-The @code{send} function is like @code{write}, but with the additional
-flags @var{flags}. The possible values of @var{flags} are described
-in @ref{Socket Data Options}.
-
-This function returns the number of bytes transmitted, or @code{-1} on
-failure. If the socket is nonblocking, then @code{send} (like
-@code{write}) can return after sending just part of the data.
-@xref{File Status Flags}, for information about nonblocking mode.
-
-Note, however, that a successful return value merely indicates that
-the message has been sent without error, not necessarily that it has
-been received without error.
-
-The following @code{errno} error conditions are defined for this function:
-
-@table @code
-@item EBADF
-The @var{socket} argument is not a valid file descriptor.
-
-@item EINTR
-The operation was interrupted by a signal before any data was sent.
-@xref{Interrupted Primitives}.
-
-@item ENOTSOCK
-The descriptor @var{socket} is not a socket.
-
-@item EMSGSIZE
-The socket type requires that the message be sent atomically, but the
-message is too large for this to be possible.
-
-@item EWOULDBLOCK
-Nonblocking mode has been set on the socket, and the write operation
-would block. (Normally @code{send} blocks until the operation can be
-completed.)
-
-@item ENOBUFS
-There is not enough internal buffer space available.
-
-@item ENOTCONN
-You never connected this socket.
-
-@item EPIPE
-This socket was connected but the connection is now broken. In this
-case, @code{send} generates a @code{SIGPIPE} signal first; if that
-signal is ignored or blocked, or if its handler returns, then
-@code{send} fails with @code{EPIPE}.
-@end table
-
-This function is defined as a cancellation point in multi-threaded
-programs, so one has to be prepared for this and make sure that
-allocated resources (like memory, file descriptors, semaphores or
-whatever) are freed even if the thread is canceled.
-@c @xref{pthread_cleanup_push}, for a method how to do this.
-@end deftypefun
-
-@node Receiving Data
-@subsubsection Receiving Data
-
-@pindex sys/socket.h
-The @code{recv} function is declared in the header file
-@file{sys/socket.h}. If your @var{flags} argument is zero, you can
-just as well use @code{read} instead of @code{recv}; see @ref{I/O
-Primitives}.
-
-@comment sys/socket.h
-@comment BSD
-@deftypefun ssize_t recv (int @var{socket}, void *@var{buffer}, size_t @var{size}, int @var{flags})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
-The @code{recv} function is like @code{read}, but with the additional
-flags @var{flags}. The possible values of @var{flags} are described
-in @ref{Socket Data Options}.
-
-If nonblocking mode is set for @var{socket}, and no data are available to
-be read, @code{recv} fails immediately rather than waiting. @xref{File
-Status Flags}, for information about nonblocking mode.
-
-This function returns the number of bytes received, or @code{-1} on failure.
-The following @code{errno} error conditions are defined for this function:
-
-@table @code
-@item EBADF
-The @var{socket} argument is not a valid file descriptor.
-
-@item ENOTSOCK
-The descriptor @var{socket} is not a socket.
-
-@item EWOULDBLOCK
-Nonblocking mode has been set on the socket, and the read operation
-would block. (Normally, @code{recv} blocks until there is input
-available to be read.)
-
-@item EINTR
-The operation was interrupted by a signal before any data was read.
-@xref{Interrupted Primitives}.
-
-@item ENOTCONN
-You never connected this socket.
-@end table
-
-This function is defined as a cancellation point in multi-threaded
-programs, so one has to be prepared for this and make sure that
-allocated resources (like memory, file descriptors, semaphores or
-whatever) are freed even if the thread is canceled.
-@c @xref{pthread_cleanup_push}, for a method how to do this.
-@end deftypefun
-
-@node Socket Data Options
-@subsubsection Socket Data Options
-
-@pindex sys/socket.h
-The @var{flags} argument to @code{send} and @code{recv} is a bit
-mask. You can bitwise-OR the values of the following macros together
-to obtain a value for this argument. All are defined in the header
-file @file{sys/socket.h}.
-
-@comment sys/socket.h
-@comment BSD
-@deftypevr Macro int MSG_OOB
-Send or receive out-of-band data. @xref{Out-of-Band Data}.
-@end deftypevr
-
-@comment sys/socket.h
-@comment BSD
-@deftypevr Macro int MSG_PEEK
-Look at the data but don't remove it from the input queue. This is
-only meaningful with input functions such as @code{recv}, not with
-@code{send}.
-@end deftypevr
-
-@comment sys/socket.h
-@comment BSD
-@deftypevr Macro int MSG_DONTROUTE
-Don't include routing information in the message. This is only
-meaningful with output operations, and is usually only of interest for
-diagnostic or routing programs. We don't try to explain it here.
-@end deftypevr
-
-@node Byte Stream Example
-@subsection Byte Stream Socket Example
-
-Here is an example client program that makes a connection for a byte
-stream socket in the Internet namespace. It doesn't do anything
-particularly interesting once it has connected to the server; it just
-sends a text string to the server and exits.
-
-This program uses @code{init_sockaddr} to set up the socket address; see
-@ref{Inet Example}.
-
-@smallexample
-@include inetcli.c.texi
-@end smallexample
-
-@node Server Example
-@subsection Byte Stream Connection Server Example
-
-The server end is much more complicated. Since we want to allow
-multiple clients to be connected to the server at the same time, it
-would be incorrect to wait for input from a single client by simply
-calling @code{read} or @code{recv}. Instead, the right thing to do is
-to use @code{select} (@pxref{Waiting for I/O}) to wait for input on
-all of the open sockets. This also allows the server to deal with
-additional connection requests.
-
-This particular server doesn't do anything interesting once it has
-gotten a message from a client. It does close the socket for that
-client when it detects an end-of-file condition (resulting from the
-client shutting down its end of the connection).
-
-This program uses @code{make_socket} to set up the socket address; see
-@ref{Inet Example}.
-
-@smallexample
-@include inetsrv.c.texi
-@end smallexample
-
-@node Out-of-Band Data
-@subsection Out-of-Band Data
-
-@cindex out-of-band data
-@cindex high-priority data
-Streams with connections permit @dfn{out-of-band} data that is
-delivered with higher priority than ordinary data. Typically the
-reason for sending out-of-band data is to send notice of an
-exceptional condition. To send out-of-band data use
-@code{send}, specifying the flag @code{MSG_OOB} (@pxref{Sending
-Data}).
-
-Out-of-band data are received with higher priority because the
-receiving process need not read it in sequence; to read the next
-available out-of-band data, use @code{recv} with the @code{MSG_OOB}
-flag (@pxref{Receiving Data}). Ordinary read operations do not read
-out-of-band data; they read only ordinary data.
-
-@cindex urgent socket condition
-When a socket finds that out-of-band data are on their way, it sends a
-@code{SIGURG} signal to the owner process or process group of the
-socket. You can specify the owner using the @code{F_SETOWN} command
-to the @code{fcntl} function; see @ref{Interrupt Input}. You must
-also establish a handler for this signal, as described in @ref{Signal
-Handling}, in order to take appropriate action such as reading the
-out-of-band data.
-
-Alternatively, you can test for pending out-of-band data, or wait
-until there is out-of-band data, using the @code{select} function; it
-can wait for an exceptional condition on the socket. @xref{Waiting
-for I/O}, for more information about @code{select}.
-
-Notification of out-of-band data (whether with @code{SIGURG} or with
-@code{select}) indicates that out-of-band data are on the way; the data
-may not actually arrive until later. If you try to read the
-out-of-band data before it arrives, @code{recv} fails with an
-@code{EWOULDBLOCK} error.
-
-Sending out-of-band data automatically places a ``mark'' in the stream
-of ordinary data, showing where in the sequence the out-of-band data
-``would have been''. This is useful when the meaning of out-of-band
-data is ``cancel everything sent so far''. Here is how you can test,
-in the receiving process, whether any ordinary data was sent before
-the mark:
-
-@smallexample
-success = ioctl (socket, SIOCATMARK, &atmark);
-@end smallexample
-
-The @code{integer} variable @var{atmark} is set to a nonzero value if
-the socket's read pointer has reached the ``mark''.
-
-@c Posix 1.g specifies sockatmark for this ioctl. sockatmark is not
-@c implemented yet.
-
-Here's a function to discard any ordinary data preceding the
-out-of-band mark:
-
-@smallexample
-int
-discard_until_mark (int socket)
-@{
- while (1)
- @{
- /* @r{This is not an arbitrary limit; any size will do.} */
- char buffer[1024];
- int atmark, success;
-
- /* @r{If we have reached the mark, return.} */
- success = ioctl (socket, SIOCATMARK, &atmark);
- if (success < 0)
- perror ("ioctl");
- if (result)
- return;
-
- /* @r{Otherwise, read a bunch of ordinary data and discard it.}
- @r{This is guaranteed not to read past the mark}
- @r{if it starts before the mark.} */
- success = read (socket, buffer, sizeof buffer);
- if (success < 0)
- perror ("read");
- @}
-@}
-@end smallexample
-
-If you don't want to discard the ordinary data preceding the mark, you
-may need to read some of it anyway, to make room in internal system
-buffers for the out-of-band data. If you try to read out-of-band data
-and get an @code{EWOULDBLOCK} error, try reading some ordinary data
-(saving it so that you can use it when you want it) and see if that
-makes room. Here is an example:
-
-@smallexample
-struct buffer
-@{
- char *buf;
- int size;
- struct buffer *next;
-@};
-
-/* @r{Read the out-of-band data from SOCKET and return it}
- @r{as a `struct buffer', which records the address of the data}
- @r{and its size.}
-
- @r{It may be necessary to read some ordinary data}
- @r{in order to make room for the out-of-band data.}
- @r{If so, the ordinary data are saved as a chain of buffers}
- @r{found in the `next' field of the value.} */
-
-struct buffer *
-read_oob (int socket)
-@{
- struct buffer *tail = 0;
- struct buffer *list = 0;
-
- while (1)
- @{
- /* @r{This is an arbitrary limit.}
- @r{Does anyone know how to do this without a limit?} */
-#define BUF_SZ 1024
- char *buf = (char *) xmalloc (BUF_SZ);
- int success;
- int atmark;
-
- /* @r{Try again to read the out-of-band data.} */
- success = recv (socket, buf, BUF_SZ, MSG_OOB);
- if (success >= 0)
- @{
- /* @r{We got it, so return it.} */
- struct buffer *link
- = (struct buffer *) xmalloc (sizeof (struct buffer));
- link->buf = buf;
- link->size = success;
- link->next = list;
- return link;
- @}
-
- /* @r{If we fail, see if we are at the mark.} */
- success = ioctl (socket, SIOCATMARK, &atmark);
- if (success < 0)
- perror ("ioctl");
- if (atmark)
- @{
- /* @r{At the mark; skipping past more ordinary data cannot help.}
- @r{So just wait a while.} */
- sleep (1);
- continue;
- @}
-
- /* @r{Otherwise, read a bunch of ordinary data and save it.}
- @r{This is guaranteed not to read past the mark}
- @r{if it starts before the mark.} */
- success = read (socket, buf, BUF_SZ);
- if (success < 0)
- perror ("read");
-
- /* @r{Save this data in the buffer list.} */
- @{
- struct buffer *link
- = (struct buffer *) xmalloc (sizeof (struct buffer));
- link->buf = buf;
- link->size = success;
-
- /* @r{Add the new link to the end of the list.} */
- if (tail)
- tail->next = link;
- else
- list = link;
- tail = link;
- @}
- @}
-@}
-@end smallexample
-
-@node Datagrams
-@section Datagram Socket Operations
-
-@cindex datagram socket
-This section describes how to use communication styles that don't use
-connections (styles @code{SOCK_DGRAM} and @code{SOCK_RDM}). Using
-these styles, you group data into packets and each packet is an
-independent communication. You specify the destination for each
-packet individually.
-
-Datagram packets are like letters: you send each one independently
-with its own destination address, and they may arrive in the wrong
-order or not at all.
-
-The @code{listen} and @code{accept} functions are not allowed for
-sockets using connectionless communication styles.
-
-@menu
-* Sending Datagrams:: Sending packets on a datagram socket.
-* Receiving Datagrams:: Receiving packets on a datagram socket.
-* Datagram Example:: An example program: packets sent over a
- datagram socket in the local namespace.
-* Example Receiver:: Another program, that receives those packets.
-@end menu
-
-@node Sending Datagrams
-@subsection Sending Datagrams
-@cindex sending a datagram
-@cindex transmitting datagrams
-@cindex datagrams, transmitting
-
-@pindex sys/socket.h
-The normal way of sending data on a datagram socket is by using the
-@code{sendto} function, declared in @file{sys/socket.h}.
-
-You can call @code{connect} on a datagram socket, but this only
-specifies a default destination for further data transmission on the
-socket. When a socket has a default destination you can use
-@code{send} (@pxref{Sending Data}) or even @code{write} (@pxref{I/O
-Primitives}) to send a packet there. You can cancel the default
-destination by calling @code{connect} using an address format of
-@code{AF_UNSPEC} in the @var{addr} argument. @xref{Connecting}, for
-more information about the @code{connect} function.
-
-@comment sys/socket.h
-@comment BSD
-@deftypefun ssize_t sendto (int @var{socket}, const void *@var{buffer}, size_t @var{size}, int @var{flags}, struct sockaddr *@var{addr}, socklen_t @var{length})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
-The @code{sendto} function transmits the data in the @var{buffer}
-through the socket @var{socket} to the destination address specified
-by the @var{addr} and @var{length} arguments. The @var{size} argument
-specifies the number of bytes to be transmitted.
-
-The @var{flags} are interpreted the same way as for @code{send}; see
-@ref{Socket Data Options}.
-
-The return value and error conditions are also the same as for
-@code{send}, but you cannot rely on the system to detect errors and
-report them; the most common error is that the packet is lost or there
-is no-one at the specified address to receive it, and the operating
-system on your machine usually does not know this.
-
-It is also possible for one call to @code{sendto} to report an error
-owing to a problem related to a previous call.
-
-This function is defined as a cancellation point in multi-threaded
-programs, so one has to be prepared for this and make sure that
-allocated resources (like memory, file descriptors, semaphores or
-whatever) are freed even if the thread is canceled.
-@c @xref{pthread_cleanup_push}, for a method how to do this.
-@end deftypefun
-
-@node Receiving Datagrams
-@subsection Receiving Datagrams
-@cindex receiving datagrams
-
-The @code{recvfrom} function reads a packet from a datagram socket and
-also tells you where it was sent from. This function is declared in
-@file{sys/socket.h}.
-
-@comment sys/socket.h
-@comment BSD
-@deftypefun ssize_t recvfrom (int @var{socket}, void *@var{buffer}, size_t @var{size}, int @var{flags}, struct sockaddr *@var{addr}, socklen_t *@var{length-ptr})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
-The @code{recvfrom} function reads one packet from the socket
-@var{socket} into the buffer @var{buffer}. The @var{size} argument
-specifies the maximum number of bytes to be read.
-
-If the packet is longer than @var{size} bytes, then you get the first
-@var{size} bytes of the packet and the rest of the packet is lost.
-There's no way to read the rest of the packet. Thus, when you use a
-packet protocol, you must always know how long a packet to expect.
-
-The @var{addr} and @var{length-ptr} arguments are used to return the
-address where the packet came from. @xref{Socket Addresses}. For a
-socket in the local domain the address information won't be meaningful,
-since you can't read the address of such a socket (@pxref{Local
-Namespace}). You can specify a null pointer as the @var{addr} argument
-if you are not interested in this information.
-
-The @var{flags} are interpreted the same way as for @code{recv}
-(@pxref{Socket Data Options}). The return value and error conditions
-are also the same as for @code{recv}.
-
-This function is defined as a cancellation point in multi-threaded
-programs, so one has to be prepared for this and make sure that
-allocated resources (like memory, file descriptors, semaphores or
-whatever) are freed even if the thread is canceled.
-@c @xref{pthread_cleanup_push}, for a method how to do this.
-@end deftypefun
-
-You can use plain @code{recv} (@pxref{Receiving Data}) instead of
-@code{recvfrom} if you don't need to find out who sent the packet
-(either because you know where it should come from or because you
-treat all possible senders alike). Even @code{read} can be used if
-you don't want to specify @var{flags} (@pxref{I/O Primitives}).
-
-@ignore
-@c sendmsg and recvmsg are like readv and writev in that they
-@c use a series of buffers. It's not clear this is worth
-@c supporting or that we support them.
-@c !!! they can do more; it is hairy
-
-@comment sys/socket.h
-@comment BSD
-@deftp {Data Type} {struct msghdr}
-@end deftp
-
-@comment sys/socket.h
-@comment BSD
-@deftypefun ssize_t sendmsg (int @var{socket}, const struct msghdr *@var{message}, int @var{flags})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
-
-This function is defined as a cancellation point in multi-threaded
-programs, so one has to be prepared for this and make sure that
-allocated resources (like memory, files descriptors, semaphores or
-whatever) are freed even if the thread is cancel.
-@c @xref{pthread_cleanup_push}, for a method how to do this.
-@end deftypefun
-
-@comment sys/socket.h
-@comment BSD
-@deftypefun ssize_t recvmsg (int @var{socket}, struct msghdr *@var{message}, int @var{flags})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
-
-This function is defined as a cancellation point in multi-threaded
-programs, so one has to be prepared for this and make sure that
-allocated resources (like memory, files descriptors, semaphores or
-whatever) are freed even if the thread is canceled.
-@c @xref{pthread_cleanup_push}, for a method how to do this.
-@end deftypefun
-@end ignore
-
-@node Datagram Example
-@subsection Datagram Socket Example
-
-Here is a set of example programs that send messages over a datagram
-stream in the local namespace. Both the client and server programs use
-the @code{make_named_socket} function that was presented in @ref{Local
-Socket Example}, to create and name their sockets.
-
-First, here is the server program. It sits in a loop waiting for
-messages to arrive, bouncing each message back to the sender.
-Obviously this isn't a particularly useful program, but it does show
-the general ideas involved.
-
-@smallexample
-@include filesrv.c.texi
-@end smallexample
-
-@node Example Receiver
-@subsection Example of Reading Datagrams
-
-Here is the client program corresponding to the server above.
-
-It sends a datagram to the server and then waits for a reply. Notice
-that the socket for the client (as well as for the server) in this
-example has to be given a name. This is so that the server can direct
-a message back to the client. Since the socket has no associated
-connection state, the only way the server can do this is by
-referencing the name of the client.
-
-@smallexample
-@include filecli.c.texi
-@end smallexample
-
-Keep in mind that datagram socket communications are unreliable. In
-this example, the client program waits indefinitely if the message
-never reaches the server or if the server's response never comes
-back. It's up to the user running the program to kill and restart
-it if desired. A more automatic solution could be to use
-@code{select} (@pxref{Waiting for I/O}) to establish a timeout period
-for the reply, and in case of timeout either re-send the message or
-shut down the socket and exit.
-
-@node Inetd
-@section The @code{inetd} Daemon
-
-We've explained above how to write a server program that does its own
-listening. Such a server must already be running in order for anyone
-to connect to it.
-
-Another way to provide a service on an Internet port is to let the daemon
-program @code{inetd} do the listening. @code{inetd} is a program that
-runs all the time and waits (using @code{select}) for messages on a
-specified set of ports. When it receives a message, it accepts the
-connection (if the socket style calls for connections) and then forks a
-child process to run the corresponding server program. You specify the
-ports and their programs in the file @file{/etc/inetd.conf}.
-
-@menu
-* Inetd Servers::
-* Configuring Inetd::
-@end menu
-
-@node Inetd Servers
-@subsection @code{inetd} Servers
-
-Writing a server program to be run by @code{inetd} is very simple. Each time
-someone requests a connection to the appropriate port, a new server
-process starts. The connection already exists at this time; the
-socket is available as the standard input descriptor and as the
-standard output descriptor (descriptors 0 and 1) in the server
-process. Thus the server program can begin reading and writing data
-right away. Often the program needs only the ordinary I/O facilities;
-in fact, a general-purpose filter program that knows nothing about
-sockets can work as a byte stream server run by @code{inetd}.
-
-You can also use @code{inetd} for servers that use connectionless
-communication styles. For these servers, @code{inetd} does not try to accept
-a connection since no connection is possible. It just starts the
-server program, which can read the incoming datagram packet from
-descriptor 0. The server program can handle one request and then
-exit, or you can choose to write it to keep reading more requests
-until no more arrive, and then exit. You must specify which of these
-two techniques the server uses when you configure @code{inetd}.
-
-@node Configuring Inetd
-@subsection Configuring @code{inetd}
-
-The file @file{/etc/inetd.conf} tells @code{inetd} which ports to listen to
-and what server programs to run for them. Normally each entry in the
-file is one line, but you can split it onto multiple lines provided
-all but the first line of the entry start with whitespace. Lines that
-start with @samp{#} are comments.
-
-Here are two standard entries in @file{/etc/inetd.conf}:
-
-@smallexample
-ftp stream tcp nowait root /libexec/ftpd ftpd
-talk dgram udp wait root /libexec/talkd talkd
-@end smallexample
-
-An entry has this format:
-
-@smallexample
-@var{service} @var{style} @var{protocol} @var{wait} @var{username} @var{program} @var{arguments}
-@end smallexample
-
-The @var{service} field says which service this program provides. It
-should be the name of a service defined in @file{/etc/services}.
-@code{inetd} uses @var{service} to decide which port to listen on for
-this entry.
-
-The fields @var{style} and @var{protocol} specify the communication
-style and the protocol to use for the listening socket. The style
-should be the name of a communication style, converted to lower case
-and with @samp{SOCK_} deleted---for example, @samp{stream} or
-@samp{dgram}. @var{protocol} should be one of the protocols listed in
-@file{/etc/protocols}. The typical protocol names are @samp{tcp} for
-byte stream connections and @samp{udp} for unreliable datagrams.
-
-The @var{wait} field should be either @samp{wait} or @samp{nowait}.
-Use @samp{wait} if @var{style} is a connectionless style and the
-server, once started, handles multiple requests as they come in.
-Use @samp{nowait} if @code{inetd} should start a new process for each message
-or request that comes in. If @var{style} uses connections, then
-@var{wait} @strong{must} be @samp{nowait}.
-
-@var{user} is the user name that the server should run as. @code{inetd} runs
-as root, so it can set the user ID of its children arbitrarily. It's
-best to avoid using @samp{root} for @var{user} if you can; but some
-servers, such as Telnet and FTP, read a username and password
-themselves. These servers need to be root initially so they can log
-in as commanded by the data coming over the network.
-
-@var{program} together with @var{arguments} specifies the command to
-run to start the server. @var{program} should be an absolute file
-name specifying the executable file to run. @var{arguments} consists
-of any number of whitespace-separated words, which become the
-command-line arguments of @var{program}. The first word in
-@var{arguments} is argument zero, which should by convention be the
-program name itself (sans directories).
-
-If you edit @file{/etc/inetd.conf}, you can tell @code{inetd} to reread the
-file and obey its new contents by sending the @code{inetd} process the
-@code{SIGHUP} signal. You'll have to use @code{ps} to determine the
-process ID of the @code{inetd} process as it is not fixed.
-
-@c !!! could document /etc/inetd.sec
-
-@node Socket Options
-@section Socket Options
-@cindex socket options
-
-This section describes how to read or set various options that modify
-the behavior of sockets and their underlying communications protocols.
-
-@cindex level, for socket options
-@cindex socket option level
-When you are manipulating a socket option, you must specify which
-@dfn{level} the option pertains to. This describes whether the option
-applies to the socket interface, or to a lower-level communications
-protocol interface.
-
-@menu
-* Socket Option Functions:: The basic functions for setting and getting
- socket options.
-* Socket-Level Options:: Details of the options at the socket level.
-@end menu
-
-@node Socket Option Functions
-@subsection Socket Option Functions
-
-@pindex sys/socket.h
-Here are the functions for examining and modifying socket options.
-They are declared in @file{sys/socket.h}.
-
-@comment sys/socket.h
-@comment BSD
-@deftypefun int getsockopt (int @var{socket}, int @var{level}, int @var{optname}, void *@var{optval}, socklen_t *@var{optlen-ptr})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
-The @code{getsockopt} function gets information about the value of
-option @var{optname} at level @var{level} for socket @var{socket}.
-
-The option value is stored in the buffer that @var{optval} points to.
-Before the call, you should supply in @code{*@var{optlen-ptr}} the
-size of this buffer; on return, it contains the number of bytes of
-information actually stored in the buffer.
-
-Most options interpret the @var{optval} buffer as a single @code{int}
-value.
-
-The actual return value of @code{getsockopt} is @code{0} on success
-and @code{-1} on failure. The following @code{errno} error conditions
-are defined:
-
-@table @code
-@item EBADF
-The @var{socket} argument is not a valid file descriptor.
-
-@item ENOTSOCK
-The descriptor @var{socket} is not a socket.
-
-@item ENOPROTOOPT
-The @var{optname} doesn't make sense for the given @var{level}.
-@end table
-@end deftypefun
-
-@comment sys/socket.h
-@comment BSD
-@deftypefun int setsockopt (int @var{socket}, int @var{level}, int @var{optname}, const void *@var{optval}, socklen_t @var{optlen})
-@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
-This function is used to set the socket option @var{optname} at level
-@var{level} for socket @var{socket}. The value of the option is passed
-in the buffer @var{optval} of size @var{optlen}.
-
-@c Argh. -zw
-@iftex
-@hfuzz 6pt
-The return value and error codes for @code{setsockopt} are the same as
-for @code{getsockopt}.
-@end iftex
-@ifinfo
-The return value and error codes for @code{setsockopt} are the same as
-for @code{getsockopt}.
-@end ifinfo
-
-@end deftypefun
-
-@node Socket-Level Options
-@subsection Socket-Level Options
-
-@comment sys/socket.h
-@comment BSD
-@deftypevr Constant int SOL_SOCKET
-Use this constant as the @var{level} argument to @code{getsockopt} or
-@code{setsockopt} to manipulate the socket-level options described in
-this section.
-@end deftypevr
-
-@pindex sys/socket.h
-@noindent
-Here is a table of socket-level option names; all are defined in the
-header file @file{sys/socket.h}.
-
-@vtable @code
-@comment sys/socket.h
-@comment BSD
-@item SO_DEBUG
-@c Extra blank line here makes the table look better.
-
-This option toggles recording of debugging information in the underlying
-protocol modules. The value has type @code{int}; a nonzero value means
-``yes''.
-@c !!! should say how this is used
-@c OK, anyone who knows, please explain.
-
-@comment sys/socket.h
-@comment BSD
-@item SO_REUSEADDR
-This option controls whether @code{bind} (@pxref{Setting Address})
-should permit reuse of local addresses for this socket. If you enable
-this option, you can actually have two sockets with the same Internet
-port number; but the system won't allow you to use the two
-identically-named sockets in a way that would confuse the Internet. The
-reason for this option is that some higher-level Internet protocols,
-including FTP, require you to keep reusing the same port number.
-
-The value has type @code{int}; a nonzero value means ``yes''.
-
-@comment sys/socket.h
-@comment BSD
-@item SO_KEEPALIVE
-This option controls whether the underlying protocol should
-periodically transmit messages on a connected socket. If the peer
-fails to respond to these messages, the connection is considered
-broken. The value has type @code{int}; a nonzero value means
-``yes''.
-
-@comment sys/socket.h
-@comment BSD
-@item SO_DONTROUTE
-This option controls whether outgoing messages bypass the normal
-message routing facilities. If set, messages are sent directly to the
-network interface instead. The value has type @code{int}; a nonzero
-value means ``yes''.
-
-@comment sys/socket.h
-@comment BSD
-@item SO_LINGER
-This option specifies what should happen when the socket of a type
-that promises reliable delivery still has untransmitted messages when
-it is closed; see @ref{Closing a Socket}. The value has type
-@code{struct linger}.
-
-@comment sys/socket.h
-@comment BSD
-@deftp {Data Type} {struct linger}
-This structure type has the following members:
-
-@table @code
-@item int l_onoff
-This field is interpreted as a boolean. If nonzero, @code{close}
-blocks until the data are transmitted or the timeout period has expired.
-
-@item int l_linger
-This specifies the timeout period, in seconds.
-@end table
-@end deftp
-
-@comment sys/socket.h
-@comment BSD
-@item SO_BROADCAST
-This option controls whether datagrams may be broadcast from the socket.
-The value has type @code{int}; a nonzero value means ``yes''.
-
-@comment sys/socket.h
-@comment BSD
-@item SO_OOBINLINE
-If this option is set, out-of-band data received on the socket is
-placed in the normal input queue. This permits it to be read using
-@code{read} or @code{recv} without specifying the @code{MSG_OOB}
-flag. @xref{Out-of-Band Data}. The value has type @code{int}; a
-nonzero value means ``yes''.
-
-@comment sys/socket.h
-@comment BSD
-@item SO_SNDBUF
-This option gets or sets the size of the output buffer. The value is a
-@code{size_t}, which is the size in bytes.
-
-@comment sys/socket.h
-@comment BSD
-@item SO_RCVBUF
-This option gets or sets the size of the input buffer. The value is a
-@code{size_t}, which is the size in bytes.
-
-@comment sys/socket.h
-@comment GNU
-@item SO_STYLE
-@comment sys/socket.h
-@comment BSD
-@itemx SO_TYPE
-This option can be used with @code{getsockopt} only. It is used to
-get the socket's communication style. @code{SO_TYPE} is the
-historical name, and @code{SO_STYLE} is the preferred name in GNU.
-The value has type @code{int} and its value designates a communication
-style; see @ref{Communication Styles}.
-
-@comment sys/socket.h
-@comment BSD
-@item SO_ERROR
-@c Extra blank line here makes the table look better.
-
-This option can be used with @code{getsockopt} only. It is used to reset
-the error status of the socket. The value is an @code{int}, which represents
-the previous error status.
-@c !!! what is "socket error status"? this is never defined.
-@end vtable
-
-@node Networks Database
-@section Networks Database
-@cindex networks database
-@cindex converting network number to network name
-@cindex converting network name to network number
-
-@pindex /etc/networks
-@pindex netdb.h
-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
-@file{/etc/networks} or in an equivalent from a name server. This data
-base is useful for routing programs such as @code{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
-@file{netdb.h}.
-
-@comment netdb.h
-@comment BSD
-@deftp {Data Type} {struct netent}
-This data type is used to represent information about entries in the
-networks database. It has the following members:
-
-@table @code
-@item char *n_name
-This is the ``official'' name of the network.
-
-@item char **n_aliases
-These are alternative names for the network, represented as a vector
-of strings. A null pointer terminates the array.
-
-@item int n_addrtype
-This is the type of the network number; this is always equal to
-@code{AF_INET} for Internet networks.
-
-@item unsigned long int n_net
-This is the network number. Network numbers are returned in host
-byte order; see @ref{Byte Order}.
-@end table
-@end deftp
-
-Use the @code{getnetbyname} or @code{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.
-
-@comment netdb.h
-@comment BSD
-@deftypefun {struct netent *} getnetbyname (const char *@var{name})
-@safety{@prelim{}@mtunsafe{@mtasurace{:netbyname} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
-@c getnetbyname =~ getpwuid @mtasurace:netbyname @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock dup @asulock @aculock
-@c malloc dup @ascuheap @acsmem
-@c getnetbyname_r dup @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c realloc dup @ascuheap @acsmem
-@c free dup @ascuheap @acsmem
-@c libc_lock_unlock dup @aculock
-@c
-@c getnetbyname_r =~ getpwuid_r @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c no nscd support
-@c res_maybe_init(!preinit) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd
-@c nss_networks_lookup2 =~ nss_passwd_lookup2 @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.l -> _nss_*_getnetbyname_r @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-The @code{getnetbyname} function returns information about the network
-named @var{name}. It returns a null pointer if there is no such
-network.
-@end deftypefun
-
-@comment netdb.h
-@comment BSD
-@deftypefun {struct netent *} getnetbyaddr (uint32_t @var{net}, int @var{type})
-@safety{@prelim{}@mtunsafe{@mtasurace{:netbyaddr} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
-@c getnetbyaddr =~ getpwuid @mtasurace:netbyaddr @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock dup @asulock @aculock
-@c malloc dup @ascuheap @acsmem
-@c getnetbyaddr_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c realloc dup @ascuheap @acsmem
-@c free dup @ascuheap @acsmem
-@c libc_lock_unlock dup @aculock
-@c
-@c getnetbyaddr_r =~ getpwuid_r @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c no nscd support
-@c nss_networks_lookup2 =~ nss_passwd_lookup2 @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.l -> _nss_*_getnetbyaddr_r @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-The @code{getnetbyaddr} function returns information about the network
-of type @var{type} with number @var{net}. You should specify a value of
-@code{AF_INET} for the @var{type} argument for Internet networks.
-
-@code{getnetbyaddr} returns a null pointer if there is no such
-network.
-@end deftypefun
-
-You can also scan the networks database using @code{setnetent},
-@code{getnetent} and @code{endnetent}. Be careful when using these
-functions because they are not reentrant.
-
-@comment netdb.h
-@comment BSD
-@deftypefun void setnetent (int @var{stayopen})
-@safety{@prelim{}@mtunsafe{@mtasurace{:netent} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
-@c setnetent @mtasurace:netent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock dup @asulock @aculock
-@c nss_setent(nss_networks_lookup2) @mtasurace:netent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c res_maybe_init(!preinit) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd
-@c setup(nss_networks_lookup2) @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *lookup_fct = nss_networks_lookup2 dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.f @mtasurace:netent @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_unlock dup @aculock
-This function opens and rewinds the networks database.
-
-If the @var{stayopen} argument is nonzero, this sets a flag so that
-subsequent calls to @code{getnetbyname} or @code{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.
-@end deftypefun
-
-@comment netdb.h
-@comment BSD
-@deftypefun {struct netent *} getnetent (void)
-@safety{@prelim{}@mtunsafe{@mtasurace{:netent} @mtasurace{:netentbuf} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
-@c getnetent @mtasurace:netent @mtasurace:netentbuf @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock dup @asulock @aculock
-@c nss_getent(getnetent_r) @mtasurace:netent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c malloc dup @ascuheap @acsmem
-@c *func = getnetent_r dup @mtasurace:netent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c realloc dup @ascuheap @acsmem
-@c free dup @ascuheap @acsmem
-@c libc_lock_unlock dup @aculock
-@c
-@c getnetent_r @mtasurace:netent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock dup @asulock @aculock
-@c nss_getent_r(nss_networks_lookup2) @mtasurace:netent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c res_maybe_init(!preinit) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd
-@c setup(nss_networks_lookup2) dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.f @mtasurace:servent @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *sfct.f @mtasurace:netent @ascuplugin
-@c libc_lock_unlock dup @aculock
-This function returns the next entry in the networks database. It
-returns a null pointer if there are no more entries.
-@end deftypefun
-
-@comment netdb.h
-@comment BSD
-@deftypefun void endnetent (void)
-@safety{@prelim{}@mtunsafe{@mtasurace{:netent} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
-@c endnetent @mtasurace:netent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_lock @asulock @aculock
-@c nss_endent(nss_networks_lookup2) @mtasurace:netent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c res_maybe_init(!preinit) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd
-@c setup(nss_networks_lookup2) dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c *fct.f @mtasurace:netent @ascuplugin
-@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
-@c libc_lock_unlock @aculock
-This function closes the networks database.
-@end deftypefun