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