getservent_r(3) Library Functions Manual getservent_r(3) NUME getservent_r, getservbyname_r, getservbyport_r - obine intrarea serviciului (reentrant) BIBLIOTECA Biblioteca C standard (libc, -lc) REZUMAT #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); Cerine pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultai feature_test_macros(7)): getservent_r(), getservbyname_r(), getservbyport_r(): Incepand cu glibc 2.19: _DEFAULT_SOURCE glibc 2.19 i versiunile anterioare: _BSD_SOURCE || _SVID_SOURCE DESCRIERE Funciile getservent_r(), getservbyname_r() i getservbyport_r() sunt echivalentele reentrante ale funciilor getservent(3), getservbyname(3) i getservbyport(3). Ele difera prin modul in care este returnata structura servent, precum i prin semnatura de apelare a funciei i valoarea de returnare. Aceasta pagina de manual descrie doar diferenele faa de funciile ne reentrante. In loc sa returneze un indicator la o structura servent alocata static ca rezultat al funciei, aceste funcii copiaza structura in locaia indicata de result_buf. Matricea buf este utilizata pentru a stoca campurile de iruri de caractere indicate de structura servent returnata; (funciile nereturnante aloca aceste iruri de caractere in memoria statica). Dimensiunea acestei matrice este specificata in buflen. Daca buf este prea mica, apelul eueaza cu eroarea ERANGE, iar apelantul trebuie sa incerce din nou cu o memorie tampon mai mare; (un buffer cu o lungime de 1024 octei ar trebui sa fie suficient pentru majoritatea aplicaiilor). Daca apelul funciei obine cu succes o evidena a serviciului, atunci *result este stabilit la result_buf; in caz contrar, *result este stabilit la NULL. VALOAREA RETURNATA In caz de succes, aceste funcii returneaza 0. In caz de eroare, acestea returneaza unul dintre numerele pozitive de eroare enumerate in seciunea ERORI-IEIRE. In caz de eroare, inregistrare nedescoperita (getservbyname_r(), getservbyport_r()) sau sfarit de intrare (getservent_r()), result este stabilit la NULL. ERORI-IEIRE ENOENT (getservent_r()) Nu mai exista inregistrari in baza de date. ERANGE buf este prea mic. Incercai din nou cu o memorie tampon mai mare (i cu buflen marit). ATRIBUTE Pentru o explicaie a termenilor folosii in aceasta seciune, a se vedea attributes(7). +-------------------------------+---------------------+----------------+ |Interfaa | Atribut | Valoare | +-------------------------------+---------------------+----------------+ |getservent_r(), | Sigurana firelor | MT-Safe locale | |getservbyname_r(), | | | |getservbyport_r() | | | +-------------------------------+---------------------+----------------+ VERSIUNI Funcii cu nume similare exista i pe alte sisteme, dei, de obicei, cu semnaturi de apelare diferite. STANDARDE GNU. EXEMPLE Programul de mai jos utilizeaza getservbyport_r() pentru a prelua inregistrarea serviciului pentru portul i protocolul menionate in primul sau argument de linie de comanda. In cazul in care se furnizeaza un al treilea argument de linie de comanda (numar intreg), acesta este utilizat ca valoare iniiala pentru buflen; daca getservbyport_r() eueaza cu eroarea ERANGE, programul incearca din nou cu dimensiuni mai mari ale memoriei tampon. Urmatoarea sesiune shell prezinta cateva exemple de execuie: $ ./a.out 7 tcp 1 ERANGE! Se reincearca cu o memorie tampon mai mare 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) Apel euat/inregistrarea nu a fost gasita Sursa programului #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("Utilizare: %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("Limita memoriei tampon a fost depaita (%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! Se reincearca cu o memorie tampon mai mare\n"); erange_cnt++; /* Incrementam cate un octet pe rand ca sa vedem exact ce dimensiune a fost necesara pentru memoria tampon. */ buflen++; if (buflen > MAX_BUF) { printf("Limita memoriei tampon a fost depaita (%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("Apel euat/inregistrarea nu a fost gasita\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); } CONSULTAI I getservent(3), services(5) TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.06 31 octombrie 2023 getservent_r(3)