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 [<not executed on terminal>]

if stdout is not terminal.

Addresses: https://github.com/karelzak/util-linux/issues/583
Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2018-05-14 12:51:50 +02:00
parent c068922a68
commit 4d9b788d64
4 changed files with 41 additions and 11 deletions

View File

@ -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=<command-exit-code>] to the "done" typescript message
- think about optional "event" records in timing file to save information

View File

@ -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);

View File

@ -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 <stdlib.h>

View File

@ -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, _("<not executed on terminal>"));
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) {