1 /* Create a tar archive.
3 Copyright (C) 1985, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
4 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
6 Written by John Gilmore, on 1985-08-25.
8 This program is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any later
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
16 Public License for more details.
18 You should have received a copy of the GNU General Public License along
19 with this program; if not, write to the Free Software Foundation, Inc.,
20 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
41 enum exclusion_tag_type type
;
42 bool (*predicate
) (const char *name
);
43 struct exclusion_tag
*next
;
46 static struct exclusion_tag
*exclusion_tags
;
49 add_exclusion_tag (const char *name
, enum exclusion_tag_type type
,
50 bool (*predicate
) (const char *name
))
52 struct exclusion_tag
*tag
= xmalloc (sizeof tag
[0]);
53 tag
->next
= exclusion_tags
;
56 tag
->predicate
= predicate
;
57 tag
->length
= strlen (name
);
62 exclusion_tag_warning (const char *dirname
, const char *tagname
,
67 _("%s: contains a cache directory tag %s; %s"),
68 quotearg_colon (dirname
),
69 quotearg_n (1, tagname
),
73 static enum exclusion_tag_type
74 check_exclusion_tags (char *dirname
, const char **tag_file_name
)
77 static size_t tagsize
;
78 struct exclusion_tag
*tag
;
79 size_t dlen
= strlen (dirname
);
83 for (tag
= exclusion_tags
; tag
; tag
= tag
->next
)
85 size_t size
= dlen
+ tag
->length
+ 1;
89 tagname
= xrealloc (tagname
, tagsize
);
94 strcpy (tagname
, dirname
);
95 nptr
= tagname
+ dlen
;
97 strcpy (nptr
, tag
->name
);
98 if (access (tagname
, F_OK
) == 0
99 && (!tag
->predicate
|| tag
->predicate (tagname
)))
102 *tag_file_name
= tag
->name
;
107 return exclusion_tag_none
;
110 /* Exclusion predicate to test if the named file (usually "CACHEDIR.TAG")
111 contains a valid header, as described at:
112 http://www.brynosaurus.com/cachedir
113 Applications can write this file into directories they create
114 for use as caches containing purely regenerable, non-precious data,
115 allowing us to avoid archiving them if --exclude-caches is specified. */
117 #define CACHEDIR_SIGNATURE "Signature: 8a477f597d28d172789f06886806bc55"
118 #define CACHEDIR_SIGNATURE_SIZE (sizeof CACHEDIR_SIGNATURE - 1)
121 cachedir_file_p (const char *name
)
123 bool tag_present
= false;
124 int fd
= open (name
, O_RDONLY
);
127 static char tagbuf
[CACHEDIR_SIGNATURE_SIZE
];
129 if (read (fd
, tagbuf
, CACHEDIR_SIGNATURE_SIZE
)
130 == CACHEDIR_SIGNATURE_SIZE
131 && memcmp (tagbuf
, CACHEDIR_SIGNATURE
, CACHEDIR_SIGNATURE_SIZE
) == 0)
140 /* The maximum uintmax_t value that can be represented with DIGITS digits,
141 assuming that each digit is BITS_PER_DIGIT wide. */
142 #define MAX_VAL_WITH_DIGITS(digits, bits_per_digit) \
143 ((digits) * (bits_per_digit) < sizeof (uintmax_t) * CHAR_BIT \
144 ? ((uintmax_t) 1 << ((digits) * (bits_per_digit))) - 1 \
147 /* The maximum uintmax_t value that can be represented with octal
148 digits and a trailing NUL in BUFFER. */
149 #define MAX_OCTAL_VAL(buffer) MAX_VAL_WITH_DIGITS (sizeof (buffer) - 1, LG_8)
151 /* Convert VALUE to an octal representation suitable for tar headers.
152 Output to buffer WHERE with size SIZE.
153 The result is undefined if SIZE is 0 or if VALUE is too large to fit. */
156 to_octal (uintmax_t value
, char *where
, size_t size
)
163 where
[--i
] = '0' + (v
& ((1 << LG_8
) - 1));
169 /* Copy at most LEN bytes from the string SRC to DST. Terminate with
170 NUL unless SRC is LEN or more bytes long. */
173 tar_copy_str (char *dst
, const char *src
, size_t len
)
176 for (i
= 0; i
< len
; i
++)
177 if (! (dst
[i
] = src
[i
]))
181 /* Same as tar_copy_str, but always terminate with NUL if using
185 tar_name_copy_str (char *dst
, const char *src
, size_t len
)
187 tar_copy_str (dst
, src
, len
);
188 if (archive_format
== OLDGNU_FORMAT
)
192 /* Convert NEGATIVE VALUE to a base-256 representation suitable for
193 tar headers. NEGATIVE is 1 if VALUE was negative before being cast
194 to uintmax_t, 0 otherwise. Output to buffer WHERE with size SIZE.
195 The result is undefined if SIZE is 0 or if VALUE is too large to
199 to_base256 (int negative
, uintmax_t value
, char *where
, size_t size
)
202 uintmax_t propagated_sign_bits
=
203 ((uintmax_t) - negative
<< (CHAR_BIT
* sizeof v
- LG_256
));
208 where
[--i
] = v
& ((1 << LG_256
) - 1);
209 v
= propagated_sign_bits
| (v
>> LG_256
);
216 to_chars (int negative
, uintmax_t value
, size_t valsize
,
217 uintmax_t (*substitute
) (int *),
218 char *where
, size_t size
, const char *type
);
221 to_chars_subst (int negative
, int gnu_format
, uintmax_t value
, size_t valsize
,
222 uintmax_t (*substitute
) (int *),
223 char *where
, size_t size
, const char *type
)
225 uintmax_t maxval
= (gnu_format
226 ? MAX_VAL_WITH_DIGITS (size
- 1, LG_256
)
227 : MAX_VAL_WITH_DIGITS (size
- 1, LG_8
));
228 char valbuf
[UINTMAX_STRSIZE_BOUND
+ 1];
229 char maxbuf
[UINTMAX_STRSIZE_BOUND
];
230 char minbuf
[UINTMAX_STRSIZE_BOUND
+ 1];
231 char const *minval_string
;
232 char const *maxval_string
= STRINGIFY_BIGINT (maxval
, maxbuf
);
233 char const *value_string
;
237 uintmax_t m
= maxval
+ 1 ? maxval
+ 1 : maxval
/ 2 + 1;
238 char *p
= STRINGIFY_BIGINT (m
, minbuf
+ 1);
247 char *p
= STRINGIFY_BIGINT (- value
, valbuf
+ 1);
252 value_string
= STRINGIFY_BIGINT (value
, valbuf
);
257 uintmax_t sub
= substitute (&negsub
) & maxval
;
258 /* NOTE: This is one of the few places where GNU_FORMAT differs from
259 OLDGNU_FORMAT. The actual differences are:
261 1. In OLDGNU_FORMAT all strings in a tar header end in \0
262 2. Incremental archives use oldgnu_header.
264 Apart from this they are completely identical. */
265 uintmax_t s
= (negsub
&= archive_format
== GNU_FORMAT
) ? - sub
: sub
;
266 char subbuf
[UINTMAX_STRSIZE_BOUND
+ 1];
267 char *sub_string
= STRINGIFY_BIGINT (s
, subbuf
+ 1);
270 WARN ((0, 0, _("value %s out of %s range %s..%s; substituting %s"),
271 value_string
, type
, minval_string
, maxval_string
,
273 return to_chars (negsub
, s
, valsize
, 0, where
, size
, type
);
276 ERROR ((0, 0, _("value %s out of %s range %s..%s"),
277 value_string
, type
, minval_string
, maxval_string
));
281 /* Convert NEGATIVE VALUE (which was originally of size VALSIZE) to
282 external form, using SUBSTITUTE (...) if VALUE won't fit. Output
283 to buffer WHERE with size SIZE. NEGATIVE is 1 iff VALUE was
284 negative before being cast to uintmax_t; its original bitpattern
285 can be deduced from VALSIZE, its original size before casting.
286 TYPE is the kind of value being output (useful for diagnostics).
287 Prefer the POSIX format of SIZE - 1 octal digits (with leading zero
288 digits), followed by '\0'. If this won't work, and if GNU or
289 OLDGNU format is allowed, use '\200' followed by base-256, or (if
290 NEGATIVE is nonzero) '\377' followed by two's complement base-256.
291 If neither format works, use SUBSTITUTE (...) instead. Pass to
292 SUBSTITUTE the address of an 0-or-1 flag recording whether the
293 substitute value is negative. */
296 to_chars (int negative
, uintmax_t value
, size_t valsize
,
297 uintmax_t (*substitute
) (int *),
298 char *where
, size_t size
, const char *type
)
300 int gnu_format
= (archive_format
== GNU_FORMAT
301 || archive_format
== OLDGNU_FORMAT
);
303 /* Generate the POSIX octal representation if the number fits. */
304 if (! negative
&& value
<= MAX_VAL_WITH_DIGITS (size
- 1, LG_8
))
306 where
[size
- 1] = '\0';
307 to_octal (value
, where
, size
- 1);
312 /* Try to cope with the number by using traditional GNU format
315 /* Generate the base-256 representation if the number fits. */
316 if (((negative
? -1 - value
: value
)
317 <= MAX_VAL_WITH_DIGITS (size
- 1, LG_256
)))
319 where
[0] = negative
? -1 : 1 << (LG_256
- 1);
320 to_base256 (negative
, value
, where
+ 1, size
- 1);
324 /* Otherwise, if the number is negative, and if it would not cause
325 ambiguity on this host by confusing positive with negative
326 values, then generate the POSIX octal representation of the value
327 modulo 2**(field bits). The resulting tar file is
328 machine-dependent, since it depends on the host word size. Yuck!
329 But this is the traditional behavior. */
330 else if (negative
&& valsize
* CHAR_BIT
<= (size
- 1) * LG_8
)
332 static int warned_once
;
336 WARN ((0, 0, _("Generating negative octal headers")));
338 where
[size
- 1] = '\0';
339 to_octal (value
& MAX_VAL_WITH_DIGITS (valsize
* CHAR_BIT
, 1),
343 /* Otherwise fall back to substitution, if possible: */
346 substitute
= NULL
; /* No substitution for formats, other than GNU */
348 return to_chars_subst (negative
, gnu_format
, value
, valsize
, substitute
,
353 gid_substitute (int *negative
)
359 static gid_t gid_nobody
;
360 if (!gid_nobody
&& !gname_to_gid ("nobody", &gid_nobody
))
369 gid_to_chars (gid_t v
, char *p
, size_t s
)
371 return to_chars (v
< 0, (uintmax_t) v
, sizeof v
, gid_substitute
, p
, s
, "gid_t");
375 major_to_chars (major_t v
, char *p
, size_t s
)
377 return to_chars (v
< 0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "major_t");
381 minor_to_chars (minor_t v
, char *p
, size_t s
)
383 return to_chars (v
< 0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "minor_t");
387 mode_to_chars (mode_t v
, char *p
, size_t s
)
389 /* In the common case where the internal and external mode bits are the same,
390 and we are not using POSIX or GNU format,
391 propagate all unknown bits to the external mode.
392 This matches historical practice.
393 Otherwise, just copy the bits we know about. */
396 if (S_ISUID
== TSUID
&& S_ISGID
== TSGID
&& S_ISVTX
== TSVTX
397 && S_IRUSR
== TUREAD
&& S_IWUSR
== TUWRITE
&& S_IXUSR
== TUEXEC
398 && S_IRGRP
== TGREAD
&& S_IWGRP
== TGWRITE
&& S_IXGRP
== TGEXEC
399 && S_IROTH
== TOREAD
&& S_IWOTH
== TOWRITE
&& S_IXOTH
== TOEXEC
400 && archive_format
!= POSIX_FORMAT
401 && archive_format
!= USTAR_FORMAT
402 && archive_format
!= GNU_FORMAT
403 && archive_format
!= OLDGNU_FORMAT
)
411 u
= ((v
& S_ISUID
? TSUID
: 0)
412 | (v
& S_ISGID
? TSGID
: 0)
413 | (v
& S_ISVTX
? TSVTX
: 0)
414 | (v
& S_IRUSR
? TUREAD
: 0)
415 | (v
& S_IWUSR
? TUWRITE
: 0)
416 | (v
& S_IXUSR
? TUEXEC
: 0)
417 | (v
& S_IRGRP
? TGREAD
: 0)
418 | (v
& S_IWGRP
? TGWRITE
: 0)
419 | (v
& S_IXGRP
? TGEXEC
: 0)
420 | (v
& S_IROTH
? TOREAD
: 0)
421 | (v
& S_IWOTH
? TOWRITE
: 0)
422 | (v
& S_IXOTH
? TOEXEC
: 0));
424 return to_chars (negative
, u
, sizeof v
, 0, p
, s
, "mode_t");
428 off_to_chars (off_t v
, char *p
, size_t s
)
430 return to_chars (v
< 0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "off_t");
434 size_to_chars (size_t v
, char *p
, size_t s
)
436 return to_chars (0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "size_t");
440 time_to_chars (time_t v
, char *p
, size_t s
)
442 return to_chars (v
< 0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "time_t");
446 uid_substitute (int *negative
)
452 static uid_t uid_nobody
;
453 if (!uid_nobody
&& !uname_to_uid ("nobody", &uid_nobody
))
462 uid_to_chars (uid_t v
, char *p
, size_t s
)
464 return to_chars (v
< 0, (uintmax_t) v
, sizeof v
, uid_substitute
, p
, s
, "uid_t");
468 uintmax_to_chars (uintmax_t v
, char *p
, size_t s
)
470 return to_chars (0, v
, sizeof v
, 0, p
, s
, "uintmax_t");
474 string_to_chars (char const *str
, char *p
, size_t s
)
476 tar_copy_str (p
, str
, s
);
481 /* A file is considered dumpable if it is sparse and both --sparse and --totals
483 Otherwise, it is dumpable unless any of the following conditions occur:
485 a) it is empty *and* world-readable, or
486 b) current archive is /dev/null */
489 file_dumpable_p (struct tar_stat_info
*st
)
492 return totals_option
&& sparse_option
&& ST_IS_SPARSE (st
->stat
);
493 return !(st
->archive_file_size
== 0
494 && (st
->stat
.st_mode
& MODE_R
) == MODE_R
);
498 /* Writing routines. */
500 /* Write the EOT block(s). Zero at least two blocks, through the end
501 of the record. Old tar, as previous versions of GNU tar, writes
502 garbage after two zeroed blocks. */
506 union block
*pointer
= find_next_block ();
507 memset (pointer
->buffer
, 0, BLOCKSIZE
);
508 set_next_block_after (pointer
);
509 pointer
= find_next_block ();
510 memset (pointer
->buffer
, 0, available_space_after (pointer
));
511 set_next_block_after (pointer
);
514 /* Write a "private" header */
516 start_private_header (const char *name
, size_t size
)
519 union block
*header
= find_next_block ();
521 memset (header
->buffer
, 0, sizeof (union block
));
523 tar_name_copy_str (header
->header
.name
, name
, NAME_FIELD_SIZE
);
524 OFF_TO_CHARS (size
, header
->header
.size
);
527 TIME_TO_CHARS (t
, header
->header
.mtime
);
528 MODE_TO_CHARS (S_IFREG
|S_IRUSR
|S_IWUSR
|S_IRGRP
|S_IROTH
, header
->header
.mode
);
529 UID_TO_CHARS (getuid (), header
->header
.uid
);
530 GID_TO_CHARS (getgid (), header
->header
.gid
);
531 MAJOR_TO_CHARS (0, header
->header
.devmajor
);
532 MINOR_TO_CHARS (0, header
->header
.devminor
);
533 strncpy (header
->header
.magic
, TMAGIC
, TMAGLEN
);
534 strncpy (header
->header
.version
, TVERSION
, TVERSLEN
);
538 /* Create a new header and store there at most NAME_FIELD_SIZE bytes of
542 write_short_name (struct tar_stat_info
*st
)
544 union block
*header
= find_next_block ();
545 memset (header
->buffer
, 0, sizeof (union block
));
546 tar_name_copy_str (header
->header
.name
, st
->file_name
, NAME_FIELD_SIZE
);
550 #define FILL(field,byte) do { \
551 memset(field, byte, sizeof(field)-1); \
552 (field)[sizeof(field)-1] = 0; \
555 /* Write a GNUTYPE_LONGLINK or GNUTYPE_LONGNAME block. */
557 write_gnu_long_link (struct tar_stat_info
*st
, const char *p
, char type
)
559 size_t size
= strlen (p
) + 1;
564 header
= start_private_header ("././@LongLink", size
);
565 FILL(header
->header
.mtime
, '0');
566 FILL(header
->header
.mode
, '0');
567 FILL(header
->header
.uid
, '0');
568 FILL(header
->header
.gid
, '0');
569 FILL(header
->header
.devmajor
, 0);
570 FILL(header
->header
.devminor
, 0);
571 uid_to_uname (0, &tmpname
);
572 UNAME_TO_CHARS (tmpname
, header
->header
.uname
);
574 gid_to_gname (0, &tmpname
);
575 GNAME_TO_CHARS (tmpname
, header
->header
.gname
);
578 strcpy (header
->header
.magic
, OLDGNU_MAGIC
);
579 header
->header
.typeflag
= type
;
580 finish_header (st
, header
, -1);
582 header
= find_next_block ();
584 bufsize
= available_space_after (header
);
586 while (bufsize
< size
)
588 memcpy (header
->buffer
, p
, bufsize
);
591 set_next_block_after (header
+ (bufsize
- 1) / BLOCKSIZE
);
592 header
= find_next_block ();
593 bufsize
= available_space_after (header
);
595 memcpy (header
->buffer
, p
, size
);
596 memset (header
->buffer
+ size
, 0, bufsize
- size
);
597 set_next_block_after (header
+ (size
- 1) / BLOCKSIZE
);
601 split_long_name (const char *name
, size_t length
)
605 if (length
> PREFIX_FIELD_SIZE
)
606 length
= PREFIX_FIELD_SIZE
+ 1;
607 for (i
= length
- 1; i
> 0; i
--)
608 if (ISSLASH (name
[i
]))
614 write_ustar_long_name (const char *name
)
616 size_t length
= strlen (name
);
620 if (length
> PREFIX_FIELD_SIZE
+ NAME_FIELD_SIZE
+ 1)
622 ERROR ((0, 0, _("%s: file name is too long (max %d); not dumped"),
623 quotearg_colon (name
),
624 PREFIX_FIELD_SIZE
+ NAME_FIELD_SIZE
+ 1));
628 i
= split_long_name (name
, length
);
629 if (i
== 0 || length
- i
- 1 > NAME_FIELD_SIZE
)
632 _("%s: file name is too long (cannot be split); not dumped"),
633 quotearg_colon (name
)));
637 header
= find_next_block ();
638 memset (header
->buffer
, 0, sizeof (header
->buffer
));
639 memcpy (header
->header
.prefix
, name
, i
);
640 memcpy (header
->header
.name
, name
+ i
+ 1, length
- i
- 1);
645 /* Write a long link name, depending on the current archive format */
647 write_long_link (struct tar_stat_info
*st
)
649 switch (archive_format
)
652 xheader_store ("linkpath", st
, NULL
);
655 case V7_FORMAT
: /* old V7 tar format */
659 _("%s: link name is too long; not dumped"),
660 quotearg_colon (st
->link_name
)));
665 write_gnu_long_link (st
, st
->link_name
, GNUTYPE_LONGLINK
);
674 write_long_name (struct tar_stat_info
*st
)
676 switch (archive_format
)
679 xheader_store ("path", st
, NULL
);
683 if (strlen (st
->file_name
) > NAME_FIELD_SIZE
-1)
685 ERROR ((0, 0, _("%s: file name is too long (max %d); not dumped"),
686 quotearg_colon (st
->file_name
),
687 NAME_FIELD_SIZE
- 1));
694 return write_ustar_long_name (st
->file_name
);
698 write_gnu_long_link (st
, st
->file_name
, GNUTYPE_LONGNAME
);
704 return write_short_name (st
);
708 write_extended (bool global
, struct tar_stat_info
*st
, union block
*old_header
)
710 union block
*header
, hp
;
714 if (st
->xhdr
.buffer
|| st
->xhdr
.stk
== NULL
)
717 xheader_finish (&st
->xhdr
);
718 memcpy (hp
.buffer
, old_header
, sizeof (hp
));
722 p
= xheader_ghdr_name ();
727 p
= xheader_xhdr_name (st
);
729 xheader_write (type
, p
, &st
->xhdr
);
731 header
= find_next_block ();
732 memcpy (header
, &hp
.buffer
, sizeof (hp
.buffer
));
737 write_header_name (struct tar_stat_info
*st
)
739 if (archive_format
== POSIX_FORMAT
&& !string_ascii_p (st
->file_name
))
741 xheader_store ("path", st
, NULL
);
742 return write_short_name (st
);
744 else if (NAME_FIELD_SIZE
- (archive_format
== OLDGNU_FORMAT
)
745 < strlen (st
->file_name
))
746 return write_long_name (st
);
748 return write_short_name (st
);
752 /* Header handling. */
754 /* Make a header block for the file whose stat info is st,
755 and return its address. */
758 start_header (struct tar_stat_info
*st
)
762 header
= write_header_name (st
);
766 /* Override some stat fields, if requested to do so. */
768 if (owner_option
!= (uid_t
) -1)
769 st
->stat
.st_uid
= owner_option
;
770 if (group_option
!= (gid_t
) -1)
771 st
->stat
.st_gid
= group_option
;
774 ((st
->stat
.st_mode
& ~MODE_ALL
)
775 | mode_adjust (st
->stat
.st_mode
, S_ISDIR (st
->stat
.st_mode
) != 0,
776 initial_umask
, mode_option
, NULL
));
778 /* Paul Eggert tried the trivial test ($WRITER cf a b; $READER tvf a)
779 for a few tars and came up with the following interoperability
783 1 2 3 4 5 6 7 8 9 READER
784 . . . . . . . . . 1 = SunOS 4.2 tar
785 # . . # # . . # # 2 = NEC SVR4.0.2 tar
786 . . . # # . . # . 3 = Solaris 2.1 tar
787 . . . . . . . . . 4 = GNU tar 1.11.1
788 . . . . . . . . . 5 = HP-UX 8.07 tar
789 . . . . . . . . . 6 = Ultrix 4.1
790 . . . . . . . . . 7 = AIX 3.2
791 . . . . . . . . . 8 = Hitachi HI-UX 1.03
792 . . . . . . . . . 9 = Omron UNIOS-B 4.3BSD 1.60Beta
795 # = ``impossible file type''
797 The following mask for old archive removes the `#'s in column 4
798 above, thus making GNU tar both a universal donor and a universal
799 acceptor for Paul's test. */
801 if (archive_format
== V7_FORMAT
|| archive_format
== USTAR_FORMAT
)
802 MODE_TO_CHARS (st
->stat
.st_mode
& MODE_ALL
, header
->header
.mode
);
804 MODE_TO_CHARS (st
->stat
.st_mode
, header
->header
.mode
);
807 uid_t uid
= st
->stat
.st_uid
;
808 if (archive_format
== POSIX_FORMAT
809 && MAX_OCTAL_VAL (header
->header
.uid
) < uid
)
811 xheader_store ("uid", st
, NULL
);
814 if (!UID_TO_CHARS (uid
, header
->header
.uid
))
819 gid_t gid
= st
->stat
.st_gid
;
820 if (archive_format
== POSIX_FORMAT
821 && MAX_OCTAL_VAL (header
->header
.gid
) < gid
)
823 xheader_store ("gid", st
, NULL
);
826 if (!GID_TO_CHARS (gid
, header
->header
.gid
))
831 off_t size
= st
->stat
.st_size
;
832 if (archive_format
== POSIX_FORMAT
833 && MAX_OCTAL_VAL (header
->header
.size
) < size
)
835 xheader_store ("size", st
, NULL
);
838 if (!OFF_TO_CHARS (size
, header
->header
.size
))
843 struct timespec mtime
= set_mtime_option
? mtime_option
: st
->mtime
;
844 if (archive_format
== POSIX_FORMAT
)
846 if (MAX_OCTAL_VAL (header
->header
.mtime
) < mtime
.tv_sec
847 || mtime
.tv_nsec
!= 0)
848 xheader_store ("mtime", st
, &mtime
);
849 if (MAX_OCTAL_VAL (header
->header
.mtime
) < mtime
.tv_sec
)
852 if (!TIME_TO_CHARS (mtime
.tv_sec
, header
->header
.mtime
))
857 if (S_ISCHR (st
->stat
.st_mode
)
858 || S_ISBLK (st
->stat
.st_mode
))
860 major_t devmajor
= major (st
->stat
.st_rdev
);
861 minor_t devminor
= minor (st
->stat
.st_rdev
);
863 if (archive_format
== POSIX_FORMAT
864 && MAX_OCTAL_VAL (header
->header
.devmajor
) < devmajor
)
866 xheader_store ("devmajor", st
, NULL
);
869 if (!MAJOR_TO_CHARS (devmajor
, header
->header
.devmajor
))
872 if (archive_format
== POSIX_FORMAT
873 && MAX_OCTAL_VAL (header
->header
.devminor
) < devminor
)
875 xheader_store ("devminor", st
, NULL
);
878 if (!MINOR_TO_CHARS (devminor
, header
->header
.devminor
))
881 else if (archive_format
!= GNU_FORMAT
&& archive_format
!= OLDGNU_FORMAT
)
883 if (!(MAJOR_TO_CHARS (0, header
->header
.devmajor
)
884 && MINOR_TO_CHARS (0, header
->header
.devminor
)))
888 if (archive_format
== POSIX_FORMAT
)
890 xheader_store ("atime", st
, NULL
);
891 xheader_store ("ctime", st
, NULL
);
893 else if (incremental_option
)
894 if (archive_format
== OLDGNU_FORMAT
|| archive_format
== GNU_FORMAT
)
896 TIME_TO_CHARS (st
->atime
.tv_sec
, header
->oldgnu_header
.atime
);
897 TIME_TO_CHARS (st
->ctime
.tv_sec
, header
->oldgnu_header
.ctime
);
900 header
->header
.typeflag
= archive_format
== V7_FORMAT
? AREGTYPE
: REGTYPE
;
902 switch (archive_format
)
908 case GNU_FORMAT
: /*FIXME?*/
909 /* Overwrite header->header.magic and header.version in one blow. */
910 strcpy (header
->header
.magic
, OLDGNU_MAGIC
);
915 strncpy (header
->header
.magic
, TMAGIC
, TMAGLEN
);
916 strncpy (header
->header
.version
, TVERSION
, TVERSLEN
);
923 if (archive_format
== V7_FORMAT
|| numeric_owner_option
)
925 /* header->header.[ug]name are left as the empty string. */
929 uid_to_uname (st
->stat
.st_uid
, &st
->uname
);
930 gid_to_gname (st
->stat
.st_gid
, &st
->gname
);
932 if (archive_format
== POSIX_FORMAT
933 && (strlen (st
->uname
) > UNAME_FIELD_SIZE
934 || !string_ascii_p (st
->uname
)))
935 xheader_store ("uname", st
, NULL
);
936 UNAME_TO_CHARS (st
->uname
, header
->header
.uname
);
938 if (archive_format
== POSIX_FORMAT
939 && (strlen (st
->gname
) > GNAME_FIELD_SIZE
940 || !string_ascii_p (st
->gname
)))
941 xheader_store ("gname", st
, NULL
);
942 GNAME_TO_CHARS (st
->gname
, header
->header
.gname
);
949 simple_finish_header (union block
*header
)
955 memcpy (header
->header
.chksum
, CHKBLANKS
, sizeof header
->header
.chksum
);
959 for (i
= sizeof *header
; i
-- != 0; )
960 /* We can't use unsigned char here because of old compilers, e.g. V7. */
963 /* Fill in the checksum field. It's formatted differently from the
964 other fields: it has [6] digits, a null, then a space -- rather than
965 digits, then a null. We use to_chars.
966 The final space is already there, from
967 checksumming, and to_chars doesn't modify it.
969 This is a fast way to do:
971 sprintf(header->header.chksum, "%6o", sum); */
973 uintmax_to_chars ((uintmax_t) sum
, header
->header
.chksum
, 7);
975 set_next_block_after (header
);
978 /* Finish off a filled-in header block and write it out. We also
979 print the file name and/or full info if verbose is on. If BLOCK_ORDINAL
980 is not negative, is the block ordinal of the first record for this
981 file, which may be a preceding long name or long link record. */
983 finish_header (struct tar_stat_info
*st
,
984 union block
*header
, off_t block_ordinal
)
986 /* Note: It is important to do this before the call to write_extended(),
987 so that the actual ustar header is printed */
989 && header
->header
.typeflag
!= GNUTYPE_LONGLINK
990 && header
->header
.typeflag
!= GNUTYPE_LONGNAME
991 && header
->header
.typeflag
!= XHDTYPE
992 && header
->header
.typeflag
!= XGLTYPE
)
994 /* These globals are parameters to print_header, sigh. */
996 current_header
= header
;
997 current_format
= archive_format
;
998 print_header (st
, block_ordinal
);
1001 header
= write_extended (false, st
, header
);
1002 simple_finish_header (header
);
1007 pad_archive (off_t size_left
)
1010 while (size_left
> 0)
1012 mv_size_left (size_left
);
1013 blk
= find_next_block ();
1014 memset (blk
->buffer
, 0, BLOCKSIZE
);
1015 set_next_block_after (blk
);
1016 size_left
-= BLOCKSIZE
;
1020 static enum dump_status
1021 dump_regular_file (int fd
, struct tar_stat_info
*st
)
1023 off_t size_left
= st
->stat
.st_size
;
1024 off_t block_ordinal
;
1027 block_ordinal
= current_block_ordinal ();
1028 blk
= start_header (st
);
1030 return dump_status_fail
;
1032 /* Mark contiguous files, if we support them. */
1033 if (archive_format
!= V7_FORMAT
&& S_ISCTG (st
->stat
.st_mode
))
1034 blk
->header
.typeflag
= CONTTYPE
;
1036 finish_header (st
, blk
, block_ordinal
);
1039 while (size_left
> 0)
1041 size_t bufsize
, count
;
1043 mv_size_left (size_left
);
1045 blk
= find_next_block ();
1047 bufsize
= available_space_after (blk
);
1049 if (size_left
< bufsize
)
1051 /* Last read -- zero out area beyond. */
1052 bufsize
= size_left
;
1053 count
= bufsize
% BLOCKSIZE
;
1055 memset (blk
->buffer
+ size_left
, 0, BLOCKSIZE
- count
);
1058 count
= (fd
< 0) ? bufsize
: safe_read (fd
, blk
->buffer
, bufsize
);
1059 if (count
== SAFE_READ_ERROR
)
1061 read_diag_details (st
->orig_file_name
,
1062 st
->stat
.st_size
- size_left
, bufsize
);
1063 pad_archive (size_left
);
1064 return dump_status_short
;
1068 set_next_block_after (blk
+ (bufsize
- 1) / BLOCKSIZE
);
1070 if (count
!= bufsize
)
1072 char buf
[UINTMAX_STRSIZE_BOUND
];
1073 memset (blk
->buffer
+ count
, 0, bufsize
- count
);
1075 ngettext ("%s: File shrank by %s byte; padding with zeros",
1076 "%s: File shrank by %s bytes; padding with zeros",
1078 quotearg_colon (st
->orig_file_name
),
1079 STRINGIFY_BIGINT (size_left
, buf
)));
1080 if (! ignore_failed_read_option
)
1081 exit_status
= TAREXIT_DIFFERS
;
1082 pad_archive (size_left
- (bufsize
-count
));
1083 return dump_status_short
;
1086 return dump_status_ok
;
1091 dump_dir0 (char *directory
,
1092 struct tar_stat_info
*st
, int top_level
, dev_t parent_device
)
1094 dev_t our_device
= st
->stat
.st_dev
;
1095 const char *tag_file_name
;
1097 if (!is_avoided_name (st
->orig_file_name
))
1099 union block
*blk
= NULL
;
1100 off_t block_ordinal
= current_block_ordinal ();
1101 st
->stat
.st_size
= 0; /* force 0 size on dir */
1103 blk
= start_header (st
);
1107 if (incremental_option
&& archive_format
!= POSIX_FORMAT
)
1108 blk
->header
.typeflag
= GNUTYPE_DUMPDIR
;
1109 else /* if (standard_option) */
1110 blk
->header
.typeflag
= DIRTYPE
;
1112 /* If we're gnudumping, we aren't done yet so don't close it. */
1114 if (!incremental_option
)
1115 finish_header (st
, blk
, block_ordinal
);
1116 else if (gnu_list_name
->dir_contents
)
1118 if (archive_format
== POSIX_FORMAT
)
1120 xheader_store ("GNU.dumpdir", st
, gnu_list_name
->dir_contents
);
1121 finish_header (st
, blk
, block_ordinal
);
1129 const char *buffer
, *p_buffer
;
1131 block_ordinal
= current_block_ordinal ();
1132 buffer
= gnu_list_name
->dir_contents
;
1134 totsize
= dumpdir_size (buffer
);
1137 OFF_TO_CHARS (totsize
, blk
->header
.size
);
1138 finish_header (st
, blk
, block_ordinal
);
1140 size_left
= totsize
;
1143 mv_total_size (totsize
);
1144 while (size_left
> 0)
1146 mv_size_left (size_left
);
1147 blk
= find_next_block ();
1148 bufsize
= available_space_after (blk
);
1149 if (size_left
< bufsize
)
1151 bufsize
= size_left
;
1152 count
= bufsize
% BLOCKSIZE
;
1154 memset (blk
->buffer
+ size_left
, 0, BLOCKSIZE
- count
);
1156 memcpy (blk
->buffer
, p_buffer
, bufsize
);
1157 size_left
-= bufsize
;
1158 p_buffer
+= bufsize
;
1159 set_next_block_after (blk
+ (bufsize
- 1) / BLOCKSIZE
);
1167 if (!recursion_option
)
1170 if (one_file_system_option
1172 && parent_device
!= st
->stat
.st_dev
)
1176 _("%s: file is on a different filesystem; not dumped"),
1177 quotearg_colon (st
->orig_file_name
)));
1184 switch (check_exclusion_tags (st
->orig_file_name
, &tag_file_name
))
1186 case exclusion_tag_none
:
1187 case exclusion_tag_all
:
1193 name_buf
= xstrdup (st
->orig_file_name
);
1194 name_size
= name_len
= strlen (name_buf
);
1196 /* Now output all the files in the directory. */
1197 /* FIXME: Should speed this up by cd-ing into the dir. */
1198 for (entry
= directory
; (entry_len
= strlen (entry
)) != 0;
1199 entry
+= entry_len
+ 1)
1201 if (name_size
< name_len
+ entry_len
)
1203 name_size
= name_len
+ entry_len
;
1204 name_buf
= xrealloc (name_buf
, name_size
+ 1);
1206 strcpy (name_buf
+ name_len
, entry
);
1207 if (!excluded_name (name_buf
))
1208 dump_file (name_buf
, 0, our_device
);
1215 case exclusion_tag_contents
:
1216 exclusion_tag_warning (st
->orig_file_name
, tag_file_name
,
1217 _("contents not dumped"));
1218 name_size
= strlen (st
->orig_file_name
) + strlen (tag_file_name
) + 1;
1219 name_buf
= xmalloc (name_size
);
1220 strcpy (name_buf
, st
->orig_file_name
);
1221 strcat (name_buf
, tag_file_name
);
1222 dump_file (name_buf
, 0, our_device
);
1226 case exclusion_tag_under
:
1227 exclusion_tag_warning (st
->orig_file_name
, tag_file_name
,
1228 _("contents not dumped"));
1234 /* Ensure exactly one trailing slash. */
1236 ensure_slash (char **pstr
)
1238 size_t len
= strlen (*pstr
);
1239 while (len
>= 1 && ISSLASH ((*pstr
)[len
- 1]))
1241 if (!ISSLASH ((*pstr
)[len
]))
1242 *pstr
= xrealloc (*pstr
, len
+ 2);
1243 (*pstr
)[len
++] = '/';
1244 (*pstr
)[len
] = '\0';
1248 dump_dir (int fd
, struct tar_stat_info
*st
, int top_level
, dev_t parent_device
)
1250 char *directory
= fdsavedir (fd
);
1253 savedir_diag (st
->orig_file_name
);
1257 dump_dir0 (directory
, st
, top_level
, parent_device
);
1264 /* Main functions of this module. */
1267 create_archive (void)
1271 open_archive (ACCESS_WRITE
);
1272 buffer_write_global_xheader ();
1274 if (incremental_option
)
1276 size_t buffer_size
= 1000;
1277 char *buffer
= xmalloc (buffer_size
);
1280 collect_and_sort_names ();
1282 while ((p
= name_from_list ()) != NULL
)
1283 if (!excluded_name (p
))
1284 dump_file (p
, -1, (dev_t
) 0);
1287 while ((p
= name_from_list ()) != NULL
)
1288 if (!excluded_name (p
))
1290 size_t plen
= strlen (p
);
1291 if (buffer_size
<= plen
)
1293 while ((buffer_size
*= 2) <= plen
)
1295 buffer
= xrealloc (buffer
, buffer_size
);
1297 memcpy (buffer
, p
, plen
);
1298 if (! ISSLASH (buffer
[plen
- 1]))
1299 buffer
[plen
++] = '/';
1300 q
= gnu_list_name
->dir_contents
;
1304 size_t qlen
= strlen (q
);
1307 if (buffer_size
< plen
+ qlen
)
1309 while ((buffer_size
*=2 ) < plen
+ qlen
)
1311 buffer
= xrealloc (buffer
, buffer_size
);
1313 strcpy (buffer
+ plen
, q
+ 1);
1314 dump_file (buffer
, -1, (dev_t
) 0);
1323 while ((p
= name_next (1)) != NULL
)
1324 if (!excluded_name (p
))
1325 dump_file (p
, 1, (dev_t
) 0);
1331 if (listed_incremental_option
)
1332 write_directory_file ();
1336 /* Calculate the hash of a link. */
1338 hash_link (void const *entry
, size_t n_buckets
)
1340 struct link
const *l
= entry
;
1341 uintmax_t num
= l
->dev
^ l
->ino
;
1342 return num
% n_buckets
;
1345 /* Compare two links for equality. */
1347 compare_links (void const *entry1
, void const *entry2
)
1349 struct link
const *link1
= entry1
;
1350 struct link
const *link2
= entry2
;
1351 return ((link1
->dev
^ link2
->dev
) | (link1
->ino
^ link2
->ino
)) == 0;
1355 unknown_file_error (char const *p
)
1357 WARN ((0, 0, _("%s: Unknown file type; file ignored"),
1358 quotearg_colon (p
)));
1359 if (!ignore_failed_read_option
)
1360 exit_status
= TAREXIT_FAILURE
;
1364 /* Handling of hard links */
1366 /* Table of all non-directories that we've written so far. Any time
1367 we see another, we check the table and avoid dumping the data
1368 again if we've done it once already. */
1369 static Hash_table
*link_table
;
1371 /* Try to dump stat as a hard link to another file in the archive.
1372 Return true if successful. */
1374 dump_hard_link (struct tar_stat_info
*st
)
1376 if (link_table
&& st
->stat
.st_nlink
> 1)
1379 struct link
*duplicate
;
1380 off_t block_ordinal
;
1383 lp
.ino
= st
->stat
.st_ino
;
1384 lp
.dev
= st
->stat
.st_dev
;
1386 if ((duplicate
= hash_lookup (link_table
, &lp
)))
1388 /* We found a link. */
1389 char const *link_name
= safer_name_suffix (duplicate
->name
, true,
1390 absolute_names_option
);
1394 block_ordinal
= current_block_ordinal ();
1395 assign_string (&st
->link_name
, link_name
);
1396 if (NAME_FIELD_SIZE
- (archive_format
== OLDGNU_FORMAT
)
1397 < strlen (link_name
))
1398 write_long_link (st
);
1400 st
->stat
.st_size
= 0;
1401 blk
= start_header (st
);
1404 tar_copy_str (blk
->header
.linkname
, link_name
, NAME_FIELD_SIZE
);
1406 blk
->header
.typeflag
= LNKTYPE
;
1407 finish_header (st
, blk
, block_ordinal
);
1409 if (remove_files_option
&& unlink (st
->orig_file_name
) != 0)
1410 unlink_error (st
->orig_file_name
);
1419 file_count_links (struct tar_stat_info
*st
)
1421 if (st
->stat
.st_nlink
> 1)
1423 struct link
*duplicate
;
1424 struct link
*lp
= xmalloc (offsetof (struct link
, name
)
1425 + strlen (st
->orig_file_name
) + 1);
1426 lp
->ino
= st
->stat
.st_ino
;
1427 lp
->dev
= st
->stat
.st_dev
;
1428 lp
->nlink
= st
->stat
.st_nlink
;
1429 strcpy (lp
->name
, st
->orig_file_name
);
1432 || (link_table
= hash_initialize (0, 0, hash_link
,
1434 && (duplicate
= hash_insert (link_table
, lp
))))
1437 if (duplicate
!= lp
)
1443 /* For each dumped file, check if all its links were dumped. Emit
1444 warnings if it is not so. */
1453 for (lp
= hash_get_first (link_table
); lp
;
1454 lp
= hash_get_next (link_table
, lp
))
1458 WARN ((0, 0, _("Missing links to %s.\n"), quote (lp
->name
)));
1464 /* Dump a single file, recursing on directories. P is the file name
1465 to dump. TOP_LEVEL tells whether this is a top-level call; zero
1466 means no, positive means yes, and negative means the top level
1467 of an incremental dump. PARENT_DEVICE is the device of P's
1468 parent directory; it is examined only if TOP_LEVEL is zero. */
1470 /* FIXME: One should make sure that for *every* path leading to setting
1471 exit_status to failure, a clear diagnostic has been issued. */
1474 dump_file0 (struct tar_stat_info
*st
, const char *p
,
1475 int top_level
, dev_t parent_device
)
1477 union block
*header
;
1479 off_t original_size
;
1480 struct timespec original_ctime
;
1481 struct timespec restore_times
[2];
1482 off_t block_ordinal
= -1;
1485 if (interactive_option
&& !confirm ("add", p
))
1488 assign_string (&st
->orig_file_name
, p
);
1489 assign_string (&st
->file_name
,
1490 safer_name_suffix (p
, false, absolute_names_option
));
1492 transform_name (&st
->file_name
);
1494 if (deref_stat (dereference_option
, p
, &st
->stat
) != 0)
1499 st
->archive_file_size
= original_size
= st
->stat
.st_size
;
1500 st
->atime
= restore_times
[0] = get_stat_atime (&st
->stat
);
1501 st
->mtime
= restore_times
[1] = get_stat_mtime (&st
->stat
);
1502 st
->ctime
= original_ctime
= get_stat_ctime (&st
->stat
);
1505 if (S_ISHIDDEN (st
->stat
.st_mode
))
1507 char *new = (char *) alloca (strlen (p
) + 2);
1517 /* See if we want only new files, and check if this one is too old to
1520 This check is omitted if incremental_option is set *and* the
1521 requested file is not explicitely listed in the command line. */
1523 if (!(incremental_option
&& !is_individual_file (p
))
1524 && !S_ISDIR (st
->stat
.st_mode
)
1525 && OLDER_TAR_STAT_TIME (*st
, m
)
1526 && (!after_date_option
|| OLDER_TAR_STAT_TIME (*st
, c
)))
1528 if (!incremental_option
&& verbose_option
)
1529 WARN ((0, 0, _("%s: file is unchanged; not dumped"),
1530 quotearg_colon (p
)));
1534 /* See if we are trying to dump the archive. */
1535 if (sys_file_is_archive (st
))
1537 WARN ((0, 0, _("%s: file is the archive; not dumped"),
1538 quotearg_colon (p
)));
1542 if (is_avoided_name (p
))
1545 is_dir
= S_ISDIR (st
->stat
.st_mode
) != 0;
1547 if (!is_dir
&& dump_hard_link (st
))
1550 if (is_dir
|| S_ISREG (st
->stat
.st_mode
) || S_ISCTG (st
->stat
.st_mode
))
1554 struct stat final_stat
;
1556 if (is_dir
|| file_dumpable_p (st
))
1559 (O_RDONLY
| O_BINARY
1560 | (is_dir
? O_DIRECTORY
| O_NONBLOCK
: 0)
1561 | (atime_preserve_option
== system_atime_preserve
1566 if (!top_level
&& errno
== ENOENT
)
1567 WARN ((0, 0, _("%s: File removed before we read it"),
1568 quotearg_colon (p
)));
1577 const char *tag_file_name
;
1578 ensure_slash (&st
->orig_file_name
);
1579 ensure_slash (&st
->file_name
);
1581 if (check_exclusion_tags (st
->orig_file_name
, &tag_file_name
)
1582 == exclusion_tag_all
)
1584 exclusion_tag_warning (st
->orig_file_name
, tag_file_name
,
1585 _("directory not dumped"));
1589 ok
= dump_dir (fd
, st
, top_level
, parent_device
);
1591 /* dump_dir consumes FD if successful. */
1597 enum dump_status status
;
1599 if (fd
!= -1 && sparse_option
&& ST_IS_SPARSE (st
->stat
))
1601 status
= sparse_dump_file (fd
, st
);
1602 if (status
== dump_status_not_implemented
)
1603 status
= dump_regular_file (fd
, st
);
1606 status
= dump_regular_file (fd
, st
);
1610 case dump_status_ok
:
1611 case dump_status_short
:
1615 case dump_status_fail
:
1618 case dump_status_not_implemented
:
1622 file_count_links (st
);
1624 ok
= status
== dump_status_ok
;
1629 /* If possible, reopen a directory if we are preserving
1630 atimes, so that we can set just the atime on systems with
1632 if (fd
< 0 && is_dir
1633 && atime_preserve_option
== replace_atime_preserve
)
1634 fd
= open (p
, O_RDONLY
| O_BINARY
| O_DIRECTORY
| O_NONBLOCK
);
1637 ? deref_stat (dereference_option
, p
, &final_stat
)
1638 : fstat (fd
, &final_stat
))
1648 if ((timespec_cmp (get_stat_ctime (&final_stat
), original_ctime
) != 0
1649 /* Original ctime will change if the file is a directory and
1650 --remove-files is given */
1651 && !(remove_files_option
&& is_dir
))
1652 || original_size
< final_stat
.st_size
)
1654 WARN ((0, 0, _("%s: file changed as we read it"),
1655 quotearg_colon (p
)));
1656 if (exit_status
== TAREXIT_SUCCESS
)
1657 exit_status
= TAREXIT_DIFFERS
;
1659 else if (atime_preserve_option
== replace_atime_preserve
1660 && set_file_atime (fd
, p
, restore_times
) != 0)
1664 if (0 <= fd
&& close (fd
) != 0)
1670 if (ok
&& remove_files_option
)
1674 if (rmdir (p
) != 0 && errno
!= ENOTEMPTY
)
1679 if (unlink (p
) != 0)
1686 #ifdef HAVE_READLINK
1687 else if (S_ISLNK (st
->stat
.st_mode
))
1691 size_t linklen
= st
->stat
.st_size
;
1692 if (linklen
!= st
->stat
.st_size
|| linklen
+ 1 == 0)
1694 buffer
= (char *) alloca (linklen
+ 1);
1695 size
= readlink (p
, buffer
, linklen
+ 1);
1701 buffer
[size
] = '\0';
1702 assign_string (&st
->link_name
, buffer
);
1703 if (NAME_FIELD_SIZE
- (archive_format
== OLDGNU_FORMAT
) < size
)
1704 write_long_link (st
);
1706 block_ordinal
= current_block_ordinal ();
1707 st
->stat
.st_size
= 0; /* force 0 size on symlink */
1708 header
= start_header (st
);
1711 tar_copy_str (header
->header
.linkname
, buffer
, NAME_FIELD_SIZE
);
1712 header
->header
.typeflag
= SYMTYPE
;
1713 finish_header (st
, header
, block_ordinal
);
1714 /* nothing more to do to it */
1716 if (remove_files_option
)
1718 if (unlink (p
) == -1)
1721 file_count_links (st
);
1725 else if (S_ISCHR (st
->stat
.st_mode
))
1727 else if (S_ISBLK (st
->stat
.st_mode
))
1729 else if (S_ISFIFO (st
->stat
.st_mode
))
1731 else if (S_ISSOCK (st
->stat
.st_mode
))
1733 WARN ((0, 0, _("%s: socket ignored"), quotearg_colon (p
)));
1736 else if (S_ISDOOR (st
->stat
.st_mode
))
1738 WARN ((0, 0, _("%s: door ignored"), quotearg_colon (p
)));
1743 unknown_file_error (p
);
1747 if (archive_format
== V7_FORMAT
)
1749 unknown_file_error (p
);
1753 block_ordinal
= current_block_ordinal ();
1754 st
->stat
.st_size
= 0; /* force 0 size */
1755 header
= start_header (st
);
1758 header
->header
.typeflag
= type
;
1760 if (type
!= FIFOTYPE
)
1762 MAJOR_TO_CHARS (major (st
->stat
.st_rdev
),
1763 header
->header
.devmajor
);
1764 MINOR_TO_CHARS (minor (st
->stat
.st_rdev
),
1765 header
->header
.devminor
);
1768 finish_header (st
, header
, block_ordinal
);
1769 if (remove_files_option
)
1771 if (unlink (p
) == -1)
1777 dump_file (const char *p
, int top_level
, dev_t parent_device
)
1779 struct tar_stat_info st
;
1780 tar_stat_init (&st
);
1781 dump_file0 (&st
, p
, top_level
, parent_device
);
1782 if (listed_incremental_option
)
1783 update_parent_directory (p
);
1784 tar_stat_destroy (&st
);