File:  [ELWIX - Embedded LightWeight unIX -] / libaitrpc / src / builtin.c
Revision 1.1.1.1.2.7: download - view: text, annotated - select for diffs - revision graph
Thu Jul 8 12:29:38 2010 UTC (14 years, 1 month ago) by misho
Branches: rpc1_0
Diff to: branchpoint 1.1.1.1: preferred, unified
fix from valgrind

    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: builtin.c,v 1.1.1.1.2.7 2010/07/08 12:29:38 misho Exp $
    7: *
    8: *************************************************************************/
    9: #include "global.h"
   10: 
   11: 
   12: /* builtin RPC server functions */
   13: 
   14: int
   15: rpcServerClients(rpc_func_t *call, int ic, rpc_val_t *iv)
   16: {
   17: 	rpc_srv_t *srv;
   18: 	rpc_val_t *v, *vals;
   19: 	rpc_cli_t *cli;
   20: 	register int i;
   21: 	const char *str;
   22: 	char wrk[INET6_ADDRSTRLEN];
   23: 	struct sockaddr_in *s;
   24: 	struct sockaddr_in6 *s6;
   25: 
   26: 	RPC_CALLBACK_CHECK_INPUT(call);
   27: 	if (!call->func_parent)
   28: 		return -1;
   29: 	else
   30: 		srv = call->func_parent;
   31: 
   32: 	if (!(vals = rpc_srv_retValsCall(call, srv->srv_numcli)))
   33: 		return -1;
   34: 
   35: 	for (i = 0, cli = srv->srv_clients, v = vals; i < srv->srv_numcli; i++, cli++) {
   36: 		if (!cli->cli_sa.sa_family) {
   37: 			RPC_SET_STR(v++, "");
   38: 			continue;
   39: 		}
   40: 
   41: 		if (AF_INET == cli->cli_sa.sa_family) {
   42: 			s = (struct sockaddr_in*) &cli->cli_sa;
   43: 			str = inet_ntop(cli->cli_sa.sa_family, &s->sin_addr, wrk, sizeof wrk);
   44: 		} else {
   45: 			s6 = (struct sockaddr_in6*) &cli->cli_sa;
   46: 			str = inet_ntop(cli->cli_sa.sa_family, &s6->sin6_addr, wrk, sizeof wrk);
   47: 		}
   48: 		if (str)
   49: 			RPC_SET_STR(v++, (char*) str);
   50: 		else
   51: 			RPC_SET_STR(v++, "0.0.0.0");
   52: 	}
   53: 
   54: 	return 0;
   55: }
   56: 
   57: int
   58: rpcServerCalls(rpc_func_t *call, int ic, rpc_val_t *iv)
   59: {
   60: 	rpc_srv_t *srv;
   61: 	rpc_val_t *v, *vals;
   62: 	rpc_func_t *f;
   63: 	register int i;
   64: 	char str[MAXPATHLEN];
   65: 
   66: 	RPC_CALLBACK_CHECK_INPUT(call);
   67: 	if (!call->func_parent)
   68: 		return -1;
   69: 	else
   70: 		srv = call->func_parent;
   71: 
   72: 	for (i = 0, f = srv->srv_funcs; f; i++, f = f->func_next);
   73: 	if (!(vals = rpc_srv_retValsCall(call, i)))
   74: 		return -1;
   75: 
   76: 	for (f = srv->srv_funcs, v = vals; f; f = f->func_next) {
   77: 		if (*f->func_name) {
   78: 			memset(str, 0, MAXPATHLEN);
   79: 			snprintf(str, MAXPATHLEN, "/%s/%s()", f->func_file, f->func_name);
   80: 			RPC_SET_STR(v++, str);
   81: 		}
   82: 	}
   83: 
   84: 	return 0;
   85: }
   86: 
   87: int
   88: rpcServerSessions(rpc_func_t *call, int ic, rpc_val_t *iv)
   89: {
   90: 	rpc_srv_t *srv;
   91: 	rpc_val_t *vals;
   92: 
   93: 	RPC_CALLBACK_CHECK_INPUT(call);
   94: 	if (!call->func_parent)
   95: 		return -1;
   96: 	else
   97: 		srv = call->func_parent;
   98: 
   99: 	if (!(vals = rpc_srv_retValsCall(call, 4)))
  100: 		return -1;
  101: 
  102: 	RPC_SET_U8(&vals[0], srv->srv_session.sess_version);
  103: 	RPC_SET_U32(&vals[1], srv->srv_session.sess_program);
  104: 	RPC_SET_U32(&vals[2], srv->srv_session.sess_process);
  105: 	RPC_SET_I32(&vals[3], srv->srv_numcli);
  106: 
  107: 	return 0;
  108: }
  109: 
  110: int
  111: rpcServerShutdown(rpc_func_t *call, int ic, rpc_val_t *iv)
  112: {
  113: 	rpc_srv_t *srv;
  114: 
  115: 	RPC_CALLBACK_CHECK_INPUT(call);
  116: 	if (!call->func_parent)
  117: 		return -1;
  118: 	else
  119: 		srv = call->func_parent;
  120: 
  121: 	pthread_mutex_lock(&srv->srv_mtx);
  122: 	rpc_Kill = 1;
  123: 	pthread_mutex_unlock(&srv->srv_mtx);
  124: 
  125: 	return 0;
  126: }
  127: 
  128: // ----------------------------------------------------
  129: 
  130: int
  131: rpcBLOBServerShutdown(rpc_func_t *call, int ic, rpc_val_t *iv)
  132: {
  133: 	rpc_srv_t *srv;
  134: 
  135: 	RPC_CALLBACK_CHECK_INPUT(call);
  136: 	if (!call->func_parent)
  137: 		return -1;
  138: 	else
  139: 		srv = call->func_parent;
  140: 
  141: 	pthread_mutex_lock(&srv->srv_blob.mtx);
  142: 	blob_Kill = 1;
  143: 	pthread_mutex_unlock(&srv->srv_blob.mtx);
  144: 
  145: 	return 0;
  146: }
  147: 
  148: int
  149: rpcBLOBServerVars(rpc_func_t *call, int ic, rpc_val_t *iv)
  150: {
  151: 	rpc_srv_t *srv;
  152: 	rpc_val_t *v, *vals;
  153: 	rpc_blob_t *b;
  154: 	register int i;
  155: 
  156: 	RPC_CALLBACK_CHECK_INPUT(call);
  157: 	if (!call->func_parent)
  158: 		return -1;
  159: 	else
  160: 		srv = call->func_parent;
  161: 
  162: 	pthread_mutex_lock(&srv->srv_blob.mtx);
  163: 	for (i = 0, b = srv->srv_blob.blobs; b; i++, b = b->blob_next);
  164: 	if (!(vals = rpc_srv_retValsCall(call, i))) {
  165: 		pthread_mutex_unlock(&srv->srv_blob.mtx);
  166: 		return 0;
  167: 	}
  168: 
  169: 	for (b = srv->srv_blob.blobs, v = vals; b; b = b->blob_next)
  170: 		RPC_SET_U32(v++, b->blob_var);
  171: 	pthread_mutex_unlock(&srv->srv_blob.mtx);
  172: 
  173: 	return 0;
  174: }
  175: 
  176: int
  177: rpcBLOBServerState(rpc_func_t *call, int ic, rpc_val_t *iv)
  178: {
  179: 	rpc_srv_t *srv;
  180: 
  181: 	RPC_CALLBACK_CHECK_INPUT(call);
  182: 	RPC_CALLBACK_CHK_RETARGS(call, ic);
  183: 	if (!call->func_parent)
  184: 		return -1;
  185: 	else
  186: 		srv = call->func_parent;
  187: 
  188: 	if (iv[0].val_type != i32)
  189: 		return -1;
  190: 
  191: 	srv->srv_blob.state = RPC_GET_I32(&iv[0]);
  192: 	return 0;
  193: }
  194: 
  195: int
  196: rpcBLOBServerClients(rpc_func_t *call, int ic, rpc_val_t *iv)
  197: {
  198: 	rpc_srv_t *srv;
  199: 	rpc_val_t *v, *vals;
  200: 	rpc_cli_t *cli;
  201: 	register int i;
  202: 	const char *str;
  203: 	char wrk[INET6_ADDRSTRLEN];
  204: 	struct sockaddr_in *s;
  205: 	struct sockaddr_in6 *s6;
  206: 
  207: 	RPC_CALLBACK_CHECK_INPUT(call);
  208: 	if (!call->func_parent)
  209: 		return -1;
  210: 	else
  211: 		srv = call->func_parent;
  212: 
  213: 	if (!(vals = rpc_srv_retValsCall(call, srv->srv_numcli)))
  214: 		return -1;
  215: 
  216: 	for (i = 0, cli = srv->srv_blob.clients, v = vals; i < srv->srv_numcli; i++, cli++) {
  217: 		if (!cli->cli_sa.sa_family) {
  218: 			RPC_SET_STR(v++, "");
  219: 			continue;
  220: 		}
  221: 
  222: 		if (AF_INET == cli->cli_sa.sa_family) {
  223: 			s = (struct sockaddr_in*) &cli->cli_sa;
  224: 			str = inet_ntop(cli->cli_sa.sa_family, &s->sin_addr, wrk, sizeof wrk);
  225: 		} else {
  226: 			s6 = (struct sockaddr_in6*) &cli->cli_sa;
  227: 			str = inet_ntop(cli->cli_sa.sa_family, &s6->sin6_addr, wrk, sizeof wrk);
  228: 		}
  229: 		if (str)
  230: 			RPC_SET_STR(v++, (char*) str);
  231: 		else
  232: 			RPC_SET_STR(v++, "0.0.0.0");
  233: 	}
  234: 
  235: 	return 0;
  236: }

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