+ }
+
+ if (!is_pattern && pattern[i]) /* no pattern and directory part */
+ {
+ i++; /* skip dir sep */
+ memcpy(prefix + prefix_len, pattern + off, i - off);
+ prefix[prefix_len + i - off] = '\0';
+ glob_r(res, pattern, i, prefix);
+ prefix[prefix_len] = '\0';
+ }
+ else
+ {
+ DIR * dir = opendir(*prefix ? prefix : "." );
+
+ if (dir)
+ {
+ struct dirent *ent;
+
+ while ((ent = readdir(dir)))
+ {
+ int r;
+ memcpy(prefix + prefix_len, pattern + off, i - off);
+ prefix[prefix_len + i - off] = '\0';
+ r = yaz_match_glob(prefix + prefix_len, ent->d_name);
+ prefix[prefix_len] = '\0';
+
+ if (r)
+ {
+ strcpy(prefix + prefix_len, ent->d_name);
+ if (pattern[i])
+ {
+ glob_r(res, pattern, i, prefix);
+ }
+ else
+ {
+ struct res_entry *ent =
+ nmem_malloc(res->nmem, sizeof(*ent));
+ ent->file = nmem_strdup(res->nmem, prefix);
+ ent->next = 0;
+ *res->last_entry = ent;
+ res->last_entry = &ent->next;
+ res->number_of_entries++;
+ }
+ prefix[prefix_len] = '\0';
+ }
+ }
+ closedir(dir);
+ }
+ }