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 (extended_header
.buffer
|| extended_header
.stk
== NULL
)
717 xheader_finish (&extended_header
);
718 memcpy (hp
.buffer
, old_header
, sizeof (hp
));
722 p
= xheader_ghdr_name ();
727 p
= xheader_xhdr_name (st
);
729 xheader_write (type
, p
, &extended_header
);
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. */
1199 for (entry
= directory
; (entry_len
= strlen (entry
)) != 0;
1200 entry
+= entry_len
+ 1)
1202 if (name_size
< name_len
+ entry_len
)
1204 name_size
= name_len
+ entry_len
;
1205 name_buf
= xrealloc (name_buf
, name_size
+ 1);
1207 strcpy (name_buf
+ name_len
, entry
);
1208 if (!excluded_name (name_buf
))
1209 dump_file (name_buf
, 0, our_device
);
1216 case exclusion_tag_contents
:
1217 exclusion_tag_warning (st
->orig_file_name
, tag_file_name
,
1218 _("contents not dumped"));
1219 name_size
= strlen (st
->orig_file_name
) + strlen (tag_file_name
) + 1;
1220 name_buf
= xmalloc (name_size
);
1221 strcpy (name_buf
, st
->orig_file_name
);
1222 strcat (name_buf
, tag_file_name
);
1223 dump_file (name_buf
, 0, our_device
);
1227 case exclusion_tag_under
:
1228 exclusion_tag_warning (st
->orig_file_name
, tag_file_name
,
1229 _("contents not dumped"));
1235 /* Ensure exactly one trailing slash. */
1237 ensure_slash (char **pstr
)
1239 size_t len
= strlen (*pstr
);
1240 while (len
>= 1 && ISSLASH ((*pstr
)[len
- 1]))
1242 if (!ISSLASH ((*pstr
)[len
]))
1243 *pstr
= xrealloc (*pstr
, len
+ 2);
1244 (*pstr
)[len
++] = '/';
1245 (*pstr
)[len
] = '\0';
1249 dump_dir (int fd
, struct tar_stat_info
*st
, int top_level
, dev_t parent_device
)
1251 char *directory
= fdsavedir (fd
);
1254 savedir_diag (st
->orig_file_name
);
1258 dump_dir0 (directory
, st
, top_level
, parent_device
);
1265 /* Main functions of this module. */
1268 create_archive (void)
1272 open_archive (ACCESS_WRITE
);
1273 xheader_write_global ();
1275 if (incremental_option
)
1277 size_t buffer_size
= 1000;
1278 char *buffer
= xmalloc (buffer_size
);
1281 collect_and_sort_names ();
1283 while ((p
= name_from_list ()) != NULL
)
1284 if (!excluded_name (p
))
1285 dump_file (p
, -1, (dev_t
) 0);
1288 while ((p
= name_from_list ()) != NULL
)
1289 if (!excluded_name (p
))
1291 size_t plen
= strlen (p
);
1292 if (buffer_size
<= plen
)
1294 while ((buffer_size
*= 2) <= plen
)
1296 buffer
= xrealloc (buffer
, buffer_size
);
1298 memcpy (buffer
, p
, plen
);
1299 if (! ISSLASH (buffer
[plen
- 1]))
1300 buffer
[plen
++] = '/';
1301 q
= gnu_list_name
->dir_contents
;
1305 size_t qlen
= strlen (q
);
1308 if (buffer_size
< plen
+ qlen
)
1310 while ((buffer_size
*=2 ) < plen
+ qlen
)
1312 buffer
= xrealloc (buffer
, buffer_size
);
1314 strcpy (buffer
+ plen
, q
+ 1);
1315 dump_file (buffer
, -1, (dev_t
) 0);
1324 while ((p
= name_next (1)) != NULL
)
1325 if (!excluded_name (p
))
1326 dump_file (p
, 1, (dev_t
) 0);
1332 if (listed_incremental_option
)
1333 write_directory_file ();
1337 /* Calculate the hash of a link. */
1339 hash_link (void const *entry
, size_t n_buckets
)
1341 struct link
const *l
= entry
;
1342 uintmax_t num
= l
->dev
^ l
->ino
;
1343 return num
% n_buckets
;
1346 /* Compare two links for equality. */
1348 compare_links (void const *entry1
, void const *entry2
)
1350 struct link
const *link1
= entry1
;
1351 struct link
const *link2
= entry2
;
1352 return ((link1
->dev
^ link2
->dev
) | (link1
->ino
^ link2
->ino
)) == 0;
1356 unknown_file_error (char const *p
)
1358 WARN ((0, 0, _("%s: Unknown file type; file ignored"),
1359 quotearg_colon (p
)));
1360 if (!ignore_failed_read_option
)
1361 exit_status
= TAREXIT_FAILURE
;
1365 /* Handling of hard links */
1367 /* Table of all non-directories that we've written so far. Any time
1368 we see another, we check the table and avoid dumping the data
1369 again if we've done it once already. */
1370 static Hash_table
*link_table
;
1372 /* Try to dump stat as a hard link to another file in the archive.
1373 Return true if successful. */
1375 dump_hard_link (struct tar_stat_info
*st
)
1377 if (link_table
&& st
->stat
.st_nlink
> 1)
1380 struct link
*duplicate
;
1381 off_t block_ordinal
;
1384 lp
.ino
= st
->stat
.st_ino
;
1385 lp
.dev
= st
->stat
.st_dev
;
1387 if ((duplicate
= hash_lookup (link_table
, &lp
)))
1389 /* We found a link. */
1390 char const *link_name
= safer_name_suffix (duplicate
->name
, true,
1391 absolute_names_option
);
1395 block_ordinal
= current_block_ordinal ();
1396 assign_string (&st
->link_name
, link_name
);
1397 if (NAME_FIELD_SIZE
- (archive_format
== OLDGNU_FORMAT
)
1398 < strlen (link_name
))
1399 write_long_link (st
);
1401 st
->stat
.st_size
= 0;
1402 blk
= start_header (st
);
1405 tar_copy_str (blk
->header
.linkname
, link_name
, NAME_FIELD_SIZE
);
1407 blk
->header
.typeflag
= LNKTYPE
;
1408 finish_header (st
, blk
, block_ordinal
);
1410 if (remove_files_option
&& unlink (st
->orig_file_name
) != 0)
1411 unlink_error (st
->orig_file_name
);
1420 file_count_links (struct tar_stat_info
*st
)
1422 if (st
->stat
.st_nlink
> 1)
1424 struct link
*duplicate
;
1425 struct link
*lp
= xmalloc (offsetof (struct link
, name
)
1426 + strlen (st
->orig_file_name
) + 1);
1427 lp
->ino
= st
->stat
.st_ino
;
1428 lp
->dev
= st
->stat
.st_dev
;
1429 lp
->nlink
= st
->stat
.st_nlink
;
1430 strcpy (lp
->name
, st
->orig_file_name
);
1433 || (link_table
= hash_initialize (0, 0, hash_link
,
1435 && (duplicate
= hash_insert (link_table
, lp
))))
1438 if (duplicate
!= lp
)
1444 /* For each dumped file, check if all its links were dumped. Emit
1445 warnings if it is not so. */
1454 for (lp
= hash_get_first (link_table
); lp
;
1455 lp
= hash_get_next (link_table
, lp
))
1459 WARN ((0, 0, _("Missing links to %s.\n"), quote (lp
->name
)));
1465 /* Dump a single file, recursing on directories. P is the file name
1466 to dump. TOP_LEVEL tells whether this is a top-level call; zero
1467 means no, positive means yes, and negative means the top level
1468 of an incremental dump. PARENT_DEVICE is the device of P's
1469 parent directory; it is examined only if TOP_LEVEL is zero. */
1471 /* FIXME: One should make sure that for *every* path leading to setting
1472 exit_status to failure, a clear diagnostic has been issued. */
1475 dump_file0 (struct tar_stat_info
*st
, const char *p
,
1476 int top_level
, dev_t parent_device
)
1478 union block
*header
;
1480 off_t original_size
;
1481 struct timespec original_ctime
;
1482 struct timespec restore_times
[2];
1483 off_t block_ordinal
= -1;
1486 if (interactive_option
&& !confirm ("add", p
))
1489 assign_string (&st
->orig_file_name
, p
);
1490 assign_string (&st
->file_name
,
1491 safer_name_suffix (p
, false, absolute_names_option
));
1493 transform_name (&st
->file_name
);
1495 if (deref_stat (dereference_option
, p
, &st
->stat
) != 0)
1500 st
->archive_file_size
= original_size
= st
->stat
.st_size
;
1501 st
->atime
= restore_times
[0] = get_stat_atime (&st
->stat
);
1502 st
->mtime
= restore_times
[1] = get_stat_mtime (&st
->stat
);
1503 st
->ctime
= original_ctime
= get_stat_ctime (&st
->stat
);
1506 if (S_ISHIDDEN (st
->stat
.st_mode
))
1508 char *new = (char *) alloca (strlen (p
) + 2);
1518 /* See if we want only new files, and check if this one is too old to
1521 This check is omitted if incremental_option is set *and* the
1522 requested file is not explicitely listed in the command line. */
1524 if (!(incremental_option
&& !is_individual_file (p
))
1525 && !S_ISDIR (st
->stat
.st_mode
)
1526 && OLDER_TAR_STAT_TIME (*st
, m
)
1527 && (!after_date_option
|| OLDER_TAR_STAT_TIME (*st
, c
)))
1529 if (!incremental_option
&& verbose_option
)
1530 WARN ((0, 0, _("%s: file is unchanged; not dumped"),
1531 quotearg_colon (p
)));
1535 /* See if we are trying to dump the archive. */
1536 if (sys_file_is_archive (st
))
1538 WARN ((0, 0, _("%s: file is the archive; not dumped"),
1539 quotearg_colon (p
)));
1543 if (is_avoided_name (p
))
1546 is_dir
= S_ISDIR (st
->stat
.st_mode
) != 0;
1548 if (!is_dir
&& dump_hard_link (st
))
1551 if (is_dir
|| S_ISREG (st
->stat
.st_mode
) || S_ISCTG (st
->stat
.st_mode
))
1555 struct stat final_stat
;
1557 if (is_dir
|| file_dumpable_p (st
))
1560 (O_RDONLY
| O_BINARY
1561 | (is_dir
? O_DIRECTORY
| O_NONBLOCK
: 0)
1562 | (atime_preserve_option
== system_atime_preserve
1567 if (!top_level
&& errno
== ENOENT
)
1568 WARN ((0, 0, _("%s: File removed before we read it"),
1569 quotearg_colon (p
)));
1578 const char *tag_file_name
;
1579 ensure_slash (&st
->orig_file_name
);
1580 ensure_slash (&st
->file_name
);
1582 if (check_exclusion_tags (st
->orig_file_name
, &tag_file_name
)
1583 == exclusion_tag_all
)
1585 exclusion_tag_warning (st
->orig_file_name
, tag_file_name
,
1586 _("directory not dumped"));
1590 ok
= dump_dir (fd
, st
, top_level
, parent_device
);
1592 /* dump_dir consumes FD if successful. */
1598 enum dump_status status
;
1600 if (fd
!= -1 && sparse_option
&& ST_IS_SPARSE (st
->stat
))
1602 status
= sparse_dump_file (fd
, st
);
1603 if (status
== dump_status_not_implemented
)
1604 status
= dump_regular_file (fd
, st
);
1607 status
= dump_regular_file (fd
, st
);
1611 case dump_status_ok
:
1612 case dump_status_short
:
1616 case dump_status_fail
:
1619 case dump_status_not_implemented
:
1623 file_count_links (st
);
1625 ok
= status
== dump_status_ok
;
1630 /* If possible, reopen a directory if we are preserving
1631 atimes, so that we can set just the atime on systems with
1633 if (fd
< 0 && is_dir
1634 && atime_preserve_option
== replace_atime_preserve
)
1635 fd
= open (p
, O_RDONLY
| O_BINARY
| O_DIRECTORY
| O_NONBLOCK
);
1638 ? deref_stat (dereference_option
, p
, &final_stat
)
1639 : fstat (fd
, &final_stat
))
1649 if (timespec_cmp (get_stat_ctime (&final_stat
), original_ctime
) != 0
1650 || original_size
< final_stat
.st_size
)
1652 WARN ((0, 0, _("%s: file changed as we read it"),
1653 quotearg_colon (p
)));
1654 if (exit_status
== TAREXIT_SUCCESS
)
1655 exit_status
= TAREXIT_DIFFERS
;
1657 else if (atime_preserve_option
== replace_atime_preserve
1658 && set_file_atime (fd
, p
, restore_times
) != 0)
1662 if (0 <= fd
&& close (fd
) != 0)
1668 if (ok
&& remove_files_option
)
1672 if (rmdir (p
) != 0 && errno
!= ENOTEMPTY
)
1677 if (unlink (p
) != 0)
1684 #ifdef HAVE_READLINK
1685 else if (S_ISLNK (st
->stat
.st_mode
))
1689 size_t linklen
= st
->stat
.st_size
;
1690 if (linklen
!= st
->stat
.st_size
|| linklen
+ 1 == 0)
1692 buffer
= (char *) alloca (linklen
+ 1);
1693 size
= readlink (p
, buffer
, linklen
+ 1);
1699 buffer
[size
] = '\0';
1700 assign_string (&st
->link_name
, buffer
);
1701 if (NAME_FIELD_SIZE
- (archive_format
== OLDGNU_FORMAT
) < size
)
1702 write_long_link (st
);
1704 block_ordinal
= current_block_ordinal ();
1705 st
->stat
.st_size
= 0; /* force 0 size on symlink */
1706 header
= start_header (st
);
1709 tar_copy_str (header
->header
.linkname
, buffer
, NAME_FIELD_SIZE
);
1710 header
->header
.typeflag
= SYMTYPE
;
1711 finish_header (st
, header
, block_ordinal
);
1712 /* nothing more to do to it */
1714 if (remove_files_option
)
1716 if (unlink (p
) == -1)
1719 file_count_links (st
);
1723 else if (S_ISCHR (st
->stat
.st_mode
))
1725 else if (S_ISBLK (st
->stat
.st_mode
))
1727 else if (S_ISFIFO (st
->stat
.st_mode
))
1729 else if (S_ISSOCK (st
->stat
.st_mode
))
1731 WARN ((0, 0, _("%s: socket ignored"), quotearg_colon (p
)));
1734 else if (S_ISDOOR (st
->stat
.st_mode
))
1736 WARN ((0, 0, _("%s: door ignored"), quotearg_colon (p
)));
1741 unknown_file_error (p
);
1745 if (archive_format
== V7_FORMAT
)
1747 unknown_file_error (p
);
1751 block_ordinal
= current_block_ordinal ();
1752 st
->stat
.st_size
= 0; /* force 0 size */
1753 header
= start_header (st
);
1756 header
->header
.typeflag
= type
;
1758 if (type
!= FIFOTYPE
)
1760 MAJOR_TO_CHARS (major (st
->stat
.st_rdev
),
1761 header
->header
.devmajor
);
1762 MINOR_TO_CHARS (minor (st
->stat
.st_rdev
),
1763 header
->header
.devminor
);
1766 finish_header (st
, header
, block_ordinal
);
1767 if (remove_files_option
)
1769 if (unlink (p
) == -1)
1775 dump_file (const char *p
, int top_level
, dev_t parent_device
)
1777 struct tar_stat_info st
;
1778 tar_stat_init (&st
);
1779 dump_file0 (&st
, p
, top_level
, parent_device
);
1780 if (listed_incremental_option
)
1781 update_parent_directory (p
);
1782 tar_stat_destroy (&st
);