--- libaitrpc/src/srv.c 2024/02/26 13:30:59 1.30.2.6 +++ libaitrpc/src/srv.c 2024/02/26 16:56:22 1.30.2.7 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: srv.c,v 1.30.2.6 2024/02/26 13:30:59 misho Exp $ +* $Id: srv.c,v 1.30.2.7 2024/02/26 16:56:22 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -302,6 +302,21 @@ execCall(sched_task_t *task) taskExit(task, NULL); } +int +rpc_srv_Return(sched_root_task_t *root, rpc_cli_t *c) +{ + rpc_srv_t *s = c->cli_parent; + u_char *buf = AIT_GET_BUF(&c->cli_buf); + struct tagRPCCall *rpc = (struct tagRPCCall*) buf; + + if (!RPC_CHK_NOREPLY(rpc)) { + rpc->call_argc = (u_char) array_Size(RPC_RETVARS(c)); + schedWrite(root, cbProto[s->srv_proto][CB_TXPACKET], c, c->cli_sock, NULL, 0); + } + + return rpc->call_argc; +} + static void * rxPacket(sched_task_t *task) { @@ -323,8 +338,15 @@ rxPacket(sched_task_t *task) /* prepare rx */ len = recv(TASK_FD(task), &b, sizeof b, MSG_PEEK); - if (len == sizeof b) + if (len < 1) { + /* close connection */ + schedEvent(TASK_ROOT(task), cbProto[s->srv_proto][CB_CLOSECLIENT], + TASK_ARG(task), 0, NULL, 0); + taskExit(task, NULL); + } else if (len == sizeof b) rlen = ntohl(b.call_len); + else + goto end; rlen = recv(TASK_FD(task), buf, rlen, 0); if (rlen == -1) { @@ -390,7 +412,7 @@ err: if (!noreply && (rpc->call_io & RPC_REQ)) schedWrite(TASK_ROOT(task), cbProto[s->srv_proto][CB_TXPACKET], TASK_ARG(task), TASK_FD(task), rpc, len); - +end: /* lets get next packet */ schedReadSelf(task); taskExit(task, NULL);