mirror of
https://github.com/tmate-io/tmate.git
synced 2024-12-25 08:09:24 +01:00
Sync OpenBSD patchset 637:
Clean up $TMUX parsing, from Micah Cowan, tweaked by me.
This commit is contained in:
parent
3c37b09272
commit
ac8aa0bc0f
50
tmux.c
50
tmux.c
@ -1,4 +1,4 @@
|
||||
/* $Id: tmux.c,v 1.200 2010-02-08 18:10:07 tcunha Exp $ */
|
||||
/* $Id: tmux.c,v 1.201 2010-02-08 18:23:48 tcunha Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||
@ -45,8 +45,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 *);
|
||||
|
||||
@ -132,9 +138,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;
|
||||
@ -143,19 +149,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;
|
||||
if ((pid_idx == path_pid + 1 || pid_idx[1] == '\0'))
|
||||
return;
|
||||
ptr1++;
|
||||
ptr2++;
|
||||
|
||||
len = ptr2 - ptr1 - 1;
|
||||
/* path */
|
||||
len = path_pid - env;
|
||||
data->path = xmalloc (len + 1);
|
||||
memcpy(data->path, env, len);
|
||||
data->path[len] = '\0';
|
||||
|
||||
/* 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);
|
||||
@ -163,7 +174,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;
|
||||
@ -227,6 +239,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;
|
||||
@ -241,6 +254,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) {
|
||||
@ -445,13 +459,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");
|
||||
}
|
||||
|
||||
@ -471,7 +484,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(
|
||||
|
Loading…
Reference in New Issue
Block a user