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