/*************************************************************************
* (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.8 2011/03/15 15:46:58 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_CHK_ARGS(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>