]> Dogcows Code - chaz/tar/blob - src/list.c
Fix bug in OLDGNU format creation.
[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 unsigned hbits; /* high bits of the file mode. */
535 mode_t mode = MODE_FROM_HEADER (header->header.mode, &hbits);
536
537 if (strcmp (header->header.magic, TMAGIC) == 0)
538 {
539 if (header->star_header.prefix[130] == 0
540 && ISOCTAL (header->star_header.atime[0])
541 && header->star_header.atime[11] == ' '
542 && ISOCTAL (header->star_header.ctime[0])
543 && header->star_header.ctime[11] == ' ')
544 format = STAR_FORMAT;
545 else if (stat_info->xhdr.size)
546 format = POSIX_FORMAT;
547 else
548 format = USTAR_FORMAT;
549 }
550 else if (strcmp (header->header.magic, OLDGNU_MAGIC) == 0)
551 format = hbits ? OLDGNU_FORMAT : GNU_FORMAT;
552 else
553 format = V7_FORMAT;
554 *format_pointer = format;
555
556 stat_info->stat.st_mode = mode;
557 stat_info->mtime.tv_sec = TIME_FROM_HEADER (header->header.mtime);
558 stat_info->mtime.tv_nsec = 0;
559 assign_string (&stat_info->uname,
560 header->header.uname[0] ? header->header.uname : NULL);
561 assign_string (&stat_info->gname,
562 header->header.gname[0] ? header->header.gname : NULL);
563
564 if (format == OLDGNU_FORMAT && incremental_option)
565 {
566 stat_info->atime.tv_sec = TIME_FROM_HEADER (header->oldgnu_header.atime);
567 stat_info->ctime.tv_sec = TIME_FROM_HEADER (header->oldgnu_header.ctime);
568 stat_info->atime.tv_nsec = stat_info->ctime.tv_nsec = 0;
569 }
570 else if (format == STAR_FORMAT)
571 {
572 stat_info->atime.tv_sec = TIME_FROM_HEADER (header->star_header.atime);
573 stat_info->ctime.tv_sec = TIME_FROM_HEADER (header->star_header.ctime);
574 stat_info->atime.tv_nsec = stat_info->ctime.tv_nsec = 0;
575 }
576 else
577 stat_info->atime = stat_info->ctime = start_time;
578
579 if (format == V7_FORMAT)
580 {
581 stat_info->stat.st_uid = UID_FROM_HEADER (header->header.uid);
582 stat_info->stat.st_gid = GID_FROM_HEADER (header->header.gid);
583 stat_info->stat.st_rdev = 0;
584 }
585 else
586 {
587 if (do_user_group)
588 {
589 /* FIXME: Decide if this should somewhat depend on -p. */
590
591 if (numeric_owner_option
592 || !*header->header.uname
593 || !uname_to_uid (header->header.uname, &stat_info->stat.st_uid))
594 stat_info->stat.st_uid = UID_FROM_HEADER (header->header.uid);
595
596 if (numeric_owner_option
597 || !*header->header.gname
598 || !gname_to_gid (header->header.gname, &stat_info->stat.st_gid))
599 stat_info->stat.st_gid = GID_FROM_HEADER (header->header.gid);
600 }
601
602 switch (header->header.typeflag)
603 {
604 case BLKTYPE:
605 case CHRTYPE:
606 stat_info->stat.st_rdev =
607 makedev (MAJOR_FROM_HEADER (header->header.devmajor),
608 MINOR_FROM_HEADER (header->header.devminor));
609 break;
610
611 default:
612 stat_info->stat.st_rdev = 0;
613 }
614 }
615
616 stat_info->archive_file_size = stat_info->stat.st_size;
617 xheader_decode (stat_info);
618
619 if (sparse_member_p (stat_info))
620 {
621 sparse_fixup_header (stat_info);
622 stat_info->is_sparse = true;
623 }
624 else
625 {
626 stat_info->is_sparse = false;
627 if (((current_format == GNU_FORMAT
628 || current_format == OLDGNU_FORMAT)
629 && current_header->header.typeflag == GNUTYPE_DUMPDIR)
630 || stat_info->dumpdir)
631 stat_info->is_dumpdir = true;
632 }
633
634 transform_member_name (&stat_info->file_name, XFORM_REGFILE);
635 switch (header->header.typeflag)
636 {
637 case SYMTYPE:
638 transform_member_name (&stat_info->link_name, XFORM_SYMLINK);
639 break;
640
641 case LNKTYPE:
642 transform_member_name (&stat_info->link_name, XFORM_LINK);
643 }
644 }
645
646 /* Convert buffer at WHERE0 of size DIGS from external format to
647 uintmax_t. DIGS must be positive. If TYPE is nonnull, the data
648 are of type TYPE. The buffer must represent a value in the range
649 -MINUS_MINVAL through MAXVAL. If OCTAL_ONLY, allow only octal
650 numbers instead of the other GNU extensions. Return -1 on error,
651 diagnosing the error if TYPE is nonnull and if !SILENT. */
652 static uintmax_t
653 from_header (char const *where0, size_t digs, char const *type,
654 uintmax_t minus_minval, uintmax_t maxval,
655 bool octal_only, bool silent)
656 {
657 uintmax_t value;
658 char const *where = where0;
659 char const *lim = where + digs;
660 int negative = 0;
661
662 /* Accommodate buggy tar of unknown vintage, which outputs leading
663 NUL if the previous field overflows. */
664 where += !*where;
665
666 /* Accommodate older tars, which output leading spaces. */
667 for (;;)
668 {
669 if (where == lim)
670 {
671 if (type && !silent)
672 ERROR ((0, 0,
673 /* TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.) */
674 _("Blanks in header where numeric %s value expected"),
675 type));
676 return -1;
677 }
678 if (!ISSPACE ((unsigned char) *where))
679 break;
680 where++;
681 }
682
683 value = 0;
684 if (ISODIGIT (*where))
685 {
686 char const *where1 = where;
687 uintmax_t overflow = 0;
688
689 for (;;)
690 {
691 value += *where++ - '0';
692 if (where == lim || ! ISODIGIT (*where))
693 break;
694 overflow |= value ^ (value << LG_8 >> LG_8);
695 value <<= LG_8;
696 }
697
698 /* Parse the output of older, unportable tars, which generate
699 negative values in two's complement octal. If the leading
700 nonzero digit is 1, we can't recover the original value
701 reliably; so do this only if the digit is 2 or more. This
702 catches the common case of 32-bit negative time stamps. */
703 if ((overflow || maxval < value) && '2' <= *where1 && type)
704 {
705 /* Compute the negative of the input value, assuming two's
706 complement. */
707 int digit = (*where1 - '0') | 4;
708 overflow = 0;
709 value = 0;
710 where = where1;
711 for (;;)
712 {
713 value += 7 - digit;
714 where++;
715 if (where == lim || ! ISODIGIT (*where))
716 break;
717 digit = *where - '0';
718 overflow |= value ^ (value << LG_8 >> LG_8);
719 value <<= LG_8;
720 }
721 value++;
722 overflow |= !value;
723
724 if (!overflow && value <= minus_minval)
725 {
726 if (!silent)
727 WARN ((0, 0,
728 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
729 _("Archive octal value %.*s is out of %s range; assuming two's complement"),
730 (int) (where - where1), where1, type));
731 negative = 1;
732 }
733 }
734
735 if (overflow)
736 {
737 if (type && !silent)
738 ERROR ((0, 0,
739 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
740 _("Archive octal value %.*s is out of %s range"),
741 (int) (where - where1), where1, type));
742 return -1;
743 }
744 }
745 else if (octal_only)
746 {
747 /* Suppress the following extensions. */
748 }
749 else if (*where == '-' || *where == '+')
750 {
751 /* Parse base-64 output produced only by tar test versions
752 1.13.6 (1999-08-11) through 1.13.11 (1999-08-23).
753 Support for this will be withdrawn in future releases. */
754 int dig;
755 if (!silent)
756 {
757 static bool warned_once;
758 if (! warned_once)
759 {
760 warned_once = true;
761 WARN ((0, 0, _("Archive contains obsolescent base-64 headers")));
762 }
763 }
764 negative = *where++ == '-';
765 while (where != lim
766 && (dig = base64_map[(unsigned char) *where]) < 64)
767 {
768 if (value << LG_64 >> LG_64 != value)
769 {
770 char *string = alloca (digs + 1);
771 memcpy (string, where0, digs);
772 string[digs] = '\0';
773 if (type && !silent)
774 ERROR ((0, 0,
775 _("Archive signed base-64 string %s is out of %s range"),
776 quote (string), type));
777 return -1;
778 }
779 value = (value << LG_64) | dig;
780 where++;
781 }
782 }
783 else if (*where == '\200' /* positive base-256 */
784 || *where == '\377' /* negative base-256 */)
785 {
786 /* Parse base-256 output. A nonnegative number N is
787 represented as (256**DIGS)/2 + N; a negative number -N is
788 represented as (256**DIGS) - N, i.e. as two's complement.
789 The representation guarantees that the leading bit is
790 always on, so that we don't confuse this format with the
791 others (assuming ASCII bytes of 8 bits or more). */
792 int signbit = *where & (1 << (LG_256 - 2));
793 uintmax_t topbits = (((uintmax_t) - signbit)
794 << (CHAR_BIT * sizeof (uintmax_t)
795 - LG_256 - (LG_256 - 2)));
796 value = (*where++ & ((1 << (LG_256 - 2)) - 1)) - signbit;
797 for (;;)
798 {
799 value = (value << LG_256) + (unsigned char) *where++;
800 if (where == lim)
801 break;
802 if (((value << LG_256 >> LG_256) | topbits) != value)
803 {
804 if (type && !silent)
805 ERROR ((0, 0,
806 _("Archive base-256 value is out of %s range"),
807 type));
808 return -1;
809 }
810 }
811 negative = signbit;
812 if (negative)
813 value = -value;
814 }
815
816 if (where != lim && *where && !ISSPACE ((unsigned char) *where))
817 {
818 if (type)
819 {
820 char buf[1000]; /* Big enough to represent any header. */
821 static struct quoting_options *o;
822
823 if (!o)
824 {
825 o = clone_quoting_options (0);
826 set_quoting_style (o, locale_quoting_style);
827 }
828
829 while (where0 != lim && ! lim[-1])
830 lim--;
831 quotearg_buffer (buf, sizeof buf, where0, lim - where, o);
832 if (!silent)
833 ERROR ((0, 0,
834 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
835 _("Archive contains %.*s where numeric %s value expected"),
836 (int) sizeof buf, buf, type));
837 }
838
839 return -1;
840 }
841
842 if (value <= (negative ? minus_minval : maxval))
843 return negative ? -value : value;
844
845 if (type && !silent)
846 {
847 char minval_buf[UINTMAX_STRSIZE_BOUND + 1];
848 char maxval_buf[UINTMAX_STRSIZE_BOUND];
849 char value_buf[UINTMAX_STRSIZE_BOUND + 1];
850 char *minval_string = STRINGIFY_BIGINT (minus_minval, minval_buf + 1);
851 char *value_string = STRINGIFY_BIGINT (value, value_buf + 1);
852 if (negative)
853 *--value_string = '-';
854 if (minus_minval)
855 *--minval_string = '-';
856 /* TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.) */
857 ERROR ((0, 0, _("Archive value %s is out of %s range %s..%s"),
858 value_string, type,
859 minval_string, STRINGIFY_BIGINT (maxval, maxval_buf)));
860 }
861
862 return -1;
863 }
864
865 gid_t
866 gid_from_header (const char *p, size_t s)
867 {
868 return from_header (p, s, "gid_t",
869 - (uintmax_t) TYPE_MINIMUM (gid_t),
870 (uintmax_t) TYPE_MAXIMUM (gid_t),
871 false, false);
872 }
873
874 major_t
875 major_from_header (const char *p, size_t s)
876 {
877 return from_header (p, s, "major_t",
878 - (uintmax_t) TYPE_MINIMUM (major_t),
879 (uintmax_t) TYPE_MAXIMUM (major_t), false, false);
880 }
881
882 minor_t
883 minor_from_header (const char *p, size_t s)
884 {
885 return from_header (p, s, "minor_t",
886 - (uintmax_t) TYPE_MINIMUM (minor_t),
887 (uintmax_t) TYPE_MAXIMUM (minor_t), false, false);
888 }
889
890 /* Convert P to the file mode, as understood by tar.
891 Store unrecognized mode bits (from 10th up) in HBITS. */
892 mode_t
893 mode_from_header (const char *p, size_t s, unsigned *hbits)
894 {
895 unsigned u = from_header (p, s, "mode_t",
896 - (uintmax_t) TYPE_MINIMUM (mode_t),
897 TYPE_MAXIMUM (uintmax_t), false, false);
898 mode_t mode = ((u & TSUID ? S_ISUID : 0)
899 | (u & TSGID ? S_ISGID : 0)
900 | (u & TSVTX ? S_ISVTX : 0)
901 | (u & TUREAD ? S_IRUSR : 0)
902 | (u & TUWRITE ? S_IWUSR : 0)
903 | (u & TUEXEC ? S_IXUSR : 0)
904 | (u & TGREAD ? S_IRGRP : 0)
905 | (u & TGWRITE ? S_IWGRP : 0)
906 | (u & TGEXEC ? S_IXGRP : 0)
907 | (u & TOREAD ? S_IROTH : 0)
908 | (u & TOWRITE ? S_IWOTH : 0)
909 | (u & TOEXEC ? S_IXOTH : 0));
910 *hbits = mode ^ u;
911 return mode;
912 }
913
914 off_t
915 off_from_header (const char *p, size_t s)
916 {
917 /* Negative offsets are not allowed in tar files, so invoke
918 from_header with minimum value 0, not TYPE_MINIMUM (off_t). */
919 return from_header (p, s, "off_t", (uintmax_t) 0,
920 (uintmax_t) TYPE_MAXIMUM (off_t), false, false);
921 }
922
923 size_t
924 size_from_header (const char *p, size_t s)
925 {
926 return from_header (p, s, "size_t", (uintmax_t) 0,
927 (uintmax_t) TYPE_MAXIMUM (size_t), false, false);
928 }
929
930 time_t
931 time_from_header (const char *p, size_t s)
932 {
933 return from_header (p, s, "time_t",
934 - (uintmax_t) TYPE_MINIMUM (time_t),
935 (uintmax_t) TYPE_MAXIMUM (time_t), false, false);
936 }
937
938 uid_t
939 uid_from_header (const char *p, size_t s)
940 {
941 return from_header (p, s, "uid_t",
942 - (uintmax_t) TYPE_MINIMUM (uid_t),
943 (uintmax_t) TYPE_MAXIMUM (uid_t), false, false);
944 }
945
946 uintmax_t
947 uintmax_from_header (const char *p, size_t s)
948 {
949 return from_header (p, s, "uintmax_t", (uintmax_t) 0,
950 TYPE_MAXIMUM (uintmax_t), false, false);
951 }
952
953
954 /* Return a printable representation of T. The result points to
955 static storage that can be reused in the next call to this
956 function, to ctime, or to asctime. If FULL_TIME, then output the
957 time stamp to its full resolution; otherwise, just output it to
958 1-minute resolution. */
959 char const *
960 tartime (struct timespec t, bool full_time)
961 {
962 enum { fraclen = sizeof ".FFFFFFFFF" - 1 };
963 static char buffer[max (UINTMAX_STRSIZE_BOUND + 1,
964 INT_STRLEN_BOUND (int) + 16)
965 + fraclen];
966 struct tm *tm;
967 time_t s = t.tv_sec;
968 int ns = t.tv_nsec;
969 bool negative = s < 0;
970 char *p;
971
972 if (negative && ns != 0)
973 {
974 s++;
975 ns = 1000000000 - ns;
976 }
977
978 tm = utc_option ? gmtime (&s) : localtime (&s);
979 if (tm)
980 {
981 if (full_time)
982 {
983 sprintf (buffer, "%04ld-%02d-%02d %02d:%02d:%02d",
984 tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
985 tm->tm_hour, tm->tm_min, tm->tm_sec);
986 code_ns_fraction (ns, buffer + strlen (buffer));
987 }
988 else
989 sprintf (buffer, "%04ld-%02d-%02d %02d:%02d",
990 tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
991 tm->tm_hour, tm->tm_min);
992 return buffer;
993 }
994
995 /* The time stamp cannot be broken down, most likely because it
996 is out of range. Convert it as an integer,
997 right-adjusted in a field with the same width as the usual
998 4-year ISO time format. */
999 p = umaxtostr (negative ? - (uintmax_t) s : s,
1000 buffer + sizeof buffer - UINTMAX_STRSIZE_BOUND - fraclen);
1001 if (negative)
1002 *--p = '-';
1003 while ((buffer + sizeof buffer - sizeof "YYYY-MM-DD HH:MM"
1004 + (full_time ? sizeof ":SS.FFFFFFFFF" - 1 : 0))
1005 < p)
1006 *--p = ' ';
1007 if (full_time)
1008 code_ns_fraction (ns, buffer + sizeof buffer - 1 - fraclen);
1009 return p;
1010 }
1011
1012 /* Actually print it.
1013
1014 Plain and fancy file header block logging. Non-verbose just prints
1015 the name, e.g. for "tar t" or "tar x". This should just contain
1016 file names, so it can be fed back into tar with xargs or the "-T"
1017 option. The verbose option can give a bunch of info, one line per
1018 file. I doubt anybody tries to parse its format, or if they do,
1019 they shouldn't. Unix tar is pretty random here anyway. */
1020
1021
1022 /* FIXME: Note that print_header uses the globals HEAD, HSTAT, and
1023 HEAD_STANDARD, which must be set up in advance. Not very clean.. */
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 void
1038 print_header (struct tar_stat_info *st, off_t block_ordinal)
1039 {
1040 char modes[11];
1041 char const *time_stamp;
1042 int time_stamp_len;
1043 char *temp_name;
1044
1045 /* These hold formatted ints. */
1046 char uform[UINTMAX_STRSIZE_BOUND], gform[UINTMAX_STRSIZE_BOUND];
1047 char *user, *group;
1048 char size[2 * UINTMAX_STRSIZE_BOUND];
1049 /* holds formatted size or major,minor */
1050 char uintbuf[UINTMAX_STRSIZE_BOUND];
1051 int pad;
1052 int sizelen;
1053
1054 if (test_label_option && current_header->header.typeflag != GNUTYPE_VOLHDR)
1055 return;
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 (current_header->header.typeflag)
1084 {
1085 case GNUTYPE_VOLHDR:
1086 modes[0] = 'V';
1087 break;
1088
1089 case GNUTYPE_MULTIVOL:
1090 modes[0] = 'M';
1091 break;
1092
1093 case GNUTYPE_LONGNAME:
1094 case GNUTYPE_LONGLINK:
1095 modes[0] = 'L';
1096 ERROR ((0, 0, _("Unexpected long name header")));
1097 break;
1098
1099 case GNUTYPE_SPARSE:
1100 case REGTYPE:
1101 case AREGTYPE:
1102 modes[0] = '-';
1103 if (temp_name[strlen (temp_name) - 1] == '/')
1104 modes[0] = 'd';
1105 break;
1106 case LNKTYPE:
1107 modes[0] = 'h';
1108 break;
1109 case GNUTYPE_DUMPDIR:
1110 modes[0] = 'd';
1111 break;
1112 case DIRTYPE:
1113 modes[0] = 'd';
1114 break;
1115 case SYMTYPE:
1116 modes[0] = 'l';
1117 break;
1118 case BLKTYPE:
1119 modes[0] = 'b';
1120 break;
1121 case CHRTYPE:
1122 modes[0] = 'c';
1123 break;
1124 case FIFOTYPE:
1125 modes[0] = 'p';
1126 break;
1127 case CONTTYPE:
1128 modes[0] = 'C';
1129 break;
1130 }
1131
1132 pax_decode_mode (st->stat.st_mode, modes + 1);
1133
1134 /* Time stamp. */
1135
1136 time_stamp = tartime (st->mtime, false);
1137 time_stamp_len = strlen (time_stamp);
1138 if (datewidth < time_stamp_len)
1139 datewidth = time_stamp_len;
1140
1141 /* User and group names. */
1142
1143 if (st->uname
1144 && st->uname[0]
1145 && current_format != V7_FORMAT
1146 && !numeric_owner_option)
1147 user = st->uname;
1148 else
1149 {
1150 /* Try parsing it as an unsigned integer first, and as a
1151 uid_t if that fails. This method can list positive user
1152 ids that are too large to fit in a uid_t. */
1153 uintmax_t u = from_header (current_header->header.uid,
1154 sizeof current_header->header.uid, 0,
1155 (uintmax_t) 0,
1156 (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1157 false, false);
1158 if (u != -1)
1159 user = STRINGIFY_BIGINT (u, uform);
1160 else
1161 {
1162 sprintf (uform, "%ld",
1163 (long) UID_FROM_HEADER (current_header->header.uid));
1164 user = uform;
1165 }
1166 }
1167
1168 if (st->gname
1169 && st->gname[0]
1170 && current_format != V7_FORMAT
1171 && !numeric_owner_option)
1172 group = st->gname;
1173 else
1174 {
1175 /* Try parsing it as an unsigned integer first, and as a
1176 gid_t if that fails. This method can list positive group
1177 ids that are too large to fit in a gid_t. */
1178 uintmax_t g = from_header (current_header->header.gid,
1179 sizeof current_header->header.gid, 0,
1180 (uintmax_t) 0,
1181 (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1182 false, false);
1183 if (g != -1)
1184 group = STRINGIFY_BIGINT (g, gform);
1185 else
1186 {
1187 sprintf (gform, "%ld",
1188 (long) GID_FROM_HEADER (current_header->header.gid));
1189 group = gform;
1190 }
1191 }
1192
1193 /* Format the file size or major/minor device numbers. */
1194
1195 switch (current_header->header.typeflag)
1196 {
1197 case CHRTYPE:
1198 case BLKTYPE:
1199 strcpy (size,
1200 STRINGIFY_BIGINT (major (st->stat.st_rdev), uintbuf));
1201 strcat (size, ",");
1202 strcat (size,
1203 STRINGIFY_BIGINT (minor (st->stat.st_rdev), uintbuf));
1204 break;
1205
1206 default:
1207 /* st->stat.st_size keeps stored file size */
1208 strcpy (size, STRINGIFY_BIGINT (st->stat.st_size, uintbuf));
1209 break;
1210 }
1211
1212 /* Figure out padding and print the whole line. */
1213
1214 sizelen = strlen (size);
1215 pad = strlen (user) + 1 + strlen (group) + 1 + sizelen;
1216 if (pad > ugswidth)
1217 ugswidth = pad;
1218
1219 fprintf (stdlis, "%s %s/%s %*s %-*s",
1220 modes, user, group, ugswidth - pad + sizelen, size,
1221 datewidth, time_stamp);
1222
1223 fprintf (stdlis, " %s", quotearg (temp_name));
1224
1225 switch (current_header->header.typeflag)
1226 {
1227 case SYMTYPE:
1228 fprintf (stdlis, " -> %s\n", quotearg (st->link_name));
1229 break;
1230
1231 case LNKTYPE:
1232 fprintf (stdlis, _(" link to %s\n"), quotearg (st->link_name));
1233 break;
1234
1235 default:
1236 {
1237 char type_string[2];
1238 type_string[0] = current_header->header.typeflag;
1239 type_string[1] = '\0';
1240 fprintf (stdlis, _(" unknown file type %s\n"),
1241 quote (type_string));
1242 }
1243 break;
1244
1245 case AREGTYPE:
1246 case REGTYPE:
1247 case GNUTYPE_SPARSE:
1248 case CHRTYPE:
1249 case BLKTYPE:
1250 case DIRTYPE:
1251 case FIFOTYPE:
1252 case CONTTYPE:
1253 case GNUTYPE_DUMPDIR:
1254 putc ('\n', stdlis);
1255 break;
1256
1257 case GNUTYPE_LONGLINK:
1258 fprintf (stdlis, _("--Long Link--\n"));
1259 break;
1260
1261 case GNUTYPE_LONGNAME:
1262 fprintf (stdlis, _("--Long Name--\n"));
1263 break;
1264
1265 case GNUTYPE_VOLHDR:
1266 fprintf (stdlis, _("--Volume Header--\n"));
1267 break;
1268
1269 case GNUTYPE_MULTIVOL:
1270 strcpy (size,
1271 STRINGIFY_BIGINT
1272 (UINTMAX_FROM_HEADER (current_header->oldgnu_header.offset),
1273 uintbuf));
1274 fprintf (stdlis, _("--Continued at byte %s--\n"), size);
1275 break;
1276 }
1277 }
1278 fflush (stdlis);
1279 }
1280
1281 /* Print a similar line when we make a directory automatically. */
1282 void
1283 print_for_mkdir (char *dirname, int length, mode_t mode)
1284 {
1285 char modes[11];
1286
1287 if (verbose_option > 1)
1288 {
1289 /* File type and modes. */
1290
1291 modes[0] = 'd';
1292 pax_decode_mode (mode, modes + 1);
1293
1294 if (block_number_option)
1295 {
1296 char buf[UINTMAX_STRSIZE_BOUND];
1297 fprintf (stdlis, _("block %s: "),
1298 STRINGIFY_BIGINT (current_block_ordinal (), buf));
1299 }
1300
1301 fprintf (stdlis, "%s %*s %.*s\n", modes, ugswidth + 1 + datewidth,
1302 _("Creating directory:"), length, quotearg (dirname));
1303 }
1304 }
1305
1306 /* Skip over SIZE bytes of data in blocks in the archive. */
1307 void
1308 skip_file (off_t size)
1309 {
1310 union block *x;
1311
1312 /* FIXME: Make sure mv_begin is always called before it */
1313
1314 if (seekable_archive)
1315 {
1316 off_t nblk = seek_archive (size);
1317 if (nblk >= 0)
1318 size -= nblk * BLOCKSIZE;
1319 else
1320 seekable_archive = false;
1321 }
1322
1323 mv_size_left (size);
1324
1325 while (size > 0)
1326 {
1327 x = find_next_block ();
1328 if (! x)
1329 FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
1330
1331 set_next_block_after (x);
1332 size -= BLOCKSIZE;
1333 mv_size_left (size);
1334 }
1335 }
1336
1337 /* Skip the current member in the archive.
1338 NOTE: Current header must be decoded before calling this function. */
1339 void
1340 skip_member (void)
1341 {
1342 if (!current_stat_info.skipped)
1343 {
1344 char save_typeflag = current_header->header.typeflag;
1345 set_next_block_after (current_header);
1346
1347 mv_begin (&current_stat_info);
1348
1349 if (current_stat_info.is_sparse)
1350 sparse_skip_file (&current_stat_info);
1351 else if (save_typeflag != DIRTYPE)
1352 skip_file (current_stat_info.stat.st_size);
1353
1354 mv_end ();
1355 }
1356 }
This page took 0.097618 seconds and 5 git commands to generate.