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
);
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
:
113 if (show_omitted_dirs_option
)
114 WARN ((0, 0, _("%s: Omitting"),
115 quotearg_colon (current_stat_info
.file_name
)));
118 decode_header (current_header
,
119 ¤t_stat_info
, ¤t_format
, 0);
128 case HEADER_ZERO_BLOCK
:
129 if (block_number_option
)
131 char buf
[UINTMAX_STRSIZE_BOUND
];
132 fprintf (stdlis
, _("block %s: ** Block of NULs **\n"),
133 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
136 set_next_block_after (current_header
);
138 if (!ignore_zeros_option
)
140 char buf
[UINTMAX_STRSIZE_BOUND
];
142 status
= read_header (false);
143 if (status
== HEADER_ZERO_BLOCK
)
145 WARN ((0, 0, _("A lone zero block at %s"),
146 STRINGIFY_BIGINT (current_block_ordinal (), buf
)));
149 status
= prev_status
;
152 case HEADER_END_OF_FILE
:
153 if (block_number_option
)
155 char buf
[UINTMAX_STRSIZE_BOUND
];
156 fprintf (stdlis
, _("block %s: ** End of File **\n"),
157 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
162 /* If the previous header was good, tell them that we are
163 skipping bad ones. */
164 set_next_block_after (current_header
);
167 case HEADER_STILL_UNREAD
:
168 ERROR ((0, 0, _("This does not look like a tar archive")));
171 case HEADER_ZERO_BLOCK
:
173 if (block_number_option
)
175 char buf
[UINTMAX_STRSIZE_BOUND
];
176 off_t block_ordinal
= current_block_ordinal ();
177 block_ordinal
-= recent_long_name_blocks
;
178 block_ordinal
-= recent_long_link_blocks
;
179 fprintf (stdlis
, _("block %s: "),
180 STRINGIFY_BIGINT (block_ordinal
, buf
));
182 ERROR ((0, 0, _("Skipping to next header")));
185 case HEADER_END_OF_FILE
:
187 /* We are in the middle of a cascade of errors. */
190 case HEADER_SUCCESS_EXTENDED
:
197 while (!all_names_found (¤t_stat_info
));
200 names_notfound (); /* print names not found */
203 /* Print a header block, based on tar options. */
207 off_t block_ordinal
= current_block_ordinal ();
208 /* Print the header block. */
210 decode_header (current_header
, ¤t_stat_info
, ¤t_format
, 0);
212 print_header (¤t_stat_info
, block_ordinal
);
214 if (incremental_option
)
216 if (verbose_option
> 2)
218 if (is_dumpdir (¤t_stat_info
))
219 list_dumpdir (current_stat_info
.dumpdir
,
220 dumpdir_size (current_stat_info
.dumpdir
));
227 /* Check header checksum */
228 /* The standard BSD tar sources create the checksum by adding up the
229 bytes in the header as type char. I think the type char was unsigned
230 on the PDP-11, but it's signed on the Next and Sun. It looks like the
231 sources to BSD tar were never changed to compute the checksum
232 correctly, so both the Sun and Next add the bytes of the header as
233 signed chars. This doesn't cause a problem until you get a file with
234 a name containing characters with the high bit set. So tar_checksum
235 computes two checksums -- signed and unsigned. */
238 tar_checksum (union block
*header
, bool silent
)
241 int unsigned_sum
= 0; /* the POSIX one :-) */
242 int signed_sum
= 0; /* the Sun one :-( */
244 uintmax_t parsed_sum
;
248 for (i
= sizeof *header
; i
-- != 0;)
250 unsigned_sum
+= (unsigned char) *p
;
251 signed_sum
+= (signed char) (*p
++);
254 if (unsigned_sum
== 0)
255 return HEADER_ZERO_BLOCK
;
257 /* Adjust checksum to count the "chksum" field as blanks. */
259 for (i
= sizeof header
->header
.chksum
; i
-- != 0;)
261 unsigned_sum
-= (unsigned char) header
->header
.chksum
[i
];
262 signed_sum
-= (signed char) (header
->header
.chksum
[i
]);
264 unsigned_sum
+= ' ' * sizeof header
->header
.chksum
;
265 signed_sum
+= ' ' * sizeof header
->header
.chksum
;
267 parsed_sum
= from_header (header
->header
.chksum
,
268 sizeof header
->header
.chksum
, 0,
270 (uintmax_t) TYPE_MAXIMUM (int), true, silent
);
271 if (parsed_sum
== (uintmax_t) -1)
272 return HEADER_FAILURE
;
274 recorded_sum
= parsed_sum
;
276 if (unsigned_sum
!= recorded_sum
&& signed_sum
!= recorded_sum
)
277 return HEADER_FAILURE
;
279 return HEADER_SUCCESS
;
282 /* Read a block that's supposed to be a header block. Return its
283 address in "current_header", and if it is good, the file's size
284 and names (file name, link name) in *info.
286 Return 1 for success, 0 if the checksum is bad, EOF on eof, 2 for a
287 block full of zeros (EOF marker).
289 If RAW_EXTENDED_HEADERS is nonzero, do not automagically fold the
290 GNU long name and link headers into later headers.
292 You must always set_next_block_after(current_header) to skip past
293 the header which this routine reads. */
296 read_header_primitive (bool raw_extended_headers
, struct tar_stat_info
*info
)
299 union block
*header_copy
;
301 union block
*data_block
;
302 size_t size
, written
;
303 union block
*next_long_name
= 0;
304 union block
*next_long_link
= 0;
305 size_t next_long_name_blocks
;
306 size_t next_long_link_blocks
;
310 enum read_header status
;
312 header
= find_next_block ();
313 current_header
= header
;
315 return HEADER_END_OF_FILE
;
317 if ((status
= tar_checksum (header
, false)) != HEADER_SUCCESS
)
320 /* Good block. Decode file size and return. */
322 if (header
->header
.typeflag
== LNKTYPE
)
323 info
->stat
.st_size
= 0; /* links 0 size on tape */
325 info
->stat
.st_size
= OFF_FROM_HEADER (header
->header
.size
);
327 if (header
->header
.typeflag
== GNUTYPE_LONGNAME
328 || header
->header
.typeflag
== GNUTYPE_LONGLINK
329 || header
->header
.typeflag
== XHDTYPE
330 || header
->header
.typeflag
== XGLTYPE
331 || header
->header
.typeflag
== SOLARIS_XHDTYPE
)
333 if (raw_extended_headers
)
334 return HEADER_SUCCESS_EXTENDED
;
335 else if (header
->header
.typeflag
== GNUTYPE_LONGNAME
336 || header
->header
.typeflag
== GNUTYPE_LONGLINK
)
338 size_t name_size
= info
->stat
.st_size
;
339 size_t n
= name_size
% BLOCKSIZE
;
340 size
= name_size
+ BLOCKSIZE
;
342 size
+= BLOCKSIZE
- n
;
344 if (name_size
!= info
->stat
.st_size
|| size
< name_size
)
347 header_copy
= xmalloc (size
+ 1);
349 if (header
->header
.typeflag
== GNUTYPE_LONGNAME
)
352 free (next_long_name
);
353 next_long_name
= header_copy
;
354 next_long_name_blocks
= size
/ BLOCKSIZE
;
359 free (next_long_link
);
360 next_long_link
= header_copy
;
361 next_long_link_blocks
= size
/ BLOCKSIZE
;
364 set_next_block_after (header
);
365 *header_copy
= *header
;
366 bp
= header_copy
->buffer
+ BLOCKSIZE
;
368 for (size
-= BLOCKSIZE
; size
> 0; size
-= written
)
370 data_block
= find_next_block ();
373 ERROR ((0, 0, _("Unexpected EOF in archive")));
376 written
= available_space_after (data_block
);
380 memcpy (bp
, data_block
->buffer
, written
);
382 set_next_block_after ((union block
*)
383 (data_block
->buffer
+ written
- 1));
388 else if (header
->header
.typeflag
== XHDTYPE
389 || header
->header
.typeflag
== SOLARIS_XHDTYPE
)
390 xheader_read (header
, OFF_FROM_HEADER (header
->header
.size
));
391 else if (header
->header
.typeflag
== XGLTYPE
)
393 xheader_read (header
, OFF_FROM_HEADER (header
->header
.size
));
394 xheader_decode_global ();
395 xheader_destroy (&extended_header
);
404 struct posix_header
const *h
= ¤t_header
->header
;
405 char namebuf
[sizeof h
->prefix
+ 1 + NAME_FIELD_SIZE
+ 1];
407 if (recent_long_name
)
408 free (recent_long_name
);
412 name
= next_long_name
->buffer
+ BLOCKSIZE
;
413 recent_long_name
= next_long_name
;
414 recent_long_name_blocks
= next_long_name_blocks
;
418 /* Accept file names as specified by POSIX.1-1996
422 if (h
->prefix
[0] && strcmp (h
->magic
, TMAGIC
) == 0)
424 memcpy (np
, h
->prefix
, sizeof h
->prefix
);
425 np
[sizeof h
->prefix
] = '\0';
429 memcpy (np
, h
->name
, sizeof h
->name
);
430 np
[sizeof h
->name
] = '\0';
432 recent_long_name
= 0;
433 recent_long_name_blocks
= 0;
435 assign_string (&info
->orig_file_name
, name
);
436 assign_string (&info
->file_name
, name
);
437 info
->had_trailing_slash
= strip_trailing_slashes (info
->file_name
);
439 if (recent_long_link
)
440 free (recent_long_link
);
444 name
= next_long_link
->buffer
+ BLOCKSIZE
;
445 recent_long_link
= next_long_link
;
446 recent_long_link_blocks
= next_long_link_blocks
;
450 memcpy (namebuf
, h
->linkname
, sizeof h
->linkname
);
451 namebuf
[sizeof h
->linkname
] = '\0';
453 recent_long_link
= 0;
454 recent_long_link_blocks
= 0;
456 assign_string (&info
->link_name
, name
);
458 return HEADER_SUCCESS
;
464 read_header (bool raw_extended_headers
)
466 return read_header_primitive (raw_extended_headers
, ¤t_stat_info
);
470 decode_xform (char *file_name
)
472 file_name
= safer_name_suffix (file_name
, false, absolute_names_option
);
473 if (strip_name_components
)
475 size_t prefix_len
= stripped_prefix_len (file_name
,
476 strip_name_components
);
477 if (prefix_len
== (size_t) -1)
478 prefix_len
= strlen (file_name
);
479 file_name
+= prefix_len
;
484 #define ISOCTAL(c) ((c)>='0'&&(c)<='7')
486 /* Decode things from a file HEADER block into STAT_INFO, also setting
487 *FORMAT_POINTER depending on the header block format. If
488 DO_USER_GROUP, decode the user/group information (this is useful
489 for extraction, but waste time when merely listing).
491 read_header() has already decoded the checksum and length, so we don't.
493 This routine should *not* be called twice for the same block, since
494 the two calls might use different DO_USER_GROUP values and thus
495 might end up with different uid/gid for the two calls. If anybody
496 wants the uid/gid they should decode it first, and other callers
497 should decode it without uid/gid before calling a routine,
498 e.g. print_header, that assumes decoded data. */
500 decode_header (union block
*header
, struct tar_stat_info
*stat_info
,
501 enum archive_format
*format_pointer
, int do_user_group
)
503 enum archive_format format
;
505 if (strcmp (header
->header
.magic
, TMAGIC
) == 0)
507 if (header
->star_header
.prefix
[130] == 0
508 && ISOCTAL (header
->star_header
.atime
[0])
509 && header
->star_header
.atime
[11] == ' '
510 && ISOCTAL (header
->star_header
.ctime
[0])
511 && header
->star_header
.ctime
[11] == ' ')
512 format
= STAR_FORMAT
;
513 else if (extended_header
.size
)
514 format
= POSIX_FORMAT
;
516 format
= USTAR_FORMAT
;
518 else if (strcmp (header
->header
.magic
, OLDGNU_MAGIC
) == 0)
519 format
= OLDGNU_FORMAT
;
522 *format_pointer
= format
;
524 stat_info
->stat
.st_mode
= MODE_FROM_HEADER (header
->header
.mode
);
525 stat_info
->mtime
.tv_sec
= TIME_FROM_HEADER (header
->header
.mtime
);
526 stat_info
->mtime
.tv_nsec
= 0;
527 assign_string (&stat_info
->uname
,
528 header
->header
.uname
[0] ? header
->header
.uname
: NULL
);
529 assign_string (&stat_info
->gname
,
530 header
->header
.gname
[0] ? header
->header
.gname
: NULL
);
532 if (format
== OLDGNU_FORMAT
&& incremental_option
)
534 stat_info
->atime
.tv_sec
= TIME_FROM_HEADER (header
->oldgnu_header
.atime
);
535 stat_info
->ctime
.tv_sec
= TIME_FROM_HEADER (header
->oldgnu_header
.ctime
);
536 stat_info
->atime
.tv_nsec
= stat_info
->ctime
.tv_nsec
= 0;
538 else if (format
== STAR_FORMAT
)
540 stat_info
->atime
.tv_sec
= TIME_FROM_HEADER (header
->star_header
.atime
);
541 stat_info
->ctime
.tv_sec
= TIME_FROM_HEADER (header
->star_header
.ctime
);
542 stat_info
->atime
.tv_nsec
= stat_info
->ctime
.tv_nsec
= 0;
545 stat_info
->atime
= stat_info
->ctime
= start_time
;
547 if (format
== V7_FORMAT
)
549 stat_info
->stat
.st_uid
= UID_FROM_HEADER (header
->header
.uid
);
550 stat_info
->stat
.st_gid
= GID_FROM_HEADER (header
->header
.gid
);
551 stat_info
->stat
.st_rdev
= 0;
557 /* FIXME: Decide if this should somewhat depend on -p. */
559 if (numeric_owner_option
560 || !*header
->header
.uname
561 || !uname_to_uid (header
->header
.uname
, &stat_info
->stat
.st_uid
))
562 stat_info
->stat
.st_uid
= UID_FROM_HEADER (header
->header
.uid
);
564 if (numeric_owner_option
565 || !*header
->header
.gname
566 || !gname_to_gid (header
->header
.gname
, &stat_info
->stat
.st_gid
))
567 stat_info
->stat
.st_gid
= GID_FROM_HEADER (header
->header
.gid
);
570 switch (header
->header
.typeflag
)
574 stat_info
->stat
.st_rdev
=
575 makedev (MAJOR_FROM_HEADER (header
->header
.devmajor
),
576 MINOR_FROM_HEADER (header
->header
.devminor
));
580 stat_info
->stat
.st_rdev
= 0;
584 stat_info
->archive_file_size
= stat_info
->stat
.st_size
;
585 xheader_decode (stat_info
);
587 if (sparse_member_p (stat_info
))
589 sparse_fixup_header (stat_info
);
590 stat_info
->is_sparse
= true;
594 stat_info
->is_sparse
= false;
595 if (((current_format
== GNU_FORMAT
596 || current_format
== OLDGNU_FORMAT
)
597 && current_header
->header
.typeflag
== GNUTYPE_DUMPDIR
)
598 || stat_info
->dumpdir
)
599 stat_info
->is_dumpdir
= true;
602 transform_name_fp (&stat_info
->file_name
, decode_xform
);
605 /* Convert buffer at WHERE0 of size DIGS from external format to
606 uintmax_t. DIGS must be positive. If TYPE is nonnull, the data
607 are of type TYPE. The buffer must represent a value in the range
608 -MINUS_MINVAL through MAXVAL. If OCTAL_ONLY, allow only octal
609 numbers instead of the other GNU extensions. Return -1 on error,
610 diagnosing the error if TYPE is nonnull and if !SILENT. */
612 from_header (char const *where0
, size_t digs
, char const *type
,
613 uintmax_t minus_minval
, uintmax_t maxval
,
614 bool octal_only
, bool silent
)
617 char const *where
= where0
;
618 char const *lim
= where
+ digs
;
621 /* Accommodate buggy tar of unknown vintage, which outputs leading
622 NUL if the previous field overflows. */
625 /* Accommodate older tars, which output leading spaces. */
632 /* TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.) */
633 _("Blanks in header where numeric %s value expected"),
637 if (!ISSPACE ((unsigned char) *where
))
643 if (ISODIGIT (*where
))
645 char const *where1
= where
;
646 uintmax_t overflow
= 0;
650 value
+= *where
++ - '0';
651 if (where
== lim
|| ! ISODIGIT (*where
))
653 overflow
|= value
^ (value
<< LG_8
>> LG_8
);
657 /* Parse the output of older, unportable tars, which generate
658 negative values in two's complement octal. If the leading
659 nonzero digit is 1, we can't recover the original value
660 reliably; so do this only if the digit is 2 or more. This
661 catches the common case of 32-bit negative time stamps. */
662 if ((overflow
|| maxval
< value
) && '2' <= *where1
&& type
)
664 /* Compute the negative of the input value, assuming two's
666 int digit
= (*where1
- '0') | 4;
674 if (where
== lim
|| ! ISODIGIT (*where
))
676 digit
= *where
- '0';
677 overflow
|= value
^ (value
<< LG_8
>> LG_8
);
683 if (!overflow
&& value
<= minus_minval
)
687 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
688 _("Archive octal value %.*s is out of %s range; assuming two's complement"),
689 (int) (where
- where1
), where1
, type
));
698 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
699 _("Archive octal value %.*s is out of %s range"),
700 (int) (where
- where1
), where1
, type
));
706 /* Suppress the following extensions. */
708 else if (*where
== '-' || *where
== '+')
710 /* Parse base-64 output produced only by tar test versions
711 1.13.6 (1999-08-11) through 1.13.11 (1999-08-23).
712 Support for this will be withdrawn in future releases. */
716 static bool warned_once
;
720 WARN ((0, 0, _("Archive contains obsolescent base-64 headers")));
723 negative
= *where
++ == '-';
725 && (dig
= base64_map
[(unsigned char) *where
]) < 64)
727 if (value
<< LG_64
>> LG_64
!= value
)
729 char *string
= alloca (digs
+ 1);
730 memcpy (string
, where0
, digs
);
734 _("Archive signed base-64 string %s is out of %s range"),
735 quote (string
), type
));
738 value
= (value
<< LG_64
) | dig
;
742 else if (*where
== '\200' /* positive base-256 */
743 || *where
== '\377' /* negative base-256 */)
745 /* Parse base-256 output. A nonnegative number N is
746 represented as (256**DIGS)/2 + N; a negative number -N is
747 represented as (256**DIGS) - N, i.e. as two's complement.
748 The representation guarantees that the leading bit is
749 always on, so that we don't confuse this format with the
750 others (assuming ASCII bytes of 8 bits or more). */
751 int signbit
= *where
& (1 << (LG_256
- 2));
752 uintmax_t topbits
= (((uintmax_t) - signbit
)
753 << (CHAR_BIT
* sizeof (uintmax_t)
754 - LG_256
- (LG_256
- 2)));
755 value
= (*where
++ & ((1 << (LG_256
- 2)) - 1)) - signbit
;
758 value
= (value
<< LG_256
) + (unsigned char) *where
++;
761 if (((value
<< LG_256
>> LG_256
) | topbits
) != value
)
765 _("Archive base-256 value is out of %s range"),
775 if (where
!= lim
&& *where
&& !ISSPACE ((unsigned char) *where
))
779 char buf
[1000]; /* Big enough to represent any header. */
780 static struct quoting_options
*o
;
784 o
= clone_quoting_options (0);
785 set_quoting_style (o
, locale_quoting_style
);
788 while (where0
!= lim
&& ! lim
[-1])
790 quotearg_buffer (buf
, sizeof buf
, where0
, lim
- where
, o
);
793 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
794 _("Archive contains %.*s where numeric %s value expected"),
795 (int) sizeof buf
, buf
, type
));
801 if (value
<= (negative
? minus_minval
: maxval
))
802 return negative
? -value
: value
;
806 char minval_buf
[UINTMAX_STRSIZE_BOUND
+ 1];
807 char maxval_buf
[UINTMAX_STRSIZE_BOUND
];
808 char value_buf
[UINTMAX_STRSIZE_BOUND
+ 1];
809 char *minval_string
= STRINGIFY_BIGINT (minus_minval
, minval_buf
+ 1);
810 char *value_string
= STRINGIFY_BIGINT (value
, value_buf
+ 1);
812 *--value_string
= '-';
814 *--minval_string
= '-';
815 /* TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.) */
816 ERROR ((0, 0, _("Archive value %s is out of %s range %s..%s"),
818 minval_string
, STRINGIFY_BIGINT (maxval
, maxval_buf
)));
825 gid_from_header (const char *p
, size_t s
)
827 return from_header (p
, s
, "gid_t",
828 - (uintmax_t) TYPE_MINIMUM (gid_t
),
829 (uintmax_t) TYPE_MAXIMUM (gid_t
),
834 major_from_header (const char *p
, size_t s
)
836 return from_header (p
, s
, "major_t",
837 - (uintmax_t) TYPE_MINIMUM (major_t
),
838 (uintmax_t) TYPE_MAXIMUM (major_t
), false, false);
842 minor_from_header (const char *p
, size_t s
)
844 return from_header (p
, s
, "minor_t",
845 - (uintmax_t) TYPE_MINIMUM (minor_t
),
846 (uintmax_t) TYPE_MAXIMUM (minor_t
), false, false);
850 mode_from_header (const char *p
, size_t s
)
852 /* Do not complain about unrecognized mode bits. */
853 unsigned u
= from_header (p
, s
, "mode_t",
854 - (uintmax_t) TYPE_MINIMUM (mode_t
),
855 TYPE_MAXIMUM (uintmax_t), false, false);
856 return ((u
& TSUID
? S_ISUID
: 0)
857 | (u
& TSGID
? S_ISGID
: 0)
858 | (u
& TSVTX
? S_ISVTX
: 0)
859 | (u
& TUREAD
? S_IRUSR
: 0)
860 | (u
& TUWRITE
? S_IWUSR
: 0)
861 | (u
& TUEXEC
? S_IXUSR
: 0)
862 | (u
& TGREAD
? S_IRGRP
: 0)
863 | (u
& TGWRITE
? S_IWGRP
: 0)
864 | (u
& TGEXEC
? S_IXGRP
: 0)
865 | (u
& TOREAD
? S_IROTH
: 0)
866 | (u
& TOWRITE
? S_IWOTH
: 0)
867 | (u
& TOEXEC
? S_IXOTH
: 0));
871 off_from_header (const char *p
, size_t s
)
873 /* Negative offsets are not allowed in tar files, so invoke
874 from_header with minimum value 0, not TYPE_MINIMUM (off_t). */
875 return from_header (p
, s
, "off_t", (uintmax_t) 0,
876 (uintmax_t) TYPE_MAXIMUM (off_t
), false, false);
880 size_from_header (const char *p
, size_t s
)
882 return from_header (p
, s
, "size_t", (uintmax_t) 0,
883 (uintmax_t) TYPE_MAXIMUM (size_t), false, false);
887 time_from_header (const char *p
, size_t s
)
889 return from_header (p
, s
, "time_t",
890 - (uintmax_t) TYPE_MINIMUM (time_t),
891 (uintmax_t) TYPE_MAXIMUM (time_t), false, false);
895 uid_from_header (const char *p
, size_t s
)
897 return from_header (p
, s
, "uid_t",
898 - (uintmax_t) TYPE_MINIMUM (uid_t
),
899 (uintmax_t) TYPE_MAXIMUM (uid_t
), false, false);
903 uintmax_from_header (const char *p
, size_t s
)
905 return from_header (p
, s
, "uintmax_t", (uintmax_t) 0,
906 TYPE_MAXIMUM (uintmax_t), false, false);
910 /* Return a printable representation of T. The result points to
911 static storage that can be reused in the next call to this
912 function, to ctime, or to asctime. If FULL_TIME, then output the
913 time stamp to its full resolution; otherwise, just output it to
914 1-minute resolution. */
916 tartime (struct timespec t
, bool full_time
)
918 enum { fraclen
= sizeof ".FFFFFFFFF" - 1 };
919 static char buffer
[max (UINTMAX_STRSIZE_BOUND
+ 1,
920 INT_STRLEN_BOUND (int) + 16)
925 bool negative
= s
< 0;
928 if (negative
&& ns
!= 0)
931 ns
= 1000000000 - ns
;
934 tm
= utc_option
? gmtime (&s
) : localtime (&s
);
939 sprintf (buffer
, "%04ld-%02d-%02d %02d:%02d:%02d",
940 tm
->tm_year
+ 1900L, tm
->tm_mon
+ 1, tm
->tm_mday
,
941 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
942 code_ns_fraction (ns
, buffer
+ strlen (buffer
));
945 sprintf (buffer
, "%04ld-%02d-%02d %02d:%02d",
946 tm
->tm_year
+ 1900L, tm
->tm_mon
+ 1, tm
->tm_mday
,
947 tm
->tm_hour
, tm
->tm_min
);
951 /* The time stamp cannot be broken down, most likely because it
952 is out of range. Convert it as an integer,
953 right-adjusted in a field with the same width as the usual
954 4-year ISO time format. */
955 p
= umaxtostr (negative
? - (uintmax_t) s
: s
,
956 buffer
+ sizeof buffer
- UINTMAX_STRSIZE_BOUND
- fraclen
);
959 while ((buffer
+ sizeof buffer
- sizeof "YYYY-MM-DD HH:MM"
960 + (full_time
? sizeof ":SS.FFFFFFFFF" - 1 : 0))
964 code_ns_fraction (ns
, buffer
+ sizeof buffer
- 1 - fraclen
);
968 /* Actually print it.
970 Plain and fancy file header block logging. Non-verbose just prints
971 the name, e.g. for "tar t" or "tar x". This should just contain
972 file names, so it can be fed back into tar with xargs or the "-T"
973 option. The verbose option can give a bunch of info, one line per
974 file. I doubt anybody tries to parse its format, or if they do,
975 they shouldn't. Unix tar is pretty random here anyway. */
978 /* FIXME: Note that print_header uses the globals HEAD, HSTAT, and
979 HEAD_STANDARD, which must be set up in advance. Not very clean.. */
981 /* Width of "user/group size", with initial value chosen
982 heuristically. This grows as needed, though this may cause some
983 stairstepping in the output. Make it too small and the output will
984 almost always look ragged. Make it too large and the output will
985 be spaced out too far. */
986 static int ugswidth
= 19;
988 /* Width of printed time stamps. It grows if longer time stamps are
989 found (typically, those with nanosecond resolution). Like
990 USGWIDTH, some stairstepping may occur. */
991 static int datewidth
= sizeof "YYYY-MM-DD HH:MM" - 1;
994 print_header (struct tar_stat_info
*st
, off_t block_ordinal
)
997 char const *time_stamp
;
1001 /* These hold formatted ints. */
1002 char uform
[UINTMAX_STRSIZE_BOUND
], gform
[UINTMAX_STRSIZE_BOUND
];
1004 char size
[2 * UINTMAX_STRSIZE_BOUND
];
1005 /* holds formatted size or major,minor */
1006 char uintbuf
[UINTMAX_STRSIZE_BOUND
];
1010 if (test_label_option
&& current_header
->header
.typeflag
!= GNUTYPE_VOLHDR
)
1013 if (show_transformed_names_option
)
1014 temp_name
= st
->file_name
? st
->file_name
: st
->orig_file_name
;
1016 temp_name
= st
->orig_file_name
? st
->orig_file_name
: st
->file_name
;
1018 if (block_number_option
)
1020 char buf
[UINTMAX_STRSIZE_BOUND
];
1021 if (block_ordinal
< 0)
1022 block_ordinal
= current_block_ordinal ();
1023 block_ordinal
-= recent_long_name_blocks
;
1024 block_ordinal
-= recent_long_link_blocks
;
1025 fprintf (stdlis
, _("block %s: "),
1026 STRINGIFY_BIGINT (block_ordinal
, buf
));
1029 if (verbose_option
<= 1)
1031 /* Just the fax, mam. */
1032 fprintf (stdlis
, "%s\n", quotearg (temp_name
));
1036 /* File type and modes. */
1039 switch (current_header
->header
.typeflag
)
1041 case GNUTYPE_VOLHDR
:
1045 case GNUTYPE_MULTIVOL
:
1049 case GNUTYPE_LONGNAME
:
1050 case GNUTYPE_LONGLINK
:
1052 ERROR ((0, 0, _("Unexpected long name header")));
1055 case GNUTYPE_SPARSE
:
1059 if (temp_name
[strlen (temp_name
) - 1] == '/')
1065 case GNUTYPE_DUMPDIR
:
1088 pax_decode_mode (st
->stat
.st_mode
, modes
+ 1);
1092 time_stamp
= tartime (st
->mtime
, false);
1093 time_stamp_len
= strlen (time_stamp
);
1094 if (datewidth
< time_stamp_len
)
1095 datewidth
= time_stamp_len
;
1097 /* User and group names. */
1101 && current_format
!= V7_FORMAT
1102 && !numeric_owner_option
)
1106 /* Try parsing it as an unsigned integer first, and as a
1107 uid_t if that fails. This method can list positive user
1108 ids that are too large to fit in a uid_t. */
1109 uintmax_t u
= from_header (current_header
->header
.uid
,
1110 sizeof current_header
->header
.uid
, 0,
1112 (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1115 user
= STRINGIFY_BIGINT (u
, uform
);
1118 sprintf (uform
, "%ld",
1119 (long) UID_FROM_HEADER (current_header
->header
.uid
));
1126 && current_format
!= V7_FORMAT
1127 && !numeric_owner_option
)
1131 /* Try parsing it as an unsigned integer first, and as a
1132 gid_t if that fails. This method can list positive group
1133 ids that are too large to fit in a gid_t. */
1134 uintmax_t g
= from_header (current_header
->header
.gid
,
1135 sizeof current_header
->header
.gid
, 0,
1137 (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1140 group
= STRINGIFY_BIGINT (g
, gform
);
1143 sprintf (gform
, "%ld",
1144 (long) GID_FROM_HEADER (current_header
->header
.gid
));
1149 /* Format the file size or major/minor device numbers. */
1151 switch (current_header
->header
.typeflag
)
1156 STRINGIFY_BIGINT (major (st
->stat
.st_rdev
), uintbuf
));
1159 STRINGIFY_BIGINT (minor (st
->stat
.st_rdev
), uintbuf
));
1163 /* st->stat.st_size keeps stored file size */
1164 strcpy (size
, STRINGIFY_BIGINT (st
->stat
.st_size
, uintbuf
));
1168 /* Figure out padding and print the whole line. */
1170 sizelen
= strlen (size
);
1171 pad
= strlen (user
) + 1 + strlen (group
) + 1 + sizelen
;
1175 fprintf (stdlis
, "%s %s/%s %*s %-*s",
1176 modes
, user
, group
, ugswidth
- pad
+ sizelen
, size
,
1177 datewidth
, time_stamp
);
1179 fprintf (stdlis
, " %s", quotearg (temp_name
));
1181 switch (current_header
->header
.typeflag
)
1184 fprintf (stdlis
, " -> %s\n", quotearg (st
->link_name
));
1188 fprintf (stdlis
, _(" link to %s\n"), quotearg (st
->link_name
));
1193 char type_string
[2];
1194 type_string
[0] = current_header
->header
.typeflag
;
1195 type_string
[1] = '\0';
1196 fprintf (stdlis
, _(" unknown file type %s\n"),
1197 quote (type_string
));
1203 case GNUTYPE_SPARSE
:
1209 case GNUTYPE_DUMPDIR
:
1210 putc ('\n', stdlis
);
1213 case GNUTYPE_LONGLINK
:
1214 fprintf (stdlis
, _("--Long Link--\n"));
1217 case GNUTYPE_LONGNAME
:
1218 fprintf (stdlis
, _("--Long Name--\n"));
1221 case GNUTYPE_VOLHDR
:
1222 fprintf (stdlis
, _("--Volume Header--\n"));
1225 case GNUTYPE_MULTIVOL
:
1228 (UINTMAX_FROM_HEADER (current_header
->oldgnu_header
.offset
),
1230 fprintf (stdlis
, _("--Continued at byte %s--\n"), size
);
1237 /* Print a similar line when we make a directory automatically. */
1239 print_for_mkdir (char *dirname
, int length
, mode_t mode
)
1243 if (verbose_option
> 1)
1245 /* File type and modes. */
1248 pax_decode_mode (mode
, modes
+ 1);
1250 if (block_number_option
)
1252 char buf
[UINTMAX_STRSIZE_BOUND
];
1253 fprintf (stdlis
, _("block %s: "),
1254 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
1257 fprintf (stdlis
, "%s %*s %.*s\n", modes
, ugswidth
+ 1 + datewidth
,
1258 _("Creating directory:"), length
, quotearg (dirname
));
1262 /* Skip over SIZE bytes of data in blocks in the archive. */
1264 skip_file (off_t size
)
1268 /* FIXME: Make sure mv_begin is always called before it */
1270 if (seekable_archive
)
1272 off_t nblk
= seek_archive (size
);
1274 size
-= nblk
* BLOCKSIZE
;
1276 seekable_archive
= false;
1279 mv_size_left (size
);
1283 x
= find_next_block ();
1285 FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
1287 set_next_block_after (x
);
1289 mv_size_left (size
);
1293 /* Skip the current member in the archive.
1294 NOTE: Current header must be decoded before calling this function. */
1298 if (!current_stat_info
.skipped
)
1300 char save_typeflag
= current_header
->header
.typeflag
;
1301 set_next_block_after (current_header
);
1303 mv_begin (¤t_stat_info
);
1305 if (current_stat_info
.is_sparse
)
1306 sparse_skip_file (¤t_stat_info
);
1307 else if (save_typeflag
!= DIRTYPE
)
1308 skip_file (current_stat_info
.stat
.st_size
);