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