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