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