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