diff options
author | Nicholas Marriott <nicm@cvs.openbsd.org> | 2010-02-06 18:29:16 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@cvs.openbsd.org> | 2010-02-06 18:29:16 +0000 |
commit | 893b71ee5211f9ac8a5550421f6021d25f2cec25 (patch) | |
tree | f6ad4f87686169f685ce8ef292baf3b890c72c9e | |
parent | d4cdb3a4db77c952208f555c9c00068f1fba9bd0 (diff) |
Clean up $TMUX parsing, from Micah Cowan, tweaked by me.
-rw-r--r-- | usr.bin/tmux/tmux.c | 50 |
1 files changed, 32 insertions, 18 deletions
diff --git a/usr.bin/tmux/tmux.c b/usr.bin/tmux/tmux.c index 2e56eab2d7f..7918c8ae5f7 100644 --- a/usr.bin/tmux/tmux.c +++ b/usr.bin/tmux/tmux.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.c,v 1.69 2010/02/06 17:15:33 nicm Exp $ */ +/* $OpenBSD: tmux.c,v 1.70 2010/02/06 18:29:15 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -46,8 +46,14 @@ time_t start_time; char *socket_path; int login_shell; +struct env_data { + char *path; + pid_t pid; + u_int idx; +}; + __dead void usage(void); -void fill_session(struct msg_command_data *); +void parse_env(struct env_data *); char *makesockpath(const char *); __dead void shell_exec(const char *, const char *); @@ -129,9 +135,9 @@ areshell(const char *shell) } void -fill_session(struct msg_command_data *data) +parse_env(struct env_data *data) { - char *env, *ptr1, *ptr2, buf[256]; + char *env, *path_pid, *pid_idx, buf[256]; size_t len; const char *errstr; long long ll; @@ -140,19 +146,24 @@ fill_session(struct msg_command_data *data) if ((env = getenv("TMUX")) == NULL) return; - if ((ptr2 = strrchr(env, ',')) == NULL || ptr2 == env) + if ((path_pid = strchr(env, ',')) == NULL || path_pid == env) return; - for (ptr1 = ptr2 - 1; ptr1 > env && *ptr1 != ','; ptr1--) - ; - if (*ptr1 != ',') + if ((pid_idx = strchr(path_pid + 1, ',')) == NULL) return; - ptr1++; - ptr2++; + if ((pid_idx == path_pid + 1 || pid_idx[1] == '\0')) + return; + + /* path */ + len = path_pid - env; + data->path = xmalloc (len + 1); + memcpy(data->path, env, len); + data->path[len] = '\0'; - len = ptr2 - ptr1 - 1; + /* pid */ + len = pid_idx - path_pid - 1; if (len > (sizeof buf) - 1) return; - memcpy(buf, ptr1, len); + memcpy(buf, path_pid + 1, len); buf[len] = '\0'; ll = strtonum(buf, 0, LONG_MAX, &errstr); @@ -160,7 +171,8 @@ fill_session(struct msg_command_data *data) return; data->pid = ll; - ll = strtonum(ptr2, 0, UINT_MAX, &errstr); + /* idx */ + ll = strtonum(pid_idx+1, 0, UINT_MAX, &errstr); if (errstr != NULL) return; data->idx = ll; @@ -224,6 +236,7 @@ main(int argc, char **argv) struct passwd *pw; struct options *oo, *so, *wo; struct keylist *keylist; + struct env_data envdata; struct msg_command_data cmddata; char *s, *shellcmd, *path, *label, *home, *cause; char cwd[MAXPATHLEN], **var; @@ -238,6 +251,7 @@ main(int argc, char **argv) flags = 0; shellcmd = label = path = NULL; + envdata.path = NULL; login_shell = (**argv == '-'); while ((opt = getopt(argc, argv, "28c:df:lL:qS:uUv")) != -1) { switch (opt) { @@ -442,13 +456,12 @@ main(int argc, char **argv) * Figure out the socket path. If specified on the command-line with * -S or -L, use it, otherwise try $TMUX or assume -L default. */ + parse_env(&envdata); if (path == NULL) { /* No -L. Try $TMUX, or default. */ if (label == NULL) { - if ((path = getenv("TMUX")) != NULL) { - path = xstrdup(path); - path[strcspn(path, ",")] = '\0'; - } else + path = envdata.path; + if (path == NULL) label = xstrdup("default"); } @@ -468,7 +481,8 @@ main(int argc, char **argv) buf = NULL; len = 0; } else { - fill_session(&cmddata); + cmddata.pid = envdata.pid; + cmddata.idx = envdata.idx; cmddata.argc = argc; if (cmd_pack_argv( |