]> Dogcows Code - chaz/tar/blob - src/list.c
(from_header): New arg OCTAL_ONLY, normally false.
[chaz/tar] / src / list.c
1 /* List a tar archive, with support routines for reading a tar archive.
2
3 Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1998, 1999, 2000,
4 2001, 2003, 2004, 2005 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, 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), true, 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 union block *header;
341 union block *header_copy;
342 char *bp;
343 union block *data_block;
344 size_t size, written;
345 union block *next_long_name = 0;
346 union block *next_long_link = 0;
347 size_t next_long_name_blocks;
348 size_t next_long_link_blocks;
349
350 while (1)
351 {
352 enum read_header status;
353
354 header = find_next_block ();
355 current_header = header;
356 if (!header)
357 return HEADER_END_OF_FILE;
358
359 if ((status = tar_checksum (header, false)) != HEADER_SUCCESS)
360 return status;
361
362 /* Good block. Decode file size and return. */
363
364 if (header->header.typeflag == LNKTYPE)
365 current_stat_info.stat.st_size = 0; /* links 0 size on tape */
366 else
367 current_stat_info.stat.st_size = OFF_FROM_HEADER (header->header.size);
368
369 if (header->header.typeflag == GNUTYPE_LONGNAME
370 || header->header.typeflag == GNUTYPE_LONGLINK
371 || header->header.typeflag == XHDTYPE
372 || header->header.typeflag == XGLTYPE)
373 {
374 if (raw_extended_headers)
375 return HEADER_SUCCESS_EXTENDED;
376 else if (header->header.typeflag == GNUTYPE_LONGNAME
377 || header->header.typeflag == GNUTYPE_LONGLINK)
378 {
379 size_t name_size = current_stat_info.stat.st_size;
380 size_t n = name_size % BLOCKSIZE;
381 size = name_size + BLOCKSIZE;
382 if (n)
383 size += BLOCKSIZE - n;
384
385 if (name_size != current_stat_info.stat.st_size
386 || size < name_size)
387 xalloc_die ();
388
389 header_copy = xmalloc (size + 1);
390
391 if (header->header.typeflag == GNUTYPE_LONGNAME)
392 {
393 if (next_long_name)
394 free (next_long_name);
395 next_long_name = header_copy;
396 next_long_name_blocks = size / BLOCKSIZE;
397 }
398 else
399 {
400 if (next_long_link)
401 free (next_long_link);
402 next_long_link = header_copy;
403 next_long_link_blocks = size / BLOCKSIZE;
404 }
405
406 set_next_block_after (header);
407 *header_copy = *header;
408 bp = header_copy->buffer + BLOCKSIZE;
409
410 for (size -= BLOCKSIZE; size > 0; size -= written)
411 {
412 data_block = find_next_block ();
413 if (! data_block)
414 {
415 ERROR ((0, 0, _("Unexpected EOF in archive")));
416 break;
417 }
418 written = available_space_after (data_block);
419 if (written > size)
420 written = size;
421
422 memcpy (bp, data_block->buffer, written);
423 bp += written;
424 set_next_block_after ((union block *)
425 (data_block->buffer + written - 1));
426 }
427
428 *bp = '\0';
429 }
430 else if (header->header.typeflag == XHDTYPE)
431 xheader_read (header, OFF_FROM_HEADER (header->header.size));
432 else if (header->header.typeflag == XGLTYPE)
433 {
434 xheader_read (header, OFF_FROM_HEADER (header->header.size));
435 xheader_decode_global ();
436 }
437
438 /* Loop! */
439
440 }
441 else
442 {
443 char const *name;
444 struct posix_header const *h = &current_header->header;
445 char namebuf[sizeof h->prefix + 1 + NAME_FIELD_SIZE + 1];
446
447 if (recent_long_name)
448 free (recent_long_name);
449
450 if (next_long_name)
451 {
452 name = next_long_name->buffer + BLOCKSIZE;
453 recent_long_name = next_long_name;
454 recent_long_name_blocks = next_long_name_blocks;
455 }
456 else
457 {
458 /* Accept file names as specified by POSIX.1-1996
459 section 10.1.1. */
460 char *np = namebuf;
461
462 if (h->prefix[0] && strcmp (h->magic, TMAGIC) == 0)
463 {
464 memcpy (np, h->prefix, sizeof h->prefix);
465 np[sizeof h->prefix] = '\0';
466 np += strlen (np);
467 *np++ = '/';
468
469 /* Prevent later references to current_header from
470 mistakenly treating this as an old GNU header.
471 This assignment invalidates h->prefix. */
472 current_header->oldgnu_header.isextended = 0;
473 }
474 memcpy (np, h->name, sizeof h->name);
475 np[sizeof h->name] = '\0';
476 name = namebuf;
477 recent_long_name = 0;
478 recent_long_name_blocks = 0;
479 }
480 assign_string (&current_stat_info.orig_file_name, name);
481 assign_string (&current_stat_info.file_name, name);
482 current_stat_info.had_trailing_slash = strip_trailing_slashes (current_stat_info.file_name);
483
484 if (recent_long_link)
485 free (recent_long_link);
486
487 if (next_long_link)
488 {
489 name = next_long_link->buffer + BLOCKSIZE;
490 recent_long_link = next_long_link;
491 recent_long_link_blocks = next_long_link_blocks;
492 }
493 else
494 {
495 memcpy (namebuf, h->linkname, sizeof h->linkname);
496 namebuf[sizeof h->linkname] = '\0';
497 name = namebuf;
498 recent_long_link = 0;
499 recent_long_link_blocks = 0;
500 }
501 assign_string (&current_stat_info.link_name, name);
502
503 return HEADER_SUCCESS;
504 }
505 }
506 }
507
508 #define ISOCTAL(c) ((c)>='0'&&(c)<='7')
509
510 /* Decode things from a file HEADER block into STAT_INFO, also setting
511 *FORMAT_POINTER depending on the header block format. If
512 DO_USER_GROUP, decode the user/group information (this is useful
513 for extraction, but waste time when merely listing).
514
515 read_header() has already decoded the checksum and length, so we don't.
516
517 This routine should *not* be called twice for the same block, since
518 the two calls might use different DO_USER_GROUP values and thus
519 might end up with different uid/gid for the two calls. If anybody
520 wants the uid/gid they should decode it first, and other callers
521 should decode it without uid/gid before calling a routine,
522 e.g. print_header, that assumes decoded data. */
523 void
524 decode_header (union block *header, struct tar_stat_info *stat_info,
525 enum archive_format *format_pointer, int do_user_group)
526 {
527 enum archive_format format;
528
529 if (strcmp (header->header.magic, TMAGIC) == 0)
530 {
531 if (header->star_header.prefix[130] == 0
532 && ISOCTAL (header->star_header.atime[0])
533 && header->star_header.atime[11] == ' '
534 && ISOCTAL (header->star_header.ctime[0])
535 && header->star_header.ctime[11] == ' ')
536 format = STAR_FORMAT;
537 else if (extended_header.size)
538 format = POSIX_FORMAT;
539 else
540 format = USTAR_FORMAT;
541 }
542 else if (strcmp (header->header.magic, OLDGNU_MAGIC) == 0)
543 format = OLDGNU_FORMAT;
544 else
545 format = V7_FORMAT;
546 *format_pointer = format;
547
548 stat_info->stat.st_mode = MODE_FROM_HEADER (header->header.mode);
549 stat_info->stat.st_mtime = TIME_FROM_HEADER (header->header.mtime);
550 assign_string (&stat_info->uname,
551 header->header.uname[0] ? header->header.uname : NULL);
552 assign_string (&stat_info->gname,
553 header->header.gname[0] ? header->header.gname : NULL);
554 stat_info->devmajor = MAJOR_FROM_HEADER (header->header.devmajor);
555 stat_info->devminor = MINOR_FROM_HEADER (header->header.devminor);
556
557 stat_info->stat.st_atime = start_time;
558 stat_info->stat.st_ctime = start_time;
559
560 if (format == OLDGNU_FORMAT && incremental_option)
561 {
562 stat_info->stat.st_atime = TIME_FROM_HEADER (header->oldgnu_header.atime);
563 stat_info->stat.st_ctime = TIME_FROM_HEADER (header->oldgnu_header.ctime);
564 }
565
566 if (format == V7_FORMAT)
567 {
568 stat_info->stat.st_uid = UID_FROM_HEADER (header->header.uid);
569 stat_info->stat.st_gid = GID_FROM_HEADER (header->header.gid);
570 stat_info->stat.st_rdev = 0;
571 }
572 else
573 {
574
575 if (format == STAR_FORMAT)
576 {
577 stat_info->stat.st_atime = TIME_FROM_HEADER (header->star_header.atime);
578 stat_info->stat.st_ctime = TIME_FROM_HEADER (header->star_header.ctime);
579 }
580
581 if (do_user_group)
582 {
583 /* FIXME: Decide if this should somewhat depend on -p. */
584
585 if (numeric_owner_option
586 || !*header->header.uname
587 || !uname_to_uid (header->header.uname, &stat_info->stat.st_uid))
588 stat_info->stat.st_uid = UID_FROM_HEADER (header->header.uid);
589
590 if (numeric_owner_option
591 || !*header->header.gname
592 || !gname_to_gid (header->header.gname, &stat_info->stat.st_gid))
593 stat_info->stat.st_gid = GID_FROM_HEADER (header->header.gid);
594 }
595
596 switch (header->header.typeflag)
597 {
598 case BLKTYPE:
599 case CHRTYPE:
600 stat_info->stat.st_rdev = makedev (stat_info->devmajor,
601 stat_info->devminor);
602 break;
603
604 default:
605 stat_info->stat.st_rdev = 0;
606 }
607 }
608
609 stat_info->archive_file_size = stat_info->stat.st_size;
610 xheader_decode (stat_info);
611
612 if (sparse_member_p (stat_info))
613 {
614 sparse_fixup_header (stat_info);
615 stat_info->is_sparse = true;
616 }
617 else
618 stat_info->is_sparse = false;
619 }
620
621 /* Convert buffer at WHERE0 of size DIGS from external format to
622 uintmax_t. DIGS must be positive. If TYPE is nonnull, the data
623 are of type TYPE. The buffer must represent a value in the range
624 -MINUS_MINVAL through MAXVAL. If OCTAL_ONLY, allow only octal
625 numbers instead of the other GNU extensions. Return -1 on error,
626 diagnosing the error if TYPE is nonnull and if !SILENT. */
627 static uintmax_t
628 from_header (char const *where0, size_t digs, char const *type,
629 uintmax_t minus_minval, uintmax_t maxval,
630 bool octal_only, bool silent)
631 {
632 uintmax_t value;
633 char const *where = where0;
634 char const *lim = where + digs;
635 int negative = 0;
636
637 /* Accommodate buggy tar of unknown vintage, which outputs leading
638 NUL if the previous field overflows. */
639 where += !*where;
640
641 /* Accommodate older tars, which output leading spaces. */
642 for (;;)
643 {
644 if (where == lim)
645 {
646 if (type && !silent)
647 ERROR ((0, 0,
648 /* TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.) */
649 _("Blanks in header where numeric %s value expected"),
650 type));
651 return -1;
652 }
653 if (!ISSPACE ((unsigned char) *where))
654 break;
655 where++;
656 }
657
658 value = 0;
659 if (ISODIGIT (*where))
660 {
661 char const *where1 = where;
662 uintmax_t overflow = 0;
663
664 for (;;)
665 {
666 value += *where++ - '0';
667 if (where == lim || ! ISODIGIT (*where))
668 break;
669 overflow |= value ^ (value << LG_8 >> LG_8);
670 value <<= LG_8;
671 }
672
673 /* Parse the output of older, unportable tars, which generate
674 negative values in two's complement octal. If the leading
675 nonzero digit is 1, we can't recover the original value
676 reliably; so do this only if the digit is 2 or more. This
677 catches the common case of 32-bit negative time stamps. */
678 if ((overflow || maxval < value) && '2' <= *where1 && type)
679 {
680 /* Compute the negative of the input value, assuming two's
681 complement. */
682 int digit = (*where1 - '0') | 4;
683 overflow = 0;
684 value = 0;
685 where = where1;
686 for (;;)
687 {
688 value += 7 - digit;
689 where++;
690 if (where == lim || ! ISODIGIT (*where))
691 break;
692 digit = *where - '0';
693 overflow |= value ^ (value << LG_8 >> LG_8);
694 value <<= LG_8;
695 }
696 value++;
697 overflow |= !value;
698
699 if (!overflow && value <= minus_minval)
700 {
701 if (!silent)
702 WARN ((0, 0,
703 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
704 _("Archive octal value %.*s is out of %s range; assuming two's complement"),
705 (int) (where - where1), where1, type));
706 negative = 1;
707 }
708 }
709
710 if (overflow)
711 {
712 if (type && !silent)
713 ERROR ((0, 0,
714 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
715 _("Archive octal value %.*s is out of %s range"),
716 (int) (where - where1), where1, type));
717 return -1;
718 }
719 }
720 else if (octal_only)
721 {
722 /* Suppress the following extensions. */
723 }
724 else if (*where == '-' || *where == '+')
725 {
726 /* Parse base-64 output produced only by tar test versions
727 1.13.6 (1999-08-11) through 1.13.11 (1999-08-23).
728 Support for this will be withdrawn in future releases. */
729 int dig;
730 if (!silent)
731 {
732 static bool warned_once;
733 if (! warned_once)
734 {
735 warned_once = true;
736 WARN ((0, 0, _("Archive contains obsolescent base-64 headers")));
737 }
738 }
739 negative = *where++ == '-';
740 while (where != lim
741 && (dig = base64_map[(unsigned char) *where]) < 64)
742 {
743 if (value << LG_64 >> LG_64 != value)
744 {
745 char *string = alloca (digs + 1);
746 memcpy (string, where0, digs);
747 string[digs] = '\0';
748 if (type && !silent)
749 ERROR ((0, 0,
750 _("Archive signed base-64 string %s is out of %s range"),
751 quote (string), type));
752 return -1;
753 }
754 value = (value << LG_64) | dig;
755 where++;
756 }
757 }
758 else if (*where == '\200' /* positive base-256 */
759 || *where == '\377' /* negative base-256 */)
760 {
761 /* Parse base-256 output. A nonnegative number N is
762 represented as (256**DIGS)/2 + N; a negative number -N is
763 represented as (256**DIGS) - N, i.e. as two's complement.
764 The representation guarantees that the leading bit is
765 always on, so that we don't confuse this format with the
766 others (assuming ASCII bytes of 8 bits or more). */
767 int signbit = *where & (1 << (LG_256 - 2));
768 uintmax_t topbits = (((uintmax_t) - signbit)
769 << (CHAR_BIT * sizeof (uintmax_t)
770 - LG_256 - (LG_256 - 2)));
771 value = (*where++ & ((1 << (LG_256 - 2)) - 1)) - signbit;
772 for (;;)
773 {
774 value = (value << LG_256) + (unsigned char) *where++;
775 if (where == lim)
776 break;
777 if (((value << LG_256 >> LG_256) | topbits) != value)
778 {
779 if (type && !silent)
780 ERROR ((0, 0,
781 _("Archive base-256 value is out of %s range"),
782 type));
783 return -1;
784 }
785 }
786 negative = signbit;
787 if (negative)
788 value = -value;
789 }
790
791 if (where != lim && *where && !ISSPACE ((unsigned char) *where))
792 {
793 if (type)
794 {
795 char buf[1000]; /* Big enough to represent any header. */
796 static struct quoting_options *o;
797
798 if (!o)
799 {
800 o = clone_quoting_options (0);
801 set_quoting_style (o, locale_quoting_style);
802 }
803
804 while (where0 != lim && ! lim[-1])
805 lim--;
806 quotearg_buffer (buf, sizeof buf, where0, lim - where, o);
807 if (!silent)
808 ERROR ((0, 0,
809 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
810 _("Archive contains %.*s where numeric %s value expected"),
811 (int) sizeof buf, buf, type));
812 }
813
814 return -1;
815 }
816
817 if (value <= (negative ? minus_minval : maxval))
818 return negative ? -value : value;
819
820 if (type && !silent)
821 {
822 char minval_buf[UINTMAX_STRSIZE_BOUND + 1];
823 char maxval_buf[UINTMAX_STRSIZE_BOUND];
824 char value_buf[UINTMAX_STRSIZE_BOUND + 1];
825 char *minval_string = STRINGIFY_BIGINT (minus_minval, minval_buf + 1);
826 char *value_string = STRINGIFY_BIGINT (value, value_buf + 1);
827 if (negative)
828 *--value_string = '-';
829 if (minus_minval)
830 *--minval_string = '-';
831 /* TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.) */
832 ERROR ((0, 0, _("Archive value %s is out of %s range %s..%s"),
833 value_string, type,
834 minval_string, STRINGIFY_BIGINT (maxval, maxval_buf)));
835 }
836
837 return -1;
838 }
839
840 gid_t
841 gid_from_header (const char *p, size_t s)
842 {
843 return from_header (p, s, "gid_t",
844 - (uintmax_t) TYPE_MINIMUM (gid_t),
845 (uintmax_t) TYPE_MAXIMUM (gid_t),
846 false, false);
847 }
848
849 major_t
850 major_from_header (const char *p, size_t s)
851 {
852 return from_header (p, s, "major_t",
853 - (uintmax_t) TYPE_MINIMUM (major_t),
854 (uintmax_t) TYPE_MAXIMUM (major_t), false, false);
855 }
856
857 minor_t
858 minor_from_header (const char *p, size_t s)
859 {
860 return from_header (p, s, "minor_t",
861 - (uintmax_t) TYPE_MINIMUM (minor_t),
862 (uintmax_t) TYPE_MAXIMUM (minor_t), false, false);
863 }
864
865 mode_t
866 mode_from_header (const char *p, size_t s)
867 {
868 /* Do not complain about unrecognized mode bits. */
869 unsigned u = from_header (p, s, "mode_t",
870 - (uintmax_t) TYPE_MINIMUM (mode_t),
871 TYPE_MAXIMUM (uintmax_t), false, false);
872 return ((u & TSUID ? S_ISUID : 0)
873 | (u & TSGID ? S_ISGID : 0)
874 | (u & TSVTX ? S_ISVTX : 0)
875 | (u & TUREAD ? S_IRUSR : 0)
876 | (u & TUWRITE ? S_IWUSR : 0)
877 | (u & TUEXEC ? S_IXUSR : 0)
878 | (u & TGREAD ? S_IRGRP : 0)
879 | (u & TGWRITE ? S_IWGRP : 0)
880 | (u & TGEXEC ? S_IXGRP : 0)
881 | (u & TOREAD ? S_IROTH : 0)
882 | (u & TOWRITE ? S_IWOTH : 0)
883 | (u & TOEXEC ? S_IXOTH : 0));
884 }
885
886 off_t
887 off_from_header (const char *p, size_t s)
888 {
889 /* Negative offsets are not allowed in tar files, so invoke
890 from_header with minimum value 0, not TYPE_MINIMUM (off_t). */
891 return from_header (p, s, "off_t", (uintmax_t) 0,
892 (uintmax_t) TYPE_MAXIMUM (off_t), false, false);
893 }
894
895 size_t
896 size_from_header (const char *p, size_t s)
897 {
898 return from_header (p, s, "size_t", (uintmax_t) 0,
899 (uintmax_t) TYPE_MAXIMUM (size_t), false, false);
900 }
901
902 time_t
903 time_from_header (const char *p, size_t s)
904 {
905 return from_header (p, s, "time_t",
906 - (uintmax_t) TYPE_MINIMUM (time_t),
907 (uintmax_t) TYPE_MAXIMUM (time_t), false, false);
908 }
909
910 uid_t
911 uid_from_header (const char *p, size_t s)
912 {
913 return from_header (p, s, "uid_t",
914 - (uintmax_t) TYPE_MINIMUM (uid_t),
915 (uintmax_t) TYPE_MAXIMUM (uid_t), false, false);
916 }
917
918 uintmax_t
919 uintmax_from_header (const char *p, size_t s)
920 {
921 return from_header (p, s, "uintmax_t", (uintmax_t) 0,
922 TYPE_MAXIMUM (uintmax_t), false, false);
923 }
924
925
926 /* Format O as a null-terminated decimal string into BUF _backwards_;
927 return pointer to start of result. */
928 char *
929 stringify_uintmax_t_backwards (uintmax_t o, char *buf)
930 {
931 *--buf = '\0';
932 do
933 *--buf = '0' + (int) (o % 10);
934 while ((o /= 10) != 0);
935 return buf;
936 }
937
938 /* Return a printable representation of T. The result points to
939 static storage that can be reused in the next call to this
940 function, to ctime, or to asctime. */
941 char const *
942 tartime (time_t t)
943 {
944 static char buffer[max (UINTMAX_STRSIZE_BOUND + 1,
945 INT_STRLEN_BOUND (int) + 16)];
946 char *p;
947
948 #if USE_OLD_CTIME
949 p = ctime (&t);
950 if (p)
951 {
952 char const *time_stamp = p + 4;
953 for (p += 16; p[3] != '\n'; p++)
954 p[0] = p[3];
955 p[0] = '\0';
956 return time_stamp;
957 }
958 #else
959 /* Use ISO 8610 format. See:
960 http://www.cl.cam.ac.uk/~mgk25/iso-time.html */
961 struct tm *tm = utc_option ? gmtime (&t) : localtime (&t);
962 if (tm)
963 {
964 sprintf (buffer, "%04ld-%02d-%02d %02d:%02d:%02d",
965 tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
966 tm->tm_hour, tm->tm_min, tm->tm_sec);
967 return buffer;
968 }
969 #endif
970
971 /* The time stamp cannot be broken down, most likely because it
972 is out of range. Convert it as an integer,
973 right-adjusted in a field with the same width as the usual
974 19-byte 4-year ISO time format. */
975 p = stringify_uintmax_t_backwards (t < 0 ? - (uintmax_t) t : (uintmax_t) t,
976 buffer + sizeof buffer);
977 if (t < 0)
978 *--p = '-';
979 while (buffer + sizeof buffer - 19 - 1 < p)
980 *--p = ' ';
981 return p;
982 }
983
984 /* Actually print it.
985
986 Plain and fancy file header block logging. Non-verbose just prints
987 the name, e.g. for "tar t" or "tar x". This should just contain
988 file names, so it can be fed back into tar with xargs or the "-T"
989 option. The verbose option can give a bunch of info, one line per
990 file. I doubt anybody tries to parse its format, or if they do,
991 they shouldn't. Unix tar is pretty random here anyway. */
992
993
994 /* FIXME: Note that print_header uses the globals HEAD, HSTAT, and
995 HEAD_STANDARD, which must be set up in advance. Not very clean.. */
996
997 /* UGSWIDTH starts with 18, so with user and group names <= 8 chars, the
998 columns never shift during the listing. */
999 #define UGSWIDTH 18
1000 static int ugswidth = UGSWIDTH; /* maximum width encountered so far */
1001
1002 /* DATEWIDTH is the number of columns taken by the date and time fields. */
1003 #if USE_OLD_CDATE
1004 # define DATEWIDTH 19
1005 #else
1006 # define DATEWIDTH 18
1007 #endif
1008
1009 void
1010 print_header (struct tar_stat_info *st, off_t block_ordinal)
1011 {
1012 char modes[11];
1013 char const *time_stamp;
1014 char *temp_name = st->orig_file_name ? st->orig_file_name : st->file_name;
1015
1016 /* These hold formatted ints. */
1017 char uform[UINTMAX_STRSIZE_BOUND], gform[UINTMAX_STRSIZE_BOUND];
1018 char *user, *group;
1019 char size[2 * UINTMAX_STRSIZE_BOUND];
1020 /* holds formatted size or major,minor */
1021 char uintbuf[UINTMAX_STRSIZE_BOUND];
1022 int pad;
1023
1024 if (block_number_option)
1025 {
1026 char buf[UINTMAX_STRSIZE_BOUND];
1027 if (block_ordinal < 0)
1028 block_ordinal = current_block_ordinal ();
1029 block_ordinal -= recent_long_name_blocks;
1030 block_ordinal -= recent_long_link_blocks;
1031 fprintf (stdlis, _("block %s: "),
1032 STRINGIFY_BIGINT (block_ordinal, buf));
1033 }
1034
1035 if (verbose_option <= 1)
1036 {
1037 /* Just the fax, mam. */
1038 fprintf (stdlis, "%s\n", quotearg (temp_name));
1039 }
1040 else
1041 {
1042 /* File type and modes. */
1043
1044 modes[0] = '?';
1045 switch (current_header->header.typeflag)
1046 {
1047 case GNUTYPE_VOLHDR:
1048 modes[0] = 'V';
1049 break;
1050
1051 case GNUTYPE_MULTIVOL:
1052 modes[0] = 'M';
1053 break;
1054
1055 case GNUTYPE_NAMES:
1056 modes[0] = 'N';
1057 break;
1058
1059 case GNUTYPE_LONGNAME:
1060 case GNUTYPE_LONGLINK:
1061 modes[0] = 'L';
1062 ERROR ((0, 0, _("Unexpected long name header")));
1063 break;
1064
1065 case GNUTYPE_SPARSE:
1066 case REGTYPE:
1067 case AREGTYPE:
1068 modes[0] = '-';
1069 if (temp_name[strlen (temp_name) - 1] == '/')
1070 modes[0] = 'd';
1071 break;
1072 case LNKTYPE:
1073 modes[0] = 'h';
1074 break;
1075 case GNUTYPE_DUMPDIR:
1076 modes[0] = 'd';
1077 break;
1078 case DIRTYPE:
1079 modes[0] = 'd';
1080 break;
1081 case SYMTYPE:
1082 modes[0] = 'l';
1083 break;
1084 case BLKTYPE:
1085 modes[0] = 'b';
1086 break;
1087 case CHRTYPE:
1088 modes[0] = 'c';
1089 break;
1090 case FIFOTYPE:
1091 modes[0] = 'p';
1092 break;
1093 case CONTTYPE:
1094 modes[0] = 'C';
1095 break;
1096 }
1097
1098 decode_mode (st->stat.st_mode, modes + 1);
1099
1100 /* Time stamp. */
1101
1102 time_stamp = tartime (st->stat.st_mtime);
1103
1104 /* User and group names. */
1105
1106 if (st->uname && current_format != V7_FORMAT
1107 && !numeric_owner_option)
1108 user = st->uname;
1109 else
1110 {
1111 /* Try parsing it as an unsigned integer first, and as a
1112 uid_t if that fails. This method can list positive user
1113 ids that are too large to fit in a uid_t. */
1114 uintmax_t u = from_header (current_header->header.uid,
1115 sizeof current_header->header.uid, 0,
1116 (uintmax_t) 0,
1117 (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1118 false, false);
1119 if (u != -1)
1120 user = STRINGIFY_BIGINT (u, uform);
1121 else
1122 {
1123 sprintf (uform, "%ld",
1124 (long) UID_FROM_HEADER (current_header->header.uid));
1125 user = uform;
1126 }
1127 }
1128
1129 if (st->gname && current_format != V7_FORMAT
1130 && !numeric_owner_option)
1131 group = st->gname;
1132 else
1133 {
1134 /* Try parsing it as an unsigned integer first, and as a
1135 gid_t if that fails. This method can list positive group
1136 ids that are too large to fit in a gid_t. */
1137 uintmax_t g = from_header (current_header->header.gid,
1138 sizeof current_header->header.gid, 0,
1139 (uintmax_t) 0,
1140 (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1141 false, false);
1142 if (g != -1)
1143 group = STRINGIFY_BIGINT (g, gform);
1144 else
1145 {
1146 sprintf (gform, "%ld",
1147 (long) GID_FROM_HEADER (current_header->header.gid));
1148 group = gform;
1149 }
1150 }
1151
1152 /* Format the file size or major/minor device numbers. */
1153
1154 switch (current_header->header.typeflag)
1155 {
1156 case CHRTYPE:
1157 case BLKTYPE:
1158 strcpy (size,
1159 STRINGIFY_BIGINT (major (st->stat.st_rdev), uintbuf));
1160 strcat (size, ",");
1161 strcat (size,
1162 STRINGIFY_BIGINT (minor (st->stat.st_rdev), uintbuf));
1163 break;
1164
1165 default:
1166 /* st->stat.st_size keeps stored file size */
1167 strcpy (size, STRINGIFY_BIGINT (st->stat.st_size, uintbuf));
1168 break;
1169 }
1170
1171 /* Figure out padding and print the whole line. */
1172
1173 pad = strlen (user) + strlen (group) + strlen (size) + 1;
1174 if (pad > ugswidth)
1175 ugswidth = pad;
1176
1177 fprintf (stdlis, "%s %s/%s %*s%s %s",
1178 modes, user, group, ugswidth - pad, "", size, time_stamp);
1179
1180 fprintf (stdlis, " %s", quotearg (temp_name));
1181
1182 switch (current_header->header.typeflag)
1183 {
1184 case SYMTYPE:
1185 fprintf (stdlis, " -> %s\n", quotearg (st->link_name));
1186 break;
1187
1188 case LNKTYPE:
1189 fprintf (stdlis, _(" link to %s\n"), quotearg (st->link_name));
1190 break;
1191
1192 default:
1193 {
1194 char type_string[2];
1195 type_string[0] = current_header->header.typeflag;
1196 type_string[1] = '\0';
1197 fprintf (stdlis, _(" unknown file type %s\n"),
1198 quote (type_string));
1199 }
1200 break;
1201
1202 case AREGTYPE:
1203 case REGTYPE:
1204 case GNUTYPE_SPARSE:
1205 case CHRTYPE:
1206 case BLKTYPE:
1207 case DIRTYPE:
1208 case FIFOTYPE:
1209 case CONTTYPE:
1210 case GNUTYPE_DUMPDIR:
1211 putc ('\n', stdlis);
1212 break;
1213
1214 case GNUTYPE_LONGLINK:
1215 fprintf (stdlis, _("--Long Link--\n"));
1216 break;
1217
1218 case GNUTYPE_LONGNAME:
1219 fprintf (stdlis, _("--Long Name--\n"));
1220 break;
1221
1222 case GNUTYPE_VOLHDR:
1223 fprintf (stdlis, _("--Volume Header--\n"));
1224 break;
1225
1226 case GNUTYPE_MULTIVOL:
1227 strcpy (size,
1228 STRINGIFY_BIGINT
1229 (UINTMAX_FROM_HEADER (current_header->oldgnu_header.offset),
1230 uintbuf));
1231 fprintf (stdlis, _("--Continued at byte %s--\n"), size);
1232 break;
1233
1234 case GNUTYPE_NAMES:
1235 fprintf (stdlis, _("--Mangled file names--\n"));
1236 break;
1237 }
1238 }
1239 fflush (stdlis);
1240 }
1241
1242 /* Print a similar line when we make a directory automatically. */
1243 void
1244 print_for_mkdir (char *dirname, int length, mode_t mode)
1245 {
1246 char modes[11];
1247
1248 if (verbose_option > 1)
1249 {
1250 /* File type and modes. */
1251
1252 modes[0] = 'd';
1253 decode_mode (mode, modes + 1);
1254
1255 if (block_number_option)
1256 {
1257 char buf[UINTMAX_STRSIZE_BOUND];
1258 fprintf (stdlis, _("block %s: "),
1259 STRINGIFY_BIGINT (current_block_ordinal (), buf));
1260 }
1261
1262 fprintf (stdlis, "%s %*s %.*s\n", modes, ugswidth + DATEWIDTH,
1263 _("Creating directory:"), length, quotearg (dirname));
1264 }
1265 }
1266
1267 /* Skip over SIZE bytes of data in blocks in the archive. */
1268 void
1269 skip_file (off_t size)
1270 {
1271 union block *x;
1272
1273 if (multi_volume_option)
1274 {
1275 save_totsize = size;
1276 save_sizeleft = size;
1277 }
1278
1279 if (seekable_archive)
1280 {
1281 off_t nblk = seek_archive (size);
1282 if (nblk >= 0)
1283 {
1284 size -= nblk * BLOCKSIZE;
1285 if (multi_volume_option) /* Argh.. */
1286 save_sizeleft -= nblk * BLOCKSIZE;
1287 }
1288 else
1289 seekable_archive = false;
1290 }
1291
1292 while (size > 0)
1293 {
1294 x = find_next_block ();
1295 if (! x)
1296 FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
1297
1298 set_next_block_after (x);
1299 size -= BLOCKSIZE;
1300 if (multi_volume_option)
1301 save_sizeleft -= BLOCKSIZE;
1302 }
1303 }
1304
1305 /* Skip the current member in the archive.
1306 NOTE: Current header must be decoded before calling this function. */
1307 void
1308 skip_member (void)
1309 {
1310 char save_typeflag = current_header->header.typeflag;
1311 set_next_block_after (current_header);
1312
1313 assign_string (&save_name, current_stat_info.file_name);
1314
1315 if (current_stat_info.is_sparse)
1316 sparse_skip_file (&current_stat_info);
1317 else if (save_typeflag != DIRTYPE)
1318 skip_file (current_stat_info.stat.st_size);
1319 }
This page took 0.091038 seconds and 5 git commands to generate.