--- libaitrpc/src/builtin.c 2010/06/24 15:01:19 1.1.1.1.2.3 +++ libaitrpc/src/builtin.c 2010/06/28 15:18:43 1.1.1.1.2.4 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: builtin.c,v 1.1.1.1.2.3 2010/06/24 15:01:19 misho Exp $ +* $Id: builtin.c,v 1.1.1.1.2.4 2010/06/28 15:18:43 misho Exp $ * *************************************************************************/ #include "global.h" @@ -32,9 +32,11 @@ rpcServerClients(rpc_func_t *call, int ic, rpc_val_t * if (!(vals = rpc_srv_retValsCall(call, srv->srv_numcli))) return -1; - for (i = 0, cli = srv->srv_clients, v = vals; i < srv->srv_numcli; cli++) { - if (!cli->cli_sa.sa_family) + 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; @@ -43,10 +45,10 @@ rpcServerClients(rpc_func_t *call, int ic, rpc_val_t * s6 = (struct sockaddr_in6*) &cli->cli_sa; str = inet_ntop(cli->cli_sa.sa_family, &s6->sin6_addr, wrk, sizeof wrk); } - if (str) { + if (str) RPC_SET_STR(v++, (char*) str); - i++; - } + else + RPC_SET_STR(v++, "0.0.0.0"); } return 0; @@ -167,3 +169,64 @@ rpcBLOBServerVars(rpc_func_t *call, int ic, rpc_val_t return 0; } +int +rpcBLOBServerState(rpc_func_t *call, int ic, rpc_val_t *iv) +{ + rpc_srv_t *srv; + + RPC_CALLBACK_CHK_NUM_ARGS(call, ic); + RPC_CALLBACK_CHECK_INPUT(call); + 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; +}