8d6944e274de9820cf012f639013e0f027e1404b
[debian/tar] / src / extract.c
1 /* Extract files from a tar archive.
2    Copyright (C) 1988, 92,93,94,96,97,98, 1999 Free Software Foundation, Inc.
3    Written by John Gilmore, on 1985-11-19.
4
5    This program is free software; you can redistribute it and/or modify it
6    under the terms of the GNU General Public License as published by the
7    Free Software Foundation; either version 2, or (at your option) any later
8    version.
9
10    This program is distributed in the hope that it will be useful, but
11    WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
13    Public License for more details.
14
15    You should have received a copy of the GNU General Public License along
16    with this program; if not, write to the Free Software Foundation, Inc.,
17    59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
18
19 #include "system.h"
20
21 #include <time.h>
22 time_t time ();
23
24 #if HAVE_UTIME_H
25 # include <utime.h>
26 #else
27 struct utimbuf
28   {
29     long actime;
30     long modtime;
31   };
32 #endif
33
34 #include "common.h"
35
36 static time_t now;              /* current time */
37 static int we_are_root;         /* true if our effective uid == 0 */
38 static mode_t newdir_umask;     /* umask when creating new directories */
39 static mode_t current_umask;    /* current umask (which is set to 0 if -p) */
40
41 #if 0
42 /* "Scratch" space to store the information about a sparse file before
43    writing the info into the header or extended header.  */
44 struct sp_array *sparsearray;
45
46 /* Number of elts storable in the sparsearray.  */
47 int   sp_array_size = 10;
48 #endif
49
50 struct delayed_set_stat
51   {
52     struct delayed_set_stat *next;
53     char *file_name;
54     struct stat stat_info;
55   };
56
57 static struct delayed_set_stat *delayed_set_stat_head;
58
59 /*--------------------------.
60 | Set up to extract files.  |
61 `--------------------------*/
62
63 void
64 extr_init (void)
65 {
66   now = time ((time_t *) 0);
67   we_are_root = geteuid () == 0;
68
69   /* Option -p clears the kernel umask, so it does not affect proper
70      restoration of file permissions.  New intermediate directories will
71      comply with umask at start of program.  */
72
73   newdir_umask = umask (0);
74   if (same_permissions_option)
75     current_umask = 0;
76   else
77     {
78       umask (newdir_umask);     /* restore the kernel umask */
79       current_umask = newdir_umask;
80     }
81
82   /* FIXME: Just make sure we can add files in directories we create.  Maybe
83      should we later remove permissions we are adding, here?  */
84   newdir_umask &= ~ MODE_WXUSR;
85 }
86
87 /*------------------------------------------------------------------.
88 | Restore mode for FILE_NAME, from information given in STAT_INFO.  |
89 `------------------------------------------------------------------*/
90
91 static void
92 set_mode (char *file_name, struct stat *stat_info)
93 {
94   /* We ought to force permission when -k is not selected, because if the
95      file already existed, open or creat would save the permission bits from
96      the previously created file, ignoring the ones we specified.
97
98      But with -k selected, we know *we* created this file, so the mode
99      bits were set by our open.  If the file has abnormal mode bits, we must
100      chmod since writing or chown has probably reset them.  If the file is
101      normal, we merely skip the chmod.  This works because we did umask (0)
102      when -p, so umask will have left the specified mode alone.  */
103
104   if (!keep_old_files_option
105       || (stat_info->st_mode & (S_ISUID | S_ISGID | S_ISVTX)))
106     if (chmod (file_name, ~current_umask & stat_info->st_mode) < 0)
107       ERROR ((0, errno, _("%s: Cannot change mode to %04lo"),
108               file_name,
109               (unsigned long) (~current_umask & stat_info->st_mode)));
110 }
111
112 /*----------------------------------------------------------------------.
113 | Restore stat attributes (owner, group, mode and times) for FILE_NAME, |
114 | using information given in STAT_INFO.  SYMLINK_FLAG is non-zero for a |
115 | freshly restored symbolic link.                                       |
116 `----------------------------------------------------------------------*/
117
118 /* FIXME: About proper restoration of symbolic link attributes, we still do
119    not have it right.  Pretesters' reports tell us we need further study and
120    probably more configuration.  For now, just use lchown if it exists, and
121    punt for the rest.  Sigh!  */
122
123 static void
124 set_stat (char *file_name, struct stat *stat_info, int symlink_flag)
125 {
126   struct utimbuf utimbuf;
127
128   if (!symlink_flag)
129     {
130       /* We do the utime before the chmod because some versions of utime are
131          broken and trash the modes of the file.  */
132
133       if (!touch_option)
134         {
135           /* We set the accessed time to `now', which is really the time we
136              started extracting files, unless incremental_option is used, in
137              which case .st_atime is used.  */
138
139           /* FIXME: incremental_option should set ctime too, but how?  */
140
141           if (incremental_option)
142             utimbuf.actime = stat_info->st_atime;
143           else
144             utimbuf.actime = now;
145
146           utimbuf.modtime = stat_info->st_mtime;
147
148           if (utime (file_name, &utimbuf) < 0)
149             ERROR ((0, errno,
150                     _("%s: Could not change access and modification times"),
151                     file_name));
152         }
153
154       /* Some systems allow non-root users to give files away.  Once this
155          done, it is not possible anymore to change file permissions, so we
156          have to set permissions prior to possibly giving files away.  */
157
158       set_mode (file_name, stat_info);
159     }
160
161   /* If we are root, set the owner and group of the extracted file, so we
162      extract as the original owner.  Or else, if we are running as a user,
163      leave the owner and group as they are, so we extract as that user.  */
164
165   if (we_are_root || same_owner_option)
166     {
167 #if HAVE_LCHOWN
168
169       /* When lchown exists, it should be used to change the attributes of
170          the symbolic link itself.  In this case, a mere chown would change
171          the attributes of the file the symbolic link is pointing to, and
172          should be avoided.  */
173
174       if (symlink_flag)
175         {
176           if (lchown (file_name, stat_info->st_uid, stat_info->st_gid) < 0)
177             ERROR ((0, errno, _("%s: Cannot lchown to uid %lu gid %lu"),
178                     file_name,
179                     (unsigned long) stat_info->st_uid,
180                     (unsigned long) stat_info->st_gid));
181         }
182       else
183         {
184           if (chown (file_name, stat_info->st_uid, stat_info->st_gid) < 0)
185             ERROR ((0, errno, _("%s: Cannot chown to uid %lu gid %lu"),
186                     file_name,
187                     (unsigned long) stat_info->st_uid,
188                     (unsigned long) stat_info->st_gid));
189         }
190
191 #else /* not HAVE_LCHOWN */
192
193       if (!symlink_flag)
194
195         if (chown (file_name, stat_info->st_uid, stat_info->st_gid) < 0)
196           ERROR ((0, errno, _("%s: Cannot chown to uid %lu gid %lu"),
197                   file_name,
198                   (unsigned long) stat_info->st_uid,
199                   (unsigned long) stat_info->st_gid));
200
201 #endif/* not HAVE_LCHOWN */
202
203       if (!symlink_flag)
204
205         /* On a few systems, and in particular, those allowing to give files
206            away, changing the owner or group destroys the suid or sgid bits.
207            So let's attempt setting these bits once more.  */
208
209         if (stat_info->st_mode & (S_ISUID | S_ISGID | S_ISVTX))
210           set_mode (file_name, stat_info);
211     }
212 }
213
214 /*-----------------------------------------------------------------------.
215 | After a file/link/symlink/directory creation has failed, see if it's   |
216 | because some required directory was not present, and if so, create all |
217 | required directories.  Return non-zero if a directory was created.     |
218 `-----------------------------------------------------------------------*/
219
220 static int
221 make_directories (char *file_name)
222 {
223   char *cursor;                 /* points into path */
224   int did_something = 0;        /* did we do anything yet? */
225   int saved_errno = errno;      /* remember caller's errno */
226   int status;
227
228   for (cursor = strchr (file_name, '/');
229        cursor != NULL;
230        cursor = strchr (cursor + 1, '/'))
231     {
232       /* Avoid mkdir of empty string, if leading or double '/'.  */
233
234       if (cursor == file_name || cursor[-1] == '/')
235         continue;
236
237       /* Avoid mkdir where last part of path is '.'.  */
238
239       if (cursor[-1] == '.' && (cursor == file_name + 1 || cursor[-2] == '/'))
240         continue;
241
242       *cursor = '\0';           /* truncate the path there */
243       status = mkdir (file_name, ~newdir_umask & MODE_RWX);
244
245       if (status == 0)
246         {
247           /* Fix ownership.  */
248
249           if (we_are_root)
250             if (chown (file_name, current_stat.st_uid, current_stat.st_gid) < 0)
251               ERROR ((0, errno,
252                       _("%s: Cannot change owner to uid %lu, gid %lu"),
253                       file_name,
254                       (unsigned long) current_stat.st_uid,
255                       (unsigned long) current_stat.st_gid));
256
257           print_for_mkdir (file_name, cursor - file_name,
258                            ~newdir_umask & MODE_RWX);
259           did_something = 1;
260
261           *cursor = '/';
262           continue;
263         }
264
265       *cursor = '/';
266
267       if (errno == EEXIST
268 #if MSDOS
269           /* Turbo C mkdir gives a funny errno.  */
270           || errno == EACCES
271 #endif
272           )
273         /* Directory already exists.  */
274         continue;
275
276       /* Some other error in the mkdir.  We return to the caller.  */
277       break;
278     }
279
280   errno = saved_errno;          /* FIXME: errno should be read-only */
281   return did_something;         /* tell them to retry if we made one */
282 }
283
284 /*--------------------------------------------------------------------.
285 | Attempt repairing what went wrong with the extraction.  Delete an   |
286 | already existing file or create missing intermediate directories.   |
287 | Return nonzero if we somewhat increased our chances at a successful |
288 | extraction.  errno is properly restored on zero return.             |
289 `--------------------------------------------------------------------*/
290
291 static int
292 maybe_recoverable (char *file_name)
293 {
294   switch (errno)
295     {
296     case EEXIST:
297       /* Attempt deleting an existing file.  However, with -k, just stay
298          quiet.  */
299
300       if (keep_old_files_option)
301         return 0;
302
303       return remove_any_file (file_name, 0);
304
305     case ENOENT:
306       /* Attempt creating missing intermediate directories.  */
307
308       return make_directories (file_name);
309
310     default:
311       /* Just say we can't do anything about it...  */
312
313       return 0;
314     }
315 }
316
317 /*---.
318 | ?  |
319 `---*/
320
321 static void
322 extract_sparse_file (int fd, off_t *sizeleft, off_t totalsize, char *name)
323 {
324   int sparse_ind = 0;
325   size_t written;
326   ssize_t count;
327
328   /* assuming sizeleft is initially totalsize */
329
330   while (*sizeleft > 0)
331     {
332       union block *data_block = find_next_block ();
333       if (data_block == NULL)
334         {
335           ERROR ((0, 0, _("Unexpected EOF on archive file")));
336           return;
337         }
338       if (lseek (fd, sparsearray[sparse_ind].offset, SEEK_SET) < 0)
339         {
340           char buf[UINTMAX_STRSIZE_BOUND];
341           ERROR ((0, errno, _("%s: lseek error at byte %s"),
342                   STRINGIFY_BIGINT (sparsearray[sparse_ind].offset, buf),
343                   name));
344           return;
345         }
346       written = sparsearray[sparse_ind++].numbytes;
347       while (written > BLOCKSIZE)
348         {
349           count = full_write (fd, data_block->buffer, BLOCKSIZE);
350           if (count < 0)
351             ERROR ((0, errno, _("%s: Could not write to file"), name));
352           written -= count;
353           *sizeleft -= count;
354           set_next_block_after (data_block);
355           data_block = find_next_block ();
356         }
357
358       count = full_write (fd, data_block->buffer, written);
359
360       if (count < 0)
361         ERROR ((0, errno, _("%s: Could not write to file"), name));
362       else if (count != written)
363         {
364           char buf1[UINTMAX_STRSIZE_BOUND];
365           char buf2[UINTMAX_STRSIZE_BOUND];
366           ERROR ((0, 0, _("%s: Could only write %s of %s bytes"),
367                   name,
368                   STRINGIFY_BIGINT (totalsize - *sizeleft, buf1),
369                   STRINGIFY_BIGINT (totalsize, buf2)));
370           skip_file (*sizeleft);
371         }
372
373       written -= count;
374       *sizeleft -= count;
375       set_next_block_after (data_block);
376     }
377
378   free (sparsearray);
379 }
380
381 /*----------------------------------.
382 | Extract a file from the archive.  |
383 `----------------------------------*/
384
385 void
386 extract_archive (void)
387 {
388   union block *data_block;
389   int fd;
390   int status;
391   ssize_t sstatus;
392   size_t name_length;
393   size_t written;
394   int openflag;
395   off_t size;
396   int skipcrud;
397   int counter;
398   char typeflag;
399 #if 0
400   int sparse_ind = 0;
401 #endif
402   union block *exhdr;
403   struct delayed_set_stat *data;
404
405 #define CURRENT_FILE_NAME (skipcrud + current_file_name)
406
407   set_next_block_after (current_header);
408   decode_header (current_header, &current_stat, &current_format, 1);
409
410   if (interactive_option && !confirm ("extract", current_file_name))
411     {
412       if (current_header->oldgnu_header.isextended)
413         skip_extended_headers ();
414       skip_file (current_stat.st_size);
415       return;
416     }
417
418   /* Print the block from `current_header' and `current_stat'.  */
419
420   if (verbose_option)
421     print_header ();
422
423   /* Check for fully specified file names and other atrocities.  */
424
425   skipcrud = 0;
426   while (!absolute_names_option && CURRENT_FILE_NAME[0] == '/')
427     {
428       static int warned_once = 0;
429
430       skipcrud++;               /* force relative path */
431       if (!warned_once)
432         {
433           warned_once = 1;
434           WARN ((0, 0, _("\
435 Removing leading `/' from absolute path names in the archive")));
436         }
437     }
438
439   /* Take a safety backup of a previously existing file.  */
440
441   if (backup_option && !to_stdout_option)
442     if (!maybe_backup_file (CURRENT_FILE_NAME, 0))
443       {
444         ERROR ((0, errno, _("%s: Was unable to backup this file"),
445                 CURRENT_FILE_NAME));
446         if (current_header->oldgnu_header.isextended)
447           skip_extended_headers ();
448         skip_file (current_stat.st_size);
449         return;
450       }
451
452   /* Extract the archive entry according to its type.  */
453
454   typeflag = current_header->header.typeflag;
455   switch (typeflag)
456     {
457       /* JK - What we want to do if the file is sparse is loop through
458          the array of sparse structures in the header and read in and
459          translate the character strings representing 1) the offset at
460          which to write and 2) how many bytes to write into numbers,
461          which we store into the scratch array, "sparsearray".  This
462          array makes our life easier the same way it did in creating the
463          tar file that had to deal with a sparse file.
464
465          After we read in the first five (at most) sparse structures, we
466          check to see if the file has an extended header, i.e., if more
467          sparse structures are needed to describe the contents of the new
468          file.  If so, we read in the extended headers and continue to
469          store their contents into the sparsearray.  */
470
471     case GNUTYPE_SPARSE:
472       sp_array_size = 10;
473       sparsearray = (struct sp_array *)
474         xmalloc (sp_array_size * sizeof (struct sp_array));
475
476       for (counter = 0; counter < SPARSES_IN_OLDGNU_HEADER; counter++)
477         {
478           sparsearray[counter].offset =
479             OFF_FROM_OCT (current_header->oldgnu_header.sp[counter].offset);
480           sparsearray[counter].numbytes =
481             SIZE_FROM_OCT (current_header->oldgnu_header.sp[counter].numbytes);
482           if (!sparsearray[counter].numbytes)
483             break;
484         }
485
486       if (current_header->oldgnu_header.isextended)
487         {
488           /* Read in the list of extended headers and translate them
489              into the sparsearray as before.  Note that this
490              invalidates current_header.  */
491
492           /* static */ int ind = SPARSES_IN_OLDGNU_HEADER;
493
494           while (1)
495             {
496               exhdr = find_next_block ();
497               for (counter = 0; counter < SPARSES_IN_SPARSE_HEADER; counter++)
498                 {
499                   if (counter + ind > sp_array_size - 1)
500                     {
501                       /* Realloc the scratch area since we've run out of
502                          room.  */
503
504                       sp_array_size *= 2;
505                       sparsearray = (struct sp_array *)
506                         xrealloc (sparsearray,
507                                   sp_array_size * (sizeof (struct sp_array)));
508                     }
509                   /* Compare to 0, or use !(int)..., for Pyramid's dumb
510                      compiler.  */
511                   if (exhdr->sparse_header.sp[counter].numbytes == 0)
512                     break;
513                   sparsearray[counter + ind].offset =
514                     OFF_FROM_OCT (exhdr->sparse_header.sp[counter].offset);
515                   sparsearray[counter + ind].numbytes =
516                     SIZE_FROM_OCT (exhdr->sparse_header.sp[counter].numbytes);
517                 }
518               if (!exhdr->sparse_header.isextended)
519                 break;
520               else
521                 {
522                   ind += SPARSES_IN_SPARSE_HEADER;
523                   set_next_block_after (exhdr);
524                 }
525             }
526           set_next_block_after (exhdr);
527         }
528       /* Fall through.  */
529
530     case AREGTYPE:
531     case REGTYPE:
532     case CONTTYPE:
533
534       /* Appears to be a file.  But BSD tar uses the convention that a slash
535          suffix means a directory.  */
536
537       name_length = strlen (CURRENT_FILE_NAME) - 1;
538       if (CURRENT_FILE_NAME[name_length] == '/')
539         goto really_dir;
540
541       /* FIXME: deal with protection issues.  */
542
543     again_file:
544       openflag = (keep_old_files_option ?
545                   O_BINARY | O_NDELAY | O_WRONLY | O_CREAT | O_EXCL :
546                   O_BINARY | O_NDELAY | O_WRONLY | O_CREAT | O_TRUNC)
547         | ((typeflag == GNUTYPE_SPARSE) ? 0 : O_APPEND);
548
549       /* JK - The last | is a kludge to solve the problem the O_APPEND
550          flag causes with files we are trying to make sparse: when a file
551          is opened with O_APPEND, it writes to the last place that
552          something was written, thereby ignoring any lseeks that we have
553          done.  We add this extra condition to make it able to lseek when
554          a file is sparse, i.e., we don't open the new file with this
555          flag.  (Grump -- this bug caused me to waste a good deal of
556          time, I might add)  */
557
558       if (to_stdout_option)
559         {
560           fd = 1;
561           goto extract_file;
562         }
563
564       if (unlink_first_option)
565         remove_any_file (CURRENT_FILE_NAME, recursive_unlink_option);
566
567 #if O_CTG
568       /* Contiguous files (on the Masscomp) have to specify the size in
569          the open call that creates them.  */
570
571       if (typeflag == CONTTYPE)
572         fd = open (CURRENT_FILE_NAME, openflag | O_CTG,
573                    current_stat.st_mode, current_stat.st_size);
574       else
575         fd = open (CURRENT_FILE_NAME, openflag, current_stat.st_mode);
576
577 #else /* not O_CTG */
578       if (typeflag == CONTTYPE)
579         {
580           static int conttype_diagnosed = 0;
581
582           if (!conttype_diagnosed)
583             {
584               conttype_diagnosed = 1;
585               WARN ((0, 0, _("Extracting contiguous files as regular files")));
586             }
587         }
588       fd = open (CURRENT_FILE_NAME, openflag, current_stat.st_mode);
589
590 #endif /* not O_CTG */
591
592       if (fd < 0)
593         {
594           if (maybe_recoverable (CURRENT_FILE_NAME))
595             goto again_file;
596
597           ERROR ((0, errno, _("%s: Could not create file"),
598                   CURRENT_FILE_NAME));
599           if (current_header->oldgnu_header.isextended)
600             skip_extended_headers ();
601           skip_file (current_stat.st_size);
602           if (backup_option)
603             undo_last_backup ();
604           break;
605         }
606
607     extract_file:
608       if (typeflag == GNUTYPE_SPARSE)
609         {
610           char *name;
611           size_t name_length_bis;
612
613           /* Kludge alert.  NAME is assigned to header.name because
614              during the extraction, the space that contains the header
615              will get scribbled on, and the name will get munged, so any
616              error messages that happen to contain the filename will look
617              REAL interesting unless we do this.  */
618
619           name_length_bis = strlen (CURRENT_FILE_NAME) + 1;
620           name = (char *) xmalloc (name_length_bis);
621           memcpy (name, CURRENT_FILE_NAME, name_length_bis);
622           size = current_stat.st_size;
623           extract_sparse_file (fd, &size, current_stat.st_size, name);
624         }
625       else
626         for (size = current_stat.st_size;
627              size > 0;
628              size -= written)
629           {
630             if (multi_volume_option)
631               {
632                 assign_string (&save_name, current_file_name);
633                 save_totsize = current_stat.st_size;
634                 save_sizeleft = size;
635               }
636
637             /* Locate data, determine max length writeable, write it,
638                block that we have used the data, then check if the write
639                worked.  */
640
641             data_block = find_next_block ();
642             if (data_block == NULL)
643               {
644                 ERROR ((0, 0, _("Unexpected EOF on archive file")));
645                 break;          /* FIXME: What happens, then?  */
646               }
647
648             written = available_space_after (data_block);
649
650             if (written > size)
651               written = size;
652             errno = 0;          /* FIXME: errno should be read-only */
653             sstatus = full_write (fd, data_block->buffer, written);
654
655             set_next_block_after ((union block *)
656                                   (data_block->buffer + written - 1));
657             if (sstatus == written)
658               continue;
659
660             /* Error in writing to file.  Print it, skip to next file in
661                archive.  */
662
663             if (sstatus < 0)
664               ERROR ((0, errno, _("%s: Could not write to file"),
665                       CURRENT_FILE_NAME));
666             else
667               ERROR ((0, 0, _("%s: Could only write %lu of %lu bytes"),
668                       CURRENT_FILE_NAME,
669                       (unsigned long) sstatus,
670                       (unsigned long) written));
671             skip_file (size - written);
672             break;              /* still do the close, mod time, chmod, etc */
673           }
674
675       if (multi_volume_option)
676         assign_string (&save_name, NULL);
677
678       /* If writing to stdout, don't try to do anything to the filename;
679          it doesn't exist, or we don't want to touch it anyway.  */
680
681       if (to_stdout_option)
682         break;
683
684       status = close (fd);
685       if (status < 0)
686         {
687           ERROR ((0, errno, _("%s: Error while closing"), CURRENT_FILE_NAME));
688           if (backup_option)
689             undo_last_backup ();
690         }
691
692       set_stat (CURRENT_FILE_NAME, &current_stat, 0);
693       break;
694
695     case SYMTYPE:
696       if (to_stdout_option)
697         break;
698
699 #ifdef S_ISLNK
700       if (unlink_first_option)
701         remove_any_file (CURRENT_FILE_NAME, recursive_unlink_option);
702
703       while (status = symlink (current_link_name, CURRENT_FILE_NAME),
704              status != 0)
705         if (!maybe_recoverable (CURRENT_FILE_NAME))
706           break;
707
708       if (status == 0)
709
710         /* Setting the attributes of symbolic links might, on some systems,
711            change the pointed to file, instead of the symbolic link itself.
712            At least some of these systems have a lchown call, and the
713            set_stat routine knows about this.    */
714
715         set_stat (CURRENT_FILE_NAME, &current_stat, 1);
716
717       else
718         {
719           ERROR ((0, errno, _("%s: Could not create symlink to `%s'"),
720                   CURRENT_FILE_NAME, current_link_name));
721           if (backup_option)
722             undo_last_backup ();
723         }
724       break;
725
726 #else /* not S_ISLNK */
727       {
728         static int warned_once = 0;
729
730         if (!warned_once)
731           {
732             warned_once = 1;
733             WARN ((0, 0, _("\
734 Attempting extraction of symbolic links as hard links")));
735           }
736       }
737       /* Fall through.  */
738
739 #endif /* not S_ISLNK */
740
741     case LNKTYPE:
742       if (to_stdout_option)
743         break;
744
745       if (unlink_first_option)
746         remove_any_file (CURRENT_FILE_NAME, recursive_unlink_option);
747
748     again_link:
749       {
750         struct stat st1, st2;
751
752         /* MSDOS does not implement links.  However, djgpp's link() actually
753            copies the file.  */
754         status = link (current_link_name, CURRENT_FILE_NAME);
755
756         if (status == 0)
757           break;
758         if (maybe_recoverable (CURRENT_FILE_NAME))
759           goto again_link;
760
761         if (incremental_option && errno == EEXIST)
762           break;
763         if (stat (current_link_name, &st1) == 0
764             && stat (CURRENT_FILE_NAME, &st2) == 0
765             && st1.st_dev == st2.st_dev
766             && st1.st_ino == st2.st_ino)
767           break;
768
769         ERROR ((0, errno, _("%s: Could not link to `%s'"),
770                 CURRENT_FILE_NAME, current_link_name));
771         if (backup_option)
772           undo_last_backup ();
773       }
774       break;
775
776 #if S_IFCHR
777     case CHRTYPE:
778       current_stat.st_mode |= S_IFCHR;
779       goto make_node;
780 #endif
781
782 #if S_IFBLK
783     case BLKTYPE:
784       current_stat.st_mode |= S_IFBLK;
785 #endif
786
787 #if defined(S_IFCHR) || defined(S_IFBLK)
788     make_node:
789       if (to_stdout_option)
790         break;
791
792       if (unlink_first_option)
793         remove_any_file (CURRENT_FILE_NAME, recursive_unlink_option);
794
795       status = mknod (CURRENT_FILE_NAME, current_stat.st_mode,
796                       current_stat.st_rdev);
797       if (status != 0)
798         {
799           if (maybe_recoverable (CURRENT_FILE_NAME))
800             goto make_node;
801
802           ERROR ((0, errno, _("%s: Could not make node"), CURRENT_FILE_NAME));
803           if (backup_option)
804             undo_last_backup ();
805           break;
806         };
807       set_stat (CURRENT_FILE_NAME, &current_stat, 0);
808       break;
809 #endif
810
811 #ifdef S_ISFIFO
812     case FIFOTYPE:
813       if (to_stdout_option)
814         break;
815
816       if (unlink_first_option)
817         remove_any_file (CURRENT_FILE_NAME, recursive_unlink_option);
818
819       while (status = mkfifo (CURRENT_FILE_NAME, current_stat.st_mode),
820              status != 0)
821         if (!maybe_recoverable (CURRENT_FILE_NAME))
822           break;
823
824       if (status == 0)
825         set_stat (CURRENT_FILE_NAME, &current_stat, 0);
826       else
827         {
828           ERROR ((0, errno, _("%s: Could not make fifo"), CURRENT_FILE_NAME));
829           if (backup_option)
830             undo_last_backup ();
831         }
832       break;
833 #endif
834
835     case DIRTYPE:
836     case GNUTYPE_DUMPDIR:
837       name_length = strlen (CURRENT_FILE_NAME) - 1;
838
839     really_dir:
840       /* Check for trailing /, and zap as many as we find.  */
841       while (name_length && CURRENT_FILE_NAME[name_length] == '/')
842         CURRENT_FILE_NAME[name_length--] = '\0';
843
844       if (incremental_option)
845         {
846           /* Read the entry and delete files that aren't listed in the
847              archive.  */
848
849           gnu_restore (skipcrud);
850         }
851       else if (typeflag == GNUTYPE_DUMPDIR)
852         skip_file (current_stat.st_size);
853
854       if (to_stdout_option)
855         break;
856
857     again_dir:
858       status = mkdir (CURRENT_FILE_NAME,
859                       ((we_are_root ? 0 : MODE_WXUSR)
860                        | current_stat.st_mode));
861       if (status != 0)
862         {
863           /* If the directory creation fails, let's consider immediately the
864              case where the directory already exists.  We have three good
865              reasons for clearing out this case before attempting recovery.
866
867              1) It would not be efficient recovering the error by deleting
868              the directory in maybe_recoverable, then recreating it right
869              away.  We only hope we will be able to adjust its permissions
870              adequately, later.
871
872              2) Removing the directory might fail if it is not empty.  By
873              exception, this real error is traditionally not reported.
874
875              3) Let's suppose `DIR' already exists and we are about to
876              extract `DIR/../DIR'.  This would fail because the directory
877              already exists, and maybe_recoverable would react by removing
878              `DIR'.  This then would fail again because there are missing
879              intermediate directories, and maybe_recoverable would react by
880              creating `DIR'.  We would then have an extraction loop.  */
881
882           if (errno == EEXIST)
883             {
884               struct stat st1;
885               int saved_errno = errno;
886
887               if (stat (CURRENT_FILE_NAME, &st1) == 0 && S_ISDIR (st1.st_mode))
888                 goto check_perms;
889
890               errno = saved_errno; /* FIXME: errno should be read-only */
891             }
892
893           if (maybe_recoverable (CURRENT_FILE_NAME))
894             goto again_dir;
895
896           /* If we're trying to create '.', let it be.  */
897
898           /* FIXME: Strange style...  */
899
900           if (CURRENT_FILE_NAME[name_length] == '.'
901               && (name_length == 0
902                   || CURRENT_FILE_NAME[name_length - 1] == '/'))
903             goto check_perms;
904
905           ERROR ((0, errno, _("%s: Could not create directory"),
906                   CURRENT_FILE_NAME));
907           if (backup_option)
908             undo_last_backup ();
909           break;
910         }
911
912     check_perms:
913       if (!we_are_root && MODE_WXUSR != (MODE_WXUSR & current_stat.st_mode))
914         {
915           current_stat.st_mode |= MODE_WXUSR;
916           WARN ((0, 0, _("Added write and execute permission to directory %s"),
917                  CURRENT_FILE_NAME));
918         }
919
920 #if !MSDOS
921       /* MSDOS does not associate timestamps with directories.   In this
922          case, no need to try delaying their restoration.  */
923
924       if (touch_option)
925
926         /* FIXME: I do not believe in this.  Ignoring time stamps does not
927            alleviate the need of delaying the restoration of directories'
928            mode.  Let's ponder this for a little while.  */
929
930         set_mode (CURRENT_FILE_NAME, &current_stat);
931
932       else
933         {
934           data = ((struct delayed_set_stat *)
935                       xmalloc (sizeof (struct delayed_set_stat)));
936           data->file_name = xstrdup (CURRENT_FILE_NAME);
937           data->stat_info = current_stat;
938           data->next = delayed_set_stat_head;
939           delayed_set_stat_head = data;
940         }
941 #endif /* !MSDOS */
942       break;
943
944     case GNUTYPE_VOLHDR:
945       if (verbose_option)
946         fprintf (stdlis, _("Reading %s\n"), current_file_name);
947       break;
948
949     case GNUTYPE_NAMES:
950       extract_mangle ();
951       break;
952
953     case GNUTYPE_MULTIVOL:
954       ERROR ((0, 0, _("\
955 Cannot extract `%s' -- file is continued from another volume"),
956               current_file_name));
957       skip_file (current_stat.st_size);
958       if (backup_option)
959         undo_last_backup ();
960       break;
961
962     case GNUTYPE_LONGNAME:
963     case GNUTYPE_LONGLINK:
964       ERROR ((0, 0, _("Visible long name error")));
965       skip_file (current_stat.st_size);
966       if (backup_option)
967         undo_last_backup ();
968       break;
969
970     default:
971       WARN ((0, 0,
972              _("Unknown file type '%c' for %s, extracted as normal file"),
973              typeflag, CURRENT_FILE_NAME));
974       goto again_file;
975     }
976
977 #undef CURRENT_FILE_NAME
978 }
979
980 /*----------------------------------------------------------------.
981 | Set back the utime and mode for all the extracted directories.  |
982 `----------------------------------------------------------------*/
983
984 void
985 apply_delayed_set_stat (void)
986 {
987   struct delayed_set_stat *data;
988
989   while (delayed_set_stat_head != NULL)
990     {
991       data = delayed_set_stat_head;
992       delayed_set_stat_head = delayed_set_stat_head->next;
993       set_stat (data->file_name, &data->stat_info, 0);
994       free (data->file_name);
995       free (data);
996     }
997 }