getprotoent_r(3)
β¨ getprotoent_r(3) β the reentrant protocol-entry girlies β¨
okay so bestie, we're in the Library Functions Manual section of your friendly neighborhood man pages, and today we're getting protocol entries but the reentrant way. you know. the β¨thread-safeβ¨ way. it's giving responsible. it's giving adulting. let's go π
πΈ NAME
getprotoent_r, getprotobyname_r, getprotobynumber_r β get protocol entry (reentrant) π¦
π LIBRARY
Standard C library (libc, -lc)
β SYNOPSIS
#include <netdb.h>
int getprotoent_r(size_t size;
struct protoent *restrict result_buf,
char buf[restrict size], size_t size,
struct protoent **restrict result);
int getprotobyname_r(size_t size;
const char *restrict name,
struct protoent *restrict result_buf,
char buf[restrict size], size_t size,
struct protoent **restrict result);
int getprotobynumber_r(size_t size;
int proto,
struct protoent *restrict result_buf,
char buf[restrict size], size_t size,
struct protoent **restrict result);
π Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
getprotoent_r(), getprotobyname_r(), getprotobynumber_r():
- Since glibc 2.19:
_DEFAULT_SOURCE
- glibc 2.19 and earlier:
_BSD_SOURCE || _SVID_SOURCE
(yeah boo, you gotta define the magic word before the #include or the compiler's gonna be like "who? never heard of her" π)
π DESCRIPTION
So. getprotoent_r(), getprotobyname_r(), and getprotobynumber_r() are the reentrant equivalents of, respectively, getprotoent(3), getprotobyname(3), and getprotobynumber(3). they're the same girl, she just got a glow-up β¨. what's different:
- the way the
protoentstructure gets handed back to you, - the function calling signature,
- and the return value.
this page only walks you through the differences from the nonreentrant girlies. periodt.
instead of handing you a pointer to a statically allocated protoent structure as the function result (gross, shared, everyone's fighting over it π), these functions copy the structure into the location pointed to by result_buf. your buffer, your business. π
the buf array is where the string fields pointed to by the returned protoent structure get stored. (the nonreentrant functions allocate those strings in static storage β not it.) you tell her how big that array is with size. and like, if buf is too small? the call fails with the error ERANGE, and you have to try again with a larger buffer. no drama, just retry. (a buffer of size 1024 bytes should be sufficient for most applications, so maybe just start there? π«Ά)
and if the function call successfully obtains a protocol record, then *result is set pointing to result_buf. otherwise, *result is set to NULL. bye. π
π« RETURN VALUE
On success, these functions return 0. slay. β
On error, they return one of the positive error numbers listed in ERRORS.
On error, record not found (getprotobyname_r(), getprotobynumber_r()), or end of input (getprotoent_r()), result is set to NULL.
π₯ ERRORS
ENOENT(getprotoent_r()) β No more records in database. that's all she wrote, bestie πERANGEβbufis too small. Try again with a larger buffer (and increasedsize).
π ATTRIBUTES
For an explanation of the terms used in this section, see attributes(7).
- Interface:
getprotoent_r(),getprotobyname_r(),getprotobynumber_r() - Attribute: Thread safety
- Value:
MT-Safe locale
(MT-Safe locale, no cap. now that's main character energy π§)
π VERSIONS
Functions with similar names exist on some other systems, though typically with different calling signatures. so like, don't just copy-paste your code over there and expect it to eat. check first. π
πΈ STANDARDS
GNU.
π EXAMPLES
The program below uses 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 size; if getprotobyname_r() fails with the error ERANGE, the program retries with larger buffer sizes. The following shell session shows a couple of sample runs:
$ ./a.out tcp 1
ERANGE! Retrying with larger buffer
getprotobyname_r() returned: 0 (success) (size=78)
p_name=tcp; p_proto=6; aliases=TCP
$ ./a.out xxx 1
ERANGE! Retrying with larger buffer
getprotobyname_r() returned: 0 (success) (size=100)
Call failed/record not found
β¨ Program source
#define _GNU_SOURCE
#include <ctype.h>
#include <errno.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_BUF 10000
int
main(int argc, char *argv[])
{
int size, erange_cnt, s;
struct protoent result_buf;
struct protoent *result;
char buf[MAX_BUF];
if (argc < 2) {
printf("Usage: %s proto-name [size]\n", argv[0]);
exit(EXIT_FAILURE);
}
size = 1024;
if (argc > 2)
size = atoi(argv[2]);
if (size > MAX_BUF) {
printf("Exceeded buffer limit (%d)\n", MAX_BUF);
exit(EXIT_FAILURE);
}
erange_cnt = 0;
do {
s = getprotobyname_r(argv[1], &result_buf,
buf, size, &result);
if (s == ERANGE) {
if (erange_cnt == 0)
printf("ERANGE! Retrying with larger buffer\n");
erange_cnt++;
/* Increment a byte at a time so we can see exactly
what size buffer was required. */
size++;
if (size > MAX_BUF) {
printf("Exceeded buffer limit (%d)\n", MAX_BUF);
exit(EXIT_FAILURE);
}
}
} while (s == ERANGE);
printf("getprotobyname_r() returned: %s (size=%d)\n",
(s == 0) ? "0 (success)" : (s == ENOENT) ? "ENOENT" :
strerror(s), size);
if (s != 0 || result == NULL) {
printf("Call failed/record not found\n");
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("\n");
exit(EXIT_SUCCESS);
}
π¦ SEE ALSO
and that's the whole page, bestie!! π this came to you from Linux man-pages 6.20, dated 2025-09-21 β go off, go read it, go write some thread-safe code. you got this. mwah. πβ¨π
π¦ where this page comes from
- arch rolling: man-pages 6.20-1 Β· BSD-2-Clause AND BSD-3-Clause AND BSD-4.3TAHOE AND BSD-4-Clause-UC AND GPL-1.0-or-later AND GPL-2.0-only AND GPL-2.0-or-later AND GPL-3.0-or-later AND LGPL-3.0-linking-exception AND LGPL-3.0-or-later AND LicenseRef-Public-Domain AND LicenseRef-UltraPermissive AND Linux-man-pages-1-para AND Linux-man-pages-copyleft AND Linux-man-pages-copyleft-2-para AND Linux-man-pages-copyleft-var AND MIT AND Spencer-94
- nixpkgs unstable: man-pages 6.20
- π the page's license: Linux-man-pages-copyleft
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms