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