getservent_r(3) Library Functions Manual getservent_r(3) NOM getservent_r, getservbyname_r, getservbyport_r - Acceder aux informations sur les services (version reentrante) BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include 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 fonctionnalites 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 anterieures : _BSD_SOURCE || _SVID_SOURCE DESCRIPTION getservent_r(), getservbyname_r() et getservbyport_r() sont respectivement les versions reentrantes de getservent(3), getservbyname(3) et getservbyport(3). Elles different car la structure servent est renvoyee, les signatures et la valeur renvoyee sont aussi differentes. Cette page de manuel decrit juste les differences depuis les versions non reentrantes. Au lieu de renvoyer un pointeur vers une structure servent statiquement allouee, ces fonctions copient la structure a l'adresse pointee par result_buf. Le tableau buf est utilise pour sauvegarder les champs de la chaine pointee par la structure servent renvoyee (les fonctions non reentrantes allouent ces chaines de facon statique). La taille du tableau est indiquee avec buflen. Si buf est trop petit, l'appel echoue avec l'erreur ERANGE, et l'appelant doit essayer de nouveau avec un tableau plus grand (un tableau de 1024 octets est en general suffisant). Si la fonction reussie a obtenir un enregistrement de service, alors *result pointe vers result_buf, sinon *result est defini a NULL. VALEUR RENVOYEE En cas de succes, ces fonctions renvoient zero. En cas d'erreur, une valeur d'erreur positive listee dans ERREURS est renvoyee. En cas d'erreur, << enregistrement non trouve >> (getservbyname_r(), getservbyport_r()) ou << fin de l'entree >> (getservent_r()), result est defini a NULL. ERREURS ENOENT (getservent_r()) Plus d'enregistrement dans la base de donnees. ERANGE buf est trop petit. Reessayer avec un tampon plus grand (et augmentez buflen). ATTRIBUTS Pour une explication des termes utilises dans cette section, consulter attributes(7). +--------------------------+--------------------------+----------------+ |Interface | Attribut | Valeur | +--------------------------+--------------------------+----------------+ |getservent_r(), | Securite des threads | MT-Safe locale | |getservbyname_r(), | | | |getservbyport_r() | | | +--------------------------+--------------------------+----------------+ VERSIONS Des fonctions avec des noms similaires existent sur d'autres systemes, bien qu'en general avec des signatures d'appel differentes. STANDARDS GNU. EXEMPLES Le programme ci-dessous utilise getservbyport_r() pour recuperer l'enregistrement du port et du protocole nomme dans les deux premiers arguments de sa ligne de commande. Si un troisieme argument (un entier) est fourni, il est utilise comme valeur initiale de buflen. Si getservbyport_r() echoue 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 (succes) (buflen=87) s_name=echo; s_proto=tcp; s_port=7; aliases= $ ./a.out 77777 tcp getservbyport_r() renvoye: 0 (succes) (buflen=1024) Echec appel/enregistrement non trouve Source du programme #define _GNU_SOURCE #include #include #include #include #include #include #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 depassee (%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++; /* Incrementer un octet a la fois pour pouvoir voir exactement la taille du tampon necessaire. */ buflen++; if (buflen > MAX_BUF) { printf("limite du tampon depassee (%d)\n", MAX_BUF); exit(EXIT_FAILURE); } } } while (s == ERANGE); printf("getservbyport_r() renvoye : %s (buflen=%d)\n", (s == 0) ? "0 (succes)" : (s == ENOENT) ? "ENOENT" : strerror(s), buflen); if (s != 0 || result == NULL) { printf("Echec appel/enregistrement non trouve\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 francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Pierre Giraud Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 getservent_r(3)