]> git.cworth.org Git - tar/blob - src/extract.c
32a883f6592f23a505410a4b09d03b2e066f1e1f
[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 <utimens.h>
25 #include <errno.h>
26 #include <xgetcwd.h>
27 #include <priv-set.h>
28
29 #include "common.h"
30
31 static bool we_are_root;        /* true if our effective uid == 0 */
32 static mode_t newdir_umask;     /* umask when creating new directories */
33 static mode_t current_umask;    /* current umask (which is set to 0 if -p) */
34
35 /* Status of the permissions of a file that we are extracting.  */
36 enum permstatus
37 {
38   /* This file may have existed already; its permissions are unknown.  */
39   UNKNOWN_PERMSTATUS,
40
41   /* This file was created using the permissions from the archive,
42      except with S_IRWXG | S_IRWXO masked out if 0 < same_owner_option.  */
43   ARCHIVED_PERMSTATUS,
44
45   /* This is an intermediate directory; the archive did not specify
46      its permissions.  */
47   INTERDIR_PERMSTATUS
48 };
49
50 /* List of directories whose statuses we need to extract after we've
51    finished extracting their subsidiary files.  If you consider each
52    contiguous subsequence of elements of the form [D]?[^D]*, where [D]
53    represents an element where AFTER_LINKS is nonzero and [^D]
54    represents an element where AFTER_LINKS is zero, then the head
55    of the subsequence has the longest name, and each non-head element
56    in the prefix is an ancestor (in the directory hierarchy) of the
57    preceding element.  */
58
59 struct delayed_set_stat
60   {
61     struct delayed_set_stat *next;
62     dev_t dev;
63     ino_t ino;
64     mode_t mode;
65     uid_t uid;
66     gid_t gid;
67     struct timespec atime;
68     struct timespec mtime;
69     size_t file_name_len;
70     mode_t invert_permissions;
71     enum permstatus permstatus;
72     bool after_links;
73     char file_name[1];
74   };
75
76 static struct delayed_set_stat *delayed_set_stat_head;
77
78 /* List of links whose creation we have delayed.  */
79 struct delayed_link
80   {
81     /* The next delayed link in the list.  */
82     struct delayed_link *next;
83
84     /* The device, inode number and last-modified time of the placeholder.  */
85     dev_t dev;
86     ino_t ino;
87     struct timespec mtime;
88
89     /* True if the link is symbolic.  */
90     bool is_symlink;
91
92     /* The desired owner and group of the link, if it is a symlink.  */
93     uid_t uid;
94     gid_t gid;
95
96     /* A list of sources for this link.  The sources are all to be
97        hard-linked together.  */
98     struct string_list *sources;
99
100     /* The desired target of the desired link.  */
101     char target[1];
102   };
103
104 static struct delayed_link *delayed_link_head;
105
106 struct string_list
107   {
108     struct string_list *next;
109     char string[1];
110   };
111
112 /*  Set up to extract files.  */
113 void
114 extr_init (void)
115 {
116   we_are_root = geteuid () == 0;
117   same_permissions_option += we_are_root;
118   same_owner_option += we_are_root;
119
120   /* Option -p clears the kernel umask, so it does not affect proper
121      restoration of file permissions.  New intermediate directories will
122      comply with umask at start of program.  */
123
124   newdir_umask = umask (0);
125   if (0 < same_permissions_option)
126     current_umask = 0;
127   else
128     {
129       umask (newdir_umask);     /* restore the kernel umask */
130       current_umask = newdir_umask;
131     }
132 }
133
134 /* If restoring permissions, restore the mode for FILE_NAME from
135    information given in *STAT_INFO (where *CUR_INFO gives
136    the current status if CUR_INFO is nonzero); otherwise invert the
137    INVERT_PERMISSIONS bits from the file's current permissions.
138    PERMSTATUS specifies the status of the file's permissions.
139    TYPEFLAG specifies the type of the file.  */
140 static void
141 set_mode (char const *file_name,
142           struct stat const *stat_info,
143           struct stat const *cur_info,
144           mode_t invert_permissions, enum permstatus permstatus,
145           char typeflag)
146 {
147   mode_t mode;
148   bool failed;
149   
150   if (0 < same_permissions_option
151       && permstatus != INTERDIR_PERMSTATUS)
152     {
153       mode = stat_info->st_mode;
154
155       /* If we created the file and it has a mode that we set already
156          with O_CREAT, then its mode is often set correctly already.
157          But if we are changing ownership, the mode's group and and
158          other permission bits were omitted originally, so it's less
159          likely that the mode is OK now.  Also, on many hosts, some
160          directories inherit the setgid bits from their parents, so we
161          we must set directories' modes explicitly.  */
162       if ((permstatus == ARCHIVED_PERMSTATUS
163            && ! (mode & ~ (0 < same_owner_option ? S_IRWXU : MODE_RWX)))
164           && typeflag != DIRTYPE
165           && typeflag != GNUTYPE_DUMPDIR)
166         return;
167     }
168   else if (! invert_permissions)
169     return;
170   else
171     {
172       /* We must inspect a directory's current permissions, since the
173          directory may have inherited its setgid bit from its parent.
174
175          INVERT_PERMISSIONS happens to be nonzero only for directories
176          that we created, so there's no point optimizing this code for
177          other cases.  */
178       struct stat st;
179       if (! cur_info)
180         {
181           if (stat (file_name, &st) != 0)
182             {
183               stat_error (file_name);
184               return;
185             }
186           cur_info = &st;
187         }
188       mode = cur_info->st_mode ^ invert_permissions;
189     }
190
191   failed = chmod (file_name, mode) != 0;
192   if (failed && errno == EPERM)
193     {
194       /* On Solaris, chmod may fail if we don't have PRIV_ALL.  */
195       if (priv_set_restore_linkdir () == 0)
196         {
197           failed = chmod (file_name, mode) != 0;
198           priv_set_remove_linkdir ();
199         }
200     }
201   if (failed)
202     chmod_error_details (file_name, mode);
203 }
204
205 /* Check time after successfully setting FILE_NAME's time stamp to T.  */
206 static void
207 check_time (char const *file_name, struct timespec t)
208 {
209   if (t.tv_sec <= 0)
210     WARNOPT (WARN_TIMESTAMP,
211              (0, 0, _("%s: implausibly old time stamp %s"),
212               file_name, tartime (t, true)));
213   else if (timespec_cmp (volume_start_time, t) < 0)
214     {
215       struct timespec now;
216       gettime (&now);
217       if (timespec_cmp (now, t) < 0)
218         {
219           char buf[TIMESPEC_STRSIZE_BOUND];
220           struct timespec diff;
221           diff.tv_sec = t.tv_sec - now.tv_sec;
222           diff.tv_nsec = t.tv_nsec - now.tv_nsec;
223           if (diff.tv_nsec < 0)
224             {
225               diff.tv_nsec += BILLION;
226               diff.tv_sec--;
227             }
228           WARNOPT (WARN_TIMESTAMP,
229                    (0, 0, _("%s: time stamp %s is %s s in the future"),
230                     file_name, tartime (t, true), code_timespec (diff, buf)));
231         }
232     }
233 }
234
235 /* Restore stat attributes (owner, group, mode and times) for
236    FILE_NAME, using information given in *ST.
237    If CUR_INFO is nonzero, *CUR_INFO is the
238    file's current status.
239    If not restoring permissions, invert the
240    INVERT_PERMISSIONS bits from the file's current permissions.
241    PERMSTATUS specifies the status of the file's permissions.
242    TYPEFLAG specifies the type of the file.  */
243
244 /* FIXME: About proper restoration of symbolic link attributes, we still do
245    not have it right.  Pretesters' reports tell us we need further study and
246    probably more configuration.  For now, just use lchown if it exists, and
247    punt for the rest.  Sigh!  */
248
249 static void
250 set_stat (char const *file_name,
251           struct tar_stat_info const *st,
252           struct stat const *cur_info,
253           mode_t invert_permissions, enum permstatus permstatus,
254           char typeflag)
255 {
256   if (typeflag != SYMTYPE)
257     {
258       /* We do the utime before the chmod because some versions of utime are
259          broken and trash the modes of the file.  */
260
261       if (! touch_option && permstatus != INTERDIR_PERMSTATUS)
262         {
263           /* We set the accessed time to `now', which is really the time we
264              started extracting files, unless incremental_option is used, in
265              which case .st_atime is used.  */
266
267           /* FIXME: incremental_option should set ctime too, but how?  */
268
269           struct timespec ts[2];
270           if (incremental_option)
271             ts[0] = st->atime;
272           else
273             ts[0] = start_time;
274           ts[1] = st->mtime;
275
276           if (utimens (file_name, ts) != 0)
277             utime_error (file_name);
278           else
279             {
280               check_time (file_name, ts[0]);
281               check_time (file_name, ts[1]);
282             }
283         }
284
285       /* Some systems allow non-root users to give files away.  Once this
286          done, it is not possible anymore to change file permissions.
287          However, setting file permissions now would be incorrect, since
288          they would apply to the wrong user, and there would be a race
289          condition.  So, don't use systems that allow non-root users to
290          give files away.  */
291     }
292
293   if (0 < same_owner_option && permstatus != INTERDIR_PERMSTATUS)
294     {
295       /* When lchown exists, it should be used to change the attributes of
296          the symbolic link itself.  In this case, a mere chown would change
297          the attributes of the file the symbolic link is pointing to, and
298          should be avoided.  */
299       int chown_result = 1;
300
301       if (typeflag == SYMTYPE)
302         {
303 #if HAVE_LCHOWN
304           chown_result = lchown (file_name, st->stat.st_uid, st->stat.st_gid);
305 #endif
306         }
307       else
308         {
309           chown_result = chown (file_name, st->stat.st_uid, st->stat.st_gid);
310         }
311
312       if (chown_result == 0)
313         {
314           /* Changing the owner can flip st_mode bits in some cases, so
315              ignore cur_info if it might be obsolete now.  */
316           if (cur_info
317               && cur_info->st_mode & S_IXUGO
318               && cur_info->st_mode & (S_ISUID | S_ISGID))
319             cur_info = NULL;
320         }
321       else if (chown_result < 0)
322         chown_error_details (file_name,
323                              st->stat.st_uid, st->stat.st_gid);
324     }
325
326   if (typeflag != SYMTYPE)
327     set_mode (file_name, &st->stat, cur_info,
328               invert_permissions, permstatus, typeflag);
329 }
330
331 /* Remember to restore stat attributes (owner, group, mode and times)
332    for the directory FILE_NAME, using information given in *ST,
333    once we stop extracting files into that directory.
334    If not restoring permissions, remember to invert the
335    INVERT_PERMISSIONS bits from the file's current permissions.
336    PERMSTATUS specifies the status of the file's permissions.
337
338    NOTICE: this works only if the archive has usual member order, i.e.
339    directory, then the files in that directory. Incremental archive have
340    somewhat reversed order: first go subdirectories, then all other
341    members. To help cope with this case the variable
342    delay_directory_restore_option is set by prepare_to_extract.
343
344    If an archive was explicitely created so that its member order is
345    reversed, some directory timestamps can be restored incorrectly,
346    e.g.:
347        tar --no-recursion -cf archive dir dir/file1 foo dir/file2
348 */
349 static void
350 delay_set_stat (char const *file_name, struct tar_stat_info const *st,
351                 mode_t invert_permissions, enum permstatus permstatus)
352 {
353   size_t file_name_len = strlen (file_name);
354   struct delayed_set_stat *data =
355     xmalloc (offsetof (struct delayed_set_stat, file_name)
356              + file_name_len + 1);
357   data->next = delayed_set_stat_head;
358   data->dev = st->stat.st_dev;
359   data->ino = st->stat.st_ino;
360   data->mode = st->stat.st_mode;
361   data->uid = st->stat.st_uid;
362   data->gid = st->stat.st_gid;
363   data->atime = st->atime;
364   data->mtime = st->mtime;
365   data->file_name_len = file_name_len;
366   data->invert_permissions = invert_permissions;
367   data->permstatus = permstatus;
368   data->after_links = 0;
369   strcpy (data->file_name, file_name);
370   delayed_set_stat_head = data;
371 }
372
373 /* Update the delayed_set_stat info for an intermediate directory
374    created within the file name of DIR.  The intermediate directory turned
375    out to be the same as this directory, e.g. due to ".." or symbolic
376    links.  *DIR_STAT_INFO is the status of the directory.  */
377 static void
378 repair_delayed_set_stat (char const *dir,
379                          struct stat const *dir_stat_info)
380 {
381   struct delayed_set_stat *data;
382   for (data = delayed_set_stat_head;  data;  data = data->next)
383     {
384       struct stat st;
385       if (stat (data->file_name, &st) != 0)
386         {
387           stat_error (data->file_name);
388           return;
389         }
390
391       if (st.st_dev == dir_stat_info->st_dev
392           && st.st_ino == dir_stat_info->st_ino)
393         {
394           data->dev = current_stat_info.stat.st_dev;
395           data->ino = current_stat_info.stat.st_ino;
396           data->mode = current_stat_info.stat.st_mode;
397           data->uid = current_stat_info.stat.st_uid;
398           data->gid = current_stat_info.stat.st_gid;
399           data->atime = current_stat_info.atime;
400           data->mtime = current_stat_info.mtime;
401           data->invert_permissions =
402             ((current_stat_info.stat.st_mode ^ st.st_mode)
403              & MODE_RWX & ~ current_umask);
404           data->permstatus = ARCHIVED_PERMSTATUS;
405           return;
406         }
407     }
408
409   ERROR ((0, 0, _("%s: Unexpected inconsistency when making directory"),
410           quotearg_colon (dir)));
411 }
412
413 /* After a file/link/directory creation has failed, see if
414    it's because some required directory was not present, and if so,
415    create all required directories.  Return non-zero if a directory
416    was created.  */
417 static int
418 make_directories (char *file_name)
419 {
420   char *cursor0 = file_name + FILE_SYSTEM_PREFIX_LEN (file_name);
421   char *cursor;                 /* points into the file name */
422   int did_something = 0;        /* did we do anything yet? */
423   int mode;
424   int invert_permissions;
425   int status;
426
427   for (cursor = cursor0; *cursor; cursor++)
428     {
429       if (! ISSLASH (*cursor))
430         continue;
431
432       /* Avoid mkdir of empty string, if leading or double '/'.  */
433
434       if (cursor == cursor0 || ISSLASH (cursor[-1]))
435         continue;
436
437       /* Avoid mkdir where last part of file name is "." or "..".  */
438
439       if (cursor[-1] == '.'
440           && (cursor == cursor0 + 1 || ISSLASH (cursor[-2])
441               || (cursor[-2] == '.'
442                   && (cursor == cursor0 + 2 || ISSLASH (cursor[-3])))))
443         continue;
444
445       *cursor = '\0';           /* truncate the name there */
446       mode = MODE_RWX & ~ newdir_umask;
447       invert_permissions = we_are_root ? 0 : MODE_WXUSR & ~ mode;
448       status = mkdir (file_name, mode ^ invert_permissions);
449
450       if (status == 0)
451         {
452           /* Create a struct delayed_set_stat even if
453              invert_permissions is zero, because
454              repair_delayed_set_stat may need to update the struct.  */
455           delay_set_stat (file_name,
456                           &current_stat_info,
457                           invert_permissions, INTERDIR_PERMSTATUS);
458
459           print_for_mkdir (file_name, cursor - file_name, mode);
460           did_something = 1;
461
462           *cursor = '/';
463           continue;
464         }
465
466       *cursor = '/';
467
468       if (errno == EEXIST)
469         continue;               /* Directory already exists.  */
470       else if ((errno == ENOSYS /* Automounted dirs on Solaris return
471                                    this. Reported by Warren Hyde
472                                    <Warren.Hyde@motorola.com> */
473                || ERRNO_IS_EACCES)  /* Turbo C mkdir gives a funny errno.  */
474                && access (file_name, W_OK) == 0)
475         continue;
476
477       /* Some other error in the mkdir.  We return to the caller.  */
478       break;
479     }
480
481   return did_something;         /* tell them to retry if we made one */
482 }
483
484 static bool
485 file_newer_p (const char *file_name, struct tar_stat_info *tar_stat)
486 {
487   struct stat st;
488
489   if (stat (file_name, &st))
490     {
491       if (errno != ENOENT)
492         {
493           stat_warn (file_name);
494           /* Be on the safe side: if the file does exist assume it is newer */
495           return true;
496         }
497       return false;
498     }
499   if (!S_ISDIR (st.st_mode)
500       && tar_timespec_cmp (tar_stat->mtime, get_stat_mtime (&st)) <= 0)
501     {
502       return true;
503     }
504   return false;
505 }
506
507 #define RECOVER_NO 0
508 #define RECOVER_OK 1
509 #define RECOVER_SKIP 2
510
511 /* Attempt repairing what went wrong with the extraction.  Delete an
512    already existing file or create missing intermediate directories.
513    Return RECOVER_OK if we somewhat increased our chances at a successful
514    extraction, RECOVER_NO if there are no chances, and RECOVER_SKIP if the
515    caller should skip extraction of that member.  The value of errno is
516    properly restored on returning RECOVER_NO.  */
517
518 static int
519 maybe_recoverable (char *file_name, int *interdir_made)
520 {
521   int e = errno;
522
523   if (*interdir_made)
524     return RECOVER_NO;
525
526   switch (errno)
527     {
528     case EEXIST:
529       /* Remove an old file, if the options allow this.  */
530
531       switch (old_files_option)
532         {
533         case KEEP_OLD_FILES:
534           return RECOVER_SKIP;
535
536         case KEEP_NEWER_FILES:
537           if (file_newer_p (file_name, &current_stat_info))
538             {
539               errno = e;
540               return RECOVER_NO;
541             }
542           /* FALL THROUGH */
543
544         case DEFAULT_OLD_FILES:
545         case NO_OVERWRITE_DIR_OLD_FILES:
546         case OVERWRITE_OLD_FILES:
547           {
548             int r = remove_any_file (file_name, ORDINARY_REMOVE_OPTION);
549             errno = EEXIST;
550             return r > 0 ? RECOVER_OK : RECOVER_NO;
551           }
552
553         case UNLINK_FIRST_OLD_FILES:
554           break;
555         }
556
557     case ENOENT:
558       /* Attempt creating missing intermediate directories.  */
559       if (! make_directories (file_name))
560         {
561           errno = ENOENT;
562           return RECOVER_NO;
563         }
564       *interdir_made = 1;
565       return RECOVER_OK;
566
567     default:
568       /* Just say we can't do anything about it...  */
569
570       return RECOVER_NO;
571     }
572 }
573
574 /* Fix the statuses of all directories whose statuses need fixing, and
575    which are not ancestors of FILE_NAME.  If AFTER_LINKS is
576    nonzero, do this for all such directories; otherwise, stop at the
577    first directory that is marked to be fixed up only after delayed
578    links are applied.  */
579 static void
580 apply_nonancestor_delayed_set_stat (char const *file_name, bool after_links)
581 {
582   size_t file_name_len = strlen (file_name);
583   bool check_for_renamed_directories = 0;
584
585   while (delayed_set_stat_head)
586     {
587       struct delayed_set_stat *data = delayed_set_stat_head;
588       bool skip_this_one = 0;
589       struct stat st;
590       struct stat const *cur_info = 0;
591
592       check_for_renamed_directories |= data->after_links;
593
594       if (after_links < data->after_links
595           || (data->file_name_len < file_name_len
596               && file_name[data->file_name_len]
597               && (ISSLASH (file_name[data->file_name_len])
598                   || ISSLASH (file_name[data->file_name_len - 1]))
599               && memcmp (file_name, data->file_name, data->file_name_len) == 0))
600         break;
601
602       if (check_for_renamed_directories)
603         {
604           cur_info = &st;
605           if (stat (data->file_name, &st) != 0)
606             {
607               stat_error (data->file_name);
608               skip_this_one = 1;
609             }
610           else if (! (st.st_dev == data->dev && st.st_ino == data->ino))
611             {
612               ERROR ((0, 0,
613                       _("%s: Directory renamed before its status could be extracted"),
614                       quotearg_colon (data->file_name)));
615               skip_this_one = 1;
616             }
617         }
618
619       if (! skip_this_one)
620         {
621           struct tar_stat_info sb;
622           sb.stat.st_mode = data->mode;
623           sb.stat.st_uid = data->uid;
624           sb.stat.st_gid = data->gid;
625           sb.atime = data->atime;
626           sb.mtime = data->mtime;
627           set_stat (data->file_name, &sb, cur_info,
628                     data->invert_permissions, data->permstatus, DIRTYPE);
629         }
630
631       delayed_set_stat_head = data->next;
632       free (data);
633     }
634 }
635
636 \f
637
638 /* Extractor functions for various member types */
639
640 static int
641 extract_dir (char *file_name, int typeflag)
642 {
643   int status;
644   mode_t mode;
645   int interdir_made = 0;
646
647   /* Save 'root device' to avoid purging mount points. */
648   if (one_file_system_option && root_device == 0)
649     {
650       struct stat st;
651       char *dir = xgetcwd ();
652
653       if (deref_stat (true, dir, &st))
654         stat_diag (dir);
655       else
656         root_device = st.st_dev;
657       free (dir);
658     }
659
660   if (incremental_option)
661     /* Read the entry and delete files that aren't listed in the archive.  */
662     purge_directory (file_name);
663   else if (typeflag == GNUTYPE_DUMPDIR)
664     skip_member ();
665
666   mode = current_stat_info.stat.st_mode | (we_are_root ? 0 : MODE_WXUSR);
667   if (0 < same_owner_option || current_stat_info.stat.st_mode & ~ MODE_RWX)
668     mode &= S_IRWXU;
669
670   while ((status = mkdir (file_name, mode)))
671     {
672       if (errno == EEXIST
673           && (interdir_made
674               || old_files_option == DEFAULT_OLD_FILES
675               || old_files_option == OVERWRITE_OLD_FILES))
676         {
677           struct stat st;
678           if (stat (file_name, &st) == 0)
679             {
680               if (interdir_made)
681                 {
682                   repair_delayed_set_stat (file_name, &st);
683                   return 0;
684                 }
685               if (S_ISDIR (st.st_mode))
686                 {
687                   status = 0;
688                   mode = st.st_mode;
689                   break;
690                 }
691             }
692           errno = EEXIST;
693         }
694
695       switch (maybe_recoverable (file_name, &interdir_made))
696         {
697         case RECOVER_OK:
698           continue;
699
700         case RECOVER_SKIP:
701           break;
702
703         case RECOVER_NO:
704           if (errno != EEXIST)
705             {
706               mkdir_error (file_name);
707               return 1;
708             }
709           break;
710         }
711       break;
712     }
713
714   if (status == 0
715       || old_files_option == DEFAULT_OLD_FILES
716       || old_files_option == OVERWRITE_OLD_FILES)
717     {
718       if (status == 0)
719         delay_set_stat (file_name, &current_stat_info,
720                         ((mode ^ current_stat_info.stat.st_mode)
721                          & MODE_RWX & ~ current_umask),
722                         ARCHIVED_PERMSTATUS);
723       else /* For an already existing directory, invert_perms must be 0 */
724         delay_set_stat (file_name, &current_stat_info,
725                         0,
726                         UNKNOWN_PERMSTATUS);
727     }
728   return status;
729 }
730
731
732 static int
733 open_output_file (char *file_name, int typeflag, mode_t mode)
734 {
735   int fd;
736   int openflag = (O_WRONLY | O_BINARY | O_CREAT
737                   | (old_files_option == OVERWRITE_OLD_FILES
738                      ? O_TRUNC
739                      : O_EXCL));
740
741 #if O_CTG
742   /* Contiguous files (on the Masscomp) have to specify the size in
743      the open call that creates them.  */
744
745   if (typeflag == CONTTYPE)
746     fd = open (file_name, openflag | O_CTG, mode, current_stat_info.stat.st_size);
747   else
748     fd = open (file_name, openflag, mode);
749
750 #else /* not O_CTG */
751   if (typeflag == CONTTYPE)
752     {
753       static int conttype_diagnosed;
754
755       if (!conttype_diagnosed)
756         {
757           conttype_diagnosed = 1;
758           WARNOPT (WARN_CONTIGUOUS_CAST,
759                    (0, 0, _("Extracting contiguous files as regular files")));
760         }
761     }
762   fd = open (file_name, openflag, mode);
763
764 #endif /* not O_CTG */
765
766   return fd;
767 }
768
769 static int
770 extract_file (char *file_name, int typeflag)
771 {
772   int fd;
773   off_t size;
774   union block *data_block;
775   int status;
776   size_t count;
777   size_t written;
778   int interdir_made = 0;
779   mode_t mode = current_stat_info.stat.st_mode & MODE_RWX & ~ current_umask;
780   mode_t invert_permissions =
781     0 < same_owner_option ? mode & (S_IRWXG | S_IRWXO) : 0;
782
783   /* FIXME: deal with protection issues.  */
784
785   if (to_stdout_option)
786     fd = STDOUT_FILENO;
787   else if (to_command_option)
788     {
789       fd = sys_exec_command (file_name, 'f', &current_stat_info);
790       if (fd < 0)
791         {
792           skip_member ();
793           return 0;
794         }
795     }
796   else
797     {
798       int recover = RECOVER_NO;
799       do
800         fd = open_output_file (file_name, typeflag, mode ^ invert_permissions);
801       while (fd < 0
802              && (recover = maybe_recoverable (file_name, &interdir_made))
803                  == RECOVER_OK);
804
805       if (fd < 0)
806         {
807           skip_member ();
808           if (recover == RECOVER_SKIP)
809             return 0;
810           open_error (file_name);
811           return 1;
812         }
813     }
814
815   mv_begin (&current_stat_info);
816   if (current_stat_info.is_sparse)
817     sparse_extract_file (fd, &current_stat_info, &size);
818   else
819     for (size = current_stat_info.stat.st_size; size > 0; )
820       {
821         mv_size_left (size);
822
823         /* Locate data, determine max length writeable, write it,
824            block that we have used the data, then check if the write
825            worked.  */
826
827         data_block = find_next_block ();
828         if (! data_block)
829           {
830             ERROR ((0, 0, _("Unexpected EOF in archive")));
831             break;              /* FIXME: What happens, then?  */
832           }
833
834         written = available_space_after (data_block);
835
836         if (written > size)
837           written = size;
838         errno = 0;
839         count = full_write (fd, data_block->buffer, written);
840         size -= written;
841
842         set_next_block_after ((union block *)
843                               (data_block->buffer + written - 1));
844         if (count != written)
845           {
846             if (!to_command_option)
847               write_error_details (file_name, count, written);
848             /* FIXME: shouldn't we restore from backup? */
849             break;
850           }
851       }
852
853   skip_file (size);
854
855   mv_end ();
856
857   /* If writing to stdout, don't try to do anything to the filename;
858      it doesn't exist, or we don't want to touch it anyway.  */
859
860   if (to_stdout_option)
861     return 0;
862
863   status = close (fd);
864   if (status < 0)
865     close_error (file_name);
866
867   if (to_command_option)
868     sys_wait_command ();
869   else
870     set_stat (file_name, &current_stat_info, NULL, invert_permissions,
871               (old_files_option == OVERWRITE_OLD_FILES ?
872                UNKNOWN_PERMSTATUS : ARCHIVED_PERMSTATUS),
873               typeflag);
874
875   return status;
876 }
877
878 /* Create a placeholder file with name FILE_NAME, which will be
879    replaced after other extraction is done by a symbolic link if
880    IS_SYMLINK is true, and by a hard link otherwise.  Set
881    *INTERDIR_MADE if an intermediate directory is made in the
882    process.  */
883
884 static int
885 create_placeholder_file (char *file_name, bool is_symlink, int *interdir_made)
886 {
887   int fd;
888   struct stat st;
889
890   while ((fd = open (file_name, O_WRONLY | O_CREAT | O_EXCL, 0)) < 0)
891     if (! maybe_recoverable (file_name, interdir_made))
892       break;
893
894   if (fd < 0)
895     open_error (file_name);
896   else if (fstat (fd, &st) != 0)
897     {
898       stat_error (file_name);
899       close (fd);
900     }
901   else if (close (fd) != 0)
902     close_error (file_name);
903   else
904     {
905       struct delayed_set_stat *h;
906       struct delayed_link *p =
907         xmalloc (offsetof (struct delayed_link, target)
908                  + strlen (current_stat_info.link_name)
909                  + 1);
910       p->next = delayed_link_head;
911       delayed_link_head = p;
912       p->dev = st.st_dev;
913       p->ino = st.st_ino;
914       p->mtime = get_stat_mtime (&st);
915       p->is_symlink = is_symlink;
916       if (is_symlink)
917         {
918           p->uid = current_stat_info.stat.st_uid;
919           p->gid = current_stat_info.stat.st_gid;
920         }
921       p->sources = xmalloc (offsetof (struct string_list, string)
922                             + strlen (file_name) + 1);
923       p->sources->next = 0;
924       strcpy (p->sources->string, file_name);
925       strcpy (p->target, current_stat_info.link_name);
926
927       h = delayed_set_stat_head;
928       if (h && ! h->after_links
929           && strncmp (file_name, h->file_name, h->file_name_len) == 0
930           && ISSLASH (file_name[h->file_name_len])
931           && (last_component (file_name) == file_name + h->file_name_len + 1))
932         {
933           do
934             {
935               h->after_links = 1;
936
937               if (stat (h->file_name, &st) != 0)
938                 stat_error (h->file_name);
939               else
940                 {
941                   h->dev = st.st_dev;
942                   h->ino = st.st_ino;
943                 }
944             }
945           while ((h = h->next) && ! h->after_links);
946         }
947
948       return 0;
949     }
950
951   return -1;
952 }
953
954 static int
955 extract_link (char *file_name, int typeflag)
956 {
957   int interdir_made = 0;
958   char const *link_name;
959
960   link_name = current_stat_info.link_name;
961   
962   if (! absolute_names_option && contains_dot_dot (link_name))
963     return create_placeholder_file (file_name, false, &interdir_made);
964
965   do
966     {
967       struct stat st1, st2;
968       int e;
969       int status = link (link_name, file_name);
970       e = errno;
971
972       if (status == 0)
973         {
974           struct delayed_link *ds = delayed_link_head;
975           if (ds && lstat (link_name, &st1) == 0)
976             for (; ds; ds = ds->next)
977               if (ds->dev == st1.st_dev
978                   && ds->ino == st1.st_ino
979                   && timespec_cmp (ds->mtime, get_stat_mtime (&st1)) == 0)
980                 {
981                   struct string_list *p =  xmalloc (offsetof (struct string_list, string)
982                                                     + strlen (file_name) + 1);
983                   strcpy (p->string, file_name);
984                   p->next = ds->sources;
985                   ds->sources = p;
986                   break;
987                 }
988           return 0;
989         }
990       else if ((e == EEXIST && strcmp (link_name, file_name) == 0)
991                || (lstat (link_name, &st1) == 0
992                    && lstat (file_name, &st2) == 0
993                    && st1.st_dev == st2.st_dev
994                    && st1.st_ino == st2.st_ino))
995         return 0;
996
997       errno = e;
998     }
999   while (maybe_recoverable (file_name, &interdir_made));
1000
1001   if (!(incremental_option && errno == EEXIST))
1002     {
1003       link_error (link_name, file_name);
1004       return 1;
1005     }
1006   return 0;
1007 }
1008
1009 static int
1010 extract_symlink (char *file_name, int typeflag)
1011 {
1012 #ifdef HAVE_SYMLINK
1013   int status;
1014   int interdir_made = 0;
1015
1016   if (! absolute_names_option
1017       && (IS_ABSOLUTE_FILE_NAME (current_stat_info.link_name)
1018           || contains_dot_dot (current_stat_info.link_name)))
1019     return create_placeholder_file (file_name, true, &interdir_made);
1020
1021   while ((status = symlink (current_stat_info.link_name, file_name)))
1022     if (!maybe_recoverable (file_name, &interdir_made))
1023       break;
1024
1025   if (status == 0)
1026     set_stat (file_name, &current_stat_info, NULL, 0, 0, SYMTYPE);
1027   else
1028     symlink_error (current_stat_info.link_name, file_name);
1029   return status;
1030
1031 #else
1032   static int warned_once;
1033
1034   if (!warned_once)
1035     {
1036       warned_once = 1;
1037       WARNOPT (WARN_SYMBOLIC_CAST,
1038                (0, 0,
1039                 _("Attempting extraction of symbolic links as hard links")));
1040     }
1041   return extract_link (file_name, typeflag);
1042 #endif
1043 }
1044
1045 #if S_IFCHR || S_IFBLK
1046 static int
1047 extract_node (char *file_name, int typeflag)
1048 {
1049   int status;
1050   int interdir_made = 0;
1051   mode_t mode = current_stat_info.stat.st_mode & ~ current_umask;
1052   mode_t invert_permissions =
1053     0 < same_owner_option ? mode & (S_IRWXG | S_IRWXO) : 0;
1054
1055   do
1056     status = mknod (file_name, mode ^ invert_permissions,
1057                     current_stat_info.stat.st_rdev);
1058   while (status && maybe_recoverable (file_name, &interdir_made));
1059
1060   if (status != 0)
1061     mknod_error (file_name);
1062   else
1063     set_stat (file_name, &current_stat_info, NULL, invert_permissions,
1064               ARCHIVED_PERMSTATUS, typeflag);
1065   return status;
1066 }
1067 #endif
1068
1069 #if HAVE_MKFIFO || defined mkfifo
1070 static int
1071 extract_fifo (char *file_name, int typeflag)
1072 {
1073   int status;
1074   int interdir_made = 0;
1075   mode_t mode = current_stat_info.stat.st_mode & ~ current_umask;
1076   mode_t invert_permissions =
1077     0 < same_owner_option ? mode & (S_IRWXG | S_IRWXO) : 0;
1078
1079   while ((status = mkfifo (file_name, mode)) != 0)
1080     if (!maybe_recoverable (file_name, &interdir_made))
1081       break;
1082
1083   if (status == 0)
1084     set_stat (file_name, &current_stat_info, NULL, invert_permissions,
1085               ARCHIVED_PERMSTATUS, typeflag);
1086   else
1087     mkfifo_error (file_name);
1088   return status;
1089 }
1090 #endif
1091
1092 static int
1093 extract_volhdr (char *file_name, int typeflag)
1094 {
1095   skip_member ();
1096   return 0;
1097 }
1098
1099 static int
1100 extract_failure (char *file_name, int typeflag)
1101 {
1102   return 1;
1103 }
1104
1105 typedef int (*tar_extractor_t) (char *file_name, int typeflag);
1106
1107 \f
1108
1109 /* Prepare to extract a file. Find extractor function.
1110    Return zero if extraction should not proceed.  */
1111
1112 static int
1113 prepare_to_extract (char const *file_name, int typeflag, tar_extractor_t *fun)
1114 {
1115   int rc = 1;
1116
1117   if (EXTRACT_OVER_PIPE)
1118     rc = 0;
1119
1120   /* Select the extractor */
1121   switch (typeflag)
1122     {
1123     case GNUTYPE_SPARSE:
1124       *fun = extract_file;
1125       rc = 1;
1126       break;
1127
1128     case AREGTYPE:
1129     case REGTYPE:
1130     case CONTTYPE:
1131       /* Appears to be a file.  But BSD tar uses the convention that a slash
1132          suffix means a directory.  */
1133       if (current_stat_info.had_trailing_slash)
1134         *fun = extract_dir;
1135       else
1136         {
1137           *fun = extract_file;
1138           rc = 1;
1139         }
1140       break;
1141
1142     case SYMTYPE:
1143       *fun = extract_symlink;
1144       break;
1145
1146     case LNKTYPE:
1147       *fun = extract_link;
1148       break;
1149
1150 #if S_IFCHR
1151     case CHRTYPE:
1152       current_stat_info.stat.st_mode |= S_IFCHR;
1153       *fun = extract_node;
1154       break;
1155 #endif
1156
1157 #if S_IFBLK
1158     case BLKTYPE:
1159       current_stat_info.stat.st_mode |= S_IFBLK;
1160       *fun = extract_node;
1161       break;
1162 #endif
1163
1164 #if HAVE_MKFIFO || defined mkfifo
1165     case FIFOTYPE:
1166       *fun = extract_fifo;
1167       break;
1168 #endif
1169
1170     case DIRTYPE:
1171     case GNUTYPE_DUMPDIR:
1172       *fun = extract_dir;
1173       if (current_stat_info.is_dumpdir)
1174         delay_directory_restore_option = true;
1175       break;
1176
1177     case GNUTYPE_VOLHDR:
1178       *fun = extract_volhdr;
1179       break;
1180
1181     case GNUTYPE_MULTIVOL:
1182       ERROR ((0, 0,
1183               _("%s: Cannot extract -- file is continued from another volume"),
1184               quotearg_colon (current_stat_info.file_name)));
1185       *fun = extract_failure;
1186       break;
1187
1188     case GNUTYPE_LONGNAME:
1189     case GNUTYPE_LONGLINK:
1190       ERROR ((0, 0, _("Unexpected long name header")));
1191       *fun = extract_failure;
1192       break;
1193
1194     default:
1195       WARNOPT (WARN_UNKNOWN_CAST,
1196                (0, 0,
1197                 _("%s: Unknown file type `%c', extracted as normal file"),
1198                 quotearg_colon (file_name), typeflag));
1199       *fun = extract_file;
1200     }
1201
1202   /* Determine whether the extraction should proceed */
1203   if (rc == 0)
1204     return 0;
1205
1206   switch (old_files_option)
1207     {
1208     case UNLINK_FIRST_OLD_FILES:
1209       if (!remove_any_file (file_name,
1210                             recursive_unlink_option ? RECURSIVE_REMOVE_OPTION
1211                                                       : ORDINARY_REMOVE_OPTION)
1212           && errno && errno != ENOENT)
1213         {
1214           unlink_error (file_name);
1215           return 0;
1216         }
1217       break;
1218
1219     case KEEP_NEWER_FILES:
1220       if (file_newer_p (file_name, &current_stat_info))
1221         {
1222           WARNOPT (WARN_IGNORE_NEWER,
1223                    (0, 0, _("Current %s is newer or same age"),
1224                     quote (file_name)));
1225           return 0;
1226         }
1227       break;
1228
1229     default:
1230       break;
1231     }
1232
1233   return 1;
1234 }
1235
1236 /* Extract a file from the archive.  */
1237 void
1238 extract_archive (void)
1239 {
1240   char typeflag;
1241   tar_extractor_t fun;
1242
1243   fatal_exit_hook = extract_finish;
1244   
1245   /* Try to disable the ability to unlink a directory.  */
1246   priv_set_remove_linkdir ();
1247
1248   set_next_block_after (current_header);
1249   decode_header (current_header, &current_stat_info, &current_format, 1);
1250   if (!current_stat_info.file_name[0]
1251       || (interactive_option
1252           && !confirm ("extract", current_stat_info.file_name)))
1253     {
1254       skip_member ();
1255       return;
1256     }
1257
1258   /* Print the block from current_header and current_stat.  */
1259   if (verbose_option)
1260     print_header (&current_stat_info, current_header, -1);
1261
1262   /* Restore stats for all non-ancestor directories, unless
1263      it is an incremental archive.
1264      (see NOTICE in the comment to delay_set_stat above) */
1265   if (!delay_directory_restore_option)
1266     apply_nonancestor_delayed_set_stat (current_stat_info.file_name, 0);
1267
1268   /* Take a safety backup of a previously existing file.  */
1269
1270   if (backup_option)
1271     if (!maybe_backup_file (current_stat_info.file_name, 0))
1272       {
1273         int e = errno;
1274         ERROR ((0, e, _("%s: Was unable to backup this file"),
1275                 quotearg_colon (current_stat_info.file_name)));
1276         skip_member ();
1277         return;
1278       }
1279
1280   /* Extract the archive entry according to its type.  */
1281   /* KLUDGE */
1282   typeflag = sparse_member_p (&current_stat_info) ?
1283                   GNUTYPE_SPARSE : current_header->header.typeflag;
1284
1285   if (prepare_to_extract (current_stat_info.file_name, typeflag, &fun))
1286     {
1287       if (fun && (*fun) (current_stat_info.file_name, typeflag)
1288           && backup_option)
1289         undo_last_backup ();
1290     }
1291   else
1292     skip_member ();
1293
1294 }
1295
1296 /* Extract the symbolic links whose final extraction were delayed.  */
1297 static void
1298 apply_delayed_links (void)
1299 {
1300   struct delayed_link *ds;
1301
1302   for (ds = delayed_link_head; ds; )
1303     {
1304       struct string_list *sources = ds->sources;
1305       char const *valid_source = 0;
1306
1307       for (sources = ds->sources; sources; sources = sources->next)
1308         {
1309           char const *source = sources->string;
1310           struct stat st;
1311
1312           /* Make sure the placeholder file is still there.  If not,
1313              don't create a link, as the placeholder was probably
1314              removed by a later extraction.  */
1315           if (lstat (source, &st) == 0
1316               && st.st_dev == ds->dev
1317               && st.st_ino == ds->ino
1318               && timespec_cmp (get_stat_mtime (&st), ds->mtime) == 0)
1319             {
1320               /* Unlink the placeholder, then create a hard link if possible,
1321                  a symbolic link otherwise.  */
1322               if (unlink (source) != 0)
1323                 unlink_error (source);
1324               else if (valid_source && link (valid_source, source) == 0)
1325                 ;
1326               else if (!ds->is_symlink)
1327                 {
1328                   if (link (ds->target, source) != 0)
1329                     link_error (ds->target, source);
1330                 }
1331               else if (symlink (ds->target, source) != 0)
1332                 symlink_error (ds->target, source);
1333               else
1334                 {
1335                   struct tar_stat_info st1;
1336                   st1.stat.st_uid = ds->uid;
1337                   st1.stat.st_gid = ds->gid;
1338                   set_stat (source, &st1, NULL, 0, 0, SYMTYPE);
1339                   valid_source = source;
1340                 }
1341             }
1342         }
1343
1344       for (sources = ds->sources; sources; )
1345         {
1346           struct string_list *next = sources->next;
1347           free (sources);
1348           sources = next;
1349         }
1350
1351       {
1352         struct delayed_link *next = ds->next;
1353         free (ds);
1354         ds = next;
1355       }
1356     }
1357
1358   delayed_link_head = 0;
1359 }
1360
1361 /* Finish the extraction of an archive.  */
1362 void
1363 extract_finish (void)
1364 {
1365   /* First, fix the status of ordinary directories that need fixing.  */
1366   apply_nonancestor_delayed_set_stat ("", 0);
1367
1368   /* Then, apply delayed links, so that they don't affect delayed
1369      directory status-setting for ordinary directories.  */
1370   apply_delayed_links ();
1371
1372   /* Finally, fix the status of directories that are ancestors
1373      of delayed links.  */
1374   apply_nonancestor_delayed_set_stat ("", 1);
1375 }
1376
1377 bool
1378 rename_directory (char *src, char *dst)
1379 {
1380   if (rename (src, dst))
1381     {
1382       int e = errno;
1383
1384       switch (e)
1385         {
1386         case ENOENT:
1387           if (make_directories (dst))
1388             {
1389               if (rename (src, dst) == 0)
1390                 return true;
1391               e = errno;
1392             }
1393           break;
1394
1395         case EXDEV:
1396           /* FIXME: Fall back to recursive copying */
1397
1398         default:
1399           break;
1400         }
1401
1402       ERROR ((0, e, _("Cannot rename %s to %s"),
1403               quote_n (0, src),
1404               quote_n (1, dst)));
1405       return false;
1406     }
1407   return true;
1408 }