.\" 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 GETPROTOENT_R 3  2021-03-22 "GNU" "Linux Programmer's Manual"
.SH NAME
getprotoent_r, getprotobyname_r, getprotobynumber_r \- get
protocol entry (reentrant)
.SH SYNOPSIS
.nf
.B #include <netdb.h>
.PP
.BI "int getprotoent_r(struct protoent *restrict " result_buf ,
.BI "                  char *restrict " buf ", size_t " buflen ,
.BI "                  struct protoent **restrict " result );
.BI "int getprotobyname_r(const char *restrict " name ,
.BI "                  struct protoent *restrict " result_buf ,
.BI "                  char *restrict " buf ", size_t " buflen ,
.BI "                  struct protoent **restrict " result );
.BI "int getprotobynumber_r(int " proto ,
.BI "                  struct protoent *restrict " result_buf ,
.BI "                  char *restrict " buf ", size_t " buflen ,
.BI "                  struct protoent **restrict " result );
.PP
.fi
.RS -4
Feature Test Macro Requirements for glibc (see
.BR feature_test_macros (7)):
.RE
.PP
.BR getprotoent_r (),
.BR getprotobyname_r (),
.BR getprotobynumber_r ():
.nf
    Since glibc 2.19:
        _DEFAULT_SOURCE
    Glibc 2.19 and earlier:
        _BSD_SOURCE || _SVID_SOURCE
.fi
.SH DESCRIPTION
The
.BR getprotoent_r (),
.BR getprotobyname_r (),
and
.BR getprotobynumber_r ()
functions are the reentrant equivalents of, respectively,
.BR getprotoent (3),
.BR getprotobyname (3),
and
.BR getprotobynumber (3).
They differ in the way that the
.I protoent
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 protoent
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 protoent
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.
.\" The 1024 byte value is also what the Solaris man page suggests. -- mtk
.PP
If the function call successfully obtains a protocol record, then
.I *result
is set pointing to
.IR result_buf ;
otherwise,
.I *result
is set to NULL.
.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 ( getprotobyname_r (),
.BR getprotobynumber_r ()),
or end of input
.RB ( getprotoent_r ())
.I result
is set to NULL.
.SH ERRORS
.TP
.B ENOENT
.RB ( getprotoent_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 getprotoent_r (),
.BR getprotobyname_r (),
.BR getprotobynumber_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 EXAMPLES
The program below uses
.BR getprotobyname_r ()
to retrieve the protocol record for the protocol named
in its first command-line argument.
If a second (integer) command-line argument is supplied,
it is used as the initial value for
.IR buflen ;
if
.BR getprotobyname_r ()
fails with the error
.BR ERANGE ,
the program retries with larger buffer sizes.
The following shell session shows a couple of sample runs:
.PP
.in +4n
.EX
.RB "$" " ./a.out tcp 1"
ERANGE! Retrying with larger buffer
getprotobyname_r() returned: 0 (success)  (buflen=78)
p_name=tcp; p_proto=6; aliases=TCP
.RB "$" " ./a.out xxx 1"
ERANGE! Retrying with larger buffer
getprotobyname_r() returned: 0 (success)  (buflen=100)
Call failed/record not found
.EE
.in
.SS Program source
\&
.EX
#define _GNU_SOURCE
#include <ctype.h>
#include <netdb.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

#define MAX_BUF 10000

int
main(int argc, char *argv[])
{
    int buflen, erange_cnt, s;
    struct protoent result_buf;
    struct protoent *result;
    char buf[MAX_BUF];

    if (argc < 2) {
        printf("Usage: %s proto\-name [buflen]\en", argv[0]);
        exit(EXIT_FAILURE);
    }

    buflen = 1024;
    if (argc > 2)
        buflen = atoi(argv[2]);

    if (buflen > MAX_BUF) {
        printf("Exceeded buffer limit (%d)\en", MAX_BUF);
        exit(EXIT_FAILURE);
    }

    erange_cnt = 0;
    do {
        s = getprotobyname_r(argv[1], &result_buf,
                     buf, buflen, &result);
        if (s == ERANGE) {
            if (erange_cnt == 0)
                printf("ERANGE! Retrying with larger buffer\en");
            erange_cnt++;

            /* Increment a byte at a time so we can see exactly
               what size buffer was required. */

            buflen++;

            if (buflen > MAX_BUF) {
                printf("Exceeded buffer limit (%d)\en", MAX_BUF);
                exit(EXIT_FAILURE);
            }
        }
    } while (s == ERANGE);

    printf("getprotobyname_r() returned: %s  (buflen=%d)\en",
            (s == 0) ? "0 (success)" : (s == ENOENT) ? "ENOENT" :
            strerror(s), buflen);

    if (s != 0 || result == NULL) {
        printf("Call failed/record not found\en");
        exit(EXIT_FAILURE);
    }

    printf("p_name=%s; p_proto=%d; aliases=",
                result_buf.p_name, result_buf.p_proto);
    for (char **p = result_buf.p_aliases; *p != NULL; p++)
        printf("%s ", *p);
    printf("\en");

    exit(EXIT_SUCCESS);
}
.EE
.SH SEE ALSO
.BR getprotoent (3),
.BR protocols (5)
