getprotoent_r(3) Library Functions Manual getprotoent_r(3)

ИМЯ

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

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.

ОШИБКИ

(getprotoent_r()) Больше нет записей в базе данных.
Размер 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 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

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

2 мая 2024 г. Linux man-pages 6.8