X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Flog.c;h=9ee0621160ebca923233e94889ce72153a532049;hp=5de6da7d280597dc072db08c534f1f118a2be166;hb=d5e283b1a75c5f8249300b465b4e7b55130bec49;hpb=4d7c5e087b2bc82c9f503dff003916d1047903ce diff --git a/src/log.c b/src/log.c index 5de6da7d..9ee06211 100644 --- a/src/log.c +++ b/src/log.c @@ -1,5 +1,6 @@ /* Messages logging. - Copyright (C) 1998-2006 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, + 2007, 2008 Free Software Foundation, Inc. This file is part of GNU Wget. @@ -16,17 +17,18 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Wget. If not, see . -In addition, as a special exception, the Free Software Foundation -gives permission to link the code of its release of Wget with the -OpenSSL project's "OpenSSL" library (or with modified versions of it -that use the same license as the "OpenSSL" library), and distribute -the linked executables. You must obey the GNU General Public License -in all respects for all of the code used other than "OpenSSL". If you -modify this file, you may extend this exception to your version of the -file, but you are not obligated to do so. If you do not wish to do -so, delete this exception statement from your version. */ +Additional permission under GNU GPL version 3 section 7 -#include +If you modify this program, or any covered work, by linking or +combining it with the OpenSSL project's OpenSSL library (or a +modified version of that library), containing parts covered by the +terms of the OpenSSL or SSLeay licenses, the Free Software Foundation +grants you additional permission to convey the resulting work. +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 "wget.h" #include #include @@ -38,11 +40,23 @@ so, delete this exception statement from your version. */ #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 @@ -107,9 +121,9 @@ static bool needs_flushing; static struct log_ln { char static_line[STATIC_LENGTH + 1]; /* statically allocated line. */ - char *malloced_line; /* malloc'ed line, for lines of output + char *malloced_line; /* malloc'ed line, for lines of output larger than 80 characters. */ - char *content; /* this points either to malloced_line + char *content; /* this points either to malloced_line or to the appropriate static_line. If this is NULL, it means the line has not yet been used. */ @@ -126,9 +140,9 @@ static bool trailing_line; static void check_redirect_output (void); -#define ROT_ADVANCE(num) do { \ - if (++num >= SAVED_LOG_LINES) \ - num = 0; \ +#define ROT_ADVANCE(num) do { \ + if (++num >= SAVED_LOG_LINES) \ + num = 0; \ } while (0) /* Free the log line index with NUM. This calls free on @@ -166,21 +180,21 @@ saved_append_1 (const char *start, const char *end) struct log_ln *ln; if (log_line_current == -1) - log_line_current = 0; + log_line_current = 0; else - free_log_line (log_line_current); + free_log_line (log_line_current); ln = log_lines + log_line_current; if (len > STATIC_LENGTH) - { - ln->malloced_line = strdupdelim (start, end); - ln->content = ln->malloced_line; - } + { + ln->malloced_line = strdupdelim (start, end); + ln->content = ln->malloced_line; + } else - { - memcpy (ln->static_line, start, len); - ln->static_line[len] = '\0'; - ln->content = ln->static_line; - } + { + memcpy (ln->static_line, start, len); + ln->static_line[len] = '\0'; + ln->content = ln->static_line; + } } else { @@ -191,38 +205,38 @@ saved_append_1 (const char *start, const char *end) convert it to malloc(). */ struct log_ln *ln = log_lines + log_line_current; if (ln->malloced_line) - { - /* Resize malloc'ed line and append. */ - int old_len = strlen (ln->malloced_line); - ln->malloced_line = xrealloc (ln->malloced_line, old_len + len + 1); - memcpy (ln->malloced_line + old_len, start, len); - ln->malloced_line[old_len + len] = '\0'; - /* might have changed due to realloc */ - ln->content = ln->malloced_line; - } + { + /* Resize malloc'ed line and append. */ + int old_len = strlen (ln->malloced_line); + ln->malloced_line = xrealloc (ln->malloced_line, old_len + len + 1); + memcpy (ln->malloced_line + old_len, start, len); + ln->malloced_line[old_len + len] = '\0'; + /* might have changed due to realloc */ + ln->content = ln->malloced_line; + } else - { - int old_len = strlen (ln->static_line); - if (old_len + len > STATIC_LENGTH) - { - /* Allocate memory and concatenate the old and the new + { + int old_len = strlen (ln->static_line); + if (old_len + len > STATIC_LENGTH) + { + /* Allocate memory and concatenate the old and the new contents. */ - ln->malloced_line = xmalloc (old_len + len + 1); - memcpy (ln->malloced_line, ln->static_line, - old_len); - memcpy (ln->malloced_line + old_len, start, len); - ln->malloced_line[old_len + len] = '\0'; - ln->content = ln->malloced_line; - } - else - { - /* Just append to the old, statically allocated + ln->malloced_line = xmalloc (old_len + len + 1); + memcpy (ln->malloced_line, ln->static_line, + old_len); + memcpy (ln->malloced_line + old_len, start, len); + ln->malloced_line[old_len + len] = '\0'; + ln->content = ln->malloced_line; + } + else + { + /* Just append to the old, statically allocated contents. */ - memcpy (ln->static_line + old_len, start, len); - ln->static_line[old_len + len] = '\0'; - ln->content = ln->static_line; - } - } + memcpy (ln->static_line + old_len, start, len); + ln->static_line[old_len + len] = '\0'; + ln->content = ln->static_line; + } + } } trailing_line = !(end[-1] == '\n'); if (!trailing_line) @@ -241,9 +255,9 @@ saved_append (const char *s) { const char *end = strchr (s, '\n'); if (!end) - end = s + strlen (s); + end = s + strlen (s); else - ++end; + ++end; saved_append_1 (s, end); s = end; } @@ -259,22 +273,22 @@ saved_append (const char *s) * LOG_NONVERBOSE - print the message if opt.verbose is zero; * LOG_VERBOSE - print the message if opt.verbose is non-zero. */ -#define CHECK_VERBOSE(x) \ - switch (x) \ - { \ - case LOG_ALWAYS: \ - break; \ - case LOG_NOTQUIET: \ - if (opt.quiet) \ - return; \ - break; \ - case LOG_NONVERBOSE: \ - if (opt.verbose || opt.quiet) \ - return; \ - break; \ - case LOG_VERBOSE: \ - if (!opt.verbose) \ - return; \ +#define CHECK_VERBOSE(x) \ + switch (x) \ + { \ + case LOG_ALWAYS: \ + break; \ + case LOG_NOTQUIET: \ + if (opt.quiet) \ + return; \ + break; \ + case LOG_NONVERBOSE: \ + if (opt.verbose || opt.quiet) \ + return; \ + break; \ + case LOG_VERBOSE: \ + if (!opt.verbose) \ + return; \ } /* Returns the file descriptor for logging. This is LOGFP, except if @@ -306,7 +320,7 @@ logputs (enum log_options o, const char *s) return; CHECK_VERBOSE (o); - fputs (s, fp); + FPUTS (s, fp); if (save_context_p) saved_append (s); if (flush_log_p) @@ -337,7 +351,7 @@ struct logvprintf_state { static bool log_vprintf_internal (struct logvprintf_state *state, const char *fmt, - va_list args) + va_list args) { char smallmsg[128]; char *write_ptr = smallmsg; @@ -378,7 +392,7 @@ log_vprintf_internal (struct logvprintf_state *state, const char *fmt, if (numwritten == -1) { /* Writing failed, and we don't know the needed size. Try - again with doubled size. */ + again with doubled size. */ int newsize = available_size << 1; state->bigmsg = xrealloc (state->bigmsg, newsize); state->allocated = newsize; @@ -387,7 +401,7 @@ log_vprintf_internal (struct logvprintf_state *state, const char *fmt, else if (numwritten >= available_size) { /* Writing failed, but we know exactly how much space we - need. */ + need. */ int newsize = numwritten + 1; state->bigmsg = xrealloc (state->bigmsg, newsize); state->allocated = newsize; @@ -396,7 +410,7 @@ log_vprintf_internal (struct logvprintf_state *state, const char *fmt, /* Writing succeeded. */ saved_append (write_ptr); - fputs (write_ptr, fp); + FPUTS (write_ptr, fp); if (state->bigmsg) xfree (state->bigmsg); @@ -415,7 +429,19 @@ logflush (void) { FILE *fp = get_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] */ + } needs_flushing = false; } @@ -434,9 +460,9 @@ log_set_flush (bool flush) else { /* Reenable flushing. If anything was printed in no-flush mode, - flush the log now. */ + flush the log now. */ if (needs_flushing) - logflush (); + logflush (); flush_log_p = true; } } @@ -493,15 +519,15 @@ debug_logprintf (const char *fmt, ...) check_redirect_output (); if (inhibit_logging) - return; + return; xzero (lpstate); do - { - va_start (args, fmt); - done = log_vprintf_internal (&lpstate, fmt, args); - va_end (args); - } + { + va_start (args, fmt); + done = log_vprintf_internal (&lpstate, fmt, args); + va_end (args); + } while (!done); } } @@ -516,10 +542,10 @@ log_init (const char *file, bool appendp) { logfp = fopen (file, appendp ? "a" : "w"); if (!logfp) - { - fprintf (stderr, "%s: %s: %s\n", exec_name, file, strerror (errno)); - exit (1); - } + { + fprintf (stderr, "%s: %s: %s\n", exec_name, file, strerror (errno)); + exit (1); + } } else { @@ -533,16 +559,16 @@ log_init (const char *file, bool appendp) if (1 #ifdef HAVE_ISATTY - && isatty (fileno (logfp)) + && isatty (fileno (logfp)) #endif - ) - { - /* If the output is a TTY, enable save context, i.e. store - the most recent several messages ("context") and dump - them to a log file in case SIGHUP or SIGUSR1 is received - (or Ctrl+Break is pressed under Windows). */ - save_context_p = true; - } + ) + { + /* If the output is a TTY, enable save context, i.e. store + the most recent several messages ("context") and dump + them to a log file in case SIGHUP or SIGUSR1 is received + (or Ctrl+Break is pressed under Windows). */ + save_context_p = true; + } } } @@ -582,20 +608,20 @@ log_dump_context (void) { struct log_ln *ln = log_lines + num; if (ln->content) - fputs (ln->content, fp); + FPUTS (ln->content, fp); 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); fflush (fp); } /* 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) @@ -603,7 +629,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; } @@ -643,26 +669,26 @@ copy_and_escape (const char *source, char *dest, char escape, int base) { case 8: while ((c = *from++) != '\0') - if (ISPRINT (c)) - *to++ = c; - else - { - *to++ = escape; - *to++ = '0' + (c >> 6); - *to++ = '0' + ((c >> 3) & 7); - *to++ = '0' + (c & 7); - } + if (c_isprint (c)) + *to++ = c; + else + { + *to++ = escape; + *to++ = '0' + (c >> 6); + *to++ = '0' + ((c >> 3) & 7); + *to++ = '0' + (c & 7); + } break; case 16: while ((c = *from++) != '\0') - if (ISPRINT (c)) - *to++ = c; - else - { - *to++ = escape; - *to++ = XNUM_TO_DIGIT (c >> 4); - *to++ = XNUM_TO_DIGIT (c & 0xf); - } + if (c_isprint (c)) + *to++ = c; + else + { + *to++ = escape; + *to++ = XNUM_TO_DIGIT (c >> 4); + *to++ = XNUM_TO_DIGIT (c & 0xf); + } break; default: abort (); @@ -675,12 +701,12 @@ struct ringel { char *buffer; int size; }; -static struct ringel ring[RING_SIZE]; /* ring data */ +static struct ringel ring[RING_SIZE]; /* ring data */ static const char * escnonprint_internal (const char *str, char escape, int base) { - static int ringpos; /* current ring position */ + static int ringpos; /* current ring position */ int nprcnt; assert (base == 8 || base == 16); @@ -706,8 +732,8 @@ escnonprint_internal (const char *str, char escape, int base) (re)allocate it. */ if (r->buffer == NULL || r->size < needed_size) { - r->buffer = xrealloc (r->buffer, needed_size); - r->size = needed_size; + r->buffer = xrealloc (r->buffer, needed_size); + r->size = needed_size; } copy_and_escape (str, r->buffer, escape, base); @@ -761,7 +787,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); } @@ -780,8 +806,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 (); @@ -792,7 +818,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, strerror (errno)); inhibit_logging = true; } save_context_p = false;