X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fextract.c;h=214d975e5b3e84b79266a13287e6384321d4dd73;hb=ae3238495de4ab6ce65dbed001ec47db87dd6acc;hp=65b9a359e45bc3a1974ef20ff3556dcad9ae90a3;hpb=44391cb932218032536f4cd40baef46d686051d5;p=chaz%2Ftar diff --git a/src/extract.c b/src/extract.c index 65b9a35..214d975 100644 --- a/src/extract.c +++ b/src/extract.c @@ -19,9 +19,10 @@ with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include "system.h" +#include #include #include +#include #if HAVE_UTIME_H # include @@ -113,7 +114,6 @@ extr_init (void) we_are_root = geteuid () == 0; same_permissions_option += we_are_root; same_owner_option += we_are_root; - xalloc_fail_func = extract_finish; /* Save 'root device' to avoid purging mount points. FIXME: Should the same be done after handling -C option ? */ @@ -367,7 +367,7 @@ repair_delayed_set_stat (char const *dir, static int make_directories (char *file_name) { - char *cursor0 = file_name + FILESYSTEM_PREFIX_LEN (file_name); + char *cursor0 = file_name + FILE_SYSTEM_PREFIX_LEN (file_name); char *cursor; /* points into the file name */ int did_something = 0; /* did we do anything yet? */ int mode; @@ -811,8 +811,7 @@ extract_archive (void) break; if (absolute_names_option - || ! (ISSLASH (current_stat_info.link_name - [FILESYSTEM_PREFIX_LEN (current_stat_info.link_name)]) + || ! (IS_ABSOLUTE_FILE_NAME (current_stat_info.link_name) || contains_dot_dot (current_stat_info.link_name))) { while (status = symlink (current_stat_info.link_name, file_name), @@ -925,11 +924,12 @@ extract_archive (void) /* MSDOS does not implement links. However, djgpp's link() actually copies the file. */ status = link (link_name, file_name); + e = errno; if (status == 0) { struct delayed_symlink *ds = delayed_symlink_head; - if (ds && stat (link_name, &st1) == 0) + if (ds && lstat (link_name, &st1) == 0) for (; ds; ds = ds->next) if (ds->dev == st1.st_dev && ds->ino == st1.st_ino @@ -945,17 +945,20 @@ extract_archive (void) } break; } + + if ((e == EEXIST && strcmp (link_name, file_name) == 0) + || (lstat (link_name, &st1) == 0 + && lstat (file_name, &st2) == 0 + && st1.st_dev == st2.st_dev + && st1.st_ino == st2.st_ino)) + break; + + errno = e; if (maybe_recoverable (file_name, &interdir_made)) goto again_link; if (incremental_option && errno == EEXIST) break; - e = errno; - if (stat (link_name, &st1) == 0 - && stat (file_name, &st2) == 0 - && st1.st_dev == st2.st_dev - && st1.st_ino == st2.st_ino) - break; link_error (link_name, file_name); if (backup_option) @@ -1206,3 +1209,10 @@ fatal_exit (void) error (TAREXIT_FAILURE, 0, _("Error is not recoverable: exiting now")); abort (); } + +void +xalloc_die (void) +{ + error (0, 0, "%s", _("memory exhausted")); + fatal_exit (); +}