--- libaitrpc/src/srv.c 2015/06/30 14:11:55 1.26.2.10 +++ libaitrpc/src/srv.c 2015/07/02 21:52:29 1.26.2.12 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: srv.c,v 1.26.2.10 2015/06/30 14:11:55 misho Exp $ +* $Id: srv.c,v 1.26.2.12 2015/07/02 21:52:29 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -82,7 +82,29 @@ static sched_task_func_t cbProto[SOCK_MAX_SUPPORT][4] static volatile uintptr_t _glSigArg = 0; +#pragma GCC visibility push(hidden) +static int +rpc_funcs_cmp(struct tagRPCFunc *a, struct tagRPCFunc *b) +{ + int ret; + + assert(a && b); + + ret = AIT_KEY(&a->func_name) - AIT_KEY(&b->func_name); + + if (ret < 0) + return -1; + else if (ret > 0) + return 1; + + return ret; +} + +AVL_GENERATE(tagRPCFuncs, tagRPCFunc, func_node, rpc_funcs_cmp); + +#pragma GCC visibility pop + void rpc_freeCli(rpc_cli_t * __restrict c) { @@ -197,14 +219,14 @@ txPacket(sched_task_t *task) rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(rpc_Errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); } else if (rpc_pktFreeSpace(c) > s->srv_netbuf) { rpc_SetErr(EMSGSIZE, "Message too long"); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(rpc_Errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); } else { rpc->call_argc = (u_char) array_Size(RPC_RETVARS(c)); /* Go Encapsulate variables */ @@ -214,8 +236,8 @@ txPacket(sched_task_t *task) rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(rpc_Errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); } else wlen += ret; } @@ -263,8 +285,8 @@ execCall(sched_task_t *task) rpc_SetErr(ERPCMISMATCH, "#%d - %s", elwix_GetErrno(), elwix_GetError()); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(rpc_Errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); taskExit(task, NULL); } } else @@ -274,15 +296,15 @@ execCall(sched_task_t *task) rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(rpc_Errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); } else { /* if client doesn't want reply */ - rpc->call_rep.ret = RPC_ERROR(rpc_srv_execCall(c, rpc, f->func_name, arr)); + RPC_SET_RETURN(rpc, rpc_srv_execCall(c, rpc, f->func_name, arr)); if (rpc->call_rep.ret == htonl(-1)) { if (!rpc->call_rep.eno) { LOGERR; - rpc->call_rep.eno = RPC_ERROR(rpc_Errno); + RPC_SET_ERRNO(rpc, rpc_Errno); } rpc->call_argc ^= rpc->call_argc; ait_freeVars(&c->cli_vars); @@ -339,8 +361,8 @@ rxPacket(sched_task_t *task) rpc_SetErr(ERPCMISMATCH, "Short RPC packet"); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); goto err; } else len = ntohl(rpc->call_len); @@ -348,8 +370,8 @@ rxPacket(sched_task_t *task) rpc_SetErr(ERPCMISMATCH, "Short RPC packet"); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); goto err; } @@ -367,8 +389,8 @@ rxPacket(sched_task_t *task) rpc_SetErr(ERPCMISMATCH, "Bad CRC RPC packet"); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); goto err; } #endif @@ -378,8 +400,8 @@ rxPacket(sched_task_t *task) rpc_SetErr(ERPCMISMATCH, "Get invalid RPC session"); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); goto err; } @@ -464,14 +486,14 @@ txUDPPacket(sched_task_t *task) rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(rpc_Errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); } else if (rpc_pktFreeSpace(c) > s->srv_netbuf) { rpc_SetErr(EMSGSIZE, "Message too long"); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(rpc_Errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); } else { rpc->call_argc = (u_char) array_Size(RPC_RETVARS(c)); /* Go Encapsulate variables */ @@ -481,8 +503,8 @@ txUDPPacket(sched_task_t *task) rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(rpc_Errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); } else wlen += ret; } @@ -604,14 +626,14 @@ txRAWPacket(sched_task_t *task) rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(rpc_Errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); } else if (rpc_pktFreeSpace(c) > s->srv_netbuf) { rpc_SetErr(EMSGSIZE, "Message too long"); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(rpc_Errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); } else { rpc->call_argc = (u_char) array_Size(RPC_RETVARS(c)); /* Go Encapsulate variables */ @@ -621,8 +643,8 @@ txRAWPacket(sched_task_t *task) rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(rpc_Errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); } else wlen += ret; } @@ -765,14 +787,14 @@ txBPFPacket(sched_task_t *task) rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(rpc_Errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); } else if (rpc_pktFreeSpace(c) > s->srv_netbuf) { rpc_SetErr(EMSGSIZE, "Message too long"); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(rpc_Errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); } else { rpc->call_argc = (u_char) array_Size(RPC_RETVARS(c)); /* Go Encapsulate variables */ @@ -782,8 +804,8 @@ txBPFPacket(sched_task_t *task) rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(rpc_Errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); } else wlen += ret; } @@ -928,14 +950,14 @@ txEXTPacket(sched_task_t *task) rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(rpc_Errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); } else if (rpc_pktFreeSpace(c) > s->srv_netbuf) { rpc_SetErr(EMSGSIZE, "Message too long"); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(rpc_Errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); } else { rpc->call_argc = (u_char) array_Size(RPC_RETVARS(c)); /* Go Encapsulate variables */ @@ -945,8 +967,8 @@ txEXTPacket(sched_task_t *task) rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); rpc->call_argc ^= rpc->call_argc; - rpc->call_rep.ret = RPC_ERROR(-1); - rpc->call_rep.eno = RPC_ERROR(rpc_Errno); + RPC_SET_RETURN(rpc, -1); + RPC_SET_ERRNO(rpc, rpc_Errno); } else wlen += ret; } @@ -1118,7 +1140,7 @@ rxBLOB(sched_task_t *task) if (!(b = rpc_srv_getBLOB(s, ntohl(blob.hdr_var)))) { rpc_SetErr(EINVAL, "Var=%x not found", ntohl(blob.hdr_var)); blob.hdr_cmd = no; - blob.hdr_ret = RPC_ERROR(-1); + RPC_SET_BLOB_RET(&blob, -1); break; } else blob.hdr_len = htonl(b->blob_len); @@ -1129,7 +1151,7 @@ rxBLOB(sched_task_t *task) rpc_srv_blobUnmap(b); } else { blob.hdr_cmd = error; - blob.hdr_ret = RPC_ERROR(-1); + RPC_SET_BLOB_RET(&blob, -1); } break; case set: @@ -1143,19 +1165,19 @@ rxBLOB(sched_task_t *task) rpc_srv_blobUnmap(b); } else { blob.hdr_cmd = error; - blob.hdr_ret = RPC_ERROR(-1); + RPC_SET_BLOB_RET(&blob, -1); } break; case unset: if (rpc_srv_unregisterBLOB(s, ntohl(blob.hdr_var)) == -1) { blob.hdr_cmd = error; - blob.hdr_ret = RPC_ERROR(-1); + RPC_SET_BLOB_RET(&blob, -1); } break; default: rpc_SetErr(EPROCUNAVAIL, "Unsupported BLOB command %d", blob.hdr_cmd); blob.hdr_cmd = error; - blob.hdr_ret = RPC_ERROR(-1); + RPC_SET_BLOB_RET(&blob, -1); } end: