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