--- libaitrpc/src/cli.c 2012/05/18 15:37:58 1.9.2.17 +++ libaitrpc/src/cli.c 2012/05/18 23:03:00 1.9.2.18 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: cli.c,v 1.9.2.17 2012/05/18 15:37:58 misho Exp $ +* $Id: cli.c,v 1.9.2.18 2012/05/18 23:03:00 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -290,27 +290,26 @@ rpc_cli_execCall(rpc_cli_t *cli, int noreply, u_short pfd.fd = cli->cli_sock; pfd.events = POLLOUT; + if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 || + pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) { + if (ret) + LOGERR; + else + rpc_SetErr(ETIMEDOUT, "Timeout, can't send to RPC server"); + return -1; + } do { - if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 || - pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) { - if (ret) { - if (errno == EAGAIN) - continue; - else - LOGERR; - } else - rpc_SetErr(ETIMEDOUT, "Timeout, can't send to RPC server"); + if ((ret = send(cli->cli_sock, buf, wlen, MSG_NOSIGNAL)) == -1) { + if (errno == EAGAIN) + continue; + LOGERR; return -1; + } else if (ret != wlen) { + rpc_SetErr(EPROCUNAVAIL, "RPC request, should be send %d bytes, " + "really sended %d bytes", wlen, ret); + return -1; } } while (0); - if ((ret = send(cli->cli_sock, buf, wlen, MSG_NOSIGNAL)) == -1) { - LOGERR; - return -1; - } else if (ret != wlen) { - rpc_SetErr(EPROCUNAVAIL, "RPC request, should be send %d bytes, " - "really sended %d bytes", wlen, ret); - return -1; - } if (noreply) /* we not want reply */ return 0; @@ -321,35 +320,38 @@ rpc_cli_execCall(rpc_cli_t *cli, int noreply, u_short do { if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 || pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) { + if (ret) + LOGERR; + else { + if (wlen++ < 7) + continue; + else + rpc_SetErr(ETIMEDOUT, "Timeout, no answer from RPC server"); + } + return -1; + } + } while (0); + do { + memset(buf, 0, AIT_LEN(&cli->cli_buf)); + if ((ret = recv(cli->cli_sock, buf, AIT_LEN(&cli->cli_buf), 0)) < 1) { if (ret) { if (errno == EAGAIN) continue; else LOGERR; - } else { - if (wlen++ < 7) - continue; - else - rpc_SetErr(ETIMEDOUT, "Timeout, no answer from RPC server"); } return -1; } } while (0); - memset(buf, 0, AIT_LEN(&cli->cli_buf)); - if ((ret = recv(cli->cli_sock, buf, AIT_LEN(&cli->cli_buf), 0)) < 1) { - if (ret) - LOGERR; - return -1; - } if (ret < sizeof(struct tagRPCCall)) { - rpc_SetErr(ERPCMISMATCH, "Short RPC packet"); + rpc_SetErr(ERPCMISMATCH, "Short RPC packet %d bytes", ret); return -1; } /* calculate CRC */ crc = ntohs(rpc->call_crc); rpc->call_crc ^= rpc->call_crc; - if (crc != crcFletcher16((u_short*) buf, ret / 2)) { + if (crc != crcFletcher16((u_short*) buf, ntohs(rpc->call_len) / 2)) { rpc_SetErr(ERPCMISMATCH, "Bad CRC RPC packet"); return -1; }