version 1.2, 2011/05/02 23:12:08
|
version 1.2.2.3, 2011/07/14 02:39:52
|
Line 251 rpc_cli_execCall(rpc_cli_t *cli, const char *csModule,
|
Line 251 rpc_cli_execCall(rpc_cli_t *cli, const char *csModule,
|
fd_set fds; |
fd_set fds; |
u_char buf[BUFSIZ], str[MAXPATHLEN + UCHAR_MAX + 1], *data; |
u_char buf[BUFSIZ], str[MAXPATHLEN + UCHAR_MAX + 1], *data; |
struct tagRPCCall *rpc = (struct tagRPCCall*) buf; |
struct tagRPCCall *rpc = (struct tagRPCCall*) buf; |
struct tagRPCRet *rrpc; | struct tagRPCRet *rrpc = NULL; |
int ret = 0, Limit = 0; |
int ret = 0, Limit = 0; |
register int i; |
register int i; |
rpc_val_t *v; |
rpc_val_t *v; |
Line 276 rpc_cli_execCall(rpc_cli_t *cli, const char *csModule,
|
Line 276 rpc_cli_execCall(rpc_cli_t *cli, const char *csModule,
|
Limit = sizeof(struct tagRPCCall); |
Limit = sizeof(struct tagRPCCall); |
if (in_argc) { |
if (in_argc) { |
v = (rpc_val_t*) (buf + sizeof(struct tagRPCCall)); |
v = (rpc_val_t*) (buf + sizeof(struct tagRPCCall)); |
|
if (in_argc * sizeof(rpc_val_t) > BUFSIZ - Limit) { |
|
rpc_SetErr(EMSGSIZE, "Error:: in prepare RPC packet values (-7) ...\n"); |
|
return -7; |
|
} else |
|
Limit += in_argc * sizeof(rpc_val_t); |
memcpy(v, in_vals, in_argc * sizeof(rpc_val_t)); |
memcpy(v, in_vals, in_argc * sizeof(rpc_val_t)); |
Limit += in_argc * sizeof(rpc_val_t); |
|
data = (u_char*) v + in_argc * sizeof(rpc_val_t); |
data = (u_char*) v + in_argc * sizeof(rpc_val_t); |
for (i = 0; i < in_argc; i++) { |
for (i = 0; i < in_argc; i++) { |
switch (in_vals[i].val_type) { |
switch (in_vals[i].val_type) { |
Line 293 rpc_cli_execCall(rpc_cli_t *cli, const char *csModule,
|
Line 297 rpc_cli_execCall(rpc_cli_t *cli, const char *csModule,
|
Limit += in_vals[i].val_len; |
Limit += in_vals[i].val_len; |
break; |
break; |
case string: |
case string: |
if (Limit + in_vals[i].val_len + 1 > BUFSIZ) { | if (Limit + in_vals[i].val_len > BUFSIZ) { |
ret = -7; |
ret = -7; |
break; |
break; |
} |
} |
|
|
memcpy(data, in_vals[i].val.string, in_vals[i].val_len); |
memcpy(data, in_vals[i].val.string, in_vals[i].val_len); |
v[i].val.string = (int8_t*) ((void*) data - (void*) v); |
v[i].val.string = (int8_t*) ((void*) data - (void*) v); |
data += in_vals[i].val_len + 1; | data += in_vals[i].val_len; |
Limit += in_vals[i].val_len + 1; | Limit += in_vals[i].val_len; |
break; |
break; |
default: |
default: |
break; |
break; |
Line 335 rpc_cli_execCall(rpc_cli_t *cli, const char *csModule,
|
Line 339 rpc_cli_execCall(rpc_cli_t *cli, const char *csModule,
|
LOGERR; |
LOGERR; |
return -3; |
return -3; |
} |
} |
if (!ret) // receive EOF | if (!ret) /* receive EOF! */ |
return 0; |
return 0; |
if (ret < sizeof(struct tagRPCRet)) { |
if (ret < sizeof(struct tagRPCRet)) { |
rpc_SetErr(EMSGSIZE, "Error:: too short RPC packet ...\n"); |
rpc_SetErr(EMSGSIZE, "Error:: too short RPC packet ...\n"); |
return -4; |
return -4; |
} else |
} else |
rrpc = (struct tagRPCRet*) buf; |
rrpc = (struct tagRPCRet*) buf; |
// check RPC packet session info | /* check RPC packet session info */ |
if (memcmp(&rrpc->ret_session, cli->cli_parent, sizeof rrpc->ret_session)) { |
if (memcmp(&rrpc->ret_session, cli->cli_parent, sizeof rrpc->ret_session)) { |
rpc_SetErr(EINVAL, "Error:: get invalid RPC session ...\n"); |
rpc_SetErr(EINVAL, "Error:: get invalid RPC session ...\n"); |
return -5; |
return -5; |
Line 358 rpc_cli_execCall(rpc_cli_t *cli, const char *csModule,
|
Line 362 rpc_cli_execCall(rpc_cli_t *cli, const char *csModule,
|
return -7; |
return -7; |
} else |
} else |
Limit += rrpc->ret_argc * sizeof(rpc_val_t); |
Limit += rrpc->ret_argc * sizeof(rpc_val_t); |
// RPC is OK! Go decapsulate variables ... | /* RPC is OK! Go decapsulate variables ... */ |
if (rrpc->ret_argc) { |
if (rrpc->ret_argc) { |
*out_argc = rrpc->ret_argc; |
*out_argc = rrpc->ret_argc; |
*out_vals = calloc(rrpc->ret_argc, sizeof(rpc_val_t)); |
*out_vals = calloc(rrpc->ret_argc, sizeof(rpc_val_t)); |
Line 368 rpc_cli_execCall(rpc_cli_t *cli, const char *csModule,
|
Line 372 rpc_cli_execCall(rpc_cli_t *cli, const char *csModule,
|
return -1; |
return -1; |
} else |
} else |
memcpy(*out_vals, buf + sizeof(struct tagRPCRet), Limit - sizeof(struct tagRPCRet)); |
memcpy(*out_vals, buf + sizeof(struct tagRPCRet), Limit - sizeof(struct tagRPCRet)); |
// RPC received variables types OK! | /* RPC received variables types OK! */ |
data = (u_char*) buf + Limit; |
data = (u_char*) buf + Limit; |
for (i = 0; i < rrpc->ret_argc; i++) |
for (i = 0; i < rrpc->ret_argc; i++) |
switch ((*out_vals)[i].val_type) { |
switch ((*out_vals)[i].val_type) { |
Line 394 rpc_cli_execCall(rpc_cli_t *cli, const char *csModule,
|
Line 398 rpc_cli_execCall(rpc_cli_t *cli, const char *csModule,
|
data += (*out_vals)[i].val_len; |
data += (*out_vals)[i].val_len; |
break; |
break; |
case string: |
case string: |
if ((*out_vals)[i].val_len + 1 > BUFSIZ - Limit) { | if ((*out_vals)[i].val_len > BUFSIZ - Limit) { |
rpc_SetErr(EMSGSIZE, "Error:: Too big RPC packet ...\n"); |
rpc_SetErr(EMSGSIZE, "Error:: Too big RPC packet ...\n"); |
free(*out_vals); |
free(*out_vals); |
*out_vals = NULL; |
*out_vals = NULL; |
*out_argc = 0; |
*out_argc = 0; |
return -7; |
return -7; |
} else |
} else |
Limit += (*out_vals)[i].val_len + 1; | Limit += (*out_vals)[i].val_len; |
|
|
(*out_vals)[i].val.string = (int8_t*) strdup((char*) data); | (*out_vals)[i].val.string = malloc((*out_vals)[i].val_len); |
if (!(*out_vals)[i].val.string) { |
if (!(*out_vals)[i].val.string) { |
rpc_SetErr(errno, "Error:: in prepare RPC reply ...\n"); |
rpc_SetErr(errno, "Error:: in prepare RPC reply ...\n"); |
free(*out_vals); |
free(*out_vals); |
*out_vals = NULL; |
*out_vals = NULL; |
*out_argc = 0; |
*out_argc = 0; |
return -1; |
return -1; |
} else { | } else |
/* sanity check ... preserve null byte */ | memcpy((*out_vals)[i].val.string, data, (*out_vals)[i].val_len); |
(*out_vals)[i].val.string[(*out_vals)[i].val_len] = 0; | data += (*out_vals)[i].val_len; |
} | |
data += (*out_vals)[i].val_len + 1; | |
break; |
break; |
default: |
default: |
break; |
break; |