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