]> sjero.net Git - wget/blob - src/log.c
NEWS: cite --start-pos
[wget] / src / log.c
1 /* Messages logging.
2    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
3    2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
4
5 This file is part of GNU Wget.
6
7 GNU Wget is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 GNU Wget is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with Wget.  If not, see <http://www.gnu.org/licenses/>.
19
20 Additional permission under GNU GPL version 3 section 7
21
22 If you modify this program, or any covered work, by linking or
23 combining it with the OpenSSL project's OpenSSL library (or a
24 modified version of that library), containing parts covered by the
25 terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
26 grants you additional permission to convey the resulting work.
27 Corresponding Source for a non-source form of such a combination
28 shall include the source code for the parts of OpenSSL used as well
29 as that of the covered work.  */
30
31 #include "wget.h"
32
33 #include <stdio.h>
34 #include <string.h>
35 #include <stdlib.h>
36 #include <stdarg.h>
37 #include <unistd.h>
38 #include <assert.h>
39 #include <errno.h>
40
41 #include "utils.h"
42 #include "log.h"
43
44 /* 2005-10-25 SMS.
45    VMS log files are often VFC record format, not stream, so fputs() can
46    produce multiple records, even when there's no newline terminator in
47    the buffer.  The result is unsightly output with spurious newlines.
48    Using fprintf() instead of fputs(), along with inhibiting some
49    fflush() activity below, seems to solve the problem.
50 */
51 #ifdef __VMS
52 # define FPUTS( s, f) fprintf( (f), "%s", (s))
53 #else /* def __VMS */
54 # define FPUTS( s, f) fputs( (s), (f))
55 #endif /* def __VMS [else] */
56
57 /* This file implements support for "logging".  Logging means printing
58    output, plus several additional features:
59
60    - Cataloguing output by importance.  You can specify that a log
61    message is "verbose" or "debug", and it will not be printed unless
62    in verbose or debug mode, respectively.
63
64    - Redirecting the log to the file.  When Wget's output goes to the
65    terminal, and Wget receives SIGHUP, all further output is
66    redirected to a log file.  When this is the case, Wget can also
67    print the last several lines of "context" to the log file so that
68    it does not begin in the middle of a line.  For this to work, the
69    logging code stores the last several lines of context.  Callers may
70    request for certain output not to be stored.
71
72    - Inhibiting output.  When Wget receives SIGHUP, but redirecting
73    the output fails, logging is inhibited.  */
74
75 \f
76 /* The file descriptor used for logging.  This is NULL before log_init
77    is called; logging functions log to stderr then.  log_init sets it
78    either to stderr or to a file pointer obtained from fopen().  If
79    logging is inhibited, logfp is set back to NULL. */
80 static FILE *logfp;
81
82 /* A second file descriptor pointing to the temporary log file for the
83    WARC writer.  If WARC writing is disabled, this is NULL.  */
84 static FILE *warclogfp;
85
86 /* If true, it means logging is inhibited, i.e. nothing is printed or
87    stored.  */
88 static bool inhibit_logging;
89
90 /* Whether the last output lines are stored for use as context.  */
91 static bool save_context_p;
92
93 /* Whether the log is flushed after each command. */
94 static bool flush_log_p = true;
95
96 /* Whether any output has been received while flush_log_p was 0. */
97 static bool needs_flushing;
98
99 /* In the event of a hang-up, and if its output was on a TTY, Wget
100    redirects its output to `wget-log'.
101
102    For the convenience of reading this newly-created log, we store the
103    last several lines ("screenful", hence the choice of 24) of Wget
104    output, and dump them as context when the time comes.  */
105 #define SAVED_LOG_LINES 24
106
107 /* log_lines is a circular buffer that stores SAVED_LOG_LINES lines of
108    output.  log_line_current always points to the position in the
109    buffer that will be written to next.  When log_line_current reaches
110    SAVED_LOG_LINES, it is reset to zero.
111
112    The problem here is that we'd have to either (re)allocate and free
113    strings all the time, or limit the lines to an arbitrary number of
114    characters.  Instead of settling for either of these, we do both:
115    if the line is smaller than a certain "usual" line length (128
116    chars by default), a preallocated memory is used.  The rare lines
117    that are longer than 128 characters are malloc'ed and freed
118    separately.  This gives good performance with minimum memory
119    consumption and fragmentation.  */
120
121 #define STATIC_LENGTH 128
122
123 static struct log_ln {
124   char static_line[STATIC_LENGTH + 1]; /* statically allocated
125                                           line. */
126   char *malloced_line;          /* malloc'ed line, for lines of output
127                                    larger than 80 characters. */
128   char *content;                /* this points either to malloced_line
129                                    or to the appropriate static_line.
130                                    If this is NULL, it means the line
131                                    has not yet been used. */
132 } log_lines[SAVED_LOG_LINES];
133
134 /* The current position in the ring. */
135 static int log_line_current = -1;
136
137 /* Whether the most recently written line was "trailing", i.e. did not
138    finish with \n.  This is an important piece of information because
139    the code is always careful to append data to trailing lines, rather
140    than create new ones.  */
141 static bool trailing_line;
142
143 static void check_redirect_output (void);
144 \f
145 #define ROT_ADVANCE(num) do {                   \
146   if (++num >= SAVED_LOG_LINES)                 \
147     num = 0;                                    \
148 } while (0)
149
150 /* Free the log line index with NUM.  This calls free on
151    ln->malloced_line if it's non-NULL, and it also resets
152    ln->malloced_line and ln->content to NULL.  */
153
154 static void
155 free_log_line (int num)
156 {
157   struct log_ln *ln = log_lines + num;
158   if (ln->malloced_line)
159     {
160       xfree (ln->malloced_line);
161       ln->malloced_line = NULL;
162     }
163   ln->content = NULL;
164 }
165
166 /* Append bytes in the range [start, end) to one line in the log.  The
167    region is not supposed to contain newlines, except for the last
168    character (at end[-1]).  */
169
170 static void
171 saved_append_1 (const char *start, const char *end)
172 {
173   int len = end - start;
174   if (!len)
175     return;
176
177   /* First, check whether we need to append to an existing line or to
178      create a new one.  */
179   if (!trailing_line)
180     {
181       /* Create a new line. */
182       struct log_ln *ln;
183
184       if (log_line_current == -1)
185         log_line_current = 0;
186       else
187         free_log_line (log_line_current);
188       ln = log_lines + log_line_current;
189       if (len > STATIC_LENGTH)
190         {
191           ln->malloced_line = strdupdelim (start, end);
192           ln->content = ln->malloced_line;
193         }
194       else
195         {
196           memcpy (ln->static_line, start, len);
197           ln->static_line[len] = '\0';
198           ln->content = ln->static_line;
199         }
200     }
201   else
202     {
203       /* Append to the last line.  If the line is malloc'ed, we just
204          call realloc and append the new string.  If the line is
205          static, we have to check whether appending the new string
206          would make it exceed STATIC_LENGTH characters, and if so,
207          convert it to malloc(). */
208       struct log_ln *ln = log_lines + log_line_current;
209       if (ln->malloced_line)
210         {
211           /* Resize malloc'ed line and append. */
212           int old_len = strlen (ln->malloced_line);
213           ln->malloced_line = xrealloc (ln->malloced_line, old_len + len + 1);
214           memcpy (ln->malloced_line + old_len, start, len);
215           ln->malloced_line[old_len + len] = '\0';
216           /* might have changed due to realloc */
217           ln->content = ln->malloced_line;
218         }
219       else
220         {
221           int old_len = strlen (ln->static_line);
222           if (old_len + len > STATIC_LENGTH)
223             {
224               /* Allocate memory and concatenate the old and the new
225                  contents. */
226               ln->malloced_line = xmalloc (old_len + len + 1);
227               memcpy (ln->malloced_line, ln->static_line,
228                       old_len);
229               memcpy (ln->malloced_line + old_len, start, len);
230               ln->malloced_line[old_len + len] = '\0';
231               ln->content = ln->malloced_line;
232             }
233           else
234             {
235               /* Just append to the old, statically allocated
236                  contents.  */
237               memcpy (ln->static_line + old_len, start, len);
238               ln->static_line[old_len + len] = '\0';
239               ln->content = ln->static_line;
240             }
241         }
242     }
243   trailing_line = !(end[-1] == '\n');
244   if (!trailing_line)
245     ROT_ADVANCE (log_line_current);
246 }
247
248 /* Log the contents of S, as explained above.  If S consists of
249    multiple lines, they are logged separately.  If S does not end with
250    a newline, it will form a "trailing" line, to which things will get
251    appended the next time this function is called.  */
252
253 static void
254 saved_append (const char *s)
255 {
256   while (*s)
257     {
258       const char *end = strchr (s, '\n');
259       if (!end)
260         end = s + strlen (s);
261       else
262         ++end;
263       saved_append_1 (s, end);
264       s = end;
265     }
266 }
267 \f
268 /* Check X against opt.verbose and opt.quiet.  The semantics is as
269    follows:
270
271    * LOG_ALWAYS - print the message unconditionally;
272
273    * LOG_NOTQUIET - print the message if opt.quiet is non-zero;
274
275    * LOG_NONVERBOSE - print the message if opt.verbose is zero;
276
277    * LOG_VERBOSE - print the message if opt.verbose is non-zero.  */
278 #define CHECK_VERBOSE(x)                        \
279   switch (x)                                    \
280     {                                           \
281     case LOG_ALWAYS:                            \
282       break;                                    \
283     case LOG_NOTQUIET:                          \
284       if (opt.quiet)                            \
285         return;                                 \
286       break;                                    \
287     case LOG_NONVERBOSE:                        \
288       if (opt.verbose || opt.quiet)             \
289         return;                                 \
290       break;                                    \
291     case LOG_VERBOSE:                           \
292       if (!opt.verbose)                         \
293         return;                                 \
294     }
295
296 /* Returns the file descriptor for logging.  This is LOGFP, except if
297    called before log_init, in which case it returns stderr.  This is
298    useful in case someone calls a logging function before log_init.
299
300    If logging is inhibited, return NULL.  */
301
302 static FILE *
303 get_log_fp (void)
304 {
305   if (inhibit_logging)
306     return NULL;
307   if (logfp)
308     return logfp;
309   return stderr;
310 }
311
312 /* Returns the file descriptor for the secondary log file. This is
313    WARCLOGFP, except if called before log_init, in which case it
314    returns stderr.  This is useful in case someone calls a logging
315    function before log_init.
316
317    If logging is inhibited, return NULL.  */
318
319 static FILE *
320 get_warc_log_fp (void)
321 {
322   if (inhibit_logging)
323     return NULL;
324   if (warclogfp)
325     return warclogfp;
326   return NULL;
327 }
328
329 /* Sets the file descriptor for the secondary log file.  */
330
331 void
332 log_set_warc_log_fp (FILE * fp)
333 {
334   warclogfp = fp;
335 }
336 \f
337 /* Log a literal string S.  The string is logged as-is, without a
338    newline appended.  */
339
340 void
341 logputs (enum log_options o, const char *s)
342 {
343   FILE *fp;
344   FILE *warcfp;
345
346   check_redirect_output ();
347   if ((fp = get_log_fp ()) == NULL)
348     return;
349   warcfp = get_warc_log_fp ();
350   CHECK_VERBOSE (o);
351
352   FPUTS (s, fp);
353   if (warcfp != NULL)
354     FPUTS (s, warcfp);
355   if (save_context_p)
356     saved_append (s);
357   if (flush_log_p)
358     logflush ();
359   else
360     needs_flushing = true;
361 }
362
363 struct logvprintf_state {
364   char *bigmsg;
365   int expected_size;
366   int allocated;
367 };
368
369 /* Print a message to the log.  A copy of message will be saved to
370    saved_log, for later reusal by log_dump_context().
371
372    Normally we'd want this function to loop around vsnprintf until
373    sufficient room is allocated, as the Linux man page recommends.
374    However each call to vsnprintf() must be preceded by va_start and
375    followed by va_end.  Since calling va_start/va_end is possible only
376    in the function that contains the `...' declaration, we cannot call
377    vsnprintf more than once.  Therefore this function saves its state
378    to logvprintf_state and signals the parent to call it again.
379
380    (An alternative approach would be to use va_copy, but that's not
381    portable.)  */
382
383 static bool
384 log_vprintf_internal (struct logvprintf_state *state, const char *fmt,
385                       va_list args)
386 {
387   char smallmsg[128];
388   char *write_ptr = smallmsg;
389   int available_size = sizeof (smallmsg);
390   int numwritten;
391   FILE *fp = get_log_fp ();
392   FILE *warcfp = get_warc_log_fp ();
393
394   if (!save_context_p && warcfp == NULL)
395     {
396       /* In the simple case just call vfprintf(), to avoid needless
397          allocation and games with vsnprintf(). */
398       vfprintf (fp, fmt, args);
399       goto flush;
400     }
401
402   if (state->allocated != 0)
403     {
404       write_ptr = state->bigmsg;
405       available_size = state->allocated;
406     }
407
408   /* The GNU coding standards advise not to rely on the return value
409      of sprintf().  However, vsnprintf() is a relatively new function
410      missing from legacy systems.  Therefore I consider it safe to
411      assume that its return value is meaningful.  On the systems where
412      vsnprintf() is not available, we use the implementation from
413      snprintf.c which does return the correct value.  */
414   numwritten = vsnprintf (write_ptr, available_size, fmt, args);
415
416   /* vsnprintf() will not step over the limit given by available_size.
417      If it fails, it returns either -1 (older implementations) or the
418      number of characters (not counting the terminating \0) that
419      *would have* been written if there had been enough room (C99).
420      In the former case, we double available_size and malloc to get a
421      larger buffer, and try again.  In the latter case, we use the
422      returned information to build a buffer of the correct size.  */
423
424   if (numwritten == -1)
425     {
426       /* Writing failed, and we don't know the needed size.  Try
427          again with doubled size. */
428       int newsize = available_size << 1;
429       state->bigmsg = xrealloc (state->bigmsg, newsize);
430       state->allocated = newsize;
431       return false;
432     }
433   else if (numwritten >= available_size)
434     {
435       /* Writing failed, but we know exactly how much space we
436          need. */
437       int newsize = numwritten + 1;
438       state->bigmsg = xrealloc (state->bigmsg, newsize);
439       state->allocated = newsize;
440       return false;
441     }
442
443   /* Writing succeeded. */
444   if (save_context_p)
445     saved_append (write_ptr);
446   FPUTS (write_ptr, fp);
447   if (warcfp != NULL)
448     FPUTS (write_ptr, warcfp);
449   if (state->bigmsg)
450     xfree (state->bigmsg);
451
452  flush:
453   if (flush_log_p)
454     logflush ();
455   else
456     needs_flushing = true;
457
458   return true;
459 }
460
461 /* Flush LOGFP.  Useful while flushing is disabled.  */
462 void
463 logflush (void)
464 {
465   FILE *fp = get_log_fp ();
466   FILE *warcfp = get_warc_log_fp ();
467   if (fp)
468     {
469 /* 2005-10-25 SMS.
470    On VMS, flush only for a terminal.  See note at FPUTS macro, above.
471 */
472 #ifdef __VMS
473       if (isatty( fileno( fp)))
474         {
475           fflush (fp);
476         }
477 #else /* def __VMS */
478       fflush (fp);
479 #endif /* def __VMS [else] */
480     }
481
482   if (warcfp != NULL)
483     fflush (warcfp);
484
485   needs_flushing = false;
486 }
487
488 /* Enable or disable log flushing. */
489 void
490 log_set_flush (bool flush)
491 {
492   if (flush == flush_log_p)
493     return;
494
495   if (flush == false)
496     {
497       /* Disable flushing by setting flush_log_p to 0. */
498       flush_log_p = false;
499     }
500   else
501     {
502       /* Reenable flushing.  If anything was printed in no-flush mode,
503          flush the log now.  */
504       if (needs_flushing)
505         logflush ();
506       flush_log_p = true;
507     }
508 }
509
510 /* (Temporarily) disable storing log to memory.  Returns the old
511    status of storing, with which this function can be called again to
512    reestablish storing. */
513
514 bool
515 log_set_save_context (bool savep)
516 {
517   bool old = save_context_p;
518   save_context_p = savep;
519   return old;
520 }
521
522 /* Print a message to the screen or to the log.  The first argument
523    defines the verbosity of the message, and the rest are as in
524    printf(3).  */
525
526 void
527 logprintf (enum log_options o, const char *fmt, ...)
528 {
529   va_list args;
530   struct logvprintf_state lpstate;
531   bool done;
532
533   check_redirect_output ();
534   if (inhibit_logging)
535     return;
536   CHECK_VERBOSE (o);
537
538   xzero (lpstate);
539   do
540     {
541       va_start (args, fmt);
542       done = log_vprintf_internal (&lpstate, fmt, args);
543       va_end (args);
544
545       if (done && errno == EPIPE)
546         exit (1);
547     }
548   while (!done);
549 }
550
551 #ifdef ENABLE_DEBUG
552 /* The same as logprintf(), but does anything only if opt.debug is
553    true.  */
554 void
555 debug_logprintf (const char *fmt, ...)
556 {
557   if (opt.debug)
558     {
559       va_list args;
560       struct logvprintf_state lpstate;
561       bool done;
562
563       check_redirect_output ();
564       if (inhibit_logging)
565         return;
566
567       xzero (lpstate);
568       do
569         {
570           va_start (args, fmt);
571           done = log_vprintf_internal (&lpstate, fmt, args);
572           va_end (args);
573         }
574       while (!done);
575     }
576 }
577 #endif /* ENABLE_DEBUG */
578 \f
579 /* Open FILE and set up a logging stream.  If FILE cannot be opened,
580    exit with status of 1.  */
581 void
582 log_init (const char *file, bool appendp)
583 {
584   if (file)
585     {
586       logfp = fopen (file, appendp ? "a" : "w");
587       if (!logfp)
588         {
589           fprintf (stderr, "%s: %s: %s\n", exec_name, file, strerror (errno));
590           exit (1);
591         }
592     }
593   else
594     {
595       /* The log goes to stderr to avoid collisions with the output if
596          the user specifies `-O -'.  #### Francois Pinard suggests
597          that it's a better idea to print to stdout by default, and to
598          stderr only if the user actually specifies `-O -'.  He says
599          this inconsistency is harder to document, but is overall
600          easier on the user.  */
601       logfp = stderr;
602
603       if (1
604 #ifdef HAVE_ISATTY
605           && isatty (fileno (logfp))
606 #endif
607           )
608         {
609           /* If the output is a TTY, enable save context, i.e. store
610              the most recent several messages ("context") and dump
611              them to a log file in case SIGHUP or SIGUSR1 is received
612              (or Ctrl+Break is pressed under Windows).  */
613           save_context_p = true;
614         }
615     }
616 }
617
618 /* Close LOGFP (only if we opened it, not if it's stderr), inhibit
619    further logging and free the memory associated with it.  */
620 void
621 log_close (void)
622 {
623   int i;
624
625   if (logfp && (logfp != stderr))
626     fclose (logfp);
627   logfp = NULL;
628   inhibit_logging = true;
629   save_context_p = false;
630
631   for (i = 0; i < SAVED_LOG_LINES; i++)
632     free_log_line (i);
633   log_line_current = -1;
634   trailing_line = false;
635 }
636
637 /* Dump saved lines to logfp. */
638 static void
639 log_dump_context (void)
640 {
641   int num = log_line_current;
642   FILE *fp = get_log_fp ();
643   FILE *warcfp = get_warc_log_fp ();
644   if (!fp)
645     return;
646
647   if (num == -1)
648     return;
649   if (trailing_line)
650     ROT_ADVANCE (num);
651   do
652     {
653       struct log_ln *ln = log_lines + num;
654       if (ln->content)
655         {
656           FPUTS (ln->content, fp);
657           if (warcfp != NULL)
658             FPUTS (ln->content, warcfp);
659         }
660       ROT_ADVANCE (num);
661     }
662   while (num != log_line_current);
663   if (trailing_line)
664     if (log_lines[log_line_current].content)
665       {
666         FPUTS (log_lines[log_line_current].content, fp);
667         if (warcfp != NULL)
668           FPUTS (log_lines[log_line_current].content, warcfp);
669       }
670   fflush (fp);
671   fflush (warcfp);
672 }
673 \f
674 /* String escape functions. */
675
676 /* Return the number of non-printable characters in SOURCE.
677    Non-printable characters are determined as per c-ctype.c.  */
678
679 static int
680 count_nonprint (const char *source)
681 {
682   const char *p;
683   int cnt;
684   for (p = source, cnt = 0; *p; p++)
685     if (!c_isprint (*p))
686       ++cnt;
687   return cnt;
688 }
689
690 /* Copy SOURCE to DEST, escaping non-printable characters.
691
692    Non-printable refers to anything outside the non-control ASCII
693    range (32-126) which means that, for example, CR, LF, and TAB are
694    considered non-printable along with ESC, BS, and other control
695    chars.  This is by design: it makes sure that messages from remote
696    servers cannot be easily used to deceive the users by mimicking
697    Wget's output.  Disallowing non-ASCII characters is another
698    necessary security measure, which makes sure that remote servers
699    cannot garble the screen or guess the local charset and perform
700    homographic attacks.
701
702    Of course, the above mandates that escnonprint only be used in
703    contexts expected to be ASCII, such as when printing host names,
704    URL components, HTTP headers, FTP server messages, and the like.
705
706    ESCAPE is the leading character of the escape sequence.  BASE
707    should be the base of the escape sequence, and must be either 8 for
708    octal or 16 for hex.
709
710    DEST must point to a location with sufficient room to store an
711    encoded version of SOURCE.  */
712
713 static void
714 copy_and_escape (const char *source, char *dest, char escape, int base)
715 {
716   const char *from = source;
717   char *to = dest;
718   unsigned char c;
719
720   /* Copy chars from SOURCE to DEST, escaping non-printable ones. */
721   switch (base)
722     {
723     case 8:
724       while ((c = *from++) != '\0')
725         if (c_isprint (c))
726           *to++ = c;
727         else
728           {
729             *to++ = escape;
730             *to++ = '0' + (c >> 6);
731             *to++ = '0' + ((c >> 3) & 7);
732             *to++ = '0' + (c & 7);
733           }
734       break;
735     case 16:
736       while ((c = *from++) != '\0')
737         if (c_isprint (c))
738           *to++ = c;
739         else
740           {
741             *to++ = escape;
742             *to++ = XNUM_TO_DIGIT (c >> 4);
743             *to++ = XNUM_TO_DIGIT (c & 0xf);
744           }
745       break;
746     default:
747       abort ();
748     }
749   *to = '\0';
750 }
751
752 #define RING_SIZE 3
753 struct ringel {
754   char *buffer;
755   int size;
756 };
757 static struct ringel ring[RING_SIZE];   /* ring data */
758
759 static const char *
760 escnonprint_internal (const char *str, char escape, int base)
761 {
762   static int ringpos;                   /* current ring position */
763   int nprcnt;
764
765   assert (base == 8 || base == 16);
766
767   nprcnt = count_nonprint (str);
768   if (nprcnt == 0)
769     /* If there are no non-printable chars in STR, don't bother
770        copying anything, just return STR.  */
771     return str;
772
773   {
774     /* Set up a pointer to the current ring position, so we can write
775        simply r->X instead of ring[ringpos].X. */
776     struct ringel *r = ring + ringpos;
777
778     /* Every non-printable character is replaced with the escape char
779        and three (or two, depending on BASE) *additional* chars.  Size
780        must also include the length of the original string and one
781        additional char for the terminating \0. */
782     int needed_size = strlen (str) + 1 + (base == 8 ? 3 * nprcnt : 2 * nprcnt);
783
784     /* If the current buffer is uninitialized or too small,
785        (re)allocate it.  */
786     if (r->buffer == NULL || r->size < needed_size)
787       {
788         r->buffer = xrealloc (r->buffer, needed_size);
789         r->size = needed_size;
790       }
791
792     copy_and_escape (str, r->buffer, escape, base);
793     ringpos = (ringpos + 1) % RING_SIZE;
794     return r->buffer;
795   }
796 }
797
798 /* Return a pointer to a static copy of STR with the non-printable
799    characters escaped as \ooo.  If there are no non-printable
800    characters in STR, STR is returned.  See copy_and_escape for more
801    information on which characters are considered non-printable.
802
803    DON'T call this function on translated strings because escaping
804    will break them.  Don't call it on literal strings from the source,
805    which are by definition trusted.  If newlines are allowed in the
806    string, escape and print it line by line because escaping the whole
807    string will convert newlines to \012.  (This is so that expectedly
808    single-line messages cannot use embedded newlines to mimic Wget's
809    output and deceive the user.)
810
811    escnonprint doesn't quote its escape character because it is notf
812    meant as a general and reversible quoting mechanism, but as a quick
813    way to defang binary junk sent by malicious or buggy servers.
814
815    NOTE: since this function can return a pointer to static data, be
816    careful to copy its result before calling it again.  However, to be
817    more useful with printf, it maintains an internal ring of static
818    buffers to return.  Currently the ring size is 3, which means you
819    can print up to three values in the same printf; if more is needed,
820    bump RING_SIZE.  */
821
822 const char *
823 escnonprint (const char *str)
824 {
825   return escnonprint_internal (str, '\\', 8);
826 }
827
828 /* Return a pointer to a static copy of STR with the non-printable
829    characters escaped as %XX.  If there are no non-printable
830    characters in STR, STR is returned.
831
832    See escnonprint for usage details.  */
833
834 const char *
835 escnonprint_uri (const char *str)
836 {
837   return escnonprint_internal (str, '%', 16);
838 }
839
840 void
841 log_cleanup (void)
842 {
843   size_t i;
844   for (i = 0; i < countof (ring); i++)
845     xfree_null (ring[i].buffer);
846 }
847 \f
848 /* When SIGHUP or SIGUSR1 are received, the output is redirected
849    elsewhere.  Such redirection is only allowed once. */
850 static enum { RR_NONE, RR_REQUESTED, RR_DONE } redirect_request = RR_NONE;
851 static const char *redirect_request_signal_name;
852
853 /* Redirect output to `wget-log'.  */
854
855 static void
856 redirect_output (void)
857 {
858   char *logfile;
859   logfp = unique_create (DEFAULT_LOGFILE, false, &logfile);
860   if (logfp)
861     {
862       fprintf (stderr, _("\n%s received, redirecting output to %s.\n"),
863                redirect_request_signal_name, quote (logfile));
864       xfree (logfile);
865       /* Dump the context output to the newly opened log.  */
866       log_dump_context ();
867     }
868   else
869     {
870       /* Eek!  Opening the alternate log file has failed.  Nothing we
871          can do but disable printing completely. */
872       fprintf (stderr, _("\n%s received.\n"), redirect_request_signal_name);
873       fprintf (stderr, _("%s: %s; disabling logging.\n"),
874                (logfile) ? logfile : DEFAULT_LOGFILE, strerror (errno));
875       inhibit_logging = true;
876     }
877   save_context_p = false;
878 }
879
880 /* Check whether a signal handler requested the output to be
881    redirected. */
882
883 static void
884 check_redirect_output (void)
885 {
886   if (redirect_request == RR_REQUESTED)
887     {
888       redirect_request = RR_DONE;
889       redirect_output ();
890     }
891 }
892
893 /* Request redirection at a convenient time.  This may be called from
894    a signal handler. */
895
896 void
897 log_request_redirect_output (const char *signal_name)
898 {
899   if (redirect_request == RR_NONE && save_context_p)
900     /* Request output redirection.  The request will be processed by
901        check_redirect_output(), which is called from entry point log
902        functions. */
903     redirect_request = RR_REQUESTED;
904   redirect_request_signal_name = signal_name;
905 }