Provided by: manpages-fr-dev_4.15.0-9_all bug

NOM

       getservent_r, getservbyname_r, getservbyport_r - Accéder aux informations sur les services
       (version réentrante)

SYNOPSIS

       #include <netdb.h>

       int getservent_r(struct servent *restrict result_buf,
                        char *restrict buf, size_t buflen,
                        struct servent **restrict result);
       int getservbyname_r(const char *restrict name,
                        const char *restrict proto,
                        struct servent *restrict result_buf,
                        char *restrict buf, size_t buflen,
                        struct servent **restrict result);
       int getservbyport_r(int port,
                        const char *restrict proto,
                        struct servent *restrict result_buf,
                        char *restrict buf, 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
           Pour la glibc 2.19 et précédentes :
               _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).

       ┌─────────────────────────────────────────────────┬──────────────────────┬────────────────┐
       │InterfaceAttributValeur         │
       ├─────────────────────────────────────────────────┼──────────────────────┼────────────────┤
       │getservent_r(), getservbyname_r(),               │ Sécurité des threads │ MT-Safe locale │
       │getservbyport_r()                                │                      │                │
       └─────────────────────────────────────────────────┴──────────────────────┴────────────────┘

CONFORMITÉ

       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.

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! 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

   Source du programme

       #define _GNU_SOURCE
       #include <ctype.h>
       #include <netdb.h>
       #include <stdlib.h>
       #include <stdio.h>
       #include <errno.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)

COLOPHON

       Cette  page  fait partie de la publication 5.13 du projet man-pages Linux. Une description
       du projet et des instructions pour signaler des anomalies et la dernière version de  cette
       page peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

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> et David Prévot <david@tilapin.org>

       Cette traduction est une documentation libre ; veuillez vous reporter  à  la  GNU  General
       Public   License   version 3  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  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⟩.