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