aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Marriott <nicholas.marriott@gmail.com>2015-07-14 08:15:05 +0100
committerNicholas Marriott <nicholas.marriott@gmail.com>2015-07-14 08:15:05 +0100
commit5ffb869e1a543b264b9d94a19077d16f9832aff5 (patch)
tree59392329b2b678d46667e0960efa9e2c7dfb202a
parentbed3069fd746741286e624126774f98ed51fbbdf (diff)
parentdcc28434f460f637976ca313e062c0728d438e97 (diff)
downloadrtmux-5ffb869e1a543b264b9d94a19077d16f9832aff5.tar.gz
rtmux-5ffb869e1a543b264b9d94a19077d16f9832aff5.tar.bz2
rtmux-5ffb869e1a543b264b9d94a19077d16f9832aff5.zip
Merge branch 'master' of github.com:tmux/tmux
-rw-r--r--client.c8
-rw-r--r--cmd-show-environment.c68
-rw-r--r--format.c2
-rw-r--r--input.c5
-rw-r--r--screen-write.c2
-rw-r--r--server-client.c5
-rw-r--r--tmux.16
-rw-r--r--tmux.h2
-rw-r--r--tty.c9
9 files changed, 80 insertions, 27 deletions
diff --git a/client.c b/client.c
index 9c493dfa..9a5ae455 100644
--- a/client.c
+++ b/client.c
@@ -354,6 +354,7 @@ client_send_identify(int flags)
{
const char *s;
char **ss;
+ size_t sslen;
int fd;
pid_t pid;
@@ -378,8 +379,11 @@ client_send_identify(int flags)
pid = getpid();
client_write_one(MSG_IDENTIFY_CLIENTPID, -1, &pid, sizeof pid);
- for (ss = environ; *ss != NULL; ss++)
- client_write_one(MSG_IDENTIFY_ENVIRON, -1, *ss, strlen(*ss) + 1);
+ for (ss = environ; *ss != NULL; ss++) {
+ 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);
diff --git a/cmd-show-environment.c b/cmd-show-environment.c
index 7737752f..a61cf3f4 100644
--- a/cmd-show-environment.c
+++ b/cmd-show-environment.c
@@ -27,16 +27,61 @@
* 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 = {
"show-environment", "showenv",
- "gt:", 0, 1,
- "[-g] " CMD_TARGET_SESSION_USAGE " [name]",
+ "gst:", 0, 1,
+ "[-gs] " CMD_TARGET_SESSION_USAGE " [name]",
0,
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
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'))
env = &global_environ;
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);
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]);
return (CMD_RETURN_ERROR);
}
- if (envent->value != NULL)
- cmdq_print(cmdq, "%s=%s", envent->name, envent->value);
- else
- cmdq_print(cmdq, "-%s", envent->name);
+ cmd_show_environment_print(self, cmdq, envent);
return (CMD_RETURN_NORMAL);
}
- RB_FOREACH(envent, environ, env) {
- if (envent->value != NULL)
- cmdq_print(cmdq, "%s=%s", envent->name, envent->value);
- else
- cmdq_print(cmdq, "-%s", envent->name);
- }
-
+ RB_FOREACH(envent, environ, env)
+ cmd_show_environment_print(self, cmdq, envent);
return (CMD_RETURN_NORMAL);
}
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/input.c b/input.c
index d1ff17fe..095816c3 100644
--- a/input.c
+++ b/input.c
@@ -801,10 +801,7 @@ input_reset(struct window_pane *wp)
{
struct input_ctx *ictx = wp->ictx;
- memcpy(&ictx->cell, &grid_default_cell, sizeof ictx->cell);
- memcpy(&ictx->old_cell, &ictx->cell, sizeof ictx->old_cell);
- ictx->old_cx = 0;
- ictx->old_cy = 0;
+ input_reset_cell(ictx);
if (wp->mode == NULL)
screen_write_start(&ictx->ctx, wp, &wp->base);
diff --git a/screen-write.c b/screen-write.c
index e38c9f53..37e2b548 100644
--- a/screen-write.c
+++ b/screen-write.c
@@ -795,6 +795,8 @@ screen_write_linefeed(struct screen_write_ctx *ctx, int wrapped)
gl = &s->grid->linedata[s->grid->hsize + s->cy];
if (wrapped)
gl->flags |= GRID_LINE_WRAPPED;
+ else
+ gl->flags &= ~GRID_LINE_WRAPPED;
if (s->cy == s->rlower)
grid_view_scroll_region_up(s->grid, s->rupper, s->rlower);
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 20754551..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"
@@ -3547,7 +3548,7 @@ flag unsets a variable.
indicates the variable is to be removed from the environment before starting a
new process.
.It Xo Ic show-environment
-.Op Fl g
+.Op Fl gs
.Op Fl t Ar target-session
.Op Ar variable
.Xc
@@ -3561,6 +3562,9 @@ If
is omitted, all variables are shown.
Variables removed from the environment are prefixed with
.Ql - .
+If
+.Fl s
+is used, the output is formatted as a set of Bourne shell commands.
.El
.Sh STATUS LINE
.Nm
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