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