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 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. */
31 static bool we_are_root
; /* true if our effective uid == 0 */
32 static mode_t newdir_umask
; /* umask when creating new directories */
33 static mode_t current_umask
; /* current umask (which is set to 0 if -p) */
35 /* Status of the permissions of a file that we are extracting. */
38 /* This file may have existed already; its permissions are unknown. */
41 /* This file was created using the permissions from the archive,
42 except with S_IRWXG | S_IRWXO masked out if 0 < same_owner_option. */
45 /* This is an intermediate directory; the archive did not specify
50 /* List of directories whose statuses we need to extract after we've
51 finished extracting their subsidiary files. If you consider each
52 contiguous subsequence of elements of the form [D]?[^D]*, where [D]
53 represents an element where AFTER_LINKS is nonzero and [^D]
54 represents an element where AFTER_LINKS is zero, then the head
55 of the subsequence has the longest name, and each non-head element
56 in the prefix is an ancestor (in the directory hierarchy) of the
59 struct delayed_set_stat
61 struct delayed_set_stat
*next
;
67 struct timespec atime
;
68 struct timespec mtime
;
70 mode_t invert_permissions
;
71 enum permstatus permstatus
;
76 static struct delayed_set_stat
*delayed_set_stat_head
;
78 /* List of links whose creation we have delayed. */
81 /* The next delayed link in the list. */
82 struct delayed_link
*next
;
84 /* The device, inode number and last-modified time of the placeholder. */
87 struct timespec mtime
;
89 /* True if the link is symbolic. */
92 /* The desired owner and group of the link, if it is a symlink. */
96 /* A list of sources for this link. The sources are all to be
97 hard-linked together. */
98 struct string_list
*sources
;
100 /* The desired target of the desired link. */
104 static struct delayed_link
*delayed_link_head
;
108 struct string_list
*next
;
112 /* Set up to extract files. */
116 we_are_root
= geteuid () == 0;
117 same_permissions_option
+= we_are_root
;
118 same_owner_option
+= we_are_root
;
120 /* Option -p clears the kernel umask, so it does not affect proper
121 restoration of file permissions. New intermediate directories will
122 comply with umask at start of program. */
124 newdir_umask
= umask (0);
125 if (0 < same_permissions_option
)
129 umask (newdir_umask
); /* restore the kernel umask */
130 current_umask
= newdir_umask
;
134 /* If restoring permissions, restore the mode for FILE_NAME from
135 information given in *STAT_INFO (where *CUR_INFO gives
136 the current status if CUR_INFO is nonzero); otherwise invert the
137 INVERT_PERMISSIONS bits from the file's current permissions.
138 PERMSTATUS specifies the status of the file's permissions.
139 TYPEFLAG specifies the type of the file. */
141 set_mode (char const *file_name
,
142 struct stat
const *stat_info
,
143 struct stat
const *cur_info
,
144 mode_t invert_permissions
, enum permstatus permstatus
,
150 if (0 < same_permissions_option
151 && permstatus
!= INTERDIR_PERMSTATUS
)
153 mode
= stat_info
->st_mode
;
155 /* If we created the file and it has a mode that we set already
156 with O_CREAT, then its mode is often set correctly already.
157 But if we are changing ownership, the mode's group and and
158 other permission bits were omitted originally, so it's less
159 likely that the mode is OK now. Also, on many hosts, some
160 directories inherit the setgid bits from their parents, so we
161 we must set directories' modes explicitly. */
162 if ((permstatus
== ARCHIVED_PERMSTATUS
163 && ! (mode
& ~ (0 < same_owner_option
? S_IRWXU
: MODE_RWX
)))
164 && typeflag
!= DIRTYPE
165 && typeflag
!= GNUTYPE_DUMPDIR
)
168 else if (! invert_permissions
)
172 /* We must inspect a directory's current permissions, since the
173 directory may have inherited its setgid bit from its parent.
175 INVERT_PERMISSIONS happens to be nonzero only for directories
176 that we created, so there's no point optimizing this code for
181 if (stat (file_name
, &st
) != 0)
183 stat_error (file_name
);
188 mode
= cur_info
->st_mode
^ invert_permissions
;
191 failed
= chmod (file_name
, mode
) != 0;
192 if (failed
&& errno
== EPERM
)
194 /* On Solaris, chmod may fail if we don't have PRIV_ALL. */
195 if (priv_set_restore_linkdir () == 0)
197 failed
= chmod (file_name
, mode
) != 0;
198 priv_set_remove_linkdir ();
202 chmod_error_details (file_name
, mode
);
205 /* Check time after successfully setting FILE_NAME's time stamp to T. */
207 check_time (char const *file_name
, struct timespec t
)
210 WARN ((0, 0, _("%s: implausibly old time stamp %s"),
211 file_name
, tartime (t
, true)));
212 else if (timespec_cmp (volume_start_time
, t
) < 0)
216 if (timespec_cmp (now
, t
) < 0)
218 char buf
[TIMESPEC_STRSIZE_BOUND
];
219 struct timespec diff
;
220 diff
.tv_sec
= t
.tv_sec
- now
.tv_sec
;
221 diff
.tv_nsec
= t
.tv_nsec
- now
.tv_nsec
;
222 if (diff
.tv_nsec
< 0)
224 diff
.tv_nsec
+= BILLION
;
227 WARN ((0, 0, _("%s: time stamp %s is %s s in the future"),
228 file_name
, tartime (t
, true), code_timespec (diff
, buf
)));
233 /* Restore stat attributes (owner, group, mode and times) for
234 FILE_NAME, using information given in *ST.
235 If CUR_INFO is nonzero, *CUR_INFO is the
236 file's current status.
237 If not restoring permissions, invert the
238 INVERT_PERMISSIONS bits from the file's current permissions.
239 PERMSTATUS specifies the status of the file's permissions.
240 TYPEFLAG specifies the type of the file. */
242 /* FIXME: About proper restoration of symbolic link attributes, we still do
243 not have it right. Pretesters' reports tell us we need further study and
244 probably more configuration. For now, just use lchown if it exists, and
245 punt for the rest. Sigh! */
248 set_stat (char const *file_name
,
249 struct tar_stat_info
const *st
,
250 struct stat
const *cur_info
,
251 mode_t invert_permissions
, enum permstatus permstatus
,
254 if (typeflag
!= SYMTYPE
)
256 /* We do the utime before the chmod because some versions of utime are
257 broken and trash the modes of the file. */
259 if (! touch_option
&& permstatus
!= INTERDIR_PERMSTATUS
)
261 /* We set the accessed time to `now', which is really the time we
262 started extracting files, unless incremental_option is used, in
263 which case .st_atime is used. */
265 /* FIXME: incremental_option should set ctime too, but how? */
267 struct timespec ts
[2];
268 if (incremental_option
)
274 if (utimens (file_name
, ts
) != 0)
275 utime_error (file_name
);
278 check_time (file_name
, ts
[0]);
279 check_time (file_name
, ts
[1]);
283 /* Some systems allow non-root users to give files away. Once this
284 done, it is not possible anymore to change file permissions.
285 However, setting file permissions now would be incorrect, since
286 they would apply to the wrong user, and there would be a race
287 condition. So, don't use systems that allow non-root users to
291 if (0 < same_owner_option
&& permstatus
!= INTERDIR_PERMSTATUS
)
293 /* When lchown exists, it should be used to change the attributes of
294 the symbolic link itself. In this case, a mere chown would change
295 the attributes of the file the symbolic link is pointing to, and
296 should be avoided. */
297 int chown_result
= 1;
299 if (typeflag
== SYMTYPE
)
302 chown_result
= lchown (file_name
, st
->stat
.st_uid
, st
->stat
.st_gid
);
307 chown_result
= chown (file_name
, st
->stat
.st_uid
, st
->stat
.st_gid
);
310 if (chown_result
== 0)
312 /* Changing the owner can flip st_mode bits in some cases, so
313 ignore cur_info if it might be obsolete now. */
315 && cur_info
->st_mode
& S_IXUGO
316 && cur_info
->st_mode
& (S_ISUID
| S_ISGID
))
319 else if (chown_result
< 0)
320 chown_error_details (file_name
,
321 st
->stat
.st_uid
, st
->stat
.st_gid
);
324 if (typeflag
!= SYMTYPE
)
325 set_mode (file_name
, &st
->stat
, cur_info
,
326 invert_permissions
, permstatus
, typeflag
);
329 /* Remember to restore stat attributes (owner, group, mode and times)
330 for the directory FILE_NAME, using information given in *ST,
331 once we stop extracting files into that directory.
332 If not restoring permissions, remember to invert the
333 INVERT_PERMISSIONS bits from the file's current permissions.
334 PERMSTATUS specifies the status of the file's permissions.
336 NOTICE: this works only if the archive has usual member order, i.e.
337 directory, then the files in that directory. Incremental archive have
338 somewhat reversed order: first go subdirectories, then all other
339 members. To help cope with this case the variable
340 delay_directory_restore_option is set by prepare_to_extract.
342 If an archive was explicitely created so that its member order is
343 reversed, some directory timestamps can be restored incorrectly,
345 tar --no-recursion -cf archive dir dir/file1 foo dir/file2
348 delay_set_stat (char const *file_name
, struct tar_stat_info
const *st
,
349 mode_t invert_permissions
, enum permstatus permstatus
)
351 size_t file_name_len
= strlen (file_name
);
352 struct delayed_set_stat
*data
=
353 xmalloc (offsetof (struct delayed_set_stat
, file_name
)
354 + file_name_len
+ 1);
355 data
->next
= delayed_set_stat_head
;
356 data
->dev
= st
->stat
.st_dev
;
357 data
->ino
= st
->stat
.st_ino
;
358 data
->mode
= st
->stat
.st_mode
;
359 data
->uid
= st
->stat
.st_uid
;
360 data
->gid
= st
->stat
.st_gid
;
361 data
->atime
= st
->atime
;
362 data
->mtime
= st
->mtime
;
363 data
->file_name_len
= file_name_len
;
364 data
->invert_permissions
= invert_permissions
;
365 data
->permstatus
= permstatus
;
366 data
->after_links
= 0;
367 strcpy (data
->file_name
, file_name
);
368 delayed_set_stat_head
= data
;
371 /* Update the delayed_set_stat info for an intermediate directory
372 created within the file name of DIR. The intermediate directory turned
373 out to be the same as this directory, e.g. due to ".." or symbolic
374 links. *DIR_STAT_INFO is the status of the directory. */
376 repair_delayed_set_stat (char const *dir
,
377 struct stat
const *dir_stat_info
)
379 struct delayed_set_stat
*data
;
380 for (data
= delayed_set_stat_head
; data
; data
= data
->next
)
383 if (stat (data
->file_name
, &st
) != 0)
385 stat_error (data
->file_name
);
389 if (st
.st_dev
== dir_stat_info
->st_dev
390 && st
.st_ino
== dir_stat_info
->st_ino
)
392 data
->dev
= current_stat_info
.stat
.st_dev
;
393 data
->ino
= current_stat_info
.stat
.st_ino
;
394 data
->mode
= current_stat_info
.stat
.st_mode
;
395 data
->uid
= current_stat_info
.stat
.st_uid
;
396 data
->gid
= current_stat_info
.stat
.st_gid
;
397 data
->atime
= current_stat_info
.atime
;
398 data
->mtime
= current_stat_info
.mtime
;
399 data
->invert_permissions
=
400 ((current_stat_info
.stat
.st_mode
^ st
.st_mode
)
401 & MODE_RWX
& ~ current_umask
);
402 data
->permstatus
= ARCHIVED_PERMSTATUS
;
407 ERROR ((0, 0, _("%s: Unexpected inconsistency when making directory"),
408 quotearg_colon (dir
)));
411 /* After a file/link/directory creation has failed, see if
412 it's because some required directory was not present, and if so,
413 create all required directories. Return non-zero if a directory
416 make_directories (char *file_name
)
418 char *cursor0
= file_name
+ FILE_SYSTEM_PREFIX_LEN (file_name
);
419 char *cursor
; /* points into the file name */
420 int did_something
= 0; /* did we do anything yet? */
422 int invert_permissions
;
425 for (cursor
= cursor0
; *cursor
; cursor
++)
427 if (! ISSLASH (*cursor
))
430 /* Avoid mkdir of empty string, if leading or double '/'. */
432 if (cursor
== cursor0
|| ISSLASH (cursor
[-1]))
435 /* Avoid mkdir where last part of file name is "." or "..". */
437 if (cursor
[-1] == '.'
438 && (cursor
== cursor0
+ 1 || ISSLASH (cursor
[-2])
439 || (cursor
[-2] == '.'
440 && (cursor
== cursor0
+ 2 || ISSLASH (cursor
[-3])))))
443 *cursor
= '\0'; /* truncate the name there */
444 mode
= MODE_RWX
& ~ newdir_umask
;
445 invert_permissions
= we_are_root
? 0 : MODE_WXUSR
& ~ mode
;
446 status
= mkdir (file_name
, mode
^ invert_permissions
);
450 /* Create a struct delayed_set_stat even if
451 invert_permissions is zero, because
452 repair_delayed_set_stat may need to update the struct. */
453 delay_set_stat (file_name
,
455 invert_permissions
, INTERDIR_PERMSTATUS
);
457 print_for_mkdir (file_name
, cursor
- file_name
, mode
);
467 continue; /* Directory already exists. */
468 else if ((errno
== ENOSYS
/* Automounted dirs on Solaris return
469 this. Reported by Warren Hyde
470 <Warren.Hyde@motorola.com> */
471 || ERRNO_IS_EACCES
) /* Turbo C mkdir gives a funny errno. */
472 && access (file_name
, W_OK
) == 0)
475 /* Some other error in the mkdir. We return to the caller. */
479 return did_something
; /* tell them to retry if we made one */
483 file_newer_p (const char *file_name
, struct tar_stat_info
*tar_stat
)
487 if (stat (file_name
, &st
))
491 stat_warn (file_name
);
492 /* Be on the safe side: if the file does exist assume it is newer */
497 if (!S_ISDIR (st
.st_mode
)
498 && tar_timespec_cmp (tar_stat
->mtime
, get_stat_mtime (&st
)) <= 0)
507 #define RECOVER_SKIP 2
509 /* Attempt repairing what went wrong with the extraction. Delete an
510 already existing file or create missing intermediate directories.
511 Return RECOVER_OK if we somewhat increased our chances at a successful
512 extraction, RECOVER_NO if there are no chances, and RECOVER_SKIP if the
513 caller should skip extraction of that member. The value of errno is
514 properly restored on returning RECOVER_NO. */
517 maybe_recoverable (char *file_name
, int *interdir_made
)
527 /* Remove an old file, if the options allow this. */
529 switch (old_files_option
)
534 case KEEP_NEWER_FILES
:
535 if (file_newer_p (file_name
, ¤t_stat_info
))
542 case DEFAULT_OLD_FILES
:
543 case NO_OVERWRITE_DIR_OLD_FILES
:
544 case OVERWRITE_OLD_FILES
:
546 int r
= remove_any_file (file_name
, ORDINARY_REMOVE_OPTION
);
548 return r
> 0 ? RECOVER_OK
: RECOVER_NO
;
551 case UNLINK_FIRST_OLD_FILES
:
556 /* Attempt creating missing intermediate directories. */
557 if (! make_directories (file_name
))
566 /* Just say we can't do anything about it... */
572 /* Fix the statuses of all directories whose statuses need fixing, and
573 which are not ancestors of FILE_NAME. If AFTER_LINKS is
574 nonzero, do this for all such directories; otherwise, stop at the
575 first directory that is marked to be fixed up only after delayed
576 links are applied. */
578 apply_nonancestor_delayed_set_stat (char const *file_name
, bool after_links
)
580 size_t file_name_len
= strlen (file_name
);
581 bool check_for_renamed_directories
= 0;
583 while (delayed_set_stat_head
)
585 struct delayed_set_stat
*data
= delayed_set_stat_head
;
586 bool skip_this_one
= 0;
588 struct stat
const *cur_info
= 0;
590 check_for_renamed_directories
|= data
->after_links
;
592 if (after_links
< data
->after_links
593 || (data
->file_name_len
< file_name_len
594 && file_name
[data
->file_name_len
]
595 && (ISSLASH (file_name
[data
->file_name_len
])
596 || ISSLASH (file_name
[data
->file_name_len
- 1]))
597 && memcmp (file_name
, data
->file_name
, data
->file_name_len
) == 0))
600 if (check_for_renamed_directories
)
603 if (stat (data
->file_name
, &st
) != 0)
605 stat_error (data
->file_name
);
608 else if (! (st
.st_dev
== data
->dev
&& st
.st_ino
== data
->ino
))
611 _("%s: Directory renamed before its status could be extracted"),
612 quotearg_colon (data
->file_name
)));
619 struct tar_stat_info sb
;
620 sb
.stat
.st_mode
= data
->mode
;
621 sb
.stat
.st_uid
= data
->uid
;
622 sb
.stat
.st_gid
= data
->gid
;
623 sb
.atime
= data
->atime
;
624 sb
.mtime
= data
->mtime
;
625 set_stat (data
->file_name
, &sb
, cur_info
,
626 data
->invert_permissions
, data
->permstatus
, DIRTYPE
);
629 delayed_set_stat_head
= data
->next
;
636 /* Extractor functions for various member types */
639 extract_dir (char *file_name
, int typeflag
)
643 int interdir_made
= 0;
645 /* Save 'root device' to avoid purging mount points. */
646 if (one_file_system_option
&& root_device
== 0)
649 char *dir
= xgetcwd ();
651 if (deref_stat (true, dir
, &st
))
654 root_device
= st
.st_dev
;
658 if (incremental_option
)
659 /* Read the entry and delete files that aren't listed in the archive. */
660 purge_directory (file_name
);
661 else if (typeflag
== GNUTYPE_DUMPDIR
)
664 mode
= current_stat_info
.stat
.st_mode
| (we_are_root
? 0 : MODE_WXUSR
);
665 if (0 < same_owner_option
|| current_stat_info
.stat
.st_mode
& ~ MODE_RWX
)
668 while ((status
= mkdir (file_name
, mode
)))
672 || old_files_option
== DEFAULT_OLD_FILES
673 || old_files_option
== OVERWRITE_OLD_FILES
))
676 if (stat (file_name
, &st
) == 0)
680 repair_delayed_set_stat (file_name
, &st
);
683 if (S_ISDIR (st
.st_mode
))
692 switch (maybe_recoverable (file_name
, &interdir_made
))
703 mkdir_error (file_name
);
712 || old_files_option
== DEFAULT_OLD_FILES
713 || old_files_option
== OVERWRITE_OLD_FILES
)
716 delay_set_stat (file_name
, ¤t_stat_info
,
717 ((mode
^ current_stat_info
.stat
.st_mode
)
718 & MODE_RWX
& ~ current_umask
),
719 ARCHIVED_PERMSTATUS
);
720 else /* For an already existing directory, invert_perms must be 0 */
721 delay_set_stat (file_name
, ¤t_stat_info
,
730 open_output_file (char *file_name
, int typeflag
, mode_t mode
)
733 int openflag
= (O_WRONLY
| O_BINARY
| O_CREAT
734 | (old_files_option
== OVERWRITE_OLD_FILES
739 /* Contiguous files (on the Masscomp) have to specify the size in
740 the open call that creates them. */
742 if (typeflag
== CONTTYPE
)
743 fd
= open (file_name
, openflag
| O_CTG
, mode
, current_stat_info
.stat
.st_size
);
745 fd
= open (file_name
, openflag
, mode
);
747 #else /* not O_CTG */
748 if (typeflag
== CONTTYPE
)
750 static int conttype_diagnosed
;
752 if (!conttype_diagnosed
)
754 conttype_diagnosed
= 1;
755 WARN ((0, 0, _("Extracting contiguous files as regular files")));
758 fd
= open (file_name
, openflag
, mode
);
760 #endif /* not O_CTG */
766 extract_file (char *file_name
, int typeflag
)
770 union block
*data_block
;
774 int interdir_made
= 0;
775 mode_t mode
= current_stat_info
.stat
.st_mode
& MODE_RWX
& ~ current_umask
;
776 mode_t invert_permissions
=
777 0 < same_owner_option
? mode
& (S_IRWXG
| S_IRWXO
) : 0;
779 /* FIXME: deal with protection issues. */
781 if (to_stdout_option
)
783 else if (to_command_option
)
785 fd
= sys_exec_command (file_name
, 'f', ¤t_stat_info
);
794 int recover
= RECOVER_NO
;
796 fd
= open_output_file (file_name
, typeflag
, mode
^ invert_permissions
);
798 && (recover
= maybe_recoverable (file_name
, &interdir_made
))
804 if (recover
== RECOVER_SKIP
)
806 open_error (file_name
);
811 mv_begin (¤t_stat_info
);
812 if (current_stat_info
.is_sparse
)
813 sparse_extract_file (fd
, ¤t_stat_info
, &size
);
815 for (size
= current_stat_info
.stat
.st_size
; size
> 0; )
819 /* Locate data, determine max length writeable, write it,
820 block that we have used the data, then check if the write
823 data_block
= find_next_block ();
826 ERROR ((0, 0, _("Unexpected EOF in archive")));
827 break; /* FIXME: What happens, then? */
830 written
= available_space_after (data_block
);
835 count
= full_write (fd
, data_block
->buffer
, written
);
838 set_next_block_after ((union block
*)
839 (data_block
->buffer
+ written
- 1));
840 if (count
!= written
)
842 if (!to_command_option
)
843 write_error_details (file_name
, count
, written
);
844 /* FIXME: shouldn't we restore from backup? */
853 /* If writing to stdout, don't try to do anything to the filename;
854 it doesn't exist, or we don't want to touch it anyway. */
856 if (to_stdout_option
)
861 close_error (file_name
);
863 if (to_command_option
)
866 set_stat (file_name
, ¤t_stat_info
, NULL
, invert_permissions
,
867 (old_files_option
== OVERWRITE_OLD_FILES
?
868 UNKNOWN_PERMSTATUS
: ARCHIVED_PERMSTATUS
),
874 /* Create a placeholder file with name FILE_NAME, which will be
875 replaced after other extraction is done by a symbolic link if
876 IS_SYMLINK is true, and by a hard link otherwise. Set
877 *INTERDIR_MADE if an intermediate directory is made in the
881 create_placeholder_file (char *file_name
, bool is_symlink
, int *interdir_made
)
886 while ((fd
= open (file_name
, O_WRONLY
| O_CREAT
| O_EXCL
, 0)) < 0)
887 if (! maybe_recoverable (file_name
, interdir_made
))
891 open_error (file_name
);
892 else if (fstat (fd
, &st
) != 0)
894 stat_error (file_name
);
897 else if (close (fd
) != 0)
898 close_error (file_name
);
901 struct delayed_set_stat
*h
;
902 struct delayed_link
*p
=
903 xmalloc (offsetof (struct delayed_link
, target
)
904 + strlen (current_stat_info
.link_name
)
906 p
->next
= delayed_link_head
;
907 delayed_link_head
= p
;
910 p
->mtime
= get_stat_mtime (&st
);
911 p
->is_symlink
= is_symlink
;
914 p
->uid
= current_stat_info
.stat
.st_uid
;
915 p
->gid
= current_stat_info
.stat
.st_gid
;
917 p
->sources
= xmalloc (offsetof (struct string_list
, string
)
918 + strlen (file_name
) + 1);
919 p
->sources
->next
= 0;
920 strcpy (p
->sources
->string
, file_name
);
921 strcpy (p
->target
, current_stat_info
.link_name
);
923 h
= delayed_set_stat_head
;
924 if (h
&& ! h
->after_links
925 && strncmp (file_name
, h
->file_name
, h
->file_name_len
) == 0
926 && ISSLASH (file_name
[h
->file_name_len
])
927 && (last_component (file_name
) == file_name
+ h
->file_name_len
+ 1))
933 if (stat (h
->file_name
, &st
) != 0)
934 stat_error (h
->file_name
);
941 while ((h
= h
->next
) && ! h
->after_links
);
951 extract_link (char *file_name
, int typeflag
)
953 int interdir_made
= 0;
954 char const *link_name
;
956 link_name
= current_stat_info
.link_name
;
958 if (! absolute_names_option
&& contains_dot_dot (link_name
))
959 return create_placeholder_file (file_name
, false, &interdir_made
);
963 struct stat st1
, st2
;
965 int status
= link (link_name
, file_name
);
970 struct delayed_link
*ds
= delayed_link_head
;
971 if (ds
&& lstat (link_name
, &st1
) == 0)
972 for (; ds
; ds
= ds
->next
)
973 if (ds
->dev
== st1
.st_dev
974 && ds
->ino
== st1
.st_ino
975 && timespec_cmp (ds
->mtime
, get_stat_mtime (&st1
)) == 0)
977 struct string_list
*p
= xmalloc (offsetof (struct string_list
, string
)
978 + strlen (file_name
) + 1);
979 strcpy (p
->string
, file_name
);
980 p
->next
= ds
->sources
;
986 else if ((e
== EEXIST
&& strcmp (link_name
, file_name
) == 0)
987 || (lstat (link_name
, &st1
) == 0
988 && lstat (file_name
, &st2
) == 0
989 && st1
.st_dev
== st2
.st_dev
990 && st1
.st_ino
== st2
.st_ino
))
995 while (maybe_recoverable (file_name
, &interdir_made
));
997 if (!(incremental_option
&& errno
== EEXIST
))
999 link_error (link_name
, file_name
);
1006 extract_symlink (char *file_name
, int typeflag
)
1010 int interdir_made
= 0;
1012 if (! absolute_names_option
1013 && (IS_ABSOLUTE_FILE_NAME (current_stat_info
.link_name
)
1014 || contains_dot_dot (current_stat_info
.link_name
)))
1015 return create_placeholder_file (file_name
, true, &interdir_made
);
1017 while ((status
= symlink (current_stat_info
.link_name
, file_name
)))
1018 if (!maybe_recoverable (file_name
, &interdir_made
))
1022 set_stat (file_name
, ¤t_stat_info
, NULL
, 0, 0, SYMTYPE
);
1024 symlink_error (current_stat_info
.link_name
, file_name
);
1028 static int warned_once
;
1033 WARN ((0, 0, _("Attempting extraction of symbolic links as hard links")));
1035 return extract_link (file_name
, typeflag
);
1039 #if S_IFCHR || S_IFBLK
1041 extract_node (char *file_name
, int typeflag
)
1044 int interdir_made
= 0;
1045 mode_t mode
= current_stat_info
.stat
.st_mode
& ~ current_umask
;
1046 mode_t invert_permissions
=
1047 0 < same_owner_option
? mode
& (S_IRWXG
| S_IRWXO
) : 0;
1050 status
= mknod (file_name
, mode
^ invert_permissions
,
1051 current_stat_info
.stat
.st_rdev
);
1052 while (status
&& maybe_recoverable (file_name
, &interdir_made
));
1055 mknod_error (file_name
);
1057 set_stat (file_name
, ¤t_stat_info
, NULL
, invert_permissions
,
1058 ARCHIVED_PERMSTATUS
, typeflag
);
1063 #if HAVE_MKFIFO || defined mkfifo
1065 extract_fifo (char *file_name
, int typeflag
)
1068 int interdir_made
= 0;
1069 mode_t mode
= current_stat_info
.stat
.st_mode
& ~ current_umask
;
1070 mode_t invert_permissions
=
1071 0 < same_owner_option
? mode
& (S_IRWXG
| S_IRWXO
) : 0;
1073 while ((status
= mkfifo (file_name
, mode
)) != 0)
1074 if (!maybe_recoverable (file_name
, &interdir_made
))
1078 set_stat (file_name
, ¤t_stat_info
, NULL
, invert_permissions
,
1079 ARCHIVED_PERMSTATUS
, typeflag
);
1081 mkfifo_error (file_name
);
1087 extract_volhdr (char *file_name
, int typeflag
)
1090 fprintf (stdlis
, _("Reading %s\n"), quote (current_stat_info
.file_name
));
1096 extract_failure (char *file_name
, int typeflag
)
1101 typedef int (*tar_extractor_t
) (char *file_name
, int typeflag
);
1105 /* Prepare to extract a file. Find extractor function.
1106 Return zero if extraction should not proceed. */
1109 prepare_to_extract (char const *file_name
, int typeflag
, tar_extractor_t
*fun
)
1113 if (EXTRACT_OVER_PIPE
)
1116 /* Select the extractor */
1119 case GNUTYPE_SPARSE
:
1120 *fun
= extract_file
;
1127 /* Appears to be a file. But BSD tar uses the convention that a slash
1128 suffix means a directory. */
1129 if (current_stat_info
.had_trailing_slash
)
1133 *fun
= extract_file
;
1139 *fun
= extract_symlink
;
1143 *fun
= extract_link
;
1148 current_stat_info
.stat
.st_mode
|= S_IFCHR
;
1149 *fun
= extract_node
;
1155 current_stat_info
.stat
.st_mode
|= S_IFBLK
;
1156 *fun
= extract_node
;
1160 #if HAVE_MKFIFO || defined mkfifo
1162 *fun
= extract_fifo
;
1167 case GNUTYPE_DUMPDIR
:
1169 if (current_stat_info
.is_dumpdir
)
1170 delay_directory_restore_option
= true;
1173 case GNUTYPE_VOLHDR
:
1174 *fun
= extract_volhdr
;
1177 case GNUTYPE_MULTIVOL
:
1179 _("%s: Cannot extract -- file is continued from another volume"),
1180 quotearg_colon (current_stat_info
.file_name
)));
1181 *fun
= extract_failure
;
1184 case GNUTYPE_LONGNAME
:
1185 case GNUTYPE_LONGLINK
:
1186 ERROR ((0, 0, _("Unexpected long name header")));
1187 *fun
= extract_failure
;
1192 _("%s: Unknown file type `%c', extracted as normal file"),
1193 quotearg_colon (file_name
), typeflag
));
1194 *fun
= extract_file
;
1197 /* Determine whether the extraction should proceed */
1201 switch (old_files_option
)
1203 case UNLINK_FIRST_OLD_FILES
:
1204 if (!remove_any_file (file_name
,
1205 recursive_unlink_option
? RECURSIVE_REMOVE_OPTION
1206 : ORDINARY_REMOVE_OPTION
)
1207 && errno
&& errno
!= ENOENT
)
1209 unlink_error (file_name
);
1214 case KEEP_NEWER_FILES
:
1215 if (file_newer_p (file_name
, ¤t_stat_info
))
1217 WARN ((0, 0, _("Current %s is newer or same age"),
1218 quote (file_name
)));
1230 /* Extract a file from the archive. */
1232 extract_archive (void)
1235 tar_extractor_t fun
;
1237 /* Try to disable the ability to unlink a directory. */
1238 priv_set_remove_linkdir ();
1240 set_next_block_after (current_header
);
1241 decode_header (current_header
, ¤t_stat_info
, ¤t_format
, 1);
1242 if (!current_stat_info
.file_name
[0]
1243 || (interactive_option
1244 && !confirm ("extract", current_stat_info
.file_name
)))
1250 /* Print the block from current_header and current_stat. */
1252 print_header (¤t_stat_info
, -1);
1254 /* Restore stats for all non-ancestor directories, unless
1255 it is an incremental archive.
1256 (see NOTICE in the comment to delay_set_stat above) */
1257 if (!delay_directory_restore_option
)
1258 apply_nonancestor_delayed_set_stat (current_stat_info
.file_name
, 0);
1260 /* Take a safety backup of a previously existing file. */
1263 if (!maybe_backup_file (current_stat_info
.file_name
, 0))
1266 ERROR ((0, e
, _("%s: Was unable to backup this file"),
1267 quotearg_colon (current_stat_info
.file_name
)));
1272 /* Extract the archive entry according to its type. */
1274 typeflag
= sparse_member_p (¤t_stat_info
) ?
1275 GNUTYPE_SPARSE
: current_header
->header
.typeflag
;
1277 if (prepare_to_extract (current_stat_info
.file_name
, typeflag
, &fun
))
1279 if (fun
&& (*fun
) (current_stat_info
.file_name
, typeflag
)
1281 undo_last_backup ();
1288 /* Extract the symbolic links whose final extraction were delayed. */
1290 apply_delayed_links (void)
1292 struct delayed_link
*ds
;
1294 for (ds
= delayed_link_head
; ds
; )
1296 struct string_list
*sources
= ds
->sources
;
1297 char const *valid_source
= 0;
1299 for (sources
= ds
->sources
; sources
; sources
= sources
->next
)
1301 char const *source
= sources
->string
;
1304 /* Make sure the placeholder file is still there. If not,
1305 don't create a link, as the placeholder was probably
1306 removed by a later extraction. */
1307 if (lstat (source
, &st
) == 0
1308 && st
.st_dev
== ds
->dev
1309 && st
.st_ino
== ds
->ino
1310 && timespec_cmp (get_stat_mtime (&st
), ds
->mtime
) == 0)
1312 /* Unlink the placeholder, then create a hard link if possible,
1313 a symbolic link otherwise. */
1314 if (unlink (source
) != 0)
1315 unlink_error (source
);
1316 else if (valid_source
&& link (valid_source
, source
) == 0)
1318 else if (!ds
->is_symlink
)
1320 if (link (ds
->target
, source
) != 0)
1321 link_error (ds
->target
, source
);
1323 else if (symlink (ds
->target
, source
) != 0)
1324 symlink_error (ds
->target
, source
);
1327 struct tar_stat_info st1
;
1328 st1
.stat
.st_uid
= ds
->uid
;
1329 st1
.stat
.st_gid
= ds
->gid
;
1330 set_stat (source
, &st1
, NULL
, 0, 0, SYMTYPE
);
1331 valid_source
= source
;
1336 for (sources
= ds
->sources
; sources
; )
1338 struct string_list
*next
= sources
->next
;
1344 struct delayed_link
*next
= ds
->next
;
1350 delayed_link_head
= 0;
1353 /* Finish the extraction of an archive. */
1355 extract_finish (void)
1357 /* First, fix the status of ordinary directories that need fixing. */
1358 apply_nonancestor_delayed_set_stat ("", 0);
1360 /* Then, apply delayed links, so that they don't affect delayed
1361 directory status-setting for ordinary directories. */
1362 apply_delayed_links ();
1364 /* Finally, fix the status of directories that are ancestors
1365 of delayed links. */
1366 apply_nonancestor_delayed_set_stat ("", 1);
1370 rename_directory (char *src
, char *dst
)
1372 if (rename (src
, dst
))
1379 if (make_directories (dst
))
1381 if (rename (src
, dst
) == 0)
1388 /* FIXME: Fall back to recursive copying */
1394 ERROR ((0, e
, _("Cannot rename %s to %s"),
1406 error (TAREXIT_FAILURE
, 0, _("Error is not recoverable: exiting now"));
1413 error (0, 0, "%s", _("memory exhausted"));