]> Dogcows Code - chaz/tar/blob - src/list.c
(transform_member_name): New function
[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 Free Software Foundation, Inc.
5
6 Written by John Gilmore, on 1985-08-26.
7
8 This program is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
16 Public License for more details.
17
18 You should have received a copy of the GNU General Public License along
19 with this program; if not, write to the Free Software Foundation, Inc.,
20 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
21
22 #include <system.h>
23 #include <inttostr.h>
24 #include <quotearg.h>
25
26 #include "common.h"
27
28 #define max(a, b) ((a) < (b) ? (b) : (a))
29
30 union block *current_header; /* points to current archive header */
31 enum archive_format current_format; /* recognized format */
32 union block *recent_long_name; /* recent long name header and contents */
33 union block *recent_long_link; /* likewise, for long link */
34 size_t recent_long_name_blocks; /* number of blocks in recent_long_name */
35 size_t recent_long_link_blocks; /* likewise, for long link */
36
37 static uintmax_t from_header (const char *, size_t, const char *,
38 uintmax_t, uintmax_t, bool, bool);
39
40 /* Base 64 digits; see Internet RFC 2045 Table 1. */
41 static char const base_64_digits[64] =
42 {
43 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
44 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
45 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
46 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
47 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
48 };
49
50 /* Table of base-64 digit values indexed by unsigned chars.
51 The value is 64 for unsigned chars that are not base-64 digits. */
52 static char base64_map[UCHAR_MAX + 1];
53
54 static void
55 base64_init (void)
56 {
57 int i;
58 memset (base64_map, 64, sizeof base64_map);
59 for (i = 0; i < 64; i++)
60 base64_map[(int) base_64_digits[i]] = i;
61 }
62
63 /* Main loop for reading an archive. */
64 void
65 read_and (void (*do_something) (void))
66 {
67 enum read_header status = HEADER_STILL_UNREAD;
68 enum read_header prev_status;
69 struct timespec mtime;
70
71 base64_init ();
72 name_gather ();
73
74 open_archive (ACCESS_READ);
75 do
76 {
77 prev_status = status;
78 tar_stat_destroy (&current_stat_info);
79 xheader_destroy (&extended_header);
80
81 status = read_header (false);
82 switch (status)
83 {
84 case HEADER_STILL_UNREAD:
85 case HEADER_SUCCESS_EXTENDED:
86 abort ();
87
88 case HEADER_SUCCESS:
89
90 /* Valid header. We should decode next field (mode) first.
91 Ensure incoming names are null terminated. */
92
93 if (! name_match (current_stat_info.file_name)
94 || (NEWER_OPTION_INITIALIZED (newer_mtime_option)
95 /* FIXME: We get mtime now, and again later; this causes
96 duplicate diagnostics if header.mtime is bogus. */
97 && ((mtime.tv_sec
98 = TIME_FROM_HEADER (current_header->header.mtime)),
99 /* FIXME: Grab fractional time stamps from
100 extended header. */
101 mtime.tv_nsec = 0,
102 current_stat_info.mtime = mtime,
103 OLDER_TAR_STAT_TIME (current_stat_info, m)))
104 || excluded_name (current_stat_info.file_name))
105 {
106 switch (current_header->header.typeflag)
107 {
108 case GNUTYPE_VOLHDR:
109 case GNUTYPE_MULTIVOL:
110 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 (false);
143 if (status == HEADER_ZERO_BLOCK)
144 break;
145 WARN ((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;
306 size_t next_long_link_blocks;
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 (header, OFF_FROM_HEADER (header->header.size));
391 else if (header->header.typeflag == XGLTYPE)
392 {
393 xheader_read (header, OFF_FROM_HEADER (header->header.size));
394 xheader_decode_global ();
395 xheader_destroy (&extended_header);
396 }
397
398 /* Loop! */
399
400 }
401 else
402 {
403 char const *name;
404 struct posix_header const *h = &current_header->header;
405 char namebuf[sizeof h->prefix + 1 + NAME_FIELD_SIZE + 1];
406
407 if (recent_long_name)
408 free (recent_long_name);
409
410 if (next_long_name)
411 {
412 name = next_long_name->buffer + BLOCKSIZE;
413 recent_long_name = next_long_name;
414 recent_long_name_blocks = next_long_name_blocks;
415 }
416 else
417 {
418 /* Accept file names as specified by POSIX.1-1996
419 section 10.1.1. */
420 char *np = namebuf;
421
422 if (h->prefix[0] && strcmp (h->magic, TMAGIC) == 0)
423 {
424 memcpy (np, h->prefix, sizeof h->prefix);
425 np[sizeof h->prefix] = '\0';
426 np += strlen (np);
427 *np++ = '/';
428 }
429 memcpy (np, h->name, sizeof h->name);
430 np[sizeof h->name] = '\0';
431 name = namebuf;
432 recent_long_name = 0;
433 recent_long_name_blocks = 0;
434 }
435 assign_string (&info->orig_file_name, name);
436 assign_string (&info->file_name, name);
437 info->had_trailing_slash = strip_trailing_slashes (info->file_name);
438
439 if (recent_long_link)
440 free (recent_long_link);
441
442 if (next_long_link)
443 {
444 name = next_long_link->buffer + BLOCKSIZE;
445 recent_long_link = next_long_link;
446 recent_long_link_blocks = next_long_link_blocks;
447 }
448 else
449 {
450 memcpy (namebuf, h->linkname, sizeof h->linkname);
451 namebuf[sizeof h->linkname] = '\0';
452 name = namebuf;
453 recent_long_link = 0;
454 recent_long_link_blocks = 0;
455 }
456 assign_string (&info->link_name, name);
457
458 return HEADER_SUCCESS;
459 }
460 }
461 }
462
463 enum read_header
464 read_header (bool raw_extended_headers)
465 {
466 return read_header_primitive (raw_extended_headers, &current_stat_info);
467 }
468
469 static char *
470 decode_xform (char *file_name, void *data)
471 {
472 bool link_target = *(bool*)data;
473 file_name = safer_name_suffix (file_name, link_target,
474 absolute_names_option);
475 if (strip_name_components)
476 {
477 size_t prefix_len = stripped_prefix_len (file_name,
478 strip_name_components);
479 if (prefix_len == (size_t) -1)
480 prefix_len = strlen (file_name);
481 file_name += prefix_len;
482 }
483 return file_name;
484 }
485
486 bool
487 transform_member_name (char **pinput, bool lnk)
488 {
489 return transform_name_fp (pinput, decode_xform, &lnk);
490 }
491
492 #define ISOCTAL(c) ((c)>='0'&&(c)<='7')
493
494 /* Decode things from a file HEADER block into STAT_INFO, also setting
495 *FORMAT_POINTER depending on the header block format. If
496 DO_USER_GROUP, decode the user/group information (this is useful
497 for extraction, but waste time when merely listing).
498
499 read_header() has already decoded the checksum and length, so we don't.
500
501 This routine should *not* be called twice for the same block, since
502 the two calls might use different DO_USER_GROUP values and thus
503 might end up with different uid/gid for the two calls. If anybody
504 wants the uid/gid they should decode it first, and other callers
505 should decode it without uid/gid before calling a routine,
506 e.g. print_header, that assumes decoded data. */
507 void
508 decode_header (union block *header, struct tar_stat_info *stat_info,
509 enum archive_format *format_pointer, int do_user_group)
510 {
511 enum archive_format format;
512
513 if (strcmp (header->header.magic, TMAGIC) == 0)
514 {
515 if (header->star_header.prefix[130] == 0
516 && ISOCTAL (header->star_header.atime[0])
517 && header->star_header.atime[11] == ' '
518 && ISOCTAL (header->star_header.ctime[0])
519 && header->star_header.ctime[11] == ' ')
520 format = STAR_FORMAT;
521 else if (extended_header.size)
522 format = POSIX_FORMAT;
523 else
524 format = USTAR_FORMAT;
525 }
526 else if (strcmp (header->header.magic, OLDGNU_MAGIC) == 0)
527 format = OLDGNU_FORMAT;
528 else
529 format = V7_FORMAT;
530 *format_pointer = format;
531
532 stat_info->stat.st_mode = MODE_FROM_HEADER (header->header.mode);
533 stat_info->mtime.tv_sec = TIME_FROM_HEADER (header->header.mtime);
534 stat_info->mtime.tv_nsec = 0;
535 assign_string (&stat_info->uname,
536 header->header.uname[0] ? header->header.uname : NULL);
537 assign_string (&stat_info->gname,
538 header->header.gname[0] ? header->header.gname : NULL);
539
540 if (format == OLDGNU_FORMAT && incremental_option)
541 {
542 stat_info->atime.tv_sec = TIME_FROM_HEADER (header->oldgnu_header.atime);
543 stat_info->ctime.tv_sec = TIME_FROM_HEADER (header->oldgnu_header.ctime);
544 stat_info->atime.tv_nsec = stat_info->ctime.tv_nsec = 0;
545 }
546 else if (format == STAR_FORMAT)
547 {
548 stat_info->atime.tv_sec = TIME_FROM_HEADER (header->star_header.atime);
549 stat_info->ctime.tv_sec = TIME_FROM_HEADER (header->star_header.ctime);
550 stat_info->atime.tv_nsec = stat_info->ctime.tv_nsec = 0;
551 }
552 else
553 stat_info->atime = stat_info->ctime = start_time;
554
555 if (format == V7_FORMAT)
556 {
557 stat_info->stat.st_uid = UID_FROM_HEADER (header->header.uid);
558 stat_info->stat.st_gid = GID_FROM_HEADER (header->header.gid);
559 stat_info->stat.st_rdev = 0;
560 }
561 else
562 {
563 if (do_user_group)
564 {
565 /* FIXME: Decide if this should somewhat depend on -p. */
566
567 if (numeric_owner_option
568 || !*header->header.uname
569 || !uname_to_uid (header->header.uname, &stat_info->stat.st_uid))
570 stat_info->stat.st_uid = UID_FROM_HEADER (header->header.uid);
571
572 if (numeric_owner_option
573 || !*header->header.gname
574 || !gname_to_gid (header->header.gname, &stat_info->stat.st_gid))
575 stat_info->stat.st_gid = GID_FROM_HEADER (header->header.gid);
576 }
577
578 switch (header->header.typeflag)
579 {
580 case BLKTYPE:
581 case CHRTYPE:
582 stat_info->stat.st_rdev =
583 makedev (MAJOR_FROM_HEADER (header->header.devmajor),
584 MINOR_FROM_HEADER (header->header.devminor));
585 break;
586
587 default:
588 stat_info->stat.st_rdev = 0;
589 }
590 }
591
592 stat_info->archive_file_size = stat_info->stat.st_size;
593 xheader_decode (stat_info);
594
595 if (sparse_member_p (stat_info))
596 {
597 sparse_fixup_header (stat_info);
598 stat_info->is_sparse = true;
599 }
600 else
601 {
602 stat_info->is_sparse = false;
603 if (((current_format == GNU_FORMAT
604 || current_format == OLDGNU_FORMAT)
605 && current_header->header.typeflag == GNUTYPE_DUMPDIR)
606 || stat_info->dumpdir)
607 stat_info->is_dumpdir = true;
608 }
609
610 transform_member_name (&stat_info->file_name, false);
611 }
612
613 /* Convert buffer at WHERE0 of size DIGS from external format to
614 uintmax_t. DIGS must be positive. If TYPE is nonnull, the data
615 are of type TYPE. The buffer must represent a value in the range
616 -MINUS_MINVAL through MAXVAL. If OCTAL_ONLY, allow only octal
617 numbers instead of the other GNU extensions. Return -1 on error,
618 diagnosing the error if TYPE is nonnull and if !SILENT. */
619 static uintmax_t
620 from_header (char const *where0, size_t digs, char const *type,
621 uintmax_t minus_minval, uintmax_t maxval,
622 bool octal_only, bool silent)
623 {
624 uintmax_t value;
625 char const *where = where0;
626 char const *lim = where + digs;
627 int negative = 0;
628
629 /* Accommodate buggy tar of unknown vintage, which outputs leading
630 NUL if the previous field overflows. */
631 where += !*where;
632
633 /* Accommodate older tars, which output leading spaces. */
634 for (;;)
635 {
636 if (where == lim)
637 {
638 if (type && !silent)
639 ERROR ((0, 0,
640 /* TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.) */
641 _("Blanks in header where numeric %s value expected"),
642 type));
643 return -1;
644 }
645 if (!ISSPACE ((unsigned char) *where))
646 break;
647 where++;
648 }
649
650 value = 0;
651 if (ISODIGIT (*where))
652 {
653 char const *where1 = where;
654 uintmax_t overflow = 0;
655
656 for (;;)
657 {
658 value += *where++ - '0';
659 if (where == lim || ! ISODIGIT (*where))
660 break;
661 overflow |= value ^ (value << LG_8 >> LG_8);
662 value <<= LG_8;
663 }
664
665 /* Parse the output of older, unportable tars, which generate
666 negative values in two's complement octal. If the leading
667 nonzero digit is 1, we can't recover the original value
668 reliably; so do this only if the digit is 2 or more. This
669 catches the common case of 32-bit negative time stamps. */
670 if ((overflow || maxval < value) && '2' <= *where1 && type)
671 {
672 /* Compute the negative of the input value, assuming two's
673 complement. */
674 int digit = (*where1 - '0') | 4;
675 overflow = 0;
676 value = 0;
677 where = where1;
678 for (;;)
679 {
680 value += 7 - digit;
681 where++;
682 if (where == lim || ! ISODIGIT (*where))
683 break;
684 digit = *where - '0';
685 overflow |= value ^ (value << LG_8 >> LG_8);
686 value <<= LG_8;
687 }
688 value++;
689 overflow |= !value;
690
691 if (!overflow && value <= minus_minval)
692 {
693 if (!silent)
694 WARN ((0, 0,
695 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
696 _("Archive octal value %.*s is out of %s range; assuming two's complement"),
697 (int) (where - where1), where1, type));
698 negative = 1;
699 }
700 }
701
702 if (overflow)
703 {
704 if (type && !silent)
705 ERROR ((0, 0,
706 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
707 _("Archive octal value %.*s is out of %s range"),
708 (int) (where - where1), where1, type));
709 return -1;
710 }
711 }
712 else if (octal_only)
713 {
714 /* Suppress the following extensions. */
715 }
716 else if (*where == '-' || *where == '+')
717 {
718 /* Parse base-64 output produced only by tar test versions
719 1.13.6 (1999-08-11) through 1.13.11 (1999-08-23).
720 Support for this will be withdrawn in future releases. */
721 int dig;
722 if (!silent)
723 {
724 static bool warned_once;
725 if (! warned_once)
726 {
727 warned_once = true;
728 WARN ((0, 0, _("Archive contains obsolescent base-64 headers")));
729 }
730 }
731 negative = *where++ == '-';
732 while (where != lim
733 && (dig = base64_map[(unsigned char) *where]) < 64)
734 {
735 if (value << LG_64 >> LG_64 != value)
736 {
737 char *string = alloca (digs + 1);
738 memcpy (string, where0, digs);
739 string[digs] = '\0';
740 if (type && !silent)
741 ERROR ((0, 0,
742 _("Archive signed base-64 string %s is out of %s range"),
743 quote (string), type));
744 return -1;
745 }
746 value = (value << LG_64) | dig;
747 where++;
748 }
749 }
750 else if (*where == '\200' /* positive base-256 */
751 || *where == '\377' /* negative base-256 */)
752 {
753 /* Parse base-256 output. A nonnegative number N is
754 represented as (256**DIGS)/2 + N; a negative number -N is
755 represented as (256**DIGS) - N, i.e. as two's complement.
756 The representation guarantees that the leading bit is
757 always on, so that we don't confuse this format with the
758 others (assuming ASCII bytes of 8 bits or more). */
759 int signbit = *where & (1 << (LG_256 - 2));
760 uintmax_t topbits = (((uintmax_t) - signbit)
761 << (CHAR_BIT * sizeof (uintmax_t)
762 - LG_256 - (LG_256 - 2)));
763 value = (*where++ & ((1 << (LG_256 - 2)) - 1)) - signbit;
764 for (;;)
765 {
766 value = (value << LG_256) + (unsigned char) *where++;
767 if (where == lim)
768 break;
769 if (((value << LG_256 >> LG_256) | topbits) != value)
770 {
771 if (type && !silent)
772 ERROR ((0, 0,
773 _("Archive base-256 value is out of %s range"),
774 type));
775 return -1;
776 }
777 }
778 negative = signbit;
779 if (negative)
780 value = -value;
781 }
782
783 if (where != lim && *where && !ISSPACE ((unsigned char) *where))
784 {
785 if (type)
786 {
787 char buf[1000]; /* Big enough to represent any header. */
788 static struct quoting_options *o;
789
790 if (!o)
791 {
792 o = clone_quoting_options (0);
793 set_quoting_style (o, locale_quoting_style);
794 }
795
796 while (where0 != lim && ! lim[-1])
797 lim--;
798 quotearg_buffer (buf, sizeof buf, where0, lim - where, o);
799 if (!silent)
800 ERROR ((0, 0,
801 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
802 _("Archive contains %.*s where numeric %s value expected"),
803 (int) sizeof buf, buf, type));
804 }
805
806 return -1;
807 }
808
809 if (value <= (negative ? minus_minval : maxval))
810 return negative ? -value : value;
811
812 if (type && !silent)
813 {
814 char minval_buf[UINTMAX_STRSIZE_BOUND + 1];
815 char maxval_buf[UINTMAX_STRSIZE_BOUND];
816 char value_buf[UINTMAX_STRSIZE_BOUND + 1];
817 char *minval_string = STRINGIFY_BIGINT (minus_minval, minval_buf + 1);
818 char *value_string = STRINGIFY_BIGINT (value, value_buf + 1);
819 if (negative)
820 *--value_string = '-';
821 if (minus_minval)
822 *--minval_string = '-';
823 /* TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.) */
824 ERROR ((0, 0, _("Archive value %s is out of %s range %s..%s"),
825 value_string, type,
826 minval_string, STRINGIFY_BIGINT (maxval, maxval_buf)));
827 }
828
829 return -1;
830 }
831
832 gid_t
833 gid_from_header (const char *p, size_t s)
834 {
835 return from_header (p, s, "gid_t",
836 - (uintmax_t) TYPE_MINIMUM (gid_t),
837 (uintmax_t) TYPE_MAXIMUM (gid_t),
838 false, false);
839 }
840
841 major_t
842 major_from_header (const char *p, size_t s)
843 {
844 return from_header (p, s, "major_t",
845 - (uintmax_t) TYPE_MINIMUM (major_t),
846 (uintmax_t) TYPE_MAXIMUM (major_t), false, false);
847 }
848
849 minor_t
850 minor_from_header (const char *p, size_t s)
851 {
852 return from_header (p, s, "minor_t",
853 - (uintmax_t) TYPE_MINIMUM (minor_t),
854 (uintmax_t) TYPE_MAXIMUM (minor_t), false, false);
855 }
856
857 mode_t
858 mode_from_header (const char *p, size_t s)
859 {
860 /* Do not complain about unrecognized mode bits. */
861 unsigned u = from_header (p, s, "mode_t",
862 - (uintmax_t) TYPE_MINIMUM (mode_t),
863 TYPE_MAXIMUM (uintmax_t), false, false);
864 return ((u & TSUID ? S_ISUID : 0)
865 | (u & TSGID ? S_ISGID : 0)
866 | (u & TSVTX ? S_ISVTX : 0)
867 | (u & TUREAD ? S_IRUSR : 0)
868 | (u & TUWRITE ? S_IWUSR : 0)
869 | (u & TUEXEC ? S_IXUSR : 0)
870 | (u & TGREAD ? S_IRGRP : 0)
871 | (u & TGWRITE ? S_IWGRP : 0)
872 | (u & TGEXEC ? S_IXGRP : 0)
873 | (u & TOREAD ? S_IROTH : 0)
874 | (u & TOWRITE ? S_IWOTH : 0)
875 | (u & TOEXEC ? S_IXOTH : 0));
876 }
877
878 off_t
879 off_from_header (const char *p, size_t s)
880 {
881 /* Negative offsets are not allowed in tar files, so invoke
882 from_header with minimum value 0, not TYPE_MINIMUM (off_t). */
883 return from_header (p, s, "off_t", (uintmax_t) 0,
884 (uintmax_t) TYPE_MAXIMUM (off_t), false, false);
885 }
886
887 size_t
888 size_from_header (const char *p, size_t s)
889 {
890 return from_header (p, s, "size_t", (uintmax_t) 0,
891 (uintmax_t) TYPE_MAXIMUM (size_t), false, false);
892 }
893
894 time_t
895 time_from_header (const char *p, size_t s)
896 {
897 return from_header (p, s, "time_t",
898 - (uintmax_t) TYPE_MINIMUM (time_t),
899 (uintmax_t) TYPE_MAXIMUM (time_t), false, false);
900 }
901
902 uid_t
903 uid_from_header (const char *p, size_t s)
904 {
905 return from_header (p, s, "uid_t",
906 - (uintmax_t) TYPE_MINIMUM (uid_t),
907 (uintmax_t) TYPE_MAXIMUM (uid_t), false, false);
908 }
909
910 uintmax_t
911 uintmax_from_header (const char *p, size_t s)
912 {
913 return from_header (p, s, "uintmax_t", (uintmax_t) 0,
914 TYPE_MAXIMUM (uintmax_t), false, false);
915 }
916
917
918 /* Return a printable representation of T. The result points to
919 static storage that can be reused in the next call to this
920 function, to ctime, or to asctime. If FULL_TIME, then output the
921 time stamp to its full resolution; otherwise, just output it to
922 1-minute resolution. */
923 char const *
924 tartime (struct timespec t, bool full_time)
925 {
926 enum { fraclen = sizeof ".FFFFFFFFF" - 1 };
927 static char buffer[max (UINTMAX_STRSIZE_BOUND + 1,
928 INT_STRLEN_BOUND (int) + 16)
929 + fraclen];
930 struct tm *tm;
931 time_t s = t.tv_sec;
932 int ns = t.tv_nsec;
933 bool negative = s < 0;
934 char *p;
935
936 if (negative && ns != 0)
937 {
938 s++;
939 ns = 1000000000 - ns;
940 }
941
942 tm = utc_option ? gmtime (&s) : localtime (&s);
943 if (tm)
944 {
945 if (full_time)
946 {
947 sprintf (buffer, "%04ld-%02d-%02d %02d:%02d:%02d",
948 tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
949 tm->tm_hour, tm->tm_min, tm->tm_sec);
950 code_ns_fraction (ns, buffer + strlen (buffer));
951 }
952 else
953 sprintf (buffer, "%04ld-%02d-%02d %02d:%02d",
954 tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
955 tm->tm_hour, tm->tm_min);
956 return buffer;
957 }
958
959 /* The time stamp cannot be broken down, most likely because it
960 is out of range. Convert it as an integer,
961 right-adjusted in a field with the same width as the usual
962 4-year ISO time format. */
963 p = umaxtostr (negative ? - (uintmax_t) s : s,
964 buffer + sizeof buffer - UINTMAX_STRSIZE_BOUND - fraclen);
965 if (negative)
966 *--p = '-';
967 while ((buffer + sizeof buffer - sizeof "YYYY-MM-DD HH:MM"
968 + (full_time ? sizeof ":SS.FFFFFFFFF" - 1 : 0))
969 < p)
970 *--p = ' ';
971 if (full_time)
972 code_ns_fraction (ns, buffer + sizeof buffer - 1 - fraclen);
973 return p;
974 }
975
976 /* Actually print it.
977
978 Plain and fancy file header block logging. Non-verbose just prints
979 the name, e.g. for "tar t" or "tar x". This should just contain
980 file names, so it can be fed back into tar with xargs or the "-T"
981 option. The verbose option can give a bunch of info, one line per
982 file. I doubt anybody tries to parse its format, or if they do,
983 they shouldn't. Unix tar is pretty random here anyway. */
984
985
986 /* FIXME: Note that print_header uses the globals HEAD, HSTAT, and
987 HEAD_STANDARD, which must be set up in advance. Not very clean.. */
988
989 /* Width of "user/group size", with initial value chosen
990 heuristically. This grows as needed, though this may cause some
991 stairstepping in the output. Make it too small and the output will
992 almost always look ragged. Make it too large and the output will
993 be spaced out too far. */
994 static int ugswidth = 19;
995
996 /* Width of printed time stamps. It grows if longer time stamps are
997 found (typically, those with nanosecond resolution). Like
998 USGWIDTH, some stairstepping may occur. */
999 static int datewidth = sizeof "YYYY-MM-DD HH:MM" - 1;
1000
1001 void
1002 print_header (struct tar_stat_info *st, off_t block_ordinal)
1003 {
1004 char modes[11];
1005 char const *time_stamp;
1006 int time_stamp_len;
1007 char *temp_name;
1008
1009 /* These hold formatted ints. */
1010 char uform[UINTMAX_STRSIZE_BOUND], gform[UINTMAX_STRSIZE_BOUND];
1011 char *user, *group;
1012 char size[2 * UINTMAX_STRSIZE_BOUND];
1013 /* holds formatted size or major,minor */
1014 char uintbuf[UINTMAX_STRSIZE_BOUND];
1015 int pad;
1016 int sizelen;
1017
1018 if (test_label_option && current_header->header.typeflag != GNUTYPE_VOLHDR)
1019 return;
1020
1021 if (show_transformed_names_option)
1022 temp_name = st->file_name ? st->file_name : st->orig_file_name;
1023 else
1024 temp_name = st->orig_file_name ? st->orig_file_name : st->file_name;
1025
1026 if (block_number_option)
1027 {
1028 char buf[UINTMAX_STRSIZE_BOUND];
1029 if (block_ordinal < 0)
1030 block_ordinal = current_block_ordinal ();
1031 block_ordinal -= recent_long_name_blocks;
1032 block_ordinal -= recent_long_link_blocks;
1033 fprintf (stdlis, _("block %s: "),
1034 STRINGIFY_BIGINT (block_ordinal, buf));
1035 }
1036
1037 if (verbose_option <= 1)
1038 {
1039 /* Just the fax, mam. */
1040 fprintf (stdlis, "%s\n", quotearg (temp_name));
1041 }
1042 else
1043 {
1044 /* File type and modes. */
1045
1046 modes[0] = '?';
1047 switch (current_header->header.typeflag)
1048 {
1049 case GNUTYPE_VOLHDR:
1050 modes[0] = 'V';
1051 break;
1052
1053 case GNUTYPE_MULTIVOL:
1054 modes[0] = 'M';
1055 break;
1056
1057 case GNUTYPE_LONGNAME:
1058 case GNUTYPE_LONGLINK:
1059 modes[0] = 'L';
1060 ERROR ((0, 0, _("Unexpected long name header")));
1061 break;
1062
1063 case GNUTYPE_SPARSE:
1064 case REGTYPE:
1065 case AREGTYPE:
1066 modes[0] = '-';
1067 if (temp_name[strlen (temp_name) - 1] == '/')
1068 modes[0] = 'd';
1069 break;
1070 case LNKTYPE:
1071 modes[0] = 'h';
1072 break;
1073 case GNUTYPE_DUMPDIR:
1074 modes[0] = 'd';
1075 break;
1076 case DIRTYPE:
1077 modes[0] = 'd';
1078 break;
1079 case SYMTYPE:
1080 modes[0] = 'l';
1081 break;
1082 case BLKTYPE:
1083 modes[0] = 'b';
1084 break;
1085 case CHRTYPE:
1086 modes[0] = 'c';
1087 break;
1088 case FIFOTYPE:
1089 modes[0] = 'p';
1090 break;
1091 case CONTTYPE:
1092 modes[0] = 'C';
1093 break;
1094 }
1095
1096 pax_decode_mode (st->stat.st_mode, modes + 1);
1097
1098 /* Time stamp. */
1099
1100 time_stamp = tartime (st->mtime, false);
1101 time_stamp_len = strlen (time_stamp);
1102 if (datewidth < time_stamp_len)
1103 datewidth = time_stamp_len;
1104
1105 /* User and group names. */
1106
1107 if (st->uname
1108 && st->uname[0]
1109 && current_format != V7_FORMAT
1110 && !numeric_owner_option)
1111 user = st->uname;
1112 else
1113 {
1114 /* Try parsing it as an unsigned integer first, and as a
1115 uid_t if that fails. This method can list positive user
1116 ids that are too large to fit in a uid_t. */
1117 uintmax_t u = from_header (current_header->header.uid,
1118 sizeof current_header->header.uid, 0,
1119 (uintmax_t) 0,
1120 (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1121 false, false);
1122 if (u != -1)
1123 user = STRINGIFY_BIGINT (u, uform);
1124 else
1125 {
1126 sprintf (uform, "%ld",
1127 (long) UID_FROM_HEADER (current_header->header.uid));
1128 user = uform;
1129 }
1130 }
1131
1132 if (st->gname
1133 && st->gname[0]
1134 && current_format != V7_FORMAT
1135 && !numeric_owner_option)
1136 group = st->gname;
1137 else
1138 {
1139 /* Try parsing it as an unsigned integer first, and as a
1140 gid_t if that fails. This method can list positive group
1141 ids that are too large to fit in a gid_t. */
1142 uintmax_t g = from_header (current_header->header.gid,
1143 sizeof current_header->header.gid, 0,
1144 (uintmax_t) 0,
1145 (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1146 false, false);
1147 if (g != -1)
1148 group = STRINGIFY_BIGINT (g, gform);
1149 else
1150 {
1151 sprintf (gform, "%ld",
1152 (long) GID_FROM_HEADER (current_header->header.gid));
1153 group = gform;
1154 }
1155 }
1156
1157 /* Format the file size or major/minor device numbers. */
1158
1159 switch (current_header->header.typeflag)
1160 {
1161 case CHRTYPE:
1162 case BLKTYPE:
1163 strcpy (size,
1164 STRINGIFY_BIGINT (major (st->stat.st_rdev), uintbuf));
1165 strcat (size, ",");
1166 strcat (size,
1167 STRINGIFY_BIGINT (minor (st->stat.st_rdev), uintbuf));
1168 break;
1169
1170 default:
1171 /* st->stat.st_size keeps stored file size */
1172 strcpy (size, STRINGIFY_BIGINT (st->stat.st_size, uintbuf));
1173 break;
1174 }
1175
1176 /* Figure out padding and print the whole line. */
1177
1178 sizelen = strlen (size);
1179 pad = strlen (user) + 1 + strlen (group) + 1 + sizelen;
1180 if (pad > ugswidth)
1181 ugswidth = pad;
1182
1183 fprintf (stdlis, "%s %s/%s %*s %-*s",
1184 modes, user, group, ugswidth - pad + sizelen, size,
1185 datewidth, time_stamp);
1186
1187 fprintf (stdlis, " %s", quotearg (temp_name));
1188
1189 switch (current_header->header.typeflag)
1190 {
1191 case SYMTYPE:
1192 fprintf (stdlis, " -> %s\n", quotearg (st->link_name));
1193 break;
1194
1195 case LNKTYPE:
1196 fprintf (stdlis, _(" link to %s\n"), quotearg (st->link_name));
1197 break;
1198
1199 default:
1200 {
1201 char type_string[2];
1202 type_string[0] = current_header->header.typeflag;
1203 type_string[1] = '\0';
1204 fprintf (stdlis, _(" unknown file type %s\n"),
1205 quote (type_string));
1206 }
1207 break;
1208
1209 case AREGTYPE:
1210 case REGTYPE:
1211 case GNUTYPE_SPARSE:
1212 case CHRTYPE:
1213 case BLKTYPE:
1214 case DIRTYPE:
1215 case FIFOTYPE:
1216 case CONTTYPE:
1217 case GNUTYPE_DUMPDIR:
1218 putc ('\n', stdlis);
1219 break;
1220
1221 case GNUTYPE_LONGLINK:
1222 fprintf (stdlis, _("--Long Link--\n"));
1223 break;
1224
1225 case GNUTYPE_LONGNAME:
1226 fprintf (stdlis, _("--Long Name--\n"));
1227 break;
1228
1229 case GNUTYPE_VOLHDR:
1230 fprintf (stdlis, _("--Volume Header--\n"));
1231 break;
1232
1233 case GNUTYPE_MULTIVOL:
1234 strcpy (size,
1235 STRINGIFY_BIGINT
1236 (UINTMAX_FROM_HEADER (current_header->oldgnu_header.offset),
1237 uintbuf));
1238 fprintf (stdlis, _("--Continued at byte %s--\n"), size);
1239 break;
1240 }
1241 }
1242 fflush (stdlis);
1243 }
1244
1245 /* Print a similar line when we make a directory automatically. */
1246 void
1247 print_for_mkdir (char *dirname, int length, mode_t mode)
1248 {
1249 char modes[11];
1250
1251 if (verbose_option > 1)
1252 {
1253 /* File type and modes. */
1254
1255 modes[0] = 'd';
1256 pax_decode_mode (mode, modes + 1);
1257
1258 if (block_number_option)
1259 {
1260 char buf[UINTMAX_STRSIZE_BOUND];
1261 fprintf (stdlis, _("block %s: "),
1262 STRINGIFY_BIGINT (current_block_ordinal (), buf));
1263 }
1264
1265 fprintf (stdlis, "%s %*s %.*s\n", modes, ugswidth + 1 + datewidth,
1266 _("Creating directory:"), length, quotearg (dirname));
1267 }
1268 }
1269
1270 /* Skip over SIZE bytes of data in blocks in the archive. */
1271 void
1272 skip_file (off_t size)
1273 {
1274 union block *x;
1275
1276 /* FIXME: Make sure mv_begin is always called before it */
1277
1278 if (seekable_archive)
1279 {
1280 off_t nblk = seek_archive (size);
1281 if (nblk >= 0)
1282 size -= nblk * BLOCKSIZE;
1283 else
1284 seekable_archive = false;
1285 }
1286
1287 mv_size_left (size);
1288
1289 while (size > 0)
1290 {
1291 x = find_next_block ();
1292 if (! x)
1293 FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
1294
1295 set_next_block_after (x);
1296 size -= BLOCKSIZE;
1297 mv_size_left (size);
1298 }
1299 }
1300
1301 /* Skip the current member in the archive.
1302 NOTE: Current header must be decoded before calling this function. */
1303 void
1304 skip_member (void)
1305 {
1306 if (!current_stat_info.skipped)
1307 {
1308 char save_typeflag = current_header->header.typeflag;
1309 set_next_block_after (current_header);
1310
1311 mv_begin (&current_stat_info);
1312
1313 if (current_stat_info.is_sparse)
1314 sparse_skip_file (&current_stat_info);
1315 else if (save_typeflag != DIRTYPE)
1316 skip_file (current_stat_info.stat.st_size);
1317
1318 mv_end ();
1319 }
1320 }
This page took 0.101249 seconds and 5 git commands to generate.