Import upstream version 1.28
[debian/tar] / src / names.c
1 /* Various processing of names.
2
3    Copyright 1988, 1992, 1994, 1996-2001, 2003-2007, 2009, 2013-2014
4    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, see <http://www.gnu.org/licenses/>.  */
18
19 #include <system.h>
20
21 #include <fnmatch.h>
22 #include <hash.h>
23 #include <quotearg.h>
24 #include <wordsplit.h>
25 #include <argp.h>
26
27 #include "common.h"
28 \f
29 /* User and group names.  */
30
31 /* Make sure you link with the proper libraries if you are running the
32    Yellow Peril (thanks for the good laugh, Ian J.!), or, euh... NIS.
33    This code should also be modified for non-UNIX systems to do something
34    reasonable.  */
35
36 static char *cached_uname;
37 static char *cached_gname;
38
39 static uid_t cached_uid;        /* valid only if cached_uname is not empty */
40 static gid_t cached_gid;        /* valid only if cached_gname is not empty */
41
42 /* These variables are valid only if nonempty.  */
43 static char *cached_no_such_uname;
44 static char *cached_no_such_gname;
45
46 /* These variables are valid only if nonzero.  It's not worth optimizing
47    the case for weird systems where 0 is not a valid uid or gid.  */
48 static uid_t cached_no_such_uid;
49 static gid_t cached_no_such_gid;
50
51 /* Given UID, find the corresponding UNAME.  */
52 void
53 uid_to_uname (uid_t uid, char **uname)
54 {
55   struct passwd *passwd;
56
57   if (uid != 0 && uid == cached_no_such_uid)
58     {
59       *uname = xstrdup ("");
60       return;
61     }
62
63   if (!cached_uname || uid != cached_uid)
64     {
65       passwd = getpwuid (uid);
66       if (passwd)
67         {
68           cached_uid = uid;
69           assign_string (&cached_uname, passwd->pw_name);
70         }
71       else
72         {
73           cached_no_such_uid = uid;
74           *uname = xstrdup ("");
75           return;
76         }
77     }
78   *uname = xstrdup (cached_uname);
79 }
80
81 /* Given GID, find the corresponding GNAME.  */
82 void
83 gid_to_gname (gid_t gid, char **gname)
84 {
85   struct group *group;
86
87   if (gid != 0 && gid == cached_no_such_gid)
88     {
89       *gname = xstrdup ("");
90       return;
91     }
92
93   if (!cached_gname || gid != cached_gid)
94     {
95       group = getgrgid (gid);
96       if (group)
97         {
98           cached_gid = gid;
99           assign_string (&cached_gname, group->gr_name);
100         }
101       else
102         {
103           cached_no_such_gid = gid;
104           *gname = xstrdup ("");
105           return;
106         }
107     }
108   *gname = xstrdup (cached_gname);
109 }
110
111 /* Given UNAME, set the corresponding UID and return 1, or else, return 0.  */
112 int
113 uname_to_uid (char const *uname, uid_t *uidp)
114 {
115   struct passwd *passwd;
116
117   if (cached_no_such_uname
118       && strcmp (uname, cached_no_such_uname) == 0)
119     return 0;
120
121   if (!cached_uname
122       || uname[0] != cached_uname[0]
123       || strcmp (uname, cached_uname) != 0)
124     {
125       passwd = getpwnam (uname);
126       if (passwd)
127         {
128           cached_uid = passwd->pw_uid;
129           assign_string (&cached_uname, passwd->pw_name);
130         }
131       else
132         {
133           assign_string (&cached_no_such_uname, uname);
134           return 0;
135         }
136     }
137   *uidp = cached_uid;
138   return 1;
139 }
140
141 /* Given GNAME, set the corresponding GID and return 1, or else, return 0.  */
142 int
143 gname_to_gid (char const *gname, gid_t *gidp)
144 {
145   struct group *group;
146
147   if (cached_no_such_gname
148       && strcmp (gname, cached_no_such_gname) == 0)
149     return 0;
150
151   if (!cached_gname
152       || gname[0] != cached_gname[0]
153       || strcmp (gname, cached_gname) != 0)
154     {
155       group = getgrnam (gname);
156       if (group)
157         {
158           cached_gid = group->gr_gid;
159           assign_string (&cached_gname, gname);
160         }
161       else
162         {
163           assign_string (&cached_no_such_gname, gname);
164           return 0;
165         }
166     }
167   *gidp = cached_gid;
168   return 1;
169 }
170
171 \f
172 static struct name *
173 make_name (const char *file_name)
174 {
175   struct name *p = xzalloc (sizeof (*p));
176   if (!file_name)
177     file_name = "";
178   p->name = xstrdup (file_name);
179   p->length = strlen (p->name);
180   return p;
181 }
182
183 static void
184 free_name (struct name *p)
185 {
186   if (p)
187     {
188       free (p->name);
189       free (p->caname);
190       free (p);
191     }
192 }
193
194 \f
195 /* Names from the command call.  */
196
197 static struct name *namelist;   /* first name in list, if any */
198 static struct name *nametail;   /* end of name list */
199
200 /* File name arguments are processed in two stages: first a
201    name element list (see below) is filled, then the names from it
202    are moved into the namelist.
203
204    This awkward process is needed only to implement --same-order option,
205    which is meant to help process large archives on machines with
206    limited memory.  With this option on, namelist contains at most one
207    entry, which diminishes the memory consumption.
208
209    However, I very much doubt if we still need this -- Sergey */
210
211 /* A name_list element contains entries of three types: */
212
213 #define NELT_NAME  0   /* File name */
214 #define NELT_CHDIR 1   /* Change directory request */
215 #define NELT_FMASK 2   /* Change fnmatch options request */
216 #define NELT_FILE  3   /* Read file names from that file */
217 #define NELT_NOOP  4   /* No operation */
218
219 struct name_elt        /* A name_array element. */
220 {
221   struct name_elt *next, *prev;
222   char type;           /* Element type, see NELT_* constants above */
223   union
224   {
225     const char *name;  /* File or directory name */
226     int matching_flags;/* fnmatch options if type == NELT_FMASK */
227     struct             /* File, if type == NELT_FILE */
228     {
229       const char *name;/* File name */
230       int term;        /* File name terminator in the list */
231       FILE *fp;
232     } file;
233   } v;
234 };
235
236 static struct name_elt *name_head;  /* store a list of names */
237 size_t name_count;                  /* how many of the entries are names? */
238
239 static struct name_elt *
240 name_elt_alloc (void)
241 {
242   struct name_elt *elt;
243
244   elt = xmalloc (sizeof (*elt));
245   if (!name_head)
246     {
247       name_head = elt;
248       name_head->prev = name_head->next = NULL;
249       name_head->type = NELT_NOOP;
250       elt = xmalloc (sizeof (*elt));
251     }
252
253   elt->prev = name_head->prev;
254   if (name_head->prev)
255     name_head->prev->next = elt;
256   elt->next = name_head;
257   name_head->prev = elt;
258   return elt;
259 }
260
261 static void
262 name_list_adjust (void)
263 {
264   if (name_head)
265     while (name_head->prev)
266       name_head = name_head->prev;
267 }
268
269 static void
270 name_list_advance (void)
271 {
272   struct name_elt *elt = name_head;
273   name_head = elt->next;
274   if (name_head)
275     name_head->prev = NULL;
276   free (elt);
277 }
278
279 /* Add to name_array the file NAME with fnmatch options MATCHING_FLAGS */
280 void
281 name_add_name (const char *name, int matching_flags)
282 {
283   static int prev_flags = 0; /* FIXME: Or EXCLUDE_ANCHORED? */
284   struct name_elt *ep = name_elt_alloc ();
285
286   if (prev_flags != matching_flags)
287     {
288       ep->type = NELT_FMASK;
289       ep->v.matching_flags = matching_flags;
290       prev_flags = matching_flags;
291       ep = name_elt_alloc ();
292     }
293   ep->type = NELT_NAME;
294   ep->v.name = name;
295   name_count++;
296 }
297
298 /* Add to name_array a chdir request for the directory NAME */
299 void
300 name_add_dir (const char *name)
301 {
302   struct name_elt *ep = name_elt_alloc ();
303   ep->type = NELT_CHDIR;
304   ep->v.name = name;
305 }
306
307 void
308 name_add_file (const char *name, int term)
309 {
310   struct name_elt *ep = name_elt_alloc ();
311   ep->type = NELT_FILE;
312   ep->v.file.name = name;
313   ep->v.file.term = term;
314   ep->v.file.fp = NULL;
315 }
316 \f
317 /* Names from external name file.  */
318
319 static char *name_buffer;       /* buffer to hold the current file name */
320 static size_t name_buffer_length; /* allocated length of name_buffer */
321
322 /* Set up to gather file names for tar.  They can either come from a
323    file or were saved from decoding arguments.  */
324 void
325 name_init (void)
326 {
327   name_buffer = xmalloc (NAME_FIELD_SIZE + 2);
328   name_buffer_length = NAME_FIELD_SIZE;
329   name_list_adjust ();
330 }
331
332 void
333 name_term (void)
334 {
335   free (name_buffer);
336 }
337 \f
338 /* Prevent recursive inclusion of the same file */
339 struct file_id_list
340 {
341   struct file_id_list *next;
342   ino_t ino;
343   dev_t dev;
344   const char *from_file;
345 };
346
347 static struct file_id_list *file_id_list;
348
349 /* Return the name of the file from which the file names and options
350    are being read.
351 */
352 static const char *
353 file_list_name (void)
354 {
355   struct name_elt *elt;
356
357   for (elt = name_head; elt; elt = elt->next)
358     if (elt->type == NELT_FILE && elt->v.file.fp)
359       return elt->v.file.name;
360   return _("command line");
361 }
362
363 static int
364 add_file_id (const char *filename)
365 {
366   struct file_id_list *p;
367   struct stat st;
368   const char *reading_from;
369
370   if (stat (filename, &st))
371     stat_fatal (filename);
372   reading_from = file_list_name ();
373   for (p = file_id_list; p; p = p->next)
374     if (p->ino == st.st_ino && p->dev == st.st_dev)
375       {
376         int oldc = set_char_quoting (NULL, ':', 1);
377         ERROR ((0, 0,
378                 _("%s: file list requested from %s already read from %s"),
379                 quotearg_n (0, filename),
380                 reading_from, p->from_file));
381         set_char_quoting (NULL, ':', oldc);
382         return 1;
383       }
384   p = xmalloc (sizeof *p);
385   p->next = file_id_list;
386   p->ino = st.st_ino;
387   p->dev = st.st_dev;
388   p->from_file = reading_from;
389   file_id_list = p;
390   return 0;
391 }
392 \f
393 enum read_file_list_state  /* Result of reading file name from the list file */
394   {
395     file_list_success,     /* OK, name read successfully */
396     file_list_end,         /* End of list file */
397     file_list_zero,        /* Zero separator encountered where it should not */
398     file_list_skip         /* Empty (zero-length) entry encountered, skip it */
399   };
400
401 /* Read from FP a sequence of characters up to TERM and put them
402    into STK.
403  */
404 static enum read_file_list_state
405 read_name_from_file (struct name_elt *ent)
406 {
407   int c;
408   size_t counter = 0;
409   FILE *fp = ent->v.file.fp;
410   int term = ent->v.file.term;
411
412   for (c = getc (fp); c != EOF && c != term; c = getc (fp))
413     {
414       if (counter == name_buffer_length)
415         name_buffer = x2realloc (name_buffer, &name_buffer_length);
416       name_buffer[counter++] = c;
417       if (c == 0)
418         {
419           /* We have read a zero separator. The file possibly is
420              zero-separated */
421           return file_list_zero;
422         }
423     }
424
425   if (counter == 0 && c != EOF)
426     return file_list_skip;
427
428   if (counter == name_buffer_length)
429     name_buffer = x2realloc (name_buffer, &name_buffer_length);
430   name_buffer[counter] = 0;
431
432   return (counter == 0 && c == EOF) ? file_list_end : file_list_success;
433 }
434
435 static int
436 handle_option (const char *str)
437 {
438   struct wordsplit ws;
439   int i;
440
441   while (*str && isspace (*str))
442     ++str;
443   if (*str != '-')
444     return 1;
445
446   ws.ws_offs = 1;
447   if (wordsplit (str, &ws, WRDSF_DEFFLAGS|WRDSF_DOOFFS))
448     FATAL_ERROR ((0, 0, _("cannot split string '%s': %s"),
449                   str, wordsplit_strerror (&ws)));
450   ws.ws_wordv[0] = program_invocation_short_name;
451   more_options (ws.ws_wordc+ws.ws_offs, ws.ws_wordv);
452   for (i = 0; i < ws.ws_wordc+ws.ws_offs; i++)
453     ws.ws_wordv[i] = NULL;
454
455   wordsplit_free (&ws);
456   return 0;
457 }
458
459 static int
460 read_next_name (struct name_elt *ent, struct name_elt *ret)
461 {
462   if (!ent->v.file.fp)
463     {
464       if (!strcmp (ent->v.file.name, "-"))
465         {
466           request_stdin ("-T");
467           ent->v.file.fp = stdin;
468         }
469       else
470         {
471           if (add_file_id (ent->v.file.name))
472             {
473               name_list_advance ();
474               return 1;
475             }
476           if ((ent->v.file.fp = fopen (ent->v.file.name, "r")) == NULL)
477             open_fatal (ent->v.file.name);
478         }
479     }
480
481   while (1)
482     {
483       switch (read_name_from_file (ent))
484         {
485         case file_list_skip:
486           continue;
487
488         case file_list_zero:
489           WARNOPT (WARN_FILENAME_WITH_NULS,
490                    (0, 0, N_("%s: file name read contains nul character"),
491                     quotearg_colon (ent->v.file.name)));
492           ent->v.file.term = 0;
493           /* fall through */
494         case file_list_success:
495           if (unquote_option)
496             unquote_string (name_buffer);
497           if (handle_option (name_buffer) == 0)
498             {
499               name_list_adjust ();
500               return 1;
501             }
502           ret->type = NELT_NAME;
503           ret->v.name = name_buffer;
504           return 0;
505
506         case file_list_end:
507           if (strcmp (ent->v.file.name, "-"))
508             fclose (ent->v.file.fp);
509           ent->v.file.fp = NULL;
510           name_list_advance ();
511           return 1;
512         }
513     }
514 }
515 \f
516 static void
517 copy_name (struct name_elt *ep)
518 {
519   const char *source;
520   size_t source_len;
521   char *cursor;
522
523   source = ep->v.name;
524   source_len = strlen (source);
525   if (name_buffer_length < source_len)
526     {
527       do
528         {
529           name_buffer_length *= 2;
530           if (! name_buffer_length)
531             xalloc_die ();
532         }
533       while (name_buffer_length < source_len);
534
535       free (name_buffer);
536       name_buffer = xmalloc(name_buffer_length + 2);
537     }
538   strcpy (name_buffer, source);
539
540   /* Zap trailing slashes.  */
541   cursor = name_buffer + strlen (name_buffer) - 1;
542   while (cursor > name_buffer && ISSLASH (*cursor))
543     *cursor-- = '\0';
544 }
545
546 \f
547 static int matching_flags; /* exclude_fnmatch options */
548
549 /* Get the next NELT_NAME element from name_array.  Result is in
550    static storage and can't be relied upon across two calls.
551
552    If CHANGE_DIRS is true, treat any entries of type NELT_CHDIR as
553    the request to change to the given directory.
554
555    Entries of type NELT_FMASK cause updates of the matching_flags
556    value. */
557 static struct name_elt *
558 name_next_elt (int change_dirs)
559 {
560   static struct name_elt entry;
561   struct name_elt *ep;
562
563   while ((ep = name_head) != NULL)
564     {
565       switch (ep->type)
566         {
567         case NELT_NOOP:
568           name_list_advance ();
569           break;
570
571         case NELT_FMASK:
572           matching_flags = ep->v.matching_flags;
573           recursion_option = matching_flags & FNM_LEADING_DIR;
574           name_list_advance ();
575           continue;
576
577         case NELT_FILE:
578           if (read_next_name (ep, &entry) == 0)
579             return &entry;
580           continue;
581
582         case NELT_CHDIR:
583           if (change_dirs)
584             {
585               chdir_do (chdir_arg (xstrdup (ep->v.name)));
586               name_list_advance ();
587               break;
588             }
589           /* fall through */
590         case NELT_NAME:
591           copy_name (ep);
592           if (unquote_option)
593             unquote_string (name_buffer);
594           entry.type = ep->type;
595           entry.v.name = name_buffer;
596           name_list_advance ();
597           return &entry;
598         }
599     }
600
601   return NULL;
602 }
603
604 const char *
605 name_next (int change_dirs)
606 {
607   struct name_elt *nelt = name_next_elt (change_dirs);
608   return nelt ? nelt->v.name : NULL;
609 }
610
611 /* Gather names in a list for scanning.  Could hash them later if we
612    really care.
613
614    If the names are already sorted to match the archive, we just read
615    them one by one.  name_gather reads the first one, and it is called
616    by name_match as appropriate to read the next ones.  At EOF, the
617    last name read is just left in the buffer.  This option lets users
618    of small machines extract an arbitrary number of files by doing
619    "tar t" and editing down the list of files.  */
620
621 void
622 name_gather (void)
623 {
624   /* Buffer able to hold a single name.  */
625   static struct name *buffer = NULL;
626
627   struct name_elt *ep;
628
629   if (same_order_option)
630     {
631       static int change_dir;
632
633       while ((ep = name_next_elt (0)) && ep->type == NELT_CHDIR)
634         change_dir = chdir_arg (xstrdup (ep->v.name));
635
636       if (ep)
637         {
638           free_name (buffer);
639           buffer = make_name (ep->v.name);
640           buffer->change_dir = change_dir;
641           buffer->next = 0;
642           buffer->found_count = 0;
643           buffer->matching_flags = matching_flags;
644           buffer->directory = NULL;
645           buffer->parent = NULL;
646           buffer->cmdline = true;
647
648           namelist = nametail = buffer;
649         }
650       else if (change_dir)
651         addname (0, change_dir, false, NULL);
652     }
653   else
654     {
655       /* Non sorted names -- read them all in.  */
656       int change_dir = 0;
657
658       for (;;)
659         {
660           int change_dir0 = change_dir;
661           while ((ep = name_next_elt (0)) && ep->type == NELT_CHDIR)
662             change_dir = chdir_arg (xstrdup (ep->v.name));
663
664           if (ep)
665             addname (ep->v.name, change_dir, true, NULL);
666           else
667             {
668               if (change_dir != change_dir0)
669                 addname (NULL, change_dir, false, NULL);
670               break;
671             }
672         }
673     }
674 }
675
676 /*  Add a name to the namelist.  */
677 struct name *
678 addname (char const *string, int change_dir, bool cmdline, struct name *parent)
679 {
680   struct name *name = make_name (string);
681
682   name->prev = nametail;
683   name->next = NULL;
684   name->found_count = 0;
685   name->matching_flags = matching_flags;
686   name->change_dir = change_dir;
687   name->directory = NULL;
688   name->parent = parent;
689   name->cmdline = cmdline;
690
691   if (nametail)
692     nametail->next = name;
693   else
694     namelist = name;
695   nametail = name;
696   return name;
697 }
698
699 /* Find a match for FILE_NAME (whose string length is LENGTH) in the name
700    list.  */
701 static struct name *
702 namelist_match (char const *file_name, size_t length)
703 {
704   struct name *p;
705
706   for (p = namelist; p; p = p->next)
707     {
708       if (p->name[0]
709           && exclude_fnmatch (p->name, file_name, p->matching_flags))
710         return p;
711     }
712
713   return NULL;
714 }
715
716 void
717 remname (struct name *name)
718 {
719   struct name *p;
720
721   if ((p = name->prev) != NULL)
722     p->next = name->next;
723   else
724     namelist = name->next;
725
726   if ((p = name->next) != NULL)
727     p->prev = name->prev;
728   else
729     nametail = name->prev;
730 }
731
732 /* Return true if and only if name FILE_NAME (from an archive) matches any
733    name from the namelist.  */
734 bool
735 name_match (const char *file_name)
736 {
737   size_t length = strlen (file_name);
738
739   while (1)
740     {
741       struct name *cursor = namelist;
742
743       if (!cursor)
744         return true;
745
746       if (cursor->name[0] == 0)
747         {
748           chdir_do (cursor->change_dir);
749           namelist = NULL;
750           nametail = NULL;
751           return true;
752         }
753
754       cursor = namelist_match (file_name, length);
755       if (cursor)
756         {
757           if (!(ISSLASH (file_name[cursor->length]) && recursion_option)
758               || cursor->found_count == 0)
759             cursor->found_count++; /* remember it matched */
760           if (starting_file_option)
761             {
762               free (namelist);
763               namelist = NULL;
764               nametail = NULL;
765             }
766           chdir_do (cursor->change_dir);
767
768           /* We got a match.  */
769           return ISFOUND (cursor);
770         }
771
772       /* Filename from archive not found in namelist.  If we have the whole
773          namelist here, just return 0.  Otherwise, read the next name in and
774          compare it.  If this was the last name, namelist->found_count will
775          remain on.  If not, we loop to compare the newly read name.  */
776
777       if (same_order_option && namelist->found_count)
778         {
779           name_gather ();       /* read one more */
780           if (namelist->found_count)
781             return false;
782         }
783       else
784         return false;
785     }
786 }
787
788 /* Returns true if all names from the namelist were processed.
789    P is the stat_info of the most recently processed entry.
790    The decision is postponed until the next entry is read if:
791
792    1) P ended with a slash (i.e. it was a directory)
793    2) P matches any entry from the namelist *and* represents a subdirectory
794    or a file lying under this entry (in the terms of directory structure).
795
796    This is necessary to handle contents of directories. */
797 bool
798 all_names_found (struct tar_stat_info *p)
799 {
800   struct name const *cursor;
801   size_t len;
802
803   if (!p->file_name || occurrence_option == 0 || p->had_trailing_slash)
804     return false;
805   len = strlen (p->file_name);
806   for (cursor = namelist; cursor; cursor = cursor->next)
807     {
808       if ((cursor->name[0] && !WASFOUND (cursor))
809           || (len >= cursor->length && ISSLASH (p->file_name[cursor->length])))
810         return false;
811     }
812   return true;
813 }
814
815 static int
816 regex_usage_warning (const char *name)
817 {
818   static int warned_once = 0;
819
820   if (warn_regex_usage && fnmatch_pattern_has_wildcards (name, 0))
821     {
822       warned_once = 1;
823       WARN ((0, 0,
824              _("Pattern matching characters used in file names")));
825       WARN ((0, 0,
826              _("Use --wildcards to enable pattern matching,"
827                " or --no-wildcards to suppress this warning")));
828     }
829   return warned_once;
830 }
831
832 /* Print the names of things in the namelist that were not matched.  */
833 void
834 names_notfound (void)
835 {
836   struct name const *cursor;
837
838   for (cursor = namelist; cursor; cursor = cursor->next)
839     if (!WASFOUND (cursor) && cursor->name[0])
840       {
841         regex_usage_warning (cursor->name);
842         ERROR ((0, 0,
843                 (cursor->found_count == 0) ?
844                      _("%s: Not found in archive") :
845                      _("%s: Required occurrence not found in archive"),
846                 quotearg_colon (cursor->name)));
847       }
848
849   /* Don't bother freeing the name list; we're about to exit.  */
850   namelist = NULL;
851   nametail = NULL;
852
853   if (same_order_option)
854     {
855       const char *name;
856
857       while ((name = name_next (1)) != NULL)
858         {
859           regex_usage_warning (name);
860           ERROR ((0, 0, _("%s: Not found in archive"),
861                   quotearg_colon (name)));
862         }
863     }
864 }
865
866 void
867 label_notfound (void)
868 {
869   struct name const *cursor;
870
871   if (!namelist)
872     return;
873
874   for (cursor = namelist; cursor; cursor = cursor->next)
875     if (WASFOUND (cursor))
876       return;
877
878   if (verbose_option)
879     error (0, 0, _("Archive label mismatch"));
880   set_exit_status (TAREXIT_DIFFERS);
881
882   for (cursor = namelist; cursor; cursor = cursor->next)
883     {
884       if (regex_usage_warning (cursor->name))
885         break;
886     }
887
888   /* Don't bother freeing the name list; we're about to exit.  */
889   namelist = NULL;
890   nametail = NULL;
891
892   if (same_order_option)
893     {
894       const char *name;
895
896       while ((name = name_next (1)) != NULL
897              && regex_usage_warning (name) == 0)
898         ;
899     }
900 }
901 \f
902 /* Sorting name lists.  */
903
904 /* Sort *singly* linked LIST of names, of given LENGTH, using COMPARE
905    to order names.  Return the sorted list.  Note that after calling
906    this function, the 'prev' links in list elements are messed up.
907
908    Apart from the type 'struct name' and the definition of SUCCESSOR,
909    this is a generic list-sorting function, but it's too painful to
910    make it both generic and portable
911    in C.  */
912
913 static struct name *
914 merge_sort_sll (struct name *list, int length,
915                 int (*compare) (struct name const*, struct name const*))
916 {
917   struct name *first_list;
918   struct name *second_list;
919   int first_length;
920   int second_length;
921   struct name *result;
922   struct name **merge_point;
923   struct name *cursor;
924   int counter;
925
926 # define SUCCESSOR(name) ((name)->next)
927
928   if (length == 1)
929     return list;
930
931   if (length == 2)
932     {
933       if ((*compare) (list, SUCCESSOR (list)) > 0)
934         {
935           result = SUCCESSOR (list);
936           SUCCESSOR (result) = list;
937           SUCCESSOR (list) = 0;
938           return result;
939         }
940       return list;
941     }
942
943   first_list = list;
944   first_length = (length + 1) / 2;
945   second_length = length / 2;
946   for (cursor = list, counter = first_length - 1;
947        counter;
948        cursor = SUCCESSOR (cursor), counter--)
949     continue;
950   second_list = SUCCESSOR (cursor);
951   SUCCESSOR (cursor) = 0;
952
953   first_list = merge_sort_sll (first_list, first_length, compare);
954   second_list = merge_sort_sll (second_list, second_length, compare);
955
956   merge_point = &result;
957   while (first_list && second_list)
958     if ((*compare) (first_list, second_list) < 0)
959       {
960         cursor = SUCCESSOR (first_list);
961         *merge_point = first_list;
962         merge_point = &SUCCESSOR (first_list);
963         first_list = cursor;
964       }
965     else
966       {
967         cursor = SUCCESSOR (second_list);
968         *merge_point = second_list;
969         merge_point = &SUCCESSOR (second_list);
970         second_list = cursor;
971       }
972   if (first_list)
973     *merge_point = first_list;
974   else
975     *merge_point = second_list;
976
977   return result;
978
979 #undef SUCCESSOR
980 }
981
982 /* Sort doubly linked LIST of names, of given LENGTH, using COMPARE
983    to order names.  Return the sorted list.  */
984 static struct name *
985 merge_sort (struct name *list, int length,
986             int (*compare) (struct name const*, struct name const*))
987 {
988   struct name *head, *p, *prev;
989   head = merge_sort_sll (list, length, compare);
990   /* Fixup prev pointers */
991   for (prev = NULL, p = head; p; prev = p, p = p->next)
992     p->prev = prev;
993   return head;
994 }
995
996 /* A comparison function for sorting names.  Put found names last;
997    break ties by string comparison.  */
998
999 static int
1000 compare_names_found (struct name const *n1, struct name const *n2)
1001 {
1002   int found_diff = WASFOUND (n2) - WASFOUND (n1);
1003   return found_diff ? found_diff : strcmp (n1->name, n2->name);
1004 }
1005
1006 /* Simple comparison by names. */
1007 static int
1008 compare_names (struct name const *n1, struct name const *n2)
1009 {
1010   return strcmp (n1->name, n2->name);
1011 }
1012
1013 \f
1014 /* Add all the dirs under ST to the namelist NAME, descending the
1015    directory hierarchy recursively.  */
1016
1017 static void
1018 add_hierarchy_to_namelist (struct tar_stat_info *st, struct name *name)
1019 {
1020   const char *buffer;
1021
1022   name->directory = scan_directory (st);
1023   buffer = directory_contents (name->directory);
1024   if (buffer)
1025     {
1026       struct name *child_head = NULL, *child_tail = NULL;
1027       size_t name_length = name->length;
1028       size_t allocated_length = (name_length >= NAME_FIELD_SIZE
1029                                  ? name_length + NAME_FIELD_SIZE
1030                                  : NAME_FIELD_SIZE);
1031       char *namebuf = xmalloc (allocated_length + 1);
1032                                 /* FIXME: + 2 above?  */
1033       const char *string;
1034       size_t string_length;
1035       int change_dir = name->change_dir;
1036
1037       strcpy (namebuf, name->name);
1038       if (! ISSLASH (namebuf[name_length - 1]))
1039         {
1040           namebuf[name_length++] = '/';
1041           namebuf[name_length] = '\0';
1042         }
1043
1044       for (string = buffer; *string; string += string_length + 1)
1045         {
1046           string_length = strlen (string);
1047           if (*string == 'D')
1048             {
1049               struct name *np;
1050               struct tar_stat_info subdir;
1051               int subfd;
1052
1053               if (allocated_length <= name_length + string_length)
1054                 {
1055                   do
1056                     {
1057                       allocated_length *= 2;
1058                       if (! allocated_length)
1059                         xalloc_die ();
1060                     }
1061                   while (allocated_length <= name_length + string_length);
1062
1063                   namebuf = xrealloc (namebuf, allocated_length + 1);
1064                 }
1065               strcpy (namebuf + name_length, string + 1);
1066               np = addname (namebuf, change_dir, false, name);
1067               if (!child_head)
1068                 child_head = np;
1069               else
1070                 child_tail->sibling = np;
1071               child_tail = np;
1072
1073               tar_stat_init (&subdir);
1074               subdir.parent = st;
1075               if (st->fd < 0)
1076                 {
1077                   subfd = -1;
1078                   errno = - st->fd;
1079                 }
1080               else
1081                 subfd = subfile_open (st, string + 1,
1082                                       open_read_flags | O_DIRECTORY);
1083               if (subfd < 0)
1084                 open_diag (namebuf);
1085               else
1086                 {
1087                   subdir.fd = subfd;
1088                   if (fstat (subfd, &subdir.stat) != 0)
1089                     stat_diag (namebuf);
1090                   else if (! (O_DIRECTORY || S_ISDIR (subdir.stat.st_mode)))
1091                     {
1092                       errno = ENOTDIR;
1093                       open_diag (namebuf);
1094                     }
1095                   else
1096                     {
1097                       subdir.orig_file_name = xstrdup (namebuf);
1098                       add_hierarchy_to_namelist (&subdir, np);
1099                       restore_parent_fd (&subdir);
1100                     }
1101                 }
1102
1103               tar_stat_destroy (&subdir);
1104             }
1105         }
1106
1107       free (namebuf);
1108       name->child = child_head;
1109     }
1110 }
1111 \f
1112 /* Auxiliary functions for hashed table of struct name's. */
1113
1114 static size_t
1115 name_hash (void const *entry, size_t n_buckets)
1116 {
1117   struct name const *name = entry;
1118   return hash_string (name->caname, n_buckets);
1119 }
1120
1121 /* Compare two directories for equality of their names. */
1122 static bool
1123 name_compare (void const *entry1, void const *entry2)
1124 {
1125   struct name const *name1 = entry1;
1126   struct name const *name2 = entry2;
1127   return strcmp (name1->caname, name2->caname) == 0;
1128 }
1129
1130 \f
1131 /* Rebase 'name' member of CHILD and all its siblings to
1132    the new PARENT. */
1133 static void
1134 rebase_child_list (struct name *child, struct name *parent)
1135 {
1136   size_t old_prefix_len = child->parent->length;
1137   size_t new_prefix_len = parent->length;
1138   char *new_prefix = parent->name;
1139
1140   for (; child; child = child->sibling)
1141     {
1142       size_t size = child->length - old_prefix_len + new_prefix_len;
1143       char *newp = xmalloc (size + 1);
1144       strcpy (newp, new_prefix);
1145       strcat (newp, child->name + old_prefix_len);
1146       free (child->name);
1147       child->name = newp;
1148       child->length = size;
1149
1150       rebase_directory (child->directory,
1151                         child->parent->name, old_prefix_len,
1152                         new_prefix, new_prefix_len);
1153     }
1154 }
1155
1156 /* Collect all the names from argv[] (or whatever), expand them into a
1157    directory tree, and sort them.  This gets only subdirectories, not
1158    all files.  */
1159
1160 void
1161 collect_and_sort_names (void)
1162 {
1163   struct name *name;
1164   struct name *next_name, *prev_name = NULL;
1165   int num_names;
1166   Hash_table *nametab;
1167
1168   name_gather ();
1169
1170   if (!namelist)
1171     addname (".", 0, false, NULL);
1172
1173   if (listed_incremental_option)
1174     {
1175       switch (chdir_count ())
1176         {
1177         case 0:
1178           break;
1179
1180         case 1:
1181           if (namelist->change_dir == 0)
1182             USAGE_ERROR ((0, 0,
1183                           _("Using -C option inside file list is not "
1184                             "allowed with --listed-incremental")));
1185           break;
1186
1187         default:
1188           USAGE_ERROR ((0, 0,
1189                         _("Only one -C option is allowed with "
1190                           "--listed-incremental")));
1191         }
1192
1193       read_directory_file ();
1194     }
1195
1196   num_names = 0;
1197   for (name = namelist; name; name = name->next, num_names++)
1198     {
1199       struct tar_stat_info st;
1200
1201       if (name->found_count || name->directory)
1202         continue;
1203       if (name->matching_flags & EXCLUDE_WILDCARDS)
1204         /* NOTE: EXCLUDE_ANCHORED is not relevant here */
1205         /* FIXME: just skip regexps for now */
1206         continue;
1207       chdir_do (name->change_dir);
1208
1209       if (name->name[0] == 0)
1210         continue;
1211
1212       tar_stat_init (&st);
1213
1214       if (deref_stat (name->name, &st.stat) != 0)
1215         {
1216           stat_diag (name->name);
1217           continue;
1218         }
1219       if (S_ISDIR (st.stat.st_mode))
1220         {
1221           int dir_fd = openat (chdir_fd, name->name,
1222                                open_read_flags | O_DIRECTORY);
1223           if (dir_fd < 0)
1224             open_diag (name->name);
1225           else
1226             {
1227               st.fd = dir_fd;
1228               if (fstat (dir_fd, &st.stat) != 0)
1229                 stat_diag (name->name);
1230               else if (O_DIRECTORY || S_ISDIR (st.stat.st_mode))
1231                 {
1232                   st.orig_file_name = xstrdup (name->name);
1233                   name->found_count++;
1234                   add_hierarchy_to_namelist (&st, name);
1235                 }
1236             }
1237         }
1238
1239       tar_stat_destroy (&st);
1240     }
1241
1242   namelist = merge_sort (namelist, num_names, compare_names);
1243
1244   num_names = 0;
1245   nametab = hash_initialize (0, 0, name_hash, name_compare, NULL);
1246   for (name = namelist; name; name = next_name)
1247     {
1248       next_name = name->next;
1249       name->caname = normalize_filename (name->change_dir, name->name);
1250       if (prev_name)
1251         {
1252           struct name *p = hash_lookup (nametab, name);
1253           if (p)
1254             {
1255               /* Keep the one listed in the command line */
1256               if (!name->parent)
1257                 {
1258                   if (p->child)
1259                     rebase_child_list (p->child, name);
1260                   hash_delete (nametab, name);
1261                   /* FIXME: remove_directory (p->caname); ? */
1262                   remname (p);
1263                   free_name (p);
1264                   num_names--;
1265                 }
1266               else
1267                 {
1268                   if (name->child)
1269                     rebase_child_list (name->child, p);
1270                   /* FIXME: remove_directory (name->caname); ? */
1271                   remname (name);
1272                   free_name (name);
1273                   continue;
1274                 }
1275             }
1276         }
1277       name->found_count = 0;
1278       if (!hash_insert (nametab, name))
1279         xalloc_die ();
1280       prev_name = name;
1281       num_names++;
1282     }
1283   nametail = prev_name;
1284   hash_free (nametab);
1285
1286   namelist = merge_sort (namelist, num_names, compare_names_found);
1287
1288   if (listed_incremental_option)
1289     {
1290       for (name = namelist; name && name->name[0] == 0; name++)
1291         ;
1292       if (name)
1293         append_incremental_renames (name->directory);
1294     }
1295 }
1296
1297 /* This is like name_match, except that
1298     1. It returns a pointer to the name it matched, and doesn't set FOUND
1299     in structure. The caller will have to do that if it wants to.
1300     2. If the namelist is empty, it returns null, unlike name_match, which
1301     returns TRUE. */
1302 struct name *
1303 name_scan (const char *file_name)
1304 {
1305   size_t length = strlen (file_name);
1306
1307   while (1)
1308     {
1309       struct name *cursor = namelist_match (file_name, length);
1310       if (cursor)
1311         return cursor;
1312
1313       /* Filename from archive not found in namelist.  If we have the whole
1314          namelist here, just return 0.  Otherwise, read the next name in and
1315          compare it.  If this was the last name, namelist->found_count will
1316          remain on.  If not, we loop to compare the newly read name.  */
1317
1318       if (same_order_option && namelist && namelist->found_count)
1319         {
1320           name_gather ();       /* read one more */
1321           if (namelist->found_count)
1322             return 0;
1323         }
1324       else
1325         return 0;
1326     }
1327 }
1328
1329 /* This returns a name from the namelist which doesn't have ->found
1330    set.  It sets ->found before returning, so successive calls will
1331    find and return all the non-found names in the namelist.  */
1332 struct name *gnu_list_name;
1333
1334 struct name const *
1335 name_from_list (void)
1336 {
1337   if (!gnu_list_name)
1338     gnu_list_name = namelist;
1339   while (gnu_list_name
1340          && (gnu_list_name->found_count || gnu_list_name->name[0] == 0))
1341     gnu_list_name = gnu_list_name->next;
1342   if (gnu_list_name)
1343     {
1344       gnu_list_name->found_count++;
1345       chdir_do (gnu_list_name->change_dir);
1346       return gnu_list_name;
1347     }
1348   return NULL;
1349 }
1350
1351 void
1352 blank_name_list (void)
1353 {
1354   struct name *name;
1355
1356   gnu_list_name = 0;
1357   for (name = namelist; name; name = name->next)
1358     name->found_count = 0;
1359 }
1360
1361 /* Yield a newly allocated file name consisting of FILE_NAME concatenated to
1362    NAME, with an intervening slash if FILE_NAME does not already end in one. */
1363 char *
1364 new_name (const char *file_name, const char *name)
1365 {
1366   size_t file_name_len = strlen (file_name);
1367   size_t namesize = strlen (name) + 1;
1368   int slash = file_name_len && ! ISSLASH (file_name[file_name_len - 1]);
1369   char *buffer = xmalloc (file_name_len + slash + namesize);
1370   memcpy (buffer, file_name, file_name_len);
1371   buffer[file_name_len] = '/';
1372   memcpy (buffer + file_name_len + slash, name, namesize);
1373   return buffer;
1374 }
1375
1376 \f
1377
1378 /* Return the size of the prefix of FILE_NAME that is removed after
1379    stripping NUM leading file name components.  NUM must be
1380    positive.  */
1381
1382 size_t
1383 stripped_prefix_len (char const *file_name, size_t num)
1384 {
1385   char const *p = file_name + FILE_SYSTEM_PREFIX_LEN (file_name);
1386   while (ISSLASH (*p))
1387     p++;
1388   while (*p)
1389     {
1390       bool slash = ISSLASH (*p);
1391       p++;
1392       if (slash)
1393         {
1394           if (--num == 0)
1395             return p - file_name;
1396           while (ISSLASH (*p))
1397             p++;
1398         }
1399     }
1400   return -1;
1401 }
1402 \f
1403 /* Return nonzero if NAME contains ".." as a file name component.  */
1404 bool
1405 contains_dot_dot (char const *name)
1406 {
1407   char const *p = name + FILE_SYSTEM_PREFIX_LEN (name);
1408
1409   for (;; p++)
1410     {
1411       if (p[0] == '.' && p[1] == '.' && (ISSLASH (p[2]) || !p[2]))
1412         return 1;
1413
1414       while (! ISSLASH (*p))
1415         {
1416           if (! *p++)
1417             return 0;
1418         }
1419     }
1420 }