Hi, Reworked recent patch to behave correctly on fg and bg. Now user can switch
from fg to bg and vice versa and wget will select fd accordingly.
Please review.
Thanks
Piotr
---
src/log.c | 116 +++--
src/log.h | 1 +
src/main.c | 2 +-
3 files changed, 76 insertions(+), 43 deletions(-)
diff --git a/src/log.c b/src/log.c
index a1338ca..f93b02c 100644
--- a/src/log.c
+++ b/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");
+ filelogfp = fopen (file, appendp ? "a" : "w");
if (!logfp)
{
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,9 @@ log_init (const char *file, bool appendp)
save_context_p = true;
}
}
+
+ /* Initialize this values so we don't have to ask every time we print line */
+ shell_is_interactive = isatty (STDIN_FILENO);
}
/* Close LOGFP (only if we opened it, not if it's stderr), inhibit
@@ -880,59 +898,73 @@ 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, );
- 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);
- /* Dump the context output to the newly opened log. */
- log_dump_context ();
+ if (signal_name)
+{
+ fprintf(stderr, "\n%s received.", signal_name);
+}
+ if (!filelogfp)
+{
+ filelogfp = unique_create (DEFAULT_LOGFILE, false, );
+ 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 ();
+}
+ else
+{
+ /* Eek! Opening the alternate log file has failed. Nothing we
+can do but disable printing completely. */
+ fprintf (stderr, _("%s: %s; disabling logging.\n"),
+ (logfile) ? logfile : DEFAULT_LOGFILE, strerror (errno));
+ inhibit_logging = true;
+}
+}
+ else
+{
+ fprintf (stderr, _("\nRedirecting output to %s.\n"),
+ quote (logfile));
+ logfp = filelogfp;
+ log_dump_context ();
+}
}
- else
+ else if (!to_file && logfp != stdlogfp)
{
- /* 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;
+ logfp = stdlogfp;
+ log_dump_context ();
}
- save_context_p = false;
}
-/* Check whether a signal handler requested the output to be
- redirected. */
+/* Check whether there's a