Man page - getservbyname_r(3)

Packages contains this manual

Available languages:

en fr ja ru ro

Manual

getservent_r

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
ATTRIBUTS
VERSIONS
STANDARDS
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION

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).

Image grohtml-3867327-1.png

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("Utilisation : %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("limite du tampon dépassée (%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 ! Nouvel essai avec un tampon plus grand\n");
erange_cnt++;
/* Incrémenter un octet à la fois pour pouvoir voir
exactement la taille du tampon nécessaire. */
buflen++;
if (buflen > MAX_BUF) {
printf("limite du tampon dépassée (%d)\n", MAX_BUF);
exit(EXIT_FAILURE);
}
}
} while (s == ERANGE);
printf("getservbyport_r() renvoyé : %s (buflen=%d)\n",
(s == 0) ? "0 (succĂšs)" : (s == ENOENT) ? "ENOENT" :
strerror(s), buflen);
if (s != 0 || result == NULL) {
printf("Échec appel/enregistrement non trouvĂ©\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 à debian-l10n-french@lists.debian.org .