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