Diff for /libaitrpc/inc/aitrpc.h between versions 1.14 and 1.25.2.1

version 1.14, 2013/04/02 15:50:14 version 1.25.2.1, 2015/01/15 20:27:49
Line 12  terms: Line 12  terms:
 All of the documentation and software included in the ELWIX and AITNET  All of the documentation and software included in the ELWIX and AITNET
 Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>  Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   
Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013Copyright 2004 - 2014
         by Michael Pounov <misho@elwix.org>.  All rights reserved.          by Michael Pounov <misho@elwix.org>.  All rights reserved.
   
 Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
Line 62  SUCH DAMAGE. Line 62  SUCH DAMAGE.
 #include <aitsched.h>  #include <aitsched.h>
   
   
#define RPC_VERSION             6#define RPC_VERSION             7
 #define RPC_DEFPORT             2611  #define RPC_DEFPORT             2611
   
   /* Additional ELWIX RPC supporting protocols */
   #ifndef SOCK_STREAM
   #define SOCK_STREAM             1       /* stream socket */
   #endif
   #ifndef SOCK_DGRAM
   #define SOCK_DGRAM              2       /* datagram socket */
   #endif
   #ifndef SOCK_RAW
   #define SOCK_RAW                3       /* raw-protocol interface */
   #endif
   #define SOCK_BPF                4       /* ethernet interface */
   #define SOCK_PIPE               5       /* bi-directional pipe interface */
   
 /* RPC call request flags */  /* RPC call request flags */
   
 #define RPC_REPLY               0x0  #define RPC_REPLY               0x0
Line 85  SUCH DAMAGE. Line 98  SUCH DAMAGE.
 #define CALL_BLOBCLIENTS        65528  #define CALL_BLOBCLIENTS        65528
 #define CALL_BLOBVARS           65527  #define CALL_BLOBVARS           65527
   
   /* RPC signals */
   #define SIGFBLOB                54
   
 /* RPC types */  /* RPC types */
   
Line 125  typedef struct { Line 140  typedef struct {
 struct tagRPCCall {  struct tagRPCCall {
         rpc_sess_t      call_session;          rpc_sess_t      call_session;
   
        uint16_t    call_seq;        uint32_t      call_len;
        uint16_t      call_len; 
         uint16_t        call_crc;          uint16_t        call_crc;
   
         union {          union {
Line 143  struct tagRPCCall { Line 157  struct tagRPCCall {
         uint16_t        call_argc;          uint16_t        call_argc;
         ait_val_t       call_argv[0];          ait_val_t       call_argv[0];
 } __packed;                     /* size == 20 bytes */  } __packed;                     /* size == 20 bytes */
#define RPC_CHK_NOREPLY(x)      ((x)->call_req.flags & RPC_NOREPLY)#define RPC_CHK_NOREPLY(x)      (ntohl((u_long) (x)->call_req.flags) & RPC_NOREPLY)
 #define RPC_SET_ERRNO(x, _v)    ((x)->call_rep.eno = htonl((_v)))
   
 /* Network BLOB packet - Header */  /* Network BLOB packet - Header */
   
Line 245  typedef struct { Line 260  typedef struct {
  */   */
 typedef int (*rpc_callback_t)(rpc_cli_t *, struct tagRPCCall *, array_t *);  typedef int (*rpc_callback_t)(rpc_cli_t *, struct tagRPCCall *, array_t *);
   
   #define RPC_CALL_DEFINE(x)      int (x)(rpc_cli_t*, struct tagRPCCall*, array_t*)
   #define RPC_CALL_ARGS(arg1, arg2, arg3) rpc_cli_t* arg1, struct tagRPCCall* arg2, array_t* arg3
   #define RPC_CALL_STDARGS        RPC_CALL_ARGS(cli, rpc, iv)
   
   
 /* ----------------------------------------------------------------------- */  /* ----------------------------------------------------------------------- */
   
 /* Error support functions */  /* Error support functions */
   
 // rpc_GetErrno() Get error code of last operation  // rpc_GetErrno() Get error code of last operation
inline int rpc_GetErrno();int rpc_GetErrno();
 // rpc_GetError() Get error text of last operation  // rpc_GetError() Get error text of last operation
inline const char *rpc_GetError();const char *rpc_GetError();
 // rpc_SetErr() Set error to variables for internal use!!!
 void rpc_SetErr(int eno, char *estr, ...);
   
   
   
 /*  /*
    * rpc_Read() - RPC read operation
    *
    * @sock = socket
    * @type = type of socket
    * @flags = receive flags
    * @sa = check client address, if you use udp protocol
    * @buf = buffer
    * @blen = buffer length
    * return: -1 error, 0 EOF or or >0 readed bytes into buffer
    */
   ssize_t rpc_Read(int sock, int type, int flags, sockaddr_t * __restrict sa, 
                   unsigned char * __restrict buf, size_t blen);
   /*
    * rpc_Write() - RPC write operation
    *
    * @sock = socket
    * @type = type of socket
    * @flags = send flags
    * @sa = send to client address, if you use udp protocol
    * @buf = buffer
    * @blen = buffer length
    * return: -1 error, 0 EOF or >0 written bytes into buffer
    */
   ssize_t rpc_Write(int sock, int type, int flags, sockaddr_t * __restrict sa, 
                   unsigned char * __restrict buf, size_t blen);
   
   /*
  * rpc_chkPktSession() - Check RPC session   * rpc_chkPktSession() - Check RPC session
  *   *
  * @p = packet session   * @p = packet session
  * @s = active session   * @s = active session
  * return: -1, 1, 2, 3 are errors or 0 ok   * return: -1, 1, 2, 3 are errors or 0 ok
  */   */
inline int rpc_chkPktSession(rpc_sess_t *p, rpc_sess_t *s);int rpc_chkPktSession(rpc_sess_t *p, rpc_sess_t *s);
 /*  /*
  * rpc_addPktSession() - Prepare session into network format   * rpc_addPktSession() - Prepare session into network format
  *   *
Line 271  inline int rpc_chkPktSession(rpc_sess_t *p, rpc_sess_t Line 320  inline int rpc_chkPktSession(rpc_sess_t *p, rpc_sess_t
  * @s = host session   * @s = host session
  * return: -1 error or 0 ok   * return: -1 error or 0 ok
  */   */
inline int rpc_addPktSession(rpc_sess_t *p, rpc_sess_t *s);int rpc_addPktSession(rpc_sess_t *p, rpc_sess_t *s);
 /*  /*
  * rpc_register_srvPing() - Register ping service function   * rpc_register_srvPing() - Register ping service function
  *   *
  * @srv = RPC server instance   * @srv = RPC server instance
  * return: -1 error or 0 ok   * return: -1 error or 0 ok
  */   */
inline int rpc_register_srvPing(rpc_srv_t * __restrict srv);int rpc_register_srvPing(rpc_srv_t * __restrict srv);
 /*  /*
  * rpc_register_srvServices() - Register internal service functions   * rpc_register_srvServices() - Register internal service functions
  *   *
Line 316  rpc_srv_t *rpc_srv_initServer(unsigned char InstID, in Line 365  rpc_srv_t *rpc_srv_initServer(unsigned char InstID, in
  * @psrv = RPC Server instance   * @psrv = RPC Server instance
  * return: none   * return: none
  */   */
inline void rpc_srv_endServer(rpc_srv_t ** __restrict psrv);void rpc_srv_endServer(rpc_srv_t ** __restrict psrv);
 /*  /*
  * rpc_srv_loopServer() - Execute Main server loop and wait for clients requests   * rpc_srv_loopServer() - Execute Main server loop and wait for clients requests
  *   *
Line 324  inline void rpc_srv_endServer(rpc_srv_t ** __restrict  Line 373  inline void rpc_srv_endServer(rpc_srv_t ** __restrict 
  * return: -1 error or 0 ok, infinite loop ...   * return: -1 error or 0 ok, infinite loop ...
  */   */
 int rpc_srv_loopServer(rpc_srv_t * __restrict srv);  int rpc_srv_loopServer(rpc_srv_t * __restrict srv);
#define rpc_srv_execServer(_srv, _sync) do { assert((_srv)); \#define rpc_srv_execServer(_srv, _sync) \
                                                if (!(_srv)->srv_kill) { \        do { assert((_srv)); \
                                                        pthread_create(&(_srv)->srv_tid, NULL, (void*(*)(void*)) \                if (!(_srv)->srv_kill) { \
                                                                        rpc_srv_loopServer, (_srv)); \                        pthread_create(&(_srv)->srv_tid, NULL, (void*(*)(void*)) \
                                                        if ((_sync)) \                                        rpc_srv_loopServer, (_srv)); \
                                                                pthread_join((_srv)->srv_tid, (void**) (_sync)); \                        if ((_sync)) \
                                                        else \                                pthread_join((_srv)->srv_tid, (void**) (_sync)); \
                                                                pthread_detach((_srv)->srv_tid); \                        else \
                                                } } while (0)                                pthread_detach((_srv)->srv_tid); \
         } } while (0)
 #define rpc_srv_killServer(_srv) \
         (assert((_srv)), (_srv)->srv_blob.kill = 1, (_srv)->srv_kill = 1)
   
 /*  /*
  * rpc_srv_initBLOBServer() - Init & create BLOB Server   * rpc_srv_initBLOBServer() - Init & create BLOB Server
Line 349  int rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv, Line 401  int rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv,
  * @srv = RPC Server instance   * @srv = RPC Server instance
  * return: none   * return: none
  */   */
inline void rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv);void rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv);
 /*  /*
  * rpc_srv_loopBLOB() - Execute Main BLOB server loop and wait for clients requests   * rpc_srv_loopBLOB() - Execute Main BLOB server loop and wait for clients requests
  *   *
Line 357  inline void rpc_srv_endBLOBServer(rpc_srv_t * __restri Line 409  inline void rpc_srv_endBLOBServer(rpc_srv_t * __restri
  * return: -1 error or 0 ok, infinite loop ...   * return: -1 error or 0 ok, infinite loop ...
  */   */
 int rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv);  int rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv);
#define rpc_srv_execBLOBServer(_srv)    do { assert((_srv)); \#define rpc_srv_execBLOBServer(_srv) \
                                                if (!(_srv)->srv_kill && !(_srv)->srv_blob.kill) { \        do { assert((_srv)); \
                                                        pthread_create(&(_srv)->srv_blob.tid, NULL, \                if (!(_srv)->srv_kill && !(_srv)->srv_blob.kill) { \
                                                                        (void*(*)(void*)) \                        pthread_create(&(_srv)->srv_blob.tid, NULL, \
                                                                        rpc_srv_loopBLOBServer, (_srv)); \                                        (void*(*)(void*)) rpc_srv_loopBLOBServer, (_srv)); \
                                                        pthread_detach((_srv)->srv_blob.tid); \                        pthread_detach((_srv)->srv_blob.tid); \
                                                } \                } \
                                        } while (0)        } while (0)
   
 /*  /*
    * rpc_srv_initServer2() - Init & create layer2 RPC Server
    *
    * @InstID = Instance for authentication & recognition
    * @concurentClients = Concurent clients at same time to this server
    * @netBuf = Network buffer length (min:512 bytes), if =0 == BUFSIZ (also meaning max RPC packet)
    * @csIface = Interface name for bind server, if NULL first interface on host
    * return: NULL == error or !=NULL bind and created RPC server instance
    */
   rpc_srv_t *rpc_srv_initServer2(u_char InstID, int concurentClients, int netBuf, 
                   const char *csIface);
   
   /*
  * rpc_srv_registerCall() - Register call to RPC server   * rpc_srv_registerCall() - Register call to RPC server
  *   *
  * @srv = RPC Server instance   * @srv = RPC Server instance
Line 390  int rpc_srv_unregisterCall(rpc_srv_t * __restrict srv, Line 454  int rpc_srv_unregisterCall(rpc_srv_t * __restrict srv,
  * @tag = tag for function   * @tag = tag for function
  * return: NULL not found call, !=NULL return call   * return: NULL not found call, !=NULL return call
  */   */
inline rpc_func_t *rpc_srv_getCall(rpc_srv_t * __restrict srv, uint16_t tag);rpc_func_t *rpc_srv_getCall(rpc_srv_t * __restrict srv, uint16_t tag);
 /*  /*
  * rpc_srv_execCall() Execute registered call from RPC server   * rpc_srv_execCall() Execute registered call from RPC server
  *   *
Line 409  int rpc_srv_execCall(rpc_cli_t * __restrict cli, struc Line 473  int rpc_srv_execCall(rpc_cli_t * __restrict cli, struc
  *   *
  * @srv = RPC Server instance   * @srv = RPC Server instance
  * @len = BLOB length object   * @len = BLOB length object
    * @tout = BLOB live timeout in seconds
  * return: NULL error or !=NULL allocated BLOB object   * return: NULL error or !=NULL allocated BLOB object
  */   */
inline rpc_blob_t *rpc_srv_blobCreate(rpc_srv_t * __restrict srv, int len);rpc_blob_t *rpc_srv_blobCreate(rpc_srv_t * __restrict srv, int len, int tout);
 /*  /*
  * rpc_srv_blobMap() - Map blob to memory region    * rpc_srv_blobMap() - Map blob to memory region 
  *   *
Line 419  inline rpc_blob_t *rpc_srv_blobCreate(rpc_srv_t * __re Line 484  inline rpc_blob_t *rpc_srv_blobCreate(rpc_srv_t * __re
  * @blob = Map to this BLOB element   * @blob = Map to this BLOB element
  * return: -1 error or 0 ok   * return: -1 error or 0 ok
  */   */
inline int rpc_srv_blobMap(rpc_srv_t * __restrict srv, rpc_blob_t * __restrict blob);int rpc_srv_blobMap(rpc_srv_t * __restrict srv, rpc_blob_t * __restrict blob);
 /*  /*
  * rpc_srv_blobUnmap() - Unmap blob memory region    * rpc_srv_blobUnmap() - Unmap blob memory region 
  *   *
  * @blob = Mapped BLOB element   * @blob = Mapped BLOB element
  * return: none   * return: none
  */   */
inline void rpc_srv_blobUnmap(rpc_blob_t * __restrict blob);void rpc_srv_blobUnmap(rpc_blob_t * __restrict blob);
 /*  /*
  * rpc_srv_blobFree() - Free blob from disk & memory   * rpc_srv_blobFree() - Free blob from disk & memory
  *   *
Line 434  inline void rpc_srv_blobUnmap(rpc_blob_t * __restrict  Line 499  inline void rpc_srv_blobUnmap(rpc_blob_t * __restrict 
  * @blob = Mapped BLOB element   * @blob = Mapped BLOB element
  * return: -1 error or 0 ok   * return: -1 error or 0 ok
  */   */
inline int rpc_srv_blobFree(rpc_srv_t * __restrict srv, rpc_blob_t * __restrict blob);int rpc_srv_blobFree(rpc_srv_t * __restrict srv, rpc_blob_t * __restrict blob);
   
 /*  /*
  * rpc_srv_registerBLOB() - Register new BLOB to server   * rpc_srv_registerBLOB() - Register new BLOB to server
  *   *
  * @srv = RPC Server instance   * @srv = RPC Server instance
  * @len = BLOB length   * @len = BLOB length
    * @tout = BLOB live timeout in seconds
  * return: NULL error or new registered BLOB   * return: NULL error or new registered BLOB
  */   */
rpc_blob_t *rpc_srv_registerBLOB(rpc_srv_t * __restrict srv, size_t len);rpc_blob_t *rpc_srv_registerBLOB(rpc_srv_t * __restrict srv, size_t len, int tout);
 /*  /*
  * rpc_srv_unregisterBLOB() - Unregister BLOB from server   * rpc_srv_unregisterBLOB() - Unregister BLOB from server
  *   *
Line 459  int rpc_srv_unregisterBLOB(rpc_srv_t * __restrict srv, Line 525  int rpc_srv_unregisterBLOB(rpc_srv_t * __restrict srv,
  * @var = hash for variable   * @var = hash for variable
  * return: NULL not found, !=NULL return blob var   * return: NULL not found, !=NULL return blob var
  */   */
inline rpc_blob_t *rpc_srv_getBLOB(rpc_srv_t * __restrict srv, uint32_t var);rpc_blob_t *rpc_srv_getBLOB(rpc_srv_t * __restrict srv, uint32_t var);
   
 /*  /*
  * rpc_srv_sendBLOB() - Send mapped BLOB to client   * rpc_srv_sendBLOB() - Send mapped BLOB to client
Line 486  int rpc_srv_recvBLOB(rpc_cli_t * __restrict cli, rpc_b Line 552  int rpc_srv_recvBLOB(rpc_cli_t * __restrict cli, rpc_b
  * @cli = Client instance   * @cli = Client instance
  * @var = BLOB variable   * @var = BLOB variable
  * @data = BLOB data   * @data = BLOB data
    * @tout = BLOB live on server timeout in seconds, if =0 default timeout
  * return: -1 error, 0 ok, 1 remote error   * return: -1 error, 0 ok, 1 remote error
  */   */
int rpc_cli_sendBLOB(rpc_cli_t * __restrict cli, ait_val_t * __restrict var, void * __restrict data);int rpc_cli_sendBLOB(rpc_cli_t * __restrict cli, ait_val_t * __restrict var, 
                 void * __restrict data, int tout);
 /*  /*
  * rpc_cli_recvBLOB() - Receive BLOB from server   * rpc_cli_recvBLOB() - Receive BLOB from server
  *   *
Line 514  int rpc_cli_delBLOB(rpc_cli_t * __restrict cli, ait_va Line 582  int rpc_cli_delBLOB(rpc_cli_t * __restrict cli, ait_va
  * @data = BLOB data, must be e_free after use!   * @data = BLOB data, must be e_free after use!
  * return: -1 error, 0 ok, >0 remote error   * return: -1 error, 0 ok, >0 remote error
  */   */
inline int rpc_cli_getBLOB(rpc_cli_t * __restrict cli, ait_val_t * __restrict var, int rpc_cli_getBLOB(rpc_cli_t * __restrict cli, ait_val_t * __restrict var, 
                 void ** __restrict data);                  void ** __restrict data);
   
   
Line 533  inline int rpc_cli_getBLOB(rpc_cli_t * __restrict cli, Line 601  inline int rpc_cli_getBLOB(rpc_cli_t * __restrict cli,
 rpc_cli_t *rpc_cli_openClient(unsigned char InstID, int netBuf,   rpc_cli_t *rpc_cli_openClient(unsigned char InstID, int netBuf, 
                 const char *csHost, unsigned short Port, int proto);                  const char *csHost, unsigned short Port, int proto);
 /*  /*
    * rpc_cli_reconnectClient() - Reconnecting client to RPC server
    *
    * @cli = RPC Client session
    * return: -1 error or 0 ok
    */
   int rpc_cli_reconnectClient(rpc_cli_t * __restrict cli);
   /*
  * rpc_cli_closeClient() - Close connection to RPC server and free resources   * rpc_cli_closeClient() - Close connection to RPC server and free resources
  *   *
  * @cli = RPC Client session   * @cli = RPC Client session
Line 547  void rpc_cli_closeClient(rpc_cli_t ** __restrict cli); Line 622  void rpc_cli_closeClient(rpc_cli_t ** __restrict cli);
  * @sa = Server address   * @sa = Server address
  * @pkt = RPC packet   * @pkt = RPC packet
  * @len = Length of packet   * @len = Length of packet
 * return: -1 error or !=-1 sended bytes * return: -1 error, 0  EOF or >0 sended bytes
  */   */
 int rpc_pkt_Send(int sock, int type, sockaddr_t * __restrict sa,   int rpc_pkt_Send(int sock, int type, sockaddr_t * __restrict sa, 
                 ait_val_t * __restrict pkt, int len);                  ait_val_t * __restrict pkt, int len);
Line 558  int rpc_pkt_Send(int sock, int type, sockaddr_t * __re Line 633  int rpc_pkt_Send(int sock, int type, sockaddr_t * __re
  * @type = Type of socket   * @type = Type of socket
  * @sa = Server address   * @sa = Server address
  * @pkt = RPC packet   * @pkt = RPC packet
 * return: -1 error or !=-1 sended bytes * return: -1 error, 0 EOF or >0 received bytes
  */   */
 int rpc_pkt_Receive(int sock, int type, sockaddr_t * __restrict sa,   int rpc_pkt_Receive(int sock, int type, sockaddr_t * __restrict sa, 
                 ait_val_t * __restrict pkt);                  ait_val_t * __restrict pkt);
Line 579  int rpc_pkt_Request(ait_val_t * __restrict pkt, rpc_se Line 654  int rpc_pkt_Request(ait_val_t * __restrict pkt, rpc_se
  * rpc_pkt_Replay() - Decode RPC Replay packet   * rpc_pkt_Replay() - Decode RPC Replay packet
  *   *
  * @pkt = Packet buffer   * @pkt = Packet buffer
 * @sess = RPC session info * @sess = RPC session info, if =NULL don't check session
  * @tag = Function tag   * @tag = Function tag
  * @vars = Function argument array of values, may be NULL   * @vars = Function argument array of values, may be NULL
  * @nocrc = Without CRC calculation   * @nocrc = Without CRC calculation
Line 595  int rpc_pkt_Replay(ait_val_t * __restrict pkt, rpc_ses Line 670  int rpc_pkt_Replay(ait_val_t * __restrict pkt, rpc_ses
  * @tag = Function tag for execution   * @tag = Function tag for execution
  * @in_vars = IN function argument array of values, may be NULL   * @in_vars = IN function argument array of values, may be NULL
  * @out_vars = OUT returned array of rpc values, if !=NULL must be free after use with ait_freeVars()   * @out_vars = OUT returned array of rpc values, if !=NULL must be free after use with ait_freeVars()
 * return: -1 error or != -1 ok result * return: -1 error, 0 ok result or 1 closed rpc connection
  */   */
 int rpc_cli_execCall(rpc_cli_t *cli, int noreply, unsigned short tag,   int rpc_cli_execCall(rpc_cli_t *cli, int noreply, unsigned short tag, 
                 array_t * __restrict in_vars, array_t ** __restrict out_vars);                  array_t * __restrict in_vars, array_t ** __restrict out_vars);
Line 605  int rpc_cli_execCall(rpc_cli_t *cli, int noreply, unsi Line 680  int rpc_cli_execCall(rpc_cli_t *cli, int noreply, unsi
  * @out_vars = Returned array with variables from RPC call   * @out_vars = Returned array with variables from RPC call
  * return: none   * return: none
  */   */
inline void rpc_cli_freeCall(array_t ** __restrict out_vars);void rpc_cli_freeCall(array_t ** __restrict out_vars);
 /*  /*
  * rpc_cli_ping() - Ping RPC server   * rpc_cli_ping() - Ping RPC server
  *   *
  * @cli = connected client   * @cli = connected client
  * return: -1 error or !=-1 ping seq id   * return: -1 error or !=-1 ping seq id
  */   */
inline int rpc_cli_ping(rpc_cli_t *cli);int rpc_cli_ping(rpc_cli_t *cli);
   
   
 /*  /*
Line 630  rpc_cli_t *rpc_cli_openBLOBClient(rpc_cli_t * __restri Line 705  rpc_cli_t *rpc_cli_openBLOBClient(rpc_cli_t * __restri
  * return: none   * return: none
  */   */
 void rpc_cli_closeBLOBClient(rpc_cli_t ** __restrict cli);  void rpc_cli_closeBLOBClient(rpc_cli_t ** __restrict cli);
   
   
   /*
    * rpc_cli_openClient2() - Connect to layer2 RPC Server
    *
    * @InstID = InstID for RPC session request
    * @netBuf = Network buffer length (min:512 bytes), if =0 == BUFSIZ (also meaning max RPC packet)
    * @csIface = Interface name for bind client, if NULL first interface on host
    * @csHost = Host ethernet address
    * return: NULL == error or !=NULL connection to RPC server established
    */
   rpc_cli_t *rpc_cli_openClient2(u_char InstID, int netBuf, 
                   const char *csIface, const char *csHost);
   /*
    * rpc_cli_closeClient2() - Close layer2 connection to RPC server and free resources
    *
    * @cli = RPC Client session
    * return: none
    */
   void rpc_cli_closeClient2(rpc_cli_t ** __restrict cli);
   
   
 #endif  #endif

Removed from v.1.14  
changed lines
  Added in v.1.25.2.1


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>