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

version 1.8, 2013/03/07 23:10:50 version 1.11, 2013/08/23 13:53:15
Line 73  AVL_GENERATE(tagRPCFuncs, tagRPCFunc, func_node, rpc_f Line 73  AVL_GENERATE(tagRPCFuncs, tagRPCFunc, func_node, rpc_f
 #pragma GCC visibility pop  #pragma GCC visibility pop
   
 // rpc_GetErrno() Get error code of last operation  // rpc_GetErrno() Get error code of last operation
inline intint
 rpc_GetErrno()  rpc_GetErrno()
 {  {
         return rpc_Errno;          return rpc_Errno;
 }  }
   
 // rpc_GetError() Get error text of last operation  // rpc_GetError() Get error text of last operation
inline const char *const char *
 rpc_GetError()  rpc_GetError()
 {  {
         return rpc_Error;          return rpc_Error;
 }  }
   
 // rpc_SetErr() Set error to variables for internal use!!!  // rpc_SetErr() Set error to variables for internal use!!!
inline voidvoid
 rpc_SetErr(int eno, char *estr, ...)  rpc_SetErr(int eno, char *estr, ...)
 {  {
         va_list lst;          va_list lst;
Line 107  rpc_SetErr(int eno, char *estr, ...) Line 107  rpc_SetErr(int eno, char *estr, ...)
  * @s = active session   * @s = active session
  * return: -1, 1, 2, 3 are errors or 0 ok   * return: -1, 1, 2, 3 are errors or 0 ok
  */   */
inline intint
 rpc_chkPktSession(rpc_sess_t *p, rpc_sess_t *s)  rpc_chkPktSession(rpc_sess_t *p, rpc_sess_t *s)
 {  {
         if (!p || !s)          if (!p || !s)
Line 115  rpc_chkPktSession(rpc_sess_t *p, rpc_sess_t *s) Line 115  rpc_chkPktSession(rpc_sess_t *p, rpc_sess_t *s)
   
         if (p->sess_version != s->sess_version)          if (p->sess_version != s->sess_version)
                 return 1;                  return 1;
        if (ntohl(p->sess_program) != s->sess_program)        if (p->sess_instance != s->sess_instance)
                 return 2;                  return 2;
         if (p->sess_process != s->sess_process)  
                 return 3;  
   
         return 0;          return 0;
 }  }
Line 130  rpc_chkPktSession(rpc_sess_t *p, rpc_sess_t *s) Line 128  rpc_chkPktSession(rpc_sess_t *p, rpc_sess_t *s)
  * @s = host session   * @s = host session
  * return: -1 error or 0 ok   * return: -1 error or 0 ok
  */   */
inline intint
 rpc_addPktSession(rpc_sess_t *p, rpc_sess_t *s)  rpc_addPktSession(rpc_sess_t *p, rpc_sess_t *s)
 {  {
         if (!p || !s)          if (!p || !s)
                 return -1;                  return -1;
   
         p->sess_version = s->sess_version;          p->sess_version = s->sess_version;
        p->sess_program = htonl(s->sess_program);        p->sess_instance = s->sess_instance;
        p->sess_process = s->sess_process; 
   
         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.8  
changed lines
  Added in v.1.11


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