1 /* Create a tar archive.
3 Copyright (C) 1985, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
4 2003, 2004 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 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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
*stat
)
342 return !(dev_null_output
343 || (stat
->archive_file_size
== 0
344 && (stat
->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 /* Write a "private" header */
375 start_private_header (const char *name
, size_t size
)
378 union block
*header
= find_next_block ();
380 memset (header
->buffer
, 0, sizeof (union block
));
382 tar_copy_str (header
->header
.name
, name
, NAME_FIELD_SIZE
);
383 OFF_TO_CHARS (size
, header
->header
.size
);
386 TIME_TO_CHARS (t
, header
->header
.mtime
);
387 MODE_TO_CHARS (S_IFREG
|S_IRUSR
|S_IWUSR
|S_IRGRP
|S_IROTH
, header
->header
.mode
);
388 UID_TO_CHARS (getuid (), header
->header
.uid
);
389 GID_TO_CHARS (getgid (), header
->header
.gid
);
390 MAJOR_TO_CHARS (0, header
->header
.devmajor
);
391 MAJOR_TO_CHARS (0, header
->header
.devminor
);
392 strncpy (header
->header
.magic
, TMAGIC
, TMAGLEN
);
393 strncpy (header
->header
.version
, TVERSION
, TVERSLEN
);
397 /* Create a new header and store there at most NAME_FIELD_SIZE bytes of
401 write_short_name (struct tar_stat_info
*st
)
403 union block
*header
= find_next_block ();
404 memset (header
->buffer
, 0, sizeof (union block
));
405 tar_copy_str (header
->header
.name
, st
->file_name
, NAME_FIELD_SIZE
);
409 /* Write a GNUTYPE_LONGLINK or GNUTYPE_LONGNAME block. */
411 write_gnu_long_link (struct tar_stat_info
*st
, const char *p
, char type
)
413 size_t size
= strlen (p
) + 1;
417 header
= start_private_header ("././@LongLink", size
);
418 strcpy (header
->header
.magic
, OLDGNU_MAGIC
);
419 header
->header
.typeflag
= type
;
420 finish_header (st
, header
, -1);
422 header
= find_next_block ();
424 bufsize
= available_space_after (header
);
426 while (bufsize
< size
)
428 memcpy (header
->buffer
, p
, bufsize
);
431 set_next_block_after (header
+ (bufsize
- 1) / BLOCKSIZE
);
432 header
= find_next_block ();
433 bufsize
= available_space_after (header
);
435 memcpy (header
->buffer
, p
, size
);
436 memset (header
->buffer
+ size
, 0, bufsize
- size
);
437 set_next_block_after (header
+ (size
- 1) / BLOCKSIZE
);
441 split_long_name (const char *name
, size_t length
)
445 if (length
> PREFIX_FIELD_SIZE
)
446 length
= PREFIX_FIELD_SIZE
+2;
447 for (i
= length
- 1; i
> 0; i
--)
448 if (ISSLASH (name
[i
]))
454 write_ustar_long_name (const char *name
)
456 size_t length
= strlen (name
);
460 if (length
> PREFIX_FIELD_SIZE
+ NAME_FIELD_SIZE
+ 1)
462 WARN ((0, 0, _("%s: file name is too long (max %d); not dumped"),
463 quotearg_colon (name
),
464 PREFIX_FIELD_SIZE
+ NAME_FIELD_SIZE
+ 1));
468 i
= split_long_name (name
, length
);
469 if (i
== 0 || length
- i
- 1 > NAME_FIELD_SIZE
)
472 _("%s: file name is too long (cannot be split); not dumped"),
473 quotearg_colon (name
)));
477 header
= find_next_block ();
478 memset (header
->buffer
, 0, sizeof (header
->buffer
));
479 memcpy (header
->header
.prefix
, name
, i
);
480 memcpy (header
->header
.name
, name
+ i
+ 1, length
- i
- 1);
485 /* Write a long link name, depending on the current archive format */
487 write_long_link (struct tar_stat_info
*st
)
489 switch (archive_format
)
492 xheader_store ("linkpath", st
, NULL
);
495 case V7_FORMAT
: /* old V7 tar format */
499 _("%s: link name is too long; not dumped"),
500 quotearg_colon (st
->link_name
)));
505 write_gnu_long_link (st
, st
->link_name
, GNUTYPE_LONGLINK
);
514 write_long_name (struct tar_stat_info
*st
)
516 switch (archive_format
)
519 xheader_store ("path", st
, NULL
);
523 if (strlen (st
->file_name
) > NAME_FIELD_SIZE
-1)
525 WARN ((0, 0, _("%s: file name is too long (max %d); not dumped"),
526 quotearg_colon (st
->file_name
),
527 NAME_FIELD_SIZE
- 1));
534 return write_ustar_long_name (st
->file_name
);
538 write_gnu_long_link (st
, st
->file_name
, GNUTYPE_LONGNAME
);
544 return write_short_name (st
);
548 write_extended (struct tar_stat_info
*st
, union block
*old_header
)
550 union block
*header
, hp
;
553 if (extended_header
.buffer
|| extended_header
.stk
== NULL
)
556 xheader_finish (&extended_header
);
557 memcpy (hp
.buffer
, old_header
, sizeof (hp
));
558 p
= xheader_xhdr_name (st
);
559 xheader_write (XHDTYPE
, p
, &extended_header
);
561 header
= find_next_block ();
562 memcpy (header
, &hp
.buffer
, sizeof (hp
.buffer
));
567 write_header_name (struct tar_stat_info
*st
)
569 if (archive_format
== POSIX_FORMAT
&& !string_ascii_p (st
->file_name
))
571 xheader_store ("path", st
, NULL
);
572 return write_short_name (st
);
574 else if (NAME_FIELD_SIZE
< strlen (st
->file_name
))
575 return write_long_name (st
);
577 return write_short_name (st
);
581 /* Header handling. */
583 /* Make a header block for the file whose stat info is st,
584 and return its address. */
587 start_header (struct tar_stat_info
*st
)
591 header
= write_header_name (st
);
595 /* Override some stat fields, if requested to do so. */
597 if (owner_option
!= (uid_t
) -1)
598 st
->stat
.st_uid
= owner_option
;
599 if (group_option
!= (gid_t
) -1)
600 st
->stat
.st_gid
= group_option
;
602 st
->stat
.st_mode
= ((st
->stat
.st_mode
& ~MODE_ALL
)
603 | mode_adjust (st
->stat
.st_mode
, mode_option
));
605 /* Paul Eggert tried the trivial test ($WRITER cf a b; $READER tvf a)
606 for a few tars and came up with the following interoperability
610 1 2 3 4 5 6 7 8 9 READER
611 . . . . . . . . . 1 = SunOS 4.2 tar
612 # . . # # . . # # 2 = NEC SVR4.0.2 tar
613 . . . # # . . # . 3 = Solaris 2.1 tar
614 . . . . . . . . . 4 = GNU tar 1.11.1
615 . . . . . . . . . 5 = HP-UX 8.07 tar
616 . . . . . . . . . 6 = Ultrix 4.1
617 . . . . . . . . . 7 = AIX 3.2
618 . . . . . . . . . 8 = Hitachi HI-UX 1.03
619 . . . . . . . . . 9 = Omron UNIOS-B 4.3BSD 1.60Beta
622 # = ``impossible file type''
624 The following mask for old archive removes the `#'s in column 4
625 above, thus making GNU tar both a universal donor and a universal
626 acceptor for Paul's test. */
628 if (archive_format
== V7_FORMAT
|| archive_format
== USTAR_FORMAT
)
629 MODE_TO_CHARS (st
->stat
.st_mode
& MODE_ALL
, header
->header
.mode
);
631 MODE_TO_CHARS (st
->stat
.st_mode
, header
->header
.mode
);
633 if (st
->stat
.st_uid
> MAXOCTAL7
&& archive_format
== POSIX_FORMAT
)
634 xheader_store ("uid", st
, NULL
);
636 UID_TO_CHARS (st
->stat
.st_uid
, header
->header
.uid
);
638 if (st
->stat
.st_gid
> MAXOCTAL7
&& archive_format
== POSIX_FORMAT
)
639 xheader_store ("gid", st
, NULL
);
641 GID_TO_CHARS (st
->stat
.st_gid
, header
->header
.gid
);
643 if (st
->stat
.st_size
> MAXOCTAL11
&& archive_format
== POSIX_FORMAT
)
644 xheader_store ("size", st
, NULL
);
646 OFF_TO_CHARS (st
->stat
.st_size
, header
->header
.size
);
648 TIME_TO_CHARS (st
->stat
.st_mtime
, header
->header
.mtime
);
651 if (S_ISCHR (st
->stat
.st_mode
)
652 || S_ISBLK (st
->stat
.st_mode
))
654 st
->devmajor
= major (st
->stat
.st_rdev
);
655 st
->devminor
= minor (st
->stat
.st_rdev
);
657 if (st
->devmajor
> MAXOCTAL7
&& archive_format
== POSIX_FORMAT
)
658 xheader_store ("devmajor", st
, NULL
);
660 MAJOR_TO_CHARS (st
->devmajor
, header
->header
.devmajor
);
662 if (st
->devminor
> MAXOCTAL7
&& archive_format
== POSIX_FORMAT
)
663 xheader_store ("devminor", st
, NULL
);
665 MAJOR_TO_CHARS (st
->devminor
, header
->header
.devminor
);
669 MAJOR_TO_CHARS (0, header
->header
.devmajor
);
670 MINOR_TO_CHARS (0, header
->header
.devminor
);
673 if (archive_format
== POSIX_FORMAT
)
675 xheader_store ("atime", st
, NULL
);
676 xheader_store ("ctime", st
, NULL
);
678 else if (incremental_option
)
679 if (archive_format
== OLDGNU_FORMAT
|| archive_format
== GNU_FORMAT
)
681 TIME_TO_CHARS (st
->stat
.st_atime
, header
->oldgnu_header
.atime
);
682 TIME_TO_CHARS (st
->stat
.st_ctime
, header
->oldgnu_header
.ctime
);
685 header
->header
.typeflag
= archive_format
== V7_FORMAT
? AREGTYPE
: REGTYPE
;
687 switch (archive_format
)
693 case GNU_FORMAT
: /*FIXME?*/
694 /* Overwrite header->header.magic and header.version in one blow. */
695 strcpy (header
->header
.magic
, OLDGNU_MAGIC
);
700 strncpy (header
->header
.magic
, TMAGIC
, TMAGLEN
);
701 strncpy (header
->header
.version
, TVERSION
, TVERSLEN
);
708 if (archive_format
== V7_FORMAT
|| numeric_owner_option
)
710 /* header->header.[ug]name are left as the empty string. */
714 uid_to_uname (st
->stat
.st_uid
, &st
->uname
);
715 gid_to_gname (st
->stat
.st_gid
, &st
->gname
);
717 if (archive_format
== POSIX_FORMAT
718 && (strlen (st
->uname
) > UNAME_FIELD_SIZE
719 || !string_ascii_p (st
->uname
)))
720 xheader_store ("uname", st
, NULL
);
722 UNAME_TO_CHARS (st
->uname
, header
->header
.uname
);
724 if (archive_format
== POSIX_FORMAT
725 && (strlen (st
->gname
) > GNAME_FIELD_SIZE
726 || !string_ascii_p (st
->gname
)))
727 xheader_store ("gname", st
, NULL
);
729 GNAME_TO_CHARS (st
->gname
, header
->header
.gname
);
736 simple_finish_header (union block
*header
)
742 memcpy (header
->header
.chksum
, CHKBLANKS
, sizeof header
->header
.chksum
);
746 for (i
= sizeof *header
; i
-- != 0; )
747 /* We can't use unsigned char here because of old compilers, e.g. V7. */
750 /* Fill in the checksum field. It's formatted differently from the
751 other fields: it has [6] digits, a null, then a space -- rather than
752 digits, then a null. We use to_chars.
753 The final space is already there, from
754 checksumming, and to_chars doesn't modify it.
756 This is a fast way to do:
758 sprintf(header->header.chksum, "%6o", sum); */
760 uintmax_to_chars ((uintmax_t) sum
, header
->header
.chksum
, 7);
762 set_next_block_after (header
);
765 /* Finish off a filled-in header block and write it out. We also
766 print the file name and/or full info if verbose is on. If BLOCK_ORDINAL
767 is not negative, is the block ordinal of the first record for this
768 file, which may be a preceding long name or long link record. */
770 finish_header (struct tar_stat_info
*st
,
771 union block
*header
, off_t block_ordinal
)
773 /* Note: It is important to do this before the call to write_extended(),
774 so that the actual ustar header is printed */
776 && header
->header
.typeflag
!= GNUTYPE_LONGLINK
777 && header
->header
.typeflag
!= GNUTYPE_LONGNAME
778 && header
->header
.typeflag
!= XHDTYPE
779 && header
->header
.typeflag
!= XGLTYPE
)
781 /* These globals are parameters to print_header, sigh. */
783 current_header
= header
;
784 current_format
= archive_format
;
785 print_header (st
, block_ordinal
);
788 header
= write_extended (st
, header
);
789 simple_finish_header (header
);
794 pad_archive (off_t size_left
)
797 while (size_left
> 0)
799 save_sizeleft
= size_left
;
800 blk
= find_next_block ();
801 memset (blk
->buffer
, 0, BLOCKSIZE
);
802 set_next_block_after (blk
);
803 size_left
-= BLOCKSIZE
;
807 static enum dump_status
808 dump_regular_file (int fd
, struct tar_stat_info
*stat
)
810 off_t size_left
= stat
->stat
.st_size
;
814 block_ordinal
= current_block_ordinal ();
815 blk
= start_header (stat
);
817 return dump_status_fail
;
819 /* Mark contiguous files, if we support them. */
820 if (archive_format
!= V7_FORMAT
&& S_ISCTG (stat
->stat
.st_mode
))
821 blk
->header
.typeflag
= CONTTYPE
;
823 finish_header (stat
, blk
, block_ordinal
);
825 while (size_left
> 0)
827 size_t bufsize
, count
;
829 if (multi_volume_option
)
831 assign_string (&save_name
, stat
->file_name
);
832 save_sizeleft
= size_left
;
833 save_totsize
= stat
->stat
.st_size
;
835 blk
= find_next_block ();
837 bufsize
= available_space_after (blk
);
839 if (size_left
< bufsize
)
841 /* Last read -- zero out area beyond. */
843 count
= bufsize
% BLOCKSIZE
;
845 memset (blk
->buffer
+ size_left
, 0, BLOCKSIZE
- count
);
848 count
= (fd
< 0) ? bufsize
: safe_read (fd
, blk
->buffer
, bufsize
);
851 read_diag_details (stat
->orig_file_name
,
852 stat
->stat
.st_size
- size_left
, bufsize
);
853 pad_archive (size_left
);
854 return dump_status_short
;
858 set_next_block_after (blk
+ (bufsize
- 1) / BLOCKSIZE
);
860 if (count
!= bufsize
)
862 char buf
[UINTMAX_STRSIZE_BOUND
];
863 memset (blk
->buffer
+ count
, 0, bufsize
- count
);
865 ngettext ("%s: File shrank by %s byte; padding with zeros",
866 "%s: File shrank by %s bytes; padding with zeros",
868 quotearg_colon (stat
->orig_file_name
),
869 STRINGIFY_BIGINT (size_left
, buf
)));
870 if (! ignore_failed_read_option
)
871 exit_status
= TAREXIT_FAILURE
;
872 pad_archive (size_left
);
873 return dump_status_short
;
876 return dump_status_ok
;
880 dump_regular_finish (int fd
, struct tar_stat_info
*st
, time_t original_ctime
)
884 struct stat final_stat
;
885 if (fstat (fd
, &final_stat
) != 0)
887 stat_diag (st
->orig_file_name
);
889 else if (final_stat
.st_ctime
!= original_ctime
)
891 WARN ((0, 0, _("%s: file changed as we read it"),
892 quotearg_colon (st
->orig_file_name
)));
896 close_diag (st
->orig_file_name
);
899 if (remove_files_option
)
901 if (unlink (st
->orig_file_name
) == -1)
902 unlink_error (st
->orig_file_name
);
907 dump_dir0 (char *directory
,
908 struct tar_stat_info
*stat
, int top_level
, dev_t parent_device
)
910 dev_t our_device
= stat
->stat
.st_dev
;
912 if (!is_avoided_name (stat
->orig_file_name
))
914 union block
*blk
= NULL
;
915 off_t block_ordinal
= current_block_ordinal ();
916 stat
->stat
.st_size
= 0; /* force 0 size on dir */
918 blk
= start_header (stat
);
922 if (incremental_option
)
923 blk
->header
.typeflag
= GNUTYPE_DUMPDIR
;
924 else /* if (standard_option) */
925 blk
->header
.typeflag
= DIRTYPE
;
927 /* If we're gnudumping, we aren't done yet so don't close it. */
929 if (!incremental_option
)
930 finish_header (stat
, blk
, block_ordinal
);
931 else if (gnu_list_name
->dir_contents
)
937 const char *buffer
, *p_buffer
;
938 off_t block_ordinal
= current_block_ordinal ();
940 buffer
= gnu_list_name
->dir_contents
; /* FOO */
943 for (p_buffer
= buffer
; *p_buffer
; )
945 size_t size
= strlen (p_buffer
) + 1;
950 OFF_TO_CHARS (totsize
, blk
->header
.size
);
951 finish_header (stat
, blk
, block_ordinal
);
954 while (size_left
> 0)
956 if (multi_volume_option
)
958 assign_string (&save_name
, stat
->orig_file_name
);
959 save_sizeleft
= size_left
;
960 save_totsize
= totsize
;
962 blk
= find_next_block ();
963 bufsize
= available_space_after (blk
);
964 if (size_left
< bufsize
)
967 count
= bufsize
% BLOCKSIZE
;
969 memset (blk
->buffer
+ size_left
, 0, BLOCKSIZE
- count
);
971 memcpy (blk
->buffer
, p_buffer
, bufsize
);
972 size_left
-= bufsize
;
974 set_next_block_after (blk
+ (bufsize
- 1) / BLOCKSIZE
);
976 if (multi_volume_option
)
977 assign_string (&save_name
, 0);
982 if (!recursion_option
)
985 if (one_file_system_option
987 && parent_device
!= stat
->stat
.st_dev
)
991 _("%s: file is on a different filesystem; not dumped"),
992 quotearg_colon (stat
->orig_file_name
)));
999 char *name_buf
= strdup (stat
->orig_file_name
);
1000 size_t name_size
= strlen (name_buf
);
1001 size_t name_len
= name_size
;
1003 /* Now output all the files in the directory. */
1004 /* FIXME: Should speed this up by cd-ing into the dir. */
1006 for (entry
= directory
; (entry_len
= strlen (entry
)) != 0;
1007 entry
+= entry_len
+ 1)
1009 if (name_size
< name_len
+ entry_len
)
1011 name_size
= name_len
+ entry_len
;
1012 name_buf
= xrealloc (name_buf
, name_size
+ 1);
1014 strcpy (name_buf
+ name_len
, entry
);
1015 if (!excluded_name (name_buf
))
1016 dump_file (name_buf
, 0, our_device
);
1023 /* Ensure exactly one trailing slash. */
1025 ensure_slash (char **pstr
)
1027 size_t len
= strlen (*pstr
);
1028 while (len
>= 1 && ISSLASH ((*pstr
)[len
- 1]))
1030 if (!ISSLASH ((*pstr
)[len
]))
1031 *pstr
= xrealloc (*pstr
, len
+ 2);
1032 (*pstr
)[len
++] = '/';
1033 (*pstr
)[len
] = '\0';
1037 dump_dir (struct tar_stat_info
*stat
, int top_level
, dev_t parent_device
)
1041 directory
= savedir (stat
->orig_file_name
);
1044 savedir_diag (stat
->orig_file_name
);
1048 ensure_slash (&stat
->orig_file_name
);
1049 ensure_slash (&stat
->file_name
);
1051 dump_dir0 (directory
, stat
, top_level
, parent_device
);
1058 /* Main functions of this module. */
1061 create_archive (void)
1065 open_archive (ACCESS_WRITE
);
1066 xheader_write_global ();
1068 if (incremental_option
)
1070 size_t buffer_size
= 1000;
1071 char *buffer
= xmalloc (buffer_size
);
1074 collect_and_sort_names ();
1076 while ((p
= name_from_list ()) != NULL
)
1077 if (!excluded_name (p
))
1078 dump_file (p
, -1, (dev_t
) 0);
1081 while ((p
= name_from_list ()) != NULL
)
1082 if (!excluded_name (p
))
1084 size_t plen
= strlen (p
);
1085 if (buffer_size
<= plen
)
1087 while ((buffer_size
*= 2) <= plen
)
1089 buffer
= xrealloc (buffer
, buffer_size
);
1091 memcpy (buffer
, p
, plen
);
1092 if (! ISSLASH (buffer
[plen
- 1]))
1093 buffer
[plen
++] = '/';
1094 q
= gnu_list_name
->dir_contents
;
1098 size_t qlen
= strlen (q
);
1101 if (buffer_size
< plen
+ qlen
)
1103 while ((buffer_size
*=2 ) < plen
+ qlen
)
1105 buffer
= xrealloc (buffer
, buffer_size
);
1107 strcpy (buffer
+ plen
, q
+ 1);
1108 dump_file (buffer
, -1, (dev_t
) 0);
1117 while ((p
= name_next (1)) != NULL
)
1118 if (!excluded_name (p
))
1119 dump_file (p
, 1, (dev_t
) 0);
1125 if (listed_incremental_option
)
1126 write_directory_file ();
1130 /* Calculate the hash of a link. */
1132 hash_link (void const *entry
, unsigned n_buckets
)
1134 struct link
const *link
= entry
;
1135 return (uintmax_t) (link
->dev
^ link
->ino
) % n_buckets
;
1138 /* Compare two links for equality. */
1140 compare_links (void const *entry1
, void const *entry2
)
1142 struct link
const *link1
= entry1
;
1143 struct link
const *link2
= entry2
;
1144 return ((link1
->dev
^ link2
->dev
) | (link1
->ino
^ link2
->ino
)) == 0;
1148 unknown_file_error (char *p
)
1150 WARN ((0, 0, _("%s: Unknown file type; file ignored"),
1151 quotearg_colon (p
)));
1152 if (!ignore_failed_read_option
)
1153 exit_status
= TAREXIT_FAILURE
;
1157 /* Handling of hard links */
1159 /* Table of all non-directories that we've written so far. Any time
1160 we see another, we check the table and avoid dumping the data
1161 again if we've done it once already. */
1162 static Hash_table
*link_table
;
1164 /* Try to dump stat as a hard link to another file in the archive. If
1165 succeeded returns true */
1167 dump_hard_link (struct tar_stat_info
*stat
)
1169 if (link_table
&& stat
->stat
.st_nlink
> 1)
1173 off_t block_ordinal
;
1176 lp
.ino
= stat
->stat
.st_ino
;
1177 lp
.dev
= stat
->stat
.st_dev
;
1179 if ((dup
= hash_lookup (link_table
, &lp
)))
1181 /* We found a link. */
1182 char const *link_name
= safer_name_suffix (dup
->name
, true);
1186 block_ordinal
= current_block_ordinal ();
1187 assign_string (&stat
->link_name
, link_name
);
1188 if (NAME_FIELD_SIZE
< strlen (link_name
))
1189 write_long_link (stat
);
1191 stat
->stat
.st_size
= 0;
1192 blk
= start_header (stat
);
1195 tar_copy_str (blk
->header
.linkname
, link_name
, NAME_FIELD_SIZE
);
1197 blk
->header
.typeflag
= LNKTYPE
;
1198 finish_header (stat
, blk
, block_ordinal
);
1200 if (remove_files_option
&& unlink (stat
->orig_file_name
) != 0)
1201 unlink_error (stat
->orig_file_name
);
1210 file_count_links (struct tar_stat_info
*stat
)
1212 if (stat
->stat
.st_nlink
> 1)
1215 struct link
*lp
= xmalloc (offsetof (struct link
, name
)
1216 + strlen (stat
->orig_file_name
) + 1);
1217 lp
->ino
= stat
->stat
.st_ino
;
1218 lp
->dev
= stat
->stat
.st_dev
;
1219 lp
->nlink
= stat
->stat
.st_nlink
;
1220 strcpy (lp
->name
, stat
->orig_file_name
);
1223 || (link_table
= hash_initialize (0, 0, hash_link
,
1225 && (dup
= hash_insert (link_table
, lp
))))
1234 /* For each dumped file, check if all its links were dumped. Emit
1235 warnings if it is not so. */
1244 for (lp
= hash_get_first (link_table
); lp
;
1245 lp
= hash_get_next (link_table
, lp
))
1249 WARN ((0, 0, _("Missing links to '%s'.\n"), lp
->name
));
1255 /* Dump a single file, recursing on directories. P is the file name
1256 to dump. TOP_LEVEL tells whether this is a top-level call; zero
1257 means no, positive means yes, and negative means the top level
1258 of an incremental dump. PARENT_DEVICE is the device of P's
1259 parent directory; it is examined only if TOP_LEVEL is zero. */
1261 /* FIXME: One should make sure that for *every* path leading to setting
1262 exit_status to failure, a clear diagnostic has been issued. */
1265 dump_file0 (struct tar_stat_info
*stat
, char *p
,
1266 int top_level
, dev_t parent_device
)
1268 union block
*header
;
1270 time_t original_ctime
;
1271 struct utimbuf restore_times
;
1272 off_t block_ordinal
= -1;
1274 if (interactive_option
&& !confirm ("add", p
))
1277 assign_string (&stat
->orig_file_name
, p
);
1278 assign_string (&stat
->file_name
, safer_name_suffix (p
, false));
1280 if (deref_stat (dereference_option
, p
, &stat
->stat
) != 0)
1285 stat
->archive_file_size
= stat
->stat
.st_size
;
1286 sys_stat_nanoseconds(stat
);
1287 original_ctime
= stat
->stat
.st_ctime
;
1288 restore_times
.actime
= stat
->stat
.st_atime
;
1289 restore_times
.modtime
= stat
->stat
.st_mtime
;
1292 if (S_ISHIDDEN (stat
->stat
.st_mode
))
1294 char *new = (char *) alloca (strlen (p
) + 2);
1304 /* See if we want only new files, and check if this one is too old to
1305 put in the archive. */
1307 if (!S_ISDIR (stat
->stat
.st_mode
)
1308 && stat
->stat
.st_mtime
< newer_mtime_option
1309 && (!after_date_option
|| stat
->stat
.st_ctime
< newer_ctime_option
))
1311 if (0 < top_level
) /* equivalent to !incremental_option */
1312 WARN ((0, 0, _("%s: file is unchanged; not dumped"),
1313 quotearg_colon (p
)));
1314 /* FIXME: recheck this return. */
1318 /* See if we are trying to dump the archive. */
1319 if (sys_file_is_archive (stat
))
1321 WARN ((0, 0, _("%s: file is the archive; not dumped"),
1322 quotearg_colon (p
)));
1326 if (S_ISDIR (stat
->stat
.st_mode
))
1328 dump_dir (stat
, top_level
, parent_device
);
1329 if (atime_preserve_option
)
1330 utime (p
, &restore_times
);
1333 else if (is_avoided_name (p
))
1337 /* Check for multiple links. */
1338 if (dump_hard_link (stat
))
1341 /* This is not a link to a previously dumped file, so dump it. */
1343 if (S_ISREG (stat
->stat
.st_mode
)
1344 || S_ISCTG (stat
->stat
.st_mode
))
1347 enum dump_status status
;
1349 if (file_dumpable_p (stat
))
1351 fd
= open (stat
->orig_file_name
,
1352 O_RDONLY
| O_BINARY
);
1355 if (!top_level
&& errno
== ENOENT
)
1356 WARN ((0, 0, _("%s: File removed before we read it"),
1357 quotearg_colon (stat
->orig_file_name
)));
1359 open_diag (stat
->orig_file_name
);
1366 if (sparse_option
&& sparse_file_p (stat
))
1368 status
= sparse_dump_file (fd
, stat
);
1369 if (status
== dump_status_not_implemented
)
1370 status
= dump_regular_file (fd
, stat
);
1373 status
= dump_regular_file (fd
, stat
);
1377 case dump_status_ok
:
1378 if (multi_volume_option
)
1379 assign_string (&save_name
, 0);
1380 dump_regular_finish (fd
, stat
, original_ctime
);
1383 case dump_status_short
:
1384 if (multi_volume_option
)
1385 assign_string (&save_name
, 0);
1389 case dump_status_fail
:
1393 case dump_status_not_implemented
:
1397 if (atime_preserve_option
)
1398 utime (stat
->orig_file_name
, &restore_times
);
1399 file_count_links (stat
);
1402 #ifdef HAVE_READLINK
1403 else if (S_ISLNK (stat
->stat
.st_mode
))
1407 size_t linklen
= stat
->stat
.st_size
;
1408 if (linklen
!= stat
->stat
.st_size
|| linklen
+ 1 == 0)
1410 buffer
= (char *) alloca (linklen
+ 1);
1411 size
= readlink (p
, buffer
, linklen
+ 1);
1417 buffer
[size
] = '\0';
1418 assign_string (&stat
->link_name
, buffer
);
1419 if (size
> NAME_FIELD_SIZE
)
1420 write_long_link (stat
);
1422 block_ordinal
= current_block_ordinal ();
1423 stat
->stat
.st_size
= 0; /* force 0 size on symlink */
1424 header
= start_header (stat
);
1427 tar_copy_str (header
->header
.linkname
, buffer
, NAME_FIELD_SIZE
);
1428 header
->header
.typeflag
= SYMTYPE
;
1429 finish_header (stat
, header
, block_ordinal
);
1430 /* nothing more to do to it */
1432 if (remove_files_option
)
1434 if (unlink (p
) == -1)
1437 file_count_links (stat
);
1441 else if (S_ISCHR (stat
->stat
.st_mode
))
1443 else if (S_ISBLK (stat
->stat
.st_mode
))
1445 else if (S_ISFIFO (stat
->stat
.st_mode
))
1447 else if (S_ISSOCK (stat
->stat
.st_mode
))
1449 WARN ((0, 0, _("%s: socket ignored"), quotearg_colon (p
)));
1452 else if (S_ISDOOR (stat
->stat
.st_mode
))
1454 WARN ((0, 0, _("%s: door ignored"), quotearg_colon (p
)));
1459 unknown_file_error (p
);
1464 if (archive_format
== V7_FORMAT
)
1466 unknown_file_error (p
);
1470 block_ordinal
= current_block_ordinal ();
1471 stat
->stat
.st_size
= 0; /* force 0 size */
1472 header
= start_header (stat
);
1475 header
->header
.typeflag
= type
;
1477 if (type
!= FIFOTYPE
)
1479 MAJOR_TO_CHARS (major (stat
->stat
.st_rdev
),
1480 header
->header
.devmajor
);
1481 MINOR_TO_CHARS (minor (stat
->stat
.st_rdev
),
1482 header
->header
.devminor
);
1485 finish_header (stat
, header
, block_ordinal
);
1486 if (remove_files_option
)
1488 if (unlink (p
) == -1)
1494 dump_file (char *p
, int top_level
, dev_t parent_device
)
1496 struct tar_stat_info stat
;
1497 tar_stat_init (&stat
);
1498 dump_file0 (&stat
, p
, top_level
, parent_device
);
1499 tar_stat_destroy (&stat
);