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

ИМЯ

       getprotoent_r,  getprotobyname_r,  getprotobynumber_r  -  возвращают  запись о протоколе (реентерабельные
       версии)

LIBRARY

       Standard C library (libc, -lc)

СИНТАКСИС

       #include <netdb.h>

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

   Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

       getprotoent_r(), getprotobyname_r(), getprotobynumber_r():
           начиная с glibc 2.19:
               _DEFAULT_SOURCE
           в glibc 2.19 и старее:
               _BSD_SOURCE || _SVID_SOURCE

ОПИСАНИЕ

       Функции   getprotoent_r(),   getprotobyname_r()   и   getprotobynumber_r()   являются    реентерабельными
       эквивалентами   getprotoent(3),  getprotobyname(3)  и getprotobynumber(3), соответственно. Они отличаются
       способом возврата  структуры  protoent,  списком  параметров  и  типом  возвращаемого  значения.  В  этой
       справочной странице описаны только различия с нереентерабельными функциями.

       Вместо  возврата  указателя на статически выделенную структуру protoent в качестве результата эти функции
       копируют структуру в расположение, указанное result_buf.

       Массив  buf  используется   для   хранения   строковых   полей   из   возвращаемой   структуры   protoent
       (нереентерабельные  функции  выделяют  эти  строки  из  статического  хранилища).  Размер данного массива
       задаётся в buflen. Если buf слишком мал, то вызов завершается с ошибкой  ERANGE,  вызывающий  должен  его
       повторить с большим буфером (для большинства приложений должно быть достаточно буфера длиной 1024 байт).

       Если  вызов  получил  запись о протоколе, то  *result указывает на result_buf; в противном случае *result
       устанавливается в NULL.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       При успешном выполнении эти функции возвращают 0. При ошибке возвращается одно из положительных значений,
       перечисленных В разделе ОШИБКИ.

       При   ошибке,   отсутствии   записи   (getprotobyname_r(),   getprotobynumber_r())   или   конце   данных
       (getprotoent_r()) значение result равно NULL.

ОШИБКИ

       ENOENT (getprotoent_r()) Больше нет записей в базе данных.

       ERANGE Размер buf слишком мал. Попробуйте ещё раз с большим буфером (и увеличенным значением buflen).

АТРИБУТЫ

       Описание терминов данного раздела смотрите в attributes(7).
       ┌───────────────────────────────────────────────────────────────┬──────────────────────┬────────────────┐
       │ ИнтерфейсАтрибутЗначение       │
       ├───────────────────────────────────────────────────────────────┼──────────────────────┼────────────────┤
       │ getprotoent_r(), getprotobyname_r(), getprotobynumber_r()     │ Безвредность в нитях │ MT-Safe locale │
       └───────────────────────────────────────────────────────────────┴──────────────────────┴────────────────┘

ВЕРСИИ

       Functions  with  similar  names  exist  on  some  other  systems, though typically with different calling
       signatures.

СТАНДАРТЫ

       GNU.

ПРИМЕРЫ

       Программа, представленная ниже, использует getprotobyname_r() для получения записи о протоколе с  именем,
       указанным  в  командной  строке.  Если  задан  второй  параметр (целое), то он используется как начальное
       значение buflen; если getprotobyname_r() завершается с ошибкой ERANGE, то программа повторяет  попытки  с
       большими значениями буфера. Пара примеров работы в сеансовой оболочке:

           $ ./a.out tcp 1
           ERANGE! Повтор с большим буфером
           результат getprotobyname_r(): 0 (успешно)  (buflen=78)
           p_name=tcp; p_proto=6; aliases=TCP
           $ ./a.out xxx 1
           ERANGE! Повтор с большим буфером
           результат getprotobyname_r(): 0 (успешно)  (buflen=100)
           Ошибка вызова/запись не найдена

   Исходный код программы

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

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

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

           if (buflen > MAX_BUF) {
               printf("Exceeded buffer limit (%d)\n", MAX_BUF);
               exit(EXIT_FAILURE);
           }

           erange_cnt = 0;
           do {
               s = getprotobyname_r(argv[1], &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("getprotobyname_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("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);
       }

СМОТРИТЕ ТАКЖЕ

       getprotoent(3), protocols(5)

ПЕРЕВОД

       Русский  перевод этой страницы руководства разработал Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry
       Bolkhovskikh    <d20052005@yandex.ru>,    Vladislav     <ivladislavefimov@gmail.com>,     Yuri     Kozlov
       <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

       Этот  перевод является свободной программной документацией; он распространяется на условиях общедоступной
       лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html  версии  3  или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

       Если  вы  обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
       разработчику по его адресу электронной почты или по адресу списка рассылки русских переводчиков.

Linux man-pages 6.8                               2 мая 2024 г.                                 getprotoent_r(3)