File:  [ELWIX - Embedded LightWeight unIX -] / libaitrpc / src / builtin.c
Revision 1.1.1.1.2.6: download - view: text, annotated - select for diffs - revision graph
Thu Jul 8 09:18:51 2010 UTC (13 years, 11 months ago) by misho
Branches: rpc1_0
Diff to: branchpoint 1.1.1.1: preferred, colored
add lock

/*************************************************************************
* (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.2.6 2010/07/08 09:18:51 misho Exp $
*
*************************************************************************/
#include "global.h"


/* builtin RPC server functions */

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

	RPC_CALLBACK_CHECK_INPUT(call);
	if (!call->func_parent)
		return -1;
	else
		srv = call->func_parent;

	if (!(vals = rpc_srv_retValsCall(call, srv->srv_numcli)))
		return -1;

	for (i = 0, cli = srv->srv_clients, v = vals; i < srv->srv_numcli; i++, cli++) {
		if (!cli->cli_sa.sa_family) {
			RPC_SET_STR(v++, "");
			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);
		else
			RPC_SET_STR(v++, "0.0.0.0");
	}

	return 0;
}

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

	RPC_CALLBACK_CHECK_INPUT(call);
	if (!call->func_parent)
		return -1;
	else
		srv = call->func_parent;

	for (i = 0, f = srv->srv_funcs; f; i++, f = f->func_next);
	if (!(vals = rpc_srv_retValsCall(call, i)))
		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_func_t *call, int ic, rpc_val_t *iv)
{
	rpc_srv_t *srv;
	rpc_val_t *vals;

	RPC_CALLBACK_CHECK_INPUT(call);
	if (!call->func_parent)
		return -1;
	else
		srv = call->func_parent;

	if (!(vals = rpc_srv_retValsCall(call, 4)))
		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;
}

int
rpcServerShutdown(rpc_func_t *call, int ic, rpc_val_t *iv)
{
	rpc_srv_t *srv;

	RPC_CALLBACK_CHECK_INPUT(call);
	if (!call->func_parent)
		return -1;
	else
		srv = call->func_parent;

	pthread_mutex_lock(&srv->srv_mtx);
	rpc_Kill = 1;
	pthread_mutex_unlock(&srv->srv_mtx);

	return 0;
}

// ----------------------------------------------------

int
rpcBLOBServerShutdown(rpc_func_t *call, int ic, rpc_val_t *iv)
{
	rpc_srv_t *srv;

	RPC_CALLBACK_CHECK_INPUT(call);
	if (!call->func_parent)
		return -1;
	else
		srv = call->func_parent;

	pthread_mutex_lock(&srv->srv_blob.mtx);
	blob_Kill = 1;
	pthread_mutex_unlock(&srv->srv_blob.mtx);

	return 0;
}

int
rpcBLOBServerVars(rpc_func_t *call, int ic, rpc_val_t *iv)
{
	rpc_srv_t *srv;
	rpc_val_t *v, *vals;
	rpc_blob_t *b;
	register int i;

	RPC_CALLBACK_CHECK_INPUT(call);
	if (!call->func_parent)
		return -1;
	else
		srv = call->func_parent;

	pthread_mutex_lock(&srv->srv_blob.mtx);
	for (i = 0, b = srv->srv_blob.blobs; b; i++, b = b->blob_next);
	if (!(vals = rpc_srv_retValsCall(call, i))) {
		pthread_mutex_unlock(&srv->srv_blob.mtx);
		return -1;
	}

	for (b = srv->srv_blob.blobs, v = vals; b; b = b->blob_next)
		RPC_SET_U32(v++, b->blob_var);
	pthread_mutex_unlock(&srv->srv_blob.mtx);

	return 0;
}

int
rpcBLOBServerState(rpc_func_t *call, int ic, rpc_val_t *iv)
{
	rpc_srv_t *srv;

	RPC_CALLBACK_CHECK_INPUT(call);
	RPC_CALLBACK_CHK_RETARGS(call, ic);
	if (!call->func_parent)
		return -1;
	else
		srv = call->func_parent;

	if (iv[0].val_type != i32)
		return -1;

	srv->srv_blob.state = RPC_GET_I32(&iv[0]);
	return 0;
}

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

	RPC_CALLBACK_CHECK_INPUT(call);
	if (!call->func_parent)
		return -1;
	else
		srv = call->func_parent;

	if (!(vals = rpc_srv_retValsCall(call, srv->srv_numcli)))
		return -1;

	for (i = 0, cli = srv->srv_blob.clients, v = vals; i < srv->srv_numcli; i++, cli++) {
		if (!cli->cli_sa.sa_family) {
			RPC_SET_STR(v++, "");
			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);
		else
			RPC_SET_STR(v++, "0.0.0.0");
	}

	return 0;
}

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