X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fnames.c;h=b12efe1be5781702e489ad6bf3099bcda7e00ec5;hb=2947023d277cb0a787c73721d6190a75444cd65f;hp=eaa94d284aa7257c08970ff877155b1e3542e9aa;hpb=1bcbbcf1ff2c537ffa970dbf82e3843d4ad110e5;p=chaz%2Ftar diff --git a/src/names.c b/src/names.c index eaa94d2..b12efe1 100644 --- a/src/names.c +++ b/src/names.c @@ -418,14 +418,15 @@ name_gather (void) buffer->next = 0; buffer->found_count = 0; buffer->matching_flags = matching_flags; - buffer->dir_contents = NULL; + buffer->directory = NULL; buffer->parent = NULL; + buffer->cmdline = true; namelist = buffer; nametail = &namelist->next; } else if (change_dir) - addname (0, change_dir, NULL); + addname (0, change_dir, false, NULL); } else { @@ -439,11 +440,11 @@ name_gather (void) change_dir = chdir_arg (xstrdup (ep->v.name)); if (ep) - addname (ep->v.name, change_dir, NULL); + addname (ep->v.name, change_dir, true, NULL); else { if (change_dir != change_dir0) - addname (0, change_dir, NULL); + addname (NULL, change_dir, false, NULL); break; } } @@ -452,7 +453,7 @@ name_gather (void) /* Add a name to the namelist. */ struct name * -addname (char const *string, int change_dir, struct name *parent) +addname (char const *string, int change_dir, bool cmdline, struct name *parent) { struct name *name = make_name (string); @@ -461,8 +462,9 @@ addname (char const *string, int change_dir, struct name *parent) name->found_count = 0; name->matching_flags = matching_flags; name->change_dir = change_dir; - name->dir_contents = NULL; + name->directory = NULL; name->parent = parent; + name->cmdline = cmdline; *nametail = name; nametail = &name->next; @@ -587,18 +589,12 @@ all_names_found (struct tar_stat_info *p) return true; } -static inline int -is_pattern (const char *string) -{ - return strchr (string, '*') || strchr (string, '[') || strchr (string, '?'); -} - static void regex_usage_warning (const char *name) { static int warned_once = 0; - if (warn_regex_usage && is_pattern (name)) + if (warn_regex_usage && fnmatch_pattern_has_wildcards (name, 0)) { warned_once = 1; WARN ((0, 0, @@ -767,12 +763,11 @@ compare_names (struct name const *n1, struct name const *n2) static void add_hierarchy_to_namelist (struct name *name, dev_t device, bool cmdline) { - char *file_name = name->name; - const char *buffer = scan_directory (file_name, device, cmdline); + const char *buffer; - if (! buffer) - name->dir_contents = "\0\0\0\0"; - else + name_fill_directory (name, device, cmdline); + buffer = directory_contents (name->directory); + if (buffer) { struct name *child_head = NULL, *child_tail = NULL; size_t name_length = name->length; @@ -785,8 +780,7 @@ add_hierarchy_to_namelist (struct name *name, dev_t device, bool cmdline) size_t string_length; int change_dir = name->change_dir; - name->dir_contents = buffer; - strcpy (namebuf, file_name); + strcpy (namebuf, name->name); if (! ISSLASH (namebuf[name_length - 1])) { namebuf[name_length++] = '/'; @@ -813,7 +807,7 @@ add_hierarchy_to_namelist (struct name *name, dev_t device, bool cmdline) namebuf = xrealloc (namebuf, allocated_length + 1); } strcpy (namebuf + name_length, string + 1); - np = addname (namebuf, change_dir, name); + np = addname (namebuf, change_dir, false, name); if (!child_head) child_head = np; else @@ -866,8 +860,9 @@ rebase_child_list (struct name *child, struct name *parent) child->name = newp; child->length = size; - rebase_directory (child->name, old_prefix_len, child->parent->name, - new_prefix); + rebase_directory (child->directory, + child->parent->name, old_prefix_len, + new_prefix, new_prefix_len); } } @@ -887,7 +882,7 @@ collect_and_sort_names (void) name_gather (); if (!namelist) - addname (".", 0, NULL); + addname (".", 0, false, NULL); if (listed_incremental_option) { @@ -908,14 +903,14 @@ collect_and_sort_names (void) _("Only one -C option is allowed with " "--listed-incremental"))); } - chdir_do (namelist->change_dir); + read_directory_file (); } - for (name = namelist; name; name = next_name) + num_names = 0; + for (name = namelist; name; name = name->next, num_names++) { - next_name = name->next; - if (name->found_count || name->dir_contents) + if (name->found_count || name->directory) continue; if (name->matching_flags & EXCLUDE_WILDCARDS) /* NOTE: EXCLUDE_ANCHORED is not relevant here */ @@ -934,15 +929,10 @@ collect_and_sort_names (void) if (S_ISDIR (statbuf.st_mode)) { name->found_count++; - if (name->found_count == 1) - add_hierarchy_to_namelist (name, statbuf.st_dev, true); + add_hierarchy_to_namelist (name, statbuf.st_dev, true); } } - num_names = 0; - for (name = namelist; name; name = name->next) - num_names++; - namelist = merge_sort (namelist, num_names, compare_names); num_names = 0; @@ -980,7 +970,8 @@ collect_and_sort_names (void) } } name->found_count = 0; - hash_insert (nametab, name); + if (!hash_insert (nametab, name)) + xalloc_die (); prev_name = name; num_names++; } @@ -994,7 +985,7 @@ collect_and_sort_names (void) for (name = namelist; name && name->name[0] == 0; name++) ; if (name) - name->dir_contents = append_incremental_renames (name->dir_contents); + append_incremental_renames (name->directory); } } @@ -1035,8 +1026,8 @@ name_scan (const char *file_name) find and return all the non-found names in the namelist. */ struct name *gnu_list_name; -char * -name_from_list (void) +struct name const * +name_from_list () { if (!gnu_list_name) gnu_list_name = namelist; @@ -1047,9 +1038,9 @@ name_from_list (void) { gnu_list_name->found_count++; chdir_do (gnu_list_name->change_dir); - return gnu_list_name->name; + return gnu_list_name; } - return 0; + return NULL; } void