diff options
author | Nicholas Marriott <nicm@cvs.openbsd.org> | 2009-07-30 16:40:13 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@cvs.openbsd.org> | 2009-07-30 16:40:13 +0000 |
commit | 6f24487b3d1457cee624018f1b0e33805f34201c (patch) | |
tree | f7d34df0403ede02b202cb2b08258a628fbdbb4c /usr.bin/tmux | |
parent | e0035a735befa3d84920b3b249343f51f6976856 (diff) |
Similar changes for server_msg_dispatch: use a switch instead of a lookup table
and merge smaller functions inline.
Diffstat (limited to 'usr.bin/tmux')
-rw-r--r-- | usr.bin/tmux/server-msg.c | 245 |
1 files changed, 101 insertions, 144 deletions
diff --git a/usr.bin/tmux/server-msg.c b/usr.bin/tmux/server-msg.c index af9f9682780..7471323cf45 100644 --- a/usr.bin/tmux/server-msg.c +++ b/usr.bin/tmux/server-msg.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server-msg.c,v 1.8 2009/07/29 14:17:26 nicm Exp $ */ +/* $OpenBSD: server-msg.c,v 1.9 2009/07/30 16:40:12 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -26,39 +26,22 @@ #include "tmux.h" -void server_msg_fn_command(struct hdr *, struct client *); -void server_msg_fn_identify(struct hdr *, struct client *); -void server_msg_fn_resize(struct hdr *, struct client *); -void server_msg_fn_exiting(struct hdr *, struct client *); -void server_msg_fn_unlock(struct hdr *, struct client *); -void server_msg_fn_wakeup(struct hdr *, struct client *); - -void printflike2 server_msg_fn_command_error( - struct cmd_ctx *, const char *, ...); -void printflike2 server_msg_fn_command_print( - struct cmd_ctx *, const char *, ...); -void printflike2 server_msg_fn_command_info( - struct cmd_ctx *, const char *, ...); - -struct server_msg { - enum msgtype type; - void (*fn)(struct hdr *, struct client *); -}; -const struct server_msg server_msg_table[] = { - { MSG_IDENTIFY, server_msg_fn_identify }, - { MSG_COMMAND, server_msg_fn_command }, - { MSG_RESIZE, server_msg_fn_resize }, - { MSG_EXITING, server_msg_fn_exiting }, - { MSG_UNLOCK, server_msg_fn_unlock }, - { MSG_WAKEUP, server_msg_fn_wakeup }, -}; +void server_msg_command(struct client *, struct msg_command_data *); +void server_msg_identify(struct client *, struct msg_identify_data *); +void server_msg_resize(struct client *, struct msg_resize_data *); + +void printflike2 server_msg_command_error(struct cmd_ctx *, const char *, ...); +void printflike2 server_msg_command_print(struct cmd_ctx *, const char *, ...); +void printflike2 server_msg_command_info(struct cmd_ctx *, const char *, ...); int server_msg_dispatch(struct client *c) { struct hdr hdr; - const struct server_msg *msg; - u_int i; + struct msg_command_data commanddata; + struct msg_identify_data identifydata; + struct msg_resize_data resizedata; + struct msg_unlock_data unlockdata; for (;;) { if (BUFFER_USED(c->in) < sizeof hdr) @@ -68,20 +51,63 @@ server_msg_dispatch(struct client *c) return (0); buffer_remove(c->in, sizeof hdr); - for (i = 0; i < nitems(server_msg_table); i++) { - msg = server_msg_table + i; - if (msg->type == hdr.type) { - msg->fn(&hdr, c); - break; - } - } - if (i == nitems(server_msg_table)) + switch (hdr.type) { + case MSG_COMMAND: + if (hdr.size != sizeof commanddata) + fatalx("bad MSG_COMMAND size"); + buffer_read(c->in, &commanddata, sizeof commanddata); + + server_msg_command(c, &commanddata); + break; + case MSG_IDENTIFY: + if (hdr.size != sizeof identifydata) + fatalx("bad MSG_IDENTIFY size"); + buffer_read(c->in, &identifydata, sizeof identifydata); + + server_msg_identify(c, &identifydata); + break; + case MSG_RESIZE: + if (hdr.size != sizeof resizedata) + fatalx("bad MSG_RESIZE size"); + buffer_read(c->in, &resizedata, sizeof resizedata); + + server_msg_resize(c, &resizedata); + break; + case MSG_EXITING: + if (hdr.size != 0) + fatalx("bad MSG_EXITING size"); + + c->session = NULL; + tty_close(&c->tty, c->flags & CLIENT_SUSPENDED); + server_write_client(c, MSG_EXITED, NULL, 0); + break; + case MSG_UNLOCK: + if (hdr.size != sizeof unlockdata) + fatalx("bad MSG_UNLOCK size"); + buffer_read(c->in, &unlockdata, sizeof unlockdata); + + unlockdata.pass[(sizeof unlockdata.pass) - 1] = '\0'; + if (server_unlock(unlockdata.pass) != 0) + server_write_error(c, "bad password"); + memset(&unlockdata, 0, sizeof unlockdata); + server_write_client(c, MSG_EXIT, NULL, 0); + break; + case MSG_WAKEUP: + if (hdr.size != 0) + fatalx("bad MSG_WAKEUP size"); + + c->flags &= ~CLIENT_SUSPENDED; + tty_start_tty(&c->tty); + server_redraw_client(c); + break; + default: fatalx("unexpected message"); + } } } void printflike2 -server_msg_fn_command_error(struct cmd_ctx *ctx, const char *fmt, ...) +server_msg_command_error(struct cmd_ctx *ctx, const char *fmt, ...) { struct msg_print_data data; va_list ap; @@ -94,7 +120,7 @@ server_msg_fn_command_error(struct cmd_ctx *ctx, const char *fmt, ...) } void printflike2 -server_msg_fn_command_print(struct cmd_ctx *ctx, const char *fmt, ...) +server_msg_command_print(struct cmd_ctx *ctx, const char *fmt, ...) { struct msg_print_data data; va_list ap; @@ -107,7 +133,7 @@ server_msg_fn_command_print(struct cmd_ctx *ctx, const char *fmt, ...) } void printflike2 -server_msg_fn_command_info(struct cmd_ctx *ctx, const char *fmt, ...) +server_msg_command_info(struct cmd_ctx *ctx, const char *fmt, ...) { struct msg_print_data data; va_list ap; @@ -123,35 +149,30 @@ server_msg_fn_command_info(struct cmd_ctx *ctx, const char *fmt, ...) } void -server_msg_fn_command(struct hdr *hdr, struct client *c) +server_msg_command(struct client *c, struct msg_command_data *data) { - struct msg_command_data data; - struct cmd_ctx ctx; - struct cmd_list *cmdlist = NULL; - struct cmd *cmd; - int argc; - char **argv, *cause; - - if (hdr->size < sizeof data) - fatalx("bad MSG_COMMAND size"); - buffer_read(c->in, &data, sizeof data); + struct cmd_ctx ctx; + struct cmd_list *cmdlist = NULL; + struct cmd *cmd; + int argc; + char **argv, *cause; server_activity = time(NULL); - ctx.error = server_msg_fn_command_error; - ctx.print = server_msg_fn_command_print; - ctx.info = server_msg_fn_command_info; + ctx.error = server_msg_command_error; + ctx.print = server_msg_command_print; + ctx.info = server_msg_command_info; - ctx.msgdata = &data; + ctx.msgdata = data; ctx.curclient = NULL; ctx.cursession = NULL; ctx.cmdclient = c; - argc = data.argc; - data.argv[(sizeof data.argv) - 1] = '\0'; - if (cmd_unpack_argv(data.argv, sizeof data.argv, argc, &argv) != 0) { - server_msg_fn_command_error(&ctx, "command too long"); + argc = data->argc; + data->argv[(sizeof data->argv) - 1] = '\0'; + if (cmd_unpack_argv(data->argv, sizeof data->argv, argc, &argv) != 0) { + server_msg_command_error(&ctx, "command too long"); goto error; } @@ -162,16 +183,16 @@ server_msg_fn_command(struct hdr *hdr, struct client *c) } if ((cmdlist = cmd_list_parse(argc, argv, &cause)) == NULL) { - server_msg_fn_command_error(&ctx, "%s", cause); + server_msg_command_error(&ctx, "%s", cause); cmd_free_argv(argc, argv); goto error; } cmd_free_argv(argc, argv); - if (data.pid != -1) { + if (data->pid != -1) { TAILQ_FOREACH(cmd, cmdlist, qentry) { if (cmd->entry->flags & CMD_CANTNEST) { - server_msg_fn_command_error(&ctx, + server_msg_command_error(&ctx, "sessions should be nested with care. " "unset $TMUX to force"); goto error; @@ -191,60 +212,43 @@ error: } void -server_msg_fn_identify(struct hdr *hdr, struct client *c) +server_msg_identify(struct client *c, struct msg_identify_data *data) { - struct msg_identify_data data; - - if (hdr->size < sizeof data) - fatalx("bad MSG_IDENTIFY size"); - buffer_read(c->in, &data, sizeof data); - - log_debug("identify msg from client: %u,%u (%d)", - data.sx, data.sy, data.version); - - if (data.version != PROTOCOL_VERSION) { + if (data->version != PROTOCOL_VERSION) { server_write_error(c, "protocol version mismatch"); return; } - c->tty.sx = data.sx; - c->tty.sy = data.sy; + c->tty.sx = data->sx; + c->tty.sy = data->sy; c->cwd = NULL; - data.cwd[(sizeof data.cwd) - 1] = '\0'; - if (*data.cwd != '\0') - c->cwd = xstrdup(data.cwd); - - data.tty[(sizeof data.tty) - 1] = '\0'; - data.term[(sizeof data.term) - 1] = '\0'; - tty_init(&c->tty, data.tty, data.term); - if (data.flags & IDENTIFY_UTF8) + data->cwd[(sizeof data->cwd) - 1] = '\0'; + if (*data->cwd != '\0') + c->cwd = xstrdup(data->cwd); + + data->tty[(sizeof data->tty) - 1] = '\0'; + data->term[(sizeof data->term) - 1] = '\0'; + tty_init(&c->tty, data->tty, data->term); + if (data->flags & IDENTIFY_UTF8) c->tty.flags |= TTY_UTF8; - if (data.flags & IDENTIFY_256COLOURS) + if (data->flags & IDENTIFY_256COLOURS) c->tty.term_flags |= TERM_256COLOURS; - else if (data.flags & IDENTIFY_88COLOURS) + else if (data->flags & IDENTIFY_88COLOURS) c->tty.term_flags |= TERM_88COLOURS; - if (data.flags & IDENTIFY_HASDEFAULTS) + if (data->flags & IDENTIFY_HASDEFAULTS) c->tty.term_flags |= TERM_HASDEFAULTS; c->flags |= CLIENT_TERMINAL; } void -server_msg_fn_resize(struct hdr *hdr, struct client *c) +server_msg_resize(struct client *c, struct msg_resize_data *data) { - struct msg_resize_data data; - - if (hdr->size != sizeof data) - fatalx("bad MSG_RESIZE size"); - buffer_read(c->in, &data, sizeof data); - - log_debug("resize msg from client: %u,%u", data.sx, data.sy); - - c->tty.sx = data.sx; + c->tty.sx = data->sx; if (c->tty.sx == 0) c->tty.sx = 80; - c->tty.sy = data.sy; + c->tty.sy = data->sy; if (c->tty.sy == 0) c->tty.sy = 25; @@ -258,50 +262,3 @@ server_msg_fn_resize(struct hdr *hdr, struct client *c) /* Always redraw this client. */ server_redraw_client(c); } - -void -server_msg_fn_exiting(struct hdr *hdr, struct client *c) -{ - if (hdr->size != 0) - fatalx("bad MSG_EXITING size"); - - log_debug("exiting msg from client"); - - c->session = NULL; - - tty_close(&c->tty, c->flags & CLIENT_SUSPENDED); - - server_write_client(c, MSG_EXITED, NULL, 0); -} - -void -server_msg_fn_unlock(struct hdr *hdr, struct client *c) -{ - struct msg_unlock_data data; - - if (hdr->size != sizeof data) - fatalx("bad MSG_UNLOCK size"); - buffer_read(c->in, &data, sizeof data); - - log_debug("unlock msg from client"); - - data.pass[(sizeof data.pass) - 1] = '\0'; - if (server_unlock(data.pass) != 0) - server_write_error(c, "bad password"); - memset(&data, 0, sizeof data); - - server_write_client(c, MSG_EXIT, NULL, 0); -} - -void -server_msg_fn_wakeup(struct hdr *hdr, struct client *c) -{ - if (hdr->size != 0) - fatalx("bad MSG_WAKEUP size"); - - log_debug("wakeup msg from client"); - - c->flags &= ~CLIENT_SUSPENDED; - tty_start_tty(&c->tty); - server_redraw_client(c); -} |