]> Dogcows Code - chaz/tar/blob - src/list.c
Fix listing of volume labels (in particular in PAX archives).
[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, etc.) */
676 _("Blanks in header where numeric %s value expected"),
677 type));
678 return -1;
679 }
680 if (!ISSPACE ((unsigned char) *where))
681 break;
682 where++;
683 }
684
685 value = 0;
686 if (ISODIGIT (*where))
687 {
688 char const *where1 = where;
689 uintmax_t overflow = 0;
690
691 for (;;)
692 {
693 value += *where++ - '0';
694 if (where == lim || ! ISODIGIT (*where))
695 break;
696 overflow |= value ^ (value << LG_8 >> LG_8);
697 value <<= LG_8;
698 }
699
700 /* Parse the output of older, unportable tars, which generate
701 negative values in two's complement octal. If the leading
702 nonzero digit is 1, we can't recover the original value
703 reliably; so do this only if the digit is 2 or more. This
704 catches the common case of 32-bit negative time stamps. */
705 if ((overflow || maxval < value) && '2' <= *where1 && type)
706 {
707 /* Compute the negative of the input value, assuming two's
708 complement. */
709 int digit = (*where1 - '0') | 4;
710 overflow = 0;
711 value = 0;
712 where = where1;
713 for (;;)
714 {
715 value += 7 - digit;
716 where++;
717 if (where == lim || ! ISODIGIT (*where))
718 break;
719 digit = *where - '0';
720 overflow |= value ^ (value << LG_8 >> LG_8);
721 value <<= LG_8;
722 }
723 value++;
724 overflow |= !value;
725
726 if (!overflow && value <= minus_minval)
727 {
728 if (!silent)
729 WARN ((0, 0,
730 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
731 _("Archive octal value %.*s is out of %s range; assuming two's complement"),
732 (int) (where - where1), where1, type));
733 negative = 1;
734 }
735 }
736
737 if (overflow)
738 {
739 if (type && !silent)
740 ERROR ((0, 0,
741 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
742 _("Archive octal value %.*s is out of %s range"),
743 (int) (where - where1), where1, type));
744 return -1;
745 }
746 }
747 else if (octal_only)
748 {
749 /* Suppress the following extensions. */
750 }
751 else if (*where == '-' || *where == '+')
752 {
753 /* Parse base-64 output produced only by tar test versions
754 1.13.6 (1999-08-11) through 1.13.11 (1999-08-23).
755 Support for this will be withdrawn in future releases. */
756 int dig;
757 if (!silent)
758 {
759 static bool warned_once;
760 if (! warned_once)
761 {
762 warned_once = true;
763 WARN ((0, 0, _("Archive contains obsolescent base-64 headers")));
764 }
765 }
766 negative = *where++ == '-';
767 while (where != lim
768 && (dig = base64_map[(unsigned char) *where]) < 64)
769 {
770 if (value << LG_64 >> LG_64 != value)
771 {
772 char *string = alloca (digs + 1);
773 memcpy (string, where0, digs);
774 string[digs] = '\0';
775 if (type && !silent)
776 ERROR ((0, 0,
777 _("Archive signed base-64 string %s is out of %s range"),
778 quote (string), type));
779 return -1;
780 }
781 value = (value << LG_64) | dig;
782 where++;
783 }
784 }
785 else if (*where == '\200' /* positive base-256 */
786 || *where == '\377' /* negative base-256 */)
787 {
788 /* Parse base-256 output. A nonnegative number N is
789 represented as (256**DIGS)/2 + N; a negative number -N is
790 represented as (256**DIGS) - N, i.e. as two's complement.
791 The representation guarantees that the leading bit is
792 always on, so that we don't confuse this format with the
793 others (assuming ASCII bytes of 8 bits or more). */
794 int signbit = *where & (1 << (LG_256 - 2));
795 uintmax_t topbits = (((uintmax_t) - signbit)
796 << (CHAR_BIT * sizeof (uintmax_t)
797 - LG_256 - (LG_256 - 2)));
798 value = (*where++ & ((1 << (LG_256 - 2)) - 1)) - signbit;
799 for (;;)
800 {
801 value = (value << LG_256) + (unsigned char) *where++;
802 if (where == lim)
803 break;
804 if (((value << LG_256 >> LG_256) | topbits) != value)
805 {
806 if (type && !silent)
807 ERROR ((0, 0,
808 _("Archive base-256 value is out of %s range"),
809 type));
810 return -1;
811 }
812 }
813 negative = signbit;
814 if (negative)
815 value = -value;
816 }
817
818 if (where != lim && *where && !ISSPACE ((unsigned char) *where))
819 {
820 if (type)
821 {
822 char buf[1000]; /* Big enough to represent any header. */
823 static struct quoting_options *o;
824
825 if (!o)
826 {
827 o = clone_quoting_options (0);
828 set_quoting_style (o, locale_quoting_style);
829 }
830
831 while (where0 != lim && ! lim[-1])
832 lim--;
833 quotearg_buffer (buf, sizeof buf, where0, lim - where, o);
834 if (!silent)
835 ERROR ((0, 0,
836 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
837 _("Archive contains %.*s where numeric %s value expected"),
838 (int) sizeof buf, buf, type));
839 }
840
841 return -1;
842 }
843
844 if (value <= (negative ? minus_minval : maxval))
845 return negative ? -value : value;
846
847 if (type && !silent)
848 {
849 char minval_buf[UINTMAX_STRSIZE_BOUND + 1];
850 char maxval_buf[UINTMAX_STRSIZE_BOUND];
851 char value_buf[UINTMAX_STRSIZE_BOUND + 1];
852 char *minval_string = STRINGIFY_BIGINT (minus_minval, minval_buf + 1);
853 char *value_string = STRINGIFY_BIGINT (value, value_buf + 1);
854 if (negative)
855 *--value_string = '-';
856 if (minus_minval)
857 *--minval_string = '-';
858 /* TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.) */
859 ERROR ((0, 0, _("Archive value %s is out of %s range %s..%s"),
860 value_string, type,
861 minval_string, STRINGIFY_BIGINT (maxval, maxval_buf)));
862 }
863
864 return -1;
865 }
866
867 gid_t
868 gid_from_header (const char *p, size_t s)
869 {
870 return from_header (p, s, "gid_t",
871 - (uintmax_t) TYPE_MINIMUM (gid_t),
872 (uintmax_t) TYPE_MAXIMUM (gid_t),
873 false, false);
874 }
875
876 major_t
877 major_from_header (const char *p, size_t s)
878 {
879 return from_header (p, s, "major_t",
880 - (uintmax_t) TYPE_MINIMUM (major_t),
881 (uintmax_t) TYPE_MAXIMUM (major_t), false, false);
882 }
883
884 minor_t
885 minor_from_header (const char *p, size_t s)
886 {
887 return from_header (p, s, "minor_t",
888 - (uintmax_t) TYPE_MINIMUM (minor_t),
889 (uintmax_t) TYPE_MAXIMUM (minor_t), false, false);
890 }
891
892 /* Convert P to the file mode, as understood by tar.
893 Store unrecognized mode bits (from 10th up) in HBITS. */
894 mode_t
895 mode_from_header (const char *p, size_t s, unsigned *hbits)
896 {
897 unsigned u = from_header (p, s, "mode_t",
898 - (uintmax_t) TYPE_MINIMUM (mode_t),
899 TYPE_MAXIMUM (uintmax_t), false, false);
900 mode_t mode = ((u & TSUID ? S_ISUID : 0)
901 | (u & TSGID ? S_ISGID : 0)
902 | (u & TSVTX ? S_ISVTX : 0)
903 | (u & TUREAD ? S_IRUSR : 0)
904 | (u & TUWRITE ? S_IWUSR : 0)
905 | (u & TUEXEC ? S_IXUSR : 0)
906 | (u & TGREAD ? S_IRGRP : 0)
907 | (u & TGWRITE ? S_IWGRP : 0)
908 | (u & TGEXEC ? S_IXGRP : 0)
909 | (u & TOREAD ? S_IROTH : 0)
910 | (u & TOWRITE ? S_IWOTH : 0)
911 | (u & TOEXEC ? S_IXOTH : 0));
912 *hbits = mode ^ u;
913 return mode;
914 }
915
916 off_t
917 off_from_header (const char *p, size_t s)
918 {
919 /* Negative offsets are not allowed in tar files, so invoke
920 from_header with minimum value 0, not TYPE_MINIMUM (off_t). */
921 return from_header (p, s, "off_t", (uintmax_t) 0,
922 (uintmax_t) TYPE_MAXIMUM (off_t), false, false);
923 }
924
925 size_t
926 size_from_header (const char *p, size_t s)
927 {
928 return from_header (p, s, "size_t", (uintmax_t) 0,
929 (uintmax_t) TYPE_MAXIMUM (size_t), false, false);
930 }
931
932 time_t
933 time_from_header (const char *p, size_t s)
934 {
935 return from_header (p, s, "time_t",
936 - (uintmax_t) TYPE_MINIMUM (time_t),
937 (uintmax_t) TYPE_MAXIMUM (time_t), false, false);
938 }
939
940 uid_t
941 uid_from_header (const char *p, size_t s)
942 {
943 return from_header (p, s, "uid_t",
944 - (uintmax_t) TYPE_MINIMUM (uid_t),
945 (uintmax_t) TYPE_MAXIMUM (uid_t), false, false);
946 }
947
948 uintmax_t
949 uintmax_from_header (const char *p, size_t s)
950 {
951 return from_header (p, s, "uintmax_t", (uintmax_t) 0,
952 TYPE_MAXIMUM (uintmax_t), false, false);
953 }
954
955
956 /* Return a printable representation of T. The result points to
957 static storage that can be reused in the next call to this
958 function, to ctime, or to asctime. If FULL_TIME, then output the
959 time stamp to its full resolution; otherwise, just output it to
960 1-minute resolution. */
961 char const *
962 tartime (struct timespec t, bool full_time)
963 {
964 enum { fraclen = sizeof ".FFFFFFFFF" - 1 };
965 static char buffer[max (UINTMAX_STRSIZE_BOUND + 1,
966 INT_STRLEN_BOUND (int) + 16)
967 + fraclen];
968 struct tm *tm;
969 time_t s = t.tv_sec;
970 int ns = t.tv_nsec;
971 bool negative = s < 0;
972 char *p;
973
974 if (negative && ns != 0)
975 {
976 s++;
977 ns = 1000000000 - ns;
978 }
979
980 tm = utc_option ? gmtime (&s) : localtime (&s);
981 if (tm)
982 {
983 if (full_time)
984 {
985 sprintf (buffer, "%04ld-%02d-%02d %02d:%02d:%02d",
986 tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
987 tm->tm_hour, tm->tm_min, tm->tm_sec);
988 code_ns_fraction (ns, buffer + strlen (buffer));
989 }
990 else
991 sprintf (buffer, "%04ld-%02d-%02d %02d:%02d",
992 tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
993 tm->tm_hour, tm->tm_min);
994 return buffer;
995 }
996
997 /* The time stamp cannot be broken down, most likely because it
998 is out of range. Convert it as an integer,
999 right-adjusted in a field with the same width as the usual
1000 4-year ISO time format. */
1001 p = umaxtostr (negative ? - (uintmax_t) s : s,
1002 buffer + sizeof buffer - UINTMAX_STRSIZE_BOUND - fraclen);
1003 if (negative)
1004 *--p = '-';
1005 while ((buffer + sizeof buffer - sizeof "YYYY-MM-DD HH:MM"
1006 + (full_time ? sizeof ":SS.FFFFFFFFF" - 1 : 0))
1007 < p)
1008 *--p = ' ';
1009 if (full_time)
1010 code_ns_fraction (ns, buffer + sizeof buffer - 1 - fraclen);
1011 return p;
1012 }
1013
1014 /* Actually print it.
1015
1016 Plain and fancy file header block logging. Non-verbose just prints
1017 the name, e.g. for "tar t" or "tar x". This should just contain
1018 file names, so it can be fed back into tar with xargs or the "-T"
1019 option. The verbose option can give a bunch of info, one line per
1020 file. I doubt anybody tries to parse its format, or if they do,
1021 they shouldn't. Unix tar is pretty random here anyway. */
1022
1023
1024 /* Width of "user/group size", with initial value chosen
1025 heuristically. This grows as needed, though this may cause some
1026 stairstepping in the output. Make it too small and the output will
1027 almost always look ragged. Make it too large and the output will
1028 be spaced out too far. */
1029 static int ugswidth = 19;
1030
1031 /* Width of printed time stamps. It grows if longer time stamps are
1032 found (typically, those with nanosecond resolution). Like
1033 USGWIDTH, some stairstepping may occur. */
1034 static int datewidth = sizeof "YYYY-MM-DD HH:MM" - 1;
1035
1036 static bool volume_label_printed = false;
1037
1038 static void
1039 simple_print_header (struct tar_stat_info *st, union block *blk,
1040 off_t block_ordinal)
1041 {
1042 char modes[11];
1043 char const *time_stamp;
1044 int time_stamp_len;
1045 char *temp_name;
1046
1047 /* These hold formatted ints. */
1048 char uform[UINTMAX_STRSIZE_BOUND], gform[UINTMAX_STRSIZE_BOUND];
1049 char *user, *group;
1050 char size[2 * UINTMAX_STRSIZE_BOUND];
1051 /* holds formatted size or major,minor */
1052 char uintbuf[UINTMAX_STRSIZE_BOUND];
1053 int pad;
1054 int sizelen;
1055
1056 if (test_label_option && blk->header.typeflag != GNUTYPE_VOLHDR)
1057 return;
1058
1059 if (show_transformed_names_option)
1060 temp_name = st->file_name ? st->file_name : st->orig_file_name;
1061 else
1062 temp_name = st->orig_file_name ? st->orig_file_name : st->file_name;
1063
1064 if (block_number_option)
1065 {
1066 char buf[UINTMAX_STRSIZE_BOUND];
1067 if (block_ordinal < 0)
1068 block_ordinal = current_block_ordinal ();
1069 block_ordinal -= recent_long_name_blocks;
1070 block_ordinal -= recent_long_link_blocks;
1071 fprintf (stdlis, _("block %s: "),
1072 STRINGIFY_BIGINT (block_ordinal, buf));
1073 }
1074
1075 if (verbose_option <= 1)
1076 {
1077 /* Just the fax, mam. */
1078 fprintf (stdlis, "%s\n", quotearg (temp_name));
1079 }
1080 else
1081 {
1082 /* File type and modes. */
1083
1084 modes[0] = '?';
1085 switch (blk->header.typeflag)
1086 {
1087 case GNUTYPE_VOLHDR:
1088 volume_label_printed = true;
1089 modes[0] = 'V';
1090 break;
1091
1092 case GNUTYPE_MULTIVOL:
1093 modes[0] = 'M';
1094 break;
1095
1096 case GNUTYPE_LONGNAME:
1097 case GNUTYPE_LONGLINK:
1098 modes[0] = 'L';
1099 ERROR ((0, 0, _("Unexpected long name header")));
1100 break;
1101
1102 case GNUTYPE_SPARSE:
1103 case REGTYPE:
1104 case AREGTYPE:
1105 modes[0] = '-';
1106 if (temp_name[strlen (temp_name) - 1] == '/')
1107 modes[0] = 'd';
1108 break;
1109 case LNKTYPE:
1110 modes[0] = 'h';
1111 break;
1112 case GNUTYPE_DUMPDIR:
1113 modes[0] = 'd';
1114 break;
1115 case DIRTYPE:
1116 modes[0] = 'd';
1117 break;
1118 case SYMTYPE:
1119 modes[0] = 'l';
1120 break;
1121 case BLKTYPE:
1122 modes[0] = 'b';
1123 break;
1124 case CHRTYPE:
1125 modes[0] = 'c';
1126 break;
1127 case FIFOTYPE:
1128 modes[0] = 'p';
1129 break;
1130 case CONTTYPE:
1131 modes[0] = 'C';
1132 break;
1133 }
1134
1135 pax_decode_mode (st->stat.st_mode, modes + 1);
1136
1137 /* Time stamp. */
1138
1139 time_stamp = tartime (st->mtime, false);
1140 time_stamp_len = strlen (time_stamp);
1141 if (datewidth < time_stamp_len)
1142 datewidth = time_stamp_len;
1143
1144 /* User and group names. */
1145
1146 if (st->uname
1147 && st->uname[0]
1148 && current_format != V7_FORMAT
1149 && !numeric_owner_option)
1150 user = st->uname;
1151 else
1152 {
1153 /* Try parsing it as an unsigned integer first, and as a
1154 uid_t if that fails. This method can list positive user
1155 ids that are too large to fit in a uid_t. */
1156 uintmax_t u = from_header (blk->header.uid,
1157 sizeof blk->header.uid, 0,
1158 (uintmax_t) 0,
1159 (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1160 false, false);
1161 if (u != -1)
1162 user = STRINGIFY_BIGINT (u, uform);
1163 else
1164 {
1165 sprintf (uform, "%ld",
1166 (long) UID_FROM_HEADER (blk->header.uid));
1167 user = uform;
1168 }
1169 }
1170
1171 if (st->gname
1172 && st->gname[0]
1173 && current_format != V7_FORMAT
1174 && !numeric_owner_option)
1175 group = st->gname;
1176 else
1177 {
1178 /* Try parsing it as an unsigned integer first, and as a
1179 gid_t if that fails. This method can list positive group
1180 ids that are too large to fit in a gid_t. */
1181 uintmax_t g = from_header (blk->header.gid,
1182 sizeof blk->header.gid, 0,
1183 (uintmax_t) 0,
1184 (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1185 false, false);
1186 if (g != -1)
1187 group = STRINGIFY_BIGINT (g, gform);
1188 else
1189 {
1190 sprintf (gform, "%ld",
1191 (long) GID_FROM_HEADER (blk->header.gid));
1192 group = gform;
1193 }
1194 }
1195
1196 /* Format the file size or major/minor device numbers. */
1197
1198 switch (blk->header.typeflag)
1199 {
1200 case CHRTYPE:
1201 case BLKTYPE:
1202 strcpy (size,
1203 STRINGIFY_BIGINT (major (st->stat.st_rdev), uintbuf));
1204 strcat (size, ",");
1205 strcat (size,
1206 STRINGIFY_BIGINT (minor (st->stat.st_rdev), uintbuf));
1207 break;
1208
1209 default:
1210 /* st->stat.st_size keeps stored file size */
1211 strcpy (size, STRINGIFY_BIGINT (st->stat.st_size, uintbuf));
1212 break;
1213 }
1214
1215 /* Figure out padding and print the whole line. */
1216
1217 sizelen = strlen (size);
1218 pad = strlen (user) + 1 + strlen (group) + 1 + sizelen;
1219 if (pad > ugswidth)
1220 ugswidth = pad;
1221
1222 fprintf (stdlis, "%s %s/%s %*s %-*s",
1223 modes, user, group, ugswidth - pad + sizelen, size,
1224 datewidth, time_stamp);
1225
1226 fprintf (stdlis, " %s", quotearg (temp_name));
1227
1228 switch (blk->header.typeflag)
1229 {
1230 case SYMTYPE:
1231 fprintf (stdlis, " -> %s\n", quotearg (st->link_name));
1232 break;
1233
1234 case LNKTYPE:
1235 fprintf (stdlis, _(" link to %s\n"), quotearg (st->link_name));
1236 break;
1237
1238 default:
1239 {
1240 char type_string[2];
1241 type_string[0] = blk->header.typeflag;
1242 type_string[1] = '\0';
1243 fprintf (stdlis, _(" unknown file type %s\n"),
1244 quote (type_string));
1245 }
1246 break;
1247
1248 case AREGTYPE:
1249 case REGTYPE:
1250 case GNUTYPE_SPARSE:
1251 case CHRTYPE:
1252 case BLKTYPE:
1253 case DIRTYPE:
1254 case FIFOTYPE:
1255 case CONTTYPE:
1256 case GNUTYPE_DUMPDIR:
1257 putc ('\n', stdlis);
1258 break;
1259
1260 case GNUTYPE_LONGLINK:
1261 fprintf (stdlis, _("--Long Link--\n"));
1262 break;
1263
1264 case GNUTYPE_LONGNAME:
1265 fprintf (stdlis, _("--Long Name--\n"));
1266 break;
1267
1268 case GNUTYPE_VOLHDR:
1269 fprintf (stdlis, _("--Volume Header--\n"));
1270 break;
1271
1272 case GNUTYPE_MULTIVOL:
1273 strcpy (size,
1274 STRINGIFY_BIGINT
1275 (UINTMAX_FROM_HEADER (blk->oldgnu_header.offset),
1276 uintbuf));
1277 fprintf (stdlis, _("--Continued at byte %s--\n"), size);
1278 break;
1279 }
1280 }
1281 fflush (stdlis);
1282 }
1283
1284
1285 void
1286 print_header (struct tar_stat_info *st, union block *blk,
1287 off_t block_ordinal)
1288 {
1289 if (current_format == POSIX_FORMAT && !volume_label_printed && volume_label)
1290 {
1291 struct tar_stat_info vstat;
1292 union block vblk;
1293 enum archive_format dummy;
1294
1295 volume_label_printed = true;
1296
1297 memset (&vblk, 0, sizeof (vblk));
1298 vblk.header.typeflag = GNUTYPE_VOLHDR;
1299 if (recent_global_header)
1300 memcpy (vblk.header.mtime, recent_global_header->header.mtime,
1301 sizeof vblk.header.mtime);
1302 tar_stat_init (&vstat);
1303 assign_string (&vstat.file_name, ".");
1304 decode_header (&vblk, &vstat, &dummy, 0);
1305 assign_string (&vstat.file_name, volume_label);
1306 simple_print_header (&vstat, &vblk, block_ordinal);
1307 tar_stat_destroy (&vstat);
1308 }
1309 simple_print_header (st, blk, block_ordinal);
1310 }
1311
1312 /* Print a similar line when we make a directory automatically. */
1313 void
1314 print_for_mkdir (char *dirname, int length, mode_t mode)
1315 {
1316 char modes[11];
1317
1318 if (verbose_option > 1)
1319 {
1320 /* File type and modes. */
1321
1322 modes[0] = 'd';
1323 pax_decode_mode (mode, modes + 1);
1324
1325 if (block_number_option)
1326 {
1327 char buf[UINTMAX_STRSIZE_BOUND];
1328 fprintf (stdlis, _("block %s: "),
1329 STRINGIFY_BIGINT (current_block_ordinal (), buf));
1330 }
1331
1332 fprintf (stdlis, "%s %*s %.*s\n", modes, ugswidth + 1 + datewidth,
1333 _("Creating directory:"), length, quotearg (dirname));
1334 }
1335 }
1336
1337 /* Skip over SIZE bytes of data in blocks in the archive. */
1338 void
1339 skip_file (off_t size)
1340 {
1341 union block *x;
1342
1343 /* FIXME: Make sure mv_begin is always called before it */
1344
1345 if (seekable_archive)
1346 {
1347 off_t nblk = seek_archive (size);
1348 if (nblk >= 0)
1349 size -= nblk * BLOCKSIZE;
1350 else
1351 seekable_archive = false;
1352 }
1353
1354 mv_size_left (size);
1355
1356 while (size > 0)
1357 {
1358 x = find_next_block ();
1359 if (! x)
1360 FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
1361
1362 set_next_block_after (x);
1363 size -= BLOCKSIZE;
1364 mv_size_left (size);
1365 }
1366 }
1367
1368 /* Skip the current member in the archive.
1369 NOTE: Current header must be decoded before calling this function. */
1370 void
1371 skip_member (void)
1372 {
1373 if (!current_stat_info.skipped)
1374 {
1375 char save_typeflag = current_header->header.typeflag;
1376 set_next_block_after (current_header);
1377
1378 mv_begin (&current_stat_info);
1379
1380 if (current_stat_info.is_sparse)
1381 sparse_skip_file (&current_stat_info);
1382 else if (save_typeflag != DIRTYPE)
1383 skip_file (current_stat_info.stat.st_size);
1384
1385 mv_end ();
1386 }
1387 }
This page took 0.106375 seconds and 5 git commands to generate.