]> Dogcows Code - chaz/tar/blob - src/extract.c
tar: work around FreeBSD symlink incompatibility with POSIX
[chaz/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 }
This page took 0.112367 seconds and 5 git commands to generate.