1 /* GNU dump extensions to tar.
3 Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
4 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
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
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.
16 You should have received a copy of the GNU General Public License along
17 with this program; if not, write to the Free Software Foundation, Inc.,
18 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
25 /* Incremental dump specialities. */
27 /* Which child files to save under a directory. */
35 #define DIRF_INIT 0x0001 /* directory structure is initialized
36 (procdir called at least once) */
37 #define DIRF_NFS 0x0002 /* directory is mounted on nfs */
38 #define DIRF_FOUND 0x0004 /* directory is found on fs */
39 #define DIRF_NEW 0x0008 /* directory is new (not found
40 in the previous dump) */
41 #define DIRF_RENAMED 0x0010 /* directory is renamed */
43 #define DIR_IS_INITED(d) ((d)->flags & DIRF_INIT)
44 #define DIR_IS_NFS(d) ((d)->flags & DIRF_NFS)
45 #define DIR_IS_FOUND(d) ((d)->flags & DIRF_FOUND)
46 #define DIR_IS_NEW(d) ((d)->flags & DIRF_NEW)
47 #define DIR_IS_RENAMED(d) ((d)->flags & DIRF_RENAMED)
49 #define DIR_SET_FLAG(d,f) (d)->flags |= (f)
50 #define DIR_CLEAR_FLAG(d,f) (d)->flags &= ~(f)
52 struct dumpdir
/* Dump directory listing */
54 char *contents
; /* Actual contents */
55 size_t total
; /* Total number of elements */
56 size_t elc
; /* Number of D/N/Y elements. */
57 char **elv
; /* Array of D/N/Y elements */
60 /* Directory attributes. */
63 struct directory
*next
;
64 struct timespec mtime
; /* Modification time */
65 dev_t device_number
; /* device number for directory */
66 ino_t inode_number
; /* inode number for directory */
67 struct dumpdir
*dump
; /* Directory contents */
68 struct dumpdir
*idump
; /* Initial contents if the directory was
70 enum children children
; /* What to save under this directory */
71 unsigned flags
; /* See DIRF_ macros above */
72 struct directory
*orig
; /* If the directory was renamed, points to
73 the original directory structure */
74 const char *tagfile
; /* Tag file, if the directory falls under
75 exclusion_tag_under */
76 char *caname
; /* canonical name */
77 char *name
; /* file name of directory */
81 dumpdir_create0 (const char *contents
, const char *cmask
)
84 size_t i
, total
, ctsize
, len
;
88 for (i
= 0, total
= 0, ctsize
= 1, q
= contents
; *q
; total
++, q
+= len
)
92 if (!cmask
|| strchr (cmask
, *q
))
95 dump
= xmalloc (sizeof (*dump
) + ctsize
);
96 dump
->contents
= (char*)(dump
+ 1);
97 memcpy (dump
->contents
, contents
, ctsize
);
100 dump
->elv
= xcalloc (i
+ 1, sizeof (dump
->elv
[0]));
102 for (i
= 0, p
= dump
->contents
; *p
; p
+= strlen (p
) + 1)
104 if (!cmask
|| strchr (cmask
, *p
))
105 dump
->elv
[i
++] = p
+ 1;
112 dumpdir_create (const char *contents
)
114 return dumpdir_create0 (contents
, "YND");
118 dumpdir_free (struct dumpdir
*dump
)
125 compare_dirnames (const void *first
, const void *second
)
127 char const *const *name1
= first
;
128 char const *const *name2
= second
;
129 return strcmp (*name1
, *name2
);
132 /* Locate NAME in the dumpdir array DUMP.
133 Return pointer to the slot in DUMP->contents, or NULL if not found */
135 dumpdir_locate (struct dumpdir
*dump
, const char *name
)
141 ptr
= bsearch (&name
, dump
->elv
, dump
->elc
, sizeof (dump
->elv
[0]),
143 return ptr
? *ptr
- 1: NULL
;
148 struct dumpdir
*dump
; /* Dumpdir being iterated */
149 int all
; /* Iterate over all entries, not only D/N/Y */
150 size_t next
; /* Index of the next element */
154 dumpdir_next (struct dumpdir_iter
*itr
)
156 size_t cur
= itr
->next
;
161 ret
= itr
->dump
->contents
+ cur
;
164 itr
->next
+= strlen (ret
) + 1;
166 else if (cur
< itr
->dump
->elc
)
168 ret
= itr
->dump
->elv
[cur
] - 1;
176 dumpdir_first (struct dumpdir
*dump
, int all
, struct dumpdir_iter
**pitr
)
178 struct dumpdir_iter
*itr
= xmalloc (sizeof (*itr
));
183 return dumpdir_next (itr
);
186 /* Return size in bytes of the dumpdir array P */
188 dumpdir_size (const char *p
)
194 size_t size
= strlen (p
) + 1;
202 static struct directory
*dirhead
, *dirtail
;
203 static Hash_table
*directory_table
;
204 static Hash_table
*directory_meta_table
;
206 #if HAVE_ST_FSTYPE_STRING
207 static char const nfs_string
[] = "nfs";
208 # define NFS_FILE_STAT(st) (strcmp ((st).st_fstype, nfs_string) == 0)
210 # define ST_DEV_MSB(st) (~ (dev_t) 0 << (sizeof (st).st_dev * CHAR_BIT - 1))
211 # define NFS_FILE_STAT(st) (((st).st_dev & ST_DEV_MSB (st)) != 0)
214 /* Calculate the hash of a directory. */
216 hash_directory_canonical_name (void const *entry
, size_t n_buckets
)
218 struct directory
const *directory
= entry
;
219 return hash_string (directory
->caname
, n_buckets
);
222 /* Compare two directories for equality of their names. */
224 compare_directory_canonical_names (void const *entry1
, void const *entry2
)
226 struct directory
const *directory1
= entry1
;
227 struct directory
const *directory2
= entry2
;
228 return strcmp (directory1
->caname
, directory2
->caname
) == 0;
232 hash_directory_meta (void const *entry
, size_t n_buckets
)
234 struct directory
const *directory
= entry
;
235 /* FIXME: Work out a better algorytm */
236 return (directory
->device_number
+ directory
->inode_number
) % n_buckets
;
239 /* Compare two directories for equality of their device and inode numbers. */
241 compare_directory_meta (void const *entry1
, void const *entry2
)
243 struct directory
const *directory1
= entry1
;
244 struct directory
const *directory2
= entry2
;
245 return directory1
->device_number
== directory2
->device_number
246 && directory1
->inode_number
== directory2
->inode_number
;
249 /* Make a directory entry for given relative NAME and canonical name CANAME.
250 The latter is "stolen", i.e. the returned directory contains pointer to
252 static struct directory
*
253 make_directory (const char *name
, char *caname
)
255 size_t namelen
= strlen (name
);
256 struct directory
*directory
= xmalloc (sizeof (*directory
));
257 directory
->next
= NULL
;
258 directory
->dump
= directory
->idump
= NULL
;
259 directory
->orig
= NULL
;
260 directory
->flags
= false;
261 if (namelen
&& ISSLASH (name
[namelen
- 1]))
263 directory
->name
= xmalloc (namelen
+ 1);
264 memcpy (directory
->name
, name
, namelen
);
265 directory
->name
[namelen
] = 0;
266 directory
->caname
= caname
;
267 directory
->tagfile
= NULL
;
272 free_directory (struct directory
*dir
)
279 static struct directory
*
280 attach_directory (const char *name
)
282 char *cname
= normalize_filename (name
);
283 struct directory
*dir
= make_directory (name
, cname
);
294 dirlist_replace_prefix (const char *pref
, const char *repl
)
296 struct directory
*dp
;
297 size_t pref_len
= strlen (pref
);
298 size_t repl_len
= strlen (repl
);
299 for (dp
= dirhead
; dp
; dp
= dp
->next
)
300 replace_prefix (&dp
->name
, pref
, pref_len
, repl
, repl_len
);
303 /* Create and link a new directory entry for directory NAME, having a
304 device number DEV and an inode number INO, with NFS indicating
305 whether it is an NFS device and FOUND indicating whether we have
306 found that the directory exists. */
307 static struct directory
*
308 note_directory (char const *name
, struct timespec mtime
,
309 dev_t dev
, ino_t ino
, bool nfs
, bool found
,
310 const char *contents
)
312 struct directory
*directory
= attach_directory (name
);
314 directory
->mtime
= mtime
;
315 directory
->device_number
= dev
;
316 directory
->inode_number
= ino
;
317 directory
->children
= CHANGED_CHILDREN
;
319 DIR_SET_FLAG (directory
, DIRF_NFS
);
321 DIR_SET_FLAG (directory
, DIRF_FOUND
);
323 directory
->dump
= dumpdir_create (contents
);
325 directory
->dump
= NULL
;
327 if (! ((directory_table
328 || (directory_table
= hash_initialize (0, 0,
329 hash_directory_canonical_name
,
330 compare_directory_canonical_names
, 0)))
331 && hash_insert (directory_table
, directory
)))
334 if (! ((directory_meta_table
335 || (directory_meta_table
= hash_initialize (0, 0,
337 compare_directory_meta
,
339 && hash_insert (directory_meta_table
, directory
)))
345 /* Return a directory entry for a given file NAME, or zero if none found. */
346 static struct directory
*
347 find_directory (const char *name
)
349 if (! directory_table
)
353 char *caname
= normalize_filename (name
);
354 struct directory
*dir
= make_directory (name
, caname
);
355 struct directory
*ret
= hash_lookup (directory_table
, dir
);
356 free_directory (dir
);
362 /* Remove directory entry for the given CANAME */
364 remove_directory (const char *caname
)
366 struct directory
*dir
= make_directory (caname
, xstrdup (caname
));
367 struct directory
*ret
= hash_delete (directory_table
, dir
);
369 free_directory (ret
);
370 free_directory (dir
);
374 /* If first OLD_PREFIX_LEN bytes of DIR->NAME name match OLD_PREFIX,
375 replace them with NEW_PREFIX. */
377 rebase_directory (struct directory
*dir
,
378 const char *old_prefix
, size_t old_prefix_len
,
379 const char *new_prefix
, size_t new_prefix_len
)
381 replace_prefix (&dir
->name
, old_prefix
, old_prefix_len
,
382 new_prefix
, new_prefix_len
);
385 /* Return a directory entry for a given combination of device and inode
386 numbers, or zero if none found. */
387 static struct directory
*
388 find_directory_meta (dev_t dev
, ino_t ino
)
390 if (! directory_meta_table
)
394 struct directory
*dir
= make_directory ("", NULL
);
395 struct directory
*ret
;
396 dir
->device_number
= dev
;
397 dir
->inode_number
= ino
;
398 ret
= hash_lookup (directory_meta_table
, dir
);
399 free_directory (dir
);
405 update_parent_directory (const char *name
)
407 struct directory
*directory
;
411 directory
= find_directory (p
);
415 if (deref_stat (dereference_option
, p
, &st
) != 0)
418 stat_diag (directory
->name
);
419 /* else: should have been already reported */
422 directory
->mtime
= get_stat_mtime (&st
);
427 #define PD_FORCE_CHILDREN 0x10
428 #define PD_FORCE_INIT 0x20
429 #define PD_CHILDREN(f) ((f) & 3)
431 static struct directory
*
432 procdir (const char *name_buffer
, struct stat
*stat_data
,
437 struct directory
*directory
;
438 bool nfs
= NFS_FILE_STAT (*stat_data
);
440 if ((directory
= find_directory (name_buffer
)) != NULL
)
442 if (DIR_IS_INITED (directory
))
444 if (flag
& PD_FORCE_INIT
)
446 assign_string (&directory
->name
, name_buffer
);
450 *entry
= 'N'; /* Avoid duplicating this directory */
455 if (strcmp (directory
->name
, name_buffer
))
461 /* With NFS, the same file can have two different devices
462 if an NFS directory is mounted in multiple locations,
463 which is relatively common when automounting.
464 To avoid spurious incremental redumping of
465 directories, consider all NFS devices as equal,
466 relying on the i-node to establish differences. */
468 if (! ((!check_device_option
469 || (DIR_IS_NFS (directory
) && nfs
)
470 || directory
->device_number
== stat_data
->st_dev
)
471 && directory
->inode_number
== stat_data
->st_ino
))
473 /* FIXME: find_directory_meta ignores nfs */
474 struct directory
*d
= find_directory_meta (stat_data
->st_dev
,
478 if (strcmp (d
->name
, name_buffer
))
480 WARNOPT (WARN_RENAME_DIRECTORY
,
482 _("%s: Directory has been renamed from %s"),
483 quotearg_colon (name_buffer
),
484 quote_n (1, d
->name
)));
486 DIR_SET_FLAG (directory
, DIRF_RENAMED
);
487 dirlist_replace_prefix (d
->name
, name_buffer
);
489 directory
->children
= CHANGED_CHILDREN
;
493 WARNOPT (WARN_RENAME_DIRECTORY
,
494 (0, 0, _("%s: Directory has been renamed"),
495 quotearg_colon (name_buffer
)));
496 directory
->children
= ALL_CHILDREN
;
497 directory
->device_number
= stat_data
->st_dev
;
498 directory
->inode_number
= stat_data
->st_ino
;
501 DIR_SET_FLAG (directory
, DIRF_NFS
);
504 directory
->children
= CHANGED_CHILDREN
;
506 DIR_SET_FLAG (directory
, DIRF_FOUND
);
510 struct directory
*d
= find_directory_meta (stat_data
->st_dev
,
513 directory
= note_directory (name_buffer
,
514 get_stat_mtime(stat_data
),
523 if (strcmp (d
->name
, name_buffer
))
525 WARNOPT (WARN_RENAME_DIRECTORY
,
526 (0, 0, _("%s: Directory has been renamed from %s"),
527 quotearg_colon (name_buffer
),
528 quote_n (1, d
->name
)));
530 DIR_SET_FLAG (directory
, DIRF_RENAMED
);
531 dirlist_replace_prefix (d
->name
, name_buffer
);
533 directory
->children
= CHANGED_CHILDREN
;
537 DIR_SET_FLAG (directory
, DIRF_NEW
);
538 WARNOPT (WARN_NEW_DIRECTORY
,
539 (0, 0, _("%s: Directory is new"),
540 quotearg_colon (name_buffer
)));
541 directory
->children
=
542 (listed_incremental_option
543 || (OLDER_STAT_TIME (*stat_data
, m
)
544 || (after_date_option
545 && OLDER_STAT_TIME (*stat_data
, c
))))
551 /* If the directory is on another device and --one-file-system was given,
553 if (one_file_system_option
&& device
!= stat_data
->st_dev
554 /* ... except if it was explicitely given in the command line */
555 && !is_individual_file (name_buffer
))
559 _("%s: directory is on a different filesystem; not dumped"),
560 quotearg_colon (directory->name)));
562 directory
->children
= NO_CHILDREN
;
563 else if (flag
& PD_FORCE_CHILDREN
)
565 directory
->children
= PD_CHILDREN(flag
);
566 if (directory
->children
== NO_CHILDREN
)
570 DIR_SET_FLAG (directory
, DIRF_INIT
);
572 if (directory
->children
!= NO_CHILDREN
)
574 const char *tag_file_name
;
576 switch (check_exclusion_tags (name_buffer
, &tag_file_name
))
578 case exclusion_tag_all
:
579 /* This warning can be duplicated by code in dump_file0, but only
580 in case when the topmost directory being archived contains
582 exclusion_tag_warning (name_buffer
, tag_file_name
,
583 _("directory not dumped"));
585 directory
->children
= NO_CHILDREN
;
588 case exclusion_tag_contents
:
589 exclusion_tag_warning (name_buffer
, tag_file_name
,
590 _("contents not dumped"));
591 directory
->children
= NO_CHILDREN
;
594 case exclusion_tag_under
:
595 exclusion_tag_warning (name_buffer
, tag_file_name
,
596 _("contents not dumped"));
597 directory
->tagfile
= tag_file_name
;
600 case exclusion_tag_none
:
608 /* Compare dumpdir array from DIRECTORY with directory listing DIR and
609 build a new dumpdir template.
611 DIR must be returned by a previous call to savedir().
613 File names in DIRECTORY->dump->contents must be sorted
616 DIRECTORY->dump is replaced with the created template. Each entry is
617 prefixed with ' ' if it was present in DUMP and with 'Y' otherwise. */
620 makedumpdir (struct directory
*directory
, const char *dir
)
623 dirsize
, /* Number of elements in DIR */
624 len
; /* Length of DIR, including terminating nul */
627 char *new_dump
, *new_dump_ptr
;
628 struct dumpdir
*dump
;
630 if (directory
->children
== ALL_CHILDREN
)
632 else if (DIR_IS_RENAMED (directory
))
633 dump
= directory
->orig
->idump
?
634 directory
->orig
->idump
: directory
->orig
->dump
;
636 dump
= directory
->dump
;
638 /* Count the size of DIR and the number of elements it contains */
641 for (p
= dir
; *p
; p
+= strlen (p
) + 1, dirsize
++)
642 len
+= strlen (p
) + 2;
645 /* Create a sorted directory listing */
646 array
= xcalloc (dirsize
, sizeof array
[0]);
647 for (i
= 0, p
= dir
; *p
; p
+= strlen (p
) + 1, i
++)
650 qsort (array
, dirsize
, sizeof (array
[0]), compare_dirnames
);
652 /* Prepare space for new dumpdir */
653 new_dump
= xmalloc (len
);
654 new_dump_ptr
= new_dump
;
656 /* Fill in the dumpdir template */
657 for (i
= 0; i
< dirsize
; i
++)
659 const char *loc
= dumpdir_locate (dump
, array
[i
]);
662 if (directory
->tagfile
)
663 *new_dump_ptr
= strcmp (directory
->tagfile
, array
[i
]) == 0 ?
669 else if (directory
->tagfile
)
670 *new_dump_ptr
++ = strcmp (directory
->tagfile
, array
[i
]) == 0 ?
673 *new_dump_ptr
++ = 'Y'; /* New entry */
675 /* Copy the file name */
676 for (p
= array
[i
]; (*new_dump_ptr
++ = *p
++); )
680 directory
->idump
= directory
->dump
;
681 directory
->dump
= dumpdir_create0 (new_dump
, NULL
);
685 /* Recursively scan the given directory DIR.
686 DEVICE is the device number where DIR resides (for --one-file-system).
687 If CMDLINE is true, the directory name was explicitly listed in the
689 Unless *PDIR is NULL, store there a pointer to the struct directory
692 scan_directory (char *dir
, dev_t device
, bool cmdline
)
694 char *dirp
= savedir (dir
); /* for scanning directory */
695 char *name_buffer
; /* directory, `/', and directory member */
696 size_t name_buffer_size
; /* allocated size of name_buffer, minus 2 */
697 size_t name_length
; /* used length in name_buffer */
698 struct stat stat_data
;
699 struct directory
*directory
;
705 name_buffer_size
= strlen (dir
) + NAME_FIELD_SIZE
;
706 name_buffer
= xmalloc (name_buffer_size
+ 2);
707 strcpy (name_buffer
, dir
);
708 zap_slashes (name_buffer
);
710 if (deref_stat (dereference_option
, name_buffer
, &stat_data
))
712 dir_removed_diag (name_buffer
, false, stat_diag
);
714 children = CHANGED_CHILDREN;
721 directory
= procdir (name_buffer
, &stat_data
, device
,
722 (cmdline
? PD_FORCE_INIT
: 0),
725 name_length
= strlen (name_buffer
);
726 if (! ISSLASH (name_buffer
[name_length
- 1]))
728 name_buffer
[name_length
] = DIRECTORY_SEPARATOR
;
729 /* name_buffer has been allocated an extra slot */
730 name_buffer
[++name_length
] = 0;
733 if (dirp
&& directory
->children
!= NO_CHILDREN
)
735 char *entry
; /* directory entry being scanned */
736 size_t entrylen
; /* length of directory entry */
739 makedumpdir (directory
, dirp
);
741 for (entry
= dumpdir_first (directory
->dump
, 1, &itr
);
743 entry
= dumpdir_next (itr
))
745 entrylen
= strlen (entry
);
746 if (name_buffer_size
<= entrylen
- 1 + name_length
)
749 name_buffer_size
+= NAME_FIELD_SIZE
;
750 while (name_buffer_size
<= entrylen
- 1 + name_length
);
751 name_buffer
= xrealloc (name_buffer
, name_buffer_size
+ 2);
753 strcpy (name_buffer
+ name_length
, entry
+ 1);
755 if (*entry
== 'I') /* Ignored entry */
757 else if (excluded_name (name_buffer
))
761 if (deref_stat (dereference_option
, name_buffer
, &stat_data
))
763 stat_diag (name_buffer
);
768 if (S_ISDIR (stat_data
.st_mode
))
771 if (!recursion_option
)
772 pd_flag
|= PD_FORCE_CHILDREN
| NO_CHILDREN
;
773 else if (directory
->children
== ALL_CHILDREN
)
774 pd_flag
|= PD_FORCE_CHILDREN
| ALL_CHILDREN
;
776 procdir (name_buffer
, &stat_data
, device
, pd_flag
, entry
);
779 else if (one_file_system_option
&& device
!= stat_data
.st_dev
)
782 else if (*entry
== 'Y')
783 /* New entry, skip further checks */;
785 /* FIXME: if (S_ISHIDDEN (stat_data.st_mode))?? */
787 else if (OLDER_STAT_TIME (stat_data
, m
)
788 && (!after_date_option
789 || OLDER_STAT_TIME (stat_data
, c
)))
805 /* Return pointer to the contents of the directory DIR */
807 directory_contents (struct directory
*dir
)
811 return dir
->dump
? dir
->dump
->contents
: NULL
;
814 /* A "safe" version of directory_contents, which never returns NULL. */
816 safe_directory_contents (struct directory
*dir
)
818 const char *ret
= directory_contents (dir
);
819 return ret
? ret
: "\0\0\0\0";
823 name_fill_directory (struct name
*name
, dev_t device
, bool cmdline
)
825 name
->directory
= scan_directory (name
->name
, device
, cmdline
);
830 obstack_code_rename (struct obstack
*stk
, char *from
, char *to
)
834 s
= from
[0] == 0 ? from
:
835 safer_name_suffix (from
, false, absolute_names_option
);
836 obstack_1grow (stk
, 'R');
837 obstack_grow (stk
, s
, strlen (s
) + 1);
840 safer_name_suffix (to
, false, absolute_names_option
);
841 obstack_1grow (stk
, 'T');
842 obstack_grow (stk
, s
, strlen (s
) + 1);
846 store_rename (struct directory
*dir
, struct obstack
*stk
)
848 if (DIR_IS_RENAMED (dir
))
850 struct directory
*prev
, *p
;
852 /* Detect eventual cycles and clear DIRF_RENAMED flag, so these entries
853 are ignored when hit by this function next time.
854 If the chain forms a cycle, prev points to the entry DIR is renamed
855 from. In this case it still retains DIRF_RENAMED flag, which will be
856 cleared in the `else' branch below */
857 for (prev
= dir
; prev
&& prev
->orig
!= dir
; prev
= prev
->orig
)
858 DIR_CLEAR_FLAG (prev
, DIRF_RENAMED
);
862 for (p
= dir
; p
&& p
->orig
; p
= p
->orig
)
863 obstack_code_rename (stk
, p
->orig
->name
, p
->name
);
869 DIR_CLEAR_FLAG (prev
, DIRF_RENAMED
);
871 /* Break the cycle by using a temporary name for one of its
873 First, create a temp name stub entry. */
874 temp_name
= dir_name (dir
->name
);
875 obstack_1grow (stk
, 'X');
876 obstack_grow (stk
, temp_name
, strlen (temp_name
) + 1);
878 obstack_code_rename (stk
, dir
->name
, "");
880 for (p
= dir
; p
!= prev
; p
= p
->orig
)
881 obstack_code_rename (stk
, p
->orig
->name
, p
->name
);
883 obstack_code_rename (stk
, "", prev
->name
);
889 append_incremental_renames (struct directory
*dir
)
893 struct directory
*dp
;
900 dump
= directory_contents (dir
);
903 size
= dumpdir_size (dump
) - 1;
904 obstack_grow (&stk
, dump
, size
);
909 for (dp
= dirhead
; dp
; dp
= dp
->next
)
910 store_rename (dp
, &stk
);
912 if (obstack_object_size (&stk
) != size
)
914 obstack_1grow (&stk
, 0);
915 dumpdir_free (dir
->dump
);
916 dir
->dump
= dumpdir_create (obstack_finish (&stk
));
918 obstack_free (&stk
, NULL
);
923 static FILE *listed_incremental_stream
;
925 /* Version of incremental format snapshots (directory files) used by this
926 tar. Currently it is supposed to be a single decimal number. 0 means
927 incremental snapshots as per tar version before 1.15.2.
929 The current tar version supports incremental versions from
930 0 up to TAR_INCREMENTAL_VERSION, inclusive.
931 It is able to create only snapshots of TAR_INCREMENTAL_VERSION */
933 #define TAR_INCREMENTAL_VERSION 2
935 /* Read incremental snapshot formats 0 and 1 */
937 read_incr_db_01 (int version
, const char *initbuf
)
950 if (getline (&buf
, &bufsize
, listed_incremental_stream
) <= 0)
952 read_error (listed_incremental_option
);
960 buf
= strdup (initbuf
);
961 bufsize
= strlen (buf
) + 1;
964 sec
= TYPE_MINIMUM (time_t);
967 u
= strtoumax (buf
, &ebuf
, 10);
968 if (!errno
&& TYPE_MAXIMUM (time_t) < u
)
970 if (errno
|| buf
== ebuf
)
971 ERROR ((0, errno
, "%s:%ld: %s",
972 quotearg_colon (listed_incremental_option
),
974 _("Invalid time stamp")));
979 if (version
== 1 && *ebuf
)
981 char const *buf_ns
= ebuf
+ 1;
983 u
= strtoumax (buf_ns
, &ebuf
, 10);
984 if (!errno
&& BILLION
<= u
)
986 if (errno
|| buf_ns
== ebuf
)
988 ERROR ((0, errno
, "%s:%ld: %s",
989 quotearg_colon (listed_incremental_option
),
991 _("Invalid time stamp")));
992 sec
= TYPE_MINIMUM (time_t);
999 /* pre-1 incremental format does not contain nanoseconds */
1003 newer_mtime_option
.tv_sec
= sec
;
1004 newer_mtime_option
.tv_nsec
= nsec
;
1007 while (0 < (n
= getline (&buf
, &bufsize
, listed_incremental_stream
)))
1011 bool nfs
= buf
[0] == '+';
1012 char *strp
= buf
+ nfs
;
1013 struct timespec mtime
;
1017 if (buf
[n
- 1] == '\n')
1023 u
= strtoumax (strp
, &ebuf
, 10);
1024 if (!errno
&& TYPE_MAXIMUM (time_t) < u
)
1026 if (errno
|| strp
== ebuf
|| *ebuf
!= ' ')
1028 ERROR ((0, errno
, "%s:%ld: %s",
1029 quotearg_colon (listed_incremental_option
), lineno
,
1030 _("Invalid modification time (seconds)")));
1038 u
= strtoumax (strp
, &ebuf
, 10);
1039 if (!errno
&& BILLION
<= u
)
1041 if (errno
|| strp
== ebuf
|| *ebuf
!= ' ')
1043 ERROR ((0, errno
, "%s:%ld: %s",
1044 quotearg_colon (listed_incremental_option
), lineno
,
1045 _("Invalid modification time (nanoseconds)")));
1051 mtime
.tv_nsec
= nsec
;
1055 memset (&mtime
, 0, sizeof mtime
);
1058 u
= strtoumax (strp
, &ebuf
, 10);
1059 if (!errno
&& TYPE_MAXIMUM (dev_t
) < u
)
1061 if (errno
|| strp
== ebuf
|| *ebuf
!= ' ')
1063 ERROR ((0, errno
, "%s:%ld: %s",
1064 quotearg_colon (listed_incremental_option
), lineno
,
1065 _("Invalid device number")));
1073 u
= strtoumax (strp
, &ebuf
, 10);
1074 if (!errno
&& TYPE_MAXIMUM (ino_t
) < u
)
1076 if (errno
|| strp
== ebuf
|| *ebuf
!= ' ')
1078 ERROR ((0, errno
, "%s:%ld: %s",
1079 quotearg_colon (listed_incremental_option
), lineno
,
1080 _("Invalid inode number")));
1088 unquote_string (strp
);
1089 note_directory (strp
, mtime
, dev
, ino
, nfs
, false, NULL
);
1094 /* Read a nul-terminated string from FP and store it in STK.
1095 Store the number of bytes read (including nul terminator) in PCOUNT.
1097 Return the last character read or EOF on end of file. */
1099 read_obstack (FILE *fp
, struct obstack
*stk
, size_t *pcount
)
1104 for (i
= 0, c
= getc (fp
); c
!= EOF
&& c
!= 0; c
= getc (fp
), i
++)
1105 obstack_1grow (stk
, c
);
1106 obstack_1grow (stk
, 0);
1112 /* Read from file FP a nul-terminated string and convert it to
1113 intmax_t. Return the resulting value in PVAL. Assume '-' has
1116 Throw a fatal error if the string cannot be converted or if the
1117 converted value is less than MIN_VAL. */
1120 read_negative_num (FILE *fp
, intmax_t min_val
, intmax_t *pval
)
1124 char buf
[INT_BUFSIZE_BOUND (intmax_t)];
1128 for (i
= 1; ISDIGIT (c
= getc (fp
)); i
++)
1130 if (i
== sizeof buf
- 1)
1131 FATAL_ERROR ((0, 0, _("Field too long while reading snapshot file")));
1138 FATAL_ERROR ((0, errno
, _("Read error in snapshot file")));
1140 FATAL_ERROR ((0, 0, _("Unexpected EOF in snapshot file")));
1145 *pval
= strtoimax (buf
, &ep
, 10);
1146 if (c
|| errno
|| *pval
< min_val
)
1147 FATAL_ERROR ((0, errno
, _("Unexpected field value in snapshot file")));
1150 /* Read from file FP a nul-terminated string and convert it to
1151 uintmax_t. Return the resulting value in PVAL. Assume C has
1154 Throw a fatal error if the string cannot be converted or if the
1155 converted value exceeds MAX_VAL.
1157 Return the last character read or EOF on end of file. */
1160 read_unsigned_num (int c
, FILE *fp
, uintmax_t max_val
, uintmax_t *pval
)
1163 char buf
[UINTMAX_STRSIZE_BOUND
], *ep
;
1165 for (i
= 0; ISDIGIT (c
); i
++)
1167 if (i
== sizeof buf
- 1)
1168 FATAL_ERROR ((0, 0, _("Field too long while reading snapshot file")));
1176 FATAL_ERROR ((0, errno
, _("Read error in snapshot file")));
1180 FATAL_ERROR ((0, 0, _("Unexpected EOF in snapshot file")));
1185 *pval
= strtoumax (buf
, &ep
, 10);
1186 if (c
|| errno
|| max_val
< *pval
)
1187 FATAL_ERROR ((0, errno
, _("Unexpected field value in snapshot file")));
1191 /* Read from file FP a nul-terminated string and convert it to
1192 uintmax_t. Return the resulting value in PVAL.
1194 Throw a fatal error if the string cannot be converted or if the
1195 converted value exceeds MAX_VAL.
1197 Return the last character read or EOF on end of file. */
1200 read_num (FILE *fp
, uintmax_t max_val
, uintmax_t *pval
)
1202 return read_unsigned_num (getc (fp
), fp
, max_val
, pval
);
1205 /* Read from FP two NUL-terminated strings representing a struct
1206 timespec. Return the resulting value in PVAL.
1208 Throw a fatal error if the string cannot be converted. */
1211 read_timespec (FILE *fp
, struct timespec
*pval
)
1219 read_negative_num (fp
, TYPE_MINIMUM (time_t), &i
);
1225 c
= read_unsigned_num (c
, fp
, TYPE_MAXIMUM (time_t), &u
);
1229 if (c
|| read_num (fp
, BILLION
- 1, &u
))
1230 FATAL_ERROR ((0, 0, "%s: %s",
1231 quotearg_colon (listed_incremental_option
),
1232 _("Unexpected EOF in snapshot file")));
1236 /* Read incremental snapshot format 2 */
1243 obstack_init (&stk
);
1245 read_timespec (listed_incremental_stream
, &newer_mtime_option
);
1249 struct timespec mtime
;
1257 if (read_num (listed_incremental_stream
, 1, &u
))
1258 return; /* Normal return */
1262 read_timespec (listed_incremental_stream
, &mtime
);
1264 if (read_num (listed_incremental_stream
, TYPE_MAXIMUM (dev_t
), &u
))
1268 if (read_num (listed_incremental_stream
, TYPE_MAXIMUM (ino_t
), &u
))
1272 if (read_obstack (listed_incremental_stream
, &stk
, &s
))
1275 name
= obstack_finish (&stk
);
1277 while (read_obstack (listed_incremental_stream
, &stk
, &s
) == 0 && s
> 1)
1279 if (getc (listed_incremental_stream
) != 0)
1280 FATAL_ERROR ((0, 0, "%s: %s",
1281 quotearg_colon (listed_incremental_option
),
1282 _("Missing record terminator")));
1284 content
= obstack_finish (&stk
);
1285 note_directory (name
, mtime
, dev
, ino
, nfs
, false, content
);
1286 obstack_free (&stk
, content
);
1288 FATAL_ERROR ((0, 0, "%s: %s",
1289 quotearg_colon (listed_incremental_option
),
1290 _("Unexpected EOF in snapshot file")));
1293 /* Read incremental snapshot file (directory file).
1294 If the file has older incremental version, make sure that it is processed
1295 correctly and that tar will use the most conservative backup method among
1296 possible alternatives (i.e. prefer ALL_CHILDREN over CHANGED_CHILDREN,
1297 etc.) This ensures that the snapshots are updated to the recent version
1298 without any loss of data. */
1300 read_directory_file (void)
1305 int flags
= O_RDWR
| O_CREAT
;
1307 if (incremental_level
== 0)
1309 /* Open the file for both read and write. That way, we can write
1310 it later without having to reopen it, and don't have to worry if
1311 we chdir in the meantime. */
1312 fd
= open (listed_incremental_option
, flags
, MODE_RW
);
1315 open_error (listed_incremental_option
);
1319 listed_incremental_stream
= fdopen (fd
, "r+");
1320 if (! listed_incremental_stream
)
1322 open_error (listed_incremental_option
);
1327 /* Consume the first name from the name list and reset the
1328 list afterwards. This is done to change to the new
1329 directory, if the first name is a chdir request (-C dir),
1330 which is necessary to recreate absolute file names. */
1334 if (0 < getline (&buf
, &bufsize
, listed_incremental_stream
))
1337 uintmax_t incremental_version
;
1339 if (strncmp (buf
, PACKAGE_NAME
, sizeof PACKAGE_NAME
- 1) == 0)
1341 ebuf
= buf
+ sizeof PACKAGE_NAME
- 1;
1343 ERROR((1, 0, _("Bad incremental file format")));
1344 for (; *ebuf
!= '-'; ebuf
++)
1346 ERROR((1, 0, _("Bad incremental file format")));
1348 incremental_version
= strtoumax (ebuf
+ 1, NULL
, 10);
1351 incremental_version
= 0;
1353 switch (incremental_version
)
1357 read_incr_db_01 (incremental_version
, buf
);
1360 case TAR_INCREMENTAL_VERSION
:
1365 ERROR ((1, 0, _("Unsupported incremental format version: %"PRIuMAX
),
1366 incremental_version
));
1371 if (ferror (listed_incremental_stream
))
1372 read_error (listed_incremental_option
);
1377 /* Output incremental data for the directory ENTRY to the file DATA.
1378 Return nonzero if successful, preserving errno on write failure. */
1380 write_directory_file_entry (void *entry
, void *data
)
1382 struct directory
const *directory
= entry
;
1385 if (DIR_IS_FOUND (directory
))
1387 char buf
[UINTMAX_STRSIZE_BOUND
];
1390 s
= DIR_IS_NFS (directory
) ? "1" : "0";
1391 fwrite (s
, 2, 1, fp
);
1392 s
= (TYPE_SIGNED (time_t)
1393 ? imaxtostr (directory
->mtime
.tv_sec
, buf
)
1394 : umaxtostr (directory
->mtime
.tv_sec
, buf
));
1395 fwrite (s
, strlen (s
) + 1, 1, fp
);
1396 s
= umaxtostr (directory
->mtime
.tv_nsec
, buf
);
1397 fwrite (s
, strlen (s
) + 1, 1, fp
);
1398 s
= umaxtostr (directory
->device_number
, buf
);
1399 fwrite (s
, strlen (s
) + 1, 1, fp
);
1400 s
= umaxtostr (directory
->inode_number
, buf
);
1401 fwrite (s
, strlen (s
) + 1, 1, fp
);
1403 fwrite (directory
->name
, strlen (directory
->name
) + 1, 1, fp
);
1404 if (directory
->dump
)
1409 for (p
= dumpdir_first (directory
->dump
, 0, &itr
);
1411 p
= dumpdir_next (itr
))
1412 fwrite (p
, strlen (p
) + 1, 1, fp
);
1415 fwrite ("\0\0", 2, 1, fp
);
1418 return ! ferror (fp
);
1422 write_directory_file (void)
1424 FILE *fp
= listed_incremental_stream
;
1425 char buf
[UINTMAX_STRSIZE_BOUND
];
1431 if (fseek (fp
, 0L, SEEK_SET
) != 0)
1432 seek_error (listed_incremental_option
);
1433 if (sys_truncate (fileno (fp
)) != 0)
1434 truncate_error (listed_incremental_option
);
1436 fprintf (fp
, "%s-%s-%d\n", PACKAGE_NAME
, PACKAGE_VERSION
,
1437 TAR_INCREMENTAL_VERSION
);
1439 s
= (TYPE_SIGNED (time_t)
1440 ? imaxtostr (start_time
.tv_sec
, buf
)
1441 : umaxtostr (start_time
.tv_sec
, buf
));
1442 fwrite (s
, strlen (s
) + 1, 1, fp
);
1443 s
= umaxtostr (start_time
.tv_nsec
, buf
);
1444 fwrite (s
, strlen (s
) + 1, 1, fp
);
1446 if (! ferror (fp
) && directory_table
)
1447 hash_do_for_each (directory_table
, write_directory_file_entry
, fp
);
1450 write_error (listed_incremental_option
);
1451 if (fclose (fp
) != 0)
1452 close_error (listed_incremental_option
);
1456 /* Restoration of incremental dumps. */
1459 get_gnu_dumpdir (struct tar_stat_info
*stat_info
)
1463 union block
*data_block
;
1467 size
= stat_info
->stat
.st_size
;
1469 archive_dir
= xmalloc (size
);
1472 set_next_block_after (current_header
);
1473 mv_begin (stat_info
);
1475 for (; size
> 0; size
-= copied
)
1477 mv_size_left (size
);
1478 data_block
= find_next_block ();
1480 ERROR ((1, 0, _("Unexpected EOF in archive")));
1481 copied
= available_space_after (data_block
);
1484 memcpy (to
, data_block
->buffer
, copied
);
1486 set_next_block_after ((union block
*)
1487 (data_block
->buffer
+ copied
- 1));
1492 stat_info
->dumpdir
= archive_dir
;
1493 stat_info
->skipped
= true; /* For skip_member() and friends
1494 to work correctly */
1497 /* Return T if STAT_INFO represents a dumpdir archive member.
1498 Note: can invalidate current_header. It happens if flush_archive()
1499 gets called within get_gnu_dumpdir() */
1501 is_dumpdir (struct tar_stat_info
*stat_info
)
1503 if (stat_info
->is_dumpdir
&& !stat_info
->dumpdir
)
1504 get_gnu_dumpdir (stat_info
);
1505 return stat_info
->is_dumpdir
;
1509 dumpdir_ok (char *dumpdir
)
1512 int has_tempdir
= 0;
1515 for (p
= dumpdir
; *p
; p
+= strlen (p
) + 1)
1517 if (expect
&& *p
!= expect
)
1520 _("Malformed dumpdir: expected '%c' but found %#3o"),
1530 _("Malformed dumpdir: 'X' duplicated")));
1543 _("Malformed dumpdir: empty name in 'R'")));
1556 _("Malformed dumpdir: 'T' not preceeded by 'R'")));
1559 if (p
[1] == 0 && !has_tempdir
)
1562 _("Malformed dumpdir: empty name in 'T'")));
1574 /* FIXME: bail out? */
1582 _("Malformed dumpdir: expected '%c' but found end of data"),
1588 WARNOPT (WARN_BAD_DUMPDIR
,
1589 (0, 0, _("Malformed dumpdir: 'X' never used")));
1594 /* Examine the directories under directory_name and delete any
1595 files that were not there at the time of the back-up. */
1597 try_purge_directory (char const *directory_name
)
1600 char *cur
, *arc
, *p
;
1601 char *temp_stub
= NULL
;
1602 struct dumpdir
*dump
;
1604 if (!is_dumpdir (¤t_stat_info
))
1607 current_dir
= savedir (directory_name
);
1610 /* The directory doesn't exist now. It'll be created. In any
1611 case, we don't have to delete any files out of it. */
1614 /* Verify if dump directory is sane */
1615 if (!dumpdir_ok (current_stat_info
.dumpdir
))
1618 /* Process renames */
1619 for (arc
= current_stat_info
.dumpdir
; *arc
; arc
+= strlen (arc
) + 1)
1623 #define TEMP_DIR_TEMPLATE "tar.XXXXXX"
1624 size_t len
= strlen (arc
+ 1);
1625 temp_stub
= xrealloc (temp_stub
, len
+ 1 + sizeof TEMP_DIR_TEMPLATE
);
1626 memcpy (temp_stub
, arc
+ 1, len
);
1627 temp_stub
[len
] = '/';
1628 memcpy (temp_stub
+ len
+ 1, TEMP_DIR_TEMPLATE
,
1629 sizeof TEMP_DIR_TEMPLATE
);
1630 if (!mkdtemp (temp_stub
))
1633 _("Cannot create temporary directory using template %s"),
1634 quote (temp_stub
)));
1640 else if (*arc
== 'R')
1644 arc
+= strlen (arc
) + 1;
1647 /* Ensure that neither source nor destination are absolute file
1648 names (unless permitted by -P option), and that they do not
1649 contain dubious parts (e.g. ../).
1651 This is an extra safety precaution. Besides, it might be
1652 necessary to extract from archives created with tar versions
1656 src
= safer_name_suffix (src
, false, absolute_names_option
);
1658 dst
= safer_name_suffix (dst
, false, absolute_names_option
);
1665 if (!rename_directory (src
, dst
))
1669 /* FIXME: Make sure purge_directory(dst) will return
1678 /* Process deletes */
1679 dump
= dumpdir_create (current_stat_info
.dumpdir
);
1681 for (cur
= current_dir
; *cur
; cur
+= strlen (cur
) + 1)
1687 p
= new_name (directory_name
, cur
);
1689 if (deref_stat (false, p
, &st
))
1691 if (errno
!= ENOENT
) /* FIXME: Maybe keep a list of renamed
1692 dirs and check it here? */
1695 WARN ((0, 0, _("%s: Not purging directory: unable to stat"),
1696 quotearg_colon (p
)));
1701 if (!(entry
= dumpdir_locate (dump
, cur
))
1702 || (*entry
== 'D' && !S_ISDIR (st
.st_mode
))
1703 || (*entry
== 'Y' && S_ISDIR (st
.st_mode
)))
1705 if (one_file_system_option
&& st
.st_dev
!= root_device
)
1708 _("%s: directory is on a different device: not purging"),
1709 quotearg_colon (p
)));
1713 if (! interactive_option
|| confirm ("delete", p
))
1716 fprintf (stdlis
, _("%s: Deleting %s\n"),
1717 program_name
, quote (p
));
1718 if (! remove_any_file (p
, RECURSIVE_REMOVE_OPTION
))
1721 ERROR ((0, e
, _("%s: Cannot remove"), quotearg_colon (p
)));
1727 dumpdir_free (dump
);
1734 purge_directory (char const *directory_name
)
1736 if (!try_purge_directory (directory_name
))
1741 list_dumpdir (char *buffer
, size_t size
)
1754 fprintf (stdlis
, "%c", *buffer
);
1757 fprintf (stdlis
, " ");
1765 fputc ('\n', stdlis
);
1772 fputc (*buffer
, stdlis
);