.\" Copyright 2008, Linux Foundation, written by Michael Kerrisk
.\"	<mtk.manpages@gmail.com>
.\"
.\" %%%LICENSE_START(VERBATIM)
.\" Permission is granted to make and distribute verbatim copies of this
.\" manual provided the copyright notice and this permission notice are
.\" preserved on all copies.
.\"
.\" Permission is granted to copy and distribute modified versions of this
.\" manual under the conditions for verbatim copying, provided that the
.\" entire resulting derived work is distributed under the terms of a
.\" permission notice identical to this one.
.\"
.\" Since the Linux kernel and libraries are constantly changing, this
.\" manual page may be incorrect or out-of-date.  The author(s) assume no
.\" responsibility for errors or omissions, or for damages resulting from
.\" the use of the information contained herein.  The author(s) may not
.\" have taken the same level of care in the production of this manual,
.\" which is licensed free of charge, as they might when working
.\" professionally.
.\"
.\" Formatted or processed versions of this manual, if unaccompanied by
.\" the source, must acknowledge the copyright and authors of this work.
.\" %%%LICENSE_END
.\"
.TH GETNETENT_R 3  2021-03-22 "GNU" "Linux Programmer's Manual"
.SH NAME
getnetent_r, getnetbyname_r, getnetbyaddr_r \- get
network entry (reentrant)
.SH SYNOPSIS
.nf
.B #include <netdb.h>
.PP
.BI "int getnetent_r(struct netent *restrict " result_buf ,
.BI "                char *restrict " buf ", size_t " buflen ,
.BI "                struct netent **restrict " result ,
.BI "                int *restrict " h_errnop );
.BI "int getnetbyname_r(const char *restrict " name ,
.BI "                struct netent *restrict " result_buf ,
.BI "                char *restrict " buf ", size_t " buflen ,
.BI "                struct netent **restrict " result ,
.BI "                int *restrict " h_errnop );
.BI "int getnetbyaddr_r(uint32_t " net ", int " type ,
.BI "                struct netent *restrict " result_buf ,
.BI "                char *restrict " buf ", size_t " buflen ,
.BI "                struct netent **restrict " result ,
.BI "                int *restrict " h_errnop );
.PP
.fi
.RS -4
Feature Test Macro Requirements for glibc (see
.BR feature_test_macros (7)):
.RE
.PP
.BR getnetent_r (),
.BR getnetbyname_r (),
.BR getnetbyaddr_r ():
.nf
    Since glibc 2.19:
        _DEFAULT_SOURCE
    Glibc 2.19 and earlier:
        _BSD_SOURCE || _SVID_SOURCE
.fi
.SH DESCRIPTION
The
.BR getnetent_r (),
.BR getnetbyname_r (),
and
.BR getnetbyaddr_r ()
functions are the reentrant equivalents of, respectively,
.BR getnetent (3),
.BR getnetbyname (3),
and
.BR getnetbynumber (3).
They differ in the way that the
.I netent
structure is returned,
and in the function calling signature and return value.
This manual page describes just the differences from
the nonreentrant functions.
.PP
Instead of returning a pointer to a statically allocated
.I netent
structure as the function result,
these functions copy the structure into the location pointed to by
.IR result_buf .
.PP
The
.I buf
array is used to store the string fields pointed to by the returned
.I netent
structure.
(The nonreentrant functions allocate these strings in static storage.)
The size of this array is specified in
.IR buflen .
If
.I buf
is too small, the call fails with the error
.BR ERANGE ,
and the caller must try again with a larger buffer.
(A buffer of length 1024 bytes should be sufficient for most applications.)
.\" I can find no information on the required/recommended buffer size;
.\" the nonreentrant functions use a 1024 byte buffer -- mtk.
.PP
If the function call successfully obtains a network record, then
.I *result
is set pointing to
.IR result_buf ;
otherwise,
.I *result
is set to NULL.
.PP
The buffer pointed to by
.I h_errnop
is used to return the value that would be stored in the global variable
.I h_errno
by the nonreentrant versions of these functions.
.\" getnetent.3 doesn't document any use of h_errno, but nevertheless
.\" the nonreentrant functions no seem to set h_errno.
.SH RETURN VALUE
On success, these functions return 0.
On error, they return one of the positive error numbers listed in ERRORS.
.PP
On error, record not found
.RB ( getnetbyname_r (),
.BR getnetbyaddr_r ()),
or end of input
.RB ( getnetent_r ())
.I result
is set to NULL.
.SH ERRORS
.TP
.B ENOENT
.RB ( getnetent_r ())
No more records in database.
.TP
.B ERANGE
.I buf
is too small.
Try again with a larger buffer
(and increased
.IR buflen ).
.SH ATTRIBUTES
For an explanation of the terms used in this section, see
.BR attributes (7).
.ad l
.nh
.TS
allbox;
lbx lb lb
l l l.
Interface	Attribute	Value
T{
.BR getnetent_r (),
.BR getnetbyname_r (),
.BR getnetbyaddr_r ()
T}	Thread safety	MT-Safe locale
.TE
.hy
.ad
.sp 1
.SH CONFORMING TO
These functions are GNU extensions.
Functions with similar names exist on some other systems,
though typically with different calling signatures.
.SH SEE ALSO
.BR getnetent (3),
.BR networks (5)
