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