File:  [ELWIX - Embedded LightWeight unIX -] / libaitrpc / inc / aitrpc_cli.h
Revision 1.3: download - view: text, annotated - select for diffs - revision graph
Wed Mar 20 17:32:30 2024 UTC (2 months, 1 week ago) by misho
Branches: MAIN
CVS tags: rpc9_6, RPC9_5, HEAD
Version 9.5

/*************************************************************************
* (C) 2015 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
*  by Michael Pounov <misho@openbsd-bg.org>
*
* $Author: misho $
* $Id: aitrpc_cli.h,v 1.3 2024/03/20 17:32:30 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 <info@elwix.org>

Copyright 2004 - 2024
	by Michael Pounov <misho@elwix.org>.  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 <misho@elwix.org>
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 <aitrpc_pkt.h>


/* 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 = >0 We not want RPC reply, -1 IPC request with 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 = >0 We not want RPC reply, -1 IPC request with 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

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