Diff for /libaitrpc/src/cli.c between versions 1.25.2.2 and 1.28.2.1

version 1.25.2.2, 2015/06/28 21:52:26 version 1.28.2.1, 2024/03/19 15:17:16
Line 12  terms: Line 12  terms:
 All of the documentation and software included in the ELWIX and AITNET  All of the documentation and software included in the ELWIX and AITNET
 Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>  Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   
Copyright 2004 - 2015Copyright 2004 - 2024
         by Michael Pounov <misho@elwix.org>.  All rights reserved.          by Michael Pounov <misho@elwix.org>.  All rights reserved.
   
 Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
Line 71  rpc_cli_openBLOBClient(rpc_cli_t * __restrict rpccli,  Line 71  rpc_cli_openBLOBClient(rpc_cli_t * __restrict rpccli, 
         } else          } else
                 memcpy(cli, rpccli, sizeof(rpc_cli_t));                  memcpy(cli, rpccli, sizeof(rpc_cli_t));
   
        memcpy(&cli->cli_sa, &rpccli->cli_sa, sizeof(sockaddr_t));        memcpy(&cli->cli_sa, &rpccli->cli_sa, sizeof cli->cli_sa);
         switch (cli->cli_sa.sa.sa_family) {          switch (cli->cli_sa.sa.sa_family) {
                 case AF_INET:                  case AF_INET:
                         cli->cli_sa.sin.sin_port =                           cli->cli_sa.sin.sin_port = 
Line 111  rpc_cli_openBLOBClient(rpc_cli_t * __restrict rpccli,  Line 111  rpc_cli_openBLOBClient(rpc_cli_t * __restrict rpccli, 
                 e_free(cli);                  e_free(cli);
                 return NULL;                  return NULL;
         }          }
        if (connect(cli->cli_sock, &cli->cli_sa.sa, cli->cli_sa.sa.sa_len) == -1) {        if (connect(cli->cli_sock, &cli->cli_sa.sa, e_addrlen(&cli->cli_sa)) == -1) {
                 LOGERR;                  LOGERR;
                 close(cli->cli_sock);                  close(cli->cli_sock);
                 e_free(cli);                  e_free(cli);
Line 158  rpc_cli_closeBLOBClient(rpc_cli_t ** __restrict cli) Line 158  rpc_cli_closeBLOBClient(rpc_cli_t ** __restrict cli)
 rpc_cli_t *  rpc_cli_t *
 rpc_cli_openClient(u_char InstID, int netBuf, const char *csHost, u_short Port, int proto)  rpc_cli_openClient(u_char InstID, int netBuf, const char *csHost, u_short Port, int proto)
 {  {
           int n = 1;
         rpc_cli_t *cli = NULL;          rpc_cli_t *cli = NULL;
         sockaddr_t sa = E_SOCKADDR_INIT;          sockaddr_t sa = E_SOCKADDR_INIT;
           socklen_t salen;
   
         if (proto < 0 || proto > SOCK_RAW) {          if (proto < 0 || proto > SOCK_RAW) {
                 rpc_SetErr(EINVAL, "Invalid parameters can`t open RPC client");                  rpc_SetErr(EINVAL, "Invalid parameters can`t open RPC client");
Line 170  rpc_cli_openClient(u_char InstID, int netBuf, const ch Line 172  rpc_cli_openClient(u_char InstID, int netBuf, const ch
   
         if (!Port && proto < SOCK_RAW)          if (!Port && proto < SOCK_RAW)
                 Port = RPC_DEFPORT;                  Port = RPC_DEFPORT;
        if (!e_gethostbyname(csHost, Port, &sa))        if (!(salen = e_gethostbyname(csHost, Port, &sa)))
                 return NULL;                  return NULL;
         if (!proto)          if (!proto)
                 proto = SOCK_STREAM;                  proto = SOCK_STREAM;
Line 218  rpc_cli_openClient(u_char InstID, int netBuf, const ch Line 220  rpc_cli_openClient(u_char InstID, int netBuf, const ch
                 LOGERR;                  LOGERR;
                 goto err;                  goto err;
         }          }
        if (cli->cli_id == SOCK_STREAM)        if (cli->cli_id == SOCK_STREAM) {
                if (connect(cli->cli_sock, &cli->cli_sa.sa, cli->cli_sa.sa.sa_len) == -1) {                setsockopt(cli->cli_sock, IPPROTO_TCP, TCP_NODELAY, &n, sizeof n);
                 if (connect(cli->cli_sock, &cli->cli_sa.sa, salen) == -1) {
                         LOGERR;                          LOGERR;
                         goto err;                          goto err;
                 }                  }
           }
         if (cli->cli_id == SOCK_DGRAM) {          if (cli->cli_id == SOCK_DGRAM) {
                 sockaddr_t sa2;                  sockaddr_t sa2;
   
                if (!e_gethostbyname(csHost, 0, &sa2))                if (!(salen = e_gethostbyname(csHost, 0, &sa2)))
                         goto err;                          goto err;
                if (bind(cli->cli_sock, &sa2.sa, sa2.sa.sa_len) == -1) {                if (bind(cli->cli_sock, &sa2.sa, salen) == -1) {
                         LOGERR;                          LOGERR;
                         goto err;                          goto err;
                 }                  }
Line 261  rpc_cli_reconnectClient(rpc_cli_t * __restrict cli) Line 265  rpc_cli_reconnectClient(rpc_cli_t * __restrict cli)
         else          else
                 netBuf = AIT_LEN(&cli->cli_buf);                  netBuf = AIT_LEN(&cli->cli_buf);
   
           if (cli->cli_id == SOCK_STREAM)
                   shutdown(cli->cli_sock, SHUT_RDWR);
           if (cli->cli_id == SOCK_DGRAM && cli->cli_sa.sa.sa_family == AF_LOCAL) {
                   sockaddr_t sa2 = E_SOCKADDR_INIT;
                   socklen_t salen = sizeof sa2;
   
   #ifndef __linux__
                   sa2.sa.sa_len = salen;
   #endif
                   if (!getsockname(cli->cli_sock, &sa2.sa, &salen))
                           unlink(sa2.sun.sun_path);
           }
         close(cli->cli_sock);          close(cli->cli_sock);
   
         srandom(time(NULL) ^ getpid());          srandom(time(NULL) ^ getpid());
Line 283  rpc_cli_reconnectClient(rpc_cli_t * __restrict cli) Line 299  rpc_cli_reconnectClient(rpc_cli_t * __restrict cli)
                 return -1;                  return -1;
         }          }
         if (cli->cli_id == SOCK_STREAM)          if (cli->cli_id == SOCK_STREAM)
                if (connect(cli->cli_sock, &cli->cli_sa.sa, cli->cli_sa.sa.sa_len) == -1) {                if (connect(cli->cli_sock, &cli->cli_sa.sa, e_addrlen(&cli->cli_sa)) == -1) {
                         LOGERR;                          LOGERR;
                         close(cli->cli_sock);                          close(cli->cli_sock);
                         return -1;                          return -1;
Line 307  rpc_cli_closeClient(rpc_cli_t ** __restrict cli) Line 323  rpc_cli_closeClient(rpc_cli_t ** __restrict cli)
   
         if ((*cli)->cli_id == SOCK_STREAM)          if ((*cli)->cli_id == SOCK_STREAM)
                 shutdown((*cli)->cli_sock, SHUT_RDWR);                  shutdown((*cli)->cli_sock, SHUT_RDWR);
           if ((*cli)->cli_id == SOCK_DGRAM && (*cli)->cli_sa.sa.sa_family == AF_LOCAL) {
                   sockaddr_t sa2 = E_SOCKADDR_INIT;
                   socklen_t salen = sizeof sa2;
   
   #ifndef __linux__
                   sa2.sa.sa_len = salen;
   #endif
                   if (!getsockname((*cli)->cli_sock, &sa2.sa, &salen))
                           unlink(sa2.sun.sun_path);
           }
         close((*cli)->cli_sock);          close((*cli)->cli_sock);
   
         AIT_FREE_VAL(&(*cli)->cli_buf);          AIT_FREE_VAL(&(*cli)->cli_buf);
Line 379  rpc_pkt_Receive(int sock, int type, sockaddr_t * __res Line 405  rpc_pkt_Receive(int sock, int type, sockaddr_t * __res
                         if (seq != ntohl(rpc->call_seq))                          if (seq != ntohl(rpc->call_seq))
                                 continue;                                  continue;
                 }                  }
        } while (ret < 1);        } while (ret < 0);
   
         return ret;          return ret;
 }  }
Line 391  rpc_pkt_Receive(int sock, int type, sockaddr_t * __res Line 417  rpc_pkt_Receive(int sock, int type, sockaddr_t * __res
  * @sess = RPC session info   * @sess = RPC session info
  * @tag = Function tag for execution   * @tag = Function tag for execution
  * @vars = Function argument array of values, may be NULL   * @vars = Function argument array of values, may be NULL
 * @noreply = We not want RPC reply * @noreply = >0 We not want RPC reply, -1 IPC request with reply
  * @nocrc = Without CRC calculation   * @nocrc = Without CRC calculation
  * @seq = Sign packet with seq.no   * @seq = Sign packet with seq.no
  * return: -1 error or != -1 prepared bytes into packet   * return: -1 error or != -1 prepared bytes into packet
Line 411  rpc_pkt_Request(ait_val_t * __restrict pkt, rpc_sess_t Line 437  rpc_pkt_Request(ait_val_t * __restrict pkt, rpc_sess_t
   
         /* calc estimated length */          /* calc estimated length */
         estlen = ait_resideVars(vars) + len;          estlen = ait_resideVars(vars) + len;
        if (estlen > AIT_LEN(pkt))        if (estlen > AIT_LEN(pkt)) {
                AIT_RE_BUF(pkt, estlen);                rpc_SetErr(EMSGSIZE, "Message too long");
                 return -1;
         }
         buf = AIT_GET_BUF(pkt);          buf = AIT_GET_BUF(pkt);
   
         /* prepare RPC call */          /* prepare RPC call */
Line 425  rpc_pkt_Request(ait_val_t * __restrict pkt, rpc_sess_t Line 453  rpc_pkt_Request(ait_val_t * __restrict pkt, rpc_sess_t
                 rpc->call_argc = (u_char) array_Size(vars);                  rpc->call_argc = (u_char) array_Size(vars);
   
         /* set reply */          /* set reply */
        rpc->call_req.flags = (uint64_t) htonl(noreply ? RPC_NOREPLY : RPC_REPLY);        rpc->call_req.flags = (uint64_t) htonl((noreply > 0) ? RPC_NOREPLY : RPC_REPLY);
   
         if (array_Size(vars)) {          if (array_Size(vars)) {
                 /* marshaling variables */                  /* marshaling variables */
Line 439  rpc_pkt_Request(ait_val_t * __restrict pkt, rpc_sess_t Line 467  rpc_pkt_Request(ait_val_t * __restrict pkt, rpc_sess_t
   
         /* total packet length */          /* total packet length */
         rpc->call_len = htonl(len);          rpc->call_len = htonl(len);
        rpc->call_io = RPC_REQ;        rpc->call_io = (noreply == -1) ? RPC_IPC : RPC_REQ;
   
         /* sign packet */          /* sign packet */
         rpc->call_seq = htonl(seq);          rpc->call_seq = htonl(seq);
Line 536  rpc_pkt_Replay(ait_val_t * __restrict pkt, rpc_sess_t  Line 564  rpc_pkt_Replay(ait_val_t * __restrict pkt, rpc_sess_t 
  * rpc_cli_execCall() - Execute RPC call   * rpc_cli_execCall() - Execute RPC call
  *   *
  * @cli = RPC Client session   * @cli = RPC Client session
 * @noreply = We not want RPC reply * @noreply = >0 We not want RPC reply, -1 IPC request with reply
  * @tag = Function tag for execution   * @tag = Function tag for execution
  * @in_vars = IN function argument array of values, may be NULL   * @in_vars = IN function argument array of values, may be NULL
  * @out_vars = OUT returned array of rpc values, if !=NULL must be free after use with ait_freeVars()   * @out_vars = OUT returned array of rpc values, if !=NULL must be free after use with ait_freeVars()
Line 547  rpc_cli_execCall(rpc_cli_t *cli, int noreply, u_short  Line 575  rpc_cli_execCall(rpc_cli_t *cli, int noreply, u_short 
                 array_t * __restrict in_vars, array_t ** __restrict out_vars)                  array_t * __restrict in_vars, array_t ** __restrict out_vars)
 {  {
         int type = 0, wlen;          int type = 0, wlen;
         u_char *buf;  
         u_int seq = 0;          u_int seq = 0;
   
         if (!cli) {          if (!cli) {
Line 558  rpc_cli_execCall(rpc_cli_t *cli, int noreply, u_short  Line 585  rpc_cli_execCall(rpc_cli_t *cli, int noreply, u_short 
                         type = cli->cli_id;                          type = cli->cli_id;
                 else                  else
                         seq = random(); /* sign package */                          seq = random(); /* sign package */
                 buf = AIT_GET_BUF(&cli->cli_buf);  
         }          }
         if (out_vars)          if (out_vars)
                 *out_vars = NULL;                  *out_vars = NULL;
   
        if ((wlen = rpc_pkt_Request(&cli->cli_buf, cli->cli_parent, tag, in_vars, noreply, type, seq)) == -1)        if ((wlen = rpc_pkt_Request(&cli->cli_buf, cli->cli_parent, tag, 
                                         in_vars, noreply, type, seq)) == -1)
                 return -1;                  return -1;
   
        if ((wlen = rpc_pkt_Send(cli->cli_sock, cli->cli_id, &cli->cli_sa, &cli->cli_buf, wlen)) == -1)        if ((wlen = rpc_pkt_Send(cli->cli_sock, cli->cli_id, &cli->cli_sa, 
                                         &cli->cli_buf, wlen)) == -1)
                 return -1;                  return -1;
        if (!wlen)      /* closed rpc connection */        if (!wlen)              /* closed rpc connection */
                 return 1;                  return 1;
   
        if (noreply)       /* we not want reply */        if (noreply > 0)       /* we not want reply */
                 return 0;                  return 0;
   
        if ((wlen = rpc_pkt_Receive(cli->cli_sock, cli->cli_id, &cli->cli_sa, &cli->cli_buf, seq)) == -1)        if ((wlen = rpc_pkt_Receive(cli->cli_sock, cli->cli_id, &cli->cli_sa, 
                                         &cli->cli_buf, seq)) == -1)
                 return -1;                  return -1;
        if (!wlen)      /* closed rpc connection */        if (!wlen) {        /* closed rpc connection */
                return 1;                rpc_SetErr(ECONNRESET, "Closed connection");
                 return -1;
         }
   
        if ((wlen = rpc_pkt_Replay(&cli->cli_buf, cli->cli_parent, tag, out_vars, type)) == -1)        if ((wlen = rpc_pkt_Replay(&cli->cli_buf, cli->cli_parent, tag, 
                                         out_vars, type)) == -1)
                 return -1;                  return -1;
   
        return 0;        return wlen;
 }  }
   
 /*  /*
Line 638  rpc_cli_ping(rpc_cli_t *cli) Line 670  rpc_cli_ping(rpc_cli_t *cli)
 rpc_cli_t *  rpc_cli_t *
 rpc_cli_openClient2(u_char InstID, int netBuf, const char *csIface, const char *csHost)  rpc_cli_openClient2(u_char InstID, int netBuf, const char *csIface, const char *csHost)
 {  {
   #ifndef __linux__
         rpc_cli_t *cli = NULL;          rpc_cli_t *cli = NULL;
         sockaddr_t sa = E_SOCKADDR_INIT, sal = E_SOCKADDR_INIT;          sockaddr_t sa = E_SOCKADDR_INIT, sal = E_SOCKADDR_INIT;
         char szIface[64], szStr[STRSIZ];          char szIface[64], szStr[STRSIZ];
Line 732  err: Line 765  err:
                 close(cli->cli_sock);                  close(cli->cli_sock);
         e_free(cli->cli_parent);          e_free(cli->cli_parent);
         e_free(cli);          e_free(cli);
   #else
           rpc_SetErr(ENOTSUP, "Feature isn't supported on Linux!");
   #endif
         return NULL;          return NULL;
 }  }
   

Removed from v.1.25.2.2  
changed lines
  Added in v.1.28.2.1


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