]> Dogcows Code - chaz/tar/blob - src/list.c
Update
[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 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 (current_stat_info.dumpdir)
220 list_dumpdir (current_stat_info.dumpdir,
221 dumpdir_size (current_stat_info.dumpdir));
222 }
223 }
224
225 if (multi_volume_option)
226 assign_string (&save_name, current_stat_info.orig_file_name);
227
228 skip_member ();
229
230 if (multi_volume_option)
231 assign_string (&save_name, 0);
232 }
233
234 /* Check header checksum */
235 /* The standard BSD tar sources create the checksum by adding up the
236 bytes in the header as type char. I think the type char was unsigned
237 on the PDP-11, but it's signed on the Next and Sun. It looks like the
238 sources to BSD tar were never changed to compute the checksum
239 correctly, so both the Sun and Next add the bytes of the header as
240 signed chars. This doesn't cause a problem until you get a file with
241 a name containing characters with the high bit set. So tar_checksum
242 computes two checksums -- signed and unsigned. */
243
244 enum read_header
245 tar_checksum (union block *header, bool silent)
246 {
247 size_t i;
248 int unsigned_sum = 0; /* the POSIX one :-) */
249 int signed_sum = 0; /* the Sun one :-( */
250 int recorded_sum;
251 uintmax_t parsed_sum;
252 char *p;
253
254 p = header->buffer;
255 for (i = sizeof *header; i-- != 0;)
256 {
257 unsigned_sum += (unsigned char) *p;
258 signed_sum += (signed char) (*p++);
259 }
260
261 if (unsigned_sum == 0)
262 return HEADER_ZERO_BLOCK;
263
264 /* Adjust checksum to count the "chksum" field as blanks. */
265
266 for (i = sizeof header->header.chksum; i-- != 0;)
267 {
268 unsigned_sum -= (unsigned char) header->header.chksum[i];
269 signed_sum -= (signed char) (header->header.chksum[i]);
270 }
271 unsigned_sum += ' ' * sizeof header->header.chksum;
272 signed_sum += ' ' * sizeof header->header.chksum;
273
274 parsed_sum = from_header (header->header.chksum,
275 sizeof header->header.chksum, 0,
276 (uintmax_t) 0,
277 (uintmax_t) TYPE_MAXIMUM (int), true, silent);
278 if (parsed_sum == (uintmax_t) -1)
279 return HEADER_FAILURE;
280
281 recorded_sum = parsed_sum;
282
283 if (unsigned_sum != recorded_sum && signed_sum != recorded_sum)
284 return HEADER_FAILURE;
285
286 return HEADER_SUCCESS;
287 }
288
289 /* Read a block that's supposed to be a header block. Return its
290 address in "current_header", and if it is good, the file's size in
291 current_stat_info.stat.st_size.
292
293 Return 1 for success, 0 if the checksum is bad, EOF on eof, 2 for a
294 block full of zeros (EOF marker).
295
296 If RAW_EXTENDED_HEADERS is nonzero, do not automagically fold the
297 GNU long name and link headers into later headers.
298
299 You must always set_next_block_after(current_header) to skip past
300 the header which this routine reads. */
301
302 enum read_header
303 read_header (bool raw_extended_headers)
304 {
305 union block *header;
306 union block *header_copy;
307 char *bp;
308 union block *data_block;
309 size_t size, written;
310 union block *next_long_name = 0;
311 union block *next_long_link = 0;
312 size_t next_long_name_blocks;
313 size_t next_long_link_blocks;
314
315 while (1)
316 {
317 enum read_header status;
318
319 header = find_next_block ();
320 current_header = header;
321 if (!header)
322 return HEADER_END_OF_FILE;
323
324 if ((status = tar_checksum (header, false)) != HEADER_SUCCESS)
325 return status;
326
327 /* Good block. Decode file size and return. */
328
329 if (header->header.typeflag == LNKTYPE)
330 current_stat_info.stat.st_size = 0; /* links 0 size on tape */
331 else
332 current_stat_info.stat.st_size = OFF_FROM_HEADER (header->header.size);
333
334 if (header->header.typeflag == GNUTYPE_LONGNAME
335 || header->header.typeflag == GNUTYPE_LONGLINK
336 || header->header.typeflag == XHDTYPE
337 || header->header.typeflag == XGLTYPE
338 || header->header.typeflag == SOLARIS_XHDTYPE)
339 {
340 if (raw_extended_headers)
341 return HEADER_SUCCESS_EXTENDED;
342 else if (header->header.typeflag == GNUTYPE_LONGNAME
343 || header->header.typeflag == GNUTYPE_LONGLINK)
344 {
345 size_t name_size = current_stat_info.stat.st_size;
346 size_t n = name_size % BLOCKSIZE;
347 size = name_size + BLOCKSIZE;
348 if (n)
349 size += BLOCKSIZE - n;
350
351 if (name_size != current_stat_info.stat.st_size
352 || size < name_size)
353 xalloc_die ();
354
355 header_copy = xmalloc (size + 1);
356
357 if (header->header.typeflag == GNUTYPE_LONGNAME)
358 {
359 if (next_long_name)
360 free (next_long_name);
361 next_long_name = header_copy;
362 next_long_name_blocks = size / BLOCKSIZE;
363 }
364 else
365 {
366 if (next_long_link)
367 free (next_long_link);
368 next_long_link = header_copy;
369 next_long_link_blocks = size / BLOCKSIZE;
370 }
371
372 set_next_block_after (header);
373 *header_copy = *header;
374 bp = header_copy->buffer + BLOCKSIZE;
375
376 for (size -= BLOCKSIZE; size > 0; size -= written)
377 {
378 data_block = find_next_block ();
379 if (! data_block)
380 {
381 ERROR ((0, 0, _("Unexpected EOF in archive")));
382 break;
383 }
384 written = available_space_after (data_block);
385 if (written > size)
386 written = size;
387
388 memcpy (bp, data_block->buffer, written);
389 bp += written;
390 set_next_block_after ((union block *)
391 (data_block->buffer + written - 1));
392 }
393
394 *bp = '\0';
395 }
396 else if (header->header.typeflag == XHDTYPE
397 || header->header.typeflag == SOLARIS_XHDTYPE)
398 xheader_read (header, OFF_FROM_HEADER (header->header.size));
399 else if (header->header.typeflag == XGLTYPE)
400 {
401 xheader_read (header, OFF_FROM_HEADER (header->header.size));
402 xheader_decode_global ();
403 }
404
405 /* Loop! */
406
407 }
408 else
409 {
410 char const *name;
411 struct posix_header const *h = &current_header->header;
412 char namebuf[sizeof h->prefix + 1 + NAME_FIELD_SIZE + 1];
413
414 if (recent_long_name)
415 free (recent_long_name);
416
417 if (next_long_name)
418 {
419 name = next_long_name->buffer + BLOCKSIZE;
420 recent_long_name = next_long_name;
421 recent_long_name_blocks = next_long_name_blocks;
422 }
423 else
424 {
425 /* Accept file names as specified by POSIX.1-1996
426 section 10.1.1. */
427 char *np = namebuf;
428
429 if (h->prefix[0] && strcmp (h->magic, TMAGIC) == 0)
430 {
431 memcpy (np, h->prefix, sizeof h->prefix);
432 np[sizeof h->prefix] = '\0';
433 np += strlen (np);
434 *np++ = '/';
435 }
436 memcpy (np, h->name, sizeof h->name);
437 np[sizeof h->name] = '\0';
438 name = namebuf;
439 recent_long_name = 0;
440 recent_long_name_blocks = 0;
441 }
442 assign_string (&current_stat_info.orig_file_name, name);
443 assign_string (&current_stat_info.file_name, name);
444 current_stat_info.had_trailing_slash = strip_trailing_slashes (current_stat_info.file_name);
445
446 if (recent_long_link)
447 free (recent_long_link);
448
449 if (next_long_link)
450 {
451 name = next_long_link->buffer + BLOCKSIZE;
452 recent_long_link = next_long_link;
453 recent_long_link_blocks = next_long_link_blocks;
454 }
455 else
456 {
457 memcpy (namebuf, h->linkname, sizeof h->linkname);
458 namebuf[sizeof h->linkname] = '\0';
459 name = namebuf;
460 recent_long_link = 0;
461 recent_long_link_blocks = 0;
462 }
463 assign_string (&current_stat_info.link_name, name);
464
465 return HEADER_SUCCESS;
466 }
467 }
468 }
469
470 #define ISOCTAL(c) ((c)>='0'&&(c)<='7')
471
472 /* Decode things from a file HEADER block into STAT_INFO, also setting
473 *FORMAT_POINTER depending on the header block format. If
474 DO_USER_GROUP, decode the user/group information (this is useful
475 for extraction, but waste time when merely listing).
476
477 read_header() has already decoded the checksum and length, so we don't.
478
479 This routine should *not* be called twice for the same block, since
480 the two calls might use different DO_USER_GROUP values and thus
481 might end up with different uid/gid for the two calls. If anybody
482 wants the uid/gid they should decode it first, and other callers
483 should decode it without uid/gid before calling a routine,
484 e.g. print_header, that assumes decoded data. */
485 void
486 decode_header (union block *header, struct tar_stat_info *stat_info,
487 enum archive_format *format_pointer, int do_user_group)
488 {
489 enum archive_format format;
490
491 if (strcmp (header->header.magic, TMAGIC) == 0)
492 {
493 if (header->star_header.prefix[130] == 0
494 && ISOCTAL (header->star_header.atime[0])
495 && header->star_header.atime[11] == ' '
496 && ISOCTAL (header->star_header.ctime[0])
497 && header->star_header.ctime[11] == ' ')
498 format = STAR_FORMAT;
499 else if (extended_header.size)
500 format = POSIX_FORMAT;
501 else
502 format = USTAR_FORMAT;
503 }
504 else if (strcmp (header->header.magic, OLDGNU_MAGIC) == 0)
505 format = OLDGNU_FORMAT;
506 else
507 format = V7_FORMAT;
508 *format_pointer = format;
509
510 stat_info->stat.st_mode = MODE_FROM_HEADER (header->header.mode);
511 stat_info->mtime.tv_sec = TIME_FROM_HEADER (header->header.mtime);
512 stat_info->mtime.tv_nsec = 0;
513 assign_string (&stat_info->uname,
514 header->header.uname[0] ? header->header.uname : NULL);
515 assign_string (&stat_info->gname,
516 header->header.gname[0] ? header->header.gname : NULL);
517
518 if (format == OLDGNU_FORMAT && incremental_option)
519 {
520 stat_info->atime.tv_sec = TIME_FROM_HEADER (header->oldgnu_header.atime);
521 stat_info->ctime.tv_sec = TIME_FROM_HEADER (header->oldgnu_header.ctime);
522 stat_info->atime.tv_nsec = stat_info->ctime.tv_nsec = 0;
523 }
524 else if (format == STAR_FORMAT)
525 {
526 stat_info->atime.tv_sec = TIME_FROM_HEADER (header->star_header.atime);
527 stat_info->ctime.tv_sec = TIME_FROM_HEADER (header->star_header.ctime);
528 stat_info->atime.tv_nsec = stat_info->ctime.tv_nsec = 0;
529 }
530 else
531 stat_info->atime = stat_info->ctime = start_time;
532
533 if (format == V7_FORMAT)
534 {
535 stat_info->stat.st_uid = UID_FROM_HEADER (header->header.uid);
536 stat_info->stat.st_gid = GID_FROM_HEADER (header->header.gid);
537 stat_info->stat.st_rdev = 0;
538 }
539 else
540 {
541 if (do_user_group)
542 {
543 /* FIXME: Decide if this should somewhat depend on -p. */
544
545 if (numeric_owner_option
546 || !*header->header.uname
547 || !uname_to_uid (header->header.uname, &stat_info->stat.st_uid))
548 stat_info->stat.st_uid = UID_FROM_HEADER (header->header.uid);
549
550 if (numeric_owner_option
551 || !*header->header.gname
552 || !gname_to_gid (header->header.gname, &stat_info->stat.st_gid))
553 stat_info->stat.st_gid = GID_FROM_HEADER (header->header.gid);
554 }
555
556 switch (header->header.typeflag)
557 {
558 case BLKTYPE:
559 case CHRTYPE:
560 stat_info->stat.st_rdev =
561 makedev (MAJOR_FROM_HEADER (header->header.devmajor),
562 MINOR_FROM_HEADER (header->header.devminor));
563 break;
564
565 default:
566 stat_info->stat.st_rdev = 0;
567 }
568 }
569
570 stat_info->archive_file_size = stat_info->stat.st_size;
571 xheader_decode (stat_info);
572
573 if (sparse_member_p (stat_info))
574 {
575 sparse_fixup_header (stat_info);
576 stat_info->is_sparse = true;
577 }
578 else
579 {
580 stat_info->is_sparse = false;
581 if ((current_format == GNU_FORMAT
582 || current_format == OLDGNU_FORMAT)
583 && current_header->header.typeflag == GNUTYPE_DUMPDIR)
584 get_gnu_dumpdir ();
585 }
586 }
587
588 /* Convert buffer at WHERE0 of size DIGS from external format to
589 uintmax_t. DIGS must be positive. If TYPE is nonnull, the data
590 are of type TYPE. The buffer must represent a value in the range
591 -MINUS_MINVAL through MAXVAL. If OCTAL_ONLY, allow only octal
592 numbers instead of the other GNU extensions. Return -1 on error,
593 diagnosing the error if TYPE is nonnull and if !SILENT. */
594 static uintmax_t
595 from_header (char const *where0, size_t digs, char const *type,
596 uintmax_t minus_minval, uintmax_t maxval,
597 bool octal_only, bool silent)
598 {
599 uintmax_t value;
600 char const *where = where0;
601 char const *lim = where + digs;
602 int negative = 0;
603
604 /* Accommodate buggy tar of unknown vintage, which outputs leading
605 NUL if the previous field overflows. */
606 where += !*where;
607
608 /* Accommodate older tars, which output leading spaces. */
609 for (;;)
610 {
611 if (where == lim)
612 {
613 if (type && !silent)
614 ERROR ((0, 0,
615 /* TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.) */
616 _("Blanks in header where numeric %s value expected"),
617 type));
618 return -1;
619 }
620 if (!ISSPACE ((unsigned char) *where))
621 break;
622 where++;
623 }
624
625 value = 0;
626 if (ISODIGIT (*where))
627 {
628 char const *where1 = where;
629 uintmax_t overflow = 0;
630
631 for (;;)
632 {
633 value += *where++ - '0';
634 if (where == lim || ! ISODIGIT (*where))
635 break;
636 overflow |= value ^ (value << LG_8 >> LG_8);
637 value <<= LG_8;
638 }
639
640 /* Parse the output of older, unportable tars, which generate
641 negative values in two's complement octal. If the leading
642 nonzero digit is 1, we can't recover the original value
643 reliably; so do this only if the digit is 2 or more. This
644 catches the common case of 32-bit negative time stamps. */
645 if ((overflow || maxval < value) && '2' <= *where1 && type)
646 {
647 /* Compute the negative of the input value, assuming two's
648 complement. */
649 int digit = (*where1 - '0') | 4;
650 overflow = 0;
651 value = 0;
652 where = where1;
653 for (;;)
654 {
655 value += 7 - digit;
656 where++;
657 if (where == lim || ! ISODIGIT (*where))
658 break;
659 digit = *where - '0';
660 overflow |= value ^ (value << LG_8 >> LG_8);
661 value <<= LG_8;
662 }
663 value++;
664 overflow |= !value;
665
666 if (!overflow && value <= minus_minval)
667 {
668 if (!silent)
669 WARN ((0, 0,
670 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
671 _("Archive octal value %.*s is out of %s range; assuming two's complement"),
672 (int) (where - where1), where1, type));
673 negative = 1;
674 }
675 }
676
677 if (overflow)
678 {
679 if (type && !silent)
680 ERROR ((0, 0,
681 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
682 _("Archive octal value %.*s is out of %s range"),
683 (int) (where - where1), where1, type));
684 return -1;
685 }
686 }
687 else if (octal_only)
688 {
689 /* Suppress the following extensions. */
690 }
691 else if (*where == '-' || *where == '+')
692 {
693 /* Parse base-64 output produced only by tar test versions
694 1.13.6 (1999-08-11) through 1.13.11 (1999-08-23).
695 Support for this will be withdrawn in future releases. */
696 int dig;
697 if (!silent)
698 {
699 static bool warned_once;
700 if (! warned_once)
701 {
702 warned_once = true;
703 WARN ((0, 0, _("Archive contains obsolescent base-64 headers")));
704 }
705 }
706 negative = *where++ == '-';
707 while (where != lim
708 && (dig = base64_map[(unsigned char) *where]) < 64)
709 {
710 if (value << LG_64 >> LG_64 != value)
711 {
712 char *string = alloca (digs + 1);
713 memcpy (string, where0, digs);
714 string[digs] = '\0';
715 if (type && !silent)
716 ERROR ((0, 0,
717 _("Archive signed base-64 string %s is out of %s range"),
718 quote (string), type));
719 return -1;
720 }
721 value = (value << LG_64) | dig;
722 where++;
723 }
724 }
725 else if (*where == '\200' /* positive base-256 */
726 || *where == '\377' /* negative base-256 */)
727 {
728 /* Parse base-256 output. A nonnegative number N is
729 represented as (256**DIGS)/2 + N; a negative number -N is
730 represented as (256**DIGS) - N, i.e. as two's complement.
731 The representation guarantees that the leading bit is
732 always on, so that we don't confuse this format with the
733 others (assuming ASCII bytes of 8 bits or more). */
734 int signbit = *where & (1 << (LG_256 - 2));
735 uintmax_t topbits = (((uintmax_t) - signbit)
736 << (CHAR_BIT * sizeof (uintmax_t)
737 - LG_256 - (LG_256 - 2)));
738 value = (*where++ & ((1 << (LG_256 - 2)) - 1)) - signbit;
739 for (;;)
740 {
741 value = (value << LG_256) + (unsigned char) *where++;
742 if (where == lim)
743 break;
744 if (((value << LG_256 >> LG_256) | topbits) != value)
745 {
746 if (type && !silent)
747 ERROR ((0, 0,
748 _("Archive base-256 value is out of %s range"),
749 type));
750 return -1;
751 }
752 }
753 negative = signbit;
754 if (negative)
755 value = -value;
756 }
757
758 if (where != lim && *where && !ISSPACE ((unsigned char) *where))
759 {
760 if (type)
761 {
762 char buf[1000]; /* Big enough to represent any header. */
763 static struct quoting_options *o;
764
765 if (!o)
766 {
767 o = clone_quoting_options (0);
768 set_quoting_style (o, locale_quoting_style);
769 }
770
771 while (where0 != lim && ! lim[-1])
772 lim--;
773 quotearg_buffer (buf, sizeof buf, where0, lim - where, o);
774 if (!silent)
775 ERROR ((0, 0,
776 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
777 _("Archive contains %.*s where numeric %s value expected"),
778 (int) sizeof buf, buf, type));
779 }
780
781 return -1;
782 }
783
784 if (value <= (negative ? minus_minval : maxval))
785 return negative ? -value : value;
786
787 if (type && !silent)
788 {
789 char minval_buf[UINTMAX_STRSIZE_BOUND + 1];
790 char maxval_buf[UINTMAX_STRSIZE_BOUND];
791 char value_buf[UINTMAX_STRSIZE_BOUND + 1];
792 char *minval_string = STRINGIFY_BIGINT (minus_minval, minval_buf + 1);
793 char *value_string = STRINGIFY_BIGINT (value, value_buf + 1);
794 if (negative)
795 *--value_string = '-';
796 if (minus_minval)
797 *--minval_string = '-';
798 /* TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.) */
799 ERROR ((0, 0, _("Archive value %s is out of %s range %s..%s"),
800 value_string, type,
801 minval_string, STRINGIFY_BIGINT (maxval, maxval_buf)));
802 }
803
804 return -1;
805 }
806
807 gid_t
808 gid_from_header (const char *p, size_t s)
809 {
810 return from_header (p, s, "gid_t",
811 - (uintmax_t) TYPE_MINIMUM (gid_t),
812 (uintmax_t) TYPE_MAXIMUM (gid_t),
813 false, false);
814 }
815
816 major_t
817 major_from_header (const char *p, size_t s)
818 {
819 return from_header (p, s, "major_t",
820 - (uintmax_t) TYPE_MINIMUM (major_t),
821 (uintmax_t) TYPE_MAXIMUM (major_t), false, false);
822 }
823
824 minor_t
825 minor_from_header (const char *p, size_t s)
826 {
827 return from_header (p, s, "minor_t",
828 - (uintmax_t) TYPE_MINIMUM (minor_t),
829 (uintmax_t) TYPE_MAXIMUM (minor_t), false, false);
830 }
831
832 mode_t
833 mode_from_header (const char *p, size_t s)
834 {
835 /* Do not complain about unrecognized mode bits. */
836 unsigned u = from_header (p, s, "mode_t",
837 - (uintmax_t) TYPE_MINIMUM (mode_t),
838 TYPE_MAXIMUM (uintmax_t), false, false);
839 return ((u & TSUID ? S_ISUID : 0)
840 | (u & TSGID ? S_ISGID : 0)
841 | (u & TSVTX ? S_ISVTX : 0)
842 | (u & TUREAD ? S_IRUSR : 0)
843 | (u & TUWRITE ? S_IWUSR : 0)
844 | (u & TUEXEC ? S_IXUSR : 0)
845 | (u & TGREAD ? S_IRGRP : 0)
846 | (u & TGWRITE ? S_IWGRP : 0)
847 | (u & TGEXEC ? S_IXGRP : 0)
848 | (u & TOREAD ? S_IROTH : 0)
849 | (u & TOWRITE ? S_IWOTH : 0)
850 | (u & TOEXEC ? S_IXOTH : 0));
851 }
852
853 off_t
854 off_from_header (const char *p, size_t s)
855 {
856 /* Negative offsets are not allowed in tar files, so invoke
857 from_header with minimum value 0, not TYPE_MINIMUM (off_t). */
858 return from_header (p, s, "off_t", (uintmax_t) 0,
859 (uintmax_t) TYPE_MAXIMUM (off_t), false, false);
860 }
861
862 size_t
863 size_from_header (const char *p, size_t s)
864 {
865 return from_header (p, s, "size_t", (uintmax_t) 0,
866 (uintmax_t) TYPE_MAXIMUM (size_t), false, false);
867 }
868
869 time_t
870 time_from_header (const char *p, size_t s)
871 {
872 return from_header (p, s, "time_t",
873 - (uintmax_t) TYPE_MINIMUM (time_t),
874 (uintmax_t) TYPE_MAXIMUM (time_t), false, false);
875 }
876
877 uid_t
878 uid_from_header (const char *p, size_t s)
879 {
880 return from_header (p, s, "uid_t",
881 - (uintmax_t) TYPE_MINIMUM (uid_t),
882 (uintmax_t) TYPE_MAXIMUM (uid_t), false, false);
883 }
884
885 uintmax_t
886 uintmax_from_header (const char *p, size_t s)
887 {
888 return from_header (p, s, "uintmax_t", (uintmax_t) 0,
889 TYPE_MAXIMUM (uintmax_t), false, false);
890 }
891
892
893 /* Return a printable representation of T. The result points to
894 static storage that can be reused in the next call to this
895 function, to ctime, or to asctime. If FULL_TIME, then output the
896 time stamp to its full resolution; otherwise, just output it to
897 1-minute resolution. */
898 char const *
899 tartime (struct timespec t, bool full_time)
900 {
901 enum { fraclen = sizeof ".FFFFFFFFF" - 1 };
902 static char buffer[max (UINTMAX_STRSIZE_BOUND + 1,
903 INT_STRLEN_BOUND (int) + 16)
904 + fraclen];
905 struct tm *tm;
906 time_t s = t.tv_sec;
907 int ns = t.tv_nsec;
908 bool negative = s < 0;
909 char *p;
910
911 if (negative && ns != 0)
912 {
913 s++;
914 ns = 1000000000 - ns;
915 }
916
917 tm = utc_option ? gmtime (&s) : localtime (&s);
918 if (tm)
919 {
920 if (full_time)
921 {
922 sprintf (buffer, "%04ld-%02d-%02d %02d:%02d:%02d",
923 tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
924 tm->tm_hour, tm->tm_min, tm->tm_sec);
925 code_ns_fraction (ns, buffer + strlen (buffer));
926 }
927 else
928 sprintf (buffer, "%04ld-%02d-%02d %02d:%02d",
929 tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
930 tm->tm_hour, tm->tm_min);
931 return buffer;
932 }
933
934 /* The time stamp cannot be broken down, most likely because it
935 is out of range. Convert it as an integer,
936 right-adjusted in a field with the same width as the usual
937 4-year ISO time format. */
938 p = umaxtostr (negative ? - (uintmax_t) s : s,
939 buffer + sizeof buffer - UINTMAX_STRSIZE_BOUND - fraclen);
940 if (negative)
941 *--p = '-';
942 while ((buffer + sizeof buffer - sizeof "YYYY-MM-DD HH:MM"
943 + (full_time ? sizeof ":SS.FFFFFFFFF" - 1 : 0))
944 < p)
945 *--p = ' ';
946 if (full_time)
947 code_ns_fraction (ns, buffer + sizeof buffer - 1 - fraclen);
948 return p;
949 }
950
951 /* Actually print it.
952
953 Plain and fancy file header block logging. Non-verbose just prints
954 the name, e.g. for "tar t" or "tar x". This should just contain
955 file names, so it can be fed back into tar with xargs or the "-T"
956 option. The verbose option can give a bunch of info, one line per
957 file. I doubt anybody tries to parse its format, or if they do,
958 they shouldn't. Unix tar is pretty random here anyway. */
959
960
961 /* FIXME: Note that print_header uses the globals HEAD, HSTAT, and
962 HEAD_STANDARD, which must be set up in advance. Not very clean.. */
963
964 /* Width of "user/group size", with initial value chosen
965 heuristically. This grows as needed, though this may cause some
966 stairstepping in the output. Make it too small and the output will
967 almost always look ragged. Make it too large and the output will
968 be spaced out too far. */
969 static int ugswidth = 19;
970
971 /* Width of printed time stamps. It grows if longer time stamps are
972 found (typically, those with nanosecond resolution). Like
973 USGWIDTH, some stairstepping may occur. */
974 static int datewidth = sizeof "YYYY-MM-DD HH:MM" - 1;
975
976 void
977 print_header (struct tar_stat_info *st, off_t block_ordinal)
978 {
979 char modes[11];
980 char const *time_stamp;
981 int time_stamp_len;
982 char *temp_name = st->orig_file_name ? st->orig_file_name : st->file_name;
983
984 /* These hold formatted ints. */
985 char uform[UINTMAX_STRSIZE_BOUND], gform[UINTMAX_STRSIZE_BOUND];
986 char *user, *group;
987 char size[2 * UINTMAX_STRSIZE_BOUND];
988 /* holds formatted size or major,minor */
989 char uintbuf[UINTMAX_STRSIZE_BOUND];
990 int pad;
991 int sizelen;
992
993 if (test_label_option && current_header->header.typeflag != GNUTYPE_VOLHDR)
994 return;
995
996 if (show_stored_names_option)
997 {
998 switch (subcommand_option)
999 {
1000 case CAT_SUBCOMMAND:
1001 case UPDATE_SUBCOMMAND:
1002 case APPEND_SUBCOMMAND:
1003 case CREATE_SUBCOMMAND:
1004 temp_name = st->file_name ? st->file_name : st->orig_file_name;
1005 break;
1006
1007 default:
1008 temp_name = st->orig_file_name ? st->orig_file_name : st->file_name;
1009 }
1010 }
1011 else
1012 temp_name = st->orig_file_name ? st->orig_file_name : st->file_name;
1013
1014 if (block_number_option)
1015 {
1016 char buf[UINTMAX_STRSIZE_BOUND];
1017 if (block_ordinal < 0)
1018 block_ordinal = current_block_ordinal ();
1019 block_ordinal -= recent_long_name_blocks;
1020 block_ordinal -= recent_long_link_blocks;
1021 fprintf (stdlis, _("block %s: "),
1022 STRINGIFY_BIGINT (block_ordinal, buf));
1023 }
1024
1025 if (verbose_option <= 1)
1026 {
1027 /* Just the fax, mam. */
1028 fprintf (stdlis, "%s\n", quotearg (temp_name));
1029 }
1030 else
1031 {
1032 /* File type and modes. */
1033
1034 modes[0] = '?';
1035 switch (current_header->header.typeflag)
1036 {
1037 case GNUTYPE_VOLHDR:
1038 modes[0] = 'V';
1039 break;
1040
1041 case GNUTYPE_MULTIVOL:
1042 modes[0] = 'M';
1043 break;
1044
1045 case GNUTYPE_NAMES:
1046 modes[0] = 'N';
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 case GNUTYPE_NAMES:
1234 fprintf (stdlis, _("--Mangled file names--\n"));
1235 break;
1236 }
1237 }
1238 fflush (stdlis);
1239 }
1240
1241 /* Print a similar line when we make a directory automatically. */
1242 void
1243 print_for_mkdir (char *dirname, int length, mode_t mode)
1244 {
1245 char modes[11];
1246
1247 if (verbose_option > 1)
1248 {
1249 /* File type and modes. */
1250
1251 modes[0] = 'd';
1252 pax_decode_mode (mode, modes + 1);
1253
1254 if (block_number_option)
1255 {
1256 char buf[UINTMAX_STRSIZE_BOUND];
1257 fprintf (stdlis, _("block %s: "),
1258 STRINGIFY_BIGINT (current_block_ordinal (), buf));
1259 }
1260
1261 fprintf (stdlis, "%s %*s %.*s\n", modes, ugswidth + 1 + datewidth,
1262 _("Creating directory:"), length, quotearg (dirname));
1263 }
1264 }
1265
1266 /* Skip over SIZE bytes of data in blocks in the archive. */
1267 void
1268 skip_file (off_t size)
1269 {
1270 union block *x;
1271
1272 if (multi_volume_option)
1273 {
1274 save_totsize = size;
1275 save_sizeleft = size;
1276 }
1277
1278 if (seekable_archive)
1279 {
1280 off_t nblk = seek_archive (size);
1281 if (nblk >= 0)
1282 {
1283 size -= nblk * BLOCKSIZE;
1284 if (multi_volume_option) /* Argh.. */
1285 save_sizeleft -= nblk * BLOCKSIZE;
1286 }
1287 else
1288 seekable_archive = false;
1289 }
1290
1291 while (size > 0)
1292 {
1293 x = find_next_block ();
1294 if (! x)
1295 FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
1296
1297 set_next_block_after (x);
1298 size -= BLOCKSIZE;
1299 if (multi_volume_option)
1300 save_sizeleft -= BLOCKSIZE;
1301 }
1302 }
1303
1304 /* Skip the current member in the archive.
1305 NOTE: Current header must be decoded before calling this function. */
1306 void
1307 skip_member (void)
1308 {
1309 char save_typeflag = current_header->header.typeflag;
1310 set_next_block_after (current_header);
1311
1312 assign_string (&save_name, current_stat_info.orig_file_name);
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 }
This page took 0.093227 seconds and 4 git commands to generate.