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