Annotation of libaitrpc/src/lists.c, revision 1.1.2.3

1.1.2.1   misho       1: #include "global.h"
                      2: 
                      3: 
1.1.2.2   misho       4: /*
                      5:  * rpc_srv_freeValsCall() Free return variables for RPC call
                      6:  * @call = RPC function call
                      7:  * return: none
                      8:  */
                      9: inline void
                     10: rpc_srv_freeValsCall(rpc_func_t * __restrict call)
                     11: {
                     12:        rpc_srv_declValsCall(call, 0);
                     13: }
                     14: 
                     15: /*
                     16:  * rpc_srv_declValsCall() Declare return variables for RPC call
                     17:  * @call = RPC function call
                     18:  * @return_vals = Number of return variables
                     19:  * return: -1 error, !=-1 ok
                     20:  */
                     21: inline int
                     22: rpc_srv_declValsCall(rpc_func_t * __restrict call, int return_vals)
                     23: {
                     24:        void *ptr;
                     25: 
                     26:        if (!call || return_vals < 0) {
                     27:                rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t declare return variables for RPC call...\n");
                     28:                return -1;
                     29:        } else
                     30:                call->func_args = return_vals;
                     31: 
                     32:        if (!return_vals) {
                     33:                if (call->func_vals) {
                     34:                        free(call->func_vals);
                     35:                        call->func_vals = NULL;
                     36:                }
                     37:        } else {
                     38:                ptr = realloc(call->func_vals, return_vals * sizeof(rpc_val_t));
                     39:                if (!ptr) {
                     40:                        LOGERR;
                     41:                        return -1;
                     42:                } else
                     43:                        call->func_vals = ptr;
                     44:        }
                     45: 
                     46:        return call->func_args;
                     47: }
                     48: 
                     49: /*
                     50:  * rpc_srv_delValsCall() Clean values from return variables of RPC call
                     51:  * @call = RPC function call
                     52:  * return: -1 error, !=-1 Returned number of cleaned RPC variables
                     53:  */
                     54: inline int
                     55: rpc_srv_delValsCall(rpc_func_t * __restrict call)
                     56: {
                     57:        if (!call) {
                     58:                rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t delete return variables ...\n");
                     59:                return -1;
                     60:        }
                     61: 
                     62:        memset(call->func_vals, 0, call->func_args * sizeof(rpc_val_t));
                     63:        return call->func_args;
                     64: }
                     65: 
                     66: /*
                     67:  * rpc_srv_copyValsCall() Copy return variables for RPC call to new variable
                     68:  * @call = RPC function call
                     69:  * @newvals = New allocated variables array, must be free after use
                     70:  * return: -1 error, !=-1 Returned number of copied RPC variables
                     71:  */
                     72: inline int
                     73: rpc_srv_copyValsCall(rpc_func_t * __restrict call, rpc_val_t ** __restrict newvals)
                     74: {
                     75:        if (!call || !newvals) {
                     76:                rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t copy return variables to new array\n");
                     77:                return -1;
                     78:        }
                     79: 
                     80:        *newvals = calloc(call->func_args, sizeof(rpc_val_t));
                     81:        if (!*newvals) {
                     82:                LOGERR;
                     83:                return -1;
                     84:        } else
                     85:                memcpy(*newvals, call->func_vals, call->func_args * sizeof(rpc_val_t));
                     86: 
                     87:        return call->func_args;
                     88: }
                     89: 
                     90: /*
                     91:  * rpc_srv_getValsCall() Get return variables for RPC call
                     92:  * @call = RPC function call
                     93:  * @vals = Returned variables, may be NULL
                     94:  * return: -1 error, !=-1 Number of returned variables
                     95:  */
                     96: inline int
                     97: rpc_srv_getValsCall(rpc_func_t * __restrict call, rpc_val_t ** __restrict vals)
                     98: {
                     99:        if (!call) {
                    100:                rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t get return variables ...\n");
                    101:                return -1;
                    102:        }
                    103: 
                    104:        if (vals)
                    105:                *vals = call->func_vals;
                    106:        return call->func_args;
                    107: }
                    108: 
                    109: // ---------------------------------------------------------
                    110: 
                    111: /*
                    112:  * rpc_srv_registerCall() Register call to RPC server
                    113:  * @srv = RPC Server instance
                    114:  * @csModule = Module name, if NULL self binary
                    115:  * @csFunc = Function name
                    116:  * @args = Number of function arguments
                    117:  * return: -1 error or 0 register ok
                    118:  */
                    119: int
                    120: rpc_srv_registerCall(rpc_srv_t * __restrict srv, const char *csModule, const char *csFunc, u_char args)
                    121: {
                    122:        rpc_func_t *func;
                    123:        u_char str[MAXPATHLEN + UCHAR_MAX + 1];
                    124: 
                    125:        memset(str, 0, MAXPATHLEN + UCHAR_MAX + 1);
                    126:        if (!srv || !csFunc) {
                    127:                rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t register function to RPC server ...\n");
                    128:                return -1;
                    129:        }
                    130:        if (!(func = malloc(sizeof(rpc_func_t)))) {
                    131:                LOGERR;
                    132:                return -1;
                    133:        } else {
                    134:                memset(func, 0, sizeof(rpc_func_t));
                    135:                strlcpy((char*) func->func_name, csFunc, UCHAR_MAX + 1);
                    136:        }
                    137:        if (csModule) {
                    138:                strlcpy((char*) func->func_file, csModule, MAXPATHLEN);
                    139:                strlcpy((char*) str, csModule, MAXPATHLEN + UCHAR_MAX + 1);
                    140:        }
                    141:        strlcat((char*) str, "__", MAXPATHLEN + UCHAR_MAX + 1);
                    142:        strlcat((char*) str, csFunc, MAXPATHLEN + UCHAR_MAX + 1);
                    143: 
                    144:        func->func_tag = crcFletcher16((u_short*) str, (MAXPATHLEN + UCHAR_MAX + 1) / 2);
                    145:        func->func_hash = hash_fnv((char*) str, MAXPATHLEN + UCHAR_MAX + 1);
                    146: 
                    147:        if (rpc_srv_declValsCall(func, args) == -1) {
                    148:                free(func);
                    149:                return -1;
                    150:        }
                    151: 
                    152:        pthread_mutex_lock(&srv->srv_mtx);
                    153:        func->func_next = srv->srv_funcs;
                    154:        srv->srv_funcs = func;
                    155:        pthread_mutex_unlock(&srv->srv_mtx);
                    156:        return 0;
                    157: }
                    158: 
                    159: /*
                    160:  * rpc_srv_unregisterCall() Unregister call from RPC server
                    161:  * @srv = RPC Server instance
                    162:  * @csModule = Module name, if NULL self binary
                    163:  * @csFunc = Function name
                    164:  * return: -1 error, 0 not found call, 1 unregister ok
                    165:  */
                    166: int
                    167: rpc_srv_unregisterCall(rpc_srv_t * __restrict srv, const char *csModule, const char *csFunc)
                    168: {
                    169:        rpc_func_t func, *f, *curr;
                    170:        u_char str[MAXPATHLEN + UCHAR_MAX + 1];
                    171: 
                    172:        memset(&func, 0, sizeof(rpc_func_t));
                    173:        memset(str, 0, MAXPATHLEN + UCHAR_MAX + 1);
                    174:        if (!srv || !csFunc) {
                    175:                rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t unregister function from RPC server ...\n");
                    176:                return -1;
                    177:        } else
                    178:                strlcpy((char*) func.func_name, csFunc, UCHAR_MAX + 1);
                    179:        if (csModule) {
                    180:                strlcpy((char*) func.func_file, csModule, MAXPATHLEN);
                    181:                strlcpy((char*) str, csModule, MAXPATHLEN + UCHAR_MAX + 1);
                    182:        }
                    183:        strlcat((char*) str, "__", MAXPATHLEN + UCHAR_MAX + 1);
                    184:        strlcat((char*) str, csFunc, MAXPATHLEN + UCHAR_MAX + 1);
                    185: 
                    186:        func.func_tag = crcFletcher16((u_short*) str, (MAXPATHLEN + UCHAR_MAX + 1) / 2);
                    187:        func.func_hash = hash_fnv((char*) str, MAXPATHLEN + UCHAR_MAX + 1);
                    188: 
                    189:        f = rpc_srv_getCall(srv, func.func_tag, func.func_hash);
                    190:        if (!f)         // not found element for unregister
                    191:                return 0;
                    192: 
                    193:        pthread_mutex_lock(&srv->srv_mtx);
                    194:        if (srv->srv_funcs == f) {      // if is 1st element
                    195:                srv->srv_funcs = srv->srv_funcs->func_next;
                    196: 
                    197:                if (f->func_args && f->func_vals)
                    198:                        free(f->func_vals);
                    199:                free(f);
                    200:        } else {
                    201:                for (curr = srv->srv_funcs; curr->func_next != f; curr = curr->func_next);
                    202:                curr->func_next = curr->func_next->func_next;
                    203: 
                    204:                if (f->func_args && f->func_vals)
                    205:                        free(f->func_vals);
                    206:                free(f);
                    207:        }
                    208:        pthread_mutex_unlock(&srv->srv_mtx);
                    209: 
                    210:        return 1;
                    211: }
                    212: 
                    213: /*
                    214:  * rpc_srv_getCall() Get registered call from RPC server
                    215:  * @srv = RPC Server instance
                    216:  * @tag = tag for function
                    217:  * @hash = hash for function
                    218:  * return: NULL not found call, !=NULL return call
                    219:  */
                    220: inline rpc_func_t *
                    221: rpc_srv_getCall(rpc_srv_t * __restrict srv, uint16_t tag, uint32_t hash)
                    222: {
                    223:        rpc_func_t *f;
                    224: 
                    225:        if (!srv) {
                    226:                rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t get function from RPC server ...\n");
                    227:                return NULL;
                    228:        }
                    229: 
                    230:        for (f = srv->srv_funcs; f; f = f->func_next)
                    231:                if (f->func_tag == tag && f->func_hash == hash)
                    232:                        break;
                    233: 
                    234:        return f;
                    235: }
                    236: 
                    237: /*
                    238:  * rpc_srv_getFunc() Get registered call from RPC server by Name
                    239:  * @srv = RPC Server instance
                    240:  * @csModule = Module name, if NULL self binary
                    241:  * @csFunc = Function name
                    242:  * return: NULL not found call, !=NULL return call
                    243:  */
                    244: rpc_func_t *
                    245: rpc_srv_getFunc(rpc_srv_t * __restrict srv, const char *csModule, const char *csFunc)
                    246: {
                    247:        rpc_func_t func;
                    248:        u_char str[MAXPATHLEN + UCHAR_MAX + 1];
                    249: 
                    250:        memset(&func, 0, sizeof(rpc_func_t));
                    251:        memset(str, 0, MAXPATHLEN + UCHAR_MAX + 1);
                    252:        if (!srv || !csFunc) {
                    253:                rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t get function from RPC server ...\n");
                    254:                return NULL;
                    255:        } else
                    256:                strlcpy((char*) func.func_name, csFunc, UCHAR_MAX + 1);
                    257:        if (csModule) {
                    258:                strlcpy((char*) func.func_file, csModule, MAXPATHLEN);
                    259:                strlcpy((char*) str, csModule, MAXPATHLEN + UCHAR_MAX + 1);
                    260:        }
                    261:        strlcat((char*) str, "__", MAXPATHLEN + UCHAR_MAX + 1);
                    262:        strlcat((char*) str, csFunc, MAXPATHLEN + UCHAR_MAX + 1);
                    263: 
                    264:        func.func_tag = crcFletcher16((u_short*) str, (MAXPATHLEN + UCHAR_MAX + 1) / 2);
                    265:        func.func_hash = hash_fnv((char*) str, MAXPATHLEN + UCHAR_MAX + 1);
                    266: 
                    267:        return rpc_srv_getCall(srv, func.func_tag, func.func_hash);
                    268: }
                    269: 
                    270: // ---------------------------------------------------------
                    271: 
                    272: /*
                    273:  * rpc_srv_getBLOB() Get registered BLOB 
                    274:  * @srv = RPC Server instance
                    275:  * @var = hash for variable
                    276:  * return: NULL not found, !=NULL return blob var
                    277:  */
                    278: inline rpc_blob_t *
                    279: rpc_srv_getBLOB(rpc_srv_t * __restrict srv, uint32_t var)
                    280: {
                    281:        rpc_blob_t *b;
                    282: 
                    283:        if (!srv) {
                    284:                rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t get variable from BLOB server ...\n");
                    285:                return NULL;
                    286:        }
                    287: 
                    288:        for (b = srv->srv_blob.blobs; b; b = b->blob_next)
                    289:                if (b->blob_var == var)
                    290:                        break;
                    291: 
                    292:        return b;
                    293: }
                    294: 
1.1.2.3 ! misho     295: /*
        !           296:  * rpc_srv_registerBLOB() Register new BLOB to server
        !           297:  * @srv = RPC Server instance
        !           298:  * @len = BLOB length
        !           299:  * return: -1 error or 0 register ok
        !           300:  */
        !           301: rpc_blob_t *
        !           302: rpc_srv_registerBLOB(rpc_srv_t * __restrict srv, size_t len)
        !           303: {
        !           304:        rpc_blob_t *blob = NULL;
        !           305: 
        !           306:        if (!srv || !len) {
        !           307:                rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t register BLOB to server ...\n");
        !           308:                return blob;
        !           309:        }
        !           310: 
        !           311:        blob = rpc_srv_blobCreate(srv, len);
        !           312:        if (blob) {
        !           313:                pthread_mutex_lock(&srv->srv_blob.mtx);
        !           314:                blob->blob_next = srv->srv_blob.blobs;
        !           315:                srv->srv_blob.blobs = blob;
        !           316:                pthread_mutex_unlock(&srv->srv_blob.mtx);
        !           317:        }
        !           318: 
        !           319:        return blob;
        !           320: }
        !           321: 
        !           322: /*
        !           323:  * rpc_srv_unregisterBLOB() Unregister BLOB from server
        !           324:  * @srv = RPC Server instance
        !           325:  * @var = BLOB Variable for unregister
        !           326:  * return: -1 error, 0 not found call, 1 unregister ok
        !           327:  */
        !           328: int
        !           329: rpc_srv_unregisterBLOB(rpc_srv_t * __restrict srv, uint32_t var)
        !           330: {
        !           331:        rpc_blob_t *b, *curr;
        !           332: 
        !           333:        if (!srv) {
        !           334:                rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t unregister BLOB from server ...\n");
        !           335:                return -1;
        !           336:        }
        !           337: 
        !           338:        b = rpc_srv_getBLOB(srv, var);
        !           339:        if (!b)         // not found element for unregister
        !           340:                return 0;
        !           341: 
        !           342:        pthread_mutex_lock(&srv->srv_blob.mtx);
        !           343:        if (srv->srv_blob.blobs == b) { // if is 1st element
        !           344:                srv->srv_blob.blobs = srv->srv_blob.blobs->blob_next;
        !           345:        } else {
        !           346:                for (curr = srv->srv_blob.blobs; curr->blob_next != b; curr = curr->blob_next);
        !           347:                curr->blob_next = curr->blob_next->blob_next;
        !           348:        }
        !           349:        rpc_srv_blobFree(srv, b);
        !           350:        free(b);
        !           351:        pthread_mutex_unlock(&srv->srv_blob.mtx);
        !           352: 
        !           353:        return 1;
        !           354: }

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