+ int len;
+ char *slash;
+
+ while (*arg == '.' && arg[1] == '/') {
+ if (fbpos < 0) {
+ if (fbsize < absize)
+ filt_buf = realloc_array(filt_buf, char, fbsize = absize);
+ memcpy(filt_buf, arg_buf, abpos + 1);
+ fbpos = abpos;
+ }
+ ENSURE_MEMSPACE(arg_buf, char, absize, abpos + 2);
+ arg_buf[abpos++] = *arg++;
+ arg_buf[abpos++] = *arg++;
+ arg_buf[abpos] = '\0';
+ }
+ if ((slash = strchr(arg, '/')) != NULL) {
+ *slash = '\0';
+ len = slash - arg;
+ } else
+ len = strlen(arg);
+ if (strpbrk(arg, "*?[")) {
+ struct dirent *di;
+ DIR *d;
+
+ if (!(d = opendir(abpos ? arg_buf : ".")))
+ return;
+ while ((di = readdir(d)) != NULL) {
+ char *dname = d_name(di);
+ if (dname[0] == '.' && (dname[1] == '\0'
+ || (dname[1] == '.' && dname[2] == '\0')))
+ continue;
+ if (!wildmatch(arg, dname))
+ continue;
+ call_glob_match(dname, strlen(dname), 1,
+ slash ? arg + len + 1 : NULL,
+ abpos, fbpos);
+ }
+ closedir(d);
+ } else {
+ call_glob_match(arg, len, 0,
+ slash ? arg + len + 1 : NULL,
+ abpos, fbpos);
+ }
+ if (slash)
+ *slash = '/';
+}