1
0
mirror of https://github.com/tmate-io/tmate-ssh-server.git synced 2020-11-18 19:53:51 -08:00

Merge branch 'master' of github.com:tmux/tmux

This commit is contained in:
Nicholas Marriott 2015-07-14 08:15:05 +01:00
commit 5ffb869e1a
9 changed files with 80 additions and 27 deletions

View File

@ -354,6 +354,7 @@ client_send_identify(int flags)
{ {
const char *s; const char *s;
char **ss; char **ss;
size_t sslen;
int fd; int fd;
pid_t pid; pid_t pid;
@ -378,8 +379,11 @@ client_send_identify(int flags)
pid = getpid(); pid = getpid();
client_write_one(MSG_IDENTIFY_CLIENTPID, -1, &pid, sizeof pid); client_write_one(MSG_IDENTIFY_CLIENTPID, -1, &pid, sizeof pid);
for (ss = environ; *ss != NULL; ss++) for (ss = environ; *ss != NULL; ss++) {
client_write_one(MSG_IDENTIFY_ENVIRON, -1, *ss, strlen(*ss) + 1); sslen = strlen(*ss) + 1;
if (sslen <= MAX_IMSGSIZE - IMSG_HEADER_SIZE)
client_write_one(MSG_IDENTIFY_ENVIRON, -1, *ss, sslen);
}
client_write_one(MSG_IDENTIFY_DONE, -1, NULL, 0); client_write_one(MSG_IDENTIFY_DONE, -1, NULL, 0);

View File

@ -27,16 +27,61 @@
* Show environment. * Show environment.
*/ */
enum cmd_retval cmd_show_environment_exec(struct cmd *, struct cmd_q *); enum cmd_retval cmd_show_environment_exec(struct cmd *, struct cmd_q *);
char *cmd_show_environment_escape(struct environ_entry *);
void cmd_show_environment_print(struct cmd *, struct cmd_q *,
struct environ_entry *);
const struct cmd_entry cmd_show_environment_entry = { const struct cmd_entry cmd_show_environment_entry = {
"show-environment", "showenv", "show-environment", "showenv",
"gt:", 0, 1, "gst:", 0, 1,
"[-g] " CMD_TARGET_SESSION_USAGE " [name]", "[-gs] " CMD_TARGET_SESSION_USAGE " [name]",
0, 0,
cmd_show_environment_exec cmd_show_environment_exec
}; };
char *
cmd_show_environment_escape(struct environ_entry *envent)
{
const char *value = envent->value;
char c, *out, *ret;
out = ret = xmalloc(strlen(value) * 2 + 1); /* at most twice the size */
while ((c = *value++) != '\0') {
/* POSIX interprets $ ` " and \ in double quotes. */
if (c == '$' || c == '`' || c == '"' || c == '\\')
*out++ = '\\';
*out++ = c;
}
*out = '\0';
return ret;
}
void
cmd_show_environment_print(struct cmd *self, struct cmd_q *cmdq,
struct environ_entry *envent)
{
char *escaped;
if (!args_has(self->args, 's')) {
if (envent->value != NULL)
cmdq_print(cmdq, "%s=%s", envent->name, envent->value);
else
cmdq_print(cmdq, "-%s", envent->name);
return;
}
if (envent->value != NULL) {
escaped = cmd_show_environment_escape(envent);
cmdq_print(cmdq, "%s=\"%s\"; export %s;", envent->name, escaped,
envent->name);
free(escaped);
} else
cmdq_print(cmdq, "unset %s;", envent->name);
}
enum cmd_retval enum cmd_retval
cmd_show_environment_exec(struct cmd *self, struct cmd_q *cmdq) cmd_show_environment_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
@ -48,7 +93,8 @@ cmd_show_environment_exec(struct cmd *self, struct cmd_q *cmdq)
if (args_has(self->args, 'g')) if (args_has(self->args, 'g'))
env = &global_environ; env = &global_environ;
else { else {
if ((s = cmd_find_session(cmdq, args_get(args, 't'), 0)) == NULL) s = cmd_find_session(cmdq, args_get(args, 't'), 0);
if (s == NULL)
return (CMD_RETURN_ERROR); return (CMD_RETURN_ERROR);
env = &s->environ; env = &s->environ;
} }
@ -59,19 +105,11 @@ cmd_show_environment_exec(struct cmd *self, struct cmd_q *cmdq)
cmdq_error(cmdq, "unknown variable: %s", args->argv[0]); cmdq_error(cmdq, "unknown variable: %s", args->argv[0]);
return (CMD_RETURN_ERROR); return (CMD_RETURN_ERROR);
} }
if (envent->value != NULL) cmd_show_environment_print(self, cmdq, envent);
cmdq_print(cmdq, "%s=%s", envent->name, envent->value);
else
cmdq_print(cmdq, "-%s", envent->name);
return (CMD_RETURN_NORMAL); return (CMD_RETURN_NORMAL);
} }
RB_FOREACH(envent, environ, env) { RB_FOREACH(envent, environ, env)
if (envent->value != NULL) cmd_show_environment_print(self, cmdq, envent);
cmdq_print(cmdq, "%s=%s", envent->name, envent->value);
else
cmdq_print(cmdq, "-%s", envent->name);
}
return (CMD_RETURN_NORMAL); return (CMD_RETURN_NORMAL);
} }

View File

@ -712,6 +712,8 @@ format_defaults_client(struct format_tree *ft, struct client *c)
format_add(ft, "client_tty", "%s", c->tty.path); format_add(ft, "client_tty", "%s", c->tty.path);
if (c->tty.termname != NULL) if (c->tty.termname != NULL)
format_add(ft, "client_termname", "%s", c->tty.termname); 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; t = c->creation_time.tv_sec;
format_add(ft, "client_created", "%lld", (long long) t); format_add(ft, "client_created", "%lld", (long long) t);

View File

@ -801,10 +801,7 @@ input_reset(struct window_pane *wp)
{ {
struct input_ctx *ictx = wp->ictx; struct input_ctx *ictx = wp->ictx;
memcpy(&ictx->cell, &grid_default_cell, sizeof ictx->cell); input_reset_cell(ictx);
memcpy(&ictx->old_cell, &ictx->cell, sizeof ictx->old_cell);
ictx->old_cx = 0;
ictx->old_cy = 0;
if (wp->mode == NULL) if (wp->mode == NULL)
screen_write_start(&ictx->ctx, wp, &wp->base); screen_write_start(&ictx->ctx, wp, &wp->base);

View File

@ -795,6 +795,8 @@ screen_write_linefeed(struct screen_write_ctx *ctx, int wrapped)
gl = &s->grid->linedata[s->grid->hsize + s->cy]; gl = &s->grid->linedata[s->grid->hsize + s->cy];
if (wrapped) if (wrapped)
gl->flags |= GRID_LINE_WRAPPED; gl->flags |= GRID_LINE_WRAPPED;
else
gl->flags &= ~GRID_LINE_WRAPPED;
if (s->cy == s->rlower) if (s->cy == s->rlower)
grid_view_scroll_region_up(s->grid, s->rupper, s->rlower); grid_view_scroll_region_up(s->grid, s->rupper, s->rlower);

View File

@ -95,6 +95,8 @@ server_client_create(int fd)
environ_init(&c->environ); environ_init(&c->environ);
c->cwd = -1;
c->cmdq = cmdq_new(c); c->cmdq = cmdq_new(c);
c->cmdq->client_exit = 1; c->cmdq->client_exit = 1;
@ -1267,12 +1269,11 @@ server_client_msg_identify(struct client *c, struct imsg *imsg)
if (c->fd == -1) if (c->fd == -1)
return; return;
if (!isatty(c->fd)) { if (tty_init(&c->tty, c, c->fd, c->term) != 0) {
close(c->fd); close(c->fd);
c->fd = -1; c->fd = -1;
return; return;
} }
tty_init(&c->tty, c, c->fd, c->term);
if (c->flags & CLIENT_UTF8) if (c->flags & CLIENT_UTF8)
c->tty.flags |= TTY_UTF8; c->tty.flags |= TTY_UTF8;
if (c->flags & CLIENT_256COLOURS) if (c->flags & CLIENT_256COLOURS)

6
tmux.1
View File

@ -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_activity_string" Ta "" Ta "String time client last had activity"
.It Li "client_created" Ta "" Ta "Integer time client created" .It Li "client_created" Ta "" Ta "Integer time client created"
.It Li "client_created_string" Ta "" Ta "String 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_height" Ta "" Ta "Height of client"
.It Li "client_last_session" Ta "" Ta "Name of the client's last session" .It Li "client_last_session" Ta "" Ta "Name of the client's last session"
.It Li "client_pid" Ta "" Ta "PID of client process" .It Li "client_pid" Ta "" Ta "PID of client process"
@ -3547,7 +3548,7 @@ flag unsets a variable.
indicates the variable is to be removed from the environment before starting a indicates the variable is to be removed from the environment before starting a
new process. new process.
.It Xo Ic show-environment .It Xo Ic show-environment
.Op Fl g .Op Fl gs
.Op Fl t Ar target-session .Op Fl t Ar target-session
.Op Ar variable .Op Ar variable
.Xc .Xc
@ -3561,6 +3562,9 @@ If
is omitted, all variables are shown. is omitted, all variables are shown.
Variables removed from the environment are prefixed with Variables removed from the environment are prefixed with
.Ql - . .Ql - .
If
.Fl s
is used, the output is formatted as a set of Bourne shell commands.
.El .El
.Sh STATUS LINE .Sh STATUS LINE
.Nm .Nm

2
tmux.h
View File

@ -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_puts(struct tty *, const char *);
void tty_putc(struct tty *, u_char); void tty_putc(struct tty *, u_char);
void tty_putn(struct tty *, const void *, size_t, u_int); 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_resize(struct tty *);
int tty_set_size(struct tty *, u_int, u_int); int tty_set_size(struct tty *, u_int, u_int);
void tty_set_class(struct tty *, u_int); void tty_set_class(struct tty *, u_int);

9
tty.c
View File

@ -59,11 +59,14 @@ void tty_default_colours(struct grid_cell *, const struct window_pane *);
#define tty_pane_full_width(tty, ctx) \ #define tty_pane_full_width(tty, ctx) \
((ctx)->xoff == 0 && screen_size_x((ctx)->wp->screen) >= (tty)->sx) ((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) tty_init(struct tty *tty, struct client *c, int fd, char *term)
{ {
char *path; char *path;
if (!isatty(fd))
return (-1);
memset(tty, 0, sizeof *tty); memset(tty, 0, sizeof *tty);
tty->log_fd = -1; tty->log_fd = -1;
@ -75,13 +78,15 @@ tty_init(struct tty *tty, struct client *c, int fd, char *term)
tty->client = c; tty->client = c;
if ((path = ttyname(fd)) == NULL) if ((path = ttyname(fd)) == NULL)
fatalx("ttyname failed"); return (-1);
tty->path = xstrdup(path); tty->path = xstrdup(path);
tty->cstyle = 0; tty->cstyle = 0;
tty->ccolour = xstrdup(""); tty->ccolour = xstrdup("");
tty->flags = 0; tty->flags = 0;
tty->term_flags = 0; tty->term_flags = 0;
return (0);
} }
int int