X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Fres.c;h=d805222c753e0a40ed026ef08d5e57f7239b4cc1;hb=3fbd2beb5c41de39604f27b39a9461335b2b176b;hp=4e26a7a66d7d2fff8669011d804803b36d10bc2e;hpb=58e601f9b6d9ac15b90fa7c72686e81e01e5416f;p=idzebra-moved-to-github.git diff --git a/util/res.c b/util/res.c index 4e26a7a..d805222 100644 --- a/util/res.c +++ b/util/res.c @@ -1,5 +1,5 @@ -/* $Id: res.c,v 1.47 2005-10-27 08:49:29 adam Exp $ - Copyright (C) 1995-2005 +/* $Id: res.c,v 1.55 2007-01-05 16:11:25 adam Exp $ + Copyright (C) 1995-2006 Index Data ApS This file is part of the Zebra server. @@ -15,9 +15,9 @@ 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 -along with Zebra; see the file LICENSE.zebra. If not, write to the -Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ #include @@ -43,11 +43,19 @@ struct res_entry { }; struct res_struct { + int ref_count; struct res_entry *first, *last; Res def_res; Res over_res; }; +static Res res_incref(Res r) +{ + if (r) + r->ref_count++; + return r; +} + static struct res_entry *add_entry(Res r) { struct res_entry *resp; @@ -226,13 +234,16 @@ ZEBRA_RES res_read_file(Res r, const char *fname) fclose(fr); return ZEBRA_OK; } + Res res_open(Res def_res, Res over_res) { Res r; r = (Res) xmalloc(sizeof(*r)); + + r->ref_count = 1; r->first = r->last = NULL; - r->def_res = def_res; - r->over_res = over_res; + r->def_res = res_incref(def_res); + r->over_res = res_incref(over_res); return r; } @@ -253,11 +264,13 @@ void res_clear(Res r) void res_close(Res r) { - if (!r) - return; - res_clear(r); - - xfree(r); + if (r && --(r->ref_count) == 0) + { + res_clear(r); + res_close(r->def_res); + res_close(r->over_res); + xfree(r); + } } const char *res_get_prefix(Res r, const char *name, const char *prefix, @@ -307,7 +320,8 @@ const char *res_get_def(Res r, const char *name, const char *def) if (!(t = res_get(r, name))) { - yaz_log(YLOG_DEBUG, "CAUTION: Using default resource %s:%s", name, def); + if (def) + yaz_log(YLOG_DEBUG, "Using default resource %s:%s", name, def); return def; } else @@ -330,6 +344,8 @@ void res_set(Res r, const char *name, const char *value) struct res_entry *re; assert(r); + if (!value) + return; for (re = r->first; re; re=re->next) if (re->value && !yaz_matchstr(re->name, name)) { @@ -379,7 +395,7 @@ ZEBRA_RES res_write_file(Res r, const char *fname) if (!fr) { yaz_log(YLOG_FATAL|YLOG_ERRNO, "Cannot create `%s'", fname); - exit(1); + return ZEBRA_FAIL; } for (re = r->first; re; re=re->next) @@ -461,10 +477,10 @@ void res_close_over (Res r) void res_add (Res r, const char *name, const char *value) { struct res_entry *re; - assert (r); - if ((name) && (value)) - yaz_log (YLOG_RES, "res_add res=%p, name=%s, value=%s", r, name, value); - + assert(r); + assert(name); + assert(value); + yaz_log (YLOG_RES, "res_add res=%p, name=%s, value=%s", r, name, value); re = add_entry (r); re->name = xstrdup (name); re->value = xstrdup_env (value); @@ -540,3 +556,77 @@ void res_dump (Res r, int level) res_dump (r->over_res, level + 1); } } + +int res_check(Res r_i, Res r_v) +{ + struct res_entry *e_i; + int errors = 0; + + for (e_i = r_i->first; e_i; e_i = e_i->next) + { + struct res_entry *e_v; + for (e_v = r_v->first; e_v; e_v = e_v->next) + { + int prefix_allowed = 0; + int suffix_allowed = 0; + const char *name = e_i->name; + size_t name_len = strlen(e_i->name); + char namez[32]; + const char *first_dot = 0; + const char *second_dot = 0; + + if (strchr(e_v->value, 'p')) + prefix_allowed = 1; + if (strchr(e_v->value, 's')) + suffix_allowed = 1; + + first_dot = strchr(name, '.'); + if (prefix_allowed && first_dot) + { + name = first_dot+1; + name_len = strlen(name); + } + second_dot = strchr(name, '.'); + if (suffix_allowed && second_dot) + { + name_len = second_dot - name; + } + if (name_len < sizeof(namez)-1) + { + memcpy(namez, name, name_len); + namez[name_len] = '\0'; + if (!yaz_matchstr(namez, e_v->name)) + break; + } + /* for case 'a.b' we have to check 'a' as well */ + if (prefix_allowed && suffix_allowed && first_dot && !second_dot) + { + name = e_i->name; + name_len = first_dot - name; + if (name_len < sizeof(namez)-1) + { + memcpy(namez, name, name_len); + namez[name_len] = '\0'; + if (!yaz_matchstr(namez, e_v->name)) + break; + } + } + } + if (!e_v) + { + yaz_log(YLOG_WARN, "The following setting is unrecognized: %s", + e_i->name); + errors++; + } + } + return errors; +} + +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +