]> Dogcows Code - chaz/tar/blob - src/extract.c
(extr_init, make_directories, extract_archive):
[chaz/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 }
This page took 0.083574 seconds and 5 git commands to generate.