]> Dogcows Code - chaz/tar/blob - src/list.c
Keep a detailed map of archive members stored in the record buffer.
[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, 2006, 2007, 2010 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 3, 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 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
21
22 #include <system.h>
23 #include <inttostr.h>
24 #include <quotearg.h>
25
26 #include "common.h"
27
28 #define max(a, b) ((a) < (b) ? (b) : (a))
29
30 union block *current_header; /* points to current archive header */
31 enum archive_format current_format; /* recognized format */
32 union block *recent_long_name; /* recent long name header and contents */
33 union block *recent_long_link; /* likewise, for long link */
34 size_t recent_long_name_blocks; /* number of blocks in recent_long_name */
35 size_t recent_long_link_blocks; /* likewise, for long link */
36 union block *recent_global_header; /* Recent global header block */
37
38 static uintmax_t from_header (const char *, size_t, const char *,
39 uintmax_t, uintmax_t, bool, bool);
40
41 /* Base 64 digits; see Internet RFC 2045 Table 1. */
42 static char const base_64_digits[64] =
43 {
44 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
45 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
46 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
47 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
48 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
49 };
50
51 /* Table of base-64 digit values indexed by unsigned chars.
52 The value is 64 for unsigned chars that are not base-64 digits. */
53 static char base64_map[UCHAR_MAX + 1];
54
55 static void
56 base64_init (void)
57 {
58 int i;
59 memset (base64_map, 64, sizeof base64_map);
60 for (i = 0; i < 64; i++)
61 base64_map[(int) base_64_digits[i]] = i;
62 }
63
64 /* Main loop for reading an archive. */
65 void
66 read_and (void (*do_something) (void))
67 {
68 enum read_header status = HEADER_STILL_UNREAD;
69 enum read_header prev_status;
70 struct timespec mtime;
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
81 status = read_header (&current_header, &current_stat_info,
82 read_header_auto);
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 decode_header (current_header, &current_stat_info,
94 &current_format, 1);
95 if (! name_match (current_stat_info.file_name)
96 || (NEWER_OPTION_INITIALIZED (newer_mtime_option)
97 /* FIXME: We get mtime now, and again later; this causes
98 duplicate diagnostics if header.mtime is bogus. */
99 && ((mtime.tv_sec
100 = TIME_FROM_HEADER (current_header->header.mtime)),
101 /* FIXME: Grab fractional time stamps from
102 extended header. */
103 mtime.tv_nsec = 0,
104 current_stat_info.mtime = mtime,
105 OLDER_TAR_STAT_TIME (current_stat_info, 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 break;
113
114 case DIRTYPE:
115 if (show_omitted_dirs_option)
116 WARN ((0, 0, _("%s: Omitting"),
117 quotearg_colon (current_stat_info.file_name)));
118 /* Fall through. */
119 default:
120 skip_member ();
121 continue;
122 }
123 }
124
125 (*do_something) ();
126 continue;
127
128 case HEADER_ZERO_BLOCK:
129 if (block_number_option)
130 {
131 char buf[UINTMAX_STRSIZE_BOUND];
132 fprintf (stdlis, _("block %s: ** Block of NULs **\n"),
133 STRINGIFY_BIGINT (current_block_ordinal (), buf));
134 }
135
136 set_next_block_after (current_header);
137
138 if (!ignore_zeros_option)
139 {
140 char buf[UINTMAX_STRSIZE_BOUND];
141
142 status = read_header (&current_header, &current_stat_info,
143 read_header_auto);
144 if (status == HEADER_ZERO_BLOCK)
145 break;
146 WARNOPT (WARN_ALONE_ZERO_BLOCK,
147 (0, 0, _("A lone zero block at %s"),
148 STRINGIFY_BIGINT (current_block_ordinal (), buf)));
149 break;
150 }
151 status = prev_status;
152 continue;
153
154 case HEADER_END_OF_FILE:
155 if (block_number_option)
156 {
157 char buf[UINTMAX_STRSIZE_BOUND];
158 fprintf (stdlis, _("block %s: ** End of File **\n"),
159 STRINGIFY_BIGINT (current_block_ordinal (), buf));
160 }
161 break;
162
163 case HEADER_FAILURE:
164 /* If the previous header was good, tell them that we are
165 skipping bad ones. */
166 set_next_block_after (current_header);
167 switch (prev_status)
168 {
169 case HEADER_STILL_UNREAD:
170 ERROR ((0, 0, _("This does not look like a tar archive")));
171 /* Fall through. */
172
173 case HEADER_ZERO_BLOCK:
174 case HEADER_SUCCESS:
175 if (block_number_option)
176 {
177 char buf[UINTMAX_STRSIZE_BOUND];
178 off_t block_ordinal = current_block_ordinal ();
179 block_ordinal -= recent_long_name_blocks;
180 block_ordinal -= recent_long_link_blocks;
181 fprintf (stdlis, _("block %s: "),
182 STRINGIFY_BIGINT (block_ordinal, buf));
183 }
184 ERROR ((0, 0, _("Skipping to next header")));
185 break;
186
187 case HEADER_END_OF_FILE:
188 case HEADER_FAILURE:
189 /* We are in the middle of a cascade of errors. */
190 break;
191
192 case HEADER_SUCCESS_EXTENDED:
193 abort ();
194 }
195 continue;
196 }
197 break;
198 }
199 while (!all_names_found (&current_stat_info));
200
201 close_archive ();
202 names_notfound (); /* print names not found */
203 }
204
205 /* Print a header block, based on tar options. */
206 void
207 list_archive (void)
208 {
209 off_t block_ordinal = current_block_ordinal ();
210
211 /* Print the header block. */
212 if (verbose_option)
213 print_header (&current_stat_info, current_header, block_ordinal);
214
215 if (incremental_option)
216 {
217 if (verbose_option > 2)
218 {
219 if (is_dumpdir (&current_stat_info))
220 list_dumpdir (current_stat_info.dumpdir,
221 dumpdir_size (current_stat_info.dumpdir));
222 }
223 }
224
225 skip_member ();
226 }
227
228 /* Check header checksum */
229 /* The standard BSD tar sources create the checksum by adding up the
230 bytes in the header as type char. I think the type char was unsigned
231 on the PDP-11, but it's signed on the Next and Sun. It looks like the
232 sources to BSD tar were never changed to compute the checksum
233 correctly, so both the Sun and Next add the bytes of the header as
234 signed chars. This doesn't cause a problem until you get a file with
235 a name containing characters with the high bit set. So tar_checksum
236 computes two checksums -- signed and unsigned. */
237
238 enum read_header
239 tar_checksum (union block *header, bool silent)
240 {
241 size_t i;
242 int unsigned_sum = 0; /* the POSIX one :-) */
243 int signed_sum = 0; /* the Sun one :-( */
244 int recorded_sum;
245 uintmax_t parsed_sum;
246 char *p;
247
248 p = header->buffer;
249 for (i = sizeof *header; i-- != 0;)
250 {
251 unsigned_sum += (unsigned char) *p;
252 signed_sum += (signed char) (*p++);
253 }
254
255 if (unsigned_sum == 0)
256 return HEADER_ZERO_BLOCK;
257
258 /* Adjust checksum to count the "chksum" field as blanks. */
259
260 for (i = sizeof header->header.chksum; i-- != 0;)
261 {
262 unsigned_sum -= (unsigned char) header->header.chksum[i];
263 signed_sum -= (signed char) (header->header.chksum[i]);
264 }
265 unsigned_sum += ' ' * sizeof header->header.chksum;
266 signed_sum += ' ' * sizeof header->header.chksum;
267
268 parsed_sum = from_header (header->header.chksum,
269 sizeof header->header.chksum, 0,
270 (uintmax_t) 0,
271 (uintmax_t) TYPE_MAXIMUM (int), true, silent);
272 if (parsed_sum == (uintmax_t) -1)
273 return HEADER_FAILURE;
274
275 recorded_sum = parsed_sum;
276
277 if (unsigned_sum != recorded_sum && signed_sum != recorded_sum)
278 return HEADER_FAILURE;
279
280 return HEADER_SUCCESS;
281 }
282
283 /* Read a block that's supposed to be a header block. Return its
284 address in *RETURN_BLOCK, and if it is good, the file's size
285 and names (file name, link name) in *INFO.
286
287 Return one of enum read_header describing the status of the
288 operation.
289
290 The MODE parameter instructs read_header what to do with special
291 header blocks, i.e.: extended POSIX, GNU long name or long link,
292 etc.:
293
294 read_header_auto process them automatically,
295 read_header_x_raw when a special header is read, return
296 HEADER_SUCCESS_EXTENDED without actually
297 processing the header,
298 read_header_x_global when a POSIX global header is read,
299 decode it and return HEADER_SUCCESS_EXTENDED.
300
301 You must always set_next_block_after(*return_block) to skip past
302 the header which this routine reads. */
303
304 enum read_header
305 read_header (union block **return_block, struct tar_stat_info *info,
306 enum read_header_mode mode)
307 {
308 union block *header;
309 union block *header_copy;
310 char *bp;
311 union block *data_block;
312 size_t size, written;
313 union block *next_long_name = 0;
314 union block *next_long_link = 0;
315 size_t next_long_name_blocks = 0;
316 size_t next_long_link_blocks = 0;
317
318 while (1)
319 {
320 enum read_header status;
321
322 header = find_next_block ();
323 *return_block = header;
324 if (!header)
325 return HEADER_END_OF_FILE;
326
327 if ((status = tar_checksum (header, false)) != HEADER_SUCCESS)
328 return status;
329
330 /* Good block. Decode file size and return. */
331
332 if (header->header.typeflag == LNKTYPE)
333 info->stat.st_size = 0; /* links 0 size on tape */
334 else
335 info->stat.st_size = OFF_FROM_HEADER (header->header.size);
336
337 if (header->header.typeflag == GNUTYPE_LONGNAME
338 || header->header.typeflag == GNUTYPE_LONGLINK
339 || header->header.typeflag == XHDTYPE
340 || header->header.typeflag == XGLTYPE
341 || header->header.typeflag == SOLARIS_XHDTYPE)
342 {
343 if (mode == read_header_x_raw)
344 return HEADER_SUCCESS_EXTENDED;
345 else if (header->header.typeflag == GNUTYPE_LONGNAME
346 || header->header.typeflag == GNUTYPE_LONGLINK)
347 {
348 size_t name_size = info->stat.st_size;
349 size_t n = name_size % BLOCKSIZE;
350 size = name_size + BLOCKSIZE;
351 if (n)
352 size += BLOCKSIZE - n;
353
354 if (name_size != info->stat.st_size || size < name_size)
355 xalloc_die ();
356
357 header_copy = xmalloc (size + 1);
358
359 if (header->header.typeflag == GNUTYPE_LONGNAME)
360 {
361 if (next_long_name)
362 free (next_long_name);
363 next_long_name = header_copy;
364 next_long_name_blocks = size / BLOCKSIZE;
365 }
366 else
367 {
368 if (next_long_link)
369 free (next_long_link);
370 next_long_link = header_copy;
371 next_long_link_blocks = size / BLOCKSIZE;
372 }
373
374 set_next_block_after (header);
375 *header_copy = *header;
376 bp = header_copy->buffer + BLOCKSIZE;
377
378 for (size -= BLOCKSIZE; size > 0; size -= written)
379 {
380 data_block = find_next_block ();
381 if (! data_block)
382 {
383 ERROR ((0, 0, _("Unexpected EOF in archive")));
384 break;
385 }
386 written = available_space_after (data_block);
387 if (written > size)
388 written = size;
389
390 memcpy (bp, data_block->buffer, written);
391 bp += written;
392 set_next_block_after ((union block *)
393 (data_block->buffer + written - 1));
394 }
395
396 *bp = '\0';
397 }
398 else if (header->header.typeflag == XHDTYPE
399 || header->header.typeflag == SOLARIS_XHDTYPE)
400 xheader_read (&info->xhdr, header,
401 OFF_FROM_HEADER (header->header.size));
402 else if (header->header.typeflag == XGLTYPE)
403 {
404 struct xheader xhdr;
405
406 if (!recent_global_header)
407 recent_global_header = xmalloc (sizeof *recent_global_header);
408 memcpy (recent_global_header, header,
409 sizeof *recent_global_header);
410 memset (&xhdr, 0, sizeof xhdr);
411 xheader_read (&xhdr, header,
412 OFF_FROM_HEADER (header->header.size));
413 xheader_decode_global (&xhdr);
414 xheader_destroy (&xhdr);
415 if (mode == read_header_x_global)
416 return HEADER_SUCCESS_EXTENDED;
417 }
418
419 /* Loop! */
420
421 }
422 else
423 {
424 char const *name;
425 struct posix_header const *h = &header->header;
426 char namebuf[sizeof h->prefix + 1 + NAME_FIELD_SIZE + 1];
427
428 if (recent_long_name)
429 free (recent_long_name);
430
431 if (next_long_name)
432 {
433 name = next_long_name->buffer + BLOCKSIZE;
434 recent_long_name = next_long_name;
435 recent_long_name_blocks = next_long_name_blocks;
436 }
437 else
438 {
439 /* Accept file names as specified by POSIX.1-1996
440 section 10.1.1. */
441 char *np = namebuf;
442
443 if (h->prefix[0] && strcmp (h->magic, TMAGIC) == 0)
444 {
445 memcpy (np, h->prefix, sizeof h->prefix);
446 np[sizeof h->prefix] = '\0';
447 np += strlen (np);
448 *np++ = '/';
449 }
450 memcpy (np, h->name, sizeof h->name);
451 np[sizeof h->name] = '\0';
452 name = namebuf;
453 recent_long_name = 0;
454 recent_long_name_blocks = 0;
455 }
456 assign_string (&info->orig_file_name, name);
457 assign_string (&info->file_name, name);
458 info->had_trailing_slash = strip_trailing_slashes (info->file_name);
459
460 if (recent_long_link)
461 free (recent_long_link);
462
463 if (next_long_link)
464 {
465 name = next_long_link->buffer + BLOCKSIZE;
466 recent_long_link = next_long_link;
467 recent_long_link_blocks = next_long_link_blocks;
468 }
469 else
470 {
471 memcpy (namebuf, h->linkname, sizeof h->linkname);
472 namebuf[sizeof h->linkname] = '\0';
473 name = namebuf;
474 recent_long_link = 0;
475 recent_long_link_blocks = 0;
476 }
477 assign_string (&info->link_name, name);
478
479 return HEADER_SUCCESS;
480 }
481 }
482 }
483
484 static char *
485 decode_xform (char *file_name, void *data)
486 {
487 int type = *(int*)data;
488
489 switch (type)
490 {
491 case XFORM_SYMLINK:
492 /* FIXME: It is not quite clear how and to which extent are the symbolic
493 links subject to filename transformation. In the absence of another
494 solution, symbolic links are exempt from component stripping and
495 name suffix normalization, but subject to filename transformation
496 proper. */
497 return file_name;
498
499 case XFORM_LINK:
500 file_name = safer_name_suffix (file_name, true, absolute_names_option);
501 break;
502
503 case XFORM_REGFILE:
504 file_name = safer_name_suffix (file_name, false, absolute_names_option);
505 break;
506 }
507
508 if (strip_name_components)
509 {
510 size_t prefix_len = stripped_prefix_len (file_name,
511 strip_name_components);
512 if (prefix_len == (size_t) -1)
513 prefix_len = strlen (file_name);
514 file_name += prefix_len;
515 }
516 return file_name;
517 }
518
519 bool
520 transform_member_name (char **pinput, int type)
521 {
522 return transform_name_fp (pinput, type, decode_xform, &type);
523 }
524
525 #define ISOCTAL(c) ((c)>='0'&&(c)<='7')
526
527 /* Decode things from a file HEADER block into STAT_INFO, also setting
528 *FORMAT_POINTER depending on the header block format. If
529 DO_USER_GROUP, decode the user/group information (this is useful
530 for extraction, but waste time when merely listing).
531
532 read_header() has already decoded the checksum and length, so we don't.
533
534 This routine should *not* be called twice for the same block, since
535 the two calls might use different DO_USER_GROUP values and thus
536 might end up with different uid/gid for the two calls. If anybody
537 wants the uid/gid they should decode it first, and other callers
538 should decode it without uid/gid before calling a routine,
539 e.g. print_header, that assumes decoded data. */
540 void
541 decode_header (union block *header, struct tar_stat_info *stat_info,
542 enum archive_format *format_pointer, int do_user_group)
543 {
544 enum archive_format format;
545 unsigned hbits; /* high bits of the file mode. */
546 mode_t mode = MODE_FROM_HEADER (header->header.mode, &hbits);
547
548 if (strcmp (header->header.magic, TMAGIC) == 0)
549 {
550 if (header->star_header.prefix[130] == 0
551 && ISOCTAL (header->star_header.atime[0])
552 && header->star_header.atime[11] == ' '
553 && ISOCTAL (header->star_header.ctime[0])
554 && header->star_header.ctime[11] == ' ')
555 format = STAR_FORMAT;
556 else if (stat_info->xhdr.size)
557 format = POSIX_FORMAT;
558 else
559 format = USTAR_FORMAT;
560 }
561 else if (strcmp (header->header.magic, OLDGNU_MAGIC) == 0)
562 format = hbits ? OLDGNU_FORMAT : GNU_FORMAT;
563 else
564 format = V7_FORMAT;
565 *format_pointer = format;
566
567 stat_info->stat.st_mode = mode;
568 stat_info->mtime.tv_sec = TIME_FROM_HEADER (header->header.mtime);
569 stat_info->mtime.tv_nsec = 0;
570 assign_string (&stat_info->uname,
571 header->header.uname[0] ? header->header.uname : NULL);
572 assign_string (&stat_info->gname,
573 header->header.gname[0] ? header->header.gname : NULL);
574
575 if (format == OLDGNU_FORMAT && incremental_option)
576 {
577 stat_info->atime.tv_sec = TIME_FROM_HEADER (header->oldgnu_header.atime);
578 stat_info->ctime.tv_sec = TIME_FROM_HEADER (header->oldgnu_header.ctime);
579 stat_info->atime.tv_nsec = stat_info->ctime.tv_nsec = 0;
580 }
581 else if (format == STAR_FORMAT)
582 {
583 stat_info->atime.tv_sec = TIME_FROM_HEADER (header->star_header.atime);
584 stat_info->ctime.tv_sec = TIME_FROM_HEADER (header->star_header.ctime);
585 stat_info->atime.tv_nsec = stat_info->ctime.tv_nsec = 0;
586 }
587 else
588 stat_info->atime = stat_info->ctime = start_time;
589
590 if (format == V7_FORMAT)
591 {
592 stat_info->stat.st_uid = UID_FROM_HEADER (header->header.uid);
593 stat_info->stat.st_gid = GID_FROM_HEADER (header->header.gid);
594 stat_info->stat.st_rdev = 0;
595 }
596 else
597 {
598 if (do_user_group)
599 {
600 /* FIXME: Decide if this should somewhat depend on -p. */
601
602 if (numeric_owner_option
603 || !*header->header.uname
604 || !uname_to_uid (header->header.uname, &stat_info->stat.st_uid))
605 stat_info->stat.st_uid = UID_FROM_HEADER (header->header.uid);
606
607 if (numeric_owner_option
608 || !*header->header.gname
609 || !gname_to_gid (header->header.gname, &stat_info->stat.st_gid))
610 stat_info->stat.st_gid = GID_FROM_HEADER (header->header.gid);
611 }
612
613 switch (header->header.typeflag)
614 {
615 case BLKTYPE:
616 case CHRTYPE:
617 stat_info->stat.st_rdev =
618 makedev (MAJOR_FROM_HEADER (header->header.devmajor),
619 MINOR_FROM_HEADER (header->header.devminor));
620 break;
621
622 default:
623 stat_info->stat.st_rdev = 0;
624 }
625 }
626
627 stat_info->archive_file_size = stat_info->stat.st_size;
628 xheader_decode (stat_info);
629
630 if (sparse_member_p (stat_info))
631 {
632 sparse_fixup_header (stat_info);
633 stat_info->is_sparse = true;
634 }
635 else
636 {
637 stat_info->is_sparse = false;
638 if (((current_format == GNU_FORMAT
639 || current_format == OLDGNU_FORMAT)
640 && current_header->header.typeflag == GNUTYPE_DUMPDIR)
641 || stat_info->dumpdir)
642 stat_info->is_dumpdir = true;
643 }
644
645 transform_member_name (&stat_info->file_name, XFORM_REGFILE);
646 switch (header->header.typeflag)
647 {
648 case SYMTYPE:
649 transform_member_name (&stat_info->link_name, XFORM_SYMLINK);
650 break;
651
652 case LNKTYPE:
653 transform_member_name (&stat_info->link_name, XFORM_LINK);
654 }
655 }
656
657 /* Convert buffer at WHERE0 of size DIGS from external format to
658 uintmax_t. DIGS must be positive. If TYPE is nonnull, the data
659 are of type TYPE. The buffer must represent a value in the range
660 -MINUS_MINVAL through MAXVAL. If OCTAL_ONLY, allow only octal
661 numbers instead of the other GNU extensions. Return -1 on error,
662 diagnosing the error if TYPE is nonnull and if !SILENT. */
663 static uintmax_t
664 from_header (char const *where0, size_t digs, char const *type,
665 uintmax_t minus_minval, uintmax_t maxval,
666 bool octal_only, bool silent)
667 {
668 uintmax_t value;
669 char const *where = where0;
670 char const *lim = where + digs;
671 int negative = 0;
672
673 /* Accommodate buggy tar of unknown vintage, which outputs leading
674 NUL if the previous field overflows. */
675 where += !*where;
676
677 /* Accommodate older tars, which output leading spaces. */
678 for (;;)
679 {
680 if (where == lim)
681 {
682 if (type && !silent)
683 ERROR ((0, 0,
684 /* TRANSLATORS: %s is type of the value (gid_t, uid_t,
685 etc.) */
686 _("Blanks in header where numeric %s value expected"),
687 type));
688 return -1;
689 }
690 if (!ISSPACE ((unsigned char) *where))
691 break;
692 where++;
693 }
694
695 value = 0;
696 if (ISODIGIT (*where))
697 {
698 char const *where1 = where;
699 uintmax_t overflow = 0;
700
701 for (;;)
702 {
703 value += *where++ - '0';
704 if (where == lim || ! ISODIGIT (*where))
705 break;
706 overflow |= value ^ (value << LG_8 >> LG_8);
707 value <<= LG_8;
708 }
709
710 /* Parse the output of older, unportable tars, which generate
711 negative values in two's complement octal. If the leading
712 nonzero digit is 1, we can't recover the original value
713 reliably; so do this only if the digit is 2 or more. This
714 catches the common case of 32-bit negative time stamps. */
715 if ((overflow || maxval < value) && '2' <= *where1 && type)
716 {
717 /* Compute the negative of the input value, assuming two's
718 complement. */
719 int digit = (*where1 - '0') | 4;
720 overflow = 0;
721 value = 0;
722 where = where1;
723 for (;;)
724 {
725 value += 7 - digit;
726 where++;
727 if (where == lim || ! ISODIGIT (*where))
728 break;
729 digit = *where - '0';
730 overflow |= value ^ (value << LG_8 >> LG_8);
731 value <<= LG_8;
732 }
733 value++;
734 overflow |= !value;
735
736 if (!overflow && value <= minus_minval)
737 {
738 if (!silent)
739 WARN ((0, 0,
740 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
741 _("Archive octal value %.*s is out of %s range; assuming two's complement"),
742 (int) (where - where1), where1, type));
743 negative = 1;
744 }
745 }
746
747 if (overflow)
748 {
749 if (type && !silent)
750 ERROR ((0, 0,
751 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
752 _("Archive octal value %.*s is out of %s range"),
753 (int) (where - where1), where1, type));
754 return -1;
755 }
756 }
757 else if (octal_only)
758 {
759 /* Suppress the following extensions. */
760 }
761 else if (*where == '-' || *where == '+')
762 {
763 /* Parse base-64 output produced only by tar test versions
764 1.13.6 (1999-08-11) through 1.13.11 (1999-08-23).
765 Support for this will be withdrawn in future releases. */
766 int dig;
767 if (!silent)
768 {
769 static bool warned_once;
770 if (! warned_once)
771 {
772 warned_once = true;
773 WARN ((0, 0, _("Archive contains obsolescent base-64 headers")));
774 }
775 }
776 negative = *where++ == '-';
777 while (where != lim
778 && (dig = base64_map[(unsigned char) *where]) < 64)
779 {
780 if (value << LG_64 >> LG_64 != value)
781 {
782 char *string = alloca (digs + 1);
783 memcpy (string, where0, digs);
784 string[digs] = '\0';
785 if (type && !silent)
786 ERROR ((0, 0,
787 _("Archive signed base-64 string %s is out of %s range"),
788 quote (string), type));
789 return -1;
790 }
791 value = (value << LG_64) | dig;
792 where++;
793 }
794 }
795 else if (*where == '\200' /* positive base-256 */
796 || *where == '\377' /* negative base-256 */)
797 {
798 /* Parse base-256 output. A nonnegative number N is
799 represented as (256**DIGS)/2 + N; a negative number -N is
800 represented as (256**DIGS) - N, i.e. as two's complement.
801 The representation guarantees that the leading bit is
802 always on, so that we don't confuse this format with the
803 others (assuming ASCII bytes of 8 bits or more). */
804 int signbit = *where & (1 << (LG_256 - 2));
805 uintmax_t topbits = (((uintmax_t) - signbit)
806 << (CHAR_BIT * sizeof (uintmax_t)
807 - LG_256 - (LG_256 - 2)));
808 value = (*where++ & ((1 << (LG_256 - 2)) - 1)) - signbit;
809 for (;;)
810 {
811 value = (value << LG_256) + (unsigned char) *where++;
812 if (where == lim)
813 break;
814 if (((value << LG_256 >> LG_256) | topbits) != value)
815 {
816 if (type && !silent)
817 ERROR ((0, 0,
818 _("Archive base-256 value is out of %s range"),
819 type));
820 return -1;
821 }
822 }
823 negative = signbit;
824 if (negative)
825 value = -value;
826 }
827
828 if (where != lim && *where && !ISSPACE ((unsigned char) *where))
829 {
830 if (type)
831 {
832 char buf[1000]; /* Big enough to represent any header. */
833 static struct quoting_options *o;
834
835 if (!o)
836 {
837 o = clone_quoting_options (0);
838 set_quoting_style (o, locale_quoting_style);
839 }
840
841 while (where0 != lim && ! lim[-1])
842 lim--;
843 quotearg_buffer (buf, sizeof buf, where0, lim - where, o);
844 if (!silent)
845 ERROR ((0, 0,
846 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
847 _("Archive contains %.*s where numeric %s value expected"),
848 (int) sizeof buf, buf, type));
849 }
850
851 return -1;
852 }
853
854 if (value <= (negative ? minus_minval : maxval))
855 return negative ? -value : value;
856
857 if (type && !silent)
858 {
859 char minval_buf[UINTMAX_STRSIZE_BOUND + 1];
860 char maxval_buf[UINTMAX_STRSIZE_BOUND];
861 char value_buf[UINTMAX_STRSIZE_BOUND + 1];
862 char *minval_string = STRINGIFY_BIGINT (minus_minval, minval_buf + 1);
863 char *value_string = STRINGIFY_BIGINT (value, value_buf + 1);
864 if (negative)
865 *--value_string = '-';
866 if (minus_minval)
867 *--minval_string = '-';
868 /* TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.) */
869 ERROR ((0, 0, _("Archive value %s is out of %s range %s..%s"),
870 value_string, type,
871 minval_string, STRINGIFY_BIGINT (maxval, maxval_buf)));
872 }
873
874 return -1;
875 }
876
877 gid_t
878 gid_from_header (const char *p, size_t s)
879 {
880 return from_header (p, s, "gid_t",
881 - (uintmax_t) TYPE_MINIMUM (gid_t),
882 (uintmax_t) TYPE_MAXIMUM (gid_t),
883 false, false);
884 }
885
886 major_t
887 major_from_header (const char *p, size_t s)
888 {
889 return from_header (p, s, "major_t",
890 - (uintmax_t) TYPE_MINIMUM (major_t),
891 (uintmax_t) TYPE_MAXIMUM (major_t), false, false);
892 }
893
894 minor_t
895 minor_from_header (const char *p, size_t s)
896 {
897 return from_header (p, s, "minor_t",
898 - (uintmax_t) TYPE_MINIMUM (minor_t),
899 (uintmax_t) TYPE_MAXIMUM (minor_t), false, false);
900 }
901
902 /* Convert P to the file mode, as understood by tar.
903 Store unrecognized mode bits (from 10th up) in HBITS. */
904 mode_t
905 mode_from_header (const char *p, size_t s, unsigned *hbits)
906 {
907 unsigned u = from_header (p, s, "mode_t",
908 - (uintmax_t) TYPE_MINIMUM (mode_t),
909 TYPE_MAXIMUM (uintmax_t), false, false);
910 mode_t mode = ((u & TSUID ? S_ISUID : 0)
911 | (u & TSGID ? S_ISGID : 0)
912 | (u & TSVTX ? S_ISVTX : 0)
913 | (u & TUREAD ? S_IRUSR : 0)
914 | (u & TUWRITE ? S_IWUSR : 0)
915 | (u & TUEXEC ? S_IXUSR : 0)
916 | (u & TGREAD ? S_IRGRP : 0)
917 | (u & TGWRITE ? S_IWGRP : 0)
918 | (u & TGEXEC ? S_IXGRP : 0)
919 | (u & TOREAD ? S_IROTH : 0)
920 | (u & TOWRITE ? S_IWOTH : 0)
921 | (u & TOEXEC ? S_IXOTH : 0));
922 *hbits = mode ^ u;
923 return mode;
924 }
925
926 off_t
927 off_from_header (const char *p, size_t s)
928 {
929 /* Negative offsets are not allowed in tar files, so invoke
930 from_header with minimum value 0, not TYPE_MINIMUM (off_t). */
931 return from_header (p, s, "off_t", (uintmax_t) 0,
932 (uintmax_t) TYPE_MAXIMUM (off_t), false, false);
933 }
934
935 size_t
936 size_from_header (const char *p, size_t s)
937 {
938 return from_header (p, s, "size_t", (uintmax_t) 0,
939 (uintmax_t) TYPE_MAXIMUM (size_t), false, false);
940 }
941
942 time_t
943 time_from_header (const char *p, size_t s)
944 {
945 return from_header (p, s, "time_t",
946 - (uintmax_t) TYPE_MINIMUM (time_t),
947 (uintmax_t) TYPE_MAXIMUM (time_t), false, false);
948 }
949
950 uid_t
951 uid_from_header (const char *p, size_t s)
952 {
953 return from_header (p, s, "uid_t",
954 - (uintmax_t) TYPE_MINIMUM (uid_t),
955 (uintmax_t) TYPE_MAXIMUM (uid_t), false, false);
956 }
957
958 uintmax_t
959 uintmax_from_header (const char *p, size_t s)
960 {
961 return from_header (p, s, "uintmax_t", (uintmax_t) 0,
962 TYPE_MAXIMUM (uintmax_t), false, false);
963 }
964
965
966 /* Return a printable representation of T. The result points to
967 static storage that can be reused in the next call to this
968 function, to ctime, or to asctime. If FULL_TIME, then output the
969 time stamp to its full resolution; otherwise, just output it to
970 1-minute resolution. */
971 char const *
972 tartime (struct timespec t, bool full_time)
973 {
974 enum { fraclen = sizeof ".FFFFFFFFF" - 1 };
975 static char buffer[max (UINTMAX_STRSIZE_BOUND + 1,
976 INT_STRLEN_BOUND (int) + 16)
977 + fraclen];
978 struct tm *tm;
979 time_t s = t.tv_sec;
980 int ns = t.tv_nsec;
981 bool negative = s < 0;
982 char *p;
983
984 if (negative && ns != 0)
985 {
986 s++;
987 ns = 1000000000 - ns;
988 }
989
990 tm = utc_option ? gmtime (&s) : localtime (&s);
991 if (tm)
992 {
993 if (full_time)
994 {
995 sprintf (buffer, "%04ld-%02d-%02d %02d:%02d:%02d",
996 tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
997 tm->tm_hour, tm->tm_min, tm->tm_sec);
998 code_ns_fraction (ns, buffer + strlen (buffer));
999 }
1000 else
1001 sprintf (buffer, "%04ld-%02d-%02d %02d:%02d",
1002 tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
1003 tm->tm_hour, tm->tm_min);
1004 return buffer;
1005 }
1006
1007 /* The time stamp cannot be broken down, most likely because it
1008 is out of range. Convert it as an integer,
1009 right-adjusted in a field with the same width as the usual
1010 4-year ISO time format. */
1011 p = umaxtostr (negative ? - (uintmax_t) s : s,
1012 buffer + sizeof buffer - UINTMAX_STRSIZE_BOUND - fraclen);
1013 if (negative)
1014 *--p = '-';
1015 while ((buffer + sizeof buffer - sizeof "YYYY-MM-DD HH:MM"
1016 + (full_time ? sizeof ":SS.FFFFFFFFF" - 1 : 0))
1017 < p)
1018 *--p = ' ';
1019 if (full_time)
1020 code_ns_fraction (ns, buffer + sizeof buffer - 1 - fraclen);
1021 return p;
1022 }
1023
1024 /* Actually print it.
1025
1026 Plain and fancy file header block logging. Non-verbose just prints
1027 the name, e.g. for "tar t" or "tar x". This should just contain
1028 file names, so it can be fed back into tar with xargs or the "-T"
1029 option. The verbose option can give a bunch of info, one line per
1030 file. I doubt anybody tries to parse its format, or if they do,
1031 they shouldn't. Unix tar is pretty random here anyway. */
1032
1033
1034 /* Width of "user/group size", with initial value chosen
1035 heuristically. This grows as needed, though this may cause some
1036 stairstepping in the output. Make it too small and the output will
1037 almost always look ragged. Make it too large and the output will
1038 be spaced out too far. */
1039 static int ugswidth = 19;
1040
1041 /* Width of printed time stamps. It grows if longer time stamps are
1042 found (typically, those with nanosecond resolution). Like
1043 USGWIDTH, some stairstepping may occur. */
1044 static int datewidth = sizeof "YYYY-MM-DD HH:MM" - 1;
1045
1046 static bool volume_label_printed = false;
1047
1048 static void
1049 simple_print_header (struct tar_stat_info *st, union block *blk,
1050 off_t block_ordinal)
1051 {
1052 char modes[11];
1053 char const *time_stamp;
1054 int time_stamp_len;
1055 char *temp_name;
1056
1057 /* These hold formatted ints. */
1058 char uform[UINTMAX_STRSIZE_BOUND], gform[UINTMAX_STRSIZE_BOUND];
1059 char *user, *group;
1060 char size[2 * UINTMAX_STRSIZE_BOUND];
1061 /* holds formatted size or major,minor */
1062 char uintbuf[UINTMAX_STRSIZE_BOUND];
1063 int pad;
1064 int sizelen;
1065
1066 if (show_transformed_names_option)
1067 temp_name = st->file_name ? st->file_name : st->orig_file_name;
1068 else
1069 temp_name = st->orig_file_name ? st->orig_file_name : st->file_name;
1070
1071 if (block_number_option)
1072 {
1073 char buf[UINTMAX_STRSIZE_BOUND];
1074 if (block_ordinal < 0)
1075 block_ordinal = current_block_ordinal ();
1076 block_ordinal -= recent_long_name_blocks;
1077 block_ordinal -= recent_long_link_blocks;
1078 fprintf (stdlis, _("block %s: "),
1079 STRINGIFY_BIGINT (block_ordinal, buf));
1080 }
1081
1082 if (verbose_option <= 1)
1083 {
1084 /* Just the fax, mam. */
1085 fprintf (stdlis, "%s\n", quotearg (temp_name));
1086 }
1087 else
1088 {
1089 /* File type and modes. */
1090
1091 modes[0] = '?';
1092 switch (blk->header.typeflag)
1093 {
1094 case GNUTYPE_VOLHDR:
1095 volume_label_printed = true;
1096 modes[0] = 'V';
1097 break;
1098
1099 case GNUTYPE_MULTIVOL:
1100 modes[0] = 'M';
1101 break;
1102
1103 case GNUTYPE_LONGNAME:
1104 case GNUTYPE_LONGLINK:
1105 modes[0] = 'L';
1106 ERROR ((0, 0, _("Unexpected long name header")));
1107 break;
1108
1109 case GNUTYPE_SPARSE:
1110 case REGTYPE:
1111 case AREGTYPE:
1112 modes[0] = '-';
1113 if (temp_name[strlen (temp_name) - 1] == '/')
1114 modes[0] = 'd';
1115 break;
1116 case LNKTYPE:
1117 modes[0] = 'h';
1118 break;
1119 case GNUTYPE_DUMPDIR:
1120 modes[0] = 'd';
1121 break;
1122 case DIRTYPE:
1123 modes[0] = 'd';
1124 break;
1125 case SYMTYPE:
1126 modes[0] = 'l';
1127 break;
1128 case BLKTYPE:
1129 modes[0] = 'b';
1130 break;
1131 case CHRTYPE:
1132 modes[0] = 'c';
1133 break;
1134 case FIFOTYPE:
1135 modes[0] = 'p';
1136 break;
1137 case CONTTYPE:
1138 modes[0] = 'C';
1139 break;
1140 }
1141
1142 pax_decode_mode (st->stat.st_mode, modes + 1);
1143
1144 /* Time stamp. */
1145
1146 time_stamp = tartime (st->mtime, full_time_option);
1147 time_stamp_len = strlen (time_stamp);
1148 if (datewidth < time_stamp_len)
1149 datewidth = time_stamp_len;
1150
1151 /* User and group names. */
1152
1153 if (st->uname
1154 && st->uname[0]
1155 && current_format != V7_FORMAT
1156 && !numeric_owner_option)
1157 user = st->uname;
1158 else
1159 {
1160 /* Try parsing it as an unsigned integer first, and as a
1161 uid_t if that fails. This method can list positive user
1162 ids that are too large to fit in a uid_t. */
1163 uintmax_t u = from_header (blk->header.uid,
1164 sizeof blk->header.uid, 0,
1165 (uintmax_t) 0,
1166 (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1167 false, false);
1168 if (u != -1)
1169 user = STRINGIFY_BIGINT (u, uform);
1170 else
1171 {
1172 sprintf (uform, "%ld",
1173 (long) UID_FROM_HEADER (blk->header.uid));
1174 user = uform;
1175 }
1176 }
1177
1178 if (st->gname
1179 && st->gname[0]
1180 && current_format != V7_FORMAT
1181 && !numeric_owner_option)
1182 group = st->gname;
1183 else
1184 {
1185 /* Try parsing it as an unsigned integer first, and as a
1186 gid_t if that fails. This method can list positive group
1187 ids that are too large to fit in a gid_t. */
1188 uintmax_t g = from_header (blk->header.gid,
1189 sizeof blk->header.gid, 0,
1190 (uintmax_t) 0,
1191 (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1192 false, false);
1193 if (g != -1)
1194 group = STRINGIFY_BIGINT (g, gform);
1195 else
1196 {
1197 sprintf (gform, "%ld",
1198 (long) GID_FROM_HEADER (blk->header.gid));
1199 group = gform;
1200 }
1201 }
1202
1203 /* Format the file size or major/minor device numbers. */
1204
1205 switch (blk->header.typeflag)
1206 {
1207 case CHRTYPE:
1208 case BLKTYPE:
1209 strcpy (size,
1210 STRINGIFY_BIGINT (major (st->stat.st_rdev), uintbuf));
1211 strcat (size, ",");
1212 strcat (size,
1213 STRINGIFY_BIGINT (minor (st->stat.st_rdev), uintbuf));
1214 break;
1215
1216 default:
1217 /* st->stat.st_size keeps stored file size */
1218 strcpy (size, STRINGIFY_BIGINT (st->stat.st_size, uintbuf));
1219 break;
1220 }
1221
1222 /* Figure out padding and print the whole line. */
1223
1224 sizelen = strlen (size);
1225 pad = strlen (user) + 1 + strlen (group) + 1 + sizelen;
1226 if (pad > ugswidth)
1227 ugswidth = pad;
1228
1229 fprintf (stdlis, "%s %s/%s %*s %-*s",
1230 modes, user, group, ugswidth - pad + sizelen, size,
1231 datewidth, time_stamp);
1232
1233 fprintf (stdlis, " %s", quotearg (temp_name));
1234
1235 switch (blk->header.typeflag)
1236 {
1237 case SYMTYPE:
1238 fprintf (stdlis, " -> %s\n", quotearg (st->link_name));
1239 break;
1240
1241 case LNKTYPE:
1242 fprintf (stdlis, _(" link to %s\n"), quotearg (st->link_name));
1243 break;
1244
1245 default:
1246 {
1247 char type_string[2];
1248 type_string[0] = blk->header.typeflag;
1249 type_string[1] = '\0';
1250 fprintf (stdlis, _(" unknown file type %s\n"),
1251 quote (type_string));
1252 }
1253 break;
1254
1255 case AREGTYPE:
1256 case REGTYPE:
1257 case GNUTYPE_SPARSE:
1258 case CHRTYPE:
1259 case BLKTYPE:
1260 case DIRTYPE:
1261 case FIFOTYPE:
1262 case CONTTYPE:
1263 case GNUTYPE_DUMPDIR:
1264 putc ('\n', stdlis);
1265 break;
1266
1267 case GNUTYPE_LONGLINK:
1268 fprintf (stdlis, _("--Long Link--\n"));
1269 break;
1270
1271 case GNUTYPE_LONGNAME:
1272 fprintf (stdlis, _("--Long Name--\n"));
1273 break;
1274
1275 case GNUTYPE_VOLHDR:
1276 fprintf (stdlis, _("--Volume Header--\n"));
1277 break;
1278
1279 case GNUTYPE_MULTIVOL:
1280 strcpy (size,
1281 STRINGIFY_BIGINT
1282 (UINTMAX_FROM_HEADER (blk->oldgnu_header.offset),
1283 uintbuf));
1284 fprintf (stdlis, _("--Continued at byte %s--\n"), size);
1285 break;
1286 }
1287 }
1288 fflush (stdlis);
1289 }
1290
1291
1292 static void
1293 print_volume_label (void)
1294 {
1295 struct tar_stat_info vstat;
1296 union block vblk;
1297 enum archive_format dummy;
1298
1299 memset (&vblk, 0, sizeof (vblk));
1300 vblk.header.typeflag = GNUTYPE_VOLHDR;
1301 if (recent_global_header)
1302 memcpy (vblk.header.mtime, recent_global_header->header.mtime,
1303 sizeof vblk.header.mtime);
1304 tar_stat_init (&vstat);
1305 assign_string (&vstat.file_name, ".");
1306 decode_header (&vblk, &vstat, &dummy, 0);
1307 assign_string (&vstat.file_name, volume_label);
1308 simple_print_header (&vstat, &vblk, 0);
1309 tar_stat_destroy (&vstat);
1310 }
1311
1312 void
1313 print_header (struct tar_stat_info *st, union block *blk,
1314 off_t block_ordinal)
1315 {
1316 if (current_format == POSIX_FORMAT && !volume_label_printed && volume_label)
1317 {
1318 print_volume_label ();
1319 volume_label_printed = true;
1320 }
1321
1322 simple_print_header (st, blk, block_ordinal);
1323 }
1324
1325 /* Print a similar line when we make a directory automatically. */
1326 void
1327 print_for_mkdir (char *dirname, int length, mode_t mode)
1328 {
1329 char modes[11];
1330
1331 if (verbose_option > 1)
1332 {
1333 /* File type and modes. */
1334
1335 modes[0] = 'd';
1336 pax_decode_mode (mode, modes + 1);
1337
1338 if (block_number_option)
1339 {
1340 char buf[UINTMAX_STRSIZE_BOUND];
1341 fprintf (stdlis, _("block %s: "),
1342 STRINGIFY_BIGINT (current_block_ordinal (), buf));
1343 }
1344
1345 fprintf (stdlis, "%s %*s %.*s\n", modes, ugswidth + 1 + datewidth,
1346 _("Creating directory:"), length, quotearg (dirname));
1347 }
1348 }
1349
1350 /* Skip over SIZE bytes of data in blocks in the archive. */
1351 void
1352 skip_file (off_t size)
1353 {
1354 union block *x;
1355
1356 /* FIXME: Make sure mv_begin_read is always called before it */
1357
1358 if (seekable_archive)
1359 {
1360 off_t nblk = seek_archive (size);
1361 if (nblk >= 0)
1362 size -= nblk * BLOCKSIZE;
1363 else
1364 seekable_archive = false;
1365 }
1366
1367 mv_size_left (size);
1368
1369 while (size > 0)
1370 {
1371 x = find_next_block ();
1372 if (! x)
1373 FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
1374
1375 set_next_block_after (x);
1376 size -= BLOCKSIZE;
1377 mv_size_left (size);
1378 }
1379 }
1380
1381 /* Skip the current member in the archive.
1382 NOTE: Current header must be decoded before calling this function. */
1383 void
1384 skip_member (void)
1385 {
1386 if (!current_stat_info.skipped)
1387 {
1388 char save_typeflag = current_header->header.typeflag;
1389 set_next_block_after (current_header);
1390
1391 mv_begin_read (&current_stat_info);
1392
1393 if (current_stat_info.is_sparse)
1394 sparse_skip_file (&current_stat_info);
1395 else if (save_typeflag != DIRTYPE)
1396 skip_file (current_stat_info.stat.st_size);
1397
1398 mv_end ();
1399 }
1400 }
1401
1402 void
1403 test_archive_label ()
1404 {
1405 base64_init ();
1406 name_gather ();
1407
1408 open_archive (ACCESS_READ);
1409 if (read_header (&current_header, &current_stat_info, read_header_auto)
1410 == HEADER_SUCCESS)
1411 {
1412 decode_header (current_header,
1413 &current_stat_info, &current_format, 0);
1414 if (current_header->header.typeflag == GNUTYPE_VOLHDR)
1415 assign_string (&volume_label, current_header->header.name);
1416
1417 if (volume_label)
1418 {
1419 if (verbose_option)
1420 print_volume_label ();
1421 if (!name_match (volume_label) && multi_volume_option)
1422 {
1423 char *s = drop_volume_label_suffix (volume_label);
1424 name_match (s);
1425 free (s);
1426 }
1427 }
1428 }
1429 close_archive ();
1430 label_notfound ();
1431 }
This page took 0.09861 seconds and 5 git commands to generate.