/************************************************************************* * (C) 2010 AITNET ltd - Sofia/Bulgaria - * by Michael Pounov * * $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; }