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