tar: work around FreeBSD symlink incompatibility with POSIX
[debian/tar] / src / extract.c
1 /* Extract files from a tar archive.
2
3    Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1998, 1999, 2000,
4    2001, 2003, 2004, 2005, 2006, 2007, 2010 Free Software Foundation, Inc.
5
6    Written by John Gilmore, on 1985-11-19.
7
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
11    version.
12
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.
17
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.  */
21
22 #include <system.h>
23 #include <quotearg.h>
24 #include <errno.h>
25 #include <priv-set.h>
26 #include <utimens.h>
27
28 #include "common.h"
29
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
34 #define ALL_MODE_BITS ((mode_t) ~ (mode_t) 0)
35
36 #if ! HAVE_FCHMOD && ! defined fchmod
37 # define fchmod(fd, mode) (errno = ENOSYS, -1)
38 #endif
39 #if ! HAVE_FCHOWN && ! defined fchown
40 # define fchown(fd, uid, gid) (errno = ENOSYS, -1)
41 #endif
42
43 /* Return true if an error number ERR means the system call is
44    supported in this case.  */
45 static bool
46 implemented (int err)
47 {
48   return ! (err == ENOSYS
49             || err == ENOTSUP
50             || (EOPNOTSUPP != ENOTSUP && err == EOPNOTSUPP));
51 }
52
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
60    preceding element.  */
61
62 struct delayed_set_stat
63   {
64     /* Next directory in list.  */
65     struct delayed_set_stat *next;
66
67     /* Metadata for this directory.  */
68     dev_t dev;
69     ino_t ino;
70     mode_t mode; /* The desired mode is MODE & ~ current_umask.  */
71     uid_t uid;
72     gid_t gid;
73     struct timespec atime;
74     struct timespec mtime;
75
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
79        matter.  */
80     mode_t current_mode;
81     mode_t current_mode_mask;
82
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.  */
87     bool interdir;
88
89     /* Whether symbolic links should be followed when accessing the
90        directory.  */
91     int atflag;
92
93     /* Do not set the status of this directory until after delayed
94        links are created.  */
95     bool after_links;
96
97     /* Directory that the name is relative to.  */
98     int change_dir;
99
100     /* Length and contents of name.  */
101     size_t file_name_len;
102     char file_name[1];
103   };
104
105 static struct delayed_set_stat *delayed_set_stat_head;
106
107 /* List of links whose creation we have delayed.  */
108 struct delayed_link
109   {
110     /* The next delayed link in the list.  */
111     struct delayed_link *next;
112
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.  */
116     dev_t dev;
117     ino_t ino;
118     struct timespec ctime;
119
120     /* True if the link is symbolic.  */
121     bool is_symlink;
122
123     /* The desired metadata, valid only the link is symbolic.  */
124     mode_t mode;
125     uid_t uid;
126     gid_t gid;
127     struct timespec atime;
128     struct timespec mtime;
129
130     /* The directory that the sources and target are relative to.  */
131     int change_dir;
132
133     /* A list of sources for this link.  The sources are all to be
134        hard-linked together.  */
135     struct string_list *sources;
136
137     /* The desired target of the desired link.  */
138     char target[1];
139   };
140
141 static struct delayed_link *delayed_link_head;
142
143 struct string_list
144   {
145     struct string_list *next;
146     char string[1];
147   };
148
149 /*  Set up to extract files.  */
150 void
151 extr_init (void)
152 {
153   we_are_root = geteuid () == 0;
154   same_permissions_option += we_are_root;
155   same_owner_option += we_are_root;
156
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.  */
160
161   newdir_umask = umask (0);
162   if (0 < same_permissions_option)
163     current_umask = 0;
164   else
165     {
166       umask (newdir_umask);     /* restore the kernel umask */
167       current_umask = newdir_umask;
168     }
169 }
170
171 /* Use fchmod if possible, fchmodat otherwise.  */
172 static int
173 fd_chmod (int fd, char const *file, mode_t mode, int atflag)
174 {
175   if (0 <= fd)
176     {
177       int result = fchmod (fd, mode);
178       if (result == 0 || implemented (errno))
179         return result;
180     }
181   return fchmodat (chdir_fd, file, mode, atflag);
182 }
183
184 /* Use fchown if possible, fchownat otherwise.  */
185 static int
186 fd_chown (int fd, char const *file, uid_t uid, gid_t gid, int atflag)
187 {
188   if (0 <= fd)
189     {
190       int result = fchown (fd, uid, gid);
191       if (result == 0 || implemented (errno))
192         return result;
193     }
194   return fchownat (chdir_fd, file, uid, gid, atflag);
195 }
196
197 /* Use fstat if possible, fstatat otherwise.  */
198 static int
199 fd_stat (int fd, char const *file, struct stat *st, int atflag)
200 {
201   return (0 <= fd
202           ? fstat (fd, st)
203           : fstatat (chdir_fd, file, st, atflag));
204 }
205
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.  */
214 static void
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)
219 {
220   if (((current_mode ^ mode) | ~ current_mode_mask) & mode_mask)
221     {
222       if (MODE_ALL & ~ mode_mask & ~ current_mode_mask)
223         {
224           struct stat st;
225           if (fd_stat (fd, file_name, &st, atflag) != 0)
226             {
227               stat_error (file_name);
228               return;
229             }
230           current_mode = st.st_mode;
231         }
232
233       current_mode &= MODE_ALL;
234       mode = (current_mode & ~ mode_mask) | (mode & mode_mask);
235
236       if (current_mode != mode)
237         {
238           int chmod_errno =
239             fd_chmod (fd, file_name, mode, atflag) == 0 ? 0 : errno;
240
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
244              (2009-09-03).  */
245           if (chmod_errno == EPERM && (mode & S_ISUID)
246               && priv_set_restore_linkdir () == 0)
247             {
248               chmod_errno =
249                 fd_chmod (fd, file_name, mode, atflag) == 0 ? 0 : errno;
250               priv_set_remove_linkdir ();
251             }
252
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;
260
261           if (chmod_errno
262               && (typeflag != SYMTYPE || implemented (chmod_errno)))
263             {
264               errno = chmod_errno;
265               chmod_error_details (file_name, mode);
266             }
267         }
268     }
269 }
270
271 /* Check time after successfully setting FILE_NAME's time stamp to T.  */
272 static void
273 check_time (char const *file_name, struct timespec t)
274 {
275   if (t.tv_sec <= 0)
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)
280     {
281       struct timespec now;
282       gettime (&now);
283       if (timespec_cmp (now, t) < 0)
284         {
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)
290             {
291               diff.tv_nsec += BILLION;
292               diff.tv_sec--;
293             }
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)));
297         }
298     }
299 }
300
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.  */
309
310 static void
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)
315 {
316   /* Do the utime before the chmod because some versions of utime are
317      broken and trash the modes of the file.  */
318
319   if (! touch_option && ! interdir)
320     {
321       struct timespec ts[2];
322       if (incremental_option)
323         ts[0] = st->atime;
324       else
325         ts[0].tv_nsec = UTIME_OMIT;
326       ts[1] = st->mtime;
327
328       if (fdutimensat (fd, chdir_fd, file_name, ts, atflag) == 0)
329         {
330           if (incremental_option)
331             check_time (file_name, ts[0]);
332           check_time (file_name, ts[1]);
333         }
334       else if (typeflag != SYMTYPE || implemented (errno))
335         utime_error (file_name);
336     }
337
338   if (0 < same_owner_option && ! interdir)
339     {
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
345          give files away.  */
346       uid_t uid = st->stat.st_uid;
347       gid_t gid = st->stat.st_gid;
348
349       if (fd_chown (fd, file_name, uid, gid, atflag) == 0)
350         {
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));
354         }
355       else if (typeflag != SYMTYPE || implemented (errno))
356         chown_error_details (file_name, uid, gid);
357     }
358
359   set_mode (file_name,
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);
363 }
364
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.  */
368 static void
369 mark_after_links (struct delayed_set_stat *head)
370 {
371   struct delayed_set_stat *h = head;
372
373   do
374     {
375       struct stat st;
376       h->after_links = 1;
377
378       if (deref_stat (h->file_name, &st) != 0)
379         stat_error (h->file_name);
380       else
381         {
382           h->dev = st.st_dev;
383           h->ino = st.st_ino;
384         }
385     }
386   while ((h = h->next) && ! h->after_links);
387 }
388
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.
392
393    If ST is null, merely create a placeholder node for an intermediate
394    directory that was created by make_directories.
395
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.
401
402    If an archive was explicitely created so that its member order is
403    reversed, some directory timestamps can be restored incorrectly,
404    e.g.:
405        tar --no-recursion -cf archive dir dir/file1 foo dir/file2
406 */
407 static void
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)
411 {
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;
417   data->mode = mode;
418   if (st)
419     {
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;
426     }
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);
438 }
439
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.  */
444 static void
445 repair_delayed_set_stat (char const *dir,
446                          struct stat const *dir_stat_info)
447 {
448   struct delayed_set_stat *data;
449   for (data = delayed_set_stat_head;  data;  data = data->next)
450     {
451       struct stat st;
452       if (fstatat (chdir_fd, data->file_name, &st, data->atflag) != 0)
453         {
454           stat_error (data->file_name);
455           return;
456         }
457
458       if (st.st_dev == dir_stat_info->st_dev
459           && st.st_ino == dir_stat_info->st_ino)
460         {
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;
471           return;
472         }
473     }
474
475   ERROR ((0, 0, _("%s: Unexpected inconsistency when making directory"),
476           quotearg_colon (dir)));
477 }
478
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.  */
484 static int
485 make_directories (char *file_name, bool *interdir_made)
486 {
487   char *cursor0 = file_name + FILE_SYSTEM_PREFIX_LEN (file_name);
488   char *cursor;                 /* points into the file name */
489
490   for (cursor = cursor0; *cursor; cursor++)
491     {
492       mode_t mode;
493       mode_t desired_mode;
494       int status;
495
496       if (! ISSLASH (*cursor))
497         continue;
498
499       /* Avoid mkdir of empty string, if leading or double '/'.  */
500
501       if (cursor == cursor0 || ISSLASH (cursor[-1]))
502         continue;
503
504       /* Avoid mkdir where last part of file name is "." or "..".  */
505
506       if (cursor[-1] == '.'
507           && (cursor == cursor0 + 1 || ISSLASH (cursor[-2])
508               || (cursor[-2] == '.'
509                   && (cursor == cursor0 + 2 || ISSLASH (cursor[-3])))))
510         continue;
511
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);
516
517       if (status == 0)
518         {
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);
525
526           print_for_mkdir (file_name, cursor - file_name, desired_mode);
527           *interdir_made = true;
528         }
529       else if (errno == EEXIST)
530         status = 0;
531       else
532         {
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.  */
537           int e = errno;
538           struct stat st;
539           status = fstatat (chdir_fd, file_name, &st, 0);
540           if (status)
541             {
542               errno = e;
543               mkdir_error (file_name);
544             }
545         }
546
547       *cursor = '/';
548       if (status)
549         return status;
550     }
551
552   return 0;
553 }
554
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
557    TAR_STAT.  */
558 static bool
559 file_newer_p (const char *file_name, struct stat const *stp,
560               struct tar_stat_info *tar_stat)
561 {
562   struct stat st;
563
564   if (!stp)
565     {
566       if (deref_stat (file_name, &st) != 0)
567         {
568           if (errno != ENOENT)
569             {
570               stat_warn (file_name);
571               /* Be safer: if the file exists, assume it is newer.  */
572               return true;
573             }
574           return false;
575         }
576       stp = &st;
577     }
578
579   return (! S_ISDIR (stp->st_mode)
580           && tar_timespec_cmp (tar_stat->mtime, get_stat_mtime (stp)) <= 0);
581 }
582
583 #define RECOVER_NO 0
584 #define RECOVER_OK 1
585 #define RECOVER_SKIP 2
586
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.
593
594    If REGULAR, the caller was trying to extract onto a regular file.
595
596    Set *INTERDIR_MADE if an intermediate directory is made as part of
597    the recovery process.  */
598
599 static int
600 maybe_recoverable (char *file_name, bool regular, bool *interdir_made)
601 {
602   int e = errno;
603   struct stat st;
604   struct stat const *stp = 0;
605
606   if (*interdir_made)
607     return RECOVER_NO;
608
609   switch (e)
610     {
611     case ELOOP:
612       /* With open ("symlink", O_NOFOLLOW|...), POSIX says errno == ELOOP,
613          but FreeBSD through at least 8.1 uses errno == EMLINK.  */
614     case EMLINK:
615       if (! regular
616           || old_files_option != OVERWRITE_OLD_FILES || dereference_option)
617         break;
618       if (strchr (file_name, '/'))
619         {
620           if (deref_stat (file_name, &st) != 0)
621             break;
622           stp = &st;
623         }
624
625       /* The caller tried to open a symbolic link with O_NOFOLLOW.
626          Fall through, treating it as an already-existing file.  */
627
628     case EEXIST:
629       /* Remove an old file, if the options allow this.  */
630
631       switch (old_files_option)
632         {
633         case KEEP_OLD_FILES:
634           return RECOVER_SKIP;
635
636         case KEEP_NEWER_FILES:
637           if (file_newer_p (file_name, stp, &current_stat_info))
638             break;
639           /* FALL THROUGH */
640
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))
645             return RECOVER_OK;
646           break;
647
648         case UNLINK_FIRST_OLD_FILES:
649           break;
650         }
651
652     case ENOENT:
653       /* Attempt creating missing intermediate directories.  */
654       if (make_directories (file_name, interdir_made) == 0 && *interdir_made)
655         return RECOVER_OK;
656       break;
657
658     default:
659       /* Just say we can't do anything about it...  */
660       break;
661     }
662
663   errno = e;
664   return RECOVER_NO;
665 }
666
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.  */
672 static void
673 apply_nonancestor_delayed_set_stat (char const *file_name, bool after_links)
674 {
675   size_t file_name_len = strlen (file_name);
676   bool check_for_renamed_directories = 0;
677
678   while (delayed_set_stat_head)
679     {
680       struct delayed_set_stat *data = delayed_set_stat_head;
681       bool skip_this_one = 0;
682       struct stat st;
683       mode_t current_mode = data->current_mode;
684       mode_t current_mode_mask = data->current_mode_mask;
685
686       check_for_renamed_directories |= data->after_links;
687
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))
694         break;
695
696       chdir_do (data->change_dir);
697
698       if (check_for_renamed_directories)
699         {
700           if (fstatat (chdir_fd, data->file_name, &st, data->atflag) != 0)
701             {
702               stat_error (data->file_name);
703               skip_this_one = 1;
704             }
705           else
706             {
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))
710                 {
711                   ERROR ((0, 0,
712                           _("%s: Directory renamed before its status could be extracted"),
713                           quotearg_colon (data->file_name)));
714                   skip_this_one = 1;
715                 }
716             }
717         }
718
719       if (! skip_this_one)
720         {
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);
730         }
731
732       delayed_set_stat_head = data->next;
733       free (data);
734     }
735 }
736
737 \f
738
739 /* Extractor functions for various member types */
740
741 static int
742 extract_dir (char *file_name, int typeflag)
743 {
744   int status;
745   mode_t mode;
746   mode_t current_mode = 0;
747   mode_t current_mode_mask = 0;
748   int atflag = 0;
749   bool interdir_made = false;
750
751   /* Save 'root device' to avoid purging mount points. */
752   if (one_file_system_option && root_device == 0)
753     {
754       struct stat st;
755
756       if (fstatat (chdir_fd, ".", &st, 0) != 0)
757         stat_diag (".");
758       else
759         root_device = st.st_dev;
760     }
761
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)
766     skip_member ();
767
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
777               ? S_IRWXU
778               : MODE_RWX))
779           | (we_are_root ? 0 : MODE_WXUSR));
780
781   for (;;)
782     {
783       status = mkdirat (chdir_fd, file_name, mode);
784       if (status == 0)
785         {
786           current_mode = mode & ~ current_umask;
787           current_mode_mask = MODE_RWX;
788           atflag = AT_SYMLINK_NOFOLLOW;
789           break;
790         }
791
792       if (errno == EEXIST
793           && (interdir_made
794               || old_files_option == DEFAULT_OLD_FILES
795               || old_files_option == OVERWRITE_OLD_FILES))
796         {
797           struct stat st;
798           if (deref_stat (file_name, &st) == 0)
799             {
800               current_mode = st.st_mode;
801               current_mode_mask = ALL_MODE_BITS;
802
803               if (S_ISDIR (current_mode))
804                 {
805                   if (interdir_made)
806                     {
807                       repair_delayed_set_stat (file_name, &st);
808                       return 0;
809                     }
810                   break;
811                 }
812             }
813           errno = EEXIST;
814         }
815
816       switch (maybe_recoverable (file_name, false, &interdir_made))
817         {
818         case RECOVER_OK:
819           continue;
820
821         case RECOVER_SKIP:
822           break;
823
824         case RECOVER_NO:
825           if (errno != EEXIST)
826             {
827               mkdir_error (file_name);
828               return 1;
829             }
830           break;
831         }
832       break;
833     }
834
835   if (status == 0
836       || old_files_option == DEFAULT_OLD_FILES
837       || old_files_option == OVERWRITE_OLD_FILES)
838     delay_set_stat (file_name, &current_stat_info,
839                     current_mode, current_mode_mask,
840                     current_stat_info.stat.st_mode, atflag);
841   return status;
842 }
843
844
845
846 static int
847 open_output_file (char const *file_name, int typeflag, mode_t mode,
848                   mode_t *current_mode, mode_t *current_mode_mask)
849 {
850   int fd;
851   bool overwriting_old_files = old_files_option == OVERWRITE_OLD_FILES;
852   int openflag = (O_WRONLY | O_BINARY | O_CLOEXEC | O_NOCTTY | O_NONBLOCK
853                   | O_CREAT
854                   | (overwriting_old_files
855                      ? O_TRUNC | (dereference_option ? 0 : O_NOFOLLOW)
856                      : O_EXCL));
857
858   if (typeflag == CONTTYPE)
859     {
860       static int conttype_diagnosed;
861
862       if (!conttype_diagnosed)
863         {
864           conttype_diagnosed = 1;
865           WARNOPT (WARN_CONTIGUOUS_CAST,
866                    (0, 0, _("Extracting contiguous files as regular files")));
867         }
868     }
869
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)
874     {
875       struct stat st;
876       if (fstatat (chdir_fd, file_name, &st, AT_SYMLINK_NOFOLLOW) == 0
877           && S_ISLNK (st.st_mode))
878         {
879           errno = ELOOP;
880           return -1;
881         }
882     }
883
884   fd = openat (chdir_fd, file_name, openflag, mode);
885   if (0 <= fd)
886     {
887       if (overwriting_old_files)
888         {
889           struct stat st;
890           if (fstat (fd, &st) != 0)
891             {
892               int e = errno;
893               close (fd);
894               errno = e;
895               return -1;
896             }
897           if (! S_ISREG (st.st_mode))
898             {
899               close (fd);
900               errno = EEXIST;
901               return -1;
902             }
903           *current_mode = st.st_mode;
904           *current_mode_mask = ALL_MODE_BITS;
905         }
906       else
907         {
908           *current_mode = mode & ~ current_umask;
909           *current_mode_mask = MODE_RWX;
910         }
911     }
912
913   return fd;
914 }
915
916 static int
917 extract_file (char *file_name, int typeflag)
918 {
919   int fd;
920   off_t size;
921   union block *data_block;
922   int status;
923   size_t count;
924   size_t written;
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;
930
931   if (to_stdout_option)
932     fd = STDOUT_FILENO;
933   else if (to_command_option)
934     {
935       fd = sys_exec_command (file_name, 'f', &current_stat_info);
936       if (fd < 0)
937         {
938           skip_member ();
939           return 0;
940         }
941     }
942   else
943     {
944       while ((fd = open_output_file (file_name, typeflag, mode,
945                                      &current_mode, &current_mode_mask))
946              < 0)
947         {
948           int recover = maybe_recoverable (file_name, true, &interdir_made);
949           if (recover != RECOVER_OK)
950             {
951               skip_member ();
952               if (recover == RECOVER_SKIP)
953                 return 0;
954               open_error (file_name);
955               return 1;
956             }
957         }
958     }
959
960   mv_begin_read (&current_stat_info);
961   if (current_stat_info.is_sparse)
962     sparse_extract_file (fd, &current_stat_info, &size);
963   else
964     for (size = current_stat_info.stat.st_size; size > 0; )
965       {
966         mv_size_left (size);
967
968         /* Locate data, determine max length writeable, write it,
969            block that we have used the data, then check if the write
970            worked.  */
971
972         data_block = find_next_block ();
973         if (! data_block)
974           {
975             ERROR ((0, 0, _("Unexpected EOF in archive")));
976             break;              /* FIXME: What happens, then?  */
977           }
978
979         written = available_space_after (data_block);
980
981         if (written > size)
982           written = size;
983         errno = 0;
984         count = full_write (fd, data_block->buffer, written);
985         size -= written;
986
987         set_next_block_after ((union block *)
988                               (data_block->buffer + written - 1));
989         if (count != written)
990           {
991             if (!to_command_option)
992               write_error_details (file_name, count, written);
993             /* FIXME: shouldn't we restore from backup? */
994             break;
995           }
996       }
997
998   skip_file (size);
999
1000   mv_end ();
1001
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.  */
1004
1005   if (to_stdout_option)
1006     return 0;
1007
1008   if (! to_command_option)
1009     set_stat (file_name, &current_stat_info, fd,
1010               current_mode, current_mode_mask, typeflag, false,
1011               (old_files_option == OVERWRITE_OLD_FILES
1012                ? 0 : AT_SYMLINK_NOFOLLOW));
1013
1014   status = close (fd);
1015   if (status < 0)
1016     close_error (file_name);
1017
1018   if (to_command_option)
1019     sys_wait_command ();
1020
1021   return status;
1022 }
1023
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
1028    process.  */
1029
1030 static int
1031 create_placeholder_file (char *file_name, bool is_symlink, bool *interdir_made)
1032 {
1033   int fd;
1034   struct stat st;
1035
1036   while ((fd = openat (chdir_fd, file_name, O_WRONLY | O_CREAT | O_EXCL, 0)) < 0)
1037     {
1038       switch (maybe_recoverable (file_name, false, interdir_made))
1039         {
1040         case RECOVER_OK:
1041           continue;
1042
1043         case RECOVER_SKIP:
1044           return 0;
1045
1046         case RECOVER_NO:
1047           open_error (file_name);
1048           return -1;
1049         }
1050       }
1051
1052   if (fstat (fd, &st) != 0)
1053     {
1054       stat_error (file_name);
1055       close (fd);
1056     }
1057   else if (close (fd) != 0)
1058     close_error (file_name);
1059   else
1060     {
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)
1065                  + 1);
1066       p->next = delayed_link_head;
1067       delayed_link_head = p;
1068       p->dev = st.st_dev;
1069       p->ino = st.st_ino;
1070       p->ctime = get_stat_ctime (&st);
1071       p->is_symlink = is_symlink;
1072       if (is_symlink)
1073         {
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;
1079         }
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);
1086
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);
1093
1094       return 0;
1095     }
1096
1097   return -1;
1098 }
1099
1100 static int
1101 extract_link (char *file_name, int typeflag)
1102 {
1103   bool interdir_made = false;
1104   char const *link_name;
1105   int rc;
1106
1107   link_name = current_stat_info.link_name;
1108
1109   if (! absolute_names_option && contains_dot_dot (link_name))
1110     return create_placeholder_file (file_name, false, &interdir_made);
1111
1112   do
1113     {
1114       struct stat st1, st2;
1115       int e;
1116       int status = linkat (chdir_fd, link_name, chdir_fd, file_name, 0);
1117       e = errno;
1118
1119       if (status == 0)
1120         {
1121           struct delayed_link *ds = delayed_link_head;
1122           if (ds
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)
1129                 {
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;
1134                   ds->sources = p;
1135                   break;
1136                 }
1137           return 0;
1138         }
1139       else if ((e == EEXIST && strcmp (link_name, file_name) == 0)
1140                || ((fstatat (chdir_fd, link_name, &st1, AT_SYMLINK_NOFOLLOW)
1141                     == 0)
1142                    && (fstatat (chdir_fd, file_name, &st2, AT_SYMLINK_NOFOLLOW)
1143                        == 0)
1144                    && st1.st_dev == st2.st_dev
1145                    && st1.st_ino == st2.st_ino))
1146         return 0;
1147
1148       errno = e;
1149     }
1150   while ((rc = maybe_recoverable (file_name, false, &interdir_made))
1151          == RECOVER_OK);
1152
1153   if (rc == RECOVER_SKIP)
1154     return 0;
1155   if (!(incremental_option && errno == EEXIST))
1156     {
1157       link_error (link_name, file_name);
1158       return 1;
1159     }
1160   return 0;
1161 }
1162
1163 static int
1164 extract_symlink (char *file_name, int typeflag)
1165 {
1166 #ifdef HAVE_SYMLINK
1167   bool interdir_made = false;
1168
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);
1173
1174   while (symlinkat (current_stat_info.link_name, chdir_fd, file_name) != 0)
1175     switch (maybe_recoverable (file_name, false, &interdir_made))
1176       {
1177       case RECOVER_OK:
1178         continue;
1179
1180       case RECOVER_SKIP:
1181         return 0;
1182
1183       case RECOVER_NO:
1184         symlink_error (current_stat_info.link_name, file_name);
1185         return -1;
1186       }
1187
1188   set_stat (file_name, &current_stat_info, -1, 0, 0,
1189             SYMTYPE, false, AT_SYMLINK_NOFOLLOW);
1190   return 0;
1191
1192 #else
1193   static int warned_once;
1194
1195   if (!warned_once)
1196     {
1197       warned_once = 1;
1198       WARNOPT (WARN_SYMBOLIC_CAST,
1199                (0, 0,
1200                 _("Attempting extraction of symbolic links as hard links")));
1201     }
1202   return extract_link (file_name, typeflag);
1203 #endif
1204 }
1205
1206 #if S_IFCHR || S_IFBLK
1207 static int
1208 extract_node (char *file_name, int typeflag)
1209 {
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));
1213
1214   while (mknodat (chdir_fd, file_name, mode, current_stat_info.stat.st_rdev)
1215          != 0)
1216     switch (maybe_recoverable (file_name, false, &interdir_made))
1217       {
1218       case RECOVER_OK:
1219         continue;
1220
1221       case RECOVER_SKIP:
1222         return 0;
1223
1224       case RECOVER_NO:
1225         mknod_error (file_name);
1226         return -1;
1227       }
1228
1229   set_stat (file_name, &current_stat_info, -1,
1230             mode & ~ current_umask, MODE_RWX,
1231             typeflag, false, AT_SYMLINK_NOFOLLOW);
1232   return 0;
1233 }
1234 #endif
1235
1236 #if HAVE_MKFIFO || defined mkfifo
1237 static int
1238 extract_fifo (char *file_name, int typeflag)
1239 {
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));
1243
1244   while (mkfifoat (chdir_fd, file_name, mode) != 0)
1245     switch (maybe_recoverable (file_name, false, &interdir_made))
1246       {
1247       case RECOVER_OK:
1248         continue;
1249
1250       case RECOVER_SKIP:
1251         return 0;
1252
1253       case RECOVER_NO:
1254         mkfifo_error (file_name);
1255         return -1;
1256       }
1257
1258   set_stat (file_name, &current_stat_info, -1,
1259             mode & ~ current_umask, MODE_RWX,
1260             typeflag, false, AT_SYMLINK_NOFOLLOW);
1261   return 0;
1262 }
1263 #endif
1264
1265 static int
1266 extract_volhdr (char *file_name, int typeflag)
1267 {
1268   skip_member ();
1269   return 0;
1270 }
1271
1272 static int
1273 extract_failure (char *file_name, int typeflag)
1274 {
1275   return 1;
1276 }
1277
1278 typedef int (*tar_extractor_t) (char *file_name, int typeflag);
1279
1280 \f
1281
1282 /* Prepare to extract a file. Find extractor function.
1283    Return zero if extraction should not proceed.  */
1284
1285 static int
1286 prepare_to_extract (char const *file_name, int typeflag, tar_extractor_t *fun)
1287 {
1288   int rc = 1;
1289
1290   if (EXTRACT_OVER_PIPE)
1291     rc = 0;
1292
1293   /* Select the extractor */
1294   switch (typeflag)
1295     {
1296     case GNUTYPE_SPARSE:
1297       *fun = extract_file;
1298       rc = 1;
1299       break;
1300
1301     case AREGTYPE:
1302     case REGTYPE:
1303     case CONTTYPE:
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)
1307         *fun = extract_dir;
1308       else
1309         {
1310           *fun = extract_file;
1311           rc = 1;
1312         }
1313       break;
1314
1315     case SYMTYPE:
1316       *fun = extract_symlink;
1317       break;
1318
1319     case LNKTYPE:
1320       *fun = extract_link;
1321       break;
1322
1323 #if S_IFCHR
1324     case CHRTYPE:
1325       current_stat_info.stat.st_mode |= S_IFCHR;
1326       *fun = extract_node;
1327       break;
1328 #endif
1329
1330 #if S_IFBLK
1331     case BLKTYPE:
1332       current_stat_info.stat.st_mode |= S_IFBLK;
1333       *fun = extract_node;
1334       break;
1335 #endif
1336
1337 #if HAVE_MKFIFO || defined mkfifo
1338     case FIFOTYPE:
1339       *fun = extract_fifo;
1340       break;
1341 #endif
1342
1343     case DIRTYPE:
1344     case GNUTYPE_DUMPDIR:
1345       *fun = extract_dir;
1346       if (current_stat_info.is_dumpdir)
1347         delay_directory_restore_option = true;
1348       break;
1349
1350     case GNUTYPE_VOLHDR:
1351       *fun = extract_volhdr;
1352       break;
1353
1354     case GNUTYPE_MULTIVOL:
1355       ERROR ((0, 0,
1356               _("%s: Cannot extract -- file is continued from another volume"),
1357               quotearg_colon (current_stat_info.file_name)));
1358       *fun = extract_failure;
1359       break;
1360
1361     case GNUTYPE_LONGNAME:
1362     case GNUTYPE_LONGLINK:
1363       ERROR ((0, 0, _("Unexpected long name header")));
1364       *fun = extract_failure;
1365       break;
1366
1367     default:
1368       WARNOPT (WARN_UNKNOWN_CAST,
1369                (0, 0,
1370                 _("%s: Unknown file type `%c', extracted as normal file"),
1371                 quotearg_colon (file_name), typeflag));
1372       *fun = extract_file;
1373     }
1374
1375   /* Determine whether the extraction should proceed */
1376   if (rc == 0)
1377     return 0;
1378
1379   switch (old_files_option)
1380     {
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)
1386         {
1387           unlink_error (file_name);
1388           return 0;
1389         }
1390       break;
1391
1392     case KEEP_NEWER_FILES:
1393       if (file_newer_p (file_name, 0, &current_stat_info))
1394         {
1395           WARNOPT (WARN_IGNORE_NEWER,
1396                    (0, 0, _("Current %s is newer or same age"),
1397                     quote (file_name)));
1398           return 0;
1399         }
1400       break;
1401
1402     default:
1403       break;
1404     }
1405
1406   return 1;
1407 }
1408
1409 /* Extract a file from the archive.  */
1410 void
1411 extract_archive (void)
1412 {
1413   char typeflag;
1414   tar_extractor_t fun;
1415
1416   fatal_exit_hook = extract_finish;
1417
1418   set_next_block_after (current_header);
1419
1420   if (!current_stat_info.file_name[0]
1421       || (interactive_option
1422           && !confirm ("extract", current_stat_info.file_name)))
1423     {
1424       skip_member ();
1425       return;
1426     }
1427
1428   /* Print the block from current_header and current_stat.  */
1429   if (verbose_option)
1430     print_header (&current_stat_info, current_header, -1);
1431
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)
1436     {
1437       int dir = chdir_current;
1438       apply_nonancestor_delayed_set_stat (current_stat_info.file_name, 0);
1439       chdir_do (dir);
1440     }
1441
1442   /* Take a safety backup of a previously existing file.  */
1443
1444   if (backup_option)
1445     if (!maybe_backup_file (current_stat_info.file_name, 0))
1446       {
1447         int e = errno;
1448         ERROR ((0, e, _("%s: Was unable to backup this file"),
1449                 quotearg_colon (current_stat_info.file_name)));
1450         skip_member ();
1451         return;
1452       }
1453
1454   /* Extract the archive entry according to its type.  */
1455   /* KLUDGE */
1456   typeflag = sparse_member_p (&current_stat_info) ?
1457                   GNUTYPE_SPARSE : current_header->header.typeflag;
1458
1459   if (prepare_to_extract (current_stat_info.file_name, typeflag, &fun))
1460     {
1461       if (fun && (*fun) (current_stat_info.file_name, typeflag)
1462           && backup_option)
1463         undo_last_backup ();
1464     }
1465   else
1466     skip_member ();
1467
1468 }
1469
1470 /* Extract the links whose final extraction were delayed.  */
1471 static void
1472 apply_delayed_links (void)
1473 {
1474   struct delayed_link *ds;
1475
1476   for (ds = delayed_link_head; ds; )
1477     {
1478       struct string_list *sources = ds->sources;
1479       char const *valid_source = 0;
1480
1481       chdir_do (ds->change_dir);
1482
1483       for (sources = ds->sources; sources; sources = sources->next)
1484         {
1485           char const *source = sources->string;
1486           struct stat st;
1487
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)
1495             {
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)
1502                            == 0))
1503                 ;
1504               else if (!ds->is_symlink)
1505                 {
1506                   if (linkat (chdir_fd, ds->target, chdir_fd, source, 0) != 0)
1507                     link_error (ds->target, source);
1508                 }
1509               else if (symlinkat (ds->target, chdir_fd, source) != 0)
1510                 symlink_error (ds->target, source);
1511               else
1512                 {
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;
1522                 }
1523             }
1524         }
1525
1526       for (sources = ds->sources; sources; )
1527         {
1528           struct string_list *next = sources->next;
1529           free (sources);
1530           sources = next;
1531         }
1532
1533       {
1534         struct delayed_link *next = ds->next;
1535         free (ds);
1536         ds = next;
1537       }
1538     }
1539
1540   delayed_link_head = 0;
1541 }
1542
1543 /* Finish the extraction of an archive.  */
1544 void
1545 extract_finish (void)
1546 {
1547   /* First, fix the status of ordinary directories that need fixing.  */
1548   apply_nonancestor_delayed_set_stat ("", 0);
1549
1550   /* Then, apply delayed links, so that they don't affect delayed
1551      directory status-setting for ordinary directories.  */
1552   apply_delayed_links ();
1553
1554   /* Finally, fix the status of directories that are ancestors
1555      of delayed links.  */
1556   apply_nonancestor_delayed_set_stat ("", 1);
1557 }
1558
1559 bool
1560 rename_directory (char *src, char *dst)
1561 {
1562   if (renameat (chdir_fd, src, chdir_fd, dst) != 0)
1563     {
1564       int e = errno;
1565       bool interdir_made;
1566
1567       switch (e)
1568         {
1569         case ENOENT:
1570           if (make_directories (dst, &interdir_made) == 0)
1571             {
1572               if (renameat (chdir_fd, src, chdir_fd, dst) == 0)
1573                 return true;
1574               e = errno;
1575             }
1576           break;
1577
1578         case EXDEV:
1579           /* FIXME: Fall back to recursive copying */
1580
1581         default:
1582           break;
1583         }
1584
1585       ERROR ((0, e, _("Cannot rename %s to %s"),
1586               quote_n (0, src),
1587               quote_n (1, dst)));
1588       return false;
1589     }
1590   return true;
1591 }