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