--- libaitrpc/inc/aitrpc_cli.h 2015/07/02 17:52:52 1.1 +++ libaitrpc/inc/aitrpc_cli.h 2015/07/02 22:28:14 1.2 @@ -0,0 +1,334 @@ +/************************************************************************* +* (C) 2015 AITNET ltd - Sofia/Bulgaria - +* by Michael Pounov +* +* $Author: misho $ +* $Id: aitrpc_cli.h,v 1.2 2015/07/02 22:28:14 misho Exp $ +* +************************************************************************** +The ELWIX and AITNET software is distributed under the following +terms: + +All of the documentation and software included in the ELWIX and AITNET +Releases is copyrighted by ELWIX - Sofia/Bulgaria + +Copyright 2004 - 2015 + by Michael Pounov . All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: +This product includes software developed by Michael Pounov +ELWIX - Embedded LightWeight unIX and its contributors. +4. Neither the name of AITNET nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ +#ifndef __AITRPC_CLI_H +#define __AITRPC_CLI_H + + +#include + + +/* Network RPC client elements */ + +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_vars; /* function return variables */ + + void *cli_parent; /* pointer to parent rpc_srv_t for server or to rpc_sess_t for client */ +} rpc_cli_t; +#define RPC_RETVARS(x) ((x)->cli_vars) +#define RPC_SRV_SERVER(x) ((rpc_srv_t*) (x)->cli_parent) +#define RPC_CLI_SESSION(x) ((rpc_sess_t*) (x)->cli_parent) + +/* ----------------------------------------------------------------------- */ + +/* Error support functions */ + +// rpc_GetErrno() Get error code of last operation +int rpc_GetErrno(); +// rpc_GetError() Get error text of last operation +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 + * @pkt = RPC packet + * 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, + ait_val_t * __restrict pkt); +/* + * rpc_Write() - RPC write operation + * + * @sock = socket + * @type = type of socket + * @flags = send flags + * @sa = send to client address, if you use udp protocol + * @pkt = RPC packet + * @blen = write 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, + ait_val_t * __restrict pkt, size_t blen); + +/* + * rpc_pktFreeSpace() - Get free space for payload into RPC packet + * + * @c = RPC client + * return: remains free bytes from packet + */ +size_t rpc_pktFreeSpace(rpc_cli_t * __restrict c); +/* + * rpc_chkPktSession() - Check RPC session + * + * @p = packet session + * @s = active session + * return: -1, 1, 2, 3 are errors or 0 ok + */ +int rpc_chkPktSession(rpc_sess_t *p, rpc_sess_t *s); +/* + * rpc_addPktSession() - Prepare session into network format + * + * @p = packet session + * @s = host session + * return: -1 error or 0 ok + */ +int rpc_addPktSession(rpc_sess_t *p, rpc_sess_t *s); + +/* CLIENT part of functions */ + +/* + * rpc_cli_sendBLOB() - Send BLOB to server + * + * @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 tout); +/* + * rpc_cli_recvBLOB() - Receive BLOB from server + * + * @cli = Client instance + * @var = BLOB variable + * @data = BLOB data, must be e_free after use! + * return: -1 error, 0 ok, 1 remote error + */ +int rpc_cli_recvBLOB(rpc_cli_t * __restrict cli, ait_val_t * __restrict var, void ** __restrict data); +/* + * rpc_cli_delBLOB() - Delete BLOB from server + * + * @cli = Client instance + * @var = BLOB variable + * return: -1 error, 0 ok, 1 remote error + */ +int rpc_cli_delBLOB(rpc_cli_t * __restrict cli, ait_val_t * __restrict var); +/* + * rpc_cli_getBLOB() - Receive BLOB from server and Delete after that. + * + * @cli = Client instance + * @var = BLOB variable + * @data = BLOB data, must be e_free after use! + * return: -1 error, 0 ok, >0 remote error + */ +int rpc_cli_getBLOB(rpc_cli_t * __restrict cli, ait_val_t * __restrict var, + void ** __restrict data); + + +/* RPC Client side functions */ + +/* + * rpc_cli_openClient() - Connect to RPC Server + * + * @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 char InstID, int netBuf, + 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 + * + * @cli = RPC Client session + * return: none + */ +void rpc_cli_closeClient(rpc_cli_t ** __restrict cli); +/* + * rpc_pkt_Send() - Send RPC packet + * + * @sock = Socket + * @type = Type of socket + * @sa = Server address + * @pkt = RPC packet + * @len = Length of packet + * return: -1 error, 0 EOF or >0 sended bytes + */ +int rpc_pkt_Send(int sock, int type, sockaddr_t * __restrict sa, + ait_val_t * __restrict pkt, int len); +/* + * rpc_pkt_Receive() - Receive RPC packet + * + * @sock = Socket + * @type = Type of socket + * @sa = Server address + * @pkt = RPC packet + * @seq = Signed packet with seq.no + * return: -1 error, 0 EOF or >0 received bytes + */ +int rpc_pkt_Receive(int sock, int type, sockaddr_t * __restrict sa, + ait_val_t * __restrict pkt, int seq); +/* + * rpc_pkt_Request() - Build RPC Request packet + * + * @pkt = Packet buffer + * @sess = RPC session info + * @tag = Function tag for execution + * @vars = Function argument array of values, may be NULL + * @noreply = We not want RPC reply + * @nocrc = Without CRC calculation + * @seq = Sign packet with seq.no + * 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, int nocrc, int seq); +/* + * rpc_pkt_Replay() - Decode RPC Replay packet + * + * @pkt = Packet buffer + * @sess = RPC session info, if =NULL don't check session + * @tag = Function tag, if =CALL_TAG_MAX don't check 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, int nocrc); +/* + * rpc_cli_execCall() - Execute RPC call + * + * @cli = RPC Client session + * @noreply = We not want RPC reply + * @tag = Function tag for execution + * @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() + * return: -1 error, 0 ok result or 1 closed rpc connection + */ +int rpc_cli_execCall(rpc_cli_t *cli, int noreply, unsigned short tag, + array_t * __restrict in_vars, array_t ** __restrict out_vars); +/* + * rpc_cli_freeCall() - Free resouce allocated by RPC call + * + * @out_vars = Returned array with variables from RPC call + * return: none + */ +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 + */ +int rpc_cli_ping(rpc_cli_t *cli); + + +/* + * rpc_cli_openBLOBClient() - Connect to BLOB Server + * + * @rpccli = RPC Client session + * @Port = Port for bind server, if Port == 0 default port is selected + * return: NULL == error or !=NULL connection to BLOB server established + */ +rpc_cli_t *rpc_cli_openBLOBClient(rpc_cli_t * __restrict rpccli, unsigned short Port); +/* + * rpc_cli_closeBLOBClient() - Close connection to BLOB server and free resources + * + * @cli = BLOB Client session + * return: none + */ +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); + + +/* + * rpc_cli_openClientExt() - Connect to pipe RPC Server + * + * @InstID = InstID for RPC session request + * @netBuf = Network buffer length (min:512 bytes), if =0 == BUFSIZ (also meaning max RPC packet) + * @fd = File descriptor + * return: NULL == error or !=NULL connection to RPC server established + */ +rpc_cli_t *rpc_cli_openClientExt(u_char InstID, int netBuf, int fd); +/* + * rpc_cli_closeClientExt() - Close pipe connection to RPC server and free resources + * + * @cli = RPC Client session + * return: none + */ +void rpc_cli_closeClientExt(rpc_cli_t ** __restrict cli); + + +#endif