getprotoent_r, getprotobyname_r, getprotobynumber_r - Accéder aux
protocoles (version réentrante)
Bibliothèque C standard (
libc,
-lc)
#include <netdb.h>
int getprotoent_r(struct protoent *restrict result_buf,
char buf[restrict .buflen], size_t buflen,
struct protoent **restrict result);
int getprotobyname_r(const char *restrict name,
struct protoent *restrict result_buf,
char buf[restrict .buflen], size_t buflen,
struct protoent **restrict result);
int getprotobynumber_r(int proto,
struct protoent *restrict result_buf,
char buf[restrict .buflen], size_t buflen,
struct protoent **restrict result);
getprotoent_r(),
getprotobyname_r(),
getprotobynumber_r():
Depuis la glibc 2.19 :
_DEFAULT_SOURCE
Pour la glibc 2.19 et précédentes :
_BSD_SOURCE || _SVID_SOURCE
getprotoent_r(),
getprotobyname_r(), et
getprotobynumber_r() sont respectivement, les versions
réentrantes des fonctions
getprotoent(3),
getprotobyname(3), et
getprotobynumber(3). Elles
diffèrent car la structure
protoent est renvoyée, et leur
signature ainsi que leur valeur de retour sont aussi différentes. Cette
page de manuel décrit juste les différences depuis les fonctions
non réentrantes.
Au lieu de retourner un pointeur vers une structure
protoent statiquement
allouée, ces fonctions copient la structure à l'adresse
pointée par
result_buf.
Le tableau
buf est utilisé pour sauvegarder les champs de la
chaîne pointés par la structure
protoent renvoyée
(les fonctions non réentrantes allouent ces chaînes de
façon statique). La taille du tableau est indiquée avec
buflen. Si
buf est trop petit, l'appel échoue avec
l'erreur
ERANGE, et l'appelant doit essayer de nouveau avec un tableau
plus grand (un tableau de 1024 octets est en général suffisant).
Si la fonction obtient un enregistrement de protocol, alors
*result
pointe vers
result_buf sinon
*result est défini à
NULL.
En cas de succès, ces fonctions renvoient zéro. En cas d'erreur,
une valeur d'erreur positive listée dans ERREURS est renvoyée.
Dans le cas des erreurs, « enregistrement non
trouvé » (
getprotobyname_r(),
getprotobynumber_r()) ou « fin de
l'entrée » (
getprotoent_r()),
result est
défini à NULL.
- ENOENT
- (getprotoent_r()) Plus d'autre enregistrement dans
la base.
- ERANGE
-
buf est trop petit. Réessayer avec un tampon
plus grand (et augmentez buflen).
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface |
Attribut |
Valeur |
getprotoent_r(), getprotobyname_r(),
getprotobynumber_r() |
Sécurité des threads |
MT-Safe locale |
Ces fonctions sont des extensions GNU. Des fonctions avec des noms similaires
existent sur d'autres systèmes, bien qu’en général
avec des signatures d'appel différentes.
Le programme ci-dessous utilise
getprotobyname_r() pour
récupérer l'enregistrement de protocole du protocole
nommé dans le premier argument de sa ligne de commande. Si un second
argument (un entier) est fourni, il est utilisé comme valeur initiale
de
buflen. Si
getprotobyname_r() échoue avec l'erreur
ERANGE, le programme recommence avec une taille de tampon plus grande.
La session shell suivante montre des exemples d'utilisation.
$ ./a.out tcp 1
ERANGE! Retrying with larger buffer
getprotobyname_r() returned: 0 (success) (buflen=78)
p_name=tcp; p_proto=6; aliases=TCP
$ ./a.out xxx 1
ERANGE! Retrying with larger buffer
getprotobyname_r() returned: 0 (success) (buflen=100)
Call failed/record not found
#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 buflen, erange_cnt, s;
struct protoent result_buf;
struct protoent *result;
char buf[MAX_BUF];
if (argc < 2) {
printf("Usage: %s proto-name [buflen]\n", argv[0]);
exit(EXIT_FAILURE);
}
buflen = 1024;
if (argc > 2)
buflen = atoi(argv[2]);
if (buflen > 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, buflen, &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. */
buflen++;
if (buflen > MAX_BUF) {
printf("Exceeded buffer limit (%d)\n", MAX_BUF);
exit(EXIT_FAILURE);
}
}
} while (s == ERANGE);
printf("getprotobyname_r() returned: %s (buflen=%d)\n",
(s == 0) ? "0 (success)" : (s == ENOENT) ? "ENOENT" :
strerror(s), buflen);
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);
}
getprotoent(3),
protocols(5)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]> et David Prévot <
[email protected]>
Cette traduction est une documentation libre ; veuillez vous reporter
à la
GNU
General Public License version 3 concernant les conditions de copie
et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
[email protected]