version 1.93, 2013/03/24 09:28:59 |
version 1.94, 2013/03/24 09:54:10 |
|
|
struct client *, struct msg_identify_data *, int); |
struct client *, struct msg_identify_data *, int); |
void server_client_msg_shell(struct client *); |
void server_client_msg_shell(struct client *); |
|
|
void printflike2 server_client_msg_error(struct cmd_ctx *, const char *, ...); |
|
void printflike2 server_client_msg_print(struct cmd_ctx *, const char *, ...); |
|
void printflike2 server_client_msg_info(struct cmd_ctx *, const char *, ...); |
|
|
|
/* Create a new client. */ |
/* Create a new client. */ |
void |
void |
server_client_create(int fd) |
server_client_create(int fd) |
|
|
fatal("gettimeofday failed"); |
fatal("gettimeofday failed"); |
memcpy(&c->activity_time, &c->creation_time, sizeof c->activity_time); |
memcpy(&c->activity_time, &c->creation_time, sizeof c->activity_time); |
|
|
|
c->cmdq = cmdq_new(c); |
|
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 (); |
c->stderr_data = evbuffer_new (); |
c->stderr_data = evbuffer_new (); |
|
|
free(c->prompt_buffer); |
free(c->prompt_buffer); |
free(c->cwd); |
free(c->cwd); |
|
|
|
c->cmdq->dead = 1; |
|
cmdq_free(c->cmdq); |
|
c->cmdq = NULL; |
|
|
environ_free(&c->environ); |
environ_free(&c->environ); |
|
|
close(c->ibuf.fd); |
close(c->ibuf.fd); |
|
|
} |
} |
} |
} |
|
|
/* Callback to send error message to client. */ |
|
void printflike2 |
|
server_client_msg_error(struct cmd_ctx *ctx, const char *fmt, ...) |
|
{ |
|
va_list ap; |
|
|
|
va_start(ap, fmt); |
|
evbuffer_add_vprintf(ctx->cmdclient->stderr_data, fmt, ap); |
|
va_end(ap); |
|
|
|
evbuffer_add(ctx->cmdclient->stderr_data, "\n", 1); |
|
server_push_stderr(ctx->cmdclient); |
|
ctx->cmdclient->retcode = 1; |
|
} |
|
|
|
/* Callback to send print message to client. */ |
|
void printflike2 |
|
server_client_msg_print(struct cmd_ctx *ctx, const char *fmt, ...) |
|
{ |
|
va_list ap; |
|
|
|
va_start(ap, fmt); |
|
evbuffer_add_vprintf(ctx->cmdclient->stdout_data, fmt, ap); |
|
va_end(ap); |
|
|
|
evbuffer_add(ctx->cmdclient->stdout_data, "\n", 1); |
|
server_push_stdout(ctx->cmdclient); |
|
} |
|
|
|
/* Callback to send print message to client, if not quiet. */ |
|
void printflike2 |
|
server_client_msg_info(struct cmd_ctx *ctx, const char *fmt, ...) |
|
{ |
|
va_list ap; |
|
|
|
if (options_get_number(&global_options, "quiet")) |
|
return; |
|
|
|
va_start(ap, fmt); |
|
evbuffer_add_vprintf(ctx->cmdclient->stdout_data, fmt, ap); |
|
va_end(ap); |
|
|
|
evbuffer_add(ctx->cmdclient->stdout_data, "\n", 1); |
|
server_push_stdout(ctx->cmdclient); |
|
} |
|
|
|
/* Handle command message. */ |
/* Handle command message. */ |
void |
void |
server_client_msg_command(struct client *c, struct msg_command_data *data) |
server_client_msg_command(struct client *c, struct msg_command_data *data) |
{ |
{ |
struct cmd_ctx *ctx; |
|
struct cmd_list *cmdlist = NULL; |
struct cmd_list *cmdlist = NULL; |
int argc; |
int argc; |
char **argv, *cause; |
char **argv, *cause; |
|
|
ctx = cmd_get_ctx(c, NULL); |
|
ctx->msgdata = data; |
|
ctx->error = server_client_msg_error; |
|
ctx->print = server_client_msg_print; |
|
ctx->info = server_client_msg_info; |
|
|
|
argc = data->argc; |
argc = data->argc; |
data->argv[(sizeof data->argv) - 1] = '\0'; |
data->argv[(sizeof data->argv) - 1] = '\0'; |
if (cmd_unpack_argv(data->argv, sizeof data->argv, argc, &argv) != 0) { |
if (cmd_unpack_argv(data->argv, sizeof data->argv, argc, &argv) != 0) { |
server_client_msg_error(ctx, "command too long"); |
cmdq_error(c->cmdq, "command too long"); |
goto error; |
goto error; |
} |
} |
|
|
|
|
*argv = xstrdup("new-session"); |
*argv = xstrdup("new-session"); |
} |
} |
|
|
if ((cmdlist = cmd_list_parse(argc, argv, &cause)) == NULL) { |
if ((cmdlist = cmd_list_parse(argc, argv, NULL, 0, &cause)) == NULL) { |
server_client_msg_error(ctx, "%s", cause); |
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); |
|
|
switch (cmd_list_exec(cmdlist, ctx)) |
cmdq_run(c->cmdq, cmdlist); |
{ |
|
case CMD_RETURN_ERROR: |
|
case CMD_RETURN_NORMAL: |
|
c->flags |= CLIENT_EXIT; |
|
break; |
|
case CMD_RETURN_ATTACH: |
|
case CMD_RETURN_YIELD: |
|
break; |
|
} |
|
cmd_list_free(cmdlist); |
cmd_list_free(cmdlist); |
cmd_free_ctx(ctx); |
|
return; |
return; |
|
|
error: |
error: |
if (cmdlist != NULL) |
if (cmdlist != NULL) |
cmd_list_free(cmdlist); |
cmd_list_free(cmdlist); |
cmd_free_ctx(ctx); |
|
|
|
c->flags |= CLIENT_EXIT; |
c->flags |= CLIENT_EXIT; |
} |
} |