--- libaitrpc/src/srv.c 2015/06/29 22:39:33 1.26.2.9 +++ libaitrpc/src/srv.c 2015/06/30 14:11:55 1.26.2.10 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: srv.c,v 1.26.2.9 2015/06/29 22:39:33 misho Exp $ +* $Id: srv.c,v 1.26.2.10 2015/06/30 14:11:55 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -313,6 +313,7 @@ rxPacket(sched_task_t *task) u_short crc; #endif u_char *buf = AIT_GET_BUF(&c->cli_buf); + u_char b[sizeof(struct tagRPCCall)]; struct tagRPCCall *rpc = (struct tagRPCCall*) buf; #ifdef TCP_SESSION_TIMEOUT struct timespec ts = { DEF_RPC_TIMEOUT, 0 }; @@ -322,6 +323,11 @@ rxPacket(sched_task_t *task) TASK_ARG(task), ts, TASK_ARG(task), 0); #endif + /* prepare rx */ + len = recv(TASK_FD(task), b, sizeof b, MSG_PEEK); + if (len == sizeof b) + rlen = ntohl(((struct tagRPCCall*) b)->call_len); + rlen = recv(TASK_FD(task), buf, rlen, 0); if (rlen == -1) { /* close connection */ @@ -613,6 +619,7 @@ txRAWPacket(sched_task_t *task) RPC_RETVARS(c)); if (ret == -1) { 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);