version 1.193, 2016/10/12 13:03:27 |
version 1.194, 2016/10/16 17:55:14 |
|
|
c->fd = -1; |
c->fd = -1; |
c->cwd = NULL; |
c->cwd = NULL; |
|
|
c->cmdq = cmdq_new(c); |
TAILQ_INIT(&c->queue); |
c->cmdq->client_exit = 1; |
|
|
|
c->stdin_data = evbuffer_new(); |
c->stdin_data = evbuffer_new(); |
c->stdout_data = evbuffer_new(); |
c->stdout_data = evbuffer_new(); |
|
|
free(c->prompt_string); |
free(c->prompt_string); |
free(c->prompt_buffer); |
free(c->prompt_buffer); |
|
|
c->cmdq->flags |= CMD_Q_DEAD; |
|
cmdq_free(c->cmdq); |
|
c->cmdq = NULL; |
|
|
|
environ_free(c->environ); |
environ_free(c->environ); |
|
|
proc_remove_peer(c->peer); |
proc_remove_peer(c->peer); |
|
|
|
|
log_debug("free client %p (%d references)", c, c->references); |
log_debug("free client %p (%d references)", c, c->references); |
|
|
|
if (!TAILQ_EMPTY(&c->queue)) |
|
fatalx("queue not empty"); |
|
|
if (c->references == 0) |
if (c->references == 0) |
free(c); |
free(c); |
} |
} |
|
|
} |
} |
} |
} |
|
|
|
/* Callback when command is done. */ |
|
static enum cmd_retval |
|
server_client_command_done(struct cmd_q *cmdq, __unused void *data) |
|
{ |
|
struct client *c = cmdq->client; |
|
|
|
if (~c->flags & CLIENT_ATTACHED) |
|
c->flags |= CLIENT_EXIT; |
|
return (CMD_RETURN_NORMAL); |
|
} |
|
|
|
/* Show an error message. */ |
|
static enum cmd_retval |
|
server_client_command_error(struct cmd_q *cmdq, void *data) |
|
{ |
|
char *error = data; |
|
|
|
cmdq_error(cmdq, "%s", error); |
|
free(error); |
|
|
|
return (CMD_RETURN_NORMAL); |
|
} |
|
|
/* Handle command message. */ |
/* Handle command message. */ |
static void |
static void |
server_client_dispatch_command(struct client *c, struct imsg *imsg) |
server_client_dispatch_command(struct client *c, struct imsg *imsg) |
|
|
|
|
argc = data.argc; |
argc = data.argc; |
if (cmd_unpack_argv(buf, len, argc, &argv) != 0) { |
if (cmd_unpack_argv(buf, len, argc, &argv) != 0) { |
cmdq_error(c->cmdq, "command too long"); |
cause = xstrdup("command too long"); |
goto error; |
goto error; |
} |
} |
|
|
|
|
} |
} |
|
|
if ((cmdlist = cmd_list_parse(argc, argv, NULL, 0, &cause)) == NULL) { |
if ((cmdlist = cmd_list_parse(argc, argv, NULL, 0, &cause)) == NULL) { |
cmdq_error(c->cmdq, "%s", cause); |
|
cmd_free_argv(argc, argv); |
cmd_free_argv(argc, argv); |
goto error; |
goto error; |
} |
} |
cmd_free_argv(argc, argv); |
cmd_free_argv(argc, argv); |
|
|
if (c != cfg_client || cfg_finished) |
cmdq_append(c, cmdq_get_command(cmdlist, NULL, NULL, 0)); |
cmdq_run(c->cmdq, cmdlist, NULL); |
cmdq_append(c, cmdq_get_callback(server_client_command_done, NULL)); |
else |
|
cmdq_append(c->cmdq, cmdlist, NULL); |
|
cmd_list_free(cmdlist); |
cmd_list_free(cmdlist); |
return; |
return; |
|
|
error: |
error: |
|
cmdq_append(c, cmdq_get_callback(server_client_command_error, cause)); |
|
|
if (cmdlist != NULL) |
if (cmdlist != NULL) |
cmd_list_free(cmdlist); |
cmd_list_free(cmdlist); |
|
|