1 /* List a tar archive, with support routines for reading a tar archive.
2 Copyright 1988,92,93,94,96,97,98,1999 Free Software Foundation, Inc.
3 Written by John Gilmore, on 1985-08-26.
5 This program is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License as published by the
7 Free Software Foundation; either version 2, or (at your option) any later
10 This program is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
13 Public License for more details.
15 You should have received a copy of the GNU General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19 /* Define to non-zero for forcing old ctime format instead of ISO format. */
32 #define max(a, b) ((a) < (b) ? (b) : (a))
34 union block
*current_header
; /* points to current archive header */
35 struct stat current_stat
; /* stat struct corresponding */
36 enum archive_format current_format
; /* recognized format */
38 static uintmax_t from_header
PARAMS ((const char *, size_t, const char *,
39 uintmax_t, uintmax_t));
41 /* Base 64 digits; see Internet RFC 2045 Table 1. */
42 static char const base_64_digits
[64] =
44 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
45 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
46 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
47 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
48 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
51 /* Table of base-64 digit values indexed by unsigned chars.
52 The value is 64 for unsigned chars that are not base-64 digits. */
53 static char base64_map
[UCHAR_MAX
+ 1];
59 memset (base64_map
, 64, sizeof base64_map
);
60 for (i
= 0; i
< 64; i
++)
61 base64_map
[(int) base_64_digits
[i
]] = i
;
64 /*-----------------------------------.
65 | Main loop for reading an archive. |
66 `-----------------------------------*/
69 read_and (void (*do_something
) ())
71 enum read_header status
= HEADER_STILL_UNREAD
;
72 enum read_header prev_status
;
76 open_archive (ACCESS_READ
);
81 status
= read_header ();
84 case HEADER_STILL_UNREAD
:
89 /* Valid header. We should decode next field (mode) first.
90 Ensure incoming names are null terminated. */
92 if (!name_match (current_file_name
)
93 || (newer_mtime_option
!= TYPE_MINIMUM (time_t)
94 /* FIXME: We get mtime now, and again later; this
95 causes duplicate diagnostics if header.mtime is
97 && ((current_stat
.st_mtime
98 = TIME_FROM_HEADER (current_header
->header
.mtime
))
99 < newer_mtime_option
))
100 || excluded_name (current_file_name
))
104 if (current_header
->header
.typeflag
== GNUTYPE_VOLHDR
105 || current_header
->header
.typeflag
== GNUTYPE_MULTIVOL
106 || current_header
->header
.typeflag
== GNUTYPE_NAMES
)
111 if (show_omitted_dirs_option
112 && current_header
->header
.typeflag
== DIRTYPE
)
113 WARN ((0, 0, _("Omitting %s"), current_file_name
));
115 /* Skip past it in the archive. */
117 save_typeflag
= current_header
->header
.typeflag
;
118 set_next_block_after (current_header
);
119 if (current_header
->oldgnu_header
.isextended
)
120 skip_extended_headers ();
122 /* Skip to the next header on the archive. */
124 if (save_typeflag
!= DIRTYPE
)
125 skip_file (current_stat
.st_size
);
132 case HEADER_ZERO_BLOCK
:
133 if (block_number_option
)
135 char buf
[UINTMAX_STRSIZE_BOUND
];
136 fprintf (stdlis
, _("block %s: ** Block of NULs **\n"),
137 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
140 set_next_block_after (current_header
);
141 status
= prev_status
;
142 if (ignore_zeros_option
)
146 case HEADER_END_OF_FILE
:
147 if (block_number_option
)
149 char buf
[UINTMAX_STRSIZE_BOUND
];
150 fprintf (stdlis
, _("block %s: ** End of File **\n"),
151 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
156 /* If the previous header was good, tell them that we are
157 skipping bad ones. */
158 set_next_block_after (current_header
);
161 case HEADER_STILL_UNREAD
:
162 ERROR ((0, 0, _("This does not look like a tar archive")));
165 case HEADER_ZERO_BLOCK
:
167 ERROR ((0, 0, _("Skipping to next header")));
170 case HEADER_END_OF_FILE
:
172 /* We are in the middle of a cascade of errors. */
180 apply_delayed_set_stat ();
182 names_notfound (); /* print names not found */
185 /*---------------------------------------------.
186 | Print a header block, based on tar options. |
187 `---------------------------------------------*/
192 /* Print the header block. */
196 if (verbose_option
> 1)
197 decode_header (current_header
, ¤t_stat
, ¤t_format
, 0);
201 if (incremental_option
&& current_header
->header
.typeflag
== GNUTYPE_DUMPDIR
)
204 size_t written
, check
;
205 union block
*data_block
;
207 set_next_block_after (current_header
);
208 if (multi_volume_option
)
210 assign_string (&save_name
, current_file_name
);
211 save_totsize
= current_stat
.st_size
;
213 for (size
= current_stat
.st_size
; size
> 0; size
-= written
)
215 if (multi_volume_option
)
216 save_sizeleft
= size
;
217 data_block
= find_next_block ();
220 ERROR ((0, 0, _("EOF in archive file")));
221 break; /* FIXME: What happens, then? */
223 written
= available_space_after (data_block
);
227 check
= fwrite (data_block
->buffer
, sizeof (char), written
, stdlis
);
228 set_next_block_after ((union block
*)
229 (data_block
->buffer
+ written
- 1));
230 if (check
!= written
)
232 ERROR ((0, errno
, _("Only wrote %lu of %lu bytes to file %s"),
233 (unsigned long) check
,
234 (unsigned long) written
, current_file_name
));
235 skip_file (size
- written
);
239 if (multi_volume_option
)
240 assign_string (&save_name
, 0);
241 fputc ('\n', stdlis
);
247 /* Skip past the header in the archive, and past any extended headers. */
249 set_next_block_after (current_header
);
250 if (current_header
->oldgnu_header
.isextended
)
251 skip_extended_headers ();
253 if (multi_volume_option
)
254 assign_string (&save_name
, current_file_name
);
256 /* Skip to the next header on the archive. */
258 skip_file (current_stat
.st_size
);
260 if (multi_volume_option
)
261 assign_string (&save_name
, 0);
264 /*-----------------------------------------------------------------------.
265 | Read a block that's supposed to be a header block. Return its address |
266 | in "current_header", and if it is good, the file's size in |
267 | current_stat.st_size. |
269 | Return 1 for success, 0 if the checksum is bad, EOF on eof, 2 for a |
270 | block full of zeros (EOF marker). |
272 | You must always set_next_block_after(current_header) to skip past the |
273 | header which this routine reads. |
274 `-----------------------------------------------------------------------*/
276 /* The standard BSD tar sources create the checksum by adding up the
277 bytes in the header as type char. I think the type char was unsigned
278 on the PDP-11, but it's signed on the Next and Sun. It looks like the
279 sources to BSD tar were never changed to compute the checksum
280 correctly, so both the Sun and Next add the bytes of the header as
281 signed chars. This doesn't cause a problem until you get a file with
282 a name containing characters with the high bit set. So read_header
283 computes two checksums -- signed and unsigned. */
289 int unsigned_sum
; /* the POSIX one :-) */
290 int signed_sum
; /* the Sun one :-( */
292 uintmax_t parsed_sum
;
297 union block
*data_block
;
298 size_t size
, written
;
299 static char *next_long_name
, *next_long_link
;
303 header
= find_next_block ();
304 current_header
= header
;
306 return HEADER_END_OF_FILE
;
311 for (i
= sizeof *header
; i
-- != 0;)
313 unsigned_sum
+= (unsigned char) *p
;
314 signed_sum
+= signed_char (*p
++);
317 if (unsigned_sum
== 0)
318 return HEADER_ZERO_BLOCK
;
320 /* Adjust checksum to count the "chksum" field as blanks. */
322 for (i
= sizeof header
->header
.chksum
; i
-- != 0;)
324 unsigned_sum
-= (unsigned char) header
->header
.chksum
[i
];
325 signed_sum
-= signed_char (header
->header
.chksum
[i
]);
327 unsigned_sum
+= ' ' * sizeof header
->header
.chksum
;
328 signed_sum
+= ' ' * sizeof header
->header
.chksum
;
330 parsed_sum
= from_header (header
->header
.chksum
,
331 sizeof header
->header
.chksum
, 0,
333 (uintmax_t) TYPE_MAXIMUM (int));
334 if (parsed_sum
== (uintmax_t) -1)
335 return HEADER_FAILURE
;
337 recorded_sum
= parsed_sum
;
339 if (unsigned_sum
!= recorded_sum
&& signed_sum
!= recorded_sum
)
340 return HEADER_FAILURE
;
342 /* Good block. Decode file size and return. */
344 if (header
->header
.typeflag
== LNKTYPE
)
345 current_stat
.st_size
= 0; /* links 0 size on tape */
347 current_stat
.st_size
= OFF_FROM_HEADER (header
->header
.size
);
349 if (header
->header
.typeflag
== GNUTYPE_LONGNAME
350 || header
->header
.typeflag
== GNUTYPE_LONGLINK
)
352 longp
= ((header
->header
.typeflag
== GNUTYPE_LONGNAME
)
356 set_next_block_after (header
);
359 size
= current_stat
.st_size
;
360 if (size
!= current_stat
.st_size
)
361 FATAL_ERROR ((0, 0, _("Memory exhausted")));
362 bp
= *longp
= xmalloc (size
);
364 for (; size
> 0; size
-= written
)
366 data_block
= find_next_block ();
369 ERROR ((0, 0, _("Unexpected EOF on archive file")));
372 written
= available_space_after (data_block
);
376 memcpy (bp
, data_block
->buffer
, written
);
378 set_next_block_after ((union block
*)
379 (data_block
->buffer
+ written
- 1));
388 struct posix_header
*h
= ¤t_header
->header
;
389 char namebuf
[sizeof h
->prefix
+ 1 + NAME_FIELD_SIZE
+ 1];
391 name
= next_long_name
;
394 /* Accept file names as specified by POSIX.1-1996
396 int posix_header
= strcmp (h
->magic
, TMAGIC
) == 0;
399 if (posix_header
&& h
->prefix
[0])
401 memcpy (np
, h
->prefix
, sizeof h
->prefix
);
402 np
[sizeof h
->prefix
] = '\0';
406 memcpy (np
, h
->name
, sizeof h
->name
);
407 np
[sizeof h
->name
] = '\0';
410 assign_string (¤t_file_name
, name
);
413 free (next_long_name
);
417 name
= next_long_link
;
420 memcpy (namebuf
, h
->linkname
, sizeof h
->linkname
);
421 namebuf
[sizeof h
->linkname
] = '\0';
424 assign_string (¤t_link_name
, name
);
427 free (next_long_link
);
431 return HEADER_SUCCESS
;
436 /*-------------------------------------------------------------------------.
437 | Decode things from a file HEADER block into STAT_INFO, also setting |
438 | *FORMAT_POINTER depending on the header block format. If DO_USER_GROUP, |
439 | decode the user/group information (this is useful for extraction, but |
440 | waste time when merely listing). |
442 | read_header() has already decoded the checksum and length, so we don't. |
444 | This routine should *not* be called twice for the same block, since the |
445 | two calls might use different DO_USER_GROUP values and thus might end up |
446 | with different uid/gid for the two calls. If anybody wants the uid/gid |
447 | they should decode it first, and other callers should decode it without |
448 | uid/gid before calling a routine, e.g. print_header, that assumes |
450 `-------------------------------------------------------------------------*/
453 decode_header (union block
*header
, struct stat
*stat_info
,
454 enum archive_format
*format_pointer
, int do_user_group
)
456 enum archive_format format
;
458 if (strcmp (header
->header
.magic
, TMAGIC
) == 0)
459 format
= POSIX_FORMAT
;
460 else if (strcmp (header
->header
.magic
, OLDGNU_MAGIC
) == 0)
461 format
= OLDGNU_FORMAT
;
464 *format_pointer
= format
;
466 stat_info
->st_mode
= MODE_FROM_HEADER (header
->header
.mode
);
467 stat_info
->st_mtime
= TIME_FROM_HEADER (header
->header
.mtime
);
469 if (format
== OLDGNU_FORMAT
&& incremental_option
)
471 stat_info
->st_atime
= TIME_FROM_HEADER (header
->oldgnu_header
.atime
);
472 stat_info
->st_ctime
= TIME_FROM_HEADER (header
->oldgnu_header
.ctime
);
475 if (format
== V7_FORMAT
)
477 stat_info
->st_uid
= UID_FROM_HEADER (header
->header
.uid
);
478 stat_info
->st_gid
= GID_FROM_HEADER (header
->header
.gid
);
479 stat_info
->st_rdev
= 0;
485 /* FIXME: Decide if this should somewhat depend on -p. */
487 if (numeric_owner_option
488 || !*header
->header
.uname
489 || !uname_to_uid (header
->header
.uname
, &stat_info
->st_uid
))
490 stat_info
->st_uid
= UID_FROM_HEADER (header
->header
.uid
);
492 if (numeric_owner_option
493 || !*header
->header
.gname
494 || !gname_to_gid (header
->header
.gname
, &stat_info
->st_gid
))
495 stat_info
->st_gid
= GID_FROM_HEADER (header
->header
.gid
);
497 switch (header
->header
.typeflag
)
501 = makedev (MAJOR_FROM_HEADER (header
->header
.devmajor
),
502 MINOR_FROM_HEADER (header
->header
.devminor
));
507 = makedev (MAJOR_FROM_HEADER (header
->header
.devmajor
),
508 MINOR_FROM_HEADER (header
->header
.devminor
));
512 stat_info
->st_rdev
= 0;
517 /*------------------------------------------------------------------------.
518 | Convert buffer at WHERE0 of size DIGS from external format to uintmax_t.|
519 | The data is of type TYPE. The buffer must represent a value in the |
520 | range -MINUS_MINVAL through MAXVAL. DIGS must be positive. |
521 `------------------------------------------------------------------------*/
524 from_header (char const *where0
, size_t digs
, char const *type
,
525 uintmax_t minus_minval
, uintmax_t maxval
)
528 char const *where
= where0
;
529 char const *lim
= where
+ digs
;
532 /* Accommodate buggy tar of unknown vintage, which outputs leading
533 NUL if the previous field overflows. */
536 /* Accommodate older tars, which output leading spaces. */
543 _("Blanks in header where numeric %s value expected"),
547 if (!ISSPACE ((unsigned char) *where
))
553 if (ISODIGIT (*where
))
555 char const *where1
= where
;
556 uintmax_t overflow
= 0;
560 value
+= *where
++ - '0';
561 if (where
== lim
|| ! ISODIGIT (*where
))
563 overflow
|= value
^ (value
<< LG_8
>> LG_8
);
567 /* Parse the output of older, unportable tars, which generate
568 negative values in two's complement octal. If the leading
569 nonzero digit is 1, we can't recover the original value
570 reliably; so do this only if the digit is 2 or more. This
571 catches the common case of 32-bit negative time stamps. */
572 if ((overflow
|| maxval
< value
) && '2' <= *where1
)
574 /* Compute the negative of the input value, assuming two's
576 int digit
= (*where1
- '0') | 4;
584 if (where
== lim
|| ! ISODIGIT (*where
))
586 digit
= *where
- '0';
587 overflow
|= value
^ (value
<< LG_8
>> LG_8
);
593 if (!overflow
&& value
<= minus_minval
)
596 _("Archive octal value %.*s is out of %s range; assuming two's complement"),
597 (int) (where
- where1
), where1
, type
));
605 _("Archive octal value %.*s is out of %s range"),
606 (int) (where
- where1
), where1
, type
));
612 /* The following forms cannot appear as checksums, so we don't
613 check for them if TYPE is null. */
615 if (*where
== '-' || *where
== '+')
617 /* Parse base-64 output produced only by tar test versions
618 1.13.6 (1999-08-11) through 1.13.11 (1999-08-23).
619 Support for this will be withdrawn in future releases. */
621 static int warned_once
;
626 _("Archive contains obsolescent base-64 headers")));
628 negative
= *where
++ == '-';
630 && (dig
= base64_map
[(unsigned char) *where
]) < 64)
632 if (value
<< LG_64
>> LG_64
!= value
)
635 _("Archive signed base-64 string `%.*s' is out of %s range"),
636 (int) digs
, where0
, type
));
639 value
= (value
<< LG_64
) | dig
;
643 else if (*where
== '\200' /* positive base-256 */
644 || *where
== '\377' /* negative base-256 */)
646 /* Parse base-256 output. A nonnegative number N is
647 represented as (256**DIGS)/2 + N; a negative number -N is
648 represented as (256**DIGS) - N, i.e. as two's complement.
649 The representation guarantees that the leading bit is
650 always on, so that we don't confuse this format with the
651 others (assuming ASCII bytes of 8 bits or more). */
652 int signbit
= *where
& (1 << (LG_256
- 2));
653 uintmax_t topbits
= (((uintmax_t) - signbit
)
654 << (CHAR_BIT
* sizeof (uintmax_t)
655 - LG_256
- (LG_256
- 2)));
656 value
= (*where
++ & ((1 << (LG_256
- 2)) - 1)) - signbit
;
659 value
= (value
<< LG_256
) + (unsigned char) *where
++;
662 if (((value
<< LG_256
>> LG_256
) | topbits
) != value
)
665 _("Archive base-256 value is out of %s range"),
676 if (where
!= lim
&& *where
&& !ISSPACE ((unsigned char) *where
))
680 char buf
[1000]; /* Big enough to represent any header. */
681 static struct quoting_options
*o
;
685 o
= clone_quoting_options (0);
686 set_quoting_style (o
, c_quoting_style
);
689 while (where0
!= lim
&& ! lim
[-1])
691 quotearg_buffer (buf
, sizeof buf
, where0
, lim
- where
, o
);
693 _("Archive contains `%.*s' where numeric %s value expected"),
694 (int) sizeof buf
, buf
, type
));
700 if (value
<= (negative
? minus_minval
: maxval
))
701 return negative
? -value
: value
;
705 char minval_buf
[UINTMAX_STRSIZE_BOUND
+ 1];
706 char maxval_buf
[UINTMAX_STRSIZE_BOUND
];
707 char value_buf
[UINTMAX_STRSIZE_BOUND
+ 1];
708 char *minval_string
= STRINGIFY_BIGINT (minus_minval
, minval_buf
+ 1);
709 char *value_string
= STRINGIFY_BIGINT (value
, value_buf
+ 1);
711 *--value_string
= '-';
713 *--minval_string
= '-';
714 ERROR ((0, 0, _("Archive value %s is out of %s range %s..%s"),
716 minval_string
, STRINGIFY_BIGINT (maxval
, maxval_buf
)));
723 gid_from_header (const char *p
, size_t s
)
725 return from_header (p
, s
, "gid_t",
726 - (uintmax_t) TYPE_MINIMUM (gid_t
),
727 (uintmax_t) TYPE_MAXIMUM (gid_t
));
731 major_from_header (const char *p
, size_t s
)
733 return from_header (p
, s
, "major_t",
734 - (uintmax_t) TYPE_MINIMUM (major_t
),
735 (uintmax_t) TYPE_MAXIMUM (major_t
));
739 minor_from_header (const char *p
, size_t s
)
741 return from_header (p
, s
, "minor_t",
742 - (uintmax_t) TYPE_MINIMUM (minor_t
),
743 (uintmax_t) TYPE_MAXIMUM (minor_t
));
747 mode_from_header (const char *p
, size_t s
)
749 /* Do not complain about unrecognized mode bits. */
750 unsigned u
= from_header (p
, s
, "mode_t",
751 - (uintmax_t) TYPE_MINIMUM (mode_t
),
752 TYPE_MAXIMUM (uintmax_t));
753 return ((u
& TSUID
? S_ISUID
: 0)
754 | (u
& TSGID
? S_ISGID
: 0)
755 | (u
& TSVTX
? S_ISVTX
: 0)
756 | (u
& TUREAD
? S_IRUSR
: 0)
757 | (u
& TUWRITE
? S_IWUSR
: 0)
758 | (u
& TUEXEC
? S_IXUSR
: 0)
759 | (u
& TGREAD
? S_IRGRP
: 0)
760 | (u
& TGWRITE
? S_IWGRP
: 0)
761 | (u
& TGEXEC
? S_IXGRP
: 0)
762 | (u
& TOREAD
? S_IROTH
: 0)
763 | (u
& TOWRITE
? S_IWOTH
: 0)
764 | (u
& TOEXEC
? S_IXOTH
: 0));
768 off_from_header (const char *p
, size_t s
)
770 /* Negative offsets are not allowed in tar files, so invoke
771 from_header with minimum value 0, not TYPE_MINIMUM (off_t). */
772 return from_header (p
, s
, "off_t", (uintmax_t) 0,
773 (uintmax_t) TYPE_MAXIMUM (off_t
));
777 size_from_header (const char *p
, size_t s
)
779 return from_header (p
, s
, "size_t", (uintmax_t) 0,
780 (uintmax_t) TYPE_MAXIMUM (size_t));
784 time_from_header (const char *p
, size_t s
)
786 time_t t
= from_header (p
, s
, "time_t",
787 - (uintmax_t) TYPE_MINIMUM (time_t),
788 (uintmax_t) TYPE_MAXIMUM (time_t));
789 if (start_time
< t
&& time (0) < t
)
790 WARN ((0, 0, _("Archive contains future timestamp %s"), tartime (t
)));
795 uid_from_header (const char *p
, size_t s
)
797 return from_header (p
, s
, "uid_t",
798 - (uintmax_t) TYPE_MINIMUM (uid_t
),
799 (uintmax_t) TYPE_MAXIMUM (uid_t
));
803 uintmax_from_header (const char *p
, size_t s
)
805 return from_header (p
, s
, "uintmax_t", (uintmax_t) 0,
806 TYPE_MAXIMUM (uintmax_t));
810 /*----------------------------------------------------------------------.
811 | Format O as a null-terminated decimal string into BUF _backwards_; |
812 | return pointer to start of result. |
813 `----------------------------------------------------------------------*/
815 stringify_uintmax_t_backwards (uintmax_t o
, char *buf
)
819 *--buf
= '0' + (int) (o
% 10);
820 while ((o
/= 10) != 0);
824 /* Return a printable representation of T. The result points to
825 static storage that can be reused in the next call to this
826 function, to ctime, or to asctime. */
830 static char buffer
[max (UINTMAX_STRSIZE_BOUND
+ 1,
831 INT_STRLEN_BOUND (int) + 16)];
838 char const *time_stamp
= p
+ 4;
839 for (p
+= 16; p
[4] != '\n'; p
++)
845 /* Use ISO 8610 format. See:
846 http://www.cl.cam.ac.uk/~mgk25/iso-time.html */
847 struct tm
*tm
= localtime (&t
);
850 sprintf (buffer
, "%04d-%02d-%02d %02d:%02d:%02d",
851 tm
->tm_year
+ 1900, tm
->tm_mon
+ 1, tm
->tm_mday
,
852 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
857 /* The time stamp cannot be broken down, most likely because it
858 is out of range. Convert it as an integer,
859 right-adjusted in a field with the same width as the usual
860 19-byte 4-year ISO time format. */
861 p
= stringify_uintmax_t_backwards (t
< 0 ? - (uintmax_t) t
: (uintmax_t) t
,
862 buffer
+ sizeof buffer
);
865 while (buffer
+ sizeof buffer
- 19 - 1 < p
)
870 /*-------------------------------------------------------------------------.
871 | Decode MODE from its binary form in a stat structure, and encode it into |
872 | a 9 characters string STRING, terminated with a NUL. |
873 `-------------------------------------------------------------------------*/
876 decode_mode (mode_t mode
, char *string
)
878 *string
++ = mode
& S_IRUSR
? 'r' : '-';
879 *string
++ = mode
& S_IWUSR
? 'w' : '-';
880 *string
++ = (mode
& S_ISUID
881 ? (mode
& S_IXUSR
? 's' : 'S')
882 : (mode
& S_IXUSR
? 'x' : '-'));
883 *string
++ = mode
& S_IRGRP
? 'r' : '-';
884 *string
++ = mode
& S_IWGRP
? 'w' : '-';
885 *string
++ = (mode
& S_ISGID
886 ? (mode
& S_IXGRP
? 's' : 'S')
887 : (mode
& S_IXGRP
? 'x' : '-'));
888 *string
++ = mode
& S_IROTH
? 'r' : '-';
889 *string
++ = mode
& S_IWOTH
? 'w' : '-';
890 *string
++ = (mode
& S_ISVTX
891 ? (mode
& S_IXOTH
? 't' : 'T')
892 : (mode
& S_IXOTH
? 'x' : '-'));
896 /*-------------------------------------------------------------------------.
897 | Actually print it. |
899 | Plain and fancy file header block logging. Non-verbose just prints the |
900 | name, e.g. for "tar t" or "tar x". This should just contain file names, |
901 | so it can be fed back into tar with xargs or the "-T" option. The |
902 | verbose option can give a bunch of info, one line per file. I doubt |
903 | anybody tries to parse its format, or if they do, they shouldn't. Unix |
904 | tar is pretty random here anyway. |
905 `-------------------------------------------------------------------------*/
907 /* FIXME: Note that print_header uses the globals HEAD, HSTAT, and
908 HEAD_STANDARD, which must be set up in advance. Not very clean... */
910 /* UGSWIDTH starts with 18, so with user and group names <= 8 chars, the
911 columns never shift during the listing. */
913 static int ugswidth
= UGSWIDTH
; /* maximum width encountered so far */
915 /* DATEWIDTH is the number of columns taken by the date and time fields. */
917 # define DATEWIDTH 19
919 # define DATEWIDTH 18
926 char const *time_stamp
;
927 /* These hold formatted ints. */
928 char uform
[UINTMAX_STRSIZE_BOUND
], gform
[UINTMAX_STRSIZE_BOUND
];
930 char size
[2 * UINTMAX_STRSIZE_BOUND
];
931 /* holds formatted size or major,minor */
932 char uintbuf
[UINTMAX_STRSIZE_BOUND
];
936 if (block_number_option
)
938 char buf
[UINTMAX_STRSIZE_BOUND
];
939 fprintf (stdlis
, _("block %s: "),
940 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
943 if (verbose_option
<= 1)
945 /* Just the fax, mam. */
947 char *quoted_name
= quote_copy_string (current_file_name
);
951 fprintf (stdlis
, "%s\n", quoted_name
);
955 fprintf (stdlis
, "%s\n", current_file_name
);
959 /* File type and modes. */
962 switch (current_header
->header
.typeflag
)
968 case GNUTYPE_MULTIVOL
:
976 case GNUTYPE_LONGNAME
:
977 case GNUTYPE_LONGLINK
:
978 ERROR ((0, 0, _("Visible longname error")));
986 if (current_file_name
[strlen (current_file_name
) - 1] == '/')
989 case GNUTYPE_DUMPDIR
:
1012 decode_mode (current_stat
.st_mode
, modes
+ 1);
1016 time_stamp
= tartime (current_stat
.st_mtime
);
1018 /* User and group names. */
1020 if (*current_header
->header
.uname
&& current_format
!= V7_FORMAT
1021 && !numeric_owner_option
)
1022 user
= current_header
->header
.uname
;
1024 user
= STRINGIFY_BIGINT (UINTMAX_FROM_HEADER
1025 (current_header
->header
.uid
),
1028 if (*current_header
->header
.gname
&& current_format
!= V7_FORMAT
1029 && !numeric_owner_option
)
1030 group
= current_header
->header
.gname
;
1032 group
= STRINGIFY_BIGINT (UINTMAX_FROM_HEADER
1033 (current_header
->header
.gid
),
1036 /* Format the file size or major/minor device numbers. */
1038 switch (current_header
->header
.typeflag
)
1043 STRINGIFY_BIGINT (major (current_stat
.st_rdev
), uintbuf
));
1046 STRINGIFY_BIGINT (minor (current_stat
.st_rdev
), uintbuf
));
1048 case GNUTYPE_SPARSE
:
1051 (UINTMAX_FROM_HEADER (current_header
1052 ->oldgnu_header
.realsize
),
1056 strcpy (size
, STRINGIFY_BIGINT (current_stat
.st_size
, uintbuf
));
1060 /* Figure out padding and print the whole line. */
1062 pad
= strlen (user
) + strlen (group
) + strlen (size
) + 1;
1066 fprintf (stdlis
, "%s %s/%s %*s%s %s",
1067 modes
, user
, group
, ugswidth
- pad
, "", size
, time_stamp
);
1069 name
= quote_copy_string (current_file_name
);
1072 fprintf (stdlis
, " %s", name
);
1076 fprintf (stdlis
, " %s", current_file_name
);
1078 switch (current_header
->header
.typeflag
)
1081 name
= quote_copy_string (current_link_name
);
1084 fprintf (stdlis
, " -> %s\n", name
);
1088 fprintf (stdlis
, " -> %s\n", current_link_name
);
1092 name
= quote_copy_string (current_link_name
);
1095 fprintf (stdlis
, _(" link to %s\n"), name
);
1099 fprintf (stdlis
, _(" link to %s\n"), current_link_name
);
1103 fprintf (stdlis
, _(" unknown file type `%c'\n"),
1104 current_header
->header
.typeflag
);
1109 case GNUTYPE_SPARSE
:
1115 case GNUTYPE_DUMPDIR
:
1116 putc ('\n', stdlis
);
1119 case GNUTYPE_VOLHDR
:
1120 fprintf (stdlis
, _("--Volume Header--\n"));
1123 case GNUTYPE_MULTIVOL
:
1126 (UINTMAX_FROM_HEADER (current_header
->oldgnu_header
.offset
),
1128 fprintf (stdlis
, _("--Continued at byte %s--\n"), size
);
1132 fprintf (stdlis
, _("--Mangled file names--\n"));
1139 /*--------------------------------------------------------------.
1140 | Print a similar line when we make a directory automatically. |
1141 `--------------------------------------------------------------*/
1144 print_for_mkdir (char *pathname
, int length
, mode_t mode
)
1149 if (verbose_option
> 1)
1151 /* File type and modes. */
1154 decode_mode (mode
, modes
+ 1);
1156 if (block_number_option
)
1158 char buf
[UINTMAX_STRSIZE_BOUND
];
1159 fprintf (stdlis
, _("block %s: "),
1160 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
1162 name
= quote_copy_string (pathname
);
1165 fprintf (stdlis
, "%s %*s %.*s\n", modes
, ugswidth
+ DATEWIDTH
,
1166 _("Creating directory:"), length
, name
);
1170 fprintf (stdlis
, "%s %*s %.*s\n", modes
, ugswidth
+ DATEWIDTH
,
1171 _("Creating directory:"), length
, pathname
);
1175 /*--------------------------------------------------------.
1176 | Skip over SIZE bytes of data in blocks in the archive. |
1177 `--------------------------------------------------------*/
1180 skip_file (off_t size
)
1184 if (multi_volume_option
)
1186 save_totsize
= size
;
1187 save_sizeleft
= size
;
1192 x
= find_next_block ();
1194 FATAL_ERROR ((0, 0, _("Unexpected EOF on archive file")));
1196 set_next_block_after (x
);
1198 if (multi_volume_option
)
1199 save_sizeleft
-= BLOCKSIZE
;
1208 skip_extended_headers (void)
1214 exhdr
= find_next_block ();
1216 FATAL_ERROR ((0, 0, _("Unexpected EOF on archive file")));
1217 set_next_block_after (exhdr
);
1219 while (exhdr
->sparse_header
.isextended
);