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 #define ALL_MODE_BITS ((mode_t) ~ (mode_t) 0)
36 #if ! HAVE_FCHMOD && ! defined fchmod
37 # define fchmod(fd, mode) (errno = ENOSYS, -1)
39 #if ! HAVE_FCHOWN && ! defined fchown
40 # define fchown(fd, uid, gid) (errno = ENOSYS, -1)
43 /* Return true if an error number ERR means the system call is
44 supported in this case. */
48 return ! (err
== ENOSYS
50 || (EOPNOTSUPP
!= ENOTSUP
&& err
== EOPNOTSUPP
));
53 /* List of directories whose statuses we need to extract after we've
54 finished extracting their subsidiary files. If you consider each
55 contiguous subsequence of elements of the form [D]?[^D]*, where [D]
56 represents an element where AFTER_LINKS is nonzero and [^D]
57 represents an element where AFTER_LINKS is zero, then the head
58 of the subsequence has the longest name, and each non-head element
59 in the prefix is an ancestor (in the directory hierarchy) of the
62 struct delayed_set_stat
64 /* Next directory in list. */
65 struct delayed_set_stat
*next
;
67 /* Metadata for this directory. */
70 mode_t mode
; /* The desired mode is MODE & ~ current_umask. */
73 struct timespec atime
;
74 struct timespec mtime
;
76 /* An estimate of the directory's current mode, along with a mask
77 specifying which bits of this estimate are known to be correct.
78 If CURRENT_MODE_MASK is zero, CURRENT_MODE's value doesn't
81 mode_t current_mode_mask
;
83 /* This directory is an intermediate directory that was created
84 as an ancestor of some other directory; it was not mentioned
85 in the archive, so do not set its uid, gid, atime, or mtime,
86 and don't alter its mode outside of MODE_RWX. */
89 /* Whether symbolic links should be followed when accessing the
93 /* Do not set the status of this directory until after delayed
97 /* Directory that the name is relative to. */
100 /* Length and contents of name. */
101 size_t file_name_len
;
105 static struct delayed_set_stat
*delayed_set_stat_head
;
107 /* List of links whose creation we have delayed. */
110 /* The next delayed link in the list. */
111 struct delayed_link
*next
;
113 /* The device, inode number and birthtime of the placeholder.
114 birthtime.tv_nsec is negative if the birthtime is not available.
115 Don't use mtime as this would allow for false matches if some
116 other process removes the placeholder. Don't use ctime as
117 this would cause race conditions and other screwups, e.g.,
118 when restoring hard-linked symlinks. */
121 struct timespec birthtime
;
123 /* True if the link is symbolic. */
126 /* The desired metadata, valid only the link is symbolic. */
130 struct timespec atime
;
131 struct timespec mtime
;
133 /* The directory that the sources and target are relative to. */
136 /* A list of sources for this link. The sources are all to be
137 hard-linked together. */
138 struct string_list
*sources
;
140 /* The desired target of the desired link. */
144 static struct delayed_link
*delayed_link_head
;
148 struct string_list
*next
;
152 /* Set up to extract files. */
156 we_are_root
= geteuid () == 0;
157 same_permissions_option
+= we_are_root
;
158 same_owner_option
+= we_are_root
;
160 /* Option -p clears the kernel umask, so it does not affect proper
161 restoration of file permissions. New intermediate directories will
162 comply with umask at start of program. */
164 newdir_umask
= umask (0);
165 if (0 < same_permissions_option
)
169 umask (newdir_umask
); /* restore the kernel umask */
170 current_umask
= newdir_umask
;
174 /* Use fchmod if possible, fchmodat otherwise. */
176 fd_chmod (int fd
, char const *file
, mode_t mode
, int atflag
)
180 int result
= fchmod (fd
, mode
);
181 if (result
== 0 || implemented (errno
))
184 return fchmodat (chdir_fd
, file
, mode
, atflag
);
187 /* Use fchown if possible, fchownat otherwise. */
189 fd_chown (int fd
, char const *file
, uid_t uid
, gid_t gid
, int atflag
)
193 int result
= fchown (fd
, uid
, gid
);
194 if (result
== 0 || implemented (errno
))
197 return fchownat (chdir_fd
, file
, uid
, gid
, atflag
);
200 /* Use fstat if possible, fstatat otherwise. */
202 fd_stat (int fd
, char const *file
, struct stat
*st
, int atflag
)
206 : fstatat (chdir_fd
, file
, st
, atflag
));
209 /* Set the mode for FILE_NAME to MODE.
210 MODE_MASK specifies the bits of MODE that we care about;
211 thus if MODE_MASK is zero, do nothing.
212 If FD is nonnegative, it is a file descriptor for the file.
213 CURRENT_MODE and CURRENT_MODE_MASK specify information known about
214 the file's current mode, using the style of struct delayed_set_stat.
215 TYPEFLAG specifies the type of the file.
216 ATFLAG specifies the flag to use when statting the file. */
218 set_mode (char const *file_name
,
219 mode_t mode
, mode_t mode_mask
, int fd
,
220 mode_t current_mode
, mode_t current_mode_mask
,
221 char typeflag
, int atflag
)
223 if (((current_mode
^ mode
) | ~ current_mode_mask
) & mode_mask
)
225 if (MODE_ALL
& ~ mode_mask
& ~ current_mode_mask
)
228 if (fd_stat (fd
, file_name
, &st
, atflag
) != 0)
230 stat_error (file_name
);
233 current_mode
= st
.st_mode
;
236 current_mode
&= MODE_ALL
;
237 mode
= (current_mode
& ~ mode_mask
) | (mode
& mode_mask
);
239 if (current_mode
!= mode
)
242 fd_chmod (fd
, file_name
, mode
, atflag
) == 0 ? 0 : errno
;
244 /* On Solaris, chmod may fail if we don't have PRIV_ALL, because
245 setuid-root files would otherwise be a backdoor. See
246 http://opensolaris.org/jive/thread.jspa?threadID=95826
248 if (chmod_errno
== EPERM
&& (mode
& S_ISUID
)
249 && priv_set_restore_linkdir () == 0)
252 fd_chmod (fd
, file_name
, mode
, atflag
) == 0 ? 0 : errno
;
253 priv_set_remove_linkdir ();
256 /* Linux fchmodat does not support AT_SYMLINK_NOFOLLOW, and
257 returns ENOTSUP even when operating on non-symlinks, try
258 again with the flag disabled if it does not appear to be
259 supported and if the file is not a symlink. This
260 introduces a race, alas. */
261 if (atflag
&& typeflag
!= SYMTYPE
&& ! implemented (chmod_errno
))
262 chmod_errno
= fd_chmod (fd
, file_name
, mode
, 0) == 0 ? 0 : errno
;
265 && (typeflag
!= SYMTYPE
|| implemented (chmod_errno
)))
268 chmod_error_details (file_name
, mode
);
274 /* Check time after successfully setting FILE_NAME's time stamp to T. */
276 check_time (char const *file_name
, struct timespec t
)
279 WARNOPT (WARN_TIMESTAMP
,
280 (0, 0, _("%s: implausibly old time stamp %s"),
281 file_name
, tartime (t
, true)));
282 else if (timespec_cmp (volume_start_time
, t
) < 0)
286 if (timespec_cmp (now
, t
) < 0)
288 char buf
[TIMESPEC_STRSIZE_BOUND
];
289 struct timespec diff
;
290 diff
.tv_sec
= t
.tv_sec
- now
.tv_sec
;
291 diff
.tv_nsec
= t
.tv_nsec
- now
.tv_nsec
;
292 if (diff
.tv_nsec
< 0)
294 diff
.tv_nsec
+= BILLION
;
297 WARNOPT (WARN_TIMESTAMP
,
298 (0, 0, _("%s: time stamp %s is %s s in the future"),
299 file_name
, tartime (t
, true), code_timespec (diff
, buf
)));
304 /* Restore stat attributes (owner, group, mode and times) for
305 FILE_NAME, using information given in *ST.
306 If FD is nonnegative, it is a file descriptor for the file.
307 CURRENT_MODE and CURRENT_MODE_MASK specify information known about
308 the file's current mode, using the style of struct delayed_set_stat.
309 TYPEFLAG specifies the type of the file.
310 If INTERDIR, this is an intermediate directory.
311 ATFLAG specifies the flag to use when statting the file. */
314 set_stat (char const *file_name
,
315 struct tar_stat_info
const *st
,
316 int fd
, mode_t current_mode
, mode_t current_mode_mask
,
317 char typeflag
, bool interdir
, int atflag
)
319 /* Do the utime before the chmod because some versions of utime are
320 broken and trash the modes of the file. */
322 if (! touch_option
&& ! interdir
)
324 struct timespec ts
[2];
325 if (incremental_option
)
328 ts
[0].tv_nsec
= UTIME_OMIT
;
331 if (fdutimensat (fd
, chdir_fd
, file_name
, ts
, atflag
) == 0)
333 if (incremental_option
)
334 check_time (file_name
, ts
[0]);
335 check_time (file_name
, ts
[1]);
337 else if (typeflag
!= SYMTYPE
|| implemented (errno
))
338 utime_error (file_name
);
341 if (0 < same_owner_option
&& ! interdir
)
343 /* Some systems allow non-root users to give files away. Once this
344 done, it is not possible anymore to change file permissions.
345 However, setting file permissions now would be incorrect, since
346 they would apply to the wrong user, and there would be a race
347 condition. So, don't use systems that allow non-root users to
349 uid_t uid
= st
->stat
.st_uid
;
350 gid_t gid
= st
->stat
.st_gid
;
352 if (fd_chown (fd
, file_name
, uid
, gid
, atflag
) == 0)
354 /* Changing the owner can clear st_mode bits in some cases. */
355 if ((current_mode
| ~ current_mode_mask
) & S_IXUGO
)
356 current_mode_mask
&= ~ (current_mode
& (S_ISUID
| S_ISGID
));
358 else if (typeflag
!= SYMTYPE
|| implemented (errno
))
359 chown_error_details (file_name
, uid
, gid
);
363 st
->stat
.st_mode
& ~ current_umask
,
364 0 < same_permissions_option
&& ! interdir
? MODE_ALL
: MODE_RWX
,
365 fd
, current_mode
, current_mode_mask
, typeflag
, atflag
);
368 /* For each entry H in the leading prefix of entries in HEAD that do
369 not have after_links marked, mark H and fill in its dev and ino
370 members. Assume HEAD && ! HEAD->after_links. */
372 mark_after_links (struct delayed_set_stat
*head
)
374 struct delayed_set_stat
*h
= head
;
381 if (deref_stat (h
->file_name
, &st
) != 0)
382 stat_error (h
->file_name
);
389 while ((h
= h
->next
) && ! h
->after_links
);
392 /* Remember to restore stat attributes (owner, group, mode and times)
393 for the directory FILE_NAME, using information given in *ST,
394 once we stop extracting files into that directory.
396 If ST is null, merely create a placeholder node for an intermediate
397 directory that was created by make_directories.
399 NOTICE: this works only if the archive has usual member order, i.e.
400 directory, then the files in that directory. Incremental archive have
401 somewhat reversed order: first go subdirectories, then all other
402 members. To help cope with this case the variable
403 delay_directory_restore_option is set by prepare_to_extract.
405 If an archive was explicitely created so that its member order is
406 reversed, some directory timestamps can be restored incorrectly,
408 tar --no-recursion -cf archive dir dir/file1 foo dir/file2
411 delay_set_stat (char const *file_name
, struct tar_stat_info
const *st
,
412 mode_t current_mode
, mode_t current_mode_mask
,
413 mode_t mode
, int atflag
)
415 size_t file_name_len
= strlen (file_name
);
416 struct delayed_set_stat
*data
=
417 xmalloc (offsetof (struct delayed_set_stat
, file_name
)
418 + file_name_len
+ 1);
419 data
->next
= delayed_set_stat_head
;
423 data
->dev
= st
->stat
.st_dev
;
424 data
->ino
= st
->stat
.st_ino
;
425 data
->uid
= st
->stat
.st_uid
;
426 data
->gid
= st
->stat
.st_gid
;
427 data
->atime
= st
->atime
;
428 data
->mtime
= st
->mtime
;
430 data
->file_name_len
= file_name_len
;
431 data
->current_mode
= current_mode
;
432 data
->current_mode_mask
= current_mode_mask
;
433 data
->interdir
= ! st
;
434 data
->atflag
= atflag
;
435 data
->after_links
= 0;
436 data
->change_dir
= chdir_current
;
437 strcpy (data
->file_name
, file_name
);
438 delayed_set_stat_head
= data
;
439 if (must_be_dot_or_slash (file_name
))
440 mark_after_links (data
);
443 /* Update the delayed_set_stat info for an intermediate directory
444 created within the file name of DIR. The intermediate directory turned
445 out to be the same as this directory, e.g. due to ".." or symbolic
446 links. *DIR_STAT_INFO is the status of the directory. */
448 repair_delayed_set_stat (char const *dir
,
449 struct stat
const *dir_stat_info
)
451 struct delayed_set_stat
*data
;
452 for (data
= delayed_set_stat_head
; data
; data
= data
->next
)
455 if (fstatat (chdir_fd
, data
->file_name
, &st
, data
->atflag
) != 0)
457 stat_error (data
->file_name
);
461 if (st
.st_dev
== dir_stat_info
->st_dev
462 && st
.st_ino
== dir_stat_info
->st_ino
)
464 data
->dev
= current_stat_info
.stat
.st_dev
;
465 data
->ino
= current_stat_info
.stat
.st_ino
;
466 data
->mode
= current_stat_info
.stat
.st_mode
;
467 data
->uid
= current_stat_info
.stat
.st_uid
;
468 data
->gid
= current_stat_info
.stat
.st_gid
;
469 data
->atime
= current_stat_info
.atime
;
470 data
->mtime
= current_stat_info
.mtime
;
471 data
->current_mode
= st
.st_mode
;
472 data
->current_mode_mask
= ALL_MODE_BITS
;
473 data
->interdir
= false;
478 ERROR ((0, 0, _("%s: Unexpected inconsistency when making directory"),
479 quotearg_colon (dir
)));
482 /* After a file/link/directory creation has failed, see if
483 it's because some required directory was not present, and if so,
484 create all required directories. Return zero if all the required
485 directories were created, nonzero (issuing a diagnostic) otherwise.
486 Set *INTERDIR_MADE if at least one directory was created. */
488 make_directories (char *file_name
, bool *interdir_made
)
490 char *cursor0
= file_name
+ FILE_SYSTEM_PREFIX_LEN (file_name
);
491 char *cursor
; /* points into the file name */
493 for (cursor
= cursor0
; *cursor
; cursor
++)
499 if (! ISSLASH (*cursor
))
502 /* Avoid mkdir of empty string, if leading or double '/'. */
504 if (cursor
== cursor0
|| ISSLASH (cursor
[-1]))
507 /* Avoid mkdir where last part of file name is "." or "..". */
509 if (cursor
[-1] == '.'
510 && (cursor
== cursor0
+ 1 || ISSLASH (cursor
[-2])
511 || (cursor
[-2] == '.'
512 && (cursor
== cursor0
+ 2 || ISSLASH (cursor
[-3])))))
515 *cursor
= '\0'; /* truncate the name there */
516 desired_mode
= MODE_RWX
& ~ newdir_umask
;
517 mode
= desired_mode
| (we_are_root
? 0 : MODE_WXUSR
);
518 status
= mkdirat (chdir_fd
, file_name
, mode
);
522 /* Create a struct delayed_set_stat even if
523 mode == desired_mode, because
524 repair_delayed_set_stat may need to update the struct. */
525 delay_set_stat (file_name
,
526 0, mode
& ~ current_umask
, MODE_RWX
,
527 desired_mode
, AT_SYMLINK_NOFOLLOW
);
529 print_for_mkdir (file_name
, cursor
- file_name
, desired_mode
);
530 *interdir_made
= true;
532 else if (errno
== EEXIST
)
536 /* Check whether the desired file exists. Even when the
537 file exists, mkdir can fail with some errno value E other
538 than EEXIST, so long as E describes an error condition
539 that also applies. */
542 status
= fstatat (chdir_fd
, file_name
, &st
, 0);
546 mkdir_error (file_name
);
558 /* Return true if FILE_NAME (with status *STP, if STP) is not a
559 directory, and has a time stamp newer than (or equal to) that of
562 file_newer_p (const char *file_name
, struct stat
const *stp
,
563 struct tar_stat_info
*tar_stat
)
569 if (deref_stat (file_name
, &st
) != 0)
573 stat_warn (file_name
);
574 /* Be safer: if the file exists, assume it is newer. */
582 return (! S_ISDIR (stp
->st_mode
)
583 && tar_timespec_cmp (tar_stat
->mtime
, get_stat_mtime (stp
)) <= 0);
588 #define RECOVER_SKIP 2
590 /* Attempt repairing what went wrong with the extraction. Delete an
591 already existing file or create missing intermediate directories.
592 Return RECOVER_OK if we somewhat increased our chances at a successful
593 extraction, RECOVER_NO if there are no chances, and RECOVER_SKIP if the
594 caller should skip extraction of that member. The value of errno is
595 properly restored on returning RECOVER_NO.
597 If REGULAR, the caller was trying to extract onto a regular file.
599 Set *INTERDIR_MADE if an intermediate directory is made as part of
600 the recovery process. */
603 maybe_recoverable (char *file_name
, bool regular
, bool *interdir_made
)
607 struct stat
const *stp
= 0;
616 /* With open ("symlink", O_NOFOLLOW|...), POSIX says errno == ELOOP,
617 but some operating systems do not conform to the standard. */
619 /* NetBSD uses errno == EFTYPE; see <http://gnats.netbsd.org/43154>. */
622 /* FreeBSD 8.1 uses errno == EMLINK. */
624 /* Tru64 5.1B uses errno == ENOTSUP. */
628 || old_files_option
!= OVERWRITE_OLD_FILES
|| dereference_option
)
630 if (strchr (file_name
, '/'))
632 if (deref_stat (file_name
, &st
) != 0)
637 /* The caller tried to open a symbolic link with O_NOFOLLOW.
638 Fall through, treating it as an already-existing file. */
641 /* Remove an old file, if the options allow this. */
643 switch (old_files_option
)
646 WARNOPT (WARN_EXISTING_FILE
,
647 (0, 0, _("%s: skipping existing file"), file_name
));
653 case KEEP_NEWER_FILES
:
654 if (file_newer_p (file_name
, stp
, ¤t_stat_info
))
658 case DEFAULT_OLD_FILES
:
659 case NO_OVERWRITE_DIR_OLD_FILES
:
660 case OVERWRITE_OLD_FILES
:
661 if (0 < remove_any_file (file_name
, ORDINARY_REMOVE_OPTION
))
665 case UNLINK_FIRST_OLD_FILES
:
670 /* Attempt creating missing intermediate directories. */
671 if (make_directories (file_name
, interdir_made
) == 0 && *interdir_made
)
676 /* Just say we can't do anything about it... */
684 /* Fix the statuses of all directories whose statuses need fixing, and
685 which are not ancestors of FILE_NAME. If AFTER_LINKS is
686 nonzero, do this for all such directories; otherwise, stop at the
687 first directory that is marked to be fixed up only after delayed
688 links are applied. */
690 apply_nonancestor_delayed_set_stat (char const *file_name
, bool after_links
)
692 size_t file_name_len
= strlen (file_name
);
693 bool check_for_renamed_directories
= 0;
695 while (delayed_set_stat_head
)
697 struct delayed_set_stat
*data
= delayed_set_stat_head
;
698 bool skip_this_one
= 0;
700 mode_t current_mode
= data
->current_mode
;
701 mode_t current_mode_mask
= data
->current_mode_mask
;
703 check_for_renamed_directories
|= data
->after_links
;
705 if (after_links
< data
->after_links
706 || (data
->file_name_len
< file_name_len
707 && file_name
[data
->file_name_len
]
708 && (ISSLASH (file_name
[data
->file_name_len
])
709 || ISSLASH (file_name
[data
->file_name_len
- 1]))
710 && memcmp (file_name
, data
->file_name
, data
->file_name_len
) == 0))
713 chdir_do (data
->change_dir
);
715 if (check_for_renamed_directories
)
717 if (fstatat (chdir_fd
, data
->file_name
, &st
, data
->atflag
) != 0)
719 stat_error (data
->file_name
);
724 current_mode
= st
.st_mode
;
725 current_mode_mask
= ALL_MODE_BITS
;
726 if (! (st
.st_dev
== data
->dev
&& st
.st_ino
== data
->ino
))
729 _("%s: Directory renamed before its status could be extracted"),
730 quotearg_colon (data
->file_name
)));
738 struct tar_stat_info sb
;
739 sb
.stat
.st_mode
= data
->mode
;
740 sb
.stat
.st_uid
= data
->uid
;
741 sb
.stat
.st_gid
= data
->gid
;
742 sb
.atime
= data
->atime
;
743 sb
.mtime
= data
->mtime
;
744 set_stat (data
->file_name
, &sb
,
745 -1, current_mode
, current_mode_mask
,
746 DIRTYPE
, data
->interdir
, data
->atflag
);
749 delayed_set_stat_head
= data
->next
;
756 /* Extractor functions for various member types */
759 extract_dir (char *file_name
, int typeflag
)
763 mode_t current_mode
= 0;
764 mode_t current_mode_mask
= 0;
766 bool interdir_made
= false;
768 /* Save 'root device' to avoid purging mount points. */
769 if (one_file_system_option
&& root_device
== 0)
773 if (fstatat (chdir_fd
, ".", &st
, 0) != 0)
776 root_device
= st
.st_dev
;
779 if (incremental_option
)
780 /* Read the entry and delete files that aren't listed in the archive. */
781 purge_directory (file_name
);
782 else if (typeflag
== GNUTYPE_DUMPDIR
)
785 /* If ownership or permissions will be restored later, create the
786 directory with restrictive permissions at first, so that in the
787 meantime processes owned by other users do not inadvertently
788 create files under this directory that inherit the wrong owner,
789 group, or permissions from the directory. If not root, though,
790 make the directory writeable and searchable at first, so that
791 files can be created under it. */
792 mode
= ((current_stat_info
.stat
.st_mode
793 & (0 < same_owner_option
|| 0 < same_permissions_option
796 | (we_are_root
? 0 : MODE_WXUSR
));
800 status
= mkdirat (chdir_fd
, file_name
, mode
);
803 current_mode
= mode
& ~ current_umask
;
804 current_mode_mask
= MODE_RWX
;
805 atflag
= AT_SYMLINK_NOFOLLOW
;
811 || old_files_option
== DEFAULT_OLD_FILES
812 || old_files_option
== OVERWRITE_OLD_FILES
))
815 if (deref_stat (file_name
, &st
) == 0)
817 current_mode
= st
.st_mode
;
818 current_mode_mask
= ALL_MODE_BITS
;
820 if (S_ISDIR (current_mode
))
824 repair_delayed_set_stat (file_name
, &st
);
833 switch (maybe_recoverable (file_name
, false, &interdir_made
))
844 mkdir_error (file_name
);
853 || old_files_option
== DEFAULT_OLD_FILES
854 || old_files_option
== OVERWRITE_OLD_FILES
)
855 delay_set_stat (file_name
, ¤t_stat_info
,
856 current_mode
, current_mode_mask
,
857 current_stat_info
.stat
.st_mode
, atflag
);
864 open_output_file (char const *file_name
, int typeflag
, mode_t mode
,
865 mode_t
*current_mode
, mode_t
*current_mode_mask
)
868 bool overwriting_old_files
= old_files_option
== OVERWRITE_OLD_FILES
;
869 int openflag
= (O_WRONLY
| O_BINARY
| O_CLOEXEC
| O_NOCTTY
| O_NONBLOCK
871 | (overwriting_old_files
872 ? O_TRUNC
| (dereference_option
? 0 : O_NOFOLLOW
)
875 if (typeflag
== CONTTYPE
)
877 static int conttype_diagnosed
;
879 if (!conttype_diagnosed
)
881 conttype_diagnosed
= 1;
882 WARNOPT (WARN_CONTIGUOUS_CAST
,
883 (0, 0, _("Extracting contiguous files as regular files")));
887 /* If O_NOFOLLOW is needed but does not work, check for a symlink
888 separately. There's a race condition, but that cannot be avoided
889 on hosts lacking O_NOFOLLOW. */
890 if (! O_NOFOLLOW
&& overwriting_old_files
&& ! dereference_option
)
893 if (fstatat (chdir_fd
, file_name
, &st
, AT_SYMLINK_NOFOLLOW
) == 0
894 && S_ISLNK (st
.st_mode
))
901 fd
= openat (chdir_fd
, file_name
, openflag
, mode
);
904 if (overwriting_old_files
)
907 if (fstat (fd
, &st
) != 0)
914 if (! S_ISREG (st
.st_mode
))
920 *current_mode
= st
.st_mode
;
921 *current_mode_mask
= ALL_MODE_BITS
;
925 *current_mode
= mode
& ~ current_umask
;
926 *current_mode_mask
= MODE_RWX
;
934 extract_file (char *file_name
, int typeflag
)
938 union block
*data_block
;
942 bool interdir_made
= false;
943 mode_t mode
= (current_stat_info
.stat
.st_mode
& MODE_RWX
944 & ~ (0 < same_owner_option
? S_IRWXG
| S_IRWXO
: 0));
945 mode_t current_mode
= 0;
946 mode_t current_mode_mask
= 0;
948 if (to_stdout_option
)
950 else if (to_command_option
)
952 fd
= sys_exec_command (file_name
, 'f', ¤t_stat_info
);
961 while ((fd
= open_output_file (file_name
, typeflag
, mode
,
962 ¤t_mode
, ¤t_mode_mask
))
965 int recover
= maybe_recoverable (file_name
, true, &interdir_made
);
966 if (recover
!= RECOVER_OK
)
969 if (recover
== RECOVER_SKIP
)
971 open_error (file_name
);
977 mv_begin_read (¤t_stat_info
);
978 if (current_stat_info
.is_sparse
)
979 sparse_extract_file (fd
, ¤t_stat_info
, &size
);
981 for (size
= current_stat_info
.stat
.st_size
; size
> 0; )
985 /* Locate data, determine max length writeable, write it,
986 block that we have used the data, then check if the write
989 data_block
= find_next_block ();
992 ERROR ((0, 0, _("Unexpected EOF in archive")));
993 break; /* FIXME: What happens, then? */
996 written
= available_space_after (data_block
);
1001 count
= full_write (fd
, data_block
->buffer
, written
);
1004 set_next_block_after ((union block
*)
1005 (data_block
->buffer
+ written
- 1));
1006 if (count
!= written
)
1008 if (!to_command_option
)
1009 write_error_details (file_name
, count
, written
);
1010 /* FIXME: shouldn't we restore from backup? */
1019 /* If writing to stdout, don't try to do anything to the filename;
1020 it doesn't exist, or we don't want to touch it anyway. */
1022 if (to_stdout_option
)
1025 if (! to_command_option
)
1026 set_stat (file_name
, ¤t_stat_info
, fd
,
1027 current_mode
, current_mode_mask
, typeflag
, false,
1028 (old_files_option
== OVERWRITE_OLD_FILES
1029 ? 0 : AT_SYMLINK_NOFOLLOW
));
1031 status
= close (fd
);
1033 close_error (file_name
);
1035 if (to_command_option
)
1036 sys_wait_command ();
1041 /* Create a placeholder file with name FILE_NAME, which will be
1042 replaced after other extraction is done by a symbolic link if
1043 IS_SYMLINK is true, and by a hard link otherwise. Set
1044 *INTERDIR_MADE if an intermediate directory is made in the
1048 create_placeholder_file (char *file_name
, bool is_symlink
, bool *interdir_made
)
1053 while ((fd
= openat (chdir_fd
, file_name
, O_WRONLY
| O_CREAT
| O_EXCL
, 0)) < 0)
1055 switch (maybe_recoverable (file_name
, false, interdir_made
))
1064 open_error (file_name
);
1069 if (fstat (fd
, &st
) != 0)
1071 stat_error (file_name
);
1074 else if (close (fd
) != 0)
1075 close_error (file_name
);
1078 struct delayed_set_stat
*h
;
1079 struct delayed_link
*p
=
1080 xmalloc (offsetof (struct delayed_link
, target
)
1081 + strlen (current_stat_info
.link_name
)
1083 p
->next
= delayed_link_head
;
1084 delayed_link_head
= p
;
1087 p
->birthtime
= get_stat_birthtime (&st
);
1088 p
->is_symlink
= is_symlink
;
1091 p
->mode
= current_stat_info
.stat
.st_mode
;
1092 p
->uid
= current_stat_info
.stat
.st_uid
;
1093 p
->gid
= current_stat_info
.stat
.st_gid
;
1094 p
->atime
= current_stat_info
.atime
;
1095 p
->mtime
= current_stat_info
.mtime
;
1097 p
->change_dir
= chdir_current
;
1098 p
->sources
= xmalloc (offsetof (struct string_list
, string
)
1099 + strlen (file_name
) + 1);
1100 p
->sources
->next
= 0;
1101 strcpy (p
->sources
->string
, file_name
);
1102 strcpy (p
->target
, current_stat_info
.link_name
);
1104 h
= delayed_set_stat_head
;
1105 if (h
&& ! h
->after_links
1106 && strncmp (file_name
, h
->file_name
, h
->file_name_len
) == 0
1107 && ISSLASH (file_name
[h
->file_name_len
])
1108 && (last_component (file_name
) == file_name
+ h
->file_name_len
+ 1))
1109 mark_after_links (h
);
1118 extract_link (char *file_name
, int typeflag
)
1120 bool interdir_made
= false;
1121 char const *link_name
;
1124 link_name
= current_stat_info
.link_name
;
1126 if (! absolute_names_option
&& contains_dot_dot (link_name
))
1127 return create_placeholder_file (file_name
, false, &interdir_made
);
1131 struct stat st1
, st2
;
1133 int status
= linkat (chdir_fd
, link_name
, chdir_fd
, file_name
, 0);
1138 struct delayed_link
*ds
= delayed_link_head
;
1140 && fstatat (chdir_fd
, link_name
, &st1
, AT_SYMLINK_NOFOLLOW
) == 0)
1141 for (; ds
; ds
= ds
->next
)
1142 if (ds
->change_dir
== chdir_current
1143 && ds
->dev
== st1
.st_dev
1144 && ds
->ino
== st1
.st_ino
1145 && (timespec_cmp (ds
->birthtime
, get_stat_birthtime (&st1
))
1148 struct string_list
*p
= xmalloc (offsetof (struct string_list
, string
)
1149 + strlen (file_name
) + 1);
1150 strcpy (p
->string
, file_name
);
1151 p
->next
= ds
->sources
;
1157 else if ((e
== EEXIST
&& strcmp (link_name
, file_name
) == 0)
1158 || ((fstatat (chdir_fd
, link_name
, &st1
, AT_SYMLINK_NOFOLLOW
)
1160 && (fstatat (chdir_fd
, file_name
, &st2
, AT_SYMLINK_NOFOLLOW
)
1162 && st1
.st_dev
== st2
.st_dev
1163 && st1
.st_ino
== st2
.st_ino
))
1168 while ((rc
= maybe_recoverable (file_name
, false, &interdir_made
))
1171 if (rc
== RECOVER_SKIP
)
1173 if (!(incremental_option
&& errno
== EEXIST
))
1175 link_error (link_name
, file_name
);
1182 extract_symlink (char *file_name
, int typeflag
)
1185 bool interdir_made
= false;
1187 if (! absolute_names_option
1188 && (IS_ABSOLUTE_FILE_NAME (current_stat_info
.link_name
)
1189 || contains_dot_dot (current_stat_info
.link_name
)))
1190 return create_placeholder_file (file_name
, true, &interdir_made
);
1192 while (symlinkat (current_stat_info
.link_name
, chdir_fd
, file_name
) != 0)
1193 switch (maybe_recoverable (file_name
, false, &interdir_made
))
1202 symlink_error (current_stat_info
.link_name
, file_name
);
1206 set_stat (file_name
, ¤t_stat_info
, -1, 0, 0,
1207 SYMTYPE
, false, AT_SYMLINK_NOFOLLOW
);
1211 static int warned_once
;
1216 WARNOPT (WARN_SYMBOLIC_CAST
,
1218 _("Attempting extraction of symbolic links as hard links")));
1220 return extract_link (file_name
, typeflag
);
1224 #if S_IFCHR || S_IFBLK
1226 extract_node (char *file_name
, int typeflag
)
1228 bool interdir_made
= false;
1229 mode_t mode
= (current_stat_info
.stat
.st_mode
& (MODE_RWX
| S_IFBLK
| S_IFCHR
)
1230 & ~ (0 < same_owner_option
? S_IRWXG
| S_IRWXO
: 0));
1232 while (mknodat (chdir_fd
, file_name
, mode
, current_stat_info
.stat
.st_rdev
)
1234 switch (maybe_recoverable (file_name
, false, &interdir_made
))
1243 mknod_error (file_name
);
1247 set_stat (file_name
, ¤t_stat_info
, -1,
1248 mode
& ~ current_umask
, MODE_RWX
,
1249 typeflag
, false, AT_SYMLINK_NOFOLLOW
);
1254 #if HAVE_MKFIFO || defined mkfifo
1256 extract_fifo (char *file_name
, int typeflag
)
1258 bool interdir_made
= false;
1259 mode_t mode
= (current_stat_info
.stat
.st_mode
& MODE_RWX
1260 & ~ (0 < same_owner_option
? S_IRWXG
| S_IRWXO
: 0));
1262 while (mkfifoat (chdir_fd
, file_name
, mode
) != 0)
1263 switch (maybe_recoverable (file_name
, false, &interdir_made
))
1272 mkfifo_error (file_name
);
1276 set_stat (file_name
, ¤t_stat_info
, -1,
1277 mode
& ~ current_umask
, MODE_RWX
,
1278 typeflag
, false, AT_SYMLINK_NOFOLLOW
);
1284 extract_volhdr (char *file_name
, int typeflag
)
1291 extract_failure (char *file_name
, int typeflag
)
1296 typedef int (*tar_extractor_t
) (char *file_name
, int typeflag
);
1300 /* Prepare to extract a file. Find extractor function.
1301 Return zero if extraction should not proceed. */
1304 prepare_to_extract (char const *file_name
, int typeflag
, tar_extractor_t
*fun
)
1308 if (EXTRACT_OVER_PIPE
)
1311 /* Select the extractor */
1314 case GNUTYPE_SPARSE
:
1315 *fun
= extract_file
;
1322 /* Appears to be a file. But BSD tar uses the convention that a slash
1323 suffix means a directory. */
1324 if (current_stat_info
.had_trailing_slash
)
1328 *fun
= extract_file
;
1334 *fun
= extract_symlink
;
1338 *fun
= extract_link
;
1343 current_stat_info
.stat
.st_mode
|= S_IFCHR
;
1344 *fun
= extract_node
;
1350 current_stat_info
.stat
.st_mode
|= S_IFBLK
;
1351 *fun
= extract_node
;
1355 #if HAVE_MKFIFO || defined mkfifo
1357 *fun
= extract_fifo
;
1362 case GNUTYPE_DUMPDIR
:
1364 if (current_stat_info
.is_dumpdir
)
1365 delay_directory_restore_option
= true;
1368 case GNUTYPE_VOLHDR
:
1369 *fun
= extract_volhdr
;
1372 case GNUTYPE_MULTIVOL
:
1374 _("%s: Cannot extract -- file is continued from another volume"),
1375 quotearg_colon (current_stat_info
.file_name
)));
1376 *fun
= extract_failure
;
1379 case GNUTYPE_LONGNAME
:
1380 case GNUTYPE_LONGLINK
:
1381 ERROR ((0, 0, _("Unexpected long name header")));
1382 *fun
= extract_failure
;
1386 WARNOPT (WARN_UNKNOWN_CAST
,
1388 _("%s: Unknown file type `%c', extracted as normal file"),
1389 quotearg_colon (file_name
), typeflag
));
1390 *fun
= extract_file
;
1393 /* Determine whether the extraction should proceed */
1397 switch (old_files_option
)
1399 case UNLINK_FIRST_OLD_FILES
:
1400 if (!remove_any_file (file_name
,
1401 recursive_unlink_option
? RECURSIVE_REMOVE_OPTION
1402 : ORDINARY_REMOVE_OPTION
)
1403 && errno
&& errno
!= ENOENT
)
1405 unlink_error (file_name
);
1410 case KEEP_NEWER_FILES
:
1411 if (file_newer_p (file_name
, 0, ¤t_stat_info
))
1413 WARNOPT (WARN_IGNORE_NEWER
,
1414 (0, 0, _("Current %s is newer or same age"),
1415 quote (file_name
)));
1427 /* Extract a file from the archive. */
1429 extract_archive (void)
1432 tar_extractor_t fun
;
1434 fatal_exit_hook
= extract_finish
;
1436 set_next_block_after (current_header
);
1438 if (!current_stat_info
.file_name
[0]
1439 || (interactive_option
1440 && !confirm ("extract", current_stat_info
.file_name
)))
1446 /* Print the block from current_header and current_stat. */
1448 print_header (¤t_stat_info
, current_header
, -1);
1450 /* Restore stats for all non-ancestor directories, unless
1451 it is an incremental archive.
1452 (see NOTICE in the comment to delay_set_stat above) */
1453 if (!delay_directory_restore_option
)
1455 int dir
= chdir_current
;
1456 apply_nonancestor_delayed_set_stat (current_stat_info
.file_name
, 0);
1460 /* Take a safety backup of a previously existing file. */
1463 if (!maybe_backup_file (current_stat_info
.file_name
, 0))
1466 ERROR ((0, e
, _("%s: Was unable to backup this file"),
1467 quotearg_colon (current_stat_info
.file_name
)));
1472 /* Extract the archive entry according to its type. */
1474 typeflag
= sparse_member_p (¤t_stat_info
) ?
1475 GNUTYPE_SPARSE
: current_header
->header
.typeflag
;
1477 if (prepare_to_extract (current_stat_info
.file_name
, typeflag
, &fun
))
1479 if (fun
&& (*fun
) (current_stat_info
.file_name
, typeflag
)
1481 undo_last_backup ();
1488 /* Extract the links whose final extraction were delayed. */
1490 apply_delayed_links (void)
1492 struct delayed_link
*ds
;
1494 for (ds
= delayed_link_head
; ds
; )
1496 struct string_list
*sources
= ds
->sources
;
1497 char const *valid_source
= 0;
1499 chdir_do (ds
->change_dir
);
1501 for (sources
= ds
->sources
; sources
; sources
= sources
->next
)
1503 char const *source
= sources
->string
;
1506 /* Make sure the placeholder file is still there. If not,
1507 don't create a link, as the placeholder was probably
1508 removed by a later extraction. */
1509 if (fstatat (chdir_fd
, source
, &st
, AT_SYMLINK_NOFOLLOW
) == 0
1510 && st
.st_dev
== ds
->dev
1511 && st
.st_ino
== ds
->ino
1512 && timespec_cmp (get_stat_birthtime (&st
), ds
->birthtime
) == 0)
1514 /* Unlink the placeholder, then create a hard link if possible,
1515 a symbolic link otherwise. */
1516 if (unlinkat (chdir_fd
, source
, 0) != 0)
1517 unlink_error (source
);
1518 else if (valid_source
1519 && (linkat (chdir_fd
, valid_source
, chdir_fd
, source
, 0)
1522 else if (!ds
->is_symlink
)
1524 if (linkat (chdir_fd
, ds
->target
, chdir_fd
, source
, 0) != 0)
1525 link_error (ds
->target
, source
);
1527 else if (symlinkat (ds
->target
, chdir_fd
, source
) != 0)
1528 symlink_error (ds
->target
, source
);
1531 struct tar_stat_info st1
;
1532 st1
.stat
.st_mode
= ds
->mode
;
1533 st1
.stat
.st_uid
= ds
->uid
;
1534 st1
.stat
.st_gid
= ds
->gid
;
1535 st1
.atime
= ds
->atime
;
1536 st1
.mtime
= ds
->mtime
;
1537 set_stat (source
, &st1
, -1, 0, 0, SYMTYPE
,
1538 false, AT_SYMLINK_NOFOLLOW
);
1539 valid_source
= source
;
1544 for (sources
= ds
->sources
; sources
; )
1546 struct string_list
*next
= sources
->next
;
1552 struct delayed_link
*next
= ds
->next
;
1558 delayed_link_head
= 0;
1561 /* Finish the extraction of an archive. */
1563 extract_finish (void)
1565 /* First, fix the status of ordinary directories that need fixing. */
1566 apply_nonancestor_delayed_set_stat ("", 0);
1568 /* Then, apply delayed links, so that they don't affect delayed
1569 directory status-setting for ordinary directories. */
1570 apply_delayed_links ();
1572 /* Finally, fix the status of directories that are ancestors
1573 of delayed links. */
1574 apply_nonancestor_delayed_set_stat ("", 1);
1578 rename_directory (char *src
, char *dst
)
1580 if (renameat (chdir_fd
, src
, chdir_fd
, dst
) != 0)
1588 if (make_directories (dst
, &interdir_made
) == 0)
1590 if (renameat (chdir_fd
, src
, chdir_fd
, dst
) == 0)
1597 /* FIXME: Fall back to recursive copying */
1603 ERROR ((0, e
, _("Cannot rename %s to %s"),