--- libaitrpc/src/srv.c 2010/06/23 16:23:31 1.1.1.1.2.6 +++ libaitrpc/src/srv.c 2010/06/24 11:01:46 1.1.1.1.2.9 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: srv.c,v 1.1.1.1.2.6 2010/06/23 16:23:31 misho Exp $ +* $Id: srv.c,v 1.1.1.1.2.9 2010/06/24 11:01:46 misho Exp $ * *************************************************************************/ #include "global.h" @@ -12,7 +12,7 @@ static void * rpc_srv_dispatchCall(void *arg) { - rpc_cli_t cli, *c = arg; + rpc_cli_t *c = arg; rpc_srv_t *s; rpc_val_t *vals, *v = NULL; rpc_func_t *f; @@ -74,10 +74,6 @@ rpc_srv_dispatchCall(void *arg) v[i].val.string = (int8_t*) data; data += v[i].val_len + 1; break; - case blob: - rpc_srv_getBLOBVar(&v[i], data); - data += sizeof(rpc_cli_t); - break; default: break; } @@ -135,20 +131,6 @@ rpc_srv_dispatchCall(void *arg) data += vals[i].val_len + 1; Limit += vals[i].val_len + 1; break; - case blob: - if (ret || Limit + sizeof(rpc_cli_t) > BUFSIZ) { - rpc_SetErr(EMSGSIZE, "Error:: in prepare RPC packet (-7) ...\n"); - rrpc.ret_retcode = ret = -7; - rrpc.ret_argc = 0; - break; - } - - memcpy(data, &cli, sizeof(rpc_cli_t)); - data += sizeof(rpc_cli_t); - Limit += sizeof(rpc_cli_t); - - rpc_srv_setBLOBVar(&vals[i], &cli); - break; default: break; } @@ -196,14 +178,13 @@ 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; - } + } else + cx++; memset(buf, 0, sizeof buf); if ((ret = recv(c->cli_sock, buf, sizeof buf, 0)) == -1) { LOGERR; @@ -227,14 +208,16 @@ 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; - } + // Go to proceed packet ... switch (blob->hdr_cmd) { case get: + 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; + } + if (rpc_srv_blobMap(s, b) != -1) { ret = rpc_srv_sendBLOB(c, b); rpc_srv_blobUnmap(b); @@ -242,22 +225,40 @@ rpc_srv_dispatchVars(void *arg) ret = -7; break; case set: - ret = rpc_srv_recvBLOB(c, b); - if (ret == -1) + if ((b = rpc_srv_registerBLOB(s, blob->hdr_len))) { + // set new BLOB variable for reply :) + blob->hdr_var = b->blob_var; + + ret = rpc_srv_recvBLOB(c, b); + rpc_srv_blobUnmap(b); + } else ret = -7; break; case unset: - ret = rpc_srv_deleteBLOB(c, b); + ret = rpc_srv_unregisterBLOB(s, blob->hdr_var); 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); shutdown(c->cli_sock, SHUT_RDWR);