X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fextract.c;h=9897e82a61bd1d18c4c90743f236477516205ae0;hb=427b3b8c79b64f6ca08adbfcea7aa54f4496f124;hp=531654aabbd9184e93c18b8048ddb821c39f1804;hpb=b60e56fdb6fd8d82a1f92a4fa7781d9a3184dce1;p=chaz%2Ftar diff --git a/src/extract.c b/src/extract.c index 531654a..9897e82 100644 --- a/src/extract.c +++ b/src/extract.c @@ -23,7 +23,6 @@ #include #include #include -#include #include #include "common.h" @@ -146,7 +145,7 @@ set_mode (char const *file_name, { mode_t mode; bool failed; - + if (0 < same_permissions_option && permstatus != INTERDIR_PERMSTATUS) { @@ -648,13 +647,11 @@ extract_dir (char *file_name, int typeflag) if (one_file_system_option && root_device == 0) { struct stat st; - char *dir = xgetcwd (); - if (deref_stat (true, dir, &st)) - stat_diag (dir); + if (stat (".", &st) != 0) + stat_diag ("."); else root_device = st.st_dev; - free (dir); } if (incremental_option) @@ -812,7 +809,7 @@ extract_file (char *file_name, int typeflag) } } - mv_begin (¤t_stat_info); + mv_begin_read (¤t_stat_info); if (current_stat_info.is_sparse) sparse_extract_file (fd, ¤t_stat_info, &size); else @@ -893,10 +890,10 @@ create_placeholder_file (char *file_name, bool is_symlink, int *interdir_made) { case RECOVER_OK: continue; - + case RECOVER_SKIP: return 0; - + case RECOVER_NO: open_error (file_name); return -1; @@ -967,9 +964,9 @@ extract_link (char *file_name, int typeflag) int interdir_made = 0; char const *link_name; int rc; - + link_name = current_stat_info.link_name; - + if (! absolute_names_option && contains_dot_dot (link_name)) return create_placeholder_file (file_name, false, &interdir_made); @@ -1035,15 +1032,15 @@ extract_symlink (char *file_name, int typeflag) { case RECOVER_OK: continue; - + case RECOVER_SKIP: return 0; - + case RECOVER_NO: symlink_error (current_stat_info.link_name, file_name); return -1; } - + set_stat (file_name, ¤t_stat_info, NULL, 0, 0, SYMTYPE); return 0; @@ -1065,7 +1062,6 @@ extract_symlink (char *file_name, int typeflag) static int extract_node (char *file_name, int typeflag) { - int status; int interdir_made = 0; mode_t mode = current_stat_info.stat.st_mode & ~ current_umask; mode_t invert_permissions = @@ -1077,10 +1073,10 @@ extract_node (char *file_name, int typeflag) { case RECOVER_OK: continue; - + case RECOVER_SKIP: return 0; - + case RECOVER_NO: mknod_error (file_name); return -1; @@ -1088,7 +1084,7 @@ extract_node (char *file_name, int typeflag) set_stat (file_name, ¤t_stat_info, NULL, invert_permissions, ARCHIVED_PERMSTATUS, typeflag); - return status; + return 0; } #endif @@ -1107,10 +1103,10 @@ extract_fifo (char *file_name, int typeflag) { case RECOVER_OK: continue; - + case RECOVER_SKIP: return 0; - + case RECOVER_NO: mkfifo_error (file_name); return -1; @@ -1274,12 +1270,12 @@ extract_archive (void) tar_extractor_t fun; fatal_exit_hook = extract_finish; - + /* Try to disable the ability to unlink a directory. */ priv_set_remove_linkdir (); set_next_block_after (current_header); - decode_header (current_header, ¤t_stat_info, ¤t_format, 1); + if (!current_stat_info.file_name[0] || (interactive_option && !confirm ("extract", current_stat_info.file_name)))