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 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 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22 /* Define to non-zero for forcing old ctime format instead of ISO format. */
30 #define max(a, b) ((a) < (b) ? (b) : (a))
32 union block
*current_header
; /* points to current archive header */
33 enum archive_format current_format
; /* recognized format */
34 union block
*recent_long_name
; /* recent long name header and contents */
35 union block
*recent_long_link
; /* likewise, for long link */
36 size_t recent_long_name_blocks
; /* number of blocks in recent_long_name */
37 size_t recent_long_link_blocks
; /* likewise, for long link */
39 static uintmax_t from_header (const char *, size_t, const char *,
40 uintmax_t, uintmax_t);
42 /* Base 64 digits; see Internet RFC 2045 Table 1. */
43 static char const base_64_digits
[64] =
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 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
48 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
49 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
52 /* Table of base-64 digit values indexed by unsigned chars.
53 The value is 64 for unsigned chars that are not base-64 digits. */
54 static char base64_map
[UCHAR_MAX
+ 1];
60 memset (base64_map
, 64, sizeof base64_map
);
61 for (i
= 0; i
< 64; i
++)
62 base64_map
[(int) base_64_digits
[i
]] = i
;
65 /* Main loop for reading an archive. */
67 read_and (void (*do_something
) (void))
69 enum read_header status
= HEADER_STILL_UNREAD
;
70 enum read_header prev_status
;
74 open_archive (ACCESS_READ
);
79 tar_stat_destroy (¤t_stat_info
);
80 xheader_destroy (&extended_header
);
82 status
= read_header (false);
85 case HEADER_STILL_UNREAD
:
86 case HEADER_SUCCESS_EXTENDED
:
91 /* Valid header. We should decode next field (mode) first.
92 Ensure incoming names are null terminated. */
94 if (! name_match (current_stat_info
.file_name
)
95 || (NEWER_OPTION_INITIALIZED (newer_mtime_option
)
96 /* FIXME: We get mtime now, and again later; this causes
97 duplicate diagnostics if header.mtime is bogus. */
98 && ((current_stat_info
.stat
.st_mtime
99 = TIME_FROM_HEADER (current_header
->header
.mtime
)),
101 /* FIXME: Grab fractional time stamps from
103 current_stat_info
.stat
.st_mtim
.ST_MTIM_NSEC
= 0,
105 OLDER_STAT_TIME (current_stat_info
.stat
, m
)))
106 || excluded_name (current_stat_info
.file_name
))
108 switch (current_header
->header
.typeflag
)
111 case GNUTYPE_MULTIVOL
:
116 if (show_omitted_dirs_option
)
117 WARN ((0, 0, _("%s: Omitting"),
118 quotearg_colon (current_stat_info
.file_name
)));
121 decode_header (current_header
,
122 ¤t_stat_info
, ¤t_format
, 0);
131 case HEADER_ZERO_BLOCK
:
132 if (block_number_option
)
134 char buf
[UINTMAX_STRSIZE_BOUND
];
135 fprintf (stdlis
, _("block %s: ** Block of NULs **\n"),
136 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
139 set_next_block_after (current_header
);
141 if (!ignore_zeros_option
)
143 char buf
[UINTMAX_STRSIZE_BOUND
];
145 status
= read_header (false);
146 if (status
== HEADER_ZERO_BLOCK
)
148 WARN ((0, 0, _("A lone zero block at %s"),
149 STRINGIFY_BIGINT (current_block_ordinal (), buf
)));
152 status
= prev_status
;
155 case HEADER_END_OF_FILE
:
156 if (block_number_option
)
158 char buf
[UINTMAX_STRSIZE_BOUND
];
159 fprintf (stdlis
, _("block %s: ** End of File **\n"),
160 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
165 /* If the previous header was good, tell them that we are
166 skipping bad ones. */
167 set_next_block_after (current_header
);
170 case HEADER_STILL_UNREAD
:
171 ERROR ((0, 0, _("This does not look like a tar archive")));
174 case HEADER_ZERO_BLOCK
:
176 if (block_number_option
)
178 char buf
[UINTMAX_STRSIZE_BOUND
];
179 off_t block_ordinal
= current_block_ordinal ();
180 block_ordinal
-= recent_long_name_blocks
;
181 block_ordinal
-= recent_long_link_blocks
;
182 fprintf (stdlis
, _("block %s: "),
183 STRINGIFY_BIGINT (block_ordinal
, buf
));
185 ERROR ((0, 0, _("Skipping to next header")));
188 case HEADER_END_OF_FILE
:
190 /* We are in the middle of a cascade of errors. */
193 case HEADER_SUCCESS_EXTENDED
:
200 while (!all_names_found (¤t_stat_info
));
203 names_notfound (); /* print names not found */
206 /* Print a header block, based on tar options. */
210 /* Print the header block. */
212 decode_header (current_header
, ¤t_stat_info
, ¤t_format
, 0);
214 print_header (¤t_stat_info
, -1);
216 if (incremental_option
&& current_header
->header
.typeflag
== GNUTYPE_DUMPDIR
)
219 size_t written
, check
;
220 union block
*data_block
;
222 set_next_block_after (current_header
);
223 if (multi_volume_option
)
225 assign_string (&save_name
, current_stat_info
.file_name
);
226 save_totsize
= current_stat_info
.stat
.st_size
;
228 for (size
= current_stat_info
.stat
.st_size
; size
> 0; size
-= written
)
230 if (multi_volume_option
)
231 save_sizeleft
= size
;
232 data_block
= find_next_block ();
235 ERROR ((0, 0, _("Unexpected EOF in archive")));
236 break; /* FIXME: What happens, then? */
238 written
= available_space_after (data_block
);
242 check
= fwrite (data_block
->buffer
, sizeof (char), written
, stdlis
);
243 set_next_block_after ((union block
*)
244 (data_block
->buffer
+ written
- 1));
245 if (check
!= written
)
247 write_error_details (current_stat_info
.file_name
, check
, written
);
248 skip_file (size
- written
);
252 if (multi_volume_option
)
253 assign_string (&save_name
, 0);
254 fputc ('\n', stdlis
);
260 if (multi_volume_option
)
261 assign_string (&save_name
, current_stat_info
.file_name
);
265 if (multi_volume_option
)
266 assign_string (&save_name
, 0);
269 /* Check header checksum */
270 /* The standard BSD tar sources create the checksum by adding up the
271 bytes in the header as type char. I think the type char was unsigned
272 on the PDP-11, but it's signed on the Next and Sun. It looks like the
273 sources to BSD tar were never changed to compute the checksum
274 correctly, so both the Sun and Next add the bytes of the header as
275 signed chars. This doesn't cause a problem until you get a file with
276 a name containing characters with the high bit set. So tar_checksum
277 computes two checksums -- signed and unsigned. */
280 tar_checksum (union block
*header
)
283 int unsigned_sum
= 0; /* the POSIX one :-) */
284 int signed_sum
= 0; /* the Sun one :-( */
286 uintmax_t parsed_sum
;
290 for (i
= sizeof *header
; i
-- != 0;)
292 unsigned_sum
+= (unsigned char) *p
;
293 signed_sum
+= (signed char) (*p
++);
296 if (unsigned_sum
== 0)
297 return HEADER_ZERO_BLOCK
;
299 /* Adjust checksum to count the "chksum" field as blanks. */
301 for (i
= sizeof header
->header
.chksum
; i
-- != 0;)
303 unsigned_sum
-= (unsigned char) header
->header
.chksum
[i
];
304 signed_sum
-= (signed char) (header
->header
.chksum
[i
]);
306 unsigned_sum
+= ' ' * sizeof header
->header
.chksum
;
307 signed_sum
+= ' ' * sizeof header
->header
.chksum
;
309 parsed_sum
= from_header (header
->header
.chksum
,
310 sizeof header
->header
.chksum
, 0,
312 (uintmax_t) TYPE_MAXIMUM (int));
313 if (parsed_sum
== (uintmax_t) -1)
314 return HEADER_FAILURE
;
316 recorded_sum
= parsed_sum
;
318 if (unsigned_sum
!= recorded_sum
&& signed_sum
!= recorded_sum
)
319 return HEADER_FAILURE
;
321 return HEADER_SUCCESS
;
324 /* Read a block that's supposed to be a header block. Return its
325 address in "current_header", and if it is good, the file's size in
326 current_stat_info.stat.st_size.
328 Return 1 for success, 0 if the checksum is bad, EOF on eof, 2 for a
329 block full of zeros (EOF marker).
331 If RAW_EXTENDED_HEADERS is nonzero, do not automagically fold the
332 GNU long name and link headers into later headers.
334 You must always set_next_block_after(current_header) to skip past
335 the header which this routine reads. */
338 read_header (bool raw_extended_headers
)
342 union block
*header_copy
;
344 union block
*data_block
;
345 size_t size
, written
;
346 union block
*next_long_name
= 0;
347 union block
*next_long_link
= 0;
348 size_t next_long_name_blocks
;
349 size_t next_long_link_blocks
;
353 enum read_header status
;
355 header
= find_next_block ();
356 current_header
= header
;
358 return HEADER_END_OF_FILE
;
360 if ((status
= tar_checksum (header
)) != HEADER_SUCCESS
)
363 /* Good block. Decode file size and return. */
365 if (header
->header
.typeflag
== LNKTYPE
)
366 current_stat_info
.stat
.st_size
= 0; /* links 0 size on tape */
368 current_stat_info
.stat
.st_size
= OFF_FROM_HEADER (header
->header
.size
);
370 if (header
->header
.typeflag
== GNUTYPE_LONGNAME
371 || header
->header
.typeflag
== GNUTYPE_LONGLINK
372 || header
->header
.typeflag
== XHDTYPE
373 || header
->header
.typeflag
== XGLTYPE
)
375 if (raw_extended_headers
)
376 return HEADER_SUCCESS_EXTENDED
;
377 else if (header
->header
.typeflag
== GNUTYPE_LONGNAME
378 || header
->header
.typeflag
== GNUTYPE_LONGLINK
)
380 size_t name_size
= current_stat_info
.stat
.st_size
;
381 size
= name_size
- name_size
% BLOCKSIZE
+ 2 * BLOCKSIZE
;
382 if (name_size
!= current_stat_info
.stat
.st_size
386 header_copy
= xmalloc (size
+ 1);
388 if (header
->header
.typeflag
== GNUTYPE_LONGNAME
)
391 free (next_long_name
);
392 next_long_name
= header_copy
;
393 next_long_name_blocks
= size
/ BLOCKSIZE
;
398 free (next_long_link
);
399 next_long_link
= header_copy
;
400 next_long_link_blocks
= size
/ BLOCKSIZE
;
403 set_next_block_after (header
);
404 *header_copy
= *header
;
405 bp
= header_copy
->buffer
+ BLOCKSIZE
;
407 for (size
-= BLOCKSIZE
; size
> 0; size
-= written
)
409 data_block
= find_next_block ();
412 ERROR ((0, 0, _("Unexpected EOF in archive")));
415 written
= available_space_after (data_block
);
419 memcpy (bp
, data_block
->buffer
, written
);
421 set_next_block_after ((union block
*)
422 (data_block
->buffer
+ written
- 1));
427 else if (header
->header
.typeflag
== XHDTYPE
)
428 xheader_read (header
, OFF_FROM_HEADER (header
->header
.size
));
429 else if (header
->header
.typeflag
== XGLTYPE
)
431 xheader_read (header
, OFF_FROM_HEADER (header
->header
.size
));
432 xheader_decode_global ();
441 struct posix_header
const *h
= ¤t_header
->header
;
442 char namebuf
[sizeof h
->prefix
+ 1 + NAME_FIELD_SIZE
+ 1];
444 if (recent_long_name
)
445 free (recent_long_name
);
449 name
= next_long_name
->buffer
+ BLOCKSIZE
;
450 recent_long_name
= next_long_name
;
451 recent_long_name_blocks
= next_long_name_blocks
;
455 /* Accept file names as specified by POSIX.1-1996
459 if (h
->prefix
[0] && strcmp (h
->magic
, TMAGIC
) == 0)
461 memcpy (np
, h
->prefix
, sizeof h
->prefix
);
462 np
[sizeof h
->prefix
] = '\0';
466 /* Prevent later references to current_header from
467 mistakenly treating this as an old GNU header.
468 This assignment invalidates h->prefix. */
469 current_header
->oldgnu_header
.isextended
= 0;
471 memcpy (np
, h
->name
, sizeof h
->name
);
472 np
[sizeof h
->name
] = '\0';
474 recent_long_name
= 0;
475 recent_long_name_blocks
= 0;
477 assign_string (¤t_stat_info
.orig_file_name
, name
);
478 assign_string (¤t_stat_info
.file_name
, name
);
479 current_stat_info
.had_trailing_slash
= strip_trailing_slashes (current_stat_info
.file_name
);
481 if (recent_long_link
)
482 free (recent_long_link
);
486 name
= next_long_link
->buffer
+ BLOCKSIZE
;
487 recent_long_link
= next_long_link
;
488 recent_long_link_blocks
= next_long_link_blocks
;
492 memcpy (namebuf
, h
->linkname
, sizeof h
->linkname
);
493 namebuf
[sizeof h
->linkname
] = '\0';
495 recent_long_link
= 0;
496 recent_long_link_blocks
= 0;
498 assign_string (¤t_stat_info
.link_name
, name
);
500 return HEADER_SUCCESS
;
505 #define ISOCTAL(c) ((c)>='0'&&(c)<='7')
507 /* Decode things from a file HEADER block into STAT_INFO, also setting
508 *FORMAT_POINTER depending on the header block format. If
509 DO_USER_GROUP, decode the user/group information (this is useful
510 for extraction, but waste time when merely listing).
512 read_header() has already decoded the checksum and length, so we don't.
514 This routine should *not* be called twice for the same block, since
515 the two calls might use different DO_USER_GROUP values and thus
516 might end up with different uid/gid for the two calls. If anybody
517 wants the uid/gid they should decode it first, and other callers
518 should decode it without uid/gid before calling a routine,
519 e.g. print_header, that assumes decoded data. */
521 decode_header (union block
*header
, struct tar_stat_info
*stat_info
,
522 enum archive_format
*format_pointer
, int do_user_group
)
524 enum archive_format format
;
526 if (strcmp (header
->header
.magic
, TMAGIC
) == 0)
528 if (header
->star_header
.prefix
[130] == 0
529 && ISOCTAL (header
->star_header
.atime
[0])
530 && header
->star_header
.atime
[11] == ' '
531 && ISOCTAL (header
->star_header
.ctime
[0])
532 && header
->star_header
.ctime
[11] == ' ')
533 format
= STAR_FORMAT
;
534 else if (extended_header
.size
)
535 format
= POSIX_FORMAT
;
537 format
= USTAR_FORMAT
;
539 else if (strcmp (header
->header
.magic
, OLDGNU_MAGIC
) == 0)
540 format
= OLDGNU_FORMAT
;
543 *format_pointer
= format
;
545 stat_info
->stat
.st_mode
= MODE_FROM_HEADER (header
->header
.mode
);
546 stat_info
->stat
.st_mtime
= TIME_FROM_HEADER (header
->header
.mtime
);
547 assign_string (&stat_info
->uname
,
548 header
->header
.uname
[0] ? header
->header
.uname
: NULL
);
549 assign_string (&stat_info
->gname
,
550 header
->header
.gname
[0] ? header
->header
.gname
: NULL
);
551 stat_info
->devmajor
= MAJOR_FROM_HEADER (header
->header
.devmajor
);
552 stat_info
->devminor
= MINOR_FROM_HEADER (header
->header
.devminor
);
554 stat_info
->stat
.st_atime
= start_time
;
555 stat_info
->stat
.st_ctime
= start_time
;
557 if (format
== OLDGNU_FORMAT
&& incremental_option
)
559 stat_info
->stat
.st_atime
= TIME_FROM_HEADER (header
->oldgnu_header
.atime
);
560 stat_info
->stat
.st_ctime
= TIME_FROM_HEADER (header
->oldgnu_header
.ctime
);
563 if (format
== V7_FORMAT
)
565 stat_info
->stat
.st_uid
= UID_FROM_HEADER (header
->header
.uid
);
566 stat_info
->stat
.st_gid
= GID_FROM_HEADER (header
->header
.gid
);
567 stat_info
->stat
.st_rdev
= 0;
572 if (format
== STAR_FORMAT
)
574 stat_info
->stat
.st_atime
= TIME_FROM_HEADER (header
->star_header
.atime
);
575 stat_info
->stat
.st_ctime
= TIME_FROM_HEADER (header
->star_header
.ctime
);
580 /* FIXME: Decide if this should somewhat depend on -p. */
582 if (numeric_owner_option
583 || !*header
->header
.uname
584 || !uname_to_uid (header
->header
.uname
, &stat_info
->stat
.st_uid
))
585 stat_info
->stat
.st_uid
= UID_FROM_HEADER (header
->header
.uid
);
587 if (numeric_owner_option
588 || !*header
->header
.gname
589 || !gname_to_gid (header
->header
.gname
, &stat_info
->stat
.st_gid
))
590 stat_info
->stat
.st_gid
= GID_FROM_HEADER (header
->header
.gid
);
593 switch (header
->header
.typeflag
)
597 stat_info
->stat
.st_rdev
= makedev (stat_info
->devmajor
,
598 stat_info
->devminor
);
602 stat_info
->stat
.st_rdev
= 0;
606 stat_info
->archive_file_size
= stat_info
->stat
.st_size
;
607 xheader_decode (stat_info
);
609 if (sparse_member_p (stat_info
))
611 sparse_fixup_header (stat_info
);
612 stat_info
->is_sparse
= true;
615 stat_info
->is_sparse
= false;
618 /* Convert buffer at WHERE0 of size DIGS from external format to
619 uintmax_t. The data is of type TYPE. The buffer must represent a
620 value in the range -MINUS_MINVAL through MAXVAL. DIGS must be
621 positive. Return -1 on error, diagnosing the error if TYPE is
624 from_header (char const *where0
, size_t digs
, char const *type
,
625 uintmax_t minus_minval
, uintmax_t maxval
)
628 char const *where
= where0
;
629 char const *lim
= where
+ digs
;
632 /* Accommodate buggy tar of unknown vintage, which outputs leading
633 NUL if the previous field overflows. */
636 /* Accommodate older tars, which output leading spaces. */
643 _("Blanks in header where numeric %s value expected"),
647 if (!ISSPACE ((unsigned char) *where
))
653 if (ISODIGIT (*where
))
655 char const *where1
= where
;
656 uintmax_t overflow
= 0;
660 value
+= *where
++ - '0';
661 if (where
== lim
|| ! ISODIGIT (*where
))
663 overflow
|= value
^ (value
<< LG_8
>> LG_8
);
667 /* Parse the output of older, unportable tars, which generate
668 negative values in two's complement octal. If the leading
669 nonzero digit is 1, we can't recover the original value
670 reliably; so do this only if the digit is 2 or more. This
671 catches the common case of 32-bit negative time stamps. */
672 if ((overflow
|| maxval
< value
) && '2' <= *where1
&& type
)
674 /* Compute the negative of the input value, assuming two's
676 int digit
= (*where1
- '0') | 4;
684 if (where
== lim
|| ! ISODIGIT (*where
))
686 digit
= *where
- '0';
687 overflow
|= value
^ (value
<< LG_8
>> LG_8
);
693 if (!overflow
&& value
<= minus_minval
)
696 _("Archive octal value %.*s is out of %s range; assuming two's complement"),
697 (int) (where
- where1
), where1
, type
));
706 _("Archive octal value %.*s is out of %s range"),
707 (int) (where
- where1
), where1
, type
));
711 else if (*where
== '-' || *where
== '+')
713 /* Parse base-64 output produced only by tar test versions
714 1.13.6 (1999-08-11) through 1.13.11 (1999-08-23).
715 Support for this will be withdrawn in future releases. */
717 static int warned_once
;
722 _("Archive contains obsolescent base-64 headers")));
724 negative
= *where
++ == '-';
726 && (dig
= base64_map
[(unsigned char) *where
]) < 64)
728 if (value
<< LG_64
>> LG_64
!= value
)
730 char *string
= alloca (digs
+ 1);
731 memcpy (string
, where0
, digs
);
735 _("Archive signed base-64 string %s is out of %s range"),
736 quote (string
), type
));
739 value
= (value
<< LG_64
) | dig
;
743 else if (*where
== '\200' /* positive base-256 */
744 || *where
== '\377' /* negative base-256 */)
746 /* Parse base-256 output. A nonnegative number N is
747 represented as (256**DIGS)/2 + N; a negative number -N is
748 represented as (256**DIGS) - N, i.e. as two's complement.
749 The representation guarantees that the leading bit is
750 always on, so that we don't confuse this format with the
751 others (assuming ASCII bytes of 8 bits or more). */
752 int signbit
= *where
& (1 << (LG_256
- 2));
753 uintmax_t topbits
= (((uintmax_t) - signbit
)
754 << (CHAR_BIT
* sizeof (uintmax_t)
755 - LG_256
- (LG_256
- 2)));
756 value
= (*where
++ & ((1 << (LG_256
- 2)) - 1)) - signbit
;
759 value
= (value
<< LG_256
) + (unsigned char) *where
++;
762 if (((value
<< LG_256
>> LG_256
) | topbits
) != value
)
766 _("Archive base-256 value is out of %s range"),
776 if (where
!= lim
&& *where
&& !ISSPACE ((unsigned char) *where
))
780 char buf
[1000]; /* Big enough to represent any header. */
781 static struct quoting_options
*o
;
785 o
= clone_quoting_options (0);
786 set_quoting_style (o
, locale_quoting_style
);
789 while (where0
!= lim
&& ! lim
[-1])
791 quotearg_buffer (buf
, sizeof buf
, where0
, lim
- where
, o
);
793 _("Archive contains %.*s where numeric %s value expected"),
794 (int) sizeof buf
, buf
, type
));
800 if (value
<= (negative
? minus_minval
: maxval
))
801 return negative
? -value
: value
;
805 char minval_buf
[UINTMAX_STRSIZE_BOUND
+ 1];
806 char maxval_buf
[UINTMAX_STRSIZE_BOUND
];
807 char value_buf
[UINTMAX_STRSIZE_BOUND
+ 1];
808 char *minval_string
= STRINGIFY_BIGINT (minus_minval
, minval_buf
+ 1);
809 char *value_string
= STRINGIFY_BIGINT (value
, value_buf
+ 1);
811 *--value_string
= '-';
813 *--minval_string
= '-';
814 ERROR ((0, 0, _("Archive value %s is out of %s range %s.%s"),
816 minval_string
, STRINGIFY_BIGINT (maxval
, maxval_buf
)));
823 gid_from_header (const char *p
, size_t s
)
825 return from_header (p
, s
, "gid_t",
826 - (uintmax_t) TYPE_MINIMUM (gid_t
),
827 (uintmax_t) TYPE_MAXIMUM (gid_t
));
831 major_from_header (const char *p
, size_t s
)
833 return from_header (p
, s
, "major_t",
834 - (uintmax_t) TYPE_MINIMUM (major_t
),
835 (uintmax_t) TYPE_MAXIMUM (major_t
));
839 minor_from_header (const char *p
, size_t s
)
841 return from_header (p
, s
, "minor_t",
842 - (uintmax_t) TYPE_MINIMUM (minor_t
),
843 (uintmax_t) TYPE_MAXIMUM (minor_t
));
847 mode_from_header (const char *p
, size_t s
)
849 /* Do not complain about unrecognized mode bits. */
850 unsigned u
= from_header (p
, s
, "mode_t",
851 - (uintmax_t) TYPE_MINIMUM (mode_t
),
852 TYPE_MAXIMUM (uintmax_t));
853 return ((u
& TSUID
? S_ISUID
: 0)
854 | (u
& TSGID
? S_ISGID
: 0)
855 | (u
& TSVTX
? S_ISVTX
: 0)
856 | (u
& TUREAD
? S_IRUSR
: 0)
857 | (u
& TUWRITE
? S_IWUSR
: 0)
858 | (u
& TUEXEC
? S_IXUSR
: 0)
859 | (u
& TGREAD
? S_IRGRP
: 0)
860 | (u
& TGWRITE
? S_IWGRP
: 0)
861 | (u
& TGEXEC
? S_IXGRP
: 0)
862 | (u
& TOREAD
? S_IROTH
: 0)
863 | (u
& TOWRITE
? S_IWOTH
: 0)
864 | (u
& TOEXEC
? S_IXOTH
: 0));
868 off_from_header (const char *p
, size_t s
)
870 /* Negative offsets are not allowed in tar files, so invoke
871 from_header with minimum value 0, not TYPE_MINIMUM (off_t). */
872 return from_header (p
, s
, "off_t", (uintmax_t) 0,
873 (uintmax_t) TYPE_MAXIMUM (off_t
));
877 size_from_header (const char *p
, size_t s
)
879 return from_header (p
, s
, "size_t", (uintmax_t) 0,
880 (uintmax_t) TYPE_MAXIMUM (size_t));
884 time_from_header (const char *p
, size_t s
)
886 return from_header (p
, s
, "time_t",
887 - (uintmax_t) TYPE_MINIMUM (time_t),
888 (uintmax_t) TYPE_MAXIMUM (time_t));
892 uid_from_header (const char *p
, size_t s
)
894 return from_header (p
, s
, "uid_t",
895 - (uintmax_t) TYPE_MINIMUM (uid_t
),
896 (uintmax_t) TYPE_MAXIMUM (uid_t
));
900 uintmax_from_header (const char *p
, size_t s
)
902 return from_header (p
, s
, "uintmax_t", (uintmax_t) 0,
903 TYPE_MAXIMUM (uintmax_t));
907 /* Format O as a null-terminated decimal string into BUF _backwards_;
908 return pointer to start of result. */
910 stringify_uintmax_t_backwards (uintmax_t o
, char *buf
)
914 *--buf
= '0' + (int) (o
% 10);
915 while ((o
/= 10) != 0);
919 /* Return a printable representation of T. The result points to
920 static storage that can be reused in the next call to this
921 function, to ctime, or to asctime. */
925 static char buffer
[max (UINTMAX_STRSIZE_BOUND
+ 1,
926 INT_STRLEN_BOUND (int) + 16)];
933 char const *time_stamp
= p
+ 4;
934 for (p
+= 16; p
[3] != '\n'; p
++)
940 /* Use ISO 8610 format. See:
941 http://www.cl.cam.ac.uk/~mgk25/iso-time.html */
942 struct tm
*tm
= utc_option
? gmtime (&t
) : localtime (&t
);
945 sprintf (buffer
, "%04ld-%02d-%02d %02d:%02d:%02d",
946 tm
->tm_year
+ 1900L, tm
->tm_mon
+ 1, tm
->tm_mday
,
947 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
952 /* The time stamp cannot be broken down, most likely because it
953 is out of range. Convert it as an integer,
954 right-adjusted in a field with the same width as the usual
955 19-byte 4-year ISO time format. */
956 p
= stringify_uintmax_t_backwards (t
< 0 ? - (uintmax_t) t
: (uintmax_t) t
,
957 buffer
+ sizeof buffer
);
960 while (buffer
+ sizeof buffer
- 19 - 1 < p
)
965 /* Actually print it.
967 Plain and fancy file header block logging. Non-verbose just prints
968 the name, e.g. for "tar t" or "tar x". This should just contain
969 file names, so it can be fed back into tar with xargs or the "-T"
970 option. The verbose option can give a bunch of info, one line per
971 file. I doubt anybody tries to parse its format, or if they do,
972 they shouldn't. Unix tar is pretty random here anyway. */
975 /* FIXME: Note that print_header uses the globals HEAD, HSTAT, and
976 HEAD_STANDARD, which must be set up in advance. Not very clean.. */
978 /* UGSWIDTH starts with 18, so with user and group names <= 8 chars, the
979 columns never shift during the listing. */
981 static int ugswidth
= UGSWIDTH
; /* maximum width encountered so far */
983 /* DATEWIDTH is the number of columns taken by the date and time fields. */
985 # define DATEWIDTH 19
987 # define DATEWIDTH 18
991 print_header (struct tar_stat_info
*st
, off_t block_ordinal
)
994 char const *time_stamp
;
995 char *temp_name
= st
->orig_file_name
? st
->orig_file_name
: st
->file_name
;
997 /* These hold formatted ints. */
998 char uform
[UINTMAX_STRSIZE_BOUND
], gform
[UINTMAX_STRSIZE_BOUND
];
1000 char size
[2 * UINTMAX_STRSIZE_BOUND
];
1001 /* holds formatted size or major,minor */
1002 char uintbuf
[UINTMAX_STRSIZE_BOUND
];
1005 if (block_number_option
)
1007 char buf
[UINTMAX_STRSIZE_BOUND
];
1008 if (block_ordinal
< 0)
1009 block_ordinal
= current_block_ordinal ();
1010 block_ordinal
-= recent_long_name_blocks
;
1011 block_ordinal
-= recent_long_link_blocks
;
1012 fprintf (stdlis
, _("block %s: "),
1013 STRINGIFY_BIGINT (block_ordinal
, buf
));
1016 if (verbose_option
<= 1)
1018 /* Just the fax, mam. */
1019 fprintf (stdlis
, "%s\n", quotearg (temp_name
));
1023 /* File type and modes. */
1026 switch (current_header
->header
.typeflag
)
1028 case GNUTYPE_VOLHDR
:
1032 case GNUTYPE_MULTIVOL
:
1040 case GNUTYPE_LONGNAME
:
1041 case GNUTYPE_LONGLINK
:
1043 ERROR ((0, 0, _("Visible longname error")));
1046 case GNUTYPE_SPARSE
:
1050 if (temp_name
[strlen (temp_name
) - 1] == '/')
1056 case GNUTYPE_DUMPDIR
:
1079 decode_mode (st
->stat
.st_mode
, modes
+ 1);
1083 time_stamp
= tartime (st
->stat
.st_mtime
);
1085 /* User and group names. */
1087 if (st
->uname
&& current_format
!= V7_FORMAT
1088 && !numeric_owner_option
)
1092 /* Try parsing it as an unsigned integer first, and as a
1093 uid_t if that fails. This method can list positive user
1094 ids that are too large to fit in a uid_t. */
1095 uintmax_t u
= from_header (current_header
->header
.uid
,
1096 sizeof current_header
->header
.uid
, 0,
1098 (uintmax_t) TYPE_MAXIMUM (uintmax_t));
1100 user
= STRINGIFY_BIGINT (u
, uform
);
1103 sprintf (uform
, "%ld",
1104 (long) UID_FROM_HEADER (current_header
->header
.uid
));
1109 if (st
->gname
&& current_format
!= V7_FORMAT
1110 && !numeric_owner_option
)
1114 /* Try parsing it as an unsigned integer first, and as a
1115 gid_t if that fails. This method can list positive group
1116 ids that are too large to fit in a gid_t. */
1117 uintmax_t g
= from_header (current_header
->header
.gid
,
1118 sizeof current_header
->header
.gid
, 0,
1120 (uintmax_t) TYPE_MAXIMUM (uintmax_t));
1122 group
= STRINGIFY_BIGINT (g
, gform
);
1125 sprintf (gform
, "%ld",
1126 (long) GID_FROM_HEADER (current_header
->header
.gid
));
1131 /* Format the file size or major/minor device numbers. */
1133 switch (current_header
->header
.typeflag
)
1138 STRINGIFY_BIGINT (major (st
->stat
.st_rdev
), uintbuf
));
1141 STRINGIFY_BIGINT (minor (st
->stat
.st_rdev
), uintbuf
));
1145 /* st->stat.st_size keeps stored file size */
1146 strcpy (size
, STRINGIFY_BIGINT (st
->stat
.st_size
, uintbuf
));
1150 /* Figure out padding and print the whole line. */
1152 pad
= strlen (user
) + strlen (group
) + strlen (size
) + 1;
1156 fprintf (stdlis
, "%s %s/%s %*s%s %s",
1157 modes
, user
, group
, ugswidth
- pad
, "", size
, time_stamp
);
1159 fprintf (stdlis
, " %s", quotearg (temp_name
));
1161 switch (current_header
->header
.typeflag
)
1164 fprintf (stdlis
, " -> %s\n", quotearg (st
->link_name
));
1168 fprintf (stdlis
, _(" link to %s\n"), quotearg (st
->link_name
));
1173 char type_string
[2];
1174 type_string
[0] = current_header
->header
.typeflag
;
1175 type_string
[1] = '\0';
1176 fprintf (stdlis
, _(" unknown file type %s\n"),
1177 quote (type_string
));
1183 case GNUTYPE_SPARSE
:
1189 case GNUTYPE_DUMPDIR
:
1190 putc ('\n', stdlis
);
1193 case GNUTYPE_LONGLINK
:
1194 fprintf (stdlis
, _("--Long Link--\n"));
1197 case GNUTYPE_LONGNAME
:
1198 fprintf (stdlis
, _("--Long Name--\n"));
1201 case GNUTYPE_VOLHDR
:
1202 fprintf (stdlis
, _("--Volume Header--\n"));
1205 case GNUTYPE_MULTIVOL
:
1208 (UINTMAX_FROM_HEADER (current_header
->oldgnu_header
.offset
),
1210 fprintf (stdlis
, _("--Continued at byte %s--\n"), size
);
1214 fprintf (stdlis
, _("--Mangled file names--\n"));
1221 /* Print a similar line when we make a directory automatically. */
1223 print_for_mkdir (char *dirname
, int length
, mode_t mode
)
1227 if (verbose_option
> 1)
1229 /* File type and modes. */
1232 decode_mode (mode
, modes
+ 1);
1234 if (block_number_option
)
1236 char buf
[UINTMAX_STRSIZE_BOUND
];
1237 fprintf (stdlis
, _("block %s: "),
1238 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
1241 fprintf (stdlis
, "%s %*s %.*s\n", modes
, ugswidth
+ DATEWIDTH
,
1242 _("Creating directory:"), length
, quotearg (dirname
));
1246 /* Skip over SIZE bytes of data in blocks in the archive. */
1248 skip_file (off_t size
)
1252 if (multi_volume_option
)
1254 save_totsize
= size
;
1255 save_sizeleft
= size
;
1258 if (seekable_archive
)
1260 off_t nblk
= seek_archive (size
);
1263 size
-= nblk
* BLOCKSIZE
;
1264 if (multi_volume_option
) /* Argh.. */
1265 save_sizeleft
-= nblk
* BLOCKSIZE
;
1268 seekable_archive
= false;
1273 x
= find_next_block ();
1275 FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
1277 set_next_block_after (x
);
1279 if (multi_volume_option
)
1280 save_sizeleft
-= BLOCKSIZE
;
1284 /* Skip the current member in the archive.
1285 NOTE: Current header must be decoded before calling this function. */
1289 char save_typeflag
= current_header
->header
.typeflag
;
1290 set_next_block_after (current_header
);
1292 assign_string (&save_name
, current_stat_info
.file_name
);
1294 if (current_stat_info
.is_sparse
)
1295 sparse_skip_file (¤t_stat_info
);
1296 else if (save_typeflag
!= DIRTYPE
)
1297 skip_file (current_stat_info
.stat
.st_size
);