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. */
38 /* The maximum uintmax_t value that can be represented with DIGITS digits,
39 assuming that each digit is BITS_PER_DIGIT wide. */
40 #define MAX_VAL_WITH_DIGITS(digits, bits_per_digit) \
41 ((digits) * (bits_per_digit) < sizeof (uintmax_t) * CHAR_BIT \
42 ? ((uintmax_t) 1 << ((digits) * (bits_per_digit))) - 1 \
45 /* The maximum uintmax_t value that can be represented with octal
46 digits and a trailing NUL in BUFFER. */
47 #define MAX_OCTAL_VAL(buffer) MAX_VAL_WITH_DIGITS (sizeof (buffer) - 1, LG_8)
49 /* Convert VALUE to an octal representation suitable for tar headers.
50 Output to buffer WHERE with size SIZE.
51 The result is undefined if SIZE is 0 or if VALUE is too large to fit. */
54 to_octal (uintmax_t value
, char *where
, size_t size
)
61 where
[--i
] = '0' + (v
& ((1 << LG_8
) - 1));
67 /* Copy at most LEN bytes from the string SRC to DST. Terminate with
68 NUL unless SRC is LEN or more bytes long. */
71 tar_copy_str (char *dst
, const char *src
, size_t len
)
74 for (i
= 0; i
< len
; i
++)
75 if (! (dst
[i
] = src
[i
]))
79 /* Same as tar_copy_str, but always terminate with NUL if using
83 tar_name_copy_str (char *dst
, const char *src
, size_t len
)
85 tar_copy_str (dst
, src
, len
);
86 if (archive_format
== OLDGNU_FORMAT
)
90 /* Convert NEGATIVE VALUE to a base-256 representation suitable for
91 tar headers. NEGATIVE is 1 if VALUE was negative before being cast
92 to uintmax_t, 0 otherwise. Output to buffer WHERE with size SIZE.
93 The result is undefined if SIZE is 0 or if VALUE is too large to
97 to_base256 (int negative
, uintmax_t value
, char *where
, size_t size
)
100 uintmax_t propagated_sign_bits
=
101 ((uintmax_t) - negative
<< (CHAR_BIT
* sizeof v
- LG_256
));
106 where
[--i
] = v
& ((1 << LG_256
) - 1);
107 v
= propagated_sign_bits
| (v
>> LG_256
);
112 /* Convert NEGATIVE VALUE (which was originally of size VALSIZE) to
113 external form, using SUBSTITUTE (...) if VALUE won't fit. Output
114 to buffer WHERE with size SIZE. NEGATIVE is 1 iff VALUE was
115 negative before being cast to uintmax_t; its original bitpattern
116 can be deduced from VALSIZE, its original size before casting.
117 TYPE is the kind of value being output (useful for diagnostics).
118 Prefer the POSIX format of SIZE - 1 octal digits (with leading zero
119 digits), followed by '\0'. If this won't work, and if GNU or
120 OLDGNU format is allowed, use '\200' followed by base-256, or (if
121 NEGATIVE is nonzero) '\377' followed by two's complement base-256.
122 If neither format works, use SUBSTITUTE (...) instead. Pass to
123 SUBSTITUTE the address of an 0-or-1 flag recording whether the
124 substitute value is negative. */
127 to_chars (int negative
, uintmax_t value
, size_t valsize
,
128 uintmax_t (*substitute
) (int *),
129 char *where
, size_t size
, const char *type
)
131 int base256_allowed
= (archive_format
== GNU_FORMAT
132 || archive_format
== OLDGNU_FORMAT
);
134 /* Generate the POSIX octal representation if the number fits. */
135 if (! negative
&& value
<= MAX_VAL_WITH_DIGITS (size
- 1, LG_8
))
137 where
[size
- 1] = '\0';
138 to_octal (value
, where
, size
- 1);
141 /* Otherwise, generate the base-256 representation if we are
142 generating an old or new GNU format and if the number fits. */
143 else if (((negative
? -1 - value
: value
)
144 <= MAX_VAL_WITH_DIGITS (size
- 1, LG_256
))
147 where
[0] = negative
? -1 : 1 << (LG_256
- 1);
148 to_base256 (negative
, value
, where
+ 1, size
- 1);
151 /* Otherwise, if the number is negative, and if it would not cause
152 ambiguity on this host by confusing positive with negative
153 values, then generate the POSIX octal representation of the value
154 modulo 2**(field bits). The resulting tar file is
155 machine-dependent, since it depends on the host word size. Yuck!
156 But this is the traditional behavior. */
157 else if (negative
&& valsize
* CHAR_BIT
<= (size
- 1) * LG_8
)
159 static int warned_once
;
163 WARN ((0, 0, _("Generating negative octal headers")));
165 where
[size
- 1] = '\0';
166 to_octal (value
& MAX_VAL_WITH_DIGITS (valsize
* CHAR_BIT
, 1),
170 /* Otherwise, output a substitute value if possible (with a
171 warning), and an error message if not. */
174 uintmax_t maxval
= (base256_allowed
175 ? MAX_VAL_WITH_DIGITS (size
- 1, LG_256
)
176 : MAX_VAL_WITH_DIGITS (size
- 1, LG_8
));
177 char valbuf
[UINTMAX_STRSIZE_BOUND
+ 1];
178 char maxbuf
[UINTMAX_STRSIZE_BOUND
];
179 char minbuf
[UINTMAX_STRSIZE_BOUND
+ 1];
180 char const *minval_string
;
181 char const *maxval_string
= STRINGIFY_BIGINT (maxval
, maxbuf
);
182 char const *value_string
;
186 uintmax_t m
= maxval
+ 1 ? maxval
+ 1 : maxval
/ 2 + 1;
187 char *p
= STRINGIFY_BIGINT (m
, minbuf
+ 1);
196 char *p
= STRINGIFY_BIGINT (- value
, valbuf
+ 1);
201 value_string
= STRINGIFY_BIGINT (value
, valbuf
);
206 uintmax_t sub
= substitute (&negsub
) & maxval
;
207 /* FIXME: This is the only place where GNU_FORMAT differs from
208 OLDGNU_FORMAT. Apart from this they are completely identical. */
209 uintmax_t s
= (negsub
&= archive_format
== GNU_FORMAT
) ? - sub
: sub
;
210 char subbuf
[UINTMAX_STRSIZE_BOUND
+ 1];
211 char *sub_string
= STRINGIFY_BIGINT (s
, subbuf
+ 1);
214 WARN ((0, 0, _("value %s out of %s range %s..%s; substituting %s"),
215 value_string
, type
, minval_string
, maxval_string
,
217 to_chars (negsub
, s
, valsize
, 0, where
, size
, type
);
220 ERROR ((0, 0, _("value %s out of %s range %s..%s"),
221 value_string
, type
, minval_string
, maxval_string
));
226 gid_substitute (int *negative
)
232 static gid_t gid_nobody
;
233 if (!gid_nobody
&& !gname_to_gid ("nobody", &gid_nobody
))
242 gid_to_chars (gid_t v
, char *p
, size_t s
)
244 to_chars (v
< 0, (uintmax_t) v
, sizeof v
, gid_substitute
, p
, s
, "gid_t");
248 major_to_chars (major_t v
, char *p
, size_t s
)
250 to_chars (v
< 0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "major_t");
254 minor_to_chars (minor_t v
, char *p
, size_t s
)
256 to_chars (v
< 0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "minor_t");
260 mode_to_chars (mode_t v
, char *p
, size_t s
)
262 /* In the common case where the internal and external mode bits are the same,
263 and we are not using POSIX or GNU format,
264 propagate all unknown bits to the external mode.
265 This matches historical practice.
266 Otherwise, just copy the bits we know about. */
269 if (S_ISUID
== TSUID
&& S_ISGID
== TSGID
&& S_ISVTX
== TSVTX
270 && S_IRUSR
== TUREAD
&& S_IWUSR
== TUWRITE
&& S_IXUSR
== TUEXEC
271 && S_IRGRP
== TGREAD
&& S_IWGRP
== TGWRITE
&& S_IXGRP
== TGEXEC
272 && S_IROTH
== TOREAD
&& S_IWOTH
== TOWRITE
&& S_IXOTH
== TOEXEC
273 && archive_format
!= POSIX_FORMAT
274 && archive_format
!= USTAR_FORMAT
275 && archive_format
!= GNU_FORMAT
)
283 u
= ((v
& S_ISUID
? TSUID
: 0)
284 | (v
& S_ISGID
? TSGID
: 0)
285 | (v
& S_ISVTX
? TSVTX
: 0)
286 | (v
& S_IRUSR
? TUREAD
: 0)
287 | (v
& S_IWUSR
? TUWRITE
: 0)
288 | (v
& S_IXUSR
? TUEXEC
: 0)
289 | (v
& S_IRGRP
? TGREAD
: 0)
290 | (v
& S_IWGRP
? TGWRITE
: 0)
291 | (v
& S_IXGRP
? TGEXEC
: 0)
292 | (v
& S_IROTH
? TOREAD
: 0)
293 | (v
& S_IWOTH
? TOWRITE
: 0)
294 | (v
& S_IXOTH
? TOEXEC
: 0));
296 to_chars (negative
, u
, sizeof v
, 0, p
, s
, "mode_t");
300 off_to_chars (off_t v
, char *p
, size_t s
)
302 to_chars (v
< 0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "off_t");
306 size_to_chars (size_t v
, char *p
, size_t s
)
308 to_chars (0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "size_t");
312 time_to_chars (time_t v
, char *p
, size_t s
)
314 to_chars (v
< 0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "time_t");
318 uid_substitute (int *negative
)
324 static uid_t uid_nobody
;
325 if (!uid_nobody
&& !uname_to_uid ("nobody", &uid_nobody
))
334 uid_to_chars (uid_t v
, char *p
, size_t s
)
336 to_chars (v
< 0, (uintmax_t) v
, sizeof v
, uid_substitute
, p
, s
, "uid_t");
340 uintmax_to_chars (uintmax_t v
, char *p
, size_t s
)
342 to_chars (0, v
, sizeof v
, 0, p
, s
, "uintmax_t");
346 string_to_chars (char const *str
, char *p
, size_t s
)
348 tar_copy_str (p
, str
, s
);
353 /* A file is considered dumpable if it is sparse and both --sparse and --totals
355 Otherwise, it is dumpable unless any of the following conditions occur:
357 a) it is empty *and* world-readable, or
358 b) current archive is /dev/null */
361 file_dumpable_p (struct tar_stat_info
*st
)
364 return totals_option
&& sparse_option
&& sparse_file_p (st
);
365 return !(st
->archive_file_size
== 0
366 && (st
->stat
.st_mode
& MODE_R
) == MODE_R
);
370 /* Writing routines. */
372 /* Write the EOT block(s). Zero at least two blocks, through the end
373 of the record. Old tar, as previous versions of GNU tar, writes
374 garbage after two zeroed blocks. */
378 union block
*pointer
= find_next_block ();
379 memset (pointer
->buffer
, 0, BLOCKSIZE
);
380 set_next_block_after (pointer
);
381 pointer
= find_next_block ();
382 memset (pointer
->buffer
, 0, available_space_after (pointer
));
383 set_next_block_after (pointer
);
386 /* Write a "private" header */
388 start_private_header (const char *name
, size_t size
)
391 union block
*header
= find_next_block ();
393 memset (header
->buffer
, 0, sizeof (union block
));
395 tar_name_copy_str (header
->header
.name
, name
, NAME_FIELD_SIZE
);
396 OFF_TO_CHARS (size
, header
->header
.size
);
399 TIME_TO_CHARS (t
, header
->header
.mtime
);
400 MODE_TO_CHARS (S_IFREG
|S_IRUSR
|S_IWUSR
|S_IRGRP
|S_IROTH
, header
->header
.mode
);
401 UID_TO_CHARS (getuid (), header
->header
.uid
);
402 GID_TO_CHARS (getgid (), header
->header
.gid
);
403 MAJOR_TO_CHARS (0, header
->header
.devmajor
);
404 MINOR_TO_CHARS (0, header
->header
.devminor
);
405 strncpy (header
->header
.magic
, TMAGIC
, TMAGLEN
);
406 strncpy (header
->header
.version
, TVERSION
, TVERSLEN
);
410 /* Create a new header and store there at most NAME_FIELD_SIZE bytes of
414 write_short_name (struct tar_stat_info
*st
)
416 union block
*header
= find_next_block ();
417 memset (header
->buffer
, 0, sizeof (union block
));
418 tar_name_copy_str (header
->header
.name
, st
->file_name
, NAME_FIELD_SIZE
);
422 #define FILL(field,byte) do { \
423 memset(field, byte, sizeof(field)-1); \
424 (field)[sizeof(field)-1] = 0; \
427 /* Write a GNUTYPE_LONGLINK or GNUTYPE_LONGNAME block. */
429 write_gnu_long_link (struct tar_stat_info
*st
, const char *p
, char type
)
431 size_t size
= strlen (p
) + 1;
436 header
= start_private_header ("././@LongLink", size
);
437 FILL(header
->header
.mtime
, '0');
438 FILL(header
->header
.mode
, '0');
439 FILL(header
->header
.uid
, '0');
440 FILL(header
->header
.gid
, '0');
441 FILL(header
->header
.devmajor
, 0);
442 FILL(header
->header
.devminor
, 0);
443 uid_to_uname (0, &tmpname
);
444 UNAME_TO_CHARS (tmpname
, header
->header
.uname
);
446 gid_to_gname (0, &tmpname
);
447 GNAME_TO_CHARS (tmpname
, header
->header
.gname
);
450 strcpy (header
->header
.magic
, OLDGNU_MAGIC
);
451 header
->header
.typeflag
= type
;
452 finish_header (st
, header
, -1);
454 header
= find_next_block ();
456 bufsize
= available_space_after (header
);
458 while (bufsize
< size
)
460 memcpy (header
->buffer
, p
, bufsize
);
463 set_next_block_after (header
+ (bufsize
- 1) / BLOCKSIZE
);
464 header
= find_next_block ();
465 bufsize
= available_space_after (header
);
467 memcpy (header
->buffer
, p
, size
);
468 memset (header
->buffer
+ size
, 0, bufsize
- size
);
469 set_next_block_after (header
+ (size
- 1) / BLOCKSIZE
);
473 split_long_name (const char *name
, size_t length
)
477 if (length
> PREFIX_FIELD_SIZE
)
478 length
= PREFIX_FIELD_SIZE
+2;
479 for (i
= length
- 1; i
> 0; i
--)
480 if (ISSLASH (name
[i
]))
486 write_ustar_long_name (const char *name
)
488 size_t length
= strlen (name
);
492 if (length
> PREFIX_FIELD_SIZE
+ NAME_FIELD_SIZE
+ 1)
494 ERROR ((0, 0, _("%s: file name is too long (max %d); not dumped"),
495 quotearg_colon (name
),
496 PREFIX_FIELD_SIZE
+ NAME_FIELD_SIZE
+ 1));
500 i
= split_long_name (name
, length
);
501 if (i
== 0 || length
- i
- 1 > NAME_FIELD_SIZE
)
504 _("%s: file name is too long (cannot be split); not dumped"),
505 quotearg_colon (name
)));
509 header
= find_next_block ();
510 memset (header
->buffer
, 0, sizeof (header
->buffer
));
511 memcpy (header
->header
.prefix
, name
, i
);
512 memcpy (header
->header
.name
, name
+ i
+ 1, length
- i
- 1);
517 /* Write a long link name, depending on the current archive format */
519 write_long_link (struct tar_stat_info
*st
)
521 switch (archive_format
)
524 xheader_store ("linkpath", st
, NULL
);
527 case V7_FORMAT
: /* old V7 tar format */
531 _("%s: link name is too long; not dumped"),
532 quotearg_colon (st
->link_name
)));
537 write_gnu_long_link (st
, st
->link_name
, GNUTYPE_LONGLINK
);
546 write_long_name (struct tar_stat_info
*st
)
548 switch (archive_format
)
551 xheader_store ("path", st
, NULL
);
555 if (strlen (st
->file_name
) > NAME_FIELD_SIZE
-1)
557 ERROR ((0, 0, _("%s: file name is too long (max %d); not dumped"),
558 quotearg_colon (st
->file_name
),
559 NAME_FIELD_SIZE
- 1));
566 return write_ustar_long_name (st
->file_name
);
570 write_gnu_long_link (st
, st
->file_name
, GNUTYPE_LONGNAME
);
576 return write_short_name (st
);
580 write_extended (struct tar_stat_info
*st
, union block
*old_header
)
582 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
));
590 p
= xheader_xhdr_name (st
);
591 xheader_write (XHDTYPE
, p
, &extended_header
);
593 header
= find_next_block ();
594 memcpy (header
, &hp
.buffer
, sizeof (hp
.buffer
));
599 write_header_name (struct tar_stat_info
*st
)
601 if (archive_format
== POSIX_FORMAT
&& !string_ascii_p (st
->file_name
))
603 xheader_store ("path", st
, NULL
);
604 return write_short_name (st
);
606 else if (NAME_FIELD_SIZE
- (archive_format
== OLDGNU_FORMAT
)
607 < strlen (st
->file_name
))
608 return write_long_name (st
);
610 return write_short_name (st
);
614 /* Header handling. */
616 /* Make a header block for the file whose stat info is st,
617 and return its address. */
620 start_header (struct tar_stat_info
*st
)
624 header
= write_header_name (st
);
628 /* Override some stat fields, if requested to do so. */
630 if (owner_option
!= (uid_t
) -1)
631 st
->stat
.st_uid
= owner_option
;
632 if (group_option
!= (gid_t
) -1)
633 st
->stat
.st_gid
= group_option
;
636 ((st
->stat
.st_mode
& ~MODE_ALL
)
637 | mode_adjust (st
->stat
.st_mode
, mode_option
, initial_umask
));
639 /* Paul Eggert tried the trivial test ($WRITER cf a b; $READER tvf a)
640 for a few tars and came up with the following interoperability
644 1 2 3 4 5 6 7 8 9 READER
645 . . . . . . . . . 1 = SunOS 4.2 tar
646 # . . # # . . # # 2 = NEC SVR4.0.2 tar
647 . . . # # . . # . 3 = Solaris 2.1 tar
648 . . . . . . . . . 4 = GNU tar 1.11.1
649 . . . . . . . . . 5 = HP-UX 8.07 tar
650 . . . . . . . . . 6 = Ultrix 4.1
651 . . . . . . . . . 7 = AIX 3.2
652 . . . . . . . . . 8 = Hitachi HI-UX 1.03
653 . . . . . . . . . 9 = Omron UNIOS-B 4.3BSD 1.60Beta
656 # = ``impossible file type''
658 The following mask for old archive removes the `#'s in column 4
659 above, thus making GNU tar both a universal donor and a universal
660 acceptor for Paul's test. */
662 if (archive_format
== V7_FORMAT
|| archive_format
== USTAR_FORMAT
)
663 MODE_TO_CHARS (st
->stat
.st_mode
& MODE_ALL
, header
->header
.mode
);
665 MODE_TO_CHARS (st
->stat
.st_mode
, header
->header
.mode
);
668 uid_t uid
= st
->stat
.st_uid
;
669 if (archive_format
== POSIX_FORMAT
670 && MAX_OCTAL_VAL (header
->header
.uid
) < uid
)
672 xheader_store ("uid", st
, NULL
);
675 UID_TO_CHARS (uid
, header
->header
.uid
);
679 gid_t gid
= st
->stat
.st_gid
;
680 if (archive_format
== POSIX_FORMAT
681 && MAX_OCTAL_VAL (header
->header
.gid
) < gid
)
683 xheader_store ("gid", st
, NULL
);
686 GID_TO_CHARS (gid
, header
->header
.gid
);
690 off_t size
= st
->stat
.st_size
;
691 if (archive_format
== POSIX_FORMAT
692 && MAX_OCTAL_VAL (header
->header
.size
) < size
)
694 xheader_store ("size", st
, NULL
);
697 OFF_TO_CHARS (size
, header
->header
.size
);
701 struct timespec mtime
= st
->mtime
;
702 if (archive_format
== POSIX_FORMAT
)
704 if (MAX_OCTAL_VAL (header
->header
.mtime
) < mtime
.tv_sec
705 || mtime
.tv_nsec
!= 0)
706 xheader_store ("mtime", st
, NULL
);
707 if (MAX_OCTAL_VAL (header
->header
.mtime
) < mtime
.tv_sec
)
710 TIME_TO_CHARS (mtime
.tv_sec
, header
->header
.mtime
);
714 if (S_ISCHR (st
->stat
.st_mode
)
715 || S_ISBLK (st
->stat
.st_mode
))
717 major_t devmajor
= major (st
->stat
.st_rdev
);
718 minor_t devminor
= minor (st
->stat
.st_rdev
);
720 if (archive_format
== POSIX_FORMAT
721 && MAX_OCTAL_VAL (header
->header
.devmajor
) < devmajor
)
723 xheader_store ("devmajor", st
, NULL
);
726 MAJOR_TO_CHARS (devmajor
, header
->header
.devmajor
);
728 if (archive_format
== POSIX_FORMAT
729 && MAX_OCTAL_VAL (header
->header
.devminor
) < devminor
)
731 xheader_store ("devminor", st
, NULL
);
734 MINOR_TO_CHARS (devminor
, header
->header
.devminor
);
736 else if (archive_format
!= GNU_FORMAT
&& archive_format
!= OLDGNU_FORMAT
)
738 MAJOR_TO_CHARS (0, header
->header
.devmajor
);
739 MINOR_TO_CHARS (0, header
->header
.devminor
);
742 if (archive_format
== POSIX_FORMAT
)
744 xheader_store ("atime", st
, NULL
);
745 xheader_store ("ctime", st
, NULL
);
747 else if (incremental_option
)
748 if (archive_format
== OLDGNU_FORMAT
|| archive_format
== GNU_FORMAT
)
750 TIME_TO_CHARS (st
->atime
.tv_sec
, header
->oldgnu_header
.atime
);
751 TIME_TO_CHARS (st
->ctime
.tv_sec
, header
->oldgnu_header
.ctime
);
754 header
->header
.typeflag
= archive_format
== V7_FORMAT
? AREGTYPE
: REGTYPE
;
756 switch (archive_format
)
762 case GNU_FORMAT
: /*FIXME?*/
763 /* Overwrite header->header.magic and header.version in one blow. */
764 strcpy (header
->header
.magic
, OLDGNU_MAGIC
);
769 strncpy (header
->header
.magic
, TMAGIC
, TMAGLEN
);
770 strncpy (header
->header
.version
, TVERSION
, TVERSLEN
);
777 if (archive_format
== V7_FORMAT
|| numeric_owner_option
)
779 /* header->header.[ug]name are left as the empty string. */
783 uid_to_uname (st
->stat
.st_uid
, &st
->uname
);
784 gid_to_gname (st
->stat
.st_gid
, &st
->gname
);
786 if (archive_format
== POSIX_FORMAT
787 && (strlen (st
->uname
) > UNAME_FIELD_SIZE
788 || !string_ascii_p (st
->uname
)))
789 xheader_store ("uname", st
, NULL
);
790 UNAME_TO_CHARS (st
->uname
, header
->header
.uname
);
792 if (archive_format
== POSIX_FORMAT
793 && (strlen (st
->gname
) > GNAME_FIELD_SIZE
794 || !string_ascii_p (st
->gname
)))
795 xheader_store ("gname", st
, NULL
);
796 GNAME_TO_CHARS (st
->gname
, header
->header
.gname
);
803 simple_finish_header (union block
*header
)
809 memcpy (header
->header
.chksum
, CHKBLANKS
, sizeof header
->header
.chksum
);
813 for (i
= sizeof *header
; i
-- != 0; )
814 /* We can't use unsigned char here because of old compilers, e.g. V7. */
817 /* Fill in the checksum field. It's formatted differently from the
818 other fields: it has [6] digits, a null, then a space -- rather than
819 digits, then a null. We use to_chars.
820 The final space is already there, from
821 checksumming, and to_chars doesn't modify it.
823 This is a fast way to do:
825 sprintf(header->header.chksum, "%6o", sum); */
827 uintmax_to_chars ((uintmax_t) sum
, header
->header
.chksum
, 7);
829 set_next_block_after (header
);
832 /* Finish off a filled-in header block and write it out. We also
833 print the file name and/or full info if verbose is on. If BLOCK_ORDINAL
834 is not negative, is the block ordinal of the first record for this
835 file, which may be a preceding long name or long link record. */
837 finish_header (struct tar_stat_info
*st
,
838 union block
*header
, off_t block_ordinal
)
840 /* Note: It is important to do this before the call to write_extended(),
841 so that the actual ustar header is printed */
843 && header
->header
.typeflag
!= GNUTYPE_LONGLINK
844 && header
->header
.typeflag
!= GNUTYPE_LONGNAME
845 && header
->header
.typeflag
!= XHDTYPE
846 && header
->header
.typeflag
!= XGLTYPE
)
848 /* These globals are parameters to print_header, sigh. */
850 current_header
= header
;
851 current_format
= archive_format
;
852 print_header (st
, block_ordinal
);
855 header
= write_extended (st
, header
);
856 simple_finish_header (header
);
861 pad_archive (off_t size_left
)
864 while (size_left
> 0)
866 save_sizeleft
= size_left
;
867 blk
= find_next_block ();
868 memset (blk
->buffer
, 0, BLOCKSIZE
);
869 set_next_block_after (blk
);
870 size_left
-= BLOCKSIZE
;
874 static enum dump_status
875 dump_regular_file (int fd
, struct tar_stat_info
*st
)
877 off_t size_left
= st
->stat
.st_size
;
881 block_ordinal
= current_block_ordinal ();
882 blk
= start_header (st
);
884 return dump_status_fail
;
886 /* Mark contiguous files, if we support them. */
887 if (archive_format
!= V7_FORMAT
&& S_ISCTG (st
->stat
.st_mode
))
888 blk
->header
.typeflag
= CONTTYPE
;
890 finish_header (st
, blk
, block_ordinal
);
892 while (size_left
> 0)
894 size_t bufsize
, count
;
896 if (multi_volume_option
)
898 assign_string (&save_name
, st
->orig_file_name
);
899 save_sizeleft
= size_left
;
900 save_totsize
= st
->stat
.st_size
;
902 blk
= find_next_block ();
904 bufsize
= available_space_after (blk
);
906 if (size_left
< bufsize
)
908 /* Last read -- zero out area beyond. */
910 count
= bufsize
% BLOCKSIZE
;
912 memset (blk
->buffer
+ size_left
, 0, BLOCKSIZE
- count
);
915 count
= (fd
< 0) ? bufsize
: safe_read (fd
, blk
->buffer
, bufsize
);
916 if (count
== SAFE_READ_ERROR
)
918 read_diag_details (st
->orig_file_name
,
919 st
->stat
.st_size
- size_left
, bufsize
);
920 pad_archive (size_left
);
921 return dump_status_short
;
925 set_next_block_after (blk
+ (bufsize
- 1) / BLOCKSIZE
);
927 if (count
!= bufsize
)
929 char buf
[UINTMAX_STRSIZE_BOUND
];
930 memset (blk
->buffer
+ count
, 0, bufsize
- count
);
932 ngettext ("%s: File shrank by %s byte; padding with zeros",
933 "%s: File shrank by %s bytes; padding with zeros",
935 quotearg_colon (st
->orig_file_name
),
936 STRINGIFY_BIGINT (size_left
, buf
)));
937 if (! ignore_failed_read_option
)
938 exit_status
= TAREXIT_FAILURE
;
939 pad_archive (size_left
- (bufsize
-count
));
940 return dump_status_short
;
943 return dump_status_ok
;
947 dump_regular_finish (int fd
, struct tar_stat_info
*st
,
948 struct timespec original_ctime
)
952 struct stat final_stat
;
953 if (fstat (fd
, &final_stat
) != 0)
955 stat_diag (st
->orig_file_name
);
957 else if (timespec_cmp (get_stat_ctime (&final_stat
), original_ctime
)
960 WARN ((0, 0, _("%s: file changed as we read it"),
961 quotearg_colon (st
->orig_file_name
)));
965 close_diag (st
->orig_file_name
);
968 if (remove_files_option
)
970 if (unlink (st
->orig_file_name
) == -1)
971 unlink_error (st
->orig_file_name
);
975 /* Look in directory DIRNAME for a cache directory tag file
976 with the magic name "CACHEDIR.TAG" and a standard header,
978 http://www.brynosaurus.com/cachedir
979 Applications can write this file into directories they create
980 for use as caches containing purely regenerable, non-precious data,
981 allowing us to avoid archiving them if --exclude-caches is specified. */
983 #define CACHEDIR_SIGNATURE "Signature: 8a477f597d28d172789f06886806bc55"
984 #define CACHEDIR_SIGNATURE_SIZE (sizeof CACHEDIR_SIGNATURE - 1)
987 check_cache_directory (char *dirname
)
989 static char tagname
[] = "CACHEDIR.TAG";
992 int tag_present
= false;
994 tagpath
= xmalloc (strlen (dirname
) + strlen (tagname
) + 1);
995 strcpy (tagpath
, dirname
);
996 strcat (tagpath
, tagname
);
998 fd
= open (tagpath
, O_RDONLY
);
1001 static char tagbuf
[CACHEDIR_SIGNATURE_SIZE
];
1003 if (read (fd
, tagbuf
, CACHEDIR_SIGNATURE_SIZE
)
1004 == CACHEDIR_SIGNATURE_SIZE
1005 && memcmp (tagbuf
, CACHEDIR_SIGNATURE
, CACHEDIR_SIGNATURE_SIZE
) == 0)
1017 dump_dir0 (char *directory
,
1018 struct tar_stat_info
*st
, int top_level
, dev_t parent_device
)
1020 dev_t our_device
= st
->stat
.st_dev
;
1022 if (!is_avoided_name (st
->orig_file_name
))
1024 union block
*blk
= NULL
;
1025 off_t block_ordinal
= current_block_ordinal ();
1026 st
->stat
.st_size
= 0; /* force 0 size on dir */
1028 blk
= start_header (st
);
1032 if (incremental_option
)
1033 blk
->header
.typeflag
= GNUTYPE_DUMPDIR
;
1034 else /* if (standard_option) */
1035 blk
->header
.typeflag
= DIRTYPE
;
1037 /* If we're gnudumping, we aren't done yet so don't close it. */
1039 if (!incremental_option
)
1040 finish_header (st
, blk
, block_ordinal
);
1041 else if (gnu_list_name
->dir_contents
)
1047 const char *buffer
, *p_buffer
;
1049 block_ordinal
= current_block_ordinal ();
1050 buffer
= gnu_list_name
->dir_contents
; /* FOO */
1053 for (p_buffer
= buffer
; *p_buffer
; )
1055 size_t size
= strlen (p_buffer
) + 1;
1060 OFF_TO_CHARS (totsize
, blk
->header
.size
);
1061 finish_header (st
, blk
, block_ordinal
);
1063 size_left
= totsize
;
1064 while (size_left
> 0)
1066 if (multi_volume_option
)
1068 assign_string (&save_name
, st
->orig_file_name
);
1069 save_sizeleft
= size_left
;
1070 save_totsize
= totsize
;
1072 blk
= find_next_block ();
1073 bufsize
= available_space_after (blk
);
1074 if (size_left
< bufsize
)
1076 bufsize
= size_left
;
1077 count
= bufsize
% BLOCKSIZE
;
1079 memset (blk
->buffer
+ size_left
, 0, BLOCKSIZE
- count
);
1081 memcpy (blk
->buffer
, p_buffer
, bufsize
);
1082 size_left
-= bufsize
;
1083 p_buffer
+= bufsize
;
1084 set_next_block_after (blk
+ (bufsize
- 1) / BLOCKSIZE
);
1086 if (multi_volume_option
)
1087 assign_string (&save_name
, 0);
1092 if (!recursion_option
)
1095 if (one_file_system_option
1097 && parent_device
!= st
->stat
.st_dev
)
1101 _("%s: file is on a different filesystem; not dumped"),
1102 quotearg_colon (st
->orig_file_name
)));
1106 if (exclude_caches_option
1107 && check_cache_directory(st
->orig_file_name
))
1111 _("%s: contains a cache directory tag; not dumped"),
1112 quotearg_colon (st
->orig_file_name
)));
1119 char *name_buf
= xstrdup (st
->orig_file_name
);
1120 size_t name_size
= strlen (name_buf
);
1121 size_t name_len
= name_size
;
1123 /* Now output all the files in the directory. */
1124 /* FIXME: Should speed this up by cd-ing into the dir. */
1126 for (entry
= directory
; (entry_len
= strlen (entry
)) != 0;
1127 entry
+= entry_len
+ 1)
1129 if (name_size
< name_len
+ entry_len
)
1131 name_size
= name_len
+ entry_len
;
1132 name_buf
= xrealloc (name_buf
, name_size
+ 1);
1134 strcpy (name_buf
+ name_len
, entry
);
1135 if (!excluded_name (name_buf
))
1136 dump_file (name_buf
, 0, our_device
);
1143 /* Ensure exactly one trailing slash. */
1145 ensure_slash (char **pstr
)
1147 size_t len
= strlen (*pstr
);
1148 while (len
>= 1 && ISSLASH ((*pstr
)[len
- 1]))
1150 if (!ISSLASH ((*pstr
)[len
]))
1151 *pstr
= xrealloc (*pstr
, len
+ 2);
1152 (*pstr
)[len
++] = '/';
1153 (*pstr
)[len
] = '\0';
1157 dump_dir (struct tar_stat_info
*st
, int top_level
, dev_t parent_device
)
1161 directory
= savedir (st
->orig_file_name
);
1164 savedir_diag (st
->orig_file_name
);
1168 ensure_slash (&st
->orig_file_name
);
1169 ensure_slash (&st
->file_name
);
1171 dump_dir0 (directory
, st
, top_level
, parent_device
);
1178 /* Main functions of this module. */
1181 create_archive (void)
1185 open_archive (ACCESS_WRITE
);
1186 xheader_write_global ();
1188 if (incremental_option
)
1190 size_t buffer_size
= 1000;
1191 char *buffer
= xmalloc (buffer_size
);
1194 collect_and_sort_names ();
1196 while ((p
= name_from_list ()) != NULL
)
1197 if (!excluded_name (p
))
1198 dump_file (p
, -1, (dev_t
) 0);
1201 while ((p
= name_from_list ()) != NULL
)
1202 if (!excluded_name (p
))
1204 size_t plen
= strlen (p
);
1205 if (buffer_size
<= plen
)
1207 while ((buffer_size
*= 2) <= plen
)
1209 buffer
= xrealloc (buffer
, buffer_size
);
1211 memcpy (buffer
, p
, plen
);
1212 if (! ISSLASH (buffer
[plen
- 1]))
1213 buffer
[plen
++] = '/';
1214 q
= gnu_list_name
->dir_contents
;
1218 size_t qlen
= strlen (q
);
1221 if (buffer_size
< plen
+ qlen
)
1223 while ((buffer_size
*=2 ) < plen
+ qlen
)
1225 buffer
= xrealloc (buffer
, buffer_size
);
1227 strcpy (buffer
+ plen
, q
+ 1);
1228 dump_file (buffer
, -1, (dev_t
) 0);
1237 while ((p
= name_next (1)) != NULL
)
1238 if (!excluded_name (p
))
1239 dump_file (p
, 1, (dev_t
) 0);
1245 if (listed_incremental_option
)
1246 write_directory_file ();
1250 /* Calculate the hash of a link. */
1252 hash_link (void const *entry
, size_t n_buckets
)
1254 struct link
const *l
= entry
;
1255 uintmax_t num
= l
->dev
^ l
->ino
;
1256 return num
% n_buckets
;
1259 /* Compare two links for equality. */
1261 compare_links (void const *entry1
, void const *entry2
)
1263 struct link
const *link1
= entry1
;
1264 struct link
const *link2
= entry2
;
1265 return ((link1
->dev
^ link2
->dev
) | (link1
->ino
^ link2
->ino
)) == 0;
1269 unknown_file_error (char *p
)
1271 WARN ((0, 0, _("%s: Unknown file type; file ignored"),
1272 quotearg_colon (p
)));
1273 if (!ignore_failed_read_option
)
1274 exit_status
= TAREXIT_FAILURE
;
1278 /* Handling of hard links */
1280 /* Table of all non-directories that we've written so far. Any time
1281 we see another, we check the table and avoid dumping the data
1282 again if we've done it once already. */
1283 static Hash_table
*link_table
;
1285 /* Try to dump stat as a hard link to another file in the archive. If
1286 succeeded returns true */
1288 dump_hard_link (struct tar_stat_info
*st
)
1290 if (link_table
&& st
->stat
.st_nlink
> 1)
1293 struct link
*duplicate
;
1294 off_t block_ordinal
;
1297 lp
.ino
= st
->stat
.st_ino
;
1298 lp
.dev
= st
->stat
.st_dev
;
1300 if ((duplicate
= hash_lookup (link_table
, &lp
)))
1302 /* We found a link. */
1303 char const *link_name
= safer_name_suffix (duplicate
->name
, true,
1304 absolute_names_option
);
1308 block_ordinal
= current_block_ordinal ();
1309 assign_string (&st
->link_name
, link_name
);
1310 if (NAME_FIELD_SIZE
- (archive_format
== OLDGNU_FORMAT
)
1311 < strlen (link_name
))
1312 write_long_link (st
);
1314 st
->stat
.st_size
= 0;
1315 blk
= start_header (st
);
1318 tar_copy_str (blk
->header
.linkname
, link_name
, NAME_FIELD_SIZE
);
1320 blk
->header
.typeflag
= LNKTYPE
;
1321 finish_header (st
, blk
, block_ordinal
);
1323 if (remove_files_option
&& unlink (st
->orig_file_name
) != 0)
1324 unlink_error (st
->orig_file_name
);
1333 file_count_links (struct tar_stat_info
*st
)
1335 if (st
->stat
.st_nlink
> 1)
1337 struct link
*duplicate
;
1338 struct link
*lp
= xmalloc (offsetof (struct link
, name
)
1339 + strlen (st
->orig_file_name
) + 1);
1340 lp
->ino
= st
->stat
.st_ino
;
1341 lp
->dev
= st
->stat
.st_dev
;
1342 lp
->nlink
= st
->stat
.st_nlink
;
1343 strcpy (lp
->name
, st
->orig_file_name
);
1346 || (link_table
= hash_initialize (0, 0, hash_link
,
1348 && (duplicate
= hash_insert (link_table
, lp
))))
1351 if (duplicate
!= lp
)
1357 /* For each dumped file, check if all its links were dumped. Emit
1358 warnings if it is not so. */
1367 for (lp
= hash_get_first (link_table
); lp
;
1368 lp
= hash_get_next (link_table
, lp
))
1372 WARN ((0, 0, _("Missing links to %s.\n"), quote (lp
->name
)));
1378 /* Dump a single file, recursing on directories. P is the file name
1379 to dump. TOP_LEVEL tells whether this is a top-level call; zero
1380 means no, positive means yes, and negative means the top level
1381 of an incremental dump. PARENT_DEVICE is the device of P's
1382 parent directory; it is examined only if TOP_LEVEL is zero. */
1384 /* FIXME: One should make sure that for *every* path leading to setting
1385 exit_status to failure, a clear diagnostic has been issued. */
1388 dump_file0 (struct tar_stat_info
*st
, char *p
,
1389 int top_level
, dev_t parent_device
)
1391 union block
*header
;
1393 struct timespec original_ctime
;
1394 struct timespec restore_times
[2];
1395 off_t block_ordinal
= -1;
1397 if (interactive_option
&& !confirm ("add", p
))
1400 assign_string (&st
->orig_file_name
, p
);
1401 assign_string (&st
->file_name
,
1402 safer_name_suffix (p
, false, absolute_names_option
));
1404 if (deref_stat (dereference_option
, p
, &st
->stat
) != 0)
1409 st
->archive_file_size
= st
->stat
.st_size
;
1410 st
->atime
= restore_times
[0] = get_stat_atime (&st
->stat
);
1411 st
->mtime
= restore_times
[1] = get_stat_mtime (&st
->stat
);
1412 st
->ctime
= original_ctime
= get_stat_ctime (&st
->stat
);
1415 if (S_ISHIDDEN (st
->stat
.st_mode
))
1417 char *new = (char *) alloca (strlen (p
) + 2);
1427 /* See if we want only new files, and check if this one is too old to
1430 This check is omitted if incremental_option is set *and* the
1431 requested file is not explicitely listed in the command line. */
1433 if (!(incremental_option
&& !is_individual_file (p
))
1434 && !S_ISDIR (st
->stat
.st_mode
)
1435 && OLDER_TAR_STAT_TIME (*st
, m
)
1436 && (!after_date_option
|| OLDER_TAR_STAT_TIME (*st
, c
)))
1438 if (!incremental_option
&& verbose_option
)
1439 WARN ((0, 0, _("%s: file is unchanged; not dumped"),
1440 quotearg_colon (p
)));
1444 /* See if we are trying to dump the archive. */
1445 if (sys_file_is_archive (st
))
1447 WARN ((0, 0, _("%s: file is the archive; not dumped"),
1448 quotearg_colon (p
)));
1452 if (is_avoided_name (p
))
1454 if (S_ISDIR (st
->stat
.st_mode
))
1456 dump_dir (st
, top_level
, parent_device
);
1457 if (atime_preserve_option
)
1458 utimens (p
, restore_times
);
1463 /* Check for multiple links. */
1464 if (dump_hard_link (st
))
1467 /* This is not a link to a previously dumped file, so dump it. */
1469 if (S_ISREG (st
->stat
.st_mode
)
1470 || S_ISCTG (st
->stat
.st_mode
))
1473 enum dump_status status
;
1475 if (file_dumpable_p (st
))
1477 fd
= open (st
->orig_file_name
,
1478 O_RDONLY
| O_BINARY
);
1481 if (!top_level
&& errno
== ENOENT
)
1482 WARN ((0, 0, _("%s: File removed before we read it"),
1483 quotearg_colon (st
->orig_file_name
)));
1485 open_diag (st
->orig_file_name
);
1492 if (fd
!= -1 && sparse_option
&& sparse_file_p (st
))
1494 status
= sparse_dump_file (fd
, st
);
1495 if (status
== dump_status_not_implemented
)
1496 status
= dump_regular_file (fd
, st
);
1499 status
= dump_regular_file (fd
, st
);
1503 case dump_status_ok
:
1504 if (multi_volume_option
)
1505 assign_string (&save_name
, 0);
1506 dump_regular_finish (fd
, st
, original_ctime
);
1509 case dump_status_short
:
1510 if (multi_volume_option
)
1511 assign_string (&save_name
, 0);
1515 case dump_status_fail
:
1519 case dump_status_not_implemented
:
1523 if (atime_preserve_option
)
1524 utimens (st
->orig_file_name
, restore_times
);
1525 file_count_links (st
);
1528 #ifdef HAVE_READLINK
1529 else if (S_ISLNK (st
->stat
.st_mode
))
1533 size_t linklen
= st
->stat
.st_size
;
1534 if (linklen
!= st
->stat
.st_size
|| linklen
+ 1 == 0)
1536 buffer
= (char *) alloca (linklen
+ 1);
1537 size
= readlink (p
, buffer
, linklen
+ 1);
1543 buffer
[size
] = '\0';
1544 assign_string (&st
->link_name
, buffer
);
1545 if (NAME_FIELD_SIZE
- (archive_format
== OLDGNU_FORMAT
) < size
)
1546 write_long_link (st
);
1548 block_ordinal
= current_block_ordinal ();
1549 st
->stat
.st_size
= 0; /* force 0 size on symlink */
1550 header
= start_header (st
);
1553 tar_copy_str (header
->header
.linkname
, buffer
, NAME_FIELD_SIZE
);
1554 header
->header
.typeflag
= SYMTYPE
;
1555 finish_header (st
, header
, block_ordinal
);
1556 /* nothing more to do to it */
1558 if (remove_files_option
)
1560 if (unlink (p
) == -1)
1563 file_count_links (st
);
1567 else if (S_ISCHR (st
->stat
.st_mode
))
1569 else if (S_ISBLK (st
->stat
.st_mode
))
1571 else if (S_ISFIFO (st
->stat
.st_mode
))
1573 else if (S_ISSOCK (st
->stat
.st_mode
))
1575 WARN ((0, 0, _("%s: socket ignored"), quotearg_colon (p
)));
1578 else if (S_ISDOOR (st
->stat
.st_mode
))
1580 WARN ((0, 0, _("%s: door ignored"), quotearg_colon (p
)));
1585 unknown_file_error (p
);
1590 if (archive_format
== V7_FORMAT
)
1592 unknown_file_error (p
);
1596 block_ordinal
= current_block_ordinal ();
1597 st
->stat
.st_size
= 0; /* force 0 size */
1598 header
= start_header (st
);
1601 header
->header
.typeflag
= type
;
1603 if (type
!= FIFOTYPE
)
1605 MAJOR_TO_CHARS (major (st
->stat
.st_rdev
),
1606 header
->header
.devmajor
);
1607 MINOR_TO_CHARS (minor (st
->stat
.st_rdev
),
1608 header
->header
.devminor
);
1611 finish_header (st
, header
, block_ordinal
);
1612 if (remove_files_option
)
1614 if (unlink (p
) == -1)
1620 dump_file (char *p
, int top_level
, dev_t parent_device
)
1622 struct tar_stat_info st
;
1623 tar_stat_init (&st
);
1624 dump_file0 (&st
, p
, top_level
, parent_device
);
1625 if (listed_incremental_option
)
1626 update_parent_directory (p
);
1627 tar_stat_destroy (&st
);