X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Flog.c;h=4f93a21cb050446b7325092d5bcf66e9abdbea83;hp=e448c1412bbd1d0e850dc87f512112fe888d5c5c;hb=320cfdcb658e8d6556ae9dfd902c2db1db866a6b;hpb=86395b297b58c8c9b43d7ca8c42b831d4926dac6 diff --git a/src/log.c b/src/log.c index e448c141..4f93a21c 100644 --- a/src/log.c +++ b/src/log.c @@ -1,6 +1,6 @@ /* Messages logging. Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, - 2007 Free Software Foundation, Inc. + 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. This file is part of GNU Wget. @@ -28,23 +28,33 @@ Corresponding Source for a non-source form of such a combination shall include the source code for the parts of OpenSSL used as well as that of the covered work. */ -#include +#include "wget.h" #include #include #include #include -#ifdef HAVE_UNISTD_H -# include -#endif +#include #include #include -#include "wget.h" #include "utils.h" #include "log.h" -/* This file impplement support for "logging". Logging means printing +/* 2005-10-25 SMS. + VMS log files are often VFC record format, not stream, so fputs() can + produce multiple records, even when there's no newline terminator in + the buffer. The result is unsightly output with spurious newlines. + Using fprintf() instead of fputs(), along with inhibiting some + fflush() activity below, seems to solve the problem. +*/ +#ifdef __VMS +# define FPUTS( s, f) fprintf( (f), "%s", (s)) +#else /* def __VMS */ +# define FPUTS( s, f) fputs( (s), (f)) +#endif /* def __VMS [else] */ + +/* This file implements support for "logging". Logging means printing output, plus several additional features: - Cataloguing output by importance. You can specify that a log @@ -69,6 +79,10 @@ as that of the covered work. */ logging is inhibited, logfp is set back to NULL. */ static FILE *logfp; +/* 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; + /* If true, it means logging is inhibited, i.e. nothing is printed or stored. */ static bool inhibit_logging; @@ -294,6 +308,31 @@ get_log_fp (void) return logfp; return stderr; } + +/* Returns the file descriptor for the secondary log file. This is + WARCLOGFP, except if called before log_init, in which case it + returns stderr. This is useful in case someone calls a logging + function before log_init. + + If logging is inhibited, return NULL. */ + +static FILE * +get_warc_log_fp (void) +{ + if (inhibit_logging) + return NULL; + if (warclogfp) + return warclogfp; + return NULL; +} + +/* Sets the file descriptor for the secondary log file. */ + +void +log_set_warc_log_fp (FILE * fp) +{ + warclogfp = fp; +} /* Log a literal string S. The string is logged as-is, without a newline appended. */ @@ -302,13 +341,17 @@ void logputs (enum log_options o, const char *s) { FILE *fp; + FILE *warcfp; check_redirect_output (); if ((fp = get_log_fp ()) == NULL) return; + warcfp = get_warc_log_fp (); CHECK_VERBOSE (o); - fputs (s, fp); + FPUTS (s, fp); + if (warcfp != NULL) + FPUTS (s, warcfp); if (save_context_p) saved_append (s); if (flush_log_p) @@ -346,8 +389,9 @@ log_vprintf_internal (struct logvprintf_state *state, const char *fmt, int available_size = sizeof (smallmsg); int numwritten; FILE *fp = get_log_fp (); + FILE *warcfp = get_warc_log_fp (); - if (!save_context_p) + if (!save_context_p && warcfp == NULL) { /* In the simple case just call vfprintf(), to avoid needless allocation and games with vsnprintf(). */ @@ -397,8 +441,11 @@ log_vprintf_internal (struct logvprintf_state *state, const char *fmt, } /* Writing succeeded. */ - saved_append (write_ptr); - fputs (write_ptr, fp); + if (save_context_p) + saved_append (write_ptr); + FPUTS (write_ptr, fp); + if (warcfp != NULL) + FPUTS (write_ptr, warcfp); if (state->bigmsg) xfree (state->bigmsg); @@ -416,8 +463,25 @@ void logflush (void) { FILE *fp = get_log_fp (); + FILE *warcfp = get_warc_log_fp (); if (fp) - fflush (fp); + { +/* 2005-10-25 SMS. + On VMS, flush only for a terminal. See note at FPUTS macro, above. +*/ +#ifdef __VMS + if (isatty( fileno( fp))) + { + fflush (fp); + } +#else /* def __VMS */ + fflush (fp); +#endif /* def __VMS [else] */ + } + + if (warcfp != NULL) + fflush (warcfp); + needs_flushing = false; } @@ -477,6 +541,9 @@ logprintf (enum log_options o, const char *fmt, ...) va_start (args, fmt); done = log_vprintf_internal (&lpstate, fmt, args); va_end (args); + + if (done && errno == EPIPE) + exit (1); } while (!done); } @@ -548,14 +615,14 @@ log_init (const char *file, bool appendp) } } -/* Close LOGFP, inhibit further logging and free the memory associated - with it. */ +/* Close LOGFP (only if we opened it, not if it's stderr), inhibit + further logging and free the memory associated with it. */ void log_close (void) { int i; - if (logfp) + if (logfp && (logfp != stderr)) fclose (logfp); logfp = NULL; inhibit_logging = true; @@ -573,6 +640,7 @@ log_dump_context (void) { int num = log_line_current; FILE *fp = get_log_fp (); + FILE *warcfp = get_warc_log_fp (); if (!fp) return; @@ -584,20 +652,29 @@ log_dump_context (void) { struct log_ln *ln = log_lines + num; if (ln->content) - fputs (ln->content, fp); + { + FPUTS (ln->content, fp); + if (warcfp != NULL) + FPUTS (ln->content, warcfp); + } ROT_ADVANCE (num); } while (num != log_line_current); if (trailing_line) if (log_lines[log_line_current].content) - fputs (log_lines[log_line_current].content, fp); + { + FPUTS (log_lines[log_line_current].content, fp); + if (warcfp != NULL) + FPUTS (log_lines[log_line_current].content, warcfp); + } fflush (fp); + fflush (warcfp); } /* String escape functions. */ /* Return the number of non-printable characters in SOURCE. - Non-printable characters are determined as per safe-ctype.c. */ + Non-printable characters are determined as per c-ctype.c. */ static int count_nonprint (const char *source) @@ -605,7 +682,7 @@ count_nonprint (const char *source) const char *p; int cnt; for (p = source, cnt = 0; *p; p++) - if (!ISPRINT (*p)) + if (!c_isprint (*p)) ++cnt; return cnt; } @@ -645,7 +722,7 @@ copy_and_escape (const char *source, char *dest, char escape, int base) { case 8: while ((c = *from++) != '\0') - if (ISPRINT (c)) + if (c_isprint (c)) *to++ = c; else { @@ -657,7 +734,7 @@ copy_and_escape (const char *source, char *dest, char escape, int base) break; case 16: while ((c = *from++) != '\0') - if (ISPRINT (c)) + if (c_isprint (c)) *to++ = c; else { @@ -763,7 +840,7 @@ escnonprint_uri (const char *str) void log_cleanup (void) { - int i; + size_t i; for (i = 0; i < countof (ring); i++) xfree_null (ring[i].buffer); } @@ -782,8 +859,8 @@ redirect_output (void) logfp = unique_create (DEFAULT_LOGFILE, false, &logfile); if (logfp) { - fprintf (stderr, _("\n%s received, redirecting output to `%s'.\n"), - redirect_request_signal_name, logfile); + 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 (); @@ -794,7 +871,7 @@ redirect_output (void) can do but disable printing completely. */ fprintf (stderr, _("\n%s received.\n"), redirect_request_signal_name); fprintf (stderr, _("%s: %s; disabling logging.\n"), - logfile, strerror (errno)); + (logfile) ? logfile : DEFAULT_LOGFILE, strerror (errno)); inhibit_logging = true; } save_context_p = false;