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