1 /* Create a tar archive.
3 Copyright (C) 1985, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
4 2003, 2004, 2005 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
);
111 /* Convert NEGATIVE VALUE (which was originally of size VALSIZE) to
112 external form, using SUBSTITUTE (...) if VALUE won't fit. Output
113 to buffer WHERE with size SIZE. NEGATIVE is 1 iff VALUE was
114 negative before being cast to uintmax_t; its original bitpattern
115 can be deduced from VALSIZE, its original size before casting.
116 TYPE is the kind of value being output (useful for diagnostics).
117 Prefer the POSIX format of SIZE - 1 octal digits (with leading zero
118 digits), followed by '\0'. If this won't work, and if GNU or
119 OLDGNU format is allowed, use '\200' followed by base-256, or (if
120 NEGATIVE is nonzero) '\377' followed by two's complement base-256.
121 If neither format works, use SUBSTITUTE (...) instead. Pass to
122 SUBSTITUTE the address of an 0-or-1 flag recording whether the
123 substitute value is negative. */
126 to_chars (int negative
, uintmax_t value
, size_t valsize
,
127 uintmax_t (*substitute
) (int *),
128 char *where
, size_t size
, const char *type
)
130 int base256_allowed
= (archive_format
== GNU_FORMAT
131 || archive_format
== OLDGNU_FORMAT
);
133 /* Generate the POSIX octal representation if the number fits. */
134 if (! negative
&& value
<= MAX_VAL_WITH_DIGITS (size
- 1, LG_8
))
136 where
[size
- 1] = '\0';
137 to_octal (value
, where
, size
- 1);
140 /* Otherwise, generate the base-256 representation if we are
141 generating an old or new GNU format and if the number fits. */
142 else if (((negative
? -1 - value
: value
)
143 <= MAX_VAL_WITH_DIGITS (size
- 1, LG_256
))
146 where
[0] = negative
? -1 : 1 << (LG_256
- 1);
147 to_base256 (negative
, value
, where
+ 1, size
- 1);
150 /* Otherwise, if the number is negative, and if it would not cause
151 ambiguity on this host by confusing positive with negative
152 values, then generate the POSIX octal representation of the value
153 modulo 2**(field bits). The resulting tar file is
154 machine-dependent, since it depends on the host word size. Yuck!
155 But this is the traditional behavior. */
156 else if (negative
&& valsize
* CHAR_BIT
<= (size
- 1) * LG_8
)
158 static int warned_once
;
162 WARN ((0, 0, _("Generating negative octal headers")));
164 where
[size
- 1] = '\0';
165 to_octal (value
& MAX_VAL_WITH_DIGITS (valsize
* CHAR_BIT
, 1),
169 /* Otherwise, output a substitute value if possible (with a
170 warning), and an error message if not. */
173 uintmax_t maxval
= (base256_allowed
174 ? MAX_VAL_WITH_DIGITS (size
- 1, LG_256
)
175 : MAX_VAL_WITH_DIGITS (size
- 1, LG_8
));
176 char valbuf
[UINTMAX_STRSIZE_BOUND
+ 1];
177 char maxbuf
[UINTMAX_STRSIZE_BOUND
];
178 char minbuf
[UINTMAX_STRSIZE_BOUND
+ 1];
179 char const *minval_string
;
180 char const *maxval_string
= STRINGIFY_BIGINT (maxval
, maxbuf
);
181 char const *value_string
;
185 uintmax_t m
= maxval
+ 1 ? maxval
+ 1 : maxval
/ 2 + 1;
186 char *p
= STRINGIFY_BIGINT (m
, minbuf
+ 1);
195 char *p
= STRINGIFY_BIGINT (- value
, valbuf
+ 1);
200 value_string
= STRINGIFY_BIGINT (value
, valbuf
);
205 uintmax_t sub
= substitute (&negsub
) & maxval
;
206 /* FIXME: This is the only place where GNU_FORMAT differs from
207 OLDGNU_FORMAT. Apart from this they are completely identical. */
208 uintmax_t s
= (negsub
&= archive_format
== GNU_FORMAT
) ? - sub
: sub
;
209 char subbuf
[UINTMAX_STRSIZE_BOUND
+ 1];
210 char *sub_string
= STRINGIFY_BIGINT (s
, subbuf
+ 1);
213 WARN ((0, 0, _("value %s out of %s range %s..%s; substituting %s"),
214 value_string
, type
, minval_string
, maxval_string
,
216 to_chars (negsub
, s
, valsize
, 0, where
, size
, type
);
219 ERROR ((0, 0, _("value %s out of %s range %s..%s"),
220 value_string
, type
, minval_string
, maxval_string
));
225 gid_substitute (int *negative
)
231 static gid_t gid_nobody
;
232 if (!gid_nobody
&& !gname_to_gid ("nobody", &gid_nobody
))
241 gid_to_chars (gid_t v
, char *p
, size_t s
)
243 to_chars (v
< 0, (uintmax_t) v
, sizeof v
, gid_substitute
, p
, s
, "gid_t");
247 major_to_chars (major_t v
, char *p
, size_t s
)
249 to_chars (v
< 0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "major_t");
253 minor_to_chars (minor_t v
, char *p
, size_t s
)
255 to_chars (v
< 0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "minor_t");
259 mode_to_chars (mode_t v
, char *p
, size_t s
)
261 /* In the common case where the internal and external mode bits are the same,
262 and we are not using POSIX or GNU format,
263 propagate all unknown bits to the external mode.
264 This matches historical practice.
265 Otherwise, just copy the bits we know about. */
268 if (S_ISUID
== TSUID
&& S_ISGID
== TSGID
&& S_ISVTX
== TSVTX
269 && S_IRUSR
== TUREAD
&& S_IWUSR
== TUWRITE
&& S_IXUSR
== TUEXEC
270 && S_IRGRP
== TGREAD
&& S_IWGRP
== TGWRITE
&& S_IXGRP
== TGEXEC
271 && S_IROTH
== TOREAD
&& S_IWOTH
== TOWRITE
&& S_IXOTH
== TOEXEC
272 && archive_format
!= POSIX_FORMAT
273 && archive_format
!= USTAR_FORMAT
274 && archive_format
!= GNU_FORMAT
)
282 u
= ((v
& S_ISUID
? TSUID
: 0)
283 | (v
& S_ISGID
? TSGID
: 0)
284 | (v
& S_ISVTX
? TSVTX
: 0)
285 | (v
& S_IRUSR
? TUREAD
: 0)
286 | (v
& S_IWUSR
? TUWRITE
: 0)
287 | (v
& S_IXUSR
? TUEXEC
: 0)
288 | (v
& S_IRGRP
? TGREAD
: 0)
289 | (v
& S_IWGRP
? TGWRITE
: 0)
290 | (v
& S_IXGRP
? TGEXEC
: 0)
291 | (v
& S_IROTH
? TOREAD
: 0)
292 | (v
& S_IWOTH
? TOWRITE
: 0)
293 | (v
& S_IXOTH
? TOEXEC
: 0));
295 to_chars (negative
, u
, sizeof v
, 0, p
, s
, "mode_t");
299 off_to_chars (off_t v
, char *p
, size_t s
)
301 to_chars (v
< 0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "off_t");
305 size_to_chars (size_t v
, char *p
, size_t s
)
307 to_chars (0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "size_t");
311 time_to_chars (time_t v
, char *p
, size_t s
)
313 to_chars (v
< 0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "time_t");
317 uid_substitute (int *negative
)
323 static uid_t uid_nobody
;
324 if (!uid_nobody
&& !uname_to_uid ("nobody", &uid_nobody
))
333 uid_to_chars (uid_t v
, char *p
, size_t s
)
335 to_chars (v
< 0, (uintmax_t) v
, sizeof v
, uid_substitute
, p
, s
, "uid_t");
339 uintmax_to_chars (uintmax_t v
, char *p
, size_t s
)
341 to_chars (0, v
, sizeof v
, 0, p
, s
, "uintmax_t");
345 string_to_chars (char const *str
, char *p
, size_t s
)
347 tar_copy_str (p
, str
, s
);
352 /* A file is considered dumpable if it is sparse and both --sparse and --totals
354 Otherwise, it is dumpable unless any of the following conditions occur:
356 a) it is empty *and* world-readable, or
357 b) current archive is /dev/null */
360 file_dumpable_p (struct tar_stat_info
*st
)
363 return totals_option
&& sparse_option
&& sparse_file_p (st
);
364 return !(st
->archive_file_size
== 0
365 && (st
->stat
.st_mode
& MODE_R
) == MODE_R
);
369 /* Writing routines. */
371 /* Write the EOT block(s). Zero at least two blocks, through the end
372 of the record. Old tar, as previous versions of GNU tar, writes
373 garbage after two zeroed blocks. */
377 union block
*pointer
= find_next_block ();
378 memset (pointer
->buffer
, 0, BLOCKSIZE
);
379 set_next_block_after (pointer
);
380 pointer
= find_next_block ();
381 memset (pointer
->buffer
, 0, available_space_after (pointer
));
382 set_next_block_after (pointer
);
385 /* Write a "private" header */
387 start_private_header (const char *name
, size_t size
)
390 union block
*header
= find_next_block ();
392 memset (header
->buffer
, 0, sizeof (union block
));
394 tar_name_copy_str (header
->header
.name
, name
, NAME_FIELD_SIZE
);
395 OFF_TO_CHARS (size
, header
->header
.size
);
398 TIME_TO_CHARS (t
, header
->header
.mtime
);
399 MODE_TO_CHARS (S_IFREG
|S_IRUSR
|S_IWUSR
|S_IRGRP
|S_IROTH
, header
->header
.mode
);
400 UID_TO_CHARS (getuid (), header
->header
.uid
);
401 GID_TO_CHARS (getgid (), header
->header
.gid
);
402 MAJOR_TO_CHARS (0, header
->header
.devmajor
);
403 MINOR_TO_CHARS (0, header
->header
.devminor
);
404 strncpy (header
->header
.magic
, TMAGIC
, TMAGLEN
);
405 strncpy (header
->header
.version
, TVERSION
, TVERSLEN
);
409 /* Create a new header and store there at most NAME_FIELD_SIZE bytes of
413 write_short_name (struct tar_stat_info
*st
)
415 union block
*header
= find_next_block ();
416 memset (header
->buffer
, 0, sizeof (union block
));
417 tar_name_copy_str (header
->header
.name
, st
->file_name
, NAME_FIELD_SIZE
);
421 #define FILL(field,byte) do { \
422 memset(field, byte, sizeof(field)-1); \
423 (field)[sizeof(field)-1] = 0; \
426 /* Write a GNUTYPE_LONGLINK or GNUTYPE_LONGNAME block. */
428 write_gnu_long_link (struct tar_stat_info
*st
, const char *p
, char type
)
430 size_t size
= strlen (p
) + 1;
435 header
= start_private_header ("././@LongLink", size
);
436 FILL(header
->header
.mtime
, '0');
437 FILL(header
->header
.mode
, '0');
438 FILL(header
->header
.uid
, '0');
439 FILL(header
->header
.gid
, '0');
440 FILL(header
->header
.devmajor
, 0);
441 FILL(header
->header
.devminor
, 0);
442 uid_to_uname (0, &tmpname
);
443 UNAME_TO_CHARS (tmpname
, header
->header
.uname
);
445 gid_to_gname (0, &tmpname
);
446 GNAME_TO_CHARS (tmpname
, header
->header
.gname
);
449 strcpy (header
->header
.magic
, OLDGNU_MAGIC
);
450 header
->header
.typeflag
= type
;
451 finish_header (st
, header
, -1);
453 header
= find_next_block ();
455 bufsize
= available_space_after (header
);
457 while (bufsize
< size
)
459 memcpy (header
->buffer
, p
, bufsize
);
462 set_next_block_after (header
+ (bufsize
- 1) / BLOCKSIZE
);
463 header
= find_next_block ();
464 bufsize
= available_space_after (header
);
466 memcpy (header
->buffer
, p
, size
);
467 memset (header
->buffer
+ size
, 0, bufsize
- size
);
468 set_next_block_after (header
+ (size
- 1) / BLOCKSIZE
);
472 split_long_name (const char *name
, size_t length
)
476 if (length
> PREFIX_FIELD_SIZE
)
477 length
= PREFIX_FIELD_SIZE
+2;
478 for (i
= length
- 1; i
> 0; i
--)
479 if (ISSLASH (name
[i
]))
485 write_ustar_long_name (const char *name
)
487 size_t length
= strlen (name
);
491 if (length
> PREFIX_FIELD_SIZE
+ NAME_FIELD_SIZE
+ 1)
493 ERROR ((0, 0, _("%s: file name is too long (max %d); not dumped"),
494 quotearg_colon (name
),
495 PREFIX_FIELD_SIZE
+ NAME_FIELD_SIZE
+ 1));
499 i
= split_long_name (name
, length
);
500 if (i
== 0 || length
- i
- 1 > NAME_FIELD_SIZE
)
503 _("%s: file name is too long (cannot be split); not dumped"),
504 quotearg_colon (name
)));
508 header
= find_next_block ();
509 memset (header
->buffer
, 0, sizeof (header
->buffer
));
510 memcpy (header
->header
.prefix
, name
, i
);
511 memcpy (header
->header
.name
, name
+ i
+ 1, length
- i
- 1);
516 /* Write a long link name, depending on the current archive format */
518 write_long_link (struct tar_stat_info
*st
)
520 switch (archive_format
)
523 xheader_store ("linkpath", st
, NULL
);
526 case V7_FORMAT
: /* old V7 tar format */
530 _("%s: link name is too long; not dumped"),
531 quotearg_colon (st
->link_name
)));
536 write_gnu_long_link (st
, st
->link_name
, GNUTYPE_LONGLINK
);
545 write_long_name (struct tar_stat_info
*st
)
547 switch (archive_format
)
550 xheader_store ("path", st
, NULL
);
554 if (strlen (st
->file_name
) > NAME_FIELD_SIZE
-1)
556 ERROR ((0, 0, _("%s: file name is too long (max %d); not dumped"),
557 quotearg_colon (st
->file_name
),
558 NAME_FIELD_SIZE
- 1));
565 return write_ustar_long_name (st
->file_name
);
569 write_gnu_long_link (st
, st
->file_name
, GNUTYPE_LONGNAME
);
575 return write_short_name (st
);
579 write_extended (bool global
, struct tar_stat_info
*st
, union block
*old_header
)
581 union block
*header
, hp
;
585 if (extended_header
.buffer
|| extended_header
.stk
== NULL
)
588 xheader_finish (&extended_header
);
589 memcpy (hp
.buffer
, old_header
, sizeof (hp
));
593 p
= xheader_ghdr_name ();
598 p
= xheader_xhdr_name (st
);
600 xheader_write (type
, p
, &extended_header
);
602 header
= find_next_block ();
603 memcpy (header
, &hp
.buffer
, sizeof (hp
.buffer
));
608 write_header_name (struct tar_stat_info
*st
)
610 if (archive_format
== POSIX_FORMAT
&& !string_ascii_p (st
->file_name
))
612 xheader_store ("path", st
, NULL
);
613 return write_short_name (st
);
615 else if (NAME_FIELD_SIZE
- (archive_format
== OLDGNU_FORMAT
)
616 < strlen (st
->file_name
))
617 return write_long_name (st
);
619 return write_short_name (st
);
623 /* Header handling. */
625 /* Make a header block for the file whose stat info is st,
626 and return its address. */
629 start_header (struct tar_stat_info
*st
)
633 header
= write_header_name (st
);
637 /* Override some stat fields, if requested to do so. */
639 if (owner_option
!= (uid_t
) -1)
640 st
->stat
.st_uid
= owner_option
;
641 if (group_option
!= (gid_t
) -1)
642 st
->stat
.st_gid
= group_option
;
645 ((st
->stat
.st_mode
& ~MODE_ALL
)
646 | mode_adjust (st
->stat
.st_mode
, mode_option
, initial_umask
));
648 /* Paul Eggert tried the trivial test ($WRITER cf a b; $READER tvf a)
649 for a few tars and came up with the following interoperability
653 1 2 3 4 5 6 7 8 9 READER
654 . . . . . . . . . 1 = SunOS 4.2 tar
655 # . . # # . . # # 2 = NEC SVR4.0.2 tar
656 . . . # # . . # . 3 = Solaris 2.1 tar
657 . . . . . . . . . 4 = GNU tar 1.11.1
658 . . . . . . . . . 5 = HP-UX 8.07 tar
659 . . . . . . . . . 6 = Ultrix 4.1
660 . . . . . . . . . 7 = AIX 3.2
661 . . . . . . . . . 8 = Hitachi HI-UX 1.03
662 . . . . . . . . . 9 = Omron UNIOS-B 4.3BSD 1.60Beta
665 # = ``impossible file type''
667 The following mask for old archive removes the `#'s in column 4
668 above, thus making GNU tar both a universal donor and a universal
669 acceptor for Paul's test. */
671 if (archive_format
== V7_FORMAT
|| archive_format
== USTAR_FORMAT
)
672 MODE_TO_CHARS (st
->stat
.st_mode
& MODE_ALL
, header
->header
.mode
);
674 MODE_TO_CHARS (st
->stat
.st_mode
, header
->header
.mode
);
677 uid_t uid
= st
->stat
.st_uid
;
678 if (archive_format
== POSIX_FORMAT
679 && MAX_OCTAL_VAL (header
->header
.uid
) < uid
)
681 xheader_store ("uid", st
, NULL
);
684 UID_TO_CHARS (uid
, header
->header
.uid
);
688 gid_t gid
= st
->stat
.st_gid
;
689 if (archive_format
== POSIX_FORMAT
690 && MAX_OCTAL_VAL (header
->header
.gid
) < gid
)
692 xheader_store ("gid", st
, NULL
);
695 GID_TO_CHARS (gid
, header
->header
.gid
);
699 off_t size
= st
->stat
.st_size
;
700 if (archive_format
== POSIX_FORMAT
701 && MAX_OCTAL_VAL (header
->header
.size
) < size
)
703 xheader_store ("size", st
, NULL
);
706 OFF_TO_CHARS (size
, header
->header
.size
);
710 struct timespec mtime
= st
->mtime
;
711 if (archive_format
== POSIX_FORMAT
)
713 if (MAX_OCTAL_VAL (header
->header
.mtime
) < mtime
.tv_sec
714 || mtime
.tv_nsec
!= 0)
715 xheader_store ("mtime", st
, NULL
);
716 if (MAX_OCTAL_VAL (header
->header
.mtime
) < mtime
.tv_sec
)
719 TIME_TO_CHARS (mtime
.tv_sec
, header
->header
.mtime
);
723 if (S_ISCHR (st
->stat
.st_mode
)
724 || S_ISBLK (st
->stat
.st_mode
))
726 major_t devmajor
= major (st
->stat
.st_rdev
);
727 minor_t devminor
= minor (st
->stat
.st_rdev
);
729 if (archive_format
== POSIX_FORMAT
730 && MAX_OCTAL_VAL (header
->header
.devmajor
) < devmajor
)
732 xheader_store ("devmajor", st
, NULL
);
735 MAJOR_TO_CHARS (devmajor
, header
->header
.devmajor
);
737 if (archive_format
== POSIX_FORMAT
738 && MAX_OCTAL_VAL (header
->header
.devminor
) < devminor
)
740 xheader_store ("devminor", st
, NULL
);
743 MINOR_TO_CHARS (devminor
, header
->header
.devminor
);
745 else if (archive_format
!= GNU_FORMAT
&& archive_format
!= OLDGNU_FORMAT
)
747 MAJOR_TO_CHARS (0, header
->header
.devmajor
);
748 MINOR_TO_CHARS (0, header
->header
.devminor
);
751 if (archive_format
== POSIX_FORMAT
)
753 xheader_store ("atime", st
, NULL
);
754 xheader_store ("ctime", st
, NULL
);
756 else if (incremental_option
)
757 if (archive_format
== OLDGNU_FORMAT
|| archive_format
== GNU_FORMAT
)
759 TIME_TO_CHARS (st
->atime
.tv_sec
, header
->oldgnu_header
.atime
);
760 TIME_TO_CHARS (st
->ctime
.tv_sec
, header
->oldgnu_header
.ctime
);
763 header
->header
.typeflag
= archive_format
== V7_FORMAT
? AREGTYPE
: REGTYPE
;
765 switch (archive_format
)
771 case GNU_FORMAT
: /*FIXME?*/
772 /* Overwrite header->header.magic and header.version in one blow. */
773 strcpy (header
->header
.magic
, OLDGNU_MAGIC
);
778 strncpy (header
->header
.magic
, TMAGIC
, TMAGLEN
);
779 strncpy (header
->header
.version
, TVERSION
, TVERSLEN
);
786 if (archive_format
== V7_FORMAT
|| numeric_owner_option
)
788 /* header->header.[ug]name are left as the empty string. */
792 uid_to_uname (st
->stat
.st_uid
, &st
->uname
);
793 gid_to_gname (st
->stat
.st_gid
, &st
->gname
);
795 if (archive_format
== POSIX_FORMAT
796 && (strlen (st
->uname
) > UNAME_FIELD_SIZE
797 || !string_ascii_p (st
->uname
)))
798 xheader_store ("uname", st
, NULL
);
799 UNAME_TO_CHARS (st
->uname
, header
->header
.uname
);
801 if (archive_format
== POSIX_FORMAT
802 && (strlen (st
->gname
) > GNAME_FIELD_SIZE
803 || !string_ascii_p (st
->gname
)))
804 xheader_store ("gname", st
, NULL
);
805 GNAME_TO_CHARS (st
->gname
, header
->header
.gname
);
812 simple_finish_header (union block
*header
)
818 memcpy (header
->header
.chksum
, CHKBLANKS
, sizeof header
->header
.chksum
);
822 for (i
= sizeof *header
; i
-- != 0; )
823 /* We can't use unsigned char here because of old compilers, e.g. V7. */
826 /* Fill in the checksum field. It's formatted differently from the
827 other fields: it has [6] digits, a null, then a space -- rather than
828 digits, then a null. We use to_chars.
829 The final space is already there, from
830 checksumming, and to_chars doesn't modify it.
832 This is a fast way to do:
834 sprintf(header->header.chksum, "%6o", sum); */
836 uintmax_to_chars ((uintmax_t) sum
, header
->header
.chksum
, 7);
838 set_next_block_after (header
);
841 /* Finish off a filled-in header block and write it out. We also
842 print the file name and/or full info if verbose is on. If BLOCK_ORDINAL
843 is not negative, is the block ordinal of the first record for this
844 file, which may be a preceding long name or long link record. */
846 finish_header (struct tar_stat_info
*st
,
847 union block
*header
, off_t block_ordinal
)
849 /* Note: It is important to do this before the call to write_extended(),
850 so that the actual ustar header is printed */
852 && header
->header
.typeflag
!= GNUTYPE_LONGLINK
853 && header
->header
.typeflag
!= GNUTYPE_LONGNAME
854 && header
->header
.typeflag
!= XHDTYPE
855 && header
->header
.typeflag
!= XGLTYPE
)
857 /* These globals are parameters to print_header, sigh. */
859 current_header
= header
;
860 current_format
= archive_format
;
861 print_header (st
, block_ordinal
);
864 header
= write_extended (false, st
, header
);
865 simple_finish_header (header
);
870 pad_archive (off_t size_left
)
873 while (size_left
> 0)
875 mv_size_left (size_left
);
876 blk
= find_next_block ();
877 memset (blk
->buffer
, 0, BLOCKSIZE
);
878 set_next_block_after (blk
);
879 size_left
-= BLOCKSIZE
;
883 static enum dump_status
884 dump_regular_file (int fd
, struct tar_stat_info
*st
)
886 off_t size_left
= st
->stat
.st_size
;
890 block_ordinal
= current_block_ordinal ();
891 blk
= start_header (st
);
893 return dump_status_fail
;
895 /* Mark contiguous files, if we support them. */
896 if (archive_format
!= V7_FORMAT
&& S_ISCTG (st
->stat
.st_mode
))
897 blk
->header
.typeflag
= CONTTYPE
;
899 finish_header (st
, blk
, block_ordinal
);
902 while (size_left
> 0)
904 size_t bufsize
, count
;
906 mv_size_left (size_left
);
908 blk
= find_next_block ();
910 bufsize
= available_space_after (blk
);
912 if (size_left
< bufsize
)
914 /* Last read -- zero out area beyond. */
916 count
= bufsize
% BLOCKSIZE
;
918 memset (blk
->buffer
+ size_left
, 0, BLOCKSIZE
- count
);
921 count
= (fd
< 0) ? bufsize
: safe_read (fd
, blk
->buffer
, bufsize
);
922 if (count
== SAFE_READ_ERROR
)
924 read_diag_details (st
->orig_file_name
,
925 st
->stat
.st_size
- size_left
, bufsize
);
926 pad_archive (size_left
);
927 return dump_status_short
;
931 set_next_block_after (blk
+ (bufsize
- 1) / BLOCKSIZE
);
933 if (count
!= bufsize
)
935 char buf
[UINTMAX_STRSIZE_BOUND
];
936 memset (blk
->buffer
+ count
, 0, bufsize
- count
);
938 ngettext ("%s: File shrank by %s byte; padding with zeros",
939 "%s: File shrank by %s bytes; padding with zeros",
941 quotearg_colon (st
->orig_file_name
),
942 STRINGIFY_BIGINT (size_left
, buf
)));
943 if (! ignore_failed_read_option
)
944 exit_status
= TAREXIT_FAILURE
;
945 pad_archive (size_left
- (bufsize
-count
));
946 return dump_status_short
;
949 return dump_status_ok
;
952 /* Look in directory DIRNAME for a cache directory tag file
953 with the magic name "CACHEDIR.TAG" and a standard header,
955 http://www.brynosaurus.com/cachedir
956 Applications can write this file into directories they create
957 for use as caches containing purely regenerable, non-precious data,
958 allowing us to avoid archiving them if --exclude-caches is specified. */
960 #define CACHEDIR_SIGNATURE "Signature: 8a477f597d28d172789f06886806bc55"
961 #define CACHEDIR_SIGNATURE_SIZE (sizeof CACHEDIR_SIGNATURE - 1)
964 check_cache_directory (char *dirname
)
966 static char tagname
[] = "CACHEDIR.TAG";
969 int tag_present
= false;
971 tagpath
= xmalloc (strlen (dirname
) + strlen (tagname
) + 1);
972 strcpy (tagpath
, dirname
);
973 strcat (tagpath
, tagname
);
975 fd
= open (tagpath
, O_RDONLY
);
978 static char tagbuf
[CACHEDIR_SIGNATURE_SIZE
];
980 if (read (fd
, tagbuf
, CACHEDIR_SIGNATURE_SIZE
)
981 == CACHEDIR_SIGNATURE_SIZE
982 && memcmp (tagbuf
, CACHEDIR_SIGNATURE
, CACHEDIR_SIGNATURE_SIZE
) == 0)
994 dump_dir0 (char *directory
,
995 struct tar_stat_info
*st
, int top_level
, dev_t parent_device
)
997 dev_t our_device
= st
->stat
.st_dev
;
999 if (!is_avoided_name (st
->orig_file_name
))
1001 union block
*blk
= NULL
;
1002 off_t block_ordinal
= current_block_ordinal ();
1003 st
->stat
.st_size
= 0; /* force 0 size on dir */
1005 blk
= start_header (st
);
1009 if (incremental_option
&& archive_format
!= POSIX_FORMAT
)
1010 blk
->header
.typeflag
= GNUTYPE_DUMPDIR
;
1011 else /* if (standard_option) */
1012 blk
->header
.typeflag
= DIRTYPE
;
1014 /* If we're gnudumping, we aren't done yet so don't close it. */
1016 if (!incremental_option
)
1017 finish_header (st
, blk
, block_ordinal
);
1018 else if (gnu_list_name
->dir_contents
)
1020 if (archive_format
== POSIX_FORMAT
)
1022 xheader_store ("GNU.dumpdir", st
, gnu_list_name
->dir_contents
);
1023 finish_header (st
, blk
, block_ordinal
);
1031 const char *buffer
, *p_buffer
;
1033 block_ordinal
= current_block_ordinal ();
1034 buffer
= gnu_list_name
->dir_contents
;
1036 totsize
= dumpdir_size (buffer
);
1039 OFF_TO_CHARS (totsize
, blk
->header
.size
);
1040 finish_header (st
, blk
, block_ordinal
);
1042 size_left
= totsize
;
1045 mv_total_size (totsize
);
1046 while (size_left
> 0)
1048 mv_size_left (size_left
);
1049 blk
= find_next_block ();
1050 bufsize
= available_space_after (blk
);
1051 if (size_left
< bufsize
)
1053 bufsize
= size_left
;
1054 count
= bufsize
% BLOCKSIZE
;
1056 memset (blk
->buffer
+ size_left
, 0, BLOCKSIZE
- count
);
1058 memcpy (blk
->buffer
, p_buffer
, bufsize
);
1059 size_left
-= bufsize
;
1060 p_buffer
+= bufsize
;
1061 set_next_block_after (blk
+ (bufsize
- 1) / BLOCKSIZE
);
1069 if (!recursion_option
)
1072 if (one_file_system_option
1074 && parent_device
!= st
->stat
.st_dev
)
1078 _("%s: file is on a different filesystem; not dumped"),
1079 quotearg_colon (st
->orig_file_name
)));
1083 if (exclude_caches_option
1084 && check_cache_directory(st
->orig_file_name
))
1088 _("%s: contains a cache directory tag; not dumped"),
1089 quotearg_colon (st
->orig_file_name
)));
1096 char *name_buf
= xstrdup (st
->orig_file_name
);
1097 size_t name_size
= strlen (name_buf
);
1098 size_t name_len
= name_size
;
1100 /* Now output all the files in the directory. */
1101 /* FIXME: Should speed this up by cd-ing into the dir. */
1103 for (entry
= directory
; (entry_len
= strlen (entry
)) != 0;
1104 entry
+= entry_len
+ 1)
1106 if (name_size
< name_len
+ entry_len
)
1108 name_size
= name_len
+ entry_len
;
1109 name_buf
= xrealloc (name_buf
, name_size
+ 1);
1111 strcpy (name_buf
+ name_len
, entry
);
1112 if (!excluded_name (name_buf
))
1113 dump_file (name_buf
, 0, our_device
);
1120 /* Ensure exactly one trailing slash. */
1122 ensure_slash (char **pstr
)
1124 size_t len
= strlen (*pstr
);
1125 while (len
>= 1 && ISSLASH ((*pstr
)[len
- 1]))
1127 if (!ISSLASH ((*pstr
)[len
]))
1128 *pstr
= xrealloc (*pstr
, len
+ 2);
1129 (*pstr
)[len
++] = '/';
1130 (*pstr
)[len
] = '\0';
1134 dump_dir (int fd
, struct tar_stat_info
*st
, int top_level
, dev_t parent_device
)
1136 char *directory
= fdsavedir (fd
);
1139 savedir_diag (st
->orig_file_name
);
1143 ensure_slash (&st
->orig_file_name
);
1144 ensure_slash (&st
->file_name
);
1146 dump_dir0 (directory
, st
, top_level
, parent_device
);
1153 /* Main functions of this module. */
1156 create_archive (void)
1160 open_archive (ACCESS_WRITE
);
1161 xheader_write_global ();
1163 if (incremental_option
)
1165 size_t buffer_size
= 1000;
1166 char *buffer
= xmalloc (buffer_size
);
1169 collect_and_sort_names ();
1171 while ((p
= name_from_list ()) != NULL
)
1172 if (!excluded_name (p
))
1173 dump_file (p
, -1, (dev_t
) 0);
1176 while ((p
= name_from_list ()) != NULL
)
1177 if (!excluded_name (p
))
1179 size_t plen
= strlen (p
);
1180 if (buffer_size
<= plen
)
1182 while ((buffer_size
*= 2) <= plen
)
1184 buffer
= xrealloc (buffer
, buffer_size
);
1186 memcpy (buffer
, p
, plen
);
1187 if (! ISSLASH (buffer
[plen
- 1]))
1188 buffer
[plen
++] = '/';
1189 q
= gnu_list_name
->dir_contents
;
1193 size_t qlen
= strlen (q
);
1196 if (buffer_size
< plen
+ qlen
)
1198 while ((buffer_size
*=2 ) < plen
+ qlen
)
1200 buffer
= xrealloc (buffer
, buffer_size
);
1202 strcpy (buffer
+ plen
, q
+ 1);
1203 dump_file (buffer
, -1, (dev_t
) 0);
1212 while ((p
= name_next (1)) != NULL
)
1213 if (!excluded_name (p
))
1214 dump_file (p
, 1, (dev_t
) 0);
1220 if (listed_incremental_option
)
1221 write_directory_file ();
1225 /* Calculate the hash of a link. */
1227 hash_link (void const *entry
, size_t n_buckets
)
1229 struct link
const *l
= entry
;
1230 uintmax_t num
= l
->dev
^ l
->ino
;
1231 return num
% n_buckets
;
1234 /* Compare two links for equality. */
1236 compare_links (void const *entry1
, void const *entry2
)
1238 struct link
const *link1
= entry1
;
1239 struct link
const *link2
= entry2
;
1240 return ((link1
->dev
^ link2
->dev
) | (link1
->ino
^ link2
->ino
)) == 0;
1244 unknown_file_error (char const *p
)
1246 WARN ((0, 0, _("%s: Unknown file type; file ignored"),
1247 quotearg_colon (p
)));
1248 if (!ignore_failed_read_option
)
1249 exit_status
= TAREXIT_FAILURE
;
1253 /* Handling of hard links */
1255 /* Table of all non-directories that we've written so far. Any time
1256 we see another, we check the table and avoid dumping the data
1257 again if we've done it once already. */
1258 static Hash_table
*link_table
;
1260 /* Try to dump stat as a hard link to another file in the archive.
1261 Return true if successful. */
1263 dump_hard_link (struct tar_stat_info
*st
)
1265 if (link_table
&& st
->stat
.st_nlink
> 1)
1268 struct link
*duplicate
;
1269 off_t block_ordinal
;
1272 lp
.ino
= st
->stat
.st_ino
;
1273 lp
.dev
= st
->stat
.st_dev
;
1275 if ((duplicate
= hash_lookup (link_table
, &lp
)))
1277 /* We found a link. */
1278 char const *link_name
= safer_name_suffix (duplicate
->name
, true,
1279 absolute_names_option
);
1283 block_ordinal
= current_block_ordinal ();
1284 assign_string (&st
->link_name
, link_name
);
1285 if (NAME_FIELD_SIZE
- (archive_format
== OLDGNU_FORMAT
)
1286 < strlen (link_name
))
1287 write_long_link (st
);
1289 st
->stat
.st_size
= 0;
1290 blk
= start_header (st
);
1293 tar_copy_str (blk
->header
.linkname
, link_name
, NAME_FIELD_SIZE
);
1295 blk
->header
.typeflag
= LNKTYPE
;
1296 finish_header (st
, blk
, block_ordinal
);
1298 if (remove_files_option
&& unlink (st
->orig_file_name
) != 0)
1299 unlink_error (st
->orig_file_name
);
1308 file_count_links (struct tar_stat_info
*st
)
1310 if (st
->stat
.st_nlink
> 1)
1312 struct link
*duplicate
;
1313 struct link
*lp
= xmalloc (offsetof (struct link
, name
)
1314 + strlen (st
->orig_file_name
) + 1);
1315 lp
->ino
= st
->stat
.st_ino
;
1316 lp
->dev
= st
->stat
.st_dev
;
1317 lp
->nlink
= st
->stat
.st_nlink
;
1318 strcpy (lp
->name
, st
->orig_file_name
);
1321 || (link_table
= hash_initialize (0, 0, hash_link
,
1323 && (duplicate
= hash_insert (link_table
, lp
))))
1326 if (duplicate
!= lp
)
1332 /* For each dumped file, check if all its links were dumped. Emit
1333 warnings if it is not so. */
1342 for (lp
= hash_get_first (link_table
); lp
;
1343 lp
= hash_get_next (link_table
, lp
))
1347 WARN ((0, 0, _("Missing links to %s.\n"), quote (lp
->name
)));
1353 /* Dump a single file, recursing on directories. P is the file name
1354 to dump. TOP_LEVEL tells whether this is a top-level call; zero
1355 means no, positive means yes, and negative means the top level
1356 of an incremental dump. PARENT_DEVICE is the device of P's
1357 parent directory; it is examined only if TOP_LEVEL is zero. */
1359 /* FIXME: One should make sure that for *every* path leading to setting
1360 exit_status to failure, a clear diagnostic has been issued. */
1363 dump_file0 (struct tar_stat_info
*st
, char const *p
,
1364 int top_level
, dev_t parent_device
)
1366 union block
*header
;
1368 struct timespec original_ctime
;
1369 struct timespec restore_times
[2];
1370 off_t block_ordinal
= -1;
1373 if (interactive_option
&& !confirm ("add", p
))
1376 assign_string (&st
->orig_file_name
, p
);
1377 assign_string (&st
->file_name
,
1378 safer_name_suffix (p
, false, absolute_names_option
));
1380 if (deref_stat (dereference_option
, p
, &st
->stat
) != 0)
1385 st
->archive_file_size
= st
->stat
.st_size
;
1386 st
->atime
= restore_times
[0] = get_stat_atime (&st
->stat
);
1387 st
->mtime
= restore_times
[1] = get_stat_mtime (&st
->stat
);
1388 st
->ctime
= original_ctime
= get_stat_ctime (&st
->stat
);
1391 if (S_ISHIDDEN (st
->stat
.st_mode
))
1393 char *new = (char *) alloca (strlen (p
) + 2);
1403 /* See if we want only new files, and check if this one is too old to
1406 This check is omitted if incremental_option is set *and* the
1407 requested file is not explicitely listed in the command line. */
1409 if (!(incremental_option
&& !is_individual_file (p
))
1410 && !S_ISDIR (st
->stat
.st_mode
)
1411 && OLDER_TAR_STAT_TIME (*st
, m
)
1412 && (!after_date_option
|| OLDER_TAR_STAT_TIME (*st
, c
)))
1414 if (!incremental_option
&& verbose_option
)
1415 WARN ((0, 0, _("%s: file is unchanged; not dumped"),
1416 quotearg_colon (p
)));
1420 /* See if we are trying to dump the archive. */
1421 if (sys_file_is_archive (st
))
1423 WARN ((0, 0, _("%s: file is the archive; not dumped"),
1424 quotearg_colon (p
)));
1428 if (is_avoided_name (p
))
1431 is_dir
= S_ISDIR (st
->stat
.st_mode
) != 0;
1433 if (!is_dir
&& dump_hard_link (st
))
1436 if (is_dir
|| S_ISREG (st
->stat
.st_mode
) || S_ISCTG (st
->stat
.st_mode
))
1440 struct stat final_stat
;
1442 if (is_dir
|| file_dumpable_p (st
))
1445 (O_RDONLY
| O_BINARY
1446 | (is_dir
? O_DIRECTORY
| O_NONBLOCK
: 0)
1447 | (atime_preserve_option
== system_atime_preserve
1452 if (!top_level
&& errno
== ENOENT
)
1453 WARN ((0, 0, _("%s: File removed before we read it"),
1454 quotearg_colon (p
)));
1463 ok
= dump_dir (fd
, st
, top_level
, parent_device
);
1465 /* dump_dir consumes FD if successful. */
1471 enum dump_status status
;
1473 if (fd
!= -1 && sparse_option
&& sparse_file_p (st
))
1475 status
= sparse_dump_file (fd
, st
);
1476 if (status
== dump_status_not_implemented
)
1477 status
= dump_regular_file (fd
, st
);
1480 status
= dump_regular_file (fd
, st
);
1484 case dump_status_ok
:
1485 case dump_status_short
:
1489 case dump_status_fail
:
1492 case dump_status_not_implemented
:
1496 ok
= status
== dump_status_ok
;
1501 /* If possible, reopen a directory if we are preserving
1502 atimes, so that we can set just the atime on systems with
1504 if (fd
< 0 && is_dir
1505 && atime_preserve_option
== replace_atime_preserve
)
1506 fd
= open (p
, O_RDONLY
| O_BINARY
| O_DIRECTORY
| O_NONBLOCK
);
1509 ? deref_stat (dereference_option
, p
, &final_stat
)
1510 : fstat (fd
, &final_stat
))
1520 if (timespec_cmp (get_stat_ctime (&final_stat
), original_ctime
) != 0)
1521 WARN ((0, 0, _("%s: file changed as we read it"),
1522 quotearg_colon (p
)));
1523 else if (atime_preserve_option
== replace_atime_preserve
1524 && set_file_atime (fd
, p
, restore_times
) != 0)
1528 if (0 <= fd
&& close (fd
) != 0)
1534 if (ok
&& remove_files_option
)
1538 if (rmdir (p
) != 0 && errno
!= ENOTEMPTY
)
1543 if (unlink (p
) != 0)
1550 #ifdef HAVE_READLINK
1551 else if (S_ISLNK (st
->stat
.st_mode
))
1555 size_t linklen
= st
->stat
.st_size
;
1556 if (linklen
!= st
->stat
.st_size
|| linklen
+ 1 == 0)
1558 buffer
= (char *) alloca (linklen
+ 1);
1559 size
= readlink (p
, buffer
, linklen
+ 1);
1565 buffer
[size
] = '\0';
1566 assign_string (&st
->link_name
, buffer
);
1567 if (NAME_FIELD_SIZE
- (archive_format
== OLDGNU_FORMAT
) < size
)
1568 write_long_link (st
);
1570 block_ordinal
= current_block_ordinal ();
1571 st
->stat
.st_size
= 0; /* force 0 size on symlink */
1572 header
= start_header (st
);
1575 tar_copy_str (header
->header
.linkname
, buffer
, NAME_FIELD_SIZE
);
1576 header
->header
.typeflag
= SYMTYPE
;
1577 finish_header (st
, header
, block_ordinal
);
1578 /* nothing more to do to it */
1580 if (remove_files_option
)
1582 if (unlink (p
) == -1)
1585 file_count_links (st
);
1589 else if (S_ISCHR (st
->stat
.st_mode
))
1591 else if (S_ISBLK (st
->stat
.st_mode
))
1593 else if (S_ISFIFO (st
->stat
.st_mode
))
1595 else if (S_ISSOCK (st
->stat
.st_mode
))
1597 WARN ((0, 0, _("%s: socket ignored"), quotearg_colon (p
)));
1600 else if (S_ISDOOR (st
->stat
.st_mode
))
1602 WARN ((0, 0, _("%s: door ignored"), quotearg_colon (p
)));
1607 unknown_file_error (p
);
1611 if (archive_format
== V7_FORMAT
)
1613 unknown_file_error (p
);
1617 block_ordinal
= current_block_ordinal ();
1618 st
->stat
.st_size
= 0; /* force 0 size */
1619 header
= start_header (st
);
1622 header
->header
.typeflag
= type
;
1624 if (type
!= FIFOTYPE
)
1626 MAJOR_TO_CHARS (major (st
->stat
.st_rdev
),
1627 header
->header
.devmajor
);
1628 MINOR_TO_CHARS (minor (st
->stat
.st_rdev
),
1629 header
->header
.devminor
);
1632 finish_header (st
, header
, block_ordinal
);
1633 if (remove_files_option
)
1635 if (unlink (p
) == -1)
1641 dump_file (char *p
, int top_level
, dev_t parent_device
)
1643 struct tar_stat_info st
;
1644 tar_stat_init (&st
);
1645 dump_file0 (&st
, p
, top_level
, parent_device
);
1646 if (listed_incremental_option
)
1647 update_parent_directory (p
);
1648 tar_stat_destroy (&st
);