RPC(3)

ИМЯ
rpc - библиотечные функции для вызова удалённых процедур

СИНТАКСИС И ОПИСАНИЕ
Эти функции позволяют программам, созданным на Си, вызывать удалённые процедуры на других машинах в сети. Сначала, клиент вызывает процедуру путём отправки пакета с данными на сервер. После принятия пакета сервер вызывает функцию распределения (dispatch) для выполнения запрошенной службы и отсылает ответ обратно. Последним действием результат выполнения процедуры возвращается клиенту.

Чтобы использовать эти функции, включите заголовочный файл <rpc/rpc.h>. Представленные ниже прототипы позволяют использовать следующие типы:

    typedef int bool_t;

typedef bool_t (*xdrproc_t) (XDR *, void *, ...);

typedef bool_t (*resultproc_t) (caddr_t resp,
                                struct sockaddr_in *raddr);

Объявления типов AUTH, CLIENT, SVCXPRT и XDR смотрите в заголовочных файлах.

void auth_destroy(AUTH *auth);

    Макрос, который уничтожает аутентификационную информацию, связанную с auth. Уничтожение, обычно, вызывает высвобождение скрытых структур данных. Работа с auth после вызова auth_destroy() не описана.

AUTH *authnone_create(void);

    Создаёт и возвращает аутентификационный описатель RPC, который передаёт непригодную аутентификационную информацию с каждым вызовом удалённой процедуры. Данная аутентификация используется в RPC по умолчанию.

AUTH *authunix_create(char *host, int uid, int gid,
                      int len, int *aup_gids);

    Создаёт и возвращает аутентификационный описатель RPC, который содержит аутентификационную информацию. В параметре host содержится имя машины, на которой была создана информация; в uid содержится пользовательский идентификатор; в gid содержится идентификатор текущей группы пользователя; значения len и aup_gids описывают обновляемый (counted) массив групп, к которым принадлежит пользователь. Это упрощает персонализацию пользователя.

AUTH *authunix_create_default(void);

    Вызывает authunix_create() с соответствующими параметрами.

int callrpc(char *host, unsigned long prognum,
            unsigned long versnum, unsigned long procnum,
            xdrproc_t inproc, char *in,
            xdrproc_t outproc, char *out);

    Вызывает удалённую процедуру, связанную с prognum, versnum и procnum на машине host. В параметре in передаётся адрес параметров процедуры, в out — адрес, по которому должен помещаться результат; inproc используется для кодирования параметров процедуры, а outproc — для декодирования результатов. При успешном выполнении эта функция возвращает 0 или целое значение в enum clnt_stat при ошибке. Для перевода номера ошибки в сообщение об ошибке можно использовать функцию clnt_perrno().

    Предупреждение: при вызове удалённой процедуры с помощью данной функции для передачи используется протокол UDP/IP; ограничения смотрите в описании clntudp_create(). При использовании данной функции вы не можете управлять задержкой или аутентификацией.

enum clnt_stat clnt_broadcast(unsigned long prognum,
                     unsigned long versnum, unsigned long procnum,
                     xdrproc_t inproc, char *in,
                     xdrproc_t outproc, char *out,
                     resultproc_t eachresult);

    Подобна callrpc(), только сообщение посылается как широковещательное во все локально подключённые сети. Каждый раз при получении ответа эта функция вызывает eachresult() следующего вида:

        eachresult(char *out, struct sockaddr_in *addr);

    где out — тот же самый параметр out, переданный в clnt_broadcast(), за исключением того, что результат удалённой процедуры сразу же декодируется; addr указывает на адрес машины, которая послала результат. Если eachresult() возвращает 0, то clnt_broadcast() продолжит ждать ответы; в противном случае она возвращает соответствующий статус.

    Предупреждение: размер широковещательных сокетов ограничен максимальной единицей передачи данных подключения. Для ethernet это значение равно 1500 байтам.

enum clnt_stat clnt_call(CLIENT *clnt, unsigned long procnum,
                    xdrproc_t inproc, char *in,
                    xdrproc_t outproc, char *out,
                    struct timeval tout);

    Макрос, который вызывает удалённую процедуру procnum, связанную с клиентским описателем clnt, полученным от функции создания клиента RPC, такой как clnt_create(). Параметр in — адрес аргументов процедуры, а out — адрес, по которому размещается результат; inproc используется для кодирования параметров процедуры, а outproc используется для декодирования её результатов; tout — допустимое время ожидания результатов.

clnt_destroy(CLIENT *clnt);

    Макрос, который уничтожает клиентский описатель RPC. Уничтожение, обычно, затрагивает скрытые структуры данных, включая сам clnt. Работа с clnt после вызова clnt_destroy() не описана. Если библиотека RPC открывала связанный сокет, он также будет закрыт. В противном случае сокет останется открытым.

CLIENT *clnt_create(char *host, unsigned long prog,
                    unsigned long vers, char *proto);

    Основная функция для создания клиента. В host указывается имя удалённой машины, где где расположен сервер. В proto указывается тип протокола передачи, который будет использован. Поддерживаемые значения этого поля: «udp» и «tcp». Время задержки задаётся значением по умолчанию, но может быть изменено с помощью clnt_control().

    Предупреждение: использование UDP имеет недостатки. Так как в сообщениях RPC на основе UDP может быть только 8 КБ закодированных данных, этот протокол не может быть использован для процедур с большим количеством параметров или которые возвращают результат большого размера.

bool_t clnt_control(CLIENT *cl, int req, char *info);

    Макрос, используемый для изменения или получения различной информации о клиентском объекте. В req указывается тип операции, а в info — указатель на информацию. Для UDP и TCP поддерживаются следующие значения req и их типы параметров:

        // назначить общее время ожидания
        CLSET_TIMEOUT  struct timeval
        // получить общее время ожидания
        CLGET_TIMEOUT  struct timeval

    Замечание: если вы установили время ожидания с помощью clnt_control(), то параметр времени ожидания, передаваемый clnt_call(), будет игнорироваться во всех будущих вызовах.

        // получить адрес сервера
        CLGET_SERVER_ADDR  struct sockaddr_in

    Следующие операции действительны только для UDP:

        // назначить повторное время ожидания
        CLSET_RETRY_TIMEOUT  struct timeval
        // получить повторное время ожидания
        CLGET_RETRY_TIMEOUT  struct timeval

    Повторное время — это время, в течение которого «UDP RPC» ждёт ответа от сервера перед повторной отправкой запроса.

clnt_freeres(CLIENT * clnt, xdrproc_t outproc, char *out);

    Макрос, который освобождает любые данные, размещаемые системой RPC/XDR, когда она декодирует результаты вызова RPC. Параметр out — адрес результатов, а outproc — функция XDR, описывающая результаты. Эта функция возвращает 1, если результаты были успешно освобождены и 0 в противном случае.

void clnt_geterr(CLIENT *clnt, struct rpc_err *errp);

    Макрос, который копирует структуру ошибки клиентского описателя в структуру по адресу errp.

void clnt_pcreateerror(char *s);

    Выводит в стандартный поток ошибок сообщение, описывающее почему клиентский описатель RPC не удалось создать. В начало сообщения добавляется строка s и знак двоеточия. Используется при ошибках в функциях clnt_create(), clntraw_create(), clnttcp_create() или clntudp_create().

void clnt_perrno(enum clnt_stat stat);

    Выводит в стандартный поток ошибок сообщение согласно условию, указанному в stat. Используется после callrpc().

clnt_perror(CLIENT *clnt, char *s);

    Выводит в стандартный поток ошибок сообщение, описывающее почему вызов RPC завершился с ошибкой. Значение clnt — описатель, использовавшийся при вызове. В начало сообщения добавляется строка s и знак двоеточия. Используется после clnt_call().

char *clnt_spcreateerror(char *s);

    Похожа на clnt_pcreateerror(), но возвращает строку вместо вывода в стандартный поток ошибок.

    Дефекты: возвращается указатель на статические данные, которые переписываются при каждом вызове.

char *clnt_sperrno(enum clnt_stat stat);

    Получает те же аргументы, что и clnt_perrno(), но вместо отправки в стандартный поток ошибок сообщения, которое показывает почему вызов RPC завершился с ошибкой, возвращает указатель на строку с сообщением. Строка заканчивается символом NEWLINE.

    Функция clnt_sperrno() используется вместо clnt_perrno(), если программа не имеет стандартного потока ошибок (для программ, запущенных как сервер), или если программист не хочет выводить сообщения с помощью printf(3), или если формат сообщения отличается от формата, поддерживаемого clnt_perrno(). Замечание: в отличие от clnt_sperror() и clnt_spcreateerror(), clnt_sperrno() возвращает указатель на статические данные, но результат не будет переписан при каждом вызове.

char *clnt_sperror(CLIENT *rpch, char *s);

    Похожа на clnt_perror(), но (подобно clnt_sperrno()) возвращает строку вместо вывода сообщения в стандартный поток ошибок.

    Дефекты: возвращается указатель на статические данные, которые переписываются при каждом вызове.

CLIENT *clntraw_create(unsigned long prognum, unsigned long versnum);

    Эта функция создаёт игрушечного клиента RPC для удалённой программы prognum версии versnum. Протокол, используемый для пересылки сообщения службе, на самом деле является буфером внутри адресного пространства процесса, поэтому соответствующий сервер RPC должен находиться в том же адресном пространстве; смотрите svcraw_create(). Он позволяет имитировать RPC и временные задержки без какого-либо участия ядра. При ошибке эта функция возвращает NULL..

CLIENT *clnttcp_create(struct sockaddr_in *addr,
                unsigned long prognum, unsigned long versnum,
                int *sockp, unsigned int sendsz, unsigned int recvsz);

    Эта функция создаёт клиента RPC для удалённой программы prognum, версии versnum; для передачи клиент использует протокол TCP/IP. Удалённая программа расположена по интернет-адресу *addr. Если значение addr->sin_port равно 0, тогда ему назначается реальный порт, который прослушивается удалённой программой (эта информация запрашивается у удалённой службы portmap). Параметр sockp — сокет; если его значение равно RPC_ANYSOCK, тогда эта функция открывает новый сокет и изменяет sockp. Так как в RPC на основе TCP используется буферизация ввода-вывода, пользователь может задать размер посылаемых и получаемых буферов с помощью параметров sendsz и recvsz; при значении 0 выбираются подходящие величины по умолчанию. При ошибке эта функция возвращает NULL.

CLIENT *clntudp_create(struct sockaddr_in *addr,
                unsigned long prognum, unsigned long versnum,
                struct timeval wait, int *sockp);

    Эта функция создаёт клиента RPC для удалённой программы prognum версии versnum; для передачи клиент использует протокол UDP/IP. Удалённая программа расположена по интернет-адресу *addr. Если addr->sin_port равно 0, тогда ему назначается реальный порт, который прослушивается удалённой программой (эта информация запрашивается у удалённой службы portmap). Параметр sockp — сокет; если его значение равно RPC_ANYSOCK, тогда эта функция открывает новый сокет и изменяет sockp. Протокол UDP повторяет отправку сообщения через интервал, указанный в параметре wait, пока не будет получен ответ или не истечёт время ожидания. Полное время ожидания вызова определяется clnt_call().

    Предупреждение: так как в сообщениях RPC на основе UDP может быть только 8 КБ закодированных данных, этот протокол не может быть использован для процедур с большим количеством параметров или которые возвращают результат большого размера.

CLIENT *clntudp_bufcreate(struct sockaddr_in *addr,
            unsigned long prognum, unsigned long versnum,
            struct timeval wait, int *sockp,
            unsigned int sendsize, unsigned int recosize);

    Эта функция создаёт клиента RPC для удалённой программы prognum версии versnum; для передачи клиент использует протокол UDP/IP. Удалённая программа расположена по интернет-адресу *addr. Если addr->sin_port равно 0, тогда ему назначается реальный порт, который прослушивается удалённой программой (эта информация запрашивается у удалённой службы portmap). Параметр sockp — сокет; если его значение равно RPC_ANYSOCK, тогда эта функция открывает новый сокет и изменяет sockp. Протокол UDP повторяет отправку через интервал, указанный в параметре wait, пока не будет получен ответ или не истечёт время ожидания. Полное время ожидания вызова определяется clnt_call().

    Эта функция позволяет пользователям задать максимальный размер пакета для отправки и принятия сообщений RPC через UDP.

void get_myaddress(struct sockaddr_in *addr);

    Заполнить IP-адрес машины в *addr, не используя библиотечные функции, которые работают с /etc/hosts. Номер порта всегда устанавливается равным htons(PMAPPORT).

struct pmaplist *pmap_getmaps(struct sockaddr_in *addr);

    Пользовательский интерфейс службы portmap, который возвращает текущий список соответствий RPC-программа — порт, находящихся на машине с определённым IP-адресом *addr. Эта функция может возвратить NULL. Эту функцию использует команда rpcinfo -p.

unsigned short pmap_getport(struct sockaddr_in *addr,
                    unsigned long prognum, unsigned long versnum,
                    unsigned int protocol);

    Пользовательский интерфейс службы portmap, который возвращает номер порта, на котором ожидает подключения служба, поддерживающая программный номер prognum версии versnum, и отвечает по протоколу передачи, связанному с protocol. Обычно, значение protocol равно IPPROTO_UDP или IPPROTO_TCP. Возвращаемое значение 0 означает, что соответствия не существует или что RPC системы не может соединиться с удалённой службой portmap. В последнем случае глобальная переменная rpc_createerr содержит состояние RPC.

enum clnt_stat pmap_rmtcall(struct sockaddr_in *addr,
                    unsigned long prognum, unsigned long versnum,
                    unsigned long procnum,
                    xdrproc_t inproc, char *in,
                    xdrproc_t outproc, char *out,
                    struct timeval tout, unsigned long *portp);

    Пользовательский интерфейс службы portmap, который указывает portmap на машине с IP-адресом *addr выполнить вызов RPC от вашего имени к процедуре на этой машине. При успешном выполнении процедуры параметр *portp заменяется на номер программного порта. Предназначение других параметров описано в callrpc() и clnt_call(). Эта функция может быть использована только для «ping». Смотрите также clnt_broadcast().

bool_t pmap_set(unsigned long prognum, unsigned long versnum,
                unsigned int protocol, unsigned short port);

    Пользовательский интерфейс службы portmap, который устанавливает соответствие между [prognum,versnum,protocol] и port на машине с службой portmap. Обычно, значение protocol равно IPPROTO_UDP или IPPROTO_TCP. При успешном выполнении эта функция возвращает 1 и 0 в противном случае. Автоматически выполняется из svc_register().

bool_t pmap_unset(unsigned long prognum, unsigned long versnum);

    Пользовательский интерфейс службы portmap, который уничтожает все соответствия между [prognum,versnum,*] и ports на машине с службой portmap. При успешном выполнении эта функция возвращает 1 и 0 в противном случае.

int registerrpc(unsigned long prognum, unsigned long versnum,
                unsigned long procnum, char *(*procname)(char *),
                xdrproc_t inproc, xdrproc_t outproc);

    Регистрирует процедуру procname в пакете служб RPC. Если запрос приходит программе prognum версии versnum и процедуре procnum, то procname вызывается с указателем на эти параметры; procname должна возвращать указатель на эти статические результаты; inproc используется для декодирования параметров, а outproc — для кодирования результатов. При успешной регистрации эта функция возвращает 0 и -1 в противном случае.

    Предупреждение: удалённые процедуры, зарегистрированные таким способом, доступны по протоколу UDP/IP; информацию об ограничениях смотрите в svcudp_create().

struct rpc_createerr rpc_createerr;

    Глобальная переменная, значение которой устанавливается любой функцией создания клиента RPC при ошибке. Используйте функцию clnt_pcreateerror() для вывода сообщения о причине ошибки.

void svc_destroy(SVCXPRT *xprt);

    Макрос, который уничтожает описатель протокола службы RPC xprt. Уничтожение, обычно, освобождает скрытые структуры данных, включая сам xprt. Работа с xprt после вызова этой функции не описана.

fd_set svc_fdset;

    Глобальная переменная, отражающая битовую маску читаемого файлового дескриптора службы RPC; она подходит в качестве параметра для системного вызова select(2). Полезна только, если реализация службы использует собственный обработчик асинхронных событий, а не вызова svc_run(). Эта переменная доступна только для чтения (не передавайте её адрес в select(2)!), также она может измениться после вызова svc_getreqset() или функций создания.

int svc_fds;

    Подобна svc_fdset, но ограничена 32 файловыми дескрипторами. Устарела, используйте svc_fdset.

svc_freeargs(SVCXPRT *xprt, xdrproc_t inproc, char *in);

    Макрос, который освобождает любые данные, выделенные системой RPC/XDR при декодировании аргументов процедуры службы с помощью svc_getargs(). Эта функция возвращает 1, если результаты были успешно освобождены, и 0 в противном случае.

svc_getargs(SVCXPRT *xprt, xdrproc_t inproc, char *in);

    Макрос, декодирующий параметры запроса RPC, связанного с описателем протокола службы RPC xprt. Параметр in — адрес, по которому будут размещены аргументы; inproc — функция XDR, использующаяся для декодирования аргументов. При успешном декодировании функция возвращает 1 и 0 в противном случае.

struct sockaddr_in *svc_getcaller(SVCXPRT *xprt);

    Правильный способ получения сетевого адреса вызвавшего процедуру, связанную с описателем протокола службы RPC xprt.

void svc_getreqset(fd_set *rdfds);

    Функция представляет интерес, только если реализация службы не вызывает функцию svc_run(), а реализует собственную асинхронную обработку событий. Вызывается, когда системный вызов select(2) определил, что поступил запрос RPC в какой-либо сокет RPC; rdfds — битовая маска читаемого файлового дескриптора. Функция завершается после обработки всех сокетов, связанных со значением rdfds.

void svc_getreq(int rdfds);

    Подобна svc_getreqset(), но ограничена 32 файловыми дескрипторами. Устарела, используйте svc_getreqset().

bool_t svc_register(SVCXPRT *xprt, unsigned long prognum,
                    unsigned long versnum,
                    void (*dispatch)(svc_req *, SVCXPRT *),
                    unsigned long protocol);

    Связывает prognum и versnum с функцией распределения служб dispatch. Если значение protocol равно 0, то служба не регистрируется службой portmap. Если значение protocol не равно 0, тогда соответствие [prognum,versnum,protocol] и xprt->xp_port устанавливается локальной службой portmap (обычно, значение protocol равно 0, IPPROTO_UDP или IPPROTO_TCP). Функция dispatch имеет следующий вид:

        dispatch(struct svc_req *request, SVCXPRT *xprt);

    При успешном выполнении функция svc_register() возвращает 1 и 0 в противном случае.

void svc_run(void);

    Эта функция не возвращает управление. Она ждёт поступления запросов RPC и при их появлении вызывает соответствующую процедуру службы с помощью svc_getreq(). Обычно, эта функция ждёт возврата из системного вызова select(2).

bool_t svc_sendreply(SVCXPRT *xprt, xdrproc_t outproc, char *out);

    Вызывается функцией распределения служб RPC для отправки результатов вызову удалённой процедуры. Параметр xprt — описатель протокола связанного запроса; outproc — функция XDR, которая используется для кодирования результатов; out — адрес, по которому находятся результаты. При успешном выполнении эта функция возвращает 1 и 0 в противном случае.

void svc_unregister(unsigned long prognum, unsigned long versnum);

    Удаляет все сопоставления [prognum,versnum] функциям распределения и [prognum,versnum,*] номеру порта.

void svcerr_auth(SVCXPRT *xprt, enum auth_stat why);

    Вызывается функцией распределения служб, которая отклоняет выполнение вызова удалённой процедуры из ошибки аутентификации.

void svcerr_decode(SVCXPRT *xprt);

    Вызывается функцией распределения служб, если невозможно декодировать её параметры. Смотрите также svc_getargs().

void svcerr_noproc(SVCXPRT *xprt);

    Вызывается функцией распределения служб, если не реализован номер процедуры, указанный в полученном запросе.

void svcerr_noprog(SVCXPRT *xprt);

    Вызывается, когда желаемая программа не зарегистрирована в пакете RPC. Обычно, для реализации службы эта функция не требуется.

void svcerr_progvers(SVCXPRT *xprt);

    Вызывается, когда желаемая версия программы не зарегистрирована в пакете RPC. Обычно, для реализации службы эта функция не требуется.

void svcerr_systemerr(SVCXPRT *xprt);

    Вызывается функцией распределения служб при обнаружении системной ошибки, не относящейся к какому-то конкретному протоколу. Например, служба может вызвать эту функцию, если не удалось выделить память.

void svcerr_weakauth(SVCXPRT *xprt);

    Вызывается функцией распределения служб для отклонения вызова удалённой процедуры из недостатка параметров аутентификации. Функция вызывает svcerr_auth(xprt, AUTH_TOOWEAK).

SVCXPRT *svcfd_create(int fd, unsigned int sendsize,
                      unsigned int recvsize);

    Создаёт службу поверх любого открытого файлового дескриптора. Обычно, этот файловый дескриптор является подключённым сокетом для поточного протокола, например TCP. В sendsize и recvsize указываются размеры буферов отправки и приёма. Если эти значения равны нулю, то выбирается приемлемое значение по умолчанию.

SVCXPRT *svcraw_create(void);

    Эта функция создаёт игрушечный протокол службы RPC и возвращает указатель на него. В действительности протокол представляет собой буфер внутри адресного пространства процесса, поэтому соответствующие клиенты RPC должны находиться в том же адресном пространстве; смотрите clntraw_create(). Эта функция позволяет имитировать RPC и создавать дополнительные нагрузки на RPC (как, например, время пересылки туда и обратно) без какого-либо вмешательства ядра. При ошибке функция возвращает NULL.

SVCXPRT *svctcp_create(int sock, unsigned int send_buf_size,
                       unsigned int recv_buf_size);

    Эта функция создаёт протокол службы RPC на основе TCP/IP и возвращает указатель на него. Протокол связывается с сокетом sock, значение которого может быть равно RPC_ANYSOCK; в этом случае создаётся новый сокет. Если сокет не привязан к локальному порту TCP, то эта функция привязывает его к произвольному порту. При завершении xprt->xp_sock содержит дескриптор сокета протокола, а xprt->xp_port — номер порта протокола. При ошибке эта функция возвращает NULL. Так как в RPC на основе TCP используется буферизация ввода-вывода, пользователи могут задавать размер буферов; при нулевом значении выбирается подходящий размер по умолчанию.

SVCXPRT *svcudp_bufcreate(int sock, unsigned int sendsize,
                          unsigned int recosize);

    Эта функция создаёт протокол службы RPC на основе UDP/IP и возвращает указатель на него. Протокол связывается с сокетом sock, значение которого может быть равно RPC_ANYSOCK; в этом случае создаётся новый сокет. Если сокет не привязан к локальному порту UDP, то эта функция привязывает его к произвольному порту. При завершении xprt->xp_sock содержит дескриптор сокета протокола, а xprt->xp_port — номер порта протокола. При ошибке эта функция возвращает NULL.

    Эта функция позволяет пользователям задать максимальный размер пакета для отправки и принятия сообщений RPC через UDP.

SVCXPRT *svcudp_create(int sock);

    Этот вызов аналогичен svcudp_bufcreate(sock,SZ,SZ) для некоторого размера SZ по умолчанию.

bool_t xdr_accepted_reply(XDR *xdrs, struct accepted_reply *ar);

    Используется для кодирования ответных сообщений RPC. Эта функция полезна для пользователей, которые хотят генерировать RPC-подобные сообщения без использования пакета RPC.

bool_t xdr_authunix_parms(XDR *xdrs, struct authunix_parms *aupp);

    Используется для описания информации (credentials) UNIX. Эта функция полезна для пользователей, которые хотят генерировать такую информацию без использования пакета аутентификации RPC.

void xdr_callhdr(XDR *xdrs, struct rpc_msg *chdr);

    Используется для описания заголовка сообщений вызовов RPC. Эта функция полезна для пользователей, которые хотят генерировать RPC-подобные сообщения без использования пакета RPC.

bool_t xdr_callmsg(XDR *xdrs, struct rpc_msg *cmsg);

    Используется для описания сообщений вызовов RPC. Эта функция полезна для пользователей, которые хотят генерировать RPC-подобные сообщения без использования пакета RPC.

bool_t xdr_opaque_auth(XDR *xdrs, struct opaque_auth *ap);

    Используется для описания информационных сообщений аутентификации RPC. Эта функция полезна для пользователей, которые хотят генерировать RPC-подобные сообщения без использования пакета RPC.

bool_t xdr_pmap(XDR *xdrs, struct pmap *regs);

    Используется для описания параметров различных функций portmap извне. Эта функция полезна для пользователей, которые хотят генерировать такие параметры без использования интерфейса pmap.

bool_t xdr_pmaplist(XDR *xdrs, struct pmaplist **rp);

    Используется для описания списка соответствия портов извне. Эта функция полезна для пользователей, которые хотят генерировать такие параметры без использования интерфейса pmap.

bool_t xdr_rejected_reply(XDR *xdrs, struct rejected_reply *rr);

    Используется для описания ответных сообщений RPC. Эта функция полезна для пользователей, которые хотят генерировать RPC-подобные сообщения без использования пакета RPC.

bool_t xdr_replymsg(XDR *xdrs, struct rpc_msg *rmsg);

    Используется для описания ответных сообщений RPC. Эта функция полезна для пользователей, которые хотят генерировать RPC-подобные сообщения без использования пакета RPC.

void xprt_register(SVCXPRT *xprt);

    После создания описателей протокола службы RPC они должны самостоятельно зарегистрироваться в пакетом служб RPC. Эта функция изменяет глобальную переменную svc_fds. Обычно, для реализации служб эта функция не требуется.

void xprt_unregister(SVCXPRT *xprt);

    Перед уничтожением описателя протокола службы RPC он должен самостоятельно отменить регистрацию в пакете службы RPC. Эта функция изменяет глобальную переменную svc_fds. Обычно, для реализации служб эта функция не требуется.

АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение
auth_destroy(), authnone_create(), authunix_create(), authunix_create_default(), callrpc(), clnt_broadcast(), clnt_call(), clnt_destroy(), clnt_create(), clnt_control(), clnt_freeres(), clnt_geterr(), clnt_pcreateerror(), clnt_perrno(), clnt_perror(), clnt_spcreateerror(), clnt_sperrno(), clnt_sperror(), clntraw_create(), clnttcp_create(), clntudp_create(), clntudp_bufcreate(), get_myaddress(), pmap_getmaps(), pmap_getport(), pmap_rmtcall(), pmap_set(), pmap_unset(), registerrpc(), svc_destroy(), svc_freeargs(), svc_getargs(), svc_getcaller(), svc_getreqset(), svc_getreq(), svc_register(), svc_run(), svc_sendreply(), svc_unregister(), svcerr_auth(), svcerr_decode(), svcerr_noproc(), svcerr_noprog(), svcerr_progvers(), svcerr_systemerr(), svcerr_weakauth(), svcfd_create(), svcraw_create(), svctcp_create(), svcudp_bufcreate(), svcudp_create(), xdr_accepted_reply(), xdr_authunix_parms(), xdr_callhdr(), xdr_callmsg(), xdr_opaque_auth(), xdr_pmap(), xdr_pmaplist(), xdr_rejected_reply(), xdr_replymsg(), xprt_register(), xprt_unregister() | Безвредность в нитях | MT-Safe

СМОТРИТЕ ТАКЖЕ
xdr(3)

Руководства:
    Remote Procedure Calls: Protocol Specification
    Remote Procedure Call Programming Guide
    rpcgen Programming Guide

RPC: Remote Procedure Call Protocol Specification, RFC 1050, Sun Microsystems, Inc., USC-ISI.