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