--- libaitrpc/src/srv.c 2010/06/23 15:07:15 1.1.1.1.2.5 +++ libaitrpc/src/srv.c 2010/06/23 17:29:07 1.1.1.1.2.8 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: srv.c,v 1.1.1.1.2.5 2010/06/23 15:07:15 misho Exp $ +* $Id: srv.c,v 1.1.1.1.2.8 2010/06/23 17:29:07 misho Exp $ * *************************************************************************/ #include "global.h" @@ -185,7 +185,7 @@ rpc_srv_dispatchVars(void *arg) rpc_blob_t *b; int cx, ret; fd_set fds; - u_char buf[BLOBSIZ]; + u_char buf[sizeof(struct tagBLOBHdr)]; struct tagBLOBHdr *blob; if (!arg) { @@ -196,16 +196,15 @@ rpc_srv_dispatchVars(void *arg) cx = -1; do { - cx++; - FD_ZERO(&fds); FD_SET(c->cli_sock, &fds); ret = select(c->cli_sock + 1, &fds, NULL, NULL, NULL); if (ret == -1) { ret = -2; - } - memset(buf, 0, BLOBSIZ); - if ((ret = recv(c->cli_sock, buf, BLOBSIZ, 0)) == -1) { + } else + cx++; + memset(buf, 0, sizeof buf); + if ((ret = recv(c->cli_sock, buf, sizeof buf, 0)) == -1) { LOGERR; ret = -3; break; @@ -227,26 +226,57 @@ rpc_srv_dispatchVars(void *arg) ret = -5; break; } - // Go to decapsulate packet ... - if (!(b = rpc_srv_getBLOB(s, blob->hdr_var))) { - rpc_SetErr(EINVAL, "Error:: var (%x) not found into BLOB server ...\n", blob->hdr_var); - ret = -6; - break; - } + // get requested BLOB object + if (!(b = rpc_srv_getBLOB(s, blob->hdr_var))) + if (blob->hdr_cmd != set) { + rpc_SetErr(EINVAL, "Error:: var (%x) not found into BLOB server ...\n", blob->hdr_var); + ret = -6; + break; + } + // Go to proceed packet ... switch (blob->hdr_cmd) { case get: - ret = rpc_srv_sendBLOB(c, b); + if (rpc_srv_blobMap(s, b) != -1) { + ret = rpc_srv_sendBLOB(c, b); + rpc_srv_blobUnmap(b); + } else + ret = -7; break; case set: - ret = rpc_srv_recvBLOB(c, b); + if (b) { + rpc_SetErr(EINVAL, "Error:: Cannot set var into BLOB server, already exists ...\n"); + ret = -6; + break; + } + + ret = rpc_srv_recvBLOB(c); + if (ret == -1) + ret = -7; break; case unset: - ret = rpc_srv_freeBLOB(b); + ret = rpc_srv_blobFree(s, b); + if (ret == -1) + ret = -7; break; default: rpc_SetErr(EINVAL, "Error:: unsupported BLOB command (%d)...\n", blob->hdr_cmd); - ret -7; + ret = -7; + } + + // Replay to client! + blob->hdr_cmd = ret < 0 ? error : ok; + blob->hdr_seq = ret; + if ((ret = send(c->cli_sock, buf, sizeof buf, 0)) == -1) { + LOGERR; + ret = -8; + break; + } + if (ret != sizeof buf) { + rpc_SetErr(EBADMSG, "Error:: in send BLOB reply, should be send %d bytes, " + "really is %d\n", sizeof buf, ret); + ret = -9; + break; } } while (ret > -1);