cf2de096d00b9d3ea29fe3ef7a1c88e22ce02462
[debian/tar] / src / list.c
1 /* List a tar archive, with support routines for reading a tar archive.
2
3    Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1998, 1999, 2000,
4    2001, 2003, 2004, 2005, 2006, 2007, 2010 Free Software Foundation, Inc.
5
6    Written by John Gilmore, on 1985-08-26.
7
8    This program is free software; you can redistribute it and/or modify it
9    under the terms of the GNU General Public License as published by the
10    Free Software Foundation; either version 3, or (at your option) any later
11    version.
12
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.
17
18    You should have received a copy of the GNU General Public License along
19    with this program; if not, write to the Free Software Foundation, Inc.,
20    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
21
22 #include <system.h>
23 #include <inttostr.h>
24 #include <quotearg.h>
25
26 #include "common.h"
27
28 #define max(a, b) ((a) < (b) ? (b) : (a))
29
30 union block *current_header;    /* points to current archive header */
31 enum archive_format current_format; /* recognized format */
32 union block *recent_long_name;  /* recent long name header and contents */
33 union block *recent_long_link;  /* likewise, for long link */
34 size_t recent_long_name_blocks; /* number of blocks in recent_long_name */
35 size_t recent_long_link_blocks; /* likewise, for long link */
36 union block *recent_global_header; /* Recent global header block */
37
38 #define GID_FROM_HEADER(where) gid_from_header (where, sizeof (where))
39 #define MAJOR_FROM_HEADER(where) major_from_header (where, sizeof (where))
40 #define MINOR_FROM_HEADER(where) minor_from_header (where, sizeof (where))
41 #define MODE_FROM_HEADER(where, hbits) \
42   mode_from_header (where, sizeof (where), hbits)
43 #define TIME_FROM_HEADER(where) time_from_header (where, sizeof (where))
44 #define UID_FROM_HEADER(where) uid_from_header (where, sizeof (where))
45
46 static gid_t gid_from_header (const char *buf, size_t size);
47 static major_t major_from_header (const char *buf, size_t size);
48 static minor_t minor_from_header (const char *buf, size_t size);
49 static mode_t mode_from_header (const char *buf, size_t size, unsigned *hbits);
50 static time_t time_from_header (const char *buf, size_t size);
51 static uid_t uid_from_header (const char *buf, size_t size);
52 static uintmax_t from_header (const char *, size_t, const char *,
53                               uintmax_t, uintmax_t, bool, bool);
54
55 /* Base 64 digits; see Internet RFC 2045 Table 1.  */
56 static char const base_64_digits[64] =
57 {
58   'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
59   'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
60   'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
61   'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
62   '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
63 };
64
65 /* Table of base-64 digit values indexed by unsigned chars.
66    The value is 64 for unsigned chars that are not base-64 digits.  */
67 static char base64_map[UCHAR_MAX + 1];
68
69 static void
70 base64_init (void)
71 {
72   int i;
73   memset (base64_map, 64, sizeof base64_map);
74   for (i = 0; i < 64; i++)
75     base64_map[(int) base_64_digits[i]] = i;
76 }
77
78 static char *
79 decode_xform (char *file_name, void *data)
80 {
81   int type = *(int*)data;
82
83   switch (type)
84     {
85     case XFORM_SYMLINK:
86       /* FIXME: It is not quite clear how and to which extent are the symbolic
87          links subject to filename transformation.  In the absence of another
88          solution, symbolic links are exempt from component stripping and
89          name suffix normalization, but subject to filename transformation
90          proper. */
91       return file_name;
92
93     case XFORM_LINK:
94       file_name = safer_name_suffix (file_name, true, absolute_names_option);
95       break;
96
97     case XFORM_REGFILE:
98       file_name = safer_name_suffix (file_name, false, absolute_names_option);
99       break;
100     }
101
102   if (strip_name_components)
103     {
104       size_t prefix_len = stripped_prefix_len (file_name,
105                                                strip_name_components);
106       if (prefix_len == (size_t) -1)
107         prefix_len = strlen (file_name);
108       file_name += prefix_len;
109     }
110   return file_name;
111 }
112
113 static bool
114 transform_member_name (char **pinput, int type)
115 {
116   return transform_name_fp (pinput, type, decode_xform, &type);
117 }
118
119 void
120 transform_stat_info (int typeflag, struct tar_stat_info *stat_info)
121 {
122   if (typeflag == GNUTYPE_VOLHDR)
123     /* Name transformations don't apply to volume headers. */
124     return;
125
126   transform_member_name (&stat_info->file_name, XFORM_REGFILE);
127   switch (typeflag)
128     {
129     case SYMTYPE:
130       transform_member_name (&stat_info->link_name, XFORM_SYMLINK);
131       break;
132
133     case LNKTYPE:
134       transform_member_name (&stat_info->link_name, XFORM_LINK);
135     }
136 }
137
138 /* Main loop for reading an archive.  */
139 void
140 read_and (void (*do_something) (void))
141 {
142   enum read_header status = HEADER_STILL_UNREAD;
143   enum read_header prev_status;
144   struct timespec mtime;
145
146   base64_init ();
147   name_gather ();
148
149   open_archive (ACCESS_READ);
150   do
151     {
152       prev_status = status;
153       tar_stat_destroy (&current_stat_info);
154
155       status = read_header (&current_header, &current_stat_info,
156                             read_header_auto);
157       switch (status)
158         {
159         case HEADER_STILL_UNREAD:
160         case HEADER_SUCCESS_EXTENDED:
161           abort ();
162
163         case HEADER_SUCCESS:
164
165           /* Valid header.  We should decode next field (mode) first.
166              Ensure incoming names are null terminated.  */
167           decode_header (current_header, &current_stat_info,
168                          &current_format, 1);
169           if (! name_match (current_stat_info.file_name)
170               || (NEWER_OPTION_INITIALIZED (newer_mtime_option)
171                   /* FIXME: We get mtime now, and again later; this causes
172                      duplicate diagnostics if header.mtime is bogus.  */
173                   && ((mtime.tv_sec
174                        = TIME_FROM_HEADER (current_header->header.mtime)),
175                       /* FIXME: Grab fractional time stamps from
176                          extended header.  */
177                       mtime.tv_nsec = 0,
178                       current_stat_info.mtime = mtime,
179                       OLDER_TAR_STAT_TIME (current_stat_info, m)))
180               || excluded_name (current_stat_info.file_name))
181             {
182               switch (current_header->header.typeflag)
183                 {
184                 case GNUTYPE_VOLHDR:
185                 case GNUTYPE_MULTIVOL:
186                   break;
187
188                 case DIRTYPE:
189                   if (show_omitted_dirs_option)
190                     WARN ((0, 0, _("%s: Omitting"),
191                            quotearg_colon (current_stat_info.file_name)));
192                   /* Fall through.  */
193                 default:
194                   skip_member ();
195                   continue;
196                 }
197             }
198           transform_stat_info (current_header->header.typeflag,
199                                &current_stat_info);
200           (*do_something) ();
201           continue;
202
203         case HEADER_ZERO_BLOCK:
204           if (block_number_option)
205             {
206               char buf[UINTMAX_STRSIZE_BOUND];
207               fprintf (stdlis, _("block %s: ** Block of NULs **\n"),
208                        STRINGIFY_BIGINT (current_block_ordinal (), buf));
209             }
210
211           set_next_block_after (current_header);
212
213           if (!ignore_zeros_option)
214             {
215               char buf[UINTMAX_STRSIZE_BOUND];
216
217               status = read_header (&current_header, &current_stat_info,
218                                     read_header_auto);
219               if (status == HEADER_ZERO_BLOCK)
220                 break;
221               WARNOPT (WARN_ALONE_ZERO_BLOCK,
222                        (0, 0, _("A lone zero block at %s"),
223                         STRINGIFY_BIGINT (current_block_ordinal (), buf)));
224               break;
225             }
226           status = prev_status;
227           continue;
228
229         case HEADER_END_OF_FILE:
230           if (block_number_option)
231             {
232               char buf[UINTMAX_STRSIZE_BOUND];
233               fprintf (stdlis, _("block %s: ** End of File **\n"),
234                        STRINGIFY_BIGINT (current_block_ordinal (), buf));
235             }
236           break;
237
238         case HEADER_FAILURE:
239           /* If the previous header was good, tell them that we are
240              skipping bad ones.  */
241           set_next_block_after (current_header);
242           switch (prev_status)
243             {
244             case HEADER_STILL_UNREAD:
245               ERROR ((0, 0, _("This does not look like a tar archive")));
246               /* Fall through.  */
247
248             case HEADER_ZERO_BLOCK:
249             case HEADER_SUCCESS:
250               if (block_number_option)
251                 {
252                   char buf[UINTMAX_STRSIZE_BOUND];
253                   off_t block_ordinal = current_block_ordinal ();
254                   block_ordinal -= recent_long_name_blocks;
255                   block_ordinal -= recent_long_link_blocks;
256                   fprintf (stdlis, _("block %s: "),
257                            STRINGIFY_BIGINT (block_ordinal, buf));
258                 }
259               ERROR ((0, 0, _("Skipping to next header")));
260               break;
261
262             case HEADER_END_OF_FILE:
263             case HEADER_FAILURE:
264               /* We are in the middle of a cascade of errors.  */
265               break;
266
267             case HEADER_SUCCESS_EXTENDED:
268               abort ();
269             }
270           continue;
271         }
272       break;
273     }
274   while (!all_names_found (&current_stat_info));
275
276   close_archive ();
277   names_notfound ();            /* print names not found */
278 }
279
280 /* Print a header block, based on tar options.  */
281 void
282 list_archive (void)
283 {
284   off_t block_ordinal = current_block_ordinal ();
285
286   /* Print the header block.  */
287   if (verbose_option)
288     print_header (&current_stat_info, current_header, block_ordinal);
289
290   if (incremental_option)
291     {
292       if (verbose_option > 2)
293         {
294           if (is_dumpdir (&current_stat_info))
295             list_dumpdir (current_stat_info.dumpdir,
296                           dumpdir_size (current_stat_info.dumpdir));
297         }
298     }
299
300   skip_member ();
301 }
302
303 /* Check header checksum */
304 /* The standard BSD tar sources create the checksum by adding up the
305    bytes in the header as type char.  I think the type char was unsigned
306    on the PDP-11, but it's signed on the Next and Sun.  It looks like the
307    sources to BSD tar were never changed to compute the checksum
308    correctly, so both the Sun and Next add the bytes of the header as
309    signed chars.  This doesn't cause a problem until you get a file with
310    a name containing characters with the high bit set.  So tar_checksum
311    computes two checksums -- signed and unsigned.  */
312
313 enum read_header
314 tar_checksum (union block *header, bool silent)
315 {
316   size_t i;
317   int unsigned_sum = 0;         /* the POSIX one :-) */
318   int signed_sum = 0;           /* the Sun one :-( */
319   int recorded_sum;
320   uintmax_t parsed_sum;
321   char *p;
322
323   p = header->buffer;
324   for (i = sizeof *header; i-- != 0;)
325     {
326       unsigned_sum += (unsigned char) *p;
327       signed_sum += (signed char) (*p++);
328     }
329
330   if (unsigned_sum == 0)
331     return HEADER_ZERO_BLOCK;
332
333   /* Adjust checksum to count the "chksum" field as blanks.  */
334
335   for (i = sizeof header->header.chksum; i-- != 0;)
336     {
337       unsigned_sum -= (unsigned char) header->header.chksum[i];
338       signed_sum -= (signed char) (header->header.chksum[i]);
339     }
340   unsigned_sum += ' ' * sizeof header->header.chksum;
341   signed_sum += ' ' * sizeof header->header.chksum;
342
343   parsed_sum = from_header (header->header.chksum,
344                             sizeof header->header.chksum, 0,
345                             (uintmax_t) 0,
346                             (uintmax_t) TYPE_MAXIMUM (int), true, silent);
347   if (parsed_sum == (uintmax_t) -1)
348     return HEADER_FAILURE;
349
350   recorded_sum = parsed_sum;
351
352   if (unsigned_sum != recorded_sum && signed_sum != recorded_sum)
353     return HEADER_FAILURE;
354
355   return HEADER_SUCCESS;
356 }
357
358 /* Read a block that's supposed to be a header block.  Return its
359    address in *RETURN_BLOCK, and if it is good, the file's size
360    and names (file name, link name) in *INFO.
361
362    Return one of enum read_header describing the status of the
363    operation.
364
365    The MODE parameter instructs read_header what to do with special
366    header blocks, i.e.: extended POSIX, GNU long name or long link,
367    etc.:
368
369      read_header_auto        process them automatically,
370      read_header_x_raw       when a special header is read, return
371                              HEADER_SUCCESS_EXTENDED without actually
372                              processing the header,
373      read_header_x_global    when a POSIX global header is read,
374                              decode it and return HEADER_SUCCESS_EXTENDED.
375
376    You must always set_next_block_after(*return_block) to skip past
377    the header which this routine reads.  */
378
379 enum read_header
380 read_header (union block **return_block, struct tar_stat_info *info,
381              enum read_header_mode mode)
382 {
383   union block *header;
384   union block *header_copy;
385   char *bp;
386   union block *data_block;
387   size_t size, written;
388   union block *next_long_name = 0;
389   union block *next_long_link = 0;
390   size_t next_long_name_blocks = 0;
391   size_t next_long_link_blocks = 0;
392
393   while (1)
394     {
395       enum read_header status;
396
397       header = find_next_block ();
398       *return_block = header;
399       if (!header)
400         return HEADER_END_OF_FILE;
401
402       if ((status = tar_checksum (header, false)) != HEADER_SUCCESS)
403         return status;
404
405       /* Good block.  Decode file size and return.  */
406
407       if (header->header.typeflag == LNKTYPE)
408         info->stat.st_size = 0; /* links 0 size on tape */
409       else
410         info->stat.st_size = OFF_FROM_HEADER (header->header.size);
411
412       if (header->header.typeflag == GNUTYPE_LONGNAME
413           || header->header.typeflag == GNUTYPE_LONGLINK
414           || header->header.typeflag == XHDTYPE
415           || header->header.typeflag == XGLTYPE
416           || header->header.typeflag == SOLARIS_XHDTYPE)
417         {
418           if (mode == read_header_x_raw)
419             return HEADER_SUCCESS_EXTENDED;
420           else if (header->header.typeflag == GNUTYPE_LONGNAME
421                    || header->header.typeflag == GNUTYPE_LONGLINK)
422             {
423               size_t name_size = info->stat.st_size;
424               size_t n = name_size % BLOCKSIZE;
425               size = name_size + BLOCKSIZE;
426               if (n)
427                 size += BLOCKSIZE - n;
428
429               if (name_size != info->stat.st_size || size < name_size)
430                 xalloc_die ();
431
432               header_copy = xmalloc (size + 1);
433
434               if (header->header.typeflag == GNUTYPE_LONGNAME)
435                 {
436                   free (next_long_name);
437                   next_long_name = header_copy;
438                   next_long_name_blocks = size / BLOCKSIZE;
439                 }
440               else
441                 {
442                   free (next_long_link);
443                   next_long_link = header_copy;
444                   next_long_link_blocks = size / BLOCKSIZE;
445                 }
446
447               set_next_block_after (header);
448               *header_copy = *header;
449               bp = header_copy->buffer + BLOCKSIZE;
450
451               for (size -= BLOCKSIZE; size > 0; size -= written)
452                 {
453                   data_block = find_next_block ();
454                   if (! data_block)
455                     {
456                       ERROR ((0, 0, _("Unexpected EOF in archive")));
457                       break;
458                     }
459                   written = available_space_after (data_block);
460                   if (written > size)
461                     written = size;
462
463                   memcpy (bp, data_block->buffer, written);
464                   bp += written;
465                   set_next_block_after ((union block *)
466                                         (data_block->buffer + written - 1));
467                 }
468
469               *bp = '\0';
470             }
471           else if (header->header.typeflag == XHDTYPE
472                    || header->header.typeflag == SOLARIS_XHDTYPE)
473             xheader_read (&info->xhdr, header,
474                           OFF_FROM_HEADER (header->header.size));
475           else if (header->header.typeflag == XGLTYPE)
476             {
477               struct xheader xhdr;
478
479               if (!recent_global_header)
480                 recent_global_header = xmalloc (sizeof *recent_global_header);
481               memcpy (recent_global_header, header,
482                       sizeof *recent_global_header);
483               memset (&xhdr, 0, sizeof xhdr);
484               xheader_read (&xhdr, header,
485                             OFF_FROM_HEADER (header->header.size));
486               xheader_decode_global (&xhdr);
487               xheader_destroy (&xhdr);
488               if (mode == read_header_x_global)
489                 return HEADER_SUCCESS_EXTENDED;
490             }
491
492           /* Loop!  */
493
494         }
495       else
496         {
497           char const *name;
498           struct posix_header const *h = &header->header;
499           char namebuf[sizeof h->prefix + 1 + NAME_FIELD_SIZE + 1];
500
501           free (recent_long_name);
502
503           if (next_long_name)
504             {
505               name = next_long_name->buffer + BLOCKSIZE;
506               recent_long_name = next_long_name;
507               recent_long_name_blocks = next_long_name_blocks;
508             }
509           else
510             {
511               /* Accept file names as specified by POSIX.1-1996
512                  section 10.1.1.  */
513               char *np = namebuf;
514
515               if (h->prefix[0] && strcmp (h->magic, TMAGIC) == 0)
516                 {
517                   memcpy (np, h->prefix, sizeof h->prefix);
518                   np[sizeof h->prefix] = '\0';
519                   np += strlen (np);
520                   *np++ = '/';
521                 }
522               memcpy (np, h->name, sizeof h->name);
523               np[sizeof h->name] = '\0';
524               name = namebuf;
525               recent_long_name = 0;
526               recent_long_name_blocks = 0;
527             }
528           assign_string (&info->orig_file_name, name);
529           assign_string (&info->file_name, name);
530           info->had_trailing_slash = strip_trailing_slashes (info->file_name);
531
532           free (recent_long_link);
533
534           if (next_long_link)
535             {
536               name = next_long_link->buffer + BLOCKSIZE;
537               recent_long_link = next_long_link;
538               recent_long_link_blocks = next_long_link_blocks;
539             }
540           else
541             {
542               memcpy (namebuf, h->linkname, sizeof h->linkname);
543               namebuf[sizeof h->linkname] = '\0';
544               name = namebuf;
545               recent_long_link = 0;
546               recent_long_link_blocks = 0;
547             }
548           assign_string (&info->link_name, name);
549
550           return HEADER_SUCCESS;
551         }
552     }
553 }
554
555 #define ISOCTAL(c) ((c)>='0'&&(c)<='7')
556
557 /* Decode things from a file HEADER block into STAT_INFO, also setting
558    *FORMAT_POINTER depending on the header block format.  If
559    DO_USER_GROUP, decode the user/group information (this is useful
560    for extraction, but waste time when merely listing).
561
562    read_header() has already decoded the checksum and length, so we don't.
563
564    This routine should *not* be called twice for the same block, since
565    the two calls might use different DO_USER_GROUP values and thus
566    might end up with different uid/gid for the two calls.  If anybody
567    wants the uid/gid they should decode it first, and other callers
568    should decode it without uid/gid before calling a routine,
569    e.g. print_header, that assumes decoded data.  */
570 void
571 decode_header (union block *header, struct tar_stat_info *stat_info,
572                enum archive_format *format_pointer, int do_user_group)
573 {
574   enum archive_format format;
575   unsigned hbits; /* high bits of the file mode. */
576   mode_t mode = MODE_FROM_HEADER (header->header.mode, &hbits);
577
578   if (strcmp (header->header.magic, TMAGIC) == 0)
579     {
580       if (header->star_header.prefix[130] == 0
581           && ISOCTAL (header->star_header.atime[0])
582           && header->star_header.atime[11] == ' '
583           && ISOCTAL (header->star_header.ctime[0])
584           && header->star_header.ctime[11] == ' ')
585         format = STAR_FORMAT;
586       else if (stat_info->xhdr.size)
587         format = POSIX_FORMAT;
588       else
589         format = USTAR_FORMAT;
590     }
591   else if (strcmp (header->buffer + offsetof (struct posix_header, magic),
592                    OLDGNU_MAGIC)
593            == 0)
594     format = hbits ? OLDGNU_FORMAT : GNU_FORMAT;
595   else
596     format = V7_FORMAT;
597   *format_pointer = format;
598
599   stat_info->stat.st_mode = mode;
600   stat_info->mtime.tv_sec = TIME_FROM_HEADER (header->header.mtime);
601   stat_info->mtime.tv_nsec = 0;
602   assign_string (&stat_info->uname,
603                  header->header.uname[0] ? header->header.uname : NULL);
604   assign_string (&stat_info->gname,
605                  header->header.gname[0] ? header->header.gname : NULL);
606
607   if (format == OLDGNU_FORMAT && incremental_option)
608     {
609       stat_info->atime.tv_sec = TIME_FROM_HEADER (header->oldgnu_header.atime);
610       stat_info->ctime.tv_sec = TIME_FROM_HEADER (header->oldgnu_header.ctime);
611       stat_info->atime.tv_nsec = stat_info->ctime.tv_nsec = 0;
612     }
613   else if (format == STAR_FORMAT)
614     {
615       stat_info->atime.tv_sec = TIME_FROM_HEADER (header->star_header.atime);
616       stat_info->ctime.tv_sec = TIME_FROM_HEADER (header->star_header.ctime);
617       stat_info->atime.tv_nsec = stat_info->ctime.tv_nsec = 0;
618     }
619   else
620     stat_info->atime = stat_info->ctime = start_time;
621
622   if (format == V7_FORMAT)
623     {
624       stat_info->stat.st_uid = UID_FROM_HEADER (header->header.uid);
625       stat_info->stat.st_gid = GID_FROM_HEADER (header->header.gid);
626       stat_info->stat.st_rdev = 0;
627     }
628   else
629     {
630       if (do_user_group)
631         {
632           /* FIXME: Decide if this should somewhat depend on -p.  */
633
634           if (numeric_owner_option
635               || !*header->header.uname
636               || !uname_to_uid (header->header.uname, &stat_info->stat.st_uid))
637             stat_info->stat.st_uid = UID_FROM_HEADER (header->header.uid);
638
639           if (numeric_owner_option
640               || !*header->header.gname
641               || !gname_to_gid (header->header.gname, &stat_info->stat.st_gid))
642             stat_info->stat.st_gid = GID_FROM_HEADER (header->header.gid);
643         }
644
645       switch (header->header.typeflag)
646         {
647         case BLKTYPE:
648         case CHRTYPE:
649           stat_info->stat.st_rdev =
650             makedev (MAJOR_FROM_HEADER (header->header.devmajor),
651                      MINOR_FROM_HEADER (header->header.devminor));
652           break;
653
654         default:
655           stat_info->stat.st_rdev = 0;
656         }
657     }
658
659   stat_info->archive_file_size = stat_info->stat.st_size;
660   xheader_decode (stat_info);
661
662   if (sparse_member_p (stat_info))
663     {
664       sparse_fixup_header (stat_info);
665       stat_info->is_sparse = true;
666     }
667   else
668     {
669       stat_info->is_sparse = false;
670       if (((current_format == GNU_FORMAT
671             || current_format == OLDGNU_FORMAT)
672            && current_header->header.typeflag == GNUTYPE_DUMPDIR)
673           || stat_info->dumpdir)
674         stat_info->is_dumpdir = true;
675     }
676 }
677
678
679 /* Convert buffer at WHERE0 of size DIGS from external format to
680    uintmax_t.  DIGS must be positive.  If TYPE is nonnull, the data
681    are of type TYPE.  The buffer must represent a value in the range
682    -MINUS_MINVAL through MAXVAL.  If OCTAL_ONLY, allow only octal
683    numbers instead of the other GNU extensions.  Return -1 on error,
684    diagnosing the error if TYPE is nonnull and if !SILENT.  */
685 static uintmax_t
686 from_header (char const *where0, size_t digs, char const *type,
687              uintmax_t minus_minval, uintmax_t maxval,
688              bool octal_only, bool silent)
689 {
690   uintmax_t value;
691   char const *where = where0;
692   char const *lim = where + digs;
693   int negative = 0;
694
695   /* Accommodate buggy tar of unknown vintage, which outputs leading
696      NUL if the previous field overflows.  */
697   where += !*where;
698
699   /* Accommodate older tars, which output leading spaces.  */
700   for (;;)
701     {
702       if (where == lim)
703         {
704           if (type && !silent)
705             ERROR ((0, 0,
706                     /* TRANSLATORS: %s is type of the value (gid_t, uid_t,
707                        etc.) */
708                     _("Blanks in header where numeric %s value expected"),
709                     type));
710           return -1;
711         }
712       if (!ISSPACE ((unsigned char) *where))
713         break;
714       where++;
715     }
716
717   value = 0;
718   if (ISODIGIT (*where))
719     {
720       char const *where1 = where;
721       uintmax_t overflow = 0;
722
723       for (;;)
724         {
725           value += *where++ - '0';
726           if (where == lim || ! ISODIGIT (*where))
727             break;
728           overflow |= value ^ (value << LG_8 >> LG_8);
729           value <<= LG_8;
730         }
731
732       /* Parse the output of older, unportable tars, which generate
733          negative values in two's complement octal.  If the leading
734          nonzero digit is 1, we can't recover the original value
735          reliably; so do this only if the digit is 2 or more.  This
736          catches the common case of 32-bit negative time stamps.  */
737       if ((overflow || maxval < value) && '2' <= *where1 && type)
738         {
739           /* Compute the negative of the input value, assuming two's
740              complement.  */
741           int digit = (*where1 - '0') | 4;
742           overflow = 0;
743           value = 0;
744           where = where1;
745           for (;;)
746             {
747               value += 7 - digit;
748               where++;
749               if (where == lim || ! ISODIGIT (*where))
750                 break;
751               digit = *where - '0';
752               overflow |= value ^ (value << LG_8 >> LG_8);
753               value <<= LG_8;
754             }
755           value++;
756           overflow |= !value;
757
758           if (!overflow && value <= minus_minval)
759             {
760               if (!silent)
761                 WARN ((0, 0,
762                        /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
763                        _("Archive octal value %.*s is out of %s range; assuming two's complement"),
764                        (int) (where - where1), where1, type));
765               negative = 1;
766             }
767         }
768
769       if (overflow)
770         {
771           if (type && !silent)
772             ERROR ((0, 0,
773                     /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
774                     _("Archive octal value %.*s is out of %s range"),
775                     (int) (where - where1), where1, type));
776           return -1;
777         }
778     }
779   else if (octal_only)
780     {
781       /* Suppress the following extensions.  */
782     }
783   else if (*where == '-' || *where == '+')
784     {
785       /* Parse base-64 output produced only by tar test versions
786          1.13.6 (1999-08-11) through 1.13.11 (1999-08-23).
787          Support for this will be withdrawn in future releases.  */
788       int dig;
789       if (!silent)
790         {
791           static bool warned_once;
792           if (! warned_once)
793             {
794               warned_once = true;
795               WARN ((0, 0, _("Archive contains obsolescent base-64 headers")));
796             }
797         }
798       negative = *where++ == '-';
799       while (where != lim
800              && (dig = base64_map[(unsigned char) *where]) < 64)
801         {
802           if (value << LG_64 >> LG_64 != value)
803             {
804               char *string = alloca (digs + 1);
805               memcpy (string, where0, digs);
806               string[digs] = '\0';
807               if (type && !silent)
808                 ERROR ((0, 0,
809                         _("Archive signed base-64 string %s is out of %s range"),
810                         quote (string), type));
811               return -1;
812             }
813           value = (value << LG_64) | dig;
814           where++;
815         }
816     }
817   else if (*where == '\200' /* positive base-256 */
818            || *where == '\377' /* negative base-256 */)
819     {
820       /* Parse base-256 output.  A nonnegative number N is
821          represented as (256**DIGS)/2 + N; a negative number -N is
822          represented as (256**DIGS) - N, i.e. as two's complement.
823          The representation guarantees that the leading bit is
824          always on, so that we don't confuse this format with the
825          others (assuming ASCII bytes of 8 bits or more).  */
826       int signbit = *where & (1 << (LG_256 - 2));
827       uintmax_t topbits = (((uintmax_t) - signbit)
828                            << (CHAR_BIT * sizeof (uintmax_t)
829                                - LG_256 - (LG_256 - 2)));
830       value = (*where++ & ((1 << (LG_256 - 2)) - 1)) - signbit;
831       for (;;)
832         {
833           value = (value << LG_256) + (unsigned char) *where++;
834           if (where == lim)
835             break;
836           if (((value << LG_256 >> LG_256) | topbits) != value)
837             {
838               if (type && !silent)
839                 ERROR ((0, 0,
840                         _("Archive base-256 value is out of %s range"),
841                         type));
842               return -1;
843             }
844         }
845       negative = signbit;
846       if (negative)
847         value = -value;
848     }
849
850   if (where != lim && *where && !ISSPACE ((unsigned char) *where))
851     {
852       if (type)
853         {
854           char buf[1000]; /* Big enough to represent any header.  */
855           static struct quoting_options *o;
856
857           if (!o)
858             {
859               o = clone_quoting_options (0);
860               set_quoting_style (o, locale_quoting_style);
861             }
862
863           while (where0 != lim && ! lim[-1])
864             lim--;
865           quotearg_buffer (buf, sizeof buf, where0, lim - where, o);
866           if (!silent)
867             ERROR ((0, 0,
868                     /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
869                     _("Archive contains %.*s where numeric %s value expected"),
870                     (int) sizeof buf, buf, type));
871         }
872
873       return -1;
874     }
875
876   if (value <= (negative ? minus_minval : maxval))
877     return negative ? -value : value;
878
879   if (type && !silent)
880     {
881       char minval_buf[UINTMAX_STRSIZE_BOUND + 1];
882       char maxval_buf[UINTMAX_STRSIZE_BOUND];
883       char value_buf[UINTMAX_STRSIZE_BOUND + 1];
884       char *minval_string = STRINGIFY_BIGINT (minus_minval, minval_buf + 1);
885       char *value_string = STRINGIFY_BIGINT (value, value_buf + 1);
886       if (negative)
887         *--value_string = '-';
888       if (minus_minval)
889         *--minval_string = '-';
890       /* TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.) */
891       ERROR ((0, 0, _("Archive value %s is out of %s range %s..%s"),
892               value_string, type,
893               minval_string, STRINGIFY_BIGINT (maxval, maxval_buf)));
894     }
895
896   return -1;
897 }
898
899 static gid_t
900 gid_from_header (const char *p, size_t s)
901 {
902   return from_header (p, s, "gid_t",
903                       - (uintmax_t) TYPE_MINIMUM (gid_t),
904                       (uintmax_t) TYPE_MAXIMUM (gid_t),
905                       false, false);
906 }
907
908 static major_t
909 major_from_header (const char *p, size_t s)
910 {
911   return from_header (p, s, "major_t",
912                       - (uintmax_t) TYPE_MINIMUM (major_t),
913                       (uintmax_t) TYPE_MAXIMUM (major_t), false, false);
914 }
915
916 static minor_t
917 minor_from_header (const char *p, size_t s)
918 {
919   return from_header (p, s, "minor_t",
920                       - (uintmax_t) TYPE_MINIMUM (minor_t),
921                       (uintmax_t) TYPE_MAXIMUM (minor_t), false, false);
922 }
923
924 /* Convert P to the file mode, as understood by tar.
925    Store unrecognized mode bits (from 10th up) in HBITS. */
926 static mode_t
927 mode_from_header (const char *p, size_t s, unsigned *hbits)
928 {
929   unsigned u = from_header (p, s, "mode_t",
930                             - (uintmax_t) TYPE_MINIMUM (mode_t),
931                             TYPE_MAXIMUM (uintmax_t), false, false);
932   mode_t mode = ((u & TSUID ? S_ISUID : 0)
933                  | (u & TSGID ? S_ISGID : 0)
934                  | (u & TSVTX ? S_ISVTX : 0)
935                  | (u & TUREAD ? S_IRUSR : 0)
936                  | (u & TUWRITE ? S_IWUSR : 0)
937                  | (u & TUEXEC ? S_IXUSR : 0)
938                  | (u & TGREAD ? S_IRGRP : 0)
939                  | (u & TGWRITE ? S_IWGRP : 0)
940                  | (u & TGEXEC ? S_IXGRP : 0)
941                  | (u & TOREAD ? S_IROTH : 0)
942                  | (u & TOWRITE ? S_IWOTH : 0)
943                  | (u & TOEXEC ? S_IXOTH : 0));
944   *hbits = mode ^ u;
945   return mode;
946 }
947
948 off_t
949 off_from_header (const char *p, size_t s)
950 {
951   /* Negative offsets are not allowed in tar files, so invoke
952      from_header with minimum value 0, not TYPE_MINIMUM (off_t).  */
953   return from_header (p, s, "off_t", (uintmax_t) 0,
954                       (uintmax_t) TYPE_MAXIMUM (off_t), false, false);
955 }
956
957 static time_t
958 time_from_header (const char *p, size_t s)
959 {
960   return from_header (p, s, "time_t",
961                       - (uintmax_t) TYPE_MINIMUM (time_t),
962                       (uintmax_t) TYPE_MAXIMUM (time_t), false, false);
963 }
964
965 static uid_t
966 uid_from_header (const char *p, size_t s)
967 {
968   return from_header (p, s, "uid_t",
969                       - (uintmax_t) TYPE_MINIMUM (uid_t),
970                       (uintmax_t) TYPE_MAXIMUM (uid_t), false, false);
971 }
972
973 uintmax_t
974 uintmax_from_header (const char *p, size_t s)
975 {
976   return from_header (p, s, "uintmax_t", (uintmax_t) 0,
977                       TYPE_MAXIMUM (uintmax_t), false, false);
978 }
979
980
981 /* Return a printable representation of T.  The result points to
982    static storage that can be reused in the next call to this
983    function, to ctime, or to asctime.  If FULL_TIME, then output the
984    time stamp to its full resolution; otherwise, just output it to
985    1-minute resolution.  */
986 char const *
987 tartime (struct timespec t, bool full_time)
988 {
989   enum { fraclen = sizeof ".FFFFFFFFF" - 1 };
990   static char buffer[max (UINTMAX_STRSIZE_BOUND + 1,
991                           INT_STRLEN_BOUND (int) + 16)
992                      + fraclen];
993   struct tm *tm;
994   time_t s = t.tv_sec;
995   int ns = t.tv_nsec;
996   bool negative = s < 0;
997   char *p;
998
999   if (negative && ns != 0)
1000     {
1001       s++;
1002       ns = 1000000000 - ns;
1003     }
1004
1005   tm = utc_option ? gmtime (&s) : localtime (&s);
1006   if (tm)
1007     {
1008       if (full_time)
1009         {
1010           sprintf (buffer, "%04ld-%02d-%02d %02d:%02d:%02d",
1011                    tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
1012                    tm->tm_hour, tm->tm_min, tm->tm_sec);
1013           code_ns_fraction (ns, buffer + strlen (buffer));
1014         }
1015       else
1016         sprintf (buffer, "%04ld-%02d-%02d %02d:%02d",
1017                  tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
1018                  tm->tm_hour, tm->tm_min);
1019       return buffer;
1020     }
1021
1022   /* The time stamp cannot be broken down, most likely because it
1023      is out of range.  Convert it as an integer,
1024      right-adjusted in a field with the same width as the usual
1025      4-year ISO time format.  */
1026   p = umaxtostr (negative ? - (uintmax_t) s : s,
1027                  buffer + sizeof buffer - UINTMAX_STRSIZE_BOUND - fraclen);
1028   if (negative)
1029     *--p = '-';
1030   while ((buffer + sizeof buffer - sizeof "YYYY-MM-DD HH:MM"
1031           + (full_time ? sizeof ":SS.FFFFFFFFF" - 1 : 0))
1032          < p)
1033     *--p = ' ';
1034   if (full_time)
1035     code_ns_fraction (ns, buffer + sizeof buffer - 1 - fraclen);
1036   return p;
1037 }
1038
1039 /* Actually print it.
1040
1041    Plain and fancy file header block logging.  Non-verbose just prints
1042    the name, e.g. for "tar t" or "tar x".  This should just contain
1043    file names, so it can be fed back into tar with xargs or the "-T"
1044    option.  The verbose option can give a bunch of info, one line per
1045    file.  I doubt anybody tries to parse its format, or if they do,
1046    they shouldn't.  Unix tar is pretty random here anyway.  */
1047
1048
1049 /* Width of "user/group size", with initial value chosen
1050    heuristically.  This grows as needed, though this may cause some
1051    stairstepping in the output.  Make it too small and the output will
1052    almost always look ragged.  Make it too large and the output will
1053    be spaced out too far.  */
1054 static int ugswidth = 19;
1055
1056 /* Width of printed time stamps.  It grows if longer time stamps are
1057    found (typically, those with nanosecond resolution).  Like
1058    USGWIDTH, some stairstepping may occur.  */
1059 static int datewidth = sizeof "YYYY-MM-DD HH:MM" - 1;
1060
1061 static bool volume_label_printed = false;
1062
1063 static void
1064 simple_print_header (struct tar_stat_info *st, union block *blk,
1065                      off_t block_ordinal)
1066 {
1067   char modes[11];
1068   char const *time_stamp;
1069   int time_stamp_len;
1070   char *temp_name;
1071
1072   /* These hold formatted ints.  */
1073   char uform[UINTMAX_STRSIZE_BOUND], gform[UINTMAX_STRSIZE_BOUND];
1074   char *user, *group;
1075   char size[2 * UINTMAX_STRSIZE_BOUND];
1076                                 /* holds formatted size or major,minor */
1077   char uintbuf[UINTMAX_STRSIZE_BOUND];
1078   int pad;
1079   int sizelen;
1080
1081   if (show_transformed_names_option)
1082     temp_name = st->file_name ? st->file_name : st->orig_file_name;
1083   else
1084     temp_name = st->orig_file_name ? st->orig_file_name : st->file_name;
1085
1086   if (block_number_option)
1087     {
1088       char buf[UINTMAX_STRSIZE_BOUND];
1089       if (block_ordinal < 0)
1090         block_ordinal = current_block_ordinal ();
1091       block_ordinal -= recent_long_name_blocks;
1092       block_ordinal -= recent_long_link_blocks;
1093       fprintf (stdlis, _("block %s: "),
1094                STRINGIFY_BIGINT (block_ordinal, buf));
1095     }
1096
1097   if (verbose_option <= 1)
1098     {
1099       /* Just the fax, mam.  */
1100       fprintf (stdlis, "%s\n", quotearg (temp_name));
1101     }
1102   else
1103     {
1104       /* File type and modes.  */
1105
1106       modes[0] = '?';
1107       switch (blk->header.typeflag)
1108         {
1109         case GNUTYPE_VOLHDR:
1110           volume_label_printed = true;
1111           modes[0] = 'V';
1112           break;
1113
1114         case GNUTYPE_MULTIVOL:
1115           modes[0] = 'M';
1116           break;
1117
1118         case GNUTYPE_LONGNAME:
1119         case GNUTYPE_LONGLINK:
1120           modes[0] = 'L';
1121           ERROR ((0, 0, _("Unexpected long name header")));
1122           break;
1123
1124         case GNUTYPE_SPARSE:
1125         case REGTYPE:
1126         case AREGTYPE:
1127           modes[0] = '-';
1128           if (temp_name[strlen (temp_name) - 1] == '/')
1129             modes[0] = 'd';
1130           break;
1131         case LNKTYPE:
1132           modes[0] = 'h';
1133           break;
1134         case GNUTYPE_DUMPDIR:
1135           modes[0] = 'd';
1136           break;
1137         case DIRTYPE:
1138           modes[0] = 'd';
1139           break;
1140         case SYMTYPE:
1141           modes[0] = 'l';
1142           break;
1143         case BLKTYPE:
1144           modes[0] = 'b';
1145           break;
1146         case CHRTYPE:
1147           modes[0] = 'c';
1148           break;
1149         case FIFOTYPE:
1150           modes[0] = 'p';
1151           break;
1152         case CONTTYPE:
1153           modes[0] = 'C';
1154           break;
1155         }
1156
1157       pax_decode_mode (st->stat.st_mode, modes + 1);
1158
1159       /* Time stamp.  */
1160
1161       time_stamp = tartime (st->mtime, full_time_option);
1162       time_stamp_len = strlen (time_stamp);
1163       if (datewidth < time_stamp_len)
1164         datewidth = time_stamp_len;
1165
1166       /* User and group names.  */
1167
1168       if (st->uname
1169           && st->uname[0]
1170           && current_format != V7_FORMAT
1171           && !numeric_owner_option)
1172         user = st->uname;
1173       else
1174         {
1175           /* Try parsing it as an unsigned integer first, and as a
1176              uid_t if that fails.  This method can list positive user
1177              ids that are too large to fit in a uid_t.  */
1178           uintmax_t u = from_header (blk->header.uid,
1179                                      sizeof blk->header.uid, 0,
1180                                      (uintmax_t) 0,
1181                                      (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1182                                      false, false);
1183           if (u != -1)
1184             user = STRINGIFY_BIGINT (u, uform);
1185           else
1186             {
1187               sprintf (uform, "%ld",
1188                        (long) UID_FROM_HEADER (blk->header.uid));
1189               user = uform;
1190             }
1191         }
1192
1193       if (st->gname
1194           && st->gname[0]
1195           && current_format != V7_FORMAT
1196           && !numeric_owner_option)
1197         group = st->gname;
1198       else
1199         {
1200           /* Try parsing it as an unsigned integer first, and as a
1201              gid_t if that fails.  This method can list positive group
1202              ids that are too large to fit in a gid_t.  */
1203           uintmax_t g = from_header (blk->header.gid,
1204                                      sizeof blk->header.gid, 0,
1205                                      (uintmax_t) 0,
1206                                      (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1207                                      false, false);
1208           if (g != -1)
1209             group = STRINGIFY_BIGINT (g, gform);
1210           else
1211             {
1212               sprintf (gform, "%ld",
1213                        (long) GID_FROM_HEADER (blk->header.gid));
1214               group = gform;
1215             }
1216         }
1217
1218       /* Format the file size or major/minor device numbers.  */
1219
1220       switch (blk->header.typeflag)
1221         {
1222         case CHRTYPE:
1223         case BLKTYPE:
1224           strcpy (size,
1225                   STRINGIFY_BIGINT (major (st->stat.st_rdev), uintbuf));
1226           strcat (size, ",");
1227           strcat (size,
1228                   STRINGIFY_BIGINT (minor (st->stat.st_rdev), uintbuf));
1229           break;
1230
1231         default:
1232           /* st->stat.st_size keeps stored file size */
1233           strcpy (size, STRINGIFY_BIGINT (st->stat.st_size, uintbuf));
1234           break;
1235         }
1236
1237       /* Figure out padding and print the whole line.  */
1238
1239       sizelen = strlen (size);
1240       pad = strlen (user) + 1 + strlen (group) + 1 + sizelen;
1241       if (pad > ugswidth)
1242         ugswidth = pad;
1243
1244       fprintf (stdlis, "%s %s/%s %*s %-*s",
1245                modes, user, group, ugswidth - pad + sizelen, size,
1246                datewidth, time_stamp);
1247
1248       fprintf (stdlis, " %s", quotearg (temp_name));
1249
1250       switch (blk->header.typeflag)
1251         {
1252         case SYMTYPE:
1253           fprintf (stdlis, " -> %s\n", quotearg (st->link_name));
1254           break;
1255
1256         case LNKTYPE:
1257           fprintf (stdlis, _(" link to %s\n"), quotearg (st->link_name));
1258           break;
1259
1260         default:
1261           {
1262             char type_string[2];
1263             type_string[0] = blk->header.typeflag;
1264             type_string[1] = '\0';
1265             fprintf (stdlis, _(" unknown file type %s\n"),
1266                      quote (type_string));
1267           }
1268           break;
1269
1270         case AREGTYPE:
1271         case REGTYPE:
1272         case GNUTYPE_SPARSE:
1273         case CHRTYPE:
1274         case BLKTYPE:
1275         case DIRTYPE:
1276         case FIFOTYPE:
1277         case CONTTYPE:
1278         case GNUTYPE_DUMPDIR:
1279           putc ('\n', stdlis);
1280           break;
1281
1282         case GNUTYPE_LONGLINK:
1283           fprintf (stdlis, _("--Long Link--\n"));
1284           break;
1285
1286         case GNUTYPE_LONGNAME:
1287           fprintf (stdlis, _("--Long Name--\n"));
1288           break;
1289
1290         case GNUTYPE_VOLHDR:
1291           fprintf (stdlis, _("--Volume Header--\n"));
1292           break;
1293
1294         case GNUTYPE_MULTIVOL:
1295           strcpy (size,
1296                   STRINGIFY_BIGINT
1297                   (UINTMAX_FROM_HEADER (blk->oldgnu_header.offset),
1298                    uintbuf));
1299           fprintf (stdlis, _("--Continued at byte %s--\n"), size);
1300           break;
1301         }
1302     }
1303   fflush (stdlis);
1304 }
1305
1306
1307 static void
1308 print_volume_label (void)
1309 {
1310   struct tar_stat_info vstat;
1311   union block vblk;
1312   enum archive_format dummy;
1313
1314   memset (&vblk, 0, sizeof (vblk));
1315   vblk.header.typeflag = GNUTYPE_VOLHDR;
1316   if (recent_global_header)
1317     memcpy (vblk.header.mtime, recent_global_header->header.mtime,
1318             sizeof vblk.header.mtime);
1319   tar_stat_init (&vstat);
1320   assign_string (&vstat.file_name, ".");
1321   decode_header (&vblk, &vstat, &dummy, 0);
1322   assign_string (&vstat.file_name, volume_label);
1323   simple_print_header (&vstat, &vblk, 0);
1324   tar_stat_destroy (&vstat);
1325 }
1326
1327 void
1328 print_header (struct tar_stat_info *st, union block *blk,
1329               off_t block_ordinal)
1330 {
1331   if (current_format == POSIX_FORMAT && !volume_label_printed && volume_label)
1332     {
1333       print_volume_label ();
1334       volume_label_printed = true;
1335     }
1336
1337   simple_print_header (st, blk, block_ordinal);
1338 }
1339
1340 /* Print a similar line when we make a directory automatically.  */
1341 void
1342 print_for_mkdir (char *dirname, int length, mode_t mode)
1343 {
1344   char modes[11];
1345
1346   if (verbose_option > 1)
1347     {
1348       /* File type and modes.  */
1349
1350       modes[0] = 'd';
1351       pax_decode_mode (mode, modes + 1);
1352
1353       if (block_number_option)
1354         {
1355           char buf[UINTMAX_STRSIZE_BOUND];
1356           fprintf (stdlis, _("block %s: "),
1357                    STRINGIFY_BIGINT (current_block_ordinal (), buf));
1358         }
1359
1360       fprintf (stdlis, "%s %*s %.*s\n", modes, ugswidth + 1 + datewidth,
1361                _("Creating directory:"), length, quotearg (dirname));
1362     }
1363 }
1364
1365 /* Skip over SIZE bytes of data in blocks in the archive.  */
1366 void
1367 skip_file (off_t size)
1368 {
1369   union block *x;
1370
1371   /* FIXME: Make sure mv_begin_read is always called before it */
1372
1373   if (seekable_archive)
1374     {
1375       off_t nblk = seek_archive (size);
1376       if (nblk >= 0)
1377         size -= nblk * BLOCKSIZE;
1378       else
1379         seekable_archive = false;
1380     }
1381
1382   mv_size_left (size);
1383
1384   while (size > 0)
1385     {
1386       x = find_next_block ();
1387       if (! x)
1388         FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
1389
1390       set_next_block_after (x);
1391       size -= BLOCKSIZE;
1392       mv_size_left (size);
1393     }
1394 }
1395
1396 /* Skip the current member in the archive.
1397    NOTE: Current header must be decoded before calling this function. */
1398 void
1399 skip_member (void)
1400 {
1401   if (!current_stat_info.skipped)
1402     {
1403       char save_typeflag = current_header->header.typeflag;
1404       set_next_block_after (current_header);
1405
1406       mv_begin_read (&current_stat_info);
1407
1408       if (current_stat_info.is_sparse)
1409         sparse_skip_file (&current_stat_info);
1410       else if (save_typeflag != DIRTYPE)
1411         skip_file (current_stat_info.stat.st_size);
1412
1413       mv_end ();
1414     }
1415 }
1416
1417 void
1418 test_archive_label ()
1419 {
1420   base64_init ();
1421   name_gather ();
1422
1423   open_archive (ACCESS_READ);
1424   if (read_header (&current_header, &current_stat_info, read_header_auto)
1425       == HEADER_SUCCESS)
1426     {
1427       decode_header (current_header,
1428                      &current_stat_info, &current_format, 0);
1429       if (current_header->header.typeflag == GNUTYPE_VOLHDR)
1430         assign_string (&volume_label, current_header->header.name);
1431
1432       if (volume_label)
1433         {
1434           if (verbose_option)
1435             print_volume_label ();
1436           if (!name_match (volume_label) && multi_volume_option)
1437             {
1438               char *s = drop_volume_label_suffix (volume_label);
1439               name_match (s);
1440               free (s);
1441             }
1442         }
1443     }
1444   close_archive ();
1445   label_notfound ();
1446 }