mirror of
https://github.com/mirror/wget.git
synced 2025-02-28 21:00:25 +08:00
Fixes #45790: wget prints it's progress even when background
* src/log.c: Use tcgetpgrp(STDIN_FILENO) != getpgrp() to determine when to print to STD* or logfile. Deprecate log_request_redirect_output function. Use different file handles for STD* and logfile, to easily switch between them when changing fg/bg. * src/log.h: Make redirect_output function externally linked. * src/main.c: Don't use deprecated log_request_redirect_output function. Use redirect_output instead. * src/mswindows.c: Don't use deprecated log_request_redirect_output function. Use redirect_output instead.
This commit is contained in:
parent
78e0ec5f03
commit
dd5c549f6a
109
src/log.c
109
src/log.c
@ -80,6 +80,18 @@ as that of the covered work. */
|
||||
logging is inhibited, logfp is set back to NULL. */
|
||||
static FILE *logfp;
|
||||
|
||||
/* Descriptor of the stdout|stderr */
|
||||
static FILE *stdlogfp;
|
||||
|
||||
/* Descriptor of the wget.log* file (if created) */
|
||||
static FILE *filelogfp;
|
||||
|
||||
/* Name of log file */
|
||||
static char *logfile;
|
||||
|
||||
/* Is interactive shell ? */
|
||||
static int shell_is_interactive;
|
||||
|
||||
/* A second file descriptor pointing to the temporary log file for the
|
||||
WARC writer. If WARC writing is disabled, this is NULL. */
|
||||
static FILE *warclogfp;
|
||||
@ -611,16 +623,18 @@ log_init (const char *file, bool appendp)
|
||||
{
|
||||
if (HYPHENP (file))
|
||||
{
|
||||
logfp = stdout;
|
||||
stdlogfp = stdout;
|
||||
logfp = stdlogfp;
|
||||
}
|
||||
else
|
||||
{
|
||||
logfp = fopen (file, appendp ? "a" : "w");
|
||||
if (!logfp)
|
||||
filelogfp = fopen (file, appendp ? "a" : "w");
|
||||
if (!filelogfp)
|
||||
{
|
||||
fprintf (stderr, "%s: %s: %s\n", exec_name, file, strerror (errno));
|
||||
exit (WGET_EXIT_GENERIC_ERROR);
|
||||
}
|
||||
logfp = filelogfp;
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -631,7 +645,8 @@ log_init (const char *file, bool appendp)
|
||||
stderr only if the user actually specifies `-O -'. He says
|
||||
this inconsistency is harder to document, but is overall
|
||||
easier on the user. */
|
||||
logfp = stderr;
|
||||
stdlogfp = stderr;
|
||||
logfp = stdlogfp;
|
||||
|
||||
if (1
|
||||
#ifdef HAVE_ISATTY
|
||||
@ -646,6 +661,11 @@ log_init (const char *file, bool appendp)
|
||||
save_context_p = true;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef WINDOWS
|
||||
/* Initialize this values so we don't have to ask every time we print line */
|
||||
shell_is_interactive = isatty (STDIN_FILENO);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Close LOGFP (only if we opened it, not if it's stderr), inhibit
|
||||
@ -880,21 +900,29 @@ log_cleanup (void)
|
||||
|
||||
/* When SIGHUP or SIGUSR1 are received, the output is redirected
|
||||
elsewhere. Such redirection is only allowed once. */
|
||||
static enum { RR_NONE, RR_REQUESTED, RR_DONE } redirect_request = RR_NONE;
|
||||
static const char *redirect_request_signal_name;
|
||||
|
||||
/* Redirect output to `wget-log'. */
|
||||
/* Redirect output to `wget-log' or back to stdout/stderr. */
|
||||
|
||||
static void
|
||||
redirect_output (void)
|
||||
void
|
||||
redirect_output (bool to_file, const char *signal_name)
|
||||
{
|
||||
char *logfile;
|
||||
logfp = unique_create (DEFAULT_LOGFILE, false, &logfile);
|
||||
if (logfp)
|
||||
if (to_file && logfp != filelogfp)
|
||||
{
|
||||
fprintf (stderr, _("\n%s received, redirecting output to %s.\n"),
|
||||
redirect_request_signal_name, quote (logfile));
|
||||
xfree (logfile);
|
||||
if (signal_name)
|
||||
{
|
||||
fprintf (stderr, "\n%s received.", signal_name);
|
||||
}
|
||||
if (!filelogfp)
|
||||
{
|
||||
filelogfp = unique_create (DEFAULT_LOGFILE, false, &logfile);
|
||||
if (filelogfp)
|
||||
{
|
||||
fprintf (stderr, _("\nRedirecting output to %s.\n"),
|
||||
quote (logfile));
|
||||
/* Store signal name to tell wget it's permanent redirect to log file */
|
||||
redirect_request_signal_name = signal_name;
|
||||
logfp = filelogfp;
|
||||
/* Dump the context output to the newly opened log. */
|
||||
log_dump_context ();
|
||||
}
|
||||
@ -902,37 +930,48 @@ redirect_output (void)
|
||||
{
|
||||
/* Eek! Opening the alternate log file has failed. Nothing we
|
||||
can do but disable printing completely. */
|
||||
fprintf (stderr, _("\n%s received.\n"), redirect_request_signal_name);
|
||||
fprintf (stderr, _("%s: %s; disabling logging.\n"),
|
||||
(logfile) ? logfile : DEFAULT_LOGFILE, strerror (errno));
|
||||
inhibit_logging = true;
|
||||
}
|
||||
save_context_p = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf (stderr, _("\nRedirecting output to %s.\n"),
|
||||
quote (logfile));
|
||||
logfp = filelogfp;
|
||||
log_dump_context ();
|
||||
}
|
||||
}
|
||||
else if (!to_file && logfp != stdlogfp)
|
||||
{
|
||||
logfp = stdlogfp;
|
||||
log_dump_context ();
|
||||
}
|
||||
}
|
||||
|
||||
/* Check whether a signal handler requested the output to be
|
||||
redirected. */
|
||||
/* Check whether there's a need to redirect output. */
|
||||
|
||||
static void
|
||||
check_redirect_output (void)
|
||||
{
|
||||
if (redirect_request == RR_REQUESTED)
|
||||
#ifndef WINDOWS
|
||||
/* If it was redirected already to log file by SIGHUP or SIGUSR1,
|
||||
* it was permanent and since that redirect_request_signal_name is set.
|
||||
* If there was no SIGHUP or SIGUSR1 and shell is interactive
|
||||
* we check if process is fg or bg before every line is printed.*/
|
||||
if (!redirect_request_signal_name && shell_is_interactive)
|
||||
{
|
||||
redirect_request = RR_DONE;
|
||||
redirect_output ();
|
||||
if (tcgetpgrp (STDIN_FILENO) != getpgrp ())
|
||||
{
|
||||
// Process backgrounded
|
||||
redirect_output (true,NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/* Request redirection at a convenient time. This may be called from
|
||||
a signal handler. */
|
||||
|
||||
void
|
||||
log_request_redirect_output (const char *signal_name)
|
||||
{
|
||||
if (redirect_request == RR_NONE && save_context_p)
|
||||
/* Request output redirection. The request will be processed by
|
||||
check_redirect_output(), which is called from entry point log
|
||||
functions. */
|
||||
redirect_request = RR_REQUESTED;
|
||||
redirect_request_signal_name = signal_name;
|
||||
else
|
||||
{
|
||||
// Process foregrounded
|
||||
redirect_output (false,NULL);
|
||||
}
|
||||
}
|
||||
#endif /* WINDOWS */
|
||||
}
|
||||
|
@ -52,6 +52,7 @@ void log_init (const char *, bool);
|
||||
void log_close (void);
|
||||
void log_cleanup (void);
|
||||
void log_request_redirect_output (const char *);
|
||||
void redirect_output (bool, const char *);
|
||||
|
||||
const char *escnonprint (const char *);
|
||||
const char *escnonprint_uri (const char *);
|
||||
|
@ -132,7 +132,7 @@ redirect_output_signal (int sig)
|
||||
signal_name = "SIGUSR1";
|
||||
#endif
|
||||
|
||||
log_request_redirect_output (signal_name);
|
||||
redirect_output (true,signal_name);
|
||||
progress_schedule_redirect ();
|
||||
signal (sig, redirect_output_signal);
|
||||
}
|
||||
|
@ -53,9 +53,6 @@ as that of the covered work. */
|
||||
#endif
|
||||
|
||||
|
||||
/* Defined in log.c. */
|
||||
void log_request_redirect_output (const char *);
|
||||
|
||||
/* Windows version of xsleep in utils.c. */
|
||||
|
||||
void
|
||||
@ -98,7 +95,7 @@ static void
|
||||
ws_hangup (const char *reason)
|
||||
{
|
||||
fprintf (stderr, _("Continuing in background.\n"));
|
||||
log_request_redirect_output (reason);
|
||||
redirect_output (true, reason);
|
||||
|
||||
/* Detach process from the current console. Under Windows 9x, if we
|
||||
were launched from a 16-bit process (which is usually the case;
|
||||
|
Loading…
Reference in New Issue
Block a user