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 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
);
79 xheader_destroy (&extended_header
);
81 status
= read_header (false);
84 case HEADER_STILL_UNREAD
:
85 case HEADER_SUCCESS_EXTENDED
:
90 /* Valid header. We should decode next field (mode) first.
91 Ensure incoming names are null terminated. */
93 if (! name_match (current_stat_info
.file_name
)
94 || (NEWER_OPTION_INITIALIZED (newer_mtime_option
)
95 /* FIXME: We get mtime now, and again later; this causes
96 duplicate diagnostics if header.mtime is bogus. */
98 = TIME_FROM_HEADER (current_header
->header
.mtime
)),
99 /* FIXME: Grab fractional time stamps from
102 current_stat_info
.mtime
= mtime
,
103 OLDER_TAR_STAT_TIME (current_stat_info
, m
)))
104 || excluded_name (current_stat_info
.file_name
))
106 switch (current_header
->header
.typeflag
)
109 case GNUTYPE_MULTIVOL
:
114 if (show_omitted_dirs_option
)
115 WARN ((0, 0, _("%s: Omitting"),
116 quotearg_colon (current_stat_info
.file_name
)));
119 decode_header (current_header
,
120 ¤t_stat_info
, ¤t_format
, 0);
129 case HEADER_ZERO_BLOCK
:
130 if (block_number_option
)
132 char buf
[UINTMAX_STRSIZE_BOUND
];
133 fprintf (stdlis
, _("block %s: ** Block of NULs **\n"),
134 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
137 set_next_block_after (current_header
);
139 if (!ignore_zeros_option
)
141 char buf
[UINTMAX_STRSIZE_BOUND
];
143 status
= read_header (false);
144 if (status
== HEADER_ZERO_BLOCK
)
146 WARN ((0, 0, _("A lone zero block at %s"),
147 STRINGIFY_BIGINT (current_block_ordinal (), buf
)));
150 status
= prev_status
;
153 case HEADER_END_OF_FILE
:
154 if (block_number_option
)
156 char buf
[UINTMAX_STRSIZE_BOUND
];
157 fprintf (stdlis
, _("block %s: ** End of File **\n"),
158 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
163 /* If the previous header was good, tell them that we are
164 skipping bad ones. */
165 set_next_block_after (current_header
);
168 case HEADER_STILL_UNREAD
:
169 ERROR ((0, 0, _("This does not look like a tar archive")));
172 case HEADER_ZERO_BLOCK
:
174 if (block_number_option
)
176 char buf
[UINTMAX_STRSIZE_BOUND
];
177 off_t block_ordinal
= current_block_ordinal ();
178 block_ordinal
-= recent_long_name_blocks
;
179 block_ordinal
-= recent_long_link_blocks
;
180 fprintf (stdlis
, _("block %s: "),
181 STRINGIFY_BIGINT (block_ordinal
, buf
));
183 ERROR ((0, 0, _("Skipping to next header")));
186 case HEADER_END_OF_FILE
:
188 /* We are in the middle of a cascade of errors. */
191 case HEADER_SUCCESS_EXTENDED
:
198 while (!all_names_found (¤t_stat_info
));
201 names_notfound (); /* print names not found */
204 /* Print a header block, based on tar options. */
208 off_t block_ordinal
= current_block_ordinal ();
209 /* Print the header block. */
211 decode_header (current_header
, ¤t_stat_info
, ¤t_format
, 0);
213 print_header (¤t_stat_info
, block_ordinal
);
215 if (incremental_option
)
217 if (verbose_option
> 2)
219 if (current_stat_info
.dumpdir
)
220 list_dumpdir (current_stat_info
.dumpdir
,
221 dumpdir_size (current_stat_info
.dumpdir
));
225 mv_begin (¤t_stat_info
);
232 /* Check header checksum */
233 /* The standard BSD tar sources create the checksum by adding up the
234 bytes in the header as type char. I think the type char was unsigned
235 on the PDP-11, but it's signed on the Next and Sun. It looks like the
236 sources to BSD tar were never changed to compute the checksum
237 correctly, so both the Sun and Next add the bytes of the header as
238 signed chars. This doesn't cause a problem until you get a file with
239 a name containing characters with the high bit set. So tar_checksum
240 computes two checksums -- signed and unsigned. */
243 tar_checksum (union block
*header
, bool silent
)
246 int unsigned_sum
= 0; /* the POSIX one :-) */
247 int signed_sum
= 0; /* the Sun one :-( */
249 uintmax_t parsed_sum
;
253 for (i
= sizeof *header
; i
-- != 0;)
255 unsigned_sum
+= (unsigned char) *p
;
256 signed_sum
+= (signed char) (*p
++);
259 if (unsigned_sum
== 0)
260 return HEADER_ZERO_BLOCK
;
262 /* Adjust checksum to count the "chksum" field as blanks. */
264 for (i
= sizeof header
->header
.chksum
; i
-- != 0;)
266 unsigned_sum
-= (unsigned char) header
->header
.chksum
[i
];
267 signed_sum
-= (signed char) (header
->header
.chksum
[i
]);
269 unsigned_sum
+= ' ' * sizeof header
->header
.chksum
;
270 signed_sum
+= ' ' * sizeof header
->header
.chksum
;
272 parsed_sum
= from_header (header
->header
.chksum
,
273 sizeof header
->header
.chksum
, 0,
275 (uintmax_t) TYPE_MAXIMUM (int), true, silent
);
276 if (parsed_sum
== (uintmax_t) -1)
277 return HEADER_FAILURE
;
279 recorded_sum
= parsed_sum
;
281 if (unsigned_sum
!= recorded_sum
&& signed_sum
!= recorded_sum
)
282 return HEADER_FAILURE
;
284 return HEADER_SUCCESS
;
287 /* Read a block that's supposed to be a header block. Return its
288 address in "current_header", and if it is good, the file's size in
289 current_stat_info.stat.st_size.
291 Return 1 for success, 0 if the checksum is bad, EOF on eof, 2 for a
292 block full of zeros (EOF marker).
294 If RAW_EXTENDED_HEADERS is nonzero, do not automagically fold the
295 GNU long name and link headers into later headers.
297 You must always set_next_block_after(current_header) to skip past
298 the header which this routine reads. */
301 read_header (bool raw_extended_headers
)
304 union block
*header_copy
;
306 union block
*data_block
;
307 size_t size
, written
;
308 union block
*next_long_name
= 0;
309 union block
*next_long_link
= 0;
310 size_t next_long_name_blocks
;
311 size_t next_long_link_blocks
;
315 enum read_header status
;
317 header
= find_next_block ();
318 current_header
= header
;
320 return HEADER_END_OF_FILE
;
322 if ((status
= tar_checksum (header
, false)) != HEADER_SUCCESS
)
325 /* Good block. Decode file size and return. */
327 if (header
->header
.typeflag
== LNKTYPE
)
328 current_stat_info
.stat
.st_size
= 0; /* links 0 size on tape */
330 current_stat_info
.stat
.st_size
= OFF_FROM_HEADER (header
->header
.size
);
332 if (header
->header
.typeflag
== GNUTYPE_LONGNAME
333 || header
->header
.typeflag
== GNUTYPE_LONGLINK
334 || header
->header
.typeflag
== XHDTYPE
335 || header
->header
.typeflag
== XGLTYPE
336 || header
->header
.typeflag
== SOLARIS_XHDTYPE
)
338 if (raw_extended_headers
)
339 return HEADER_SUCCESS_EXTENDED
;
340 else if (header
->header
.typeflag
== GNUTYPE_LONGNAME
341 || header
->header
.typeflag
== GNUTYPE_LONGLINK
)
343 size_t name_size
= current_stat_info
.stat
.st_size
;
344 size_t n
= name_size
% BLOCKSIZE
;
345 size
= name_size
+ BLOCKSIZE
;
347 size
+= BLOCKSIZE
- n
;
349 if (name_size
!= current_stat_info
.stat
.st_size
353 header_copy
= xmalloc (size
+ 1);
355 if (header
->header
.typeflag
== GNUTYPE_LONGNAME
)
358 free (next_long_name
);
359 next_long_name
= header_copy
;
360 next_long_name_blocks
= size
/ BLOCKSIZE
;
365 free (next_long_link
);
366 next_long_link
= header_copy
;
367 next_long_link_blocks
= size
/ BLOCKSIZE
;
370 set_next_block_after (header
);
371 *header_copy
= *header
;
372 bp
= header_copy
->buffer
+ BLOCKSIZE
;
374 for (size
-= BLOCKSIZE
; size
> 0; size
-= written
)
376 data_block
= find_next_block ();
379 ERROR ((0, 0, _("Unexpected EOF in archive")));
382 written
= available_space_after (data_block
);
386 memcpy (bp
, data_block
->buffer
, written
);
388 set_next_block_after ((union block
*)
389 (data_block
->buffer
+ written
- 1));
394 else if (header
->header
.typeflag
== XHDTYPE
395 || header
->header
.typeflag
== SOLARIS_XHDTYPE
)
396 xheader_read (header
, OFF_FROM_HEADER (header
->header
.size
));
397 else if (header
->header
.typeflag
== XGLTYPE
)
399 xheader_read (header
, OFF_FROM_HEADER (header
->header
.size
));
400 xheader_decode_global ();
401 xheader_destroy (&extended_header
);
410 struct posix_header
const *h
= ¤t_header
->header
;
411 char namebuf
[sizeof h
->prefix
+ 1 + NAME_FIELD_SIZE
+ 1];
413 if (recent_long_name
)
414 free (recent_long_name
);
418 name
= next_long_name
->buffer
+ BLOCKSIZE
;
419 recent_long_name
= next_long_name
;
420 recent_long_name_blocks
= next_long_name_blocks
;
424 /* Accept file names as specified by POSIX.1-1996
428 if (h
->prefix
[0] && strcmp (h
->magic
, TMAGIC
) == 0)
430 memcpy (np
, h
->prefix
, sizeof h
->prefix
);
431 np
[sizeof h
->prefix
] = '\0';
435 memcpy (np
, h
->name
, sizeof h
->name
);
436 np
[sizeof h
->name
] = '\0';
438 recent_long_name
= 0;
439 recent_long_name_blocks
= 0;
441 assign_string (¤t_stat_info
.orig_file_name
, name
);
442 assign_string (¤t_stat_info
.file_name
, name
);
443 current_stat_info
.had_trailing_slash
= strip_trailing_slashes (current_stat_info
.file_name
);
445 if (recent_long_link
)
446 free (recent_long_link
);
450 name
= next_long_link
->buffer
+ BLOCKSIZE
;
451 recent_long_link
= next_long_link
;
452 recent_long_link_blocks
= next_long_link_blocks
;
456 memcpy (namebuf
, h
->linkname
, sizeof h
->linkname
);
457 namebuf
[sizeof h
->linkname
] = '\0';
459 recent_long_link
= 0;
460 recent_long_link_blocks
= 0;
462 assign_string (¤t_stat_info
.link_name
, name
);
464 return HEADER_SUCCESS
;
469 #define ISOCTAL(c) ((c)>='0'&&(c)<='7')
471 /* Decode things from a file HEADER block into STAT_INFO, also setting
472 *FORMAT_POINTER depending on the header block format. If
473 DO_USER_GROUP, decode the user/group information (this is useful
474 for extraction, but waste time when merely listing).
476 read_header() has already decoded the checksum and length, so we don't.
478 This routine should *not* be called twice for the same block, since
479 the two calls might use different DO_USER_GROUP values and thus
480 might end up with different uid/gid for the two calls. If anybody
481 wants the uid/gid they should decode it first, and other callers
482 should decode it without uid/gid before calling a routine,
483 e.g. print_header, that assumes decoded data. */
485 decode_header (union block
*header
, struct tar_stat_info
*stat_info
,
486 enum archive_format
*format_pointer
, int do_user_group
)
488 enum archive_format format
;
490 if (strcmp (header
->header
.magic
, TMAGIC
) == 0)
492 if (header
->star_header
.prefix
[130] == 0
493 && ISOCTAL (header
->star_header
.atime
[0])
494 && header
->star_header
.atime
[11] == ' '
495 && ISOCTAL (header
->star_header
.ctime
[0])
496 && header
->star_header
.ctime
[11] == ' ')
497 format
= STAR_FORMAT
;
498 else if (extended_header
.size
)
499 format
= POSIX_FORMAT
;
501 format
= USTAR_FORMAT
;
503 else if (strcmp (header
->header
.magic
, OLDGNU_MAGIC
) == 0)
504 format
= OLDGNU_FORMAT
;
507 *format_pointer
= format
;
509 stat_info
->stat
.st_mode
= MODE_FROM_HEADER (header
->header
.mode
);
510 stat_info
->mtime
.tv_sec
= TIME_FROM_HEADER (header
->header
.mtime
);
511 stat_info
->mtime
.tv_nsec
= 0;
512 assign_string (&stat_info
->uname
,
513 header
->header
.uname
[0] ? header
->header
.uname
: NULL
);
514 assign_string (&stat_info
->gname
,
515 header
->header
.gname
[0] ? header
->header
.gname
: NULL
);
517 if (format
== OLDGNU_FORMAT
&& incremental_option
)
519 stat_info
->atime
.tv_sec
= TIME_FROM_HEADER (header
->oldgnu_header
.atime
);
520 stat_info
->ctime
.tv_sec
= TIME_FROM_HEADER (header
->oldgnu_header
.ctime
);
521 stat_info
->atime
.tv_nsec
= stat_info
->ctime
.tv_nsec
= 0;
523 else if (format
== STAR_FORMAT
)
525 stat_info
->atime
.tv_sec
= TIME_FROM_HEADER (header
->star_header
.atime
);
526 stat_info
->ctime
.tv_sec
= TIME_FROM_HEADER (header
->star_header
.ctime
);
527 stat_info
->atime
.tv_nsec
= stat_info
->ctime
.tv_nsec
= 0;
530 stat_info
->atime
= stat_info
->ctime
= start_time
;
532 if (format
== V7_FORMAT
)
534 stat_info
->stat
.st_uid
= UID_FROM_HEADER (header
->header
.uid
);
535 stat_info
->stat
.st_gid
= GID_FROM_HEADER (header
->header
.gid
);
536 stat_info
->stat
.st_rdev
= 0;
542 /* FIXME: Decide if this should somewhat depend on -p. */
544 if (numeric_owner_option
545 || !*header
->header
.uname
546 || !uname_to_uid (header
->header
.uname
, &stat_info
->stat
.st_uid
))
547 stat_info
->stat
.st_uid
= UID_FROM_HEADER (header
->header
.uid
);
549 if (numeric_owner_option
550 || !*header
->header
.gname
551 || !gname_to_gid (header
->header
.gname
, &stat_info
->stat
.st_gid
))
552 stat_info
->stat
.st_gid
= GID_FROM_HEADER (header
->header
.gid
);
555 switch (header
->header
.typeflag
)
559 stat_info
->stat
.st_rdev
=
560 makedev (MAJOR_FROM_HEADER (header
->header
.devmajor
),
561 MINOR_FROM_HEADER (header
->header
.devminor
));
565 stat_info
->stat
.st_rdev
= 0;
569 stat_info
->archive_file_size
= stat_info
->stat
.st_size
;
570 xheader_decode (stat_info
);
572 if (sparse_member_p (stat_info
))
574 sparse_fixup_header (stat_info
);
575 stat_info
->is_sparse
= true;
579 stat_info
->is_sparse
= false;
580 if ((current_format
== GNU_FORMAT
581 || current_format
== OLDGNU_FORMAT
)
582 && current_header
->header
.typeflag
== GNUTYPE_DUMPDIR
)
587 /* Convert buffer at WHERE0 of size DIGS from external format to
588 uintmax_t. DIGS must be positive. If TYPE is nonnull, the data
589 are of type TYPE. The buffer must represent a value in the range
590 -MINUS_MINVAL through MAXVAL. If OCTAL_ONLY, allow only octal
591 numbers instead of the other GNU extensions. Return -1 on error,
592 diagnosing the error if TYPE is nonnull and if !SILENT. */
594 from_header (char const *where0
, size_t digs
, char const *type
,
595 uintmax_t minus_minval
, uintmax_t maxval
,
596 bool octal_only
, bool silent
)
599 char const *where
= where0
;
600 char const *lim
= where
+ digs
;
603 /* Accommodate buggy tar of unknown vintage, which outputs leading
604 NUL if the previous field overflows. */
607 /* Accommodate older tars, which output leading spaces. */
614 /* TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.) */
615 _("Blanks in header where numeric %s value expected"),
619 if (!ISSPACE ((unsigned char) *where
))
625 if (ISODIGIT (*where
))
627 char const *where1
= where
;
628 uintmax_t overflow
= 0;
632 value
+= *where
++ - '0';
633 if (where
== lim
|| ! ISODIGIT (*where
))
635 overflow
|= value
^ (value
<< LG_8
>> LG_8
);
639 /* Parse the output of older, unportable tars, which generate
640 negative values in two's complement octal. If the leading
641 nonzero digit is 1, we can't recover the original value
642 reliably; so do this only if the digit is 2 or more. This
643 catches the common case of 32-bit negative time stamps. */
644 if ((overflow
|| maxval
< value
) && '2' <= *where1
&& type
)
646 /* Compute the negative of the input value, assuming two's
648 int digit
= (*where1
- '0') | 4;
656 if (where
== lim
|| ! ISODIGIT (*where
))
658 digit
= *where
- '0';
659 overflow
|= value
^ (value
<< LG_8
>> LG_8
);
665 if (!overflow
&& value
<= minus_minval
)
669 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
670 _("Archive octal value %.*s is out of %s range; assuming two's complement"),
671 (int) (where
- where1
), where1
, type
));
680 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
681 _("Archive octal value %.*s is out of %s range"),
682 (int) (where
- where1
), where1
, type
));
688 /* Suppress the following extensions. */
690 else if (*where
== '-' || *where
== '+')
692 /* Parse base-64 output produced only by tar test versions
693 1.13.6 (1999-08-11) through 1.13.11 (1999-08-23).
694 Support for this will be withdrawn in future releases. */
698 static bool warned_once
;
702 WARN ((0, 0, _("Archive contains obsolescent base-64 headers")));
705 negative
= *where
++ == '-';
707 && (dig
= base64_map
[(unsigned char) *where
]) < 64)
709 if (value
<< LG_64
>> LG_64
!= value
)
711 char *string
= alloca (digs
+ 1);
712 memcpy (string
, where0
, digs
);
716 _("Archive signed base-64 string %s is out of %s range"),
717 quote (string
), type
));
720 value
= (value
<< LG_64
) | dig
;
724 else if (*where
== '\200' /* positive base-256 */
725 || *where
== '\377' /* negative base-256 */)
727 /* Parse base-256 output. A nonnegative number N is
728 represented as (256**DIGS)/2 + N; a negative number -N is
729 represented as (256**DIGS) - N, i.e. as two's complement.
730 The representation guarantees that the leading bit is
731 always on, so that we don't confuse this format with the
732 others (assuming ASCII bytes of 8 bits or more). */
733 int signbit
= *where
& (1 << (LG_256
- 2));
734 uintmax_t topbits
= (((uintmax_t) - signbit
)
735 << (CHAR_BIT
* sizeof (uintmax_t)
736 - LG_256
- (LG_256
- 2)));
737 value
= (*where
++ & ((1 << (LG_256
- 2)) - 1)) - signbit
;
740 value
= (value
<< LG_256
) + (unsigned char) *where
++;
743 if (((value
<< LG_256
>> LG_256
) | topbits
) != value
)
747 _("Archive base-256 value is out of %s range"),
757 if (where
!= lim
&& *where
&& !ISSPACE ((unsigned char) *where
))
761 char buf
[1000]; /* Big enough to represent any header. */
762 static struct quoting_options
*o
;
766 o
= clone_quoting_options (0);
767 set_quoting_style (o
, locale_quoting_style
);
770 while (where0
!= lim
&& ! lim
[-1])
772 quotearg_buffer (buf
, sizeof buf
, where0
, lim
- where
, o
);
775 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
776 _("Archive contains %.*s where numeric %s value expected"),
777 (int) sizeof buf
, buf
, type
));
783 if (value
<= (negative
? minus_minval
: maxval
))
784 return negative
? -value
: value
;
788 char minval_buf
[UINTMAX_STRSIZE_BOUND
+ 1];
789 char maxval_buf
[UINTMAX_STRSIZE_BOUND
];
790 char value_buf
[UINTMAX_STRSIZE_BOUND
+ 1];
791 char *minval_string
= STRINGIFY_BIGINT (minus_minval
, minval_buf
+ 1);
792 char *value_string
= STRINGIFY_BIGINT (value
, value_buf
+ 1);
794 *--value_string
= '-';
796 *--minval_string
= '-';
797 /* TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.) */
798 ERROR ((0, 0, _("Archive value %s is out of %s range %s..%s"),
800 minval_string
, STRINGIFY_BIGINT (maxval
, maxval_buf
)));
807 gid_from_header (const char *p
, size_t s
)
809 return from_header (p
, s
, "gid_t",
810 - (uintmax_t) TYPE_MINIMUM (gid_t
),
811 (uintmax_t) TYPE_MAXIMUM (gid_t
),
816 major_from_header (const char *p
, size_t s
)
818 return from_header (p
, s
, "major_t",
819 - (uintmax_t) TYPE_MINIMUM (major_t
),
820 (uintmax_t) TYPE_MAXIMUM (major_t
), false, false);
824 minor_from_header (const char *p
, size_t s
)
826 return from_header (p
, s
, "minor_t",
827 - (uintmax_t) TYPE_MINIMUM (minor_t
),
828 (uintmax_t) TYPE_MAXIMUM (minor_t
), false, false);
832 mode_from_header (const char *p
, size_t s
)
834 /* Do not complain about unrecognized mode bits. */
835 unsigned u
= from_header (p
, s
, "mode_t",
836 - (uintmax_t) TYPE_MINIMUM (mode_t
),
837 TYPE_MAXIMUM (uintmax_t), false, false);
838 return ((u
& TSUID
? S_ISUID
: 0)
839 | (u
& TSGID
? S_ISGID
: 0)
840 | (u
& TSVTX
? S_ISVTX
: 0)
841 | (u
& TUREAD
? S_IRUSR
: 0)
842 | (u
& TUWRITE
? S_IWUSR
: 0)
843 | (u
& TUEXEC
? S_IXUSR
: 0)
844 | (u
& TGREAD
? S_IRGRP
: 0)
845 | (u
& TGWRITE
? S_IWGRP
: 0)
846 | (u
& TGEXEC
? S_IXGRP
: 0)
847 | (u
& TOREAD
? S_IROTH
: 0)
848 | (u
& TOWRITE
? S_IWOTH
: 0)
849 | (u
& TOEXEC
? S_IXOTH
: 0));
853 off_from_header (const char *p
, size_t s
)
855 /* Negative offsets are not allowed in tar files, so invoke
856 from_header with minimum value 0, not TYPE_MINIMUM (off_t). */
857 return from_header (p
, s
, "off_t", (uintmax_t) 0,
858 (uintmax_t) TYPE_MAXIMUM (off_t
), false, false);
862 size_from_header (const char *p
, size_t s
)
864 return from_header (p
, s
, "size_t", (uintmax_t) 0,
865 (uintmax_t) TYPE_MAXIMUM (size_t), false, false);
869 time_from_header (const char *p
, size_t s
)
871 return from_header (p
, s
, "time_t",
872 - (uintmax_t) TYPE_MINIMUM (time_t),
873 (uintmax_t) TYPE_MAXIMUM (time_t), false, false);
877 uid_from_header (const char *p
, size_t s
)
879 return from_header (p
, s
, "uid_t",
880 - (uintmax_t) TYPE_MINIMUM (uid_t
),
881 (uintmax_t) TYPE_MAXIMUM (uid_t
), false, false);
885 uintmax_from_header (const char *p
, size_t s
)
887 return from_header (p
, s
, "uintmax_t", (uintmax_t) 0,
888 TYPE_MAXIMUM (uintmax_t), false, false);
892 /* Return a printable representation of T. The result points to
893 static storage that can be reused in the next call to this
894 function, to ctime, or to asctime. If FULL_TIME, then output the
895 time stamp to its full resolution; otherwise, just output it to
896 1-minute resolution. */
898 tartime (struct timespec t
, bool full_time
)
900 enum { fraclen
= sizeof ".FFFFFFFFF" - 1 };
901 static char buffer
[max (UINTMAX_STRSIZE_BOUND
+ 1,
902 INT_STRLEN_BOUND (int) + 16)
907 bool negative
= s
< 0;
910 if (negative
&& ns
!= 0)
913 ns
= 1000000000 - ns
;
916 tm
= utc_option
? gmtime (&s
) : localtime (&s
);
921 sprintf (buffer
, "%04ld-%02d-%02d %02d:%02d:%02d",
922 tm
->tm_year
+ 1900L, tm
->tm_mon
+ 1, tm
->tm_mday
,
923 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
924 code_ns_fraction (ns
, buffer
+ strlen (buffer
));
927 sprintf (buffer
, "%04ld-%02d-%02d %02d:%02d",
928 tm
->tm_year
+ 1900L, tm
->tm_mon
+ 1, tm
->tm_mday
,
929 tm
->tm_hour
, tm
->tm_min
);
933 /* The time stamp cannot be broken down, most likely because it
934 is out of range. Convert it as an integer,
935 right-adjusted in a field with the same width as the usual
936 4-year ISO time format. */
937 p
= umaxtostr (negative
? - (uintmax_t) s
: s
,
938 buffer
+ sizeof buffer
- UINTMAX_STRSIZE_BOUND
- fraclen
);
941 while ((buffer
+ sizeof buffer
- sizeof "YYYY-MM-DD HH:MM"
942 + (full_time
? sizeof ":SS.FFFFFFFFF" - 1 : 0))
946 code_ns_fraction (ns
, buffer
+ sizeof buffer
- 1 - fraclen
);
950 /* Actually print it.
952 Plain and fancy file header block logging. Non-verbose just prints
953 the name, e.g. for "tar t" or "tar x". This should just contain
954 file names, so it can be fed back into tar with xargs or the "-T"
955 option. The verbose option can give a bunch of info, one line per
956 file. I doubt anybody tries to parse its format, or if they do,
957 they shouldn't. Unix tar is pretty random here anyway. */
960 /* FIXME: Note that print_header uses the globals HEAD, HSTAT, and
961 HEAD_STANDARD, which must be set up in advance. Not very clean.. */
963 /* Width of "user/group size", with initial value chosen
964 heuristically. This grows as needed, though this may cause some
965 stairstepping in the output. Make it too small and the output will
966 almost always look ragged. Make it too large and the output will
967 be spaced out too far. */
968 static int ugswidth
= 19;
970 /* Width of printed time stamps. It grows if longer time stamps are
971 found (typically, those with nanosecond resolution). Like
972 USGWIDTH, some stairstepping may occur. */
973 static int datewidth
= sizeof "YYYY-MM-DD HH:MM" - 1;
976 print_header (struct tar_stat_info
*st
, off_t block_ordinal
)
979 char const *time_stamp
;
981 char *temp_name
= st
->orig_file_name
? st
->orig_file_name
: st
->file_name
;
983 /* These hold formatted ints. */
984 char uform
[UINTMAX_STRSIZE_BOUND
], gform
[UINTMAX_STRSIZE_BOUND
];
986 char size
[2 * UINTMAX_STRSIZE_BOUND
];
987 /* holds formatted size or major,minor */
988 char uintbuf
[UINTMAX_STRSIZE_BOUND
];
992 if (test_label_option
&& current_header
->header
.typeflag
!= GNUTYPE_VOLHDR
)
995 if (show_stored_names_option
)
997 switch (subcommand_option
)
1000 case UPDATE_SUBCOMMAND
:
1001 case APPEND_SUBCOMMAND
:
1002 case CREATE_SUBCOMMAND
:
1003 temp_name
= st
->file_name
? st
->file_name
: st
->orig_file_name
;
1007 temp_name
= st
->orig_file_name
? st
->orig_file_name
: st
->file_name
;
1011 temp_name
= st
->orig_file_name
? st
->orig_file_name
: st
->file_name
;
1013 if (block_number_option
)
1015 char buf
[UINTMAX_STRSIZE_BOUND
];
1016 if (block_ordinal
< 0)
1017 block_ordinal
= current_block_ordinal ();
1018 block_ordinal
-= recent_long_name_blocks
;
1019 block_ordinal
-= recent_long_link_blocks
;
1020 fprintf (stdlis
, _("block %s: "),
1021 STRINGIFY_BIGINT (block_ordinal
, buf
));
1024 if (verbose_option
<= 1)
1026 /* Just the fax, mam. */
1027 fprintf (stdlis
, "%s\n", quotearg (temp_name
));
1031 /* File type and modes. */
1034 switch (current_header
->header
.typeflag
)
1036 case GNUTYPE_VOLHDR
:
1040 case GNUTYPE_MULTIVOL
:
1048 case GNUTYPE_LONGNAME
:
1049 case GNUTYPE_LONGLINK
:
1051 ERROR ((0, 0, _("Unexpected long name header")));
1054 case GNUTYPE_SPARSE
:
1058 if (temp_name
[strlen (temp_name
) - 1] == '/')
1064 case GNUTYPE_DUMPDIR
:
1087 pax_decode_mode (st
->stat
.st_mode
, modes
+ 1);
1091 time_stamp
= tartime (st
->mtime
, false);
1092 time_stamp_len
= strlen (time_stamp
);
1093 if (datewidth
< time_stamp_len
)
1094 datewidth
= time_stamp_len
;
1096 /* User and group names. */
1100 && current_format
!= V7_FORMAT
1101 && !numeric_owner_option
)
1105 /* Try parsing it as an unsigned integer first, and as a
1106 uid_t if that fails. This method can list positive user
1107 ids that are too large to fit in a uid_t. */
1108 uintmax_t u
= from_header (current_header
->header
.uid
,
1109 sizeof current_header
->header
.uid
, 0,
1111 (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1114 user
= STRINGIFY_BIGINT (u
, uform
);
1117 sprintf (uform
, "%ld",
1118 (long) UID_FROM_HEADER (current_header
->header
.uid
));
1125 && current_format
!= V7_FORMAT
1126 && !numeric_owner_option
)
1130 /* Try parsing it as an unsigned integer first, and as a
1131 gid_t if that fails. This method can list positive group
1132 ids that are too large to fit in a gid_t. */
1133 uintmax_t g
= from_header (current_header
->header
.gid
,
1134 sizeof current_header
->header
.gid
, 0,
1136 (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1139 group
= STRINGIFY_BIGINT (g
, gform
);
1142 sprintf (gform
, "%ld",
1143 (long) GID_FROM_HEADER (current_header
->header
.gid
));
1148 /* Format the file size or major/minor device numbers. */
1150 switch (current_header
->header
.typeflag
)
1155 STRINGIFY_BIGINT (major (st
->stat
.st_rdev
), uintbuf
));
1158 STRINGIFY_BIGINT (minor (st
->stat
.st_rdev
), uintbuf
));
1162 /* st->stat.st_size keeps stored file size */
1163 strcpy (size
, STRINGIFY_BIGINT (st
->stat
.st_size
, uintbuf
));
1167 /* Figure out padding and print the whole line. */
1169 sizelen
= strlen (size
);
1170 pad
= strlen (user
) + 1 + strlen (group
) + 1 + sizelen
;
1174 fprintf (stdlis
, "%s %s/%s %*s %-*s",
1175 modes
, user
, group
, ugswidth
- pad
+ sizelen
, size
,
1176 datewidth
, time_stamp
);
1178 fprintf (stdlis
, " %s", quotearg (temp_name
));
1180 switch (current_header
->header
.typeflag
)
1183 fprintf (stdlis
, " -> %s\n", quotearg (st
->link_name
));
1187 fprintf (stdlis
, _(" link to %s\n"), quotearg (st
->link_name
));
1192 char type_string
[2];
1193 type_string
[0] = current_header
->header
.typeflag
;
1194 type_string
[1] = '\0';
1195 fprintf (stdlis
, _(" unknown file type %s\n"),
1196 quote (type_string
));
1202 case GNUTYPE_SPARSE
:
1208 case GNUTYPE_DUMPDIR
:
1209 putc ('\n', stdlis
);
1212 case GNUTYPE_LONGLINK
:
1213 fprintf (stdlis
, _("--Long Link--\n"));
1216 case GNUTYPE_LONGNAME
:
1217 fprintf (stdlis
, _("--Long Name--\n"));
1220 case GNUTYPE_VOLHDR
:
1221 fprintf (stdlis
, _("--Volume Header--\n"));
1224 case GNUTYPE_MULTIVOL
:
1227 (UINTMAX_FROM_HEADER (current_header
->oldgnu_header
.offset
),
1229 fprintf (stdlis
, _("--Continued at byte %s--\n"), size
);
1233 fprintf (stdlis
, _("--Mangled file names--\n"));
1240 /* Print a similar line when we make a directory automatically. */
1242 print_for_mkdir (char *dirname
, int length
, mode_t mode
)
1246 if (verbose_option
> 1)
1248 /* File type and modes. */
1251 pax_decode_mode (mode
, modes
+ 1);
1253 if (block_number_option
)
1255 char buf
[UINTMAX_STRSIZE_BOUND
];
1256 fprintf (stdlis
, _("block %s: "),
1257 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
1260 fprintf (stdlis
, "%s %*s %.*s\n", modes
, ugswidth
+ 1 + datewidth
,
1261 _("Creating directory:"), length
, quotearg (dirname
));
1265 /* Skip over SIZE bytes of data in blocks in the archive. */
1267 skip_file (off_t size
)
1271 /* FIXME: Make sure mv_begin is always called before it */
1273 if (seekable_archive
)
1275 off_t nblk
= seek_archive (size
);
1277 size
-= nblk
* BLOCKSIZE
;
1279 seekable_archive
= false;
1282 mv_size_left (size
);
1286 x
= find_next_block ();
1288 FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
1290 set_next_block_after (x
);
1292 mv_size_left (size
);
1296 /* Skip the current member in the archive.
1297 NOTE: Current header must be decoded before calling this function. */
1301 char save_typeflag
= current_header
->header
.typeflag
;
1302 set_next_block_after (current_header
);
1304 mv_begin (¤t_stat_info
);
1306 if (current_stat_info
.is_sparse
)
1307 sparse_skip_file (¤t_stat_info
);
1308 else if (save_typeflag
!= DIRTYPE
)
1309 skip_file (current_stat_info
.stat
.st_size
);