Make shell_command a global like other stuff rather than making it an

exception and using callback argument.
This commit is contained in:
nicm 2017-07-12 09:21:25 +00:00
parent d0d42dc4cb
commit ed3cfaafb2
3 changed files with 16 additions and 17 deletions

View File

@ -64,7 +64,7 @@ static void client_write(int, const char *, size_t);
static void client_signal(int); static void client_signal(int);
static void client_dispatch(struct imsg *, void *); static void client_dispatch(struct imsg *, void *);
static void client_dispatch_attached(struct imsg *); static void client_dispatch_attached(struct imsg *);
static void client_dispatch_wait(struct imsg *, const char *); static void client_dispatch_wait(struct imsg *);
static const char *client_exit_message(void); static const char *client_exit_message(void);
/* /*
@ -215,8 +215,7 @@ client_exit_message(void)
/* Client main loop. */ /* Client main loop. */
int int
client_main(struct event_base *base, int argc, char **argv, int flags, client_main(struct event_base *base, int argc, char **argv, int flags)
const char *shellcmd)
{ {
struct cmd *cmd; struct cmd *cmd;
struct cmd_list *cmdlist; struct cmd_list *cmdlist;
@ -237,7 +236,7 @@ client_main(struct event_base *base, int argc, char **argv, int flags,
/* Set up the initial command. */ /* Set up the initial command. */
cmdflags = 0; cmdflags = 0;
if (shellcmd != NULL) { if (shell_command != NULL) {
msg = MSG_SHELL; msg = MSG_SHELL;
cmdflags = CMD_STARTSERVER; cmdflags = CMD_STARTSERVER;
} else if (argc == 0) { } else if (argc == 0) {
@ -276,8 +275,7 @@ client_main(struct event_base *base, int argc, char **argv, int flags,
} }
return (1); return (1);
} }
client_peer = proc_add_peer(client_proc, fd, client_dispatch, client_peer = proc_add_peer(client_proc, fd, client_dispatch, NULL);
(void *)shellcmd);
/* Save these before pledge(). */ /* Save these before pledge(). */
if ((cwd = getcwd(path, sizeof path)) == NULL) { if ((cwd = getcwd(path, sizeof path)) == NULL) {
@ -533,7 +531,7 @@ client_signal(int sig)
/* Callback for client read events. */ /* Callback for client read events. */
static void static void
client_dispatch(struct imsg *imsg, void *arg) client_dispatch(struct imsg *imsg, __unused void *arg)
{ {
if (imsg == NULL) { if (imsg == NULL) {
client_exitreason = CLIENT_EXIT_LOST_SERVER; client_exitreason = CLIENT_EXIT_LOST_SERVER;
@ -545,12 +543,12 @@ client_dispatch(struct imsg *imsg, void *arg)
if (client_attached) if (client_attached)
client_dispatch_attached(imsg); client_dispatch_attached(imsg);
else else
client_dispatch_wait(imsg, arg); client_dispatch_wait(imsg);
} }
/* Dispatch imsgs when in wait state (before MSG_READY). */ /* Dispatch imsgs when in wait state (before MSG_READY). */
static void static void
client_dispatch_wait(struct imsg *imsg, const char *shellcmd) client_dispatch_wait(struct imsg *imsg)
{ {
char *data; char *data;
ssize_t datalen; ssize_t datalen;
@ -630,7 +628,7 @@ client_dispatch_wait(struct imsg *imsg, const char *shellcmd)
fatalx("bad MSG_SHELL string"); fatalx("bad MSG_SHELL string");
clear_signals(0); clear_signals(0);
client_exec(data, shellcmd); client_exec(data, shell_command);
/* NOTREACHED */ /* NOTREACHED */
case MSG_DETACH: case MSG_DETACH:
case MSG_DETACHKILL: case MSG_DETACHKILL:

12
tmux.c
View File

@ -44,6 +44,7 @@ struct hooks *global_hooks;
struct timeval start_time; struct timeval start_time;
const char *socket_path; const char *socket_path;
int ptm_fd = -1; int ptm_fd = -1;
const char *shell_command;
static __dead void usage(void); static __dead void usage(void);
static char *make_label(const char *); static char *make_label(const char *);
@ -190,8 +191,8 @@ find_home(void)
int int
main(int argc, char **argv) main(int argc, char **argv)
{ {
char *path, *label, tmp[PATH_MAX]; char *path, *label, **var;
char *shellcmd = NULL, **var; char tmp[PATH_MAX];
const char *s, *shell; const char *s, *shell;
int opt, flags, keys; int opt, flags, keys;
const struct options_table_entry *oe; const struct options_table_entry *oe;
@ -220,8 +221,7 @@ main(int argc, char **argv)
flags |= CLIENT_256COLOURS; flags |= CLIENT_256COLOURS;
break; break;
case 'c': case 'c':
free(shellcmd); shell_command = optarg;
shellcmd = xstrdup(optarg);
break; break;
case 'C': case 'C':
if (flags & CLIENT_CONTROL) if (flags & CLIENT_CONTROL)
@ -258,7 +258,7 @@ main(int argc, char **argv)
argc -= optind; argc -= optind;
argv += optind; argv += optind;
if (shellcmd != NULL && argc != 0) if (shell_command != NULL && argc != 0)
usage(); usage();
if ((ptm_fd = getptmfd()) == -1) if ((ptm_fd = getptmfd()) == -1)
@ -348,5 +348,5 @@ main(int argc, char **argv)
free(label); free(label);
/* Pass control to the client. */ /* Pass control to the client. */
exit(client_main(event_init(), argc, argv, flags, shellcmd)); exit(client_main(event_init(), argc, argv, flags));
} }

3
tmux.h
View File

@ -1486,6 +1486,7 @@ extern struct environ *global_environ;
extern struct timeval start_time; extern struct timeval start_time;
extern const char *socket_path; extern const char *socket_path;
extern int ptm_fd; extern int ptm_fd;
extern const char *shell_command;
int areshell(const char *); int areshell(const char *);
void setblocking(int, int); void setblocking(int, int);
const char *find_home(void); const char *find_home(void);
@ -1820,7 +1821,7 @@ struct cmd_list *cmd_string_parse(const char *, const char *, u_int, char **);
void cmd_wait_for_flush(void); void cmd_wait_for_flush(void);
/* client.c */ /* client.c */
int client_main(struct event_base *, int, char **, int, const char *); int client_main(struct event_base *, int, char **, int);
/* key-bindings.c */ /* key-bindings.c */
RB_PROTOTYPE(key_bindings, key_binding, entry, key_bindings_cmp); RB_PROTOTYPE(key_bindings, key_binding, entry, key_bindings_cmp);