3b2efb9
Index: validator/val_anchor.c
3b2efb9
===================================================================
3b2efb9
--- validator/val_anchor.c	(revision 1404)
3b2efb9
+++ validator/val_anchor.c	(working copy)
3b2efb9
@@ -47,6 +47,11 @@
3b2efb9
 #include "util/regional.h"
3b2efb9
 #include "util/config_file.h"
3b2efb9
 
3b2efb9
+#include <dirent.h>
3b2efb9
+#include <libgen.h>
3b2efb9
+#include <fnmatch.h>
3b2efb9
+
3b2efb9
+
3b2efb9
 int
3b2efb9
 anchor_cmp(const void* k1, const void* k2)
3b2efb9
 {
3b2efb9
@@ -627,9 +633,53 @@
3b2efb9
 	FILE* in = fopen(fname, "r");
3b2efb9
 	int rdlen = 0;
3b2efb9
 	if(!in) {
3b2efb9
-		log_err("error opening file %s: %s", fname, strerror(errno));
3b2efb9
-		return 0;
3b2efb9
-	}
3b2efb9
+		if(strstr(fname,"*")!=NULL) {
3b2efb9
+			struct dirent **namelist;
3b2efb9
+			char *fnameb = strdup(fname);
3b2efb9
+			char *fnamef = strdup(fname);
3b2efb9
+			char *dbase, *globmatch;
3b2efb9
+			dbase = dirname(fnameb);
3b2efb9
+			globmatch = basename(fnamef);
3b2efb9
+			int n;
3b2efb9
+			verbose(VERB_QUERY, "wildcard found, processing directory");
3b2efb9
+			n = scandir(dbase,&namelist, 0, 0);
3b2efb9
+			if (n<0) {
3b2efb9
+				log_err("error opening wildcard in dir: %s:", dbase);
3b2efb9
+				free(namelist);
3b2efb9
+				free(dbase);
3b2efb9
+				free(fnameb);
3b2efb9
+				free(fnamef);
3b2efb9
+				free(globmatch);
482e5e4
+				return 1;
3b2efb9
+			}
3b2efb9
+			else {
3b2efb9
+				while(n--) {
3b2efb9
+					if (namelist[n]->d_type != DT_DIR) {
3b2efb9
+						if(!fnmatch(globmatch,namelist[n]->d_name,0)) {
3b2efb9
+							// log_err( "file %s matched pattern %s - loading", namelist[n]->d_name, globmatch);
3b2efb9
+							char *newname = malloc(strlen(namelist[n]->d_name) + strlen(dbase) + strlen("/") + 1);
3b2efb9
+							strcpy(newname, dbase);
3b2efb9
+							strcat(newname,"/");
3b2efb9
+							strcat(newname, namelist[n]->d_name);
3b2efb9
+							if(!anchor_read_bind_file(anchors, buffer,newname)) {
3b2efb9
+                        					log_err("error reading wildcard trusted-keys-file: %s", newname);
3b2efb9
+                					}
3b2efb9
+							free(newname);
3b2efb9
+						} else {
3b2efb9
+							// log_err("file %s did not match pattern %s", namelist[n]->d_name, globmatch);
3b2efb9
+						}
3b2efb9
+					}
3b2efb9
+					free(namelist[n]);
3b2efb9
+				}
3b2efb9
+				free(namelist);
3b2efb9
+				free(dbase);
3b2efb9
+				// causes segfault free(fnameb);
3b2efb9
+				free(fnamef);
3b2efb9
+				// causes segfault  free(globmatch);
3b2efb9
+			     }
3b2efb9
+			return 1;
3b2efb9
+			}
3b2efb9
+	         }
3b2efb9
 	verbose(VERB_QUERY, "reading in bind-compat-mode: '%s'", fname);
3b2efb9
 	/* scan for  trusted-keys  keyword, ignore everything else */
3b2efb9
 	ldns_buffer_clear(buffer);