version 1.6, 2011/11/03 15:32:21
|
version 1.6.2.1, 2012/03/13 17:10:13
|
Line 291 rpc_cli_execCall(rpc_cli_t *cli, const char *csModule,
|
Line 291 rpc_cli_execCall(rpc_cli_t *cli, const char *csModule,
|
fd_set fds; |
fd_set fds; |
u_char *buf, str[MAXPATHLEN + UCHAR_MAX + 1]; |
u_char *buf, str[MAXPATHLEN + UCHAR_MAX + 1]; |
struct tagRPCCall *rpc; |
struct tagRPCCall *rpc; |
struct tagRPCRet *rrpc = NULL; | struct tagRPCCall *rrpc = NULL; |
int ret = 0, Limit = 0; |
int ret = 0, Limit = 0; |
struct timeval tv = { DEF_RPC_TIMEOUT, 0 }; |
struct timeval tv = { DEF_RPC_TIMEOUT, 0 }; |
uint16_t tag; |
uint16_t tag; |
Line 371 rpc_cli_execCall(rpc_cli_t *cli, const char *csModule,
|
Line 371 rpc_cli_execCall(rpc_cli_t *cli, const char *csModule,
|
free(buf); |
free(buf); |
return 0; |
return 0; |
} |
} |
if (ret < sizeof(struct tagRPCRet)) { | if (ret < sizeof(struct tagRPCCall)) { |
rpc_SetErr(ERPCMISMATCH, "Error:: too short RPC packet ...\n"); |
rpc_SetErr(ERPCMISMATCH, "Error:: too short RPC packet ...\n"); |
free(buf); |
free(buf); |
return -4; |
return -4; |
} else |
} else |
rrpc = (struct tagRPCRet*) buf; | rrpc = (struct tagRPCCall*) buf; |
/* check RPC packet session info */ |
/* check RPC packet session info */ |
if (rpc_chkPktSession(&rrpc->ret_session, cli->cli_parent)) { | if (rpc_chkPktSession(&rrpc->call_session, cli->cli_parent)) { |
rpc_SetErr(ERPCMISMATCH, "Error:: get invalid RPC session ...\n"); |
rpc_SetErr(ERPCMISMATCH, "Error:: get invalid RPC session ...\n"); |
free(buf); |
free(buf); |
return -5; |
return -5; |
} else |
} else |
Limit = sizeof(struct tagRPCRet); | Limit = sizeof(struct tagRPCCall); |
if (rrpc->ret_tag != tag || rrpc->ret_hash != hash) { | if (rrpc->call_tag != tag || rrpc->call_hash != hash) { |
rpc_SetErr(ERPCMISMATCH, "Error:: get wrong RPC reply ...\n"); |
rpc_SetErr(ERPCMISMATCH, "Error:: get wrong RPC reply ...\n"); |
free(buf); |
free(buf); |
return -5; |
return -5; |
} |
} |
if (ntohl(rrpc->ret_retcode) < 0 && ntohl(rrpc->ret_errno)) { | if (ntohl(rrpc->call_rep.ret) < 0 && ntohl(rrpc->call_rep.eno)) { |
rpc_SetErr(ntohl(rrpc->ret_errno), "Error::Server side: retcode=%d #%d %s\n", | rpc_SetErr(ntohl(rrpc->call_rep.eno), "Error::Server side: retcode=%d #%d %s\n", |
ntohl(rrpc->ret_retcode), ntohl(rrpc->ret_errno), | ntohl(rrpc->call_rep.ret), ntohl(rrpc->call_rep.eno), |
strerror(ntohl(rrpc->ret_errno))); | strerror(ntohl(rrpc->call_rep.eno))); |
free(buf); |
free(buf); |
return -6; |
return -6; |
} |
} |
if (ntohs(rrpc->ret_argc) * sizeof(ait_val_t) > cli->cli_netbuf - Limit) { | if (ntohs(rrpc->call_argc) * sizeof(ait_val_t) > cli->cli_netbuf - Limit) { |
rpc_SetErr(EMSGSIZE, "Error:: reply RPC packet is too long ...\n"); |
rpc_SetErr(EMSGSIZE, "Error:: reply RPC packet is too long ...\n"); |
free(buf); |
free(buf); |
return -7; |
return -7; |
} |
} |
|
|
/* RPC is OK! Go de-marshaling variables ... */ |
/* RPC is OK! Go de-marshaling variables ... */ |
if (ntohs(rrpc->ret_argc)) { | if (ntohs(rrpc->call_argc)) { |
*out_vars = io_buffer2vars(buf + Limit, cli->cli_netbuf - Limit, |
*out_vars = io_buffer2vars(buf + Limit, cli->cli_netbuf - Limit, |
ntohs(rrpc->ret_argc), 0); | ntohs(rrpc->call_argc), 0); |
if (!*out_vars) { |
if (!*out_vars) { |
free(buf); |
free(buf); |
return -1; |
return -1; |
} |
} |
} |
} |
|
|
ret = ntohl(rrpc->ret_retcode); | ret = ntohl(rrpc->call_rep.ret); |
free(buf); |
free(buf); |
return ret; |
return ret; |
} |
} |