summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicm <nicm>2015-06-04 23:27:51 +0000
committernicm <nicm>2015-06-04 23:27:51 +0000
commit6b2129696fbefe44d0adce1f2a11b4ae477cd07e (patch)
treed204c7289caf70e18ea66fe75a7e3a0e668fd844
parentdc0d34e13792ff14b5c02fac01af013dfe111c83 (diff)
Move the nested check from client to server and compare the client tty
name to all the pane pty names instead of comparing socket paths. This means that "new -d" will work without unsetting $TMUX.
-rw-r--r--client.c16
-rw-r--r--cmd-attach-session.c7
-rw-r--r--cmd-new-session.c19
-rw-r--r--server-client.c21
-rw-r--r--tmux.h4
5 files changed, 42 insertions, 25 deletions
diff --git a/client.c b/client.c
index e2ffa546..48109613 100644
--- a/client.c
+++ b/client.c
@@ -222,7 +222,7 @@ client_main(int argc, char **argv, int flags)
cmdflags = CMD_STARTSERVER;
} else if (argc == 0) {
msg = MSG_COMMAND;
- cmdflags = CMD_STARTSERVER|CMD_CANTNEST;
+ cmdflags = CMD_STARTSERVER;
} else {
msg = MSG_COMMAND;
@@ -240,24 +240,10 @@ client_main(int argc, char **argv, int flags)
TAILQ_FOREACH(cmd, &cmdlist->list, qentry) {
if (cmd->entry->flags & CMD_STARTSERVER)
cmdflags |= CMD_STARTSERVER;
- if (cmd->entry->flags & CMD_CANTNEST)
- cmdflags |= CMD_CANTNEST;
}
cmd_list_free(cmdlist);
}
- /*
- * Check if this could be a nested session, if the command can't nest:
- * if the socket path matches $TMUX, this is probably the same server.
- */
- if (shell_cmd == NULL && environ_path != NULL &&
- (cmdflags & CMD_CANTNEST) &&
- strcmp(socket_path, environ_path) == 0) {
- fprintf(stderr, "sessions should be nested with care, "
- "unset $TMUX to force\n");
- return (1);
- }
-
/* Set process title, log and signals now this is the client. */
setproctitle("client (%s)", socket_path);
logfile("client");
diff --git a/cmd-attach-session.c b/cmd-attach-session.c
index 46d568b4..f889019c 100644
--- a/cmd-attach-session.c
+++ b/cmd-attach-session.c
@@ -36,7 +36,7 @@ const struct cmd_entry cmd_attach_session_entry = {
"attach-session", "attach",
"c:drt:", 0, 0,
"[-dr] [-c working-directory] " CMD_TARGET_SESSION_USAGE,
- CMD_CANTNEST|CMD_STARTSERVER,
+ CMD_STARTSERVER,
cmd_attach_session_exec
};
@@ -81,6 +81,11 @@ cmd_attach_session(struct cmd_q *cmdq, const char *tflag, int dflag, int rflag,
if (cmdq->client == NULL)
return (CMD_RETURN_NORMAL);
+ if (server_client_check_nested(cmdq->client)) {
+ cmdq_error(cmdq, "sessions should be nested with care, "
+ "unset $TMUX to force");
+ return (CMD_RETURN_ERROR);
+ }
if (wl != NULL) {
if (wp != NULL)
diff --git a/cmd-new-session.c b/cmd-new-session.c
index 9c767489..0fb849e2 100644
--- a/cmd-new-session.c
+++ b/cmd-new-session.c
@@ -41,7 +41,7 @@ const struct cmd_entry cmd_new_session_entry = {
"[-AdDP] [-c start-directory] [-F format] [-n window-name] "
"[-s session-name] " CMD_TARGET_SESSION_USAGE " [-x width] "
"[-y height] [command]",
- CMD_STARTSERVER|CMD_CANTNEST,
+ CMD_STARTSERVER,
cmd_new_session_exec
};
@@ -145,15 +145,20 @@ cmd_new_session_exec(struct cmd *self, struct cmd_q *cmdq)
}
/*
- * Save the termios settings, part of which is used for new windows in
- * this session.
+ * If this is a new client, check for nesting and save the termios
+ * settings (part of which is used for new windows in this session).
*
- * This is read again with tcgetattr() rather than using tty.tio as if
- * detached, tty_open won't be called. Because of this, it must be done
- * before opening the terminal as that calls tcsetattr() to prepare for
- * tmux taking over.
+ * tcgetattr() is used rather than using tty.tio since if the client is
+ * detached, tty_open won't be called. It must be done before opening
+ * the terminal as that calls tcsetattr() to prepare for tmux taking
+ * over.
*/
if (!detached && !already_attached && c->tty.fd != -1) {
+ if (server_client_check_nested(cmdq->client)) {
+ cmdq_error(cmdq, "sessions should be nested with care, "
+ "unset $TMUX to force");
+ return (CMD_RETURN_ERROR);
+ }
if (tcgetattr(c->tty.fd, &tio) != 0)
fatal("tcgetattr failed");
tiop = &tio;
diff --git a/server-client.c b/server-client.c
index 36408e91..01c8b313 100644
--- a/server-client.c
+++ b/server-client.c
@@ -46,6 +46,27 @@ void server_client_msg_command(struct client *, struct imsg *);
void server_client_msg_identify(struct client *, struct imsg *);
void server_client_msg_shell(struct client *);
+/* Check if this client is inside this server. */
+int
+server_client_check_nested(struct client *c)
+{
+ struct environ_entry *envent;
+ struct window_pane *wp;
+
+ if (c->tty.path == NULL)
+ return (0);
+
+ envent = environ_find(&c->environ, "TMUX");
+ if (envent == NULL || *envent->value == '\0')
+ return (0);
+
+ RB_FOREACH(wp, window_pane_tree, &all_window_panes) {
+ if (strcmp(wp->tty, c->tty.path) == 0)
+ return (1);
+ }
+ return (0);
+}
+
/* Set client key table. */
void
server_client_key_table(struct client *c, const char *name)
diff --git a/tmux.h b/tmux.h
index ae1682af..8406955b 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1374,8 +1374,7 @@ struct cmd_entry {
const char *usage;
#define CMD_STARTSERVER 0x1
-#define CMD_CANTNEST 0x2
-#define CMD_READONLY 0x4
+#define CMD_READONLY 0x2
int flags;
enum cmd_retval (*exec)(struct cmd *, struct cmd_q *);
@@ -1868,6 +1867,7 @@ void server_update_socket(void);
void server_add_accept(int);
/* server-client.c */
+int server_client_check_nested(struct client *);
void server_client_handle_key(struct client *, int);
void server_client_create(int);
int server_client_open(struct client *, char **);