]> Dogcows Code - chaz/tar/blob - src/extract.c
tar: quote 'like this', not `like this'
[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 birthtime of the placeholder.
114 birthtime.tv_nsec is negative if the birthtime is not available.
115 Don't use mtime as this would allow for false matches if some
116 other process removes the placeholder. Don't use ctime as
117 this would cause race conditions and other screwups, e.g.,
118 when restoring hard-linked symlinks. */
119 dev_t dev;
120 ino_t ino;
121 struct timespec birthtime;
122
123 /* True if the link is symbolic. */
124 bool is_symlink;
125
126 /* The desired metadata, valid only the link is symbolic. */
127 mode_t mode;
128 uid_t uid;
129 gid_t gid;
130 struct timespec atime;
131 struct timespec mtime;
132
133 /* The directory that the sources and target are relative to. */
134 int change_dir;
135
136 /* A list of sources for this link. The sources are all to be
137 hard-linked together. */
138 struct string_list *sources;
139
140 /* The desired target of the desired link. */
141 char target[1];
142 };
143
144 static struct delayed_link *delayed_link_head;
145
146 struct string_list
147 {
148 struct string_list *next;
149 char string[1];
150 };
151
152 /* Set up to extract files. */
153 void
154 extr_init (void)
155 {
156 we_are_root = geteuid () == 0;
157 same_permissions_option += we_are_root;
158 same_owner_option += we_are_root;
159
160 /* Option -p clears the kernel umask, so it does not affect proper
161 restoration of file permissions. New intermediate directories will
162 comply with umask at start of program. */
163
164 newdir_umask = umask (0);
165 if (0 < same_permissions_option)
166 current_umask = 0;
167 else
168 {
169 umask (newdir_umask); /* restore the kernel umask */
170 current_umask = newdir_umask;
171 }
172 }
173
174 /* Use fchmod if possible, fchmodat otherwise. */
175 static int
176 fd_chmod (int fd, char const *file, mode_t mode, int atflag)
177 {
178 if (0 <= fd)
179 {
180 int result = fchmod (fd, mode);
181 if (result == 0 || implemented (errno))
182 return result;
183 }
184 return fchmodat (chdir_fd, file, mode, atflag);
185 }
186
187 /* Use fchown if possible, fchownat otherwise. */
188 static int
189 fd_chown (int fd, char const *file, uid_t uid, gid_t gid, int atflag)
190 {
191 if (0 <= fd)
192 {
193 int result = fchown (fd, uid, gid);
194 if (result == 0 || implemented (errno))
195 return result;
196 }
197 return fchownat (chdir_fd, file, uid, gid, atflag);
198 }
199
200 /* Use fstat if possible, fstatat otherwise. */
201 static int
202 fd_stat (int fd, char const *file, struct stat *st, int atflag)
203 {
204 return (0 <= fd
205 ? fstat (fd, st)
206 : fstatat (chdir_fd, file, st, atflag));
207 }
208
209 /* Set the mode for FILE_NAME to MODE.
210 MODE_MASK specifies the bits of MODE that we care about;
211 thus if MODE_MASK is zero, do nothing.
212 If FD is nonnegative, it is a file descriptor for the file.
213 CURRENT_MODE and CURRENT_MODE_MASK specify information known about
214 the file's current mode, using the style of struct delayed_set_stat.
215 TYPEFLAG specifies the type of the file.
216 ATFLAG specifies the flag to use when statting the file. */
217 static void
218 set_mode (char const *file_name,
219 mode_t mode, mode_t mode_mask, int fd,
220 mode_t current_mode, mode_t current_mode_mask,
221 char typeflag, int atflag)
222 {
223 if (((current_mode ^ mode) | ~ current_mode_mask) & mode_mask)
224 {
225 if (MODE_ALL & ~ mode_mask & ~ current_mode_mask)
226 {
227 struct stat st;
228 if (fd_stat (fd, file_name, &st, atflag) != 0)
229 {
230 stat_error (file_name);
231 return;
232 }
233 current_mode = st.st_mode;
234 }
235
236 current_mode &= MODE_ALL;
237 mode = (current_mode & ~ mode_mask) | (mode & mode_mask);
238
239 if (current_mode != mode)
240 {
241 int chmod_errno =
242 fd_chmod (fd, file_name, mode, atflag) == 0 ? 0 : errno;
243
244 /* On Solaris, chmod may fail if we don't have PRIV_ALL, because
245 setuid-root files would otherwise be a backdoor. See
246 http://opensolaris.org/jive/thread.jspa?threadID=95826
247 (2009-09-03). */
248 if (chmod_errno == EPERM && (mode & S_ISUID)
249 && priv_set_restore_linkdir () == 0)
250 {
251 chmod_errno =
252 fd_chmod (fd, file_name, mode, atflag) == 0 ? 0 : errno;
253 priv_set_remove_linkdir ();
254 }
255
256 /* Linux fchmodat does not support AT_SYMLINK_NOFOLLOW, and
257 returns ENOTSUP even when operating on non-symlinks, try
258 again with the flag disabled if it does not appear to be
259 supported and if the file is not a symlink. This
260 introduces a race, alas. */
261 if (atflag && typeflag != SYMTYPE && ! implemented (chmod_errno))
262 chmod_errno = fd_chmod (fd, file_name, mode, 0) == 0 ? 0 : errno;
263
264 if (chmod_errno
265 && (typeflag != SYMTYPE || implemented (chmod_errno)))
266 {
267 errno = chmod_errno;
268 chmod_error_details (file_name, mode);
269 }
270 }
271 }
272 }
273
274 /* Check time after successfully setting FILE_NAME's time stamp to T. */
275 static void
276 check_time (char const *file_name, struct timespec t)
277 {
278 if (t.tv_sec <= 0)
279 WARNOPT (WARN_TIMESTAMP,
280 (0, 0, _("%s: implausibly old time stamp %s"),
281 file_name, tartime (t, true)));
282 else if (timespec_cmp (volume_start_time, t) < 0)
283 {
284 struct timespec now;
285 gettime (&now);
286 if (timespec_cmp (now, t) < 0)
287 {
288 char buf[TIMESPEC_STRSIZE_BOUND];
289 struct timespec diff;
290 diff.tv_sec = t.tv_sec - now.tv_sec;
291 diff.tv_nsec = t.tv_nsec - now.tv_nsec;
292 if (diff.tv_nsec < 0)
293 {
294 diff.tv_nsec += BILLION;
295 diff.tv_sec--;
296 }
297 WARNOPT (WARN_TIMESTAMP,
298 (0, 0, _("%s: time stamp %s is %s s in the future"),
299 file_name, tartime (t, true), code_timespec (diff, buf)));
300 }
301 }
302 }
303
304 /* Restore stat attributes (owner, group, mode and times) for
305 FILE_NAME, using information given in *ST.
306 If FD is nonnegative, it is a file descriptor for the file.
307 CURRENT_MODE and CURRENT_MODE_MASK specify information known about
308 the file's current mode, using the style of struct delayed_set_stat.
309 TYPEFLAG specifies the type of the file.
310 If INTERDIR, this is an intermediate directory.
311 ATFLAG specifies the flag to use when statting the file. */
312
313 static void
314 set_stat (char const *file_name,
315 struct tar_stat_info const *st,
316 int fd, mode_t current_mode, mode_t current_mode_mask,
317 char typeflag, bool interdir, int atflag)
318 {
319 /* Do the utime before the chmod because some versions of utime are
320 broken and trash the modes of the file. */
321
322 if (! touch_option && ! interdir)
323 {
324 struct timespec ts[2];
325 if (incremental_option)
326 ts[0] = st->atime;
327 else
328 ts[0].tv_nsec = UTIME_OMIT;
329 ts[1] = st->mtime;
330
331 if (fdutimensat (fd, chdir_fd, file_name, ts, atflag) == 0)
332 {
333 if (incremental_option)
334 check_time (file_name, ts[0]);
335 check_time (file_name, ts[1]);
336 }
337 else if (typeflag != SYMTYPE || implemented (errno))
338 utime_error (file_name);
339 }
340
341 if (0 < same_owner_option && ! interdir)
342 {
343 /* Some systems allow non-root users to give files away. Once this
344 done, it is not possible anymore to change file permissions.
345 However, setting file permissions now would be incorrect, since
346 they would apply to the wrong user, and there would be a race
347 condition. So, don't use systems that allow non-root users to
348 give files away. */
349 uid_t uid = st->stat.st_uid;
350 gid_t gid = st->stat.st_gid;
351
352 if (fd_chown (fd, file_name, uid, gid, atflag) == 0)
353 {
354 /* Changing the owner can clear st_mode bits in some cases. */
355 if ((current_mode | ~ current_mode_mask) & S_IXUGO)
356 current_mode_mask &= ~ (current_mode & (S_ISUID | S_ISGID));
357 }
358 else if (typeflag != SYMTYPE || implemented (errno))
359 chown_error_details (file_name, uid, gid);
360 }
361
362 set_mode (file_name,
363 st->stat.st_mode & ~ current_umask,
364 0 < same_permissions_option && ! interdir ? MODE_ALL : MODE_RWX,
365 fd, current_mode, current_mode_mask, typeflag, atflag);
366 }
367
368 /* For each entry H in the leading prefix of entries in HEAD that do
369 not have after_links marked, mark H and fill in its dev and ino
370 members. Assume HEAD && ! HEAD->after_links. */
371 static void
372 mark_after_links (struct delayed_set_stat *head)
373 {
374 struct delayed_set_stat *h = head;
375
376 do
377 {
378 struct stat st;
379 h->after_links = 1;
380
381 if (deref_stat (h->file_name, &st) != 0)
382 stat_error (h->file_name);
383 else
384 {
385 h->dev = st.st_dev;
386 h->ino = st.st_ino;
387 }
388 }
389 while ((h = h->next) && ! h->after_links);
390 }
391
392 /* Remember to restore stat attributes (owner, group, mode and times)
393 for the directory FILE_NAME, using information given in *ST,
394 once we stop extracting files into that directory.
395
396 If ST is null, merely create a placeholder node for an intermediate
397 directory that was created by make_directories.
398
399 NOTICE: this works only if the archive has usual member order, i.e.
400 directory, then the files in that directory. Incremental archive have
401 somewhat reversed order: first go subdirectories, then all other
402 members. To help cope with this case the variable
403 delay_directory_restore_option is set by prepare_to_extract.
404
405 If an archive was explicitely created so that its member order is
406 reversed, some directory timestamps can be restored incorrectly,
407 e.g.:
408 tar --no-recursion -cf archive dir dir/file1 foo dir/file2
409 */
410 static void
411 delay_set_stat (char const *file_name, struct tar_stat_info const *st,
412 mode_t current_mode, mode_t current_mode_mask,
413 mode_t mode, int atflag)
414 {
415 size_t file_name_len = strlen (file_name);
416 struct delayed_set_stat *data =
417 xmalloc (offsetof (struct delayed_set_stat, file_name)
418 + file_name_len + 1);
419 data->next = delayed_set_stat_head;
420 data->mode = mode;
421 if (st)
422 {
423 data->dev = st->stat.st_dev;
424 data->ino = st->stat.st_ino;
425 data->uid = st->stat.st_uid;
426 data->gid = st->stat.st_gid;
427 data->atime = st->atime;
428 data->mtime = st->mtime;
429 }
430 data->file_name_len = file_name_len;
431 data->current_mode = current_mode;
432 data->current_mode_mask = current_mode_mask;
433 data->interdir = ! st;
434 data->atflag = atflag;
435 data->after_links = 0;
436 data->change_dir = chdir_current;
437 strcpy (data->file_name, file_name);
438 delayed_set_stat_head = data;
439 if (must_be_dot_or_slash (file_name))
440 mark_after_links (data);
441 }
442
443 /* Update the delayed_set_stat info for an intermediate directory
444 created within the file name of DIR. The intermediate directory turned
445 out to be the same as this directory, e.g. due to ".." or symbolic
446 links. *DIR_STAT_INFO is the status of the directory. */
447 static void
448 repair_delayed_set_stat (char const *dir,
449 struct stat const *dir_stat_info)
450 {
451 struct delayed_set_stat *data;
452 for (data = delayed_set_stat_head; data; data = data->next)
453 {
454 struct stat st;
455 if (fstatat (chdir_fd, data->file_name, &st, data->atflag) != 0)
456 {
457 stat_error (data->file_name);
458 return;
459 }
460
461 if (st.st_dev == dir_stat_info->st_dev
462 && st.st_ino == dir_stat_info->st_ino)
463 {
464 data->dev = current_stat_info.stat.st_dev;
465 data->ino = current_stat_info.stat.st_ino;
466 data->mode = current_stat_info.stat.st_mode;
467 data->uid = current_stat_info.stat.st_uid;
468 data->gid = current_stat_info.stat.st_gid;
469 data->atime = current_stat_info.atime;
470 data->mtime = current_stat_info.mtime;
471 data->current_mode = st.st_mode;
472 data->current_mode_mask = ALL_MODE_BITS;
473 data->interdir = false;
474 return;
475 }
476 }
477
478 ERROR ((0, 0, _("%s: Unexpected inconsistency when making directory"),
479 quotearg_colon (dir)));
480 }
481
482 /* After a file/link/directory creation has failed, see if
483 it's because some required directory was not present, and if so,
484 create all required directories. Return zero if all the required
485 directories were created, nonzero (issuing a diagnostic) otherwise.
486 Set *INTERDIR_MADE if at least one directory was created. */
487 static int
488 make_directories (char *file_name, bool *interdir_made)
489 {
490 char *cursor0 = file_name + FILE_SYSTEM_PREFIX_LEN (file_name);
491 char *cursor; /* points into the file name */
492
493 for (cursor = cursor0; *cursor; cursor++)
494 {
495 mode_t mode;
496 mode_t desired_mode;
497 int status;
498
499 if (! ISSLASH (*cursor))
500 continue;
501
502 /* Avoid mkdir of empty string, if leading or double '/'. */
503
504 if (cursor == cursor0 || ISSLASH (cursor[-1]))
505 continue;
506
507 /* Avoid mkdir where last part of file name is "." or "..". */
508
509 if (cursor[-1] == '.'
510 && (cursor == cursor0 + 1 || ISSLASH (cursor[-2])
511 || (cursor[-2] == '.'
512 && (cursor == cursor0 + 2 || ISSLASH (cursor[-3])))))
513 continue;
514
515 *cursor = '\0'; /* truncate the name there */
516 desired_mode = MODE_RWX & ~ newdir_umask;
517 mode = desired_mode | (we_are_root ? 0 : MODE_WXUSR);
518 status = mkdirat (chdir_fd, file_name, mode);
519
520 if (status == 0)
521 {
522 /* Create a struct delayed_set_stat even if
523 mode == desired_mode, because
524 repair_delayed_set_stat may need to update the struct. */
525 delay_set_stat (file_name,
526 0, mode & ~ current_umask, MODE_RWX,
527 desired_mode, AT_SYMLINK_NOFOLLOW);
528
529 print_for_mkdir (file_name, cursor - file_name, desired_mode);
530 *interdir_made = true;
531 }
532 else if (errno == EEXIST)
533 status = 0;
534 else
535 {
536 /* Check whether the desired file exists. Even when the
537 file exists, mkdir can fail with some errno value E other
538 than EEXIST, so long as E describes an error condition
539 that also applies. */
540 int e = errno;
541 struct stat st;
542 status = fstatat (chdir_fd, file_name, &st, 0);
543 if (status)
544 {
545 errno = e;
546 mkdir_error (file_name);
547 }
548 }
549
550 *cursor = '/';
551 if (status)
552 return status;
553 }
554
555 return 0;
556 }
557
558 /* Return true if FILE_NAME (with status *STP, if STP) is not a
559 directory, and has a time stamp newer than (or equal to) that of
560 TAR_STAT. */
561 static bool
562 file_newer_p (const char *file_name, struct stat const *stp,
563 struct tar_stat_info *tar_stat)
564 {
565 struct stat st;
566
567 if (!stp)
568 {
569 if (deref_stat (file_name, &st) != 0)
570 {
571 if (errno != ENOENT)
572 {
573 stat_warn (file_name);
574 /* Be safer: if the file exists, assume it is newer. */
575 return true;
576 }
577 return false;
578 }
579 stp = &st;
580 }
581
582 return (! S_ISDIR (stp->st_mode)
583 && tar_timespec_cmp (tar_stat->mtime, get_stat_mtime (stp)) <= 0);
584 }
585
586 #define RECOVER_NO 0
587 #define RECOVER_OK 1
588 #define RECOVER_SKIP 2
589
590 /* Attempt repairing what went wrong with the extraction. Delete an
591 already existing file or create missing intermediate directories.
592 Return RECOVER_OK if we somewhat increased our chances at a successful
593 extraction, RECOVER_NO if there are no chances, and RECOVER_SKIP if the
594 caller should skip extraction of that member. The value of errno is
595 properly restored on returning RECOVER_NO.
596
597 If REGULAR, the caller was trying to extract onto a regular file.
598
599 Set *INTERDIR_MADE if an intermediate directory is made as part of
600 the recovery process. */
601
602 static int
603 maybe_recoverable (char *file_name, bool regular, bool *interdir_made)
604 {
605 int e = errno;
606 struct stat st;
607 struct stat const *stp = 0;
608
609 if (*interdir_made)
610 return RECOVER_NO;
611
612 switch (e)
613 {
614 case ELOOP:
615
616 /* With open ("symlink", O_NOFOLLOW|...), POSIX says errno == ELOOP,
617 but some operating systems do not conform to the standard. */
618 #ifdef EFTYPE
619 /* NetBSD uses errno == EFTYPE; see <http://gnats.netbsd.org/43154>. */
620 case EFTYPE:
621 #endif
622 /* FreeBSD 8.1 uses errno == EMLINK. */
623 case EMLINK:
624 /* Tru64 5.1B uses errno == ENOTSUP. */
625 case ENOTSUP:
626
627 if (! regular
628 || old_files_option != OVERWRITE_OLD_FILES || dereference_option)
629 break;
630 if (strchr (file_name, '/'))
631 {
632 if (deref_stat (file_name, &st) != 0)
633 break;
634 stp = &st;
635 }
636
637 /* The caller tried to open a symbolic link with O_NOFOLLOW.
638 Fall through, treating it as an already-existing file. */
639
640 case EEXIST:
641 /* Remove an old file, if the options allow this. */
642
643 switch (old_files_option)
644 {
645 case SKIP_OLD_FILES:
646 WARNOPT (WARN_EXISTING_FILE,
647 (0, 0, _("%s: skipping existing file"), file_name));
648 return RECOVER_SKIP;
649
650 case KEEP_OLD_FILES:
651 return RECOVER_NO;
652
653 case KEEP_NEWER_FILES:
654 if (file_newer_p (file_name, stp, &current_stat_info))
655 break;
656 /* FALL THROUGH */
657
658 case DEFAULT_OLD_FILES:
659 case NO_OVERWRITE_DIR_OLD_FILES:
660 case OVERWRITE_OLD_FILES:
661 if (0 < remove_any_file (file_name, ORDINARY_REMOVE_OPTION))
662 return RECOVER_OK;
663 break;
664
665 case UNLINK_FIRST_OLD_FILES:
666 break;
667 }
668
669 case ENOENT:
670 /* Attempt creating missing intermediate directories. */
671 if (make_directories (file_name, interdir_made) == 0 && *interdir_made)
672 return RECOVER_OK;
673 break;
674
675 default:
676 /* Just say we can't do anything about it... */
677 break;
678 }
679
680 errno = e;
681 return RECOVER_NO;
682 }
683
684 /* Fix the statuses of all directories whose statuses need fixing, and
685 which are not ancestors of FILE_NAME. If AFTER_LINKS is
686 nonzero, do this for all such directories; otherwise, stop at the
687 first directory that is marked to be fixed up only after delayed
688 links are applied. */
689 static void
690 apply_nonancestor_delayed_set_stat (char const *file_name, bool after_links)
691 {
692 size_t file_name_len = strlen (file_name);
693 bool check_for_renamed_directories = 0;
694
695 while (delayed_set_stat_head)
696 {
697 struct delayed_set_stat *data = delayed_set_stat_head;
698 bool skip_this_one = 0;
699 struct stat st;
700 mode_t current_mode = data->current_mode;
701 mode_t current_mode_mask = data->current_mode_mask;
702
703 check_for_renamed_directories |= data->after_links;
704
705 if (after_links < data->after_links
706 || (data->file_name_len < file_name_len
707 && file_name[data->file_name_len]
708 && (ISSLASH (file_name[data->file_name_len])
709 || ISSLASH (file_name[data->file_name_len - 1]))
710 && memcmp (file_name, data->file_name, data->file_name_len) == 0))
711 break;
712
713 chdir_do (data->change_dir);
714
715 if (check_for_renamed_directories)
716 {
717 if (fstatat (chdir_fd, data->file_name, &st, data->atflag) != 0)
718 {
719 stat_error (data->file_name);
720 skip_this_one = 1;
721 }
722 else
723 {
724 current_mode = st.st_mode;
725 current_mode_mask = ALL_MODE_BITS;
726 if (! (st.st_dev == data->dev && st.st_ino == data->ino))
727 {
728 ERROR ((0, 0,
729 _("%s: Directory renamed before its status could be extracted"),
730 quotearg_colon (data->file_name)));
731 skip_this_one = 1;
732 }
733 }
734 }
735
736 if (! skip_this_one)
737 {
738 struct tar_stat_info sb;
739 sb.stat.st_mode = data->mode;
740 sb.stat.st_uid = data->uid;
741 sb.stat.st_gid = data->gid;
742 sb.atime = data->atime;
743 sb.mtime = data->mtime;
744 set_stat (data->file_name, &sb,
745 -1, current_mode, current_mode_mask,
746 DIRTYPE, data->interdir, data->atflag);
747 }
748
749 delayed_set_stat_head = data->next;
750 free (data);
751 }
752 }
753
754 \f
755
756 /* Extractor functions for various member types */
757
758 static int
759 extract_dir (char *file_name, int typeflag)
760 {
761 int status;
762 mode_t mode;
763 mode_t current_mode = 0;
764 mode_t current_mode_mask = 0;
765 int atflag = 0;
766 bool interdir_made = false;
767
768 /* Save 'root device' to avoid purging mount points. */
769 if (one_file_system_option && root_device == 0)
770 {
771 struct stat st;
772
773 if (fstatat (chdir_fd, ".", &st, 0) != 0)
774 stat_diag (".");
775 else
776 root_device = st.st_dev;
777 }
778
779 if (incremental_option)
780 /* Read the entry and delete files that aren't listed in the archive. */
781 purge_directory (file_name);
782 else if (typeflag == GNUTYPE_DUMPDIR)
783 skip_member ();
784
785 /* If ownership or permissions will be restored later, create the
786 directory with restrictive permissions at first, so that in the
787 meantime processes owned by other users do not inadvertently
788 create files under this directory that inherit the wrong owner,
789 group, or permissions from the directory. If not root, though,
790 make the directory writeable and searchable at first, so that
791 files can be created under it. */
792 mode = ((current_stat_info.stat.st_mode
793 & (0 < same_owner_option || 0 < same_permissions_option
794 ? S_IRWXU
795 : MODE_RWX))
796 | (we_are_root ? 0 : MODE_WXUSR));
797
798 for (;;)
799 {
800 status = mkdirat (chdir_fd, file_name, mode);
801 if (status == 0)
802 {
803 current_mode = mode & ~ current_umask;
804 current_mode_mask = MODE_RWX;
805 atflag = AT_SYMLINK_NOFOLLOW;
806 break;
807 }
808
809 if (errno == EEXIST
810 && (interdir_made
811 || old_files_option == DEFAULT_OLD_FILES
812 || old_files_option == OVERWRITE_OLD_FILES))
813 {
814 struct stat st;
815 if (deref_stat (file_name, &st) == 0)
816 {
817 current_mode = st.st_mode;
818 current_mode_mask = ALL_MODE_BITS;
819
820 if (S_ISDIR (current_mode))
821 {
822 if (interdir_made)
823 {
824 repair_delayed_set_stat (file_name, &st);
825 return 0;
826 }
827 break;
828 }
829 }
830 errno = EEXIST;
831 }
832
833 switch (maybe_recoverable (file_name, false, &interdir_made))
834 {
835 case RECOVER_OK:
836 continue;
837
838 case RECOVER_SKIP:
839 break;
840
841 case RECOVER_NO:
842 if (errno != EEXIST)
843 {
844 mkdir_error (file_name);
845 return 1;
846 }
847 break;
848 }
849 break;
850 }
851
852 if (status == 0
853 || old_files_option == DEFAULT_OLD_FILES
854 || old_files_option == OVERWRITE_OLD_FILES)
855 delay_set_stat (file_name, &current_stat_info,
856 current_mode, current_mode_mask,
857 current_stat_info.stat.st_mode, atflag);
858 return status;
859 }
860
861
862
863 static int
864 open_output_file (char const *file_name, int typeflag, mode_t mode,
865 mode_t *current_mode, mode_t *current_mode_mask)
866 {
867 int fd;
868 bool overwriting_old_files = old_files_option == OVERWRITE_OLD_FILES;
869 int openflag = (O_WRONLY | O_BINARY | O_CLOEXEC | O_NOCTTY | O_NONBLOCK
870 | O_CREAT
871 | (overwriting_old_files
872 ? O_TRUNC | (dereference_option ? 0 : O_NOFOLLOW)
873 : O_EXCL));
874
875 if (typeflag == CONTTYPE)
876 {
877 static int conttype_diagnosed;
878
879 if (!conttype_diagnosed)
880 {
881 conttype_diagnosed = 1;
882 WARNOPT (WARN_CONTIGUOUS_CAST,
883 (0, 0, _("Extracting contiguous files as regular files")));
884 }
885 }
886
887 /* If O_NOFOLLOW is needed but does not work, check for a symlink
888 separately. There's a race condition, but that cannot be avoided
889 on hosts lacking O_NOFOLLOW. */
890 if (! HAVE_WORKING_O_NOFOLLOW
891 && overwriting_old_files && ! dereference_option)
892 {
893 struct stat st;
894 if (fstatat (chdir_fd, file_name, &st, AT_SYMLINK_NOFOLLOW) == 0
895 && S_ISLNK (st.st_mode))
896 {
897 errno = ELOOP;
898 return -1;
899 }
900 }
901
902 fd = openat (chdir_fd, file_name, openflag, mode);
903 if (0 <= fd)
904 {
905 if (overwriting_old_files)
906 {
907 struct stat st;
908 if (fstat (fd, &st) != 0)
909 {
910 int e = errno;
911 close (fd);
912 errno = e;
913 return -1;
914 }
915 if (! S_ISREG (st.st_mode))
916 {
917 close (fd);
918 errno = EEXIST;
919 return -1;
920 }
921 *current_mode = st.st_mode;
922 *current_mode_mask = ALL_MODE_BITS;
923 }
924 else
925 {
926 *current_mode = mode & ~ current_umask;
927 *current_mode_mask = MODE_RWX;
928 }
929 }
930
931 return fd;
932 }
933
934 static int
935 extract_file (char *file_name, int typeflag)
936 {
937 int fd;
938 off_t size;
939 union block *data_block;
940 int status;
941 size_t count;
942 size_t written;
943 bool interdir_made = false;
944 mode_t mode = (current_stat_info.stat.st_mode & MODE_RWX
945 & ~ (0 < same_owner_option ? S_IRWXG | S_IRWXO : 0));
946 mode_t current_mode = 0;
947 mode_t current_mode_mask = 0;
948
949 if (to_stdout_option)
950 fd = STDOUT_FILENO;
951 else if (to_command_option)
952 {
953 fd = sys_exec_command (file_name, 'f', &current_stat_info);
954 if (fd < 0)
955 {
956 skip_member ();
957 return 0;
958 }
959 }
960 else
961 {
962 while ((fd = open_output_file (file_name, typeflag, mode,
963 &current_mode, &current_mode_mask))
964 < 0)
965 {
966 int recover = maybe_recoverable (file_name, true, &interdir_made);
967 if (recover != RECOVER_OK)
968 {
969 skip_member ();
970 if (recover == RECOVER_SKIP)
971 return 0;
972 open_error (file_name);
973 return 1;
974 }
975 }
976 }
977
978 mv_begin_read (&current_stat_info);
979 if (current_stat_info.is_sparse)
980 sparse_extract_file (fd, &current_stat_info, &size);
981 else
982 for (size = current_stat_info.stat.st_size; size > 0; )
983 {
984 mv_size_left (size);
985
986 /* Locate data, determine max length writeable, write it,
987 block that we have used the data, then check if the write
988 worked. */
989
990 data_block = find_next_block ();
991 if (! data_block)
992 {
993 ERROR ((0, 0, _("Unexpected EOF in archive")));
994 break; /* FIXME: What happens, then? */
995 }
996
997 written = available_space_after (data_block);
998
999 if (written > size)
1000 written = size;
1001 errno = 0;
1002 count = blocking_write (fd, data_block->buffer, written);
1003 size -= written;
1004
1005 set_next_block_after ((union block *)
1006 (data_block->buffer + written - 1));
1007 if (count != written)
1008 {
1009 if (!to_command_option)
1010 write_error_details (file_name, count, written);
1011 /* FIXME: shouldn't we restore from backup? */
1012 break;
1013 }
1014 }
1015
1016 skip_file (size);
1017
1018 mv_end ();
1019
1020 /* If writing to stdout, don't try to do anything to the filename;
1021 it doesn't exist, or we don't want to touch it anyway. */
1022
1023 if (to_stdout_option)
1024 return 0;
1025
1026 if (! to_command_option)
1027 set_stat (file_name, &current_stat_info, fd,
1028 current_mode, current_mode_mask, typeflag, false,
1029 (old_files_option == OVERWRITE_OLD_FILES
1030 ? 0 : AT_SYMLINK_NOFOLLOW));
1031
1032 status = close (fd);
1033 if (status < 0)
1034 close_error (file_name);
1035
1036 if (to_command_option)
1037 sys_wait_command ();
1038
1039 return status;
1040 }
1041
1042 /* Create a placeholder file with name FILE_NAME, which will be
1043 replaced after other extraction is done by a symbolic link if
1044 IS_SYMLINK is true, and by a hard link otherwise. Set
1045 *INTERDIR_MADE if an intermediate directory is made in the
1046 process. */
1047
1048 static int
1049 create_placeholder_file (char *file_name, bool is_symlink, bool *interdir_made)
1050 {
1051 int fd;
1052 struct stat st;
1053
1054 while ((fd = openat (chdir_fd, file_name, O_WRONLY | O_CREAT | O_EXCL, 0)) < 0)
1055 {
1056 switch (maybe_recoverable (file_name, false, interdir_made))
1057 {
1058 case RECOVER_OK:
1059 continue;
1060
1061 case RECOVER_SKIP:
1062 return 0;
1063
1064 case RECOVER_NO:
1065 open_error (file_name);
1066 return -1;
1067 }
1068 }
1069
1070 if (fstat (fd, &st) != 0)
1071 {
1072 stat_error (file_name);
1073 close (fd);
1074 }
1075 else if (close (fd) != 0)
1076 close_error (file_name);
1077 else
1078 {
1079 struct delayed_set_stat *h;
1080 struct delayed_link *p =
1081 xmalloc (offsetof (struct delayed_link, target)
1082 + strlen (current_stat_info.link_name)
1083 + 1);
1084 p->next = delayed_link_head;
1085 delayed_link_head = p;
1086 p->dev = st.st_dev;
1087 p->ino = st.st_ino;
1088 p->birthtime = get_stat_birthtime (&st);
1089 p->is_symlink = is_symlink;
1090 if (is_symlink)
1091 {
1092 p->mode = current_stat_info.stat.st_mode;
1093 p->uid = current_stat_info.stat.st_uid;
1094 p->gid = current_stat_info.stat.st_gid;
1095 p->atime = current_stat_info.atime;
1096 p->mtime = current_stat_info.mtime;
1097 }
1098 p->change_dir = chdir_current;
1099 p->sources = xmalloc (offsetof (struct string_list, string)
1100 + strlen (file_name) + 1);
1101 p->sources->next = 0;
1102 strcpy (p->sources->string, file_name);
1103 strcpy (p->target, current_stat_info.link_name);
1104
1105 h = delayed_set_stat_head;
1106 if (h && ! h->after_links
1107 && strncmp (file_name, h->file_name, h->file_name_len) == 0
1108 && ISSLASH (file_name[h->file_name_len])
1109 && (last_component (file_name) == file_name + h->file_name_len + 1))
1110 mark_after_links (h);
1111
1112 return 0;
1113 }
1114
1115 return -1;
1116 }
1117
1118 static int
1119 extract_link (char *file_name, int typeflag)
1120 {
1121 bool interdir_made = false;
1122 char const *link_name;
1123 int rc;
1124
1125 link_name = current_stat_info.link_name;
1126
1127 if (! absolute_names_option && contains_dot_dot (link_name))
1128 return create_placeholder_file (file_name, false, &interdir_made);
1129
1130 do
1131 {
1132 struct stat st1, st2;
1133 int e;
1134 int status = linkat (chdir_fd, link_name, chdir_fd, file_name, 0);
1135 e = errno;
1136
1137 if (status == 0)
1138 {
1139 struct delayed_link *ds = delayed_link_head;
1140 if (ds
1141 && fstatat (chdir_fd, link_name, &st1, AT_SYMLINK_NOFOLLOW) == 0)
1142 for (; ds; ds = ds->next)
1143 if (ds->change_dir == chdir_current
1144 && ds->dev == st1.st_dev
1145 && ds->ino == st1.st_ino
1146 && (timespec_cmp (ds->birthtime, get_stat_birthtime (&st1))
1147 == 0))
1148 {
1149 struct string_list *p = xmalloc (offsetof (struct string_list, string)
1150 + strlen (file_name) + 1);
1151 strcpy (p->string, file_name);
1152 p->next = ds->sources;
1153 ds->sources = p;
1154 break;
1155 }
1156 return 0;
1157 }
1158 else if ((e == EEXIST && strcmp (link_name, file_name) == 0)
1159 || ((fstatat (chdir_fd, link_name, &st1, AT_SYMLINK_NOFOLLOW)
1160 == 0)
1161 && (fstatat (chdir_fd, file_name, &st2, AT_SYMLINK_NOFOLLOW)
1162 == 0)
1163 && st1.st_dev == st2.st_dev
1164 && st1.st_ino == st2.st_ino))
1165 return 0;
1166
1167 errno = e;
1168 }
1169 while ((rc = maybe_recoverable (file_name, false, &interdir_made))
1170 == RECOVER_OK);
1171
1172 if (rc == RECOVER_SKIP)
1173 return 0;
1174 if (!(incremental_option && errno == EEXIST))
1175 {
1176 link_error (link_name, file_name);
1177 return 1;
1178 }
1179 return 0;
1180 }
1181
1182 static int
1183 extract_symlink (char *file_name, int typeflag)
1184 {
1185 #ifdef HAVE_SYMLINK
1186 bool interdir_made = false;
1187
1188 if (! absolute_names_option
1189 && (IS_ABSOLUTE_FILE_NAME (current_stat_info.link_name)
1190 || contains_dot_dot (current_stat_info.link_name)))
1191 return create_placeholder_file (file_name, true, &interdir_made);
1192
1193 while (symlinkat (current_stat_info.link_name, chdir_fd, file_name) != 0)
1194 switch (maybe_recoverable (file_name, false, &interdir_made))
1195 {
1196 case RECOVER_OK:
1197 continue;
1198
1199 case RECOVER_SKIP:
1200 return 0;
1201
1202 case RECOVER_NO:
1203 symlink_error (current_stat_info.link_name, file_name);
1204 return -1;
1205 }
1206
1207 set_stat (file_name, &current_stat_info, -1, 0, 0,
1208 SYMTYPE, false, AT_SYMLINK_NOFOLLOW);
1209 return 0;
1210
1211 #else
1212 static int warned_once;
1213
1214 if (!warned_once)
1215 {
1216 warned_once = 1;
1217 WARNOPT (WARN_SYMBOLIC_CAST,
1218 (0, 0,
1219 _("Attempting extraction of symbolic links as hard links")));
1220 }
1221 return extract_link (file_name, typeflag);
1222 #endif
1223 }
1224
1225 #if S_IFCHR || S_IFBLK
1226 static int
1227 extract_node (char *file_name, int typeflag)
1228 {
1229 bool interdir_made = false;
1230 mode_t mode = (current_stat_info.stat.st_mode & (MODE_RWX | S_IFBLK | S_IFCHR)
1231 & ~ (0 < same_owner_option ? S_IRWXG | S_IRWXO : 0));
1232
1233 while (mknodat (chdir_fd, file_name, mode, current_stat_info.stat.st_rdev)
1234 != 0)
1235 switch (maybe_recoverable (file_name, false, &interdir_made))
1236 {
1237 case RECOVER_OK:
1238 continue;
1239
1240 case RECOVER_SKIP:
1241 return 0;
1242
1243 case RECOVER_NO:
1244 mknod_error (file_name);
1245 return -1;
1246 }
1247
1248 set_stat (file_name, &current_stat_info, -1,
1249 mode & ~ current_umask, MODE_RWX,
1250 typeflag, false, AT_SYMLINK_NOFOLLOW);
1251 return 0;
1252 }
1253 #endif
1254
1255 #if HAVE_MKFIFO || defined mkfifo
1256 static int
1257 extract_fifo (char *file_name, int typeflag)
1258 {
1259 bool interdir_made = false;
1260 mode_t mode = (current_stat_info.stat.st_mode & MODE_RWX
1261 & ~ (0 < same_owner_option ? S_IRWXG | S_IRWXO : 0));
1262
1263 while (mkfifoat (chdir_fd, file_name, mode) != 0)
1264 switch (maybe_recoverable (file_name, false, &interdir_made))
1265 {
1266 case RECOVER_OK:
1267 continue;
1268
1269 case RECOVER_SKIP:
1270 return 0;
1271
1272 case RECOVER_NO:
1273 mkfifo_error (file_name);
1274 return -1;
1275 }
1276
1277 set_stat (file_name, &current_stat_info, -1,
1278 mode & ~ current_umask, MODE_RWX,
1279 typeflag, false, AT_SYMLINK_NOFOLLOW);
1280 return 0;
1281 }
1282 #endif
1283
1284 static int
1285 extract_volhdr (char *file_name, int typeflag)
1286 {
1287 skip_member ();
1288 return 0;
1289 }
1290
1291 static int
1292 extract_failure (char *file_name, int typeflag)
1293 {
1294 return 1;
1295 }
1296
1297 typedef int (*tar_extractor_t) (char *file_name, int typeflag);
1298
1299 \f
1300
1301 /* Prepare to extract a file. Find extractor function.
1302 Return zero if extraction should not proceed. */
1303
1304 static int
1305 prepare_to_extract (char const *file_name, int typeflag, tar_extractor_t *fun)
1306 {
1307 int rc = 1;
1308
1309 if (EXTRACT_OVER_PIPE)
1310 rc = 0;
1311
1312 /* Select the extractor */
1313 switch (typeflag)
1314 {
1315 case GNUTYPE_SPARSE:
1316 *fun = extract_file;
1317 rc = 1;
1318 break;
1319
1320 case AREGTYPE:
1321 case REGTYPE:
1322 case CONTTYPE:
1323 /* Appears to be a file. But BSD tar uses the convention that a slash
1324 suffix means a directory. */
1325 if (current_stat_info.had_trailing_slash)
1326 *fun = extract_dir;
1327 else
1328 {
1329 *fun = extract_file;
1330 rc = 1;
1331 }
1332 break;
1333
1334 case SYMTYPE:
1335 *fun = extract_symlink;
1336 break;
1337
1338 case LNKTYPE:
1339 *fun = extract_link;
1340 break;
1341
1342 #if S_IFCHR
1343 case CHRTYPE:
1344 current_stat_info.stat.st_mode |= S_IFCHR;
1345 *fun = extract_node;
1346 break;
1347 #endif
1348
1349 #if S_IFBLK
1350 case BLKTYPE:
1351 current_stat_info.stat.st_mode |= S_IFBLK;
1352 *fun = extract_node;
1353 break;
1354 #endif
1355
1356 #if HAVE_MKFIFO || defined mkfifo
1357 case FIFOTYPE:
1358 *fun = extract_fifo;
1359 break;
1360 #endif
1361
1362 case DIRTYPE:
1363 case GNUTYPE_DUMPDIR:
1364 *fun = extract_dir;
1365 if (current_stat_info.is_dumpdir)
1366 delay_directory_restore_option = true;
1367 break;
1368
1369 case GNUTYPE_VOLHDR:
1370 *fun = extract_volhdr;
1371 break;
1372
1373 case GNUTYPE_MULTIVOL:
1374 ERROR ((0, 0,
1375 _("%s: Cannot extract -- file is continued from another volume"),
1376 quotearg_colon (current_stat_info.file_name)));
1377 *fun = extract_failure;
1378 break;
1379
1380 case GNUTYPE_LONGNAME:
1381 case GNUTYPE_LONGLINK:
1382 ERROR ((0, 0, _("Unexpected long name header")));
1383 *fun = extract_failure;
1384 break;
1385
1386 default:
1387 WARNOPT (WARN_UNKNOWN_CAST,
1388 (0, 0,
1389 _("%s: Unknown file type '%c', extracted as normal file"),
1390 quotearg_colon (file_name), typeflag));
1391 *fun = extract_file;
1392 }
1393
1394 /* Determine whether the extraction should proceed */
1395 if (rc == 0)
1396 return 0;
1397
1398 switch (old_files_option)
1399 {
1400 case UNLINK_FIRST_OLD_FILES:
1401 if (!remove_any_file (file_name,
1402 recursive_unlink_option ? RECURSIVE_REMOVE_OPTION
1403 : ORDINARY_REMOVE_OPTION)
1404 && errno && errno != ENOENT)
1405 {
1406 unlink_error (file_name);
1407 return 0;
1408 }
1409 break;
1410
1411 case KEEP_NEWER_FILES:
1412 if (file_newer_p (file_name, 0, &current_stat_info))
1413 {
1414 WARNOPT (WARN_IGNORE_NEWER,
1415 (0, 0, _("Current %s is newer or same age"),
1416 quote (file_name)));
1417 return 0;
1418 }
1419 break;
1420
1421 default:
1422 break;
1423 }
1424
1425 return 1;
1426 }
1427
1428 /* Extract a file from the archive. */
1429 void
1430 extract_archive (void)
1431 {
1432 char typeflag;
1433 tar_extractor_t fun;
1434
1435 fatal_exit_hook = extract_finish;
1436
1437 set_next_block_after (current_header);
1438
1439 if (!current_stat_info.file_name[0]
1440 || (interactive_option
1441 && !confirm ("extract", current_stat_info.file_name)))
1442 {
1443 skip_member ();
1444 return;
1445 }
1446
1447 /* Print the block from current_header and current_stat. */
1448 if (verbose_option)
1449 print_header (&current_stat_info, current_header, -1);
1450
1451 /* Restore stats for all non-ancestor directories, unless
1452 it is an incremental archive.
1453 (see NOTICE in the comment to delay_set_stat above) */
1454 if (!delay_directory_restore_option)
1455 {
1456 int dir = chdir_current;
1457 apply_nonancestor_delayed_set_stat (current_stat_info.file_name, 0);
1458 chdir_do (dir);
1459 }
1460
1461 /* Take a safety backup of a previously existing file. */
1462
1463 if (backup_option)
1464 if (!maybe_backup_file (current_stat_info.file_name, 0))
1465 {
1466 int e = errno;
1467 ERROR ((0, e, _("%s: Was unable to backup this file"),
1468 quotearg_colon (current_stat_info.file_name)));
1469 skip_member ();
1470 return;
1471 }
1472
1473 /* Extract the archive entry according to its type. */
1474 /* KLUDGE */
1475 typeflag = sparse_member_p (&current_stat_info) ?
1476 GNUTYPE_SPARSE : current_header->header.typeflag;
1477
1478 if (prepare_to_extract (current_stat_info.file_name, typeflag, &fun))
1479 {
1480 if (fun && (*fun) (current_stat_info.file_name, typeflag)
1481 && backup_option)
1482 undo_last_backup ();
1483 }
1484 else
1485 skip_member ();
1486
1487 }
1488
1489 /* Extract the links whose final extraction were delayed. */
1490 static void
1491 apply_delayed_links (void)
1492 {
1493 struct delayed_link *ds;
1494
1495 for (ds = delayed_link_head; ds; )
1496 {
1497 struct string_list *sources = ds->sources;
1498 char const *valid_source = 0;
1499
1500 chdir_do (ds->change_dir);
1501
1502 for (sources = ds->sources; sources; sources = sources->next)
1503 {
1504 char const *source = sources->string;
1505 struct stat st;
1506
1507 /* Make sure the placeholder file is still there. If not,
1508 don't create a link, as the placeholder was probably
1509 removed by a later extraction. */
1510 if (fstatat (chdir_fd, source, &st, AT_SYMLINK_NOFOLLOW) == 0
1511 && st.st_dev == ds->dev
1512 && st.st_ino == ds->ino
1513 && timespec_cmp (get_stat_birthtime (&st), ds->birthtime) == 0)
1514 {
1515 /* Unlink the placeholder, then create a hard link if possible,
1516 a symbolic link otherwise. */
1517 if (unlinkat (chdir_fd, source, 0) != 0)
1518 unlink_error (source);
1519 else if (valid_source
1520 && (linkat (chdir_fd, valid_source, chdir_fd, source, 0)
1521 == 0))
1522 ;
1523 else if (!ds->is_symlink)
1524 {
1525 if (linkat (chdir_fd, ds->target, chdir_fd, source, 0) != 0)
1526 link_error (ds->target, source);
1527 }
1528 else if (symlinkat (ds->target, chdir_fd, source) != 0)
1529 symlink_error (ds->target, source);
1530 else
1531 {
1532 struct tar_stat_info st1;
1533 st1.stat.st_mode = ds->mode;
1534 st1.stat.st_uid = ds->uid;
1535 st1.stat.st_gid = ds->gid;
1536 st1.atime = ds->atime;
1537 st1.mtime = ds->mtime;
1538 set_stat (source, &st1, -1, 0, 0, SYMTYPE,
1539 false, AT_SYMLINK_NOFOLLOW);
1540 valid_source = source;
1541 }
1542 }
1543 }
1544
1545 for (sources = ds->sources; sources; )
1546 {
1547 struct string_list *next = sources->next;
1548 free (sources);
1549 sources = next;
1550 }
1551
1552 {
1553 struct delayed_link *next = ds->next;
1554 free (ds);
1555 ds = next;
1556 }
1557 }
1558
1559 delayed_link_head = 0;
1560 }
1561
1562 /* Finish the extraction of an archive. */
1563 void
1564 extract_finish (void)
1565 {
1566 /* First, fix the status of ordinary directories that need fixing. */
1567 apply_nonancestor_delayed_set_stat ("", 0);
1568
1569 /* Then, apply delayed links, so that they don't affect delayed
1570 directory status-setting for ordinary directories. */
1571 apply_delayed_links ();
1572
1573 /* Finally, fix the status of directories that are ancestors
1574 of delayed links. */
1575 apply_nonancestor_delayed_set_stat ("", 1);
1576 }
1577
1578 bool
1579 rename_directory (char *src, char *dst)
1580 {
1581 if (renameat (chdir_fd, src, chdir_fd, dst) != 0)
1582 {
1583 int e = errno;
1584 bool interdir_made;
1585
1586 switch (e)
1587 {
1588 case ENOENT:
1589 if (make_directories (dst, &interdir_made) == 0)
1590 {
1591 if (renameat (chdir_fd, src, chdir_fd, dst) == 0)
1592 return true;
1593 e = errno;
1594 }
1595 break;
1596
1597 case EXDEV:
1598 /* FIXME: Fall back to recursive copying */
1599
1600 default:
1601 break;
1602 }
1603
1604 ERROR ((0, e, _("Cannot rename %s to %s"),
1605 quote_n (0, src),
1606 quote_n (1, dst)));
1607 return false;
1608 }
1609 return true;
1610 }
This page took 0.09831 seconds and 5 git commands to generate.