--- libaitrpc/inc/aitrpc.h 2013/03/07 23:10:50 1.13 +++ libaitrpc/inc/aitrpc.h 2013/08/20 23:25:18 1.17.2.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitrpc.h,v 1.13 2013/03/07 23:10:50 misho Exp $ +* $Id: aitrpc.h,v 1.17.2.1 2013/08/20 23:25:18 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -62,7 +62,7 @@ SUCH DAMAGE. #include -#define RPC_VERSION 5 +#define RPC_VERSION 6 #define RPC_DEFPORT 2611 /* RPC call request flags */ @@ -85,13 +85,15 @@ SUCH DAMAGE. #define CALL_BLOBCLIENTS 65528 #define CALL_BLOBVARS 65527 +/* RPC signals */ +#define SIGFBLOB 54 /* RPC types */ typedef enum { ok, error, no, /* for blob reply */ get, set, unset /* for blob request */ -} cmd_type_t; +} blob_cmd_type_t; #define RPC_CALLBACK_CHECK_INPUT(x) do { \ @@ -107,10 +109,15 @@ typedef enum { /* RPC session identification */ typedef struct { - uint8_t sess_version; - uint32_t sess_program; - uint8_t sess_process; -} __packed rpc_sess_t; /* size == 6 bytes */ +#if BYTE_ORDER == LITTLE_ENDIAN + uint16_t sess_instance:8; + uint16_t sess_version:8; +#endif +#if BYTE_ORDER == BIG_ENDIAN + uint16_t sess_version:8; + uint16_t sess_instance:8; +#endif +} __packed rpc_sess_t; /* size == 2 bytes */ /* Server managment RPC functions ... */ @@ -137,7 +144,7 @@ struct tagRPCCall { uint16_t call_tag; uint16_t call_argc; ait_val_t call_argv[0]; -} __packed; /* size == 24 bytes */ +} __packed; /* size == 20 bytes */ #define RPC_CHK_NOREPLY(x) ((x)->call_req.flags & RPC_NOREPLY) /* Network BLOB packet - Header */ @@ -148,9 +155,8 @@ struct tagBLOBHdr { uint32_t hdr_var; uint32_t hdr_len; uint32_t hdr_ret; - uint16_t hdr_crc; uint8_t hdr_pad; -} __packed; /* size == 22 bytes */ +} __packed; /* size == 16 bytes */ /* Network RPC client & server elements */ @@ -192,7 +198,7 @@ typedef struct { int cli_id; /* slot id */ int cli_sock; /* socket fd */ sockaddr_t cli_sa; /* host address */ - ait_val_t cli_buf; /* network buffer */ + array_t *cli_buf; /* network buffer(s) */ array_t *cli_vars; /* function return variables */ @@ -247,11 +253,14 @@ typedef int (*rpc_callback_t)(rpc_cli_t *, struct tagR /* Error support functions */ // rpc_GetErrno() Get error code of last operation -inline int rpc_GetErrno(); +int rpc_GetErrno(); // 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_chkPktSession() - Check RPC session * @@ -259,7 +268,7 @@ inline const char *rpc_GetError(); * @s = active session * 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 * @@ -267,14 +276,14 @@ inline int rpc_chkPktSession(rpc_sess_t *p, rpc_sess_t * @s = host session * 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 * * @srv = RPC server instance * 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 * @@ -296,8 +305,7 @@ int rpc_register_blobServices(rpc_srv_t * __restrict s /* * rpc_srv_initServer() - Init & create RPC Server * - * @regProgID = ProgramID for authentication & recognition - * @regProcID = ProcessID for authentication & recognition + * @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) * @csHost = Host name or address for bind server, if NULL any address @@ -305,8 +313,7 @@ int rpc_register_blobServices(rpc_srv_t * __restrict s * @proto = Protocol, if == 0 choose SOCK_STREAM * return: NULL == error or !=NULL bind and created RPC server instance */ -rpc_srv_t *rpc_srv_initServer(unsigned int regProgID, unsigned char regProcID, - int concurentClients, int netBuf, +rpc_srv_t *rpc_srv_initServer(unsigned char InstID, int concurentClients, int netBuf, const char *csHost, unsigned short Port, int proto); /* * rpc_srv_endServer() - Destroy RPC server, close all opened sockets and free resources @@ -314,7 +321,7 @@ rpc_srv_t *rpc_srv_initServer(unsigned int regProgID, * @psrv = RPC Server instance * 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 * @@ -347,7 +354,7 @@ int rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv, * @srv = RPC Server instance * 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 * @@ -388,7 +395,7 @@ int rpc_srv_unregisterCall(rpc_srv_t * __restrict srv, * @tag = tag for function * 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 * @@ -407,9 +414,10 @@ int rpc_srv_execCall(rpc_cli_t * __restrict cli, struc * * @srv = RPC Server instance * @len = BLOB length object + * @tout = BLOB live timeout in seconds * 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 * @@ -417,14 +425,14 @@ inline rpc_blob_t *rpc_srv_blobCreate(rpc_srv_t * __re * @blob = Map to this BLOB element * 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 * * @blob = Mapped BLOB element * 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 * @@ -432,16 +440,17 @@ inline void rpc_srv_blobUnmap(rpc_blob_t * __restrict * @blob = Mapped BLOB element * 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 * * @srv = RPC Server instance * @len = BLOB length + * @tout = BLOB live timeout in seconds * 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 * @@ -457,7 +466,7 @@ int rpc_srv_unregisterBLOB(rpc_srv_t * __restrict srv, * @var = hash for variable * 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 @@ -484,9 +493,11 @@ int rpc_srv_recvBLOB(rpc_cli_t * __restrict cli, rpc_b * @cli = Client instance * @var = BLOB variable * @data = BLOB data + * @tout = BLOB live on server timeout in seconds, if =0 default timeout * 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 * @@ -512,7 +523,7 @@ int rpc_cli_delBLOB(rpc_cli_t * __restrict cli, ait_va * @data = BLOB data, must be e_free after use! * 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); @@ -521,15 +532,14 @@ inline int rpc_cli_getBLOB(rpc_cli_t * __restrict cli, /* * rpc_cli_openClient() - Connect to RPC Server * - * @ProgID = ProgramID for RPC session request - * @ProcID = ProcessID for RPC session request + * @InstID = InstID for RPC session request * @netBuf = Network buffer length (min:512 bytes), if =0 == BUFSIZ (also meaning max RPC packet) * @csHost = Host name or IP address for bind server * @Port = Port for bind server, if Port == 0 default port is selected * @proto = Protocol, if == 0 choose SOCK_STREAM * return: NULL == error or !=NULL connection to RPC server established */ -rpc_cli_t *rpc_cli_openClient(unsigned int ProgID, unsigned char ProcID, int netBuf, +rpc_cli_t *rpc_cli_openClient(unsigned char InstID, int netBuf, const char *csHost, unsigned short Port, int proto); /* * rpc_cli_closeClient() - Close connection to RPC server and free resources @@ -569,10 +579,11 @@ int rpc_pkt_Receive(int sock, int type, sockaddr_t * _ * @tag = Function tag for execution * @vars = Function argument array of values, may be NULL * @noreply = We not want RPC reply + * @nocrc = Without CRC calculation * return: -1 error or != -1 prepared bytes into packet */ int rpc_pkt_Request(ait_val_t * __restrict pkt, rpc_sess_t * __restrict sess, - unsigned short tag, array_t * __restrict vars, int noreply); + unsigned short tag, array_t * __restrict vars, int noreply, int nocrc); /* * rpc_pkt_Replay() - Decode RPC Replay packet * @@ -580,10 +591,11 @@ int rpc_pkt_Request(ait_val_t * __restrict pkt, rpc_se * @sess = RPC session info * @tag = Function tag * @vars = Function argument array of values, may be NULL + * @nocrc = Without CRC calculation * return: -1 error or != -1 return value from function */ int rpc_pkt_Replay(ait_val_t * __restrict pkt, rpc_sess_t * __restrict sess, - unsigned short tag, array_t ** __restrict vars); + unsigned short tag, array_t ** __restrict vars, int nocrc); /* * rpc_cli_execCall() - Execute RPC call * @@ -602,14 +614,14 @@ int rpc_cli_execCall(rpc_cli_t *cli, int noreply, unsi * @out_vars = Returned array with variables from RPC call * 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 * * @cli = connected client * 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); /*