script: ensure typescript and timing errors do not break terminal
Earlier when typescript file failed new line after the error did not cause carriage return. Here is an example how prompt> travels to wrong place: prompt> script 0500-perms/typescript Script started, file is 0500-perms/typescript script: cannot open 0500-perms/typescript: Permission denied prompt> But that wasn't quite as bad as what happen with timing file, that at failure left terminal to state where a reset(1) run was needed. [kzak@redhat.com: - move code to restore_tty()] Signed-off-by: Sami Kerola <kerolasa@iki.fi> Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
parent
83893f2678
commit
8198052c9e
|
@ -190,12 +190,23 @@ static void die_if_link(const struct script_control *ctl)
|
||||||
"Program not started."), ctl->fname);
|
"Program not started."), ctl->fname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void restore_tty(struct script_control *ctl, int mode)
|
||||||
|
{
|
||||||
|
struct termios rtt;
|
||||||
|
|
||||||
|
if (!ctl->isterm)
|
||||||
|
return;
|
||||||
|
|
||||||
|
rtt = ctl->attrs;
|
||||||
|
tcsetattr(STDIN_FILENO, mode, &rtt);
|
||||||
|
}
|
||||||
|
|
||||||
static void __attribute__((__noreturn__)) done(struct script_control *ctl)
|
static void __attribute__((__noreturn__)) done(struct script_control *ctl)
|
||||||
{
|
{
|
||||||
DBG(MISC, ul_debug("done!"));
|
DBG(MISC, ul_debug("done!"));
|
||||||
|
|
||||||
if (ctl->isterm)
|
restore_tty(ctl, TCSADRAIN);
|
||||||
tcsetattr(STDIN_FILENO, TCSADRAIN, &ctl->attrs);
|
|
||||||
if (!ctl->quiet && ctl->typescriptfp)
|
if (!ctl->quiet && ctl->typescriptfp)
|
||||||
printf(_("Script done, file is %s\n"), ctl->fname);
|
printf(_("Script done, file is %s\n"), ctl->fname);
|
||||||
#ifdef HAVE_LIBUTEMPTER
|
#ifdef HAVE_LIBUTEMPTER
|
||||||
|
@ -423,15 +434,19 @@ static void do_io(struct script_control *ctl)
|
||||||
|
|
||||||
if ((ctl->typescriptfp =
|
if ((ctl->typescriptfp =
|
||||||
fopen(ctl->fname, ctl->append ? "a" UL_CLOEXECSTR : "w" UL_CLOEXECSTR)) == NULL) {
|
fopen(ctl->fname, ctl->append ? "a" UL_CLOEXECSTR : "w" UL_CLOEXECSTR)) == NULL) {
|
||||||
|
|
||||||
|
restore_tty(ctl, TCSANOW);
|
||||||
warn(_("cannot open %s"), ctl->fname);
|
warn(_("cannot open %s"), ctl->fname);
|
||||||
fail(ctl);
|
fail(ctl);
|
||||||
}
|
}
|
||||||
if (ctl->timing) {
|
if (ctl->timing) {
|
||||||
if (!ctl->tname) {
|
const char *tname = ctl->tname ? ctl->tname : "/dev/stderr";
|
||||||
if (!(ctl->timingfp = fopen("/dev/stderr", "w" UL_CLOEXECSTR)))
|
|
||||||
err(EXIT_FAILURE, _("cannot open %s"), "/dev/stderr");
|
if (!(ctl->timingfp = fopen(tname, "w" UL_CLOEXECSTR))) {
|
||||||
} else if (!(ctl->timingfp = fopen(ctl->tname, "w" UL_CLOEXECSTR)))
|
restore_tty(ctl, TCSANOW);
|
||||||
err(EXIT_FAILURE, _("cannot open %s"), ctl->tname);
|
warn(_("cannot open %s"), tname);
|
||||||
|
fail(ctl);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue