mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	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.
This commit is contained in:
		
							
								
								
									
										16
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								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");
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								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 **);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user