Diff for /libaitrpc/src/blob.c between versions 1.16 and 1.17

version 1.16, 2015/01/21 21:17:05 version 1.17, 2015/07/02 22:28:15
Line 70  rpc_srv_blobCreate(rpc_srv_t * __restrict srv, int len Line 70  rpc_srv_blobCreate(rpc_srv_t * __restrict srv, int len
         char szFName[MAXPATHLEN];          char szFName[MAXPATHLEN];
         int f;          int f;
         u_int rnd;          u_int rnd;
        struct timespec ts = { tout ? tout : RPC_BLOB_TIMEOUT, 0 };        struct timespec ts = { tout ? tout : DEF_RPC_BLOB_TIMEOUT, 0 };
   
 again:  again:
         rnd = random() % UINT_MAX;          rnd = random() % UINT_MAX;
Line 107  again: Line 107  again:
                 close(f);                  close(f);
                 unlink(szFName);                  unlink(szFName);
                 return NULL;                  return NULL;
        } else        } else {
                 close(f);                  close(f);
   
                   madvise(blob->blob_data, len, MADV_SEQUENTIAL);
           }
   
         blob->blob_len = len;          blob->blob_len = len;
         blob->blob_var = rnd;          blob->blob_var = rnd;
   
Line 275  rpc_srv_recvBLOB(rpc_cli_t * __restrict cli, rpc_blob_ Line 278  rpc_srv_recvBLOB(rpc_cli_t * __restrict cli, rpc_blob_
                         return -1;                          return -1;
                 }                  }
         }          }
   
         return ret;  
 }  
   
 /* ------------------------------------------------------------ */  
   
 /*  
  * rpc_cli_sendBLOB() - Send BLOB to server  
  *  
  * @cli = Client instance  
  * @var = BLOB variable  
  * @data = BLOB data  
  * @tout = BLOB live on server timeout in seconds, if =0 default timeout  
  * return: -1 error, 0 ok, 1 remote error  
  */  
 int  
 rpc_cli_sendBLOB(rpc_cli_t * __restrict cli, ait_val_t * __restrict var,   
                 void * __restrict data, int tout)  
 {  
         int ret, len;  
         uint8_t *pos;  
         struct tagBLOBHdr hdr;  
         struct pollfd pfd;  
   
         if (!cli || !var || !data) {  
                 rpc_SetErr(EINVAL, "Invalid arguments");  
                 return -1;  
         } else  
                 memset(&hdr, 0, sizeof hdr);  
   
         rpc_addPktSession(&hdr.hdr_session, cli->cli_parent);  
         hdr.hdr_cmd = set;  
         hdr.hdr_var = 0;  
         hdr.hdr_ret = tout;  
         hdr.hdr_len = htonl(AIT_LEN(var));  
   
         /* send SET request */  
         pfd.fd = cli->cli_sock;  
         pfd.events = POLLOUT;  
         if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) == -1 ||   
                         pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) {  
                 LOGERR;  
                 return -1;  
         }  
         if (send(cli->cli_sock, &hdr, sizeof hdr, MSG_NOSIGNAL) == -1) {  
                 LOGERR;  
                 return -1;  
         }  
   
         /* send BLOB to server */  
         for (ret = AIT_LEN(var), pos = data; ret > 0; ret -= len, pos += len)  
                 if ((len = send(cli->cli_sock, pos, ret, MSG_NOSIGNAL)) == -1) {  
                         LOGERR;  
                         return -1;  
                 }  
   
         /* wait for reply */  
         pfd.events = POLLIN | POLLPRI;  
         if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 ||   
                         pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) {  
                 if (ret)  
                         LOGERR;  
                 else  
                         rpc_SetErr(ETIMEDOUT, "Timeout reached! Server not respond");  
                 return -1;  
         }  
         if (recv(cli->cli_sock, &hdr, sizeof hdr, 0) == -1) {  
                 LOGERR;  
                 return 1;  
         }  
   
         if (hdr.hdr_cmd != error) {  
                 AIT_SET_BLOB(var, ntohl(hdr.hdr_var), ntohl(hdr.hdr_len));  
   
                 if (ntohl(hdr.hdr_len) != AIT_LEN(var)) {  
                         rpc_cli_delBLOB(cli, var);  
                         AIT_NEW_BLOB(var, ntohl(hdr.hdr_len));  
   
                         rpc_SetErr(ECANCELED, "Bad return length packet");  
                         return 1;  
                 }  
         }  
   
         return hdr.hdr_cmd == error;  
 }  
   
 /*  
  * rpc_cli_recvBLOB() - Receive BLOB from server  
  *  
  * @cli = Client instance  
  * @var = BLOB variable  
  * @data = BLOB data, must be e_free after use!  
  * return: -1 error, 0 ok, 1 remote error  
  */  
 int  
 rpc_cli_recvBLOB(rpc_cli_t * __restrict cli, ait_val_t * __restrict var, void ** __restrict data)  
 {  
         int ret, len;  
         uint8_t *pos;  
         struct pollfd pfd;  
         struct tagBLOBHdr hdr;  
   
         if (!cli || !var || !data) {  
                 rpc_SetErr(EINVAL, "Invalid arguments");  
                 return -1;  
         }  
   
         *data = e_malloc(AIT_LEN(var));  
         if (!*data) {  
                 LOGERR;  
                 return -1;  
         } else {  
                 memset(&hdr, 0, sizeof hdr);  
                 memset(*data, 0, AIT_LEN(var));  
         }  
   
         rpc_addPktSession(&hdr.hdr_session, cli->cli_parent);  
         hdr.hdr_cmd = get;  
         hdr.hdr_var = htonl((uint32_t) AIT_GET_BLOB(var));  
         hdr.hdr_ret = 0;  
         hdr.hdr_len = 0;  
   
         /* send GET request */  
         pfd.fd = cli->cli_sock;  
         pfd.events = POLLOUT;  
         if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) == -1 ||   
                         pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) {  
                 LOGERR;  
                 e_free(*data);  
                 *data = NULL;  
                 return -1;  
         }  
         if (send(cli->cli_sock, &hdr, sizeof hdr, 0) == -1) {  
                 LOGERR;  
                 e_free(*data);  
                 *data = NULL;  
                 return -1;  
         }  
   
         /* receive BLOB from server */  
         pfd.events = POLLIN | POLLPRI;  
         for (ret = AIT_LEN(var), pos = *data; ret > 0; ret -= len, pos += len) {  
                 if ((len = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 ||   
                                 pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) {  
                         LOGERR;  
                         e_free(*data);  
                         *data = NULL;  
                         return -1;  
                 }  
   
                 if ((len = recv(cli->cli_sock, pos, ret, 0)) == -1) {  
                         LOGERR;  
                         e_free(*data);  
                         *data = NULL;  
                         return -1;  
                 }  
         }  
   
         /* wait for reply */  
         if ((len = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 ||   
                         pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) {  
                 if (len)  
                         LOGERR;  
                 else  
                         rpc_SetErr(ETIMEDOUT, "Timeout reached! Server not respond");  
                 e_free(*data);  
                 *data = NULL;  
                 return 1;  
         }  
         if (recv(cli->cli_sock, &hdr, sizeof hdr, 0) == -1) {  
                 LOGERR;  
                 e_free(*data);  
                 *data = NULL;  
                 return 1;  
         }  
         if (hdr.hdr_cmd != error) {  
                 if (ntohl(hdr.hdr_len) != AIT_LEN(var)) {  
                         rpc_SetErr(ECANCELED, "Bad return length packet");  
                         e_free(*data);  
                         *data = NULL;  
                         return 1;  
                 }  
         }  
   
         return hdr.hdr_cmd == error;  
 }  
   
 /*  
  * rpc_cli_delBLOB() - Delete BLOB from server  
  *  
  * @cli = Client instance  
  * @var = BLOB variable  
  * return: -1 error, 0 ok, 1 remote error  
  */  
 int  
 rpc_cli_delBLOB(rpc_cli_t * __restrict cli, ait_val_t * __restrict var)  
 {  
         struct tagBLOBHdr hdr;  
         struct pollfd pfd;  
         int ret;  
   
         if (!cli || !var) {  
                 rpc_SetErr(EINVAL, "Invalid arguments");  
                 return -1;  
         } else  
                 memset(&hdr, 0, sizeof hdr);  
   
         rpc_addPktSession(&hdr.hdr_session, cli->cli_parent);  
         hdr.hdr_cmd = unset;  
         hdr.hdr_var = htonl((uint32_t) AIT_GET_BLOB(var));  
         hdr.hdr_ret = 0;  
         hdr.hdr_len = 0;  
   
         /* send UNSET request */  
         pfd.fd = cli->cli_sock;  
         pfd.events = POLLOUT;  
         if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) == -1 ||   
                         pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) {  
                 LOGERR;  
                 return -1;  
         }  
         if (send(cli->cli_sock, &hdr, sizeof hdr, MSG_NOSIGNAL) == -1) {  
                 LOGERR;  
                 return -1;  
         }  
   
         /* wait for reply */  
         pfd.events = POLLIN | POLLPRI;  
         if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 ||   
                         pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) {  
                 if (ret)  
                         LOGERR;  
                 else  
                         rpc_SetErr(ETIMEDOUT, "Timeout reached! Server not respond");  
                 return 1;  
         }  
         if (recv(cli->cli_sock, &hdr, sizeof hdr, 0) == -1) {  
                 LOGERR;  
                 return 1;  
         }  
   
         return hdr.hdr_cmd == error;  
 }  
   
 /*  
  * rpc_cli_getBLOB() - Receive BLOB from server and Delete after that  
  *  
  * @cli = Client instance  
  * @var = BLOB variable  
  * @data = BLOB data, must be e_free after use!  
  * return: -1 error, 0 ok, 1 remote error  
  */  
 int  
 rpc_cli_getBLOB(rpc_cli_t * __restrict cli, ait_val_t * __restrict var, void ** __restrict data)  
 {  
         int ret;  
   
         ret = rpc_cli_recvBLOB(cli, var, data);  
         ret |= rpc_cli_delBLOB(cli, var) > 0 ? 2 : 0;  
   
         return ret;          return ret;
 }  }

Removed from v.1.16  
changed lines
  Added in v.1.17


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>