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