script: add --log-in

Let's allow to log input independently on output. So it's possible to

 script --log-in infile		          : logs only input
 script --log-out outfile	          : logs only output
 script --log-out outfile --log-in infile : logs both to separated files

Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2019-04-12 14:14:55 +02:00
parent fc58044f79
commit 70062aad13
2 changed files with 37 additions and 16 deletions

View File

@ -87,9 +87,17 @@ being done using `cat foo'.
Allow the default output destination, i.e. the typescript file, to be a hard
or symbolic link. The command will follow a symbolic link.
.TP
\fB\-I\fR, \fB\-\-log\-in\fR \fIfile\fR
Log input to the \fIfile\fR. The log output is disabled if only \fB\-\-log\-in\fR
specified.
.sp
Use this logging functionality carefully as it logs all input, including input
when terminal has disabled echo flag (for example it log passwords in the input).
.TP
\fB\-O\fR, \fB\-\-log\-out\fR \fIfile\fR
Log output to the \fIfile\fR. The default is to log the file with name 'typescript'
if the option is not given.
Log output to the \fIfile\fR. The default is to log output to the file with
name 'typescript' if the option \fB\-\-log\-out\fR or \fB\-\-log\-in\fR is not
given. The log output is disabled if only \fB\-\-log\-in\fR specified.
.TP
\fB\-T\fR, \fB\-\-log\-timing\fR \fIfile\fR
Log timing information to the \fIfile\fR.

View File

@ -189,6 +189,7 @@ static void __attribute__((__noreturn__)) usage(void)
fputs(_("Make a typescript of a terminal session.\n"), out);
fputs(USAGE_OPTIONS, out);
fputs(_(" -I, --log-in <file> log stdin to file\n"), out);
fputs(_(" -O, --log-out <file> log stdout to file (default)\n"), out);
fputs(_(" -T, --log-timing <file> log timing information to file\n"), out);
fputs(_(" -a, --append append the output\n"), out);
@ -887,7 +888,7 @@ int main(int argc, char **argv)
.poll_timeout = -1
};
int ch;
const char *typescript = DEFAULT_TYPESCRIPT_FILENAME;
const char *outfile = NULL, *infile = NULL;
const char *timingfile = NULL;
enum { FORCE_OPTION = CHAR_MAX + 1 };
@ -898,6 +899,7 @@ int main(int argc, char **argv)
{"return", no_argument, NULL, 'e'},
{"flush", no_argument, NULL, 'f'},
{"force", no_argument, NULL, FORCE_OPTION,},
{"log-in", required_argument, NULL, 'I'},
{"log-out", required_argument, NULL, 'O'},
{"log-timing", required_argument, NULL, 'T'},
{"output-limit", required_argument, NULL, 'o'},
@ -927,7 +929,7 @@ int main(int argc, char **argv)
script_init_debug();
while ((ch = getopt_long(argc, argv, "ac:efO:o:qT:t::Vh", longopts, NULL)) != -1) {
while ((ch = getopt_long(argc, argv, "ac:efI:O:o:qT:t::Vh", longopts, NULL)) != -1) {
err_exclusive_options(ch, longopts, excl, excl_st);
@ -947,8 +949,13 @@ int main(int argc, char **argv)
case FORCE_OPTION:
ctl.force = 1;
break;
case 'I':
log_associate(&ctl, &ctl.in, optarg, SCRIPT_FMT_RAW);
infile = optarg;
break;
case 'O':
typescript = optarg;
log_associate(&ctl, &ctl.out, optarg, SCRIPT_FMT_RAW);
outfile = optarg;
break;
case 'o':
ctl.maxsz = strtosize_or_err(optarg, _("failed to parse output limit size"));
@ -980,15 +987,18 @@ int main(int argc, char **argv)
argc -= optind;
argv += optind;
if (!typescript) {
/* default if no --log-* specified */
if (!outfile && !infile) {
if (argc > 0)
typescript = argv[0];
else
outfile = argv[0];
else {
die_if_link(&ctl, DEFAULT_TYPESCRIPT_FILENAME);
}
outfile = DEFAULT_TYPESCRIPT_FILENAME;
}
/* associate stdout with typescript file */
log_associate(&ctl, &ctl.out, typescript, SCRIPT_FMT_RAW);
/* associate stdout with typescript file */
log_associate(&ctl, &ctl.out, outfile, SCRIPT_FMT_RAW);
}
ctl.shell = getenv("SHELL");
if (ctl.shell == NULL)
@ -996,11 +1006,14 @@ int main(int argc, char **argv)
getmaster(&ctl);
if (!ctl.quiet) {
if (!timingfile)
printf(_("Script started, log file is '%s'.\n"), typescript);
else
printf(_("Script started, log file is '%s', timing file is '%s'.\n"),
typescript, timingfile);
printf(_("Script started"));
if (outfile)
printf(_(", output log file is '%s'"), outfile);
if (infile)
printf(_(", input log file is '%s'"), infile);
if (timingfile)
printf(_(", timing file is '%s'"), timingfile);
printf(_(".\n"));
}
enable_rawmode_tty(&ctl);