X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Fres.c;h=fda733055772c3b5db8e9630c79071d3ea6fcd59;hb=4b4d00c51b49de97fca1d5e2ae10d943c116c916;hp=e105e596db1b7725b675ed1ac76ad9761e6873c6;hpb=9b46631dae8ab93da1e8f87f5d6638a493135c03;p=idzebra-moved-to-github.git diff --git a/util/res.c b/util/res.c index e105e59..fda7330 100644 --- a/util/res.c +++ b/util/res.c @@ -1,5 +1,5 @@ -/* $Id: res.c,v 1.53 2006-12-05 14:06:30 adam Exp $ - Copyright (C) 1995-2006 +/* $Id: res.c,v 1.56 2007-01-15 15:10:26 adam Exp $ + Copyright (C) 1995-2007 Index Data ApS This file is part of the Zebra server. @@ -344,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)) { @@ -570,26 +572,24 @@ int res_check(Res r_i, Res r_v) 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; - - if (prefix_allowed) + + first_dot = strchr(name, '.'); + if (prefix_allowed && first_dot) { - const char *cp = strchr(name, '.'); - if (cp) - { - name = cp; - name_len = strlen(name); - } + name = first_dot+1; + name_len = strlen(name); } - if (suffix_allowed) + second_dot = strchr(name, '.'); + if (suffix_allowed && second_dot) { - const char *cp = strchr(name, '.'); - if (cp) - name_len = cp - name; + name_len = second_dot - name; } if (name_len < sizeof(namez)-1) { @@ -598,6 +598,19 @@ int res_check(Res r_i, Res r_v) 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) {