From 4d9b788d64c8f9de8cb28e541d53676f26386f3a Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Mon, 14 May 2018 12:51:50 +0200 Subject: script: add more info to script header This patch introduces [...] to store extra information about terminal to the typescript header. For example: Script started on 2018-05-14 12:52:32+02:00 [TERM="xterm-256color" TTY="/dev/pts/3" COLS="190" LINES="53"] or Script started on 2018-05-14 12:54:01+02:00 [] if stdout is not terminal. Addresses: https://github.com/karelzak/util-linux/issues/583 Signed-off-by: Karel Zak --- Documentation/TODO | 6 ------ include/ttyutils.h | 1 + lib/ttyutils.c | 7 +++++++ term-utils/script.c | 38 +++++++++++++++++++++++++++++++++----- 4 files changed, 41 insertions(+), 11 deletions(-) diff --git a/Documentation/TODO b/Documentation/TODO index 2153a810c..4dbc288c9 100644 --- a/Documentation/TODO +++ b/Documentation/TODO @@ -15,12 +15,6 @@ column script ------ - - (!) add terminal type ($TERM), columns and lines to the header line, something like: - - Script started on 2018-03-05 13:02:08+0100 [term="xterm-256color", lines=53, columns=190] - - see https://github.com/karelzak/util-linux/issues/583 - - (!) add [exit=] to the "done" typescript message - think about optional "event" records in timing file to save information diff --git a/include/ttyutils.h b/include/ttyutils.h index a9baab34b..b3ed4faf1 100644 --- a/include/ttyutils.h +++ b/include/ttyutils.h @@ -52,6 +52,7 @@ struct chardata { extern int get_terminal_dimension(int *cols, int *lines); extern int get_terminal_width(int default_width); +extern int get_terminal_type(const char **type); extern int get_terminal_name(const char **path, const char **name, const char **number); diff --git a/lib/ttyutils.c b/lib/ttyutils.c index 6a1e0e0f3..00a7903ca 100644 --- a/lib/ttyutils.c +++ b/lib/ttyutils.c @@ -113,6 +113,13 @@ int get_terminal_name(const char **path, return 0; } +int get_terminal_type(const char **type) +{ + *type = getenv("TERM"); + if (*type) + return -EINVAL; + return 0; +} #ifdef TEST_PROGRAM_TTYUTILS # include diff --git a/term-utils/script.c b/term-utils/script.c index 20c35d955..b7bec7e76 100644 --- a/term-utils/script.c +++ b/term-utils/script.c @@ -182,6 +182,36 @@ static void __attribute__((__noreturn__)) usage(void) exit(EXIT_SUCCESS); } +static void typescript_message_start(const struct script_control *ctl, time_t *tvec) +{ + char buf[FORMAT_TIMESTAMP_MAX]; + int cols = 0, lines = 0; + const char *tty = NULL, *term = NULL; + + if (!ctl->typescriptfp) + return; + + strtime_iso(tvec, ISO_TIMESTAMP, buf, sizeof(buf)); + + fprintf(ctl->typescriptfp, _("Script started on %s ["), buf); + + if (ctl->isterm) { + get_terminal_dimension(&cols, &lines); + get_terminal_name(&tty, NULL, NULL); + get_terminal_type(&term); + + if (term) + fprintf(ctl->typescriptfp, "TERM=\"%s\" ", term); + if (tty) + fprintf(ctl->typescriptfp, "TTY=\"%s\" ", tty); + + fprintf(ctl->typescriptfp, "COLS=\"%d\" LINES=\"%d\"", cols, lines); + } else + fprintf(ctl->typescriptfp, _("")); + + fputs("]\n", ctl->typescriptfp); +} + static void die_if_link(const struct script_control *ctl) { struct stat s; @@ -496,11 +526,9 @@ static void do_io(struct script_control *ctl) } - if (ctl->typescriptfp) { - char buf[FORMAT_TIMESTAMP_MAX]; - strtime_iso(&tvec, ISO_TIMESTAMP, buf, sizeof(buf)); - fprintf(ctl->typescriptfp, _("Script started on %s\n"), buf); - } + if (ctl->typescriptfp) + typescript_message_start(ctl, &tvec); + gettime_monotonic(&ctl->oldtime); while (!ctl->die) { -- cgit v1.2.3-55-g7522