diff options
author | Nicholas Marriott <nicholas.marriott@gmail.com> | 2007-10-04 21:21:48 +0000 |
---|---|---|
committer | Nicholas Marriott <nicholas.marriott@gmail.com> | 2007-10-04 21:21:48 +0000 |
commit | 5a3b92c2dfd9fbcf8bda10742cea1fb47927536d (patch) | |
tree | 254d6651fbcc5d57a46ebbd066aed77ade2a438f /cmd-attach-session.c | |
parent | 4add09eab7c263ea57e5940c350c780e883813b9 (diff) | |
download | rtmux-5a3b92c2dfd9fbcf8bda10742cea1fb47927536d.tar.gz rtmux-5a3b92c2dfd9fbcf8bda10742cea1fb47927536d.tar.bz2 rtmux-5a3b92c2dfd9fbcf8bda10742cea1fb47927536d.zip |
-d option to attach. Also fix CC in Makefile and make it build with DEBUG again.
Diffstat (limited to 'cmd-attach-session.c')
-rw-r--r-- | cmd-attach-session.c | 99 |
1 files changed, 87 insertions, 12 deletions
diff --git a/cmd-attach-session.c b/cmd-attach-session.c index f97d802f..c16cd139 100644 --- a/cmd-attach-session.c +++ b/cmd-attach-session.c @@ -1,4 +1,4 @@ -/* $Id: cmd-attach-session.c,v 1.2 2007-10-04 19:03:51 nicm Exp $ */ +/* $Id: cmd-attach-session.c,v 1.3 2007-10-04 21:21:48 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -26,23 +26,71 @@ * Attach existing session to the current terminal. */ -void cmd_attach_session_exec(void *, struct cmd_ctx *); +int cmd_attach_session_parse(void **, int, char **, char **); +const char *cmd_attach_session_usage(void); +void cmd_attach_session_exec(void *, struct cmd_ctx *); +void cmd_attach_session_send(void *, struct buffer *); +void cmd_attach_session_recv(void **, struct buffer *); +void cmd_attach_session_free(void *); + +struct cmd_attach_session_data { + int flag_detach; +}; const struct cmd_entry cmd_attach_session_entry = { - CMD_ATTACHSESSION, "attach-session", "attach", 0, - NULL, - NULL, + CMD_NEWWINDOW, "attach-session", "attach", 0, + cmd_attach_session_parse, + cmd_attach_session_usage, cmd_attach_session_exec, - NULL, - NULL, - NULL + cmd_attach_session_send, + cmd_attach_session_recv, + cmd_attach_session_free }; +int +cmd_attach_session_parse(void **ptr, int argc, char **argv, char **cause) +{ + struct cmd_attach_session_data *data; + int opt; + + *ptr = data = xmalloc(sizeof *data); + data->flag_detach = 0; + + while ((opt = getopt(argc, argv, "dn:")) != EOF) { + switch (opt) { + case 'd': + data->flag_detach = 1; + break; + default: + goto usage; + } + } + argc -= optind; + argv += optind; + if (argc != 0) + goto usage; + + return (0); + +usage: + usage(cause, "%s", cmd_attach_session_usage()); + + cmd_attach_session_free(data); + return (-1); +} + +const char * +cmd_attach_session_usage(void) +{ + return ("attach-session [-d]"); +} + void -cmd_attach_session_exec(unused void *ptr, struct cmd_ctx *ctx) +cmd_attach_session_exec(void *ptr, struct cmd_ctx *ctx) { - struct client *c = ctx->client; - struct session *s = ctx->session; + struct cmd_attach_session_data *data = ptr; + struct client *c = ctx->client; + struct session *s = ctx->session; if (ctx->flags & CMD_KEY) return; @@ -51,10 +99,37 @@ cmd_attach_session_exec(unused void *ptr, struct cmd_ctx *ctx) ctx->error(ctx, "not a terminal"); return; } - + + if (data->flag_detach) + server_write_session(s, MSG_DETACH, NULL, 0); c->session = s; server_write_client(c, MSG_READY, NULL, 0); recalculate_sizes(); server_redraw_client(c); } + +void +cmd_attach_session_send(void *ptr, struct buffer *b) +{ + struct cmd_attach_session_data *data = ptr; + + buffer_write(b, data, sizeof *data); +} + +void +cmd_attach_session_recv(void **ptr, struct buffer *b) +{ + struct cmd_attach_session_data *data; + + *ptr = data = xmalloc(sizeof *data); + buffer_read(b, data, sizeof *data); +} + +void +cmd_attach_session_free(void *ptr) +{ + struct cmd_attach_session_data *data = ptr; + + xfree(data); +} |