Annotation of libaitrpc/src/lists.c, revision 1.1.2.2
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:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>