mirror of
https://github.com/tmux/tmux.git
synced 2025-03-13 21:58:48 +00:00
Clean up $TMUX parsing, from Micah Cowan, tweaked by me.
This commit is contained in:
parent
3ef3802629
commit
4a5017d1d8
48
tmux.c
48
tmux.c
@ -46,8 +46,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 *);
|
||||||
|
|
||||||
@ -129,9 +135,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;
|
||||||
@ -140,19 +146,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);
|
||||||
@ -160,7 +171,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;
|
||||||
@ -224,6 +236,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;
|
||||||
@ -238,6 +251,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) {
|
||||||
@ -442,13 +456,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");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -468,7 +481,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