mirror of
https://github.com/tmate-io/tmate.git
synced 2025-01-13 01:18:13 +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>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -45,8 +45,14 @@ time_t start_time;
|
|||||||
char *socket_path;
|
char *socket_path;
|
||||||
int login_shell;
|
int login_shell;
|
||||||
|
|
||||||
|
struct env_data {
|
||||||
|
char *path;
|
||||||
|
pid_t pid;
|
||||||
|
u_int idx;
|
||||||
|
};
|
||||||
|
|
||||||
__dead void usage(void);
|
__dead void usage(void);
|
||||||
void fill_session(struct msg_command_data *);
|
void parse_env(struct env_data *);
|
||||||
char *makesockpath(const char *);
|
char *makesockpath(const char *);
|
||||||
__dead void shell_exec(const char *, const char *);
|
__dead void shell_exec(const char *, const char *);
|
||||||
|
|
||||||
@ -132,9 +138,9 @@ areshell(const char *shell)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
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;
|
size_t len;
|
||||||
const char *errstr;
|
const char *errstr;
|
||||||
long long ll;
|
long long ll;
|
||||||
@ -143,19 +149,24 @@ fill_session(struct msg_command_data *data)
|
|||||||
if ((env = getenv("TMUX")) == NULL)
|
if ((env = getenv("TMUX")) == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((ptr2 = strrchr(env, ',')) == NULL || ptr2 == env)
|
if ((path_pid = strchr(env, ',')) == NULL || path_pid == env)
|
||||||
return;
|
return;
|
||||||
for (ptr1 = ptr2 - 1; ptr1 > env && *ptr1 != ','; ptr1--)
|
if ((pid_idx = strchr(path_pid + 1, ',')) == NULL)
|
||||||
;
|
return;
|
||||||
if (*ptr1 != ',')
|
if ((pid_idx == path_pid + 1 || pid_idx[1] == '\0'))
|
||||||
return;
|
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)
|
if (len > (sizeof buf) - 1)
|
||||||
return;
|
return;
|
||||||
memcpy(buf, ptr1, len);
|
memcpy(buf, path_pid + 1, len);
|
||||||
buf[len] = '\0';
|
buf[len] = '\0';
|
||||||
|
|
||||||
ll = strtonum(buf, 0, LONG_MAX, &errstr);
|
ll = strtonum(buf, 0, LONG_MAX, &errstr);
|
||||||
@ -163,7 +174,8 @@ fill_session(struct msg_command_data *data)
|
|||||||
return;
|
return;
|
||||||
data->pid = ll;
|
data->pid = ll;
|
||||||
|
|
||||||
ll = strtonum(ptr2, 0, UINT_MAX, &errstr);
|
/* idx */
|
||||||
|
ll = strtonum(pid_idx+1, 0, UINT_MAX, &errstr);
|
||||||
if (errstr != NULL)
|
if (errstr != NULL)
|
||||||
return;
|
return;
|
||||||
data->idx = ll;
|
data->idx = ll;
|
||||||
@ -227,6 +239,7 @@ main(int argc, char **argv)
|
|||||||
struct passwd *pw;
|
struct passwd *pw;
|
||||||
struct options *oo, *so, *wo;
|
struct options *oo, *so, *wo;
|
||||||
struct keylist *keylist;
|
struct keylist *keylist;
|
||||||
|
struct env_data envdata;
|
||||||
struct msg_command_data cmddata;
|
struct msg_command_data cmddata;
|
||||||
char *s, *shellcmd, *path, *label, *home, *cause;
|
char *s, *shellcmd, *path, *label, *home, *cause;
|
||||||
char cwd[MAXPATHLEN], **var;
|
char cwd[MAXPATHLEN], **var;
|
||||||
@ -241,6 +254,7 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
flags = 0;
|
flags = 0;
|
||||||
shellcmd = label = path = NULL;
|
shellcmd = label = path = NULL;
|
||||||
|
envdata.path = NULL;
|
||||||
login_shell = (**argv == '-');
|
login_shell = (**argv == '-');
|
||||||
while ((opt = getopt(argc, argv, "28c:df:lL:qS:uUv")) != -1) {
|
while ((opt = getopt(argc, argv, "28c:df:lL:qS:uUv")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
@ -445,13 +459,12 @@ main(int argc, char **argv)
|
|||||||
* Figure out the socket path. If specified on the command-line with
|
* Figure out the socket path. If specified on the command-line with
|
||||||
* -S or -L, use it, otherwise try $TMUX or assume -L default.
|
* -S or -L, use it, otherwise try $TMUX or assume -L default.
|
||||||
*/
|
*/
|
||||||
|
parse_env(&envdata);
|
||||||
if (path == NULL) {
|
if (path == NULL) {
|
||||||
/* No -L. Try $TMUX, or default. */
|
/* No -L. Try $TMUX, or default. */
|
||||||
if (label == NULL) {
|
if (label == NULL) {
|
||||||
if ((path = getenv("TMUX")) != NULL) {
|
path = envdata.path;
|
||||||
path = xstrdup(path);
|
if (path == NULL)
|
||||||
path[strcspn(path, ",")] = '\0';
|
|
||||||
} else
|
|
||||||
label = xstrdup("default");
|
label = xstrdup("default");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -471,7 +484,8 @@ main(int argc, char **argv)
|
|||||||
buf = NULL;
|
buf = NULL;
|
||||||
len = 0;
|
len = 0;
|
||||||
} else {
|
} else {
|
||||||
fill_session(&cmddata);
|
cmddata.pid = envdata.pid;
|
||||||
|
cmddata.idx = envdata.idx;
|
||||||
|
|
||||||
cmddata.argc = argc;
|
cmddata.argc = argc;
|
||||||
if (cmd_pack_argv(
|
if (cmd_pack_argv(
|
||||||
|
Loading…
Reference in New Issue
Block a user