-WildcardMatcher *begin_wildcard_matching(char *name) { return NULL; }
-char *wildcard_get_filename(WildcardMatcher *dir) { return NULL; }
-void finish_wildcard_matching(WildcardMatcher *dir) {}
+WildcardMatcher *begin_wildcard_matching(char *name) {
+ WildcardMatcher *ret = snew(WildcardMatcher);
+
+ if (glob(name, 0, NULL, &ret->globbed) < 0) {
+ sfree(ret);
+ return NULL;
+ }
+
+ ret->i = 0;
+
+ return ret;
+}
+char *wildcard_get_filename(WildcardMatcher *dir) {
+ if (dir->i < dir->globbed.gl_pathc) {
+ return dupstr(dir->globbed.gl_pathv[dir->i++]);
+ } else
+ return NULL;
+}
+void finish_wildcard_matching(WildcardMatcher *dir) {
+ globfree(&dir->globbed);
+ sfree(dir);
+}
+
+int vet_filename(char *name)
+{
+ if (strchr(name, '/'))
+ return FALSE;
+
+ if (name[0] == '.' && (!name[1] || (name[1] == '.' && !name[2])))
+ return FALSE;
+
+ return TRUE;
+}