Provided by: manpages-fr-dev_4.23.1-1_all bug

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

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

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  ⟨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⟩.