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, 2007, 2010 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 3, 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 */
36 union block
*recent_global_header
; /* Recent global header block */
38 #define GID_FROM_HEADER(where) gid_from_header (where, sizeof (where))
39 #define MAJOR_FROM_HEADER(where) major_from_header (where, sizeof (where))
40 #define MINOR_FROM_HEADER(where) minor_from_header (where, sizeof (where))
41 #define MODE_FROM_HEADER(where, hbits) \
42 mode_from_header (where, sizeof (where), hbits)
43 #define TIME_FROM_HEADER(where) time_from_header (where, sizeof (where))
44 #define UID_FROM_HEADER(where) uid_from_header (where, sizeof (where))
46 static gid_t
gid_from_header (const char *buf
, size_t size
);
47 static major_t
major_from_header (const char *buf
, size_t size
);
48 static minor_t
minor_from_header (const char *buf
, size_t size
);
49 static mode_t
mode_from_header (const char *buf
, size_t size
, unsigned *hbits
);
50 static time_t time_from_header (const char *buf
, size_t size
);
51 static uid_t
uid_from_header (const char *buf
, size_t size
);
52 static uintmax_t from_header (const char *, size_t, const char *,
53 uintmax_t, uintmax_t, bool, bool);
55 /* Base 64 digits; see Internet RFC 2045 Table 1. */
56 static char const base_64_digits
[64] =
58 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
59 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
60 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
61 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
62 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
65 /* Table of base-64 digit values indexed by unsigned chars.
66 The value is 64 for unsigned chars that are not base-64 digits. */
67 static char base64_map
[UCHAR_MAX
+ 1];
73 memset (base64_map
, 64, sizeof base64_map
);
74 for (i
= 0; i
< 64; i
++)
75 base64_map
[(int) base_64_digits
[i
]] = i
;
78 /* Main loop for reading an archive. */
80 read_and (void (*do_something
) (void))
82 enum read_header status
= HEADER_STILL_UNREAD
;
83 enum read_header prev_status
;
84 struct timespec mtime
;
89 open_archive (ACCESS_READ
);
93 tar_stat_destroy (¤t_stat_info
);
95 status
= read_header (¤t_header
, ¤t_stat_info
,
99 case HEADER_STILL_UNREAD
:
100 case HEADER_SUCCESS_EXTENDED
:
105 /* Valid header. We should decode next field (mode) first.
106 Ensure incoming names are null terminated. */
107 decode_header (current_header
, ¤t_stat_info
,
109 if (! name_match (current_stat_info
.file_name
)
110 || (NEWER_OPTION_INITIALIZED (newer_mtime_option
)
111 /* FIXME: We get mtime now, and again later; this causes
112 duplicate diagnostics if header.mtime is bogus. */
114 = TIME_FROM_HEADER (current_header
->header
.mtime
)),
115 /* FIXME: Grab fractional time stamps from
118 current_stat_info
.mtime
= mtime
,
119 OLDER_TAR_STAT_TIME (current_stat_info
, m
)))
120 || excluded_name (current_stat_info
.file_name
))
122 switch (current_header
->header
.typeflag
)
125 case GNUTYPE_MULTIVOL
:
129 if (show_omitted_dirs_option
)
130 WARN ((0, 0, _("%s: Omitting"),
131 quotearg_colon (current_stat_info
.file_name
)));
142 case HEADER_ZERO_BLOCK
:
143 if (block_number_option
)
145 char buf
[UINTMAX_STRSIZE_BOUND
];
146 fprintf (stdlis
, _("block %s: ** Block of NULs **\n"),
147 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
150 set_next_block_after (current_header
);
152 if (!ignore_zeros_option
)
154 char buf
[UINTMAX_STRSIZE_BOUND
];
156 status
= read_header (¤t_header
, ¤t_stat_info
,
158 if (status
== HEADER_ZERO_BLOCK
)
160 WARNOPT (WARN_ALONE_ZERO_BLOCK
,
161 (0, 0, _("A lone zero block at %s"),
162 STRINGIFY_BIGINT (current_block_ordinal (), buf
)));
165 status
= prev_status
;
168 case HEADER_END_OF_FILE
:
169 if (block_number_option
)
171 char buf
[UINTMAX_STRSIZE_BOUND
];
172 fprintf (stdlis
, _("block %s: ** End of File **\n"),
173 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
178 /* If the previous header was good, tell them that we are
179 skipping bad ones. */
180 set_next_block_after (current_header
);
183 case HEADER_STILL_UNREAD
:
184 ERROR ((0, 0, _("This does not look like a tar archive")));
187 case HEADER_ZERO_BLOCK
:
189 if (block_number_option
)
191 char buf
[UINTMAX_STRSIZE_BOUND
];
192 off_t block_ordinal
= current_block_ordinal ();
193 block_ordinal
-= recent_long_name_blocks
;
194 block_ordinal
-= recent_long_link_blocks
;
195 fprintf (stdlis
, _("block %s: "),
196 STRINGIFY_BIGINT (block_ordinal
, buf
));
198 ERROR ((0, 0, _("Skipping to next header")));
201 case HEADER_END_OF_FILE
:
203 /* We are in the middle of a cascade of errors. */
206 case HEADER_SUCCESS_EXTENDED
:
213 while (!all_names_found (¤t_stat_info
));
216 names_notfound (); /* print names not found */
219 /* Print a header block, based on tar options. */
223 off_t block_ordinal
= current_block_ordinal ();
225 /* Print the header block. */
227 print_header (¤t_stat_info
, current_header
, block_ordinal
);
229 if (incremental_option
)
231 if (verbose_option
> 2)
233 if (is_dumpdir (¤t_stat_info
))
234 list_dumpdir (current_stat_info
.dumpdir
,
235 dumpdir_size (current_stat_info
.dumpdir
));
242 /* Check header checksum */
243 /* The standard BSD tar sources create the checksum by adding up the
244 bytes in the header as type char. I think the type char was unsigned
245 on the PDP-11, but it's signed on the Next and Sun. It looks like the
246 sources to BSD tar were never changed to compute the checksum
247 correctly, so both the Sun and Next add the bytes of the header as
248 signed chars. This doesn't cause a problem until you get a file with
249 a name containing characters with the high bit set. So tar_checksum
250 computes two checksums -- signed and unsigned. */
253 tar_checksum (union block
*header
, bool silent
)
256 int unsigned_sum
= 0; /* the POSIX one :-) */
257 int signed_sum
= 0; /* the Sun one :-( */
259 uintmax_t parsed_sum
;
263 for (i
= sizeof *header
; i
-- != 0;)
265 unsigned_sum
+= (unsigned char) *p
;
266 signed_sum
+= (signed char) (*p
++);
269 if (unsigned_sum
== 0)
270 return HEADER_ZERO_BLOCK
;
272 /* Adjust checksum to count the "chksum" field as blanks. */
274 for (i
= sizeof header
->header
.chksum
; i
-- != 0;)
276 unsigned_sum
-= (unsigned char) header
->header
.chksum
[i
];
277 signed_sum
-= (signed char) (header
->header
.chksum
[i
]);
279 unsigned_sum
+= ' ' * sizeof header
->header
.chksum
;
280 signed_sum
+= ' ' * sizeof header
->header
.chksum
;
282 parsed_sum
= from_header (header
->header
.chksum
,
283 sizeof header
->header
.chksum
, 0,
285 (uintmax_t) TYPE_MAXIMUM (int), true, silent
);
286 if (parsed_sum
== (uintmax_t) -1)
287 return HEADER_FAILURE
;
289 recorded_sum
= parsed_sum
;
291 if (unsigned_sum
!= recorded_sum
&& signed_sum
!= recorded_sum
)
292 return HEADER_FAILURE
;
294 return HEADER_SUCCESS
;
297 /* Read a block that's supposed to be a header block. Return its
298 address in *RETURN_BLOCK, and if it is good, the file's size
299 and names (file name, link name) in *INFO.
301 Return one of enum read_header describing the status of the
304 The MODE parameter instructs read_header what to do with special
305 header blocks, i.e.: extended POSIX, GNU long name or long link,
308 read_header_auto process them automatically,
309 read_header_x_raw when a special header is read, return
310 HEADER_SUCCESS_EXTENDED without actually
311 processing the header,
312 read_header_x_global when a POSIX global header is read,
313 decode it and return HEADER_SUCCESS_EXTENDED.
315 You must always set_next_block_after(*return_block) to skip past
316 the header which this routine reads. */
319 read_header (union block
**return_block
, struct tar_stat_info
*info
,
320 enum read_header_mode mode
)
323 union block
*header_copy
;
325 union block
*data_block
;
326 size_t size
, written
;
327 union block
*next_long_name
= 0;
328 union block
*next_long_link
= 0;
329 size_t next_long_name_blocks
= 0;
330 size_t next_long_link_blocks
= 0;
334 enum read_header status
;
336 header
= find_next_block ();
337 *return_block
= header
;
339 return HEADER_END_OF_FILE
;
341 if ((status
= tar_checksum (header
, false)) != HEADER_SUCCESS
)
344 /* Good block. Decode file size and return. */
346 if (header
->header
.typeflag
== LNKTYPE
)
347 info
->stat
.st_size
= 0; /* links 0 size on tape */
349 info
->stat
.st_size
= OFF_FROM_HEADER (header
->header
.size
);
351 if (header
->header
.typeflag
== GNUTYPE_LONGNAME
352 || header
->header
.typeflag
== GNUTYPE_LONGLINK
353 || header
->header
.typeflag
== XHDTYPE
354 || header
->header
.typeflag
== XGLTYPE
355 || header
->header
.typeflag
== SOLARIS_XHDTYPE
)
357 if (mode
== read_header_x_raw
)
358 return HEADER_SUCCESS_EXTENDED
;
359 else if (header
->header
.typeflag
== GNUTYPE_LONGNAME
360 || header
->header
.typeflag
== GNUTYPE_LONGLINK
)
362 size_t name_size
= info
->stat
.st_size
;
363 size_t n
= name_size
% BLOCKSIZE
;
364 size
= name_size
+ BLOCKSIZE
;
366 size
+= BLOCKSIZE
- n
;
368 if (name_size
!= info
->stat
.st_size
|| size
< name_size
)
371 header_copy
= xmalloc (size
+ 1);
373 if (header
->header
.typeflag
== GNUTYPE_LONGNAME
)
376 free (next_long_name
);
377 next_long_name
= header_copy
;
378 next_long_name_blocks
= size
/ BLOCKSIZE
;
383 free (next_long_link
);
384 next_long_link
= header_copy
;
385 next_long_link_blocks
= size
/ BLOCKSIZE
;
388 set_next_block_after (header
);
389 *header_copy
= *header
;
390 bp
= header_copy
->buffer
+ BLOCKSIZE
;
392 for (size
-= BLOCKSIZE
; size
> 0; size
-= written
)
394 data_block
= find_next_block ();
397 ERROR ((0, 0, _("Unexpected EOF in archive")));
400 written
= available_space_after (data_block
);
404 memcpy (bp
, data_block
->buffer
, written
);
406 set_next_block_after ((union block
*)
407 (data_block
->buffer
+ written
- 1));
412 else if (header
->header
.typeflag
== XHDTYPE
413 || header
->header
.typeflag
== SOLARIS_XHDTYPE
)
414 xheader_read (&info
->xhdr
, header
,
415 OFF_FROM_HEADER (header
->header
.size
));
416 else if (header
->header
.typeflag
== XGLTYPE
)
420 if (!recent_global_header
)
421 recent_global_header
= xmalloc (sizeof *recent_global_header
);
422 memcpy (recent_global_header
, header
,
423 sizeof *recent_global_header
);
424 memset (&xhdr
, 0, sizeof xhdr
);
425 xheader_read (&xhdr
, header
,
426 OFF_FROM_HEADER (header
->header
.size
));
427 xheader_decode_global (&xhdr
);
428 xheader_destroy (&xhdr
);
429 if (mode
== read_header_x_global
)
430 return HEADER_SUCCESS_EXTENDED
;
439 struct posix_header
const *h
= &header
->header
;
440 char namebuf
[sizeof h
->prefix
+ 1 + NAME_FIELD_SIZE
+ 1];
442 if (recent_long_name
)
443 free (recent_long_name
);
447 name
= next_long_name
->buffer
+ BLOCKSIZE
;
448 recent_long_name
= next_long_name
;
449 recent_long_name_blocks
= next_long_name_blocks
;
453 /* Accept file names as specified by POSIX.1-1996
457 if (h
->prefix
[0] && strcmp (h
->magic
, TMAGIC
) == 0)
459 memcpy (np
, h
->prefix
, sizeof h
->prefix
);
460 np
[sizeof h
->prefix
] = '\0';
464 memcpy (np
, h
->name
, sizeof h
->name
);
465 np
[sizeof h
->name
] = '\0';
467 recent_long_name
= 0;
468 recent_long_name_blocks
= 0;
470 assign_string (&info
->orig_file_name
, name
);
471 assign_string (&info
->file_name
, name
);
472 info
->had_trailing_slash
= strip_trailing_slashes (info
->file_name
);
474 if (recent_long_link
)
475 free (recent_long_link
);
479 name
= next_long_link
->buffer
+ BLOCKSIZE
;
480 recent_long_link
= next_long_link
;
481 recent_long_link_blocks
= next_long_link_blocks
;
485 memcpy (namebuf
, h
->linkname
, sizeof h
->linkname
);
486 namebuf
[sizeof h
->linkname
] = '\0';
488 recent_long_link
= 0;
489 recent_long_link_blocks
= 0;
491 assign_string (&info
->link_name
, name
);
493 return HEADER_SUCCESS
;
499 decode_xform (char *file_name
, void *data
)
501 int type
= *(int*)data
;
506 /* FIXME: It is not quite clear how and to which extent are the symbolic
507 links subject to filename transformation. In the absence of another
508 solution, symbolic links are exempt from component stripping and
509 name suffix normalization, but subject to filename transformation
514 file_name
= safer_name_suffix (file_name
, true, absolute_names_option
);
518 file_name
= safer_name_suffix (file_name
, false, absolute_names_option
);
522 if (strip_name_components
)
524 size_t prefix_len
= stripped_prefix_len (file_name
,
525 strip_name_components
);
526 if (prefix_len
== (size_t) -1)
527 prefix_len
= strlen (file_name
);
528 file_name
+= prefix_len
;
534 transform_member_name (char **pinput
, int type
)
536 return transform_name_fp (pinput
, type
, decode_xform
, &type
);
539 #define ISOCTAL(c) ((c)>='0'&&(c)<='7')
541 /* Decode things from a file HEADER block into STAT_INFO, also setting
542 *FORMAT_POINTER depending on the header block format. If
543 DO_USER_GROUP, decode the user/group information (this is useful
544 for extraction, but waste time when merely listing).
546 read_header() has already decoded the checksum and length, so we don't.
548 This routine should *not* be called twice for the same block, since
549 the two calls might use different DO_USER_GROUP values and thus
550 might end up with different uid/gid for the two calls. If anybody
551 wants the uid/gid they should decode it first, and other callers
552 should decode it without uid/gid before calling a routine,
553 e.g. print_header, that assumes decoded data. */
555 decode_header (union block
*header
, struct tar_stat_info
*stat_info
,
556 enum archive_format
*format_pointer
, int do_user_group
)
558 enum archive_format format
;
559 unsigned hbits
; /* high bits of the file mode. */
560 mode_t mode
= MODE_FROM_HEADER (header
->header
.mode
, &hbits
);
562 if (strcmp (header
->header
.magic
, TMAGIC
) == 0)
564 if (header
->star_header
.prefix
[130] == 0
565 && ISOCTAL (header
->star_header
.atime
[0])
566 && header
->star_header
.atime
[11] == ' '
567 && ISOCTAL (header
->star_header
.ctime
[0])
568 && header
->star_header
.ctime
[11] == ' ')
569 format
= STAR_FORMAT
;
570 else if (stat_info
->xhdr
.size
)
571 format
= POSIX_FORMAT
;
573 format
= USTAR_FORMAT
;
575 else if (strcmp (header
->header
.magic
, OLDGNU_MAGIC
) == 0)
576 format
= hbits
? OLDGNU_FORMAT
: GNU_FORMAT
;
579 *format_pointer
= format
;
581 stat_info
->stat
.st_mode
= mode
;
582 stat_info
->mtime
.tv_sec
= TIME_FROM_HEADER (header
->header
.mtime
);
583 stat_info
->mtime
.tv_nsec
= 0;
584 assign_string (&stat_info
->uname
,
585 header
->header
.uname
[0] ? header
->header
.uname
: NULL
);
586 assign_string (&stat_info
->gname
,
587 header
->header
.gname
[0] ? header
->header
.gname
: NULL
);
589 if (format
== OLDGNU_FORMAT
&& incremental_option
)
591 stat_info
->atime
.tv_sec
= TIME_FROM_HEADER (header
->oldgnu_header
.atime
);
592 stat_info
->ctime
.tv_sec
= TIME_FROM_HEADER (header
->oldgnu_header
.ctime
);
593 stat_info
->atime
.tv_nsec
= stat_info
->ctime
.tv_nsec
= 0;
595 else if (format
== STAR_FORMAT
)
597 stat_info
->atime
.tv_sec
= TIME_FROM_HEADER (header
->star_header
.atime
);
598 stat_info
->ctime
.tv_sec
= TIME_FROM_HEADER (header
->star_header
.ctime
);
599 stat_info
->atime
.tv_nsec
= stat_info
->ctime
.tv_nsec
= 0;
602 stat_info
->atime
= stat_info
->ctime
= start_time
;
604 if (format
== V7_FORMAT
)
606 stat_info
->stat
.st_uid
= UID_FROM_HEADER (header
->header
.uid
);
607 stat_info
->stat
.st_gid
= GID_FROM_HEADER (header
->header
.gid
);
608 stat_info
->stat
.st_rdev
= 0;
614 /* FIXME: Decide if this should somewhat depend on -p. */
616 if (numeric_owner_option
617 || !*header
->header
.uname
618 || !uname_to_uid (header
->header
.uname
, &stat_info
->stat
.st_uid
))
619 stat_info
->stat
.st_uid
= UID_FROM_HEADER (header
->header
.uid
);
621 if (numeric_owner_option
622 || !*header
->header
.gname
623 || !gname_to_gid (header
->header
.gname
, &stat_info
->stat
.st_gid
))
624 stat_info
->stat
.st_gid
= GID_FROM_HEADER (header
->header
.gid
);
627 switch (header
->header
.typeflag
)
631 stat_info
->stat
.st_rdev
=
632 makedev (MAJOR_FROM_HEADER (header
->header
.devmajor
),
633 MINOR_FROM_HEADER (header
->header
.devminor
));
637 stat_info
->stat
.st_rdev
= 0;
641 stat_info
->archive_file_size
= stat_info
->stat
.st_size
;
642 xheader_decode (stat_info
);
644 if (sparse_member_p (stat_info
))
646 sparse_fixup_header (stat_info
);
647 stat_info
->is_sparse
= true;
651 stat_info
->is_sparse
= false;
652 if (((current_format
== GNU_FORMAT
653 || current_format
== OLDGNU_FORMAT
)
654 && current_header
->header
.typeflag
== GNUTYPE_DUMPDIR
)
655 || stat_info
->dumpdir
)
656 stat_info
->is_dumpdir
= true;
659 if (header
->header
.typeflag
== GNUTYPE_VOLHDR
)
660 /* Name transformations don't apply to volume headers. */
663 transform_member_name (&stat_info
->file_name
, XFORM_REGFILE
);
664 switch (header
->header
.typeflag
)
667 transform_member_name (&stat_info
->link_name
, XFORM_SYMLINK
);
671 transform_member_name (&stat_info
->link_name
, XFORM_LINK
);
675 /* Convert buffer at WHERE0 of size DIGS from external format to
676 uintmax_t. DIGS must be positive. If TYPE is nonnull, the data
677 are of type TYPE. The buffer must represent a value in the range
678 -MINUS_MINVAL through MAXVAL. If OCTAL_ONLY, allow only octal
679 numbers instead of the other GNU extensions. Return -1 on error,
680 diagnosing the error if TYPE is nonnull and if !SILENT. */
682 from_header (char const *where0
, size_t digs
, char const *type
,
683 uintmax_t minus_minval
, uintmax_t maxval
,
684 bool octal_only
, bool silent
)
687 char const *where
= where0
;
688 char const *lim
= where
+ digs
;
691 /* Accommodate buggy tar of unknown vintage, which outputs leading
692 NUL if the previous field overflows. */
695 /* Accommodate older tars, which output leading spaces. */
702 /* TRANSLATORS: %s is type of the value (gid_t, uid_t,
704 _("Blanks in header where numeric %s value expected"),
708 if (!ISSPACE ((unsigned char) *where
))
714 if (ISODIGIT (*where
))
716 char const *where1
= where
;
717 uintmax_t overflow
= 0;
721 value
+= *where
++ - '0';
722 if (where
== lim
|| ! ISODIGIT (*where
))
724 overflow
|= value
^ (value
<< LG_8
>> LG_8
);
728 /* Parse the output of older, unportable tars, which generate
729 negative values in two's complement octal. If the leading
730 nonzero digit is 1, we can't recover the original value
731 reliably; so do this only if the digit is 2 or more. This
732 catches the common case of 32-bit negative time stamps. */
733 if ((overflow
|| maxval
< value
) && '2' <= *where1
&& type
)
735 /* Compute the negative of the input value, assuming two's
737 int digit
= (*where1
- '0') | 4;
745 if (where
== lim
|| ! ISODIGIT (*where
))
747 digit
= *where
- '0';
748 overflow
|= value
^ (value
<< LG_8
>> LG_8
);
754 if (!overflow
&& value
<= minus_minval
)
758 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
759 _("Archive octal value %.*s is out of %s range; assuming two's complement"),
760 (int) (where
- where1
), where1
, type
));
769 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
770 _("Archive octal value %.*s is out of %s range"),
771 (int) (where
- where1
), where1
, type
));
777 /* Suppress the following extensions. */
779 else if (*where
== '-' || *where
== '+')
781 /* Parse base-64 output produced only by tar test versions
782 1.13.6 (1999-08-11) through 1.13.11 (1999-08-23).
783 Support for this will be withdrawn in future releases. */
787 static bool warned_once
;
791 WARN ((0, 0, _("Archive contains obsolescent base-64 headers")));
794 negative
= *where
++ == '-';
796 && (dig
= base64_map
[(unsigned char) *where
]) < 64)
798 if (value
<< LG_64
>> LG_64
!= value
)
800 char *string
= alloca (digs
+ 1);
801 memcpy (string
, where0
, digs
);
805 _("Archive signed base-64 string %s is out of %s range"),
806 quote (string
), type
));
809 value
= (value
<< LG_64
) | dig
;
813 else if (*where
== '\200' /* positive base-256 */
814 || *where
== '\377' /* negative base-256 */)
816 /* Parse base-256 output. A nonnegative number N is
817 represented as (256**DIGS)/2 + N; a negative number -N is
818 represented as (256**DIGS) - N, i.e. as two's complement.
819 The representation guarantees that the leading bit is
820 always on, so that we don't confuse this format with the
821 others (assuming ASCII bytes of 8 bits or more). */
822 int signbit
= *where
& (1 << (LG_256
- 2));
823 uintmax_t topbits
= (((uintmax_t) - signbit
)
824 << (CHAR_BIT
* sizeof (uintmax_t)
825 - LG_256
- (LG_256
- 2)));
826 value
= (*where
++ & ((1 << (LG_256
- 2)) - 1)) - signbit
;
829 value
= (value
<< LG_256
) + (unsigned char) *where
++;
832 if (((value
<< LG_256
>> LG_256
) | topbits
) != value
)
836 _("Archive base-256 value is out of %s range"),
846 if (where
!= lim
&& *where
&& !ISSPACE ((unsigned char) *where
))
850 char buf
[1000]; /* Big enough to represent any header. */
851 static struct quoting_options
*o
;
855 o
= clone_quoting_options (0);
856 set_quoting_style (o
, locale_quoting_style
);
859 while (where0
!= lim
&& ! lim
[-1])
861 quotearg_buffer (buf
, sizeof buf
, where0
, lim
- where
, o
);
864 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
865 _("Archive contains %.*s where numeric %s value expected"),
866 (int) sizeof buf
, buf
, type
));
872 if (value
<= (negative
? minus_minval
: maxval
))
873 return negative
? -value
: value
;
877 char minval_buf
[UINTMAX_STRSIZE_BOUND
+ 1];
878 char maxval_buf
[UINTMAX_STRSIZE_BOUND
];
879 char value_buf
[UINTMAX_STRSIZE_BOUND
+ 1];
880 char *minval_string
= STRINGIFY_BIGINT (minus_minval
, minval_buf
+ 1);
881 char *value_string
= STRINGIFY_BIGINT (value
, value_buf
+ 1);
883 *--value_string
= '-';
885 *--minval_string
= '-';
886 /* TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.) */
887 ERROR ((0, 0, _("Archive value %s is out of %s range %s..%s"),
889 minval_string
, STRINGIFY_BIGINT (maxval
, maxval_buf
)));
896 gid_from_header (const char *p
, size_t s
)
898 return from_header (p
, s
, "gid_t",
899 - (uintmax_t) TYPE_MINIMUM (gid_t
),
900 (uintmax_t) TYPE_MAXIMUM (gid_t
),
905 major_from_header (const char *p
, size_t s
)
907 return from_header (p
, s
, "major_t",
908 - (uintmax_t) TYPE_MINIMUM (major_t
),
909 (uintmax_t) TYPE_MAXIMUM (major_t
), false, false);
913 minor_from_header (const char *p
, size_t s
)
915 return from_header (p
, s
, "minor_t",
916 - (uintmax_t) TYPE_MINIMUM (minor_t
),
917 (uintmax_t) TYPE_MAXIMUM (minor_t
), false, false);
920 /* Convert P to the file mode, as understood by tar.
921 Store unrecognized mode bits (from 10th up) in HBITS. */
923 mode_from_header (const char *p
, size_t s
, unsigned *hbits
)
925 unsigned u
= from_header (p
, s
, "mode_t",
926 - (uintmax_t) TYPE_MINIMUM (mode_t
),
927 TYPE_MAXIMUM (uintmax_t), false, false);
928 mode_t mode
= ((u
& TSUID
? S_ISUID
: 0)
929 | (u
& TSGID
? S_ISGID
: 0)
930 | (u
& TSVTX
? S_ISVTX
: 0)
931 | (u
& TUREAD
? S_IRUSR
: 0)
932 | (u
& TUWRITE
? S_IWUSR
: 0)
933 | (u
& TUEXEC
? S_IXUSR
: 0)
934 | (u
& TGREAD
? S_IRGRP
: 0)
935 | (u
& TGWRITE
? S_IWGRP
: 0)
936 | (u
& TGEXEC
? S_IXGRP
: 0)
937 | (u
& TOREAD
? S_IROTH
: 0)
938 | (u
& TOWRITE
? S_IWOTH
: 0)
939 | (u
& TOEXEC
? S_IXOTH
: 0));
945 off_from_header (const char *p
, size_t s
)
947 /* Negative offsets are not allowed in tar files, so invoke
948 from_header with minimum value 0, not TYPE_MINIMUM (off_t). */
949 return from_header (p
, s
, "off_t", (uintmax_t) 0,
950 (uintmax_t) TYPE_MAXIMUM (off_t
), false, false);
954 time_from_header (const char *p
, size_t s
)
956 return from_header (p
, s
, "time_t",
957 - (uintmax_t) TYPE_MINIMUM (time_t),
958 (uintmax_t) TYPE_MAXIMUM (time_t), false, false);
962 uid_from_header (const char *p
, size_t s
)
964 return from_header (p
, s
, "uid_t",
965 - (uintmax_t) TYPE_MINIMUM (uid_t
),
966 (uintmax_t) TYPE_MAXIMUM (uid_t
), false, false);
970 uintmax_from_header (const char *p
, size_t s
)
972 return from_header (p
, s
, "uintmax_t", (uintmax_t) 0,
973 TYPE_MAXIMUM (uintmax_t), false, false);
977 /* Return a printable representation of T. The result points to
978 static storage that can be reused in the next call to this
979 function, to ctime, or to asctime. If FULL_TIME, then output the
980 time stamp to its full resolution; otherwise, just output it to
981 1-minute resolution. */
983 tartime (struct timespec t
, bool full_time
)
985 enum { fraclen
= sizeof ".FFFFFFFFF" - 1 };
986 static char buffer
[max (UINTMAX_STRSIZE_BOUND
+ 1,
987 INT_STRLEN_BOUND (int) + 16)
992 bool negative
= s
< 0;
995 if (negative
&& ns
!= 0)
998 ns
= 1000000000 - ns
;
1001 tm
= utc_option
? gmtime (&s
) : localtime (&s
);
1006 sprintf (buffer
, "%04ld-%02d-%02d %02d:%02d:%02d",
1007 tm
->tm_year
+ 1900L, tm
->tm_mon
+ 1, tm
->tm_mday
,
1008 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
1009 code_ns_fraction (ns
, buffer
+ strlen (buffer
));
1012 sprintf (buffer
, "%04ld-%02d-%02d %02d:%02d",
1013 tm
->tm_year
+ 1900L, tm
->tm_mon
+ 1, tm
->tm_mday
,
1014 tm
->tm_hour
, tm
->tm_min
);
1018 /* The time stamp cannot be broken down, most likely because it
1019 is out of range. Convert it as an integer,
1020 right-adjusted in a field with the same width as the usual
1021 4-year ISO time format. */
1022 p
= umaxtostr (negative
? - (uintmax_t) s
: s
,
1023 buffer
+ sizeof buffer
- UINTMAX_STRSIZE_BOUND
- fraclen
);
1026 while ((buffer
+ sizeof buffer
- sizeof "YYYY-MM-DD HH:MM"
1027 + (full_time
? sizeof ":SS.FFFFFFFFF" - 1 : 0))
1031 code_ns_fraction (ns
, buffer
+ sizeof buffer
- 1 - fraclen
);
1035 /* Actually print it.
1037 Plain and fancy file header block logging. Non-verbose just prints
1038 the name, e.g. for "tar t" or "tar x". This should just contain
1039 file names, so it can be fed back into tar with xargs or the "-T"
1040 option. The verbose option can give a bunch of info, one line per
1041 file. I doubt anybody tries to parse its format, or if they do,
1042 they shouldn't. Unix tar is pretty random here anyway. */
1045 /* Width of "user/group size", with initial value chosen
1046 heuristically. This grows as needed, though this may cause some
1047 stairstepping in the output. Make it too small and the output will
1048 almost always look ragged. Make it too large and the output will
1049 be spaced out too far. */
1050 static int ugswidth
= 19;
1052 /* Width of printed time stamps. It grows if longer time stamps are
1053 found (typically, those with nanosecond resolution). Like
1054 USGWIDTH, some stairstepping may occur. */
1055 static int datewidth
= sizeof "YYYY-MM-DD HH:MM" - 1;
1057 static bool volume_label_printed
= false;
1060 simple_print_header (struct tar_stat_info
*st
, union block
*blk
,
1061 off_t block_ordinal
)
1064 char const *time_stamp
;
1068 /* These hold formatted ints. */
1069 char uform
[UINTMAX_STRSIZE_BOUND
], gform
[UINTMAX_STRSIZE_BOUND
];
1071 char size
[2 * UINTMAX_STRSIZE_BOUND
];
1072 /* holds formatted size or major,minor */
1073 char uintbuf
[UINTMAX_STRSIZE_BOUND
];
1077 if (show_transformed_names_option
)
1078 temp_name
= st
->file_name
? st
->file_name
: st
->orig_file_name
;
1080 temp_name
= st
->orig_file_name
? st
->orig_file_name
: st
->file_name
;
1082 if (block_number_option
)
1084 char buf
[UINTMAX_STRSIZE_BOUND
];
1085 if (block_ordinal
< 0)
1086 block_ordinal
= current_block_ordinal ();
1087 block_ordinal
-= recent_long_name_blocks
;
1088 block_ordinal
-= recent_long_link_blocks
;
1089 fprintf (stdlis
, _("block %s: "),
1090 STRINGIFY_BIGINT (block_ordinal
, buf
));
1093 if (verbose_option
<= 1)
1095 /* Just the fax, mam. */
1096 fprintf (stdlis
, "%s\n", quotearg (temp_name
));
1100 /* File type and modes. */
1103 switch (blk
->header
.typeflag
)
1105 case GNUTYPE_VOLHDR
:
1106 volume_label_printed
= true;
1110 case GNUTYPE_MULTIVOL
:
1114 case GNUTYPE_LONGNAME
:
1115 case GNUTYPE_LONGLINK
:
1117 ERROR ((0, 0, _("Unexpected long name header")));
1120 case GNUTYPE_SPARSE
:
1124 if (temp_name
[strlen (temp_name
) - 1] == '/')
1130 case GNUTYPE_DUMPDIR
:
1153 pax_decode_mode (st
->stat
.st_mode
, modes
+ 1);
1157 time_stamp
= tartime (st
->mtime
, full_time_option
);
1158 time_stamp_len
= strlen (time_stamp
);
1159 if (datewidth
< time_stamp_len
)
1160 datewidth
= time_stamp_len
;
1162 /* User and group names. */
1166 && current_format
!= V7_FORMAT
1167 && !numeric_owner_option
)
1171 /* Try parsing it as an unsigned integer first, and as a
1172 uid_t if that fails. This method can list positive user
1173 ids that are too large to fit in a uid_t. */
1174 uintmax_t u
= from_header (blk
->header
.uid
,
1175 sizeof blk
->header
.uid
, 0,
1177 (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1180 user
= STRINGIFY_BIGINT (u
, uform
);
1183 sprintf (uform
, "%ld",
1184 (long) UID_FROM_HEADER (blk
->header
.uid
));
1191 && current_format
!= V7_FORMAT
1192 && !numeric_owner_option
)
1196 /* Try parsing it as an unsigned integer first, and as a
1197 gid_t if that fails. This method can list positive group
1198 ids that are too large to fit in a gid_t. */
1199 uintmax_t g
= from_header (blk
->header
.gid
,
1200 sizeof blk
->header
.gid
, 0,
1202 (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1205 group
= STRINGIFY_BIGINT (g
, gform
);
1208 sprintf (gform
, "%ld",
1209 (long) GID_FROM_HEADER (blk
->header
.gid
));
1214 /* Format the file size or major/minor device numbers. */
1216 switch (blk
->header
.typeflag
)
1221 STRINGIFY_BIGINT (major (st
->stat
.st_rdev
), uintbuf
));
1224 STRINGIFY_BIGINT (minor (st
->stat
.st_rdev
), uintbuf
));
1228 /* st->stat.st_size keeps stored file size */
1229 strcpy (size
, STRINGIFY_BIGINT (st
->stat
.st_size
, uintbuf
));
1233 /* Figure out padding and print the whole line. */
1235 sizelen
= strlen (size
);
1236 pad
= strlen (user
) + 1 + strlen (group
) + 1 + sizelen
;
1240 fprintf (stdlis
, "%s %s/%s %*s %-*s",
1241 modes
, user
, group
, ugswidth
- pad
+ sizelen
, size
,
1242 datewidth
, time_stamp
);
1244 fprintf (stdlis
, " %s", quotearg (temp_name
));
1246 switch (blk
->header
.typeflag
)
1249 fprintf (stdlis
, " -> %s\n", quotearg (st
->link_name
));
1253 fprintf (stdlis
, _(" link to %s\n"), quotearg (st
->link_name
));
1258 char type_string
[2];
1259 type_string
[0] = blk
->header
.typeflag
;
1260 type_string
[1] = '\0';
1261 fprintf (stdlis
, _(" unknown file type %s\n"),
1262 quote (type_string
));
1268 case GNUTYPE_SPARSE
:
1274 case GNUTYPE_DUMPDIR
:
1275 putc ('\n', stdlis
);
1278 case GNUTYPE_LONGLINK
:
1279 fprintf (stdlis
, _("--Long Link--\n"));
1282 case GNUTYPE_LONGNAME
:
1283 fprintf (stdlis
, _("--Long Name--\n"));
1286 case GNUTYPE_VOLHDR
:
1287 fprintf (stdlis
, _("--Volume Header--\n"));
1290 case GNUTYPE_MULTIVOL
:
1293 (UINTMAX_FROM_HEADER (blk
->oldgnu_header
.offset
),
1295 fprintf (stdlis
, _("--Continued at byte %s--\n"), size
);
1304 print_volume_label (void)
1306 struct tar_stat_info vstat
;
1308 enum archive_format dummy
;
1310 memset (&vblk
, 0, sizeof (vblk
));
1311 vblk
.header
.typeflag
= GNUTYPE_VOLHDR
;
1312 if (recent_global_header
)
1313 memcpy (vblk
.header
.mtime
, recent_global_header
->header
.mtime
,
1314 sizeof vblk
.header
.mtime
);
1315 tar_stat_init (&vstat
);
1316 assign_string (&vstat
.file_name
, ".");
1317 decode_header (&vblk
, &vstat
, &dummy
, 0);
1318 assign_string (&vstat
.file_name
, volume_label
);
1319 simple_print_header (&vstat
, &vblk
, 0);
1320 tar_stat_destroy (&vstat
);
1324 print_header (struct tar_stat_info
*st
, union block
*blk
,
1325 off_t block_ordinal
)
1327 if (current_format
== POSIX_FORMAT
&& !volume_label_printed
&& volume_label
)
1329 print_volume_label ();
1330 volume_label_printed
= true;
1333 simple_print_header (st
, blk
, block_ordinal
);
1336 /* Print a similar line when we make a directory automatically. */
1338 print_for_mkdir (char *dirname
, int length
, mode_t mode
)
1342 if (verbose_option
> 1)
1344 /* File type and modes. */
1347 pax_decode_mode (mode
, modes
+ 1);
1349 if (block_number_option
)
1351 char buf
[UINTMAX_STRSIZE_BOUND
];
1352 fprintf (stdlis
, _("block %s: "),
1353 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
1356 fprintf (stdlis
, "%s %*s %.*s\n", modes
, ugswidth
+ 1 + datewidth
,
1357 _("Creating directory:"), length
, quotearg (dirname
));
1361 /* Skip over SIZE bytes of data in blocks in the archive. */
1363 skip_file (off_t size
)
1367 /* FIXME: Make sure mv_begin_read is always called before it */
1369 if (seekable_archive
)
1371 off_t nblk
= seek_archive (size
);
1373 size
-= nblk
* BLOCKSIZE
;
1375 seekable_archive
= false;
1378 mv_size_left (size
);
1382 x
= find_next_block ();
1384 FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
1386 set_next_block_after (x
);
1388 mv_size_left (size
);
1392 /* Skip the current member in the archive.
1393 NOTE: Current header must be decoded before calling this function. */
1397 if (!current_stat_info
.skipped
)
1399 char save_typeflag
= current_header
->header
.typeflag
;
1400 set_next_block_after (current_header
);
1402 mv_begin_read (¤t_stat_info
);
1404 if (current_stat_info
.is_sparse
)
1405 sparse_skip_file (¤t_stat_info
);
1406 else if (save_typeflag
!= DIRTYPE
)
1407 skip_file (current_stat_info
.stat
.st_size
);
1414 test_archive_label ()
1419 open_archive (ACCESS_READ
);
1420 if (read_header (¤t_header
, ¤t_stat_info
, read_header_auto
)
1423 decode_header (current_header
,
1424 ¤t_stat_info
, ¤t_format
, 0);
1425 if (current_header
->header
.typeflag
== GNUTYPE_VOLHDR
)
1426 assign_string (&volume_label
, current_header
->header
.name
);
1431 print_volume_label ();
1432 if (!name_match (volume_label
) && multi_volume_option
)
1434 char *s
= drop_volume_label_suffix (volume_label
);