--- libaitrpc/src/cli.c 2012/05/16 14:08:52 1.9.2.5 +++ libaitrpc/src/cli.c 2012/05/17 14:22:24 1.9.2.9 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: cli.c,v 1.9.2.5 2012/05/16 14:08:52 misho Exp $ +* $Id: cli.c,v 1.9.2.9 2012/05/17 14:22:24 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -88,6 +88,8 @@ rpc_cli_openBLOBClient(rpc_cli_t * __restrict rpccli, return NULL; } + AIT_COPY_VAL(&cli->cli_buf, &rpccli->cli_buf); + /* connect to BLOB server */ cli->cli_sock = socket(cli->cli_sa.sa.sa_family, SOCK_STREAM, 0); if (cli->cli_sock == -1) { @@ -233,8 +235,8 @@ rpc_cli_closeClient(rpc_cli_t ** __restrict cli) * @cli = RPC Client session * @noreply = We not want RPC reply * @tag = Function tag for execution - * @in_vars = IN RPC call array of rpc values - * @out_vars = OUT returned array of rpc values, must be free after use with rpc_cli_freeVals() + * @in_vars = IN RPC call array of rpc values, may be NULL + * @out_vars = OUT returned array of rpc values, if !=NULL must be free after use with io_freeVars() * return: -1 error or != -1 ok result */ int @@ -260,6 +262,7 @@ rpc_cli_execCall(rpc_cli_t *cli, int noreply, u_short rpc_addPktSession(&rpc->call_session, cli->cli_parent); rpc->call_argc = htons(io_arraySize(in_vars)); rpc->call_tag = htons(tag); + rpc->call_seq = htons(random() % USHRT_MAX); /* set reply */ rpc->call_req.flags = noreply ? RPC_NOREPLY : RPC_REPLY; @@ -334,7 +337,7 @@ rpc_cli_execCall(rpc_cli_t *cli, int noreply, u_short rpc_SetErr(ERPCMISMATCH, "Get wrong RPC reply"); return -1; } - if (ntohl(rpc->call_rep.ret) < 0 && ntohl(rpc->call_rep.eno)) { + if (ntohl(rpc->call_rep.eno) && ntohl(rpc->call_rep.ret) == -1) { rpc_SetErr(ntohl(rpc->call_rep.eno), "Server side: retcode=%d #%d %s", ntohl(rpc->call_rep.ret), ntohl(rpc->call_rep.eno), strerror(ntohl(rpc->call_rep.eno))); @@ -346,14 +349,39 @@ rpc_cli_execCall(rpc_cli_t *cli, int noreply, u_short } /* RPC is OK! Go de-marshaling variables ... */ - if (ntohs(rpc->call_argc)) { + if (out_vars && ntohs(rpc->call_argc)) { *out_vars = io_buffer2vars(buf + wlen, AIT_LEN(&cli->cli_buf) - wlen, ntohs(rpc->call_argc), 0); if (!*out_vars) { + rpc_SetErr(io_GetErrno(), "%s", io_GetError()); return -1; } } ret = ntohl(rpc->call_rep.ret); + return ret; +} + +/* + * rpc_cli_ping() - Ping RPC server + * + * @cli = connected client + * return: -1 error or !=-1 ping seq id + */ +inline int +rpc_cli_ping(rpc_cli_t *cli) +{ + array_t *arr; + int ret = 0; + + if (!cli) + return -1; + + if (rpc_cli_execCall(cli, RPC_REPLY, CALL_SRVPING, NULL, &arr)) + return -1; + else + ret = AIT_GET_U16(io_getVars(arr, 0)); + io_freeVars(&arr); + return ret; }