dwww Home | Manual pages | Find package

getservent_r(3)            Library Functions Manual            getservent_r(3)

NOM
       getservent_r,  getservbyname_r,  getservbyport_r - Accéder aux informa-
       tions 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
           Pour la glibc 2.19 et précédentes :
               _BSD_SOURCE || _SVID_SOURCE

DESCRIPTION
       getservent_r(), getservbyname_r() et getservbyport_r() sont respective-
       ment les versions réentrantes  de  getservent(3),  getservbyname(3)  et
       getservbyport(3).  Elles  diffèrent  car  la structure servent est ren-
       voyé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 re-
       sult_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éen-
       trantes 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(), get-
       servbyport_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 aug-
              mentez buflen).

ATTRIBUTS
       Pour une explication des termes utilisés dans cette section,  consulter
       attributes(7).

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

STANDARDS
       Ces  fonctions sont des extensions GNU. Des fonctions avec des noms si-
       milaires 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'en-
       registrement du port et du protocole nommé dans les deux premiers argu-
       ments de sa ligne de commande. Si un troisième argument (un entier) est
       fourni, il est utilisé comme valeur initiale de buflen.  Si  getservby-
       port_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 <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 Chris-
       tophe Blaess <https://www.blaess.fr/christophe/>, Stéphan  Rafin  <ste-
       phan.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.cou-
       lon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>,  Thomas  Huriaux
       <thomas.huriaux@gmail.com>,  Nicolas François <nicolas.francois@centra-
       liens.net>, Florentin Duneau <fduneau@gmail.com>, Simon  Paillard  <si-
       mon.paillard@resel.enst-bretagne.fr>,    Denis   Barbier   <barbier@de-
       bian.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⟩.

Pages du manuel de Linux 6.03   5 février 2023                 getservent_r(3)

Generated by dwww version 1.15 on Sat Jun 29 00:26:14 CEST 2024.