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 /* Read a block that's supposed to be a header block. Return its
270 address in "current_header", and if it is good, the file's size in
271 current_stat_info.stat.st_size.
273 Return 1 for success, 0 if the checksum is bad, EOF on eof, 2 for a
274 block full of zeros (EOF marker).
276 If RAW_EXTENDED_HEADERS is nonzero, do not automagically fold the
277 GNU long name and link headers into later headers.
279 You must always set_next_block_after(current_header) to skip past
280 the header which this routine reads. */
282 /* The standard BSD tar sources create the checksum by adding up the
283 bytes in the header as type char. I think the type char was unsigned
284 on the PDP-11, but it's signed on the Next and Sun. It looks like the
285 sources to BSD tar were never changed to compute the checksum
286 correctly, so both the Sun and Next add the bytes of the header as
287 signed chars. This doesn't cause a problem until you get a file with
288 a name containing characters with the high bit set. So read_header
289 computes two checksums -- signed and unsigned. */
292 read_header (bool raw_extended_headers
)
295 int unsigned_sum
; /* the POSIX one :-) */
296 int signed_sum
; /* the Sun one :-( */
298 uintmax_t parsed_sum
;
301 union block
*header_copy
;
303 union block
*data_block
;
304 size_t size
, written
;
305 union block
*next_long_name
= 0;
306 union block
*next_long_link
= 0;
307 size_t next_long_name_blocks
;
308 size_t next_long_link_blocks
;
312 header
= find_next_block ();
313 current_header
= header
;
315 return HEADER_END_OF_FILE
;
320 for (i
= sizeof *header
; i
-- != 0;)
322 unsigned_sum
+= (unsigned char) *p
;
323 signed_sum
+= (signed char) (*p
++);
326 if (unsigned_sum
== 0)
327 return HEADER_ZERO_BLOCK
;
329 /* Adjust checksum to count the "chksum" field as blanks. */
331 for (i
= sizeof header
->header
.chksum
; i
-- != 0;)
333 unsigned_sum
-= (unsigned char) header
->header
.chksum
[i
];
334 signed_sum
-= (signed char) (header
->header
.chksum
[i
]);
336 unsigned_sum
+= ' ' * sizeof header
->header
.chksum
;
337 signed_sum
+= ' ' * sizeof header
->header
.chksum
;
339 parsed_sum
= from_header (header
->header
.chksum
,
340 sizeof header
->header
.chksum
, 0,
342 (uintmax_t) TYPE_MAXIMUM (int));
343 if (parsed_sum
== (uintmax_t) -1)
344 return HEADER_FAILURE
;
346 recorded_sum
= parsed_sum
;
348 if (unsigned_sum
!= recorded_sum
&& signed_sum
!= recorded_sum
)
349 return HEADER_FAILURE
;
351 /* Good block. Decode file size and return. */
353 if (header
->header
.typeflag
== LNKTYPE
)
354 current_stat_info
.stat
.st_size
= 0; /* links 0 size on tape */
356 current_stat_info
.stat
.st_size
= OFF_FROM_HEADER (header
->header
.size
);
358 if (header
->header
.typeflag
== GNUTYPE_LONGNAME
359 || header
->header
.typeflag
== GNUTYPE_LONGLINK
360 || header
->header
.typeflag
== XHDTYPE
361 || header
->header
.typeflag
== XGLTYPE
)
363 if (raw_extended_headers
)
364 return HEADER_SUCCESS_EXTENDED
;
365 else if (header
->header
.typeflag
== GNUTYPE_LONGNAME
366 || header
->header
.typeflag
== GNUTYPE_LONGLINK
)
368 size_t name_size
= current_stat_info
.stat
.st_size
;
369 size
= name_size
- name_size
% BLOCKSIZE
+ 2 * BLOCKSIZE
;
370 if (name_size
!= current_stat_info
.stat
.st_size
374 header_copy
= xmalloc (size
+ 1);
376 if (header
->header
.typeflag
== GNUTYPE_LONGNAME
)
379 free (next_long_name
);
380 next_long_name
= header_copy
;
381 next_long_name_blocks
= size
/ BLOCKSIZE
;
386 free (next_long_link
);
387 next_long_link
= header_copy
;
388 next_long_link_blocks
= size
/ BLOCKSIZE
;
391 set_next_block_after (header
);
392 *header_copy
= *header
;
393 bp
= header_copy
->buffer
+ BLOCKSIZE
;
395 for (size
-= BLOCKSIZE
; size
> 0; size
-= written
)
397 data_block
= find_next_block ();
400 ERROR ((0, 0, _("Unexpected EOF in archive")));
403 written
= available_space_after (data_block
);
407 memcpy (bp
, data_block
->buffer
, written
);
409 set_next_block_after ((union block
*)
410 (data_block
->buffer
+ written
- 1));
415 else if (header
->header
.typeflag
== XHDTYPE
)
416 xheader_read (header
, OFF_FROM_HEADER (header
->header
.size
));
417 else if (header
->header
.typeflag
== XGLTYPE
)
419 xheader_read (header
, OFF_FROM_HEADER (header
->header
.size
));
420 xheader_decode_global ();
429 struct posix_header
const *h
= ¤t_header
->header
;
430 char namebuf
[sizeof h
->prefix
+ 1 + NAME_FIELD_SIZE
+ 1];
432 if (recent_long_name
)
433 free (recent_long_name
);
437 name
= next_long_name
->buffer
+ BLOCKSIZE
;
438 recent_long_name
= next_long_name
;
439 recent_long_name_blocks
= next_long_name_blocks
;
443 /* Accept file names as specified by POSIX.1-1996
447 if (h
->prefix
[0] && strcmp (h
->magic
, TMAGIC
) == 0)
449 memcpy (np
, h
->prefix
, sizeof h
->prefix
);
450 np
[sizeof h
->prefix
] = '\0';
454 /* Prevent later references to current_header from
455 mistakenly treating this as an old GNU header.
456 This assignment invalidates h->prefix. */
457 current_header
->oldgnu_header
.isextended
= 0;
459 memcpy (np
, h
->name
, sizeof h
->name
);
460 np
[sizeof h
->name
] = '\0';
462 recent_long_name
= 0;
463 recent_long_name_blocks
= 0;
465 assign_string (¤t_stat_info
.orig_file_name
, name
);
466 assign_string (¤t_stat_info
.file_name
, name
);
467 current_stat_info
.had_trailing_slash
= strip_trailing_slashes (current_stat_info
.file_name
);
469 if (recent_long_link
)
470 free (recent_long_link
);
474 name
= next_long_link
->buffer
+ BLOCKSIZE
;
475 recent_long_link
= next_long_link
;
476 recent_long_link_blocks
= next_long_link_blocks
;
480 memcpy (namebuf
, h
->linkname
, sizeof h
->linkname
);
481 namebuf
[sizeof h
->linkname
] = '\0';
483 recent_long_link
= 0;
484 recent_long_link_blocks
= 0;
486 assign_string (¤t_stat_info
.link_name
, name
);
488 return HEADER_SUCCESS
;
493 #define ISOCTAL(c) ((c)>='0'&&(c)<='7')
495 /* Decode things from a file HEADER block into STAT_INFO, also setting
496 *FORMAT_POINTER depending on the header block format. If
497 DO_USER_GROUP, decode the user/group information (this is useful
498 for extraction, but waste time when merely listing).
500 read_header() has already decoded the checksum and length, so we don't.
502 This routine should *not* be called twice for the same block, since
503 the two calls might use different DO_USER_GROUP values and thus
504 might end up with different uid/gid for the two calls. If anybody
505 wants the uid/gid they should decode it first, and other callers
506 should decode it without uid/gid before calling a routine,
507 e.g. print_header, that assumes decoded data. */
509 decode_header (union block
*header
, struct tar_stat_info
*stat_info
,
510 enum archive_format
*format_pointer
, int do_user_group
)
512 enum archive_format format
;
514 if (strcmp (header
->header
.magic
, TMAGIC
) == 0)
516 if (header
->star_header
.prefix
[130] == 0
517 && ISOCTAL (header
->star_header
.atime
[0])
518 && header
->star_header
.atime
[11] == ' '
519 && ISOCTAL (header
->star_header
.ctime
[0])
520 && header
->star_header
.ctime
[11] == ' ')
521 format
= STAR_FORMAT
;
522 else if (extended_header
.size
)
523 format
= POSIX_FORMAT
;
525 format
= USTAR_FORMAT
;
527 else if (strcmp (header
->header
.magic
, OLDGNU_MAGIC
) == 0)
528 format
= OLDGNU_FORMAT
;
531 *format_pointer
= format
;
533 stat_info
->stat
.st_mode
= MODE_FROM_HEADER (header
->header
.mode
);
534 stat_info
->stat
.st_mtime
= TIME_FROM_HEADER (header
->header
.mtime
);
535 assign_string (&stat_info
->uname
, header
->header
.uname
);
536 assign_string (&stat_info
->gname
, header
->header
.gname
);
537 stat_info
->devmajor
= MAJOR_FROM_HEADER (header
->header
.devmajor
);
538 stat_info
->devminor
= MINOR_FROM_HEADER (header
->header
.devminor
);
540 stat_info
->stat
.st_atime
= start_time
;
541 stat_info
->stat
.st_ctime
= start_time
;
543 if (format
== OLDGNU_FORMAT
&& incremental_option
)
545 stat_info
->stat
.st_atime
= TIME_FROM_HEADER (header
->oldgnu_header
.atime
);
546 stat_info
->stat
.st_ctime
= TIME_FROM_HEADER (header
->oldgnu_header
.ctime
);
549 if (format
== V7_FORMAT
)
551 stat_info
->stat
.st_uid
= UID_FROM_HEADER (header
->header
.uid
);
552 stat_info
->stat
.st_gid
= GID_FROM_HEADER (header
->header
.gid
);
553 stat_info
->stat
.st_rdev
= 0;
558 if (format
== STAR_FORMAT
)
560 stat_info
->stat
.st_atime
= TIME_FROM_HEADER (header
->star_header
.atime
);
561 stat_info
->stat
.st_ctime
= TIME_FROM_HEADER (header
->star_header
.ctime
);
566 /* FIXME: Decide if this should somewhat depend on -p. */
568 if (numeric_owner_option
569 || !*header
->header
.uname
570 || !uname_to_uid (header
->header
.uname
, &stat_info
->stat
.st_uid
))
571 stat_info
->stat
.st_uid
= UID_FROM_HEADER (header
->header
.uid
);
573 if (numeric_owner_option
574 || !*header
->header
.gname
575 || !gname_to_gid (header
->header
.gname
, &stat_info
->stat
.st_gid
))
576 stat_info
->stat
.st_gid
= GID_FROM_HEADER (header
->header
.gid
);
579 switch (header
->header
.typeflag
)
583 stat_info
->stat
.st_rdev
= makedev (stat_info
->devmajor
,
584 stat_info
->devminor
);
588 stat_info
->stat
.st_rdev
= 0;
592 stat_info
->archive_file_size
= stat_info
->stat
.st_size
;
593 xheader_decode (stat_info
);
595 if (sparse_member_p (stat_info
))
597 sparse_fixup_header (stat_info
);
598 stat_info
->is_sparse
= true;
602 /* Convert buffer at WHERE0 of size DIGS from external format to
603 uintmax_t. The data is of type TYPE. The buffer must represent a
604 value in the range -MINUS_MINVAL through MAXVAL. DIGS must be
605 positive. Return -1 on error, diagnosing the error if TYPE is
608 from_header (char const *where0
, size_t digs
, char const *type
,
609 uintmax_t minus_minval
, uintmax_t maxval
)
612 char const *where
= where0
;
613 char const *lim
= where
+ digs
;
616 /* Accommodate buggy tar of unknown vintage, which outputs leading
617 NUL if the previous field overflows. */
620 /* Accommodate older tars, which output leading spaces. */
627 _("Blanks in header where numeric %s value expected"),
631 if (!ISSPACE ((unsigned char) *where
))
637 if (ISODIGIT (*where
))
639 char const *where1
= where
;
640 uintmax_t overflow
= 0;
644 value
+= *where
++ - '0';
645 if (where
== lim
|| ! ISODIGIT (*where
))
647 overflow
|= value
^ (value
<< LG_8
>> LG_8
);
651 /* Parse the output of older, unportable tars, which generate
652 negative values in two's complement octal. If the leading
653 nonzero digit is 1, we can't recover the original value
654 reliably; so do this only if the digit is 2 or more. This
655 catches the common case of 32-bit negative time stamps. */
656 if ((overflow
|| maxval
< value
) && '2' <= *where1
&& type
)
658 /* Compute the negative of the input value, assuming two's
660 int digit
= (*where1
- '0') | 4;
668 if (where
== lim
|| ! ISODIGIT (*where
))
670 digit
= *where
- '0';
671 overflow
|= value
^ (value
<< LG_8
>> LG_8
);
677 if (!overflow
&& value
<= minus_minval
)
680 _("Archive octal value %.*s is out of %s range; assuming two's complement"),
681 (int) (where
- where1
), where1
, type
));
690 _("Archive octal value %.*s is out of %s range"),
691 (int) (where
- where1
), where1
, type
));
695 else if (*where
== '-' || *where
== '+')
697 /* Parse base-64 output produced only by tar test versions
698 1.13.6 (1999-08-11) through 1.13.11 (1999-08-23).
699 Support for this will be withdrawn in future releases. */
701 static int warned_once
;
706 _("Archive contains obsolescent base-64 headers")));
708 negative
= *where
++ == '-';
710 && (dig
= base64_map
[(unsigned char) *where
]) < 64)
712 if (value
<< LG_64
>> LG_64
!= value
)
714 char *string
= alloca (digs
+ 1);
715 memcpy (string
, where0
, digs
);
719 _("Archive signed base-64 string %s is out of %s range"),
720 quote (string
), type
));
723 value
= (value
<< LG_64
) | dig
;
727 else if (*where
== '\200' /* positive base-256 */
728 || *where
== '\377' /* negative base-256 */)
730 /* Parse base-256 output. A nonnegative number N is
731 represented as (256**DIGS)/2 + N; a negative number -N is
732 represented as (256**DIGS) - N, i.e. as two's complement.
733 The representation guarantees that the leading bit is
734 always on, so that we don't confuse this format with the
735 others (assuming ASCII bytes of 8 bits or more). */
736 int signbit
= *where
& (1 << (LG_256
- 2));
737 uintmax_t topbits
= (((uintmax_t) - signbit
)
738 << (CHAR_BIT
* sizeof (uintmax_t)
739 - LG_256
- (LG_256
- 2)));
740 value
= (*where
++ & ((1 << (LG_256
- 2)) - 1)) - signbit
;
743 value
= (value
<< LG_256
) + (unsigned char) *where
++;
746 if (((value
<< LG_256
>> LG_256
) | topbits
) != value
)
750 _("Archive base-256 value is out of %s range"),
760 if (where
!= lim
&& *where
&& !ISSPACE ((unsigned char) *where
))
764 char buf
[1000]; /* Big enough to represent any header. */
765 static struct quoting_options
*o
;
769 o
= clone_quoting_options (0);
770 set_quoting_style (o
, locale_quoting_style
);
773 while (where0
!= lim
&& ! lim
[-1])
775 quotearg_buffer (buf
, sizeof buf
, where0
, lim
- where
, o
);
777 _("Archive contains %.*s where numeric %s value expected"),
778 (int) sizeof buf
, buf
, type
));
784 if (value
<= (negative
? minus_minval
: maxval
))
785 return negative
? -value
: value
;
789 char minval_buf
[UINTMAX_STRSIZE_BOUND
+ 1];
790 char maxval_buf
[UINTMAX_STRSIZE_BOUND
];
791 char value_buf
[UINTMAX_STRSIZE_BOUND
+ 1];
792 char *minval_string
= STRINGIFY_BIGINT (minus_minval
, minval_buf
+ 1);
793 char *value_string
= STRINGIFY_BIGINT (value
, value_buf
+ 1);
795 *--value_string
= '-';
797 *--minval_string
= '-';
798 ERROR ((0, 0, _("Archive value %s is out of %s range %s.%s"),
800 minval_string
, STRINGIFY_BIGINT (maxval
, maxval_buf
)));
807 gid_from_header (const char *p
, size_t s
)
809 return from_header (p
, s
, "gid_t",
810 - (uintmax_t) TYPE_MINIMUM (gid_t
),
811 (uintmax_t) TYPE_MAXIMUM (gid_t
));
815 major_from_header (const char *p
, size_t s
)
817 return from_header (p
, s
, "major_t",
818 - (uintmax_t) TYPE_MINIMUM (major_t
),
819 (uintmax_t) TYPE_MAXIMUM (major_t
));
823 minor_from_header (const char *p
, size_t s
)
825 return from_header (p
, s
, "minor_t",
826 - (uintmax_t) TYPE_MINIMUM (minor_t
),
827 (uintmax_t) TYPE_MAXIMUM (minor_t
));
831 mode_from_header (const char *p
, size_t s
)
833 /* Do not complain about unrecognized mode bits. */
834 unsigned u
= from_header (p
, s
, "mode_t",
835 - (uintmax_t) TYPE_MINIMUM (mode_t
),
836 TYPE_MAXIMUM (uintmax_t));
837 return ((u
& TSUID
? S_ISUID
: 0)
838 | (u
& TSGID
? S_ISGID
: 0)
839 | (u
& TSVTX
? S_ISVTX
: 0)
840 | (u
& TUREAD
? S_IRUSR
: 0)
841 | (u
& TUWRITE
? S_IWUSR
: 0)
842 | (u
& TUEXEC
? S_IXUSR
: 0)
843 | (u
& TGREAD
? S_IRGRP
: 0)
844 | (u
& TGWRITE
? S_IWGRP
: 0)
845 | (u
& TGEXEC
? S_IXGRP
: 0)
846 | (u
& TOREAD
? S_IROTH
: 0)
847 | (u
& TOWRITE
? S_IWOTH
: 0)
848 | (u
& TOEXEC
? S_IXOTH
: 0));
852 off_from_header (const char *p
, size_t s
)
854 /* Negative offsets are not allowed in tar files, so invoke
855 from_header with minimum value 0, not TYPE_MINIMUM (off_t). */
856 return from_header (p
, s
, "off_t", (uintmax_t) 0,
857 (uintmax_t) TYPE_MAXIMUM (off_t
));
861 size_from_header (const char *p
, size_t s
)
863 return from_header (p
, s
, "size_t", (uintmax_t) 0,
864 (uintmax_t) TYPE_MAXIMUM (size_t));
868 time_from_header (const char *p
, size_t s
)
870 return from_header (p
, s
, "time_t",
871 - (uintmax_t) TYPE_MINIMUM (time_t),
872 (uintmax_t) TYPE_MAXIMUM (time_t));
876 uid_from_header (const char *p
, size_t s
)
878 return from_header (p
, s
, "uid_t",
879 - (uintmax_t) TYPE_MINIMUM (uid_t
),
880 (uintmax_t) TYPE_MAXIMUM (uid_t
));
884 uintmax_from_header (const char *p
, size_t s
)
886 return from_header (p
, s
, "uintmax_t", (uintmax_t) 0,
887 TYPE_MAXIMUM (uintmax_t));
891 /* Format O as a null-terminated decimal string into BUF _backwards_;
892 return pointer to start of result. */
894 stringify_uintmax_t_backwards (uintmax_t o
, char *buf
)
898 *--buf
= '0' + (int) (o
% 10);
899 while ((o
/= 10) != 0);
903 /* Return a printable representation of T. The result points to
904 static storage that can be reused in the next call to this
905 function, to ctime, or to asctime. */
909 static char buffer
[max (UINTMAX_STRSIZE_BOUND
+ 1,
910 INT_STRLEN_BOUND (int) + 16)];
917 char const *time_stamp
= p
+ 4;
918 for (p
+= 16; p
[3] != '\n'; p
++)
924 /* Use ISO 8610 format. See:
925 http://www.cl.cam.ac.uk/~mgk25/iso-time.html */
926 struct tm
*tm
= utc_option
? gmtime (&t
) : localtime (&t
);
929 sprintf (buffer
, "%04ld-%02d-%02d %02d:%02d:%02d",
930 tm
->tm_year
+ 1900L, tm
->tm_mon
+ 1, tm
->tm_mday
,
931 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
936 /* The time stamp cannot be broken down, most likely because it
937 is out of range. Convert it as an integer,
938 right-adjusted in a field with the same width as the usual
939 19-byte 4-year ISO time format. */
940 p
= stringify_uintmax_t_backwards (t
< 0 ? - (uintmax_t) t
: (uintmax_t) t
,
941 buffer
+ sizeof buffer
);
944 while (buffer
+ sizeof buffer
- 19 - 1 < p
)
949 /* Actually print it.
951 Plain and fancy file header block logging. Non-verbose just prints
952 the name, e.g. for "tar t" or "tar x". This should just contain
953 file names, so it can be fed back into tar with xargs or the "-T"
954 option. The verbose option can give a bunch of info, one line per
955 file. I doubt anybody tries to parse its format, or if they do,
956 they shouldn't. Unix tar is pretty random here anyway. */
959 /* FIXME: Note that print_header uses the globals HEAD, HSTAT, and
960 HEAD_STANDARD, which must be set up in advance. Not very clean.. */
962 /* UGSWIDTH starts with 18, so with user and group names <= 8 chars, the
963 columns never shift during the listing. */
965 static int ugswidth
= UGSWIDTH
; /* maximum width encountered so far */
967 /* DATEWIDTH is the number of columns taken by the date and time fields. */
969 # define DATEWIDTH 19
971 # define DATEWIDTH 18
975 print_header (struct tar_stat_info
*st
, off_t block_ordinal
)
978 char const *time_stamp
;
979 char *temp_name
= st
->orig_file_name
? st
->orig_file_name
: st
->file_name
;
981 /* These hold formatted ints. */
982 char uform
[UINTMAX_STRSIZE_BOUND
], gform
[UINTMAX_STRSIZE_BOUND
];
984 char size
[2 * UINTMAX_STRSIZE_BOUND
];
985 /* holds formatted size or major,minor */
986 char uintbuf
[UINTMAX_STRSIZE_BOUND
];
989 if (block_number_option
)
991 char buf
[UINTMAX_STRSIZE_BOUND
];
992 if (block_ordinal
< 0)
993 block_ordinal
= current_block_ordinal ();
994 block_ordinal
-= recent_long_name_blocks
;
995 block_ordinal
-= recent_long_link_blocks
;
996 fprintf (stdlis
, _("block %s: "),
997 STRINGIFY_BIGINT (block_ordinal
, buf
));
1000 if (verbose_option
<= 1)
1002 /* Just the fax, mam. */
1003 fprintf (stdlis
, "%s\n", quotearg (temp_name
));
1007 /* File type and modes. */
1010 switch (current_header
->header
.typeflag
)
1012 case GNUTYPE_VOLHDR
:
1016 case GNUTYPE_MULTIVOL
:
1024 case GNUTYPE_LONGNAME
:
1025 case GNUTYPE_LONGLINK
:
1027 ERROR ((0, 0, _("Visible longname error")));
1030 case GNUTYPE_SPARSE
:
1034 if (temp_name
[strlen (temp_name
) - 1] == '/')
1040 case GNUTYPE_DUMPDIR
:
1063 decode_mode (st
->stat
.st_mode
, modes
+ 1);
1067 time_stamp
= tartime (st
->stat
.st_mtime
);
1069 /* User and group names. */
1071 if (st
->uname
&& current_format
!= V7_FORMAT
1072 && !numeric_owner_option
)
1076 /* Try parsing it as an unsigned integer first, and as a
1077 uid_t if that fails. This method can list positive user
1078 ids that are too large to fit in a uid_t. */
1079 uintmax_t u
= from_header (current_header
->header
.uid
,
1080 sizeof current_header
->header
.uid
, 0,
1082 (uintmax_t) TYPE_MAXIMUM (uintmax_t));
1084 user
= STRINGIFY_BIGINT (u
, uform
);
1087 sprintf (uform
, "%ld",
1088 (long) UID_FROM_HEADER (current_header
->header
.uid
));
1093 if (st
->gname
&& current_format
!= V7_FORMAT
1094 && !numeric_owner_option
)
1098 /* Try parsing it as an unsigned integer first, and as a
1099 gid_t if that fails. This method can list positive group
1100 ids that are too large to fit in a gid_t. */
1101 uintmax_t g
= from_header (current_header
->header
.gid
,
1102 sizeof current_header
->header
.gid
, 0,
1104 (uintmax_t) TYPE_MAXIMUM (uintmax_t));
1106 group
= STRINGIFY_BIGINT (g
, gform
);
1109 sprintf (gform
, "%ld",
1110 (long) GID_FROM_HEADER (current_header
->header
.gid
));
1115 /* Format the file size or major/minor device numbers. */
1117 switch (current_header
->header
.typeflag
)
1122 STRINGIFY_BIGINT (major (st
->stat
.st_rdev
), uintbuf
));
1125 STRINGIFY_BIGINT (minor (st
->stat
.st_rdev
), uintbuf
));
1129 /* st->stat.st_size keeps stored file size */
1130 strcpy (size
, STRINGIFY_BIGINT (st
->stat
.st_size
, uintbuf
));
1134 /* Figure out padding and print the whole line. */
1136 pad
= strlen (user
) + strlen (group
) + strlen (size
) + 1;
1140 fprintf (stdlis
, "%s %s/%s %*s%s %s",
1141 modes
, user
, group
, ugswidth
- pad
, "", size
, time_stamp
);
1143 fprintf (stdlis
, " %s", quotearg (temp_name
));
1145 switch (current_header
->header
.typeflag
)
1148 fprintf (stdlis
, " -> %s\n", quotearg (st
->link_name
));
1152 fprintf (stdlis
, _(" link to %s\n"), quotearg (st
->link_name
));
1157 char type_string
[2];
1158 type_string
[0] = current_header
->header
.typeflag
;
1159 type_string
[1] = '\0';
1160 fprintf (stdlis
, _(" unknown file type %s\n"),
1161 quote (type_string
));
1167 case GNUTYPE_SPARSE
:
1173 case GNUTYPE_DUMPDIR
:
1174 putc ('\n', stdlis
);
1177 case GNUTYPE_LONGLINK
:
1178 fprintf (stdlis
, _("--Long Link--\n"));
1181 case GNUTYPE_LONGNAME
:
1182 fprintf (stdlis
, _("--Long Name--\n"));
1185 case GNUTYPE_VOLHDR
:
1186 fprintf (stdlis
, _("--Volume Header--\n"));
1189 case GNUTYPE_MULTIVOL
:
1192 (UINTMAX_FROM_HEADER (current_header
->oldgnu_header
.offset
),
1194 fprintf (stdlis
, _("--Continued at byte %s--\n"), size
);
1198 fprintf (stdlis
, _("--Mangled file names--\n"));
1205 /* Print a similar line when we make a directory automatically. */
1207 print_for_mkdir (char *dirname
, int length
, mode_t mode
)
1211 if (verbose_option
> 1)
1213 /* File type and modes. */
1216 decode_mode (mode
, modes
+ 1);
1218 if (block_number_option
)
1220 char buf
[UINTMAX_STRSIZE_BOUND
];
1221 fprintf (stdlis
, _("block %s: "),
1222 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
1225 fprintf (stdlis
, "%s %*s %.*s\n", modes
, ugswidth
+ DATEWIDTH
,
1226 _("Creating directory:"), length
, quotearg (dirname
));
1230 /* Skip over SIZE bytes of data in blocks in the archive. */
1232 skip_file (off_t size
)
1236 if (multi_volume_option
)
1238 save_totsize
= size
;
1239 save_sizeleft
= size
;
1242 if (seekable_archive
)
1244 off_t nblk
= seek_archive (size
);
1247 size
-= nblk
* BLOCKSIZE
;
1248 if (multi_volume_option
) /* Argh.. */
1249 save_sizeleft
-= nblk
* BLOCKSIZE
;
1252 seekable_archive
= false;
1257 x
= find_next_block ();
1259 FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
1261 set_next_block_after (x
);
1263 if (multi_volume_option
)
1264 save_sizeleft
-= BLOCKSIZE
;
1268 /* Skip the current member in the archive.
1269 NOTE: Current header must be decoded before calling this function. */
1273 char save_typeflag
= current_header
->header
.typeflag
;
1274 set_next_block_after (current_header
);
1276 assign_string (&save_name
, current_stat_info
.file_name
);
1278 if (current_stat_info
.is_sparse
)
1279 sparse_skip_file (¤t_stat_info
);
1280 else if (save_typeflag
!= DIRTYPE
)
1281 skip_file (current_stat_info
.stat
.st_size
);