Give each client a name. This defaults to the tty name as before but

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.
This commit is contained in:
nicm
2017-04-05 10:49:46 +00:00
parent ab4a4b2ad0
commit 9b28200578
9 changed files with 61 additions and 47 deletions

46
tty.c
View File

@ -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);
@ -602,8 +603,17 @@ tty_emulate_repeat(struct tty *tty, enum tty_code_code code,
static void
tty_repeat_space(struct tty *tty, u_int n)
{
while (n-- > 0)
tty_putc(tty, ' ');
static char s[500];
if (*s != ' ')
memset(s, ' ', sizeof s);
while (n > sizeof s) {
tty_putn(tty, s, sizeof s, sizeof s);
n -= sizeof s;
}
if (n != 0)
tty_putn(tty, s, n, n);
}
/*
@ -856,8 +866,6 @@ tty_cmd_deletecharacter(struct tty *tty, const struct tty_ctx *ctx)
void
tty_cmd_clearcharacter(struct tty *tty, const struct tty_ctx *ctx)
{
u_int i;
tty_attributes(tty, &grid_default_cell, ctx->wp);
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
@ -865,10 +873,8 @@ tty_cmd_clearcharacter(struct tty *tty, const struct tty_ctx *ctx)
if (tty_term_has(tty->term, TTYC_ECH) &&
!tty_fake_bce(tty, ctx->wp, ctx->bg))
tty_putcode1(tty, TTYC_ECH, ctx->num);
else {
for (i = 0; i < ctx->num; i++)
tty_putc(tty, ' ');
}
else
tty_repeat_space(tty, ctx->num);
}
void