/************************************************************************* * (C) 2010 AITNET ltd - Sofia/Bulgaria - * by Michael Pounov * * $Author: misho $ * $Id: builtin.c,v 1.1.1.1.2.7 2010/07/08 12:29:38 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 0; } 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; }