X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=conffile.c;h=e3a74aab90fd481b73b0b8455db5eb17603054be;hb=4d9d6e20e19c1aaa0d138e70897d136b36d673c0;hp=3ffbd9fd8274c2f3d3ceca8482770ae17951740d;hpb=b7886fd46ab05c97b8a072e497903622bd1d5290;p=secnet.git diff --git a/conffile.c b/conffile.c index 3ffbd9f..e3a74aa 100644 --- a/conffile.c +++ b/conffile.c @@ -1,4 +1,22 @@ /* conffile.c - process the configuration file */ +/* + * This file is part of secnet. + * See README for full list of copyright holders. + * + * secnet is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * secnet is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * version 3 along with secnet; if not, see + * https://www.gnu.org/licenses/gpl.html. + */ /* #define DUMP_PARSE_TREE */ @@ -545,7 +563,7 @@ cstring_t *dict_keys(dict_t *dict) { atom_t *r, *j; struct entry *i; - r=safe_malloc(sizeof(*r)*(dict->size+1),"dict_keys"); + NEW_ARY(r,dict->size+1); for (i=dict->entries, j=r; i; i=i->next, j++) { *j=i->key; } @@ -637,19 +655,18 @@ void add_closure(dict_t *dict, cstring_t name, apply_fn apply) } void *find_cl_if(dict_t *dict, cstring_t name, uint32_t type, - bool_t fail_if_invalid, cstring_t desc, struct cloc loc) + bool_t required, cstring_t desc, struct cloc loc) { item_t *i; closure_t *cl; - i = dict_find_item(dict,name,fail_if_invalid,desc,loc); + i = dict_find_item(dict,name,required,desc,loc); + if (!i) return NULL; if (i->type!=t_closure) { - if (!fail_if_invalid) return NULL; cfgfatal(loc,desc,"\"%s\" must be a closure\n",name); } cl=i->data.closure; if (cl->type!=type) { - if (!fail_if_invalid) return NULL; cfgfatal(loc,desc,"\"%s\" is the wrong type of closure\n",name); } return cl->interface; @@ -705,7 +722,7 @@ const char **dict_read_string_array(dict_t *dict, cstring_t key, } int32_t ll=list_length(l); - ra=safe_malloc_ary(sizeof(*ra), ll+1, "dict_read_string_array"); + NEW_ARY(ra, ll+1); for (rap=ra; l; l=l->next,rap++) { item_t *it=l->item; if (it->type!=t_string) @@ -749,6 +766,21 @@ bool_t dict_read_bool(dict_t *dict, cstring_t key, bool_t required, return r; } +dict_t *dict_read_dict(dict_t *dict, cstring_t key, bool_t required, + cstring_t desc, struct cloc loc) +{ + item_t *i; + dict_t *r; + + i=dict_find_item(dict,key,required,desc,loc); + if (!i) return NULL; + if (i->type!=t_dict) { + cfgfatal(loc,desc,"\"%s\" must be a dictionary\n",key); + } + r=i->data.dict; + return r; +} + uint32_t string_to_word(cstring_t s, struct cloc loc, struct flagstr *f, cstring_t desc) {