mirror of
https://github.com/tmate-io/tmate.git
synced 2024-12-23 23:29:15 +01: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:
parent
dc0d34e137
commit
6b2129696f
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 **);
|
||||
|
Loading…
Reference in New Issue
Block a user