.\" -*- coding: UTF-8 -*- '\" t .\" Copyright 2008, Linux Foundation, written by Michael Kerrisk .\" .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH getprotoent_r 3 "20 июля 2023 г." "Linux man\-pages 6.05.01" .SH ИМЯ getprotoent_r, getprotobyname_r, getprotobynumber_r \- возвращают запись о протоколе (реентерабельные версии) .SH LIBRARY Standard C library (\fIlibc\fP, \fI\-lc\fP) .SH СИНТАКСИС .nf \fB#include \fP .PP \fBint getprotoent_r(struct protoent *restrict \fP\fIresult_buf\fP\fB,\fP \fB char \fP\fIbuf\fP\fB[restrict .\fP\fIbuflen\fP\fB], size_t \fP\fIbuflen\fP\fB,\fP \fB struct protoent **restrict \fP\fIresult\fP\fB);\fP \fBint getprotobyname_r(const char *restrict \fP\fIname\fP\fB,\fP \fB struct protoent *restrict \fP\fIresult_buf\fP\fB,\fP \fB char \fP\fIbuf\fP\fB[restrict .\fP\fIbuflen\fP\fB], size_t \fP\fIbuflen\fP\fB,\fP \fB struct protoent **restrict \fP\fIresult\fP\fB);\fP \fBint getprotobynumber_r(int \fP\fIproto\fP\fB,\fP \fB struct protoent *restrict \fP\fIresult_buf\fP\fB,\fP \fB char \fP\fIbuf\fP\fB[restrict .\fP\fIbuflen\fP\fB], size_t \fP\fIbuflen\fP\fB,\fP \fB struct protoent **restrict \fP\fIresult\fP\fB);\fP .PP .fi .RS -4 Требования макроса тестирования свойств для glibc (см. \fBfeature_test_macros\fP(7)): .RE .PP \fBgetprotoent_r\fP(), \fBgetprotobyname_r\fP(), \fBgetprotobynumber_r\fP(): .nf начиная с glibc 2.19: _DEFAULT_SOURCE в glibc 2.19 и старее: _BSD_SOURCE || _SVID_SOURCE .fi .SH ОПИСАНИЕ Функции \fBgetprotoent_r\fP(), \fBgetprotobyname_r\fP() и \fBgetprotobynumber_r\fP() являются реентерабельными эквивалентами \fBgetprotoent\fP(3), \fBgetprotobyname\fP(3) и \fBgetprotobynumber\fP(3), соответственно. Они отличаются способом возврата структуры \fIprotoent\fP, списком параметров и типом возвращаемого значения. В этой справочной странице описаны только различия с нереентерабельными функциями. .PP Вместо возврата указателя на статически выделенную структуру \fIprotoent\fP в качестве результата эти функции копируют структуру в расположение, указанное \fIresult_buf\fP. .PP .\" I can find no information on the required/recommended buffer size; .\" the nonreentrant functions use a 1024 byte buffer. .\" The 1024 byte value is also what the Solaris man page suggests. -- mtk Массив \fIbuf\fP используется для хранения строковых полей из возвращаемой структуры \fIprotoent\fP (нереентерабельные функции выделяют эти строки из статического хранилища). Размер данного массива задаётся в \fIbuflen\fP. Если \fIbuf\fP слишком мал, то вызов завершается с ошибкой \fBERANGE\fP, вызывающий должен его повторить с большим буфером (для большинства приложений должно быть достаточно буфера длиной 1024 байт). .PP Если вызов получил запись о протоколе, то \fI*result\fP указывает на \fIresult_buf\fP; в противном случае \fI*result\fP устанавливается в NULL. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном выполнении эти функции возвращают 0. При ошибке возвращается одно из положительных значений, перечисленных В разделе ОШИБКИ. .PP При ошибке, отсутствии записи (\fBgetprotobyname_r\fP(), \fBgetprotobynumber_r\fP()) или конце данных (\fBgetprotoent_r\fP()) значение \fIresult\fP равно NULL. .SH ОШИБКИ .TP \fBENOENT\fP (\fBgetprotoent_r\fP()) Больше нет записей в базе данных. .TP \fBERANGE\fP Размер \fIbuf\fP слишком мал. Попробуйте ещё раз с большим буфером (и увеличенным значением \fIbuflen\fP). .SH АТРИБУТЫ Описание терминов данного раздела смотрите в \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Интерфейс Атрибут Значение T{ .na .nh \fBgetprotoent_r\fP(), \fBgetprotobyname_r\fP(), \fBgetprotobynumber_r\fP() T} Безвредность в нитях MT\-Safe locale .TE .sp 1 .SH ВЕРСИИ Functions with similar names exist on some other systems, though typically with different calling signatures. .SH СТАНДАРТЫ GNU. .SH ПРИМЕРЫ Программа, представленная ниже, использует \fBgetprotobyname_r\fP() для получения записи о протоколе с именем, указанным в командной строке. Если задан второй параметр (целое), то он используется как начальное значение \fIbuflen\fP; если \fBgetprotobyname_r\fP() завершается с ошибкой \fBERANGE\fP, то программа повторяет попытки с большими значениями буфера. Пара примеров работы в сеансовой оболочке: .PP .in +4n .EX $\fB ./a.out tcp 1\fP ERANGE! Повтор с большим буфером результат getprotobyname_r(): 0 (успешно) (buflen=78) p_name=tcp; p_proto=6; aliases=TCP $\fB ./a.out xxx 1\fP ERANGE! Повтор с большим буфером результат getprotobyname_r(): 0 (успешно) (buflen=100) Ошибка вызова/запись не найдена .EE .in .SS "Исходный код программы" .\" SRC BEGIN (getprotoent_r.c) \& .EX #define _GNU_SOURCE #include #include #include #include #include #include \& #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]\en", argv[0]); exit(EXIT_FAILURE); } \& buflen = 1024; if (argc > 2) buflen = atoi(argv[2]); \& if (buflen > MAX_BUF) { printf("Exceeded buffer limit (%d)\en", 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\en"); 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)\en", MAX_BUF); exit(EXIT_FAILURE); } } } while (s == ERANGE); \& printf("getprotobyname_r() returned: %s (buflen=%d)\en", (s == 0) ? "0 (success)" : (s == ENOENT) ? "ENOENT" : strerror(s), buflen); \& if (s != 0 || result == NULL) { printf("Call failed/record not found\en"); 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("\en"); \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "СМ. ТАКЖЕ" \fBgetprotoent\fP(3), \fBprotocols\fP(5) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Azamat Hackimov , Dmitry Bolkhovskikh , Vladislav , Yuri Kozlov и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .