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) FIXME: not used */
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 */
80 static struct dumpdir
*
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;
111 static struct dumpdir
*
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
> 1 && 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 (struct tar_stat_info
*parent
)
407 struct directory
*directory
= find_directory (parent
->orig_file_name
);
411 if (fstat (parent
->fd
, &st
) != 0)
412 stat_diag (directory
->name
);
414 directory
->mtime
= get_stat_mtime (&st
);
418 #define PD_FORCE_CHILDREN 0x10
419 #define PD_FORCE_INIT 0x20
420 #define PD_CHILDREN(f) ((f) & 3)
422 static struct directory
*
423 procdir (const char *name_buffer
, struct tar_stat_info
*st
,
427 struct directory
*directory
;
428 struct stat
*stat_data
= &st
->stat
;
429 dev_t device
= st
->parent
? st
->parent
->stat
.st_dev
: 0;
430 bool nfs
= NFS_FILE_STAT (*stat_data
);
432 if ((directory
= find_directory (name_buffer
)) != NULL
)
434 if (DIR_IS_INITED (directory
))
436 if (flag
& PD_FORCE_INIT
)
438 assign_string (&directory
->name
, name_buffer
);
442 *entry
= 'N'; /* Avoid duplicating this directory */
447 if (strcmp (directory
->name
, name_buffer
))
453 /* With NFS, the same file can have two different devices
454 if an NFS directory is mounted in multiple locations,
455 which is relatively common when automounting.
456 To avoid spurious incremental redumping of
457 directories, consider all NFS devices as equal,
458 relying on the i-node to establish differences. */
460 if (! ((!check_device_option
461 || (DIR_IS_NFS (directory
) && nfs
)
462 || directory
->device_number
== stat_data
->st_dev
)
463 && directory
->inode_number
== stat_data
->st_ino
))
465 /* FIXME: find_directory_meta ignores nfs */
466 struct directory
*d
= find_directory_meta (stat_data
->st_dev
,
470 if (strcmp (d
->name
, name_buffer
))
472 WARNOPT (WARN_RENAME_DIRECTORY
,
474 _("%s: Directory has been renamed from %s"),
475 quotearg_colon (name_buffer
),
476 quote_n (1, d
->name
)));
478 DIR_SET_FLAG (directory
, DIRF_RENAMED
);
479 dirlist_replace_prefix (d
->name
, name_buffer
);
481 directory
->children
= CHANGED_CHILDREN
;
485 WARNOPT (WARN_RENAME_DIRECTORY
,
486 (0, 0, _("%s: Directory has been renamed"),
487 quotearg_colon (name_buffer
)));
488 directory
->children
= ALL_CHILDREN
;
489 directory
->device_number
= stat_data
->st_dev
;
490 directory
->inode_number
= stat_data
->st_ino
;
493 DIR_SET_FLAG (directory
, DIRF_NFS
);
496 directory
->children
= CHANGED_CHILDREN
;
498 DIR_SET_FLAG (directory
, DIRF_FOUND
);
502 struct directory
*d
= find_directory_meta (stat_data
->st_dev
,
505 directory
= note_directory (name_buffer
,
506 get_stat_mtime(stat_data
),
515 if (strcmp (d
->name
, name_buffer
))
517 WARNOPT (WARN_RENAME_DIRECTORY
,
518 (0, 0, _("%s: Directory has been renamed from %s"),
519 quotearg_colon (name_buffer
),
520 quote_n (1, d
->name
)));
522 DIR_SET_FLAG (directory
, DIRF_RENAMED
);
523 dirlist_replace_prefix (d
->name
, name_buffer
);
525 directory
->children
= CHANGED_CHILDREN
;
529 DIR_SET_FLAG (directory
, DIRF_NEW
);
530 WARNOPT (WARN_NEW_DIRECTORY
,
531 (0, 0, _("%s: Directory is new"),
532 quotearg_colon (name_buffer
)));
533 directory
->children
=
534 (listed_incremental_option
535 || (OLDER_STAT_TIME (*stat_data
, m
)
536 || (after_date_option
537 && OLDER_STAT_TIME (*stat_data
, c
))))
543 /* If the directory is on another device and --one-file-system was given,
545 if (one_file_system_option
&& device
!= stat_data
->st_dev
546 /* ... except if it was explicitely given in the command line */
547 && !is_individual_file (name_buffer
))
551 _("%s: directory is on a different filesystem; not dumped"),
552 quotearg_colon (directory->name)));
554 directory
->children
= NO_CHILDREN
;
555 else if (flag
& PD_FORCE_CHILDREN
)
557 directory
->children
= PD_CHILDREN(flag
);
558 if (directory
->children
== NO_CHILDREN
)
562 DIR_SET_FLAG (directory
, DIRF_INIT
);
564 if (directory
->children
!= NO_CHILDREN
)
566 const char *tag_file_name
;
568 switch (check_exclusion_tags (st
, &tag_file_name
))
570 case exclusion_tag_all
:
571 /* This warning can be duplicated by code in dump_file0, but only
572 in case when the topmost directory being archived contains
574 exclusion_tag_warning (name_buffer
, tag_file_name
,
575 _("directory not dumped"));
577 directory
->children
= NO_CHILDREN
;
580 case exclusion_tag_contents
:
581 exclusion_tag_warning (name_buffer
, tag_file_name
,
582 _("contents not dumped"));
583 directory
->children
= NO_CHILDREN
;
586 case exclusion_tag_under
:
587 exclusion_tag_warning (name_buffer
, tag_file_name
,
588 _("contents not dumped"));
589 directory
->tagfile
= tag_file_name
;
592 case exclusion_tag_none
:
600 /* Compare dumpdir array from DIRECTORY with directory listing DIR and
601 build a new dumpdir template.
603 DIR must be returned by a previous call to savedir().
605 File names in DIRECTORY->dump->contents must be sorted
608 DIRECTORY->dump is replaced with the created template. Each entry is
609 prefixed with ' ' if it was present in DUMP and with 'Y' otherwise. */
612 makedumpdir (struct directory
*directory
, const char *dir
)
615 dirsize
, /* Number of elements in DIR */
616 len
; /* Length of DIR, including terminating nul */
619 char *new_dump
, *new_dump_ptr
;
620 struct dumpdir
*dump
;
622 if (directory
->children
== ALL_CHILDREN
)
624 else if (DIR_IS_RENAMED (directory
))
625 dump
= directory
->orig
->idump
?
626 directory
->orig
->idump
: directory
->orig
->dump
;
628 dump
= directory
->dump
;
630 /* Count the size of DIR and the number of elements it contains */
633 for (p
= dir
; *p
; p
+= strlen (p
) + 1, dirsize
++)
634 len
+= strlen (p
) + 2;
637 /* Create a sorted directory listing */
638 array
= xcalloc (dirsize
, sizeof array
[0]);
639 for (i
= 0, p
= dir
; *p
; p
+= strlen (p
) + 1, i
++)
642 qsort (array
, dirsize
, sizeof (array
[0]), compare_dirnames
);
644 /* Prepare space for new dumpdir */
645 new_dump
= xmalloc (len
);
646 new_dump_ptr
= new_dump
;
648 /* Fill in the dumpdir template */
649 for (i
= 0; i
< dirsize
; i
++)
651 const char *loc
= dumpdir_locate (dump
, array
[i
]);
654 if (directory
->tagfile
)
655 *new_dump_ptr
= strcmp (directory
->tagfile
, array
[i
]) == 0 ?
661 else if (directory
->tagfile
)
662 *new_dump_ptr
++ = strcmp (directory
->tagfile
, array
[i
]) == 0 ?
665 *new_dump_ptr
++ = 'Y'; /* New entry */
667 /* Copy the file name */
668 for (p
= array
[i
]; (*new_dump_ptr
++ = *p
++); )
672 directory
->idump
= directory
->dump
;
673 directory
->dump
= dumpdir_create0 (new_dump
, NULL
);
677 /* Recursively scan the directory identified by ST. */
679 scan_directory (struct tar_stat_info
*st
)
681 char const *dir
= st
->orig_file_name
;
682 char *dirp
= get_directory_entries (st
);
683 dev_t device
= st
->stat
.st_dev
;
684 bool cmdline
= ! st
->parent
;
687 struct directory
*directory
;
696 directory
= procdir (tmp
, st
,
697 (cmdline
? PD_FORCE_INIT
: 0),
702 nbuf
= namebuf_create (dir
);
704 if (dirp
&& directory
->children
!= NO_CHILDREN
)
706 char *entry
; /* directory entry being scanned */
707 struct dumpdir_iter
*itr
;
709 makedumpdir (directory
, dirp
);
711 for (entry
= dumpdir_first (directory
->dump
, 1, &itr
);
713 entry
= dumpdir_next (itr
))
715 char *full_name
= namebuf_name (nbuf
, entry
+ 1);
717 if (*entry
== 'I') /* Ignored entry */
719 else if (excluded_name (full_name
))
724 void (*diag
) (char const *) = 0;
725 struct tar_stat_info stsub
;
726 tar_stat_init (&stsub
);
733 else if (fstatat (fd
, entry
+ 1, &stsub
.stat
, fstatat_flags
) != 0)
735 else if (S_ISDIR (stsub
.stat
.st_mode
))
737 int subfd
= subfile_open (st
, entry
+ 1, open_read_flags
);
743 if (fstat (subfd
, &stsub
.stat
) != 0)
750 file_removed_diag (full_name
, false, diag
);
753 else if (S_ISDIR (stsub
.stat
.st_mode
))
756 if (!recursion_option
)
757 pd_flag
|= PD_FORCE_CHILDREN
| NO_CHILDREN
;
758 else if (directory
->children
== ALL_CHILDREN
)
759 pd_flag
|= PD_FORCE_CHILDREN
| ALL_CHILDREN
;
763 procdir (full_name
, &stsub
, pd_flag
, entry
);
764 restore_parent_fd (&stsub
);
766 else if (one_file_system_option
&& device
!= stsub
.stat
.st_dev
)
768 else if (*entry
== 'Y')
769 /* New entry, skip further checks */;
770 /* FIXME: if (S_ISHIDDEN (stat_data.st_mode))?? */
771 else if (OLDER_STAT_TIME (stsub
.stat
, m
)
772 && (!after_date_option
773 || OLDER_STAT_TIME (stsub
.stat
, c
)))
778 tar_stat_destroy (&stsub
);
792 /* Return pointer to the contents of the directory DIR */
794 directory_contents (struct directory
*dir
)
798 return dir
->dump
? dir
->dump
->contents
: NULL
;
801 /* A "safe" version of directory_contents, which never returns NULL. */
803 safe_directory_contents (struct directory
*dir
)
805 const char *ret
= directory_contents (dir
);
806 return ret
? ret
: "\0\0\0\0";
811 obstack_code_rename (struct obstack
*stk
, char const *from
, char const *to
)
815 s
= from
[0] == 0 ? from
:
816 safer_name_suffix (from
, false, absolute_names_option
);
817 obstack_1grow (stk
, 'R');
818 obstack_grow (stk
, s
, strlen (s
) + 1);
821 safer_name_suffix (to
, false, absolute_names_option
);
822 obstack_1grow (stk
, 'T');
823 obstack_grow (stk
, s
, strlen (s
) + 1);
827 store_rename (struct directory
*dir
, struct obstack
*stk
)
829 if (DIR_IS_RENAMED (dir
))
831 struct directory
*prev
, *p
;
833 /* Detect eventual cycles and clear DIRF_RENAMED flag, so these entries
834 are ignored when hit by this function next time.
835 If the chain forms a cycle, prev points to the entry DIR is renamed
836 from. In this case it still retains DIRF_RENAMED flag, which will be
837 cleared in the `else' branch below */
838 for (prev
= dir
; prev
&& prev
->orig
!= dir
; prev
= prev
->orig
)
839 DIR_CLEAR_FLAG (prev
, DIRF_RENAMED
);
843 for (p
= dir
; p
&& p
->orig
; p
= p
->orig
)
844 obstack_code_rename (stk
, p
->orig
->name
, p
->name
);
850 DIR_CLEAR_FLAG (prev
, DIRF_RENAMED
);
852 /* Break the cycle by using a temporary name for one of its
854 First, create a temp name stub entry. */
855 temp_name
= dir_name (dir
->name
);
856 obstack_1grow (stk
, 'X');
857 obstack_grow (stk
, temp_name
, strlen (temp_name
) + 1);
859 obstack_code_rename (stk
, dir
->name
, "");
861 for (p
= dir
; p
!= prev
; p
= p
->orig
)
862 obstack_code_rename (stk
, p
->orig
->name
, p
->name
);
864 obstack_code_rename (stk
, "", prev
->name
);
870 append_incremental_renames (struct directory
*dir
)
874 struct directory
*dp
;
881 dump
= directory_contents (dir
);
884 size
= dumpdir_size (dump
) - 1;
885 obstack_grow (&stk
, dump
, size
);
890 for (dp
= dirhead
; dp
; dp
= dp
->next
)
891 store_rename (dp
, &stk
);
893 /* FIXME: Is this the right thing to do when DIR is null? */
894 if (dir
&& obstack_object_size (&stk
) != size
)
896 obstack_1grow (&stk
, 0);
897 dumpdir_free (dir
->dump
);
898 dir
->dump
= dumpdir_create (obstack_finish (&stk
));
900 obstack_free (&stk
, NULL
);
905 static FILE *listed_incremental_stream
;
907 /* Version of incremental format snapshots (directory files) used by this
908 tar. Currently it is supposed to be a single decimal number. 0 means
909 incremental snapshots as per tar version before 1.15.2.
911 The current tar version supports incremental versions from
912 0 up to TAR_INCREMENTAL_VERSION, inclusive.
913 It is able to create only snapshots of TAR_INCREMENTAL_VERSION */
915 #define TAR_INCREMENTAL_VERSION 2
917 /* Read incremental snapshot formats 0 and 1 */
919 read_incr_db_01 (int version
, const char *initbuf
)
932 if (getline (&buf
, &bufsize
, listed_incremental_stream
) <= 0)
934 read_error (listed_incremental_option
);
942 buf
= strdup (initbuf
);
943 bufsize
= strlen (buf
) + 1;
946 sec
= TYPE_MINIMUM (time_t);
949 u
= strtoumax (buf
, &ebuf
, 10);
950 if (!errno
&& TYPE_MAXIMUM (time_t) < u
)
952 if (errno
|| buf
== ebuf
)
953 ERROR ((0, errno
, "%s:%ld: %s",
954 quotearg_colon (listed_incremental_option
),
956 _("Invalid time stamp")));
961 if (version
== 1 && *ebuf
)
963 char const *buf_ns
= ebuf
+ 1;
965 u
= strtoumax (buf_ns
, &ebuf
, 10);
966 if (!errno
&& BILLION
<= u
)
968 if (errno
|| buf_ns
== ebuf
)
970 ERROR ((0, errno
, "%s:%ld: %s",
971 quotearg_colon (listed_incremental_option
),
973 _("Invalid time stamp")));
974 sec
= TYPE_MINIMUM (time_t);
981 /* pre-1 incremental format does not contain nanoseconds */
985 newer_mtime_option
.tv_sec
= sec
;
986 newer_mtime_option
.tv_nsec
= nsec
;
989 while (0 < (n
= getline (&buf
, &bufsize
, listed_incremental_stream
)))
993 bool nfs
= buf
[0] == '+';
994 char *strp
= buf
+ nfs
;
995 struct timespec mtime
;
999 if (buf
[n
- 1] == '\n')
1005 u
= strtoumax (strp
, &ebuf
, 10);
1006 if (!errno
&& TYPE_MAXIMUM (time_t) < u
)
1008 if (errno
|| strp
== ebuf
|| *ebuf
!= ' ')
1010 ERROR ((0, errno
, "%s:%ld: %s",
1011 quotearg_colon (listed_incremental_option
), lineno
,
1012 _("Invalid modification time (seconds)")));
1020 u
= strtoumax (strp
, &ebuf
, 10);
1021 if (!errno
&& BILLION
<= u
)
1023 if (errno
|| strp
== ebuf
|| *ebuf
!= ' ')
1025 ERROR ((0, errno
, "%s:%ld: %s",
1026 quotearg_colon (listed_incremental_option
), lineno
,
1027 _("Invalid modification time (nanoseconds)")));
1033 mtime
.tv_nsec
= nsec
;
1037 memset (&mtime
, 0, sizeof mtime
);
1040 u
= strtoumax (strp
, &ebuf
, 10);
1041 if (!errno
&& TYPE_MAXIMUM (dev_t
) < u
)
1043 if (errno
|| strp
== ebuf
|| *ebuf
!= ' ')
1045 ERROR ((0, errno
, "%s:%ld: %s",
1046 quotearg_colon (listed_incremental_option
), lineno
,
1047 _("Invalid device number")));
1055 u
= strtoumax (strp
, &ebuf
, 10);
1056 if (!errno
&& TYPE_MAXIMUM (ino_t
) < u
)
1058 if (errno
|| strp
== ebuf
|| *ebuf
!= ' ')
1060 ERROR ((0, errno
, "%s:%ld: %s",
1061 quotearg_colon (listed_incremental_option
), lineno
,
1062 _("Invalid inode number")));
1070 unquote_string (strp
);
1071 note_directory (strp
, mtime
, dev
, ino
, nfs
, false, NULL
);
1076 /* Read a nul-terminated string from FP and store it in STK.
1077 Store the number of bytes read (including nul terminator) in PCOUNT.
1079 Return the last character read or EOF on end of file. */
1081 read_obstack (FILE *fp
, struct obstack
*stk
, size_t *pcount
)
1086 for (i
= 0, c
= getc (fp
); c
!= EOF
&& c
!= 0; c
= getc (fp
), i
++)
1087 obstack_1grow (stk
, c
);
1088 obstack_1grow (stk
, 0);
1094 /* Read from file FP a nul-terminated string and convert it to
1095 intmax_t. Return the resulting value in PVAL. Assume '-' has
1098 Throw a fatal error if the string cannot be converted or if the
1099 converted value is less than MIN_VAL. */
1102 read_negative_num (FILE *fp
, intmax_t min_val
, intmax_t *pval
)
1106 char buf
[INT_BUFSIZE_BOUND (intmax_t)];
1110 for (i
= 1; ISDIGIT (c
= getc (fp
)); i
++)
1112 if (i
== sizeof buf
- 1)
1113 FATAL_ERROR ((0, 0, _("Field too long while reading snapshot file")));
1120 FATAL_ERROR ((0, errno
, _("Read error in snapshot file")));
1122 FATAL_ERROR ((0, 0, _("Unexpected EOF in snapshot file")));
1127 *pval
= strtoimax (buf
, &ep
, 10);
1128 if (c
|| errno
|| *pval
< min_val
)
1129 FATAL_ERROR ((0, errno
, _("Unexpected field value in snapshot file")));
1132 /* Read from file FP a nul-terminated string and convert it to
1133 uintmax_t. Return the resulting value in PVAL. Assume C has
1136 Throw a fatal error if the string cannot be converted or if the
1137 converted value exceeds MAX_VAL.
1139 Return the last character read or EOF on end of file. */
1142 read_unsigned_num (int c
, FILE *fp
, uintmax_t max_val
, uintmax_t *pval
)
1145 char buf
[UINTMAX_STRSIZE_BOUND
], *ep
;
1147 for (i
= 0; ISDIGIT (c
); i
++)
1149 if (i
== sizeof buf
- 1)
1150 FATAL_ERROR ((0, 0, _("Field too long while reading snapshot file")));
1158 FATAL_ERROR ((0, errno
, _("Read error in snapshot file")));
1162 FATAL_ERROR ((0, 0, _("Unexpected EOF in snapshot file")));
1167 *pval
= strtoumax (buf
, &ep
, 10);
1168 if (c
|| errno
|| max_val
< *pval
)
1169 FATAL_ERROR ((0, errno
, _("Unexpected field value in snapshot file")));
1173 /* Read from file FP a nul-terminated string and convert it to
1174 uintmax_t. Return the resulting value in PVAL.
1176 Throw a fatal error if the string cannot be converted or if the
1177 converted value exceeds MAX_VAL.
1179 Return the last character read or EOF on end of file. */
1182 read_num (FILE *fp
, uintmax_t max_val
, uintmax_t *pval
)
1184 return read_unsigned_num (getc (fp
), fp
, max_val
, pval
);
1187 /* Read from FP two NUL-terminated strings representing a struct
1188 timespec. Return the resulting value in PVAL.
1190 Throw a fatal error if the string cannot be converted. */
1193 read_timespec (FILE *fp
, struct timespec
*pval
)
1201 read_negative_num (fp
, TYPE_MINIMUM (time_t), &i
);
1207 c
= read_unsigned_num (c
, fp
, TYPE_MAXIMUM (time_t), &u
);
1211 if (c
|| read_num (fp
, BILLION
- 1, &u
))
1212 FATAL_ERROR ((0, 0, "%s: %s",
1213 quotearg_colon (listed_incremental_option
),
1214 _("Unexpected EOF in snapshot file")));
1218 /* Read incremental snapshot format 2 */
1220 read_incr_db_2 (void)
1225 obstack_init (&stk
);
1227 read_timespec (listed_incremental_stream
, &newer_mtime_option
);
1231 struct timespec mtime
;
1239 if (read_num (listed_incremental_stream
, 1, &u
))
1240 return; /* Normal return */
1244 read_timespec (listed_incremental_stream
, &mtime
);
1246 if (read_num (listed_incremental_stream
, TYPE_MAXIMUM (dev_t
), &u
))
1250 if (read_num (listed_incremental_stream
, TYPE_MAXIMUM (ino_t
), &u
))
1254 if (read_obstack (listed_incremental_stream
, &stk
, &s
))
1257 name
= obstack_finish (&stk
);
1259 while (read_obstack (listed_incremental_stream
, &stk
, &s
) == 0 && s
> 1)
1261 if (getc (listed_incremental_stream
) != 0)
1262 FATAL_ERROR ((0, 0, "%s: %s",
1263 quotearg_colon (listed_incremental_option
),
1264 _("Missing record terminator")));
1266 content
= obstack_finish (&stk
);
1267 note_directory (name
, mtime
, dev
, ino
, nfs
, false, content
);
1268 obstack_free (&stk
, content
);
1270 FATAL_ERROR ((0, 0, "%s: %s",
1271 quotearg_colon (listed_incremental_option
),
1272 _("Unexpected EOF in snapshot file")));
1275 /* Read incremental snapshot file (directory file).
1276 If the file has older incremental version, make sure that it is processed
1277 correctly and that tar will use the most conservative backup method among
1278 possible alternatives (i.e. prefer ALL_CHILDREN over CHANGED_CHILDREN,
1279 etc.) This ensures that the snapshots are updated to the recent version
1280 without any loss of data. */
1282 read_directory_file (void)
1287 int flags
= O_RDWR
| O_CREAT
;
1289 if (incremental_level
== 0)
1291 /* Open the file for both read and write. That way, we can write
1292 it later without having to reopen it, and don't have to worry if
1293 we chdir in the meantime. */
1294 fd
= open (listed_incremental_option
, flags
, MODE_RW
);
1297 open_error (listed_incremental_option
);
1301 listed_incremental_stream
= fdopen (fd
, "r+");
1302 if (! listed_incremental_stream
)
1304 open_error (listed_incremental_option
);
1309 /* Consume the first name from the name list and reset the
1310 list afterwards. This is done to change to the new
1311 directory, if the first name is a chdir request (-C dir),
1312 which is necessary to recreate absolute file names. */
1316 if (0 < getline (&buf
, &bufsize
, listed_incremental_stream
))
1319 uintmax_t incremental_version
;
1321 if (strncmp (buf
, PACKAGE_NAME
, sizeof PACKAGE_NAME
- 1) == 0)
1323 ebuf
= buf
+ sizeof PACKAGE_NAME
- 1;
1325 ERROR((1, 0, _("Bad incremental file format")));
1326 for (; *ebuf
!= '-'; ebuf
++)
1328 ERROR((1, 0, _("Bad incremental file format")));
1330 incremental_version
= strtoumax (ebuf
+ 1, NULL
, 10);
1333 incremental_version
= 0;
1335 switch (incremental_version
)
1339 read_incr_db_01 (incremental_version
, buf
);
1342 case TAR_INCREMENTAL_VERSION
:
1347 ERROR ((1, 0, _("Unsupported incremental format version: %"PRIuMAX
),
1348 incremental_version
));
1353 if (ferror (listed_incremental_stream
))
1354 read_error (listed_incremental_option
);
1359 /* Output incremental data for the directory ENTRY to the file DATA.
1360 Return nonzero if successful, preserving errno on write failure. */
1362 write_directory_file_entry (void *entry
, void *data
)
1364 struct directory
const *directory
= entry
;
1367 if (DIR_IS_FOUND (directory
))
1369 char buf
[UINTMAX_STRSIZE_BOUND
];
1372 s
= DIR_IS_NFS (directory
) ? "1" : "0";
1373 fwrite (s
, 2, 1, fp
);
1374 s
= (TYPE_SIGNED (time_t)
1375 ? imaxtostr (directory
->mtime
.tv_sec
, buf
)
1376 : umaxtostr (directory
->mtime
.tv_sec
, buf
));
1377 fwrite (s
, strlen (s
) + 1, 1, fp
);
1378 s
= umaxtostr (directory
->mtime
.tv_nsec
, buf
);
1379 fwrite (s
, strlen (s
) + 1, 1, fp
);
1380 s
= umaxtostr (directory
->device_number
, buf
);
1381 fwrite (s
, strlen (s
) + 1, 1, fp
);
1382 s
= umaxtostr (directory
->inode_number
, buf
);
1383 fwrite (s
, strlen (s
) + 1, 1, fp
);
1385 fwrite (directory
->name
, strlen (directory
->name
) + 1, 1, fp
);
1386 if (directory
->dump
)
1389 struct dumpdir_iter
*itr
;
1391 for (p
= dumpdir_first (directory
->dump
, 0, &itr
);
1393 p
= dumpdir_next (itr
))
1394 fwrite (p
, strlen (p
) + 1, 1, fp
);
1397 fwrite ("\0\0", 2, 1, fp
);
1400 return ! ferror (fp
);
1404 write_directory_file (void)
1406 FILE *fp
= listed_incremental_stream
;
1407 char buf
[UINTMAX_STRSIZE_BOUND
];
1413 if (fseeko (fp
, 0L, SEEK_SET
) != 0)
1414 seek_error (listed_incremental_option
);
1415 if (sys_truncate (fileno (fp
)) != 0)
1416 truncate_error (listed_incremental_option
);
1418 fprintf (fp
, "%s-%s-%d\n", PACKAGE_NAME
, PACKAGE_VERSION
,
1419 TAR_INCREMENTAL_VERSION
);
1421 s
= (TYPE_SIGNED (time_t)
1422 ? imaxtostr (start_time
.tv_sec
, buf
)
1423 : umaxtostr (start_time
.tv_sec
, buf
));
1424 fwrite (s
, strlen (s
) + 1, 1, fp
);
1425 s
= umaxtostr (start_time
.tv_nsec
, buf
);
1426 fwrite (s
, strlen (s
) + 1, 1, fp
);
1428 if (! ferror (fp
) && directory_table
)
1429 hash_do_for_each (directory_table
, write_directory_file_entry
, fp
);
1432 write_error (listed_incremental_option
);
1433 if (fclose (fp
) != 0)
1434 close_error (listed_incremental_option
);
1438 /* Restoration of incremental dumps. */
1441 get_gnu_dumpdir (struct tar_stat_info
*stat_info
)
1445 union block
*data_block
;
1449 size
= stat_info
->stat
.st_size
;
1451 archive_dir
= xmalloc (size
);
1454 set_next_block_after (current_header
);
1455 mv_begin_read (stat_info
);
1457 for (; size
> 0; size
-= copied
)
1459 mv_size_left (size
);
1460 data_block
= find_next_block ();
1462 ERROR ((1, 0, _("Unexpected EOF in archive")));
1463 copied
= available_space_after (data_block
);
1466 memcpy (to
, data_block
->buffer
, copied
);
1468 set_next_block_after ((union block
*)
1469 (data_block
->buffer
+ copied
- 1));
1474 stat_info
->dumpdir
= archive_dir
;
1475 stat_info
->skipped
= true; /* For skip_member() and friends
1476 to work correctly */
1479 /* Return T if STAT_INFO represents a dumpdir archive member.
1480 Note: can invalidate current_header. It happens if flush_archive()
1481 gets called within get_gnu_dumpdir() */
1483 is_dumpdir (struct tar_stat_info
*stat_info
)
1485 if (stat_info
->is_dumpdir
&& !stat_info
->dumpdir
)
1486 get_gnu_dumpdir (stat_info
);
1487 return stat_info
->is_dumpdir
;
1491 dumpdir_ok (char *dumpdir
)
1494 int has_tempdir
= 0;
1497 for (p
= dumpdir
; *p
; p
+= strlen (p
) + 1)
1499 if (expect
&& *p
!= expect
)
1502 _("Malformed dumpdir: expected '%c' but found %#3o"),
1512 _("Malformed dumpdir: 'X' duplicated")));
1525 _("Malformed dumpdir: empty name in 'R'")));
1538 _("Malformed dumpdir: 'T' not preceeded by 'R'")));
1541 if (p
[1] == 0 && !has_tempdir
)
1544 _("Malformed dumpdir: empty name in 'T'")));
1556 /* FIXME: bail out? */
1564 _("Malformed dumpdir: expected '%c' but found end of data"),
1570 WARNOPT (WARN_BAD_DUMPDIR
,
1571 (0, 0, _("Malformed dumpdir: 'X' never used")));
1576 /* Examine the directories under directory_name and delete any
1577 files that were not there at the time of the back-up. */
1579 try_purge_directory (char const *directory_name
)
1582 char *cur
, *arc
, *p
;
1583 char *temp_stub
= NULL
;
1584 struct dumpdir
*dump
;
1586 if (!is_dumpdir (¤t_stat_info
))
1589 current_dir
= savedir (directory_name
);
1592 /* The directory doesn't exist now. It'll be created. In any
1593 case, we don't have to delete any files out of it. */
1596 /* Verify if dump directory is sane */
1597 if (!dumpdir_ok (current_stat_info
.dumpdir
))
1600 /* Process renames */
1601 for (arc
= current_stat_info
.dumpdir
; *arc
; arc
+= strlen (arc
) + 1)
1605 #define TEMP_DIR_TEMPLATE "tar.XXXXXX"
1606 size_t len
= strlen (arc
+ 1);
1607 temp_stub
= xrealloc (temp_stub
, len
+ 1 + sizeof TEMP_DIR_TEMPLATE
);
1608 memcpy (temp_stub
, arc
+ 1, len
);
1609 temp_stub
[len
] = '/';
1610 memcpy (temp_stub
+ len
+ 1, TEMP_DIR_TEMPLATE
,
1611 sizeof TEMP_DIR_TEMPLATE
);
1612 if (!mkdtemp (temp_stub
))
1615 _("Cannot create temporary directory using template %s"),
1616 quote (temp_stub
)));
1622 else if (*arc
== 'R')
1626 arc
+= strlen (arc
) + 1;
1629 /* Ensure that neither source nor destination are absolute file
1630 names (unless permitted by -P option), and that they do not
1631 contain dubious parts (e.g. ../).
1633 This is an extra safety precaution. Besides, it might be
1634 necessary to extract from archives created with tar versions
1638 src
= safer_name_suffix (src
, false, absolute_names_option
);
1640 dst
= safer_name_suffix (dst
, false, absolute_names_option
);
1647 if (!rename_directory (src
, dst
))
1651 /* FIXME: Make sure purge_directory(dst) will return
1660 /* Process deletes */
1661 dump
= dumpdir_create (current_stat_info
.dumpdir
);
1663 for (cur
= current_dir
; *cur
; cur
+= strlen (cur
) + 1)
1669 p
= new_name (directory_name
, cur
);
1671 if (deref_stat (p
, &st
) != 0)
1673 if (errno
!= ENOENT
) /* FIXME: Maybe keep a list of renamed
1674 dirs and check it here? */
1677 WARN ((0, 0, _("%s: Not purging directory: unable to stat"),
1678 quotearg_colon (p
)));
1683 if (!(entry
= dumpdir_locate (dump
, cur
))
1684 || (*entry
== 'D' && !S_ISDIR (st
.st_mode
))
1685 || (*entry
== 'Y' && S_ISDIR (st
.st_mode
)))
1687 if (one_file_system_option
&& st
.st_dev
!= root_device
)
1690 _("%s: directory is on a different device: not purging"),
1691 quotearg_colon (p
)));
1695 if (! interactive_option
|| confirm ("delete", p
))
1698 fprintf (stdlis
, _("%s: Deleting %s\n"),
1699 program_name
, quote (p
));
1700 if (! remove_any_file (p
, RECURSIVE_REMOVE_OPTION
))
1703 ERROR ((0, e
, _("%s: Cannot remove"), quotearg_colon (p
)));
1709 dumpdir_free (dump
);
1716 purge_directory (char const *directory_name
)
1718 if (!try_purge_directory (directory_name
))
1723 list_dumpdir (char *buffer
, size_t size
)
1736 fprintf (stdlis
, "%c", *buffer
);
1739 fprintf (stdlis
, " ");
1747 fputc ('\n', stdlis
);
1754 fputc (*buffer
, stdlis
);