.\" -*- coding: UTF-8 -*- .\" 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 .\" .\" @(#)rpc.3n 2.4 88/08/08 4.0 RPCSRC; from 1.19 88/06/24 SMI .\" .\" 2007-12-30, mtk, Convert function prototypes to modern C syntax .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH RPC 3 "1 ноября 2020 г." "" "Руководство программиста Linux" .SH ИМЯ rpc \- библиотечные функции для вызова удалённых процедур .SH "ОБЗОР И ОПИСАНИЕ" .\" .LP .\" We don't have an rpc_secure.3 page at the moment -- MTK, 19 Sep 05 .\" Routines that are used for Secure RPC (DES authentication) are described in .\" .BR rpc_secure (3). .\" Secure RPC can be used only if DES encryption is available. Эти функции позволяют программам, созданным на Си, вызывать удалённые процедуры на других машинах в сети. Сначала, клиент вызывает процедуру путём отправки пакета с данными на сервер. После принятия пакета сервер вызывает функцию распределения (dispatch) для выполнения запрошенной службы и отсылает ответ обратно. Последним действием результат выполнения процедуры возвращается клиенту. .PP Чтобы использовать эти функции, включите заголовочный файл \fI\fP. Представленные ниже прототипы позволяют использовать следующие типы: .PP .RS 4 .EX \fBtypedef int \fP\fIbool_t\fP\fB;\fP .PP \fBtypedef bool_t (*\fP\fIxdrproc_t\fP\fB) (XDR *, void *, ...);\fP .PP \fBtypedef bool_t (*\fP\fIresultproc_t\fP\fB) (caddr_t \fP\fIresp\fP\fB,\fP \fB struct sockaddr_in *\fP\fIraddr\fP\fB);\fP .EE .RE .PP Объявления типов \fIAUTH\fP, \fICLIENT\fP, \fISVCXPRT\fP и \fIXDR\fP смотрите в заголовочных файлах. .PP .nf \fBvoid auth_destroy(AUTH *\fP\fIauth\fP\fB);\fP .fi .IP Макрос, который уничтожает аутентификационную информацию, связанную с \fIauth\fP. Уничтожение, обычно, вызывает высвобождение скрытых структур данных. Работа с \fIauth\fP после вызова \fBauth_destroy\fP() не описана. .PP .nf \fBAUTH *authnone_create(void);\fP .fi .IP Создаёт и возвращает аутентификационный описатель RPC, который передаёт непригодную аутентификационную информацию с каждым вызовом удалённой процедуры. Данная аутентификация используется в RPC по умолчанию. .PP .nf \fBAUTH *authunix_create(char *\fP\fIhost\fP\fB, int \fP\fIuid\fP\fB, int \fP\fIgid\fP\fB,\fP \fB int \fP\fIlen\fP\fB, int *\fP\fIaup_gids\fP\fB);\fP .fi .IP Создаёт и возвращает аутентификационный описатель RPC, который содержит аутентификационную информацию. В параметре \fIhost\fP содержится имя машины, на которой была создана информация; в \fIuid\fP содержится пользовательский идентификатор; в \fIgid\fP содержится идентификатор текущей группы пользователя; значения \fIlen\fP и \fIaup_gids\fP описывают обновляемый (counted) массив групп, к которым принадлежит пользователь. Это упрощает персонализацию пользователя. .PP .nf \fBAUTH *authunix_create_default(void);\fP .fi .IP Вызывает \fBauthunix_create\fP() с соответствующими параметрами. .PP .nf \fBint callrpc(char *\fP\fIhost\fP\fB, unsigned long \fP\fIprognum\fP\fB,\fP \fB unsigned long \fP\fIversnum\fP\fB, unsigned long \fP\fIprocnum\fP\fB,\fP \fB xdrproc_t \fP\fIinproc\fP\fB, char *\fP\fIin\fP\fB,\fP \fB xdrproc_t \fP\fIoutproc\fP\fB, char *\fP\fIout\fP\fB);\fP .fi .IP Вызывает удалённую процедуру, связанную с \fIprognum\fP, \fIversnum\fP и \fIprocnum\fP на машине \fIhost\fP. В параметре \fIin\fP передаётся адрес параметров процедуры, в \fIout\fP — адрес, по которому должен помещаться результат; \fIinproc\fP используется для кодирования параметров процедуры, а \fIoutproc\fP — для декодирования результатов. При успешном выполнении эта функция возвращает 0 или целое значение в \fBenum clnt_stat\fP при ошибке. Для перевода номера ошибки в сообщение об ошибке можно использовать функцию \fBclnt_perrno\fP(). .IP Предупреждение: при вызове удалённой процедуры с помощью данной функции для передачи используется протокол UDP/IP; ограничения смотрите в описании \fBclntudp_create\fP(). При использовании данной функции вы не можете управлять задержкой или аутентификацией. .PP .nf \fBenum clnt_stat clnt_broadcast(unsigned long \fP\fIprognum\fP\fB,\fP \fB unsigned long \fP\fIversnum\fP\fB, unsigned long \fP\fIprocnum\fP\fB,\fP \fB xdrproc_t \fP\fIinproc\fP\fB, char *\fP\fIin\fP\fB,\fP \fB xdrproc_t \fP\fIoutproc\fP\fB, char *\fP\fIout\fP\fB,\fP \fB resultproc_t \fP\fIeachresult\fP\fB);\fP .fi .IP Подобна \fBcallrpc\fP(), только сообщение посылается как широковещательное во все локально подключённые сети. Каждый раз при получении ответа эта функция вызывает \fBeachresult\fP() следующего вида: .IP .in +4n .EX \fBeachresult(char *\fP\fIout\fP\fB, struct sockaddr_in *\fP\fIaddr\fP\fB);\fP .EE .in .IP где \fIout\fP — тот же самый параметр \fIout\fP, переданный в \fBclnt_broadcast\fP(), за исключением того, что результат удалённой процедуры сразу же декодируется; \fIaddr\fP указывает на адрес машины, которая послала результат. Если \fBeachresult\fP() возвращает 0, то \fBclnt_broadcast\fP() продолжит ждать ответы; в противном случае она возвращает соответствующий статус. .IP Предупреждение: размер широковещательных сокетов ограничен максимальной единицей передачи данных подключения. Для ethernet это значение равно 1500 байтам. .PP .nf \fBenum clnt_stat clnt_call(CLIENT *\fP\fIclnt\fP\fB, unsigned long \fP\fIprocnum\fP\fB,\fP \fB xdrproc_t \fP\fIinproc\fP\fB, char *\fP\fIin\fP\fB,\fP \fB xdrproc_t \fP\fIoutproc\fP\fB, char *\fP\fIout\fP\fB,\fP \fB struct timeval \fP\fItout\fP\fB);\fP .fi .IP Макрос, который вызывает удалённую процедуру \fIprocnum\fP, связанную с клиентским описателем \fIclnt\fP, полученным от функции создания клиента RPC, такой как \fBclnt_create\fP(). Параметр \fIin\fP — адрес аргументов процедуры, а \fIout\fP — адрес, по которому размещается результат; \fIinproc\fP используется для кодирования параметров процедуры, а \fIoutproc\fP используется для декодирования её результатов; \fItout\fP — допустимое время ожидания результатов. .PP .nf \fBclnt_destroy(CLIENT *\fP\fIclnt\fP\fB);\fP .fi .IP Макрос, который уничтожает клиентский описатель RPC. Уничтожение, обычно, затрагивает скрытые структуры данных, включая сам \fIclnt\fP. Работа с \fIclnt\fP после вызова \fBclnt_destroy\fP() не описана. Если библиотека RPC открывала связанный сокет, он также будет закрыт. В противном случае сокет останется открытым. .PP .nf \fBCLIENT *clnt_create(char *\fP\fIhost\fP\fB, unsigned long \fP\fIprog\fP\fB,\fP \fB unsigned long \fP\fIvers\fP\fB, char *\fP\fIproto\fP\fB);\fP .fi .IP Основная функция для создания клиента. В \fIhost\fP указывается имя удалённой машины, где где расположен сервер. В \fIproto\fP указывается тип протокола передачи, который будет использован. Поддерживаемые значения этого поля: «udp» и «tcp». Время задержки задаётся значением по умолчанию, но может быть изменено с помощью \fBclnt_control\fP(). .IP Предупреждение: использование UDP имеет недостатки. Так как в сообщениях RPC на основе UDP может быть только 8 КБ закодированных данных, этот протокол не может быть использован для процедур с большим количеством параметров или которые возвращают результат большого размера. .PP .nf \fBbool_t clnt_control(CLIENT *\fP\fIcl\fP\fB, int \fP\fIreq\fP\fB, char *\fP\fIinfo\fP\fB);\fP .fi .IP Макрос, используемый для изменения или получения различной информации о клиентском объекте. В \fIreq\fP указывается тип операции, а в \fIinfo\fP — указатель на информацию. Для UDP и TCP поддерживаются следующие значения \fIreq\fP и их типы параметров: .IP .in +4n .EX // назначить общее время ожидания \fBCLSET_TIMEOUT\fP \fIstruct timeval\fP // получить общее время ожидания \fBCLGET_TIMEOUT\fP \fIstruct timeval\fP .EE .in .IP Замечание: если вы установили время ожидания с помощью \fBclnt_control\fP(), то параметр времени ожидания, передаваемый \fBclnt_call\fP(), будет игнорироваться во всех будущих вызовах. .IP .in +4n .EX \fBCLGET_SERVER_ADDR\fP \fIstruct sockaddr_in \fP // get server\(aqs address .EE .in .IP Следующие операции действительны только для UDP: .IP .in +4n .EX // назначить повторное время ожидания \fBCLSET_RETRY_TIMEOUT\fP \fIstruct timeval\fP // получить повторное время ожидания \fBCLGET_RETRY_TIMEOUT\fP \fIstruct timeval\fP .EE .in .IP Повторное время — это время, в течение которого «UDP RPC» ждёт ответа от сервера перед повторной отправкой запроса. .PP .nf \fBclnt_freeres(CLIENT * \fP\fIclnt\fP\fB, xdrproc_t \fP\fIoutproc\fP\fB, char *\fP\fIout\fP\fB);\fP .fi .IP Макрос, который освобождает любые данные, размещаемые системой RPC/XDR, когда она декодирует результаты вызова RPC. Параметр \fIout\fP — адрес результатов, а \fIoutproc\fP — функция XDR, описывающая результаты. Эта функция возвращает 1, если результаты были успешно освобождены и 0 в противном случае. .PP .nf \fBvoid clnt_geterr(CLIENT *\fP\fIclnt\fP\fB, struct rpc_err *\fP\fIerrp\fP\fB);\fP .fi .IP Макрос, который копирует структуру ошибки клиентского описателя в структуру по адресу \fIerrp\fP. .PP .nf \fBvoid clnt_pcreateerror(char *\fP\fIs\fP\fB);\fP .fi .IP Выводит в стандартный поток ошибок сообщение, описывающее почему клиентский описатель RPC не удалось создать. В начало сообщения добавляется строка \fIs\fP и знак двоеточия. Используется при ошибках в функциях \fBclnt_create\fP(), \fBclntraw_create\fP(), \fBclnttcp_create\fP() или \fBclntudp_create\fP(). .PP .nf \fBvoid clnt_perrno(enum clnt_stat \fP\fIstat\fP\fB);\fP .fi .IP Выводит в стандартный поток ошибок сообщение согласно условию, указанному в \fIstat\fP. Используется после \fBcallrpc\fP(). .PP .nf \fBclnt_perror(CLIENT *\fP\fIclnt\fP\fB, char *\fP\fIs\fP\fB);\fP .fi .IP Выводит в стандартный поток ошибок сообщение, описывающее почему вызов RPC завершился с ошибкой. Значение \fIclnt\fP — описатель, использовавшийся при вызове. В начало сообщения добавляется строка \fIs\fP и знак двоеточия. Используется после \fBclnt_call\fP(). .PP .nf \fBchar *clnt_spcreateerror(char *\fP\fIs\fP\fB);\fP .fi .IP Похожа на \fBclnt_pcreateerror\fP(), но возвращает строку вместо вывода в стандартный поток ошибок. .IP Дефекты: возвращается указатель на статические данные, которые переписываются при каждом вызове. .PP .nf \fBchar *clnt_sperrno(enum clnt_stat \fP\fIstat\fP\fB);\fP .fi .IP Получает те же аргументы, что и \fBclnt_perrno\fP(), но вместо отправки в стандартный поток ошибок сообщения, которое показывает почему вызов RPC завершился с ошибкой, возвращает указатель на строку с сообщением. Строка заканчивается символом NEWLINE. .IP Функция \fBclnt_sperrno\fP() используется вместо \fBclnt_perrno\fP(), если программа не имеет стандартного потока ошибок (для программ, запущенных как сервер), или если программист не хочет выводить сообщения с помощью \fBprintf\fP(3), или если формат сообщения отличается от формата, поддерживаемого \fBclnt_perrno\fP(). Замечание: в отличие от \fBclnt_sperror\fP() и \fBclnt_spcreateerror\fP(), \fBclnt_sperrno\fP() возвращает указатель на статические данные, но результат не будет переписан при каждом вызове. .PP .nf \fBchar *clnt_sperror(CLIENT *\fP\fIrpch\fP\fB, char *\fP\fIs\fP\fB);\fP .fi .IP Похожа на \fBclnt_perror\fP(), но (подобно \fBclnt_sperrno\fP()) возвращает строку вместо вывода сообщения в стандартный поток ошибок. .IP Дефекты: возвращается указатель на статические данные, которые переписываются при каждом вызове. .PP .nf \fBCLIENT *clntraw_create(unsigned long \fP\fIprognum\fP\fB, unsigned long \fP\fIversnum\fP\fB);\fP .fi .IP Эта функция создаёт игрушечного клиента RPC для удалённой программы \fIprognum\fP версии \fIversnum\fP. Протокол, используемый для пересылки сообщения службе, на самом деле является буфером внутри адресного пространства процесса, поэтому соответствующий сервер RPC должен находиться в том же адресном пространстве; смотрите \fBsvcraw_create\fP(). Он позволяет имитировать RPC и временные задержки без какого\-либо участия ядра. При ошибке эта функция возвращает NULL.. .PP .nf \fBCLIENT *clnttcp_create(struct sockaddr_in *\fP\fIaddr\fP\fB,\fP \fB unsigned long \fP\fIprognum\fP\fB, unsigned long \fP\fIversnum\fP\fB,\fP \fB int *\fP\fIsockp\fP\fB, unsigned int \fP\fIsendsz\fP\fB, unsigned int \fP\fIrecvsz\fP\fB);\fP .fi .IP .\"The following inline font conversion is necessary for the hyphen indicator Эта функция создаёт клиента RPC для удалённой программы \fIprognum\fP, версии \fIversnum\fP; для передачи клиент использует протокол TCP/IP. Удалённая программа расположена по интернет\-адресу \fI*addr\fP. Если значение \fIaddr\->sin_port\fP равно 0, тогда ему назначается реальный порт, который прослушивается удалённой программой (эта информация запрашивается у удалённой службы \fIportmap\fP). Параметр \fIsockp\fP — сокет; если его значение равно \fBRPC_ANYSOCK\fP, тогда эта функция открывает новый сокет и изменяет \fIsockp\fP. Так как в RPC на основе TCP используется буферизация ввода\-вывода, пользователь может задать размер посылаемых и получаемых буферов с помощью параметров \fIsendsz\fP и \fIrecvsz\fP; при значении 0 выбираются подходящие величины по умолчанию. При ошибке эта функция возвращает NULL. .PP .nf \fBCLIENT *clntudp_create(struct sockaddr_in *\fP\fIaddr\fP\fB,\fP \fB unsigned long \fP\fIprognum\fP\fB, unsigned long \fP\fIversnum\fP\fB,\fP \fB struct timeval \fP\fIwait\fP\fB, int *\fP\fIsockp\fP\fB);\fP .fi .IP Эта функция создаёт клиента RPC для удалённой программы \fIprognum\fP версии \fIversnum\fP; для передачи клиент использует протокол UDP/IP. Удалённая программа расположена по интернет\-адресу \fI*addr\fP. Если \fIaddr\->sin_port\fP равно 0, тогда ему назначается реальный порт, который прослушивается удалённой программой (эта информация запрашивается у удалённой службы \fIportmap\fP). Параметр \fIsockp\fP — сокет; если его значение равно \fBRPC_ANYSOCK\fP, тогда эта функция открывает новый сокет и изменяет \fIsockp\fP. Протокол UDP повторяет отправку сообщения через интервал, указанный в параметре \fIwait\fP, пока не будет получен ответ или не истечёт время ожидания. Полное время ожидания вызова определяется \fBclnt_call\fP(). .IP Предупреждение: так как в сообщениях RPC на основе UDP может быть только 8 КБ закодированных данных, этот протокол не может быть использован для процедур с большим количеством параметров или которые возвращают результат большого размера. .PP .nf \fBCLIENT *clntudp_bufcreate(struct sockaddr_in *\fP\fIaddr\fP\fB,\fP \fB unsigned long \fP\fIprognum\fP\fB, unsigned long \fP\fIversnum\fP\fB,\fP \fB struct timeval \fP\fIwait\fP\fB, int *\fP\fIsockp\fP\fB,\fP \fB unsigned int \fP\fIsendsize\fP\fB, unsigned int \fP\fIrecosize\fP\fB);\fP .fi .IP Эта функция создаёт клиента RPC для удалённой программы \fIprognum\fP версии \fIversnum\fP; для передачи клиент использует протокол UDP/IP. Удалённая программа расположена по интернет\-адресу \fI*addr\fP. Если \fIaddr\->sin_port\fP равно 0, тогда ему назначается реальный порт, который прослушивается удалённой программой (эта информация запрашивается у удалённой службы \fIportmap\fP). Параметр \fIsockp\fP — сокет; если его значение равно \fBRPC_ANYSOCK\fP, тогда эта функция открывает новый сокет и изменяет \fIsockp\fP. Протокол UDP повторяет отправку через интервал, указанный в параметре \fIwait\fP, пока не будет получен ответ или не истечёт время ожидания. Полное время ожидания вызова определяется \fBclnt_call\fP(). .IP Эта функция позволяет пользователям задать максимальный размер пакета для отправки и принятия сообщений RPC через UDP. .PP .nf \fBvoid get_myaddress(struct sockaddr_in *\fP\fIaddr\fP\fB);\fP .fi .IP Заполнить IP\-адрес машины в \fI*addr\fP, не используя библиотечные функции, которые работают с \fI/etc/hosts\fP. Номер порта всегда устанавливается равным \fBhtons(PMAPPORT)\fP. .PP .nf \fBstruct pmaplist *pmap_getmaps(struct sockaddr_in *\fP\fIaddr\fP\fB);\fP .fi .IP Пользовательский интерфейс службы \fBportmap\fP, который возвращает текущий список соответствий RPC\-программа — порт, находящихся на машине с определённым IP\-адресом \fI*addr\fP. Эта функция может возвратить NULL. Эту функцию использует команда \fIrpcinfo\ \-p\fP. .PP .nf \fBunsigned short pmap_getport(struct sockaddr_in *\fP\fIaddr\fP\fB,\fP \fB unsigned long \fP\fIprognum\fP\fB, unsigned long \fP\fIversnum\fP\fB,\fP \fB unsigned int \fP\fIprotocol\fP\fB);\fP .fi .IP Пользовательский интерфейс службы \fBportmap\fP, который возвращает номер порта, на котором ожидает подключения служба, поддерживающая программный номер \fIprognum\fP версии \fIversnum\fP, и отвечает по протоколу передачи, связанному с \fIprotocol\fP. Обычно, значение \fIprotocol\fP равно \fBIPPROTO_UDP\fP или \fBIPPROTO_TCP\fP. Возвращаемое значение 0 означает, что соответствия не существует или что RPC системы не может соединиться с удалённой службой \fIportmap\fP. В последнем случае глобальная переменная \fIrpc_createerr\fP содержит состояние RPC. .PP .nf \fBenum clnt_stat pmap_rmtcall(struct sockaddr_in *\fP\fIaddr\fP\fB,\fP \fB unsigned long \fP\fIprognum\fP\fB, unsigned long \fP\fIversnum\fP\fB,\fP \fB unsigned long \fP\fIprocnum\fP\fB,\fP \fB xdrproc_t \fP\fIinproc\fP\fB, char *\fP\fIin\fP\fB,\fP \fB xdrproc_t \fP\fIoutproc\fP\fB, char *\fP\fIout\fP\fB,\fP \fB struct timeval \fP\fItout\fP\fB, unsigned long *\fP\fIportp\fP\fB);\fP .fi .IP Пользовательский интерфейс службы \fBportmap\fP, который указывает \fBportmap\fP на машине с IP\-адресом \fI*addr\fP выполнить вызов RPC от вашего имени к процедуре на этой машине. При успешном выполнении процедуры параметр \fI*portp\fP заменяется на номер программного порта. Предназначение других параметров описано в \fBcallrpc\fP() и \fBclnt_call\fP(). Эта функция может быть использована только для «ping». Смотрите также \fBclnt_broadcast\fP(). .PP .nf \fBbool_t pmap_set(unsigned long \fP\fIprognum\fP\fB, unsigned long \fP\fIversnum\fP\fB,\fP \fB unsigned int \fP\fIprotocol\fP\fB, unsigned short \fP\fIport\fP\fB);\fP .fi .IP Пользовательский интерфейс службы \fBportmap\fP, который устанавливает соответствие между [\fIprognum\fP,\fIversnum\fP,\fIprotocol\fP] и \fIport\fP на машине с службой \fBportmap\fP. Обычно, значение \fIprotocol\fP равно \fBIPPROTO_UDP\fP или \fBIPPROTO_TCP\fP. При успешном выполнении эта функция возвращает 1 и 0 в противном случае. Автоматически выполняется из \fBsvc_register\fP(). .PP .nf \fBbool_t pmap_unset(unsigned long \fP\fIprognum\fP\fB, unsigned long \fP\fIversnum\fP\fB);\fP .fi .IP Пользовательский интерфейс службы \fBportmap\fP, который уничтожает все соответствия между [\fIprognum\fP,\fIversnum\fP,\fI*\fP] и \fBports\fP на машине с службой \fBportmap\fP. При успешном выполнении эта функция возвращает 1 и 0 в противном случае. .PP .nf \fBint registerrpc(unsigned long \fP\fIprognum\fP\fB, unsigned long \fP\fIversnum\fP\fB,\fP \fB unsigned long \fP\fIprocnum\fP\fB, char *(*\fP\fIprocname\fP\fB)(char *),\fP \fB xdrproc_t \fP\fIinproc\fP\fB, xdrproc_t \fP\fIoutproc\fP\fB);\fP .fi .IP Регистрирует процедуру \fIprocname\fP в пакете служб RPC. Если запрос приходит программе \fIprognum\fP версии \fIversnum\fP и процедуре \fIprocnum\fP, то \fIprocname\fP вызывается с указателем на эти параметры; \fIprocname\fP должна возвращать указатель на эти статические результаты; \fIinproc\fP используется для декодирования параметров, а \fIoutproc\fP — для кодирования результатов. При успешной регистрации эта функция возвращает 0 и \-1 в противном случае. .IP Предупреждение: удалённые процедуры, зарегистрированные таким способом, доступны по протоколу UDP/IP; информацию об ограничениях смотрите в \fBsvcudp_create\fP(). .PP .nf \fBstruct rpc_createerr \fP\fIrpc_createerr\fP\fB;\fP .fi .IP Глобальная переменная, значение которой устанавливается любой функцией создания клиента RPC при ошибке. Используйте функцию \fBclnt_pcreateerror\fP() для вывода сообщения о причине ошибки. .PP .nf \fBvoid svc_destroy(SVCXPRT *\fP\fIxprt\fP\fB);\fP .fi .IP Макрос, который уничтожает описатель протокола службы RPC \fIxprt\fP. Уничтожение, обычно, освобождает скрытые структуры данных, включая сам \fIxprt\fP. Работа с \fIxprt\fP после вызова этой функции не описана. .PP .nf \fBfd_set \fP\fIsvc_fdset\fP\fB;\fP .fi .IP Глобальная переменная, отражающая битовую маску читаемого файлового дескриптора службы RPC; она подходит в качестве параметра для системного вызова \fBselect\fP(2). Полезна только, если реализация службы использует собственный обработчик асинхронных событий, а не вызова \fBsvc_run\fP(). Эта переменная доступна только для чтения (не передавайте её адрес в \fBselect\fP(2)!), также она может измениться после вызова \fBsvc_getreqset\fP() или функций создания. .PP .nf \fBint \fP\fIsvc_fds\fP\fB;\fP .fi .IP Подобна \fBsvc_fdset\fP, но ограничена 32 файловыми дескрипторами. Устарела, используйте \fBsvc_fdset\fP. .PP .nf \fBsvc_freeargs(SVCXPRT *\fP\fIxprt\fP\fB, xdrproc_t \fP\fIinproc\fP\fB, char *\fP\fIin\fP\fB);\fP .fi .IP Макрос, который освобождает любые данные, выделенные системой RPC/XDR при декодировании аргументов процедуры службы с помощью \fBsvc_getargs\fP(). Эта функция возвращает 1, если результаты были успешно освобождены, и 0 в противном случае. .PP .nf \fBsvc_getargs(SVCXPRT *\fP\fIxprt\fP\fB, xdrproc_t \fP\fIinproc\fP\fB, char *\fP\fIin\fP\fB);\fP .fi .IP Макрос, декодирующий параметры запроса RPC, связанного с описателем протокола службы RPC \fIxprt\fP. Параметр \fIin\fP — адрес, по которому будут размещены аргументы; \fIinproc\fP — функция XDR, использующаяся для декодирования аргументов. При успешном декодировании функция возвращает 1 и 0 в противном случае. .PP .nf \fBstruct sockaddr_in *svc_getcaller(SVCXPRT *\fP\fIxprt\fP\fB);\fP .fi .IP Правильный способ получения сетевого адреса вызвавшего процедуру, связанную с описателем протокола службы RPC \fIxprt\fP. .PP .nf \fBvoid svc_getreqset(fd_set *\fP\fIrdfds\fP\fB);\fP .fi .IP Функция представляет интерес, только если реализация службы не вызывает функцию \fBsvc_run\fP(), а реализует собственную асинхронную обработку событий. Вызывается, когда системный вызов \fBselect\fP(2) определил, что поступил запрос RPC в какой\-либо сокет RPC; \fIrdfds\fP — битовая маска читаемого файлового дескриптора. Функция завершается после обработки всех сокетов, связанных со значением \fIrdfds\fP. .PP .nf \fBvoid svc_getreq(int \fP\fIrdfds\fP\fB);\fP .fi .IP Подобна \fBsvc_getreqset\fP(), но ограничена 32 файловыми дескрипторами. Устарела, используйте \fBsvc_getreqset\fP(). .PP .nf \fBbool_t svc_register(SVCXPRT *\fP\fIxprt\fP\fB, unsigned long \fP\fIprognum\fP\fB,\fP \fB unsigned long \fP\fIversnum\fP\fB,\fP \fB void (*\fP\fIdispatch\fP\fB)(svc_req *, SVCXPRT *),\fP \fB unsigned long \fP\fIprotocol\fP\fB);\fP .fi .IP Связывает \fIprognum\fP и \fIversnum\fP с функцией распределения служб \fIdispatch\fP. Если значение \fIprotocol\fP равно 0, то служба не регистрируется службой \fIportmap\fP. Если значение \fIprotocol\fP не равно 0, тогда соответствие [\fIprognum\fP,\fIversnum\fP,\fIprotocol\fP] и \fIxprt\->xp_port\fP устанавливается локальной службой \fIportmap\fP (обычно, значение \fIprotocol\fP равно 0, \fBIPPROTO_UDP\fP или \fBIPPROTO_TCP\fP). Функция \fIdispatch\fP имеет следующий вид: .IP .in +4n .EX dispatch(struct svc_req *request, SVCXPRT *xprt); .EE .in .IP При успешном выполнении функция \fBsvc_register\fP() возвращает 1 и 0 в противном случае. .PP .nf \fBvoid svc_run(void);\fP .fi .IP Эта функция не возвращает управление. Она ждёт поступления запросов RPC и при их появлении вызывает соответствующую процедуру службы с помощью \fBsvc_getreq\fP(). Обычно, эта функция ждёт возврата из системного вызова \fBselect\fP(2). .PP .nf \fBbool_t svc_sendreply(SVCXPRT *\fP\fIxprt\fP\fB, xdrproc_t \fP\fIoutproc\fP\fB, char *\fP\fIout\fP\fB);\fP .fi .IP Вызывается функцией распределения служб RPC для отправки результатов вызову удалённой процедуры. Параметр \fIxprt\fP — описатель протокола связанного запроса; \fIoutproc\fP — функция XDR, которая используется для кодирования результатов; \fIout\fP — адрес, по которому находятся результаты. При успешном выполнении эта функция возвращает 1 и 0 в противном случае. .PP .nf \fBvoid svc_unregister(unsigned long \fP\fIprognum\fP\fB, unsigned long \fP\fIversnum\fP\fB);\fP .fi .IP Удаляет все сопоставления [\fIprognum\fP,\fIversnum\fP] функциям распределения и [\fIprognum\fP,\fIversnum\fP,\fI*\fP] номеру порта. .PP .nf \fBvoid svcerr_auth(SVCXPRT *\fP\fIxprt\fP\fB, enum auth_stat \fP\fIwhy\fP\fB);\fP .fi .IP Вызывается функцией распределения служб, которая отклоняет выполнение вызова удалённой процедуры из ошибки аутентификации. .PP .nf \fBvoid svcerr_decode(SVCXPRT *\fP\fIxprt\fP\fB);\fP .fi .IP Вызывается функцией распределения служб, если невозможно декодировать её параметры. Смотрите также \fBsvc_getargs\fP(). .PP .nf \fBvoid svcerr_noproc(SVCXPRT *\fP\fIxprt\fP\fB);\fP .fi .IP Вызывается функцией распределения служб, если не реализован номер процедуры, указанный в полученном запросе. .PP .nf \fBvoid svcerr_noprog(SVCXPRT *\fP\fIxprt\fP\fB);\fP .fi .IP Вызывается, когда желаемая программа не зарегистрирована в пакете RPC. Обычно, для реализации службы эта функция не требуется. .PP .nf \fBvoid svcerr_progvers(SVCXPRT *\fP\fIxprt\fP\fB);\fP .fi .IP Вызывается, когда желаемая версия программы не зарегистрирована в пакете RPC. Обычно, для реализации службы эта функция не требуется. .PP .nf \fBvoid svcerr_systemerr(SVCXPRT *\fP\fIxprt\fP\fB);\fP .fi .IP Вызывается функцией распределения служб при обнаружении системной ошибки, не относящейся к какому\-то конкретному протоколу. Например, служба может вызвать эту функцию, если не удалось выделить память. .PP .nf \fBvoid svcerr_weakauth(SVCXPRT *\fP\fIxprt\fP\fB);\fP .fi .IP Вызывается функцией распределения служб для отклонения вызова удалённой процедуры из недостатка параметров аутентификации. Функция вызывает \fBsvcerr_auth(xprt, AUTH_TOOWEAK)\fP. .PP .nf \fBSVCXPRT *svcfd_create(int \fP\fIfd\fP\fB, unsigned int \fP\fIsendsize\fP\fB,\fP \fB unsigned int \fP\fIrecvsize\fP\fB);\fP .fi .IP Создаёт службу поверх любого открытого файлового дескриптора. Обычно, этот файловый дескриптор является подключённым сокетом для поточного протокола, например TCP. В \fIsendsize\fP и \fIrecvsize\fP указываются размеры буферов отправки и приёма. Если эти значения равны нулю, то выбирается приемлемое значение по умолчанию. .PP .nf \fBSVCXPRT *svcraw_create(void);\fP .fi .IP Эта функция создаёт игрушечный протокол службы RPC и возвращает указатель на него. В действительности протокол представляет собой буфер внутри адресного пространства процесса, поэтому соответствующие клиенты RPC должны находиться в том же адресном пространстве; смотрите \fBclntraw_create\fP(). Эта функция позволяет имитировать RPC и создавать дополнительные нагрузки на RPC (как, например, время пересылки туда и обратно) без какого\-либо вмешательства ядра. При ошибке функция возвращает NULL. .PP .nf \fBSVCXPRT *svctcp_create(int \fP\fIsock\fP\fB, unsigned int \fP\fIsend_buf_size\fP\fB,\fP \fB unsigned int \fP\fIrecv_buf_size\fP\fB);\fP .fi .IP Эта функция создаёт протокол службы RPC на основе TCP/IP и возвращает указатель на него. Протокол связывается с сокетом \fIsock\fP, значение которого может быть равно \fBRPC_ANYSOCK\fP; в этом случае создаётся новый сокет. Если сокет не привязан к локальному порту TCP, то эта функция привязывает его к произвольному порту. При завершении \fIxprt\->xp_sock\fP содержит дескриптор сокета протокола, а \fIxprt\->xp_port\fP — номер порта протокола. При ошибке эта функция возвращает NULL. Так как в RPC на основе TCP используется буферизация ввода\-вывода, пользователи могут задавать размер буферов; при нулевом значении выбирается подходящий размер по умолчанию. .PP .nf \fBSVCXPRT *svcudp_bufcreate(int \fP\fIsock\fP\fB, unsigned int \fP\fIsendsize\fP\fB,\fP \fB unsigned int \fP\fIrecosize\fP\fB);\fP .fi .IP Эта функция создаёт протокол службы RPC на основе UDP/IP и возвращает указатель на него. Протокол связывается с сокетом \fIsock\fP, значение которого может быть равно \fBRPC_ANYSOCK\fP; в этом случае создаётся новый сокет. Если сокет не привязан к локальному порту UDP, то эта функция привязывает его к произвольному порту. При завершении \fIxprt\->xp_sock\fP содержит дескриптор сокета протокола, а \fIxprt\->xp_port\fP — номер порта протокола. При ошибке эта функция возвращает NULL. .IP Эта функция позволяет пользователям задать максимальный размер пакета для отправки и принятия сообщений RPC через UDP. .PP .nf \fBSVCXPRT *svcudp_create(int \fP\fIsock\fP\fB);\fP .fi .IP Этот вызов аналогичен \fIsvcudp_bufcreate(sock,SZ,SZ)\fP для некоторого размера \fBSZ\fP по умолчанию. .PP .nf \fBbool_t xdr_accepted_reply(XDR *\fP\fIxdrs\fP\fB, struct accepted_reply *\fP\fIar\fP\fB);\fP .fi .IP Используется для кодирования ответных сообщений RPC. Эта функция полезна для пользователей, которые хотят генерировать RPC\-подобные сообщения без использования пакета RPC. .PP .nf \fBbool_t xdr_authunix_parms(XDR *\fP\fIxdrs\fP\fB, struct authunix_parms *\fP\fIaupp\fP\fB);\fP .fi .IP Используется для описания информации (credentials) UNIX. Эта функция полезна для пользователей, которые хотят генерировать такую информацию без использования пакета аутентификации RPC. .PP .nf \fBvoid xdr_callhdr(XDR *\fP\fIxdrs\fP\fB, struct rpc_msg *\fP\fIchdr\fP\fB);\fP .fi .IP Используется для описания заголовка сообщений вызовов RPC. Эта функция полезна для пользователей, которые хотят генерировать RPC\-подобные сообщения без использования пакета RPC. .PP .nf \fBbool_t xdr_callmsg(XDR *\fP\fIxdrs\fP\fB, struct rpc_msg *\fP\fIcmsg\fP\fB);\fP .fi .IP Используется для описания сообщений вызовов RPC. Эта функция полезна для пользователей, которые хотят генерировать RPC\-подобные сообщения без использования пакета RPC. .PP .nf \fBbool_t xdr_opaque_auth(XDR *\fP\fIxdrs\fP\fB, struct opaque_auth *\fP\fIap\fP\fB);\fP .fi .IP Используется для описания информационных сообщений аутентификации RPC. Эта функция полезна для пользователей, которые хотят генерировать RPC\-подобные сообщения без использования пакета RPC. .PP .nf \fBbool_t xdr_pmap(XDR *\fP\fIxdrs\fP\fB, struct pmap *\fP\fIregs\fP\fB);\fP .fi .IP Используется для описания параметров различных функций \fBportmap\fP извне. Эта функция полезна для пользователей, которые хотят генерировать такие параметры без использования интерфейса \fBpmap\fP. .PP .nf \fBbool_t xdr_pmaplist(XDR *\fP\fIxdrs\fP\fB, struct pmaplist **\fP\fIrp\fP\fB);\fP .fi .IP Используется для описания списка соответствия портов извне. Эта функция полезна для пользователей, которые хотят генерировать такие параметры без использования интерфейса \fBpmap\fP. .PP .nf \fBbool_t xdr_rejected_reply(XDR *\fP\fIxdrs\fP\fB, struct rejected_reply *\fP\fIrr\fP\fB);\fP .fi .IP Используется для описания ответных сообщений RPC. Эта функция полезна для пользователей, которые хотят генерировать RPC\-подобные сообщения без использования пакета RPC. .PP .nf \fBbool_t xdr_replymsg(XDR *\fP\fIxdrs\fP\fB, struct rpc_msg *\fP\fIrmsg\fP\fB);\fP .fi .IP Используется для описания ответных сообщений RPC. Эта функция полезна для пользователей, которые хотят генерировать RPC\-подобные сообщения без использования пакета RPC. .PP .nf \fBvoid xprt_register(SVCXPRT *\fP\fIxprt\fP\fB);\fP .fi .IP После создания описателей протокола службы RPC они должны самостоятельно зарегистрироваться в пакетом служб RPC. Эта функция изменяет глобальную переменную \fIsvc_fds\fP. Обычно, для реализации служб эта функция не требуется. .PP .nf \fBvoid xprt_unregister(SVCXPRT *\fP\fIxprt\fP\fB);\fP .fi .IP Перед уничтожением описателя протокола службы RPC он должен самостоятельно отменить регистрацию в пакете службы RPC. Эта функция изменяет глобальную переменную \fIsvc_fds\fP. Обычно, для реализации служб эта функция не требуется. .SH АТРИБУТЫ Описание терминов данного раздела смотрите в \fBattributes\fP(7). .ad l .TS allbox; lbw35 lb lb l l l. Интерфейс Атрибут Значение T{ \fBauth_destroy\fP(), \fBauthnone_create\fP(), .br \fBauthunix_create\fP(), .br \fBauthunix_create_default\fP(), .br \fBcallrpc\fP(), \fBclnt_broadcast\fP(), .br \fBclnt_call\fP(), \fBclnt_destroy\fP(), .br \fBclnt_create\fP(), \fBclnt_control\fP(), .br \fBclnt_freeres\fP(), \fBclnt_geterr\fP(), .br \fBclnt_pcreateerror\fP(), \fBclnt_perrno\fP(), .br \fBclnt_perror\fP(), .br \fBclnt_spcreateerror\fP(), .br \fBclnt_sperrno\fP(), \fBclnt_sperror\fP(), .br \fBclntraw_create\fP(), \fBclnttcp_create\fP(), .br \fBclntudp_create\fP(), .br \fBclntudp_bufcreate\fP(), .br \fBget_myaddress\fP(), \fBpmap_getmaps\fP(), .br \fBpmap_getport\fP(), \fBpmap_rmtcall\fP(), .br \fBpmap_set\fP(), \fBpmap_unset\fP(), .br \fBregisterrpc\fP(), \fBsvc_destroy\fP(), .br \fBsvc_freeargs\fP(), \fBsvc_getargs\fP(), .br \fBsvc_getcaller\fP(), \fBsvc_getreqset\fP(), .br \fBsvc_getreq\fP(), \fBsvc_register\fP(), .br \fBsvc_run\fP(), \fBsvc_sendreply\fP(), .br \fBsvc_unregister\fP(), \fBsvcerr_auth\fP(), .br \fBsvcerr_decode\fP(), \fBsvcerr_noproc\fP(), .br \fBsvcerr_noprog\fP(), \fBsvcerr_progvers\fP(), .br \fBsvcerr_systemerr\fP(), \fBsvcerr_weakauth\fP(), .br \fBsvcfd_create\fP(), \fBsvcraw_create\fP(), .br \fBsvctcp_create\fP(), .br \fBsvcudp_bufcreate\fP(), .br \fBsvcudp_create\fP(), \fBxdr_accepted_reply\fP(), .br \fBxdr_authunix_parms\fP(), .br \fBxdr_callhdr\fP(), .br \fBxdr_callmsg\fP(), \fBxdr_opaque_auth\fP(), .br \fBxdr_pmap\fP(), \fBxdr_pmaplist\fP(), .br \fBxdr_rejected_reply\fP(), .br \fBxdr_replymsg\fP(), .br \fBxprt_register\fP(), \fBxprt_unregister\fP() T} Безвредность в нитях MT\-Safe .TE .ad .SH "СМ. ТАКЖЕ" .\" We don't have an rpc_secure.3 page in the set at the moment -- MTK, 19 Sep 05 .\" .BR rpc_secure (3), \fBxdr\fP(3) .PP Следующие руководства: .RS Remote Procedure Calls: Protocol Specification .br Remote Procedure Call Programming Guide .br rpcgen Programming Guide .br .RE .PP \fIRPC: Remote Procedure Call Protocol Specification\fP, RFC\ 1050, Sun Microsystems, Inc., USC\-ISI. .SH ЗАМЕЧАНИЯ Эта страница является частью проекта Linux \fIman\-pages\fP версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу \%https://www.kernel.org/doc/man\-pages/. .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан aereiae , Azamat Hackimov , Dmitriy S. Seregin , Katrin Kutepova , Lockal , 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 .