--- libaitrpc/src/srv.c 2024/02/26 11:01:01 1.30.2.4 +++ 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.4 2024/02/26 11:01:01 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 @@ -291,7 +291,7 @@ execCall(sched_task_t *task) if (TASK_VAL(task)) { /* without reply */ ait_freeVars(&c->cli_vars); - } else { + } else if (rpc->call_io & RPC_REQ) { /* reply */ rpc->call_argc = (u_char) array_Size(RPC_RETVARS(c)); } @@ -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); @@ -1383,8 +1405,7 @@ rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv, u_s close(srv->srv_blob.server.cli_sock); AIT_FREE_VAL(&srv->srv_blob.dir); return -1; - } else - schedSignalDispatch(srv->srv_blob.root, 42); + } return 0; } @@ -1459,7 +1480,6 @@ rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv) schedPolling(srv->srv_blob.root, &ts, NULL); /* main rpc loop */ schedRun(srv->srv_blob.root, &srv->srv_blob.kill); - schedSignalDispatch(srv->srv_blob.root, 0); /* detach blobs */ TAILQ_FOREACH_SAFE(b, &srv->srv_blob.blobs, blob_node, tmp) {