getprotoent_r(3)

NUME
getprotoent_r, getprotobyname_r, getprotobynumber_r - obține intrarea protocolului (reentrante)

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <netdb.h>

int getprotoent_r(size_t size;
                  struct protoent *restrict result_buf,
                  char buf[restrict size], size_t size,
                  struct protoent **restrict result);
int getprotobyname_r(size_t size;
                  const char *restrict name,
                  struct protoent *restrict result_buf,
                  char buf[restrict size], size_t size,
                  struct protoent **restrict result);
int getprotobynumber_r(size_t size;
                  int proto,
                  struct protoent *restrict result_buf,
                  char buf[restrict size], size_t size,
                  struct protoent **restrict result);

    Cerințe pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultați feature_test_macros(7)):

getprotoent_r(), getprotobyname_r(), getprotobynumber_r():
    Începând cu glibc 2.19:
        _DEFAULT_SOURCE
    glibc 2.19 și versiunile anterioare:
        _BSD_SOURCE || _SVID_SOURCE

DESCRIERE
Funcțiile getprotoent_r(), getprotobyname_r() și getprotobynumber_r() sunt echivalentele reentrante ale funcțiilor getprotoent(3), getprotobyname(3) și getprotobynumber(3). Ele diferă prin modul în care este returnată structura protoent, precum și prin semnătura de apelare a funcției și valoarea de returnare. Această pagină de manual descrie doar diferențele față de funcțiile nereentrante.

În loc să returneze un indicator la o structură protoent alocată static ca rezultat al funcției, aceste funcții copiază structura în locația indicată de result_buf.

Matricea buf este utilizată pentru a stoca câmpurile de șiruri de caractere indicate de structura protoent returnată; (funcțiile nereentrante alocă aceste șiruri de caractere în memoria statică). Dimensiunea acestei matrice este specificată în size. Dacă buf este prea mică, apelul eșuează cu eroarea ERANGE, iar apelantul trebuie să încerce din nou cu o memorie tampon mai mare; (o memorie tampon cu o dimensiune de 1024 octeți ar trebui să fie suficientă pentru majoritatea aplicațiilor).

Dacă apelul funcției obține cu succes o înregistrare de protocol, atunci *result este stabilit la result_buf; în caz contrar, *result este stabilit la NULL.

VALOAREA RETURNATĂ
În caz de succes, aceste funcții returnează 0. În caz de eroare, acestea returnează unul dintre numerele pozitive de eroare enumerate în ERORI.

În caz de eroare, înregistrare nedescoperită (getprotobyname_r(), getprotobynumber_r()), sau sfârșit de intrare (getprotoent_r()) result este stabilit la NULL.

ERORI-IEȘIRE

ENOENT
    (getprotoent_r()) Nu mai există înregistrări în baza de date.

ERANGE
    buf este prea mic. Încercați din nou cu o memorie tampon mai mare (și cu size mărită).

ATRIBUTE
Pentru o explicație a termenilor folosiți în această secțiune, a se vedea attributes(7).
Interfață | Atribut | Valoare
getprotoent_r(), getprotobyname_r(), getprotobynumber_r() | Siguranța firelor | MT-Safe locale

VERSIUNI
Funcții cu nume similare există și pe alte sisteme, deși, de obicei, cu semnături de apelare diferite.

STANDARDE
GNU.

EXEMPLE
Programul de mai jos utilizează getprotobyname_r() pentru a prelua înregistrarea protocolului pentru protocolul numit în primul său argument de linie de comandă. În cazul în care se furnizează un al doilea argument de linie de comandă (întreg), acesta este utilizat ca valoare inițială pentru size; dacă getprotobyname_r() eșuează cu eroarea ERANGE, programul încearcă din nou cu dimensiuni mai mari ale memoriei tampon. Următoarea sesiune shell prezintă câteva exemple de execuție:

    $ ./a.out tcp 1
    ERANGE! Reîncercare cu o memorie tampon mai mare
    getprotobyname_r() returned: 0 (success)  (size=78)
    p_name=tcp; p_proto=6; aliases=TCP
    $ ./a.out xxx 1
    ERANGE! Reîncercare cu o memorie tampon mai mare
    getprotobyname_r() returned: 0 (success)  (size=100)
    Apel eșuat/înregistrarea nu a fost găsită

  Sursa programului
    #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 size, erange_cnt, s;
        struct protoent result_buf;
        struct protoent *result;
        char buf[MAX_BUF];

        if (argc < 2) {
            printf("Utilizare: %s proto-name [size]\n", argv[0]);
            exit(EXIT_FAILURE);
        }

        size = 1024;
        if (argc > 2)
            size = atoi(argv[2]);

        if (size > MAX_BUF) {
            printf("Limita memoriei tampon a fost depășită (%d)\n", MAX_BUF);
            exit(EXIT_FAILURE);
        }

        erange_cnt = 0;
        do {
            s = getprotobyname_r(argv[1], &result_buf,
                                 buf, size, &result);
            if (s == ERANGE) {
                if (erange_cnt == 0)
                    printf("ERANGE! Reîncercare cu o memorie tampon mai mare\n");
                erange_cnt++;

                /* Incrementăm câte un octet pe rând, ca să putem vedea exact
                   ce dimensiune a fost necesară pentru memoria tampon. */

                size++;

                if (size > MAX_BUF) {
                    printf("Limita memoriei tampon a fost depășită (%d)\n", MAX_BUF);
                    exit(EXIT_FAILURE);
                }
            }
        } while (s == ERANGE);

        printf("getprotobyname_r() returned: %s  (size=%d)\n",
               (s == 0) ? "0 (success)" : (s == ENOENT) ? "ENOENT" :
               strerror(s), size);

        if (s != 0 || result == NULL) {
            printf("Apel eșuat/înregistrarea nu a fost găsită\n");
            exit(EXIT_FAILURE);
        }

        printf("p_name=%s; p_proto=%d; aliases=",
               result_buf.p_name, result_buf.p_proto);
        for (char **p = result_buf.p_aliases; *p != NULL; p++)
            printf("%s ", *p);
        printf("\n");

        exit(EXIT_SUCCESS);
    }

CONSULTAȚI ȘI
getprotoent(3), protocols(5)

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.