]> Dogcows Code - chaz/tar/blob - src/extract.c
(get_gnu_dumpdir): Remove prototype
[chaz/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 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 (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
402 for (cursor = cursor0; *cursor; cursor++)
403 {
404 if (! ISSLASH (*cursor))
405 continue;
406
407 /* Avoid mkdir of empty string, if leading or double '/'. */
408
409 if (cursor == cursor0 || ISSLASH (cursor[-1]))
410 continue;
411
412 /* Avoid mkdir where last part of file name is "." or "..". */
413
414 if (cursor[-1] == '.'
415 && (cursor == cursor0 + 1 || ISSLASH (cursor[-2])
416 || (cursor[-2] == '.'
417 && (cursor == cursor0 + 2 || ISSLASH (cursor[-3])))))
418 continue;
419
420 *cursor = '\0'; /* truncate the name there */
421 mode = MODE_RWX & ~ newdir_umask;
422 invert_permissions = we_are_root ? 0 : MODE_WXUSR & ~ mode;
423 status = mkdir (file_name, mode ^ invert_permissions);
424
425 if (status == 0)
426 {
427 /* Create a struct delayed_set_stat even if
428 invert_permissions is zero, because
429 repair_delayed_set_stat may need to update the struct. */
430 delay_set_stat (file_name,
431 &current_stat_info /* ignored */,
432 invert_permissions, INTERDIR_PERMSTATUS);
433
434 print_for_mkdir (file_name, cursor - file_name, mode);
435 did_something = 1;
436
437 *cursor = '/';
438 continue;
439 }
440
441 *cursor = '/';
442
443 if (errno == EEXIST)
444 continue; /* Directory already exists. */
445 else if ((errno == ENOSYS /* Automounted dirs on Solaris return
446 this. Reported by Warren Hyde
447 <Warren.Hyde@motorola.com> */
448 || ERRNO_IS_EACCES) /* Turbo C mkdir gives a funny errno. */
449 && access (file_name, W_OK) == 0)
450 continue;
451
452 /* Some other error in the mkdir. We return to the caller. */
453 break;
454 }
455
456 return did_something; /* tell them to retry if we made one */
457 }
458
459 static bool
460 file_newer_p (const char *file_name, struct tar_stat_info *tar_stat)
461 {
462 struct stat st;
463
464 if (stat (file_name, &st))
465 {
466 stat_warn (file_name);
467 /* Be on the safe side: if the file does exist assume it is newer */
468 return errno != ENOENT;
469 }
470 if (!S_ISDIR (st.st_mode)
471 && tar_timespec_cmp (tar_stat->mtime, get_stat_mtime (&st)) <= 0)
472 {
473 return true;
474 }
475 return false;
476 }
477
478 /* Attempt repairing what went wrong with the extraction. Delete an
479 already existing file or create missing intermediate directories.
480 Return nonzero if we somewhat increased our chances at a successful
481 extraction. errno is properly restored on zero return. */
482 static int
483 maybe_recoverable (char *file_name, int *interdir_made)
484 {
485 int e = errno;
486
487 if (*interdir_made)
488 return 0;
489
490 switch (errno)
491 {
492 case EEXIST:
493 /* Remove an old file, if the options allow this. */
494
495 switch (old_files_option)
496 {
497 case KEEP_OLD_FILES:
498 return 0;
499
500 case KEEP_NEWER_FILES:
501 if (file_newer_p (file_name, &current_stat_info))
502 {
503 errno = e;
504 return 0;
505 }
506 /* FALL THROUGH */
507
508 case DEFAULT_OLD_FILES:
509 case NO_OVERWRITE_DIR_OLD_FILES:
510 case OVERWRITE_OLD_FILES:
511 {
512 int r = remove_any_file (file_name, ORDINARY_REMOVE_OPTION);
513 errno = EEXIST;
514 return r;
515 }
516
517 case UNLINK_FIRST_OLD_FILES:
518 break;
519 }
520
521 case ENOENT:
522 /* Attempt creating missing intermediate directories. */
523 if (! make_directories (file_name))
524 {
525 errno = ENOENT;
526 return 0;
527 }
528 *interdir_made = 1;
529 return 1;
530
531 default:
532 /* Just say we can't do anything about it... */
533
534 return 0;
535 }
536 }
537
538 /* Fix the statuses of all directories whose statuses need fixing, and
539 which are not ancestors of FILE_NAME. If AFTER_LINKS is
540 nonzero, do this for all such directories; otherwise, stop at the
541 first directory that is marked to be fixed up only after delayed
542 links are applied. */
543 static void
544 apply_nonancestor_delayed_set_stat (char const *file_name, bool after_links)
545 {
546 size_t file_name_len = strlen (file_name);
547 bool check_for_renamed_directories = 0;
548
549 while (delayed_set_stat_head)
550 {
551 struct delayed_set_stat *data = delayed_set_stat_head;
552 bool skip_this_one = 0;
553 struct stat st;
554 struct stat const *cur_info = 0;
555
556 check_for_renamed_directories |= data->after_links;
557
558 if (after_links < data->after_links
559 || (data->file_name_len < file_name_len
560 && file_name[data->file_name_len]
561 && (ISSLASH (file_name[data->file_name_len])
562 || ISSLASH (file_name[data->file_name_len - 1]))
563 && memcmp (file_name, data->file_name, data->file_name_len) == 0))
564 break;
565
566 if (check_for_renamed_directories)
567 {
568 cur_info = &st;
569 if (stat (data->file_name, &st) != 0)
570 {
571 stat_error (data->file_name);
572 skip_this_one = 1;
573 }
574 else if (! (st.st_dev == data->dev && st.st_ino == data->ino))
575 {
576 ERROR ((0, 0,
577 _("%s: Directory renamed before its status could be extracted"),
578 quotearg_colon (data->file_name)));
579 skip_this_one = 1;
580 }
581 }
582
583 if (! skip_this_one)
584 {
585 struct tar_stat_info st;
586 st.stat.st_mode = data->mode;
587 st.stat.st_uid = data->uid;
588 st.stat.st_gid = data->gid;
589 st.atime = data->atime;
590 st.mtime = data->mtime;
591 set_stat (data->file_name, &st, cur_info,
592 data->invert_permissions, data->permstatus, DIRTYPE);
593 }
594
595 delayed_set_stat_head = data->next;
596 free (data);
597 }
598 }
599
600 \f
601
602 /* Extractor functions for various member types */
603
604 static int
605 extract_dir (char *file_name, int typeflag)
606 {
607 int status;
608 mode_t mode;
609 int interdir_made = 0;
610
611 /* Save 'root device' to avoid purging mount points. */
612 if (one_file_system_option && root_device == 0)
613 {
614 struct stat st;
615 char *dir = xgetcwd ();
616
617 if (deref_stat (true, dir, &st))
618 stat_diag (dir);
619 else
620 root_device = st.st_dev;
621 free (dir);
622 }
623
624 if (incremental_option)
625 /* Read the entry and delete files that aren't listed in the archive. */
626 purge_directory (file_name);
627 else if (typeflag == GNUTYPE_DUMPDIR)
628 skip_member ();
629
630 mode = (current_stat_info.stat.st_mode |
631 (we_are_root ? 0 : MODE_WXUSR)) & MODE_RWX;
632
633 while ((status = mkdir (file_name, mode)))
634 {
635 if (errno == EEXIST
636 && (interdir_made
637 || old_files_option == DEFAULT_OLD_FILES
638 || old_files_option == OVERWRITE_OLD_FILES))
639 {
640 struct stat st;
641 if (stat (file_name, &st) == 0)
642 {
643 if (interdir_made)
644 {
645 repair_delayed_set_stat (file_name, &st);
646 return 0;
647 }
648 if (S_ISDIR (st.st_mode))
649 {
650 mode = st.st_mode & ~ current_umask;
651 break;
652 }
653 }
654 errno = EEXIST;
655 }
656
657 if (maybe_recoverable (file_name, &interdir_made))
658 continue;
659
660 if (errno != EEXIST)
661 {
662 mkdir_error (file_name);
663 return 1;
664 }
665 break;
666 }
667
668 if (status == 0
669 || old_files_option == DEFAULT_OLD_FILES
670 || old_files_option == OVERWRITE_OLD_FILES)
671 delay_set_stat (file_name, &current_stat_info,
672 MODE_RWX & (mode ^ current_stat_info.stat.st_mode),
673 (status == 0
674 ? ARCHIVED_PERMSTATUS
675 : UNKNOWN_PERMSTATUS));
676
677 return status;
678 }
679
680
681 static int
682 open_output_file (char *file_name, int typeflag)
683 {
684 int fd;
685 int openflag = (O_WRONLY | O_BINARY | O_CREAT
686 | (old_files_option == OVERWRITE_OLD_FILES
687 ? O_TRUNC
688 : O_EXCL));
689 mode_t mode = current_stat_info.stat.st_mode & MODE_RWX & ~ current_umask;
690
691 #if O_CTG
692 /* Contiguous files (on the Masscomp) have to specify the size in
693 the open call that creates them. */
694
695 if (typeflag == CONTTYPE)
696 fd = open (file_name, openflag | O_CTG, mode, current_stat_info.stat.st_size);
697 else
698 fd = open (file_name, openflag, mode);
699
700 #else /* not O_CTG */
701 if (typeflag == CONTTYPE)
702 {
703 static int conttype_diagnosed;
704
705 if (!conttype_diagnosed)
706 {
707 conttype_diagnosed = 1;
708 WARN ((0, 0, _("Extracting contiguous files as regular files")));
709 }
710 }
711 fd = open (file_name, openflag, mode);
712
713 #endif /* not O_CTG */
714
715 return fd;
716 }
717
718 static int
719 extract_file (char *file_name, int typeflag)
720 {
721 int fd;
722 off_t size;
723 union block *data_block;
724 int status;
725 size_t count;
726 size_t written;
727 int interdir_made = 0;
728
729 /* FIXME: deal with protection issues. */
730
731 if (to_stdout_option)
732 fd = STDOUT_FILENO;
733 else if (to_command_option)
734 {
735 fd = sys_exec_command (file_name, 'f', &current_stat_info);
736 if (fd < 0)
737 {
738 skip_member ();
739 return 0;
740 }
741 }
742 else
743 {
744 do
745 fd = open_output_file (file_name, typeflag);
746 while (fd < 0 && maybe_recoverable (file_name, &interdir_made));
747
748 if (fd < 0)
749 {
750 open_error (file_name);
751 return 1;
752 }
753 }
754
755 mv_begin (&current_stat_info);
756 if (current_stat_info.is_sparse)
757 sparse_extract_file (fd, &current_stat_info, &size);
758 else
759 for (size = current_stat_info.stat.st_size; size > 0; )
760 {
761 mv_size_left (size);
762
763 /* Locate data, determine max length writeable, write it,
764 block that we have used the data, then check if the write
765 worked. */
766
767 data_block = find_next_block ();
768 if (! data_block)
769 {
770 ERROR ((0, 0, _("Unexpected EOF in archive")));
771 break; /* FIXME: What happens, then? */
772 }
773
774 written = available_space_after (data_block);
775
776 if (written > size)
777 written = size;
778 errno = 0;
779 count = full_write (fd, data_block->buffer, written);
780 size -= written;
781
782 set_next_block_after ((union block *)
783 (data_block->buffer + written - 1));
784 if (count != written)
785 {
786 if (!to_command_option)
787 write_error_details (file_name, count, written);
788 /* FIXME: shouldn't we restore from backup? */
789 break;
790 }
791 }
792
793 skip_file (size);
794
795 mv_end ();
796
797 /* If writing to stdout, don't try to do anything to the filename;
798 it doesn't exist, or we don't want to touch it anyway. */
799
800 if (to_stdout_option)
801 return 0;
802
803 status = close (fd);
804 if (status < 0)
805 close_error (file_name);
806
807 if (to_command_option)
808 sys_wait_command ();
809 else
810 set_stat (file_name, &current_stat_info, NULL, 0,
811 (old_files_option == OVERWRITE_OLD_FILES ?
812 UNKNOWN_PERMSTATUS : ARCHIVED_PERMSTATUS),
813 typeflag);
814
815 return status;
816 }
817
818 /* Create a placeholder file with name FILE_NAME, which will be
819 replaced after other extraction is done by a symbolic link if
820 IS_SYMLINK is true, and by a hard link otherwise. Set
821 *INTERDIR_MADE if an intermediate directory is made in the
822 process. */
823
824 static int
825 create_placeholder_file (char *file_name, bool is_symlink, int *interdir_made)
826 {
827 int fd;
828 struct stat st;
829
830 while ((fd = open (file_name, O_WRONLY | O_CREAT | O_EXCL, 0)) < 0)
831 if (! maybe_recoverable (file_name, interdir_made))
832 break;
833
834 if (fd < 0)
835 open_error (file_name);
836 else if (fstat (fd, &st) != 0)
837 {
838 stat_error (file_name);
839 close (fd);
840 }
841 else if (close (fd) != 0)
842 close_error (file_name);
843 else
844 {
845 struct delayed_set_stat *h;
846 struct delayed_link *p =
847 xmalloc (offsetof (struct delayed_link, target)
848 + strlen (current_stat_info.link_name)
849 + 1);
850 p->next = delayed_link_head;
851 delayed_link_head = p;
852 p->dev = st.st_dev;
853 p->ino = st.st_ino;
854 p->mtime = get_stat_mtime (&st);
855 p->is_symlink = is_symlink;
856 if (is_symlink)
857 {
858 p->uid = current_stat_info.stat.st_uid;
859 p->gid = current_stat_info.stat.st_gid;
860 }
861 p->sources = xmalloc (offsetof (struct string_list, string)
862 + strlen (file_name) + 1);
863 p->sources->next = 0;
864 strcpy (p->sources->string, file_name);
865 strcpy (p->target, current_stat_info.link_name);
866
867 h = delayed_set_stat_head;
868 if (h && ! h->after_links
869 && strncmp (file_name, h->file_name, h->file_name_len) == 0
870 && ISSLASH (file_name[h->file_name_len])
871 && (base_name (file_name) == file_name + h->file_name_len + 1))
872 {
873 do
874 {
875 h->after_links = 1;
876
877 if (stat (h->file_name, &st) != 0)
878 stat_error (h->file_name);
879 else
880 {
881 h->dev = st.st_dev;
882 h->ino = st.st_ino;
883 }
884 }
885 while ((h = h->next) && ! h->after_links);
886 }
887
888 return 0;
889 }
890
891 return -1;
892 }
893
894 static int
895 extract_link (char *file_name, int typeflag)
896 {
897 char const *link_name = safer_name_suffix (current_stat_info.link_name,
898 true, absolute_names_option);
899 int interdir_made = 0;
900
901 if (! absolute_names_option && contains_dot_dot (link_name))
902 return create_placeholder_file (file_name, false, &interdir_made);
903
904 do
905 {
906 struct stat st1, st2;
907 int e;
908 int status = link (link_name, file_name);
909 e = errno;
910
911 if (status == 0)
912 {
913 struct delayed_link *ds = delayed_link_head;
914 if (ds && lstat (link_name, &st1) == 0)
915 for (; ds; ds = ds->next)
916 if (ds->dev == st1.st_dev
917 && ds->ino == st1.st_ino
918 && timespec_cmp (ds->mtime, get_stat_mtime (&st1)) == 0)
919 {
920 struct string_list *p = xmalloc (offsetof (struct string_list, string)
921 + strlen (file_name) + 1);
922 strcpy (p->string, file_name);
923 p->next = ds->sources;
924 ds->sources = p;
925 break;
926 }
927 return 0;
928 }
929 else if ((e == EEXIST && strcmp (link_name, file_name) == 0)
930 || (lstat (link_name, &st1) == 0
931 && lstat (file_name, &st2) == 0
932 && st1.st_dev == st2.st_dev
933 && st1.st_ino == st2.st_ino))
934 return 0;
935
936 errno = e;
937 }
938 while (maybe_recoverable (file_name, &interdir_made));
939
940 if (!(incremental_option && errno == EEXIST))
941 {
942 link_error (link_name, file_name);
943 return 1;
944 }
945 return 0;
946 }
947
948 static int
949 extract_symlink (char *file_name, int typeflag)
950 {
951 #ifdef HAVE_SYMLINK
952 int status;
953 int interdir_made = 0;
954
955 if (! absolute_names_option
956 && (IS_ABSOLUTE_FILE_NAME (current_stat_info.link_name)
957 || contains_dot_dot (current_stat_info.link_name)))
958 return create_placeholder_file (file_name, true, &interdir_made);
959
960 while ((status = symlink (current_stat_info.link_name, file_name)))
961 if (!maybe_recoverable (file_name, &interdir_made))
962 break;
963
964 if (status == 0)
965 set_stat (file_name, &current_stat_info, NULL, 0, 0, SYMTYPE);
966 else
967 symlink_error (current_stat_info.link_name, file_name);
968 return status;
969
970 #else
971 static int warned_once;
972
973 if (!warned_once)
974 {
975 warned_once = 1;
976 WARN ((0, 0, _("Attempting extraction of symbolic links as hard links")));
977 }
978 return extract_link (file_name, typeflag);
979 #endif
980 }
981
982 #if S_IFCHR || S_IFBLK
983 static int
984 extract_node (char *file_name, int typeflag)
985 {
986 int status;
987 int interdir_made = 0;
988
989 do
990 status = mknod (file_name, current_stat_info.stat.st_mode,
991 current_stat_info.stat.st_rdev);
992 while (status && maybe_recoverable (file_name, &interdir_made));
993
994 if (status != 0)
995 mknod_error (file_name);
996 else
997 set_stat (file_name, &current_stat_info, NULL, 0,
998 ARCHIVED_PERMSTATUS, typeflag);
999 return status;
1000 }
1001 #endif
1002
1003 #if HAVE_MKFIFO || defined mkfifo
1004 static int
1005 extract_fifo (char *file_name, int typeflag)
1006 {
1007 int status;
1008 int interdir_made = 0;
1009
1010 while ((status = mkfifo (file_name, current_stat_info.stat.st_mode)))
1011 if (!maybe_recoverable (file_name, &interdir_made))
1012 break;
1013
1014 if (status == 0)
1015 set_stat (file_name, &current_stat_info, NULL, 0,
1016 ARCHIVED_PERMSTATUS, typeflag);
1017 else
1018 mkfifo_error (file_name);
1019 return status;
1020 }
1021 #endif
1022
1023 static int
1024 extract_mangle_wrapper (char *file_name, int typeflag)
1025 {
1026 extract_mangle ();
1027 return 0;
1028 }
1029
1030
1031 static int
1032 extract_failure (char *file_name, int typeflag)
1033 {
1034 return 1;
1035 }
1036
1037 typedef int (*tar_extractor_t) (char *file_name, int typeflag);
1038
1039 \f
1040
1041 /* Prepare to extract a file. Find extractor function.
1042 Return zero if extraction should not proceed. */
1043
1044 static int
1045 prepare_to_extract (char const *file_name, int typeflag, tar_extractor_t *fun)
1046 {
1047 int rc = 1;
1048
1049 if (EXTRACT_OVER_PIPE)
1050 rc = 0;
1051
1052 /* Select the extractor */
1053 switch (typeflag)
1054 {
1055 case GNUTYPE_SPARSE:
1056 *fun = extract_file;
1057 rc = 1;
1058 break;
1059
1060 case AREGTYPE:
1061 case REGTYPE:
1062 case CONTTYPE:
1063 /* Appears to be a file. But BSD tar uses the convention that a slash
1064 suffix means a directory. */
1065 if (current_stat_info.had_trailing_slash)
1066 *fun = extract_dir;
1067 else
1068 {
1069 *fun = extract_file;
1070 rc = 1;
1071 }
1072 break;
1073
1074 case SYMTYPE:
1075 *fun = extract_symlink;
1076 break;
1077
1078 case LNKTYPE:
1079 *fun = extract_link;
1080 break;
1081
1082 #if S_IFCHR
1083 case CHRTYPE:
1084 current_stat_info.stat.st_mode |= S_IFCHR;
1085 *fun = extract_node;
1086 break;
1087 #endif
1088
1089 #if S_IFBLK
1090 case BLKTYPE:
1091 current_stat_info.stat.st_mode |= S_IFBLK;
1092 *fun = extract_node;
1093 break;
1094 #endif
1095
1096 #if HAVE_MKFIFO || defined mkfifo
1097 case FIFOTYPE:
1098 *fun = extract_fifo;
1099 break;
1100 #endif
1101
1102 case DIRTYPE:
1103 case GNUTYPE_DUMPDIR:
1104 *fun = extract_dir;
1105 if (current_stat_info.dumpdir)
1106 delay_directory_restore_option = true;
1107 break;
1108
1109 case GNUTYPE_VOLHDR:
1110 if (verbose_option)
1111 fprintf (stdlis, _("Reading %s\n"), quote (current_stat_info.file_name));
1112 *fun = NULL;
1113 break;
1114
1115 case GNUTYPE_NAMES:
1116 *fun = extract_mangle_wrapper;
1117 break;
1118
1119 case GNUTYPE_MULTIVOL:
1120 ERROR ((0, 0,
1121 _("%s: Cannot extract -- file is continued from another volume"),
1122 quotearg_colon (current_stat_info.file_name)));
1123 *fun = extract_failure;
1124 break;
1125
1126 case GNUTYPE_LONGNAME:
1127 case GNUTYPE_LONGLINK:
1128 ERROR ((0, 0, _("Unexpected long name header")));
1129 *fun = extract_failure;
1130 break;
1131
1132 default:
1133 WARN ((0, 0,
1134 _("%s: Unknown file type `%c', extracted as normal file"),
1135 quotearg_colon (file_name), typeflag));
1136 *fun = extract_file;
1137 }
1138
1139 /* Determine whether the extraction should proceed */
1140 if (rc == 0)
1141 return 0;
1142
1143 switch (old_files_option)
1144 {
1145 case UNLINK_FIRST_OLD_FILES:
1146 if (!remove_any_file (file_name,
1147 recursive_unlink_option ? RECURSIVE_REMOVE_OPTION
1148 : ORDINARY_REMOVE_OPTION)
1149 && errno && errno != ENOENT)
1150 {
1151 unlink_error (file_name);
1152 return 0;
1153 }
1154 break;
1155
1156 case KEEP_NEWER_FILES:
1157 if (file_newer_p (file_name, &current_stat_info))
1158 {
1159 WARN ((0, 0, _("Current %s is newer or same age"),
1160 quote (file_name)));
1161 return 0;
1162 }
1163 break;
1164
1165 default:
1166 break;
1167 }
1168
1169 return 1;
1170 }
1171
1172 /* Extract a file from the archive. */
1173 void
1174 extract_archive (void)
1175 {
1176 char typeflag;
1177 char *file_name;
1178 tar_extractor_t fun;
1179
1180 set_next_block_after (current_header);
1181 decode_header (current_header, &current_stat_info, &current_format, 1);
1182
1183 if (interactive_option && !confirm ("extract", current_stat_info.file_name))
1184 {
1185 skip_member ();
1186 return;
1187 }
1188
1189 /* Print the block from current_header and current_stat. */
1190
1191 if (verbose_option)
1192 print_header (&current_stat_info, -1);
1193
1194 file_name = safer_name_suffix (current_stat_info.file_name,
1195 false, absolute_names_option);
1196 if (strip_name_components)
1197 {
1198 size_t prefix_len = stripped_prefix_len (file_name,
1199 strip_name_components);
1200 if (prefix_len == (size_t) -1)
1201 {
1202 skip_member ();
1203 return;
1204 }
1205 file_name += prefix_len;
1206 }
1207
1208 /* Restore stats for all non-ancestor directories, unless
1209 it is an incremental archive.
1210 (see NOTICE in the comment to delay_set_stat above) */
1211 if (!delay_directory_restore_option)
1212 apply_nonancestor_delayed_set_stat (file_name, 0);
1213
1214 /* Take a safety backup of a previously existing file. */
1215
1216 if (backup_option)
1217 if (!maybe_backup_file (file_name, 0))
1218 {
1219 int e = errno;
1220 ERROR ((0, e, _("%s: Was unable to backup this file"),
1221 quotearg_colon (file_name)));
1222 skip_member ();
1223 return;
1224 }
1225
1226 /* Extract the archive entry according to its type. */
1227 /* KLUDGE */
1228 typeflag = sparse_member_p (&current_stat_info) ?
1229 GNUTYPE_SPARSE : current_header->header.typeflag;
1230
1231 if (prepare_to_extract (file_name, typeflag, &fun))
1232 {
1233 if (fun && (*fun) (file_name, typeflag) && backup_option)
1234 undo_last_backup ();
1235 }
1236 else
1237 skip_member ();
1238
1239 }
1240
1241 /* Extract the symbolic links whose final extraction were delayed. */
1242 static void
1243 apply_delayed_links (void)
1244 {
1245 struct delayed_link *ds;
1246
1247 for (ds = delayed_link_head; ds; )
1248 {
1249 struct string_list *sources = ds->sources;
1250 char const *valid_source = 0;
1251
1252 for (sources = ds->sources; sources; sources = sources->next)
1253 {
1254 char const *source = sources->string;
1255 struct stat st;
1256
1257 /* Make sure the placeholder file is still there. If not,
1258 don't create a link, as the placeholder was probably
1259 removed by a later extraction. */
1260 if (lstat (source, &st) == 0
1261 && st.st_dev == ds->dev
1262 && st.st_ino == ds->ino
1263 && timespec_cmp (get_stat_mtime (&st), ds->mtime) == 0)
1264 {
1265 /* Unlink the placeholder, then create a hard link if possible,
1266 a symbolic link otherwise. */
1267 if (unlink (source) != 0)
1268 unlink_error (source);
1269 else if (valid_source && link (valid_source, source) == 0)
1270 ;
1271 else if (!ds->is_symlink)
1272 {
1273 if (link (ds->target, source) != 0)
1274 link_error (ds->target, source);
1275 }
1276 else if (symlink (ds->target, source) != 0)
1277 symlink_error (ds->target, source);
1278 else
1279 {
1280 struct tar_stat_info st1;
1281 st1.stat.st_uid = ds->uid;
1282 st1.stat.st_gid = ds->gid;
1283 set_stat (source, &st1, NULL, 0, 0, SYMTYPE);
1284 valid_source = source;
1285 }
1286 }
1287 }
1288
1289 for (sources = ds->sources; sources; )
1290 {
1291 struct string_list *next = sources->next;
1292 free (sources);
1293 sources = next;
1294 }
1295
1296 {
1297 struct delayed_link *next = ds->next;
1298 free (ds);
1299 ds = next;
1300 }
1301 }
1302
1303 delayed_link_head = 0;
1304 }
1305
1306 /* Finish the extraction of an archive. */
1307 void
1308 extract_finish (void)
1309 {
1310 /* First, fix the status of ordinary directories that need fixing. */
1311 apply_nonancestor_delayed_set_stat ("", 0);
1312
1313 /* Then, apply delayed links, so that they don't affect delayed
1314 directory status-setting for ordinary directories. */
1315 apply_delayed_links ();
1316
1317 /* Finally, fix the status of directories that are ancestors
1318 of delayed links. */
1319 apply_nonancestor_delayed_set_stat ("", 1);
1320 }
1321
1322 void
1323 fatal_exit (void)
1324 {
1325 extract_finish ();
1326 error (TAREXIT_FAILURE, 0, _("Error is not recoverable: exiting now"));
1327 abort ();
1328 }
1329
1330 void
1331 xalloc_die (void)
1332 {
1333 error (0, 0, "%s", _("memory exhausted"));
1334 fatal_exit ();
1335 }
This page took 0.101732 seconds and 4 git commands to generate.