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