1 /* List a tar archive, with support routines for reading a tar archive.
3 Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1998, 1999, 2000,
4 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
6 Written by John Gilmore, on 1985-08-26.
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. */
28 #define max(a, b) ((a) < (b) ? (b) : (a))
30 union block
*current_header
; /* points to current archive header */
31 enum archive_format current_format
; /* recognized format */
32 union block
*recent_long_name
; /* recent long name header and contents */
33 union block
*recent_long_link
; /* likewise, for long link */
34 size_t recent_long_name_blocks
; /* number of blocks in recent_long_name */
35 size_t recent_long_link_blocks
; /* likewise, for long link */
37 static uintmax_t from_header (const char *, size_t, const char *,
38 uintmax_t, uintmax_t, bool, bool);
40 /* Base 64 digits; see Internet RFC 2045 Table 1. */
41 static char const base_64_digits
[64] =
43 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
44 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
45 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
46 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
47 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
50 /* Table of base-64 digit values indexed by unsigned chars.
51 The value is 64 for unsigned chars that are not base-64 digits. */
52 static char base64_map
[UCHAR_MAX
+ 1];
58 memset (base64_map
, 64, sizeof base64_map
);
59 for (i
= 0; i
< 64; i
++)
60 base64_map
[(int) base_64_digits
[i
]] = i
;
63 /* Main loop for reading an archive. */
65 read_and (void (*do_something
) (void))
67 enum read_header status
= HEADER_STILL_UNREAD
;
68 enum read_header prev_status
;
69 struct timespec mtime
;
74 open_archive (ACCESS_READ
);
78 tar_stat_destroy (¤t_stat_info
);
80 status
= read_header (false);
83 case HEADER_STILL_UNREAD
:
84 case HEADER_SUCCESS_EXTENDED
:
89 /* Valid header. We should decode next field (mode) first.
90 Ensure incoming names are null terminated. */
92 if (! name_match (current_stat_info
.file_name
)
93 || (NEWER_OPTION_INITIALIZED (newer_mtime_option
)
94 /* FIXME: We get mtime now, and again later; this causes
95 duplicate diagnostics if header.mtime is bogus. */
97 = TIME_FROM_HEADER (current_header
->header
.mtime
)),
98 /* FIXME: Grab fractional time stamps from
101 current_stat_info
.mtime
= mtime
,
102 OLDER_TAR_STAT_TIME (current_stat_info
, m
)))
103 || excluded_name (current_stat_info
.file_name
))
105 switch (current_header
->header
.typeflag
)
108 case GNUTYPE_MULTIVOL
:
112 if (show_omitted_dirs_option
)
113 WARN ((0, 0, _("%s: Omitting"),
114 quotearg_colon (current_stat_info
.file_name
)));
117 decode_header (current_header
,
118 ¤t_stat_info
, ¤t_format
, 0);
127 case HEADER_ZERO_BLOCK
:
128 if (block_number_option
)
130 char buf
[UINTMAX_STRSIZE_BOUND
];
131 fprintf (stdlis
, _("block %s: ** Block of NULs **\n"),
132 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
135 set_next_block_after (current_header
);
137 if (!ignore_zeros_option
)
139 char buf
[UINTMAX_STRSIZE_BOUND
];
141 status
= read_header (false);
142 if (status
== HEADER_ZERO_BLOCK
)
144 WARN ((0, 0, _("A lone zero block at %s"),
145 STRINGIFY_BIGINT (current_block_ordinal (), buf
)));
148 status
= prev_status
;
151 case HEADER_END_OF_FILE
:
152 if (block_number_option
)
154 char buf
[UINTMAX_STRSIZE_BOUND
];
155 fprintf (stdlis
, _("block %s: ** End of File **\n"),
156 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
161 /* If the previous header was good, tell them that we are
162 skipping bad ones. */
163 set_next_block_after (current_header
);
166 case HEADER_STILL_UNREAD
:
167 ERROR ((0, 0, _("This does not look like a tar archive")));
170 case HEADER_ZERO_BLOCK
:
172 if (block_number_option
)
174 char buf
[UINTMAX_STRSIZE_BOUND
];
175 off_t block_ordinal
= current_block_ordinal ();
176 block_ordinal
-= recent_long_name_blocks
;
177 block_ordinal
-= recent_long_link_blocks
;
178 fprintf (stdlis
, _("block %s: "),
179 STRINGIFY_BIGINT (block_ordinal
, buf
));
181 ERROR ((0, 0, _("Skipping to next header")));
184 case HEADER_END_OF_FILE
:
186 /* We are in the middle of a cascade of errors. */
189 case HEADER_SUCCESS_EXTENDED
:
196 while (!all_names_found (¤t_stat_info
));
199 names_notfound (); /* print names not found */
202 /* Print a header block, based on tar options. */
206 off_t block_ordinal
= current_block_ordinal ();
207 /* Print the header block. */
209 decode_header (current_header
, ¤t_stat_info
, ¤t_format
, 0);
211 print_header (¤t_stat_info
, block_ordinal
);
213 if (incremental_option
)
215 if (verbose_option
> 2)
217 if (is_dumpdir (¤t_stat_info
))
218 list_dumpdir (current_stat_info
.dumpdir
,
219 dumpdir_size (current_stat_info
.dumpdir
));
226 /* Check header checksum */
227 /* The standard BSD tar sources create the checksum by adding up the
228 bytes in the header as type char. I think the type char was unsigned
229 on the PDP-11, but it's signed on the Next and Sun. It looks like the
230 sources to BSD tar were never changed to compute the checksum
231 correctly, so both the Sun and Next add the bytes of the header as
232 signed chars. This doesn't cause a problem until you get a file with
233 a name containing characters with the high bit set. So tar_checksum
234 computes two checksums -- signed and unsigned. */
237 tar_checksum (union block
*header
, bool silent
)
240 int unsigned_sum
= 0; /* the POSIX one :-) */
241 int signed_sum
= 0; /* the Sun one :-( */
243 uintmax_t parsed_sum
;
247 for (i
= sizeof *header
; i
-- != 0;)
249 unsigned_sum
+= (unsigned char) *p
;
250 signed_sum
+= (signed char) (*p
++);
253 if (unsigned_sum
== 0)
254 return HEADER_ZERO_BLOCK
;
256 /* Adjust checksum to count the "chksum" field as blanks. */
258 for (i
= sizeof header
->header
.chksum
; i
-- != 0;)
260 unsigned_sum
-= (unsigned char) header
->header
.chksum
[i
];
261 signed_sum
-= (signed char) (header
->header
.chksum
[i
]);
263 unsigned_sum
+= ' ' * sizeof header
->header
.chksum
;
264 signed_sum
+= ' ' * sizeof header
->header
.chksum
;
266 parsed_sum
= from_header (header
->header
.chksum
,
267 sizeof header
->header
.chksum
, 0,
269 (uintmax_t) TYPE_MAXIMUM (int), true, silent
);
270 if (parsed_sum
== (uintmax_t) -1)
271 return HEADER_FAILURE
;
273 recorded_sum
= parsed_sum
;
275 if (unsigned_sum
!= recorded_sum
&& signed_sum
!= recorded_sum
)
276 return HEADER_FAILURE
;
278 return HEADER_SUCCESS
;
281 /* Read a block that's supposed to be a header block. Return its
282 address in "current_header", and if it is good, the file's size
283 and names (file name, link name) in *info.
285 Return 1 for success, 0 if the checksum is bad, EOF on eof, 2 for a
286 block full of zeros (EOF marker).
288 If RAW_EXTENDED_HEADERS is nonzero, do not automagically fold the
289 GNU long name and link headers into later headers.
291 You must always set_next_block_after(current_header) to skip past
292 the header which this routine reads. */
295 read_header_primitive (bool raw_extended_headers
, struct tar_stat_info
*info
)
298 union block
*header_copy
;
300 union block
*data_block
;
301 size_t size
, written
;
302 union block
*next_long_name
= 0;
303 union block
*next_long_link
= 0;
304 size_t next_long_name_blocks
;
305 size_t next_long_link_blocks
;
309 enum read_header status
;
311 header
= find_next_block ();
312 current_header
= header
;
314 return HEADER_END_OF_FILE
;
316 if ((status
= tar_checksum (header
, false)) != HEADER_SUCCESS
)
319 /* Good block. Decode file size and return. */
321 if (header
->header
.typeflag
== LNKTYPE
)
322 info
->stat
.st_size
= 0; /* links 0 size on tape */
324 info
->stat
.st_size
= OFF_FROM_HEADER (header
->header
.size
);
326 if (header
->header
.typeflag
== GNUTYPE_LONGNAME
327 || header
->header
.typeflag
== GNUTYPE_LONGLINK
328 || header
->header
.typeflag
== XHDTYPE
329 || header
->header
.typeflag
== XGLTYPE
330 || header
->header
.typeflag
== SOLARIS_XHDTYPE
)
332 if (raw_extended_headers
)
333 return HEADER_SUCCESS_EXTENDED
;
334 else if (header
->header
.typeflag
== GNUTYPE_LONGNAME
335 || header
->header
.typeflag
== GNUTYPE_LONGLINK
)
337 size_t name_size
= info
->stat
.st_size
;
338 size_t n
= name_size
% BLOCKSIZE
;
339 size
= name_size
+ BLOCKSIZE
;
341 size
+= BLOCKSIZE
- n
;
343 if (name_size
!= info
->stat
.st_size
|| size
< name_size
)
346 header_copy
= xmalloc (size
+ 1);
348 if (header
->header
.typeflag
== GNUTYPE_LONGNAME
)
351 free (next_long_name
);
352 next_long_name
= header_copy
;
353 next_long_name_blocks
= size
/ BLOCKSIZE
;
358 free (next_long_link
);
359 next_long_link
= header_copy
;
360 next_long_link_blocks
= size
/ BLOCKSIZE
;
363 set_next_block_after (header
);
364 *header_copy
= *header
;
365 bp
= header_copy
->buffer
+ BLOCKSIZE
;
367 for (size
-= BLOCKSIZE
; size
> 0; size
-= written
)
369 data_block
= find_next_block ();
372 ERROR ((0, 0, _("Unexpected EOF in archive")));
375 written
= available_space_after (data_block
);
379 memcpy (bp
, data_block
->buffer
, written
);
381 set_next_block_after ((union block
*)
382 (data_block
->buffer
+ written
- 1));
387 else if (header
->header
.typeflag
== XHDTYPE
388 || header
->header
.typeflag
== SOLARIS_XHDTYPE
)
389 xheader_read (&info
->xhdr
, header
,
390 OFF_FROM_HEADER (header
->header
.size
));
391 else if (header
->header
.typeflag
== XGLTYPE
)
394 memset (&xhdr
, 0, sizeof xhdr
);
395 xheader_read (&xhdr
, header
,
396 OFF_FROM_HEADER (header
->header
.size
));
397 xheader_decode_global (&xhdr
);
398 xheader_destroy (&xhdr
);
407 struct posix_header
const *h
= ¤t_header
->header
;
408 char namebuf
[sizeof h
->prefix
+ 1 + NAME_FIELD_SIZE
+ 1];
410 if (recent_long_name
)
411 free (recent_long_name
);
415 name
= next_long_name
->buffer
+ BLOCKSIZE
;
416 recent_long_name
= next_long_name
;
417 recent_long_name_blocks
= next_long_name_blocks
;
421 /* Accept file names as specified by POSIX.1-1996
425 if (h
->prefix
[0] && strcmp (h
->magic
, TMAGIC
) == 0)
427 memcpy (np
, h
->prefix
, sizeof h
->prefix
);
428 np
[sizeof h
->prefix
] = '\0';
432 memcpy (np
, h
->name
, sizeof h
->name
);
433 np
[sizeof h
->name
] = '\0';
435 recent_long_name
= 0;
436 recent_long_name_blocks
= 0;
438 assign_string (&info
->orig_file_name
, name
);
439 assign_string (&info
->file_name
, name
);
440 info
->had_trailing_slash
= strip_trailing_slashes (info
->file_name
);
442 if (recent_long_link
)
443 free (recent_long_link
);
447 name
= next_long_link
->buffer
+ BLOCKSIZE
;
448 recent_long_link
= next_long_link
;
449 recent_long_link_blocks
= next_long_link_blocks
;
453 memcpy (namebuf
, h
->linkname
, sizeof h
->linkname
);
454 namebuf
[sizeof h
->linkname
] = '\0';
456 recent_long_link
= 0;
457 recent_long_link_blocks
= 0;
459 assign_string (&info
->link_name
, name
);
461 return HEADER_SUCCESS
;
467 read_header (bool raw_extended_headers
)
469 return read_header_primitive (raw_extended_headers
, ¤t_stat_info
);
473 decode_xform (char *file_name
, void *data
)
475 xform_type type
= *(xform_type
*)data
;
480 /* FIXME: It is not quite clear how and to which extent are the symbolic
481 links subject to filename transformation. In the absence of another
482 solution, symbolic links are exempt from component stripping and
483 name suffix normalization, but subject to filename transformation
488 file_name
= safer_name_suffix (file_name
, true, absolute_names_option
);
492 file_name
= safer_name_suffix (file_name
, false, absolute_names_option
);
496 if (strip_name_components
)
498 size_t prefix_len
= stripped_prefix_len (file_name
,
499 strip_name_components
);
500 if (prefix_len
== (size_t) -1)
501 prefix_len
= strlen (file_name
);
502 file_name
+= prefix_len
;
508 transform_member_name (char **pinput
, xform_type type
)
510 return transform_name_fp (pinput
, decode_xform
, &type
);
513 #define ISOCTAL(c) ((c)>='0'&&(c)<='7')
515 /* Decode things from a file HEADER block into STAT_INFO, also setting
516 *FORMAT_POINTER depending on the header block format. If
517 DO_USER_GROUP, decode the user/group information (this is useful
518 for extraction, but waste time when merely listing).
520 read_header() has already decoded the checksum and length, so we don't.
522 This routine should *not* be called twice for the same block, since
523 the two calls might use different DO_USER_GROUP values and thus
524 might end up with different uid/gid for the two calls. If anybody
525 wants the uid/gid they should decode it first, and other callers
526 should decode it without uid/gid before calling a routine,
527 e.g. print_header, that assumes decoded data. */
529 decode_header (union block
*header
, struct tar_stat_info
*stat_info
,
530 enum archive_format
*format_pointer
, int do_user_group
)
532 enum archive_format format
;
534 if (strcmp (header
->header
.magic
, TMAGIC
) == 0)
536 if (header
->star_header
.prefix
[130] == 0
537 && ISOCTAL (header
->star_header
.atime
[0])
538 && header
->star_header
.atime
[11] == ' '
539 && ISOCTAL (header
->star_header
.ctime
[0])
540 && header
->star_header
.ctime
[11] == ' ')
541 format
= STAR_FORMAT
;
542 else if (stat_info
->xhdr
.size
)
543 format
= POSIX_FORMAT
;
545 format
= USTAR_FORMAT
;
547 else if (strcmp (header
->header
.magic
, OLDGNU_MAGIC
) == 0)
548 format
= OLDGNU_FORMAT
;
551 *format_pointer
= format
;
553 stat_info
->stat
.st_mode
= MODE_FROM_HEADER (header
->header
.mode
);
554 stat_info
->mtime
.tv_sec
= TIME_FROM_HEADER (header
->header
.mtime
);
555 stat_info
->mtime
.tv_nsec
= 0;
556 assign_string (&stat_info
->uname
,
557 header
->header
.uname
[0] ? header
->header
.uname
: NULL
);
558 assign_string (&stat_info
->gname
,
559 header
->header
.gname
[0] ? header
->header
.gname
: NULL
);
561 if (format
== OLDGNU_FORMAT
&& incremental_option
)
563 stat_info
->atime
.tv_sec
= TIME_FROM_HEADER (header
->oldgnu_header
.atime
);
564 stat_info
->ctime
.tv_sec
= TIME_FROM_HEADER (header
->oldgnu_header
.ctime
);
565 stat_info
->atime
.tv_nsec
= stat_info
->ctime
.tv_nsec
= 0;
567 else if (format
== STAR_FORMAT
)
569 stat_info
->atime
.tv_sec
= TIME_FROM_HEADER (header
->star_header
.atime
);
570 stat_info
->ctime
.tv_sec
= TIME_FROM_HEADER (header
->star_header
.ctime
);
571 stat_info
->atime
.tv_nsec
= stat_info
->ctime
.tv_nsec
= 0;
574 stat_info
->atime
= stat_info
->ctime
= start_time
;
576 if (format
== V7_FORMAT
)
578 stat_info
->stat
.st_uid
= UID_FROM_HEADER (header
->header
.uid
);
579 stat_info
->stat
.st_gid
= GID_FROM_HEADER (header
->header
.gid
);
580 stat_info
->stat
.st_rdev
= 0;
586 /* FIXME: Decide if this should somewhat depend on -p. */
588 if (numeric_owner_option
589 || !*header
->header
.uname
590 || !uname_to_uid (header
->header
.uname
, &stat_info
->stat
.st_uid
))
591 stat_info
->stat
.st_uid
= UID_FROM_HEADER (header
->header
.uid
);
593 if (numeric_owner_option
594 || !*header
->header
.gname
595 || !gname_to_gid (header
->header
.gname
, &stat_info
->stat
.st_gid
))
596 stat_info
->stat
.st_gid
= GID_FROM_HEADER (header
->header
.gid
);
599 switch (header
->header
.typeflag
)
603 stat_info
->stat
.st_rdev
=
604 makedev (MAJOR_FROM_HEADER (header
->header
.devmajor
),
605 MINOR_FROM_HEADER (header
->header
.devminor
));
609 stat_info
->stat
.st_rdev
= 0;
613 stat_info
->archive_file_size
= stat_info
->stat
.st_size
;
614 xheader_decode (stat_info
);
616 if (sparse_member_p (stat_info
))
618 sparse_fixup_header (stat_info
);
619 stat_info
->is_sparse
= true;
623 stat_info
->is_sparse
= false;
624 if (((current_format
== GNU_FORMAT
625 || current_format
== OLDGNU_FORMAT
)
626 && current_header
->header
.typeflag
== GNUTYPE_DUMPDIR
)
627 || stat_info
->dumpdir
)
628 stat_info
->is_dumpdir
= true;
631 transform_member_name (&stat_info
->file_name
, xform_regfile
);
634 /* Convert buffer at WHERE0 of size DIGS from external format to
635 uintmax_t. DIGS must be positive. If TYPE is nonnull, the data
636 are of type TYPE. The buffer must represent a value in the range
637 -MINUS_MINVAL through MAXVAL. If OCTAL_ONLY, allow only octal
638 numbers instead of the other GNU extensions. Return -1 on error,
639 diagnosing the error if TYPE is nonnull and if !SILENT. */
641 from_header (char const *where0
, size_t digs
, char const *type
,
642 uintmax_t minus_minval
, uintmax_t maxval
,
643 bool octal_only
, bool silent
)
646 char const *where
= where0
;
647 char const *lim
= where
+ digs
;
650 /* Accommodate buggy tar of unknown vintage, which outputs leading
651 NUL if the previous field overflows. */
654 /* Accommodate older tars, which output leading spaces. */
661 /* TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.) */
662 _("Blanks in header where numeric %s value expected"),
666 if (!ISSPACE ((unsigned char) *where
))
672 if (ISODIGIT (*where
))
674 char const *where1
= where
;
675 uintmax_t overflow
= 0;
679 value
+= *where
++ - '0';
680 if (where
== lim
|| ! ISODIGIT (*where
))
682 overflow
|= value
^ (value
<< LG_8
>> LG_8
);
686 /* Parse the output of older, unportable tars, which generate
687 negative values in two's complement octal. If the leading
688 nonzero digit is 1, we can't recover the original value
689 reliably; so do this only if the digit is 2 or more. This
690 catches the common case of 32-bit negative time stamps. */
691 if ((overflow
|| maxval
< value
) && '2' <= *where1
&& type
)
693 /* Compute the negative of the input value, assuming two's
695 int digit
= (*where1
- '0') | 4;
703 if (where
== lim
|| ! ISODIGIT (*where
))
705 digit
= *where
- '0';
706 overflow
|= value
^ (value
<< LG_8
>> LG_8
);
712 if (!overflow
&& value
<= minus_minval
)
716 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
717 _("Archive octal value %.*s is out of %s range; assuming two's complement"),
718 (int) (where
- where1
), where1
, type
));
727 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
728 _("Archive octal value %.*s is out of %s range"),
729 (int) (where
- where1
), where1
, type
));
735 /* Suppress the following extensions. */
737 else if (*where
== '-' || *where
== '+')
739 /* Parse base-64 output produced only by tar test versions
740 1.13.6 (1999-08-11) through 1.13.11 (1999-08-23).
741 Support for this will be withdrawn in future releases. */
745 static bool warned_once
;
749 WARN ((0, 0, _("Archive contains obsolescent base-64 headers")));
752 negative
= *where
++ == '-';
754 && (dig
= base64_map
[(unsigned char) *where
]) < 64)
756 if (value
<< LG_64
>> LG_64
!= value
)
758 char *string
= alloca (digs
+ 1);
759 memcpy (string
, where0
, digs
);
763 _("Archive signed base-64 string %s is out of %s range"),
764 quote (string
), type
));
767 value
= (value
<< LG_64
) | dig
;
771 else if (*where
== '\200' /* positive base-256 */
772 || *where
== '\377' /* negative base-256 */)
774 /* Parse base-256 output. A nonnegative number N is
775 represented as (256**DIGS)/2 + N; a negative number -N is
776 represented as (256**DIGS) - N, i.e. as two's complement.
777 The representation guarantees that the leading bit is
778 always on, so that we don't confuse this format with the
779 others (assuming ASCII bytes of 8 bits or more). */
780 int signbit
= *where
& (1 << (LG_256
- 2));
781 uintmax_t topbits
= (((uintmax_t) - signbit
)
782 << (CHAR_BIT
* sizeof (uintmax_t)
783 - LG_256
- (LG_256
- 2)));
784 value
= (*where
++ & ((1 << (LG_256
- 2)) - 1)) - signbit
;
787 value
= (value
<< LG_256
) + (unsigned char) *where
++;
790 if (((value
<< LG_256
>> LG_256
) | topbits
) != value
)
794 _("Archive base-256 value is out of %s range"),
804 if (where
!= lim
&& *where
&& !ISSPACE ((unsigned char) *where
))
808 char buf
[1000]; /* Big enough to represent any header. */
809 static struct quoting_options
*o
;
813 o
= clone_quoting_options (0);
814 set_quoting_style (o
, locale_quoting_style
);
817 while (where0
!= lim
&& ! lim
[-1])
819 quotearg_buffer (buf
, sizeof buf
, where0
, lim
- where
, o
);
822 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
823 _("Archive contains %.*s where numeric %s value expected"),
824 (int) sizeof buf
, buf
, type
));
830 if (value
<= (negative
? minus_minval
: maxval
))
831 return negative
? -value
: value
;
835 char minval_buf
[UINTMAX_STRSIZE_BOUND
+ 1];
836 char maxval_buf
[UINTMAX_STRSIZE_BOUND
];
837 char value_buf
[UINTMAX_STRSIZE_BOUND
+ 1];
838 char *minval_string
= STRINGIFY_BIGINT (minus_minval
, minval_buf
+ 1);
839 char *value_string
= STRINGIFY_BIGINT (value
, value_buf
+ 1);
841 *--value_string
= '-';
843 *--minval_string
= '-';
844 /* TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.) */
845 ERROR ((0, 0, _("Archive value %s is out of %s range %s..%s"),
847 minval_string
, STRINGIFY_BIGINT (maxval
, maxval_buf
)));
854 gid_from_header (const char *p
, size_t s
)
856 return from_header (p
, s
, "gid_t",
857 - (uintmax_t) TYPE_MINIMUM (gid_t
),
858 (uintmax_t) TYPE_MAXIMUM (gid_t
),
863 major_from_header (const char *p
, size_t s
)
865 return from_header (p
, s
, "major_t",
866 - (uintmax_t) TYPE_MINIMUM (major_t
),
867 (uintmax_t) TYPE_MAXIMUM (major_t
), false, false);
871 minor_from_header (const char *p
, size_t s
)
873 return from_header (p
, s
, "minor_t",
874 - (uintmax_t) TYPE_MINIMUM (minor_t
),
875 (uintmax_t) TYPE_MAXIMUM (minor_t
), false, false);
879 mode_from_header (const char *p
, size_t s
)
881 /* Do not complain about unrecognized mode bits. */
882 unsigned u
= from_header (p
, s
, "mode_t",
883 - (uintmax_t) TYPE_MINIMUM (mode_t
),
884 TYPE_MAXIMUM (uintmax_t), false, false);
885 return ((u
& TSUID
? S_ISUID
: 0)
886 | (u
& TSGID
? S_ISGID
: 0)
887 | (u
& TSVTX
? S_ISVTX
: 0)
888 | (u
& TUREAD
? S_IRUSR
: 0)
889 | (u
& TUWRITE
? S_IWUSR
: 0)
890 | (u
& TUEXEC
? S_IXUSR
: 0)
891 | (u
& TGREAD
? S_IRGRP
: 0)
892 | (u
& TGWRITE
? S_IWGRP
: 0)
893 | (u
& TGEXEC
? S_IXGRP
: 0)
894 | (u
& TOREAD
? S_IROTH
: 0)
895 | (u
& TOWRITE
? S_IWOTH
: 0)
896 | (u
& TOEXEC
? S_IXOTH
: 0));
900 off_from_header (const char *p
, size_t s
)
902 /* Negative offsets are not allowed in tar files, so invoke
903 from_header with minimum value 0, not TYPE_MINIMUM (off_t). */
904 return from_header (p
, s
, "off_t", (uintmax_t) 0,
905 (uintmax_t) TYPE_MAXIMUM (off_t
), false, false);
909 size_from_header (const char *p
, size_t s
)
911 return from_header (p
, s
, "size_t", (uintmax_t) 0,
912 (uintmax_t) TYPE_MAXIMUM (size_t), false, false);
916 time_from_header (const char *p
, size_t s
)
918 return from_header (p
, s
, "time_t",
919 - (uintmax_t) TYPE_MINIMUM (time_t),
920 (uintmax_t) TYPE_MAXIMUM (time_t), false, false);
924 uid_from_header (const char *p
, size_t s
)
926 return from_header (p
, s
, "uid_t",
927 - (uintmax_t) TYPE_MINIMUM (uid_t
),
928 (uintmax_t) TYPE_MAXIMUM (uid_t
), false, false);
932 uintmax_from_header (const char *p
, size_t s
)
934 return from_header (p
, s
, "uintmax_t", (uintmax_t) 0,
935 TYPE_MAXIMUM (uintmax_t), false, false);
939 /* Return a printable representation of T. The result points to
940 static storage that can be reused in the next call to this
941 function, to ctime, or to asctime. If FULL_TIME, then output the
942 time stamp to its full resolution; otherwise, just output it to
943 1-minute resolution. */
945 tartime (struct timespec t
, bool full_time
)
947 enum { fraclen
= sizeof ".FFFFFFFFF" - 1 };
948 static char buffer
[max (UINTMAX_STRSIZE_BOUND
+ 1,
949 INT_STRLEN_BOUND (int) + 16)
954 bool negative
= s
< 0;
957 if (negative
&& ns
!= 0)
960 ns
= 1000000000 - ns
;
963 tm
= utc_option
? gmtime (&s
) : localtime (&s
);
968 sprintf (buffer
, "%04ld-%02d-%02d %02d:%02d:%02d",
969 tm
->tm_year
+ 1900L, tm
->tm_mon
+ 1, tm
->tm_mday
,
970 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
971 code_ns_fraction (ns
, buffer
+ strlen (buffer
));
974 sprintf (buffer
, "%04ld-%02d-%02d %02d:%02d",
975 tm
->tm_year
+ 1900L, tm
->tm_mon
+ 1, tm
->tm_mday
,
976 tm
->tm_hour
, tm
->tm_min
);
980 /* The time stamp cannot be broken down, most likely because it
981 is out of range. Convert it as an integer,
982 right-adjusted in a field with the same width as the usual
983 4-year ISO time format. */
984 p
= umaxtostr (negative
? - (uintmax_t) s
: s
,
985 buffer
+ sizeof buffer
- UINTMAX_STRSIZE_BOUND
- fraclen
);
988 while ((buffer
+ sizeof buffer
- sizeof "YYYY-MM-DD HH:MM"
989 + (full_time
? sizeof ":SS.FFFFFFFFF" - 1 : 0))
993 code_ns_fraction (ns
, buffer
+ sizeof buffer
- 1 - fraclen
);
997 /* Actually print it.
999 Plain and fancy file header block logging. Non-verbose just prints
1000 the name, e.g. for "tar t" or "tar x". This should just contain
1001 file names, so it can be fed back into tar with xargs or the "-T"
1002 option. The verbose option can give a bunch of info, one line per
1003 file. I doubt anybody tries to parse its format, or if they do,
1004 they shouldn't. Unix tar is pretty random here anyway. */
1007 /* FIXME: Note that print_header uses the globals HEAD, HSTAT, and
1008 HEAD_STANDARD, which must be set up in advance. Not very clean.. */
1010 /* Width of "user/group size", with initial value chosen
1011 heuristically. This grows as needed, though this may cause some
1012 stairstepping in the output. Make it too small and the output will
1013 almost always look ragged. Make it too large and the output will
1014 be spaced out too far. */
1015 static int ugswidth
= 19;
1017 /* Width of printed time stamps. It grows if longer time stamps are
1018 found (typically, those with nanosecond resolution). Like
1019 USGWIDTH, some stairstepping may occur. */
1020 static int datewidth
= sizeof "YYYY-MM-DD HH:MM" - 1;
1023 print_header (struct tar_stat_info
*st
, off_t block_ordinal
)
1026 char const *time_stamp
;
1030 /* These hold formatted ints. */
1031 char uform
[UINTMAX_STRSIZE_BOUND
], gform
[UINTMAX_STRSIZE_BOUND
];
1033 char size
[2 * UINTMAX_STRSIZE_BOUND
];
1034 /* holds formatted size or major,minor */
1035 char uintbuf
[UINTMAX_STRSIZE_BOUND
];
1039 if (test_label_option
&& current_header
->header
.typeflag
!= GNUTYPE_VOLHDR
)
1042 if (show_transformed_names_option
)
1043 temp_name
= st
->file_name
? st
->file_name
: st
->orig_file_name
;
1045 temp_name
= st
->orig_file_name
? st
->orig_file_name
: st
->file_name
;
1047 if (block_number_option
)
1049 char buf
[UINTMAX_STRSIZE_BOUND
];
1050 if (block_ordinal
< 0)
1051 block_ordinal
= current_block_ordinal ();
1052 block_ordinal
-= recent_long_name_blocks
;
1053 block_ordinal
-= recent_long_link_blocks
;
1054 fprintf (stdlis
, _("block %s: "),
1055 STRINGIFY_BIGINT (block_ordinal
, buf
));
1058 if (verbose_option
<= 1)
1060 /* Just the fax, mam. */
1061 fprintf (stdlis
, "%s\n", quotearg (temp_name
));
1065 /* File type and modes. */
1068 switch (current_header
->header
.typeflag
)
1070 case GNUTYPE_VOLHDR
:
1074 case GNUTYPE_MULTIVOL
:
1078 case GNUTYPE_LONGNAME
:
1079 case GNUTYPE_LONGLINK
:
1081 ERROR ((0, 0, _("Unexpected long name header")));
1084 case GNUTYPE_SPARSE
:
1088 if (temp_name
[strlen (temp_name
) - 1] == '/')
1094 case GNUTYPE_DUMPDIR
:
1117 pax_decode_mode (st
->stat
.st_mode
, modes
+ 1);
1121 time_stamp
= tartime (st
->mtime
, false);
1122 time_stamp_len
= strlen (time_stamp
);
1123 if (datewidth
< time_stamp_len
)
1124 datewidth
= time_stamp_len
;
1126 /* User and group names. */
1130 && current_format
!= V7_FORMAT
1131 && !numeric_owner_option
)
1135 /* Try parsing it as an unsigned integer first, and as a
1136 uid_t if that fails. This method can list positive user
1137 ids that are too large to fit in a uid_t. */
1138 uintmax_t u
= from_header (current_header
->header
.uid
,
1139 sizeof current_header
->header
.uid
, 0,
1141 (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1144 user
= STRINGIFY_BIGINT (u
, uform
);
1147 sprintf (uform
, "%ld",
1148 (long) UID_FROM_HEADER (current_header
->header
.uid
));
1155 && current_format
!= V7_FORMAT
1156 && !numeric_owner_option
)
1160 /* Try parsing it as an unsigned integer first, and as a
1161 gid_t if that fails. This method can list positive group
1162 ids that are too large to fit in a gid_t. */
1163 uintmax_t g
= from_header (current_header
->header
.gid
,
1164 sizeof current_header
->header
.gid
, 0,
1166 (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1169 group
= STRINGIFY_BIGINT (g
, gform
);
1172 sprintf (gform
, "%ld",
1173 (long) GID_FROM_HEADER (current_header
->header
.gid
));
1178 /* Format the file size or major/minor device numbers. */
1180 switch (current_header
->header
.typeflag
)
1185 STRINGIFY_BIGINT (major (st
->stat
.st_rdev
), uintbuf
));
1188 STRINGIFY_BIGINT (minor (st
->stat
.st_rdev
), uintbuf
));
1192 /* st->stat.st_size keeps stored file size */
1193 strcpy (size
, STRINGIFY_BIGINT (st
->stat
.st_size
, uintbuf
));
1197 /* Figure out padding and print the whole line. */
1199 sizelen
= strlen (size
);
1200 pad
= strlen (user
) + 1 + strlen (group
) + 1 + sizelen
;
1204 fprintf (stdlis
, "%s %s/%s %*s %-*s",
1205 modes
, user
, group
, ugswidth
- pad
+ sizelen
, size
,
1206 datewidth
, time_stamp
);
1208 fprintf (stdlis
, " %s", quotearg (temp_name
));
1210 switch (current_header
->header
.typeflag
)
1213 fprintf (stdlis
, " -> %s\n", quotearg (st
->link_name
));
1217 fprintf (stdlis
, _(" link to %s\n"), quotearg (st
->link_name
));
1222 char type_string
[2];
1223 type_string
[0] = current_header
->header
.typeflag
;
1224 type_string
[1] = '\0';
1225 fprintf (stdlis
, _(" unknown file type %s\n"),
1226 quote (type_string
));
1232 case GNUTYPE_SPARSE
:
1238 case GNUTYPE_DUMPDIR
:
1239 putc ('\n', stdlis
);
1242 case GNUTYPE_LONGLINK
:
1243 fprintf (stdlis
, _("--Long Link--\n"));
1246 case GNUTYPE_LONGNAME
:
1247 fprintf (stdlis
, _("--Long Name--\n"));
1250 case GNUTYPE_VOLHDR
:
1251 fprintf (stdlis
, _("--Volume Header--\n"));
1254 case GNUTYPE_MULTIVOL
:
1257 (UINTMAX_FROM_HEADER (current_header
->oldgnu_header
.offset
),
1259 fprintf (stdlis
, _("--Continued at byte %s--\n"), size
);
1266 /* Print a similar line when we make a directory automatically. */
1268 print_for_mkdir (char *dirname
, int length
, mode_t mode
)
1272 if (verbose_option
> 1)
1274 /* File type and modes. */
1277 pax_decode_mode (mode
, modes
+ 1);
1279 if (block_number_option
)
1281 char buf
[UINTMAX_STRSIZE_BOUND
];
1282 fprintf (stdlis
, _("block %s: "),
1283 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
1286 fprintf (stdlis
, "%s %*s %.*s\n", modes
, ugswidth
+ 1 + datewidth
,
1287 _("Creating directory:"), length
, quotearg (dirname
));
1291 /* Skip over SIZE bytes of data in blocks in the archive. */
1293 skip_file (off_t size
)
1297 /* FIXME: Make sure mv_begin is always called before it */
1299 if (seekable_archive
)
1301 off_t nblk
= seek_archive (size
);
1303 size
-= nblk
* BLOCKSIZE
;
1305 seekable_archive
= false;
1308 mv_size_left (size
);
1312 x
= find_next_block ();
1314 FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
1316 set_next_block_after (x
);
1318 mv_size_left (size
);
1322 /* Skip the current member in the archive.
1323 NOTE: Current header must be decoded before calling this function. */
1327 if (!current_stat_info
.skipped
)
1329 char save_typeflag
= current_header
->header
.typeflag
;
1330 set_next_block_after (current_header
);
1332 mv_begin (¤t_stat_info
);
1334 if (current_stat_info
.is_sparse
)
1335 sparse_skip_file (¤t_stat_info
);
1336 else if (save_typeflag
!= DIRTYPE
)
1337 skip_file (current_stat_info
.stat
.st_size
);