Give each client a name. This defaults to the tty name as before but
authornicm <nicm@openbsd.org>
Wed, 5 Apr 2017 10:49:46 +0000 (10:49 +0000)
committernicm <nicm@openbsd.org>
Wed, 5 Apr 2017 10:49:46 +0000 (10:49 +0000)
falls back to an alternative if the tty name is not available. This is
clearer than overloading the client ttyname member and allows us to
remove the path stored in the tty struct, it should always be the same
as the client.

usr.bin/tmux/cmd-choose-client.c
usr.bin/tmux/cmd-find.c
usr.bin/tmux/cmd-list-clients.c
usr.bin/tmux/format.c
usr.bin/tmux/screen-redraw.c
usr.bin/tmux/server-client.c
usr.bin/tmux/tmux.1
usr.bin/tmux/tmux.h
usr.bin/tmux/tty.c

index 9d04581..ddef66c 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-choose-client.c,v 1.31 2016/10/16 19:04:05 nicm Exp $ */
+/* $OpenBSD: cmd-choose-client.c,v 1.32 2017/04/05 10:49:46 nicm Exp $ */
 
 /*
  * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -28,7 +28,7 @@
  */
 
 #define CHOOSE_CLIENT_TEMPLATE                                 \
-       "#{client_tty}: #{session_name} "                       \
+       "#{client_name}: #{session_name} "                      \
        "[#{client_width}x#{client_height} #{client_termname}]" \
        "#{?client_utf8, (utf8),}#{?client_readonly, (ro),} "   \
        "(last used #{t:client_activity})"
@@ -85,7 +85,7 @@ cmd_choose_client_exec(struct cmd *self, struct cmdq_item *item)
 
        cur = idx = 0;
        TAILQ_FOREACH(c1, &clients, entry) {
-               if (c1->session == NULL || c1->tty.path == NULL)
+               if (c1->session == NULL)
                        continue;
                if (c1 == item->client)
                        cur = idx;
@@ -97,7 +97,7 @@ cmd_choose_client_exec(struct cmd *self, struct cmdq_item *item)
                format_add(cdata->ft, "line", "%u", idx);
                format_defaults(cdata->ft, c1, NULL, NULL, NULL);
 
-               cdata->command = cmd_template_replace(action, c1->tty.path, 1);
+               cdata->command = cmd_template_replace(action, c1->name, 1);
 
                window_choose_add(wl->window->active, cdata);
 
index 28b131c..5842611 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-find.c,v 1.42 2017/03/13 10:53:32 nicm Exp $ */
+/* $OpenBSD: cmd-find.c,v 1.43 2017/04/05 10:49:46 nicm Exp $ */
 
 /*
  * Copyright (c) 2015 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -256,9 +256,9 @@ cmd_find_current_session_with_client(struct cmd_find_state *fs)
         * sessions to those containing that pane (we still use the current
         * window in the best session).
         */
-       if (fs->item != NULL && fs->item->client->tty.path != NULL) {
+       if (fs->item != NULL) {
                RB_FOREACH(wp, window_pane_tree, &all_window_panes) {
-                       if (strcmp(wp->tty, fs->item->client->tty.path) == 0)
+                       if (strcmp(wp->tty, fs->item->client->ttyname) == 0)
                                break;
                }
        } else
@@ -1248,7 +1248,6 @@ cmd_find_client(struct cmdq_item *item, const char *target, int quiet)
        struct client   *c;
        char            *copy;
        size_t           size;
-       const char      *path;
 
        /* A NULL argument means the current client. */
        if (item != NULL && target == NULL) {
@@ -1265,20 +1264,20 @@ cmd_find_client(struct cmdq_item *item, const char *target, int quiet)
        if (size != 0 && copy[size - 1] == ':')
                copy[size - 1] = '\0';
 
-       /* Check path of each client. */
+       /* Check name and path of each client. */
        TAILQ_FOREACH(c, &clients, entry) {
-               if (c->session == NULL || c->tty.path == NULL)
+               if (c->session == NULL)
                        continue;
-               path = c->tty.path;
-
-               /* Try for exact match. */
-               if (strcmp(copy, path) == 0)
+               if (strcmp(copy, c->name) == 0)
                        break;
 
-               /* Try without leading /dev. */
-               if (strncmp(path, _PATH_DEV, (sizeof _PATH_DEV) - 1) != 0)
+               if (*c->ttyname == '\0')
+                       continue;
+               if (strcmp(copy, c->ttyname) == 0)
+                       break;
+               if (strncmp(c->ttyname, _PATH_DEV, (sizeof _PATH_DEV) - 1) != 0)
                        continue;
-               if (strcmp(copy, path + (sizeof _PATH_DEV) - 1) == 0)
+               if (strcmp(copy, c->ttyname + (sizeof _PATH_DEV) - 1) == 0)
                        break;
        }
 
index 6e86373..4ad5f92 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-list-clients.c,v 1.31 2017/02/03 11:57:27 nicm Exp $ */
+/* $OpenBSD: cmd-list-clients.c,v 1.32 2017/04/05 10:49:46 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -29,7 +29,7 @@
  */
 
 #define LIST_CLIENTS_TEMPLATE                                  \
-       "#{client_tty}: #{session_name} "                       \
+       "#{client_name}: #{session_name} "                      \
        "[#{client_width}x#{client_height} #{client_termname}]" \
        "#{?client_utf8, (utf8),} #{?client_readonly, (ro),}"
 
index 1924053..17873f0 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: format.c,v 1.123 2017/03/08 13:36:12 nicm Exp $ */
+/* $OpenBSD: format.c,v 1.124 2017/04/05 10:49:46 nicm Exp $ */
 
 /*
  * Copyright (c) 2011 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1139,11 +1139,11 @@ format_defaults_client(struct format_tree *ft, struct client *c)
        if (ft->s == NULL)
                ft->s = c->session;
 
+       format_add(ft, "client_name", "%s", c->name);
        format_add(ft, "client_pid", "%ld", (long) c->pid);
        format_add(ft, "client_height", "%u", tty->sy);
        format_add(ft, "client_width", "%u", tty->sx);
-       if (tty->path != NULL)
-               format_add(ft, "client_tty", "%s", tty->path);
+       format_add(ft, "client_tty", "%s", c->ttyname);
        format_add(ft, "client_control_mode", "%d",
                !!(c->flags & CLIENT_CONTROL));
 
index e7fd2f0..a86e043 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: screen-redraw.c,v 1.44 2017/02/08 15:41:41 nicm Exp $ */
+/* $OpenBSD: screen-redraw.c,v 1.45 2017/04/05 10:49:46 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -423,7 +423,7 @@ screen_redraw_pane(struct client *c, struct window_pane *wp)
        if (status_at_line(c) == 0)
                yoff++;
 
-       log_debug("%s: redraw pane %%%u (at %u,%u)", c->tty.path, wp->id,
+       log_debug("%s: redraw pane %%%u (at %u,%u)", c->name, wp->id,
            wp->xoff, yoff);
 
        for (i = 0; i < wp->sy; i++)
index 10f268a..a06035c 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: server-client.c,v 1.215 2017/03/09 22:00:46 nicm Exp $ */
+/* $OpenBSD: server-client.c,v 1.216 2017/04/05 10:49:46 nicm Exp $ */
 
 /*
  * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -99,15 +99,12 @@ 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)
+               if (strcmp(wp->tty, c->ttyname) == 0)
                        return (1);
        }
        return (0);
@@ -322,8 +319,10 @@ server_client_free(__unused int fd, __unused short events, void *arg)
        if (!TAILQ_EMPTY(&c->queue))
                fatalx("queue not empty");
 
-       if (c->references == 0)
+       if (c->references == 0) {
+               free((void *)c->name);
                free(c);
+       }
 }
 
 /* Detach a client. */
@@ -1470,6 +1469,7 @@ server_client_dispatch_identify(struct client *c, struct imsg *imsg)
        const char      *data, *home;
        size_t           datalen;
        int              flags;
+       char            *name;
 
        if (c->flags & CLIENT_IDENTIFIED)
                fatalx("out-of-order identify message");
@@ -1535,6 +1535,13 @@ server_client_dispatch_identify(struct client *c, struct imsg *imsg)
                return;
        c->flags |= CLIENT_IDENTIFIED;
 
+       if (*c->ttyname != '\0')
+               name = xstrdup(c->ttyname);
+       else
+               xasprintf(&name, "client-%ld", (long)c->pid);
+       c->name = name;
+       log_debug("client %p name is %s", c, c->name);
+
        if (c->flags & CLIENT_CONTROL) {
                c->stdin_callback = control_callback;
 
@@ -1685,7 +1692,7 @@ server_client_add_message(struct client *c, const char *fmt, ...)
        xvasprintf(&s, fmt, ap);
        va_end(ap);
 
-       log_debug("%s: message %s", c->tty.path, s);
+       log_debug("message %s (client %p)", s, c);
 
        msg = xcalloc(1, sizeof *msg);
        msg->msg_time = time(NULL);
index b070730..ec8ad6e 100644 (file)
@@ -1,4 +1,4 @@
-.\" $OpenBSD: tmux.1,v 1.539 2017/03/22 07:16:54 nicm Exp $
+.\" $OpenBSD: tmux.1,v 1.540 2017/04/05 10:49:46 nicm Exp $
 .\"
 .\" Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
 .\"
@@ -14,7 +14,7 @@
 .\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
 .\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: March 22 2017 $
+.Dd $Mdocdate: April 5 2017 $
 .Dt TMUX 1
 .Os
 .Sh NAME
@@ -367,7 +367,8 @@ or
 These specify the client, session, window or pane which a command should affect.
 .Pp
 .Ar target-client
-should be the name of the
+should be the name of the client,
+typically the
 .Xr pty 4
 file to which the client is connected, for example either of
 .Pa /dev/ttyp1
@@ -3510,6 +3511,7 @@ The following variables are available, where appropriate:
 .It Li "client_height" Ta "" Ta "Height of client"
 .It Li "client_key_table" Ta "" Ta "Current key table"
 .It Li "client_last_session" Ta "" Ta "Name of the client's last session"
+.It Li "client_name" Ta "" Ta "Name of client"
 .It Li "client_pid" Ta "" Ta "PID of client process"
 .It Li "client_prefix" Ta "" Ta "1 if prefix key has been pressed"
 .It Li "client_readonly" Ta "" Ta "1 if client is readonly"
index f871e09..83121ec 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.733 2017/03/22 07:16:54 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.734 2017/04/05 10:49:46 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1021,7 +1021,6 @@ LIST_HEAD(tty_terms, tty_term);
 
 struct tty {
        struct client   *client;
-       char            *path;
 
        u_int            sx;
        u_int            sy;
@@ -1285,6 +1284,7 @@ struct cmd_entry {
 
 /* Client connection. */
 struct client {
+       const char      *name;
        struct tmuxpeer *peer;
        struct cmdq_list queue;
 
index e87052f..dc50a8c 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tty.c,v 1.257 2017/04/05 10:45:20 nicm Exp $ */
+/* $OpenBSD: tty.c,v 1.258 2017/04/05 10:49:46 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -94,8 +94,6 @@ tty_create_log(void)
 int
 tty_init(struct tty *tty, struct client *c, int fd, char *term)
 {
-       char    *path;
-
        if (!isatty(fd))
                return (-1);
 
@@ -105,12 +103,10 @@ tty_init(struct tty *tty, struct client *c, int fd, char *term)
                tty->term_name = xstrdup("unknown");
        else
                tty->term_name = xstrdup(term);
+
        tty->fd = fd;
        tty->client = c;
 
-       if ((path = ttyname(fd)) == NULL)
-               return (-1);
-       tty->path = xstrdup(path);
        tty->cstyle = 0;
        tty->ccolour = xstrdup("");
 
@@ -125,8 +121,9 @@ tty_init(struct tty *tty, struct client *c, int fd, char *term)
 int
 tty_resize(struct tty *tty)
 {
-       struct winsize  ws;
-       u_int           sx, sy;
+       struct client   *c = tty->client;
+       struct winsize   ws;
+       u_int            sx, sy;
 
        if (ioctl(tty->fd, TIOCGWINSZ, &ws) != -1) {
                sx = ws.ws_col;
@@ -139,7 +136,8 @@ tty_resize(struct tty *tty)
                sx = 80;
                sy = 24;
        }
-       log_debug("%s: %s now %ux%u", __func__, tty->path, sx, sy);
+       log_debug("%s: %s now %ux%u", __func__, c->name, sx, sy);
+
        if (!tty_set_size(tty, sx, sy))
                return (0);
        tty_invalidate(tty);
@@ -160,13 +158,14 @@ static void
 tty_read_callback(__unused int fd, __unused short events, void *data)
 {
        struct tty      *tty = data;
+       struct client   *c = tty->client;
        size_t           size = EVBUFFER_LENGTH(tty->in);
        int              nread;
 
        nread = evbuffer_read(tty->in, tty->fd, -1);
        if (nread == -1)
                return;
-       log_debug("%s: read %d bytes (already %zu)", tty->path, nread, size);
+       log_debug("%s: read %d bytes (already %zu)", c->name, nread, size);
 
        while (tty_keys_next(tty))
                ;
@@ -176,13 +175,14 @@ static void
 tty_write_callback(__unused int fd, __unused short events, void *data)
 {
        struct tty      *tty = data;
+       struct client   *c = tty->client;
        size_t           size = EVBUFFER_LENGTH(tty->out);
        int              nwrite;
 
        nwrite = evbuffer_write(tty->out, tty->fd);
        if (nwrite == -1)
                return;
-       log_debug("%s: wrote %d bytes (of %zu)", tty->path, nwrite, size);
+       log_debug("%s: wrote %d bytes (of %zu)", c->name, nwrite, size);
 
        if (EVBUFFER_LENGTH(tty->out) != 0)
                event_add(&tty->event_out, NULL);
@@ -351,7 +351,6 @@ tty_free(struct tty *tty)
        tty_close(tty);
 
        free(tty->ccolour);
-       free(tty->path);
        free(tty->term_name);
 }
 
@@ -424,8 +423,10 @@ tty_putcode_ptr2(struct tty *tty, enum tty_code_code code, const void *a,
 static void
 tty_add(struct tty *tty, const char *buf, size_t len)
 {
+       struct client   *c = tty->client;
+
        evbuffer_add(tty->out, buf, len);
-       log_debug("%s: %.*s", tty->path, (int)len, (const char *)buf);
+       log_debug("%s: %.*s", c->name, (int)len, (const char *)buf);
 
        if (tty_log_fd != -1)
                write(tty_log_fd, buf, len);