]>
Dogcows Code - chaz/tar/blob - src/extract.c
1 /* Extract files from a tar archive.
2 Copyright 1988, 92,93,94,96,97,98, 1999 Free Software Foundation, Inc.
3 Written by John Gilmore, on 1985-11-19.
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 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
33 static int we_are_root
; /* true if our effective uid == 0 */
34 static mode_t newdir_umask
; /* umask when creating new directories */
35 static mode_t current_umask
; /* current umask (which is set to 0 if -p) */
37 struct delayed_set_stat
39 struct delayed_set_stat
*next
;
41 struct stat stat_info
;
44 static struct delayed_set_stat
*delayed_set_stat_head
;
46 /*--------------------------.
47 | Set up to extract files. |
48 `--------------------------*/
53 we_are_root
= geteuid () == 0;
54 same_permissions_option
+= we_are_root
;
55 same_owner_option
+= we_are_root
;
57 /* Option -p clears the kernel umask, so it does not affect proper
58 restoration of file permissions. New intermediate directories will
59 comply with umask at start of program. */
61 newdir_umask
= umask (0);
62 if (0 < same_permissions_option
)
66 umask (newdir_umask
); /* restore the kernel umask */
67 current_umask
= newdir_umask
;
70 /* FIXME: Just make sure we can add files in directories we create. Maybe
71 should we later remove permissions we are adding, here? */
72 newdir_umask
&= ~ MODE_WXUSR
;
75 /*------------------------------------------------------------------.
76 | Restore mode for FILE_NAME, from information given in STAT_INFO. |
77 `------------------------------------------------------------------*/
80 set_mode (char *file_name
, struct stat
*stat_info
)
82 /* Do nothing unless we are restoring the original permissions.
84 We must force permission when -k and -U are not selected, because if the
85 file already existed, open or creat would save the permission bits from
86 the previously created file, ignoring the ones we specified.
88 But with -k or -U selected, we know *we* created this file, so the mode
89 bits were set by our open. If the file has abnormal mode bits, we must
90 chmod since writing or chown has probably reset them. If the file is
91 normal, we merely skip the chmod. This works because we did umask (0)
92 when -p, so umask will have left the specified mode alone. */
94 if (0 < same_permissions_option
95 && ((!keep_old_files_option
&& !unlink_first_option
)
96 || (stat_info
->st_mode
& (S_ISUID
| S_ISGID
| S_ISVTX
))))
97 if (chmod (file_name
, ~current_umask
& stat_info
->st_mode
) < 0)
98 ERROR ((0, errno
, _("%s: Cannot change mode to %04lo"),
100 (unsigned long) (~current_umask
& stat_info
->st_mode
)));
103 /*----------------------------------------------------------------------.
104 | Restore stat attributes (owner, group, mode and times) for FILE_NAME, |
105 | using information given in STAT_INFO. SYMLINK_FLAG is non-zero for a |
106 | freshly restored symbolic link. |
107 `----------------------------------------------------------------------*/
109 /* FIXME: About proper restoration of symbolic link attributes, we still do
110 not have it right. Pretesters' reports tell us we need further study and
111 probably more configuration. For now, just use lchown if it exists, and
112 punt for the rest. Sigh! */
115 set_stat (char *file_name
, struct stat
*stat_info
, int symlink_flag
)
117 struct utimbuf utimbuf
;
121 /* We do the utime before the chmod because some versions of utime are
122 broken and trash the modes of the file. */
126 /* We set the accessed time to `now', which is really the time we
127 started extracting files, unless incremental_option is used, in
128 which case .st_atime is used. */
130 /* FIXME: incremental_option should set ctime too, but how? */
132 if (incremental_option
)
133 utimbuf
.actime
= stat_info
->st_atime
;
135 utimbuf
.actime
= start_time
;
137 utimbuf
.modtime
= stat_info
->st_mtime
;
139 if (utime (file_name
, &utimbuf
) < 0)
141 _("%s: Could not change access and modification times"),
145 /* Some systems allow non-root users to give files away. Once this
146 done, it is not possible anymore to change file permissions, so we
147 have to set permissions prior to possibly giving files away. */
149 set_mode (file_name
, stat_info
);
152 /* If we are root, set the owner and group of the extracted file, so we
153 extract as the original owner. Or else, if we are running as a user,
154 leave the owner and group as they are, so we extract as that user. */
156 if (0 < same_owner_option
)
160 /* When lchown exists, it should be used to change the attributes of
161 the symbolic link itself. In this case, a mere chown would change
162 the attributes of the file the symbolic link is pointing to, and
163 should be avoided. */
167 if (lchown (file_name
, stat_info
->st_uid
, stat_info
->st_gid
) < 0)
168 ERROR ((0, errno
, _("%s: Cannot lchown to uid %lu gid %lu"),
170 (unsigned long) stat_info
->st_uid
,
171 (unsigned long) stat_info
->st_gid
));
175 if (chown (file_name
, stat_info
->st_uid
, stat_info
->st_gid
) < 0)
176 ERROR ((0, errno
, _("%s: Cannot chown to uid %lu gid %lu"),
178 (unsigned long) stat_info
->st_uid
,
179 (unsigned long) stat_info
->st_gid
));
182 #else /* not HAVE_LCHOWN */
186 if (chown (file_name
, stat_info
->st_uid
, stat_info
->st_gid
) < 0)
187 ERROR ((0, errno
, _("%s: Cannot chown to uid %lu gid %lu"),
189 (unsigned long) stat_info
->st_uid
,
190 (unsigned long) stat_info
->st_gid
));
192 #endif/* not HAVE_LCHOWN */
196 /* On a few systems, and in particular, those allowing to give files
197 away, changing the owner or group destroys the suid or sgid bits.
198 So let's attempt setting these bits once more. */
200 if (stat_info
->st_mode
& (S_ISUID
| S_ISGID
| S_ISVTX
))
201 set_mode (file_name
, stat_info
);
205 /*-----------------------------------------------------------------------.
206 | After a file/link/symlink/directory creation has failed, see if it's |
207 | because some required directory was not present, and if so, create all |
208 | required directories. Return non-zero if a directory was created. |
209 `-----------------------------------------------------------------------*/
212 make_directories (char *file_name
)
214 char *cursor
; /* points into path */
215 int did_something
= 0; /* did we do anything yet? */
216 int saved_errno
= errno
; /* remember caller's errno */
219 for (cursor
= strchr (file_name
, '/');
221 cursor
= strchr (cursor
+ 1, '/'))
223 /* Avoid mkdir of empty string, if leading or double '/'. */
225 if (cursor
== file_name
|| cursor
[-1] == '/')
228 /* Avoid mkdir where last part of path is '.'. */
230 if (cursor
[-1] == '.' && (cursor
== file_name
+ 1 || cursor
[-2] == '/'))
233 *cursor
= '\0'; /* truncate the path there */
234 status
= mkdir (file_name
, ~newdir_umask
& MODE_RWX
);
238 print_for_mkdir (file_name
, cursor
- file_name
,
239 ~newdir_umask
& MODE_RWX
);
250 /* Turbo C mkdir gives a funny errno. */
254 /* Directory already exists. */
257 /* Some other error in the mkdir. We return to the caller. */
261 errno
= saved_errno
; /* FIXME: errno should be read-only */
262 return did_something
; /* tell them to retry if we made one */
265 /*--------------------------------------------------------------------.
266 | Unlink the destination, if we are supposed to do so. |
267 | Return zero if extraction should not proceed. |
268 `--------------------------------------------------------------------*/
271 unlink_destination (char const *file_name
)
273 if (unlink_first_option
274 && !remove_any_file (file_name
, recursive_unlink_option
)
277 ERROR ((0, errno
, _("Cannot remove %s"), file_name
));
284 /*--------------------------------------------------------------------.
285 | Attempt repairing what went wrong with the extraction. Delete an |
286 | already existing file or create missing intermediate directories. |
287 | Return nonzero if we somewhat increased our chances at a successful |
288 | extraction. errno is properly restored on zero return. |
289 `--------------------------------------------------------------------*/
292 maybe_recoverable (char *file_name
)
297 /* Attempt deleting an existing file. However, with -k or -U, just stay
300 if (keep_old_files_option
|| unlink_first_option
)
303 return remove_any_file (file_name
, 0);
306 /* Attempt creating missing intermediate directories. */
308 return make_directories (file_name
);
311 /* Just say we can't do anything about it... */
322 extract_sparse_file (int fd
, off_t
*sizeleft
, off_t totalsize
, char *name
)
328 /* assuming sizeleft is initially totalsize */
330 while (*sizeleft
> 0)
332 union block
*data_block
= find_next_block ();
335 ERROR ((0, 0, _("Unexpected EOF on archive file")));
338 if (lseek (fd
, sparsearray
[sparse_ind
].offset
, SEEK_SET
) < 0)
340 char buf
[UINTMAX_STRSIZE_BOUND
];
341 ERROR ((0, errno
, _("%s: lseek error at byte %s"),
342 STRINGIFY_BIGINT (sparsearray
[sparse_ind
].offset
, buf
),
346 written
= sparsearray
[sparse_ind
++].numbytes
;
347 while (written
> BLOCKSIZE
)
349 count
= full_write (fd
, data_block
->buffer
, BLOCKSIZE
);
351 ERROR ((0, errno
, _("%s: Could not write to file"), name
));
354 set_next_block_after (data_block
);
355 data_block
= find_next_block ();
358 ERROR ((0, 0, _("Unexpected EOF on archive file")));
363 count
= full_write (fd
, data_block
->buffer
, written
);
366 ERROR ((0, errno
, _("%s: Could not write to file"), name
));
367 else if (count
!= written
)
369 char buf1
[UINTMAX_STRSIZE_BOUND
];
370 char buf2
[UINTMAX_STRSIZE_BOUND
];
371 ERROR ((0, 0, _("%s: Could only write %s of %s bytes"),
373 STRINGIFY_BIGINT (totalsize
- *sizeleft
, buf1
),
374 STRINGIFY_BIGINT (totalsize
, buf2
)));
375 skip_file (*sizeleft
);
380 set_next_block_after (data_block
);
386 /*----------------------------------.
387 | Extract a file from the archive. |
388 `----------------------------------*/
391 extract_archive (void)
393 union block
*data_block
;
408 struct delayed_set_stat
*data
;
410 #define CURRENT_FILE_NAME (skipcrud + current_file_name)
412 set_next_block_after (current_header
);
413 decode_header (current_header
, ¤t_stat
, ¤t_format
, 1);
415 if (interactive_option
&& !confirm ("extract", current_file_name
))
417 if (current_header
->oldgnu_header
.isextended
)
418 skip_extended_headers ();
419 skip_file (current_stat
.st_size
);
423 /* Print the block from `current_header' and `current_stat'. */
428 /* Check for fully specified file names and other atrocities. */
431 while (!absolute_names_option
&& CURRENT_FILE_NAME
[0] == '/')
433 static int warned_once
;
438 WARN ((0, 0, _("Removing leading `/' from archive names")));
440 skipcrud
++; /* force relative path */
443 /* Take a safety backup of a previously existing file. */
445 if (backup_option
&& !to_stdout_option
)
446 if (!maybe_backup_file (CURRENT_FILE_NAME
, 0))
448 ERROR ((0, errno
, _("%s: Was unable to backup this file"),
450 if (current_header
->oldgnu_header
.isextended
)
451 skip_extended_headers ();
452 skip_file (current_stat
.st_size
);
456 /* Extract the archive entry according to its type. */
458 typeflag
= current_header
->header
.typeflag
;
461 /* JK - What we want to do if the file is sparse is loop through
462 the array of sparse structures in the header and read in and
463 translate the character strings representing 1) the offset at
464 which to write and 2) how many bytes to write into numbers,
465 which we store into the scratch array, "sparsearray". This
466 array makes our life easier the same way it did in creating the
467 tar file that had to deal with a sparse file.
469 After we read in the first five (at most) sparse structures, we
470 check to see if the file has an extended header, i.e., if more
471 sparse structures are needed to describe the contents of the new
472 file. If so, we read in the extended headers and continue to
473 store their contents into the sparsearray. */
478 xmalloc (sp_array_size
* sizeof (struct sp_array
));
480 for (counter
= 0; counter
< SPARSES_IN_OLDGNU_HEADER
; counter
++)
482 struct sparse
const *s
= ¤t_header
->oldgnu_header
.sp
[counter
];
483 sparsearray
[counter
].offset
= OFF_FROM_HEADER (s
->offset
);
484 sparsearray
[counter
].numbytes
= SIZE_FROM_HEADER (s
->numbytes
);
485 if (!sparsearray
[counter
].numbytes
)
489 if (current_header
->oldgnu_header
.isextended
)
491 /* Read in the list of extended headers and translate them
492 into the sparsearray as before. Note that this
493 invalidates current_header. */
495 /* static */ int ind
= SPARSES_IN_OLDGNU_HEADER
;
499 exhdr
= find_next_block ();
502 ERROR ((0, 0, _("Unexpected EOF on archive file")));
505 for (counter
= 0; counter
< SPARSES_IN_SPARSE_HEADER
; counter
++)
507 struct sparse
const *s
= &exhdr
->sparse_header
.sp
[counter
];
508 if (counter
+ ind
> sp_array_size
- 1)
510 /* Realloc the scratch area since we've run out of
515 xrealloc (sparsearray
,
516 sp_array_size
* sizeof (struct sp_array
));
518 if (s
->numbytes
[0] == 0)
520 sparsearray
[counter
+ ind
].offset
=
521 OFF_FROM_HEADER (s
->offset
);
522 sparsearray
[counter
+ ind
].numbytes
=
523 SIZE_FROM_HEADER (s
->numbytes
);
525 if (!exhdr
->sparse_header
.isextended
)
529 ind
+= SPARSES_IN_SPARSE_HEADER
;
530 set_next_block_after (exhdr
);
533 set_next_block_after (exhdr
);
541 /* Appears to be a file. But BSD tar uses the convention that a slash
542 suffix means a directory. */
544 name_length
= strlen (CURRENT_FILE_NAME
) - 1;
545 if (CURRENT_FILE_NAME
[name_length
] == '/')
548 /* FIXME: deal with protection issues. */
551 openflag
= (keep_old_files_option
|| unlink_first_option
?
552 O_WRONLY
| O_BINARY
| O_NONBLOCK
| O_CREAT
| O_EXCL
:
553 O_WRONLY
| O_BINARY
| O_NONBLOCK
| O_CREAT
| O_TRUNC
)
554 | ((typeflag
== GNUTYPE_SPARSE
) ? 0 : O_APPEND
);
556 /* JK - The last | is a kludge to solve the problem the O_APPEND
557 flag causes with files we are trying to make sparse: when a file
558 is opened with O_APPEND, it writes to the last place that
559 something was written, thereby ignoring any lseeks that we have
560 done. We add this extra condition to make it able to lseek when
561 a file is sparse, i.e., we don't open the new file with this
562 flag. (Grump -- this bug caused me to waste a good deal of
563 time, I might add) */
565 if (to_stdout_option
)
571 if (!unlink_destination (CURRENT_FILE_NAME
))
573 if (current_header
->oldgnu_header
.isextended
)
574 skip_extended_headers ();
575 skip_file (current_stat
.st_size
);
582 /* Contiguous files (on the Masscomp) have to specify the size in
583 the open call that creates them. */
585 if (typeflag
== CONTTYPE
)
586 fd
= open (CURRENT_FILE_NAME
, openflag
| O_CTG
,
587 current_stat
.st_mode
, current_stat
.st_size
);
589 fd
= open (CURRENT_FILE_NAME
, openflag
, current_stat
.st_mode
);
591 #else /* not O_CTG */
592 if (typeflag
== CONTTYPE
)
594 static int conttype_diagnosed
;
596 if (!conttype_diagnosed
)
598 conttype_diagnosed
= 1;
599 WARN ((0, 0, _("Extracting contiguous files as regular files")));
602 fd
= open (CURRENT_FILE_NAME
, openflag
, current_stat
.st_mode
);
604 #endif /* not O_CTG */
608 if (maybe_recoverable (CURRENT_FILE_NAME
))
611 ERROR ((0, errno
, _("%s: Could not create file"),
613 if (current_header
->oldgnu_header
.isextended
)
614 skip_extended_headers ();
615 skip_file (current_stat
.st_size
);
622 if (typeflag
== GNUTYPE_SPARSE
)
625 size_t name_length_bis
;
627 /* Kludge alert. NAME is assigned to header.name because
628 during the extraction, the space that contains the header
629 will get scribbled on, and the name will get munged, so any
630 error messages that happen to contain the filename will look
631 REAL interesting unless we do this. */
633 name_length_bis
= strlen (CURRENT_FILE_NAME
) + 1;
634 name
= xmalloc (name_length_bis
);
635 memcpy (name
, CURRENT_FILE_NAME
, name_length_bis
);
636 size
= current_stat
.st_size
;
637 extract_sparse_file (fd
, &size
, current_stat
.st_size
, name
);
640 for (size
= current_stat
.st_size
;
644 if (multi_volume_option
)
646 assign_string (&save_name
, current_file_name
);
647 save_totsize
= current_stat
.st_size
;
648 save_sizeleft
= size
;
651 /* Locate data, determine max length writeable, write it,
652 block that we have used the data, then check if the write
655 data_block
= find_next_block ();
658 ERROR ((0, 0, _("Unexpected EOF on archive file")));
659 break; /* FIXME: What happens, then? */
662 written
= available_space_after (data_block
);
666 errno
= 0; /* FIXME: errno should be read-only */
667 sstatus
= full_write (fd
, data_block
->buffer
, written
);
669 set_next_block_after ((union block
*)
670 (data_block
->buffer
+ written
- 1));
671 if (sstatus
== written
)
674 /* Error in writing to file. Print it, skip to next file in
678 ERROR ((0, errno
, _("%s: Could not write to file"),
681 ERROR ((0, 0, _("%s: Could only write %lu of %lu bytes"),
683 (unsigned long) sstatus
,
684 (unsigned long) written
));
685 skip_file (size
- written
);
686 break; /* still do the close, mod time, chmod, etc */
689 if (multi_volume_option
)
690 assign_string (&save_name
, 0);
692 /* If writing to stdout, don't try to do anything to the filename;
693 it doesn't exist, or we don't want to touch it anyway. */
695 if (to_stdout_option
)
701 ERROR ((0, errno
, _("%s: Error while closing"), CURRENT_FILE_NAME
));
706 set_stat (CURRENT_FILE_NAME
, ¤t_stat
, 0);
710 if (to_stdout_option
)
714 if (!unlink_destination (CURRENT_FILE_NAME
))
717 while (status
= symlink (current_link_name
, CURRENT_FILE_NAME
),
719 if (!maybe_recoverable (CURRENT_FILE_NAME
))
724 /* Setting the attributes of symbolic links might, on some systems,
725 change the pointed to file, instead of the symbolic link itself.
726 At least some of these systems have a lchown call, and the
727 set_stat routine knows about this. */
729 set_stat (CURRENT_FILE_NAME
, ¤t_stat
, 1);
733 ERROR ((0, errno
, _("%s: Could not create symlink to `%s'"),
734 CURRENT_FILE_NAME
, current_link_name
));
742 static int warned_once
;
748 _("Attempting extraction of symbolic links as hard links")));
756 if (to_stdout_option
)
759 if (!unlink_destination (CURRENT_FILE_NAME
))
764 struct stat st1
, st2
;
766 /* MSDOS does not implement links. However, djgpp's link() actually
768 status
= link (current_link_name
, CURRENT_FILE_NAME
);
772 if (maybe_recoverable (CURRENT_FILE_NAME
))
775 if (incremental_option
&& errno
== EEXIST
)
777 if (stat (current_link_name
, &st1
) == 0
778 && stat (CURRENT_FILE_NAME
, &st2
) == 0
779 && st1
.st_dev
== st2
.st_dev
780 && st1
.st_ino
== st2
.st_ino
)
783 ERROR ((0, errno
, _("%s: Could not link to `%s'"),
784 CURRENT_FILE_NAME
, current_link_name
));
792 current_stat
.st_mode
|= S_IFCHR
;
798 current_stat
.st_mode
|= S_IFBLK
;
801 #if S_IFCHR || S_IFBLK
803 if (to_stdout_option
)
806 if (!unlink_destination (CURRENT_FILE_NAME
))
809 status
= mknod (CURRENT_FILE_NAME
, current_stat
.st_mode
,
810 current_stat
.st_rdev
);
813 if (maybe_recoverable (CURRENT_FILE_NAME
))
816 ERROR ((0, errno
, _("%s: Could not make node"), CURRENT_FILE_NAME
));
821 set_stat (CURRENT_FILE_NAME
, ¤t_stat
, 0);
825 #if HAVE_MKFIFO || defined mkfifo
827 if (to_stdout_option
)
830 if (!unlink_destination (CURRENT_FILE_NAME
))
833 while (status
= mkfifo (CURRENT_FILE_NAME
, current_stat
.st_mode
),
835 if (!maybe_recoverable (CURRENT_FILE_NAME
))
839 set_stat (CURRENT_FILE_NAME
, ¤t_stat
, 0);
842 ERROR ((0, errno
, _("%s: Could not make fifo"), CURRENT_FILE_NAME
));
850 case GNUTYPE_DUMPDIR
:
851 name_length
= strlen (CURRENT_FILE_NAME
) - 1;
854 /* Check for trailing /, and zap as many as we find. */
855 while (name_length
&& CURRENT_FILE_NAME
[name_length
] == '/')
856 CURRENT_FILE_NAME
[name_length
--] = '\0';
858 if (incremental_option
)
860 /* Read the entry and delete files that aren't listed in the
863 gnu_restore (skipcrud
);
865 else if (typeflag
== GNUTYPE_DUMPDIR
)
866 skip_file (current_stat
.st_size
);
868 if (to_stdout_option
)
872 status
= mkdir (CURRENT_FILE_NAME
,
873 ((we_are_root
? 0 : MODE_WXUSR
)
874 | current_stat
.st_mode
));
877 /* If the directory creation fails, let's consider immediately the
878 case where the directory already exists. We have three good
879 reasons for clearing out this case before attempting recovery.
881 1) It would not be efficient recovering the error by deleting
882 the directory in maybe_recoverable, then recreating it right
883 away. We only hope we will be able to adjust its permissions
886 2) Removing the directory might fail if it is not empty. By
887 exception, this real error is traditionally not reported.
889 3) Let's suppose `DIR' already exists and we are about to
890 extract `DIR/../DIR'. This would fail because the directory
891 already exists, and maybe_recoverable would react by removing
892 `DIR'. This then would fail again because there are missing
893 intermediate directories, and maybe_recoverable would react by
894 creating `DIR'. We would then have an extraction loop. */
899 int saved_errno
= errno
;
901 if (stat (CURRENT_FILE_NAME
, &st1
) == 0 && S_ISDIR (st1
.st_mode
))
904 errno
= saved_errno
; /* FIXME: errno should be read-only */
907 if (maybe_recoverable (CURRENT_FILE_NAME
))
910 /* If we're trying to create '.', let it be. */
912 /* FIXME: Strange style... */
914 if (CURRENT_FILE_NAME
[name_length
] == '.'
916 || CURRENT_FILE_NAME
[name_length
- 1] == '/'))
919 ERROR ((0, errno
, _("%s: Could not create directory"),
927 if (!we_are_root
&& MODE_WXUSR
!= (MODE_WXUSR
& current_stat
.st_mode
))
929 current_stat
.st_mode
|= MODE_WXUSR
;
930 WARN ((0, 0, _("Added write and execute permission to directory %s"),
935 /* MSDOS does not associate time stamps with directories. In this
936 case, no need to try delaying their restoration. */
940 /* FIXME: I do not believe in this. Ignoring time stamps does not
941 alleviate the need of delaying the restoration of directories'
942 mode. Let's ponder this for a little while. */
944 set_mode (CURRENT_FILE_NAME
, ¤t_stat
);
948 data
= xmalloc (sizeof (struct delayed_set_stat
));
949 data
->file_name
= xstrdup (CURRENT_FILE_NAME
);
950 data
->stat_info
= current_stat
;
951 data
->next
= delayed_set_stat_head
;
952 delayed_set_stat_head
= data
;
959 fprintf (stdlis
, _("Reading %s\n"), current_file_name
);
966 case GNUTYPE_MULTIVOL
:
968 _("Cannot extract `%s' -- file is continued from another volume"),
970 skip_file (current_stat
.st_size
);
975 case GNUTYPE_LONGNAME
:
976 case GNUTYPE_LONGLINK
:
977 ERROR ((0, 0, _("Visible long name error")));
978 skip_file (current_stat
.st_size
);
985 _("Unknown file type '%c' for %s, extracted as normal file"),
986 typeflag
, CURRENT_FILE_NAME
));
990 #undef CURRENT_FILE_NAME
993 /*----------------------------------------------------------------.
994 | Set back the utime and mode for all the extracted directories. |
995 `----------------------------------------------------------------*/
998 apply_delayed_set_stat (void)
1000 struct delayed_set_stat
*data
;
1002 while (delayed_set_stat_head
)
1004 data
= delayed_set_stat_head
;
1005 delayed_set_stat_head
= delayed_set_stat_head
->next
;
1006 set_stat (data
->file_name
, &data
->stat_info
, 0);
1007 free (data
->file_name
);
This page took 0.078073 seconds and 4 git commands to generate.