X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=conffile.c;h=e9c84d3cb4aa82fc9a49eeaea73d6f1eb8f0827b;hb=refs%2Ftags%2Fv0.1.6;hp=9e10efa2e3881c36db72afd9223074e72f3351d8;hpb=9d3a4132788b198345116624761c12ed7bc936b6;p=secnet.git diff --git a/conffile.c b/conffile.c index 9e10efa..e9c84d3 100644 --- a/conffile.c +++ b/conffile.c @@ -12,7 +12,10 @@ #include "conffile.h" #include "conffile_internal.h" #include "util.h" -#include "modules.h" +#include "ipaddr.h" + +/* from modules.c */ +extern void init_builtin_modules(dict_t *dict); static struct cloc no_loc={"none",0}; @@ -551,10 +554,36 @@ list_t *list_new(void) return NULL; } +uint32_t list_length(list_t *a) +{ + uint32_t l=0; + list_t *i; + for (i=a; i; i=i->next) l++; + return l; +} + +list_t *list_copy(list_t *a) +{ + list_t *r, *i, *b, *l; + + if (!a) return NULL; + l=NULL; + r=NULL; + for (i=a; i; i=i->next) { + b=safe_malloc(sizeof(*b),"list_copy"); + if (l) l->next=b; else r=b; + l=b; + b->item=i->item; + b->next=NULL; + } + return r; +} + list_t *list_append_list(list_t *a, list_t *b) { list_t *i; + b=list_copy(b); if (!a) return b; for (i=a; i->next; i=i->next); i->next=b; @@ -757,7 +786,7 @@ void dict_read_subnet_list(dict_t *dict, string_t key, bool_t required, cfgfatal(loc,desc,"required parameter \"%s\" not found\n",key); } /* Count the items in the list */ - for (li=l; li; li=li->next) e++; + e=list_length(l); if (e==0) return; sl->entries=e; sl->list=safe_malloc(sizeof(struct subnet)*e, "dict_read_subnet_list"); @@ -773,6 +802,17 @@ void dict_read_subnet_list(dict_t *dict, string_t key, bool_t required, } } +uint32_t string_to_word(string_t s, struct cloc loc, + struct flagstr *f, string_t desc) +{ + struct flagstr *j; + for (j=f; j->name; j++) + if (strcmp(s,j->name)==0) + return j->value; + cfgfatal(loc,desc,"option \"%s\" not known\n",s); + return 0; +} + uint32_t string_list_to_word(list_t *l, struct flagstr *f, string_t desc) { list_t *i; @@ -785,8 +825,7 @@ uint32_t string_list_to_word(list_t *l, struct flagstr *f, string_t desc) "strings\n"); } for (j=f; j->name; j++) - if (strcmp(i->item->data.string,j->name)==0) - r|=j->value; + r|=string_to_word(i->item->data.string,i->item->loc,f,desc); } return r; }