1 /* Create a tar archive.
3 Copyright (C) 1985, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
4 2003, 2004, 2005, 2006 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. */
37 /* The maximum uintmax_t value that can be represented with DIGITS digits,
38 assuming that each digit is BITS_PER_DIGIT wide. */
39 #define MAX_VAL_WITH_DIGITS(digits, bits_per_digit) \
40 ((digits) * (bits_per_digit) < sizeof (uintmax_t) * CHAR_BIT \
41 ? ((uintmax_t) 1 << ((digits) * (bits_per_digit))) - 1 \
44 /* The maximum uintmax_t value that can be represented with octal
45 digits and a trailing NUL in BUFFER. */
46 #define MAX_OCTAL_VAL(buffer) MAX_VAL_WITH_DIGITS (sizeof (buffer) - 1, LG_8)
48 /* Convert VALUE to an octal representation suitable for tar headers.
49 Output to buffer WHERE with size SIZE.
50 The result is undefined if SIZE is 0 or if VALUE is too large to fit. */
53 to_octal (uintmax_t value
, char *where
, size_t size
)
60 where
[--i
] = '0' + (v
& ((1 << LG_8
) - 1));
66 /* Copy at most LEN bytes from the string SRC to DST. Terminate with
67 NUL unless SRC is LEN or more bytes long. */
70 tar_copy_str (char *dst
, const char *src
, size_t len
)
73 for (i
= 0; i
< len
; i
++)
74 if (! (dst
[i
] = src
[i
]))
78 /* Same as tar_copy_str, but always terminate with NUL if using
82 tar_name_copy_str (char *dst
, const char *src
, size_t len
)
84 tar_copy_str (dst
, src
, len
);
85 if (archive_format
== OLDGNU_FORMAT
)
89 /* Convert NEGATIVE VALUE to a base-256 representation suitable for
90 tar headers. NEGATIVE is 1 if VALUE was negative before being cast
91 to uintmax_t, 0 otherwise. Output to buffer WHERE with size SIZE.
92 The result is undefined if SIZE is 0 or if VALUE is too large to
96 to_base256 (int negative
, uintmax_t value
, char *where
, size_t size
)
99 uintmax_t propagated_sign_bits
=
100 ((uintmax_t) - negative
<< (CHAR_BIT
* sizeof v
- LG_256
));
105 where
[--i
] = v
& ((1 << LG_256
) - 1);
106 v
= propagated_sign_bits
| (v
>> LG_256
);
113 to_chars (int negative
, uintmax_t value
, size_t valsize
,
114 uintmax_t (*substitute
) (int *),
115 char *where
, size_t size
, const char *type
);
118 to_chars_subst (int negative
, int gnu_format
, uintmax_t value
, size_t valsize
,
119 uintmax_t (*substitute
) (int *),
120 char *where
, size_t size
, const char *type
)
122 uintmax_t maxval
= (gnu_format
123 ? MAX_VAL_WITH_DIGITS (size
- 1, LG_256
)
124 : MAX_VAL_WITH_DIGITS (size
- 1, LG_8
));
125 char valbuf
[UINTMAX_STRSIZE_BOUND
+ 1];
126 char maxbuf
[UINTMAX_STRSIZE_BOUND
];
127 char minbuf
[UINTMAX_STRSIZE_BOUND
+ 1];
128 char const *minval_string
;
129 char const *maxval_string
= STRINGIFY_BIGINT (maxval
, maxbuf
);
130 char const *value_string
;
134 uintmax_t m
= maxval
+ 1 ? maxval
+ 1 : maxval
/ 2 + 1;
135 char *p
= STRINGIFY_BIGINT (m
, minbuf
+ 1);
144 char *p
= STRINGIFY_BIGINT (- value
, valbuf
+ 1);
149 value_string
= STRINGIFY_BIGINT (value
, valbuf
);
154 uintmax_t sub
= substitute (&negsub
) & maxval
;
155 /* NOTE: This is one of the few places where GNU_FORMAT differs from
156 OLDGNU_FORMAT. The actual differences are:
158 1. In OLDGNU_FORMAT all strings in a tar header end in \0
159 2. Incremental archives use oldgnu_header.
161 Apart from this they are completely identical. */
162 uintmax_t s
= (negsub
&= archive_format
== GNU_FORMAT
) ? - sub
: sub
;
163 char subbuf
[UINTMAX_STRSIZE_BOUND
+ 1];
164 char *sub_string
= STRINGIFY_BIGINT (s
, subbuf
+ 1);
167 WARN ((0, 0, _("value %s out of %s range %s..%s; substituting %s"),
168 value_string
, type
, minval_string
, maxval_string
,
170 return to_chars (negsub
, s
, valsize
, 0, where
, size
, type
);
173 ERROR ((0, 0, _("value %s out of %s range %s..%s"),
174 value_string
, type
, minval_string
, maxval_string
));
178 /* Convert NEGATIVE VALUE (which was originally of size VALSIZE) to
179 external form, using SUBSTITUTE (...) if VALUE won't fit. Output
180 to buffer WHERE with size SIZE. NEGATIVE is 1 iff VALUE was
181 negative before being cast to uintmax_t; its original bitpattern
182 can be deduced from VALSIZE, its original size before casting.
183 TYPE is the kind of value being output (useful for diagnostics).
184 Prefer the POSIX format of SIZE - 1 octal digits (with leading zero
185 digits), followed by '\0'. If this won't work, and if GNU or
186 OLDGNU format is allowed, use '\200' followed by base-256, or (if
187 NEGATIVE is nonzero) '\377' followed by two's complement base-256.
188 If neither format works, use SUBSTITUTE (...) instead. Pass to
189 SUBSTITUTE the address of an 0-or-1 flag recording whether the
190 substitute value is negative. */
193 to_chars (int negative
, uintmax_t value
, size_t valsize
,
194 uintmax_t (*substitute
) (int *),
195 char *where
, size_t size
, const char *type
)
197 int gnu_format
= (archive_format
== GNU_FORMAT
198 || archive_format
== OLDGNU_FORMAT
);
200 /* Generate the POSIX octal representation if the number fits. */
201 if (! negative
&& value
<= MAX_VAL_WITH_DIGITS (size
- 1, LG_8
))
203 where
[size
- 1] = '\0';
204 to_octal (value
, where
, size
- 1);
209 /* Try to cope with the number by using traditional GNU format
212 /* Generate the base-256 representation if the number fits. */
213 if (((negative
? -1 - value
: value
)
214 <= MAX_VAL_WITH_DIGITS (size
- 1, LG_256
)))
216 where
[0] = negative
? -1 : 1 << (LG_256
- 1);
217 to_base256 (negative
, value
, where
+ 1, size
- 1);
221 /* Otherwise, if the number is negative, and if it would not cause
222 ambiguity on this host by confusing positive with negative
223 values, then generate the POSIX octal representation of the value
224 modulo 2**(field bits). The resulting tar file is
225 machine-dependent, since it depends on the host word size. Yuck!
226 But this is the traditional behavior. */
227 else if (negative
&& valsize
* CHAR_BIT
<= (size
- 1) * LG_8
)
229 static int warned_once
;
233 WARN ((0, 0, _("Generating negative octal headers")));
235 where
[size
- 1] = '\0';
236 to_octal (value
& MAX_VAL_WITH_DIGITS (valsize
* CHAR_BIT
, 1),
240 /* Otherwise fall back to substitution, if possible: */
243 substitute
= NULL
; /* No substitution for formats, other than GNU */
245 return to_chars_subst (negative
, gnu_format
, value
, valsize
, substitute
,
250 gid_substitute (int *negative
)
256 static gid_t gid_nobody
;
257 if (!gid_nobody
&& !gname_to_gid ("nobody", &gid_nobody
))
266 gid_to_chars (gid_t v
, char *p
, size_t s
)
268 return to_chars (v
< 0, (uintmax_t) v
, sizeof v
, gid_substitute
, p
, s
, "gid_t");
272 major_to_chars (major_t v
, char *p
, size_t s
)
274 return to_chars (v
< 0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "major_t");
278 minor_to_chars (minor_t v
, char *p
, size_t s
)
280 return to_chars (v
< 0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "minor_t");
284 mode_to_chars (mode_t v
, char *p
, size_t s
)
286 /* In the common case where the internal and external mode bits are the same,
287 and we are not using POSIX or GNU format,
288 propagate all unknown bits to the external mode.
289 This matches historical practice.
290 Otherwise, just copy the bits we know about. */
293 if (S_ISUID
== TSUID
&& S_ISGID
== TSGID
&& S_ISVTX
== TSVTX
294 && S_IRUSR
== TUREAD
&& S_IWUSR
== TUWRITE
&& S_IXUSR
== TUEXEC
295 && S_IRGRP
== TGREAD
&& S_IWGRP
== TGWRITE
&& S_IXGRP
== TGEXEC
296 && S_IROTH
== TOREAD
&& S_IWOTH
== TOWRITE
&& S_IXOTH
== TOEXEC
297 && archive_format
!= POSIX_FORMAT
298 && archive_format
!= USTAR_FORMAT
299 && archive_format
!= GNU_FORMAT
300 && archive_format
!= OLDGNU_FORMAT
)
308 u
= ((v
& S_ISUID
? TSUID
: 0)
309 | (v
& S_ISGID
? TSGID
: 0)
310 | (v
& S_ISVTX
? TSVTX
: 0)
311 | (v
& S_IRUSR
? TUREAD
: 0)
312 | (v
& S_IWUSR
? TUWRITE
: 0)
313 | (v
& S_IXUSR
? TUEXEC
: 0)
314 | (v
& S_IRGRP
? TGREAD
: 0)
315 | (v
& S_IWGRP
? TGWRITE
: 0)
316 | (v
& S_IXGRP
? TGEXEC
: 0)
317 | (v
& S_IROTH
? TOREAD
: 0)
318 | (v
& S_IWOTH
? TOWRITE
: 0)
319 | (v
& S_IXOTH
? TOEXEC
: 0));
321 return to_chars (negative
, u
, sizeof v
, 0, p
, s
, "mode_t");
325 off_to_chars (off_t v
, char *p
, size_t s
)
327 return to_chars (v
< 0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "off_t");
331 size_to_chars (size_t v
, char *p
, size_t s
)
333 return to_chars (0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "size_t");
337 time_to_chars (time_t v
, char *p
, size_t s
)
339 return to_chars (v
< 0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "time_t");
343 uid_substitute (int *negative
)
349 static uid_t uid_nobody
;
350 if (!uid_nobody
&& !uname_to_uid ("nobody", &uid_nobody
))
359 uid_to_chars (uid_t v
, char *p
, size_t s
)
361 return to_chars (v
< 0, (uintmax_t) v
, sizeof v
, uid_substitute
, p
, s
, "uid_t");
365 uintmax_to_chars (uintmax_t v
, char *p
, size_t s
)
367 return to_chars (0, v
, sizeof v
, 0, p
, s
, "uintmax_t");
371 string_to_chars (char const *str
, char *p
, size_t s
)
373 tar_copy_str (p
, str
, s
);
378 /* A file is considered dumpable if it is sparse and both --sparse and --totals
380 Otherwise, it is dumpable unless any of the following conditions occur:
382 a) it is empty *and* world-readable, or
383 b) current archive is /dev/null */
386 file_dumpable_p (struct tar_stat_info
*st
)
389 return totals_option
&& sparse_option
&& ST_IS_SPARSE (st
->stat
);
390 return !(st
->archive_file_size
== 0
391 && (st
->stat
.st_mode
& MODE_R
) == MODE_R
);
395 /* Writing routines. */
397 /* Write the EOT block(s). Zero at least two blocks, through the end
398 of the record. Old tar, as previous versions of GNU tar, writes
399 garbage after two zeroed blocks. */
403 union block
*pointer
= find_next_block ();
404 memset (pointer
->buffer
, 0, BLOCKSIZE
);
405 set_next_block_after (pointer
);
406 pointer
= find_next_block ();
407 memset (pointer
->buffer
, 0, available_space_after (pointer
));
408 set_next_block_after (pointer
);
411 /* Write a "private" header */
413 start_private_header (const char *name
, size_t size
)
416 union block
*header
= find_next_block ();
418 memset (header
->buffer
, 0, sizeof (union block
));
420 tar_name_copy_str (header
->header
.name
, name
, NAME_FIELD_SIZE
);
421 OFF_TO_CHARS (size
, header
->header
.size
);
424 TIME_TO_CHARS (t
, header
->header
.mtime
);
425 MODE_TO_CHARS (S_IFREG
|S_IRUSR
|S_IWUSR
|S_IRGRP
|S_IROTH
, header
->header
.mode
);
426 UID_TO_CHARS (getuid (), header
->header
.uid
);
427 GID_TO_CHARS (getgid (), header
->header
.gid
);
428 MAJOR_TO_CHARS (0, header
->header
.devmajor
);
429 MINOR_TO_CHARS (0, header
->header
.devminor
);
430 strncpy (header
->header
.magic
, TMAGIC
, TMAGLEN
);
431 strncpy (header
->header
.version
, TVERSION
, TVERSLEN
);
435 /* Create a new header and store there at most NAME_FIELD_SIZE bytes of
439 write_short_name (struct tar_stat_info
*st
)
441 union block
*header
= find_next_block ();
442 memset (header
->buffer
, 0, sizeof (union block
));
443 tar_name_copy_str (header
->header
.name
, st
->file_name
, NAME_FIELD_SIZE
);
447 #define FILL(field,byte) do { \
448 memset(field, byte, sizeof(field)-1); \
449 (field)[sizeof(field)-1] = 0; \
452 /* Write a GNUTYPE_LONGLINK or GNUTYPE_LONGNAME block. */
454 write_gnu_long_link (struct tar_stat_info
*st
, const char *p
, char type
)
456 size_t size
= strlen (p
) + 1;
461 header
= start_private_header ("././@LongLink", size
);
462 FILL(header
->header
.mtime
, '0');
463 FILL(header
->header
.mode
, '0');
464 FILL(header
->header
.uid
, '0');
465 FILL(header
->header
.gid
, '0');
466 FILL(header
->header
.devmajor
, 0);
467 FILL(header
->header
.devminor
, 0);
468 uid_to_uname (0, &tmpname
);
469 UNAME_TO_CHARS (tmpname
, header
->header
.uname
);
471 gid_to_gname (0, &tmpname
);
472 GNAME_TO_CHARS (tmpname
, header
->header
.gname
);
475 strcpy (header
->header
.magic
, OLDGNU_MAGIC
);
476 header
->header
.typeflag
= type
;
477 finish_header (st
, header
, -1);
479 header
= find_next_block ();
481 bufsize
= available_space_after (header
);
483 while (bufsize
< size
)
485 memcpy (header
->buffer
, p
, bufsize
);
488 set_next_block_after (header
+ (bufsize
- 1) / BLOCKSIZE
);
489 header
= find_next_block ();
490 bufsize
= available_space_after (header
);
492 memcpy (header
->buffer
, p
, size
);
493 memset (header
->buffer
+ size
, 0, bufsize
- size
);
494 set_next_block_after (header
+ (size
- 1) / BLOCKSIZE
);
498 split_long_name (const char *name
, size_t length
)
502 if (length
> PREFIX_FIELD_SIZE
)
503 length
= PREFIX_FIELD_SIZE
+ 1;
504 for (i
= length
- 1; i
> 0; i
--)
505 if (ISSLASH (name
[i
]))
511 write_ustar_long_name (const char *name
)
513 size_t length
= strlen (name
);
517 if (length
> PREFIX_FIELD_SIZE
+ NAME_FIELD_SIZE
+ 1)
519 ERROR ((0, 0, _("%s: file name is too long (max %d); not dumped"),
520 quotearg_colon (name
),
521 PREFIX_FIELD_SIZE
+ NAME_FIELD_SIZE
+ 1));
525 i
= split_long_name (name
, length
);
526 if (i
== 0 || length
- i
- 1 > NAME_FIELD_SIZE
)
529 _("%s: file name is too long (cannot be split); not dumped"),
530 quotearg_colon (name
)));
534 header
= find_next_block ();
535 memset (header
->buffer
, 0, sizeof (header
->buffer
));
536 memcpy (header
->header
.prefix
, name
, i
);
537 memcpy (header
->header
.name
, name
+ i
+ 1, length
- i
- 1);
542 /* Write a long link name, depending on the current archive format */
544 write_long_link (struct tar_stat_info
*st
)
546 switch (archive_format
)
549 xheader_store ("linkpath", st
, NULL
);
552 case V7_FORMAT
: /* old V7 tar format */
556 _("%s: link name is too long; not dumped"),
557 quotearg_colon (st
->link_name
)));
562 write_gnu_long_link (st
, st
->link_name
, GNUTYPE_LONGLINK
);
571 write_long_name (struct tar_stat_info
*st
)
573 switch (archive_format
)
576 xheader_store ("path", st
, NULL
);
580 if (strlen (st
->file_name
) > NAME_FIELD_SIZE
-1)
582 ERROR ((0, 0, _("%s: file name is too long (max %d); not dumped"),
583 quotearg_colon (st
->file_name
),
584 NAME_FIELD_SIZE
- 1));
591 return write_ustar_long_name (st
->file_name
);
595 write_gnu_long_link (st
, st
->file_name
, GNUTYPE_LONGNAME
);
601 return write_short_name (st
);
605 write_extended (bool global
, struct tar_stat_info
*st
, union block
*old_header
)
607 union block
*header
, hp
;
611 if (extended_header
.buffer
|| extended_header
.stk
== NULL
)
614 xheader_finish (&extended_header
);
615 memcpy (hp
.buffer
, old_header
, sizeof (hp
));
619 p
= xheader_ghdr_name ();
624 p
= xheader_xhdr_name (st
);
626 xheader_write (type
, p
, &extended_header
);
628 header
= find_next_block ();
629 memcpy (header
, &hp
.buffer
, sizeof (hp
.buffer
));
634 write_header_name (struct tar_stat_info
*st
)
636 if (archive_format
== POSIX_FORMAT
&& !string_ascii_p (st
->file_name
))
638 xheader_store ("path", st
, NULL
);
639 return write_short_name (st
);
641 else if (NAME_FIELD_SIZE
- (archive_format
== OLDGNU_FORMAT
)
642 < strlen (st
->file_name
))
643 return write_long_name (st
);
645 return write_short_name (st
);
649 /* Header handling. */
651 /* Make a header block for the file whose stat info is st,
652 and return its address. */
655 start_header (struct tar_stat_info
*st
)
659 header
= write_header_name (st
);
663 /* Override some stat fields, if requested to do so. */
665 if (owner_option
!= (uid_t
) -1)
666 st
->stat
.st_uid
= owner_option
;
667 if (group_option
!= (gid_t
) -1)
668 st
->stat
.st_gid
= group_option
;
671 ((st
->stat
.st_mode
& ~MODE_ALL
)
672 | mode_adjust (st
->stat
.st_mode
, S_ISDIR (st
->stat
.st_mode
) != 0,
673 initial_umask
, mode_option
, NULL
));
675 /* Paul Eggert tried the trivial test ($WRITER cf a b; $READER tvf a)
676 for a few tars and came up with the following interoperability
680 1 2 3 4 5 6 7 8 9 READER
681 . . . . . . . . . 1 = SunOS 4.2 tar
682 # . . # # . . # # 2 = NEC SVR4.0.2 tar
683 . . . # # . . # . 3 = Solaris 2.1 tar
684 . . . . . . . . . 4 = GNU tar 1.11.1
685 . . . . . . . . . 5 = HP-UX 8.07 tar
686 . . . . . . . . . 6 = Ultrix 4.1
687 . . . . . . . . . 7 = AIX 3.2
688 . . . . . . . . . 8 = Hitachi HI-UX 1.03
689 . . . . . . . . . 9 = Omron UNIOS-B 4.3BSD 1.60Beta
692 # = ``impossible file type''
694 The following mask for old archive removes the `#'s in column 4
695 above, thus making GNU tar both a universal donor and a universal
696 acceptor for Paul's test. */
698 if (archive_format
== V7_FORMAT
|| archive_format
== USTAR_FORMAT
)
699 MODE_TO_CHARS (st
->stat
.st_mode
& MODE_ALL
, header
->header
.mode
);
701 MODE_TO_CHARS (st
->stat
.st_mode
, header
->header
.mode
);
704 uid_t uid
= st
->stat
.st_uid
;
705 if (archive_format
== POSIX_FORMAT
706 && MAX_OCTAL_VAL (header
->header
.uid
) < uid
)
708 xheader_store ("uid", st
, NULL
);
711 if (!UID_TO_CHARS (uid
, header
->header
.uid
))
716 gid_t gid
= st
->stat
.st_gid
;
717 if (archive_format
== POSIX_FORMAT
718 && MAX_OCTAL_VAL (header
->header
.gid
) < gid
)
720 xheader_store ("gid", st
, NULL
);
723 if (!GID_TO_CHARS (gid
, header
->header
.gid
))
728 off_t size
= st
->stat
.st_size
;
729 if (archive_format
== POSIX_FORMAT
730 && MAX_OCTAL_VAL (header
->header
.size
) < size
)
732 xheader_store ("size", st
, NULL
);
735 if (!OFF_TO_CHARS (size
, header
->header
.size
))
740 struct timespec mtime
= set_mtime_option
? mtime_option
: st
->mtime
;
741 if (archive_format
== POSIX_FORMAT
)
743 if (MAX_OCTAL_VAL (header
->header
.mtime
) < mtime
.tv_sec
744 || mtime
.tv_nsec
!= 0)
745 xheader_store ("mtime", st
, NULL
);
746 if (MAX_OCTAL_VAL (header
->header
.mtime
) < mtime
.tv_sec
)
749 if (!TIME_TO_CHARS (mtime
.tv_sec
, header
->header
.mtime
))
754 if (S_ISCHR (st
->stat
.st_mode
)
755 || S_ISBLK (st
->stat
.st_mode
))
757 major_t devmajor
= major (st
->stat
.st_rdev
);
758 minor_t devminor
= minor (st
->stat
.st_rdev
);
760 if (archive_format
== POSIX_FORMAT
761 && MAX_OCTAL_VAL (header
->header
.devmajor
) < devmajor
)
763 xheader_store ("devmajor", st
, NULL
);
766 if (!MAJOR_TO_CHARS (devmajor
, header
->header
.devmajor
))
769 if (archive_format
== POSIX_FORMAT
770 && MAX_OCTAL_VAL (header
->header
.devminor
) < devminor
)
772 xheader_store ("devminor", st
, NULL
);
775 if (!MINOR_TO_CHARS (devminor
, header
->header
.devminor
))
778 else if (archive_format
!= GNU_FORMAT
&& archive_format
!= OLDGNU_FORMAT
)
780 if (!(MAJOR_TO_CHARS (0, header
->header
.devmajor
)
781 && MINOR_TO_CHARS (0, header
->header
.devminor
)))
785 if (archive_format
== POSIX_FORMAT
)
787 xheader_store ("atime", st
, NULL
);
788 xheader_store ("ctime", st
, NULL
);
790 else if (incremental_option
)
791 if (archive_format
== OLDGNU_FORMAT
|| archive_format
== GNU_FORMAT
)
793 TIME_TO_CHARS (st
->atime
.tv_sec
, header
->oldgnu_header
.atime
);
794 TIME_TO_CHARS (st
->ctime
.tv_sec
, header
->oldgnu_header
.ctime
);
797 header
->header
.typeflag
= archive_format
== V7_FORMAT
? AREGTYPE
: REGTYPE
;
799 switch (archive_format
)
805 case GNU_FORMAT
: /*FIXME?*/
806 /* Overwrite header->header.magic and header.version in one blow. */
807 strcpy (header
->header
.magic
, OLDGNU_MAGIC
);
812 strncpy (header
->header
.magic
, TMAGIC
, TMAGLEN
);
813 strncpy (header
->header
.version
, TVERSION
, TVERSLEN
);
820 if (archive_format
== V7_FORMAT
|| numeric_owner_option
)
822 /* header->header.[ug]name are left as the empty string. */
826 uid_to_uname (st
->stat
.st_uid
, &st
->uname
);
827 gid_to_gname (st
->stat
.st_gid
, &st
->gname
);
829 if (archive_format
== POSIX_FORMAT
830 && (strlen (st
->uname
) > UNAME_FIELD_SIZE
831 || !string_ascii_p (st
->uname
)))
832 xheader_store ("uname", st
, NULL
);
833 UNAME_TO_CHARS (st
->uname
, header
->header
.uname
);
835 if (archive_format
== POSIX_FORMAT
836 && (strlen (st
->gname
) > GNAME_FIELD_SIZE
837 || !string_ascii_p (st
->gname
)))
838 xheader_store ("gname", st
, NULL
);
839 GNAME_TO_CHARS (st
->gname
, header
->header
.gname
);
846 simple_finish_header (union block
*header
)
852 memcpy (header
->header
.chksum
, CHKBLANKS
, sizeof header
->header
.chksum
);
856 for (i
= sizeof *header
; i
-- != 0; )
857 /* We can't use unsigned char here because of old compilers, e.g. V7. */
860 /* Fill in the checksum field. It's formatted differently from the
861 other fields: it has [6] digits, a null, then a space -- rather than
862 digits, then a null. We use to_chars.
863 The final space is already there, from
864 checksumming, and to_chars doesn't modify it.
866 This is a fast way to do:
868 sprintf(header->header.chksum, "%6o", sum); */
870 uintmax_to_chars ((uintmax_t) sum
, header
->header
.chksum
, 7);
872 set_next_block_after (header
);
875 /* Finish off a filled-in header block and write it out. We also
876 print the file name and/or full info if verbose is on. If BLOCK_ORDINAL
877 is not negative, is the block ordinal of the first record for this
878 file, which may be a preceding long name or long link record. */
880 finish_header (struct tar_stat_info
*st
,
881 union block
*header
, off_t block_ordinal
)
883 /* Note: It is important to do this before the call to write_extended(),
884 so that the actual ustar header is printed */
886 && header
->header
.typeflag
!= GNUTYPE_LONGLINK
887 && header
->header
.typeflag
!= GNUTYPE_LONGNAME
888 && header
->header
.typeflag
!= XHDTYPE
889 && header
->header
.typeflag
!= XGLTYPE
)
891 /* These globals are parameters to print_header, sigh. */
893 current_header
= header
;
894 current_format
= archive_format
;
895 print_header (st
, block_ordinal
);
898 header
= write_extended (false, st
, header
);
899 simple_finish_header (header
);
904 pad_archive (off_t size_left
)
907 while (size_left
> 0)
909 mv_size_left (size_left
);
910 blk
= find_next_block ();
911 memset (blk
->buffer
, 0, BLOCKSIZE
);
912 set_next_block_after (blk
);
913 size_left
-= BLOCKSIZE
;
917 static enum dump_status
918 dump_regular_file (int fd
, struct tar_stat_info
*st
)
920 off_t size_left
= st
->stat
.st_size
;
924 block_ordinal
= current_block_ordinal ();
925 blk
= start_header (st
);
927 return dump_status_fail
;
929 /* Mark contiguous files, if we support them. */
930 if (archive_format
!= V7_FORMAT
&& S_ISCTG (st
->stat
.st_mode
))
931 blk
->header
.typeflag
= CONTTYPE
;
933 finish_header (st
, blk
, block_ordinal
);
936 while (size_left
> 0)
938 size_t bufsize
, count
;
940 mv_size_left (size_left
);
942 blk
= find_next_block ();
944 bufsize
= available_space_after (blk
);
946 if (size_left
< bufsize
)
948 /* Last read -- zero out area beyond. */
950 count
= bufsize
% BLOCKSIZE
;
952 memset (blk
->buffer
+ size_left
, 0, BLOCKSIZE
- count
);
955 count
= (fd
< 0) ? bufsize
: safe_read (fd
, blk
->buffer
, bufsize
);
956 if (count
== SAFE_READ_ERROR
)
958 read_diag_details (st
->orig_file_name
,
959 st
->stat
.st_size
- size_left
, bufsize
);
960 pad_archive (size_left
);
961 return dump_status_short
;
965 set_next_block_after (blk
+ (bufsize
- 1) / BLOCKSIZE
);
967 if (count
!= bufsize
)
969 char buf
[UINTMAX_STRSIZE_BOUND
];
970 memset (blk
->buffer
+ count
, 0, bufsize
- count
);
972 ngettext ("%s: File shrank by %s byte; padding with zeros",
973 "%s: File shrank by %s bytes; padding with zeros",
975 quotearg_colon (st
->orig_file_name
),
976 STRINGIFY_BIGINT (size_left
, buf
)));
977 if (! ignore_failed_read_option
)
978 exit_status
= TAREXIT_DIFFERS
;
979 pad_archive (size_left
- (bufsize
-count
));
980 return dump_status_short
;
983 return dump_status_ok
;
986 /* Look in directory DIRNAME for a cache directory tag file
987 with the magic name "CACHEDIR.TAG" and a standard header,
989 http://www.brynosaurus.com/cachedir
990 Applications can write this file into directories they create
991 for use as caches containing purely regenerable, non-precious data,
992 allowing us to avoid archiving them if --exclude-caches is specified. */
994 #define CACHEDIR_SIGNATURE "Signature: 8a477f597d28d172789f06886806bc55"
995 #define CACHEDIR_SIGNATURE_SIZE (sizeof CACHEDIR_SIGNATURE - 1)
998 check_cache_directory (char *dirname
)
1000 static char tagname
[] = "CACHEDIR.TAG";
1003 int tag_present
= false;
1005 tagpath
= xmalloc (strlen (dirname
) + strlen (tagname
) + 1);
1006 strcpy (tagpath
, dirname
);
1007 strcat (tagpath
, tagname
);
1009 fd
= open (tagpath
, O_RDONLY
);
1012 static char tagbuf
[CACHEDIR_SIGNATURE_SIZE
];
1014 if (read (fd
, tagbuf
, CACHEDIR_SIGNATURE_SIZE
)
1015 == CACHEDIR_SIGNATURE_SIZE
1016 && memcmp (tagbuf
, CACHEDIR_SIGNATURE
, CACHEDIR_SIGNATURE_SIZE
) == 0)
1028 dump_dir0 (char *directory
,
1029 struct tar_stat_info
*st
, int top_level
, dev_t parent_device
)
1031 dev_t our_device
= st
->stat
.st_dev
;
1033 if (!is_avoided_name (st
->orig_file_name
))
1035 union block
*blk
= NULL
;
1036 off_t block_ordinal
= current_block_ordinal ();
1037 st
->stat
.st_size
= 0; /* force 0 size on dir */
1039 blk
= start_header (st
);
1043 if (incremental_option
&& archive_format
!= POSIX_FORMAT
)
1044 blk
->header
.typeflag
= GNUTYPE_DUMPDIR
;
1045 else /* if (standard_option) */
1046 blk
->header
.typeflag
= DIRTYPE
;
1048 /* If we're gnudumping, we aren't done yet so don't close it. */
1050 if (!incremental_option
)
1051 finish_header (st
, blk
, block_ordinal
);
1052 else if (gnu_list_name
->dir_contents
)
1054 if (archive_format
== POSIX_FORMAT
)
1056 xheader_store ("GNU.dumpdir", st
, gnu_list_name
->dir_contents
);
1057 finish_header (st
, blk
, block_ordinal
);
1065 const char *buffer
, *p_buffer
;
1067 block_ordinal
= current_block_ordinal ();
1068 buffer
= gnu_list_name
->dir_contents
;
1070 totsize
= dumpdir_size (buffer
);
1073 OFF_TO_CHARS (totsize
, blk
->header
.size
);
1074 finish_header (st
, blk
, block_ordinal
);
1076 size_left
= totsize
;
1079 mv_total_size (totsize
);
1080 while (size_left
> 0)
1082 mv_size_left (size_left
);
1083 blk
= find_next_block ();
1084 bufsize
= available_space_after (blk
);
1085 if (size_left
< bufsize
)
1087 bufsize
= size_left
;
1088 count
= bufsize
% BLOCKSIZE
;
1090 memset (blk
->buffer
+ size_left
, 0, BLOCKSIZE
- count
);
1092 memcpy (blk
->buffer
, p_buffer
, bufsize
);
1093 size_left
-= bufsize
;
1094 p_buffer
+= bufsize
;
1095 set_next_block_after (blk
+ (bufsize
- 1) / BLOCKSIZE
);
1103 if (!recursion_option
)
1106 if (one_file_system_option
1108 && parent_device
!= st
->stat
.st_dev
)
1112 _("%s: file is on a different filesystem; not dumped"),
1113 quotearg_colon (st
->orig_file_name
)));
1117 if (exclude_caches_option
1118 && check_cache_directory(st
->orig_file_name
))
1122 _("%s: contains a cache directory tag; not dumped"),
1123 quotearg_colon (st
->orig_file_name
)));
1130 char *name_buf
= xstrdup (st
->orig_file_name
);
1131 size_t name_size
= strlen (name_buf
);
1132 size_t name_len
= name_size
;
1134 /* Now output all the files in the directory. */
1135 /* FIXME: Should speed this up by cd-ing into the dir. */
1137 for (entry
= directory
; (entry_len
= strlen (entry
)) != 0;
1138 entry
+= entry_len
+ 1)
1140 if (name_size
< name_len
+ entry_len
)
1142 name_size
= name_len
+ entry_len
;
1143 name_buf
= xrealloc (name_buf
, name_size
+ 1);
1145 strcpy (name_buf
+ name_len
, entry
);
1146 if (!excluded_name (name_buf
))
1147 dump_file (name_buf
, 0, our_device
);
1154 /* Ensure exactly one trailing slash. */
1156 ensure_slash (char **pstr
)
1158 size_t len
= strlen (*pstr
);
1159 while (len
>= 1 && ISSLASH ((*pstr
)[len
- 1]))
1161 if (!ISSLASH ((*pstr
)[len
]))
1162 *pstr
= xrealloc (*pstr
, len
+ 2);
1163 (*pstr
)[len
++] = '/';
1164 (*pstr
)[len
] = '\0';
1168 dump_dir (int fd
, struct tar_stat_info
*st
, int top_level
, dev_t parent_device
)
1170 char *directory
= fdsavedir (fd
);
1173 savedir_diag (st
->orig_file_name
);
1177 ensure_slash (&st
->orig_file_name
);
1178 ensure_slash (&st
->file_name
);
1180 dump_dir0 (directory
, st
, top_level
, parent_device
);
1187 /* Main functions of this module. */
1190 create_archive (void)
1194 open_archive (ACCESS_WRITE
);
1195 xheader_write_global ();
1197 if (incremental_option
)
1199 size_t buffer_size
= 1000;
1200 char *buffer
= xmalloc (buffer_size
);
1203 collect_and_sort_names ();
1205 while ((p
= name_from_list ()) != NULL
)
1206 if (!excluded_name (p
))
1207 dump_file (p
, -1, (dev_t
) 0);
1210 while ((p
= name_from_list ()) != NULL
)
1211 if (!excluded_name (p
))
1213 size_t plen
= strlen (p
);
1214 if (buffer_size
<= plen
)
1216 while ((buffer_size
*= 2) <= plen
)
1218 buffer
= xrealloc (buffer
, buffer_size
);
1220 memcpy (buffer
, p
, plen
);
1221 if (! ISSLASH (buffer
[plen
- 1]))
1222 buffer
[plen
++] = '/';
1223 q
= gnu_list_name
->dir_contents
;
1227 size_t qlen
= strlen (q
);
1230 if (buffer_size
< plen
+ qlen
)
1232 while ((buffer_size
*=2 ) < plen
+ qlen
)
1234 buffer
= xrealloc (buffer
, buffer_size
);
1236 strcpy (buffer
+ plen
, q
+ 1);
1237 dump_file (buffer
, -1, (dev_t
) 0);
1246 while ((p
= name_next (1)) != NULL
)
1247 if (!excluded_name (p
))
1248 dump_file (p
, 1, (dev_t
) 0);
1254 if (listed_incremental_option
)
1255 write_directory_file ();
1259 /* Calculate the hash of a link. */
1261 hash_link (void const *entry
, size_t n_buckets
)
1263 struct link
const *l
= entry
;
1264 uintmax_t num
= l
->dev
^ l
->ino
;
1265 return num
% n_buckets
;
1268 /* Compare two links for equality. */
1270 compare_links (void const *entry1
, void const *entry2
)
1272 struct link
const *link1
= entry1
;
1273 struct link
const *link2
= entry2
;
1274 return ((link1
->dev
^ link2
->dev
) | (link1
->ino
^ link2
->ino
)) == 0;
1278 unknown_file_error (char const *p
)
1280 WARN ((0, 0, _("%s: Unknown file type; file ignored"),
1281 quotearg_colon (p
)));
1282 if (!ignore_failed_read_option
)
1283 exit_status
= TAREXIT_FAILURE
;
1287 /* Handling of hard links */
1289 /* Table of all non-directories that we've written so far. Any time
1290 we see another, we check the table and avoid dumping the data
1291 again if we've done it once already. */
1292 static Hash_table
*link_table
;
1294 /* Try to dump stat as a hard link to another file in the archive.
1295 Return true if successful. */
1297 dump_hard_link (struct tar_stat_info
*st
)
1299 if (link_table
&& st
->stat
.st_nlink
> 1)
1302 struct link
*duplicate
;
1303 off_t block_ordinal
;
1306 lp
.ino
= st
->stat
.st_ino
;
1307 lp
.dev
= st
->stat
.st_dev
;
1309 if ((duplicate
= hash_lookup (link_table
, &lp
)))
1311 /* We found a link. */
1312 char const *link_name
= safer_name_suffix (duplicate
->name
, true,
1313 absolute_names_option
);
1317 block_ordinal
= current_block_ordinal ();
1318 assign_string (&st
->link_name
, link_name
);
1319 if (NAME_FIELD_SIZE
- (archive_format
== OLDGNU_FORMAT
)
1320 < strlen (link_name
))
1321 write_long_link (st
);
1323 st
->stat
.st_size
= 0;
1324 blk
= start_header (st
);
1327 tar_copy_str (blk
->header
.linkname
, link_name
, NAME_FIELD_SIZE
);
1329 blk
->header
.typeflag
= LNKTYPE
;
1330 finish_header (st
, blk
, block_ordinal
);
1332 if (remove_files_option
&& unlink (st
->orig_file_name
) != 0)
1333 unlink_error (st
->orig_file_name
);
1342 file_count_links (struct tar_stat_info
*st
)
1344 if (st
->stat
.st_nlink
> 1)
1346 struct link
*duplicate
;
1347 struct link
*lp
= xmalloc (offsetof (struct link
, name
)
1348 + strlen (st
->orig_file_name
) + 1);
1349 lp
->ino
= st
->stat
.st_ino
;
1350 lp
->dev
= st
->stat
.st_dev
;
1351 lp
->nlink
= st
->stat
.st_nlink
;
1352 strcpy (lp
->name
, st
->orig_file_name
);
1355 || (link_table
= hash_initialize (0, 0, hash_link
,
1357 && (duplicate
= hash_insert (link_table
, lp
))))
1360 if (duplicate
!= lp
)
1366 /* For each dumped file, check if all its links were dumped. Emit
1367 warnings if it is not so. */
1376 for (lp
= hash_get_first (link_table
); lp
;
1377 lp
= hash_get_next (link_table
, lp
))
1381 WARN ((0, 0, _("Missing links to %s.\n"), quote (lp
->name
)));
1387 /* Dump a single file, recursing on directories. P is the file name
1388 to dump. TOP_LEVEL tells whether this is a top-level call; zero
1389 means no, positive means yes, and negative means the top level
1390 of an incremental dump. PARENT_DEVICE is the device of P's
1391 parent directory; it is examined only if TOP_LEVEL is zero. */
1393 /* FIXME: One should make sure that for *every* path leading to setting
1394 exit_status to failure, a clear diagnostic has been issued. */
1397 dump_file0 (struct tar_stat_info
*st
, const char *p
,
1398 int top_level
, dev_t parent_device
)
1400 union block
*header
;
1402 off_t original_size
;
1403 struct timespec original_ctime
;
1404 struct timespec restore_times
[2];
1405 off_t block_ordinal
= -1;
1408 if (interactive_option
&& !confirm ("add", p
))
1411 assign_string (&st
->orig_file_name
, p
);
1412 assign_string (&st
->file_name
,
1413 safer_name_suffix (p
, false, absolute_names_option
));
1415 transform_name (&st
->file_name
);
1417 if (deref_stat (dereference_option
, p
, &st
->stat
) != 0)
1422 st
->archive_file_size
= original_size
= st
->stat
.st_size
;
1423 st
->atime
= restore_times
[0] = get_stat_atime (&st
->stat
);
1424 st
->mtime
= restore_times
[1] = get_stat_mtime (&st
->stat
);
1425 st
->ctime
= original_ctime
= get_stat_ctime (&st
->stat
);
1428 if (S_ISHIDDEN (st
->stat
.st_mode
))
1430 char *new = (char *) alloca (strlen (p
) + 2);
1440 /* See if we want only new files, and check if this one is too old to
1443 This check is omitted if incremental_option is set *and* the
1444 requested file is not explicitely listed in the command line. */
1446 if (!(incremental_option
&& !is_individual_file (p
))
1447 && !S_ISDIR (st
->stat
.st_mode
)
1448 && OLDER_TAR_STAT_TIME (*st
, m
)
1449 && (!after_date_option
|| OLDER_TAR_STAT_TIME (*st
, c
)))
1451 if (!incremental_option
&& verbose_option
)
1452 WARN ((0, 0, _("%s: file is unchanged; not dumped"),
1453 quotearg_colon (p
)));
1457 /* See if we are trying to dump the archive. */
1458 if (sys_file_is_archive (st
))
1460 WARN ((0, 0, _("%s: file is the archive; not dumped"),
1461 quotearg_colon (p
)));
1465 if (is_avoided_name (p
))
1468 is_dir
= S_ISDIR (st
->stat
.st_mode
) != 0;
1470 if (!is_dir
&& dump_hard_link (st
))
1473 if (is_dir
|| S_ISREG (st
->stat
.st_mode
) || S_ISCTG (st
->stat
.st_mode
))
1477 struct stat final_stat
;
1479 if (is_dir
|| file_dumpable_p (st
))
1482 (O_RDONLY
| O_BINARY
1483 | (is_dir
? O_DIRECTORY
| O_NONBLOCK
: 0)
1484 | (atime_preserve_option
== system_atime_preserve
1489 if (!top_level
&& errno
== ENOENT
)
1490 WARN ((0, 0, _("%s: File removed before we read it"),
1491 quotearg_colon (p
)));
1500 ok
= dump_dir (fd
, st
, top_level
, parent_device
);
1502 /* dump_dir consumes FD if successful. */
1508 enum dump_status status
;
1510 if (fd
!= -1 && sparse_option
&& ST_IS_SPARSE (st
->stat
))
1512 status
= sparse_dump_file (fd
, st
);
1513 if (status
== dump_status_not_implemented
)
1514 status
= dump_regular_file (fd
, st
);
1517 status
= dump_regular_file (fd
, st
);
1521 case dump_status_ok
:
1522 case dump_status_short
:
1526 case dump_status_fail
:
1529 case dump_status_not_implemented
:
1533 file_count_links (st
);
1535 ok
= status
== dump_status_ok
;
1540 /* If possible, reopen a directory if we are preserving
1541 atimes, so that we can set just the atime on systems with
1543 if (fd
< 0 && is_dir
1544 && atime_preserve_option
== replace_atime_preserve
)
1545 fd
= open (p
, O_RDONLY
| O_BINARY
| O_DIRECTORY
| O_NONBLOCK
);
1548 ? deref_stat (dereference_option
, p
, &final_stat
)
1549 : fstat (fd
, &final_stat
))
1559 if (timespec_cmp (get_stat_ctime (&final_stat
), original_ctime
) != 0
1560 || original_size
< final_stat
.st_size
)
1562 WARN ((0, 0, _("%s: file changed as we read it"),
1563 quotearg_colon (p
)));
1564 if (exit_status
== TAREXIT_SUCCESS
)
1565 exit_status
= TAREXIT_DIFFERS
;
1567 else if (atime_preserve_option
== replace_atime_preserve
1568 && set_file_atime (fd
, p
, restore_times
) != 0)
1572 if (0 <= fd
&& close (fd
) != 0)
1578 if (ok
&& remove_files_option
)
1582 if (rmdir (p
) != 0 && errno
!= ENOTEMPTY
)
1587 if (unlink (p
) != 0)
1594 #ifdef HAVE_READLINK
1595 else if (S_ISLNK (st
->stat
.st_mode
))
1599 size_t linklen
= st
->stat
.st_size
;
1600 if (linklen
!= st
->stat
.st_size
|| linklen
+ 1 == 0)
1602 buffer
= (char *) alloca (linklen
+ 1);
1603 size
= readlink (p
, buffer
, linklen
+ 1);
1609 buffer
[size
] = '\0';
1610 assign_string (&st
->link_name
, buffer
);
1611 if (NAME_FIELD_SIZE
- (archive_format
== OLDGNU_FORMAT
) < size
)
1612 write_long_link (st
);
1614 block_ordinal
= current_block_ordinal ();
1615 st
->stat
.st_size
= 0; /* force 0 size on symlink */
1616 header
= start_header (st
);
1619 tar_copy_str (header
->header
.linkname
, buffer
, NAME_FIELD_SIZE
);
1620 header
->header
.typeflag
= SYMTYPE
;
1621 finish_header (st
, header
, block_ordinal
);
1622 /* nothing more to do to it */
1624 if (remove_files_option
)
1626 if (unlink (p
) == -1)
1629 file_count_links (st
);
1633 else if (S_ISCHR (st
->stat
.st_mode
))
1635 else if (S_ISBLK (st
->stat
.st_mode
))
1637 else if (S_ISFIFO (st
->stat
.st_mode
))
1639 else if (S_ISSOCK (st
->stat
.st_mode
))
1641 WARN ((0, 0, _("%s: socket ignored"), quotearg_colon (p
)));
1644 else if (S_ISDOOR (st
->stat
.st_mode
))
1646 WARN ((0, 0, _("%s: door ignored"), quotearg_colon (p
)));
1651 unknown_file_error (p
);
1655 if (archive_format
== V7_FORMAT
)
1657 unknown_file_error (p
);
1661 block_ordinal
= current_block_ordinal ();
1662 st
->stat
.st_size
= 0; /* force 0 size */
1663 header
= start_header (st
);
1666 header
->header
.typeflag
= type
;
1668 if (type
!= FIFOTYPE
)
1670 MAJOR_TO_CHARS (major (st
->stat
.st_rdev
),
1671 header
->header
.devmajor
);
1672 MINOR_TO_CHARS (minor (st
->stat
.st_rdev
),
1673 header
->header
.devminor
);
1676 finish_header (st
, header
, block_ordinal
);
1677 if (remove_files_option
)
1679 if (unlink (p
) == -1)
1685 dump_file (const char *p
, int top_level
, dev_t parent_device
)
1687 struct tar_stat_info st
;
1688 tar_stat_init (&st
);
1689 dump_file0 (&st
, p
, top_level
, parent_device
);
1690 if (listed_incremental_option
)
1691 update_parent_directory (p
);
1692 tar_stat_destroy (&st
);