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() instead of isotime(). */
29 union block
*current_header
; /* points to current archive header */
30 struct stat current_stat
; /* stat struct corresponding */
31 enum archive_format current_format
; /* recognized format */
33 static uintmax_t from_chars
PARAMS ((const char *, size_t, const char *,
34 uintmax_t, uintmax_t));
36 /* Table of base 64 digit values indexed by unsigned chars.
37 The value is 64 for unsigned chars that are not base 64 digits. */
38 static char base64_map
[1 + (unsigned char) -1];
44 memset (base64_map
, 64, sizeof base64_map
);
45 for (i
= 0; i
< 64; i
++)
46 base64_map
[(int) base_64_digits
[i
]] = i
;
49 /*-----------------------------------.
50 | Main loop for reading an archive. |
51 `-----------------------------------*/
54 read_and (void (*do_something
) ())
56 enum read_header status
= HEADER_STILL_UNREAD
;
57 enum read_header prev_status
;
62 open_archive (ACCESS_READ
);
67 status
= read_header ();
70 case HEADER_STILL_UNREAD
:
75 /* Valid header. We should decode next field (mode) first.
76 Ensure incoming names are null terminated. */
78 /* FIXME: This is a quick kludge before 1.12 goes out. */
80 = TIME_FROM_CHARS (current_header
->header
.mtime
);
82 if (!name_match (current_file_name
)
83 || current_stat
.st_mtime
< newer_mtime_option
84 || excluded_name (current_file_name
))
88 if (current_header
->header
.typeflag
== GNUTYPE_VOLHDR
89 || current_header
->header
.typeflag
== GNUTYPE_MULTIVOL
90 || current_header
->header
.typeflag
== GNUTYPE_NAMES
)
95 if (show_omitted_dirs_option
96 && current_header
->header
.typeflag
== DIRTYPE
)
97 WARN ((0, 0, _("Omitting %s"), current_file_name
));
99 /* Skip past it in the archive. */
101 if (current_header
->oldgnu_header
.isextended
)
103 save_typeflag
= current_header
->header
.typeflag
;
104 set_next_block_after (current_header
);
112 exhdr
= find_next_block ();
113 if (!exhdr
->sparse_header
.isextended
)
115 set_next_block_after (exhdr
);
119 set_next_block_after (exhdr
);
121 skip_extended_headers ();
124 /* Skip to the next header on the archive. */
126 if (save_typeflag
!= DIRTYPE
)
127 skip_file (current_stat
.st_size
);
134 case HEADER_ZERO_BLOCK
:
135 if (block_number_option
)
137 char buf
[UINTMAX_STRSIZE_BOUND
];
138 fprintf (stdlis
, _("block %s: ** Block of NULs **\n"),
139 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
142 set_next_block_after (current_header
);
143 status
= prev_status
;
144 if (ignore_zeros_option
)
148 case HEADER_END_OF_FILE
:
149 if (block_number_option
)
151 char buf
[UINTMAX_STRSIZE_BOUND
];
152 fprintf (stdlis
, _("block %s: ** End of File **\n"),
153 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
158 /* If the previous header was good, tell them that we are
159 skipping bad ones. */
160 set_next_block_after (current_header
);
163 case HEADER_STILL_UNREAD
:
164 WARN ((0, 0, _("Hmm, this doesn't look like a tar archive")));
167 case HEADER_ZERO_BLOCK
:
169 WARN ((0, 0, _("Skipping to next file header")));
172 case HEADER_END_OF_FILE
:
174 /* We are in the middle of a cascade of errors. */
182 apply_delayed_set_stat ();
184 names_notfound (); /* print names not found */
187 /*---------------------------------------------.
188 | Print a header block, based on tar options. |
189 `---------------------------------------------*/
194 int isextended
= 0; /* to remember if current_header is extended */
196 /* Print the header block. */
200 if (verbose_option
> 1)
201 decode_header (current_header
, ¤t_stat
, ¤t_format
, 0);
205 if (incremental_option
&& current_header
->header
.typeflag
== GNUTYPE_DUMPDIR
)
208 size_t written
, check
;
209 union block
*data_block
;
211 set_next_block_after (current_header
);
212 if (multi_volume_option
)
214 assign_string (&save_name
, current_file_name
);
215 save_totsize
= current_stat
.st_size
;
217 for (size
= current_stat
.st_size
; size
> 0; size
-= written
)
219 if (multi_volume_option
)
220 save_sizeleft
= size
;
221 data_block
= find_next_block ();
224 ERROR ((0, 0, _("EOF in archive file")));
225 break; /* FIXME: What happens, then? */
227 written
= available_space_after (data_block
);
230 errno
= 0; /* FIXME: errno should be read-only */
231 check
= fwrite (data_block
->buffer
, sizeof (char), written
, stdlis
);
232 set_next_block_after ((union block
*)
233 (data_block
->buffer
+ written
- 1));
234 if (check
!= written
)
236 ERROR ((0, errno
, _("Only wrote %lu of %lu bytes to file %s"),
237 (unsigned long) check
,
238 (unsigned long) written
, current_file_name
));
239 skip_file (size
- written
);
243 if (multi_volume_option
)
244 assign_string (&save_name
, NULL
);
245 fputc ('\n', stdlis
);
251 /* Check to see if we have an extended header to skip over also. */
253 if (current_header
->oldgnu_header
.isextended
)
256 /* Skip past the header in the archive. */
258 set_next_block_after (current_header
);
260 /* If we needed to skip any extended headers, do so now, by reading
261 extended headers and skipping past them in the archive. */
270 exhdr
= find_next_block ();
272 if (!exhdr
->sparse_header
.isextended
)
274 set_next_block_after (exhdr
);
277 set_next_block_after (exhdr
);
280 skip_extended_headers ();
283 if (multi_volume_option
)
284 assign_string (&save_name
, current_file_name
);
286 /* Skip to the next header on the archive. */
288 skip_file (current_stat
.st_size
);
290 if (multi_volume_option
)
291 assign_string (&save_name
, NULL
);
294 /*-----------------------------------------------------------------------.
295 | Read a block that's supposed to be a header block. Return its address |
296 | in "current_header", and if it is good, the file's size in |
297 | current_stat.st_size. |
299 | Return 1 for success, 0 if the checksum is bad, EOF on eof, 2 for a |
300 | block full of zeros (EOF marker). |
302 | You must always set_next_block_after(current_header) to skip past the |
303 | header which this routine reads. |
304 `-----------------------------------------------------------------------*/
306 /* The standard BSD tar sources create the checksum by adding up the
307 bytes in the header as type char. I think the type char was unsigned
308 on the PDP-11, but it's signed on the Next and Sun. It looks like the
309 sources to BSD tar were never changed to compute the checksum
310 currectly, so both the Sun and Next add the bytes of the header as
311 signed chars. This doesn't cause a problem until you get a file with
312 a name containing characters with the high bit set. So read_header
313 computes two checksums -- signed and unsigned. */
315 /* FIXME: The signed checksum computation is broken on machines where char's
316 are unsigned. It's uneasy to handle all cases correctly... */
322 long unsigned_sum
; /* the POSIX one :-) */
323 long signed_sum
; /* the Sun one :-( */
325 uintmax_t parsed_sum
;
330 union block
*data_block
;
331 size_t size
, written
;
332 static char *next_long_name
, *next_long_link
;
336 header
= find_next_block ();
337 current_header
= header
;
339 return HEADER_END_OF_FILE
;
341 parsed_sum
= from_chars (header
->header
.chksum
,
342 sizeof header
->header
.chksum
,
343 (char *) 0, (uintmax_t) 0,
344 (uintmax_t) TYPE_MAXIMUM (long));
345 if (parsed_sum
== (uintmax_t) -1)
346 return HEADER_FAILURE
;
348 recorded_sum
= parsed_sum
;
352 for (i
= sizeof (*header
); i
-- != 0;)
354 /* We can't use unsigned char here because of old compilers,
357 unsigned_sum
+= 0xFF & *p
;
361 /* Adjust checksum to count the "chksum" field as blanks. */
363 for (i
= sizeof (header
->header
.chksum
); i
-- != 0;)
365 unsigned_sum
-= 0xFF & header
->header
.chksum
[i
];
366 signed_sum
-= header
->header
.chksum
[i
];
368 unsigned_sum
+= ' ' * sizeof header
->header
.chksum
;
369 signed_sum
+= ' ' * sizeof header
->header
.chksum
;
371 if (unsigned_sum
== sizeof header
->header
.chksum
* ' ')
373 /* This is a zeroed block...whole block is 0's except for the
374 blanks we faked for the checksum field. */
376 return HEADER_ZERO_BLOCK
;
379 if (unsigned_sum
!= recorded_sum
&& signed_sum
!= recorded_sum
)
380 return HEADER_FAILURE
;
382 /* Good block. Decode file size and return. */
384 if (header
->header
.typeflag
== LNKTYPE
)
385 current_stat
.st_size
= 0; /* links 0 size on tape */
387 current_stat
.st_size
= OFF_FROM_CHARS (header
->header
.size
);
389 if (header
->header
.typeflag
== GNUTYPE_LONGNAME
390 || header
->header
.typeflag
== GNUTYPE_LONGLINK
)
392 longp
= ((header
->header
.typeflag
== GNUTYPE_LONGNAME
)
396 set_next_block_after (header
);
399 size
= current_stat
.st_size
;
400 if (size
!= current_stat
.st_size
)
401 FATAL_ERROR ((0, 0, _("Memory exhausted")));
402 bp
= *longp
= (char *) xmalloc (size
);
404 for (; size
> 0; size
-= written
)
406 data_block
= find_next_block ();
407 if (data_block
== NULL
)
409 ERROR ((0, 0, _("Unexpected EOF on archive file")));
412 written
= available_space_after (data_block
);
416 memcpy (bp
, data_block
->buffer
, written
);
418 set_next_block_after ((union block
*)
419 (data_block
->buffer
+ written
- 1));
428 struct posix_header
*h
= ¤t_header
->header
;
429 char namebuf
[sizeof h
->prefix
+ 1 + NAME_FIELD_SIZE
+ 1];
431 name
= next_long_name
;
434 /* Accept file names as specified by POSIX.1-1996
436 int posix_header
= strcmp (h
->magic
, TMAGIC
) == 0;
439 if (posix_header
&& h
->prefix
[0])
441 memcpy (np
, h
->prefix
, sizeof h
->prefix
);
442 np
[sizeof h
->prefix
] = '\0';
446 memcpy (np
, h
->name
, sizeof h
->name
);
447 np
[sizeof h
->name
] = '\0';
450 assign_string (¤t_file_name
, name
);
452 name
= next_long_link
;
455 memcpy (namebuf
, h
->linkname
, sizeof h
->linkname
);
456 namebuf
[sizeof h
->linkname
] = '\0';
459 assign_string (¤t_link_name
, name
);
461 next_long_link
= next_long_name
= 0;
462 return HEADER_SUCCESS
;
467 /*-------------------------------------------------------------------------.
468 | Decode things from a file HEADER block into STAT_INFO, also setting |
469 | *FORMAT_POINTER depending on the header block format. If DO_USER_GROUP, |
470 | decode the user/group information (this is useful for extraction, but |
471 | waste time when merely listing). |
473 | read_header() has already decoded the checksum and length, so we don't. |
475 | This routine should *not* be called twice for the same block, since the |
476 | two calls might use different DO_USER_GROUP values and thus might end up |
477 | with different uid/gid for the two calls. If anybody wants the uid/gid |
478 | they should decode it first, and other callers should decode it without |
479 | uid/gid before calling a routine, e.g. print_header, that assumes |
481 `-------------------------------------------------------------------------*/
484 decode_header (union block
*header
, struct stat
*stat_info
,
485 enum archive_format
*format_pointer
, int do_user_group
)
487 enum archive_format format
;
489 if (strcmp (header
->header
.magic
, TMAGIC
) == 0)
490 format
= POSIX_FORMAT
;
491 else if (strcmp (header
->header
.magic
, OLDGNU_MAGIC
) == 0)
492 format
= OLDGNU_FORMAT
;
495 *format_pointer
= format
;
497 stat_info
->st_mode
= MODE_FROM_CHARS (header
->header
.mode
);
498 stat_info
->st_mtime
= TIME_FROM_CHARS (header
->header
.mtime
);
500 if (format
== OLDGNU_FORMAT
&& incremental_option
)
502 stat_info
->st_atime
= TIME_FROM_CHARS (header
->oldgnu_header
.atime
);
503 stat_info
->st_ctime
= TIME_FROM_CHARS (header
->oldgnu_header
.ctime
);
506 if (format
== V7_FORMAT
)
508 stat_info
->st_uid
= UID_FROM_CHARS (header
->header
.uid
);
509 stat_info
->st_gid
= GID_FROM_CHARS (header
->header
.gid
);
510 stat_info
->st_rdev
= 0;
516 /* FIXME: Decide if this should somewhat depend on -p. */
518 if (numeric_owner_option
519 || !*header
->header
.uname
520 || !uname_to_uid (header
->header
.uname
, &stat_info
->st_uid
))
521 stat_info
->st_uid
= UID_FROM_CHARS (header
->header
.uid
);
523 if (numeric_owner_option
524 || !*header
->header
.gname
525 || !gname_to_gid (header
->header
.gname
, &stat_info
->st_gid
))
526 stat_info
->st_gid
= GID_FROM_CHARS (header
->header
.gid
);
528 switch (header
->header
.typeflag
)
532 = makedev (MAJOR_FROM_CHARS (header
->header
.devmajor
),
533 MINOR_FROM_CHARS (header
->header
.devminor
));
538 = makedev (MAJOR_FROM_CHARS (header
->header
.devmajor
),
539 MINOR_FROM_CHARS (header
->header
.devminor
));
543 stat_info
->st_rdev
= 0;
548 /*------------------------------------------------------------------------.
549 | Convert buffer at WHERE0 of size DIGS from external format to uintmax_t.|
550 | The data is of type TYPE. The buffer must represent a value in the |
551 | range -MINUS_MINVAL through MAXVAL. |
552 `------------------------------------------------------------------------*/
555 from_chars (char const *where0
, size_t digs
, char const *type
,
556 uintmax_t minus_minval
, uintmax_t maxval
)
559 char const *where
= where0
;
560 char const *lim
= where
+ digs
;
569 _("Blanks in header where numeric %s value expected"),
573 if (!ISSPACE ((unsigned char) *where
))
579 if (ISODIGIT (*where
))
583 if (value
<< LG_8
>> LG_8
!= value
)
585 value
= (value
<< LG_8
) | (*where
++ - '0');
587 while (where
!= lim
&& ISODIGIT (*where
));
589 /* Parse the output of older tars, which output negative values
590 in two's complement octal. This method works only if the
591 type has the same number of bits as it did on the host that
592 created the tar file, but that's the best we can do. */
593 if (maxval
< value
&& value
- maxval
<= minus_minval
)
595 value
= minus_minval
- (value
- maxval
);
599 else if (*where
== '-' || *where
== '+')
602 negative
= *where
++ == '-';
604 && (dig
= base64_map
[(unsigned char) *where
]) < 64)
606 if (value
<< LG_64
>> LG_64
!= value
)
608 value
= (value
<< LG_64
) | dig
;
613 if (where
!= lim
&& *where
&& !ISSPACE ((unsigned char) *where
))
617 char buf
[1000]; /* Big enough to represent any header. */
618 static struct quoting_options
*o
;
622 o
= clone_quoting_options ((struct quoting_options
*) 0);
623 set_quoting_style (o
, c_quoting_style
);
626 while (where0
!= lim
&& ! lim
[-1])
628 quotearg_buffer (buf
, sizeof buf
, where0
, lim
- where
, o
);
630 _("Header contains `%.*s' where numeric %s value expected"),
631 (int) sizeof buf
, buf
, type
));
637 if (value
<= (negative
? minus_minval
: maxval
))
638 return negative
? -value
: value
;
642 ERROR ((0, 0, _("Numeric value `%.*s' is out of range for %s"),
643 (int) digs
, where0
, type
));
648 gid_from_chars (const char *p
, size_t s
)
650 return from_chars (p
, s
, "gid_t",
651 - (uintmax_t) TYPE_MINIMUM (gid_t
),
652 (uintmax_t) TYPE_MAXIMUM (gid_t
));
656 major_from_chars (const char *p
, size_t s
)
658 return from_chars (p
, s
, "major_t",
659 - (uintmax_t) TYPE_MINIMUM (major_t
),
660 (uintmax_t) TYPE_MAXIMUM (major_t
));
664 minor_from_chars (const char *p
, size_t s
)
666 return from_chars (p
, s
, "minor_t",
667 - (uintmax_t) TYPE_MINIMUM (minor_t
),
668 (uintmax_t) TYPE_MAXIMUM (minor_t
));
672 mode_from_chars (const char *p
, size_t s
)
674 /* Do not complain about unrecognized mode bits. */
675 unsigned u
= from_chars (p
, s
, "mode_t",
676 - (uintmax_t) TYPE_MINIMUM (mode_t
),
677 TYPE_MAXIMUM (uintmax_t));
678 return ((u
& TSUID
? S_ISUID
: 0)
679 | (u
& TSGID
? S_ISGID
: 0)
680 | (u
& TSVTX
? S_ISVTX
: 0)
681 | (u
& TUREAD
? S_IRUSR
: 0)
682 | (u
& TUWRITE
? S_IWUSR
: 0)
683 | (u
& TUEXEC
? S_IXUSR
: 0)
684 | (u
& TGREAD
? S_IRGRP
: 0)
685 | (u
& TGWRITE
? S_IWGRP
: 0)
686 | (u
& TGEXEC
? S_IXGRP
: 0)
687 | (u
& TOREAD
? S_IROTH
: 0)
688 | (u
& TOWRITE
? S_IWOTH
: 0)
689 | (u
& TOEXEC
? S_IXOTH
: 0));
693 off_from_chars (const char *p
, size_t s
)
695 return from_chars (p
, s
, "off_t",
696 - (uintmax_t) TYPE_MINIMUM (off_t
),
697 (uintmax_t) TYPE_MAXIMUM (off_t
));
701 size_from_chars (const char *p
, size_t s
)
703 return from_chars (p
, s
, "size_t", (uintmax_t) 0,
704 (uintmax_t) TYPE_MAXIMUM (size_t));
708 time_from_chars (const char *p
, size_t s
)
710 return from_chars (p
, s
, "time_t",
711 - (uintmax_t) TYPE_MINIMUM (time_t),
712 (uintmax_t) TYPE_MAXIMUM (time_t));
716 uid_from_chars (const char *p
, size_t s
)
718 return from_chars (p
, s
, "uid_t", (uintmax_t) 0,
719 (uintmax_t) TYPE_MAXIMUM (uid_t
));
723 uintmax_from_chars (const char *p
, size_t s
)
725 return from_chars (p
, s
, "uintmax_t", (uintmax_t) 0,
726 TYPE_MAXIMUM (uintmax_t));
730 /*----------------------------------------------------------------------.
731 | Format O as a null-terminated decimal string into BUF _backwards_; |
732 | return pointer to start of result. |
733 `----------------------------------------------------------------------*/
735 stringify_uintmax_t_backwards (uintmax_t o
, char *buf
)
739 *--buf
= '0' + (int) (o
% 10);
740 while ((o
/= 10) != 0);
746 /*-------------------------------------------.
747 | Return the time formatted along ISO 8601. |
748 `-------------------------------------------*/
750 /* Also, see http://www.ft.uni-erlangen.de/~mskuhn/iso-time.html. */
753 isotime (const time_t *time
)
755 static char buffer
[INT_STRLEN_BOUND (int) + 16];
756 struct tm
*tm
= localtime (time
);
758 sprintf (buffer
, "%04d-%02d-%02d %02d:%02d:%02d",
759 tm
->tm_year
+ 1900, tm
->tm_mon
+ 1, tm
->tm_mday
,
760 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
762 /* Interpose %s between ?? and - to avoid ANSI C trigraph brain damage. */
763 sprintf (buffer
, "????%s-??%s-?? ??:??:??", "", "");
768 #endif /* not USE_OLD_CTIME */
770 /*-------------------------------------------------------------------------.
771 | Decode MODE from its binary form in a stat structure, and encode it into |
772 | a 9 characters string STRING, terminated with a NUL. |
773 `-------------------------------------------------------------------------*/
776 decode_mode (mode_t mode
, char *string
)
778 *string
++ = mode
& S_IRUSR
? 'r' : '-';
779 *string
++ = mode
& S_IWUSR
? 'w' : '-';
780 *string
++ = (mode
& S_ISUID
781 ? (mode
& S_IXUSR
? 's' : 'S')
782 : (mode
& S_IXUSR
? 'x' : '-'));
783 *string
++ = mode
& S_IRGRP
? 'r' : '-';
784 *string
++ = mode
& S_IWGRP
? 'w' : '-';
785 *string
++ = (mode
& S_ISGID
786 ? (mode
& S_IXGRP
? 's' : 'S')
787 : (mode
& S_IXGRP
? 'x' : '-'));
788 *string
++ = mode
& S_IROTH
? 'r' : '-';
789 *string
++ = mode
& S_IWOTH
? 'w' : '-';
790 *string
++ = (mode
& S_ISVTX
791 ? (mode
& S_IXOTH
? 't' : 'T')
792 : (mode
& S_IXOTH
? 'x' : '-'));
796 /*-------------------------------------------------------------------------.
797 | Actually print it. |
799 | Plain and fancy file header block logging. Non-verbose just prints the |
800 | name, e.g. for "tar t" or "tar x". This should just contain file names, |
801 | so it can be fed back into tar with xargs or the "-T" option. The |
802 | verbose option can give a bunch of info, one line per file. I doubt |
803 | anybody tries to parse its format, or if they do, they shouldn't. Unix |
804 | tar is pretty random here anyway. |
805 `-------------------------------------------------------------------------*/
807 /* FIXME: Note that print_header uses the globals HEAD, HSTAT, and
808 HEAD_STANDARD, which must be set up in advance. Not very clean... */
810 /* UGSWIDTH starts with 18, so with user and group names <= 8 chars, the
811 columns never shift during the listing. */
813 static int ugswidth
= UGSWIDTH
; /* maximum width encountered so far */
815 /* DATEWIDTH is the number of columns taken by the date and time fields. */
817 # define DATEWIDTH 19
819 # define DATEWIDTH 18
826 char const *timestamp
;
827 /* These hold formatted ints. */
828 char uform
[UINTMAX_STRSIZE_BOUND
], gform
[UINTMAX_STRSIZE_BOUND
];
830 char size
[2 * UINTMAX_STRSIZE_BOUND
];
831 /* holds formatted size or major,minor */
832 char uintbuf
[UINTMAX_STRSIZE_BOUND
];
833 time_t longie
; /* to make ctime() call portable */
837 if (block_number_option
)
839 char buf
[UINTMAX_STRSIZE_BOUND
];
840 fprintf (stdlis
, _("block %s: "),
841 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
844 if (verbose_option
<= 1)
846 /* Just the fax, mam. */
848 char *quoted_name
= quote_copy_string (current_file_name
);
852 fprintf (stdlis
, "%s\n", quoted_name
);
856 fprintf (stdlis
, "%s\n", current_file_name
);
860 /* File type and modes. */
863 switch (current_header
->header
.typeflag
)
869 case GNUTYPE_MULTIVOL
:
877 case GNUTYPE_LONGNAME
:
878 case GNUTYPE_LONGLINK
:
879 ERROR ((0, 0, _("Visible longname error")));
887 if (current_file_name
[strlen (current_file_name
) - 1] == '/')
890 case GNUTYPE_DUMPDIR
:
913 decode_mode (current_stat
.st_mode
, modes
+ 1);
917 longie
= current_stat
.st_mtime
;
920 char *ct
= ctime (&longie
);
924 for (ct
+= 16; ct
[4] != '\n'; ct
++)
929 timestamp
= "??? ?? ??:?? ????";
932 timestamp
= isotime (&longie
);
935 /* User and group names. */
937 if (*current_header
->header
.uname
&& current_format
!= V7_FORMAT
938 && !numeric_owner_option
)
939 user
= current_header
->header
.uname
;
941 user
= STRINGIFY_BIGINT (UINTMAX_FROM_CHARS
942 (current_header
->header
.uid
),
945 if (*current_header
->header
.gname
&& current_format
!= V7_FORMAT
946 && !numeric_owner_option
)
947 group
= current_header
->header
.gname
;
949 group
= STRINGIFY_BIGINT (UINTMAX_FROM_CHARS
950 (current_header
->header
.gid
),
953 /* Format the file size or major/minor device numbers. */
955 switch (current_header
->header
.typeflag
)
959 sprintf (size
, "%lu,%lu",
960 (unsigned long) major (current_stat
.st_rdev
),
961 (unsigned long) minor (current_stat
.st_rdev
));
966 (UINTMAX_FROM_CHARS (current_header
->oldgnu_header
.realsize
),
970 strcpy (size
, STRINGIFY_BIGINT (current_stat
.st_size
, uintbuf
));
974 /* Figure out padding and print the whole line. */
976 pad
= strlen (user
) + strlen (group
) + strlen (size
) + 1;
980 fprintf (stdlis
, "%s %s/%s %*s%s %s",
981 modes
, user
, group
, ugswidth
- pad
, "", size
, timestamp
);
983 name
= quote_copy_string (current_file_name
);
986 fprintf (stdlis
, " %s", name
);
990 fprintf (stdlis
, " %s", current_file_name
);
992 switch (current_header
->header
.typeflag
)
995 name
= quote_copy_string (current_link_name
);
998 fprintf (stdlis
, " -> %s\n", name
);
1002 fprintf (stdlis
, " -> %s\n", current_link_name
);
1006 name
= quote_copy_string (current_link_name
);
1009 fprintf (stdlis
, _(" link to %s\n"), name
);
1013 fprintf (stdlis
, _(" link to %s\n"), current_link_name
);
1017 fprintf (stdlis
, _(" unknown file type `%c'\n"),
1018 current_header
->header
.typeflag
);
1023 case GNUTYPE_SPARSE
:
1029 case GNUTYPE_DUMPDIR
:
1030 putc ('\n', stdlis
);
1033 case GNUTYPE_VOLHDR
:
1034 fprintf (stdlis
, _("--Volume Header--\n"));
1037 case GNUTYPE_MULTIVOL
:
1040 (UINTMAX_FROM_CHARS (current_header
->oldgnu_header
.offset
),
1042 fprintf (stdlis
, _("--Continued at byte %s--\n"), size
);
1046 fprintf (stdlis
, _("--Mangled file names--\n"));
1053 /*--------------------------------------------------------------.
1054 | Print a similar line when we make a directory automatically. |
1055 `--------------------------------------------------------------*/
1058 print_for_mkdir (char *pathname
, int length
, mode_t mode
)
1063 if (verbose_option
> 1)
1065 /* File type and modes. */
1068 decode_mode (mode
, modes
+ 1);
1070 if (block_number_option
)
1072 char buf
[UINTMAX_STRSIZE_BOUND
];
1073 fprintf (stdlis
, _("block %s: "),
1074 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
1076 name
= quote_copy_string (pathname
);
1079 fprintf (stdlis
, "%s %*s %.*s\n", modes
, ugswidth
+ DATEWIDTH
,
1080 _("Creating directory:"), length
, name
);
1084 fprintf (stdlis
, "%s %*s %.*s\n", modes
, ugswidth
+ DATEWIDTH
,
1085 _("Creating directory:"), length
, pathname
);
1089 /*--------------------------------------------------------.
1090 | Skip over SIZE bytes of data in blocks in the archive. |
1091 `--------------------------------------------------------*/
1094 skip_file (off_t size
)
1098 if (multi_volume_option
)
1100 save_totsize
= size
;
1101 save_sizeleft
= size
;
1106 x
= find_next_block ();
1108 FATAL_ERROR ((0, 0, _("Unexpected EOF on archive file")));
1110 set_next_block_after (x
);
1112 if (multi_volume_option
)
1113 save_sizeleft
-= BLOCKSIZE
;
1122 skip_extended_headers (void)
1128 exhdr
= find_next_block ();
1129 if (!exhdr
->sparse_header
.isextended
)
1131 set_next_block_after (exhdr
);
1134 set_next_block_after (exhdr
);