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