summaryrefslogtreecommitdiff
path: root/usr.bin/tmux
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2015-11-24 23:22:52 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2015-11-24 23:22:52 +0000
commit4f2090b649230e7df81a3dbb5d4cb85266725e09 (patch)
tree2dbc40865822a4fd4c85839e1ef389b07aadf6a5 /usr.bin/tmux
parent7909957383730ffa59a3a9980192f591d74f113e (diff)
Shell command from -c doesn't have to be global, pass it as an argument.
Diffstat (limited to 'usr.bin/tmux')
-rw-r--r--usr.bin/tmux/client.c28
-rw-r--r--usr.bin/tmux/tmux.c13
-rw-r--r--usr.bin/tmux/tmux.h5
3 files changed, 23 insertions, 23 deletions
diff --git a/usr.bin/tmux/client.c b/usr.bin/tmux/client.c
index ea8915a0f3a..f768dab0198 100644
--- a/usr.bin/tmux/client.c
+++ b/usr.bin/tmux/client.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: client.c,v 1.110 2015/11/24 23:01:51 nicm Exp $ */
+/* $OpenBSD: client.c,v 1.111 2015/11/24 23:22:51 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -53,7 +53,7 @@ enum msgtype client_exittype;
const char *client_exitsession;
int client_attached;
-__dead void client_exec(const char *);
+__dead void client_exec(const char *,const char *);
int client_get_lock(char *);
int client_connect(struct event_base *, const char *, int);
void client_send_identify(const char *, const char *);
@@ -62,7 +62,7 @@ void client_write(int, const char *, size_t);
void client_signal(int);
void client_dispatch(struct imsg *, void *);
void client_dispatch_attached(struct imsg *);
-void client_dispatch_wait(struct imsg *);
+void client_dispatch_wait(struct imsg *, const char *);
const char *client_exit_message(void);
/*
@@ -213,7 +213,8 @@ client_exit_message(void)
/* Client main loop. */
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_list *cmdlist;
@@ -234,7 +235,7 @@ client_main(struct event_base *base, int argc, char **argv, int flags)
/* Set up the initial command. */
cmdflags = 0;
- if (shell_cmd != NULL) {
+ if (shellcmd != NULL) {
msg = MSG_SHELL;
cmdflags = CMD_STARTSERVER;
} else if (argc == 0) {
@@ -276,7 +277,8 @@ client_main(struct event_base *base, int argc, char **argv, int flags)
}
return (1);
}
- client_peer = proc_add_peer(client_proc, fd, client_dispatch, NULL);
+ client_peer = proc_add_peer(client_proc, fd, client_dispatch,
+ (void *)shellcmd);
/* Save these before pledge(). */
if ((cwd = getcwd(path, sizeof path)) == NULL) {
@@ -450,12 +452,12 @@ client_write(int fd, const char *data, size_t size)
/* Run command in shell; used for -c. */
__dead void
-client_exec(const char *shell)
+client_exec(const char *shell, const char *shellcmd)
{
const char *name, *ptr;
char *argv0;
- log_debug("shell %s, command %s", shell, shell_cmd);
+ log_debug("shell %s, command %s", shell, shellcmd);
ptr = strrchr(shell, '/');
if (ptr != NULL && *(ptr + 1) != '\0')
@@ -473,7 +475,7 @@ client_exec(const char *shell)
setblocking(STDERR_FILENO, 1);
closefrom(STDERR_FILENO + 1);
- execl(shell, argv0, "-c", shell_cmd, (char *) NULL);
+ execl(shell, argv0, "-c", shellcmd, (char *) NULL);
fatal("execl failed");
}
@@ -519,7 +521,7 @@ client_signal(int sig)
/* Callback for client read events. */
void
-client_dispatch(struct imsg *imsg, __unused void *arg)
+client_dispatch(struct imsg *imsg, void *arg)
{
if (imsg == NULL) {
client_exitreason = CLIENT_EXIT_LOST_SERVER;
@@ -531,12 +533,12 @@ client_dispatch(struct imsg *imsg, __unused void *arg)
if (client_attached)
client_dispatch_attached(imsg);
else
- client_dispatch_wait(imsg);
+ client_dispatch_wait(imsg, arg);
}
/* Dispatch imsgs when in wait state (before MSG_READY). */
void
-client_dispatch_wait(struct imsg *imsg)
+client_dispatch_wait(struct imsg *imsg, const char *shellcmd)
{
char *data;
ssize_t datalen;
@@ -616,7 +618,7 @@ client_dispatch_wait(struct imsg *imsg)
fatalx("bad MSG_SHELL string");
clear_signals(0);
- client_exec(data);
+ client_exec(data, shellcmd);
/* NOTREACHED */
case MSG_DETACH:
case MSG_DETACHKILL:
diff --git a/usr.bin/tmux/tmux.c b/usr.bin/tmux/tmux.c
index 9690f9e86e5..a98ddb88948 100644
--- a/usr.bin/tmux/tmux.c
+++ b/usr.bin/tmux/tmux.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.c,v 1.160 2015/11/24 22:27:22 nicm Exp $ */
+/* $OpenBSD: tmux.c,v 1.161 2015/11/24 23:22:51 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -39,7 +39,6 @@ struct options *global_s_options; /* session options */
struct options *global_w_options; /* window options */
struct environ *global_environ;
-char *shell_cmd;
struct timeval start_time;
const char *socket_path;
@@ -184,7 +183,7 @@ find_home(void)
int
main(int argc, char **argv)
{
- char *path, *label, **var, tmp[PATH_MAX];
+ char *path, *label, **var, tmp[PATH_MAX], *shellcmd = NULL;
const char *s;
int opt, flags, keys;
@@ -203,8 +202,8 @@ main(int argc, char **argv)
flags |= CLIENT_256COLOURS;
break;
case 'c':
- free(shell_cmd);
- shell_cmd = xstrdup(optarg);
+ free(shellcmd);
+ shellcmd = xstrdup(optarg);
break;
case 'C':
if (flags & CLIENT_CONTROL)
@@ -241,7 +240,7 @@ main(int argc, char **argv)
argc -= optind;
argv += optind;
- if (shell_cmd != NULL && argc != 0)
+ if (shellcmd != NULL && argc != 0)
usage();
if (pledge("stdio rpath wpath cpath flock fattr unix getpw sendfd "
@@ -318,5 +317,5 @@ main(int argc, char **argv)
free(label);
/* Pass control to the client. */
- exit(client_main(event_init(), argc, argv, flags));
+ exit(client_main(event_init(), argc, argv, flags, shellcmd));
}
diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h
index e2924f53ac4..4b9b9c13ef6 100644
--- a/usr.bin/tmux/tmux.h
+++ b/usr.bin/tmux/tmux.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.590 2015/11/24 22:27:22 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.591 2015/11/24 23:22:51 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -1431,7 +1431,6 @@ extern struct options *global_options;
extern struct options *global_s_options;
extern struct options *global_w_options;
extern struct environ *global_environ;
-extern char *shell_cmd;
extern struct timeval start_time;
extern const char *socket_path;
const char *getshell(void);
@@ -1732,7 +1731,7 @@ int cmd_string_parse(const char *, struct cmd_list **, const char *,
void cmd_wait_for_flush(void);
/* client.c */
-int client_main(struct event_base *, int, char **, int);
+int client_main(struct event_base *, int, char **, int, const char *);
/* key-bindings.c */
RB_PROTOTYPE(key_bindings, key_binding, entry, key_bindings_cmp);