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