.\" -*- coding: UTF-8 -*- '\" t .\" This page was taken from the 4.4BSD-Lite CDROM (BSD license) .\" .\" %%%LICENSE_START(BSD_ONELINE_CDROM) .\" This page was taken from the 4.4BSD-Lite CDROM (BSD license) .\" %%%LICENSE_END .\" .\" @(#)xdr.3n 2.2 88/08/03 4.0 RPCSRC; from 1.16 88/03/14 SMI .\" .\" 2007-12-30, mtk, Convert function prototypes to modern C syntax .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH xdr 3 "2 мая 2024 г." "Справочные страницы Linux 6.9.1" .SH НАИМЕНОВАНИЕ xdr \- библиотечные подпрограммы для внешнего представления данных .SH БИБЛИОТЕКА Стандартная библиотека языка C (\fIlibc\fP, \fI\-lc\fP) .SH "ОБЗОР И ОПИСАНИЕ" Эти подпрограммы позволяют программистам на C описывать произвольные структуры данных машинонезависимым способом. Данные для вызовов удалённых процедур передаются с помощью этих подпрограмм. .P Представленные ниже прототипы объявлены в \fI<rpc/xdr.h>\fP и используют следующие типы: .P .RS 4 .EX \fBtypedef int \fP\fIbool_t\fP\fB;\fP .P \fBtypedef bool_t (*\fP\fIxdrproc_t\fP\fB)(XDR *, void *,...);\fP .EE .RE .P Объявление типа данных \fIXDR\fP находится в \fI<rpc/xdr.h>\fP. .P .nf \fBbool_t xdr_array(XDR *\fP\fIxdrs\fP\fB, char **\fP\fIarrp\fP\fB, unsigned int *\fP\fIsizep\fP\fB,\fP \fB unsigned int \fP\fImaxsize\fP\fB, unsigned int \fP\fIelsize\fP\fB,\fP \fB xdrproc_t \fP\fIelproc\fP\fB);\fP .fi .IP Примитив фильтра, который производит преобразования между массивами переменной длины и их внешним представлением. В аргументе \fIarrp\fP указывается адрес указателя на массив, а в \fIsizep\fP — адрес количества элементов в массиве, которое не может превышать значение \fImaxsize\fP. В аргументе \fIelsize\fP указывается \fIsizeof\fP каждого из элементов массива, а в \fIelproc\fP указывается фильтр XDR, который производит преобразования между формой элементов массива, используемой в языке С, и их внешним представлением. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .P .nf \fBbool_t xdr_bool(XDR *\fP\fIxdrs\fP\fB, bool_t *\fP\fIbp\fP\fB);\fP .fi .IP Примитив фильтра, который производит преобразования между логическими переменными (целочисленные в С) и их внешним представлением. Перекодируя данные, этот фильтр присваивает им значения, равные либо единице, либо нулю. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .P .nf \fBbool_t xdr_bytes(XDR *\fP\fIxdrs\fP\fB, char **\fP\fIsp\fP\fB, unsigned int *\fP\fIsizep\fP\fB,\fP \fB unsigned int \fP\fImaxsize\fP\fB);\fP .fi .IP Примитив фильтра, который производит преобразования между строками известной длины и их внешним представлением. В аргументе \fIsp\fP указывается адрес указателя строки. Длина строки должна находиться по адресу, указанному в \fIsizep\fP; строки не могут быть длиннее \fImaxsize\fP. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .P .nf \fBbool_t xdr_char(XDR *\fP\fIxdrs\fP\fB, char *\fP\fIcp\fP\fB);\fP .fi .IP Примитив фильтра, который производит преобразования между символьными значениями языка C и их внешним представлением. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. Замечание: закодированные символы не упакованы, и каждый занимает 4 байта. В случае с массивом символов целесообразнее использовать \fBxdr_bytes\fP(), \fBxdr_opaque\fP() или \fBxdr_string\fP(). .P .nf \fBvoid xdr_destroy(XDR *\fP\fIxdrs\fP\fB);\fP .fi .IP Макрос, который запускает подпрограмму уничтожения, привязанную к XDR\-потоку \fIxdrs\fP. Уничтожение обычно включает в себя освобождение закрытых структур данных, связанных с потоком. При использовании \fIxdrs\fP после вызова \fBxdr_destroy\fP() результат не определён. .P .nf \fBbool_t xdr_double(XDR *\fP\fIxdrs\fP\fB, double *\fP\fIdp\fP\fB);\fP .fi .IP Примитив фильтра, который производит преобразования между значениями типа \fIdouble\fP языка C и их внешним представлением. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .P .nf \fBbool_t xdr_enum(XDR *\fP\fIxdrs\fP\fB, enum_t *\fP\fIep\fP\fB);\fP .fi .IP Примитив фильтра, который производит преобразования между значениями типа \fIenum\fP (являющимися по сути целыми числами) языка C и их внешним представлением. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .P .nf \fBbool_t xdr_float(XDR *\fP\fIxdrs\fP\fB, float *\fP\fIfp\fP\fB);\fP .fi .IP Примитив фильтра, который производит преобразования между значения типа \fIfloat\fP языка C и их внешним представлением. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .P .nf \fBvoid xdr_free(xdrproc_t \fP\fIproc\fP\fB, char *\fP\fIobjp\fP\fB);\fP .fi .IP Общая подпрограмма освобождения памяти. Первым аргументом является подпрограмма XDR для освобождаемого объекта; вторым — указатель на сам объект. Замечание: сам указатель, переданный этой подпрограмме, \fIне\fP освобождается, освобождается (рекурсивно) объект, на который он \fIуказывает\fP. .P .nf \fBunsigned int xdr_getpos(XDR *\fP\fIxdrs\fP\fB);\fP .fi .IP Макрос, который запускает связанную с XDR\-потоком \fIxdrs\fP подпрограмму получения позиции. Данная подпрограмма возвращает беззнаковое целое, которое указывает на позицию в потоке байтов XDR. Одна особенность, которой потоки XDR желательно должны обладать, — это возможность производить с этим числом простые арифметические операции, хотя экземпляры потоков XDR и не обязаны гарантировать это. .P .nf \fBlong *xdr_inline(XDR *\fP\fIxdrs\fP\fB, int \fP\fIlen\fP\fB);\fP .fi .IP Макрос, который запускает подпрограмму встраивания, связанную с XDR\-потоком \fIxdrs\fP. Данная подпрограмма возвращает указатель на непрерывную часть буфера потока; в \fIlen\fP задаётся длина нужного буфера в байтах. Замечание: указатель приводится к типу \fIlong\ *\fP. .IP Предупреждение: \fBxdr_inline\fP() может возвращать NULL (0), если не удастся выделить память под непрерывный кусок буфера. Так что, поведение в разных экземплярах потока может отличаться; эта подпрограмма существует прежде всего для обеспечения возможности оптимизации. .P .nf \fBbool_t xdr_int(XDR *\fP\fIxdrs\fP\fB, int *\fP\fIip\fP\fB);\fP .fi .IP Примитив фильтра, который производит преобразования между целочисленными значениями языка C и их внешним представлением. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .P .nf \fBbool_t xdr_long(XDR *\fP\fIxdrs\fP\fB, long *\fP\fIlp\fP\fB);\fP .fi .IP Примитив фильтра, который производит преобразования между целочисленными значениями типа \fIlong\fP языка C и их внешним представлением. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .P .nf \fBvoid xdrmem_create(XDR *\fP\fIxdrs\fP\fB, char *\fP\fIaddr\fP\fB, unsigned int \fP\fIsize\fP\fB,\fP \fB enum xdr_op \fP\fIop\fP\fB);\fP .fi .IP Эта подпрограмма инициализирует объект потока XDR, на который указывает \fIxdrs\fP. Данные потока записываются в участок памяти (или считываются из него), находящийся по адресу \fIaddr\fP и длина которого не больше \fIsize\fP байт. Аргумент \fIop\fP определяет направление потока XDR (одно из: \fBXDR_ENCODE\fP, \fBXDR_DECODE\fP или \fBXDR_FREE\fP). .P .nf \fBbool_t xdr_opaque(XDR *\fP\fIxdrs\fP\fB, char *\fP\fIcp\fP\fB, unsigned int \fP\fIcnt\fP\fB);\fP .fi .IP Примитив фильтра, который производит преобразования между непрозрачными данными фиксированного размера и их внешним представлением. В аргументе \fIcp\fP указывается адрес непрозрачных данных, а в \fIcnt\fP указывается их размер в байтах. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .P .nf \fBbool_t xdr_pointer(XDR *\fP\fIxdrs\fP\fB, char **\fP\fIobjpp\fP\fB,\fP \fB unsigned int \fP\fIobjsize\fP\fB, xdrproc_t \fP\fIxdrobj\fP\fB);\fP .fi .IP Работает аналогично \fBxdr_reference\fP(), за исключением того, что в отличие от \fBxdr_reference\fP() она может обрабатывать нулевые указатели. Таким образом, \fBxdr_pointer\fP() может представлять такие рекурсивные структуры данных, как например, двоичные деревья или связные списки. .P .nf \fBvoid xdrrec_create(XDR *\fP\fIxdrs\fP\fB, unsigned int \fP\fIsendsize\fP\fB,\fP \fB unsigned int \fP\fIrecvsize\fP\fB, char *\fP\fIhandle\fP\fB,\fP \fB int (*\fP\fIreadit\fP\fB)(char *, char *, int),\fP \fB int (*\fP\fIwriteit\fP\fB)(char *, char *, int));\fP .fi .IP Эта подпрограмма инициализирует объект потока XDR, на который указывает \fIxdrs\fP. Данные потока записываются в буфер размером \fIsendsize\fP; значение ноль указывает на то, что система должна использовать подходящее значение по умолчанию. Данные потока считываются из буфера размером \fIrecvsize\fP, для которого также можно указать значение ноль для использования подходящего значения по умолчанию. Когда буфер записи потока заполнен, вызывается \fIwriteit\fP. Аналогично, когда буфер чтения потока пуст, вызывается \fIreadit\fP. Поведение этих двух подпрограмм аналогично системным вызовам \fBread\fP(2) и \fBwrite\fP(2), за исключением того, что в качестве первого аргумента в эти подпрограммы передаётся \fIhandle\fP. Замечание: поле \fIop\fP потока XDR должно быть установлено вызывающим. .IP Предупреждение: для чтения из потока XDR, созданного данным программным интерфейсом, вы должны сначала вызвать \fBxdrrec_skiprecord\fP(), прежде чем производить какие\-либо другие API\-вызовы XDR. Это вставляет дополнительные байты в поток для предоставления информации о границе записи. Кроме того, потоки XDR, созданные разными API\-функциями \fBxdr*_create\fP, несовместимы по этой же причине. .P .nf \fBbool_t xdrrec_endofrecord(XDR *\fP\fIxdrs\fP\fB, int \fP\fIsendnow\fP\fB);\fP .fi .IP Эту подпрограмму можно вызывать только для потоков, созданных \fBxdrrec_create\fP(). Данные в буфере вывода помечаются как законченная запись и, если параметр \fIsendnow\fP не равен нулю, буфер вывода записывается и отправляется. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .P .nf \fBbool_t xdrrec_eof(XDR *\fP\fIxdrs\fP\fB);\fP .fi .IP Эту подпрограмму можно вызывать только для потоков, созданных \fBxdrrec_create\fP(). Подпрограмма поглощает остаток текущей записи в данном потоке и возвращает 1, если на входе потока нет больше данных; иначе возвращается 0. .P .nf \fBbool_t xdrrec_skiprecord(XDR *\fP\fIxdrs\fP\fB);\fP .fi .IP Эту подпрограмму можно вызывать только для потоков, созданных \fBxdrrec_create\fP(). Она сообщает реализации XDR, что оставшаяся часть текущей записи в буфере ввода потока должна быть отброшена. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .P .nf \fBbool_t xdr_reference(XDR *\fP\fIxdrs\fP\fB, char **\fP\fIpp\fP\fB, unsigned int \fP\fIsize\fP\fB,\fP \fB xdrproc_t \fP\fIproc\fP\fB);\fP .fi .IP Примитив, который предоставляет перемещение по указателям внутри структур. В аргументе \fIpp\fP передаётся адрес указателя; в \fIsize\fP задаётся размер (\fIsizeof\fP) структуры, на которую указывает \fI*pp\fP; в \fIproc\fP указывается процедура\-фильтр XDR, которая производит преобразование между структурой языка С и её внешним представлением. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .IP Предупреждение: эта подпрограмма не работает с нулевыми указателями. Используйте вместо неё \fBxdr_pointer\fP(). .P .nf \fBxdr_setpos(XDR *\fP\fIxdrs\fP\fB, unsigned int \fP\fIpos\fP\fB);\fP .fi .IP Макрос, который запускает подпрограмму установки позиции, связанную с XDR\-потоком \fIxdrs\fP. В аргументе \fIpos\fP задаётся значение позиции, полученное с помощью \fBxdr_getpos\fP(). Данная подпрограмма возвращает 1, если по потоку XDR можно перемещаться, иначе 0. .IP Предупреждение: в некоторых типах потоков XDR бывает трудно изменить позицию, так что эта подпрограмма может завершиться неудачей при работе с одним типом потоков, но успешно работать с другим. .P .nf \fBbool_t xdr_short(XDR *\fP\fIxdrs\fP\fB, short *\fP\fIsp\fP\fB);\fP .fi .IP Примитив фильтра, который производит преобразования между целочисленными значения типа \fIshort\fP языка C и их внешним представлением. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .P .nf \fBvoid xdrstdio_create(XDR *\fP\fIxdrs\fP\fB, FILE *\fP\fIfile\fP\fB, enum xdr_op \fP\fIop\fP\fB);\fP .fi .IP Эта процедура инициализирует объект потока XDR, на который указывает \fIxdrs\fP. Данные потока XDR записываются в или считываются из потока \fIstdio\fP, указанного в \fIfile\fP. Аргумент \fIop\fP определяет направление потока XDR (одно из: \fBXDR_ENCODE\fP, \fBXDR_DECODE\fP или \fBXDR_FREE\fP). .IP Предупреждение: процедура уничтожения, связанная с такими потоками XDR, вызывает \fBfflush\fP(3) для потока \fIfile\fP, но никогда не вызывает \fBfclose\fP(3). .P .nf \fBbool_t xdr_string(XDR *\fP\fIxdrs\fP\fB, char **\fP\fIsp\fP\fB, unsigned int \fP\fImaxsize\fP\fB);\fP .fi .IP Примитив фильтра, который производит преобразования между строками языка C и их внешним представлением. Длина строк не может быть больше \fImaxsize\fP. Замечание: значение \fIsp\fP представляет собой адрес указателя на строку. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .P .nf \fBbool_t xdr_u_char(XDR *\fP\fIxdrs\fP\fB, unsigned char *\fP\fIucp\fP\fB);\fP .fi .IP Примитив фильтра, который производит преобразования между значениями беззнакового (\fIunsigned\fP) символьного типа языка C и их внешним представлением. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .P .nf \fBbool_t xdr_u_int(XDR *\fP\fIxdrs\fP\fB, unsigned int *\fP\fIup\fP\fB);\fP .fi .IP Примитив фильтра, который производит преобразования между беззнаковыми целочисленными значения типа \fIunsigned\fP языка C и их внешним представлением. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .P .nf \fBbool_t xdr_u_long(XDR *\fP\fIxdrs\fP\fB, unsigned long *\fP\fIulp\fP\fB);\fP .fi .IP Примитив фильтра, который производит преобразования между беззнаковыми целочисленными значения типа \fIunsigned long\fP языка C и их внешним представлением. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .P .nf \fBbool_t xdr_u_short(XDR *\fP\fIxdrs\fP\fB, unsigned short *\fP\fIusp\fP\fB);\fP .fi .IP Примитив фильтра, который производит преобразования между беззнаковыми целочисленными значения типа \fIunsigned short\fP языка C и их внешним представлением. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .P .nf \fBbool_t xdr_union(XDR *\fP\fIxdrs\fP\fB, enum_t *\fP\fIdscmp\fP\fB, char *\fP\fIunp\fP\fB,\fP \fB const struct xdr_discrim *\fP\fIchoices\fP\fB,\fP \fB xdrproc_t \fP\fIdefaultarm\fP\fB); /* may equal NULL */\fP .fi .IP Примитив фильтра, который производит преобразования между размеченными объединениями (discriminated \fIunion\fP) языка C и их внешним представлением. Сначала преобразуется метка объединения, расположенная в \fIdscmp\fP. Эта метка всегда должна иметь тип \fIenum_t\fP. Затем преобразуется само объединение, расположенное по адресу \fIunp\fP. Аргумент \fIchoices\fP представляет собой указатель на массив структур \fBxdr_discrim\fP(). Каждая структура содержит упорядоченную пару [\fIзначение\fP,\fIпроцедура\fP]. Если метка объединения равна соответствующему \fIзначению\fP, то для преобразования объединения вызывается соответствующая ей \fIпроцедура\fP. Конец массива структур \fBxdr_discrim\fP() обозначается процедурой со значением NULL. Если метка не найдена в массиве \fIchoices\fP, то вызывается процедура \fIdefaultarm\fP (если данное значение не равно NULL). Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .P .nf \fBbool_t xdr_vector(XDR *\fP\fIxdrs\fP\fB, char *\fP\fIarrp\fP\fB, unsigned int \fP\fIsize\fP\fB,\fP \fB unsigned int \fP\fIelsize\fP\fB, xdrproc_t \fP\fIelproc\fP\fB);\fP .fi .IP Примитив фильтра, который производит преобразования между массивами фиксированной длины и их внешним представлением. В аргументе \fIarrp\fP указывается адрес указателя на массив, а в \fIsize\fP — адрес количества элементов в массиве. В аргументе \fIelsize\fP указывается \fIsizeof\fP каждого из элементов массива, а в \fIelproc\fP указывается фильтр XDR, который производит преобразования между формой элементов массива, используемой в языке С, и их внешним представлением. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .P .nf \fBbool_t xdr_void(void);\fP .fi .IP Данная подпрограмма всегда возвращает 1. Её можно передавать другим подпрограммам RPC, которые обязательно требуют функцию в качестве аргумента, когда никаких действий производить на самом деле не требуется. .P .nf \fBbool_t xdr_wrapstring(XDR *\fP\fIxdrs\fP\fB, char **\fP\fIsp\fP\fB);\fP .fi .IP Примитив, вызывающий \fBxdr_string(xdrs, sp, MAXUN.UNSIGNED)\fP; где \fBMAXUN.UNSIGNED\fP равно максимальному значению беззнакового целого. Функцию \fBxdr_wrapstring\fP() иногда удобно использовать, потому что в пакете RPC в качестве аргументов передаётся максимум две процедуры XDR, а для \fBxdr_string\fP(), одного из наиболее часто используемых примитивов, требуется три. Данная подпрограмма возвращает 1 при успешном завершении, иначе 0. .SH АТРИБУТЫ Описание терминов данного раздела смотрите в \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Интерфейс Атрибут Значение T{ .na .nh \fBxdr_array\fP(), \fBxdr_bool\fP(), \fBxdr_bytes\fP(), \fBxdr_char\fP(), \fBxdr_destroy\fP(), \fBxdr_double\fP(), \fBxdr_enum\fP(), \fBxdr_float\fP(), \fBxdr_free\fP(), \fBxdr_getpos\fP(), \fBxdr_inline\fP(), \fBxdr_int\fP(), \fBxdr_long\fP(), \fBxdrmem_create\fP(), \fBxdr_opaque\fP(), \fBxdr_pointer\fP(), \fBxdrrec_create\fP(), \fBxdrrec_eof\fP(), \fBxdrrec_endofrecord\fP(), \fBxdrrec_skiprecord\fP(), \fBxdr_reference\fP(), \fBxdr_setpos\fP(), \fBxdr_short\fP(), \fBxdrstdio_create\fP(), \fBxdr_string\fP(), \fBxdr_u_char\fP(), \fBxdr_u_int\fP(), \fBxdr_u_long\fP(), \fBxdr_u_short\fP(), \fBxdr_union\fP(), \fBxdr_vector\fP(), \fBxdr_void\fP(), \fBxdr_wrapstring\fP() T} Безвредность в нитях MT\-Safe .TE .SH "СМОТРИТЕ ТАКЖЕ" \fBrpc\fP(3) .P Следующие руководства: .RS Стандарт представления внешних данных: спецификация протокола .br Представление внешних данных: технические замечания Sun. .br \fIXDR: External Data Representation Standard\fP, RFC\ 1014, Sun Microsystems, Inc., USC\-ISI. .RE .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства разработал(и) Azamat Hackimov <azamat.hackimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com>, Kirill Rekhov <krekhov.dev@gmail.com> и Alexander Golubev <fatzer2@gmail.com> . .PP Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, .UR https://www.gnu.org/licenses/gpl-3.0.html .UE версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. .PP Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу .MT <debian-l10n-russian@lists.debian.org> списка рассылки русских переводчиков .ME .