Import upstream version 1.28
[debian/tar] / src / incremen.c
1 /* GNU dump extensions to tar.
2
3    Copyright 1988, 1992-1994, 1996-1997, 1999-2001, 2003-2009, 2013-2014
4    Free Software Foundation, Inc.
5
6    This file is part of GNU tar.
7
8    GNU tar is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12
13    GNU tar is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
21 #include <system.h>
22 #include <hash.h>
23 #include <quotearg.h>
24 #include "common.h"
25
26 /* Incremental dump specialities.  */
27
28 /* Which child files to save under a directory.  */
29 enum children
30   {
31     NO_CHILDREN,
32     CHANGED_CHILDREN,
33     ALL_CHILDREN
34   };
35
36 #define DIRF_INIT     0x0001    /* directory structure is initialized
37                                    (procdir called at least once) */
38 #define DIRF_NFS      0x0002    /* directory is mounted on nfs */
39 #define DIRF_FOUND    0x0004    /* directory is found on fs */
40 #define DIRF_NEW      0x0008    /* directory is new (not found
41                                    in the previous dump) */
42 #define DIRF_RENAMED  0x0010    /* directory is renamed */
43
44 #define DIR_IS_INITED(d) ((d)->flags & DIRF_INIT)
45 #define DIR_IS_NFS(d) ((d)->flags & DIRF_NFS)
46 #define DIR_IS_FOUND(d) ((d)->flags & DIRF_FOUND)
47 /* #define DIR_IS_NEW(d) ((d)->flags & DIRF_NEW) FIXME: not used */
48 #define DIR_IS_RENAMED(d) ((d)->flags & DIRF_RENAMED)
49
50 #define DIR_SET_FLAG(d,f) (d)->flags |= (f)
51 #define DIR_CLEAR_FLAG(d,f) (d)->flags &= ~(f)
52
53 struct dumpdir                 /* Dump directory listing */
54 {
55   char *contents;              /* Actual contents */
56   size_t total;                /* Total number of elements */
57   size_t elc;                  /* Number of D/N/Y elements. */
58   char **elv;                  /* Array of D/N/Y elements */
59 };
60
61 /* Directory attributes.  */
62 struct directory
63   {
64     struct directory *next;
65     struct timespec mtime;      /* Modification time */
66     dev_t device_number;        /* device number for directory */
67     ino_t inode_number;         /* inode number for directory */
68     struct dumpdir *dump;       /* Directory contents */
69     struct dumpdir *idump;      /* Initial contents if the directory was
70                                    rescanned */
71     enum children children;     /* What to save under this directory */
72     unsigned flags;             /* See DIRF_ macros above */
73     struct directory *orig;     /* If the directory was renamed, points to
74                                    the original directory structure */
75     const char *tagfile;        /* Tag file, if the directory falls under
76                                    exclusion_tag_under */
77     char *caname;               /* canonical name */
78     char *name;                 /* file name of directory */
79   };
80
81 static struct dumpdir *
82 dumpdir_create0 (const char *contents, const char *cmask)
83 {
84   struct dumpdir *dump;
85   size_t i, total, ctsize, len;
86   char *p;
87   const char *q;
88
89   for (i = 0, total = 0, ctsize = 1, q = contents; *q; total++, q += len)
90     {
91       len = strlen (q) + 1;
92       ctsize += len;
93       if (!cmask || strchr (cmask, *q))
94         i++;
95     }
96   dump = xmalloc (sizeof (*dump) + ctsize);
97   dump->contents = (char*)(dump + 1);
98   memcpy (dump->contents, contents, ctsize);
99   dump->total = total;
100   dump->elc = i;
101   dump->elv = xcalloc (i + 1, sizeof (dump->elv[0]));
102
103   for (i = 0, p = dump->contents; *p; p += strlen (p) + 1)
104     {
105       if (!cmask || strchr (cmask, *p))
106         dump->elv[i++] = p + 1;
107     }
108   dump->elv[i] = NULL;
109   return dump;
110 }
111
112 static struct dumpdir *
113 dumpdir_create (const char *contents)
114 {
115   return dumpdir_create0 (contents, "YND");
116 }
117
118 static void
119 dumpdir_free (struct dumpdir *dump)
120 {
121   free (dump->elv);
122   free (dump);
123 }
124
125 static int
126 compare_dirnames (const void *first, const void *second)
127 {
128   char const *const *name1 = first;
129   char const *const *name2 = second;
130   return strcmp (*name1, *name2);
131 }
132
133 /* Locate NAME in the dumpdir array DUMP.
134    Return pointer to the slot in DUMP->contents, or NULL if not found */
135 static char *
136 dumpdir_locate (struct dumpdir *dump, const char *name)
137 {
138   char **ptr;
139   if (!dump)
140     return NULL;
141
142   ptr = bsearch (&name, dump->elv, dump->elc, sizeof (dump->elv[0]),
143                  compare_dirnames);
144   return ptr ? *ptr - 1: NULL;
145 }
146
147 struct dumpdir_iter
148 {
149   struct dumpdir *dump; /* Dumpdir being iterated */
150   int all;              /* Iterate over all entries, not only D/N/Y */
151   size_t next;          /* Index of the next element */
152 };
153
154 static char *
155 dumpdir_next (struct dumpdir_iter *itr)
156 {
157   size_t cur = itr->next;
158   char *ret = NULL;
159
160   if (itr->all)
161     {
162       ret = itr->dump->contents + cur;
163       if (*ret == 0)
164         return NULL;
165       itr->next += strlen (ret) + 1;
166     }
167   else if (cur < itr->dump->elc)
168     {
169       ret = itr->dump->elv[cur] - 1;
170       itr->next++;
171     }
172
173   return ret;
174 }
175
176 static char *
177 dumpdir_first (struct dumpdir *dump, int all, struct dumpdir_iter **pitr)
178 {
179   struct dumpdir_iter *itr = xmalloc (sizeof (*itr));
180   itr->dump = dump;
181   itr->all = all;
182   itr->next = 0;
183   *pitr = itr;
184   return dumpdir_next (itr);
185 }
186
187 /* Return size in bytes of the dumpdir array P */
188 size_t
189 dumpdir_size (const char *p)
190 {
191   size_t totsize = 0;
192
193   while (*p)
194     {
195       size_t size = strlen (p) + 1;
196       totsize += size;
197       p += size;
198     }
199   return totsize + 1;
200 }
201
202 \f
203 static struct directory *dirhead, *dirtail;
204 static Hash_table *directory_table;
205 static Hash_table *directory_meta_table;
206
207 #if HAVE_ST_FSTYPE_STRING
208   static char const nfs_string[] = "nfs";
209 # define NFS_FILE_STAT(st) (strcmp ((st).st_fstype, nfs_string) == 0)
210 #else
211 # define ST_DEV_MSB(st) (~ (dev_t) 0 << (sizeof (st).st_dev * CHAR_BIT - 1))
212 # define NFS_FILE_STAT(st) (((st).st_dev & ST_DEV_MSB (st)) != 0)
213 #endif
214
215 /* Calculate the hash of a directory.  */
216 static size_t
217 hash_directory_canonical_name (void const *entry, size_t n_buckets)
218 {
219   struct directory const *directory = entry;
220   return hash_string (directory->caname, n_buckets);
221 }
222
223 /* Compare two directories for equality of their names. */
224 static bool
225 compare_directory_canonical_names (void const *entry1, void const *entry2)
226 {
227   struct directory const *directory1 = entry1;
228   struct directory const *directory2 = entry2;
229   return strcmp (directory1->caname, directory2->caname) == 0;
230 }
231
232 static size_t
233 hash_directory_meta (void const *entry, size_t n_buckets)
234 {
235   struct directory const *directory = entry;
236   /* FIXME: Work out a better algorytm */
237   return (directory->device_number + directory->inode_number) % n_buckets;
238 }
239
240 /* Compare two directories for equality of their device and inode numbers. */
241 static bool
242 compare_directory_meta (void const *entry1, void const *entry2)
243 {
244   struct directory const *directory1 = entry1;
245   struct directory const *directory2 = entry2;
246   return directory1->device_number == directory2->device_number
247             && directory1->inode_number == directory2->inode_number;
248 }
249
250 /* Make a directory entry for given relative NAME and canonical name CANAME.
251    The latter is "stolen", i.e. the returned directory contains pointer to
252    it. */
253 static struct directory *
254 make_directory (const char *name, char *caname)
255 {
256   size_t namelen = strlen (name);
257   struct directory *directory = xmalloc (sizeof (*directory));
258   directory->next = NULL;
259   directory->dump = directory->idump = NULL;
260   directory->orig = NULL;
261   directory->flags = false;
262   if (namelen > 1 && ISSLASH (name[namelen - 1]))
263     namelen--;
264   directory->name = xmalloc (namelen + 1);
265   memcpy (directory->name, name, namelen);
266   directory->name[namelen] = 0;
267   directory->caname = caname;
268   directory->tagfile = NULL;
269   return directory;
270 }
271
272 static void
273 free_directory (struct directory *dir)
274 {
275   free (dir->caname);
276   free (dir->name);
277   free (dir);
278 }
279
280 static struct directory *
281 attach_directory (const char *name)
282 {
283   char *cname = normalize_filename (chdir_current, name);
284   struct directory *dir = make_directory (name, cname);
285   if (dirtail)
286     dirtail->next = dir;
287   else
288     dirhead = dir;
289   dirtail = dir;
290   return dir;
291 }
292
293 \f
294 static void
295 dirlist_replace_prefix (const char *pref, const char *repl)
296 {
297   struct directory *dp;
298   size_t pref_len = strlen (pref);
299   size_t repl_len = strlen (repl);
300   for (dp = dirhead; dp; dp = dp->next)
301     replace_prefix (&dp->name, pref, pref_len, repl, repl_len);
302 }
303
304 void
305 clear_directory_table (void)
306 {
307   struct directory *dp;
308
309   if (directory_table)
310     hash_clear (directory_table);
311   if (directory_meta_table)
312     hash_clear (directory_meta_table);
313   for (dp = dirhead; dp; )
314     {
315       struct directory *next = dp->next;
316       free_directory (dp);
317       dp = next;
318     }
319   dirhead = dirtail = NULL;
320 }
321
322 /* Create and link a new directory entry for directory NAME, having a
323    device number DEV and an inode number INO, with NFS indicating
324    whether it is an NFS device and FOUND indicating whether we have
325    found that the directory exists.  */
326 static struct directory *
327 note_directory (char const *name, struct timespec mtime,
328                 dev_t dev, ino_t ino, bool nfs, bool found,
329                 const char *contents)
330 {
331   struct directory *directory = attach_directory (name);
332
333   directory->mtime = mtime;
334   directory->device_number = dev;
335   directory->inode_number = ino;
336   directory->children = CHANGED_CHILDREN;
337   if (nfs)
338     DIR_SET_FLAG (directory, DIRF_NFS);
339   if (found)
340     DIR_SET_FLAG (directory, DIRF_FOUND);
341   if (contents)
342     directory->dump = dumpdir_create (contents);
343   else
344     directory->dump = NULL;
345
346   if (! ((directory_table
347           || (directory_table = hash_initialize (0, 0,
348                                                  hash_directory_canonical_name,
349                                                  compare_directory_canonical_names,
350                                                  0)))
351          && hash_insert (directory_table, directory)))
352     xalloc_die ();
353
354   if (! ((directory_meta_table
355           || (directory_meta_table = hash_initialize (0, 0,
356                                                       hash_directory_meta,
357                                                       compare_directory_meta,
358                                                       0)))
359          && hash_insert (directory_meta_table, directory)))
360     xalloc_die ();
361
362   return directory;
363 }
364
365 /* Return a directory entry for a given file NAME, or zero if none found.  */
366 static struct directory *
367 find_directory (const char *name)
368 {
369   if (! directory_table)
370     return 0;
371   else
372     {
373       char *caname = normalize_filename (chdir_current, name);
374       struct directory *dir = make_directory (name, caname);
375       struct directory *ret = hash_lookup (directory_table, dir);
376       free_directory (dir);
377       return ret;
378     }
379 }
380
381 #if 0
382 /* Remove directory entry for the given CANAME */
383 void
384 remove_directory (const char *caname)
385 {
386   struct directory *dir = make_directory (caname, xstrdup (caname));
387   struct directory *ret = hash_delete (directory_table, dir);
388   if (ret)
389     free_directory (ret);
390   free_directory (dir);
391 }
392 #endif
393
394 /* If first OLD_PREFIX_LEN bytes of DIR->NAME name match OLD_PREFIX,
395    replace them with NEW_PREFIX. */
396 void
397 rebase_directory (struct directory *dir,
398                   const char *old_prefix, size_t old_prefix_len,
399                   const char *new_prefix, size_t new_prefix_len)
400 {
401   replace_prefix (&dir->name, old_prefix, old_prefix_len,
402                   new_prefix, new_prefix_len);
403 }
404
405 /* Return a directory entry for a given combination of device and inode
406    numbers, or zero if none found.  */
407 static struct directory *
408 find_directory_meta (dev_t dev, ino_t ino)
409 {
410   if (! directory_meta_table)
411     return 0;
412   else
413     {
414       struct directory *dir = make_directory ("", NULL);
415       struct directory *ret;
416       dir->device_number = dev;
417       dir->inode_number = ino;
418       ret = hash_lookup (directory_meta_table, dir);
419       free_directory (dir);
420       return ret;
421     }
422 }
423
424 void
425 update_parent_directory (struct tar_stat_info *parent)
426 {
427   struct directory *directory = find_directory (parent->orig_file_name);
428   if (directory)
429     {
430       struct stat st;
431       if (fstat (parent->fd, &st) != 0)
432         stat_diag (directory->name);
433       else
434         directory->mtime = get_stat_mtime (&st);
435     }
436 }
437
438 #define PD_FORCE_CHILDREN 0x10
439 #define PD_FORCE_INIT     0x20
440 #define PD_CHILDREN(f) ((f) & 3)
441
442 static struct directory *
443 procdir (const char *name_buffer, struct tar_stat_info *st,
444          int flag,
445          char *entry)
446 {
447   struct directory *directory;
448   struct stat *stat_data = &st->stat;
449   bool nfs = NFS_FILE_STAT (*stat_data);
450   bool perhaps_renamed = false;
451
452   if ((directory = find_directory (name_buffer)) != NULL)
453     {
454       if (DIR_IS_INITED (directory))
455         {
456           if (flag & PD_FORCE_INIT)
457             {
458               assign_string (&directory->name, name_buffer);
459             }
460           else
461             {
462               *entry = 'N'; /* Avoid duplicating this directory */
463               return directory;
464             }
465         }
466
467       if (strcmp (directory->name, name_buffer))
468         {
469           *entry = 'N';
470           return directory;
471         }
472
473       /* With NFS, the same file can have two different devices
474          if an NFS directory is mounted in multiple locations,
475          which is relatively common when automounting.
476          To avoid spurious incremental redumping of
477          directories, consider all NFS devices as equal,
478          relying on the i-node to establish differences.  */
479
480       if (! ((!check_device_option
481               || (DIR_IS_NFS (directory) && nfs)
482               || directory->device_number == stat_data->st_dev)
483              && directory->inode_number == stat_data->st_ino))
484         {
485           /* FIXME: find_directory_meta ignores nfs */
486           struct directory *d = find_directory_meta (stat_data->st_dev,
487                                                      stat_data->st_ino);
488           if (d)
489             {
490               if (strcmp (d->name, name_buffer))
491                 {
492                   WARNOPT (WARN_RENAME_DIRECTORY,
493                            (0, 0,
494                             _("%s: Directory has been renamed from %s"),
495                             quotearg_colon (name_buffer),
496                             quote_n (1, d->name)));
497                   directory->orig = d;
498                   DIR_SET_FLAG (directory, DIRF_RENAMED);
499                   dirlist_replace_prefix (d->name, name_buffer);
500                 }
501               directory->children = CHANGED_CHILDREN;
502             }
503           else
504             {
505               perhaps_renamed = true;
506               directory->children = ALL_CHILDREN;
507               directory->device_number = stat_data->st_dev;
508               directory->inode_number = stat_data->st_ino;
509             }
510           if (nfs)
511             DIR_SET_FLAG (directory, DIRF_NFS);
512         }
513       else
514         directory->children = CHANGED_CHILDREN;
515
516       DIR_SET_FLAG (directory, DIRF_FOUND);
517     }
518   else
519     {
520       struct directory *d = find_directory_meta (stat_data->st_dev,
521                                                  stat_data->st_ino);
522
523       directory = note_directory (name_buffer,
524                                   get_stat_mtime (stat_data),
525                                   stat_data->st_dev,
526                                   stat_data->st_ino,
527                                   nfs,
528                                   true,
529                                   NULL);
530
531       if (d)
532         {
533           if (strcmp (d->name, name_buffer))
534             {
535               WARNOPT (WARN_RENAME_DIRECTORY,
536                        (0, 0, _("%s: Directory has been renamed from %s"),
537                         quotearg_colon (name_buffer),
538                         quote_n (1, d->name)));
539               directory->orig = d;
540               DIR_SET_FLAG (directory, DIRF_RENAMED);
541               dirlist_replace_prefix (d->name, name_buffer);
542             }
543           directory->children = CHANGED_CHILDREN;
544         }
545       else
546         {
547           DIR_SET_FLAG (directory, DIRF_NEW);
548           WARNOPT (WARN_NEW_DIRECTORY,
549                    (0, 0, _("%s: Directory is new"),
550                     quotearg_colon (name_buffer)));
551           directory->children =
552             (listed_incremental_option
553              || (OLDER_STAT_TIME (*stat_data, m)
554                  || (after_date_option
555                      && OLDER_STAT_TIME (*stat_data, c))))
556             ? ALL_CHILDREN
557             : CHANGED_CHILDREN;
558         }
559     }
560
561   if (one_file_system_option && st->parent
562       && stat_data->st_dev != st->parent->stat.st_dev)
563     {
564       WARNOPT (WARN_XDEV,
565                (0, 0,
566                 _("%s: directory is on a different filesystem; not dumped"),
567                 quotearg_colon (directory->name)));
568       directory->children = NO_CHILDREN;
569       /* If there is any dumpdir info in that directory, remove it */
570       if (directory->dump)
571         {
572           dumpdir_free (directory->dump);
573           directory->dump = NULL;
574         }
575       perhaps_renamed = false;
576     }
577
578   else if (flag & PD_FORCE_CHILDREN)
579     {
580       directory->children = PD_CHILDREN(flag);
581       if (directory->children == NO_CHILDREN)
582         *entry = 'N';
583     }
584
585   if (perhaps_renamed)
586     WARNOPT (WARN_RENAME_DIRECTORY,
587              (0, 0, _("%s: Directory has been renamed"),
588               quotearg_colon (name_buffer)));
589
590   DIR_SET_FLAG (directory, DIRF_INIT);
591
592   if (directory->children != NO_CHILDREN)
593     {
594       const char *tag_file_name;
595
596       switch (check_exclusion_tags (st, &tag_file_name))
597         {
598         case exclusion_tag_all:
599           /* This warning can be duplicated by code in dump_file0, but only
600              in case when the topmost directory being archived contains
601              an exclusion tag. */
602           exclusion_tag_warning (name_buffer, tag_file_name,
603                                  _("directory not dumped"));
604           *entry = 'N';
605           directory->children = NO_CHILDREN;
606           break;
607
608         case exclusion_tag_contents:
609           exclusion_tag_warning (name_buffer, tag_file_name,
610                                  _("contents not dumped"));
611           directory->children = NO_CHILDREN;
612           directory->tagfile = tag_file_name;
613           break;
614
615         case exclusion_tag_under:
616           exclusion_tag_warning (name_buffer, tag_file_name,
617                                  _("contents not dumped"));
618           directory->tagfile = tag_file_name;
619           break;
620
621         case exclusion_tag_none:
622           break;
623         }
624     }
625
626   return directory;
627 }
628
629 /* Compare dumpdir array from DIRECTORY with directory listing DIR and
630    build a new dumpdir template.
631
632    DIR must be returned by a previous call to savedir().
633
634    File names in DIRECTORY->dump->contents must be sorted
635    alphabetically.
636
637    DIRECTORY->dump is replaced with the created template. Each entry is
638    prefixed with ' ' if it was present in DUMP and with 'Y' otherwise. */
639
640 static void
641 makedumpdir (struct directory *directory, const char *dir)
642 {
643   size_t i,
644          dirsize,  /* Number of elements in DIR */
645          len;      /* Length of DIR, including terminating nul */
646   const char *p;
647   char const **array;
648   char *new_dump, *new_dump_ptr;
649   struct dumpdir *dump;
650
651   if (directory->children == ALL_CHILDREN)
652     dump = NULL;
653   else if (DIR_IS_RENAMED (directory))
654     dump = directory->orig->idump ?
655            directory->orig->idump : directory->orig->dump;
656   else
657     dump = directory->dump;
658
659   /* Count the size of DIR and the number of elements it contains */
660   dirsize = 0;
661   len = 0;
662   for (p = dir; *p; p += strlen (p) + 1, dirsize++)
663     len += strlen (p) + 2;
664   len++;
665
666   /* Create a sorted directory listing */
667   array = xcalloc (dirsize, sizeof array[0]);
668   for (i = 0, p = dir; *p; p += strlen (p) + 1, i++)
669     array[i] = p;
670
671   qsort (array, dirsize, sizeof (array[0]), compare_dirnames);
672
673   /* Prepare space for new dumpdir */
674   new_dump = xmalloc (len);
675   new_dump_ptr = new_dump;
676
677   /* Fill in the dumpdir template */
678   for (i = 0; i < dirsize; i++)
679     {
680       const char *loc = dumpdir_locate (dump, array[i]);
681       if (loc)
682         {
683           if (directory->tagfile)
684             *new_dump_ptr = 'I';
685           else
686             *new_dump_ptr = ' ';
687           new_dump_ptr++;
688         }
689       else if (directory->tagfile)
690         *new_dump_ptr++ = 'I';
691       else
692         *new_dump_ptr++ = 'Y'; /* New entry */
693
694       /* Copy the file name */
695       for (p = array[i]; (*new_dump_ptr++ = *p++); )
696         ;
697     }
698   *new_dump_ptr = 0;
699   directory->idump = directory->dump;
700   directory->dump = dumpdir_create0 (new_dump, NULL);
701   free (new_dump);
702   free (array);
703 }
704
705 /* Create a dumpdir containing only one entry: that for the
706    tagfile. */
707 static void
708 maketagdumpdir (struct directory *directory)
709 {
710   size_t len = strlen (directory->tagfile) + 1;
711   char *new_dump = xmalloc (len + 2);
712   new_dump[0] = 'Y';
713   memcpy (new_dump + 1, directory->tagfile, len);
714   new_dump[len + 1] = 0;
715
716   directory->idump = directory->dump;
717   directory->dump = dumpdir_create0 (new_dump, NULL);
718   free (new_dump);
719 }
720
721 /* Recursively scan the directory identified by ST.  */
722 struct directory *
723 scan_directory (struct tar_stat_info *st)
724 {
725   char const *dir = st->orig_file_name;
726   char *dirp = get_directory_entries (st);
727   dev_t device = st->stat.st_dev;
728   bool cmdline = ! st->parent;
729   namebuf_t nbuf;
730   char *tmp;
731   struct directory *directory;
732   char ch;
733
734   if (! dirp)
735     savedir_error (dir);
736
737   info_attach_exclist (st);
738   
739   tmp = xstrdup (dir);
740   zap_slashes (tmp);
741
742   directory = procdir (tmp, st,
743                        (cmdline ? PD_FORCE_INIT : 0),
744                        &ch);
745
746   free (tmp);
747
748   nbuf = namebuf_create (dir);
749
750   if (dirp)
751     {
752       if (directory->children != NO_CHILDREN)
753         {
754           char *entry;  /* directory entry being scanned */
755           struct dumpdir_iter *itr;
756
757           makedumpdir (directory, dirp);
758
759           for (entry = dumpdir_first (directory->dump, 1, &itr);
760                entry;
761                entry = dumpdir_next (itr))
762             {
763               char *full_name = namebuf_name (nbuf, entry + 1);
764
765               if (*entry == 'I') /* Ignored entry */
766                 *entry = 'N';
767               else if (excluded_name (full_name, st))
768                 *entry = 'N';
769               else
770                 {
771                   int fd = st->fd;
772                   void (*diag) (char const *) = 0;
773                   struct tar_stat_info stsub;
774                   tar_stat_init (&stsub);
775
776                   if (fd < 0)
777                     {
778                       errno = - fd;
779                       diag = open_diag;
780                     }
781                   else if (fstatat (fd, entry + 1, &stsub.stat,
782                                     fstatat_flags) != 0)
783                     diag = stat_diag;
784                   else if (S_ISDIR (stsub.stat.st_mode))
785                     {
786                       int subfd = subfile_open (st, entry + 1,
787                                                 open_read_flags);
788                       if (subfd < 0)
789                         diag = open_diag;
790                       else
791                         {
792                           stsub.fd = subfd;
793                           if (fstat (subfd, &stsub.stat) != 0)
794                             diag = stat_diag;
795                         }
796                     }
797
798                   if (diag)
799                     {
800                       file_removed_diag (full_name, false, diag);
801                       *entry = 'N';
802                     }
803                   else if (S_ISDIR (stsub.stat.st_mode))
804                     {
805                       int pd_flag = 0;
806                       if (!recursion_option)
807                         pd_flag |= PD_FORCE_CHILDREN | NO_CHILDREN;
808                       else if (directory->children == ALL_CHILDREN)
809                         pd_flag |= PD_FORCE_CHILDREN | ALL_CHILDREN;
810                       *entry = 'D';
811
812                       stsub.parent = st;
813                       procdir (full_name, &stsub, pd_flag, entry);
814                       restore_parent_fd (&stsub);
815                     }
816                   else if (one_file_system_option &&
817                            device != stsub.stat.st_dev)
818                     *entry = 'N';
819                   else if (*entry == 'Y')
820                     /* New entry, skip further checks */;
821                   /* FIXME: if (S_ISHIDDEN (stat_data.st_mode))?? */
822                   else if (OLDER_STAT_TIME (stsub.stat, m)
823                            && (!after_date_option
824                                || OLDER_STAT_TIME (stsub.stat, c)))
825                     *entry = 'N';
826                   else
827                     *entry = 'Y';
828
829                   tar_stat_destroy (&stsub);
830                 }
831             }
832           free (itr);
833         }
834       else if (directory->tagfile)
835         maketagdumpdir (directory);
836     }
837
838   namebuf_free (nbuf);
839
840   free (dirp);
841
842   return directory;
843 }
844
845 /* Return pointer to the contents of the directory DIR */
846 const char *
847 directory_contents (struct directory *dir)
848 {
849   if (!dir)
850     return NULL;
851   return dir->dump ? dir->dump->contents : NULL;
852 }
853
854 /* A "safe" version of directory_contents, which never returns NULL. */
855 const char *
856 safe_directory_contents (struct directory *dir)
857 {
858   const char *ret = directory_contents (dir);
859   return ret ? ret : "\0\0\0\0";
860 }
861
862 \f
863 static void
864 obstack_code_rename (struct obstack *stk, char const *from, char const *to)
865 {
866   char const *s;
867
868   s = from[0] == 0 ? from :
869                      safer_name_suffix (from, false, absolute_names_option);
870   obstack_1grow (stk, 'R');
871   obstack_grow (stk, s, strlen (s) + 1);
872
873   s = to[0] == 0 ? to:
874                    safer_name_suffix (to, false, absolute_names_option);
875   obstack_1grow (stk, 'T');
876   obstack_grow (stk, s, strlen (s) + 1);
877 }
878
879 static void
880 store_rename (struct directory *dir, struct obstack *stk)
881 {
882   if (DIR_IS_RENAMED (dir))
883     {
884       struct directory *prev, *p;
885
886       /* Detect eventual cycles and clear DIRF_RENAMED flag, so these entries
887          are ignored when hit by this function next time.
888          If the chain forms a cycle, prev points to the entry DIR is renamed
889          from. In this case it still retains DIRF_RENAMED flag, which will be
890          cleared in the 'else' branch below */
891       for (prev = dir; prev && prev->orig != dir; prev = prev->orig)
892         DIR_CLEAR_FLAG (prev, DIRF_RENAMED);
893
894       if (prev == NULL)
895         {
896           for (p = dir; p && p->orig; p = p->orig)
897             obstack_code_rename (stk, p->orig->name, p->name);
898         }
899       else
900         {
901           char *temp_name;
902
903           DIR_CLEAR_FLAG (prev, DIRF_RENAMED);
904
905           /* Break the cycle by using a temporary name for one of its
906              elements.
907              First, create a temp name stub entry. */
908           temp_name = dir_name (dir->name);
909           obstack_1grow (stk, 'X');
910           obstack_grow (stk, temp_name, strlen (temp_name) + 1);
911
912           obstack_code_rename (stk, dir->name, "");
913
914           for (p = dir; p != prev; p = p->orig)
915             obstack_code_rename (stk, p->orig->name, p->name);
916
917           obstack_code_rename (stk, "", prev->name);
918         }
919     }
920 }
921
922 void
923 append_incremental_renames (struct directory *dir)
924 {
925   struct obstack stk;
926   size_t size;
927   struct directory *dp;
928   const char *dump;
929
930   if (dirhead == NULL)
931     return;
932
933   obstack_init (&stk);
934   dump = directory_contents (dir);
935   if (dump)
936     {
937       size = dumpdir_size (dump) - 1;
938       obstack_grow (&stk, dump, size);
939     }
940   else
941     size = 0;
942
943   for (dp = dirhead; dp; dp = dp->next)
944     store_rename (dp, &stk);
945
946   /* FIXME: Is this the right thing to do when DIR is null?  */
947   if (dir && obstack_object_size (&stk) != size)
948     {
949       obstack_1grow (&stk, 0);
950       dumpdir_free (dir->dump);
951       dir->dump = dumpdir_create (obstack_finish (&stk));
952     }
953   obstack_free (&stk, NULL);
954 }
955
956 \f
957
958 static FILE *listed_incremental_stream;
959
960 /* Version of incremental format snapshots (directory files) used by this
961    tar. Currently it is supposed to be a single decimal number. 0 means
962    incremental snapshots as per tar version before 1.15.2.
963
964    The current tar version supports incremental versions from
965    0 up to TAR_INCREMENTAL_VERSION, inclusive.
966    It is able to create only snapshots of TAR_INCREMENTAL_VERSION */
967
968 #define TAR_INCREMENTAL_VERSION 2
969
970 /* Read incremental snapshot formats 0 and 1 */
971 static void
972 read_incr_db_01 (int version, const char *initbuf)
973 {
974   int n;
975   uintmax_t u;
976   char *buf = NULL;
977   size_t bufsize = 0;
978   char *ebuf;
979   long lineno = 1;
980
981   if (version == 1)
982     {
983       if (getline (&buf, &bufsize, listed_incremental_stream) <= 0)
984         {
985           read_error (listed_incremental_option);
986           free (buf);
987           return;
988         }
989       ++lineno;
990     }
991   else
992     {
993       buf = strdup (initbuf);
994       bufsize = strlen (buf) + 1;
995     }
996
997   newer_mtime_option = decode_timespec (buf, &ebuf, false);
998
999   if (! valid_timespec (newer_mtime_option))
1000     ERROR ((0, errno, "%s:%ld: %s",
1001             quotearg_colon (listed_incremental_option),
1002             lineno,
1003             _("Invalid time stamp")));
1004   else
1005     {
1006       if (version == 1 && *ebuf)
1007         {
1008           char const *buf_ns = ebuf + 1;
1009           errno = 0;
1010           u = strtoumax (buf_ns, &ebuf, 10);
1011           if (!errno && BILLION <= u)
1012             errno = ERANGE;
1013           if (errno || buf_ns == ebuf)
1014             {
1015               ERROR ((0, errno, "%s:%ld: %s",
1016                       quotearg_colon (listed_incremental_option),
1017                       lineno,
1018                       _("Invalid time stamp")));
1019               newer_mtime_option.tv_sec = TYPE_MINIMUM (time_t);
1020               newer_mtime_option.tv_nsec = -1;
1021             }
1022           else
1023             newer_mtime_option.tv_nsec = u;
1024         }
1025     }
1026
1027   while (0 < (n = getline (&buf, &bufsize, listed_incremental_stream)))
1028     {
1029       dev_t dev;
1030       ino_t ino;
1031       bool nfs = buf[0] == '+';
1032       char *strp = buf + nfs;
1033       struct timespec mtime;
1034
1035       lineno++;
1036
1037       if (buf[n - 1] == '\n')
1038         buf[n - 1] = '\0';
1039
1040       if (version == 1)
1041         {
1042           mtime = decode_timespec (strp, &ebuf, false);
1043           strp = ebuf;
1044           if (!valid_timespec (mtime) || *strp != ' ')
1045             ERROR ((0, errno, "%s:%ld: %s",
1046                     quotearg_colon (listed_incremental_option), lineno,
1047                     _("Invalid modification time")));
1048
1049           errno = 0;
1050           u = strtoumax (strp, &ebuf, 10);
1051           if (!errno && BILLION <= u)
1052             errno = ERANGE;
1053           if (errno || strp == ebuf || *ebuf != ' ')
1054             {
1055               ERROR ((0, errno, "%s:%ld: %s",
1056                       quotearg_colon (listed_incremental_option), lineno,
1057                       _("Invalid modification time (nanoseconds)")));
1058               mtime.tv_nsec = -1;
1059             }
1060           else
1061             mtime.tv_nsec = u;
1062           strp = ebuf;
1063         }
1064       else
1065         mtime.tv_sec = mtime.tv_nsec = 0;
1066
1067       dev = strtosysint (strp, &ebuf,
1068                          TYPE_MINIMUM (dev_t), TYPE_MAXIMUM (dev_t));
1069       strp = ebuf;
1070       if (errno || *strp != ' ')
1071         ERROR ((0, errno, "%s:%ld: %s",
1072                 quotearg_colon (listed_incremental_option), lineno,
1073                 _("Invalid device number")));
1074
1075       ino = strtosysint (strp, &ebuf,
1076                          TYPE_MINIMUM (ino_t), TYPE_MAXIMUM (ino_t));
1077       strp = ebuf;
1078       if (errno || *strp != ' ')
1079         ERROR ((0, errno, "%s:%ld: %s",
1080                 quotearg_colon (listed_incremental_option), lineno,
1081                 _("Invalid inode number")));
1082
1083       strp++;
1084       unquote_string (strp);
1085       note_directory (strp, mtime, dev, ino, nfs, false, NULL);
1086     }
1087   free (buf);
1088 }
1089
1090 /* Read a nul-terminated string from FP and store it in STK.
1091    Store the number of bytes read (including nul terminator) in PCOUNT.
1092
1093    Return the last character read or EOF on end of file. */
1094 static int
1095 read_obstack (FILE *fp, struct obstack *stk, size_t *pcount)
1096 {
1097   int c;
1098   size_t i;
1099
1100   for (i = 0, c = getc (fp); c != EOF && c != 0; c = getc (fp), i++)
1101     obstack_1grow (stk, c);
1102   obstack_1grow (stk, 0);
1103
1104   *pcount = i;
1105   return c;
1106 }
1107
1108 /* Read from file FP a null-terminated string and convert it to an
1109    integer.  FIELDNAME is the intended use of the integer, useful for
1110    diagnostics.  MIN_VAL and MAX_VAL are its minimum and maximum
1111    permissible values; MIN_VAL must be nonpositive and MAX_VAL positive.
1112    Store into *PVAL the resulting value, converted to intmax_t.
1113
1114    Throw a fatal error if the string cannot be converted or if the
1115    converted value is out of range.
1116
1117    Return true if successful, false if end of file.  */
1118
1119 static bool
1120 read_num (FILE *fp, char const *fieldname,
1121           intmax_t min_val, uintmax_t max_val, intmax_t *pval)
1122 {
1123   int i;
1124   char buf[INT_BUFSIZE_BOUND (intmax_t)];
1125   char offbuf[INT_BUFSIZE_BOUND (off_t)];
1126   char minbuf[INT_BUFSIZE_BOUND (intmax_t)];
1127   char maxbuf[INT_BUFSIZE_BOUND (intmax_t)];
1128   int conversion_errno;
1129   int c = getc (fp);
1130   bool negative = c == '-';
1131
1132   for (i = 0; (i == 0 && negative) || ISDIGIT (c); i++)
1133     {
1134       buf[i] = c;
1135       if (i == sizeof buf - 1)
1136         FATAL_ERROR ((0, 0,
1137                       _("%s: byte %s: %s %.*s... too long"),
1138                       quotearg_colon (listed_incremental_option),
1139                       offtostr (ftello (fp), offbuf),
1140                       fieldname, i + 1, buf));
1141       c = getc (fp);
1142     }
1143
1144   buf[i] = 0;
1145
1146   if (c < 0)
1147     {
1148       if (ferror (fp))
1149         read_fatal (listed_incremental_option);
1150       if (i != 0)
1151         FATAL_ERROR ((0, 0, "%s: %s",
1152                       quotearg_colon (listed_incremental_option),
1153                       _("Unexpected EOF in snapshot file")));
1154       return false;
1155     }
1156
1157   if (c)
1158     FATAL_ERROR ((0, 0,
1159                   _("%s: byte %s: %s %s followed by invalid byte 0x%02x"),
1160                   quotearg_colon (listed_incremental_option),
1161                   offtostr (ftello (fp), offbuf),
1162                   fieldname, buf, c));
1163
1164   *pval = strtosysint (buf, NULL, min_val, max_val);
1165   conversion_errno = errno;
1166
1167   switch (conversion_errno)
1168     {
1169     case ERANGE:
1170       FATAL_ERROR ((0, conversion_errno,
1171                     _("%s: byte %s: (valid range %s..%s)\n\t%s %s"),
1172                     quotearg_colon (listed_incremental_option),
1173                     offtostr (ftello (fp), offbuf),
1174                     imaxtostr (min_val, minbuf),
1175                     umaxtostr (max_val, maxbuf), fieldname, buf));
1176     default:
1177       FATAL_ERROR ((0, conversion_errno,
1178                     _("%s: byte %s: %s %s"),
1179                     quotearg_colon (listed_incremental_option),
1180                     offtostr (ftello (fp), offbuf), fieldname, buf));
1181     case 0:
1182       break;
1183     }
1184
1185   return true;
1186 }
1187
1188 /* Read from FP two NUL-terminated strings representing a struct
1189    timespec.  Return the resulting value in PVAL.
1190
1191    Throw a fatal error if the string cannot be converted.  */
1192
1193 static void
1194 read_timespec (FILE *fp, struct timespec *pval)
1195 {
1196   intmax_t s, ns;
1197
1198   if (read_num (fp, "sec", TYPE_MINIMUM (time_t), TYPE_MAXIMUM (time_t), &s)
1199       && read_num (fp, "nsec", 0, BILLION - 1, &ns))
1200     {
1201       pval->tv_sec = s;
1202       pval->tv_nsec = ns;
1203     }
1204   else
1205     {
1206       FATAL_ERROR ((0, 0, "%s: %s",
1207                     quotearg_colon (listed_incremental_option),
1208                     _("Unexpected EOF in snapshot file")));
1209     }
1210 }
1211
1212 /* Read incremental snapshot format 2 */
1213 static void
1214 read_incr_db_2 (void)
1215 {
1216   struct obstack stk;
1217   char offbuf[INT_BUFSIZE_BOUND (off_t)];
1218
1219   obstack_init (&stk);
1220
1221   read_timespec (listed_incremental_stream, &newer_mtime_option);
1222
1223   for (;;)
1224     {
1225       intmax_t i;
1226       struct timespec mtime;
1227       dev_t dev;
1228       ino_t ino;
1229       bool nfs;
1230       char *name;
1231       char *content;
1232       size_t s;
1233
1234       if (! read_num (listed_incremental_stream, "nfs", 0, 1, &i))
1235         return; /* Normal return */
1236
1237       nfs = i;
1238
1239       read_timespec (listed_incremental_stream, &mtime);
1240
1241       if (! read_num (listed_incremental_stream, "dev",
1242                       TYPE_MINIMUM (dev_t), TYPE_MAXIMUM (dev_t), &i))
1243         break;
1244       dev = i;
1245
1246       if (! read_num (listed_incremental_stream, "ino",
1247                       TYPE_MINIMUM (ino_t), TYPE_MAXIMUM (ino_t), &i))
1248         break;
1249       ino = i;
1250
1251       if (read_obstack (listed_incremental_stream, &stk, &s))
1252         break;
1253
1254       name = obstack_finish (&stk);
1255
1256       while (read_obstack (listed_incremental_stream, &stk, &s) == 0 && s > 1)
1257         ;
1258       if (getc (listed_incremental_stream) != 0)
1259         FATAL_ERROR ((0, 0, _("%s: byte %s: %s"),
1260                       quotearg_colon (listed_incremental_option),
1261                       offtostr (ftello (listed_incremental_stream), offbuf),
1262                       _("Missing record terminator")));
1263
1264       content = obstack_finish (&stk);
1265       note_directory (name, mtime, dev, ino, nfs, false, content);
1266       obstack_free (&stk, content);
1267     }
1268   FATAL_ERROR ((0, 0, "%s: %s",
1269                 quotearg_colon (listed_incremental_option),
1270                 _("Unexpected EOF in snapshot file")));
1271 }
1272
1273 /* Display (to stdout) the range of allowed values for each field
1274    in the snapshot file.  The array below should be kept in sync
1275    with any changes made to the read_num() calls in the parsing
1276    loop inside read_incr_db_2().
1277
1278    (This function is invoked via the --show-snapshot-field-ranges
1279    command line option.) */
1280
1281 struct field_range
1282 {
1283   char const *fieldname;
1284   intmax_t min_val;
1285   uintmax_t max_val;
1286 };
1287
1288 static struct field_range const field_ranges[] = {
1289   { "nfs", 0, 1 },
1290   { "timestamp_sec", TYPE_MINIMUM (time_t), TYPE_MAXIMUM (time_t) },
1291   { "timestamp_nsec", 0, BILLION - 1 },
1292   { "dev", TYPE_MINIMUM (dev_t), TYPE_MAXIMUM (dev_t) },
1293   { "ino", TYPE_MINIMUM (ino_t), TYPE_MAXIMUM (ino_t) },
1294   { NULL, 0, 0 }
1295 };
1296
1297 void
1298 show_snapshot_field_ranges (void)
1299 {
1300   struct field_range const *p;
1301   char minbuf[SYSINT_BUFSIZE];
1302   char maxbuf[SYSINT_BUFSIZE];
1303
1304   printf("This tar's snapshot file field ranges are\n");
1305   printf ("   (%-15s => [ %s, %s ]):\n\n", "field name", "min", "max");
1306
1307   for (p=field_ranges; p->fieldname != NULL; p++)
1308     {
1309       printf ("    %-15s => [ %s, %s ],\n", p->fieldname,
1310               sysinttostr (p->min_val, p->min_val, p->max_val, minbuf),
1311               sysinttostr (p->max_val, p->min_val, p->max_val, maxbuf));
1312
1313     }
1314
1315   printf("\n");
1316 }
1317
1318 /* Read incremental snapshot file (directory file).
1319    If the file has older incremental version, make sure that it is processed
1320    correctly and that tar will use the most conservative backup method among
1321    possible alternatives (i.e. prefer ALL_CHILDREN over CHANGED_CHILDREN,
1322    etc.) This ensures that the snapshots are updated to the recent version
1323    without any loss of data. */
1324 void
1325 read_directory_file (void)
1326 {
1327   int fd;
1328   char *buf = NULL;
1329   size_t bufsize = 0;
1330   int flags = O_RDWR | O_CREAT;
1331
1332   if (incremental_level == 0)
1333     flags |= O_TRUNC;
1334   /* Open the file for both read and write.  That way, we can write
1335      it later without having to reopen it, and don't have to worry if
1336      we chdir in the meantime.  */
1337   fd = open (listed_incremental_option, flags, MODE_RW);
1338   if (fd < 0)
1339     {
1340       open_error (listed_incremental_option);
1341       return;
1342     }
1343
1344   listed_incremental_stream = fdopen (fd, "r+");
1345   if (! listed_incremental_stream)
1346     {
1347       open_error (listed_incremental_option);
1348       close (fd);
1349       return;
1350     }
1351
1352   /* Consume the first name from the name list and reset the
1353      list afterwards.  This is done to change to the new
1354      directory, if the first name is a chdir request (-C dir),
1355      which is necessary to recreate absolute file names. */
1356   name_from_list ();
1357   blank_name_list ();
1358
1359   if (0 < getline (&buf, &bufsize, listed_incremental_stream))
1360     {
1361       char *ebuf;
1362       uintmax_t incremental_version;
1363
1364       if (strncmp (buf, PACKAGE_NAME, sizeof PACKAGE_NAME - 1) == 0)
1365         {
1366           ebuf = buf + sizeof PACKAGE_NAME - 1;
1367           if (*ebuf++ != '-')
1368             ERROR((1, 0, _("Bad incremental file format")));
1369           for (; *ebuf != '-'; ebuf++)
1370             if (!*ebuf)
1371               ERROR((1, 0, _("Bad incremental file format")));
1372
1373           incremental_version = strtoumax (ebuf + 1, NULL, 10);
1374         }
1375       else
1376         incremental_version = 0;
1377
1378       switch (incremental_version)
1379         {
1380         case 0:
1381         case 1:
1382           read_incr_db_01 (incremental_version, buf);
1383           break;
1384
1385         case TAR_INCREMENTAL_VERSION:
1386           read_incr_db_2 ();
1387           break;
1388
1389         default:
1390           ERROR ((1, 0, _("Unsupported incremental format version: %"PRIuMAX),
1391                   incremental_version));
1392         }
1393
1394     }
1395
1396   if (ferror (listed_incremental_stream))
1397     read_error (listed_incremental_option);
1398   free (buf);
1399 }
1400
1401 /* Output incremental data for the directory ENTRY to the file DATA.
1402    Return nonzero if successful, preserving errno on write failure.  */
1403 static bool
1404 write_directory_file_entry (void *entry, void *data)
1405 {
1406   struct directory const *directory = entry;
1407   FILE *fp = data;
1408
1409   if (DIR_IS_FOUND (directory))
1410     {
1411       char buf[SYSINT_BUFSIZE];
1412       char const *s;
1413
1414       s = DIR_IS_NFS (directory) ? "1" : "0";
1415       fwrite (s, 2, 1, fp);
1416       s = sysinttostr (directory->mtime.tv_sec, TYPE_MINIMUM (time_t),
1417                        TYPE_MAXIMUM (time_t), buf);
1418       fwrite (s, strlen (s) + 1, 1, fp);
1419       s = imaxtostr (directory->mtime.tv_nsec, buf);
1420       fwrite (s, strlen (s) + 1, 1, fp);
1421       s = sysinttostr (directory->device_number,
1422                        TYPE_MINIMUM (dev_t), TYPE_MAXIMUM (dev_t), buf);
1423       fwrite (s, strlen (s) + 1, 1, fp);
1424       s = sysinttostr (directory->inode_number,
1425                        TYPE_MINIMUM (ino_t), TYPE_MAXIMUM (ino_t), buf);
1426       fwrite (s, strlen (s) + 1, 1, fp);
1427
1428       fwrite (directory->name, strlen (directory->name) + 1, 1, fp);
1429       if (directory->dump)
1430         {
1431           const char *p;
1432           struct dumpdir_iter *itr;
1433
1434           for (p = dumpdir_first (directory->dump, 0, &itr);
1435                p;
1436                p = dumpdir_next (itr))
1437             fwrite (p, strlen (p) + 1, 1, fp);
1438           free (itr);
1439         }
1440       fwrite ("\0\0", 2, 1, fp);
1441     }
1442
1443   return ! ferror (fp);
1444 }
1445
1446 void
1447 write_directory_file (void)
1448 {
1449   FILE *fp = listed_incremental_stream;
1450   char buf[UINTMAX_STRSIZE_BOUND];
1451   char *s;
1452
1453   if (! fp)
1454     return;
1455
1456   if (fseeko (fp, 0L, SEEK_SET) != 0)
1457     seek_error (listed_incremental_option);
1458   if (sys_truncate (fileno (fp)) != 0)
1459     truncate_error (listed_incremental_option);
1460
1461   fprintf (fp, "%s-%s-%d\n", PACKAGE_NAME, PACKAGE_VERSION,
1462            TAR_INCREMENTAL_VERSION);
1463
1464   s = (TYPE_SIGNED (time_t)
1465        ? imaxtostr (start_time.tv_sec, buf)
1466        : umaxtostr (start_time.tv_sec, buf));
1467   fwrite (s, strlen (s) + 1, 1, fp);
1468   s = umaxtostr (start_time.tv_nsec, buf);
1469   fwrite (s, strlen (s) + 1, 1, fp);
1470
1471   if (! ferror (fp) && directory_table)
1472     hash_do_for_each (directory_table, write_directory_file_entry, fp);
1473
1474   if (ferror (fp))
1475     write_error (listed_incremental_option);
1476   if (fclose (fp) != 0)
1477     close_error (listed_incremental_option);
1478 }
1479
1480 \f
1481 /* Restoration of incremental dumps.  */
1482
1483 static void
1484 get_gnu_dumpdir (struct tar_stat_info *stat_info)
1485 {
1486   size_t size;
1487   size_t copied;
1488   union block *data_block;
1489   char *to;
1490   char *archive_dir;
1491
1492   size = stat_info->stat.st_size;
1493
1494   archive_dir = xmalloc (size);
1495   to = archive_dir;
1496
1497   set_next_block_after (current_header);
1498   mv_begin_read (stat_info);
1499
1500   for (; size > 0; size -= copied)
1501     {
1502       mv_size_left (size);
1503       data_block = find_next_block ();
1504       if (!data_block)
1505         ERROR ((1, 0, _("Unexpected EOF in archive")));
1506       copied = available_space_after (data_block);
1507       if (copied > size)
1508         copied = size;
1509       memcpy (to, data_block->buffer, copied);
1510       to += copied;
1511       set_next_block_after ((union block *)
1512                             (data_block->buffer + copied - 1));
1513     }
1514
1515   mv_end ();
1516
1517   stat_info->dumpdir = archive_dir;
1518   stat_info->skipped = true; /* For skip_member() and friends
1519                                 to work correctly */
1520 }
1521
1522 /* Return T if STAT_INFO represents a dumpdir archive member.
1523    Note: can invalidate current_header. It happens if flush_archive()
1524    gets called within get_gnu_dumpdir() */
1525 bool
1526 is_dumpdir (struct tar_stat_info *stat_info)
1527 {
1528   if (stat_info->is_dumpdir && !stat_info->dumpdir)
1529     get_gnu_dumpdir (stat_info);
1530   return stat_info->is_dumpdir;
1531 }
1532
1533 static bool
1534 dumpdir_ok (char *dumpdir)
1535 {
1536   char *p;
1537   int has_tempdir = 0;
1538   int expect = 0;
1539
1540   for (p = dumpdir; *p; p += strlen (p) + 1)
1541     {
1542       if (expect && *p != expect)
1543         {
1544           ERROR ((0, 0,
1545                   _("Malformed dumpdir: expected '%c' but found %#3o"),
1546                   expect, *p));
1547           return false;
1548         }
1549       switch (*p)
1550         {
1551         case 'X':
1552           if (has_tempdir)
1553             {
1554               ERROR ((0, 0,
1555                       _("Malformed dumpdir: 'X' duplicated")));
1556               return false;
1557             }
1558           else
1559             has_tempdir = 1;
1560           break;
1561
1562         case 'R':
1563           if (p[1] == 0)
1564             {
1565               if (!has_tempdir)
1566                 {
1567                   ERROR ((0, 0,
1568                           _("Malformed dumpdir: empty name in 'R'")));
1569                   return false;
1570                 }
1571               else
1572                 has_tempdir = 0;
1573             }
1574           expect = 'T';
1575           break;
1576
1577         case 'T':
1578           if (expect != 'T')
1579             {
1580               ERROR ((0, 0,
1581                       _("Malformed dumpdir: 'T' not preceeded by 'R'")));
1582               return false;
1583             }
1584           if (p[1] == 0 && !has_tempdir)
1585             {
1586               ERROR ((0, 0,
1587                       _("Malformed dumpdir: empty name in 'T'")));
1588               return false;
1589             }
1590           expect = 0;
1591           break;
1592
1593         case 'N':
1594         case 'Y':
1595         case 'D':
1596           break;
1597
1598         default:
1599           /* FIXME: bail out? */
1600           break;
1601         }
1602     }
1603
1604   if (expect)
1605     {
1606       ERROR ((0, 0,
1607               _("Malformed dumpdir: expected '%c' but found end of data"),
1608               expect));
1609       return false;
1610     }
1611
1612   if (has_tempdir)
1613     WARNOPT (WARN_BAD_DUMPDIR,
1614              (0, 0, _("Malformed dumpdir: 'X' never used")));
1615
1616   return true;
1617 }
1618
1619 /* Examine the directories under directory_name and delete any
1620    files that were not there at the time of the back-up. */
1621 static bool
1622 try_purge_directory (char const *directory_name)
1623 {
1624   char *current_dir;
1625   char *cur, *arc, *p;
1626   char *temp_stub = NULL;
1627   struct dumpdir *dump;
1628
1629   if (!is_dumpdir (&current_stat_info))
1630     return false;
1631
1632   current_dir = tar_savedir (directory_name, 0);
1633
1634   if (!current_dir)
1635     /* The directory doesn't exist now.  It'll be created.  In any
1636        case, we don't have to delete any files out of it.  */
1637     return false;
1638
1639   /* Verify if dump directory is sane */
1640   if (!dumpdir_ok (current_stat_info.dumpdir))
1641     return false;
1642
1643   /* Process renames */
1644   for (arc = current_stat_info.dumpdir; *arc; arc += strlen (arc) + 1)
1645     {
1646       if (*arc == 'X')
1647         {
1648 #define TEMP_DIR_TEMPLATE "tar.XXXXXX"
1649           size_t len = strlen (arc + 1);
1650           temp_stub = xrealloc (temp_stub, len + 1 + sizeof TEMP_DIR_TEMPLATE);
1651           memcpy (temp_stub, arc + 1, len);
1652           temp_stub[len] = '/';
1653           memcpy (temp_stub + len + 1, TEMP_DIR_TEMPLATE,
1654                   sizeof TEMP_DIR_TEMPLATE);
1655           if (!mkdtemp (temp_stub))
1656             {
1657               ERROR ((0, errno,
1658                       _("Cannot create temporary directory using template %s"),
1659                       quote (temp_stub)));
1660               free (temp_stub);
1661               free (current_dir);
1662               return false;
1663             }
1664         }
1665       else if (*arc == 'R')
1666         {
1667           char *src, *dst;
1668           src = arc + 1;
1669           arc += strlen (arc) + 1;
1670           dst = arc + 1;
1671
1672           /* Ensure that neither source nor destination are absolute file
1673              names (unless permitted by -P option), and that they do not
1674              contain dubious parts (e.g. ../).
1675
1676              This is an extra safety precaution. Besides, it might be
1677              necessary to extract from archives created with tar versions
1678              prior to 1.19. */
1679
1680           if (*src)
1681             src = safer_name_suffix (src, false, absolute_names_option);
1682           if (*dst)
1683             dst = safer_name_suffix (dst, false, absolute_names_option);
1684
1685           if (*src == 0)
1686             src = temp_stub;
1687           else if (*dst == 0)
1688             dst = temp_stub;
1689
1690           if (!rename_directory (src, dst))
1691             {
1692               free (temp_stub);
1693               free (current_dir);
1694               /* FIXME: Make sure purge_directory(dst) will return
1695                  immediately */
1696               return false;
1697             }
1698         }
1699     }
1700
1701   free (temp_stub);
1702
1703   /* Process deletes */
1704   dump = dumpdir_create (current_stat_info.dumpdir);
1705   p = NULL;
1706   for (cur = current_dir; *cur; cur += strlen (cur) + 1)
1707     {
1708       const char *entry;
1709       struct stat st;
1710       free (p);
1711       p = new_name (directory_name, cur);
1712
1713       if (deref_stat (p, &st) != 0)
1714         {
1715           if (errno != ENOENT) /* FIXME: Maybe keep a list of renamed
1716                                   dirs and check it here? */
1717             {
1718               stat_diag (p);
1719               WARN ((0, 0, _("%s: Not purging directory: unable to stat"),
1720                      quotearg_colon (p)));
1721             }
1722           continue;
1723         }
1724
1725       if (!(entry = dumpdir_locate (dump, cur))
1726           || (*entry == 'D' && !S_ISDIR (st.st_mode))
1727           || (*entry == 'Y' && S_ISDIR (st.st_mode)))
1728         {
1729           if (one_file_system_option && st.st_dev != root_device)
1730             {
1731               WARN ((0, 0,
1732                      _("%s: directory is on a different device: not purging"),
1733                      quotearg_colon (p)));
1734               continue;
1735             }
1736
1737           if (! interactive_option || confirm ("delete", p))
1738             {
1739               if (verbose_option)
1740                 fprintf (stdlis, _("%s: Deleting %s\n"),
1741                          program_name, quote (p));
1742               if (! remove_any_file (p, RECURSIVE_REMOVE_OPTION))
1743                 {
1744                   int e = errno;
1745                   ERROR ((0, e, _("%s: Cannot remove"), quotearg_colon (p)));
1746                 }
1747             }
1748         }
1749     }
1750   free (p);
1751   dumpdir_free (dump);
1752
1753   free (current_dir);
1754   return true;
1755 }
1756
1757 void
1758 purge_directory (char const *directory_name)
1759 {
1760   if (!try_purge_directory (directory_name))
1761     skip_member ();
1762 }
1763
1764 void
1765 list_dumpdir (char *buffer, size_t size)
1766 {
1767   int state = 0;
1768   while (size)
1769     {
1770       switch (*buffer)
1771         {
1772         case 'Y':
1773         case 'N':
1774         case 'D':
1775         case 'R':
1776         case 'T':
1777         case 'X':
1778           fprintf (stdlis, "%c", *buffer);
1779           if (state == 0)
1780             {
1781               fprintf (stdlis, " ");
1782               state = 1;
1783             }
1784           buffer++;
1785           size--;
1786           break;
1787
1788         case 0:
1789           fputc ('\n', stdlis);
1790           buffer++;
1791           size--;
1792           state = 0;
1793           break;
1794
1795         default:
1796           fputc (*buffer, stdlis);
1797           buffer++;
1798           size--;
1799         }
1800     }
1801 }