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 ctime of the placeholder. Use
114 ctime, not mtime, to make false matches less likely if some
115 other process removes the placeholder. */
118 struct timespec ctime
;
120 /* True if the link is symbolic. */
123 /* The desired metadata, valid only the link is symbolic. */
127 struct timespec atime
;
128 struct timespec mtime
;
130 /* The directory that the sources and target are relative to. */
133 /* A list of sources for this link. The sources are all to be
134 hard-linked together. */
135 struct string_list
*sources
;
137 /* The desired target of the desired link. */
141 static struct delayed_link
*delayed_link_head
;
145 struct string_list
*next
;
149 /* Set up to extract files. */
153 we_are_root
= geteuid () == 0;
154 same_permissions_option
+= we_are_root
;
155 same_owner_option
+= we_are_root
;
157 /* Option -p clears the kernel umask, so it does not affect proper
158 restoration of file permissions. New intermediate directories will
159 comply with umask at start of program. */
161 newdir_umask
= umask (0);
162 if (0 < same_permissions_option
)
166 umask (newdir_umask
); /* restore the kernel umask */
167 current_umask
= newdir_umask
;
171 /* Use fchmod if possible, fchmodat otherwise. */
173 fd_chmod (int fd
, char const *file
, mode_t mode
, int atflag
)
177 int result
= fchmod (fd
, mode
);
178 if (result
== 0 || implemented (errno
))
181 return fchmodat (chdir_fd
, file
, mode
, atflag
);
184 /* Use fchown if possible, fchownat otherwise. */
186 fd_chown (int fd
, char const *file
, uid_t uid
, gid_t gid
, int atflag
)
190 int result
= fchown (fd
, uid
, gid
);
191 if (result
== 0 || implemented (errno
))
194 return fchownat (chdir_fd
, file
, uid
, gid
, atflag
);
197 /* Use fstat if possible, fstatat otherwise. */
199 fd_stat (int fd
, char const *file
, struct stat
*st
, int atflag
)
203 : fstatat (chdir_fd
, file
, st
, atflag
));
206 /* Set the mode for FILE_NAME to MODE.
207 MODE_MASK specifies the bits of MODE that we care about;
208 thus if MODE_MASK is zero, do nothing.
209 If FD is nonnegative, it is a file descriptor for the file.
210 CURRENT_MODE and CURRENT_MODE_MASK specify information known about
211 the file's current mode, using the style of struct delayed_set_stat.
212 TYPEFLAG specifies the type of the file.
213 ATFLAG specifies the flag to use when statting the file. */
215 set_mode (char const *file_name
,
216 mode_t mode
, mode_t mode_mask
, int fd
,
217 mode_t current_mode
, mode_t current_mode_mask
,
218 char typeflag
, int atflag
)
220 if (((current_mode
^ mode
) | ~ current_mode_mask
) & mode_mask
)
222 if (MODE_ALL
& ~ mode_mask
& ~ current_mode_mask
)
225 if (fd_stat (fd
, file_name
, &st
, atflag
) != 0)
227 stat_error (file_name
);
230 current_mode
= st
.st_mode
;
233 current_mode
&= MODE_ALL
;
234 mode
= (current_mode
& ~ mode_mask
) | (mode
& mode_mask
);
236 if (current_mode
!= mode
)
239 fd_chmod (fd
, file_name
, mode
, atflag
) == 0 ? 0 : errno
;
241 /* On Solaris, chmod may fail if we don't have PRIV_ALL, because
242 setuid-root files would otherwise be a backdoor. See
243 http://opensolaris.org/jive/thread.jspa?threadID=95826
245 if (chmod_errno
== EPERM
&& (mode
& S_ISUID
)
246 && priv_set_restore_linkdir () == 0)
249 fd_chmod (fd
, file_name
, mode
, atflag
) == 0 ? 0 : errno
;
250 priv_set_remove_linkdir ();
253 /* Linux fchmodat does not support AT_SYMLINK_NOFOLLOW, and
254 returns ENOTSUP even when operating on non-symlinks, try
255 again with the flag disabled if it does not appear to be
256 supported and if the file is not a symlink. This
257 introduces a race, alas. */
258 if (atflag
&& typeflag
!= SYMTYPE
&& ! implemented (chmod_errno
))
259 chmod_errno
= fd_chmod (fd
, file_name
, mode
, 0) == 0 ? 0 : errno
;
262 && (typeflag
!= SYMTYPE
|| implemented (chmod_errno
)))
265 chmod_error_details (file_name
, mode
);
271 /* Check time after successfully setting FILE_NAME's time stamp to T. */
273 check_time (char const *file_name
, struct timespec t
)
276 WARNOPT (WARN_TIMESTAMP
,
277 (0, 0, _("%s: implausibly old time stamp %s"),
278 file_name
, tartime (t
, true)));
279 else if (timespec_cmp (volume_start_time
, t
) < 0)
283 if (timespec_cmp (now
, t
) < 0)
285 char buf
[TIMESPEC_STRSIZE_BOUND
];
286 struct timespec diff
;
287 diff
.tv_sec
= t
.tv_sec
- now
.tv_sec
;
288 diff
.tv_nsec
= t
.tv_nsec
- now
.tv_nsec
;
289 if (diff
.tv_nsec
< 0)
291 diff
.tv_nsec
+= BILLION
;
294 WARNOPT (WARN_TIMESTAMP
,
295 (0, 0, _("%s: time stamp %s is %s s in the future"),
296 file_name
, tartime (t
, true), code_timespec (diff
, buf
)));
301 /* Restore stat attributes (owner, group, mode and times) for
302 FILE_NAME, using information given in *ST.
303 If FD is nonnegative, it is a file descriptor for the file.
304 CURRENT_MODE and CURRENT_MODE_MASK specify information known about
305 the file's current mode, using the style of struct delayed_set_stat.
306 TYPEFLAG specifies the type of the file.
307 If INTERDIR, this is an intermediate directory.
308 ATFLAG specifies the flag to use when statting the file. */
311 set_stat (char const *file_name
,
312 struct tar_stat_info
const *st
,
313 int fd
, mode_t current_mode
, mode_t current_mode_mask
,
314 char typeflag
, bool interdir
, int atflag
)
316 /* Do the utime before the chmod because some versions of utime are
317 broken and trash the modes of the file. */
319 if (! touch_option
&& ! interdir
)
321 struct timespec ts
[2];
322 if (incremental_option
)
325 ts
[0].tv_nsec
= UTIME_OMIT
;
328 if (fdutimensat (fd
, chdir_fd
, file_name
, ts
, atflag
) == 0)
330 if (incremental_option
)
331 check_time (file_name
, ts
[0]);
332 check_time (file_name
, ts
[1]);
334 else if (typeflag
!= SYMTYPE
|| implemented (errno
))
335 utime_error (file_name
);
338 if (0 < same_owner_option
&& ! interdir
)
340 /* Some systems allow non-root users to give files away. Once this
341 done, it is not possible anymore to change file permissions.
342 However, setting file permissions now would be incorrect, since
343 they would apply to the wrong user, and there would be a race
344 condition. So, don't use systems that allow non-root users to
346 uid_t uid
= st
->stat
.st_uid
;
347 gid_t gid
= st
->stat
.st_gid
;
349 if (fd_chown (fd
, file_name
, uid
, gid
, atflag
) == 0)
351 /* Changing the owner can clear st_mode bits in some cases. */
352 if ((current_mode
| ~ current_mode_mask
) & S_IXUGO
)
353 current_mode_mask
&= ~ (current_mode
& (S_ISUID
| S_ISGID
));
355 else if (typeflag
!= SYMTYPE
|| implemented (errno
))
356 chown_error_details (file_name
, uid
, gid
);
360 st
->stat
.st_mode
& ~ current_umask
,
361 0 < same_permissions_option
&& ! interdir
? MODE_ALL
: MODE_RWX
,
362 fd
, current_mode
, current_mode_mask
, typeflag
, atflag
);
365 /* For each entry H in the leading prefix of entries in HEAD that do
366 not have after_links marked, mark H and fill in its dev and ino
367 members. Assume HEAD && ! HEAD->after_links. */
369 mark_after_links (struct delayed_set_stat
*head
)
371 struct delayed_set_stat
*h
= head
;
378 if (deref_stat (h
->file_name
, &st
) != 0)
379 stat_error (h
->file_name
);
386 while ((h
= h
->next
) && ! h
->after_links
);
389 /* Remember to restore stat attributes (owner, group, mode and times)
390 for the directory FILE_NAME, using information given in *ST,
391 once we stop extracting files into that directory.
393 If ST is null, merely create a placeholder node for an intermediate
394 directory that was created by make_directories.
396 NOTICE: this works only if the archive has usual member order, i.e.
397 directory, then the files in that directory. Incremental archive have
398 somewhat reversed order: first go subdirectories, then all other
399 members. To help cope with this case the variable
400 delay_directory_restore_option is set by prepare_to_extract.
402 If an archive was explicitely created so that its member order is
403 reversed, some directory timestamps can be restored incorrectly,
405 tar --no-recursion -cf archive dir dir/file1 foo dir/file2
408 delay_set_stat (char const *file_name
, struct tar_stat_info
const *st
,
409 mode_t current_mode
, mode_t current_mode_mask
,
410 mode_t mode
, int atflag
)
412 size_t file_name_len
= strlen (file_name
);
413 struct delayed_set_stat
*data
=
414 xmalloc (offsetof (struct delayed_set_stat
, file_name
)
415 + file_name_len
+ 1);
416 data
->next
= delayed_set_stat_head
;
420 data
->dev
= st
->stat
.st_dev
;
421 data
->ino
= st
->stat
.st_ino
;
422 data
->uid
= st
->stat
.st_uid
;
423 data
->gid
= st
->stat
.st_gid
;
424 data
->atime
= st
->atime
;
425 data
->mtime
= st
->mtime
;
427 data
->file_name_len
= file_name_len
;
428 data
->current_mode
= current_mode
;
429 data
->current_mode_mask
= current_mode_mask
;
430 data
->interdir
= ! st
;
431 data
->atflag
= atflag
;
432 data
->after_links
= 0;
433 data
->change_dir
= chdir_current
;
434 strcpy (data
->file_name
, file_name
);
435 delayed_set_stat_head
= data
;
436 if (must_be_dot_or_slash (file_name
))
437 mark_after_links (data
);
440 /* Update the delayed_set_stat info for an intermediate directory
441 created within the file name of DIR. The intermediate directory turned
442 out to be the same as this directory, e.g. due to ".." or symbolic
443 links. *DIR_STAT_INFO is the status of the directory. */
445 repair_delayed_set_stat (char const *dir
,
446 struct stat
const *dir_stat_info
)
448 struct delayed_set_stat
*data
;
449 for (data
= delayed_set_stat_head
; data
; data
= data
->next
)
452 if (fstatat (chdir_fd
, data
->file_name
, &st
, data
->atflag
) != 0)
454 stat_error (data
->file_name
);
458 if (st
.st_dev
== dir_stat_info
->st_dev
459 && st
.st_ino
== dir_stat_info
->st_ino
)
461 data
->dev
= current_stat_info
.stat
.st_dev
;
462 data
->ino
= current_stat_info
.stat
.st_ino
;
463 data
->mode
= current_stat_info
.stat
.st_mode
;
464 data
->uid
= current_stat_info
.stat
.st_uid
;
465 data
->gid
= current_stat_info
.stat
.st_gid
;
466 data
->atime
= current_stat_info
.atime
;
467 data
->mtime
= current_stat_info
.mtime
;
468 data
->current_mode
= st
.st_mode
;
469 data
->current_mode_mask
= ALL_MODE_BITS
;
470 data
->interdir
= false;
475 ERROR ((0, 0, _("%s: Unexpected inconsistency when making directory"),
476 quotearg_colon (dir
)));
479 /* After a file/link/directory creation has failed, see if
480 it's because some required directory was not present, and if so,
481 create all required directories. Return zero if all the required
482 directories were created, nonzero (issuing a diagnostic) otherwise.
483 Set *INTERDIR_MADE if at least one directory was created. */
485 make_directories (char *file_name
, bool *interdir_made
)
487 char *cursor0
= file_name
+ FILE_SYSTEM_PREFIX_LEN (file_name
);
488 char *cursor
; /* points into the file name */
490 for (cursor
= cursor0
; *cursor
; cursor
++)
496 if (! ISSLASH (*cursor
))
499 /* Avoid mkdir of empty string, if leading or double '/'. */
501 if (cursor
== cursor0
|| ISSLASH (cursor
[-1]))
504 /* Avoid mkdir where last part of file name is "." or "..". */
506 if (cursor
[-1] == '.'
507 && (cursor
== cursor0
+ 1 || ISSLASH (cursor
[-2])
508 || (cursor
[-2] == '.'
509 && (cursor
== cursor0
+ 2 || ISSLASH (cursor
[-3])))))
512 *cursor
= '\0'; /* truncate the name there */
513 desired_mode
= MODE_RWX
& ~ newdir_umask
;
514 mode
= desired_mode
| (we_are_root
? 0 : MODE_WXUSR
);
515 status
= mkdirat (chdir_fd
, file_name
, mode
);
519 /* Create a struct delayed_set_stat even if
520 mode == desired_mode, because
521 repair_delayed_set_stat may need to update the struct. */
522 delay_set_stat (file_name
,
523 0, mode
& ~ current_umask
, MODE_RWX
,
524 desired_mode
, AT_SYMLINK_NOFOLLOW
);
526 print_for_mkdir (file_name
, cursor
- file_name
, desired_mode
);
527 *interdir_made
= true;
529 else if (errno
== EEXIST
)
533 /* Check whether the desired file exists. Even when the
534 file exists, mkdir can fail with some errno value E other
535 than EEXIST, so long as E describes an error condition
536 that also applies. */
539 status
= fstatat (chdir_fd
, file_name
, &st
, 0);
543 mkdir_error (file_name
);
555 /* Return true if FILE_NAME (with status *STP, if STP) is not a
556 directory, and has a time stamp newer than (or equal to) that of
559 file_newer_p (const char *file_name
, struct stat
const *stp
,
560 struct tar_stat_info
*tar_stat
)
566 if (deref_stat (file_name
, &st
) != 0)
570 stat_warn (file_name
);
571 /* Be safer: if the file exists, assume it is newer. */
579 return (! S_ISDIR (stp
->st_mode
)
580 && tar_timespec_cmp (tar_stat
->mtime
, get_stat_mtime (stp
)) <= 0);
585 #define RECOVER_SKIP 2
587 /* Attempt repairing what went wrong with the extraction. Delete an
588 already existing file or create missing intermediate directories.
589 Return RECOVER_OK if we somewhat increased our chances at a successful
590 extraction, RECOVER_NO if there are no chances, and RECOVER_SKIP if the
591 caller should skip extraction of that member. The value of errno is
592 properly restored on returning RECOVER_NO.
594 If REGULAR, the caller was trying to extract onto a regular file.
596 Set *INTERDIR_MADE if an intermediate directory is made as part of
597 the recovery process. */
600 maybe_recoverable (char *file_name
, bool regular
, bool *interdir_made
)
604 struct stat
const *stp
= 0;
612 /* With open ("symlink", O_NOFOLLOW|...), POSIX says errno == ELOOP,
613 but FreeBSD through at least 8.1 uses errno == EMLINK. */
616 || old_files_option
!= OVERWRITE_OLD_FILES
|| dereference_option
)
618 if (strchr (file_name
, '/'))
620 if (deref_stat (file_name
, &st
) != 0)
625 /* The caller tried to open a symbolic link with O_NOFOLLOW.
626 Fall through, treating it as an already-existing file. */
629 /* Remove an old file, if the options allow this. */
631 switch (old_files_option
)
636 case KEEP_NEWER_FILES
:
637 if (file_newer_p (file_name
, stp
, ¤t_stat_info
))
641 case DEFAULT_OLD_FILES
:
642 case NO_OVERWRITE_DIR_OLD_FILES
:
643 case OVERWRITE_OLD_FILES
:
644 if (0 < remove_any_file (file_name
, ORDINARY_REMOVE_OPTION
))
648 case UNLINK_FIRST_OLD_FILES
:
653 /* Attempt creating missing intermediate directories. */
654 if (make_directories (file_name
, interdir_made
) == 0 && *interdir_made
)
659 /* Just say we can't do anything about it... */
667 /* Fix the statuses of all directories whose statuses need fixing, and
668 which are not ancestors of FILE_NAME. If AFTER_LINKS is
669 nonzero, do this for all such directories; otherwise, stop at the
670 first directory that is marked to be fixed up only after delayed
671 links are applied. */
673 apply_nonancestor_delayed_set_stat (char const *file_name
, bool after_links
)
675 size_t file_name_len
= strlen (file_name
);
676 bool check_for_renamed_directories
= 0;
678 while (delayed_set_stat_head
)
680 struct delayed_set_stat
*data
= delayed_set_stat_head
;
681 bool skip_this_one
= 0;
683 mode_t current_mode
= data
->current_mode
;
684 mode_t current_mode_mask
= data
->current_mode_mask
;
686 check_for_renamed_directories
|= data
->after_links
;
688 if (after_links
< data
->after_links
689 || (data
->file_name_len
< file_name_len
690 && file_name
[data
->file_name_len
]
691 && (ISSLASH (file_name
[data
->file_name_len
])
692 || ISSLASH (file_name
[data
->file_name_len
- 1]))
693 && memcmp (file_name
, data
->file_name
, data
->file_name_len
) == 0))
696 chdir_do (data
->change_dir
);
698 if (check_for_renamed_directories
)
700 if (fstatat (chdir_fd
, data
->file_name
, &st
, data
->atflag
) != 0)
702 stat_error (data
->file_name
);
707 current_mode
= st
.st_mode
;
708 current_mode_mask
= ALL_MODE_BITS
;
709 if (! (st
.st_dev
== data
->dev
&& st
.st_ino
== data
->ino
))
712 _("%s: Directory renamed before its status could be extracted"),
713 quotearg_colon (data
->file_name
)));
721 struct tar_stat_info sb
;
722 sb
.stat
.st_mode
= data
->mode
;
723 sb
.stat
.st_uid
= data
->uid
;
724 sb
.stat
.st_gid
= data
->gid
;
725 sb
.atime
= data
->atime
;
726 sb
.mtime
= data
->mtime
;
727 set_stat (data
->file_name
, &sb
,
728 -1, current_mode
, current_mode_mask
,
729 DIRTYPE
, data
->interdir
, data
->atflag
);
732 delayed_set_stat_head
= data
->next
;
739 /* Extractor functions for various member types */
742 extract_dir (char *file_name
, int typeflag
)
746 mode_t current_mode
= 0;
747 mode_t current_mode_mask
= 0;
749 bool interdir_made
= false;
751 /* Save 'root device' to avoid purging mount points. */
752 if (one_file_system_option
&& root_device
== 0)
756 if (fstatat (chdir_fd
, ".", &st
, 0) != 0)
759 root_device
= st
.st_dev
;
762 if (incremental_option
)
763 /* Read the entry and delete files that aren't listed in the archive. */
764 purge_directory (file_name
);
765 else if (typeflag
== GNUTYPE_DUMPDIR
)
768 /* If ownership or permissions will be restored later, create the
769 directory with restrictive permissions at first, so that in the
770 meantime processes owned by other users do not inadvertently
771 create files under this directory that inherit the wrong owner,
772 group, or permissions from the directory. If not root, though,
773 make the directory writeable and searchable at first, so that
774 files can be created under it. */
775 mode
= ((current_stat_info
.stat
.st_mode
776 & (0 < same_owner_option
|| 0 < same_permissions_option
779 | (we_are_root
? 0 : MODE_WXUSR
));
783 status
= mkdirat (chdir_fd
, file_name
, mode
);
786 current_mode
= mode
& ~ current_umask
;
787 current_mode_mask
= MODE_RWX
;
788 atflag
= AT_SYMLINK_NOFOLLOW
;
794 || old_files_option
== DEFAULT_OLD_FILES
795 || old_files_option
== OVERWRITE_OLD_FILES
))
798 if (deref_stat (file_name
, &st
) == 0)
800 current_mode
= st
.st_mode
;
801 current_mode_mask
= ALL_MODE_BITS
;
803 if (S_ISDIR (current_mode
))
807 repair_delayed_set_stat (file_name
, &st
);
816 switch (maybe_recoverable (file_name
, false, &interdir_made
))
827 mkdir_error (file_name
);
836 || old_files_option
== DEFAULT_OLD_FILES
837 || old_files_option
== OVERWRITE_OLD_FILES
)
838 delay_set_stat (file_name
, ¤t_stat_info
,
839 current_mode
, current_mode_mask
,
840 current_stat_info
.stat
.st_mode
, atflag
);
847 open_output_file (char const *file_name
, int typeflag
, mode_t mode
,
848 mode_t
*current_mode
, mode_t
*current_mode_mask
)
851 bool overwriting_old_files
= old_files_option
== OVERWRITE_OLD_FILES
;
852 int openflag
= (O_WRONLY
| O_BINARY
| O_CLOEXEC
| O_NOCTTY
| O_NONBLOCK
854 | (overwriting_old_files
855 ? O_TRUNC
| (dereference_option
? 0 : O_NOFOLLOW
)
858 if (typeflag
== CONTTYPE
)
860 static int conttype_diagnosed
;
862 if (!conttype_diagnosed
)
864 conttype_diagnosed
= 1;
865 WARNOPT (WARN_CONTIGUOUS_CAST
,
866 (0, 0, _("Extracting contiguous files as regular files")));
870 /* If O_NOFOLLOW is needed but does not work, check for a symlink
871 separately. There's a race condition, but that cannot be avoided
872 on hosts lacking O_NOFOLLOW. */
873 if (! O_NOFOLLOW
&& overwriting_old_files
&& ! dereference_option
)
876 if (fstatat (chdir_fd
, file_name
, &st
, AT_SYMLINK_NOFOLLOW
) == 0
877 && S_ISLNK (st
.st_mode
))
884 fd
= openat (chdir_fd
, file_name
, openflag
, mode
);
887 if (overwriting_old_files
)
890 if (fstat (fd
, &st
) != 0)
897 if (! S_ISREG (st
.st_mode
))
903 *current_mode
= st
.st_mode
;
904 *current_mode_mask
= ALL_MODE_BITS
;
908 *current_mode
= mode
& ~ current_umask
;
909 *current_mode_mask
= MODE_RWX
;
917 extract_file (char *file_name
, int typeflag
)
921 union block
*data_block
;
925 bool interdir_made
= false;
926 mode_t mode
= (current_stat_info
.stat
.st_mode
& MODE_RWX
927 & ~ (0 < same_owner_option
? S_IRWXG
| S_IRWXO
: 0));
928 mode_t current_mode
= 0;
929 mode_t current_mode_mask
= 0;
931 if (to_stdout_option
)
933 else if (to_command_option
)
935 fd
= sys_exec_command (file_name
, 'f', ¤t_stat_info
);
944 while ((fd
= open_output_file (file_name
, typeflag
, mode
,
945 ¤t_mode
, ¤t_mode_mask
))
948 int recover
= maybe_recoverable (file_name
, true, &interdir_made
);
949 if (recover
!= RECOVER_OK
)
952 if (recover
== RECOVER_SKIP
)
954 open_error (file_name
);
960 mv_begin_read (¤t_stat_info
);
961 if (current_stat_info
.is_sparse
)
962 sparse_extract_file (fd
, ¤t_stat_info
, &size
);
964 for (size
= current_stat_info
.stat
.st_size
; size
> 0; )
968 /* Locate data, determine max length writeable, write it,
969 block that we have used the data, then check if the write
972 data_block
= find_next_block ();
975 ERROR ((0, 0, _("Unexpected EOF in archive")));
976 break; /* FIXME: What happens, then? */
979 written
= available_space_after (data_block
);
984 count
= full_write (fd
, data_block
->buffer
, written
);
987 set_next_block_after ((union block
*)
988 (data_block
->buffer
+ written
- 1));
989 if (count
!= written
)
991 if (!to_command_option
)
992 write_error_details (file_name
, count
, written
);
993 /* FIXME: shouldn't we restore from backup? */
1002 /* If writing to stdout, don't try to do anything to the filename;
1003 it doesn't exist, or we don't want to touch it anyway. */
1005 if (to_stdout_option
)
1008 if (! to_command_option
)
1009 set_stat (file_name
, ¤t_stat_info
, fd
,
1010 current_mode
, current_mode_mask
, typeflag
, false,
1011 (old_files_option
== OVERWRITE_OLD_FILES
1012 ? 0 : AT_SYMLINK_NOFOLLOW
));
1014 status
= close (fd
);
1016 close_error (file_name
);
1018 if (to_command_option
)
1019 sys_wait_command ();
1024 /* Create a placeholder file with name FILE_NAME, which will be
1025 replaced after other extraction is done by a symbolic link if
1026 IS_SYMLINK is true, and by a hard link otherwise. Set
1027 *INTERDIR_MADE if an intermediate directory is made in the
1031 create_placeholder_file (char *file_name
, bool is_symlink
, bool *interdir_made
)
1036 while ((fd
= openat (chdir_fd
, file_name
, O_WRONLY
| O_CREAT
| O_EXCL
, 0)) < 0)
1038 switch (maybe_recoverable (file_name
, false, interdir_made
))
1047 open_error (file_name
);
1052 if (fstat (fd
, &st
) != 0)
1054 stat_error (file_name
);
1057 else if (close (fd
) != 0)
1058 close_error (file_name
);
1061 struct delayed_set_stat
*h
;
1062 struct delayed_link
*p
=
1063 xmalloc (offsetof (struct delayed_link
, target
)
1064 + strlen (current_stat_info
.link_name
)
1066 p
->next
= delayed_link_head
;
1067 delayed_link_head
= p
;
1070 p
->ctime
= get_stat_ctime (&st
);
1071 p
->is_symlink
= is_symlink
;
1074 p
->mode
= current_stat_info
.stat
.st_mode
;
1075 p
->uid
= current_stat_info
.stat
.st_uid
;
1076 p
->gid
= current_stat_info
.stat
.st_gid
;
1077 p
->atime
= current_stat_info
.atime
;
1078 p
->mtime
= current_stat_info
.mtime
;
1080 p
->change_dir
= chdir_current
;
1081 p
->sources
= xmalloc (offsetof (struct string_list
, string
)
1082 + strlen (file_name
) + 1);
1083 p
->sources
->next
= 0;
1084 strcpy (p
->sources
->string
, file_name
);
1085 strcpy (p
->target
, current_stat_info
.link_name
);
1087 h
= delayed_set_stat_head
;
1088 if (h
&& ! h
->after_links
1089 && strncmp (file_name
, h
->file_name
, h
->file_name_len
) == 0
1090 && ISSLASH (file_name
[h
->file_name_len
])
1091 && (last_component (file_name
) == file_name
+ h
->file_name_len
+ 1))
1092 mark_after_links (h
);
1101 extract_link (char *file_name
, int typeflag
)
1103 bool interdir_made
= false;
1104 char const *link_name
;
1107 link_name
= current_stat_info
.link_name
;
1109 if (! absolute_names_option
&& contains_dot_dot (link_name
))
1110 return create_placeholder_file (file_name
, false, &interdir_made
);
1114 struct stat st1
, st2
;
1116 int status
= linkat (chdir_fd
, link_name
, chdir_fd
, file_name
, 0);
1121 struct delayed_link
*ds
= delayed_link_head
;
1123 && fstatat (chdir_fd
, link_name
, &st1
, AT_SYMLINK_NOFOLLOW
) == 0)
1124 for (; ds
; ds
= ds
->next
)
1125 if (ds
->change_dir
== chdir_current
1126 && ds
->dev
== st1
.st_dev
1127 && ds
->ino
== st1
.st_ino
1128 && timespec_cmp (ds
->ctime
, get_stat_ctime (&st1
)) == 0)
1130 struct string_list
*p
= xmalloc (offsetof (struct string_list
, string
)
1131 + strlen (file_name
) + 1);
1132 strcpy (p
->string
, file_name
);
1133 p
->next
= ds
->sources
;
1139 else if ((e
== EEXIST
&& strcmp (link_name
, file_name
) == 0)
1140 || ((fstatat (chdir_fd
, link_name
, &st1
, AT_SYMLINK_NOFOLLOW
)
1142 && (fstatat (chdir_fd
, file_name
, &st2
, AT_SYMLINK_NOFOLLOW
)
1144 && st1
.st_dev
== st2
.st_dev
1145 && st1
.st_ino
== st2
.st_ino
))
1150 while ((rc
= maybe_recoverable (file_name
, false, &interdir_made
))
1153 if (rc
== RECOVER_SKIP
)
1155 if (!(incremental_option
&& errno
== EEXIST
))
1157 link_error (link_name
, file_name
);
1164 extract_symlink (char *file_name
, int typeflag
)
1167 bool interdir_made
= false;
1169 if (! absolute_names_option
1170 && (IS_ABSOLUTE_FILE_NAME (current_stat_info
.link_name
)
1171 || contains_dot_dot (current_stat_info
.link_name
)))
1172 return create_placeholder_file (file_name
, true, &interdir_made
);
1174 while (symlinkat (current_stat_info
.link_name
, chdir_fd
, file_name
) != 0)
1175 switch (maybe_recoverable (file_name
, false, &interdir_made
))
1184 symlink_error (current_stat_info
.link_name
, file_name
);
1188 set_stat (file_name
, ¤t_stat_info
, -1, 0, 0,
1189 SYMTYPE
, false, AT_SYMLINK_NOFOLLOW
);
1193 static int warned_once
;
1198 WARNOPT (WARN_SYMBOLIC_CAST
,
1200 _("Attempting extraction of symbolic links as hard links")));
1202 return extract_link (file_name
, typeflag
);
1206 #if S_IFCHR || S_IFBLK
1208 extract_node (char *file_name
, int typeflag
)
1210 bool interdir_made
= false;
1211 mode_t mode
= (current_stat_info
.stat
.st_mode
& (MODE_RWX
| S_IFBLK
| S_IFCHR
)
1212 & ~ (0 < same_owner_option
? S_IRWXG
| S_IRWXO
: 0));
1214 while (mknodat (chdir_fd
, file_name
, mode
, current_stat_info
.stat
.st_rdev
)
1216 switch (maybe_recoverable (file_name
, false, &interdir_made
))
1225 mknod_error (file_name
);
1229 set_stat (file_name
, ¤t_stat_info
, -1,
1230 mode
& ~ current_umask
, MODE_RWX
,
1231 typeflag
, false, AT_SYMLINK_NOFOLLOW
);
1236 #if HAVE_MKFIFO || defined mkfifo
1238 extract_fifo (char *file_name
, int typeflag
)
1240 bool interdir_made
= false;
1241 mode_t mode
= (current_stat_info
.stat
.st_mode
& MODE_RWX
1242 & ~ (0 < same_owner_option
? S_IRWXG
| S_IRWXO
: 0));
1244 while (mkfifoat (chdir_fd
, file_name
, mode
) != 0)
1245 switch (maybe_recoverable (file_name
, false, &interdir_made
))
1254 mkfifo_error (file_name
);
1258 set_stat (file_name
, ¤t_stat_info
, -1,
1259 mode
& ~ current_umask
, MODE_RWX
,
1260 typeflag
, false, AT_SYMLINK_NOFOLLOW
);
1266 extract_volhdr (char *file_name
, int typeflag
)
1273 extract_failure (char *file_name
, int typeflag
)
1278 typedef int (*tar_extractor_t
) (char *file_name
, int typeflag
);
1282 /* Prepare to extract a file. Find extractor function.
1283 Return zero if extraction should not proceed. */
1286 prepare_to_extract (char const *file_name
, int typeflag
, tar_extractor_t
*fun
)
1290 if (EXTRACT_OVER_PIPE
)
1293 /* Select the extractor */
1296 case GNUTYPE_SPARSE
:
1297 *fun
= extract_file
;
1304 /* Appears to be a file. But BSD tar uses the convention that a slash
1305 suffix means a directory. */
1306 if (current_stat_info
.had_trailing_slash
)
1310 *fun
= extract_file
;
1316 *fun
= extract_symlink
;
1320 *fun
= extract_link
;
1325 current_stat_info
.stat
.st_mode
|= S_IFCHR
;
1326 *fun
= extract_node
;
1332 current_stat_info
.stat
.st_mode
|= S_IFBLK
;
1333 *fun
= extract_node
;
1337 #if HAVE_MKFIFO || defined mkfifo
1339 *fun
= extract_fifo
;
1344 case GNUTYPE_DUMPDIR
:
1346 if (current_stat_info
.is_dumpdir
)
1347 delay_directory_restore_option
= true;
1350 case GNUTYPE_VOLHDR
:
1351 *fun
= extract_volhdr
;
1354 case GNUTYPE_MULTIVOL
:
1356 _("%s: Cannot extract -- file is continued from another volume"),
1357 quotearg_colon (current_stat_info
.file_name
)));
1358 *fun
= extract_failure
;
1361 case GNUTYPE_LONGNAME
:
1362 case GNUTYPE_LONGLINK
:
1363 ERROR ((0, 0, _("Unexpected long name header")));
1364 *fun
= extract_failure
;
1368 WARNOPT (WARN_UNKNOWN_CAST
,
1370 _("%s: Unknown file type `%c', extracted as normal file"),
1371 quotearg_colon (file_name
), typeflag
));
1372 *fun
= extract_file
;
1375 /* Determine whether the extraction should proceed */
1379 switch (old_files_option
)
1381 case UNLINK_FIRST_OLD_FILES
:
1382 if (!remove_any_file (file_name
,
1383 recursive_unlink_option
? RECURSIVE_REMOVE_OPTION
1384 : ORDINARY_REMOVE_OPTION
)
1385 && errno
&& errno
!= ENOENT
)
1387 unlink_error (file_name
);
1392 case KEEP_NEWER_FILES
:
1393 if (file_newer_p (file_name
, 0, ¤t_stat_info
))
1395 WARNOPT (WARN_IGNORE_NEWER
,
1396 (0, 0, _("Current %s is newer or same age"),
1397 quote (file_name
)));
1409 /* Extract a file from the archive. */
1411 extract_archive (void)
1414 tar_extractor_t fun
;
1416 fatal_exit_hook
= extract_finish
;
1418 set_next_block_after (current_header
);
1420 if (!current_stat_info
.file_name
[0]
1421 || (interactive_option
1422 && !confirm ("extract", current_stat_info
.file_name
)))
1428 /* Print the block from current_header and current_stat. */
1430 print_header (¤t_stat_info
, current_header
, -1);
1432 /* Restore stats for all non-ancestor directories, unless
1433 it is an incremental archive.
1434 (see NOTICE in the comment to delay_set_stat above) */
1435 if (!delay_directory_restore_option
)
1437 int dir
= chdir_current
;
1438 apply_nonancestor_delayed_set_stat (current_stat_info
.file_name
, 0);
1442 /* Take a safety backup of a previously existing file. */
1445 if (!maybe_backup_file (current_stat_info
.file_name
, 0))
1448 ERROR ((0, e
, _("%s: Was unable to backup this file"),
1449 quotearg_colon (current_stat_info
.file_name
)));
1454 /* Extract the archive entry according to its type. */
1456 typeflag
= sparse_member_p (¤t_stat_info
) ?
1457 GNUTYPE_SPARSE
: current_header
->header
.typeflag
;
1459 if (prepare_to_extract (current_stat_info
.file_name
, typeflag
, &fun
))
1461 if (fun
&& (*fun
) (current_stat_info
.file_name
, typeflag
)
1463 undo_last_backup ();
1470 /* Extract the links whose final extraction were delayed. */
1472 apply_delayed_links (void)
1474 struct delayed_link
*ds
;
1476 for (ds
= delayed_link_head
; ds
; )
1478 struct string_list
*sources
= ds
->sources
;
1479 char const *valid_source
= 0;
1481 chdir_do (ds
->change_dir
);
1483 for (sources
= ds
->sources
; sources
; sources
= sources
->next
)
1485 char const *source
= sources
->string
;
1488 /* Make sure the placeholder file is still there. If not,
1489 don't create a link, as the placeholder was probably
1490 removed by a later extraction. */
1491 if (fstatat (chdir_fd
, source
, &st
, AT_SYMLINK_NOFOLLOW
) == 0
1492 && st
.st_dev
== ds
->dev
1493 && st
.st_ino
== ds
->ino
1494 && timespec_cmp (get_stat_ctime (&st
), ds
->ctime
) == 0)
1496 /* Unlink the placeholder, then create a hard link if possible,
1497 a symbolic link otherwise. */
1498 if (unlinkat (chdir_fd
, source
, 0) != 0)
1499 unlink_error (source
);
1500 else if (valid_source
1501 && (linkat (chdir_fd
, valid_source
, chdir_fd
, source
, 0)
1504 else if (!ds
->is_symlink
)
1506 if (linkat (chdir_fd
, ds
->target
, chdir_fd
, source
, 0) != 0)
1507 link_error (ds
->target
, source
);
1509 else if (symlinkat (ds
->target
, chdir_fd
, source
) != 0)
1510 symlink_error (ds
->target
, source
);
1513 struct tar_stat_info st1
;
1514 st1
.stat
.st_mode
= ds
->mode
;
1515 st1
.stat
.st_uid
= ds
->uid
;
1516 st1
.stat
.st_gid
= ds
->gid
;
1517 st1
.atime
= ds
->atime
;
1518 st1
.mtime
= ds
->mtime
;
1519 set_stat (source
, &st1
, -1, 0, 0, SYMTYPE
,
1520 false, AT_SYMLINK_NOFOLLOW
);
1521 valid_source
= source
;
1526 for (sources
= ds
->sources
; sources
; )
1528 struct string_list
*next
= sources
->next
;
1534 struct delayed_link
*next
= ds
->next
;
1540 delayed_link_head
= 0;
1543 /* Finish the extraction of an archive. */
1545 extract_finish (void)
1547 /* First, fix the status of ordinary directories that need fixing. */
1548 apply_nonancestor_delayed_set_stat ("", 0);
1550 /* Then, apply delayed links, so that they don't affect delayed
1551 directory status-setting for ordinary directories. */
1552 apply_delayed_links ();
1554 /* Finally, fix the status of directories that are ancestors
1555 of delayed links. */
1556 apply_nonancestor_delayed_set_stat ("", 1);
1560 rename_directory (char *src
, char *dst
)
1562 if (renameat (chdir_fd
, src
, chdir_fd
, dst
) != 0)
1570 if (make_directories (dst
, &interdir_made
) == 0)
1572 if (renameat (chdir_fd
, src
, chdir_fd
, dst
) == 0)
1579 /* FIXME: Fall back to recursive copying */
1585 ERROR ((0, e
, _("Cannot rename %s to %s"),