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