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