Diff for /libaitrpc/src/aitrpc.c between versions 1.10 and 1.11

version 1.10, 2013/05/30 09:22:01 version 1.11, 2013/08/23 13:53:15
Line 139  rpc_addPktSession(rpc_sess_t *p, rpc_sess_t *s) Line 139  rpc_addPktSession(rpc_sess_t *p, rpc_sess_t *s)
   
         return 0;          return 0;
 }  }
   
   /*
    * rpc_Read() - RPC read operation
    *
    * @sock = socket
    * @type = type of socket
    * @flags = receive flags
    * @sa = check client address, if you use udp protocol
    * @buf = buffer
    * @blen = buffer length
    * return: -1 error or >-1 readed bytes into buffer
    */
   ssize_t
   rpc_Read(int sock, int type, int flags, sockaddr_t * __restrict sa, 
                   u_char * __restrict buf, size_t blen)
   {
           struct pollfd pfd;
           sockaddr_t sa2;
           socklen_t salen;
           int ret = 0, len;
   
           pfd.fd = sock;
           pfd.events = POLLIN | POLLPRI;
           memset(buf, 0, blen);
           memset(&sa2, 0, sizeof sa2);
           salen = sa2.ss.ss_len = sizeof(sockaddr_t);
   
           if (type == SOCK_STREAM) {
                   for (len = blen; len > 0; len -= ret, buf += ret) {
                           if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 || 
                                           pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) {
                                   LOGERR;
                                   return -1;
                           } else
                                   ret = recv(sock, buf, len, flags);
                           if (ret == -1) {
                                   LOGERR;
                                   return -1;
                           }
                   }
                   if (ret > -1)
                           ret = blen - len;
           } else {
                   do {
                           if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 || 
                                           pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) {
                                   LOGERR;
                                   return -1;
                           } else
                                   ret = recvfrom(sock, buf, blen, flags, &sa2.sa, &salen);
                           if (ret < 0) {
                                   LOGERR;
                                   return -1;
                           }
                           if (e_addrcmp(sa, &sa2, 42))
                                   rpc_SetErr(ERPCMISMATCH, "Received RPC response from unknown address");
                           else
                                   break;
                   } while (42);
           }
   
           return ret;
   }
   
   /*
    * rpc_Write() - RPC write operation
    *
    * @sock = socket
    * @type = type of socket
    * @flags = send flags
    * @sa = send to client address, if you use udp protocol
    * @buf = buffer
    * @blen = buffer length
    * return: -1 error or >-1 written bytes into buffer
    */
   ssize_t
   rpc_Write(int sock, int type, int flags, sockaddr_t * __restrict sa, 
                   u_char * __restrict buf, size_t blen)
   {
           struct pollfd pfd;
           int ret = 0, len = 0;
   
           pfd.fd = sock;
           pfd.events = POLLOUT;
   
           if (type == SOCK_STREAM) {
                   for (len = blen; len > 0; len -= ret, buf += ret) {
                           if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 || 
                                           pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) {
                                   LOGERR;
                                   return -1;
                           } else
                                   ret = send(sock, buf, len, flags);
                           if (ret == -1) {
                                   LOGERR;
                                   return -1;
                           }
                   }
                   if (ret > -1)
                           ret = blen - len;
           } else if (sa) {
                   if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 || 
                                   pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) {
                           LOGERR;
                           return -1;
                   } else
                           ret = sendto(sock, buf, blen, flags, &sa->sa, sa->sa.sa_len);
           } else {
                   rpc_SetErr(EINVAL, "Invalid argument(s)!");
                   return -1;
           }
           if (ret == -1) {
                   LOGERR;
                   return -1;
           } else if (ret != blen) {
                   rpc_SetErr(EPROCUNAVAIL, "RPC request, should be send %d bytes, "
                                   "really sended %d bytes", len, ret);
                   return -1;
           }
   
           return ret;
   }

Removed from v.1.10  
changed lines
  Added in v.1.11


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