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