X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fextract.c;h=5aaeb1bf603192d01693f330043f3225a2e52690;hb=15c02c2b9d383446b3ea35dbea5a048e136b020d;hp=2cc1f7b383a121fb5a6d864e96bf54f8af4a9d95;hpb=45ccda119355a1087450039a250359c1d0de0d08;p=chaz%2Ftar diff --git a/src/extract.c b/src/extract.c index 2cc1f7b..5aaeb1b 100644 --- a/src/extract.c +++ b/src/extract.c @@ -191,19 +191,6 @@ extr_init (void) umask (newdir_umask); /* restore the kernel umask */ current_umask = newdir_umask; } - - /* If the user wants to guarantee that everything is under one directory, - determine its name now and let it be created later. */ - if (one_top_level_option && !one_top_level_dir) - { - char *base = base_name (archive_name_array[0]); - - one_top_level_dir = strip_compression_suffix (base); - free (base); - - if (!one_top_level_dir) - USAGE_ERROR ((0, 0, _("Cannot deduce top-level directory name; please set it explicitly with --one-top-level=DIR"))); - } } /* Use fchmod if possible, fchmodat otherwise. */ @@ -550,6 +537,38 @@ repair_delayed_set_stat (char const *dir, quotearg_colon (dir))); } +static void +free_delayed_set_stat (struct delayed_set_stat *data) +{ + xheader_xattr_free (data->xattr_map, data->xattr_map_size); + free (data->cntx_name); + free (data->acls_a_ptr); + free (data->acls_d_ptr); + free (data); +} + +void +remove_delayed_set_stat (const char *fname) +{ + struct delayed_set_stat *data, *next, *prev = NULL; + for (data = delayed_set_stat_head; data; data = next) + { + next = data->next; + if (chdir_current == data->change_dir + && strcmp (data->file_name, fname) == 0) + { + free_delayed_set_stat (data); + if (prev) + prev->next = next; + else + delayed_set_stat_head = next; + return; + } + else + prev = data; + } +} + /* After a file/link/directory creation has failed, see if it's because some required directory was not present, and if so, create all required directories. Return zero if all the required @@ -859,11 +878,7 @@ apply_nonancestor_delayed_set_stat (char const *file_name, bool after_links) } delayed_set_stat_head = data->next; - xheader_xattr_free (data->xattr_map, data->xattr_map_size); - free (data->cntx_name); - free (data->acls_a_ptr); - free (data->acls_d_ptr); - free (data); + free_delayed_set_stat (data); } }