Print this page
8330 Add svc_tp_create_addr to libnsl
Reviewed by: Paul Dagnelie <pcd@delphix.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Sebastien Roy <sebastien.roy@delphix.com>

*** 3,13 **** NAME rpc_svc_create, svc_control, svc_create, svc_destroy, svc_dg_create, svc_fd_create, svc_raw_create, svc_tli_create, svc_tp_create, ! svc_vc_create, svc_door_create - server handle creation routines SYNOPSIS #include <rpc/rpc.h> bool_t svc_control(SVCXPRT *svc, const uint_t req, void *info); --- 3,14 ---- NAME rpc_svc_create, svc_control, svc_create, svc_destroy, svc_dg_create, svc_fd_create, svc_raw_create, svc_tli_create, svc_tp_create, ! svc_tp_create_addr, svc_vc_create, svc_door_create - server handle ! creation routines SYNOPSIS #include <rpc/rpc.h> bool_t svc_control(SVCXPRT *svc, const uint_t req, void *info);
*** 31,49 **** SVCXPRT *svc_raw_create(void); SVCXPRT *svc_tli_create(const int fildes, const struct netconfig *netconf, ! const struct t_bind *bind_addr, const uint_t sendsz, const uint_t recvsz); SVCXPRT *svc_tp_create(const void (*dispatch) (const struct svc_req *, const SVCXPRT *), const rpcprog_t prognum, const rpcvers_t versnum, const struct netconfig *netconf); SVCXPRT *svc_vc_create(const int fildes, const uint_t sendsz, const uint_t recvsz); SVCXPRT *svc_door_create(void (*dispatch)(struct svc_req *, SVCXPRT *), --- 32,57 ---- SVCXPRT *svc_raw_create(void); SVCXPRT *svc_tli_create(const int fildes, const struct netconfig *netconf, ! const struct t_bind *bind_info, const uint_t sendsz, const uint_t recvsz); SVCXPRT *svc_tp_create(const void (*dispatch) (const struct svc_req *, const SVCXPRT *), const rpcprog_t prognum, const rpcvers_t versnum, const struct netconfig *netconf); + SVCXPRT *svc_tp_create_addr(const void (*dispatch) + (const struct svc_req *, const SVCXPRT *), const rpcprog_t prognum, + const rpcvers_t versnum, const struct netconfig *netconf, + const struct netbuf *bind_addr) + ); + + SVCXPRT *svc_vc_create(const int fildes, const uint_t sendsz, const uint_t recvsz); SVCXPRT *svc_door_create(void (*dispatch)(struct svc_req *, SVCXPRT *),
*** 59,252 **** Routines See rpc(3NSL) for the definition of the SVCXPRT data structure. svc_control() ! A function to change or retrieve information about ! a service object. req indicates the type of ! operation and info is a pointer to the ! information. The supported values of req, their ! argument types, and what they do are: SVCGET_VERSQUIET ! If a request is received ! for a program number ! served by this server but ! the version number is ! outside the range ! registered with the ! server, an ! RPC_PROGVERSMISMATCH ! error will normally be ! returned. info should be ! a pointer to an integer. ! Upon successful ! completion of the ! SVCGET_VERSQUIET request, ! *info contains an integer ! which describes the ! server's current ! behavior: 0 indicates ! normal server behavior, ! that is, an ! RPC_PROGVERSMISMATCH ! error will be returned. ! 1 indicates that the out ! of range request will be ! silently ignored. SVCSET_VERSQUIET ! If a request is received ! for a program number ! served by this server but ! the version number is ! outside the range ! registered with the ! server, an ! RPC_PROGVERSMISMATCH ! error will normally be ! returned. It is ! sometimes desirable to ! change this behavior. ! info should be a pointer ! to an integer which is ! either 0, indicating ! normal server behavior ! and an ! RPC_PROGVERSMISMATCH ! error will be returned, ! or 1, indicating that ! the out of range request ! should be silently ! ignored. SVCGET_XID ! Returns the transaction ! ID of connection-oriented ! and connectionless ! transport service calls. ! The transaction ID ! assists in uniquely ! identifying client ! requests for a given RPC ! version, program number, ! procedure, and client. ! The transaction ID is ! extracted from the ! service transport handle ! svc. info must be a ! pointer to an unsigned ! long. Upon successful ! completion of the ! SVCGET_XID request, ! *info contains the ! transaction ID. Note ! that rendezvous and raw ! service handles do not ! define a transaction ID. ! Thus, if the service ! handle is of rendezvous ! or raw type, and the ! request is of type ! SVCGET_XID, svc_control() ! will return FALSE. Note ! also that the transaction ! ID read by the server can ! be set by the client ! through the suboption ! CLSET_XID in ! clnt_control(). See ! clnt_create(3NSL) SVCSET_RECVERRHANDLER ! Attaches or detaches a ! disconnection handler to ! the service handle, svc, ! that will be called when ! a transport error arrives ! during the reception of a ! request or when the ! server is waiting for a ! request and the ! connection shuts down. ! This handler is only ! useful for a connection ! oriented service handle. ! *info contains the ! address of the error ! handler to attach, or ! NULL to detach a ! previously defined one. ! The error handler has two ! arguments. It has a ! pointer to the erroneous ! service handle. It also ! has an integer that ! indicates if the full ! service is closed (when ! equal to zero), or that ! only one connection on ! this service is closed ! (when not equal to zero). void handler (const SVCXPRT *svc, const bool_t isAConnection); ! With the service handle ! address, svc, the error ! handler is able to detect ! which connection has ! failed and to begin an ! error recovery process. ! The error handler can be ! called by multiple ! threads and should be ! implemented in an MT-safe ! way. SVCGET_RECVERRHANDLER ! Upon successful ! completion of the ! SVCGET_RECVERRHANDLER ! request, *info contains ! the address of the ! handler for receiving ! errors. Upon failure, ! *info contains NULL. SVCSET_CONNMAXREC ! Set the maximum record ! size (in bytes) and ! enable non-blocking mode ! for this service handle. ! Value can be set and read ! for both connection and ! non-connection oriented ! transports, but is ! silently ignored for the ! non-connection oriented ! case. The info argument ! should be a pointer to an ! int. SVCGET_CONNMAXREC ! Get the maximum record ! size for this service ! handle. Zero means no ! maximum in effect and the ! connection is in blocking ! mode. The result is not ! significant for non- ! connection oriented ! transports. The info ! argument should be a pointer to an int. This routine returns TRUE if the operation was successful. Otherwise, it returns false. --- 67,186 ---- Routines See rpc(3NSL) for the definition of the SVCXPRT data structure. svc_control() ! A function to change or retrieve information about a ! service object. req indicates the type of operation and ! info is a pointer to the information. The supported ! values of req, their argument types, and what they do ! are: SVCGET_VERSQUIET ! If a request is received for a program number ! served by this server but the version number ! is outside the range registered with the ! server, an RPC_PROGVERSMISMATCH error will ! normally be returned. info should be a ! pointer to an integer. Upon successful ! completion of the SVCGET_VERSQUIET request, ! *info contains an integer which describes the ! server's current behavior: 0 indicates normal ! server behavior, that is, an ! RPC_PROGVERSMISMATCH error will be returned. ! 1 indicates that the out of range request will ! be silently ignored. SVCSET_VERSQUIET ! If a request is received for a program number ! served by this server but the version number ! is outside the range registered with the ! server, an RPC_PROGVERSMISMATCH error will ! normally be returned. It is sometimes ! desirable to change this behavior. info should ! be a pointer to an integer which is either 0, ! indicating normal server behavior and an ! RPC_PROGVERSMISMATCH error will be returned, ! or 1, indicating that the out of range ! request should be silently ignored. SVCGET_XID ! Returns the transaction ID of ! connection-oriented and connectionless ! transport service calls. The transaction ID ! assists in uniquely identifying client ! requests for a given RPC version, program ! number, procedure, and client. The transaction ! ID is extracted from the service transport ! handle svc. info must be a pointer to an ! unsigned long. Upon successful completion of ! the SVCGET_XID request, *info contains the ! transaction ID. Note that rendezvous and raw ! service handles do not define a transaction ! ID. Thus, if the service handle is of ! rendezvous or raw type, and the request is of ! type SVCGET_XID, svc_control() will return ! FALSE. Note also that the transaction ID read ! by the server can be set by the client through ! the suboption CLSET_XID in clnt_control(). ! See clnt_create(3NSL) SVCSET_RECVERRHANDLER ! Attaches or detaches a disconnection handler ! to the service handle, svc, that will be ! called when a transport error arrives during ! the reception of a request or when the server ! is waiting for a request and the connection ! shuts down. This handler is only useful for a ! connection oriented service handle. ! *info contains the address of the error ! handler to attach, or NULL to detach a ! previously defined one. The error handler has ! two arguments. It has a pointer to the ! erroneous service handle. It also has an ! integer that indicates if the full service is ! closed (when equal to zero), or that only one ! connection on this service is closed (when not ! equal to zero). void handler (const SVCXPRT *svc, const bool_t isAConnection); ! With the service handle address, svc, the ! error handler is able to detect which ! connection has failed and to begin an error ! recovery process. The error handler can be ! called by multiple threads and should be ! implemented in an MT-safe way. SVCGET_RECVERRHANDLER ! Upon successful completion of the ! SVCGET_RECVERRHANDLER request, *info contains ! the address of the handler for receiving ! errors. Upon failure, *info contains NULL. SVCSET_CONNMAXREC ! Set the maximum record size (in bytes) and ! enable non-blocking mode for this service ! handle. Value can be set and read for both ! connection and non-connection oriented ! transports, but is silently ignored for the ! non-connection oriented case. The info ! argument should be a pointer to an int. SVCGET_CONNMAXREC ! Get the maximum record size for this service ! handle. Zero means no maximum in effect and ! the connection is in blocking mode. The result ! is not significant for non-connection oriented ! transports. The info argument should be a pointer to an int. This routine returns TRUE if the operation was successful. Otherwise, it returns false.
*** 253,391 **** svc_create() svc_create() creates server handles for all the transports belonging to the class nettype. ! nettype defines a class of transports which can be ! used for a particular application. The transports ! are tried in left to right order in NETPATH ! variable or in top to bottom order in the ! netconfig database. If nettype is NULL, it ! defaults to netpath. ! svc_create() registers itself with the rpcbind ! service (see rpcbind(1M)). dispatch is called when ! there is a remote procedure call for the given ! prognum and versnum; this requires calling ! svc_run() (see svc_run() in rpc_svc_calls(3NSL)). ! If svc_create() succeeds, it returns the number of ! server handles it created, otherwise it returns 0 ! and an error message is logged. svc_destroy() ! A function macro that destroys the RPC service ! handle xprt. Destruction usually involves ! deallocation of private data structures, including ! xprt itself. Use of xprt is undefined after ! calling this routine. svc_dg_create() This routine creates a connectionless RPC service handle, and returns a pointer to it. This routine returns NULL if it fails, and an error message is ! logged. sendsz and recvsz are parameters used to ! specify the size of the buffers. If they are 0, ! suitable defaults are chosen. The file descriptor ! fildes should be open and bound. The server is not ! registered with rpcbind(1M). ! Warning: since connectionless-based RPC messages ! can only hold limited amount of encoded data, this ! transport cannot be used for procedures that take ! large arguments or return huge results. svc_fd_create() ! This routine creates a service on top of an open ! and bound file descriptor, and returns the handle ! to it. Typically, this descriptor is a connected ! file descriptor for a connection-oriented ! transport. sendsz and recvsz indicate sizes for ! the send and receive buffers. If they are 0, ! reasonable defaults are chosen. This routine ! returns NULL if it fails, and an error message is ! logged. svc_raw_create() ! This routine creates an RPC service handle and ! returns a pointer to it. The transport is really ! a buffer within the process's address space, so ! the corresponding RPC client should live in the ! same address space; (see clnt_raw_create() in ! rpc_clnt_create(3NSL)). This routine allows ! simulation of RPC and acquisition of RPC overheads ! (such as round trip times), without any kernel and ! networking interference. This routine returns NULL if it fails, and an error message is logged. Note: svc_run() should not be called when the raw interface is being used. svc_tli_create() ! This routine creates an RPC server handle, and ! returns a pointer to it. fildes is the file ! descriptor on which the service is listening. If ! fildes is RPC_ANYFD, it opens a file descriptor on ! the transport specified by netconf. If the file ! descriptor is unbound and bindaddr is non-null ! fildes is bound to the address specified by ! bindaddr, otherwise fildes is bound to a default ! address chosen by the transport. In the case where ! the default address is chosen, the number of ! outstanding connect requests is set to 8 for ! connection-oriented transports. The user may ! specify the size of the send and receive buffers ! with the parameters sendsz and recvsz ; values of ! 0 choose suitable defaults. This routine returns ! NULL if it fails, and an error message is logged. ! The server is not registered with the rpcbind(1M) ! service. svc_tp_create() ! svc_tp_create() creates a server handle for the ! network specified by netconf, and registers itself ! with the rpcbind service. dispatch is called when ! there is a remote procedure call for the given ! prognum and versnum; this requires calling ! svc_run(). svc_tp_create() returns the service ! handle if it succeeds, otherwise a NULL is ! returned and an error message is logged. svc_vc_create() ! This routine creates a connection-oriented RPC ! service and returns a pointer to it. This routine ! returns NULL if it fails, and an error message is ! logged. The users may specify the size of the send ! and receive buffers with the parameters sendsz and ! recvsz; values of 0 choose suitable defaults. The ! file descriptor fildes should be open and bound. ! The server is not registered with the rpcbind(1M) ! service. svc_door_create() ! This routine creates an RPC server handle over ! doors for the given program prognum and version ! versnum and returns a pointer to it. Doors is a ! transport mechanism that facilitates fast data ! transfer between processes on the same machine. ! The user may set the size of the send buffer with ! the parameter sendsz. If sendsz is 0, the corresponding default buffer size is 16 Kbyte. If ! successful, the svc_door_create() routine returns ! the service handle. Otherwise it returns NULL and ! sets a value for rpc_createerr. The server is not ! registered with rpcbind(1M). The SVCSET_CONNMAXREC ! and SVCGET_CONNMAXREC svc_control() requests can ! be used to set and change the maximum allowed ! request size for the doors transport. ATTRIBUTES See attributes(5) for descriptions of the following attributes: --- 187,328 ---- svc_create() svc_create() creates server handles for all the transports belonging to the class nettype. ! nettype defines a class of transports which can be used ! for a particular application. The transports are tried ! in left to right order in NETPATH variable or in top to ! bottom order in the netconfig database. If nettype is ! NULL, it defaults to netpath. ! svc_create() registers itself with the rpcbind service ! (see rpcbind(1M)). dispatch is called when there is a ! remote procedure call for the given prognum and versnum; ! this requires calling svc_run() (see svc_run() in ! rpc_svc_calls(3NSL)). If svc_create() succeeds, it ! returns the number of server handles it created, ! otherwise it returns 0 and an error message is logged. svc_destroy() ! A function macro that destroys the RPC service handle ! xprt. Destruction usually involves deallocation of ! private data structures, including xprt itself. Use of ! xprt is undefined after calling this routine. svc_dg_create() This routine creates a connectionless RPC service handle, and returns a pointer to it. This routine returns NULL if it fails, and an error message is ! logged. sendsz and recvsz are parameters used to specify ! the size of the buffers. If they are 0, suitable ! defaults are chosen. The file descriptor fildes should ! be open and bound. The server is not registered with ! rpcbind(1M). ! Warning: since connectionless-based RPC messages can ! only hold limited amount of encoded data, this transport ! cannot be used for procedures that take large arguments ! or return huge results. svc_fd_create() ! This routine creates a service on top of an open and ! bound file descriptor, and returns the handle to it. ! Typically, this descriptor is a connected file ! descriptor for a connection-oriented transport. sendsz ! and recvsz indicate sizes for the send and receive ! buffers. If they are 0, reasonable defaults are chosen. ! This routine returns NULL if it fails, and an error ! message is logged. svc_raw_create() ! This routine creates an RPC service handle and returns a ! pointer to it. The transport is really a buffer within ! the process's address space, so the corresponding RPC ! client should live in the same address space; (see ! clnt_raw_create() in rpc_clnt_create(3NSL)). This ! routine allows simulation of RPC and acquisition of RPC ! overheads (such as round trip times), without any kernel ! and networking interference. This routine returns NULL if it fails, and an error message is logged. Note: svc_run() should not be called when the raw interface is being used. svc_tli_create() ! This routine creates an RPC server handle, and returns a ! pointer to it. fildes is the file descriptor on which ! the service is listening. If fildes is RPC_ANYFD, it ! opens a file descriptor on the transport specified by ! netconf. If the file descriptor is unbound and bind_info ! is non-null fildes is bound to the address specified by ! bind_info, otherwise fildes is bound to a default ! address chosen by the transport. In the case where the ! default address is chosen, the number of outstanding ! connect requests is set to 8 for connection-oriented ! transports. The user may specify the size of the send ! and receive buffers with the parameters sendsz and ! recvsz ; values of 0 choose suitable defaults. This ! routine returns NULL if it fails, and an error message ! is logged. The server is not registered with the ! rpcbind(1M) service. svc_tp_create() ! svc_tp_create() creates a server handle for the network ! specified by netconf, and registers itself with the ! rpcbind service. dispatch is called when there is a ! remote procedure call for the given prognum and versnum; ! this requires calling svc_run(). svc_tp_create() ! returns the service handle if it succeeds, otherwise a ! NULL is returned and an error message is logged. + svc_tp_create_addr() + svc_tp_create_addr() creates a server handle for the + network specified by netconf, and registers itself with + the rpcbind service. If bind_addr is non-NULL, that + address is used for the listener binding. If bind_addr + is NULL, this call is the same as svc_tp_create(). + dispatch is called when there is a remote procedure call + for the given prognum and versnum; this requires calling + svc_run(). svc_tp_create_addr() returns the service + handle if it succeeds, otherwise a NULL is returned and + an error message is logged. + + svc_vc_create() ! This routine creates a connection-oriented RPC service ! and returns a pointer to it. This routine returns NULL ! if it fails, and an error message is logged. The users ! may specify the size of the send and receive buffers ! with the parameters sendsz and recvsz; values of 0 ! choose suitable defaults. The file descriptor fildes ! should be open and bound. The server is not registered ! with the rpcbind(1M) service. svc_door_create() ! This routine creates an RPC server handle over doors for ! the given program prognum and version versnum and ! returns a pointer to it. Doors is a transport mechanism ! that facilitates fast data transfer between processes on ! the same machine. The user may set the size of the send ! buffer with the parameter sendsz. If sendsz is 0, the corresponding default buffer size is 16 Kbyte. If ! successful, the svc_door_create() routine returns the ! service handle. Otherwise it returns NULL and sets a ! value for rpc_createerr. The server is not registered ! with rpcbind(1M). The SVCSET_CONNMAXREC and ! SVCGET_CONNMAXREC svc_control() requests can be used to ! set and change the maximum allowed request size for the ! doors transport. ATTRIBUTES See attributes(5) for descriptions of the following attributes:
*** 406,411 **** rpcbind(1M), rpc(3NSL), rpc_clnt_create(3NSL), rpc_svc_calls(3NSL), rpc_svc_err(3NSL), rpc_svc_reg(3NSL), attributes(5) ! May 18, 2017 RPC_SVC_CREATE(3NSL) --- 343,348 ---- rpcbind(1M), rpc(3NSL), rpc_clnt_create(3NSL), rpc_svc_calls(3NSL), rpc_svc_err(3NSL), rpc_svc_reg(3NSL), attributes(5) ! June 19, 2017 RPC_SVC_CREATE(3NSL)