X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-terminal%2Fsubterm.c;h=63cd2a5ad689d6ee07f3ddc6011e3f8a7c51f9a9;hb=a9944163fe5600bce85898dae78cd68442a6ff7c;hp=321cd35f528b5fe1a496fbb9c6d15610831ef759;hpb=cad8fe9a2b2ac340ef69233dd32e1bb1e45dae48;p=elogind.git diff --git a/src/libsystemd-terminal/subterm.c b/src/libsystemd-terminal/subterm.c index 321cd35f5..63cd2a5ad 100644 --- a/src/libsystemd-terminal/subterm.c +++ b/src/libsystemd-terminal/subterm.c @@ -41,6 +41,7 @@ #include "sd-event.h" #include "term-internal.h" #include "util.h" +#include "utf8.h" typedef struct Output Output; typedef struct Terminal Terminal; @@ -102,10 +103,8 @@ static int output_winch(Output *o) { assert_return(o, -EINVAL); r = ioctl(o->fd, TIOCGWINSZ, &wsz); - if (r < 0) { - log_error("error: cannot read window-size: %m"); - return -errno; - } + if (r < 0) + return log_error_errno(errno, "error: cannot read window-size: %m"); if (wsz.ws_col != o->width || wsz.ws_row != o->height) { o->width = wsz.ws_col; @@ -119,16 +118,14 @@ static int output_winch(Output *o) { } static int output_flush(Output *o) { - ssize_t len; + int r; if (o->n_obuf < 1) return 0; - len = loop_write(o->fd, o->obuf, o->n_obuf, false); - if (len < 0) { - log_error("error: cannot write to TTY (%zd): %s", len, strerror(-len)); - return len; - } + r = loop_write(o->fd, o->obuf, o->n_obuf, false); + if (r < 0) + return log_error_errno(r, "error: cannot write to TTY: %m"); o->n_obuf = 0; @@ -156,26 +153,22 @@ static int output_write(Output *o, const void *buf, size_t size) { return r; len = loop_write(o->fd, buf, size, false); - if (len < 0) { - log_error("error: cannot write to TTY (%zd): %s", len, strerror(-len)); - return len; - } + if (len < 0) + return log_error_errno(len, "error: cannot write to TTY (%zd): %m", len); return 0; } _printf_(3,0) static int output_vnprintf(Output *o, size_t max, const char *format, va_list args) { - char buf[4096]; + char buf[max]; int r; assert_return(o, -EINVAL); assert_return(format, -EINVAL); - assert_return(max <= sizeof(buf), -EINVAL); + assert_return(max <= 4096, -EINVAL); - r = vsnprintf(buf, max, format, args); - if (r > (ssize_t)max) - r = max; + r = MIN(vsnprintf(buf, max, format, args), (int) max); return output_write(o, buf, r); } @@ -428,10 +421,7 @@ static int output_draw_cell_fn(term_screen *screen, output_printf(o, "\e[38;2;%u;%u;%um", attr->fg.red, attr->fg.green, attr->fg.blue); break; case TERM_CCODE_BLACK ... TERM_CCODE_WHITE: - if (attr->bold) - output_printf(o, "\e[%um", attr->fg.ccode - TERM_CCODE_BLACK + 90); - else - output_printf(o, "\e[%um", attr->fg.ccode - TERM_CCODE_BLACK + 30); + output_printf(o, "\e[%um", attr->fg.ccode - TERM_CCODE_BLACK + 30); break; case TERM_CCODE_LIGHT_BLACK ... TERM_CCODE_LIGHT_WHITE: output_printf(o, "\e[%um", attr->fg.ccode - TERM_CCODE_LIGHT_BLACK + 90); @@ -468,7 +458,7 @@ static int output_draw_cell_fn(term_screen *screen, output_printf(o, " "); } else { for (k = 0; k < n_ch; ++k) { - ulen = term_utf8_encode(utf8, ch[k]); + ulen = utf8_encode_unichar(utf8, ch[k]); output_write(o, utf8, ulen); } } @@ -482,7 +472,6 @@ static void output_draw_screen(Output *o, term_screen *s) { term_screen_draw(s, output_draw_cell_fn, o, NULL); - output_move_to(o, s->cursor_x + 1, s->cursor_y + 3); output_printf(o, "\e[m"); } @@ -616,12 +605,12 @@ static int terminal_winch_fn(sd_event_source *source, const struct signalfd_sigi if (t->pty) { r = pty_resize(t->pty, t->output->in_width, t->output->in_height); if (r < 0) - log_error("error: pty_resize() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: pty_resize() (%d): %m", r); } r = term_screen_resize(t->screen, t->output->in_width, t->output->in_height); if (r < 0) - log_error("error: term_screen_resize() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: term_screen_resize() (%d): %m", r); terminal_dirty(t); @@ -635,7 +624,7 @@ static int terminal_push_tmp(Terminal *t, uint32_t ucs4) { assert(t); - len = term_utf8_encode(buf, ucs4); + len = utf8_encode_unichar(buf, ucs4); if (len < 1) return 0; @@ -660,10 +649,8 @@ static int terminal_write_tmp(Terminal *t) { if (t->pty) { for (i = 0; i < num; ++i) { r = pty_write(t->pty, vec[i].iov_base, vec[i].iov_len); - if (r < 0) { - log_error("error: cannot write to PTY (%d): %s", r, strerror(-r)); - return r; - } + if (r < 0) + return log_error_errno(r, "error: cannot write to PTY (%d): %m", r); } } @@ -717,7 +704,7 @@ static int terminal_io_fn(sd_event_source *source, int fd, uint32_t revents, voi if (errno == EAGAIN || errno == EINTR) return 0; - log_error("error: cannot read from TTY (%d): %m", -errno); + log_error_errno(errno, "error: cannot read from TTY (%d): %m", -errno); return -errno; } @@ -729,10 +716,8 @@ static int terminal_io_fn(sd_event_source *source, int fd, uint32_t revents, voi n_str = term_utf8_decode(&t->utf8, &str, buf[i]); for (j = 0; j < n_str; ++j) { type = term_parser_feed(t->parser, &seq, str[j]); - if (type < 0) { - log_error("error: term_parser_feed() (%d): %s", type, strerror(-type)); - return type; - } + if (type < 0) + return log_error_errno(type, "error: term_parser_feed() (%d): %m", type); if (!t->is_menu) { r = terminal_push_tmp(t, str[j]); @@ -781,10 +766,8 @@ static int terminal_pty_fn(Pty *pty, void *userdata, unsigned int event, const v break; case PTY_DATA: r = term_screen_feed_text(t->screen, ptr, size); - if (r < 0) { - log_error("error: term_screen_feed_text() (%d): %s", r, strerror(-r)); - return r; - } + if (r < 0) + return log_error_errno(r, "error: term_screen_feed_text() (%d): %m", r); terminal_dirty(t); break; @@ -836,16 +819,12 @@ static int terminal_new(Terminal **out, int in_fd, int out_fd) { assert_return(out, -EINVAL); r = tcgetattr(in_fd, &in_attr); - if (r < 0) { - log_error("error: tcgetattr() (%d): %m", -errno); - return -errno; - } + if (r < 0) + return log_error_errno(errno, "error: tcgetattr() (%d): %m", -errno); r = tcgetattr(out_fd, &out_attr); - if (r < 0) { - log_error("error: tcgetattr() (%d): %m", -errno); - return -errno; - } + if (r < 0) + return log_error_errno(errno, "error: tcgetattr() (%d): %m", -errno); t = new0(Terminal, 1); if (!t) @@ -861,49 +840,49 @@ static int terminal_new(Terminal **out, int in_fd, int out_fd) { r = tcsetattr(t->in_fd, TCSANOW, &in_attr); if (r < 0) { - log_error("error: tcsetattr() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: tcsetattr() (%d): %m", r); goto error; } r = tcsetattr(t->out_fd, TCSANOW, &out_attr); if (r < 0) { - log_error("error: tcsetattr() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: tcsetattr() (%d): %m", r); goto error; } r = sd_event_default(&t->event); if (r < 0) { - log_error("error: sd_event_default() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: sd_event_default() (%d): %m", r); goto error; } r = sigprocmask_many(SIG_BLOCK, SIGINT, SIGQUIT, SIGTERM, SIGWINCH, SIGCHLD, -1); if (r < 0) { - log_error("error: sigprocmask_many() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: sigprocmask_many() (%d): %m", r); goto error; } r = sd_event_add_signal(t->event, NULL, SIGINT, NULL, NULL); if (r < 0) { - log_error("error: sd_event_add_signal() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: sd_event_add_signal() (%d): %m", r); goto error; } r = sd_event_add_signal(t->event, NULL, SIGQUIT, NULL, NULL); if (r < 0) { - log_error("error: sd_event_add_signal() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: sd_event_add_signal() (%d): %m", r); goto error; } r = sd_event_add_signal(t->event, NULL, SIGTERM, NULL, NULL); if (r < 0) { - log_error("error: sd_event_add_signal() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: sd_event_add_signal() (%d): %m", r); goto error; } r = sd_event_add_signal(t->event, NULL, SIGWINCH, terminal_winch_fn, t); if (r < 0) { - log_error("error: sd_event_add_signal() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: sd_event_add_signal() (%d): %m", r); goto error; } @@ -911,7 +890,7 @@ static int terminal_new(Terminal **out, int in_fd, int out_fd) { t->is_dirty = true; r = sd_event_add_time(t->event, &t->frame_timer, CLOCK_MONOTONIC, 0, 0, terminal_frame_timer_fn, t); if (r < 0) { - log_error("error: sd_event_add_time() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: sd_event_add_time() (%d): %m", r); goto error; } @@ -933,7 +912,7 @@ static int terminal_new(Terminal **out, int in_fd, int out_fd) { r = term_screen_resize(t->screen, t->output->in_width, t->output->in_height); if (r < 0) { - log_error("error: term_screen_resize() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: term_screen_resize() (%d): %m", r); goto error; } @@ -955,10 +934,9 @@ static int terminal_run(Terminal *t) { assert_return(t, -EINVAL); pid = pty_fork(&t->pty, t->event, terminal_pty_fn, t, t->output->in_width, t->output->in_height); - if (pid < 0) { - log_error("error: cannot fork PTY (%d): %s", pid, strerror(-pid)); - return pid; - } else if (pid == 0) { + if (pid < 0) + return log_error_errno(pid, "error: cannot fork PTY (%d): %m", pid); + else if (pid == 0) { /* child */ char **argv = (char*[]){ @@ -970,7 +948,7 @@ static int terminal_run(Terminal *t) { setenv("COLORTERM", "systemd-subterm", 1); execve(argv[0], argv, environ); - log_error("error: cannot exec %s (%d): %m", argv[0], -errno); + log_error_errno(errno, "error: cannot exec %s (%d): %m", argv[0], -errno); _exit(1); } @@ -997,7 +975,7 @@ int main(int argc, char *argv[]) { out: if (r < 0) - log_error("error: terminal failed (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: terminal failed (%d): %m", r); terminal_free(t); return -r; }