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