From: Adam Dickmeiss Date: Tue, 5 Dec 2006 14:06:29 +0000 (+0000) Subject: Fixed bug #445: zebra.cfg does not check for valid directives. X-Git-Tag: ZEBRA.2.0.8~55 X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=commitdiff_plain;h=9b46631dae8ab93da1e8f87f5d6638a493135c03 Fixed bug #445: zebra.cfg does not check for valid directives. --- diff --git a/include/idzebra/res.h b/include/idzebra/res.h index 6164c5e..09e35e1 100644 --- a/include/idzebra/res.h +++ b/include/idzebra/res.h @@ -1,4 +1,4 @@ -/* $Id: res.h,v 1.10 2006-08-14 10:40:14 adam Exp $ +/* $Id: res.h,v 1.11 2006-12-05 14:06:29 adam Exp $ Copyright (C) 1995-2006 Index Data ApS @@ -91,6 +91,9 @@ char **res_get_array(Res r, const char* name); YAZ_EXPORT void res_dump (Res r, int level); +YAZ_EXPORT +int res_check(Res r_i, Res r_v); + YAZ_END_CDECL #endif diff --git a/index/Makefile.am b/index/Makefile.am index 4aacf7b..1192828 100644 --- a/index/Makefile.am +++ b/index/Makefile.am @@ -1,4 +1,4 @@ -## $Id: Makefile.am,v 1.60 2006-12-05 09:26:37 adam Exp $ +## $Id: Makefile.am,v 1.61 2006-12-05 14:06:29 adam Exp $ aux_libs = \ ../rset/libidzebra-rset.la \ @@ -88,7 +88,8 @@ libidzebra_2_0_la_SOURCES = \ recindex.c recindex.h recindxp.h reckeys.c reckeys.h recstat.c retrieve.c \ rpnscan.c rpnsearch.c sortidx.c symtab.c stream.c \ update_path.c update_file.c trunc.c untrans.c isam_methods.c \ - zaptterm.c zebraapi.c zinfo.c zinfo.h zsets.c key_block.c key_block.h + zaptterm.c zebraapi.c zinfo.c zinfo.h zsets.c key_block.c key_block.h \ + check_res.c bin_PROGRAMS = zebraidx zebrasrv diff --git a/index/check_res.c b/index/check_res.c new file mode 100644 index 0000000..baab2cc --- /dev/null +++ b/index/check_res.c @@ -0,0 +1,85 @@ +/* $Id: check_res.c,v 1.1 2006-12-05 14:06:29 adam Exp $ + Copyright (C) 1995-2006 + Index Data ApS + +This file is part of the Zebra server. + +Zebra 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 2, or (at your option) any later +version. + +Zebra 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 +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + +#include +#include +#include +#include + +#include "index.h" + +int zebra_check_res(Res res) +{ + int errors = 0; + Res v = res_open(0, 0); + + res_add(v, "attset", ""); + res_add(v, "chdir", ""); + res_add(v, "dbaccess", ""); + res_add(v, "encoding", ""); + res_add(v, "estimatehits", ""); + res_add(v, "group", ""); + res_add(v, "index", ""); + res_add(v, "isam", ""); + res_add(v, "isamcDebug", ""); + res_add(v, "isamsDebug", ""); + res_add(v, "keyTmpDir", ""); + res_add(v, "lockDir", ""); + res_add(v, "modulePath", ""); + res_add(v, "perm", "s"); + res_add(v, "passwd", ""); + res_add(v, "passwd.c", ""); + res_add(v, "profilePath", ""); + res_add(v, "rank", ""); + res_add(v, "recordCompression", ""); + res_add(v, "register", ""); + res_add(v, "root", ""); + res_add(v, "shadow", ""); + res_add(v, "segment", ""); + res_add(v, "setTmpDir", ""); + res_add(v, "staticrank", ""); + res_add(v, "threads", ""); + res_add(v, "database", "p"); + res_add(v, "explainDatabase", "p"); + res_add(v, "fileVerboseLimit", "p"); + res_add(v, "followLinks", "p"); + res_add(v, "recordId", "p"); + res_add(v, "recordType", "ps"); + res_add(v, "storeKeys", "p"); + res_add(v, "storeData", "p"); + res_add(v, "openRW", "p"); + + + errors = res_check(res, v); + + res_close(v); + return errors; +} + +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ + diff --git a/index/index.h b/index/index.h index dcb408d..5e6cd48 100644 --- a/index/index.h +++ b/index/index.h @@ -1,4 +1,4 @@ -/* $Id: index.h,v 1.185 2006-11-30 10:33:19 adam Exp $ +/* $Id: index.h,v 1.186 2006-12-05 14:06:29 adam Exp $ Copyright (C) 1995-2006 Index Data ApS @@ -409,6 +409,8 @@ ZEBRA_RES zapt_term_to_utf8(ZebraHandle zh, Z_AttributesPlusTerm *zapt, char *termz); +int zebra_check_res(Res res); + #define FIRST_IN_FIELD_STR "\001^" #define FIRST_IN_FIELD_CHAR 1 #define FIRST_IN_FIELD_LEN 2 diff --git a/index/zebraapi.c b/index/zebraapi.c index 3f80807..7b14661 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -1,4 +1,4 @@ -/* $Id: zebraapi.c,v 1.236 2006-12-05 09:26:37 adam Exp $ +/* $Id: zebraapi.c,v 1.237 2006-12-05 14:06:29 adam Exp $ Copyright (C) 1995-2006 Index Data ApS @@ -209,7 +209,18 @@ ZebraService zebra_start_res(const char *configName, Res def_res, Res over_res) res_close(res); return 0; } + if (zebra_check_res(res)) + { + yaz_log(YLOG_FATAL, "Configuration error(s) for %s", + configName); + return 0; + } } + else + { + zebra_check_res(res); + } + zh = xmalloc(sizeof(*zh)); zh->global_res = res; zh->sessions = 0; diff --git a/test/sort/sort1.c b/test/sort/sort1.c index ea7603b..5134ac7 100644 --- a/test/sort/sort1.c +++ b/test/sort/sort1.c @@ -1,4 +1,4 @@ -/* $Id: sort1.c,v 1.11 2006-09-20 10:51:25 adam Exp $ +/* $Id: sort1.c,v 1.12 2006-12-05 14:06:30 adam Exp $ Copyright (C) 1995-2006 Index Data ApS @@ -30,7 +30,7 @@ static void tst(int argc, char **argv) char path[256]; int i; - YAZ_CHECK(zebra_select_database(zh, "Default") == ZEBRA_OK); + YAZ_CHECK_EQ(zebra_select_database(zh, "Default"), ZEBRA_OK); zebra_init(zh); diff --git a/util/res.c b/util/res.c index 7b30454..e105e59 100644 --- a/util/res.c +++ b/util/res.c @@ -1,4 +1,4 @@ -/* $Id: res.c,v 1.52 2006-12-05 09:24:31 adam Exp $ +/* $Id: res.c,v 1.53 2006-12-05 14:06:30 adam Exp $ Copyright (C) 1995-2006 Index Data ApS @@ -554,6 +554,61 @@ 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]; + + if (strchr(e_v->value, 'p')) + prefix_allowed = 1; + if (strchr(e_v->value, 's')) + suffix_allowed = 1; + + if (prefix_allowed) + { + const char *cp = strchr(name, '.'); + if (cp) + { + name = cp; + name_len = strlen(name); + } + } + if (suffix_allowed) + { + const char *cp = strchr(name, '.'); + if (cp) + name_len = cp - 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