1 /* Extract files from a tar archive.
3 Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1998, 1999, 2000,
4 2001, 2003, 2004, 2005 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 2, 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) */
33 static bool directories_first
; /* Directory members precede non-directory
34 ones in the archive. This is detected for
35 incremental archives only. This variable
36 helps correctly restore directory
39 /* Status of the permissions of a file that we are extracting. */
42 /* This file may have existed already; its permissions are unknown. */
45 /* This file was created using the permissions from the archive. */
48 /* This is an intermediate directory; the archive did not specify
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 struct delayed_set_stat
*next
;
70 struct timespec atime
;
71 struct timespec mtime
;
73 mode_t invert_permissions
;
74 enum permstatus permstatus
;
79 static struct delayed_set_stat
*delayed_set_stat_head
;
81 /* List of links whose creation we have delayed. */
84 /* The next delayed link in the list. */
85 struct delayed_link
*next
;
87 /* The device, inode number and last-modified time of the placeholder. */
90 struct timespec mtime
;
92 /* True if the link is symbolic. */
95 /* The desired owner and group of the link, if it is a symlink. */
99 /* A list of sources for this link. The sources are all to be
100 hard-linked together. */
101 struct string_list
*sources
;
103 /* The desired target of the desired link. */
107 static struct delayed_link
*delayed_link_head
;
111 struct string_list
*next
;
115 /* Set up to extract files. */
119 we_are_root
= geteuid () == 0;
120 same_permissions_option
+= we_are_root
;
121 same_owner_option
+= we_are_root
;
123 /* Save 'root device' to avoid purging mount points.
124 FIXME: Should the same be done after handling -C option ? */
125 if (one_file_system_option
)
128 char *dir
= xgetcwd ();
130 if (deref_stat (true, dir
, &st
))
133 root_device
= st
.st_dev
;
136 /* Option -p clears the kernel umask, so it does not affect proper
137 restoration of file permissions. New intermediate directories will
138 comply with umask at start of program. */
140 newdir_umask
= umask (0);
141 if (0 < same_permissions_option
)
145 umask (newdir_umask
); /* restore the kernel umask */
146 current_umask
= newdir_umask
;
150 /* If restoring permissions, restore the mode for FILE_NAME from
151 information given in *STAT_INFO (where *CUR_INFO gives
152 the current status if CUR_INFO is nonzero); otherwise invert the
153 INVERT_PERMISSIONS bits from the file's current permissions.
154 PERMSTATUS specifies the status of the file's permissions.
155 TYPEFLAG specifies the type of the file. */
157 set_mode (char const *file_name
,
158 struct stat
const *stat_info
,
159 struct stat
const *cur_info
,
160 mode_t invert_permissions
, enum permstatus permstatus
,
165 if (0 < same_permissions_option
166 && permstatus
!= INTERDIR_PERMSTATUS
)
168 mode
= stat_info
->st_mode
;
170 /* If we created the file and it has a usual mode, then its mode
171 is normally set correctly already. But on many hosts, some
172 directories inherit the setgid bits from their parents, so we
173 we must set directories' modes explicitly. */
174 if (permstatus
== ARCHIVED_PERMSTATUS
175 && ! (mode
& ~ MODE_RWX
)
176 && typeflag
!= DIRTYPE
177 && typeflag
!= GNUTYPE_DUMPDIR
)
180 else if (! invert_permissions
)
184 /* We must inspect a directory's current permissions, since the
185 directory may have inherited its setgid bit from its parent.
187 INVERT_PERMISSIONS happens to be nonzero only for directories
188 that we created, so there's no point optimizing this code for
193 if (stat (file_name
, &st
) != 0)
195 stat_error (file_name
);
200 mode
= cur_info
->st_mode
^ invert_permissions
;
203 if (chmod (file_name
, mode
) != 0)
204 chmod_error_details (file_name
, mode
);
207 /* Check time after successfully setting FILE_NAME's time stamp to T. */
209 check_time (char const *file_name
, struct timespec t
)
212 WARN ((0, 0, _("%s: implausibly old time stamp %s"),
213 file_name
, tartime (t
, true)));
214 else if (timespec_cmp (start_time
, t
) < 0)
218 if (timespec_cmp (now
, t
) < 0)
220 char buf
[TIMESPEC_STRSIZE_BOUND
];
221 struct timespec diff
;
222 diff
.tv_sec
= t
.tv_sec
- now
.tv_sec
;
223 diff
.tv_nsec
= t
.tv_nsec
- now
.tv_nsec
;
224 if (diff
.tv_nsec
< 0)
226 diff
.tv_nsec
+= BILLION
;
229 WARN ((0, 0, _("%s: time stamp %s is %s s in the future"),
230 file_name
, tartime (t
, true), code_timespec (diff
, buf
)));
235 /* Restore stat attributes (owner, group, mode and times) for
236 FILE_NAME, using information given in *ST.
237 If CUR_INFO is nonzero, *CUR_INFO is the
238 file's currernt status.
239 If not restoring permissions, invert the
240 INVERT_PERMISSIONS bits from the file's current permissions.
241 PERMSTATUS specifies the status of the file's permissions.
242 TYPEFLAG specifies the type of the file. */
244 /* FIXME: About proper restoration of symbolic link attributes, we still do
245 not have it right. Pretesters' reports tell us we need further study and
246 probably more configuration. For now, just use lchown if it exists, and
247 punt for the rest. Sigh! */
250 set_stat (char const *file_name
,
251 struct tar_stat_info
const *st
,
252 struct stat
const *cur_info
,
253 mode_t invert_permissions
, enum permstatus permstatus
,
256 if (typeflag
!= SYMTYPE
)
258 /* We do the utime before the chmod because some versions of utime are
259 broken and trash the modes of the file. */
261 if (! touch_option
&& permstatus
!= INTERDIR_PERMSTATUS
)
263 /* We set the accessed time to `now', which is really the time we
264 started extracting files, unless incremental_option is used, in
265 which case .st_atime is used. */
267 /* FIXME: incremental_option should set ctime too, but how? */
269 struct timespec ts
[2];
270 if (incremental_option
)
276 if (utimens (file_name
, ts
) != 0)
277 utime_error (file_name
);
280 check_time (file_name
, ts
[0]);
281 check_time (file_name
, ts
[1]);
285 /* Some systems allow non-root users to give files away. Once this
286 done, it is not possible anymore to change file permissions, so we
287 have to set permissions prior to possibly giving files away. */
289 set_mode (file_name
, &st
->stat
, cur_info
,
290 invert_permissions
, permstatus
, typeflag
);
293 if (0 < same_owner_option
&& permstatus
!= INTERDIR_PERMSTATUS
)
295 /* When lchown exists, it should be used to change the attributes of
296 the symbolic link itself. In this case, a mere chown would change
297 the attributes of the file the symbolic link is pointing to, and
298 should be avoided. */
300 if (typeflag
== SYMTYPE
)
303 if (lchown (file_name
, st
->stat
.st_uid
, st
->stat
.st_gid
) < 0)
304 chown_error_details (file_name
,
305 st
->stat
.st_uid
, st
->stat
.st_gid
);
310 if (chown (file_name
, st
->stat
.st_uid
, st
->stat
.st_gid
) < 0)
311 chown_error_details (file_name
,
312 st
->stat
.st_uid
, st
->stat
.st_gid
);
314 /* On a few systems, and in particular, those allowing to give files
315 away, changing the owner or group destroys the suid or sgid bits.
316 So let's attempt setting these bits once more. */
317 if (st
->stat
.st_mode
& (S_ISUID
| S_ISGID
| S_ISVTX
))
318 set_mode (file_name
, &st
->stat
, 0,
319 invert_permissions
, permstatus
, typeflag
);
324 /* Remember to restore stat attributes (owner, group, mode and times)
325 for the directory FILE_NAME, using information given in *ST,
326 once we stop extracting files into that directory.
327 If not restoring permissions, remember to invert the
328 INVERT_PERMISSIONS bits from the file's current permissions.
329 PERMSTATUS specifies the status of the file's permissions.
331 NOTICE: this works only if the archive has usual member order, i.e.
332 directory, then the files in that directory. Incremental archive have
333 somewhat reversed order: first go subdirectories, then all other
334 members. To help cope with this case the variable directories_first
335 is set by prepare_to_extract.
337 If an archive was explicitely created so that its member order is
338 reversed, some directory timestamps can be restored incorrectly,
340 tar --no-recursion -cf archive dir dir/subdir dir/subdir/file
343 delay_set_stat (char const *file_name
, struct tar_stat_info
const *st
,
344 mode_t invert_permissions
, enum permstatus permstatus
)
346 size_t file_name_len
= strlen (file_name
);
347 struct delayed_set_stat
*data
=
348 xmalloc (offsetof (struct delayed_set_stat
, file_name
)
349 + file_name_len
+ 1);
350 data
->next
= delayed_set_stat_head
;
351 data
->dev
= st
->stat
.st_dev
;
352 data
->ino
= st
->stat
.st_ino
;
353 data
->mode
= st
->stat
.st_mode
;
354 data
->uid
= st
->stat
.st_uid
;
355 data
->gid
= st
->stat
.st_gid
;
356 data
->atime
= st
->atime
;
357 data
->mtime
= st
->mtime
;
358 data
->file_name_len
= file_name_len
;
359 data
->invert_permissions
= invert_permissions
;
360 data
->permstatus
= permstatus
;
361 data
->after_links
= 0;
362 strcpy (data
->file_name
, file_name
);
363 delayed_set_stat_head
= data
;
366 /* Update the delayed_set_stat info for an intermediate directory
367 created within the file name of DIR. The intermediate directory turned
368 out to be the same as this directory, e.g. due to ".." or symbolic
369 links. *DIR_STAT_INFO is the status of the directory. */
371 repair_delayed_set_stat (char const *dir
,
372 struct stat
const *dir_stat_info
)
374 struct delayed_set_stat
*data
;
375 for (data
= delayed_set_stat_head
; data
; data
= data
->next
)
378 if (stat (data
->file_name
, &st
) != 0)
380 stat_error (data
->file_name
);
384 if (st
.st_dev
== dir_stat_info
->st_dev
385 && st
.st_ino
== dir_stat_info
->st_ino
)
387 data
->dev
= current_stat_info
.stat
.st_dev
;
388 data
->ino
= current_stat_info
.stat
.st_ino
;
389 data
->mode
= current_stat_info
.stat
.st_mode
;
390 data
->uid
= current_stat_info
.stat
.st_uid
;
391 data
->gid
= current_stat_info
.stat
.st_gid
;
392 data
->atime
= current_stat_info
.atime
;
393 data
->mtime
= current_stat_info
.mtime
;
394 data
->invert_permissions
=
395 (MODE_RWX
& (current_stat_info
.stat
.st_mode
^ st
.st_mode
));
396 data
->permstatus
= ARCHIVED_PERMSTATUS
;
401 ERROR ((0, 0, _("%s: Unexpected inconsistency when making directory"),
402 quotearg_colon (dir
)));
405 /* After a file/link/directory creation has failed, see if
406 it's because some required directory was not present, and if so,
407 create all required directories. Return non-zero if a directory
410 make_directories (char *file_name
)
412 char *cursor0
= file_name
+ FILE_SYSTEM_PREFIX_LEN (file_name
);
413 char *cursor
; /* points into the file name */
414 int did_something
= 0; /* did we do anything yet? */
416 int invert_permissions
;
420 for (cursor
= cursor0
; *cursor
; cursor
++)
422 if (! ISSLASH (*cursor
))
425 /* Avoid mkdir of empty string, if leading or double '/'. */
427 if (cursor
== cursor0
|| ISSLASH (cursor
[-1]))
430 /* Avoid mkdir where last part of file name is "." or "..". */
432 if (cursor
[-1] == '.'
433 && (cursor
== cursor0
+ 1 || ISSLASH (cursor
[-2])
434 || (cursor
[-2] == '.'
435 && (cursor
== cursor0
+ 2 || ISSLASH (cursor
[-3])))))
438 *cursor
= '\0'; /* truncate the name there */
439 mode
= MODE_RWX
& ~ newdir_umask
;
440 invert_permissions
= we_are_root
? 0 : MODE_WXUSR
& ~ mode
;
441 status
= mkdir (file_name
, mode
^ invert_permissions
);
445 /* Create a struct delayed_set_stat even if
446 invert_permissions is zero, because
447 repair_delayed_set_stat may need to update the struct. */
448 delay_set_stat (file_name
,
449 ¤t_stat_info
/* ignored */,
450 invert_permissions
, INTERDIR_PERMSTATUS
);
452 print_for_mkdir (file_name
, cursor
- file_name
, mode
);
462 continue; /* Directory already exists. */
463 else if ((errno
== ENOSYS
/* Automounted dirs on Solaris return
464 this. Reported by Warren Hyde
465 <Warren.Hyde@motorola.com> */
466 || ERRNO_IS_EACCES
) /* Turbo C mkdir gives a funny errno. */
467 && access (file_name
, W_OK
) == 0)
470 /* Some other error in the mkdir. We return to the caller. */
474 return did_something
; /* tell them to retry if we made one */
478 file_newer_p (const char *file_name
, struct tar_stat_info
*tar_stat
)
482 if (stat (file_name
, &st
))
484 stat_warn (file_name
);
485 /* Be on the safe side: if the file does exist assume it is newer */
486 return errno
!= ENOENT
;
488 if (!S_ISDIR (st
.st_mode
)
489 && tar_timespec_cmp (tar_stat
->mtime
, get_stat_mtime (&st
)) <= 0)
496 /* Attempt repairing what went wrong with the extraction. Delete an
497 already existing file or create missing intermediate directories.
498 Return nonzero if we somewhat increased our chances at a successful
499 extraction. errno is properly restored on zero return. */
501 maybe_recoverable (char *file_name
, int *interdir_made
)
511 /* Remove an old file, if the options allow this. */
513 switch (old_files_option
)
518 case KEEP_NEWER_FILES
:
519 if (file_newer_p (file_name
, ¤t_stat_info
))
526 case DEFAULT_OLD_FILES
:
527 case NO_OVERWRITE_DIR_OLD_FILES
:
528 case OVERWRITE_OLD_FILES
:
530 int r
= remove_any_file (file_name
, ORDINARY_REMOVE_OPTION
);
535 case UNLINK_FIRST_OLD_FILES
:
540 /* Attempt creating missing intermediate directories. */
541 if (! make_directories (file_name
))
550 /* Just say we can't do anything about it... */
556 /* Fix the statuses of all directories whose statuses need fixing, and
557 which are not ancestors of FILE_NAME. If AFTER_LINKS is
558 nonzero, do this for all such directories; otherwise, stop at the
559 first directory that is marked to be fixed up only after delayed
560 links are applied. */
562 apply_nonancestor_delayed_set_stat (char const *file_name
, bool after_links
)
564 size_t file_name_len
= strlen (file_name
);
565 bool check_for_renamed_directories
= 0;
567 while (delayed_set_stat_head
)
569 struct delayed_set_stat
*data
= delayed_set_stat_head
;
570 bool skip_this_one
= 0;
572 struct stat
const *cur_info
= 0;
574 check_for_renamed_directories
|= data
->after_links
;
576 if (after_links
< data
->after_links
577 || (data
->file_name_len
< file_name_len
578 && file_name
[data
->file_name_len
]
579 && (ISSLASH (file_name
[data
->file_name_len
])
580 || ISSLASH (file_name
[data
->file_name_len
- 1]))
581 && memcmp (file_name
, data
->file_name
, data
->file_name_len
) == 0))
584 if (check_for_renamed_directories
)
587 if (stat (data
->file_name
, &st
) != 0)
589 stat_error (data
->file_name
);
592 else if (! (st
.st_dev
== data
->dev
&& st
.st_ino
== data
->ino
))
595 _("%s: Directory renamed before its status could be extracted"),
596 quotearg_colon (data
->file_name
)));
603 struct tar_stat_info st
;
604 st
.stat
.st_mode
= data
->mode
;
605 st
.stat
.st_uid
= data
->uid
;
606 st
.stat
.st_gid
= data
->gid
;
607 st
.atime
= data
->atime
;
608 st
.mtime
= data
->mtime
;
609 set_stat (data
->file_name
, &st
, cur_info
,
610 data
->invert_permissions
, data
->permstatus
, DIRTYPE
);
613 delayed_set_stat_head
= data
->next
;
620 /* Extractor functions for various member types */
623 extract_dir (char *file_name
, int typeflag
)
627 int interdir_made
= 0;
629 if (incremental_option
)
630 /* Read the entry and delete files that aren't listed in the archive. */
631 purge_directory (file_name
);
632 else if (typeflag
== GNUTYPE_DUMPDIR
)
635 mode
= (current_stat_info
.stat
.st_mode
|
636 (we_are_root
? 0 : MODE_WXUSR
)) & MODE_RWX
;
638 while ((status
= mkdir (file_name
, mode
)))
642 || old_files_option
== DEFAULT_OLD_FILES
643 || old_files_option
== OVERWRITE_OLD_FILES
))
646 if (stat (file_name
, &st
) == 0)
650 repair_delayed_set_stat (file_name
, &st
);
653 if (S_ISDIR (st
.st_mode
))
655 mode
= st
.st_mode
& ~ current_umask
;
662 if (maybe_recoverable (file_name
, &interdir_made
))
667 mkdir_error (file_name
);
674 || old_files_option
== DEFAULT_OLD_FILES
675 || old_files_option
== OVERWRITE_OLD_FILES
)
676 delay_set_stat (file_name
, ¤t_stat_info
,
677 MODE_RWX
& (mode
^ current_stat_info
.stat
.st_mode
),
679 ? ARCHIVED_PERMSTATUS
680 : UNKNOWN_PERMSTATUS
));
687 open_output_file (char *file_name
, int typeflag
)
690 int openflag
= (O_WRONLY
| O_BINARY
| O_CREAT
691 | (old_files_option
== OVERWRITE_OLD_FILES
694 mode_t mode
= current_stat_info
.stat
.st_mode
& MODE_RWX
& ~ current_umask
;
697 /* Contiguous files (on the Masscomp) have to specify the size in
698 the open call that creates them. */
700 if (typeflag
== CONTTYPE
)
701 fd
= open (file_name
, openflag
| O_CTG
, mode
, current_stat_info
.stat
.st_size
);
703 fd
= open (file_name
, openflag
, mode
);
705 #else /* not O_CTG */
706 if (typeflag
== CONTTYPE
)
708 static int conttype_diagnosed
;
710 if (!conttype_diagnosed
)
712 conttype_diagnosed
= 1;
713 WARN ((0, 0, _("Extracting contiguous files as regular files")));
716 fd
= open (file_name
, openflag
, mode
);
718 #endif /* not O_CTG */
724 extract_file (char *file_name
, int typeflag
)
728 union block
*data_block
;
732 int interdir_made
= 0;
734 /* FIXME: deal with protection issues. */
736 if (to_stdout_option
)
738 else if (to_command_option
)
740 fd
= sys_exec_command (file_name
, 'f', ¤t_stat_info
);
750 fd
= open_output_file (file_name
, typeflag
);
751 while (fd
< 0 && maybe_recoverable (file_name
, &interdir_made
));
755 open_error (file_name
);
760 mv_begin (¤t_stat_info
);
761 if (current_stat_info
.is_sparse
)
762 sparse_extract_file (fd
, ¤t_stat_info
, &size
);
764 for (size
= current_stat_info
.stat
.st_size
; size
> 0; )
768 /* Locate data, determine max length writeable, write it,
769 block that we have used the data, then check if the write
772 data_block
= find_next_block ();
775 ERROR ((0, 0, _("Unexpected EOF in archive")));
776 break; /* FIXME: What happens, then? */
779 written
= available_space_after (data_block
);
784 count
= full_write (fd
, data_block
->buffer
, written
);
787 set_next_block_after ((union block
*)
788 (data_block
->buffer
+ written
- 1));
789 if (count
!= written
)
791 if (!to_command_option
)
792 write_error_details (file_name
, count
, written
);
793 /* FIXME: shouldn't we restore from backup? */
802 /* If writing to stdout, don't try to do anything to the filename;
803 it doesn't exist, or we don't want to touch it anyway. */
805 if (to_stdout_option
)
810 close_error (file_name
);
812 if (to_command_option
)
815 set_stat (file_name
, ¤t_stat_info
, NULL
, 0,
816 (old_files_option
== OVERWRITE_OLD_FILES
?
817 UNKNOWN_PERMSTATUS
: ARCHIVED_PERMSTATUS
),
823 /* Create a placeholder file with name FILE_NAME, which will be
824 replaced after other extraction is done by a symbolic link if
825 IS_SYMLINK is true, and by a hard link otherwise. Set
826 *INTERDIR_MADE if an intermediate directory is made in the
830 create_placeholder_file (char *file_name
, bool is_symlink
, int *interdir_made
)
835 while ((fd
= open (file_name
, O_WRONLY
| O_CREAT
| O_EXCL
, 0)) < 0)
836 if (! maybe_recoverable (file_name
, interdir_made
))
840 open_error (file_name
);
841 else if (fstat (fd
, &st
) != 0)
843 stat_error (file_name
);
846 else if (close (fd
) != 0)
847 close_error (file_name
);
850 struct delayed_set_stat
*h
;
851 struct delayed_link
*p
=
852 xmalloc (offsetof (struct delayed_link
, target
)
853 + strlen (current_stat_info
.link_name
)
855 p
->next
= delayed_link_head
;
856 delayed_link_head
= p
;
859 p
->mtime
= get_stat_mtime (&st
);
860 p
->is_symlink
= is_symlink
;
863 p
->uid
= current_stat_info
.stat
.st_uid
;
864 p
->gid
= current_stat_info
.stat
.st_gid
;
866 p
->sources
= xmalloc (offsetof (struct string_list
, string
)
867 + strlen (file_name
) + 1);
868 p
->sources
->next
= 0;
869 strcpy (p
->sources
->string
, file_name
);
870 strcpy (p
->target
, current_stat_info
.link_name
);
872 h
= delayed_set_stat_head
;
873 if (h
&& ! h
->after_links
874 && strncmp (file_name
, h
->file_name
, h
->file_name_len
) == 0
875 && ISSLASH (file_name
[h
->file_name_len
])
876 && (base_name (file_name
) == file_name
+ h
->file_name_len
+ 1))
882 if (stat (h
->file_name
, &st
) != 0)
883 stat_error (h
->file_name
);
890 while ((h
= h
->next
) && ! h
->after_links
);
900 extract_link (char *file_name
, int typeflag
)
902 char const *link_name
= safer_name_suffix (current_stat_info
.link_name
,
903 true, absolute_names_option
);
904 int interdir_made
= 0;
906 if (! absolute_names_option
&& contains_dot_dot (link_name
))
907 return create_placeholder_file (file_name
, false, &interdir_made
);
911 struct stat st1
, st2
;
913 int status
= link (link_name
, file_name
);
918 struct delayed_link
*ds
= delayed_link_head
;
919 if (ds
&& lstat (link_name
, &st1
) == 0)
920 for (; ds
; ds
= ds
->next
)
921 if (ds
->dev
== st1
.st_dev
922 && ds
->ino
== st1
.st_ino
923 && timespec_cmp (ds
->mtime
, get_stat_mtime (&st1
)) == 0)
925 struct string_list
*p
= xmalloc (offsetof (struct string_list
, string
)
926 + strlen (file_name
) + 1);
927 strcpy (p
->string
, file_name
);
928 p
->next
= ds
->sources
;
934 else if ((e
== EEXIST
&& strcmp (link_name
, file_name
) == 0)
935 || (lstat (link_name
, &st1
) == 0
936 && lstat (file_name
, &st2
) == 0
937 && st1
.st_dev
== st2
.st_dev
938 && st1
.st_ino
== st2
.st_ino
))
943 while (maybe_recoverable (file_name
, &interdir_made
));
945 if (!(incremental_option
&& errno
== EEXIST
))
947 link_error (link_name
, file_name
);
954 extract_symlink (char *file_name
, int typeflag
)
958 int interdir_made
= 0;
960 if (! absolute_names_option
961 && (IS_ABSOLUTE_FILE_NAME (current_stat_info
.link_name
)
962 || contains_dot_dot (current_stat_info
.link_name
)))
963 return create_placeholder_file (file_name
, true, &interdir_made
);
965 while ((status
= symlink (current_stat_info
.link_name
, file_name
)))
966 if (!maybe_recoverable (file_name
, &interdir_made
))
970 set_stat (file_name
, ¤t_stat_info
, NULL
, 0, 0, SYMTYPE
);
972 symlink_error (current_stat_info
.link_name
, file_name
);
976 static int warned_once
;
981 WARN ((0, 0, _("Attempting extraction of symbolic links as hard links")));
983 return extract_link (file_name
, typeflag
);
987 #if S_IFCHR || S_IFBLK
989 extract_node (char *file_name
, int typeflag
)
992 int interdir_made
= 0;
995 status
= mknod (file_name
, current_stat_info
.stat
.st_mode
,
996 current_stat_info
.stat
.st_rdev
);
997 while (status
&& maybe_recoverable (file_name
, &interdir_made
));
1000 mknod_error (file_name
);
1002 set_stat (file_name
, ¤t_stat_info
, NULL
, 0,
1003 ARCHIVED_PERMSTATUS
, typeflag
);
1008 #if HAVE_MKFIFO || defined mkfifo
1010 extract_fifo (char *file_name
, int typeflag
)
1013 int interdir_made
= 0;
1015 while ((status
= mkfifo (file_name
, current_stat_info
.stat
.st_mode
)))
1016 if (!maybe_recoverable (file_name
, &interdir_made
))
1020 set_stat (file_name
, ¤t_stat_info
, NULL
, 0,
1021 ARCHIVED_PERMSTATUS
, typeflag
);
1023 mkfifo_error (file_name
);
1029 extract_mangle_wrapper (char *file_name
, int typeflag
)
1037 extract_failure (char *file_name
, int typeflag
)
1042 typedef int (*tar_extractor_t
) (char *file_name
, int typeflag
);
1046 /* Prepare to extract a file. Find extractor function.
1047 Return zero if extraction should not proceed. */
1050 prepare_to_extract (char const *file_name
, int typeflag
, tar_extractor_t
*fun
)
1054 if (EXTRACT_OVER_PIPE
)
1057 /* Select the extractor */
1060 case GNUTYPE_SPARSE
:
1061 *fun
= extract_file
;
1068 /* Appears to be a file. But BSD tar uses the convention that a slash
1069 suffix means a directory. */
1070 if (current_stat_info
.had_trailing_slash
)
1074 *fun
= extract_file
;
1080 *fun
= extract_symlink
;
1084 *fun
= extract_link
;
1089 current_stat_info
.stat
.st_mode
|= S_IFCHR
;
1090 *fun
= extract_node
;
1096 current_stat_info
.stat
.st_mode
|= S_IFBLK
;
1097 *fun
= extract_node
;
1101 #if HAVE_MKFIFO || defined mkfifo
1103 *fun
= extract_fifo
;
1108 case GNUTYPE_DUMPDIR
:
1110 if (current_stat_info
.dumpdir
)
1111 directories_first
= true;
1114 case GNUTYPE_VOLHDR
:
1116 fprintf (stdlis
, _("Reading %s\n"), quote (current_stat_info
.file_name
));
1121 *fun
= extract_mangle_wrapper
;
1124 case GNUTYPE_MULTIVOL
:
1126 _("%s: Cannot extract -- file is continued from another volume"),
1127 quotearg_colon (current_stat_info
.file_name
)));
1128 *fun
= extract_failure
;
1131 case GNUTYPE_LONGNAME
:
1132 case GNUTYPE_LONGLINK
:
1133 ERROR ((0, 0, _("Unexpected long name header")));
1134 *fun
= extract_failure
;
1139 _("%s: Unknown file type `%c', extracted as normal file"),
1140 quotearg_colon (file_name
), typeflag
));
1141 *fun
= extract_file
;
1144 /* Determine whether the extraction should proceed */
1148 switch (old_files_option
)
1150 case UNLINK_FIRST_OLD_FILES
:
1151 if (!remove_any_file (file_name
,
1152 recursive_unlink_option
? RECURSIVE_REMOVE_OPTION
1153 : ORDINARY_REMOVE_OPTION
)
1154 && errno
&& errno
!= ENOENT
)
1156 unlink_error (file_name
);
1161 case KEEP_NEWER_FILES
:
1162 if (file_newer_p (file_name
, ¤t_stat_info
))
1164 WARN ((0, 0, _("Current %s is newer or same age"),
1165 quote (file_name
)));
1177 /* Extract a file from the archive. */
1179 extract_archive (void)
1183 tar_extractor_t fun
;
1185 set_next_block_after (current_header
);
1186 decode_header (current_header
, ¤t_stat_info
, ¤t_format
, 1);
1188 if (interactive_option
&& !confirm ("extract", current_stat_info
.file_name
))
1194 /* Print the block from current_header and current_stat. */
1197 print_header (¤t_stat_info
, -1);
1199 file_name
= safer_name_suffix (current_stat_info
.file_name
,
1200 false, absolute_names_option
);
1201 if (strip_name_components
)
1203 size_t prefix_len
= stripped_prefix_len (file_name
,
1204 strip_name_components
);
1205 if (prefix_len
== (size_t) -1)
1210 file_name
+= prefix_len
;
1213 /* Restore stats for all non-ancestor directories, unless
1214 it is an incremental archive.
1215 (see NOTICE in the comment to delay_set_stat above) */
1216 if (!directories_first
)
1217 apply_nonancestor_delayed_set_stat (file_name
, 0);
1219 /* Take a safety backup of a previously existing file. */
1222 if (!maybe_backup_file (file_name
, 0))
1225 ERROR ((0, e
, _("%s: Was unable to backup this file"),
1226 quotearg_colon (file_name
)));
1231 /* Extract the archive entry according to its type. */
1233 typeflag
= sparse_member_p (¤t_stat_info
) ?
1234 GNUTYPE_SPARSE
: current_header
->header
.typeflag
;
1236 if (prepare_to_extract (file_name
, typeflag
, &fun
))
1238 if (fun
&& (*fun
) (file_name
, typeflag
) && backup_option
)
1239 undo_last_backup ();
1246 /* Extract the symbolic links whose final extraction were delayed. */
1248 apply_delayed_links (void)
1250 struct delayed_link
*ds
;
1252 for (ds
= delayed_link_head
; ds
; )
1254 struct string_list
*sources
= ds
->sources
;
1255 char const *valid_source
= 0;
1257 for (sources
= ds
->sources
; sources
; sources
= sources
->next
)
1259 char const *source
= sources
->string
;
1262 /* Make sure the placeholder file is still there. If not,
1263 don't create a link, as the placeholder was probably
1264 removed by a later extraction. */
1265 if (lstat (source
, &st
) == 0
1266 && st
.st_dev
== ds
->dev
1267 && st
.st_ino
== ds
->ino
1268 && timespec_cmp (get_stat_mtime (&st
), ds
->mtime
) == 0)
1270 /* Unlink the placeholder, then create a hard link if possible,
1271 a symbolic link otherwise. */
1272 if (unlink (source
) != 0)
1273 unlink_error (source
);
1274 else if (valid_source
&& link (valid_source
, source
) == 0)
1276 else if (!ds
->is_symlink
)
1278 if (link (ds
->target
, source
) != 0)
1279 link_error (ds
->target
, source
);
1281 else if (symlink (ds
->target
, source
) != 0)
1282 symlink_error (ds
->target
, source
);
1285 struct tar_stat_info st1
;
1286 st1
.stat
.st_uid
= ds
->uid
;
1287 st1
.stat
.st_gid
= ds
->gid
;
1288 set_stat (source
, &st1
, NULL
, 0, 0, SYMTYPE
);
1289 valid_source
= source
;
1294 for (sources
= ds
->sources
; sources
; )
1296 struct string_list
*next
= sources
->next
;
1302 struct delayed_link
*next
= ds
->next
;
1308 delayed_link_head
= 0;
1311 /* Finish the extraction of an archive. */
1313 extract_finish (void)
1315 /* First, fix the status of ordinary directories that need fixing. */
1316 apply_nonancestor_delayed_set_stat ("", 0);
1318 /* Then, apply delayed links, so that they don't affect delayed
1319 directory status-setting for ordinary directories. */
1320 apply_delayed_links ();
1322 /* Finally, fix the status of directories that are ancestors
1323 of delayed links. */
1324 apply_nonancestor_delayed_set_stat ("", 1);
1331 error (TAREXIT_FAILURE
, 0, _("Error is not recoverable: exiting now"));
1338 error (0, 0, "%s", _("memory exhausted"));