getservent_r
Table des matières
Retour à l'index
NOM
getservent_r, getservbyname_r, getservbyport_r – Accéder aux informations
sur les services (version réentrante)
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
#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);
Exigences de macros de test de fonctionnalités pour la glibc (consulter
feature_test_macros(7)) :
getservent_r(), getservbyname_r(), getservbyport_r() :
Depuis la glibc 2.19 :
_DEFAULT_SOURCE
glibc 2.19 et antérieures :
_BSD_SOURCE || _SVID_SOURCE
DESCRIPTION
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.
VALEUR RENVOYÉE
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.
ERREURS
- 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).
ATTRIBUTS
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
|
VERSIONS
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.
STANDARDS
GNU.
EXEMPLES
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 ! Nouvel essai avec un tampon plus grand
getservbyport_r() returned: 0 (succès) (buflen=87)
s_name=echo; s_proto=tcp; s_port=7; aliases=
$ ./a.out 77777 tcp
getservbyport_r() renvoyé: 0 (succès) (buflen=1024)
Échec appel/enregistrement non trouvé
Source du programme
#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);
}
VOIR AUSSI
getservent(3), services(5)
TRADUCTION
La traduction française de cette page de manuel a été créée par
Christophe Blaess <https://www.blaess.fr/christophe/>,
Stéphan Rafin <stephan.rafin@laposte.net>,
Thierry Vignaud <tvignaud@mandriva.com>,
François Micaux,
Alain Portal <aportal@univ-montp2.fr>,
Jean-Philippe Guérard <fevrier@tigreraye.org>,
Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>,
Julien Cristau <jcristau@debian.org>,
Thomas Huriaux <thomas.huriaux@gmail.com>,
Nicolas François <nicolas.francois@centraliens.net>,
Florentin Duneau <fduneau@gmail.com>,
Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,
Denis Barbier <barbier@debian.org>,
David Prévot <david@tilapin.org>
et
Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>
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 à
Index
- NOM
-
- BIBLIOTHÈQUE
-
- SYNOPSIS
-
- DESCRIPTION
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- ATTRIBUTS
-
- VERSIONS
-
- STANDARDS
-
- EXEMPLES
-
- Source du programme
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 05:06:15 GMT, September 19, 2025