.\" -*- 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 man\-pages 6.8" .SH ИМЯ xdr \- библиотечные процедуры для внешнего представления данных .SH LIBRARY Standard C library (\fIlibc\fP, \fI\-lc\fP) .SH "ОБЗОР И ОПИСАНИЕ" Эти процедуры позволяют программистам на C описывать произвольные структуры данных машинонезависимым способом. Данные для дистанционного вызова процедур передаются с помощью этих процедур. .P Представленные ниже прототипы объявлены в \fI\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\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 A filter primitive that translates between C characters and their external representations. This routine returns one if it succeeds, zero otherwise. Note: encoded characters are not packed, and occupy 4 bytes each. For arrays of characters, it is worthwhile to consider \fBxdr_bytes\fP(), \fBxdr_opaque\fP(), or \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(), за исключением того, что может обрабатывать указатели null, в отличие от \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 передается вызывающей процедуре в качестве первого параметра. Замечание: у потока XDR поле \fIop\fP должно быть установлено вызывающим. .IP Предупреждение: для чтения из потока XDR, созданного данным программным интерфейсом, самым первым должен быть вызов \fBxdrrec_skiprecord\fP(). Это вставит дополнительные байты в поток для предоставления информации о границе записи. Также, потоки XDR, созданные разными программными интерфейсами \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 Предупреждение: эта процедура не работает с указателями null. Используйте вместо неё \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 Фильтр\-примитив, преобразует \fIбеззнаковые\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) \fIобъединения\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 , Yuri Kozlov и Иван Павлов . .PP Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, .UR https://www.gnu.org/licenses/gpl-3.0.html .UE версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. .PP Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику по его адресу электронной почты или по адресу .MT списка рассылки русских переводчиков .ME .