1 /* Extract files from a tar archive.
3 Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1998, 1999, 2000,
4 2001, 2003, 2004, 2005, 2006, 2007, 2010 Free Software Foundation, Inc.
6 Written by John Gilmore, on 1985-11-19.
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
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.
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. */
30 static bool we_are_root
; /* true if our effective uid == 0 */
31 static mode_t newdir_umask
; /* umask when creating new directories */
32 static mode_t current_umask
; /* current umask (which is set to 0 if -p) */
34 /* Status of the permissions of a file that we are extracting. */
37 /* This file may have existed already; its permissions are unknown. */
40 /* This file was created using the permissions from the archive,
41 except with S_IRWXG | S_IRWXO masked out if 0 < same_owner_option. */
44 /* This is an intermediate directory; the archive did not specify
49 /* List of directories whose statuses we need to extract after we've
50 finished extracting their subsidiary files. If you consider each
51 contiguous subsequence of elements of the form [D]?[^D]*, where [D]
52 represents an element where AFTER_LINKS is nonzero and [^D]
53 represents an element where AFTER_LINKS is zero, then the head
54 of the subsequence has the longest name, and each non-head element
55 in the prefix is an ancestor (in the directory hierarchy) of the
58 struct delayed_set_stat
60 struct delayed_set_stat
*next
;
66 struct timespec atime
;
67 struct timespec mtime
;
69 mode_t invert_permissions
;
70 enum permstatus permstatus
;
75 static struct delayed_set_stat
*delayed_set_stat_head
;
77 /* List of links whose creation we have delayed. */
80 /* The next delayed link in the list. */
81 struct delayed_link
*next
;
83 /* The device, inode number and last-modified time of the placeholder. */
86 struct timespec mtime
;
88 /* True if the link is symbolic. */
91 /* The desired owner and group of the link, if it is a symlink. */
95 /* A list of sources for this link. The sources are all to be
96 hard-linked together. */
97 struct string_list
*sources
;
99 /* The desired target of the desired link. */
103 static struct delayed_link
*delayed_link_head
;
107 struct string_list
*next
;
111 /* Set up to extract files. */
115 we_are_root
= geteuid () == 0;
116 same_permissions_option
+= we_are_root
;
117 same_owner_option
+= we_are_root
;
119 /* Option -p clears the kernel umask, so it does not affect proper
120 restoration of file permissions. New intermediate directories will
121 comply with umask at start of program. */
123 newdir_umask
= umask (0);
124 if (0 < same_permissions_option
)
128 umask (newdir_umask
); /* restore the kernel umask */
129 current_umask
= newdir_umask
;
133 /* If restoring permissions, restore the mode for FILE_NAME from
134 information given in *STAT_INFO (where *CUR_INFO gives
135 the current status if CUR_INFO is nonzero); otherwise invert the
136 INVERT_PERMISSIONS bits from the file's current permissions.
137 PERMSTATUS specifies the status of the file's permissions.
138 TYPEFLAG specifies the type of the file. */
140 set_mode (char const *file_name
,
141 struct stat
const *stat_info
,
142 struct stat
const *cur_info
,
143 mode_t invert_permissions
, enum permstatus permstatus
,
149 if (0 < same_permissions_option
150 && permstatus
!= INTERDIR_PERMSTATUS
)
152 mode
= stat_info
->st_mode
;
154 /* If we created the file and it has a mode that we set already
155 with O_CREAT, then its mode is often set correctly already.
156 But if we are changing ownership, the mode's group and and
157 other permission bits were omitted originally, so it's less
158 likely that the mode is OK now. Also, on many hosts, some
159 directories inherit the setgid bits from their parents, so we
160 we must set directories' modes explicitly. */
161 if ((permstatus
== ARCHIVED_PERMSTATUS
162 && ! (mode
& ~ (0 < same_owner_option
? S_IRWXU
: MODE_RWX
)))
163 && typeflag
!= DIRTYPE
164 && typeflag
!= GNUTYPE_DUMPDIR
)
167 else if (! invert_permissions
)
171 /* We must inspect a directory's current permissions, since the
172 directory may have inherited its setgid bit from its parent.
174 INVERT_PERMISSIONS happens to be nonzero only for directories
175 that we created, so there's no point optimizing this code for
180 if (stat (file_name
, &st
) != 0)
182 stat_error (file_name
);
187 mode
= cur_info
->st_mode
^ invert_permissions
;
190 chmod_errno
= chmod (file_name
, mode
) == 0 ? 0 : errno
;
191 if (chmod_errno
== EPERM
&& (mode
& S_ISUID
) != 0)
193 /* On Solaris, chmod may fail if we don't have PRIV_ALL, because
194 setuid-root files would otherwise be a backdoor. See
195 http://opensolaris.org/jive/thread.jspa?threadID=95826
197 if (priv_set_restore_linkdir () == 0)
199 chmod_errno
= chmod (file_name
, mode
) == 0 ? 0 : errno
;
200 priv_set_remove_linkdir ();
206 chmod_error_details (file_name
, mode
);
210 /* Check time after successfully setting FILE_NAME's time stamp to T. */
212 check_time (char const *file_name
, struct timespec t
)
215 WARNOPT (WARN_TIMESTAMP
,
216 (0, 0, _("%s: implausibly old time stamp %s"),
217 file_name
, tartime (t
, true)));
218 else if (timespec_cmp (volume_start_time
, t
) < 0)
222 if (timespec_cmp (now
, t
) < 0)
224 char buf
[TIMESPEC_STRSIZE_BOUND
];
225 struct timespec diff
;
226 diff
.tv_sec
= t
.tv_sec
- now
.tv_sec
;
227 diff
.tv_nsec
= t
.tv_nsec
- now
.tv_nsec
;
228 if (diff
.tv_nsec
< 0)
230 diff
.tv_nsec
+= BILLION
;
233 WARNOPT (WARN_TIMESTAMP
,
234 (0, 0, _("%s: time stamp %s is %s s in the future"),
235 file_name
, tartime (t
, true), code_timespec (diff
, buf
)));
240 /* Restore stat attributes (owner, group, mode and times) for
241 FILE_NAME, using information given in *ST.
242 If CUR_INFO is nonzero, *CUR_INFO is the
243 file's current status.
244 If not restoring permissions, invert the
245 INVERT_PERMISSIONS bits from the file's current permissions.
246 PERMSTATUS specifies the status of the file's permissions.
247 TYPEFLAG specifies the type of the file. */
249 /* FIXME: About proper restoration of symbolic link attributes, we still do
250 not have it right. Pretesters' reports tell us we need further study and
251 probably more configuration. For now, just use lchown if it exists, and
252 punt for the rest. Sigh! */
255 set_stat (char const *file_name
,
256 struct tar_stat_info
const *st
,
257 struct stat
const *cur_info
,
258 mode_t invert_permissions
, enum permstatus permstatus
,
261 if (typeflag
!= SYMTYPE
)
263 /* We do the utime before the chmod because some versions of utime are
264 broken and trash the modes of the file. */
266 if (! touch_option
&& permstatus
!= INTERDIR_PERMSTATUS
)
268 /* We set the accessed time to `now', which is really the time we
269 started extracting files, unless incremental_option is used, in
270 which case .st_atime is used. */
272 /* FIXME: incremental_option should set ctime too, but how? */
274 struct timespec ts
[2];
275 if (incremental_option
)
281 if (utimens (file_name
, ts
) != 0)
282 utime_error (file_name
);
285 check_time (file_name
, ts
[0]);
286 check_time (file_name
, ts
[1]);
290 /* Some systems allow non-root users to give files away. Once this
291 done, it is not possible anymore to change file permissions.
292 However, setting file permissions now would be incorrect, since
293 they would apply to the wrong user, and there would be a race
294 condition. So, don't use systems that allow non-root users to
298 if (0 < same_owner_option
&& permstatus
!= INTERDIR_PERMSTATUS
)
300 /* When lchown exists, it should be used to change the attributes of
301 the symbolic link itself. In this case, a mere chown would change
302 the attributes of the file the symbolic link is pointing to, and
303 should be avoided. */
304 int chown_result
= 1;
306 if (typeflag
== SYMTYPE
)
309 chown_result
= lchown (file_name
, st
->stat
.st_uid
, st
->stat
.st_gid
);
314 chown_result
= chown (file_name
, st
->stat
.st_uid
, st
->stat
.st_gid
);
317 if (chown_result
== 0)
319 /* Changing the owner can flip st_mode bits in some cases, so
320 ignore cur_info if it might be obsolete now. */
322 && cur_info
->st_mode
& S_IXUGO
323 && cur_info
->st_mode
& (S_ISUID
| S_ISGID
))
326 else if (chown_result
< 0)
327 chown_error_details (file_name
,
328 st
->stat
.st_uid
, st
->stat
.st_gid
);
331 if (typeflag
!= SYMTYPE
)
332 set_mode (file_name
, &st
->stat
, cur_info
,
333 invert_permissions
, permstatus
, typeflag
);
336 /* Remember to restore stat attributes (owner, group, mode and times)
337 for the directory FILE_NAME, using information given in *ST,
338 once we stop extracting files into that directory.
339 If not restoring permissions, remember to invert the
340 INVERT_PERMISSIONS bits from the file's current permissions.
341 PERMSTATUS specifies the status of the file's permissions.
343 NOTICE: this works only if the archive has usual member order, i.e.
344 directory, then the files in that directory. Incremental archive have
345 somewhat reversed order: first go subdirectories, then all other
346 members. To help cope with this case the variable
347 delay_directory_restore_option is set by prepare_to_extract.
349 If an archive was explicitely created so that its member order is
350 reversed, some directory timestamps can be restored incorrectly,
352 tar --no-recursion -cf archive dir dir/file1 foo dir/file2
355 delay_set_stat (char const *file_name
, struct tar_stat_info
const *st
,
356 mode_t invert_permissions
, enum permstatus permstatus
)
358 size_t file_name_len
= strlen (file_name
);
359 struct delayed_set_stat
*data
=
360 xmalloc (offsetof (struct delayed_set_stat
, file_name
)
361 + file_name_len
+ 1);
362 data
->next
= delayed_set_stat_head
;
363 data
->dev
= st
->stat
.st_dev
;
364 data
->ino
= st
->stat
.st_ino
;
365 data
->mode
= st
->stat
.st_mode
;
366 data
->uid
= st
->stat
.st_uid
;
367 data
->gid
= st
->stat
.st_gid
;
368 data
->atime
= st
->atime
;
369 data
->mtime
= st
->mtime
;
370 data
->file_name_len
= file_name_len
;
371 data
->invert_permissions
= invert_permissions
;
372 data
->permstatus
= permstatus
;
373 data
->after_links
= 0;
374 strcpy (data
->file_name
, file_name
);
375 delayed_set_stat_head
= data
;
378 /* Update the delayed_set_stat info for an intermediate directory
379 created within the file name of DIR. The intermediate directory turned
380 out to be the same as this directory, e.g. due to ".." or symbolic
381 links. *DIR_STAT_INFO is the status of the directory. */
383 repair_delayed_set_stat (char const *dir
,
384 struct stat
const *dir_stat_info
)
386 struct delayed_set_stat
*data
;
387 for (data
= delayed_set_stat_head
; data
; data
= data
->next
)
390 if (stat (data
->file_name
, &st
) != 0)
392 stat_error (data
->file_name
);
396 if (st
.st_dev
== dir_stat_info
->st_dev
397 && st
.st_ino
== dir_stat_info
->st_ino
)
399 data
->dev
= current_stat_info
.stat
.st_dev
;
400 data
->ino
= current_stat_info
.stat
.st_ino
;
401 data
->mode
= current_stat_info
.stat
.st_mode
;
402 data
->uid
= current_stat_info
.stat
.st_uid
;
403 data
->gid
= current_stat_info
.stat
.st_gid
;
404 data
->atime
= current_stat_info
.atime
;
405 data
->mtime
= current_stat_info
.mtime
;
406 data
->invert_permissions
=
407 ((current_stat_info
.stat
.st_mode
^ st
.st_mode
)
408 & MODE_RWX
& ~ current_umask
);
409 data
->permstatus
= ARCHIVED_PERMSTATUS
;
414 ERROR ((0, 0, _("%s: Unexpected inconsistency when making directory"),
415 quotearg_colon (dir
)));
418 /* After a file/link/directory creation has failed, see if
419 it's because some required directory was not present, and if so,
420 create all required directories. Return non-zero if a directory
423 make_directories (char *file_name
)
425 char *cursor0
= file_name
+ FILE_SYSTEM_PREFIX_LEN (file_name
);
426 char *cursor
; /* points into the file name */
427 int did_something
= 0; /* did we do anything yet? */
429 int invert_permissions
;
432 for (cursor
= cursor0
; *cursor
; cursor
++)
434 if (! ISSLASH (*cursor
))
437 /* Avoid mkdir of empty string, if leading or double '/'. */
439 if (cursor
== cursor0
|| ISSLASH (cursor
[-1]))
442 /* Avoid mkdir where last part of file name is "." or "..". */
444 if (cursor
[-1] == '.'
445 && (cursor
== cursor0
+ 1 || ISSLASH (cursor
[-2])
446 || (cursor
[-2] == '.'
447 && (cursor
== cursor0
+ 2 || ISSLASH (cursor
[-3])))))
450 *cursor
= '\0'; /* truncate the name there */
451 mode
= MODE_RWX
& ~ newdir_umask
;
452 invert_permissions
= we_are_root
? 0 : MODE_WXUSR
& ~ mode
;
453 status
= mkdir (file_name
, mode
^ invert_permissions
);
457 /* Create a struct delayed_set_stat even if
458 invert_permissions is zero, because
459 repair_delayed_set_stat may need to update the struct. */
460 delay_set_stat (file_name
,
462 invert_permissions
, INTERDIR_PERMSTATUS
);
464 print_for_mkdir (file_name
, cursor
- file_name
, mode
);
474 continue; /* Directory already exists. */
475 else if ((errno
== ENOSYS
/* Automounted dirs on Solaris return
476 this. Reported by Warren Hyde
477 <Warren.Hyde@motorola.com> */
478 || ERRNO_IS_EACCES
) /* Turbo C mkdir gives a funny errno. */
479 && access (file_name
, W_OK
) == 0)
482 /* Some other error in the mkdir. We return to the caller. */
486 return did_something
; /* tell them to retry if we made one */
490 file_newer_p (const char *file_name
, struct tar_stat_info
*tar_stat
)
494 if (stat (file_name
, &st
))
498 stat_warn (file_name
);
499 /* Be on the safe side: if the file does exist assume it is newer */
504 if (!S_ISDIR (st
.st_mode
)
505 && tar_timespec_cmp (tar_stat
->mtime
, get_stat_mtime (&st
)) <= 0)
514 #define RECOVER_SKIP 2
516 /* Attempt repairing what went wrong with the extraction. Delete an
517 already existing file or create missing intermediate directories.
518 Return RECOVER_OK if we somewhat increased our chances at a successful
519 extraction, RECOVER_NO if there are no chances, and RECOVER_SKIP if the
520 caller should skip extraction of that member. The value of errno is
521 properly restored on returning RECOVER_NO. */
524 maybe_recoverable (char *file_name
, bool *interdir_made
)
534 /* Remove an old file, if the options allow this. */
536 switch (old_files_option
)
541 case KEEP_NEWER_FILES
:
542 if (file_newer_p (file_name
, ¤t_stat_info
))
549 case DEFAULT_OLD_FILES
:
550 case NO_OVERWRITE_DIR_OLD_FILES
:
551 case OVERWRITE_OLD_FILES
:
553 int r
= remove_any_file (file_name
, ORDINARY_REMOVE_OPTION
);
555 return r
> 0 ? RECOVER_OK
: RECOVER_NO
;
558 case UNLINK_FIRST_OLD_FILES
:
563 /* Attempt creating missing intermediate directories. */
564 if (! make_directories (file_name
))
569 *interdir_made
= true;
573 /* Just say we can't do anything about it... */
579 /* Fix the statuses of all directories whose statuses need fixing, and
580 which are not ancestors of FILE_NAME. If AFTER_LINKS is
581 nonzero, do this for all such directories; otherwise, stop at the
582 first directory that is marked to be fixed up only after delayed
583 links are applied. */
585 apply_nonancestor_delayed_set_stat (char const *file_name
, bool after_links
)
587 size_t file_name_len
= strlen (file_name
);
588 bool check_for_renamed_directories
= 0;
590 while (delayed_set_stat_head
)
592 struct delayed_set_stat
*data
= delayed_set_stat_head
;
593 bool skip_this_one
= 0;
595 struct stat
const *cur_info
= 0;
597 check_for_renamed_directories
|= data
->after_links
;
599 if (after_links
< data
->after_links
600 || (data
->file_name_len
< file_name_len
601 && file_name
[data
->file_name_len
]
602 && (ISSLASH (file_name
[data
->file_name_len
])
603 || ISSLASH (file_name
[data
->file_name_len
- 1]))
604 && memcmp (file_name
, data
->file_name
, data
->file_name_len
) == 0))
607 if (check_for_renamed_directories
)
610 if (stat (data
->file_name
, &st
) != 0)
612 stat_error (data
->file_name
);
615 else if (! (st
.st_dev
== data
->dev
&& st
.st_ino
== data
->ino
))
618 _("%s: Directory renamed before its status could be extracted"),
619 quotearg_colon (data
->file_name
)));
626 struct tar_stat_info sb
;
627 sb
.stat
.st_mode
= data
->mode
;
628 sb
.stat
.st_uid
= data
->uid
;
629 sb
.stat
.st_gid
= data
->gid
;
630 sb
.atime
= data
->atime
;
631 sb
.mtime
= data
->mtime
;
632 set_stat (data
->file_name
, &sb
, cur_info
,
633 data
->invert_permissions
, data
->permstatus
, DIRTYPE
);
636 delayed_set_stat_head
= data
->next
;
643 /* Extractor functions for various member types */
646 extract_dir (char *file_name
, int typeflag
)
650 bool interdir_made
= false;
652 /* Save 'root device' to avoid purging mount points. */
653 if (one_file_system_option
&& root_device
== 0)
657 if (stat (".", &st
) != 0)
660 root_device
= st
.st_dev
;
663 if (incremental_option
)
664 /* Read the entry and delete files that aren't listed in the archive. */
665 purge_directory (file_name
);
666 else if (typeflag
== GNUTYPE_DUMPDIR
)
669 mode
= current_stat_info
.stat
.st_mode
| (we_are_root
? 0 : MODE_WXUSR
);
670 if (0 < same_owner_option
|| current_stat_info
.stat
.st_mode
& ~ MODE_RWX
)
673 while ((status
= mkdir (file_name
, mode
)))
677 || old_files_option
== DEFAULT_OLD_FILES
678 || old_files_option
== OVERWRITE_OLD_FILES
))
681 if (stat (file_name
, &st
) == 0)
685 repair_delayed_set_stat (file_name
, &st
);
688 if (S_ISDIR (st
.st_mode
))
698 switch (maybe_recoverable (file_name
, &interdir_made
))
709 mkdir_error (file_name
);
718 || old_files_option
== DEFAULT_OLD_FILES
719 || old_files_option
== OVERWRITE_OLD_FILES
)
722 delay_set_stat (file_name
, ¤t_stat_info
,
723 ((mode
^ current_stat_info
.stat
.st_mode
)
724 & MODE_RWX
& ~ current_umask
),
725 ARCHIVED_PERMSTATUS
);
726 else /* For an already existing directory, invert_perms must be 0 */
727 delay_set_stat (file_name
, ¤t_stat_info
,
736 open_output_file (char *file_name
, int typeflag
, mode_t mode
)
739 int openflag
= (O_WRONLY
| O_BINARY
| O_CREAT
740 | (old_files_option
== OVERWRITE_OLD_FILES
745 /* Contiguous files (on the Masscomp) have to specify the size in
746 the open call that creates them. */
748 if (typeflag
== CONTTYPE
)
749 fd
= open (file_name
, openflag
| O_CTG
, mode
, current_stat_info
.stat
.st_size
);
751 fd
= open (file_name
, openflag
, mode
);
753 #else /* not O_CTG */
754 if (typeflag
== CONTTYPE
)
756 static int conttype_diagnosed
;
758 if (!conttype_diagnosed
)
760 conttype_diagnosed
= 1;
761 WARNOPT (WARN_CONTIGUOUS_CAST
,
762 (0, 0, _("Extracting contiguous files as regular files")));
765 fd
= open (file_name
, openflag
, mode
);
767 #endif /* not O_CTG */
773 extract_file (char *file_name
, int typeflag
)
777 union block
*data_block
;
781 bool interdir_made
= false;
782 mode_t mode
= current_stat_info
.stat
.st_mode
& MODE_RWX
& ~ current_umask
;
783 mode_t invert_permissions
=
784 0 < same_owner_option
? mode
& (S_IRWXG
| S_IRWXO
) : 0;
786 /* FIXME: deal with protection issues. */
788 if (to_stdout_option
)
790 else if (to_command_option
)
792 fd
= sys_exec_command (file_name
, 'f', ¤t_stat_info
);
801 int recover
= RECOVER_NO
;
803 fd
= open_output_file (file_name
, typeflag
, mode
^ invert_permissions
);
805 && (recover
= maybe_recoverable (file_name
, &interdir_made
))
811 if (recover
== RECOVER_SKIP
)
813 open_error (file_name
);
818 mv_begin_read (¤t_stat_info
);
819 if (current_stat_info
.is_sparse
)
820 sparse_extract_file (fd
, ¤t_stat_info
, &size
);
822 for (size
= current_stat_info
.stat
.st_size
; size
> 0; )
826 /* Locate data, determine max length writeable, write it,
827 block that we have used the data, then check if the write
830 data_block
= find_next_block ();
833 ERROR ((0, 0, _("Unexpected EOF in archive")));
834 break; /* FIXME: What happens, then? */
837 written
= available_space_after (data_block
);
842 count
= full_write (fd
, data_block
->buffer
, written
);
845 set_next_block_after ((union block
*)
846 (data_block
->buffer
+ written
- 1));
847 if (count
!= written
)
849 if (!to_command_option
)
850 write_error_details (file_name
, count
, written
);
851 /* FIXME: shouldn't we restore from backup? */
860 /* If writing to stdout, don't try to do anything to the filename;
861 it doesn't exist, or we don't want to touch it anyway. */
863 if (to_stdout_option
)
868 close_error (file_name
);
870 if (to_command_option
)
873 set_stat (file_name
, ¤t_stat_info
, NULL
, invert_permissions
,
874 (old_files_option
== OVERWRITE_OLD_FILES
?
875 UNKNOWN_PERMSTATUS
: ARCHIVED_PERMSTATUS
),
881 /* Create a placeholder file with name FILE_NAME, which will be
882 replaced after other extraction is done by a symbolic link if
883 IS_SYMLINK is true, and by a hard link otherwise. Set
884 *INTERDIR_MADE if an intermediate directory is made in the
888 create_placeholder_file (char *file_name
, bool is_symlink
, bool *interdir_made
)
893 while ((fd
= open (file_name
, O_WRONLY
| O_CREAT
| O_EXCL
, 0)) < 0)
895 switch (maybe_recoverable (file_name
, interdir_made
))
904 open_error (file_name
);
909 if (fstat (fd
, &st
) != 0)
911 stat_error (file_name
);
914 else if (close (fd
) != 0)
915 close_error (file_name
);
918 struct delayed_set_stat
*h
;
919 struct delayed_link
*p
=
920 xmalloc (offsetof (struct delayed_link
, target
)
921 + strlen (current_stat_info
.link_name
)
923 p
->next
= delayed_link_head
;
924 delayed_link_head
= p
;
927 p
->mtime
= get_stat_mtime (&st
);
928 p
->is_symlink
= is_symlink
;
931 p
->uid
= current_stat_info
.stat
.st_uid
;
932 p
->gid
= current_stat_info
.stat
.st_gid
;
934 p
->sources
= xmalloc (offsetof (struct string_list
, string
)
935 + strlen (file_name
) + 1);
936 p
->sources
->next
= 0;
937 strcpy (p
->sources
->string
, file_name
);
938 strcpy (p
->target
, current_stat_info
.link_name
);
940 h
= delayed_set_stat_head
;
941 if (h
&& ! h
->after_links
942 && strncmp (file_name
, h
->file_name
, h
->file_name_len
) == 0
943 && ISSLASH (file_name
[h
->file_name_len
])
944 && (last_component (file_name
) == file_name
+ h
->file_name_len
+ 1))
950 if (stat (h
->file_name
, &st
) != 0)
951 stat_error (h
->file_name
);
958 while ((h
= h
->next
) && ! h
->after_links
);
968 extract_link (char *file_name
, int typeflag
)
970 bool interdir_made
= false;
971 char const *link_name
;
974 link_name
= current_stat_info
.link_name
;
976 if (! absolute_names_option
&& contains_dot_dot (link_name
))
977 return create_placeholder_file (file_name
, false, &interdir_made
);
981 struct stat st1
, st2
;
983 int status
= link (link_name
, file_name
);
988 struct delayed_link
*ds
= delayed_link_head
;
989 if (ds
&& lstat (link_name
, &st1
) == 0)
990 for (; ds
; ds
= ds
->next
)
991 if (ds
->dev
== st1
.st_dev
992 && ds
->ino
== st1
.st_ino
993 && timespec_cmp (ds
->mtime
, get_stat_mtime (&st1
)) == 0)
995 struct string_list
*p
= xmalloc (offsetof (struct string_list
, string
)
996 + strlen (file_name
) + 1);
997 strcpy (p
->string
, file_name
);
998 p
->next
= ds
->sources
;
1004 else if ((e
== EEXIST
&& strcmp (link_name
, file_name
) == 0)
1005 || (lstat (link_name
, &st1
) == 0
1006 && lstat (file_name
, &st2
) == 0
1007 && st1
.st_dev
== st2
.st_dev
1008 && st1
.st_ino
== st2
.st_ino
))
1013 while ((rc
= maybe_recoverable (file_name
, &interdir_made
)) == RECOVER_OK
);
1015 if (rc
== RECOVER_SKIP
)
1017 if (!(incremental_option
&& errno
== EEXIST
))
1019 link_error (link_name
, file_name
);
1026 extract_symlink (char *file_name
, int typeflag
)
1029 bool interdir_made
= false;
1031 if (! absolute_names_option
1032 && (IS_ABSOLUTE_FILE_NAME (current_stat_info
.link_name
)
1033 || contains_dot_dot (current_stat_info
.link_name
)))
1034 return create_placeholder_file (file_name
, true, &interdir_made
);
1036 while (symlink (current_stat_info
.link_name
, file_name
))
1037 switch (maybe_recoverable (file_name
, &interdir_made
))
1046 symlink_error (current_stat_info
.link_name
, file_name
);
1050 set_stat (file_name
, ¤t_stat_info
, NULL
, 0, 0, SYMTYPE
);
1054 static int warned_once
;
1059 WARNOPT (WARN_SYMBOLIC_CAST
,
1061 _("Attempting extraction of symbolic links as hard links")));
1063 return extract_link (file_name
, typeflag
);
1067 #if S_IFCHR || S_IFBLK
1069 extract_node (char *file_name
, int typeflag
)
1071 bool interdir_made
= false;
1072 mode_t mode
= current_stat_info
.stat
.st_mode
& ~ current_umask
;
1073 mode_t invert_permissions
=
1074 0 < same_owner_option
? mode
& (S_IRWXG
| S_IRWXO
) : 0;
1076 while (mknod (file_name
, mode
^ invert_permissions
,
1077 current_stat_info
.stat
.st_rdev
))
1078 switch (maybe_recoverable (file_name
, &interdir_made
))
1087 mknod_error (file_name
);
1091 set_stat (file_name
, ¤t_stat_info
, NULL
, invert_permissions
,
1092 ARCHIVED_PERMSTATUS
, typeflag
);
1097 #if HAVE_MKFIFO || defined mkfifo
1099 extract_fifo (char *file_name
, int typeflag
)
1102 bool interdir_made
= false;
1103 mode_t mode
= current_stat_info
.stat
.st_mode
& ~ current_umask
;
1104 mode_t invert_permissions
=
1105 0 < same_owner_option
? mode
& (S_IRWXG
| S_IRWXO
) : 0;
1107 while ((status
= mkfifo (file_name
, mode
)) != 0)
1108 switch (maybe_recoverable (file_name
, &interdir_made
))
1117 mkfifo_error (file_name
);
1121 set_stat (file_name
, ¤t_stat_info
, NULL
, invert_permissions
,
1122 ARCHIVED_PERMSTATUS
, typeflag
);
1128 extract_volhdr (char *file_name
, int typeflag
)
1135 extract_failure (char *file_name
, int typeflag
)
1140 typedef int (*tar_extractor_t
) (char *file_name
, int typeflag
);
1144 /* Prepare to extract a file. Find extractor function.
1145 Return zero if extraction should not proceed. */
1148 prepare_to_extract (char const *file_name
, int typeflag
, tar_extractor_t
*fun
)
1152 if (EXTRACT_OVER_PIPE
)
1155 /* Select the extractor */
1158 case GNUTYPE_SPARSE
:
1159 *fun
= extract_file
;
1166 /* Appears to be a file. But BSD tar uses the convention that a slash
1167 suffix means a directory. */
1168 if (current_stat_info
.had_trailing_slash
)
1172 *fun
= extract_file
;
1178 *fun
= extract_symlink
;
1182 *fun
= extract_link
;
1187 current_stat_info
.stat
.st_mode
|= S_IFCHR
;
1188 *fun
= extract_node
;
1194 current_stat_info
.stat
.st_mode
|= S_IFBLK
;
1195 *fun
= extract_node
;
1199 #if HAVE_MKFIFO || defined mkfifo
1201 *fun
= extract_fifo
;
1206 case GNUTYPE_DUMPDIR
:
1208 if (current_stat_info
.is_dumpdir
)
1209 delay_directory_restore_option
= true;
1212 case GNUTYPE_VOLHDR
:
1213 *fun
= extract_volhdr
;
1216 case GNUTYPE_MULTIVOL
:
1218 _("%s: Cannot extract -- file is continued from another volume"),
1219 quotearg_colon (current_stat_info
.file_name
)));
1220 *fun
= extract_failure
;
1223 case GNUTYPE_LONGNAME
:
1224 case GNUTYPE_LONGLINK
:
1225 ERROR ((0, 0, _("Unexpected long name header")));
1226 *fun
= extract_failure
;
1230 WARNOPT (WARN_UNKNOWN_CAST
,
1232 _("%s: Unknown file type `%c', extracted as normal file"),
1233 quotearg_colon (file_name
), typeflag
));
1234 *fun
= extract_file
;
1237 /* Determine whether the extraction should proceed */
1241 switch (old_files_option
)
1243 case UNLINK_FIRST_OLD_FILES
:
1244 if (!remove_any_file (file_name
,
1245 recursive_unlink_option
? RECURSIVE_REMOVE_OPTION
1246 : ORDINARY_REMOVE_OPTION
)
1247 && errno
&& errno
!= ENOENT
)
1249 unlink_error (file_name
);
1254 case KEEP_NEWER_FILES
:
1255 if (file_newer_p (file_name
, ¤t_stat_info
))
1257 WARNOPT (WARN_IGNORE_NEWER
,
1258 (0, 0, _("Current %s is newer or same age"),
1259 quote (file_name
)));
1271 /* Extract a file from the archive. */
1273 extract_archive (void)
1276 tar_extractor_t fun
;
1278 fatal_exit_hook
= extract_finish
;
1280 set_next_block_after (current_header
);
1282 if (!current_stat_info
.file_name
[0]
1283 || (interactive_option
1284 && !confirm ("extract", current_stat_info
.file_name
)))
1290 /* Print the block from current_header and current_stat. */
1292 print_header (¤t_stat_info
, current_header
, -1);
1294 /* Restore stats for all non-ancestor directories, unless
1295 it is an incremental archive.
1296 (see NOTICE in the comment to delay_set_stat above) */
1297 if (!delay_directory_restore_option
)
1298 apply_nonancestor_delayed_set_stat (current_stat_info
.file_name
, 0);
1300 /* Take a safety backup of a previously existing file. */
1303 if (!maybe_backup_file (current_stat_info
.file_name
, 0))
1306 ERROR ((0, e
, _("%s: Was unable to backup this file"),
1307 quotearg_colon (current_stat_info
.file_name
)));
1312 /* Extract the archive entry according to its type. */
1314 typeflag
= sparse_member_p (¤t_stat_info
) ?
1315 GNUTYPE_SPARSE
: current_header
->header
.typeflag
;
1317 if (prepare_to_extract (current_stat_info
.file_name
, typeflag
, &fun
))
1319 if (fun
&& (*fun
) (current_stat_info
.file_name
, typeflag
)
1321 undo_last_backup ();
1328 /* Extract the symbolic links whose final extraction were delayed. */
1330 apply_delayed_links (void)
1332 struct delayed_link
*ds
;
1334 for (ds
= delayed_link_head
; ds
; )
1336 struct string_list
*sources
= ds
->sources
;
1337 char const *valid_source
= 0;
1339 for (sources
= ds
->sources
; sources
; sources
= sources
->next
)
1341 char const *source
= sources
->string
;
1344 /* Make sure the placeholder file is still there. If not,
1345 don't create a link, as the placeholder was probably
1346 removed by a later extraction. */
1347 if (lstat (source
, &st
) == 0
1348 && st
.st_dev
== ds
->dev
1349 && st
.st_ino
== ds
->ino
1350 && timespec_cmp (get_stat_mtime (&st
), ds
->mtime
) == 0)
1352 /* Unlink the placeholder, then create a hard link if possible,
1353 a symbolic link otherwise. */
1354 if (unlink (source
) != 0)
1355 unlink_error (source
);
1356 else if (valid_source
&& link (valid_source
, source
) == 0)
1358 else if (!ds
->is_symlink
)
1360 if (link (ds
->target
, source
) != 0)
1361 link_error (ds
->target
, source
);
1363 else if (symlink (ds
->target
, source
) != 0)
1364 symlink_error (ds
->target
, source
);
1367 struct tar_stat_info st1
;
1368 st1
.stat
.st_uid
= ds
->uid
;
1369 st1
.stat
.st_gid
= ds
->gid
;
1370 set_stat (source
, &st1
, NULL
, 0, 0, SYMTYPE
);
1371 valid_source
= source
;
1376 for (sources
= ds
->sources
; sources
; )
1378 struct string_list
*next
= sources
->next
;
1384 struct delayed_link
*next
= ds
->next
;
1390 delayed_link_head
= 0;
1393 /* Finish the extraction of an archive. */
1395 extract_finish (void)
1397 /* First, fix the status of ordinary directories that need fixing. */
1398 apply_nonancestor_delayed_set_stat ("", 0);
1400 /* Then, apply delayed links, so that they don't affect delayed
1401 directory status-setting for ordinary directories. */
1402 apply_delayed_links ();
1404 /* Finally, fix the status of directories that are ancestors
1405 of delayed links. */
1406 apply_nonancestor_delayed_set_stat ("", 1);
1410 rename_directory (char *src
, char *dst
)
1412 if (rename (src
, dst
))
1419 if (make_directories (dst
))
1421 if (rename (src
, dst
) == 0)
1428 /* FIXME: Fall back to recursive copying */
1434 ERROR ((0, e
, _("Cannot rename %s to %s"),