Implement --no-null option.
[debian/tar] / src / names.c
1 /* Various processing of names.
2
3    Copyright (C) 1988, 1992, 1994, 1996, 1997, 1998, 1999, 2000, 2001,
4    2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
5
6    This program is free software; you can redistribute it and/or modify it
7    under the terms of the GNU General Public License as published by the
8    Free Software Foundation; either version 3, or (at your option) any later
9    version.
10
11    This program is distributed in the hope that it will be useful, but
12    WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
14    Public License for more details.
15
16    You should have received a copy of the GNU General Public License along
17    with this program; if not, write to the Free Software Foundation, Inc.,
18    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
19
20 #include <system.h>
21
22 #include <fnmatch.h>
23 #include <hash.h>
24 #include <quotearg.h>
25
26 #include "common.h"
27 \f
28 /* User and group names.  */
29
30 struct group *getgrnam ();
31 struct passwd *getpwnam ();
32 #if ! HAVE_DECL_GETPWUID
33 struct passwd *getpwuid ();
34 #endif
35 #if ! HAVE_DECL_GETGRGID
36 struct group *getgrgid ();
37 #endif
38
39 /* Make sure you link with the proper libraries if you are running the
40    Yellow Peril (thanks for the good laugh, Ian J.!), or, euh... NIS.
41    This code should also be modified for non-UNIX systems to do something
42    reasonable.  */
43
44 static char *cached_uname;
45 static char *cached_gname;
46
47 static uid_t cached_uid;        /* valid only if cached_uname is not empty */
48 static gid_t cached_gid;        /* valid only if cached_gname is not empty */
49
50 /* These variables are valid only if nonempty.  */
51 static char *cached_no_such_uname;
52 static char *cached_no_such_gname;
53
54 /* These variables are valid only if nonzero.  It's not worth optimizing
55    the case for weird systems where 0 is not a valid uid or gid.  */
56 static uid_t cached_no_such_uid;
57 static gid_t cached_no_such_gid;
58
59 static void register_individual_file (char const *name);
60
61 /* Given UID, find the corresponding UNAME.  */
62 void
63 uid_to_uname (uid_t uid, char **uname)
64 {
65   struct passwd *passwd;
66
67   if (uid != 0 && uid == cached_no_such_uid)
68     {
69       *uname = xstrdup ("");
70       return;
71     }
72
73   if (!cached_uname || uid != cached_uid)
74     {
75       passwd = getpwuid (uid);
76       if (passwd)
77         {
78           cached_uid = uid;
79           assign_string (&cached_uname, passwd->pw_name);
80         }
81       else
82         {
83           cached_no_such_uid = uid;
84           *uname = xstrdup ("");
85           return;
86         }
87     }
88   *uname = xstrdup (cached_uname);
89 }
90
91 /* Given GID, find the corresponding GNAME.  */
92 void
93 gid_to_gname (gid_t gid, char **gname)
94 {
95   struct group *group;
96
97   if (gid != 0 && gid == cached_no_such_gid)
98     {
99       *gname = xstrdup ("");
100       return;
101     }
102
103   if (!cached_gname || gid != cached_gid)
104     {
105       group = getgrgid (gid);
106       if (group)
107         {
108           cached_gid = gid;
109           assign_string (&cached_gname, group->gr_name);
110         }
111       else
112         {
113           cached_no_such_gid = gid;
114           *gname = xstrdup ("");
115           return;
116         }
117     }
118   *gname = xstrdup (cached_gname);
119 }
120
121 /* Given UNAME, set the corresponding UID and return 1, or else, return 0.  */
122 int
123 uname_to_uid (char const *uname, uid_t *uidp)
124 {
125   struct passwd *passwd;
126
127   if (cached_no_such_uname
128       && strcmp (uname, cached_no_such_uname) == 0)
129     return 0;
130
131   if (!cached_uname
132       || uname[0] != cached_uname[0]
133       || strcmp (uname, cached_uname) != 0)
134     {
135       passwd = getpwnam (uname);
136       if (passwd)
137         {
138           cached_uid = passwd->pw_uid;
139           assign_string (&cached_uname, passwd->pw_name);
140         }
141       else
142         {
143           assign_string (&cached_no_such_uname, uname);
144           return 0;
145         }
146     }
147   *uidp = cached_uid;
148   return 1;
149 }
150
151 /* Given GNAME, set the corresponding GID and return 1, or else, return 0.  */
152 int
153 gname_to_gid (char const *gname, gid_t *gidp)
154 {
155   struct group *group;
156
157   if (cached_no_such_gname
158       && strcmp (gname, cached_no_such_gname) == 0)
159     return 0;
160
161   if (!cached_gname
162       || gname[0] != cached_gname[0]
163       || strcmp (gname, cached_gname) != 0)
164     {
165       group = getgrnam (gname);
166       if (group)
167         {
168           cached_gid = group->gr_gid;
169           assign_string (&cached_gname, gname);
170         }
171       else
172         {
173           assign_string (&cached_no_such_gname, gname);
174           return 0;
175         }
176     }
177   *gidp = cached_gid;
178   return 1;
179 }
180
181 \f
182 /* Names from the command call.  */
183
184 static struct name *namelist;   /* first name in list, if any */
185 static struct name **nametail = &namelist;      /* end of name list */
186
187 /* File name arguments are processed in two stages: first a 
188    name_array (see below) is filled, then the names from it
189    are moved into the namelist.
190
191    This awkward process is needed only to implement --same-order option,
192    which is meant to help process large archives on machines with
193    limited memory.  With this option on, namelist contains at most one
194    entry, which diminishes the memory consumption.
195    
196    However, I very much doubt if we still need this -- Sergey */
197
198 /* A name_array element contains entries of three types: */
199
200 #define NELT_NAME  0   /* File name */
201 #define NELT_CHDIR 1   /* Change directory request */
202 #define NELT_FMASK 2   /* Change fnmatch options request */
203
204 struct name_elt        /* A name_array element. */
205 {
206   char type;           /* Element type, see NELT_* constants above */
207   union
208   {
209     const char *name;  /* File or directory name */
210     int matching_flags;/* fnmatch options if type == NELT_FMASK */ 
211   } v;
212 };
213
214 static struct name_elt *name_array;  /* store an array of names */
215 static size_t allocated_names;   /* how big is the array? */
216 static size_t names;             /* how many entries does it have? */
217 static size_t name_index;        /* how many of the entries have we scanned? */
218
219 /* Check the size of name_array, reallocating it as necessary.  */
220 static void
221 check_name_alloc ()
222 {
223   if (names == allocated_names)
224     {
225       if (allocated_names == 0)
226         allocated_names = 10; /* Set initial allocation */
227       name_array = x2nrealloc (name_array, &allocated_names,
228                                sizeof (name_array[0]));
229     }
230 }
231
232 /* Add to name_array the file NAME with fnmatch options MATCHING_FLAGS */
233 void
234 name_add_name (const char *name, int matching_flags)
235 {
236   static int prev_flags = 0; /* FIXME: Or EXCLUDE_ANCHORED? */
237   struct name_elt *ep;
238
239   check_name_alloc ();
240   ep = &name_array[names++];
241   if (prev_flags != matching_flags)
242     {
243       ep->type = NELT_FMASK;
244       ep->v.matching_flags = matching_flags;
245       prev_flags = matching_flags;
246       check_name_alloc ();
247       ep = &name_array[names++];
248     }
249   ep->type = NELT_NAME;
250   ep->v.name = name;
251 }
252
253 /* Add to name_array a chdir request for the directory NAME */
254 void
255 name_add_dir (const char *name)
256 {
257   struct name_elt *ep;
258   check_name_alloc ();
259   ep = &name_array[names++];
260   ep->type = NELT_CHDIR;
261   ep->v.name = name;
262 }  
263
264 \f
265 /* Names from external name file.  */
266
267 static char *name_buffer;       /* buffer to hold the current file name */
268 static size_t name_buffer_length; /* allocated length of name_buffer */
269
270 /* Set up to gather file names for tar.  They can either come from a
271    file or were saved from decoding arguments.  */
272 void
273 name_init (void)
274 {
275   name_buffer = xmalloc (NAME_FIELD_SIZE + 2);
276   name_buffer_length = NAME_FIELD_SIZE;
277 }
278
279 void
280 name_term (void)
281 {
282   free (name_buffer);
283   free (name_array);
284 }
285
286 static int matching_flags; /* exclude_fnmatch options */
287
288 /* Get the next NELT_NAME element from name_array.  Result is in
289    static storage and can't be relied upon across two calls.
290
291    If CHANGE_DIRS is true, treat any entries of type NELT_CHDIR as
292    the request to change to the given directory.
293    
294    Entries of type NELT_FMASK cause updates of the matching_flags
295    value. */
296 struct name_elt *
297 name_next_elt (int change_dirs)
298 {
299   static struct name_elt entry;
300   const char *source;
301   char *cursor;
302
303   while (name_index != names)
304     {
305       struct name_elt *ep;
306       size_t source_len;
307       
308       ep = &name_array[name_index++];
309       if (ep->type == NELT_FMASK)
310         {
311           matching_flags = ep->v.matching_flags;
312           continue;
313         }
314       
315       source = ep->v.name;
316       source_len = strlen (source);
317       if (name_buffer_length < source_len)
318         {
319           do
320             {
321               name_buffer_length *= 2;
322               if (! name_buffer_length)
323                 xalloc_die ();
324             }
325           while (name_buffer_length < source_len);
326
327           free (name_buffer);
328           name_buffer = xmalloc (name_buffer_length + 2);
329         }
330       strcpy (name_buffer, source);
331
332       /* Zap trailing slashes.  */
333
334       cursor = name_buffer + strlen (name_buffer) - 1;
335       while (cursor > name_buffer && ISSLASH (*cursor))
336         *cursor-- = '\0';
337
338       if (change_dirs && ep->type == NELT_CHDIR)
339         {
340           if (chdir (name_buffer) < 0)
341             chdir_fatal (name_buffer);
342         }
343       else
344         {
345           if (unquote_option)
346             unquote_string (name_buffer);
347           if (incremental_option)
348             register_individual_file (name_buffer);
349           entry.type = ep->type;
350           entry.v.name = name_buffer;
351           return &entry;
352         }
353     }
354
355   return NULL;
356 }
357
358 const char *
359 name_next (int change_dirs)
360 {
361   struct name_elt *nelt = name_next_elt (change_dirs);
362   return nelt ? nelt->v.name : NULL;
363 }
364
365 /* Gather names in a list for scanning.  Could hash them later if we
366    really care.
367
368    If the names are already sorted to match the archive, we just read
369    them one by one.  name_gather reads the first one, and it is called
370    by name_match as appropriate to read the next ones.  At EOF, the
371    last name read is just left in the buffer.  This option lets users
372    of small machines extract an arbitrary number of files by doing
373    "tar t" and editing down the list of files.  */
374
375 void
376 name_gather (void)
377 {
378   /* Buffer able to hold a single name.  */
379   static struct name *buffer;
380   static size_t allocated_size;
381
382   struct name_elt *ep;
383
384   if (same_order_option)
385     {
386       static int change_dir;
387
388       if (allocated_size == 0)
389         {
390           allocated_size = offsetof (struct name, name) + NAME_FIELD_SIZE + 1;
391           buffer = xmalloc (allocated_size);
392           /* FIXME: This memset is overkill, and ugly...  */
393           memset (buffer, 0, allocated_size);
394         }
395       
396       while ((ep = name_next_elt (0)) && ep->type == NELT_CHDIR)
397         change_dir = chdir_arg (xstrdup (ep->v.name));
398
399       if (ep)
400         {
401           size_t needed_size;
402           
403           buffer->length = strlen (ep->v.name);
404           needed_size = offsetof (struct name, name) + buffer->length + 1;
405           if (allocated_size < needed_size)
406             {
407               do
408                 {
409                   allocated_size *= 2;
410                   if (! allocated_size)
411                     xalloc_die ();
412                 }
413               while (allocated_size < needed_size);
414
415               buffer = xrealloc (buffer, allocated_size);
416             }
417           buffer->change_dir = change_dir;
418           strcpy (buffer->name, ep->v.name);
419           buffer->next = 0;
420           buffer->found_count = 0;
421           buffer->matching_flags = matching_flags;
422           
423           namelist = buffer;
424           nametail = &namelist->next;
425         }
426       else if (change_dir)
427         addname (0, change_dir);
428     }
429   else
430     {
431       /* Non sorted names -- read them all in.  */
432       int change_dir = 0;
433
434       for (;;)
435         {
436           int change_dir0 = change_dir;
437           while ((ep = name_next_elt (0)) && ep->type == NELT_CHDIR)
438             change_dir = chdir_arg (xstrdup (ep->v.name));
439
440           if (ep)
441             addname (ep->v.name, change_dir);
442           else
443             {
444               if (change_dir != change_dir0)
445                 addname (0, change_dir);
446               break;
447             }
448         }
449     }
450 }
451
452 /*  Add a name to the namelist.  */
453 struct name *
454 addname (char const *string, int change_dir)
455 {
456   size_t length = string ? strlen (string) : 0;
457   struct name *name = xmalloc (offsetof (struct name, name) + length + 1);
458
459   if (string)
460     strcpy (name->name, string);
461   else
462     name->name[0] = 0;
463
464   name->next = NULL;
465   name->length = length;
466   name->found_count = 0;
467   name->matching_flags = matching_flags;
468   name->change_dir = change_dir;
469   name->dir_contents = NULL;
470
471   *nametail = name;
472   nametail = &name->next;
473   return name;
474 }
475
476 /* Find a match for FILE_NAME (whose string length is LENGTH) in the name
477    list.  */
478 static struct name *
479 namelist_match (char const *file_name, size_t length)
480 {
481   struct name *p;
482
483   for (p = namelist; p; p = p->next)
484     {
485       if (p->name[0]
486           && exclude_fnmatch (p->name, file_name, p->matching_flags))
487         return p;
488     }
489
490   return NULL;
491 }
492
493 /* Return true if and only if name FILE_NAME (from an archive) matches any
494    name from the namelist.  */
495 bool
496 name_match (const char *file_name)
497 {
498   size_t length = strlen (file_name);
499
500   while (1)
501     {
502       struct name *cursor = namelist;
503
504       if (!cursor)
505         return true;
506       
507       if (cursor->name[0] == 0)
508         {
509           chdir_do (cursor->change_dir);
510           namelist = 0;
511           nametail = &namelist;
512           return true;
513         }
514
515       cursor = namelist_match (file_name, length);
516       if (cursor)
517         {
518           if (!(ISSLASH (file_name[cursor->length]) && recursion_option)
519               || cursor->found_count == 0)
520             cursor->found_count++; /* remember it matched */
521           if (starting_file_option)
522             {
523               free (namelist);
524               namelist = 0;
525               nametail = &namelist;
526             }
527           chdir_do (cursor->change_dir);
528
529           /* We got a match.  */
530           return ISFOUND (cursor);
531         }
532
533       /* Filename from archive not found in namelist.  If we have the whole
534          namelist here, just return 0.  Otherwise, read the next name in and
535          compare it.  If this was the last name, namelist->found_count will
536          remain on.  If not, we loop to compare the newly read name.  */
537
538       if (same_order_option && namelist->found_count)
539         {
540           name_gather ();       /* read one more */
541           if (namelist->found_count)
542             return false;
543         }
544       else
545         return false;
546     }
547 }
548
549 /* Returns true if all names from the namelist were processed.
550    P is the stat_info of the most recently processed entry.
551    The decision is postponed until the next entry is read if:
552
553    1) P ended with a slash (i.e. it was a directory)
554    2) P matches any entry from the namelist *and* represents a subdirectory
555    or a file lying under this entry (in the terms of directory structure).
556
557    This is necessary to handle contents of directories. */
558 bool
559 all_names_found (struct tar_stat_info *p)
560 {
561   struct name const *cursor;
562   size_t len;
563
564   if (test_label_option)
565     return true;
566   if (!p->file_name || occurrence_option == 0 || p->had_trailing_slash)
567     return false;
568   len = strlen (p->file_name);
569   for (cursor = namelist; cursor; cursor = cursor->next)
570     {
571       if ((cursor->name[0] && !WASFOUND (cursor))
572           || (len >= cursor->length && ISSLASH (p->file_name[cursor->length])))
573         return false;
574     }
575   return true;
576 }
577
578 static inline int
579 is_pattern (const char *string)
580 {
581   return strchr (string, '*') || strchr (string, '[') || strchr (string, '?');
582 }
583
584 static void
585 regex_usage_warning (const char *name)
586 {
587   static int warned_once = 0;
588
589   if (warn_regex_usage && is_pattern (name))
590     {
591       warned_once = 1;
592       WARN ((0, 0,
593              /* TRANSLATORS: The following three msgids form a single sentence.
594               */
595              _("Pattern matching characters used in file names. Please,")));
596       WARN ((0, 0,
597              _("use --wildcards to enable pattern matching, or --no-wildcards to")));
598       WARN ((0, 0,
599              _("suppress this warning.")));
600     }
601 }
602
603 /* Print the names of things in the namelist that were not matched.  */
604 void
605 names_notfound (void)
606 {
607   struct name const *cursor;
608
609   for (cursor = namelist; cursor; cursor = cursor->next)
610     if (!WASFOUND (cursor) && cursor->name[0])
611       {
612         regex_usage_warning (cursor->name);
613         if (cursor->found_count == 0)
614           ERROR ((0, 0, _("%s: Not found in archive"),
615                   quotearg_colon (cursor->name)));
616         else
617           ERROR ((0, 0, _("%s: Required occurrence not found in archive"),
618                   quotearg_colon (cursor->name)));  
619       }
620
621   /* Don't bother freeing the name list; we're about to exit.  */
622   namelist = 0;
623   nametail = &namelist;
624
625   if (same_order_option)
626     {
627       const char *name;
628
629       while ((name = name_next (1)) != NULL)
630         {
631           regex_usage_warning (name);
632           ERROR ((0, 0, _("%s: Not found in archive"),
633                   quotearg_colon (name)));
634         }
635     }
636 }
637 \f
638 /* Sorting name lists.  */
639
640 /* Sort linked LIST of names, of given LENGTH, using COMPARE to order
641    names.  Return the sorted list.  Apart from the type `struct name'
642    and the definition of SUCCESSOR, this is a generic list-sorting
643    function, but it's too painful to make it both generic and portable
644    in C.  */
645
646 static struct name *
647 merge_sort (struct name *list, int length,
648             int (*compare) (struct name const*, struct name const*))
649 {
650   struct name *first_list;
651   struct name *second_list;
652   int first_length;
653   int second_length;
654   struct name *result;
655   struct name **merge_point;
656   struct name *cursor;
657   int counter;
658
659 # define SUCCESSOR(name) ((name)->next)
660
661   if (length == 1)
662     return list;
663
664   if (length == 2)
665     {
666       if ((*compare) (list, SUCCESSOR (list)) > 0)
667         {
668           result = SUCCESSOR (list);
669           SUCCESSOR (result) = list;
670           SUCCESSOR (list) = 0;
671           return result;
672         }
673       return list;
674     }
675
676   first_list = list;
677   first_length = (length + 1) / 2;
678   second_length = length / 2;
679   for (cursor = list, counter = first_length - 1;
680        counter;
681        cursor = SUCCESSOR (cursor), counter--)
682     continue;
683   second_list = SUCCESSOR (cursor);
684   SUCCESSOR (cursor) = 0;
685
686   first_list = merge_sort (first_list, first_length, compare);
687   second_list = merge_sort (second_list, second_length, compare);
688
689   merge_point = &result;
690   while (first_list && second_list)
691     if ((*compare) (first_list, second_list) < 0)
692       {
693         cursor = SUCCESSOR (first_list);
694         *merge_point = first_list;
695         merge_point = &SUCCESSOR (first_list);
696         first_list = cursor;
697       }
698     else
699       {
700         cursor = SUCCESSOR (second_list);
701         *merge_point = second_list;
702         merge_point = &SUCCESSOR (second_list);
703         second_list = cursor;
704       }
705   if (first_list)
706     *merge_point = first_list;
707   else
708     *merge_point = second_list;
709
710   return result;
711
712 #undef SUCCESSOR
713 }
714
715 /* A comparison function for sorting names.  Put found names last;
716    break ties by string comparison.  */
717
718 static int
719 compare_names (struct name const *n1, struct name const *n2)
720 {
721   int found_diff = WASFOUND(n2) - WASFOUND(n1);
722   return found_diff ? found_diff : strcmp (n1->name, n2->name);
723 }
724 \f
725 /* Add all the dirs under NAME, which names a directory, to the namelist.
726    If any of the files is a directory, recurse on the subdirectory.
727    DEVICE is the device not to leave, if the -l option is specified.  */
728
729 static void
730 add_hierarchy_to_namelist (struct name *name, dev_t device)
731 {
732   char *file_name = name->name;
733   const char *buffer = get_directory_contents (file_name, device);
734
735   if (! buffer)
736     name->dir_contents = "\0\0\0\0";
737   else
738     {
739       size_t name_length = name->length;
740       size_t allocated_length = (name_length >= NAME_FIELD_SIZE
741                                  ? name_length + NAME_FIELD_SIZE
742                                  : NAME_FIELD_SIZE);
743       char *namebuf = xmalloc (allocated_length + 1);
744                                 /* FIXME: + 2 above?  */
745       const char *string;
746       size_t string_length;
747       int change_dir = name->change_dir;
748
749       name->dir_contents = buffer;
750       strcpy (namebuf, file_name);
751       if (! ISSLASH (namebuf[name_length - 1]))
752         {
753           namebuf[name_length++] = '/';
754           namebuf[name_length] = '\0';
755         }
756
757       for (string = buffer; *string; string += string_length + 1)
758         {
759           string_length = strlen (string);
760           if (*string == 'D')
761             {
762               struct name *np;
763
764               if (allocated_length <= name_length + string_length)
765                 {
766                   do
767                     {
768                       allocated_length *= 2;
769                       if (! allocated_length)
770                         xalloc_die ();
771                     }
772                   while (allocated_length <= name_length + string_length);
773
774                   namebuf = xrealloc (namebuf, allocated_length + 1);
775                 }
776               strcpy (namebuf + name_length, string + 1);
777               np = addname (namebuf, change_dir);
778               add_hierarchy_to_namelist (np, device);
779             }
780         }
781
782       free (namebuf);
783     }
784 }
785 \f
786 /* Collect all the names from argv[] (or whatever), expand them into a
787    directory tree, and sort them.  This gets only subdirectories, not
788    all files.  */
789
790 void
791 collect_and_sort_names (void)
792 {
793   struct name *name;
794   struct name *next_name;
795   int num_names;
796   struct stat statbuf;
797
798   name_gather ();
799
800   if (listed_incremental_option)
801     read_directory_file ();
802
803   if (!namelist)
804     addname (".", 0);
805
806   for (name = namelist; name; name = next_name)
807     {
808       next_name = name->next;
809       if (name->found_count || name->dir_contents)
810         continue;
811       if (name->matching_flags & EXCLUDE_WILDCARDS)
812         /* NOTE: EXCLUDE_ANCHORED is not relevant here */
813         /* FIXME: just skip regexps for now */
814         continue;
815       chdir_do (name->change_dir);
816       if (name->name[0] == 0)
817         continue;
818
819       if (deref_stat (dereference_option, name->name, &statbuf) != 0)
820         {
821           stat_diag (name->name);
822           continue;
823         }
824       if (S_ISDIR (statbuf.st_mode))
825         {
826           name->found_count++;
827           add_hierarchy_to_namelist (name, statbuf.st_dev);
828         }
829     }
830
831   num_names = 0;
832   for (name = namelist; name; name = name->next)
833     num_names++;
834   namelist = merge_sort (namelist, num_names, compare_names);
835
836   for (name = namelist; name; name = name->next)
837     name->found_count = 0;
838
839   if (listed_incremental_option)
840     {
841       for (name = namelist; name && name->name[0] == 0; name++)
842         ;
843       if (name)
844         name->dir_contents = append_incremental_renames (name->dir_contents);
845     }
846 }
847
848 /* This is like name_match, except that
849     1. It returns a pointer to the name it matched, and doesn't set FOUND
850     in structure. The caller will have to do that if it wants to.
851     2. If the namelist is empty, it returns null, unlike name_match, which
852     returns TRUE. */
853 struct name *
854 name_scan (const char *file_name)
855 {
856   size_t length = strlen (file_name);
857
858   while (1)
859     {
860       struct name *cursor = namelist_match (file_name, length);
861       if (cursor)
862         return cursor;
863
864       /* Filename from archive not found in namelist.  If we have the whole
865          namelist here, just return 0.  Otherwise, read the next name in and
866          compare it.  If this was the last name, namelist->found_count will
867          remain on.  If not, we loop to compare the newly read name.  */
868
869       if (same_order_option && namelist && namelist->found_count)
870         {
871           name_gather ();       /* read one more */
872           if (namelist->found_count)
873             return 0;
874         }
875       else
876         return 0;
877     }
878 }
879
880 /* This returns a name from the namelist which doesn't have ->found
881    set.  It sets ->found before returning, so successive calls will
882    find and return all the non-found names in the namelist.  */
883 struct name *gnu_list_name;
884
885 char *
886 name_from_list (void)
887 {
888   if (!gnu_list_name)
889     gnu_list_name = namelist;
890   while (gnu_list_name
891          && (gnu_list_name->found_count || gnu_list_name->name[0] == 0))
892     gnu_list_name = gnu_list_name->next;
893   if (gnu_list_name)
894     {
895       gnu_list_name->found_count++;
896       chdir_do (gnu_list_name->change_dir);
897       return gnu_list_name->name;
898     }
899   return 0;
900 }
901
902 void
903 blank_name_list (void)
904 {
905   struct name *name;
906
907   gnu_list_name = 0;
908   for (name = namelist; name; name = name->next)
909     name->found_count = 0;
910 }
911
912 /* Yield a newly allocated file name consisting of FILE_NAME concatenated to
913    NAME, with an intervening slash if FILE_NAME does not already end in one. */
914 char *
915 new_name (const char *file_name, const char *name)
916 {
917   size_t file_name_len = strlen (file_name);
918   size_t namesize = strlen (name) + 1;
919   int slash = file_name_len && ! ISSLASH (file_name[file_name_len - 1]);
920   char *buffer = xmalloc (file_name_len + slash + namesize);
921   memcpy (buffer, file_name, file_name_len);
922   buffer[file_name_len] = '/';
923   memcpy (buffer + file_name_len + slash, name, namesize);
924   return buffer;
925 }
926
927 /* Return nonzero if file NAME is excluded.  */
928 bool
929 excluded_name (char const *name)
930 {
931   return excluded_file_name (excluded, name + FILE_SYSTEM_PREFIX_LEN (name));
932 }
933 \f
934 /* Names to avoid dumping.  */
935 static Hash_table *avoided_name_table;
936
937 /* Remember to not archive NAME.  */
938 void
939 add_avoided_name (char const *name)
940 {
941   hash_string_insert (&avoided_name_table, name);
942 }
943
944 /* Should NAME be avoided when archiving?  */
945 bool
946 is_avoided_name (char const *name)
947 {
948   return hash_string_lookup (avoided_name_table, name);
949 }
950
951 \f
952 static Hash_table *individual_file_table;
953
954 static void
955 register_individual_file (char const *name)
956 {
957   struct stat st;
958
959   if (deref_stat (dereference_option, name, &st) != 0)
960     return; /* Will be complained about later */
961   if (S_ISDIR (st.st_mode))
962     return;
963
964   hash_string_insert (&individual_file_table, name);
965 }
966
967 bool
968 is_individual_file (char const *name)
969 {
970   return hash_string_lookup (individual_file_table, name);
971 }
972
973 \f
974
975 /* Return the size of the prefix of FILE_NAME that is removed after
976    stripping NUM leading file name components.  NUM must be
977    positive.  */
978
979 size_t
980 stripped_prefix_len (char const *file_name, size_t num)
981 {
982   char const *p = file_name + FILE_SYSTEM_PREFIX_LEN (file_name);
983   while (ISSLASH (*p))
984     p++;
985   while (*p)
986     {
987       bool slash = ISSLASH (*p);
988       p++;
989       if (slash)
990         {
991           if (--num == 0)
992             return p - file_name;
993           while (ISSLASH (*p))
994             p++;
995         }
996     }
997   return -1;
998 }
999 \f
1000 /* Return nonzero if NAME contains ".." as a file name component.  */
1001 bool
1002 contains_dot_dot (char const *name)
1003 {
1004   char const *p = name + FILE_SYSTEM_PREFIX_LEN (name);
1005
1006   for (;; p++)
1007     {
1008       if (p[0] == '.' && p[1] == '.' && (ISSLASH (p[2]) || !p[2]))
1009         return 1;
1010
1011       while (! ISSLASH (*p))
1012         {
1013           if (! *p++)
1014             return 0;
1015         }
1016     }
1017 }