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