diff --git a/CHANGES b/CHANGES index 0e0239e4..e570374d 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,6 @@ 23 October 2007 +* (nicm) Lift limit on session name passed with -s. * (nicm) Show size in session/window lists. * (nicm) Pass tty up to server when client identifies and add a list-clients command to list connected clients. @@ -150,5 +151,5 @@ (including mutt, emacs). No status bar yet and no key remapping or other customisation. -$Id: CHANGES,v 1.47 2007-10-23 09:36:19 nicm Exp $ +$Id: CHANGES,v 1.48 2007-10-23 10:48:22 nicm Exp $ diff --git a/TODO b/TODO index 150b159b..fd21a1b7 100644 --- a/TODO +++ b/TODO @@ -47,7 +47,6 @@ -- For 0.1 -------------------------------------------------------------------- - man page -- get rid of MAXNAMELEN limits (sessid) - commands: rename sessions swap windows diff --git a/client-fn.c b/client-fn.c index 37fde7a1..598d520b 100644 --- a/client-fn.c +++ b/client-fn.c @@ -1,4 +1,4 @@ -/* $Id: client-fn.c,v 1.2 2007-10-03 12:34:16 nicm Exp $ */ +/* $Id: client-fn.c,v 1.3 2007-10-23 10:48:22 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -24,15 +24,13 @@ #include "tmux.h" void -client_fill_sessid(struct sessid *sid, char name[MAXNAMELEN]) +client_fill_session(struct msg_command_data *data) { char *env, *ptr, buf[256]; const char *errstr; long long ll; - strlcpy(sid->name, name, sizeof sid->name); - - sid->pid = -1; + data->pid = -1; if ((env = getenv("TMUX")) == NULL) return; if ((ptr = strchr(env, ',')) == NULL) @@ -45,12 +43,12 @@ client_fill_sessid(struct sessid *sid, char name[MAXNAMELEN]) ll = strtonum(ptr + 1, 0, UINT_MAX, &errstr); if (errstr != NULL) return; - sid->idx = ll; + data->idx = ll; ll = strtonum(buf, 0, LLONG_MAX, &errstr); if (errstr != NULL) return; - sid->pid = ll; + data->pid = ll; } void diff --git a/server-fn.c b/server-fn.c index 65a4ab99..74f07a0e 100644 --- a/server-fn.c +++ b/server-fn.c @@ -1,4 +1,4 @@ -/* $Id: server-fn.c,v 1.21 2007-10-19 10:21:35 nicm Exp $ */ +/* $Id: server-fn.c,v 1.22 2007-10-23 10:48:23 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -23,33 +23,33 @@ #include "tmux.h" -/* Find session from sessid. */ +/* Find session from command message. */ struct session * -server_find_sessid(struct sessid *sid, char **cause) +server_extract_session(struct msg_command_data *data, char *name, char **cause) { struct session *s; u_int i, n; - if (*sid->name != '\0') { - sid->name[(sizeof sid->name) - 1] = '\0'; - if ((s = session_find(sid->name)) == NULL) { - xasprintf(cause, "session not found: %s", sid->name); + if (name != NULL) { + if ((s = session_find(name)) == NULL) { + xasprintf(cause, "session not found: %s", name); return (NULL); } return (s); } - if (sid->pid != -1) { - if (sid->pid != getpid()) { - xasprintf(cause, "wrong server: %lld", sid->pid); + if (data->pid != -1) { + if (data->pid != getpid()) { + xasprintf(cause, "wrong server: %lld", data->pid); return (NULL); } - if (sid->idx > ARRAY_LENGTH(&sessions)) { - xasprintf(cause, "index out of range: %u", sid->idx); + if (data->idx > ARRAY_LENGTH(&sessions)) { + xasprintf(cause, "index out of range: %u", data->idx); return (NULL); } - if ((s = ARRAY_ITEM(&sessions, sid->idx)) == NULL) { - xasprintf(cause, "session doesn't exist: %u", sid->idx); + if ((s = ARRAY_ITEM(&sessions, data->idx)) == NULL) { + xasprintf( + cause, "session doesn't exist: %u", data->idx); return (NULL); } return (s); diff --git a/server-msg.c b/server-msg.c index 7b696ff5..15be6f88 100644 --- a/server-msg.c +++ b/server-msg.c @@ -1,4 +1,4 @@ -/* $Id: server-msg.c,v 1.28 2007-10-23 09:36:19 nicm Exp $ */ +/* $Id: server-msg.c,v 1.29 2007-10-23 10:48:23 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -108,11 +108,12 @@ server_msg_fn_command(struct hdr *hdr, struct client *c) struct msg_command_data data; struct cmd_ctx ctx; struct cmd *cmd; - char *cause; + char *name, *cause; if (hdr->size < sizeof data) fatalx("bad MSG_COMMAND size"); buffer_read(c->in, &data, sizeof data); + name = cmd_recv_string(c->in); cmd = cmd_recv(c->in); log_debug("got command %s from client %d", cmd->entry->name, c->fd); @@ -123,26 +124,29 @@ server_msg_fn_command(struct hdr *hdr, struct client *c) ctx.client = c; ctx.flags = 0; - if (data.sid.pid != -1 && (cmd->entry->flags & CMD_CANTNEST)) { + if (data.pid != -1 && (cmd->entry->flags & CMD_CANTNEST)) { server_msg_fn_command_error(&ctx, "sessions should be nested " "with care. unset $TMUX to force"); - return (0); + goto out; } if (cmd->entry->flags & CMD_NOSESSION) ctx.session = NULL; else { - ctx.session = server_find_sessid(&data.sid, &cause); + ctx.session = server_extract_session(&data, name, &cause); if (ctx.session == NULL) { server_msg_fn_command_error(&ctx, "%s", cause); xfree(cause); - return (0); + goto out; } } cmd_exec(cmd, &ctx); cmd_free(cmd); +out: + if (name != NULL) + xfree(name); return (0); } diff --git a/tmux.c b/tmux.c index b89538e2..1aa21711 100644 --- a/tmux.c +++ b/tmux.c @@ -1,4 +1,4 @@ -/* $Id: tmux.c,v 1.35 2007-10-20 09:57:08 nicm Exp $ */ +/* $Id: tmux.c,v 1.36 2007-10-23 10:48:23 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -170,19 +170,17 @@ main(int argc, char **argv) struct hdr hdr; const char *shell; struct passwd *pw; - char *path, *cause, name[MAXNAMELEN]; + char *path, *cause, *name; int n, opt; - *name = '\0'; - path = NULL; + path = name = NULL; while ((opt = getopt(argc, argv, "S:s:v")) != EOF) { switch (opt) { case 'S': path = xstrdup(optarg); break; case 's': - if (strlcpy(name, optarg, sizeof name) >= sizeof name) - errx(1, "session name too long: %s", optarg); + name = xstrdup(optarg); break; case 'v': debug_level++; @@ -225,10 +223,11 @@ main(int argc, char **argv) memset(&cctx, 0, sizeof cctx); if (!(cmd->entry->flags & CMD_NOSESSION) || (cmd->entry->flags & CMD_CANTNEST)) - client_fill_sessid(&data.sid, name); + client_fill_session(&data); if (client_init(path, &cctx, cmd->entry->flags & CMD_STARTSERVER) != 0) exit(1); b = buffer_create(BUFSIZ); + cmd_send_string(b, name); cmd_send(cmd, b); cmd_free(cmd); diff --git a/tmux.h b/tmux.h index 46c09a4c..e4c5bfbe 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $Id: tmux.h,v 1.64 2007-10-23 10:21:59 nicm Exp $ */ +/* $Id: tmux.h,v 1.65 2007-10-23 10:48:23 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -44,7 +44,6 @@ extern char *__progname; #define TTY_NAME_MAX 32 #endif -#define MAXNAMELEN 32 #define MAXTITLELEN 192 /* Fatal errors. */ @@ -283,13 +282,6 @@ enum hdrtype { MSG_PAUSE, }; -/* Session identification. */ -struct sessid { - long long pid; /* pid from $TMUX or -1 */ - u_int idx; /* index from $TMUX */ - char name[MAXNAMELEN]; /* empty for current */ -}; - /* Message header structure. */ struct hdr { enum hdrtype type; @@ -297,7 +289,10 @@ struct hdr { }; struct msg_command_data { - struct sessid sid; + long long pid; /* pid from $TMUX or -1 */ + u_int idx; /* index from $TMUX */ + + size_t namelen; }; struct msg_identify_data { @@ -565,7 +560,7 @@ int client_msg_dispatch(struct client_ctx *, char **); void client_write_server(struct client_ctx *, enum hdrtype, void *, size_t); void client_write_server2( struct client_ctx *, enum hdrtype, void *, size_t, void *, size_t); -void client_fill_sessid(struct sessid *, char [MAXNAMELEN]); +void client_fill_session(struct msg_command_data *); /* key-bindings.c */ extern struct bindings key_bindings; @@ -587,7 +582,8 @@ int server_start(char *); int server_msg_dispatch(struct client *); /* server-fn.c */ -struct session *server_find_sessid(struct sessid *, char **); +struct session *server_extract_session( + struct msg_command_data *, char *, char **); void server_write_client( struct client *, enum hdrtype, const void *, size_t); void server_write_session(