getservent_r, getservbyname_r, getservbyport_r - Accéder aux informations
sur les services (version réentrante)
Bibliothèque C standard (
libc,
-lc)
#include <netdb.h>
int getservent_r(struct servent *restrict result_buf,
char buf[restrict .buflen], size_t buflen,
struct servent **restrict result);
int getservbyname_r(const char *restrict name,
const char *restrict proto,
struct servent *restrict result_buf,
char buf[restrict .buflen], size_t buflen,
struct servent **restrict result);
int getservbyport_r(int port,
const char *restrict proto,
struct servent *restrict result_buf,
char buf[restrict .buflen], size_t buflen,
struct servent **restrict result);
getservent_r(),
getservbyname_r(),
getservbyport_r():
Depuis la glibc 2.19 :
_DEFAULT_SOURCE
Pour la glibc 2.19 et précédentes :
_BSD_SOURCE || _SVID_SOURCE
getservent_r(),
getservbyname_r() et
getservbyport_r() sont
respectivement les versions réentrantes de
getservent(3),
getservbyname(3) et
getservbyport(3). Elles diffèrent car
la structure
servent est renvoyée, les signatures et la valeur
renvoyée sont aussi différentes. Cette page de manuel
décrit juste les différences depuis les versions non
réentrantes.
Au lieu de renvoyer un pointeur vers une structure
servent 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ée par la structure
servent 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 réussie à obtenir un enregistrement de service,
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.
En cas d'erreur, « enregistrement non
trouvé » (
getservbyname_r(),
getservbyport_r()) ou « fin de
l'entrée » (
getservent_r()),
result est
défini à NULL.
- ENOENT
- (getservent_r()) Plus d'enregistrement dans la base
de données.
- 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 |
getservent_r(), getservbyname_r(),
getservbyport_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
getservbyport_r() pour
récupérer l'enregistrement du port et du protocole nommé
dans les deux premiers arguments de sa ligne de commande. Si un
troisième argument (un entier) est fourni, il est utilisé comme
valeur initiale de
buflen. Si
getservbyport_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 7 tcp 1
ERANGE! Retrying with larger buffer
getservbyport_r() returned: 0 (success) (buflen=87)
s_name=echo; s_proto=tcp; s_port=7; aliases=
$ ./a.out 77777 tcp
getservbyport_r() returned: 0 (success) (buflen=1024)
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, port, s;
struct servent result_buf;
struct servent *result;
char buf[MAX_BUF];
char *protop;
if (argc < 3) {
printf("Usage: %s port-num proto-name [buflen]\n", argv[0]);
exit(EXIT_FAILURE);
}
port = htons(atoi(argv[1]));
protop = (strcmp(argv[2], "null") == 0 ||
strcmp(argv[2], "NULL") == 0) ? NULL : argv[2];
buflen = 1024;
if (argc > 3)
buflen = atoi(argv[3]);
if (buflen > MAX_BUF) {
printf("Exceeded buffer limit (%d)\n", MAX_BUF);
exit(EXIT_FAILURE);
}
erange_cnt = 0;
do {
s = getservbyport_r(port, protop, &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("getservbyport_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("s_name=%s; s_proto=%s; s_port=%d; aliases=",
result_buf.s_name, result_buf.s_proto,
ntohs(result_buf.s_port));
for (char **p = result_buf.s_aliases; *p != NULL; p++)
printf("%s ", *p);
printf("\n");
exit(EXIT_SUCCESS);
}
getservent(3),
services(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]