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