Everything this function does can be done as well when the task
terminates by returning negative in ->post_select().
This also avoids to leak the stream cipher structure of the previous
connection when running in interactive mode.
1,032 bytes in 1 blocks are definitely lost in loss record 61 of 85
at 0x402994A: malloc (vg_replace_malloc.c:263)
by 0x804C689: para_malloc (string.c:71)
by 0x804FF87: sc_new (crypt.c:268)
by 0x804E204: client_post_select (client_common.c:370)
by 0x804D203: schedule (sched.c:59)
by 0x804A2E7: main (client.c:500)
1,032 bytes in 1 blocks are definitely lost in loss record 62 of 85
at 0x402994A: malloc (vg_replace_malloc.c:263)
by 0x804C689: para_malloc (string.c:71)
by 0x804FF87: sc_new (crypt.c:268)
by 0x804E217: client_post_select (client_common.c:371)
by 0x804D203: schedule (sched.c:59)
by 0x804A2E7: main (client.c:500)
schedule(&command_sched);
*result = exec_task.result_buf;
btr_remove_node(&exec_task.btrn);
schedule(&command_sched);
*result = exec_task.result_buf;
btr_remove_node(&exec_task.btrn);
ret = 1;
out:
btr_remove_node(&exec_task.btrn);
ret = 1;
out:
btr_remove_node(&exec_task.btrn);
PARA_DEBUG_LOG("line: %s\n", line);
ret = make_client_argv(line);
if (ret <= 0)
PARA_DEBUG_LOG("line: %s\n", line);
ret = make_client_argv(line);
if (ret <= 0)
-void client_disconnect(struct client_task *ct);
void client_close(struct client_task *ct);
int client_parse_config(int argc, char *argv[], struct client_task **ct_ptr,
int *loglevel);
void client_close(struct client_task *ct);
int client_parse_config(int argc, char *argv[], struct client_task **ct_ptr,
int *loglevel);
/** The size of the receiving buffer. */
#define CLIENT_BUFSIZE 4000
/** The size of the receiving buffer. */
#define CLIENT_BUFSIZE 4000
-/**
- * Close the connection to para_server and deallocate per-command resources.
- *
- * \param ct The client task.
- *
- * This frees all resources of the current command but keeps the configuration
- * in \p ct->conf.
- *
- * \sa \ref client_close().
- */
-void client_disconnect(struct client_task *ct)
-{
- if (!ct)
- return;
- if (ct->scc.fd >= 0)
- close(ct->scc.fd);
- free_argv(ct->features);
- ct->features = NULL;
- sc_free(ct->scc.recv);
- ct->scc.recv = NULL;
- sc_free(ct->scc.send);
- ct->scc.send = NULL;
- btr_remove_node(&ct->btrn[0]);
- btr_remove_node(&ct->btrn[1]);
-}
-
/**
* Close the connection to para_server and free all resources.
*
* \param ct Pointer to the client data.
*
/**
* Close the connection to para_server and free all resources.
*
* \param ct Pointer to the client data.
*
- * \sa \ref client_open(), \ref client_disconnect().
+ * \sa \ref client_open().
*/
void client_close(struct client_task *ct)
{
if (!ct)
return;
*/
void client_close(struct client_task *ct)
{
if (!ct)
return;
free(ct->user);
free(ct->config_file);
free(ct->key_file);
free(ct->user);
free(ct->config_file);
free(ct->key_file);
btr_remove_node(&ct->btrn[1]);
if (ret != -E_SERVER_CMD_SUCCESS && ret != -E_SERVER_CMD_FAILURE)
PARA_ERROR_LOG("%s\n", para_strerror(-ret));
btr_remove_node(&ct->btrn[1]);
if (ret != -E_SERVER_CMD_SUCCESS && ret != -E_SERVER_CMD_FAILURE)
PARA_ERROR_LOG("%s\n", para_strerror(-ret));
+ if (ct->scc.fd >= 0) {
+ close(ct->scc.fd);
+ ct->scc.fd = -1;
+ }
+ free_argv(ct->features);
+ ct->features = NULL;
+ sc_free(ct->scc.recv);
+ ct->scc.recv = NULL;
+ sc_free(ct->scc.send);
+ ct->scc.send = NULL;