Move the nested check from client to server and compare the client tty
authornicm <nicm@openbsd.org>
Thu, 4 Jun 2015 23:27:51 +0000 (23:27 +0000)
committernicm <nicm@openbsd.org>
Thu, 4 Jun 2015 23:27:51 +0000 (23:27 +0000)
name to all the pane pty names instead of comparing socket paths. This
means that "new -d" will work without unsetting $TMUX.

usr.bin/tmux/client.c
usr.bin/tmux/cmd-attach-session.c
usr.bin/tmux/cmd-new-session.c
usr.bin/tmux/server-client.c
usr.bin/tmux/tmux.h

index 744a6fe..46daf51 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: client.c,v 1.88 2015/04/24 20:58:44 nicm Exp $ */
+/* $OpenBSD: client.c,v 1.89 2015/06/04 23:27:51 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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");
index 7117021..7d77403 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-attach-session.c,v 1.34 2015/04/25 18:09:28 nicm Exp $ */
+/* $OpenBSD: cmd-attach-session.c,v 1.35 2015/06/04 23:27:51 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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)
index cfb355d..667d0b3 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-new-session.c,v 1.66 2015/05/29 23:02:27 nicm Exp $ */
+/* $OpenBSD: cmd-new-session.c,v 1.67 2015/06/04 23:27:51 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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;
index 731b9ea..e551c41 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: server-client.c,v 1.139 2015/05/27 13:28:04 nicm Exp $ */
+/* $OpenBSD: server-client.c,v 1.140 2015/06/04 23:27:51 nicm Exp $ */
 
 /*
  * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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)
index d3e835a..2af070f 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.516 2015/06/04 11:43:51 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.517 2015/06/04 23:27:51 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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 **);