File:  [ELWIX - Embedded LightWeight unIX -] / libaitrpc / src / builtin.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Fri Jun 18 01:48:06 2010 UTC (14 years ago) by misho
Branches: misho
CVS tags: start, rpc1_0
libaitrpc RPC subsystem

/*************************************************************************
* (C) 2010 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
*  by Michael Pounov <misho@openbsd-bg.org>
*
* $Author: misho $
* $Id: builtin.c,v 1.1.1.1 2010/06/18 01:48:06 misho Exp $
*
*************************************************************************/
#include "global.h"


/* builtin RPC server functions */

int
rpcServerClients(rpc_srv_t * __restrict srv, rpc_func_t *call, int ic, rpc_val_t *iv)
{
	rpc_val_t *v, *vals = NULL;
	rpc_cli_t *cli;
	register int i;
	const char *str;
	char wrk[INET6_ADDRSTRLEN];
	struct sockaddr_in *s;
	struct sockaddr_in6 *s6;

	if (!srv || !call) {
		rpc_SetErr(EINVAL, "Error:: invalid parameters ...\n");
		return -1;
	}
	if (rpc_srv_declValsCall(call, srv->srv_numcli) == -1)
		return -1;
	else
		rpc_srv_delValsCall(call);
	if (rpc_srv_getValsCall(call, &vals) == -1)
		return -1;

	for (i = 0, cli = srv->srv_clients, v = vals; i < srv->srv_numcli; cli++) {
		if (!cli->cli_sa.sa_family)
			continue;

		if (AF_INET == cli->cli_sa.sa_family) {
			s = (struct sockaddr_in*) &cli->cli_sa;
			str = inet_ntop(cli->cli_sa.sa_family, &s->sin_addr, wrk, sizeof wrk);
		} else {
			s6 = (struct sockaddr_in6*) &cli->cli_sa;
			str = inet_ntop(cli->cli_sa.sa_family, &s6->sin6_addr, wrk, sizeof wrk);
		}
		if (str) {
			RPC_SET_STR(v++, (char*) str);
			i++;
		}
	}

	return 0;
}

int
rpcServerCalls(rpc_srv_t * __restrict srv, rpc_func_t *call, int ic, rpc_val_t *iv)
{
	rpc_val_t *v, *vals = NULL;
	rpc_func_t *f;
	register int i;
	char str[MAXPATHLEN];

	if (!srv || !call) {
		rpc_SetErr(EINVAL, "Error:: invalid parameters ...\n");
		return -1;
	}

	for (i = 0, f = srv->srv_funcs; f; i++, f = f->func_next);

	if (rpc_srv_declValsCall(call, i) == -1)
		return -1;
	else
		rpc_srv_delValsCall(call);
	if (rpc_srv_getValsCall(call, &vals) == -1)
		return -1;

	for (f = srv->srv_funcs, v = vals; f; f = f->func_next) {
		if (*f->func_name) {
			memset(str, 0, MAXPATHLEN);
			snprintf(str, MAXPATHLEN, "/%s/%s()", f->func_file, f->func_name);
			RPC_SET_STR(v++, str);
		}
	}

	return 0;
}

int
rpcServerSessions(rpc_srv_t * __restrict srv, rpc_func_t *call, int ic, rpc_val_t *iv)
{
	rpc_val_t *vals = NULL;

	if (!srv || !call) {
		rpc_SetErr(EINVAL, "Error:: invalid parameters ...\n");
		return -1;
	}

	if (rpc_srv_declValsCall(call, 4) == -1)
		return -1;
	else
		rpc_srv_delValsCall(call);
	if (rpc_srv_getValsCall(call, &vals) == -1)
		return -1;

	RPC_SET_U8(&vals[0], srv->srv_session.sess_version);
	RPC_SET_U32(&vals[1], srv->srv_session.sess_program);
	RPC_SET_U32(&vals[2], srv->srv_session.sess_process);
	RPC_SET_I32(&vals[3], srv->srv_numcli);

	return 0;
}

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