File:  [ELWIX - Embedded LightWeight unIX -] / libaitrpc / inc / aitrpc.h
Revision 1.25.2.4: download - view: text, annotated - select for diffs - revision graph
Sun Jan 18 01:03:49 2015 UTC (9 years, 5 months ago) by misho
Branches: rpc7_3
Diff to: branchpoint 1.25: preferred, unified
adds pipe client init funcs

    1: /*************************************************************************
    2: * (C) 2010 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
    3: *  by Michael Pounov <misho@openbsd-bg.org>
    4: *
    5: * $Author: misho $
    6: * $Id: aitrpc.h,v 1.25.2.4 2015/01/18 01:03:49 misho Exp $
    7: *
    8: **************************************************************************
    9: The ELWIX and AITNET software is distributed under the following
   10: terms:
   11: 
   12: All of the documentation and software included in the ELWIX and AITNET
   13: Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   14: 
   15: Copyright 2004 - 2015
   16: 	by Michael Pounov <misho@elwix.org>.  All rights reserved.
   17: 
   18: Redistribution and use in source and binary forms, with or without
   19: modification, are permitted provided that the following conditions
   20: are met:
   21: 1. Redistributions of source code must retain the above copyright
   22:    notice, this list of conditions and the following disclaimer.
   23: 2. Redistributions in binary form must reproduce the above copyright
   24:    notice, this list of conditions and the following disclaimer in the
   25:    documentation and/or other materials provided with the distribution.
   26: 3. All advertising materials mentioning features or use of this software
   27:    must display the following acknowledgement:
   28: This product includes software developed by Michael Pounov <misho@elwix.org>
   29: ELWIX - Embedded LightWeight unIX and its contributors.
   30: 4. Neither the name of AITNET nor the names of its contributors
   31:    may be used to endorse or promote products derived from this software
   32:    without specific prior written permission.
   33: 
   34: THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND
   35: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   36: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   37: ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   38: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   39: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   40: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   41: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   42: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   43: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   44: SUCH DAMAGE.
   45: */
   46: #ifndef __AITRPC_H
   47: #define __AITRPC_H
   48: 
   49: 
   50: #include <assert.h>
   51: #include <stdlib.h>
   52: #include <string.h>
   53: #include <errno.h>
   54: #include <sys/types.h>
   55: #include <sys/param.h>
   56: #if !defined(__NetBSD__)
   57: #include <sys/limits.h>
   58: #endif
   59: #include <sys/socket.h>
   60: #include <sys/queue.h>
   61: #include <elwix.h>
   62: #include <aitsched.h>
   63: 
   64: 
   65: #define RPC_VERSION		7
   66: #define RPC_DEFPORT		2611
   67: 
   68: /* Additional ELWIX RPC supporting protocols */
   69: #ifndef SOCK_STREAM
   70: #define SOCK_STREAM		1	/* stream socket */
   71: #endif
   72: #ifndef SOCK_DGRAM
   73: #define SOCK_DGRAM		2	/* datagram socket */
   74: #endif
   75: #ifndef SOCK_RAW
   76: #define SOCK_RAW		3	/* raw-protocol interface */
   77: #endif
   78: #define SOCK_BPF		4	/* ethernet interface */
   79: #define SOCK_EXT		5	/* bi-directional pipe interface */
   80: 
   81: /* RPC call request flags */
   82: 
   83: #define RPC_REPLY		0x0
   84: #define RPC_NOREPLY		0x1
   85: 
   86: /* RPC builtin registed calls */
   87: 
   88: #define CALL_TAG_MAX		65535
   89: 
   90: #define CALL_SRVPING		65534
   91: 
   92: #define CALL_SRVSHUTDOWN	65533
   93: #define CALL_SRVCLIENTS		65532
   94: #define CALL_SRVCALLS		65531
   95: #define CALL_SRVSESSIONS	65530
   96: 
   97: #define CALL_BLOBSHUTDOWN	65529
   98: #define CALL_BLOBCLIENTS	65528
   99: #define CALL_BLOBVARS		65527
  100: 
  101: /* RPC signals */
  102: #define SIGFBLOB		54
  103: 
  104: /* RPC types */
  105: 
  106: typedef enum {
  107: 	ok, error, no, 				/* for blob reply */
  108: 	get, set, unset				/* for blob request */
  109: } blob_cmd_type_t;
  110: 
  111: 
  112: #define RPC_CALLBACK_CHECK_INPUT(x)	do { \
  113: 						assert((x)); \
  114: 						if (!(x)) { \
  115: 							rpc_SetErr(EINVAL, \
  116: 									"Invalid callback parameters ..."); \
  117: 							return -1; \
  118: 						} \
  119: 					} while (0)
  120: 
  121: 
  122: /* RPC session identification */
  123: 
  124: typedef struct {
  125: #if BYTE_ORDER == LITTLE_ENDIAN
  126: 	uint16_t	sess_instance:8;
  127: 	uint16_t	sess_version:8;
  128: #endif
  129: #if BYTE_ORDER == BIG_ENDIAN
  130: 	uint16_t	sess_version:8;
  131: 	uint16_t	sess_instance:8;
  132: #endif
  133: } __packed rpc_sess_t;	/* size == 2 bytes */
  134: 
  135: 
  136: /* Server managment RPC functions ... */
  137: 
  138: /* Network RPC packet - Client request */
  139: 
  140: struct tagRPCCall {
  141: 	rpc_sess_t	call_session;
  142: 
  143: 	uint32_t	call_len;
  144: 	uint16_t	call_crc;
  145: 
  146: 	union {
  147: 		struct {
  148: 			uint64_t	flags;
  149: 		}	call_req;
  150: 		struct {
  151: 			int32_t		ret;
  152: 			int32_t		eno;
  153: 		}	call_rep;
  154: 	};
  155: 
  156: 	uint16_t	call_tag;
  157: 	uint16_t	call_argc;
  158: 	ait_val_t	call_argv[0];
  159: } __packed;			/* size == 20 bytes */
  160: #define RPC_CHK_NOREPLY(x)	(ntohl((u_long) (x)->call_req.flags) & RPC_NOREPLY)
  161: #define RPC_SET_ERRNO(x, _v)	((x)->call_rep.eno = htonl((_v)))
  162: 
  163: /* Network BLOB packet - Header */
  164: 
  165: struct tagBLOBHdr {
  166: 	rpc_sess_t	hdr_session;
  167: 	uint8_t		hdr_cmd;
  168: 	uint32_t	hdr_var;
  169: 	uint32_t	hdr_len;
  170: 	uint32_t	hdr_ret;
  171: 	uint8_t		hdr_pad;
  172: } __packed;			/* size == 16 bytes */
  173: 
  174: /* Network RPC client & server elements */
  175: 
  176: /* RPC function registration element! */
  177: typedef struct tagRPCFunc {
  178: 	ait_val_t		func_name;
  179: 
  180: 	void			*func_parent;
  181: 
  182: 	SLIST_ENTRY(tagRPCFunc)	func_next;
  183: 	AVL_ENTRY(tagRPCFunc)	func_node;
  184: } rpc_func_t;
  185: #define RPC_FUNC_SERVER(x)	((rpc_srv_t*) (x)->func_parent)
  186: 
  187: /* Tree root node */
  188: typedef struct tagRPCFuncs {
  189: 	pthread_mutex_t		mtx;
  190: 
  191: 	struct tagRPCFunc	*slh_first;
  192: 	struct tagRPCFunc	*avlh_root;
  193: } rpc_funcs_t;
  194: #define RPC_FUNCS_LOCK(x)	pthread_mutex_lock(&(x)->mtx)
  195: #define RPC_FUNCS_UNLOCK(x)	pthread_mutex_unlock(&(x)->mtx)
  196: #define RPC_FUNCS_ISEMPTY(x)	AVL_EMPTY((x))
  197: 
  198: 
  199: /* BLOB register element */
  200: typedef struct tagBLOB {
  201: 	uint32_t		blob_var;	/* BLOB id */
  202: 
  203: 	size_t			blob_len;	/* size of allocated BLOB data */
  204: 	void			*blob_data;	/* mapped BLOB data */
  205: 
  206: 	TAILQ_ENTRY(tagBLOB)	blob_node;
  207: } rpc_blob_t;
  208: 
  209: 
  210: typedef struct {
  211: 	int		cli_id;		/* slot id */
  212: 	int		cli_sock;	/* socket fd */
  213: 	sockaddr_t	cli_sa;		/* host address */
  214: 	ait_val_t	cli_buf;	/* network buffer */
  215: 
  216: 	array_t		*cli_vars;	/* function return variables */
  217: 
  218: 	void		*cli_parent;	/* pointer to parent rpc_srv_t for server or to rpc_sess_t for client */
  219: } rpc_cli_t;
  220: #define RPC_RETVARS(x)		((x)->cli_vars)
  221: #define RPC_SRV_SERVER(x)	((rpc_srv_t*) (x)->cli_parent)
  222: #define RPC_CLI_SESSION(x)	((rpc_sess_t*) (x)->cli_parent)
  223: 
  224: typedef struct {
  225: 	rpc_sess_t			srv_session;	/* RPC session registration info */
  226: 	int				srv_netbuf;	/* size of network buffer */
  227: 	int				srv_proto;	/* Server protocol */
  228: 
  229: 	pthread_t			srv_tid;	/* RPC exec pthread */
  230: 	sched_root_task_t		*srv_root;	/* RPC server scheduler */
  231: 	intptr_t			srv_kill;	/* Scheduler condition variable */
  232: 
  233: 	rpc_cli_t			srv_server;	/* RPC server socket */
  234: 	array_t				*srv_clients;	/* connected rpc client sockets */
  235: 
  236: 	rpc_funcs_t			srv_funcs;	/* RPC functions */
  237: 
  238: 	struct {
  239: 		pthread_t			tid;		/* BLOB exec pthread */
  240: 		sched_root_task_t		*root;		/* BLOB server scheduler */
  241: 		intptr_t			kill;		/* BLOB server state: ==0 disable | !=0 enable */
  242: 
  243: 		ait_val_t			dir;		/* BLOB states directory */
  244: 
  245: 		rpc_cli_t			server;		/* BLOB server socket */
  246: 		array_t				*clients;	/* connected blob client sockets */
  247: 
  248: 		TAILQ_HEAD(, tagBLOB)		blobs;		/* registered blob variables list */
  249: 	} 				srv_blob;
  250: } rpc_srv_t;
  251: 
  252: 
  253: /* 
  254:  * (*rpc_callback_t)() - Callback type definition for RPC call in server process
  255:  *
  256:  * @arg1 = RPC client
  257:  * @arg2 = RPC packet header
  258:  * @arg3 = input array with values from RPC call execution request
  259:  * return: -1 error or >-1 success execution
  260:  */
  261: typedef int (*rpc_callback_t)(rpc_cli_t *, struct tagRPCCall *, array_t *);
  262: 
  263: #define RPC_CALL_DEFINE(x)	int (x)(rpc_cli_t*, struct tagRPCCall*, array_t*)
  264: #define RPC_CALL_ARGS(arg1, arg2, arg3)	rpc_cli_t* arg1, struct tagRPCCall* arg2, array_t* arg3
  265: #define RPC_CALL_STDARGS	RPC_CALL_ARGS(cli, rpc, iv)
  266: 
  267: 
  268: /* ----------------------------------------------------------------------- */
  269: 
  270: /* Error support functions */
  271: 
  272: // rpc_GetErrno() Get error code of last operation
  273: int rpc_GetErrno();
  274: // rpc_GetError() Get error text of last operation
  275: const char *rpc_GetError();
  276: // rpc_SetErr() Set error to variables for internal use!!!
  277: void rpc_SetErr(int eno, char *estr, ...);
  278: 
  279: 
  280: 
  281: /*
  282:  * rpc_Read() - RPC read operation
  283:  *
  284:  * @sock = socket
  285:  * @type = type of socket
  286:  * @flags = receive flags
  287:  * @sa = check client address, if you use udp protocol
  288:  * @buf = buffer
  289:  * @blen = buffer length
  290:  * return: -1 error, 0 EOF or or >0 readed bytes into buffer
  291:  */
  292: ssize_t rpc_Read(int sock, int type, int flags, sockaddr_t * __restrict sa, 
  293: 		unsigned char * __restrict buf, size_t blen);
  294: /*
  295:  * rpc_Write() - RPC write operation
  296:  *
  297:  * @sock = socket
  298:  * @type = type of socket
  299:  * @flags = send flags
  300:  * @sa = send to client address, if you use udp protocol
  301:  * @buf = buffer
  302:  * @blen = buffer length
  303:  * return: -1 error, 0 EOF or >0 written bytes into buffer
  304:  */
  305: ssize_t rpc_Write(int sock, int type, int flags, sockaddr_t * __restrict sa, 
  306: 		unsigned char * __restrict buf, size_t blen);
  307: 
  308: /*
  309:  * rpc_chkPktSession() - Check RPC session
  310:  *
  311:  * @p = packet session
  312:  * @s = active session
  313:  * return: -1, 1, 2, 3 are errors or 0 ok
  314:  */
  315: int rpc_chkPktSession(rpc_sess_t *p, rpc_sess_t *s);
  316: /*
  317:  * rpc_addPktSession() - Prepare session into network format
  318:  *
  319:  * @p = packet session
  320:  * @s = host session
  321:  * return: -1 error or 0 ok
  322:  */
  323: int rpc_addPktSession(rpc_sess_t *p, rpc_sess_t *s);
  324: /*
  325:  * rpc_register_srvPing() - Register ping service function
  326:  *
  327:  * @srv = RPC server instance
  328:  * return: -1 error or 0 ok
  329:  */
  330: int rpc_register_srvPing(rpc_srv_t * __restrict srv);
  331: /*
  332:  * rpc_register_srvServices() - Register internal service functions
  333:  *
  334:  * @srv = RPC server instance
  335:  * return: -1 error or 0 ok
  336:  */
  337: int rpc_register_srvServices(rpc_srv_t * __restrict srv);
  338: /*
  339:  * rpc_register_blobServices() - Register internal service functions
  340:  *
  341:  * @srv = RPC server instance
  342:  * return: -1 error or 0 ok
  343:  */
  344: int rpc_register_blobServices(rpc_srv_t * __restrict srv);
  345: 
  346: 
  347: /* RPC Server side functions */
  348: 
  349: /*
  350:  * rpc_srv_initServer() - Init & create RPC Server
  351:  *
  352:  * @InstID = Instance for authentication & recognition
  353:  * @concurentClients = Concurent clients at same time to this server
  354:  * @netBuf = Network buffer length (min:512 bytes), if =0 == BUFSIZ (also meaning max RPC packet)
  355:  * @csHost = Host name or address for bind server, if NULL any address
  356:  * @Port = Port for bind server, if Port == 0 default port is selected
  357:  * @proto = Protocol, if == 0 choose SOCK_STREAM
  358:  * return: NULL == error or !=NULL bind and created RPC server instance
  359:  */
  360: rpc_srv_t *rpc_srv_initServer(unsigned char InstID, int concurentClients, int netBuf, 
  361: 		const char *csHost, unsigned short Port, int proto);
  362: /*
  363:  * rpc_srv_endServer() - Destroy RPC server, close all opened sockets and free resources
  364:  *
  365:  * @psrv = RPC Server instance
  366:  * return: none
  367:  */
  368: void rpc_srv_endServer(rpc_srv_t ** __restrict psrv);
  369: /*
  370:  * rpc_srv_loopServer() - Execute Main server loop and wait for clients requests
  371:  *
  372:  * @srv = RPC Server instance
  373:  * return: -1 error or 0 ok, infinite loop ...
  374:  */
  375: int rpc_srv_loopServer(rpc_srv_t * __restrict srv);
  376: #define rpc_srv_execServer(_srv, _sync) \
  377: 	do { assert((_srv)); \
  378: 		if (!(_srv)->srv_kill) { \
  379: 			pthread_create(&(_srv)->srv_tid, NULL, (void*(*)(void*)) \
  380: 					rpc_srv_loopServer, (_srv)); \
  381: 			if ((_sync)) \
  382: 				pthread_join((_srv)->srv_tid, (void**) (_sync)); \
  383: 			else \
  384: 				pthread_detach((_srv)->srv_tid); \
  385: 	} } while (0)
  386: #define rpc_srv_killServer(_srv) \
  387: 	(assert((_srv)), (_srv)->srv_blob.kill = 1, (_srv)->srv_kill = 1)
  388: 
  389: /*
  390:  * rpc_srv_initBLOBServer() - Init & create BLOB Server
  391:  *
  392:  * @srv = RPC server instance
  393:  * @Port = Port for bind server, if Port == 0 default port is selected
  394:  * @diskDir = Disk place for BLOB file objects
  395:  * return: -1 == error or 0 bind and created BLOB server instance
  396:  */
  397: int rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv, unsigned short Port, const char *diskDir);
  398: /*
  399:  * rpc_srv_endBLOBServer() - Destroy BLOB server, close all opened sockets and free resources
  400:  *
  401:  * @srv = RPC Server instance
  402:  * return: none
  403:  */
  404: void rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv);
  405: /*
  406:  * rpc_srv_loopBLOB() - Execute Main BLOB server loop and wait for clients requests
  407:  *
  408:  * @srv = RPC Server instance
  409:  * return: -1 error or 0 ok, infinite loop ...
  410:  */
  411: int rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv);
  412: #define rpc_srv_execBLOBServer(_srv) \
  413: 	do { assert((_srv)); \
  414: 		if (!(_srv)->srv_kill && !(_srv)->srv_blob.kill) { \
  415: 			pthread_create(&(_srv)->srv_blob.tid, NULL, \
  416: 					(void*(*)(void*)) rpc_srv_loopBLOBServer, (_srv)); \
  417: 			pthread_detach((_srv)->srv_blob.tid); \
  418: 		} \
  419: 	} while (0)
  420: 
  421: /*
  422:  * rpc_srv_initServer2() - Init & create layer2 RPC Server
  423:  *
  424:  * @InstID = Instance for authentication & recognition
  425:  * @concurentClients = Concurent clients at same time to this server
  426:  * @netBuf = Network buffer length (min:512 bytes), if =0 == BUFSIZ (also meaning max RPC packet)
  427:  * @csIface = Interface name for bind server, if NULL first interface on host
  428:  * return: NULL == error or !=NULL bind and created RPC server instance
  429:  */
  430: rpc_srv_t *rpc_srv_initServer2(u_char InstID, int concurentClients, int netBuf, 
  431: 		const char *csIface);
  432: 
  433: /*
  434:  * rpc_srv_initServerExt() - Init & create pipe RPC Server
  435:  *
  436:  * @InstID = Instance for authentication & recognition
  437:  * @netBuf = Network buffer length (min:512 bytes), if =0 == BUFSIZ (also meaning max RPC packet)
  438:  * @fd = File descriptor
  439:  * return: NULL == error or !=NULL bind and created RPC server instance
  440:  */
  441: rpc_srv_t *rpc_srv_initServerExt(u_char InstID, int netBuf, int fd);
  442: 
  443: /*
  444:  * rpc_srv_registerCall() - Register call to RPC server
  445:  *
  446:  * @srv = RPC Server instance
  447:  * @tag = Function tag
  448:  * @funcaddr = Function address
  449:  * return: -1 error, 0 already registered tag or 1 register ok
  450:  */
  451: int rpc_srv_registerCall(rpc_srv_t * __restrict srv, unsigned short tag, void *funcaddr);
  452: /*
  453:  * rpc_srv_unregisterCall() - Unregister call from RPC server
  454:  *
  455:  * @srv = RPC Server instance
  456:  * @tag = Function tag
  457:  * return: -1 error, 0 not found call, 1 unregister ok
  458:  */
  459: int rpc_srv_unregisterCall(rpc_srv_t * __restrict srv, unsigned short tag);
  460: /*
  461:  * rpc_srv_getCall()  - Get registered call from RPC server
  462:  *
  463:  * @srv = RPC Server instance
  464:  * @tag = tag for function
  465:  * return: NULL not found call, !=NULL return call
  466:  */
  467: rpc_func_t *rpc_srv_getCall(rpc_srv_t * __restrict srv, uint16_t tag);
  468: /*
  469:  * rpc_srv_execCall() Execute registered call from RPC server
  470:  *
  471:  * @cli = RPC client
  472:  * @rpc = IN RPC call structure
  473:  * @funcname = Execute RPC function
  474:  * @args = IN RPC calling arguments from RPC client
  475:  * return: -1 error, !=-1 ok
  476:  */
  477: int rpc_srv_execCall(rpc_cli_t * __restrict cli, struct tagRPCCall * __restrict rpc, 
  478: 		ait_val_t funcname, array_t * __restrict args);
  479: 
  480: 
  481: /*
  482:  * rpc_srv_blobCreate() - Create and map blob to memory region and return object
  483:  *
  484:  * @srv = RPC Server instance
  485:  * @len = BLOB length object
  486:  * @tout = BLOB live timeout in seconds
  487:  * return: NULL error or !=NULL allocated BLOB object
  488:  */
  489: rpc_blob_t *rpc_srv_blobCreate(rpc_srv_t * __restrict srv, int len, int tout);
  490: /*
  491:  * rpc_srv_blobMap() - Map blob to memory region 
  492:  *
  493:  * @srv = RPC Server instance
  494:  * @blob = Map to this BLOB element
  495:  * return: -1 error or 0 ok
  496:  */
  497: int rpc_srv_blobMap(rpc_srv_t * __restrict srv, rpc_blob_t * __restrict blob);
  498: /*
  499:  * rpc_srv_blobUnmap() - Unmap blob memory region 
  500:  *
  501:  * @blob = Mapped BLOB element
  502:  * return: none
  503:  */
  504: void rpc_srv_blobUnmap(rpc_blob_t * __restrict blob);
  505: /*
  506:  * rpc_srv_blobFree() - Free blob from disk & memory
  507:  *
  508:  * @srv = RPC Server instance
  509:  * @blob = Mapped BLOB element
  510:  * return: -1 error or 0 ok
  511:  */
  512: int rpc_srv_blobFree(rpc_srv_t * __restrict srv, rpc_blob_t * __restrict blob);
  513: 
  514: /*
  515:  * rpc_srv_registerBLOB() - Register new BLOB to server
  516:  *
  517:  * @srv = RPC Server instance
  518:  * @len = BLOB length
  519:  * @tout = BLOB live timeout in seconds
  520:  * return: NULL error or new registered BLOB
  521:  */
  522: rpc_blob_t *rpc_srv_registerBLOB(rpc_srv_t * __restrict srv, size_t len, int tout);
  523: /*
  524:  * rpc_srv_unregisterBLOB() - Unregister BLOB from server
  525:  *
  526:  * @srv = RPC Server instance
  527:  * @var = BLOB Variable for unregister
  528:  * return: -1 error, 0 not found call, 1 unregister ok
  529:  */
  530: int rpc_srv_unregisterBLOB(rpc_srv_t * __restrict srv, uint32_t var);
  531: /*
  532:  * rpc_srv_getBLOB() - Get registered BLOB 
  533:  *
  534:  * @srv = RPC Server instance
  535:  * @var = hash for variable
  536:  * return: NULL not found, !=NULL return blob var
  537:  */
  538: rpc_blob_t *rpc_srv_getBLOB(rpc_srv_t * __restrict srv, uint32_t var);
  539: 
  540: /*
  541:  * rpc_srv_sendBLOB() - Send mapped BLOB to client
  542:  *
  543:  * @cli = Client instance
  544:  * @blob = Mapped BLOB element
  545:  * return: -1 error, 0 ok
  546:  */
  547: int rpc_srv_sendBLOB(rpc_cli_t * __restrict cli, rpc_blob_t * __restrict blob);
  548: /*
  549:  * rpc_srv_recvBLOB() - Receive BLOB from client
  550:  *
  551:  * @cli = Client instance
  552:  * @blob = Mapped BLOB element
  553:  * return: -1 error, 0 ok, >0 unreceived data from client, may be error?
  554:  */
  555: int rpc_srv_recvBLOB(rpc_cli_t * __restrict cli, rpc_blob_t * __restrict blob);
  556: 
  557: /* CLIENT part of functions */
  558: 
  559: /*
  560:  * rpc_cli_sendBLOB() - Send BLOB to server
  561:  *
  562:  * @cli = Client instance
  563:  * @var = BLOB variable
  564:  * @data = BLOB data
  565:  * @tout = BLOB live on server timeout in seconds, if =0 default timeout
  566:  * return: -1 error, 0 ok, 1 remote error
  567:  */
  568: int rpc_cli_sendBLOB(rpc_cli_t * __restrict cli, ait_val_t * __restrict var, 
  569: 		void * __restrict data, int tout);
  570: /*
  571:  * rpc_cli_recvBLOB() - Receive BLOB from server
  572:  *
  573:  * @cli = Client instance
  574:  * @var = BLOB variable
  575:  * @data = BLOB data, must be e_free after use!
  576:  * return: -1 error, 0 ok, 1 remote error
  577:  */
  578: int rpc_cli_recvBLOB(rpc_cli_t * __restrict cli, ait_val_t * __restrict var, void ** __restrict data);
  579: /*
  580:  * rpc_cli_delBLOB() - Delete BLOB from server
  581:  *
  582:  * @cli = Client instance
  583:  * @var = BLOB variable
  584:  * return: -1 error, 0 ok, 1 remote error
  585:  */
  586: int rpc_cli_delBLOB(rpc_cli_t * __restrict cli, ait_val_t * __restrict var);
  587: /*
  588:  * rpc_cli_getBLOB() - Receive BLOB from server and Delete after that.
  589:  *
  590:  * @cli = Client instance
  591:  * @var = BLOB variable
  592:  * @data = BLOB data, must be e_free after use!
  593:  * return: -1 error, 0 ok, >0 remote error
  594:  */
  595: int rpc_cli_getBLOB(rpc_cli_t * __restrict cli, ait_val_t * __restrict var, 
  596: 		void ** __restrict data);
  597: 
  598: 
  599: /* RPC Client side functions */
  600: 
  601: /*
  602:  * rpc_cli_openClient() - Connect to RPC Server
  603:  *
  604:  * @InstID = InstID for RPC session request
  605:  * @netBuf = Network buffer length (min:512 bytes), if =0 == BUFSIZ (also meaning max RPC packet)
  606:  * @csHost = Host name or IP address for bind server
  607:  * @Port = Port for bind server, if Port == 0 default port is selected
  608:  * @proto = Protocol, if == 0 choose SOCK_STREAM
  609:  * return: NULL == error or !=NULL connection to RPC server established
  610:  */
  611: rpc_cli_t *rpc_cli_openClient(unsigned char InstID, int netBuf, 
  612: 		const char *csHost, unsigned short Port, int proto);
  613: /*
  614:  * rpc_cli_reconnectClient() - Reconnecting client to RPC server
  615:  *
  616:  * @cli = RPC Client session
  617:  * return: -1 error or 0 ok
  618:  */
  619: int rpc_cli_reconnectClient(rpc_cli_t * __restrict cli);
  620: /*
  621:  * rpc_cli_closeClient() - Close connection to RPC server and free resources
  622:  *
  623:  * @cli = RPC Client session
  624:  * return: none
  625:  */
  626: void rpc_cli_closeClient(rpc_cli_t ** __restrict cli);
  627: /*
  628:  * rpc_pkt_Send() - Send RPC packet
  629:  *
  630:  * @sock = Socket
  631:  * @type = Type of socket
  632:  * @sa = Server address
  633:  * @pkt = RPC packet
  634:  * @len = Length of packet
  635:  * return: -1 error, 0  EOF or >0 sended bytes
  636:  */
  637: int rpc_pkt_Send(int sock, int type, sockaddr_t * __restrict sa, 
  638: 		ait_val_t * __restrict pkt, int len);
  639: /*
  640:  * rpc_pkt_Receive() - Receive RPC packet
  641:  *
  642:  * @sock = Socket
  643:  * @type = Type of socket
  644:  * @sa = Server address
  645:  * @pkt = RPC packet
  646:  * return: -1 error, 0 EOF or >0 received bytes
  647:  */
  648: int rpc_pkt_Receive(int sock, int type, sockaddr_t * __restrict sa, 
  649: 		ait_val_t * __restrict pkt);
  650: /*
  651:  * rpc_pkt_Request() - Build RPC Request packet
  652:  *
  653:  * @pkt = Packet buffer
  654:  * @sess = RPC session info
  655:  * @tag = Function tag for execution
  656:  * @vars = Function argument array of values, may be NULL
  657:  * @noreply = We not want RPC reply
  658:  * @nocrc = Without CRC calculation
  659:  * return: -1 error or != -1 prepared bytes into packet
  660:  */
  661: int rpc_pkt_Request(ait_val_t * __restrict pkt, rpc_sess_t * __restrict sess, 
  662: 		unsigned short tag, array_t * __restrict vars, int noreply, int nocrc);
  663: /*
  664:  * rpc_pkt_Replay() - Decode RPC Replay packet
  665:  *
  666:  * @pkt = Packet buffer
  667:  * @sess = RPC session info, if =NULL don't check session
  668:  * @tag = Function tag
  669:  * @vars = Function argument array of values, may be NULL
  670:  * @nocrc = Without CRC calculation
  671:  * return: -1 error or != -1 return value from function
  672:  */
  673: int rpc_pkt_Replay(ait_val_t * __restrict pkt, rpc_sess_t * __restrict sess, 
  674: 		unsigned short tag, array_t ** __restrict vars, int nocrc);
  675: /*
  676:  * rpc_cli_execCall() - Execute RPC call
  677:  *
  678:  * @cli = RPC Client session
  679:  * @noreply = We not want RPC reply
  680:  * @tag = Function tag for execution
  681:  * @in_vars = IN function argument array of values, may be NULL
  682:  * @out_vars = OUT returned array of rpc values, if !=NULL must be free after use with ait_freeVars()
  683:  * return: -1 error, 0 ok result or 1 closed rpc connection
  684:  */
  685: int rpc_cli_execCall(rpc_cli_t *cli, int noreply, unsigned short tag, 
  686: 		array_t * __restrict in_vars, array_t ** __restrict out_vars);
  687: /*
  688:  * rpc_cli_freeCall() - Free resouce allocated by RPC call
  689:  *
  690:  * @out_vars = Returned array with variables from RPC call
  691:  * return: none
  692:  */
  693: void rpc_cli_freeCall(array_t ** __restrict out_vars);
  694: /*
  695:  * rpc_cli_ping() - Ping RPC server
  696:  *
  697:  * @cli = connected client
  698:  * return: -1 error or !=-1 ping seq id
  699:  */
  700: int rpc_cli_ping(rpc_cli_t *cli);
  701: 
  702: 
  703: /*
  704:  * rpc_cli_openBLOBClient() - Connect to BLOB Server
  705:  *
  706:  * @rpccli = RPC Client session
  707:  * @Port = Port for bind server, if Port == 0 default port is selected
  708:  * return: NULL == error or !=NULL connection to BLOB server established
  709:  */
  710: rpc_cli_t *rpc_cli_openBLOBClient(rpc_cli_t * __restrict rpccli, unsigned short Port);
  711: /*
  712:  * rpc_cli_closeBLOBClient() - Close connection to BLOB server and free resources
  713:  *
  714:  * @cli = BLOB Client session
  715:  * return: none
  716:  */
  717: void rpc_cli_closeBLOBClient(rpc_cli_t ** __restrict cli);
  718: 
  719: 
  720: /*
  721:  * rpc_cli_openClient2() - Connect to layer2 RPC Server
  722:  *
  723:  * @InstID = InstID for RPC session request
  724:  * @netBuf = Network buffer length (min:512 bytes), if =0 == BUFSIZ (also meaning max RPC packet)
  725:  * @csIface = Interface name for bind client, if NULL first interface on host
  726:  * @csHost = Host ethernet address
  727:  * return: NULL == error or !=NULL connection to RPC server established
  728:  */
  729: rpc_cli_t *rpc_cli_openClient2(u_char InstID, int netBuf, 
  730: 		const char *csIface, const char *csHost);
  731: /*
  732:  * rpc_cli_closeClient2() - Close layer2 connection to RPC server and free resources
  733:  *
  734:  * @cli = RPC Client session
  735:  * return: none
  736:  */
  737: void rpc_cli_closeClient2(rpc_cli_t ** __restrict cli);
  738: 
  739: 
  740: /*
  741:  * rpc_cli_openClientExt() - Connect to pipe RPC Server
  742:  *
  743:  * @InstID = InstID for RPC session request
  744:  * @netBuf = Network buffer length (min:512 bytes), if =0 == BUFSIZ (also meaning max RPC packet)
  745:  * @fd = File descriptor
  746:  * return: NULL == error or !=NULL connection to RPC server established
  747:  */
  748: rpc_cli_t *rpc_cli_openClientExt(u_char InstID, int netBuf, int fd);
  749: /*
  750:  * rpc_cli_closeClientExt() - Close pipe connection to RPC server and free resources
  751:  *
  752:  * @cli = RPC Client session
  753:  * return: none
  754:  */
  755: void rpc_cli_closeClientExt(rpc_cli_t ** __restrict cli);
  756: 
  757: 
  758: #endif

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