]> sjero.net Git - wget/blob - src/utils.c
[svn] Added support for cookies.
[wget] / src / utils.c
1 /* Various functions of utilitarian nature.
2    Copyright (C) 1995, 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
3
4 This file is part of Wget.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
19
20 #include <config.h>
21
22 #include <stdio.h>
23 #include <stdlib.h>
24 #ifdef HAVE_STRING_H
25 # include <string.h>
26 #else  /* not HAVE_STRING_H */
27 # include <strings.h>
28 #endif /* not HAVE_STRING_H */
29 #include <sys/types.h>
30 #ifdef HAVE_UNISTD_H
31 # include <unistd.h>
32 #endif
33 #ifdef HAVE_MMAP
34 # include <sys/mman.h>
35 #endif
36 #ifdef HAVE_PWD_H
37 # include <pwd.h>
38 #endif
39 #include <limits.h>
40 #ifdef HAVE_UTIME_H
41 # include <utime.h>
42 #endif
43 #ifdef HAVE_SYS_UTIME_H
44 # include <sys/utime.h>
45 #endif
46 #include <errno.h>
47 #ifdef NeXT
48 # include <libc.h>              /* for access() */
49 #endif
50 #include <fcntl.h>
51 #include <assert.h>
52
53 #include "wget.h"
54 #include "utils.h"
55 #include "fnmatch.h"
56 #include "hash.h"
57
58 #ifndef errno
59 extern int errno;
60 #endif
61
62 /* This section implements several wrappers around the basic
63    allocation routines.  This is done for two reasons: first, so that
64    the callers of these functions need not consistently check for
65    errors.  If there is not enough virtual memory for running Wget,
66    something is seriously wrong, and Wget exits with an appropriate
67    error message.
68
69    The second reason why these are useful is that, if DEBUG_MALLOC is
70    defined, they also provide a handy (if crude) malloc debugging
71    interface that checks memory leaks.  */
72
73 /* Croak the fatal memory error and bail out with non-zero exit
74    status.  */
75 static void
76 memfatal (const char *what)
77 {
78   /* HACK: expose save_log_p from log.c, so we can turn it off in
79      order to prevent saving the log.  Saving the log is dangerous
80      because logprintf() and logputs() can call malloc(), so this
81      could infloop.  When logging is turned off, infloop can no longer
82      happen.
83
84      #### This is no longer really necessary because the new routines
85      in log.c cons only if the line exceeds eighty characters.  But
86      this can come at the end of a line, so it's OK to be careful.
87
88      On a more serious note, it would be good to have a
89      log_forced_shutdown() routine that exposes this cleanly.  */
90   extern int save_log_p;
91
92   save_log_p = 0;
93   logprintf (LOG_ALWAYS, _("%s: %s: Not enough memory.\n"), exec_name, what);
94   exit (1);
95 }
96
97 /* These functions end with _real because they need to be
98    distinguished from the debugging functions, and from the macros.
99    Explanation follows:
100
101    If memory debugging is not turned on, wget.h defines these:
102
103      #define xmalloc xmalloc_real
104      #define xrealloc xrealloc_real
105      #define xstrdup xstrdup_real
106      #define xfree free
107
108    In case of memory debugging, the definitions are a bit more
109    complex, because we want to provide more information, *and* we want
110    to call the debugging code.  (The former is the reason why xmalloc
111    and friends need to be macros in the first place.)  Then it looks
112    like this:
113
114      #define xmalloc(a) xmalloc_debug (a, __FILE__, __LINE__)
115      #define xfree(a)   xfree_debug (a, __FILE__, __LINE__)
116      #define xrealloc(a, b) xrealloc_debug (a, b, __FILE__, __LINE__)
117      #define xstrdup(a) xstrdup_debug (a, __FILE__, __LINE__)
118
119    Each of the *_debug function does its magic and calls the real one.  */
120
121 #ifdef DEBUG_MALLOC
122 # define STATIC_IF_DEBUG static
123 #else
124 # define STATIC_IF_DEBUG
125 #endif
126
127 STATIC_IF_DEBUG void *
128 xmalloc_real (size_t size)
129 {
130   void *ptr = malloc (size);
131   if (!ptr)
132     memfatal ("malloc");
133   return ptr;
134 }
135
136 STATIC_IF_DEBUG void *
137 xrealloc_real (void *ptr, size_t newsize)
138 {
139   void *newptr;
140
141   /* Not all Un*xes have the feature of realloc() that calling it with
142      a NULL-pointer is the same as malloc(), but it is easy to
143      simulate.  */
144   if (ptr)
145     newptr = realloc (ptr, newsize);
146   else
147     newptr = malloc (newsize);
148   if (!newptr)
149     memfatal ("realloc");
150   return newptr;
151 }
152
153 STATIC_IF_DEBUG char *
154 xstrdup_real (const char *s)
155 {
156   char *copy;
157
158 #ifndef HAVE_STRDUP
159   int l = strlen (s);
160   copy = malloc (l + 1);
161   if (!copy)
162     memfatal ("strdup");
163   memcpy (copy, s, l + 1);
164 #else  /* HAVE_STRDUP */
165   copy = strdup (s);
166   if (!copy)
167     memfatal ("strdup");
168 #endif /* HAVE_STRDUP */
169
170   return copy;
171 }
172
173 #ifdef DEBUG_MALLOC
174
175 /* Crude home-grown routines for debugging some malloc-related
176    problems.  Featured:
177
178    * Counting the number of malloc and free invocations, and reporting
179      the "balance", i.e. how many times more malloc was called than it
180      was the case with free.
181
182    * Making malloc store its entry into a simple array and free remove
183      stuff from that array.  At the end, print the pointers which have
184      not been freed, along with the source file and the line number.
185      This also has the side-effect of detecting freeing memory that
186      was never allocated.
187
188    Note that this kind of memory leak checking strongly depends on
189    every malloc() being followed by a free(), even if the program is
190    about to finish.  Wget is careful to free the data structure it
191    allocated in init.c.  */
192
193 static int malloc_count, free_count;
194
195 static struct {
196   char *ptr;
197   const char *file;
198   int line;
199 } malloc_debug[100000];
200
201 /* Both register_ptr and unregister_ptr take O(n) operations to run,
202    which can be a real problem.  It would be nice to use a hash table
203    for malloc_debug, but the functions in hash.c are not suitable
204    because they can call malloc() themselves.  Maybe it would work if
205    the hash table were preallocated to a huge size, and if we set the
206    rehash threshold to 1.0.  */
207
208 /* Register PTR in malloc_debug.  Abort if this is not possible
209    (presumably due to the number of current allocations exceeding the
210    size of malloc_debug.)  */
211
212 static void
213 register_ptr (void *ptr, const char *file, int line)
214 {
215   int i;
216   for (i = 0; i < ARRAY_SIZE (malloc_debug); i++)
217     if (malloc_debug[i].ptr == NULL)
218       {
219         malloc_debug[i].ptr = ptr;
220         malloc_debug[i].file = file;
221         malloc_debug[i].line = line;
222         return;
223       }
224   abort ();
225 }
226
227 /* Unregister PTR from malloc_debug.  Abort if PTR is not present in
228    malloc_debug.  (This catches calling free() with a bogus pointer.)  */
229
230 static void
231 unregister_ptr (void *ptr)
232 {
233   int i;
234   for (i = 0; i < ARRAY_SIZE (malloc_debug); i++)
235     if (malloc_debug[i].ptr == ptr)
236       {
237         malloc_debug[i].ptr = NULL;
238         return;
239       }
240   abort ();
241 }
242
243 /* Print the malloc debug stats that can be gathered from the above
244    information.  Currently this is the count of mallocs, frees, the
245    difference between the two, and the dump of the contents of
246    malloc_debug.  The last part are the memory leaks.  */
247
248 void
249 print_malloc_debug_stats (void)
250 {
251   int i;
252   printf ("\nMalloc:  %d\nFree:    %d\nBalance: %d\n\n",
253           malloc_count, free_count, malloc_count - free_count);
254   for (i = 0; i < ARRAY_SIZE (malloc_debug); i++)
255     if (malloc_debug[i].ptr != NULL)
256       printf ("0x%08ld: %s:%d\n", (long)malloc_debug[i].ptr,
257               malloc_debug[i].file, malloc_debug[i].line);
258 }
259
260 void *
261 xmalloc_debug (size_t size, const char *source_file, int source_line)
262 {
263   void *ptr = xmalloc_real (size);
264   ++malloc_count;
265   register_ptr (ptr, source_file, source_line);
266   return ptr;
267 }
268
269 void
270 xfree_debug (void *ptr, const char *source_file, int source_line)
271 {
272   assert (ptr != NULL);
273   ++free_count;
274   unregister_ptr (ptr);
275   free (ptr);
276 }
277
278 void *
279 xrealloc_debug (void *ptr, size_t newsize, const char *source_file, int source_line)
280 {
281   void *newptr = xrealloc_real (ptr, newsize);
282   if (!ptr)
283     {
284       ++malloc_count;
285       register_ptr (newptr, source_file, source_line);
286     }
287   else if (newptr != ptr)
288     {
289       unregister_ptr (ptr);
290       register_ptr (newptr, source_file, source_line);
291     }
292   return newptr;
293 }
294
295 char *
296 xstrdup_debug (const char *s, const char *source_file, int source_line)
297 {
298   char *copy = xstrdup_real (s);
299   ++malloc_count;
300   register_ptr (copy, source_file, source_line);
301   return copy;
302 }
303
304 #endif /* DEBUG_MALLOC */
305 \f
306 /* Copy the string formed by two pointers (one on the beginning, other
307    on the char after the last char) to a new, malloc-ed location.
308    0-terminate it.  */
309 char *
310 strdupdelim (const char *beg, const char *end)
311 {
312   char *res = (char *)xmalloc (end - beg + 1);
313   memcpy (res, beg, end - beg);
314   res[end - beg] = '\0';
315   return res;
316 }
317
318 /* Parse a string containing comma-separated elements, and return a
319    vector of char pointers with the elements.  Spaces following the
320    commas are ignored.  */
321 char **
322 sepstring (const char *s)
323 {
324   char **res;
325   const char *p;
326   int i = 0;
327
328   if (!s || !*s)
329     return NULL;
330   res = NULL;
331   p = s;
332   while (*s)
333     {
334       if (*s == ',')
335         {
336           res = (char **)xrealloc (res, (i + 2) * sizeof (char *));
337           res[i] = strdupdelim (p, s);
338           res[++i] = NULL;
339           ++s;
340           /* Skip the blanks following the ','.  */
341           while (ISSPACE (*s))
342             ++s;
343           p = s;
344         }
345       else
346         ++s;
347     }
348   res = (char **)xrealloc (res, (i + 2) * sizeof (char *));
349   res[i] = strdupdelim (p, s);
350   res[i + 1] = NULL;
351   return res;
352 }
353 \f
354 /* Return pointer to a static char[] buffer in which zero-terminated
355    string-representation of TM (in form hh:mm:ss) is printed.
356
357    If TM is non-NULL, the current time-in-seconds will be stored
358    there.
359
360    (#### This is misleading: one would expect TM would be used instead
361    of the current time in that case.  This design was probably
362    influenced by the design time(2), and should be changed at some
363    points.  No callers use non-NULL TM anyway.)  */
364
365 char *
366 time_str (time_t *tm)
367 {
368   static char output[15];
369   struct tm *ptm;
370   time_t secs = time (tm);
371
372   if (secs == -1)
373     {
374       /* In case of error, return the empty string.  Maybe we should
375          just abort if this happens?  */
376       *output = '\0';
377       return output;
378     }
379   ptm = localtime (&secs);
380   sprintf (output, "%02d:%02d:%02d", ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
381   return output;
382 }
383
384 /* Like the above, but include the date: YYYY-MM-DD hh:mm:ss.  */
385
386 char *
387 datetime_str (time_t *tm)
388 {
389   static char output[20];       /* "YYYY-MM-DD hh:mm:ss" + \0 */
390   struct tm *ptm;
391   time_t secs = time (tm);
392
393   if (secs == -1)
394     {
395       /* In case of error, return the empty string.  Maybe we should
396          just abort if this happens?  */
397       *output = '\0';
398       return output;
399     }
400   ptm = localtime (&secs);
401   sprintf (output, "%04d-%02d-%02d %02d:%02d:%02d",
402            ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday,
403            ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
404   return output;
405 }
406
407 /* Returns an error message for ERRNUM.  #### This requires more work.
408    This function, as well as the whole error system, is very
409    ill-conceived.  */
410 const char *
411 uerrmsg (uerr_t errnum)
412 {
413   switch (errnum)
414     {
415     case URLUNKNOWN:
416       return _("Unknown/unsupported protocol");
417       break;
418     case URLBADPORT:
419       return _("Invalid port specification");
420       break;
421     case URLBADHOST:
422       return _("Invalid host name");
423       break;
424     default:
425       abort ();
426       /* $@#@#$ compiler.  */
427       return NULL;
428     }
429 }
430 \f
431 /* The Windows versions of the following two functions are defined in
432    mswindows.c.  */
433
434 /* A cuserid() immitation using getpwuid(), to avoid hassling with
435    utmp.  Besides, not all systems have cuesrid().  Under Windows, it
436    is defined in mswindows.c.
437
438    If WHERE is non-NULL, the username will be stored there.
439    Otherwise, it will be returned as a static buffer (as returned by
440    getpwuid()).  In the latter case, the buffer should be copied
441    before calling getpwuid() or pwd_cuserid() again.  */
442 #ifndef WINDOWS
443 char *
444 pwd_cuserid (char *where)
445 {
446   struct passwd *pwd;
447
448   if (!(pwd = getpwuid (getuid ())) || !pwd->pw_name)
449     return NULL;
450   if (where)
451     {
452       strcpy (where, pwd->pw_name);
453       return where;
454     }
455   else
456     return pwd->pw_name;
457 }
458
459 void
460 fork_to_background (void)
461 {
462   pid_t pid;
463   /* Whether we arrange our own version of opt.lfilename here.  */
464   int changedp = 0;
465
466   if (!opt.lfilename)
467     {
468       opt.lfilename = unique_name (DEFAULT_LOGFILE);
469       changedp = 1;
470     }
471   pid = fork ();
472   if (pid < 0)
473     {
474       /* parent, error */
475       perror ("fork");
476       exit (1);
477     }
478   else if (pid != 0)
479     {
480       /* parent, no error */
481       printf (_("Continuing in background.\n"));
482       if (changedp)
483         printf (_("Output will be written to `%s'.\n"), opt.lfilename);
484       exit (0);
485     }
486   /* child: keep running */
487 }
488 #endif /* not WINDOWS */
489 \f
490 /* Canonicalize PATH, and return a new path.  The new path differs from PATH
491    in that:
492         Multple `/'s are collapsed to a single `/'.
493         Leading `./'s and trailing `/.'s are removed.
494         Trailing `/'s are removed.
495         Non-leading `../'s and trailing `..'s are handled by removing
496         portions of the path.
497
498    E.g. "a/b/c/./../d/.." will yield "a/b".  This function originates
499    from GNU Bash.
500
501    Changes for Wget:
502         Always use '/' as stub_char.
503         Don't check for local things using canon_stat.
504         Change the original string instead of strdup-ing.
505         React correctly when beginning with `./' and `../'.  */
506 void
507 path_simplify (char *path)
508 {
509   register int i, start, ddot;
510   char stub_char;
511
512   if (!*path)
513     return;
514
515   /*stub_char = (*path == '/') ? '/' : '.';*/
516   stub_char = '/';
517
518   /* Addition: Remove all `./'-s preceding the string.  If `../'-s
519      precede, put `/' in front and remove them too.  */
520   i = 0;
521   ddot = 0;
522   while (1)
523     {
524       if (path[i] == '.' && path[i + 1] == '/')
525         i += 2;
526       else if (path[i] == '.' && path[i + 1] == '.' && path[i + 2] == '/')
527         {
528           i += 3;
529           ddot = 1;
530         }
531       else
532         break;
533     }
534   if (i)
535     strcpy (path, path + i - ddot);
536
537   /* Replace single `.' or `..' with `/'.  */
538   if ((path[0] == '.' && path[1] == '\0')
539       || (path[0] == '.' && path[1] == '.' && path[2] == '\0'))
540     {
541       path[0] = stub_char;
542       path[1] = '\0';
543       return;
544     }
545   /* Walk along PATH looking for things to compact.  */
546   i = 0;
547   while (1)
548     {
549       if (!path[i])
550         break;
551
552       while (path[i] && path[i] != '/')
553         i++;
554
555       start = i++;
556
557       /* If we didn't find any slashes, then there is nothing left to do.  */
558       if (!path[start])
559         break;
560
561       /* Handle multiple `/'s in a row.  */
562       while (path[i] == '/')
563         i++;
564
565       if ((start + 1) != i)
566         {
567           strcpy (path + start + 1, path + i);
568           i = start + 1;
569         }
570
571       /* Check for trailing `/'.  */
572       if (start && !path[i])
573         {
574         zero_last:
575           path[--i] = '\0';
576           break;
577         }
578
579       /* Check for `../', `./' or trailing `.' by itself.  */
580       if (path[i] == '.')
581         {
582           /* Handle trailing `.' by itself.  */
583           if (!path[i + 1])
584             goto zero_last;
585
586           /* Handle `./'.  */
587           if (path[i + 1] == '/')
588             {
589               strcpy (path + i, path + i + 1);
590               i = (start < 0) ? 0 : start;
591               continue;
592             }
593
594           /* Handle `../' or trailing `..' by itself.  */
595           if (path[i + 1] == '.' &&
596               (path[i + 2] == '/' || !path[i + 2]))
597             {
598               while (--start > -1 && path[start] != '/');
599               strcpy (path + start + 1, path + i + 2);
600               i = (start < 0) ? 0 : start;
601               continue;
602             }
603         }       /* path == '.' */
604     } /* while */
605
606   if (!*path)
607     {
608       *path = stub_char;
609       path[1] = '\0';
610     }
611 }
612 \f
613 /* "Touch" FILE, i.e. make its atime and mtime equal to the time
614    specified with TM.  */
615 void
616 touch (const char *file, time_t tm)
617 {
618 #ifdef HAVE_STRUCT_UTIMBUF
619   struct utimbuf times;
620   times.actime = times.modtime = tm;
621 #else
622   time_t times[2];
623   times[0] = times[1] = tm;
624 #endif
625
626   if (utime (file, &times) == -1)
627     logprintf (LOG_NOTQUIET, "utime(%s): %s\n", file, strerror (errno));
628 }
629
630 /* Checks if FILE is a symbolic link, and removes it if it is.  Does
631    nothing under MS-Windows.  */
632 int
633 remove_link (const char *file)
634 {
635   int err = 0;
636   struct stat st;
637
638   if (lstat (file, &st) == 0 && S_ISLNK (st.st_mode))
639     {
640       DEBUGP (("Unlinking %s (symlink).\n", file));
641       err = unlink (file);
642       if (err != 0)
643         logprintf (LOG_VERBOSE, _("Failed to unlink symlink `%s': %s\n"),
644                    file, strerror (errno));
645     }
646   return err;
647 }
648
649 /* Does FILENAME exist?  This is quite a lousy implementation, since
650    it supplies no error codes -- only a yes-or-no answer.  Thus it
651    will return that a file does not exist if, e.g., the directory is
652    unreadable.  I don't mind it too much currently, though.  The
653    proper way should, of course, be to have a third, error state,
654    other than true/false, but that would introduce uncalled-for
655    additional complexity to the callers.  */
656 int
657 file_exists_p (const char *filename)
658 {
659 #ifdef HAVE_ACCESS
660   return access (filename, F_OK) >= 0;
661 #else
662   struct stat buf;
663   return stat (filename, &buf) >= 0;
664 #endif
665 }
666
667 /* Returns 0 if PATH is a directory, 1 otherwise (any kind of file).
668    Returns 0 on error.  */
669 int
670 file_non_directory_p (const char *path)
671 {
672   struct stat buf;
673   /* Use lstat() rather than stat() so that symbolic links pointing to
674      directories can be identified correctly.  */
675   if (lstat (path, &buf) != 0)
676     return 0;
677   return S_ISDIR (buf.st_mode) ? 0 : 1;
678 }
679
680 /* Return a unique filename, given a prefix and count */
681 static char *
682 unique_name_1 (const char *fileprefix, int count)
683 {
684   char *filename;
685
686   if (count)
687     {
688       filename = (char *)xmalloc (strlen (fileprefix) + numdigit (count) + 2);
689       sprintf (filename, "%s.%d", fileprefix, count);
690     }
691   else
692     filename = xstrdup (fileprefix);
693
694   if (!file_exists_p (filename))
695     return filename;
696   else
697     {
698       xfree (filename);
699       return NULL;
700     }
701 }
702
703 /* Return a unique file name, based on PREFIX.  */
704 char *
705 unique_name (const char *prefix)
706 {
707   char *file = NULL;
708   int count = 0;
709
710   while (!file)
711     file = unique_name_1 (prefix, count++);
712   return file;
713 }
714 \f
715 /* Create DIRECTORY.  If some of the pathname components of DIRECTORY
716    are missing, create them first.  In case any mkdir() call fails,
717    return its error status.  Returns 0 on successful completion.
718
719    The behaviour of this function should be identical to the behaviour
720    of `mkdir -p' on systems where mkdir supports the `-p' option.  */
721 int
722 make_directory (const char *directory)
723 {
724   int quit = 0;
725   int i;
726   char *dir;
727
728   /* Make a copy of dir, to be able to write to it.  Otherwise, the
729      function is unsafe if called with a read-only char *argument.  */
730   STRDUP_ALLOCA (dir, directory);
731
732   /* If the first character of dir is '/', skip it (and thus enable
733      creation of absolute-pathname directories.  */
734   for (i = (*dir == '/'); 1; ++i)
735     {
736       for (; dir[i] && dir[i] != '/'; i++)
737         ;
738       if (!dir[i])
739         quit = 1;
740       dir[i] = '\0';
741       /* Check whether the directory already exists.  */
742       if (!file_exists_p (dir))
743         {
744           if (mkdir (dir, 0777) < 0)
745             return -1;
746         }
747       if (quit)
748         break;
749       else
750         dir[i] = '/';
751     }
752   return 0;
753 }
754 \f
755 static int in_acclist PARAMS ((const char *const *, const char *, int));
756
757 /* Determine whether a file is acceptable to be followed, according to
758    lists of patterns to accept/reject.  */
759 int
760 acceptable (const char *s)
761 {
762   int l = strlen (s);
763
764   while (l && s[l] != '/')
765     --l;
766   if (s[l] == '/')
767     s += (l + 1);
768   if (opt.accepts)
769     {
770       if (opt.rejects)
771         return (in_acclist ((const char *const *)opt.accepts, s, 1)
772                 && !in_acclist ((const char *const *)opt.rejects, s, 1));
773       else
774         return in_acclist ((const char *const *)opt.accepts, s, 1);
775     }
776   else if (opt.rejects)
777     return !in_acclist ((const char *const *)opt.rejects, s, 1);
778   return 1;
779 }
780
781 /* Compare S1 and S2 frontally; S2 must begin with S1.  E.g. if S1 is
782    `/something', frontcmp() will return 1 only if S2 begins with
783    `/something'.  Otherwise, 0 is returned.  */
784 int
785 frontcmp (const char *s1, const char *s2)
786 {
787   for (; *s1 && *s2 && (*s1 == *s2); ++s1, ++s2);
788   return !*s1;
789 }
790
791 /* Iterate through STRLIST, and return the first element that matches
792    S, through wildcards or front comparison (as appropriate).  */
793 static char *
794 proclist (char **strlist, const char *s, enum accd flags)
795 {
796   char **x;
797
798   for (x = strlist; *x; x++)
799     if (has_wildcards_p (*x))
800       {
801         if (fnmatch (*x, s, FNM_PATHNAME) == 0)
802           break;
803       }
804     else
805       {
806         char *p = *x + ((flags & ALLABS) && (**x == '/')); /* Remove '/' */
807         if (frontcmp (p, s))
808           break;
809       }
810   return *x;
811 }
812
813 /* Returns whether DIRECTORY is acceptable for download, wrt the
814    include/exclude lists.
815
816    If FLAGS is ALLABS, the leading `/' is ignored in paths; relative
817    and absolute paths may be freely intermixed.  */
818 int
819 accdir (const char *directory, enum accd flags)
820 {
821   /* Remove starting '/'.  */
822   if (flags & ALLABS && *directory == '/')
823     ++directory;
824   if (opt.includes)
825     {
826       if (!proclist (opt.includes, directory, flags))
827         return 0;
828     }
829   if (opt.excludes)
830     {
831       if (proclist (opt.excludes, directory, flags))
832         return 0;
833     }
834   return 1;
835 }
836
837 /* Match the end of STRING against PATTERN.  For instance:
838
839    match_backwards ("abc", "bc") -> 1
840    match_backwards ("abc", "ab") -> 0
841    match_backwards ("abc", "abc") -> 1 */
842 static int
843 match_backwards (const char *string, const char *pattern)
844 {
845   int i, j;
846
847   for (i = strlen (string), j = strlen (pattern); i >= 0 && j >= 0; i--, j--)
848     if (string[i] != pattern[j])
849       break;
850   /* If the pattern was exhausted, the match was succesful.  */
851   if (j == -1)
852     return 1;
853   else
854     return 0;
855 }
856
857 /* Checks whether string S matches each element of ACCEPTS.  A list
858    element are matched either with fnmatch() or match_backwards(),
859    according to whether the element contains wildcards or not.
860
861    If the BACKWARD is 0, don't do backward comparison -- just compare
862    them normally.  */
863 static int
864 in_acclist (const char *const *accepts, const char *s, int backward)
865 {
866   for (; *accepts; accepts++)
867     {
868       if (has_wildcards_p (*accepts))
869         {
870           /* fnmatch returns 0 if the pattern *does* match the
871              string.  */
872           if (fnmatch (*accepts, s, 0) == 0)
873             return 1;
874         }
875       else
876         {
877           if (backward)
878             {
879               if (match_backwards (s, *accepts))
880                 return 1;
881             }
882           else
883             {
884               if (!strcmp (s, *accepts))
885                 return 1;
886             }
887         }
888     }
889   return 0;
890 }
891
892 /* Return the malloc-ed suffix of STR.  For instance:
893    suffix ("foo.bar")       -> "bar"
894    suffix ("foo.bar.baz")   -> "baz"
895    suffix ("/foo/bar")      -> NULL
896    suffix ("/foo.bar/baz")  -> NULL  */
897 char *
898 suffix (const char *str)
899 {
900   int i;
901
902   for (i = strlen (str); i && str[i] != '/' && str[i] != '.'; i--);
903   if (str[i++] == '.')
904     return xstrdup (str + i);
905   else
906     return NULL;
907 }
908
909 /* Read a line from FP.  The function reallocs the storage as needed
910    to accomodate for any length of the line.  Reallocs are done
911    storage exponentially, doubling the storage after each overflow to
912    minimize the number of calls to realloc() and fgets().  The newline
913    character at the end of line is retained.
914
915    After end-of-file is encountered without anything being read, NULL
916    is returned.  NULL is also returned on error.  To distinguish
917    between these two cases, use the stdio function ferror().  */
918
919 char *
920 read_whole_line (FILE *fp)
921 {
922   int length = 0;
923   int bufsize = 81;
924   char *line = (char *)xmalloc (bufsize);
925
926   while (fgets (line + length, bufsize - length, fp))
927     {
928       length += strlen (line + length);
929       assert (length > 0);
930       if (line[length - 1] == '\n')
931         break;
932       /* fgets() guarantees to read the whole line, or to use up the
933          space we've given it.  We can double the buffer
934          unconditionally.  */
935       bufsize <<= 1;
936       line = xrealloc (line, bufsize);
937     }
938   if (length == 0 || ferror (fp))
939     {
940       xfree (line);
941       return NULL;
942     }
943   if (length + 1 < bufsize)
944     /* Relieve the memory from our exponential greediness.  We say
945        `length + 1' because the terminating \0 is not included in
946        LENGTH.  We don't need to zero-terminate the string ourselves,
947        though, because fgets() does that.  */
948     line = xrealloc (line, length + 1);
949   return line;
950 }
951 \f
952 /* Read FILE into memory.  A pointer to `struct file_memory' are
953    returned; use struct element `content' to access file contents, and
954    the element `length' to know the file length.  `content' is *not*
955    zero-terminated, and you should *not* read or write beyond the [0,
956    length) range of characters.
957
958    After you are done with the file contents, call read_file_free to
959    release the memory.
960
961    Depending on the operating system and the type of file that is
962    being read, read_file() either mmap's the file into memory, or
963    reads the file into the core using read().
964
965    If file is named "-", fileno(stdin) is used for reading instead.
966    If you want to read from a real file named "-", use "./-" instead.  */
967
968 struct file_memory *
969 read_file (const char *file)
970 {
971   int fd;
972   struct file_memory *fm;
973   long size;
974   int inhibit_close = 0;
975
976   /* Some magic in the finest tradition of Perl and its kin: if FILE
977      is "-", just use stdin.  */
978   if (HYPHENP (file))
979     {
980       fd = fileno (stdin);
981       inhibit_close = 1;
982       /* Note that we don't inhibit mmap() in this case.  If stdin is
983          redirected from a regular file, mmap() will still work.  */
984     }
985   else
986     fd = open (file, O_RDONLY);
987   if (fd < 0)
988     return NULL;
989   fm = xmalloc (sizeof (struct file_memory));
990
991 #ifdef HAVE_MMAP
992   {
993     struct stat buf;
994     if (fstat (fd, &buf) < 0)
995       goto mmap_lose;
996     fm->length = buf.st_size;
997     /* NOTE: As far as I know, the callers of this function never
998        modify the file text.  Relying on this would enable us to
999        specify PROT_READ and MAP_SHARED for a marginal gain in
1000        efficiency, but at some cost to generality.  */
1001     fm->content = mmap (NULL, fm->length, PROT_READ | PROT_WRITE,
1002                         MAP_PRIVATE, fd, 0);
1003     if (fm->content == (char *)MAP_FAILED)
1004       goto mmap_lose;
1005     if (!inhibit_close)
1006       close (fd);
1007
1008     fm->mmap_p = 1;
1009     return fm;
1010   }
1011
1012  mmap_lose:
1013   /* The most common reason why mmap() fails is that FD does not point
1014      to a plain file.  However, it's also possible that mmap() doesn't
1015      work for a particular type of file.  Therefore, whenever mmap()
1016      fails, we just fall back to the regular method.  */
1017 #endif /* HAVE_MMAP */
1018
1019   fm->length = 0;
1020   size = 512;                   /* number of bytes fm->contents can
1021                                    hold at any given time. */
1022   fm->content = xmalloc (size);
1023   while (1)
1024     {
1025       long nread;
1026       if (fm->length > size / 2)
1027         {
1028           /* #### I'm not sure whether the whole exponential-growth
1029              thing makes sense with kernel read.  On Linux at least,
1030              read() refuses to read more than 4K from a file at a
1031              single chunk anyway.  But other Unixes might optimize it
1032              better, and it doesn't *hurt* anything, so I'm leaving
1033              it.  */
1034
1035           /* Normally, we grow SIZE exponentially to make the number
1036              of calls to read() and realloc() logarithmic in relation
1037              to file size.  However, read() can read an amount of data
1038              smaller than requested, and it would be unreasonably to
1039              double SIZE every time *something* was read.  Therefore,
1040              we double SIZE only when the length exceeds half of the
1041              entire allocated size.  */
1042           size <<= 1;
1043           fm->content = xrealloc (fm->content, size);
1044         }
1045       nread = read (fd, fm->content + fm->length, size - fm->length);
1046       if (nread > 0)
1047         /* Successful read. */
1048         fm->length += nread;
1049       else if (nread < 0)
1050         /* Error. */
1051         goto lose;
1052       else
1053         /* EOF */
1054         break;
1055     }
1056   if (!inhibit_close)
1057     close (fd);
1058   if (size > fm->length && fm->length != 0)
1059     /* Due to exponential growth of fm->content, the allocated region
1060        might be much larger than what is actually needed.  */
1061     fm->content = xrealloc (fm->content, fm->length);
1062   fm->mmap_p = 0;
1063   return fm;
1064
1065  lose:
1066   if (!inhibit_close)
1067     close (fd);
1068   xfree (fm->content);
1069   xfree (fm);
1070   return NULL;
1071 }
1072
1073 /* Release the resources held by FM.  Specifically, this calls
1074    munmap() or xfree() on fm->content, depending whether mmap or
1075    malloc/read were used to read in the file.  It also frees the
1076    memory needed to hold the FM structure itself.  */
1077
1078 void
1079 read_file_free (struct file_memory *fm)
1080 {
1081 #ifdef HAVE_MMAP
1082   if (fm->mmap_p)
1083     {
1084       munmap (fm->content, fm->length);
1085     }
1086   else
1087 #endif
1088     {
1089       xfree (fm->content);
1090     }
1091   xfree (fm);
1092 }
1093 \f
1094 /* Free the pointers in a NULL-terminated vector of pointers, then
1095    free the pointer itself.  */
1096 void
1097 free_vec (char **vec)
1098 {
1099   if (vec)
1100     {
1101       char **p = vec;
1102       while (*p)
1103         xfree (*p++);
1104       xfree (vec);
1105     }
1106 }
1107
1108 /* Append vector V2 to vector V1.  The function frees V2 and
1109    reallocates V1 (thus you may not use the contents of neither
1110    pointer after the call).  If V1 is NULL, V2 is returned.  */
1111 char **
1112 merge_vecs (char **v1, char **v2)
1113 {
1114   int i, j;
1115
1116   if (!v1)
1117     return v2;
1118   if (!v2)
1119     return v1;
1120   if (!*v2)
1121     {
1122       /* To avoid j == 0 */
1123       xfree (v2);
1124       return v1;
1125     }
1126   /* Count v1.  */
1127   for (i = 0; v1[i]; i++);
1128   /* Count v2.  */
1129   for (j = 0; v2[j]; j++);
1130   /* Reallocate v1.  */
1131   v1 = (char **)xrealloc (v1, (i + j + 1) * sizeof (char **));
1132   memcpy (v1 + i, v2, (j + 1) * sizeof (char *));
1133   xfree (v2);
1134   return v1;
1135 }
1136
1137 /* A set of simple-minded routines to store strings in a linked list.
1138    This used to also be used for searching, but now we have hash
1139    tables for that.  */
1140
1141 /* It's a shame that these simple things like linked lists and hash
1142    tables (see hash.c) need to be implemented over and over again.  It
1143    would be nice to be able to use the routines from glib -- see
1144    www.gtk.org for details.  However, that would make Wget depend on
1145    glib, and I want to avoid dependencies to external libraries for
1146    reasons of convenience and portability (I suspect Wget is more
1147    portable than anything ever written for Gnome).  */
1148
1149 /* Append an element to the list.  If the list has a huge number of
1150    elements, this can get slow because it has to find the list's
1151    ending.  If you think you have to call slist_append in a loop,
1152    think about calling slist_prepend() followed by slist_nreverse().  */
1153
1154 slist *
1155 slist_append (slist *l, const char *s)
1156 {
1157   slist *newel = (slist *)xmalloc (sizeof (slist));
1158   slist *beg = l;
1159
1160   newel->string = xstrdup (s);
1161   newel->next = NULL;
1162
1163   if (!l)
1164     return newel;
1165   /* Find the last element.  */
1166   while (l->next)
1167     l = l->next;
1168   l->next = newel;
1169   return beg;
1170 }
1171
1172 /* Prepend S to the list.  Unlike slist_append(), this is O(1).  */
1173
1174 slist *
1175 slist_prepend (slist *l, const char *s)
1176 {
1177   slist *newel = (slist *)xmalloc (sizeof (slist));
1178   newel->string = xstrdup (s);
1179   newel->next = l;
1180   return newel;
1181 }
1182
1183 /* Destructively reverse L. */
1184
1185 slist *
1186 slist_nreverse (slist *l)
1187 {
1188   slist *prev = NULL;
1189   while (l)
1190     {
1191       slist *next = l->next;
1192       l->next = prev;
1193       prev = l;
1194       l = next;
1195     }
1196   return prev;
1197 }
1198
1199 /* Is there a specific entry in the list?  */
1200 int
1201 slist_contains (slist *l, const char *s)
1202 {
1203   for (; l; l = l->next)
1204     if (!strcmp (l->string, s))
1205       return 1;
1206   return 0;
1207 }
1208
1209 /* Free the whole slist.  */
1210 void
1211 slist_free (slist *l)
1212 {
1213   while (l)
1214     {
1215       slist *n = l->next;
1216       xfree (l->string);
1217       xfree (l);
1218       l = n;
1219     }
1220 }
1221 \f
1222 /* Sometimes it's useful to create "sets" of strings, i.e. special
1223    hash tables where you want to store strings as keys and merely
1224    query for their existence.  Here is a set of utility routines that
1225    makes that transparent.  */
1226
1227 void
1228 string_set_add (struct hash_table *ht, const char *s)
1229 {
1230   /* First check whether the set element already exists.  If it does,
1231      do nothing so that we don't have to free() the old element and
1232      then strdup() a new one.  */
1233   if (hash_table_exists (ht, s))
1234     return;
1235
1236   /* We use "1" as value.  It provides us a useful and clear arbitrary
1237      value, and it consumes no memory -- the pointers to the same
1238      string "1" will be shared by all the key-value pairs in all `set'
1239      hash tables.  */
1240   hash_table_put (ht, xstrdup (s), "1");
1241 }
1242
1243 /* Synonym for hash_table_exists... */
1244
1245 int
1246 string_set_exists (struct hash_table *ht, const char *s)
1247 {
1248   return hash_table_exists (ht, s);
1249 }
1250
1251 static int
1252 string_set_free_mapper (void *key, void *value_ignored, void *arg_ignored)
1253 {
1254   xfree (key);
1255   return 0;
1256 }
1257
1258 void
1259 string_set_free (struct hash_table *ht)
1260 {
1261   hash_table_map (ht, string_set_free_mapper, NULL);
1262   hash_table_destroy (ht);
1263 }
1264
1265 static int
1266 free_keys_and_values_mapper (void *key, void *value, void *arg_ignored)
1267 {
1268   xfree (key);
1269   xfree (value);
1270   return 0;
1271 }
1272
1273 /* Another utility function: call free() on all keys and values of HT.  */
1274
1275 void
1276 free_keys_and_values (struct hash_table *ht)
1277 {
1278   hash_table_map (ht, free_keys_and_values_mapper, NULL);
1279 }
1280
1281 \f
1282 /* Engine for legible and legible_long_long; this function works on
1283    strings.  */
1284
1285 static char *
1286 legible_1 (const char *repr)
1287 {
1288   static char outbuf[128];
1289   int i, i1, mod;
1290   char *outptr;
1291   const char *inptr;
1292
1293   /* Reset the pointers.  */
1294   outptr = outbuf;
1295   inptr = repr;
1296   /* If the number is negative, shift the pointers.  */
1297   if (*inptr == '-')
1298     {
1299       *outptr++ = '-';
1300       ++inptr;
1301     }
1302   /* How many digits before the first separator?  */
1303   mod = strlen (inptr) % 3;
1304   /* Insert them.  */
1305   for (i = 0; i < mod; i++)
1306     *outptr++ = inptr[i];
1307   /* Now insert the rest of them, putting separator before every
1308      third digit.  */
1309   for (i1 = i, i = 0; inptr[i1]; i++, i1++)
1310     {
1311       if (i % 3 == 0 && i1 != 0)
1312         *outptr++ = ',';
1313       *outptr++ = inptr[i1];
1314     }
1315   /* Zero-terminate the string.  */
1316   *outptr = '\0';
1317   return outbuf;
1318 }
1319
1320 /* Legible -- return a static pointer to the legibly printed long.  */
1321 char *
1322 legible (long l)
1323 {
1324   char inbuf[24];
1325   /* Print the number into the buffer.  */
1326   long_to_string (inbuf, l);
1327   return legible_1 (inbuf);
1328 }
1329
1330 /* Write a string representation of NUMBER into the provided buffer.
1331    We cannot use sprintf() because we cannot be sure whether the
1332    platform supports printing of what we chose for VERY_LONG_TYPE.
1333
1334    Example: Gcc supports `long long' under many platforms, but on many
1335    of those the native libc knows nothing of it and therefore cannot
1336    print it.
1337
1338    How long BUFFER needs to be depends on the platform and the content
1339    of NUMBER.  For 64-bit VERY_LONG_TYPE (the most common case), 24
1340    bytes are sufficient.  Using more might be a good idea.
1341
1342    This function does not go through the hoops that long_to_string
1343    goes to because it doesn't need to be fast.  (It's called perhaps
1344    once in a Wget run.)  */
1345
1346 static void
1347 very_long_to_string (char *buffer, VERY_LONG_TYPE number)
1348 {
1349   int i = 0;
1350   int j;
1351
1352   /* Print the number backwards... */
1353   do
1354     {
1355       buffer[i++] = '0' + number % 10;
1356       number /= 10;
1357     }
1358   while (number);
1359
1360   /* ...and reverse the order of the digits. */
1361   for (j = 0; j < i / 2; j++)
1362     {
1363       char c = buffer[j];
1364       buffer[j] = buffer[i - 1 - j];
1365       buffer[i - 1 - j] = c;
1366     }
1367   buffer[i] = '\0';
1368 }
1369
1370 /* The same as legible(), but works on VERY_LONG_TYPE.  See sysdep.h.  */
1371 char *
1372 legible_very_long (VERY_LONG_TYPE l)
1373 {
1374   char inbuf[128];
1375   /* Print the number into the buffer.  */
1376   very_long_to_string (inbuf, l);
1377   return legible_1 (inbuf);
1378 }
1379
1380 /* Count the digits in a (long) integer.  */
1381 int
1382 numdigit (long a)
1383 {
1384   int res = 1;
1385   while ((a /= 10) != 0)
1386     ++res;
1387   return res;
1388 }
1389
1390 /* Print NUMBER to BUFFER.  This is equivalent to sprintf(buffer,
1391    "%ld", number), only much faster.
1392
1393    BUFFER should accept 24 bytes.  This should suffice for the longest
1394    numbers on 64-bit machines, including the `-' sign and the trailing
1395    \0.  */
1396 void
1397 long_to_string (char *buffer, long number)
1398 {
1399 #if (SIZEOF_LONG != 4) && (SIZEOF_LONG != 8)
1400   /* Huh? */
1401   sprintf (buffer, "%ld", number);
1402 #else /* (SIZEOF_LONG == 4) || (SIZEOF_LONG == 8) */
1403   char *p = buffer;
1404   int force = 0;
1405
1406   if (number < 0)
1407     {
1408       *p++ = '-';
1409       number = -number;
1410     }
1411
1412 #define FROB(figure) do {                                               \
1413     if (force || number >= figure)                                      \
1414       *p++ = number / figure + '0', number %= figure, force = 1;        \
1415     } while (0)
1416 #if SIZEOF_LONG == 8
1417   FROB (1000000000000000000L);
1418   FROB (100000000000000000L);
1419   FROB (10000000000000000L);
1420   FROB (1000000000000000L);
1421   FROB (100000000000000L);
1422   FROB (10000000000000L);
1423   FROB (1000000000000L);
1424   FROB (100000000000L);
1425   FROB (10000000000L);
1426 #endif /* SIZEOF_LONG == 8 */
1427   FROB (1000000000);
1428   FROB (100000000);
1429   FROB (10000000);
1430   FROB (1000000);
1431   FROB (100000);
1432   FROB (10000);
1433   FROB (1000);
1434   FROB (100);
1435   FROB (10);
1436 #undef FROB
1437   *p++ = number + '0';
1438   *p = '\0';
1439 #endif /* (SIZEOF_LONG == 4) || (SIZEOF_LONG == 8) */
1440 }
1441 \f
1442 /* This should probably be at a better place, but it doesn't really
1443    fit into html-parse.c.  */
1444
1445 /* The function returns the pointer to the malloc-ed quoted version of
1446    string s.  It will recognize and quote numeric and special graphic
1447    entities, as per RFC1866:
1448
1449    `&' -> `&amp;'
1450    `<' -> `&lt;'
1451    `>' -> `&gt;'
1452    `"' -> `&quot;'
1453    SP  -> `&#32;'
1454
1455    No other entities are recognized or replaced.  */
1456 char *
1457 html_quote_string (const char *s)
1458 {
1459   const char *b = s;
1460   char *p, *res;
1461   int i;
1462
1463   /* Pass through the string, and count the new size.  */
1464   for (i = 0; *s; s++, i++)
1465     {
1466       if (*s == '&')
1467         i += 4;                 /* `amp;' */
1468       else if (*s == '<' || *s == '>')
1469         i += 3;                 /* `lt;' and `gt;' */
1470       else if (*s == '\"')
1471         i += 5;                 /* `quot;' */
1472       else if (*s == ' ')
1473         i += 4;                 /* #32; */
1474     }
1475   res = (char *)xmalloc (i + 1);
1476   s = b;
1477   for (p = res; *s; s++)
1478     {
1479       switch (*s)
1480         {
1481         case '&':
1482           *p++ = '&';
1483           *p++ = 'a';
1484           *p++ = 'm';
1485           *p++ = 'p';
1486           *p++ = ';';
1487           break;
1488         case '<': case '>':
1489           *p++ = '&';
1490           *p++ = (*s == '<' ? 'l' : 'g');
1491           *p++ = 't';
1492           *p++ = ';';
1493           break;
1494         case '\"':
1495           *p++ = '&';
1496           *p++ = 'q';
1497           *p++ = 'u';
1498           *p++ = 'o';
1499           *p++ = 't';
1500           *p++ = ';';
1501           break;
1502         case ' ':
1503           *p++ = '&';
1504           *p++ = '#';
1505           *p++ = '3';
1506           *p++ = '2';
1507           *p++ = ';';
1508           break;
1509         default:
1510           *p++ = *s;
1511         }
1512     }
1513   *p = '\0';
1514   return res;
1515 }