]> Dogcows Code - chaz/tar/blob - src/list.c
(print_header): Special handling if test_label_option is set
[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 /* 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
516 if (strcmp (header->header.magic, TMAGIC) == 0)
517 {
518 if (header->star_header.prefix[130] == 0
519 && ISOCTAL (header->star_header.atime[0])
520 && header->star_header.atime[11] == ' '
521 && ISOCTAL (header->star_header.ctime[0])
522 && header->star_header.ctime[11] == ' ')
523 format = STAR_FORMAT;
524 else if (extended_header.size)
525 format = POSIX_FORMAT;
526 else
527 format = USTAR_FORMAT;
528 }
529 else if (strcmp (header->header.magic, OLDGNU_MAGIC) == 0)
530 format = OLDGNU_FORMAT;
531 else
532 format = V7_FORMAT;
533 *format_pointer = format;
534
535 stat_info->stat.st_mode = MODE_FROM_HEADER (header->header.mode);
536 stat_info->mtime.tv_sec = TIME_FROM_HEADER (header->header.mtime);
537 stat_info->mtime.tv_nsec = 0;
538 assign_string (&stat_info->uname,
539 header->header.uname[0] ? header->header.uname : NULL);
540 assign_string (&stat_info->gname,
541 header->header.gname[0] ? header->header.gname : NULL);
542
543 if (format == OLDGNU_FORMAT && incremental_option)
544 {
545 stat_info->atime.tv_sec = TIME_FROM_HEADER (header->oldgnu_header.atime);
546 stat_info->ctime.tv_sec = TIME_FROM_HEADER (header->oldgnu_header.ctime);
547 stat_info->atime.tv_nsec = stat_info->ctime.tv_nsec = 0;
548 }
549 else if (format == STAR_FORMAT)
550 {
551 stat_info->atime.tv_sec = TIME_FROM_HEADER (header->star_header.atime);
552 stat_info->ctime.tv_sec = TIME_FROM_HEADER (header->star_header.ctime);
553 stat_info->atime.tv_nsec = stat_info->ctime.tv_nsec = 0;
554 }
555 else
556 stat_info->atime = stat_info->ctime = start_time;
557
558 if (format == V7_FORMAT)
559 {
560 stat_info->stat.st_uid = UID_FROM_HEADER (header->header.uid);
561 stat_info->stat.st_gid = GID_FROM_HEADER (header->header.gid);
562 stat_info->stat.st_rdev = 0;
563 }
564 else
565 {
566 if (do_user_group)
567 {
568 /* FIXME: Decide if this should somewhat depend on -p. */
569
570 if (numeric_owner_option
571 || !*header->header.uname
572 || !uname_to_uid (header->header.uname, &stat_info->stat.st_uid))
573 stat_info->stat.st_uid = UID_FROM_HEADER (header->header.uid);
574
575 if (numeric_owner_option
576 || !*header->header.gname
577 || !gname_to_gid (header->header.gname, &stat_info->stat.st_gid))
578 stat_info->stat.st_gid = GID_FROM_HEADER (header->header.gid);
579 }
580
581 switch (header->header.typeflag)
582 {
583 case BLKTYPE:
584 case CHRTYPE:
585 stat_info->stat.st_rdev =
586 makedev (MAJOR_FROM_HEADER (header->header.devmajor),
587 MINOR_FROM_HEADER (header->header.devminor));
588 break;
589
590 default:
591 stat_info->stat.st_rdev = 0;
592 }
593 }
594
595 stat_info->archive_file_size = stat_info->stat.st_size;
596 xheader_decode (stat_info);
597
598 if (sparse_member_p (stat_info))
599 {
600 sparse_fixup_header (stat_info);
601 stat_info->is_sparse = true;
602 }
603 else
604 stat_info->is_sparse = false;
605 }
606
607 /* Convert buffer at WHERE0 of size DIGS from external format to
608 uintmax_t. DIGS must be positive. If TYPE is nonnull, the data
609 are of type TYPE. The buffer must represent a value in the range
610 -MINUS_MINVAL through MAXVAL. If OCTAL_ONLY, allow only octal
611 numbers instead of the other GNU extensions. Return -1 on error,
612 diagnosing the error if TYPE is nonnull and if !SILENT. */
613 static uintmax_t
614 from_header (char const *where0, size_t digs, char const *type,
615 uintmax_t minus_minval, uintmax_t maxval,
616 bool octal_only, bool silent)
617 {
618 uintmax_t value;
619 char const *where = where0;
620 char const *lim = where + digs;
621 int negative = 0;
622
623 /* Accommodate buggy tar of unknown vintage, which outputs leading
624 NUL if the previous field overflows. */
625 where += !*where;
626
627 /* Accommodate older tars, which output leading spaces. */
628 for (;;)
629 {
630 if (where == lim)
631 {
632 if (type && !silent)
633 ERROR ((0, 0,
634 /* TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.) */
635 _("Blanks in header where numeric %s value expected"),
636 type));
637 return -1;
638 }
639 if (!ISSPACE ((unsigned char) *where))
640 break;
641 where++;
642 }
643
644 value = 0;
645 if (ISODIGIT (*where))
646 {
647 char const *where1 = where;
648 uintmax_t overflow = 0;
649
650 for (;;)
651 {
652 value += *where++ - '0';
653 if (where == lim || ! ISODIGIT (*where))
654 break;
655 overflow |= value ^ (value << LG_8 >> LG_8);
656 value <<= LG_8;
657 }
658
659 /* Parse the output of older, unportable tars, which generate
660 negative values in two's complement octal. If the leading
661 nonzero digit is 1, we can't recover the original value
662 reliably; so do this only if the digit is 2 or more. This
663 catches the common case of 32-bit negative time stamps. */
664 if ((overflow || maxval < value) && '2' <= *where1 && type)
665 {
666 /* Compute the negative of the input value, assuming two's
667 complement. */
668 int digit = (*where1 - '0') | 4;
669 overflow = 0;
670 value = 0;
671 where = where1;
672 for (;;)
673 {
674 value += 7 - digit;
675 where++;
676 if (where == lim || ! ISODIGIT (*where))
677 break;
678 digit = *where - '0';
679 overflow |= value ^ (value << LG_8 >> LG_8);
680 value <<= LG_8;
681 }
682 value++;
683 overflow |= !value;
684
685 if (!overflow && value <= minus_minval)
686 {
687 if (!silent)
688 WARN ((0, 0,
689 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
690 _("Archive octal value %.*s is out of %s range; assuming two's complement"),
691 (int) (where - where1), where1, type));
692 negative = 1;
693 }
694 }
695
696 if (overflow)
697 {
698 if (type && !silent)
699 ERROR ((0, 0,
700 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
701 _("Archive octal value %.*s is out of %s range"),
702 (int) (where - where1), where1, type));
703 return -1;
704 }
705 }
706 else if (octal_only)
707 {
708 /* Suppress the following extensions. */
709 }
710 else if (*where == '-' || *where == '+')
711 {
712 /* Parse base-64 output produced only by tar test versions
713 1.13.6 (1999-08-11) through 1.13.11 (1999-08-23).
714 Support for this will be withdrawn in future releases. */
715 int dig;
716 if (!silent)
717 {
718 static bool warned_once;
719 if (! warned_once)
720 {
721 warned_once = true;
722 WARN ((0, 0, _("Archive contains obsolescent base-64 headers")));
723 }
724 }
725 negative = *where++ == '-';
726 while (where != lim
727 && (dig = base64_map[(unsigned char) *where]) < 64)
728 {
729 if (value << LG_64 >> LG_64 != value)
730 {
731 char *string = alloca (digs + 1);
732 memcpy (string, where0, digs);
733 string[digs] = '\0';
734 if (type && !silent)
735 ERROR ((0, 0,
736 _("Archive signed base-64 string %s is out of %s range"),
737 quote (string), type));
738 return -1;
739 }
740 value = (value << LG_64) | dig;
741 where++;
742 }
743 }
744 else if (*where == '\200' /* positive base-256 */
745 || *where == '\377' /* negative base-256 */)
746 {
747 /* Parse base-256 output. A nonnegative number N is
748 represented as (256**DIGS)/2 + N; a negative number -N is
749 represented as (256**DIGS) - N, i.e. as two's complement.
750 The representation guarantees that the leading bit is
751 always on, so that we don't confuse this format with the
752 others (assuming ASCII bytes of 8 bits or more). */
753 int signbit = *where & (1 << (LG_256 - 2));
754 uintmax_t topbits = (((uintmax_t) - signbit)
755 << (CHAR_BIT * sizeof (uintmax_t)
756 - LG_256 - (LG_256 - 2)));
757 value = (*where++ & ((1 << (LG_256 - 2)) - 1)) - signbit;
758 for (;;)
759 {
760 value = (value << LG_256) + (unsigned char) *where++;
761 if (where == lim)
762 break;
763 if (((value << LG_256 >> LG_256) | topbits) != value)
764 {
765 if (type && !silent)
766 ERROR ((0, 0,
767 _("Archive base-256 value is out of %s range"),
768 type));
769 return -1;
770 }
771 }
772 negative = signbit;
773 if (negative)
774 value = -value;
775 }
776
777 if (where != lim && *where && !ISSPACE ((unsigned char) *where))
778 {
779 if (type)
780 {
781 char buf[1000]; /* Big enough to represent any header. */
782 static struct quoting_options *o;
783
784 if (!o)
785 {
786 o = clone_quoting_options (0);
787 set_quoting_style (o, locale_quoting_style);
788 }
789
790 while (where0 != lim && ! lim[-1])
791 lim--;
792 quotearg_buffer (buf, sizeof buf, where0, lim - where, o);
793 if (!silent)
794 ERROR ((0, 0,
795 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
796 _("Archive contains %.*s where numeric %s value expected"),
797 (int) sizeof buf, buf, type));
798 }
799
800 return -1;
801 }
802
803 if (value <= (negative ? minus_minval : maxval))
804 return negative ? -value : value;
805
806 if (type && !silent)
807 {
808 char minval_buf[UINTMAX_STRSIZE_BOUND + 1];
809 char maxval_buf[UINTMAX_STRSIZE_BOUND];
810 char value_buf[UINTMAX_STRSIZE_BOUND + 1];
811 char *minval_string = STRINGIFY_BIGINT (minus_minval, minval_buf + 1);
812 char *value_string = STRINGIFY_BIGINT (value, value_buf + 1);
813 if (negative)
814 *--value_string = '-';
815 if (minus_minval)
816 *--minval_string = '-';
817 /* TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.) */
818 ERROR ((0, 0, _("Archive value %s is out of %s range %s..%s"),
819 value_string, type,
820 minval_string, STRINGIFY_BIGINT (maxval, maxval_buf)));
821 }
822
823 return -1;
824 }
825
826 gid_t
827 gid_from_header (const char *p, size_t s)
828 {
829 return from_header (p, s, "gid_t",
830 - (uintmax_t) TYPE_MINIMUM (gid_t),
831 (uintmax_t) TYPE_MAXIMUM (gid_t),
832 false, false);
833 }
834
835 major_t
836 major_from_header (const char *p, size_t s)
837 {
838 return from_header (p, s, "major_t",
839 - (uintmax_t) TYPE_MINIMUM (major_t),
840 (uintmax_t) TYPE_MAXIMUM (major_t), false, false);
841 }
842
843 minor_t
844 minor_from_header (const char *p, size_t s)
845 {
846 return from_header (p, s, "minor_t",
847 - (uintmax_t) TYPE_MINIMUM (minor_t),
848 (uintmax_t) TYPE_MAXIMUM (minor_t), false, false);
849 }
850
851 mode_t
852 mode_from_header (const char *p, size_t s)
853 {
854 /* Do not complain about unrecognized mode bits. */
855 unsigned u = from_header (p, s, "mode_t",
856 - (uintmax_t) TYPE_MINIMUM (mode_t),
857 TYPE_MAXIMUM (uintmax_t), false, false);
858 return ((u & TSUID ? S_ISUID : 0)
859 | (u & TSGID ? S_ISGID : 0)
860 | (u & TSVTX ? S_ISVTX : 0)
861 | (u & TUREAD ? S_IRUSR : 0)
862 | (u & TUWRITE ? S_IWUSR : 0)
863 | (u & TUEXEC ? S_IXUSR : 0)
864 | (u & TGREAD ? S_IRGRP : 0)
865 | (u & TGWRITE ? S_IWGRP : 0)
866 | (u & TGEXEC ? S_IXGRP : 0)
867 | (u & TOREAD ? S_IROTH : 0)
868 | (u & TOWRITE ? S_IWOTH : 0)
869 | (u & TOEXEC ? S_IXOTH : 0));
870 }
871
872 off_t
873 off_from_header (const char *p, size_t s)
874 {
875 /* Negative offsets are not allowed in tar files, so invoke
876 from_header with minimum value 0, not TYPE_MINIMUM (off_t). */
877 return from_header (p, s, "off_t", (uintmax_t) 0,
878 (uintmax_t) TYPE_MAXIMUM (off_t), false, false);
879 }
880
881 size_t
882 size_from_header (const char *p, size_t s)
883 {
884 return from_header (p, s, "size_t", (uintmax_t) 0,
885 (uintmax_t) TYPE_MAXIMUM (size_t), false, false);
886 }
887
888 time_t
889 time_from_header (const char *p, size_t s)
890 {
891 return from_header (p, s, "time_t",
892 - (uintmax_t) TYPE_MINIMUM (time_t),
893 (uintmax_t) TYPE_MAXIMUM (time_t), false, false);
894 }
895
896 uid_t
897 uid_from_header (const char *p, size_t s)
898 {
899 return from_header (p, s, "uid_t",
900 - (uintmax_t) TYPE_MINIMUM (uid_t),
901 (uintmax_t) TYPE_MAXIMUM (uid_t), false, false);
902 }
903
904 uintmax_t
905 uintmax_from_header (const char *p, size_t s)
906 {
907 return from_header (p, s, "uintmax_t", (uintmax_t) 0,
908 TYPE_MAXIMUM (uintmax_t), false, false);
909 }
910
911
912 /* Return a printable representation of T. The result points to
913 static storage that can be reused in the next call to this
914 function, to ctime, or to asctime. If FULL_TIME, then output the
915 time stamp to its full resolution; otherwise, just output it to
916 1-minute resolution. */
917 char const *
918 tartime (struct timespec t, bool full_time)
919 {
920 enum { fraclen = sizeof ".FFFFFFFFF" - 1 };
921 static char buffer[max (UINTMAX_STRSIZE_BOUND + 1,
922 INT_STRLEN_BOUND (int) + 16)
923 + fraclen];
924 struct tm *tm;
925 time_t s = t.tv_sec;
926 int ns = t.tv_nsec;
927 bool negative = s < 0;
928 char *p;
929
930 if (negative && ns != 0)
931 {
932 s++;
933 ns = 1000000000 - ns;
934 }
935
936 tm = utc_option ? gmtime (&s) : localtime (&s);
937 if (tm)
938 {
939 if (full_time)
940 {
941 sprintf (buffer, "%04ld-%02d-%02d %02d:%02d:%02d",
942 tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
943 tm->tm_hour, tm->tm_min, tm->tm_sec);
944 code_ns_fraction (ns, buffer + strlen (buffer));
945 }
946 else
947 sprintf (buffer, "%04ld-%02d-%02d %02d:%02d",
948 tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
949 tm->tm_hour, tm->tm_min);
950 return buffer;
951 }
952
953 /* The time stamp cannot be broken down, most likely because it
954 is out of range. Convert it as an integer,
955 right-adjusted in a field with the same width as the usual
956 4-year ISO time format. */
957 p = umaxtostr (negative ? - (uintmax_t) s : s,
958 buffer + sizeof buffer - UINTMAX_STRSIZE_BOUND - fraclen);
959 if (negative)
960 *--p = '-';
961 while ((buffer + sizeof buffer - sizeof "YYYY-MM-DD HH:MM"
962 + (full_time ? sizeof ":SS.FFFFFFFFF" - 1 : 0))
963 < p)
964 *--p = ' ';
965 if (full_time)
966 code_ns_fraction (ns, buffer + sizeof buffer - 1 - fraclen);
967 return p;
968 }
969
970 /* Actually print it.
971
972 Plain and fancy file header block logging. Non-verbose just prints
973 the name, e.g. for "tar t" or "tar x". This should just contain
974 file names, so it can be fed back into tar with xargs or the "-T"
975 option. The verbose option can give a bunch of info, one line per
976 file. I doubt anybody tries to parse its format, or if they do,
977 they shouldn't. Unix tar is pretty random here anyway. */
978
979
980 /* FIXME: Note that print_header uses the globals HEAD, HSTAT, and
981 HEAD_STANDARD, which must be set up in advance. Not very clean.. */
982
983 /* Width of "user/group size", with initial value chosen
984 heuristically. This grows as needed, though this may cause some
985 stairstepping in the output. Make it too small and the output will
986 almost always look ragged. Make it too large and the output will
987 be spaced out too far. */
988 static int ugswidth = 19;
989
990 /* Width of printed time stamps. It grows if longer time stamps are
991 found (typically, those with nanosecond resolution). Like
992 USGWIDTH, some stairstepping may occur. */
993 static int datewidth = sizeof "YYYY-MM-DD HH:MM" - 1;
994
995 void
996 print_header (struct tar_stat_info *st, off_t block_ordinal)
997 {
998 char modes[11];
999 char const *time_stamp;
1000 int time_stamp_len;
1001 char *temp_name = st->orig_file_name ? st->orig_file_name : st->file_name;
1002
1003 /* These hold formatted ints. */
1004 char uform[UINTMAX_STRSIZE_BOUND], gform[UINTMAX_STRSIZE_BOUND];
1005 char *user, *group;
1006 char size[2 * UINTMAX_STRSIZE_BOUND];
1007 /* holds formatted size or major,minor */
1008 char uintbuf[UINTMAX_STRSIZE_BOUND];
1009 int pad;
1010 int sizelen;
1011
1012 if (test_label_option && current_header->header.typeflag != GNUTYPE_VOLHDR)
1013 return;
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 if (multi_volume_option)
1274 {
1275 save_totsize = size;
1276 save_sizeleft = size;
1277 }
1278
1279 if (seekable_archive)
1280 {
1281 off_t nblk = seek_archive (size);
1282 if (nblk >= 0)
1283 {
1284 size -= nblk * BLOCKSIZE;
1285 if (multi_volume_option) /* Argh.. */
1286 save_sizeleft -= nblk * BLOCKSIZE;
1287 }
1288 else
1289 seekable_archive = false;
1290 }
1291
1292 while (size > 0)
1293 {
1294 x = find_next_block ();
1295 if (! x)
1296 FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
1297
1298 set_next_block_after (x);
1299 size -= BLOCKSIZE;
1300 if (multi_volume_option)
1301 save_sizeleft -= BLOCKSIZE;
1302 }
1303 }
1304
1305 /* Skip the current member in the archive.
1306 NOTE: Current header must be decoded before calling this function. */
1307 void
1308 skip_member (void)
1309 {
1310 char save_typeflag = current_header->header.typeflag;
1311 set_next_block_after (current_header);
1312
1313 assign_string (&save_name, current_stat_info.orig_file_name);
1314
1315 if (current_stat_info.is_sparse)
1316 sparse_skip_file (&current_stat_info);
1317 else if (save_typeflag != DIRTYPE)
1318 skip_file (current_stat_info.stat.st_size);
1319 }
This page took 0.095949 seconds and 5 git commands to generate.