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