Annotation of libaitrpc/src/builtin.c, revision 1.3

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.3     ! misho       6: * $Id: builtin.c,v 1.2.4.4 2011/08/19 14:13:31 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;
1.3     ! misho      58:        const char *str = NULL;
1.1       misho      59:        char wrk[INET6_ADDRSTRLEN];
                     60:        struct sockaddr_in *s;
                     61:        struct sockaddr_in6 *s6;
1.3     ! misho      62:        struct sockaddr_un *su;
1.1       misho      63: 
1.2       misho      64:        RPC_CALLBACK_CHECK_INPUT(call);
                     65:        if (!call->func_parent)
1.1       misho      66:                return -1;
                     67:        else
1.2       misho      68:                srv = call->func_parent;
                     69: 
1.3     ! misho      70:        if (!(vals = rpc_srv_returnVars(call, srv->srv_numcli)))
1.1       misho      71:                return -1;
                     72: 
1.2       misho      73:        for (i = 0, cli = srv->srv_clients, v = vals; i < srv->srv_numcli; i++, cli++) {
                     74:                if (!cli->cli_sa.sa_family) {
                     75:                        RPC_SET_STR(v++, "");
1.1       misho      76:                        continue;
1.2       misho      77:                }
1.1       misho      78: 
1.3     ! misho      79:                switch (cli->cli_sa.sa_family) {
        !            80:                        case AF_INET:
        !            81:                                s = (struct sockaddr_in*) &cli->cli_sa;
        !            82:                                str = inet_ntop(cli->cli_sa.sa_family, &s->sin_addr, wrk, sizeof wrk);
        !            83:                                break;
        !            84:                        case AF_INET6:
        !            85:                                s6 = (struct sockaddr_in6*) &cli->cli_sa;
        !            86:                                str = inet_ntop(cli->cli_sa.sa_family, &s6->sin6_addr, wrk, sizeof wrk);
        !            87:                                break;
        !            88:                        case AF_LOCAL:
        !            89:                                su = (struct sockaddr_un*) &cli->cli_sa;
        !            90:                                str = su->sun_path;
        !            91:                                break;
1.1       misho      92:                }
1.2       misho      93:                if (str)
1.1       misho      94:                        RPC_SET_STR(v++, (char*) str);
1.2       misho      95:                else
                     96:                        RPC_SET_STR(v++, "0.0.0.0");
1.1       misho      97:        }
                     98: 
                     99:        return 0;
                    100: }
                    101: 
                    102: int
1.2       misho     103: rpcServerCalls(rpc_func_t *call, int ic, rpc_val_t *iv)
1.1       misho     104: {
1.2       misho     105:        rpc_srv_t *srv;
                    106:        rpc_val_t *v, *vals;
1.1       misho     107:        rpc_func_t *f;
                    108:        register int i;
                    109:        char str[MAXPATHLEN];
                    110: 
1.2       misho     111:        RPC_CALLBACK_CHECK_INPUT(call);
                    112:        if (!call->func_parent)
1.1       misho     113:                return -1;
1.2       misho     114:        else
                    115:                srv = call->func_parent;
1.1       misho     116: 
                    117:        for (i = 0, f = srv->srv_funcs; f; i++, f = f->func_next);
1.3     ! misho     118:        if (!(vals = rpc_srv_returnVars(call, i)))
1.1       misho     119:                return -1;
                    120: 
                    121:        for (f = srv->srv_funcs, v = vals; f; f = f->func_next) {
                    122:                if (*f->func_name) {
1.3     ! misho     123:                        memset(str, 0, sizeof str);
        !           124:                        snprintf(str, sizeof str, "/%s/%s()", f->func_file, f->func_name);
1.1       misho     125:                        RPC_SET_STR(v++, str);
                    126:                }
                    127:        }
                    128: 
                    129:        return 0;
                    130: }
                    131: 
                    132: int
1.2       misho     133: rpcServerSessions(rpc_func_t *call, int ic, rpc_val_t *iv)
1.1       misho     134: {
1.2       misho     135:        rpc_srv_t *srv;
                    136:        rpc_val_t *vals;
1.1       misho     137: 
1.2       misho     138:        RPC_CALLBACK_CHECK_INPUT(call);
                    139:        if (!call->func_parent)
1.1       misho     140:                return -1;
1.2       misho     141:        else
                    142:                srv = call->func_parent;
1.1       misho     143: 
1.3     ! misho     144:        if (!(vals = rpc_srv_returnVars(call, 4)))
1.1       misho     145:                return -1;
                    146: 
                    147:        RPC_SET_U8(&vals[0], srv->srv_session.sess_version);
                    148:        RPC_SET_U32(&vals[1], srv->srv_session.sess_program);
                    149:        RPC_SET_U32(&vals[2], srv->srv_session.sess_process);
                    150:        RPC_SET_I32(&vals[3], srv->srv_numcli);
                    151: 
                    152:        return 0;
                    153: }
1.2       misho     154: 
                    155: int
                    156: rpcServerShutdown(rpc_func_t *call, int ic, rpc_val_t *iv)
                    157: {
                    158:        rpc_srv_t *srv;
                    159: 
                    160:        RPC_CALLBACK_CHECK_INPUT(call);
                    161:        if (!call->func_parent)
                    162:                return -1;
                    163:        else
                    164:                srv = call->func_parent;
                    165: 
                    166:        pthread_mutex_lock(&srv->srv_mtx);
1.3     ! misho     167:        srv->srv_kill = kill;
1.2       misho     168:        pthread_mutex_unlock(&srv->srv_mtx);
                    169: 
                    170:        return 0;
                    171: }
                    172: 
                    173: // ----------------------------------------------------
                    174: 
                    175: int
                    176: rpcBLOBServerShutdown(rpc_func_t *call, int ic, rpc_val_t *iv)
                    177: {
                    178:        rpc_srv_t *srv;
                    179: 
                    180:        RPC_CALLBACK_CHECK_INPUT(call);
                    181:        if (!call->func_parent)
                    182:                return -1;
                    183:        else
                    184:                srv = call->func_parent;
                    185: 
                    186:        pthread_mutex_lock(&srv->srv_blob.mtx);
1.3     ! misho     187:        srv->srv_blob.state = kill;
1.2       misho     188:        pthread_mutex_unlock(&srv->srv_blob.mtx);
                    189: 
                    190:        return 0;
                    191: }
                    192: 
                    193: int
                    194: rpcBLOBServerVars(rpc_func_t *call, int ic, rpc_val_t *iv)
                    195: {
                    196:        rpc_srv_t *srv;
                    197:        rpc_val_t *v, *vals;
                    198:        rpc_blob_t *b;
                    199:        register int i;
                    200: 
                    201:        RPC_CALLBACK_CHECK_INPUT(call);
                    202:        if (!call->func_parent)
                    203:                return -1;
                    204:        else
                    205:                srv = call->func_parent;
                    206: 
                    207:        pthread_mutex_lock(&srv->srv_blob.mtx);
                    208:        for (i = 0, b = srv->srv_blob.blobs; b; i++, b = b->blob_next);
1.3     ! misho     209:        if (!(vals = rpc_srv_returnVars(call, i))) {
1.2       misho     210:                pthread_mutex_unlock(&srv->srv_blob.mtx);
                    211:                return 0;
                    212:        }
                    213: 
                    214:        for (b = srv->srv_blob.blobs, v = vals; b; b = b->blob_next)
                    215:                RPC_SET_U32(v++, b->blob_var);
                    216:        pthread_mutex_unlock(&srv->srv_blob.mtx);
                    217: 
                    218:        return 0;
                    219: }
                    220: 
                    221: int
                    222: rpcBLOBServerState(rpc_func_t *call, int ic, rpc_val_t *iv)
                    223: {
                    224:        rpc_srv_t *srv;
                    225: 
                    226:        RPC_CALLBACK_CHK_ARGS(call, ic);
                    227:        if (!call->func_parent)
                    228:                return -1;
                    229:        else
                    230:                srv = call->func_parent;
                    231: 
                    232:        if (iv[0].val_type != i32)
                    233:                return -1;
                    234: 
                    235:        srv->srv_blob.state = RPC_GET_I32(&iv[0]);
                    236:        return 0;
                    237: }
                    238: 
                    239: int
                    240: rpcBLOBServerClients(rpc_func_t *call, int ic, rpc_val_t *iv)
                    241: {
                    242:        rpc_srv_t *srv;
                    243:        rpc_val_t *v, *vals;
                    244:        rpc_cli_t *cli;
                    245:        register int i;
1.3     ! misho     246:        const char *str = NULL;
1.2       misho     247:        char wrk[INET6_ADDRSTRLEN];
                    248:        struct sockaddr_in *s;
                    249:        struct sockaddr_in6 *s6;
1.3     ! misho     250:        struct sockaddr_un *su;
1.2       misho     251: 
                    252:        RPC_CALLBACK_CHECK_INPUT(call);
                    253:        if (!call->func_parent)
                    254:                return -1;
                    255:        else
                    256:                srv = call->func_parent;
                    257: 
1.3     ! misho     258:        if (!(vals = rpc_srv_returnVars(call, srv->srv_numcli)))
1.2       misho     259:                return -1;
                    260: 
                    261:        for (i = 0, cli = srv->srv_blob.clients, v = vals; i < srv->srv_numcli; i++, cli++) {
                    262:                if (!cli->cli_sa.sa_family) {
                    263:                        RPC_SET_STR(v++, "");
                    264:                        continue;
                    265:                }
                    266: 
1.3     ! misho     267:                switch (cli->cli_sa.sa_family) {
        !           268:                        case AF_INET:
        !           269:                                s = (struct sockaddr_in*) &cli->cli_sa;
        !           270:                                str = inet_ntop(cli->cli_sa.sa_family, &s->sin_addr, wrk, sizeof wrk);
        !           271:                                break;
        !           272:                        case AF_INET6:
        !           273:                                s6 = (struct sockaddr_in6*) &cli->cli_sa;
        !           274:                                str = inet_ntop(cli->cli_sa.sa_family, &s6->sin6_addr, wrk, sizeof wrk);
        !           275:                                break;
        !           276:                        case AF_LOCAL:
        !           277:                                su = (struct sockaddr_un*) &cli->cli_sa;
        !           278:                                str = su->sun_path;
        !           279:                                break;
1.2       misho     280:                }
                    281:                if (str)
                    282:                        RPC_SET_STR(v++, (char*) str);
                    283:                else
                    284:                        RPC_SET_STR(v++, "0.0.0.0");
                    285:        }
                    286: 
                    287:        return 0;
                    288: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>