aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--format.c2
-rw-r--r--server-client.c5
-rw-r--r--tmux.11
-rw-r--r--tmux.h2
-rw-r--r--tty.c9
5 files changed, 14 insertions, 5 deletions
diff --git a/format.c b/format.c
index 59ef598c..8f74c415 100644
--- a/format.c
+++ b/format.c
@@ -712,6 +712,8 @@ format_defaults_client(struct format_tree *ft, struct client *c)
format_add(ft, "client_tty", "%s", c->tty.path);
if (c->tty.termname != NULL)
format_add(ft, "client_termname", "%s", c->tty.termname);
+ format_add(ft, "client_control_mode", "%d",
+ !!(c->flags & CLIENT_CONTROL));
t = c->creation_time.tv_sec;
format_add(ft, "client_created", "%lld", (long long) t);
diff --git a/server-client.c b/server-client.c
index c9c0c3ef..59969618 100644
--- a/server-client.c
+++ b/server-client.c
@@ -95,6 +95,8 @@ server_client_create(int fd)
environ_init(&c->environ);
+ c->cwd = -1;
+
c->cmdq = cmdq_new(c);
c->cmdq->client_exit = 1;
@@ -1267,12 +1269,11 @@ server_client_msg_identify(struct client *c, struct imsg *imsg)
if (c->fd == -1)
return;
- if (!isatty(c->fd)) {
+ if (tty_init(&c->tty, c, c->fd, c->term) != 0) {
close(c->fd);
c->fd = -1;
return;
}
- tty_init(&c->tty, c, c->fd, c->term);
if (c->flags & CLIENT_UTF8)
c->tty.flags |= TTY_UTF8;
if (c->flags & CLIENT_256COLOURS)
diff --git a/tmux.1 b/tmux.1
index 4395928d..18626052 100644
--- a/tmux.1
+++ b/tmux.1
@@ -3362,6 +3362,7 @@ The following variables are available, where appropriate:
.It Li "client_activity_string" Ta "" Ta "String time client last had activity"
.It Li "client_created" Ta "" Ta "Integer time client created"
.It Li "client_created_string" Ta "" Ta "String time client created"
+.It Li "client_control_mode" Ta "" Ta "1 if client is in control mode"
.It Li "client_height" Ta "" Ta "Height of client"
.It Li "client_last_session" Ta "" Ta "Name of the client's last session"
.It Li "client_pid" Ta "" Ta "PID of client process"
diff --git a/tmux.h b/tmux.h
index f0fef0d5..f0f0d13c 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1604,7 +1604,7 @@ void tty_putcode_ptr2(struct tty *, enum tty_code_code, const void *,
void tty_puts(struct tty *, const char *);
void tty_putc(struct tty *, u_char);
void tty_putn(struct tty *, const void *, size_t, u_int);
-void tty_init(struct tty *, struct client *, int, char *);
+int tty_init(struct tty *, struct client *, int, char *);
int tty_resize(struct tty *);
int tty_set_size(struct tty *, u_int, u_int);
void tty_set_class(struct tty *, u_int);
diff --git a/tty.c b/tty.c
index 63380c29..374fb8c6 100644
--- a/tty.c
+++ b/tty.c
@@ -59,11 +59,14 @@ void tty_default_colours(struct grid_cell *, const struct window_pane *);
#define tty_pane_full_width(tty, ctx) \
((ctx)->xoff == 0 && screen_size_x((ctx)->wp->screen) >= (tty)->sx)
-void
+int
tty_init(struct tty *tty, struct client *c, int fd, char *term)
{
char *path;
+ if (!isatty(fd))
+ return (-1);
+
memset(tty, 0, sizeof *tty);
tty->log_fd = -1;
@@ -75,13 +78,15 @@ tty_init(struct tty *tty, struct client *c, int fd, char *term)
tty->client = c;
if ((path = ttyname(fd)) == NULL)
- fatalx("ttyname failed");
+ return (-1);
tty->path = xstrdup(path);
tty->cstyle = 0;
tty->ccolour = xstrdup("");
tty->flags = 0;
tty->term_flags = 0;
+
+ return (0);
}
int