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. */
47 /* The maximum uintmax_t value that can be represented with DIGITS digits,
48 assuming that each digit is BITS_PER_DIGIT wide. */
49 #define MAX_VAL_WITH_DIGITS(digits, bits_per_digit) \
50 ((digits) * (bits_per_digit) < sizeof (uintmax_t) * CHAR_BIT \
51 ? ((uintmax_t) 1 << ((digits) * (bits_per_digit))) - 1 \
54 /* Convert VALUE to an octal representation suitable for tar headers.
55 Output to buffer WHERE with size SIZE.
56 The result is undefined if SIZE is 0 or if VALUE is too large to fit. */
59 to_octal (uintmax_t value
, char *where
, size_t size
)
66 where
[--i
] = '0' + (v
& ((1 << LG_8
) - 1));
72 /* Convert NEGATIVE VALUE to a base-256 representation suitable for
73 tar headers. NEGATIVE is 1 if VALUE was negative before being cast
74 to uintmax_t, 0 otherwise. Output to buffer WHERE with size SIZE.
75 The result is undefined if SIZE is 0 or if VALUE is too large to
79 to_base256 (int negative
, uintmax_t value
, char *where
, size_t size
)
82 uintmax_t propagated_sign_bits
=
83 ((uintmax_t) - negative
<< (CHAR_BIT
* sizeof v
- LG_256
));
88 where
[--i
] = v
& ((1 << LG_256
) - 1);
89 v
= propagated_sign_bits
| (v
>> LG_256
);
94 /* Convert NEGATIVE VALUE (which was originally of size VALSIZE) to
95 external form, using SUBSTITUTE (...) if VALUE won't fit. Output
96 to buffer WHERE with size SIZE. NEGATIVE is 1 iff VALUE was
97 negative before being cast to uintmax_t; its original bitpattern
98 can be deduced from VALSIZE, its original size before casting.
99 TYPE is the kind of value being output (useful for diagnostics).
100 Prefer the POSIX format of SIZE - 1 octal digits (with leading zero
101 digits), followed by '\0'. If this won't work, and if GNU or
102 OLDGNU format is allowed, use '\200' followed by base-256, or (if
103 NEGATIVE is nonzero) '\377' followed by two's complement base-256.
104 If neither format works, use SUBSTITUTE (...) instead. Pass to
105 SUBSTITUTE the address of an 0-or-1 flag recording whether the
106 substitute value is negative. */
109 to_chars (int negative
, uintmax_t value
, size_t valsize
,
110 uintmax_t (*substitute
) (int *),
111 char *where
, size_t size
, const char *type
)
113 int base256_allowed
= (archive_format
== GNU_FORMAT
114 || archive_format
== OLDGNU_FORMAT
);
116 /* Generate the POSIX octal representation if the number fits. */
117 if (! negative
&& value
<= MAX_VAL_WITH_DIGITS (size
- 1, LG_8
))
119 where
[size
- 1] = '\0';
120 to_octal (value
, where
, size
- 1);
123 /* Otherwise, generate the base-256 representation if we are
124 generating an old or new GNU format and if the number fits. */
125 else if (((negative
? -1 - value
: value
)
126 <= MAX_VAL_WITH_DIGITS (size
- 1, LG_256
))
129 where
[0] = negative
? -1 : 1 << (LG_256
- 1);
130 to_base256 (negative
, value
, where
+ 1, size
- 1);
133 /* Otherwise, if the number is negative, and if it would not cause
134 ambiguity on this host by confusing positive with negative
135 values, then generate the POSIX octal representation of the value
136 modulo 2**(field bits). The resulting tar file is
137 machine-dependent, since it depends on the host word size. Yuck!
138 But this is the traditional behavior. */
139 else if (negative
&& valsize
* CHAR_BIT
<= (size
- 1) * LG_8
)
141 static int warned_once
;
145 WARN ((0, 0, _("Generating negative octal headers")));
147 where
[size
- 1] = '\0';
148 to_octal (value
& MAX_VAL_WITH_DIGITS (valsize
* CHAR_BIT
, 1),
152 /* Otherwise, output a substitute value if possible (with a
153 warning), and an error message if not. */
156 uintmax_t maxval
= (base256_allowed
157 ? MAX_VAL_WITH_DIGITS (size
- 1, LG_256
)
158 : MAX_VAL_WITH_DIGITS (size
- 1, LG_8
));
159 char valbuf
[UINTMAX_STRSIZE_BOUND
+ 1];
160 char maxbuf
[UINTMAX_STRSIZE_BOUND
];
161 char minbuf
[UINTMAX_STRSIZE_BOUND
+ 1];
162 char const *minval_string
;
163 char const *maxval_string
= STRINGIFY_BIGINT (maxval
, maxbuf
);
164 char const *value_string
;
168 uintmax_t m
= maxval
+ 1 ? maxval
+ 1 : maxval
/ 2 + 1;
169 char *p
= STRINGIFY_BIGINT (m
, minbuf
+ 1);
178 char *p
= STRINGIFY_BIGINT (- value
, valbuf
+ 1);
183 value_string
= STRINGIFY_BIGINT (value
, valbuf
);
188 uintmax_t sub
= substitute (&negsub
) & maxval
;
189 /* FIXME: This is the only place where GNU_FORMAT differs from
190 OLDGNU_FORMAT. Apart from this they are completely identical. */
191 uintmax_t s
= (negsub
&= archive_format
== GNU_FORMAT
) ? - sub
: sub
;
192 char subbuf
[UINTMAX_STRSIZE_BOUND
+ 1];
193 char *sub_string
= STRINGIFY_BIGINT (s
, subbuf
+ 1);
196 WARN ((0, 0, _("value %s out of %s range %s..%s; substituting %s"),
197 value_string
, type
, minval_string
, maxval_string
,
199 to_chars (negsub
, s
, valsize
, 0, where
, size
, type
);
202 ERROR ((0, 0, _("value %s out of %s range %s..%s"),
203 value_string
, type
, minval_string
, maxval_string
));
208 gid_substitute (int *negative
)
214 static gid_t gid_nobody
;
215 if (!gid_nobody
&& !gname_to_gid ("nobody", &gid_nobody
))
224 gid_to_chars (gid_t v
, char *p
, size_t s
)
226 to_chars (v
< 0, (uintmax_t) v
, sizeof v
, gid_substitute
, p
, s
, "gid_t");
230 major_to_chars (major_t v
, char *p
, size_t s
)
232 to_chars (v
< 0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "major_t");
236 minor_to_chars (minor_t v
, char *p
, size_t s
)
238 to_chars (v
< 0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "minor_t");
242 mode_to_chars (mode_t v
, char *p
, size_t s
)
244 /* In the common case where the internal and external mode bits are the same,
245 and we are not using POSIX or GNU format,
246 propagate all unknown bits to the external mode.
247 This matches historical practice.
248 Otherwise, just copy the bits we know about. */
251 if (S_ISUID
== TSUID
&& S_ISGID
== TSGID
&& S_ISVTX
== TSVTX
252 && S_IRUSR
== TUREAD
&& S_IWUSR
== TUWRITE
&& S_IXUSR
== TUEXEC
253 && S_IRGRP
== TGREAD
&& S_IWGRP
== TGWRITE
&& S_IXGRP
== TGEXEC
254 && S_IROTH
== TOREAD
&& S_IWOTH
== TOWRITE
&& S_IXOTH
== TOEXEC
255 && archive_format
!= POSIX_FORMAT
256 && archive_format
!= USTAR_FORMAT
257 && archive_format
!= GNU_FORMAT
)
265 u
= ((v
& S_ISUID
? TSUID
: 0)
266 | (v
& S_ISGID
? TSGID
: 0)
267 | (v
& S_ISVTX
? TSVTX
: 0)
268 | (v
& S_IRUSR
? TUREAD
: 0)
269 | (v
& S_IWUSR
? TUWRITE
: 0)
270 | (v
& S_IXUSR
? TUEXEC
: 0)
271 | (v
& S_IRGRP
? TGREAD
: 0)
272 | (v
& S_IWGRP
? TGWRITE
: 0)
273 | (v
& S_IXGRP
? TGEXEC
: 0)
274 | (v
& S_IROTH
? TOREAD
: 0)
275 | (v
& S_IWOTH
? TOWRITE
: 0)
276 | (v
& S_IXOTH
? TOEXEC
: 0));
278 to_chars (negative
, u
, sizeof v
, 0, p
, s
, "mode_t");
282 off_to_chars (off_t v
, char *p
, size_t s
)
284 to_chars (v
< 0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "off_t");
288 size_to_chars (size_t v
, char *p
, size_t s
)
290 to_chars (0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "size_t");
294 time_to_chars (time_t v
, char *p
, size_t s
)
296 to_chars (v
< 0, (uintmax_t) v
, sizeof v
, 0, p
, s
, "time_t");
300 uid_substitute (int *negative
)
306 static uid_t uid_nobody
;
307 if (!uid_nobody
&& !uname_to_uid ("nobody", &uid_nobody
))
316 uid_to_chars (uid_t v
, char *p
, size_t s
)
318 to_chars (v
< 0, (uintmax_t) v
, sizeof v
, uid_substitute
, p
, s
, "uid_t");
322 uintmax_to_chars (uintmax_t v
, char *p
, size_t s
)
324 to_chars (0, v
, sizeof v
, 0, p
, s
, "uintmax_t");
328 string_to_chars (char *str
, char *p
, size_t s
)
335 /* A file is not dumpable if
336 a) it is empty *and* world-readable, or
337 b) current archive is /dev/null */
340 file_dumpable_p (struct tar_stat_info
*st
)
342 return !(dev_null_output
343 || (st
->archive_file_size
== 0
344 && (st
->stat
.st_mode
& MODE_R
) == MODE_R
));
348 /* Writing routines. */
350 /* Write the EOT block(s). Zero at least two blocks, through the end
351 of the record. Old tar, as previous versions of GNU tar, writes
352 garbage after two zeroed blocks. */
356 union block
*pointer
= find_next_block ();
357 memset (pointer
->buffer
, 0, BLOCKSIZE
);
358 set_next_block_after (pointer
);
359 pointer
= find_next_block ();
360 memset (pointer
->buffer
, 0, available_space_after (pointer
));
361 set_next_block_after (pointer
);
364 /* Copy at most LEN bytes from SRC to DST. Terminate with NUL unless
365 SRC is LEN characters long */
367 tar_copy_str (char *dst
, const char *src
, size_t len
)
370 strncpy (dst
, src
, len
);
373 /* Same as tar_copy_str, but always terminate with NUL if using
376 tar_name_copy_str (char *dst
, const char *src
, size_t len
)
378 tar_copy_str (dst
, src
, len
);
379 if (archive_format
== OLDGNU_FORMAT
)
383 /* Write a "private" header */
385 start_private_header (const char *name
, size_t size
)
388 union block
*header
= find_next_block ();
390 memset (header
->buffer
, 0, sizeof (union block
));
392 tar_name_copy_str (header
->header
.name
, name
, NAME_FIELD_SIZE
);
393 OFF_TO_CHARS (size
, header
->header
.size
);
396 TIME_TO_CHARS (t
, header
->header
.mtime
);
397 MODE_TO_CHARS (S_IFREG
|S_IRUSR
|S_IWUSR
|S_IRGRP
|S_IROTH
, header
->header
.mode
);
398 UID_TO_CHARS (getuid (), header
->header
.uid
);
399 GID_TO_CHARS (getgid (), header
->header
.gid
);
400 MAJOR_TO_CHARS (0, header
->header
.devmajor
);
401 MAJOR_TO_CHARS (0, header
->header
.devminor
);
402 strncpy (header
->header
.magic
, TMAGIC
, TMAGLEN
);
403 strncpy (header
->header
.version
, TVERSION
, TVERSLEN
);
407 /* Create a new header and store there at most NAME_FIELD_SIZE bytes of
411 write_short_name (struct tar_stat_info
*st
)
413 union block
*header
= find_next_block ();
414 memset (header
->buffer
, 0, sizeof (union block
));
415 tar_name_copy_str (header
->header
.name
, st
->file_name
, NAME_FIELD_SIZE
);
419 #define FILL(field,byte) do { \
420 memset(field, byte, sizeof(field)-1); \
421 (field)[sizeof(field)-1] = 0; \
424 /* Write a GNUTYPE_LONGLINK or GNUTYPE_LONGNAME block. */
426 write_gnu_long_link (struct tar_stat_info
*st
, const char *p
, char type
)
428 size_t size
= strlen (p
) + 1;
433 header
= start_private_header ("././@LongLink", size
);
434 FILL(header
->header
.mtime
, '0');
435 FILL(header
->header
.mode
, '0');
436 FILL(header
->header
.uid
, '0');
437 FILL(header
->header
.gid
, '0');
438 FILL(header
->header
.devmajor
, 0);
439 FILL(header
->header
.devminor
, 0);
440 uid_to_uname (0, &tmpname
);
441 UNAME_TO_CHARS (tmpname
, header
->header
.uname
);
443 gid_to_gname (0, &tmpname
);
444 GNAME_TO_CHARS (tmpname
, header
->header
.gname
);
447 strcpy (header
->header
.magic
, OLDGNU_MAGIC
);
448 header
->header
.typeflag
= type
;
449 finish_header (st
, header
, -1);
451 header
= find_next_block ();
453 bufsize
= available_space_after (header
);
455 while (bufsize
< size
)
457 memcpy (header
->buffer
, p
, bufsize
);
460 set_next_block_after (header
+ (bufsize
- 1) / BLOCKSIZE
);
461 header
= find_next_block ();
462 bufsize
= available_space_after (header
);
464 memcpy (header
->buffer
, p
, size
);
465 memset (header
->buffer
+ size
, 0, bufsize
- size
);
466 set_next_block_after (header
+ (size
- 1) / BLOCKSIZE
);
470 split_long_name (const char *name
, size_t length
)
474 if (length
> PREFIX_FIELD_SIZE
)
475 length
= PREFIX_FIELD_SIZE
+2;
476 for (i
= length
- 1; i
> 0; i
--)
477 if (ISSLASH (name
[i
]))
483 write_ustar_long_name (const char *name
)
485 size_t length
= strlen (name
);
489 if (length
> PREFIX_FIELD_SIZE
+ NAME_FIELD_SIZE
+ 1)
491 ERROR ((0, 0, _("%s: file name is too long (max %d); not dumped"),
492 quotearg_colon (name
),
493 PREFIX_FIELD_SIZE
+ NAME_FIELD_SIZE
+ 1));
497 i
= split_long_name (name
, length
);
498 if (i
== 0 || length
- i
- 1 > NAME_FIELD_SIZE
)
501 _("%s: file name is too long (cannot be split); not dumped"),
502 quotearg_colon (name
)));
506 header
= find_next_block ();
507 memset (header
->buffer
, 0, sizeof (header
->buffer
));
508 memcpy (header
->header
.prefix
, name
, i
);
509 memcpy (header
->header
.name
, name
+ i
+ 1, length
- i
- 1);
514 /* Write a long link name, depending on the current archive format */
516 write_long_link (struct tar_stat_info
*st
)
518 switch (archive_format
)
521 xheader_store ("linkpath", st
, NULL
);
524 case V7_FORMAT
: /* old V7 tar format */
528 _("%s: link name is too long; not dumped"),
529 quotearg_colon (st
->link_name
)));
534 write_gnu_long_link (st
, st
->link_name
, GNUTYPE_LONGLINK
);
543 write_long_name (struct tar_stat_info
*st
)
545 switch (archive_format
)
548 xheader_store ("path", st
, NULL
);
552 if (strlen (st
->file_name
) > NAME_FIELD_SIZE
-1)
554 ERROR ((0, 0, _("%s: file name is too long (max %d); not dumped"),
555 quotearg_colon (st
->file_name
),
556 NAME_FIELD_SIZE
- 1));
563 return write_ustar_long_name (st
->file_name
);
567 write_gnu_long_link (st
, st
->file_name
, GNUTYPE_LONGNAME
);
573 return write_short_name (st
);
577 write_extended (struct tar_stat_info
*st
, union block
*old_header
)
579 union block
*header
, hp
;
582 if (extended_header
.buffer
|| extended_header
.stk
== NULL
)
585 xheader_finish (&extended_header
);
586 memcpy (hp
.buffer
, old_header
, sizeof (hp
));
587 p
= xheader_xhdr_name (st
);
588 xheader_write (XHDTYPE
, p
, &extended_header
);
590 header
= find_next_block ();
591 memcpy (header
, &hp
.buffer
, sizeof (hp
.buffer
));
596 write_header_name (struct tar_stat_info
*st
)
598 if (archive_format
== POSIX_FORMAT
&& !string_ascii_p (st
->file_name
))
600 xheader_store ("path", st
, NULL
);
601 return write_short_name (st
);
603 else if ((archive_format
== OLDGNU_FORMAT
604 && OLDGNU_NAME_FIELD_SIZE
< strlen (st
->file_name
))
605 || NAME_FIELD_SIZE
< strlen (st
->file_name
))
606 return write_long_name (st
);
608 return write_short_name (st
);
612 /* Header handling. */
614 /* Make a header block for the file whose stat info is st,
615 and return its address. */
618 start_header (struct tar_stat_info
*st
)
622 header
= write_header_name (st
);
626 /* Override some stat fields, if requested to do so. */
628 if (owner_option
!= (uid_t
) -1)
629 st
->stat
.st_uid
= owner_option
;
630 if (group_option
!= (gid_t
) -1)
631 st
->stat
.st_gid
= group_option
;
634 ((st
->stat
.st_mode
& ~MODE_ALL
)
635 | mode_adjust (st
->stat
.st_mode
, mode_option
, initial_umask
));
637 /* Paul Eggert tried the trivial test ($WRITER cf a b; $READER tvf a)
638 for a few tars and came up with the following interoperability
642 1 2 3 4 5 6 7 8 9 READER
643 . . . . . . . . . 1 = SunOS 4.2 tar
644 # . . # # . . # # 2 = NEC SVR4.0.2 tar
645 . . . # # . . # . 3 = Solaris 2.1 tar
646 . . . . . . . . . 4 = GNU tar 1.11.1
647 . . . . . . . . . 5 = HP-UX 8.07 tar
648 . . . . . . . . . 6 = Ultrix 4.1
649 . . . . . . . . . 7 = AIX 3.2
650 . . . . . . . . . 8 = Hitachi HI-UX 1.03
651 . . . . . . . . . 9 = Omron UNIOS-B 4.3BSD 1.60Beta
654 # = ``impossible file type''
656 The following mask for old archive removes the `#'s in column 4
657 above, thus making GNU tar both a universal donor and a universal
658 acceptor for Paul's test. */
660 if (archive_format
== V7_FORMAT
|| archive_format
== USTAR_FORMAT
)
661 MODE_TO_CHARS (st
->stat
.st_mode
& MODE_ALL
, header
->header
.mode
);
663 MODE_TO_CHARS (st
->stat
.st_mode
, header
->header
.mode
);
665 if (st
->stat
.st_uid
> MAXOCTAL7
&& archive_format
== POSIX_FORMAT
)
666 xheader_store ("uid", st
, NULL
);
668 UID_TO_CHARS (st
->stat
.st_uid
, header
->header
.uid
);
670 if (st
->stat
.st_gid
> MAXOCTAL7
&& archive_format
== POSIX_FORMAT
)
671 xheader_store ("gid", st
, NULL
);
673 GID_TO_CHARS (st
->stat
.st_gid
, header
->header
.gid
);
675 if (st
->stat
.st_size
> MAXOCTAL11
&& archive_format
== POSIX_FORMAT
)
676 xheader_store ("size", st
, NULL
);
678 OFF_TO_CHARS (st
->stat
.st_size
, header
->header
.size
);
680 TIME_TO_CHARS (st
->stat
.st_mtime
, header
->header
.mtime
);
683 if (S_ISCHR (st
->stat
.st_mode
)
684 || S_ISBLK (st
->stat
.st_mode
))
686 st
->devmajor
= major (st
->stat
.st_rdev
);
687 st
->devminor
= minor (st
->stat
.st_rdev
);
689 if (st
->devmajor
> MAXOCTAL7
&& archive_format
== POSIX_FORMAT
)
690 xheader_store ("devmajor", st
, NULL
);
692 MAJOR_TO_CHARS (st
->devmajor
, header
->header
.devmajor
);
694 if (st
->devminor
> MAXOCTAL7
&& archive_format
== POSIX_FORMAT
)
695 xheader_store ("devminor", st
, NULL
);
697 MAJOR_TO_CHARS (st
->devminor
, header
->header
.devminor
);
699 else if (archive_format
!= GNU_FORMAT
&& archive_format
!= OLDGNU_FORMAT
)
701 MAJOR_TO_CHARS (0, header
->header
.devmajor
);
702 MINOR_TO_CHARS (0, header
->header
.devminor
);
705 if (archive_format
== POSIX_FORMAT
)
707 xheader_store ("atime", st
, NULL
);
708 xheader_store ("ctime", st
, NULL
);
710 else if (incremental_option
)
711 if (archive_format
== OLDGNU_FORMAT
|| archive_format
== GNU_FORMAT
)
713 TIME_TO_CHARS (st
->stat
.st_atime
, header
->oldgnu_header
.atime
);
714 TIME_TO_CHARS (st
->stat
.st_ctime
, header
->oldgnu_header
.ctime
);
717 header
->header
.typeflag
= archive_format
== V7_FORMAT
? AREGTYPE
: REGTYPE
;
719 switch (archive_format
)
725 case GNU_FORMAT
: /*FIXME?*/
726 /* Overwrite header->header.magic and header.version in one blow. */
727 strcpy (header
->header
.magic
, OLDGNU_MAGIC
);
732 strncpy (header
->header
.magic
, TMAGIC
, TMAGLEN
);
733 strncpy (header
->header
.version
, TVERSION
, TVERSLEN
);
740 if (archive_format
== V7_FORMAT
|| numeric_owner_option
)
742 /* header->header.[ug]name are left as the empty string. */
746 uid_to_uname (st
->stat
.st_uid
, &st
->uname
);
747 gid_to_gname (st
->stat
.st_gid
, &st
->gname
);
749 if (archive_format
== POSIX_FORMAT
750 && (strlen (st
->uname
) > UNAME_FIELD_SIZE
751 || !string_ascii_p (st
->uname
)))
752 xheader_store ("uname", st
, NULL
);
754 UNAME_TO_CHARS (st
->uname
, header
->header
.uname
);
756 if (archive_format
== POSIX_FORMAT
757 && (strlen (st
->gname
) > GNAME_FIELD_SIZE
758 || !string_ascii_p (st
->gname
)))
759 xheader_store ("gname", st
, NULL
);
761 GNAME_TO_CHARS (st
->gname
, header
->header
.gname
);
768 simple_finish_header (union block
*header
)
774 memcpy (header
->header
.chksum
, CHKBLANKS
, sizeof header
->header
.chksum
);
778 for (i
= sizeof *header
; i
-- != 0; )
779 /* We can't use unsigned char here because of old compilers, e.g. V7. */
782 /* Fill in the checksum field. It's formatted differently from the
783 other fields: it has [6] digits, a null, then a space -- rather than
784 digits, then a null. We use to_chars.
785 The final space is already there, from
786 checksumming, and to_chars doesn't modify it.
788 This is a fast way to do:
790 sprintf(header->header.chksum, "%6o", sum); */
792 uintmax_to_chars ((uintmax_t) sum
, header
->header
.chksum
, 7);
794 set_next_block_after (header
);
797 /* Finish off a filled-in header block and write it out. We also
798 print the file name and/or full info if verbose is on. If BLOCK_ORDINAL
799 is not negative, is the block ordinal of the first record for this
800 file, which may be a preceding long name or long link record. */
802 finish_header (struct tar_stat_info
*st
,
803 union block
*header
, off_t block_ordinal
)
805 /* Note: It is important to do this before the call to write_extended(),
806 so that the actual ustar header is printed */
808 && header
->header
.typeflag
!= GNUTYPE_LONGLINK
809 && header
->header
.typeflag
!= GNUTYPE_LONGNAME
810 && header
->header
.typeflag
!= XHDTYPE
811 && header
->header
.typeflag
!= XGLTYPE
)
813 /* These globals are parameters to print_header, sigh. */
815 current_header
= header
;
816 current_format
= archive_format
;
817 print_header (st
, block_ordinal
);
820 header
= write_extended (st
, header
);
821 simple_finish_header (header
);
826 pad_archive (off_t size_left
)
829 while (size_left
> 0)
831 save_sizeleft
= size_left
;
832 blk
= find_next_block ();
833 memset (blk
->buffer
, 0, BLOCKSIZE
);
834 set_next_block_after (blk
);
835 size_left
-= BLOCKSIZE
;
839 static enum dump_status
840 dump_regular_file (int fd
, struct tar_stat_info
*st
)
842 off_t size_left
= st
->stat
.st_size
;
846 block_ordinal
= current_block_ordinal ();
847 blk
= start_header (st
);
849 return dump_status_fail
;
851 /* Mark contiguous files, if we support them. */
852 if (archive_format
!= V7_FORMAT
&& S_ISCTG (st
->stat
.st_mode
))
853 blk
->header
.typeflag
= CONTTYPE
;
855 finish_header (st
, blk
, block_ordinal
);
857 while (size_left
> 0)
859 size_t bufsize
, count
;
861 if (multi_volume_option
)
863 assign_string (&save_name
, st
->orig_file_name
);
864 save_sizeleft
= size_left
;
865 save_totsize
= st
->stat
.st_size
;
867 blk
= find_next_block ();
869 bufsize
= available_space_after (blk
);
871 if (size_left
< bufsize
)
873 /* Last read -- zero out area beyond. */
875 count
= bufsize
% BLOCKSIZE
;
877 memset (blk
->buffer
+ size_left
, 0, BLOCKSIZE
- count
);
880 count
= (fd
< 0) ? bufsize
: safe_read (fd
, blk
->buffer
, bufsize
);
881 if (count
== SAFE_READ_ERROR
)
883 read_diag_details (st
->orig_file_name
,
884 st
->stat
.st_size
- size_left
, bufsize
);
885 pad_archive (size_left
);
886 return dump_status_short
;
890 set_next_block_after (blk
+ (bufsize
- 1) / BLOCKSIZE
);
892 if (count
!= bufsize
)
894 char buf
[UINTMAX_STRSIZE_BOUND
];
895 memset (blk
->buffer
+ count
, 0, bufsize
- count
);
897 ngettext ("%s: File shrank by %s byte; padding with zeros",
898 "%s: File shrank by %s bytes; padding with zeros",
900 quotearg_colon (st
->orig_file_name
),
901 STRINGIFY_BIGINT (size_left
, buf
)));
902 if (! ignore_failed_read_option
)
903 exit_status
= TAREXIT_FAILURE
;
904 pad_archive (size_left
- (bufsize
-count
));
905 return dump_status_short
;
908 return dump_status_ok
;
912 dump_regular_finish (int fd
, struct tar_stat_info
*st
, time_t original_ctime
)
916 struct stat final_stat
;
917 if (fstat (fd
, &final_stat
) != 0)
919 stat_diag (st
->orig_file_name
);
921 else if (final_stat
.st_ctime
!= original_ctime
)
923 WARN ((0, 0, _("%s: file changed as we read it"),
924 quotearg_colon (st
->orig_file_name
)));
928 close_diag (st
->orig_file_name
);
931 if (remove_files_option
)
933 if (unlink (st
->orig_file_name
) == -1)
934 unlink_error (st
->orig_file_name
);
938 /* Look in directory DIRNAME for a cache directory tag file
939 with the magic name "CACHEDIR.TAG" and a standard header,
941 http://www.brynosaurus.com/cachedir
942 Applications can write this file into directories they create
943 for use as caches containing purely regenerable, non-precious data,
944 allowing us to avoid archiving them if --exclude-caches is specified. */
946 #define CACHEDIR_SIGNATURE "Signature: 8a477f597d28d172789f06886806bc55"
947 #define CACHEDIR_SIGNATURE_SIZE (sizeof CACHEDIR_SIGNATURE - 1)
950 check_cache_directory (char *dirname
)
952 static char tagname
[] = "CACHEDIR.TAG";
955 int tag_present
= false;
957 tagpath
= xmalloc (strlen (dirname
) + strlen (tagname
) + 1);
958 strcpy (tagpath
, dirname
);
959 strcat (tagpath
, tagname
);
961 fd
= open (tagpath
, O_RDONLY
);
964 static char tagbuf
[CACHEDIR_SIGNATURE_SIZE
];
966 if (read (fd
, tagbuf
, CACHEDIR_SIGNATURE_SIZE
)
967 == CACHEDIR_SIGNATURE_SIZE
968 && memcmp (tagbuf
, CACHEDIR_SIGNATURE
, CACHEDIR_SIGNATURE_SIZE
) == 0)
980 dump_dir0 (char *directory
,
981 struct tar_stat_info
*st
, int top_level
, dev_t parent_device
)
983 dev_t our_device
= st
->stat
.st_dev
;
985 if (!is_avoided_name (st
->orig_file_name
))
987 union block
*blk
= NULL
;
988 off_t block_ordinal
= current_block_ordinal ();
989 st
->stat
.st_size
= 0; /* force 0 size on dir */
991 blk
= start_header (st
);
995 if (incremental_option
)
996 blk
->header
.typeflag
= GNUTYPE_DUMPDIR
;
997 else /* if (standard_option) */
998 blk
->header
.typeflag
= DIRTYPE
;
1000 /* If we're gnudumping, we aren't done yet so don't close it. */
1002 if (!incremental_option
)
1003 finish_header (st
, blk
, block_ordinal
);
1004 else if (gnu_list_name
->dir_contents
)
1010 const char *buffer
, *p_buffer
;
1012 block_ordinal
= current_block_ordinal ();
1013 buffer
= gnu_list_name
->dir_contents
; /* FOO */
1016 for (p_buffer
= buffer
; *p_buffer
; )
1018 size_t size
= strlen (p_buffer
) + 1;
1023 OFF_TO_CHARS (totsize
, blk
->header
.size
);
1024 finish_header (st
, blk
, block_ordinal
);
1026 size_left
= totsize
;
1027 while (size_left
> 0)
1029 if (multi_volume_option
)
1031 assign_string (&save_name
, st
->orig_file_name
);
1032 save_sizeleft
= size_left
;
1033 save_totsize
= totsize
;
1035 blk
= find_next_block ();
1036 bufsize
= available_space_after (blk
);
1037 if (size_left
< bufsize
)
1039 bufsize
= size_left
;
1040 count
= bufsize
% BLOCKSIZE
;
1042 memset (blk
->buffer
+ size_left
, 0, BLOCKSIZE
- count
);
1044 memcpy (blk
->buffer
, p_buffer
, bufsize
);
1045 size_left
-= bufsize
;
1046 p_buffer
+= bufsize
;
1047 set_next_block_after (blk
+ (bufsize
- 1) / BLOCKSIZE
);
1049 if (multi_volume_option
)
1050 assign_string (&save_name
, 0);
1055 if (!recursion_option
)
1058 if (one_file_system_option
1060 && parent_device
!= st
->stat
.st_dev
)
1064 _("%s: file is on a different filesystem; not dumped"),
1065 quotearg_colon (st
->orig_file_name
)));
1069 if (exclude_caches_option
1070 && check_cache_directory(st
->orig_file_name
))
1074 _("%s: contains a cache directory tag; not dumped"),
1075 quotearg_colon (st
->orig_file_name
)));
1082 char *name_buf
= xstrdup (st
->orig_file_name
);
1083 size_t name_size
= strlen (name_buf
);
1084 size_t name_len
= name_size
;
1086 /* Now output all the files in the directory. */
1087 /* FIXME: Should speed this up by cd-ing into the dir. */
1089 for (entry
= directory
; (entry_len
= strlen (entry
)) != 0;
1090 entry
+= entry_len
+ 1)
1092 if (name_size
< name_len
+ entry_len
)
1094 name_size
= name_len
+ entry_len
;
1095 name_buf
= xrealloc (name_buf
, name_size
+ 1);
1097 strcpy (name_buf
+ name_len
, entry
);
1098 if (!excluded_name (name_buf
))
1099 dump_file (name_buf
, 0, our_device
);
1106 /* Ensure exactly one trailing slash. */
1108 ensure_slash (char **pstr
)
1110 size_t len
= strlen (*pstr
);
1111 while (len
>= 1 && ISSLASH ((*pstr
)[len
- 1]))
1113 if (!ISSLASH ((*pstr
)[len
]))
1114 *pstr
= xrealloc (*pstr
, len
+ 2);
1115 (*pstr
)[len
++] = '/';
1116 (*pstr
)[len
] = '\0';
1120 dump_dir (struct tar_stat_info
*st
, int top_level
, dev_t parent_device
)
1124 directory
= savedir (st
->orig_file_name
);
1127 savedir_diag (st
->orig_file_name
);
1131 ensure_slash (&st
->orig_file_name
);
1132 ensure_slash (&st
->file_name
);
1134 dump_dir0 (directory
, st
, top_level
, parent_device
);
1141 /* Main functions of this module. */
1144 create_archive (void)
1148 open_archive (ACCESS_WRITE
);
1149 xheader_write_global ();
1151 if (incremental_option
)
1153 size_t buffer_size
= 1000;
1154 char *buffer
= xmalloc (buffer_size
);
1157 collect_and_sort_names ();
1159 while ((p
= name_from_list ()) != NULL
)
1160 if (!excluded_name (p
))
1161 dump_file (p
, -1, (dev_t
) 0);
1164 while ((p
= name_from_list ()) != NULL
)
1165 if (!excluded_name (p
))
1167 size_t plen
= strlen (p
);
1168 if (buffer_size
<= plen
)
1170 while ((buffer_size
*= 2) <= plen
)
1172 buffer
= xrealloc (buffer
, buffer_size
);
1174 memcpy (buffer
, p
, plen
);
1175 if (! ISSLASH (buffer
[plen
- 1]))
1176 buffer
[plen
++] = '/';
1177 q
= gnu_list_name
->dir_contents
;
1181 size_t qlen
= strlen (q
);
1184 if (buffer_size
< plen
+ qlen
)
1186 while ((buffer_size
*=2 ) < plen
+ qlen
)
1188 buffer
= xrealloc (buffer
, buffer_size
);
1190 strcpy (buffer
+ plen
, q
+ 1);
1191 dump_file (buffer
, -1, (dev_t
) 0);
1200 while ((p
= name_next (1)) != NULL
)
1201 if (!excluded_name (p
))
1202 dump_file (p
, 1, (dev_t
) 0);
1208 if (listed_incremental_option
)
1209 write_directory_file ();
1213 /* Calculate the hash of a link. */
1215 hash_link (void const *entry
, size_t n_buckets
)
1217 struct link
const *l
= entry
;
1218 uintmax_t num
= l
->dev
^ l
->ino
;
1219 return num
% n_buckets
;
1222 /* Compare two links for equality. */
1224 compare_links (void const *entry1
, void const *entry2
)
1226 struct link
const *link1
= entry1
;
1227 struct link
const *link2
= entry2
;
1228 return ((link1
->dev
^ link2
->dev
) | (link1
->ino
^ link2
->ino
)) == 0;
1232 unknown_file_error (char *p
)
1234 WARN ((0, 0, _("%s: Unknown file type; file ignored"),
1235 quotearg_colon (p
)));
1236 if (!ignore_failed_read_option
)
1237 exit_status
= TAREXIT_FAILURE
;
1241 /* Handling of hard links */
1243 /* Table of all non-directories that we've written so far. Any time
1244 we see another, we check the table and avoid dumping the data
1245 again if we've done it once already. */
1246 static Hash_table
*link_table
;
1248 /* Try to dump stat as a hard link to another file in the archive. If
1249 succeeded returns true */
1251 dump_hard_link (struct tar_stat_info
*st
)
1253 if (link_table
&& st
->stat
.st_nlink
> 1)
1256 struct link
*duplicate
;
1257 off_t block_ordinal
;
1260 lp
.ino
= st
->stat
.st_ino
;
1261 lp
.dev
= st
->stat
.st_dev
;
1263 if ((duplicate
= hash_lookup (link_table
, &lp
)))
1265 /* We found a link. */
1266 char const *link_name
= safer_name_suffix (duplicate
->name
, true,
1267 absolute_names_option
);
1271 block_ordinal
= current_block_ordinal ();
1272 assign_string (&st
->link_name
, link_name
);
1273 if ((archive_format
== OLDGNU_FORMAT
1274 && OLDGNU_NAME_FIELD_SIZE
< strlen (link_name
))
1275 || NAME_FIELD_SIZE
< strlen (link_name
))
1276 write_long_link (st
);
1278 st
->stat
.st_size
= 0;
1279 blk
= start_header (st
);
1282 tar_copy_str (blk
->header
.linkname
, link_name
, NAME_FIELD_SIZE
);
1284 blk
->header
.typeflag
= LNKTYPE
;
1285 finish_header (st
, blk
, block_ordinal
);
1287 if (remove_files_option
&& unlink (st
->orig_file_name
) != 0)
1288 unlink_error (st
->orig_file_name
);
1297 file_count_links (struct tar_stat_info
*st
)
1299 if (st
->stat
.st_nlink
> 1)
1301 struct link
*duplicate
;
1302 struct link
*lp
= xmalloc (offsetof (struct link
, name
)
1303 + strlen (st
->orig_file_name
) + 1);
1304 lp
->ino
= st
->stat
.st_ino
;
1305 lp
->dev
= st
->stat
.st_dev
;
1306 lp
->nlink
= st
->stat
.st_nlink
;
1307 strcpy (lp
->name
, st
->orig_file_name
);
1310 || (link_table
= hash_initialize (0, 0, hash_link
,
1312 && (duplicate
= hash_insert (link_table
, lp
))))
1315 if (duplicate
!= lp
)
1321 /* For each dumped file, check if all its links were dumped. Emit
1322 warnings if it is not so. */
1331 for (lp
= hash_get_first (link_table
); lp
;
1332 lp
= hash_get_next (link_table
, lp
))
1336 WARN ((0, 0, _("Missing links to %s.\n"), quote (lp
->name
)));
1342 /* Dump a single file, recursing on directories. P is the file name
1343 to dump. TOP_LEVEL tells whether this is a top-level call; zero
1344 means no, positive means yes, and negative means the top level
1345 of an incremental dump. PARENT_DEVICE is the device of P's
1346 parent directory; it is examined only if TOP_LEVEL is zero. */
1348 /* FIXME: One should make sure that for *every* path leading to setting
1349 exit_status to failure, a clear diagnostic has been issued. */
1352 dump_file0 (struct tar_stat_info
*st
, char *p
,
1353 int top_level
, dev_t parent_device
)
1355 union block
*header
;
1357 time_t original_ctime
;
1358 struct utimbuf restore_times
;
1359 off_t block_ordinal
= -1;
1361 if (interactive_option
&& !confirm ("add", p
))
1364 assign_string (&st
->orig_file_name
, p
);
1365 assign_string (&st
->file_name
,
1366 safer_name_suffix (p
, false, absolute_names_option
));
1368 if (deref_stat (dereference_option
, p
, &st
->stat
) != 0)
1373 st
->archive_file_size
= st
->stat
.st_size
;
1374 sys_stat_nanoseconds (st
);
1375 original_ctime
= st
->stat
.st_ctime
;
1376 restore_times
.actime
= st
->stat
.st_atime
;
1377 restore_times
.modtime
= st
->stat
.st_mtime
;
1380 if (S_ISHIDDEN (st
->stat
.st_mode
))
1382 char *new = (char *) alloca (strlen (p
) + 2);
1392 /* See if we want only new files, and check if this one is too old to
1395 This check is omitted if incremental_option is set *and* the
1396 requested file is not explicitely listed in the command line. */
1398 if (!(incremental_option
&& !is_individual_file (p
))
1399 && !S_ISDIR (st
->stat
.st_mode
)
1400 && OLDER_STAT_TIME (st
->stat
, m
)
1401 && (!after_date_option
|| OLDER_STAT_TIME (st
->stat
, c
)))
1403 if (!incremental_option
&& verbose_option
)
1404 WARN ((0, 0, _("%s: file is unchanged; not dumped"),
1405 quotearg_colon (p
)));
1409 /* See if we are trying to dump the archive. */
1410 if (sys_file_is_archive (st
))
1412 WARN ((0, 0, _("%s: file is the archive; not dumped"),
1413 quotearg_colon (p
)));
1417 if (is_avoided_name (p
))
1419 if (S_ISDIR (st
->stat
.st_mode
))
1421 dump_dir (st
, top_level
, parent_device
);
1422 if (atime_preserve_option
)
1423 utime (p
, &restore_times
);
1428 /* Check for multiple links. */
1429 if (dump_hard_link (st
))
1432 /* This is not a link to a previously dumped file, so dump it. */
1434 if (S_ISREG (st
->stat
.st_mode
)
1435 || S_ISCTG (st
->stat
.st_mode
))
1438 enum dump_status status
;
1440 if (file_dumpable_p (st
))
1442 fd
= open (st
->orig_file_name
,
1443 O_RDONLY
| O_BINARY
);
1446 if (!top_level
&& errno
== ENOENT
)
1447 WARN ((0, 0, _("%s: File removed before we read it"),
1448 quotearg_colon (st
->orig_file_name
)));
1450 open_diag (st
->orig_file_name
);
1457 if (sparse_option
&& sparse_file_p (st
))
1459 status
= sparse_dump_file (fd
, st
);
1460 if (status
== dump_status_not_implemented
)
1461 status
= dump_regular_file (fd
, st
);
1464 status
= dump_regular_file (fd
, st
);
1468 case dump_status_ok
:
1469 if (multi_volume_option
)
1470 assign_string (&save_name
, 0);
1471 dump_regular_finish (fd
, st
, original_ctime
);
1474 case dump_status_short
:
1475 if (multi_volume_option
)
1476 assign_string (&save_name
, 0);
1480 case dump_status_fail
:
1484 case dump_status_not_implemented
:
1488 if (atime_preserve_option
)
1489 utime (st
->orig_file_name
, &restore_times
);
1490 file_count_links (st
);
1493 #ifdef HAVE_READLINK
1494 else if (S_ISLNK (st
->stat
.st_mode
))
1498 size_t linklen
= st
->stat
.st_size
;
1499 if (linklen
!= st
->stat
.st_size
|| linklen
+ 1 == 0)
1501 buffer
= (char *) alloca (linklen
+ 1);
1502 size
= readlink (p
, buffer
, linklen
+ 1);
1508 buffer
[size
] = '\0';
1509 assign_string (&st
->link_name
, buffer
);
1510 if ((archive_format
== OLDGNU_FORMAT
&& size
> OLDGNU_NAME_FIELD_SIZE
)
1511 || size
> NAME_FIELD_SIZE
)
1512 write_long_link (st
);
1514 block_ordinal
= current_block_ordinal ();
1515 st
->stat
.st_size
= 0; /* force 0 size on symlink */
1516 header
= start_header (st
);
1519 tar_copy_str (header
->header
.linkname
, buffer
, NAME_FIELD_SIZE
);
1520 header
->header
.typeflag
= SYMTYPE
;
1521 finish_header (st
, header
, block_ordinal
);
1522 /* nothing more to do to it */
1524 if (remove_files_option
)
1526 if (unlink (p
) == -1)
1529 file_count_links (st
);
1533 else if (S_ISCHR (st
->stat
.st_mode
))
1535 else if (S_ISBLK (st
->stat
.st_mode
))
1537 else if (S_ISFIFO (st
->stat
.st_mode
))
1539 else if (S_ISSOCK (st
->stat
.st_mode
))
1541 WARN ((0, 0, _("%s: socket ignored"), quotearg_colon (p
)));
1544 else if (S_ISDOOR (st
->stat
.st_mode
))
1546 WARN ((0, 0, _("%s: door ignored"), quotearg_colon (p
)));
1551 unknown_file_error (p
);
1556 if (archive_format
== V7_FORMAT
)
1558 unknown_file_error (p
);
1562 block_ordinal
= current_block_ordinal ();
1563 st
->stat
.st_size
= 0; /* force 0 size */
1564 header
= start_header (st
);
1567 header
->header
.typeflag
= type
;
1569 if (type
!= FIFOTYPE
)
1571 MAJOR_TO_CHARS (major (st
->stat
.st_rdev
),
1572 header
->header
.devmajor
);
1573 MINOR_TO_CHARS (minor (st
->stat
.st_rdev
),
1574 header
->header
.devminor
);
1577 finish_header (st
, header
, block_ordinal
);
1578 if (remove_files_option
)
1580 if (unlink (p
) == -1)
1586 dump_file (char *p
, int top_level
, dev_t parent_device
)
1588 struct tar_stat_info st
;
1589 tar_stat_init (&st
);
1590 dump_file0 (&st
, p
, top_level
, parent_device
);
1591 tar_stat_destroy (&st
);