Annotation of libaitrpc/src/builtin.c, revision 1.2.4.2
1.1 misho 1: /*************************************************************************
2: * (C) 2010 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
3: * by Michael Pounov <misho@openbsd-bg.org>
4: *
5: * $Author: misho $
1.2.4.2 ! misho 6: * $Id: builtin.c,v 1.2.4.1 2011/08/19 07:39:29 misho Exp $
1.1 misho 7: *
1.2 misho 8: **************************************************************************
9: The ELWIX and AITNET software is distributed under the following
10: terms:
11:
12: All of the documentation and software included in the ELWIX and AITNET
13: Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
14:
15: Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
16: by Michael Pounov <misho@elwix.org>. All rights reserved.
17:
18: Redistribution and use in source and binary forms, with or without
19: modification, are permitted provided that the following conditions
20: are met:
21: 1. Redistributions of source code must retain the above copyright
22: notice, this list of conditions and the following disclaimer.
23: 2. Redistributions in binary form must reproduce the above copyright
24: notice, this list of conditions and the following disclaimer in the
25: documentation and/or other materials provided with the distribution.
26: 3. All advertising materials mentioning features or use of this software
27: must display the following acknowledgement:
28: This product includes software developed by Michael Pounov <misho@elwix.org>
29: ELWIX - Embedded LightWeight unIX and its contributors.
30: 4. Neither the name of AITNET nor the names of its contributors
31: may be used to endorse or promote products derived from this software
32: without specific prior written permission.
33:
34: THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND
35: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
36: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
37: ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
38: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
39: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
40: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
41: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
42: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
43: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
44: SUCH DAMAGE.
45: */
1.1 misho 46: #include "global.h"
47:
48:
49: /* builtin RPC server functions */
50:
51: int
1.2 misho 52: rpcServerClients(rpc_func_t *call, int ic, rpc_val_t *iv)
1.1 misho 53: {
1.2 misho 54: rpc_srv_t *srv;
55: rpc_val_t *v, *vals;
1.1 misho 56: rpc_cli_t *cli;
57: register int i;
58: const char *str;
59: char wrk[INET6_ADDRSTRLEN];
60: struct sockaddr_in *s;
61: struct sockaddr_in6 *s6;
62:
1.2 misho 63: RPC_CALLBACK_CHECK_INPUT(call);
64: if (!call->func_parent)
1.1 misho 65: return -1;
66: else
1.2 misho 67: srv = call->func_parent;
68:
1.2.4.2 ! misho 69: if (!(vals = rpc_srv_returnVars(call, srv->srv_numcli)))
1.1 misho 70: return -1;
71:
1.2 misho 72: for (i = 0, cli = srv->srv_clients, v = vals; i < srv->srv_numcli; i++, cli++) {
73: if (!cli->cli_sa.sa_family) {
74: RPC_SET_STR(v++, "");
1.1 misho 75: continue;
1.2 misho 76: }
1.1 misho 77:
78: if (AF_INET == cli->cli_sa.sa_family) {
79: s = (struct sockaddr_in*) &cli->cli_sa;
80: str = inet_ntop(cli->cli_sa.sa_family, &s->sin_addr, wrk, sizeof wrk);
81: } else {
82: s6 = (struct sockaddr_in6*) &cli->cli_sa;
83: str = inet_ntop(cli->cli_sa.sa_family, &s6->sin6_addr, wrk, sizeof wrk);
84: }
1.2 misho 85: if (str)
1.1 misho 86: RPC_SET_STR(v++, (char*) str);
1.2 misho 87: else
88: RPC_SET_STR(v++, "0.0.0.0");
1.1 misho 89: }
90:
91: return 0;
92: }
93:
94: int
1.2 misho 95: rpcServerCalls(rpc_func_t *call, int ic, rpc_val_t *iv)
1.1 misho 96: {
1.2 misho 97: rpc_srv_t *srv;
98: rpc_val_t *v, *vals;
1.1 misho 99: rpc_func_t *f;
100: register int i;
101: char str[MAXPATHLEN];
102:
1.2 misho 103: RPC_CALLBACK_CHECK_INPUT(call);
104: if (!call->func_parent)
1.1 misho 105: return -1;
1.2 misho 106: else
107: srv = call->func_parent;
1.1 misho 108:
109: for (i = 0, f = srv->srv_funcs; f; i++, f = f->func_next);
1.2.4.2 ! misho 110: if (!(vals = rpc_srv_returnVars(call, i)))
1.1 misho 111: return -1;
112:
113: for (f = srv->srv_funcs, v = vals; f; f = f->func_next) {
114: if (*f->func_name) {
115: memset(str, 0, MAXPATHLEN);
116: snprintf(str, MAXPATHLEN, "/%s/%s()", f->func_file, f->func_name);
117: RPC_SET_STR(v++, str);
118: }
119: }
120:
121: return 0;
122: }
123:
124: int
1.2 misho 125: rpcServerSessions(rpc_func_t *call, int ic, rpc_val_t *iv)
1.1 misho 126: {
1.2 misho 127: rpc_srv_t *srv;
128: rpc_val_t *vals;
1.1 misho 129:
1.2 misho 130: RPC_CALLBACK_CHECK_INPUT(call);
131: if (!call->func_parent)
1.1 misho 132: return -1;
1.2 misho 133: else
134: srv = call->func_parent;
1.1 misho 135:
1.2.4.2 ! misho 136: if (!(vals = rpc_srv_returnVars(call, 4)))
1.1 misho 137: return -1;
138:
139: RPC_SET_U8(&vals[0], srv->srv_session.sess_version);
140: RPC_SET_U32(&vals[1], srv->srv_session.sess_program);
141: RPC_SET_U32(&vals[2], srv->srv_session.sess_process);
142: RPC_SET_I32(&vals[3], srv->srv_numcli);
143:
144: return 0;
145: }
1.2 misho 146:
147: int
148: rpcServerShutdown(rpc_func_t *call, int ic, rpc_val_t *iv)
149: {
150: rpc_srv_t *srv;
151:
152: RPC_CALLBACK_CHECK_INPUT(call);
153: if (!call->func_parent)
154: return -1;
155: else
156: srv = call->func_parent;
157:
158: pthread_mutex_lock(&srv->srv_mtx);
1.2.4.1 misho 159: srv->srv_kill = kill;
1.2 misho 160: pthread_mutex_unlock(&srv->srv_mtx);
161:
162: return 0;
163: }
164:
165: // ----------------------------------------------------
166:
167: int
168: rpcBLOBServerShutdown(rpc_func_t *call, int ic, rpc_val_t *iv)
169: {
170: rpc_srv_t *srv;
171:
172: RPC_CALLBACK_CHECK_INPUT(call);
173: if (!call->func_parent)
174: return -1;
175: else
176: srv = call->func_parent;
177:
178: pthread_mutex_lock(&srv->srv_blob.mtx);
1.2.4.1 misho 179: srv->srv_blob.state = kill;
1.2 misho 180: pthread_mutex_unlock(&srv->srv_blob.mtx);
181:
182: return 0;
183: }
184:
185: int
186: rpcBLOBServerVars(rpc_func_t *call, int ic, rpc_val_t *iv)
187: {
188: rpc_srv_t *srv;
189: rpc_val_t *v, *vals;
190: rpc_blob_t *b;
191: register int i;
192:
193: RPC_CALLBACK_CHECK_INPUT(call);
194: if (!call->func_parent)
195: return -1;
196: else
197: srv = call->func_parent;
198:
199: pthread_mutex_lock(&srv->srv_blob.mtx);
200: for (i = 0, b = srv->srv_blob.blobs; b; i++, b = b->blob_next);
1.2.4.2 ! misho 201: if (!(vals = rpc_srv_returnVars(call, i))) {
1.2 misho 202: pthread_mutex_unlock(&srv->srv_blob.mtx);
203: return 0;
204: }
205:
206: for (b = srv->srv_blob.blobs, v = vals; b; b = b->blob_next)
207: RPC_SET_U32(v++, b->blob_var);
208: pthread_mutex_unlock(&srv->srv_blob.mtx);
209:
210: return 0;
211: }
212:
213: int
214: rpcBLOBServerState(rpc_func_t *call, int ic, rpc_val_t *iv)
215: {
216: rpc_srv_t *srv;
217:
218: RPC_CALLBACK_CHK_ARGS(call, ic);
219: if (!call->func_parent)
220: return -1;
221: else
222: srv = call->func_parent;
223:
224: if (iv[0].val_type != i32)
225: return -1;
226:
227: srv->srv_blob.state = RPC_GET_I32(&iv[0]);
228: return 0;
229: }
230:
231: int
232: rpcBLOBServerClients(rpc_func_t *call, int ic, rpc_val_t *iv)
233: {
234: rpc_srv_t *srv;
235: rpc_val_t *v, *vals;
236: rpc_cli_t *cli;
237: register int i;
238: const char *str;
239: char wrk[INET6_ADDRSTRLEN];
240: struct sockaddr_in *s;
241: struct sockaddr_in6 *s6;
242:
243: RPC_CALLBACK_CHECK_INPUT(call);
244: if (!call->func_parent)
245: return -1;
246: else
247: srv = call->func_parent;
248:
1.2.4.2 ! misho 249: if (!(vals = rpc_srv_returnVars(call, srv->srv_numcli)))
1.2 misho 250: return -1;
251:
252: for (i = 0, cli = srv->srv_blob.clients, v = vals; i < srv->srv_numcli; i++, cli++) {
253: if (!cli->cli_sa.sa_family) {
254: RPC_SET_STR(v++, "");
255: continue;
256: }
257:
258: if (AF_INET == cli->cli_sa.sa_family) {
259: s = (struct sockaddr_in*) &cli->cli_sa;
260: str = inet_ntop(cli->cli_sa.sa_family, &s->sin_addr, wrk, sizeof wrk);
261: } else {
262: s6 = (struct sockaddr_in6*) &cli->cli_sa;
263: str = inet_ntop(cli->cli_sa.sa_family, &s6->sin6_addr, wrk, sizeof wrk);
264: }
265: if (str)
266: RPC_SET_STR(v++, (char*) str);
267: else
268: RPC_SET_STR(v++, "0.0.0.0");
269: }
270:
271: return 0;
272: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>