|
|
| version 1.17.4.3, 2013/08/21 09:42:12 | version 1.17.4.4, 2013/08/21 11:41:15 |
|---|---|
| Line 191 txPacket(sched_task_t *task) | Line 191 txPacket(sched_task_t *task) |
| rpc_cli_t *c = TASK_ARG(task); | rpc_cli_t *c = TASK_ARG(task); |
| rpc_srv_t *s = c->cli_parent; | rpc_srv_t *s = c->cli_parent; |
| rpc_func_t *f = NULL; | rpc_func_t *f = NULL; |
| u_char buf[USHRT_MAX] = { 0 }; | u_char *buf; |
| struct tagRPCCall *rpc = (struct tagRPCCall*) buf; | struct tagRPCCall *rpc; |
| int ret, wlen = sizeof(struct tagRPCCall); | int ret, wlen = sizeof(struct tagRPCCall); |
| int len = sizeof(struct tagRPCCall) + ntohl(rpc->call_len); | |
| /* copy RPC header */ | buf = e_malloc(len); |
| memcpy(buf, TASK_DATA(task), wlen); | if (!buf) { |
| rpc_SetErr(elwix_GetErrno(), "%s", elwix_GetError()); | |
| return NULL; | |
| } else { | |
| /* copy RPC header */ | |
| memcpy(buf, TASK_DATA(task), wlen); | |
| rpc = (struct tagRPCCall*) buf; | |
| } | |
| if (rpc->call_argc) { | if (rpc->call_argc) { |
| f = rpc_srv_getCall(s, ntohs(rpc->call_tag)); | f = rpc_srv_getCall(s, ntohs(rpc->call_tag)); |
| if (!f) { | if (!f) { |
| rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); | rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); |
| rpc->call_argc ^= rpc->call_argc; | rpc->call_argc ^= rpc->call_argc; |
| rpc->call_rep.ret = RPC_ERROR(-1); | rpc->call_rep.ret = RPC_ERROR(-1); |
| rpc->call_rep.eno = RPC_ERROR(rpc_Errno); | rpc->call_rep.eno = RPC_ERROR(rpc_Errno); |
| } else { | } else { |
| rpc->call_argc = htons(array_Size(RPC_RETVARS(c))); | rpc->call_argc = htons(array_Size(RPC_RETVARS(c))); |
| /* Go Encapsulate variables */ | /* Go Encapsulate variables */ |
| ret = ait_vars2buffer(buf + wlen, sizeof buf - wlen, RPC_RETVARS(c)); | ret = ait_vars2buffer(buf + wlen, len - wlen, RPC_RETVARS(c)); |
| /* Free return values */ | /* Free return values */ |
| ait_freeVars(&c->cli_vars); | ait_freeVars(&c->cli_vars); |
| if (ret == -1) { | if (ret == -1) { |
| rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); | rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); |
| rpc->call_argc ^= rpc->call_argc; | rpc->call_argc ^= rpc->call_argc; |
| rpc->call_rep.ret = RPC_ERROR(-1); | rpc->call_rep.ret = RPC_ERROR(-1); |
| rpc->call_rep.eno = RPC_ERROR(rpc_Errno); | rpc->call_rep.eno = RPC_ERROR(rpc_Errno); |
| Line 221 txPacket(sched_task_t *task) | Line 231 txPacket(sched_task_t *task) |
| } | } |
| } | } |
| rpc->call_len = htons(wlen); | rpc->call_len = htonl(wlen); |
| #if 0 | |
| /* calculate CRC */ | |
| rpc->call_crc ^= rpc->call_crc; | |
| rpc->call_crc = htons(crcFletcher16((u_short*) buf, wlen / 2)); | |
| #endif | |
| /* send reply */ | /* send reply */ |
| ret = send(TASK_FD(task), buf, wlen, MSG_NOSIGNAL); | ret = send(TASK_FD(task), buf, wlen, MSG_NOSIGNAL); |