1 /* List a tar archive, with support routines for reading a tar archive.
2 Copyright 1988,92,93,94,96,97,98,1999 Free Software Foundation, Inc.
3 Written by John Gilmore, on 1985-08-26.
5 This program is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License as published by the
7 Free Software Foundation; either version 2, or (at your option) any later
10 This program is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
13 Public License for more details.
15 You should have received a copy of the GNU General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 59 Place - Suite 330, Boston, MA 02111-1307, USA. */
19 /* Define to non-zero for forcing old ctime() instead of isotime(). */
27 #define ISODIGIT(Char) \
28 ((unsigned char) (Char) >= '0' && (unsigned char) (Char) <= '7')
29 #define ISSPACE(Char) (ISASCII (Char) && isspace (Char))
31 #ifndef FNM_LEADING_DIR
37 union block
*current_header
; /* points to current archive header */
38 struct stat current_stat
; /* stat struct corresponding */
39 enum archive_format current_format
; /* recognized format */
41 /*-----------------------------------.
42 | Main loop for reading an archive. |
43 `-----------------------------------*/
46 read_and (void (*do_something
) ())
48 enum read_header status
= HEADER_STILL_UNREAD
;
49 enum read_header prev_status
;
53 open_archive (ACCESS_READ
);
58 status
= read_header ();
61 case HEADER_STILL_UNREAD
:
66 /* Valid header. We should decode next field (mode) first.
67 Ensure incoming names are null terminated. */
69 if (ending_file_option
&&
70 fnmatch (ending_file_option
, current_file_name
,
71 FNM_LEADING_DIR
) == 0) {
75 /* FIXME: This is a quick kludge before 1.12 goes out. */
76 current_stat
.st_mtime
= TIME_FROM_OCT (current_header
->header
.mtime
);
78 if (!name_match (current_file_name
)
79 || current_stat
.st_mtime
< newer_mtime_option
80 || (exclude_option
&& check_exclude (current_file_name
)))
84 if (current_header
->header
.typeflag
== GNUTYPE_VOLHDR
85 || current_header
->header
.typeflag
== GNUTYPE_MULTIVOL
86 || current_header
->header
.typeflag
== GNUTYPE_NAMES
)
91 if (show_omitted_dirs_option
92 && current_header
->header
.typeflag
== DIRTYPE
)
93 WARN ((0, 0, _("Omitting %s"), current_file_name
));
95 /* Skip past it in the archive. */
97 if (current_header
->oldgnu_header
.isextended
)
99 save_typeflag
= current_header
->header
.typeflag
;
100 set_next_block_after (current_header
);
108 exhdr
= find_next_block ();
109 if (!exhdr
->sparse_header
.isextended
)
111 set_next_block_after (exhdr
);
115 set_next_block_after (exhdr
);
117 skip_extended_headers ();
120 /* Skip to the next header on the archive. */
122 if (save_typeflag
!= DIRTYPE
)
123 skip_file (current_stat
.st_size
);
130 case HEADER_ZERO_BLOCK
:
131 if (block_number_option
)
133 char buf
[UINTMAX_STRSIZE_BOUND
];
134 fprintf (stdlis
, _("block %s: ** Block of NULs **\n"),
135 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
138 set_next_block_after (current_header
);
139 status
= prev_status
;
140 if (ignore_zeros_option
)
144 case HEADER_END_OF_FILE
:
145 if (block_number_option
)
147 char buf
[UINTMAX_STRSIZE_BOUND
];
148 fprintf (stdlis
, _("block %s: ** End of File **\n"),
149 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
154 /* If the previous header was good, tell them that we are
155 skipping bad ones. */
156 set_next_block_after (current_header
);
159 case HEADER_STILL_UNREAD
:
160 WARN ((0, 0, _("Hmm, this doesn't look like a tar archive")));
163 case HEADER_ZERO_BLOCK
:
165 WARN ((0, 0, _("Skipping to next file header")));
168 case HEADER_END_OF_FILE
:
170 /* We are in the middle of a cascade of errors. */
179 apply_delayed_set_stat ();
181 names_notfound (); /* print names not found */
184 /*---------------------------------------------.
185 | Print a header block, based on tar options. |
186 `---------------------------------------------*/
191 int isextended
= 0; /* to remember if current_header is extended */
193 /* Print the header block. */
197 if (verbose_option
> 1)
198 decode_header (current_header
, ¤t_stat
, ¤t_format
, 0);
202 if (incremental_option
&& current_header
->header
.typeflag
== GNUTYPE_DUMPDIR
)
205 size_t written
, check
;
206 union block
*data_block
;
208 set_next_block_after (current_header
);
209 if (multi_volume_option
)
211 assign_string (&save_name
, current_file_name
);
212 save_totsize
= current_stat
.st_size
;
214 for (size
= current_stat
.st_size
; size
> 0; size
-= written
)
216 if (multi_volume_option
)
217 save_sizeleft
= size
;
218 data_block
= find_next_block ();
221 ERROR ((0, 0, _("EOF in archive file")));
222 break; /* FIXME: What happens, then? */
224 written
= available_space_after (data_block
);
227 errno
= 0; /* FIXME: errno should be read-only */
228 check
= fwrite (data_block
->buffer
, sizeof (char), written
, stdlis
);
229 set_next_block_after ((union block
*)
230 (data_block
->buffer
+ written
- 1));
231 if (check
!= written
)
233 ERROR ((0, errno
, _("Only wrote %lu of %lu bytes to file %s"),
234 (unsigned long) check
,
235 (unsigned long) written
, current_file_name
));
236 skip_file (size
- written
);
240 if (multi_volume_option
)
241 assign_string (&save_name
, NULL
);
242 fputc ('\n', stdlis
);
248 /* Check to see if we have an extended header to skip over also. */
250 if (current_header
->oldgnu_header
.isextended
)
253 /* Skip past the header in the archive. */
255 set_next_block_after (current_header
);
257 /* If we needed to skip any extended headers, do so now, by reading
258 extended headers and skipping past them in the archive. */
267 exhdr
= find_next_block ();
269 if (!exhdr
->sparse_header
.isextended
)
271 set_next_block_after (exhdr
);
274 set_next_block_after (exhdr
);
277 skip_extended_headers ();
280 if (multi_volume_option
)
281 assign_string (&save_name
, current_file_name
);
283 /* Skip to the next header on the archive. */
285 skip_file (current_stat
.st_size
);
287 if (multi_volume_option
)
288 assign_string (&save_name
, NULL
);
291 /*-----------------------------------------------------------------------.
292 | Read a block that's supposed to be a header block. Return its address |
293 | in "current_header", and if it is good, the file's size in |
294 | current_stat.st_size. |
296 | Return 1 for success, 0 if the checksum is bad, EOF on eof, 2 for a |
297 | block full of zeros (EOF marker). |
299 | You must always set_next_block_after(current_header) to skip past the |
300 | header which this routine reads. |
301 `-----------------------------------------------------------------------*/
303 /* The standard BSD tar sources create the checksum by adding up the
304 bytes in the header as type char. I think the type char was unsigned
305 on the PDP-11, but it's signed on the Next and Sun. It looks like the
306 sources to BSD tar were never changed to compute the checksum
307 currectly, so both the Sun and Next add the bytes of the header as
308 signed chars. This doesn't cause a problem until you get a file with
309 a name containing characters with the high bit set. So read_header
310 computes two checksums -- signed and unsigned. */
312 /* FIXME: The signed checksum computation is broken on machines where char's
313 are unsigned. It's uneasy to handle all cases correctly... */
319 long unsigned_sum
; /* the POSIX one :-) */
320 long signed_sum
; /* the Sun one :-( */
326 union block
*data_block
;
327 size_t size
, written
;
328 static char *next_long_name
, *next_long_link
;
332 header
= find_next_block ();
333 current_header
= header
;
335 return HEADER_END_OF_FILE
;
337 recorded_sum
= UINTMAX_FROM_OCT (header
->header
.chksum
);
342 for (i
= sizeof (*header
); i
-- != 0;)
344 /* We can't use unsigned char here because of old compilers,
347 unsigned_sum
+= 0xFF & *p
;
351 /* Adjust checksum to count the "chksum" field as blanks. */
353 for (i
= sizeof (header
->header
.chksum
); i
-- != 0;)
355 unsigned_sum
-= 0xFF & header
->header
.chksum
[i
];
356 signed_sum
-= header
->header
.chksum
[i
];
358 unsigned_sum
+= ' ' * sizeof header
->header
.chksum
;
359 signed_sum
+= ' ' * sizeof header
->header
.chksum
;
361 if (unsigned_sum
== sizeof header
->header
.chksum
* ' ')
363 /* This is a zeroed block...whole block is 0's except for the
364 blanks we faked for the checksum field. */
366 return HEADER_ZERO_BLOCK
;
369 if (unsigned_sum
!= recorded_sum
&& signed_sum
!= recorded_sum
)
370 return HEADER_FAILURE
;
372 /* Good block. Decode file size and return. */
374 if (header
->header
.typeflag
== LNKTYPE
)
375 current_stat
.st_size
= 0; /* links 0 size on tape */
377 current_stat
.st_size
= OFF_FROM_OCT (header
->header
.size
);
379 header
->header
.name
[NAME_FIELD_SIZE
- 1] = '\0';
380 if (header
->header
.typeflag
== GNUTYPE_LONGNAME
381 || header
->header
.typeflag
== GNUTYPE_LONGLINK
)
383 longp
= ((header
->header
.typeflag
== GNUTYPE_LONGNAME
)
387 set_next_block_after (header
);
390 size
= current_stat
.st_size
;
391 if (size
!= current_stat
.st_size
)
392 FATAL_ERROR ((0, 0, _("Memory exhausted")));
393 bp
= *longp
= (char *) xmalloc (size
);
395 for (; size
> 0; size
-= written
)
397 data_block
= find_next_block ();
398 if (data_block
== NULL
)
400 ERROR ((0, 0, _("Unexpected EOF on archive file")));
403 written
= available_space_after (data_block
);
407 memcpy (bp
, data_block
->buffer
, written
);
409 set_next_block_after ((union block
*)
410 (data_block
->buffer
+ written
- 1));
418 char *name
= next_long_name
;
419 struct posix_header
*h
= ¤t_header
->header
;
420 char namebuf
[sizeof h
->prefix
+ 1 + sizeof h
->name
+ 1];
424 /* Accept file names as specified by POSIX.1-1996
429 memcpy (np
, h
->prefix
, sizeof h
->prefix
);
430 np
[sizeof h
->prefix
] = '\0';
434 memcpy (np
, h
->name
, sizeof h
->name
);
435 np
[sizeof h
->name
] = '\0';
439 assign_string (¤t_file_name
, name
);
440 assign_string (¤t_link_name
,
441 (next_long_link
? next_long_link
442 : current_header
->header
.linkname
));
443 next_long_link
= next_long_name
= 0;
444 return HEADER_SUCCESS
;
449 /*-------------------------------------------------------------------------.
450 | Decode things from a file HEADER block into STAT_INFO, also setting |
451 | *FORMAT_POINTER depending on the header block format. If DO_USER_GROUP, |
452 | decode the user/group information (this is useful for extraction, but |
453 | waste time when merely listing). |
455 | read_header() has already decoded the checksum and length, so we don't. |
457 | This routine should *not* be called twice for the same block, since the |
458 | two calls might use different DO_USER_GROUP values and thus might end up |
459 | with different uid/gid for the two calls. If anybody wants the uid/gid |
460 | they should decode it first, and other callers should decode it without |
461 | uid/gid before calling a routine, e.g. print_header, that assumes |
463 `-------------------------------------------------------------------------*/
466 decode_header (union block
*header
, struct stat
*stat_info
,
467 enum archive_format
*format_pointer
, int do_user_group
)
469 enum archive_format format
;
471 if (strcmp (header
->header
.magic
, TMAGIC
) == 0)
472 format
= POSIX_FORMAT
;
473 else if (strcmp (header
->header
.magic
, OLDGNU_MAGIC
) == 0)
474 format
= OLDGNU_FORMAT
;
477 *format_pointer
= format
;
479 stat_info
->st_mode
= MODE_FROM_OCT (header
->header
.mode
);
480 stat_info
->st_mode
&= 07777;
481 stat_info
->st_mtime
= TIME_FROM_OCT (header
->header
.mtime
);
483 if (format
== OLDGNU_FORMAT
&& incremental_option
)
485 stat_info
->st_atime
= TIME_FROM_OCT (header
->oldgnu_header
.atime
);
486 stat_info
->st_ctime
= TIME_FROM_OCT (header
->oldgnu_header
.ctime
);
489 if (format
== V7_FORMAT
)
491 stat_info
->st_uid
= UID_FROM_OCT (header
->header
.uid
);
492 stat_info
->st_gid
= GID_FROM_OCT (header
->header
.gid
);
493 stat_info
->st_rdev
= 0;
499 /* FIXME: Decide if this should somewhat depend on -p. */
501 if (numeric_owner_option
502 || !*header
->header
.uname
503 || !uname_to_uid (header
->header
.uname
, &stat_info
->st_uid
))
504 stat_info
->st_uid
= UID_FROM_OCT (header
->header
.uid
);
506 if (numeric_owner_option
507 || !*header
->header
.gname
508 || !gname_to_gid (header
->header
.gname
, &stat_info
->st_gid
))
509 stat_info
->st_gid
= GID_FROM_OCT (header
->header
.gid
);
511 switch (header
->header
.typeflag
)
516 = makedev (MAJOR_FROM_OCT (header
->header
.devmajor
),
517 MINOR_FROM_OCT (header
->header
.devminor
));
524 = makedev (MAJOR_FROM_OCT (header
->header
.devmajor
),
525 MINOR_FROM_OCT (header
->header
.devminor
));
530 stat_info
->st_rdev
= 0;
535 /*------------------------------------------------------------------------.
536 | Quick and dirty octal conversion. Result is -1 if the field is invalid |
537 | (all blank, or nonoctal). |
538 `------------------------------------------------------------------------*/
541 from_oct (const char *where0
, size_t digs0
, const char *type
, uintmax_t maxval
)
544 const char *where
= where0
;
551 ERROR ((0, 0, _("Blanks in header where octal %s value expected"),
555 if (!ISSPACE (*where
))
562 while (digs
!= 0 && ISODIGIT (*where
))
564 /* Scan til nonoctal. */
566 if (value
<< 3 >> 3 != value
)
568 value
= (value
<< 3) | (*where
++ - '0');
572 if (digs
!= 0 && *where
&& !ISSPACE (*where
))
574 ERROR ((0, 0, _("Header contains `%.*s' where octal %s value expected"),
575 (int) digs0
, where0
, type
));
583 ERROR ((0, 0, _("Octal value `%.*s' is out of range for %s"),
584 (int) digs0
, where0
, type
));
588 gid_from_oct (const char *p
, size_t s
)
590 return from_oct (p
, s
, "gid_t", (uintmax_t) TYPE_MAXIMUM (gid_t
));
593 major_from_oct (const char *p
, size_t s
)
595 return from_oct (p
, s
, "major_t", (uintmax_t) TYPE_MAXIMUM (major_t
));
598 minor_from_oct (const char *p
, size_t s
)
600 return from_oct (p
, s
, "minor_t", (uintmax_t) TYPE_MAXIMUM (minor_t
));
603 mode_from_oct (const char *p
, size_t s
)
605 return from_oct (p
, s
, "mode_t", (uintmax_t) TYPE_MAXIMUM (mode_t
));
608 off_from_oct (const char *p
, size_t s
)
610 return from_oct (p
, s
, "off_t", (uintmax_t) TYPE_MAXIMUM (off_t
));
613 size_from_oct (const char *p
, size_t s
)
615 return from_oct (p
, s
, "size_t", (uintmax_t) TYPE_MAXIMUM (size_t));
618 time_from_oct (const char *p
, size_t s
)
620 return from_oct (p
, s
, "time_t", (uintmax_t) TYPE_MAXIMUM (time_t));
623 uid_from_oct (const char *p
, size_t s
)
625 return from_oct (p
, s
, "uid_t", (uintmax_t) TYPE_MAXIMUM (uid_t
));
628 uintmax_from_oct (const char *p
, size_t s
)
630 return from_oct (p
, s
, "uintmax_t", TYPE_MAXIMUM (uintmax_t));
635 /*----------------------------------------------------------------------.
636 | Format O as a null-terminated decimal string into BUF _backwards_; |
637 | return pointer to start of result. |
638 `----------------------------------------------------------------------*/
640 stringify_uintmax_t_backwards (uintmax_t o
, char *buf
)
644 *--buf
= '0' + (int) (o
% 10);
645 while ((o
/= 10) != 0);
651 /*-------------------------------------------.
652 | Return the time formatted along ISO 8601. |
653 `-------------------------------------------*/
655 /* Also, see http://www.ft.uni-erlangen.de/~mskuhn/iso-time.html. */
658 isotime (const time_t *time
)
660 static char buffer
[21];
663 tm
= localtime (time
);
664 sprintf (buffer
, "%4d-%02d-%02d %02d:%02d:%02d\n",
665 tm
->tm_year
+ 1900, tm
->tm_mon
+ 1, tm
->tm_mday
,
666 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
670 #endif /* not USE_OLD_CTIME */
672 /*-------------------------------------------------------------------------.
673 | Decode MODE from its binary form in a stat structure, and encode it into |
674 | a 9 characters string STRING, terminated with a NUL. |
675 `-------------------------------------------------------------------------*/
678 decode_mode (mode_t mode
, char *string
)
681 const char *rwx
= "rwxrwxrwx";
683 for (mask
= 0400; mask
!= 0; mask
>>= 1)
693 string
[-7] = string
[-7] == 'x' ? 's' : 'S';
695 string
[-4] = string
[-4] == 'x' ? 's' : 'S';
697 string
[-1] = string
[-1] == 'x' ? 't' : 'T';
702 /*-------------------------------------------------------------------------.
703 | Actually print it. |
705 | Plain and fancy file header block logging. Non-verbose just prints the |
706 | name, e.g. for "tar t" or "tar x". This should just contain file names, |
707 | so it can be fed back into tar with xargs or the "-T" option. The |
708 | verbose option can give a bunch of info, one line per file. I doubt |
709 | anybody tries to parse its format, or if they do, they shouldn't. Unix |
710 | tar is pretty random here anyway. |
711 `-------------------------------------------------------------------------*/
713 /* FIXME: Note that print_header uses the globals HEAD, HSTAT, and
714 HEAD_STANDARD, which must be set up in advance. Not very clean... */
716 /* UGSWIDTH starts with 18, so with user and group names <= 8 chars, the
717 columns never shift during the listing. */
719 static int ugswidth
= UGSWIDTH
; /* maximum width encountered so far */
721 /* DATEWIDTH is the number of columns taken by the date and time fields. */
723 # define DATEWIDTH 19
725 # define DATEWIDTH 18
733 char uform
[11], gform
[11]; /* these hold formatted ints */
735 char size
[2 * UINTMAX_STRSIZE_BOUND
];
736 /* holds formatted size or major,minor */
737 char uintbuf
[UINTMAX_STRSIZE_BOUND
];
738 time_t longie
; /* to make ctime() call portable */
742 if (block_number_option
)
744 char buf
[UINTMAX_STRSIZE_BOUND
];
745 fprintf (stdlis
, _("block %s: "),
746 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
749 if (verbose_option
<= 1)
751 /* Just the fax, mam. */
753 char *quoted_name
= quote_copy_string (current_file_name
);
757 fprintf (stdlis
, "%s\n", quoted_name
);
761 fprintf (stdlis
, "%s\n", current_file_name
);
765 /* File type and modes. */
768 switch (current_header
->header
.typeflag
)
774 case GNUTYPE_MULTIVOL
:
782 case GNUTYPE_LONGNAME
:
783 case GNUTYPE_LONGLINK
:
784 ERROR ((0, 0, _("Visible longname error")));
792 if (current_file_name
[strlen (current_file_name
) - 1] == '/')
795 case GNUTYPE_DUMPDIR
:
818 decode_mode (current_stat
.st_mode
, modes
+ 1);
822 longie
= current_stat
.st_mtime
;
824 timestamp
= ctime (&longie
);
825 timestamp
[16] = '\0';
826 timestamp
[24] = '\0';
828 timestamp
= isotime (&longie
);
829 timestamp
[16] = '\0';
832 /* User and group names. */
834 if (*current_header
->header
.uname
&& current_format
!= V7_FORMAT
)
835 user
= current_header
->header
.uname
;
837 user
= STRINGIFY_BIGINT (UINTMAX_FROM_OCT (current_header
->header
.uid
),
840 if (*current_header
->header
.gname
&& current_format
!= V7_FORMAT
)
841 group
= current_header
->header
.gname
;
843 group
= STRINGIFY_BIGINT (UINTMAX_FROM_OCT
844 (current_header
->header
.gid
),
847 /* Format the file size or major/minor device numbers. */
849 switch (current_header
->header
.typeflag
)
851 #if defined(S_IFBLK) || defined(S_IFCHR)
854 sprintf (size
, "%lu,%lu",
855 (unsigned long) major (current_stat
.st_rdev
),
856 (unsigned long) minor (current_stat
.st_rdev
));
862 (UINTMAX_FROM_OCT (current_header
->oldgnu_header
.realsize
),
866 strcpy (size
, STRINGIFY_BIGINT (current_stat
.st_size
, uintbuf
));
870 /* Figure out padding and print the whole line. */
872 pad
= strlen (user
) + strlen (group
) + strlen (size
) + 1;
877 fprintf (stdlis
, "%s %s/%s %*s%s %s %s",
878 modes
, user
, group
, ugswidth
- pad
, "",
879 size
, timestamp
+ 4, timestamp
+ 20);
881 fprintf (stdlis
, "%s %s/%s %*s%s %s",
882 modes
, user
, group
, ugswidth
- pad
, "", size
, timestamp
);
885 name
= quote_copy_string (current_file_name
);
888 fprintf (stdlis
, " %s", name
);
892 fprintf (stdlis
, " %s", current_file_name
);
894 switch (current_header
->header
.typeflag
)
897 name
= quote_copy_string (current_link_name
);
900 fprintf (stdlis
, " -> %s\n", name
);
904 fprintf (stdlis
, " -> %s\n", current_link_name
);
908 name
= quote_copy_string (current_link_name
);
911 fprintf (stdlis
, _(" link to %s\n"), name
);
915 fprintf (stdlis
, _(" link to %s\n"), current_link_name
);
919 fprintf (stdlis
, _(" unknown file type `%c'\n"),
920 current_header
->header
.typeflag
);
931 case GNUTYPE_DUMPDIR
:
936 fprintf (stdlis
, _("--Volume Header--\n"));
939 case GNUTYPE_MULTIVOL
:
942 (UINTMAX_FROM_OCT (current_header
->oldgnu_header
.offset
),
944 fprintf (stdlis
, _("--Continued at byte %s--\n"), size
);
948 fprintf (stdlis
, _("--Mangled file names--\n"));
955 /*--------------------------------------------------------------.
956 | Print a similar line when we make a directory automatically. |
957 `--------------------------------------------------------------*/
960 print_for_mkdir (char *pathname
, int length
, mode_t mode
)
965 if (verbose_option
> 1)
967 /* File type and modes. */
970 decode_mode (mode
, modes
+ 1);
972 if (block_number_option
)
974 char buf
[UINTMAX_STRSIZE_BOUND
];
975 fprintf (stdlis
, _("block %s: "),
976 STRINGIFY_BIGINT (current_block_ordinal (), buf
));
978 name
= quote_copy_string (pathname
);
981 fprintf (stdlis
, "%s %*s %.*s\n", modes
, ugswidth
+ DATEWIDTH
,
982 _("Creating directory:"), length
, name
);
986 fprintf (stdlis
, "%s %*s %.*s\n", modes
, ugswidth
+ DATEWIDTH
,
987 _("Creating directory:"), length
, pathname
);
991 /*--------------------------------------------------------.
992 | Skip over SIZE bytes of data in blocks in the archive. |
993 `--------------------------------------------------------*/
996 skip_file (off_t size
)
1000 if (multi_volume_option
)
1002 save_totsize
= size
;
1003 save_sizeleft
= size
;
1008 x
= find_next_block ();
1010 FATAL_ERROR ((0, 0, _("Unexpected EOF on archive file")));
1012 set_next_block_after (x
);
1014 if (multi_volume_option
)
1015 save_sizeleft
-= BLOCKSIZE
;
1024 skip_extended_headers (void)
1030 exhdr
= find_next_block ();
1031 if (!exhdr
->sparse_header
.isextended
)
1033 set_next_block_after (exhdr
);
1036 set_next_block_after (exhdr
);