X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=index%2Frecctrl.c;h=b393067a58cde1d6215fae0d859e140f96f029ee;hp=d68ded353035a64c93ba7d77ff3078b97f82007e;hb=89d16cf15eda0e4802d18b8ad09bd3653508ebfc;hpb=4478d785b7769691261005c98063b98a5a5971b3 diff --git a/index/recctrl.c b/index/recctrl.c index d68ded3..b393067 100644 --- a/index/recctrl.c +++ b/index/recctrl.c @@ -1,8 +1,5 @@ -/* $Id: recctrl.c,v 1.2 2006-08-14 10:40:15 adam Exp $ - Copyright (C) 1995-2006 - Index Data ApS - -This file is part of the Zebra server. +/* This file is part of the Zebra server. + Copyright (C) 1994-2009 Index Data 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 @@ -109,70 +106,91 @@ RecTypeClass recTypeClass_create (Res res, NMEM nmem) #endif #ifdef IDZEBRA_STATIC_ALVIS -#if HAVE_XSLT if (1) { extern RecType idzebra_filter_alvis[]; recTypeClass_add (&rts, idzebra_filter_alvis, nmem, 0); } #endif + +#ifdef IDZEBRA_STATIC_DOM + if (1) + { + extern RecType idzebra_filter_dom[]; + recTypeClass_add (&rts, idzebra_filter_dom, nmem, 0); + } #endif return rts; } -void recTypeClass_load_modules(RecTypeClass *rts, NMEM nmem, - const char *module_path) +static void load_from_dir(RecTypeClass *rts, NMEM nmem, const char *dirname) { #if HAVE_DLFCN_H - if (module_path) + DIR *dir = opendir(dirname); + if (dir) { - DIR *dir = opendir(module_path); - yaz_log(YLOG_LOG, "searching filters in %s", module_path); - if (dir) - { - struct dirent *de; - - while ((de = readdir(dir))) - { - size_t dlen = strlen(de->d_name); - if (dlen >= 5 && - !memcmp(de->d_name, "mod-", 4) && - !strcmp(de->d_name + dlen - 3, ".so")) - { - void *mod_p, *fl; - char fname[FILENAME_MAX*2+1]; - sprintf(fname, "%.*s/%.*s", - FILENAME_MAX, module_path, - FILENAME_MAX, de->d_name); - mod_p = dlopen(fname, RTLD_NOW|RTLD_GLOBAL); - if (mod_p && (fl = dlsym(mod_p, "idzebra_filter"))) - { - yaz_log(YLOG_LOG, "Loaded filter module %s", fname); - recTypeClass_add(rts, fl, nmem, mod_p); - } - else if (mod_p) - { - const char *err = dlerror(); - yaz_log(YLOG_WARN, "dlsym failed %s %s", - fname, err ? err : "none"); - dlclose(mod_p); - } - else - { - const char *err = dlerror(); - yaz_log(YLOG_WARN, "dlopen failed %s %s", - fname, err ? err : "none"); - - } - } - } - closedir(dir); - } + struct dirent *de; + + while ((de = readdir(dir))) + { + size_t dlen = strlen(de->d_name); + if (dlen >= 5 && + !memcmp(de->d_name, "mod-", 4) && + !strcmp(de->d_name + dlen - 3, ".so")) + { + void *mod_p, *fl; + char fname[FILENAME_MAX*2+1]; + sprintf(fname, "%.*s/%.*s", + FILENAME_MAX, dirname, + FILENAME_MAX, de->d_name); + mod_p = dlopen(fname, RTLD_NOW|RTLD_GLOBAL); + if (mod_p && (fl = dlsym(mod_p, "idzebra_filter"))) + { + yaz_log(YLOG_LOG, "Loaded filter module %s", fname); + recTypeClass_add(rts, fl, nmem, mod_p); + } + else if (mod_p) + { + const char *err = dlerror(); + yaz_log(YLOG_WARN, "dlsym failed %s %s", + fname, err ? err : "none"); + dlclose(mod_p); + } + else + { + const char *err = dlerror(); + yaz_log(YLOG_WARN, "dlopen failed %s %s", + fname, err ? err : "none"); + + } + } + } + closedir(dir); } #endif } +void recTypeClass_load_modules(RecTypeClass *rts, NMEM nmem, + const char *module_path) +{ + while (module_path) + { + const char *comp_ptr; + char comp[FILENAME_MAX+1]; + size_t len; + + len = yaz_filepath_comp(&module_path, &comp_ptr); + if (!len || len >= FILENAME_MAX) + break; + + memcpy(comp, comp_ptr, len); + comp[len] = '\0'; + + load_from_dir(rts, nmem, comp); + } +} + static void recTypeClass_add(struct recTypeClass **rts, RecType *rt, NMEM nmem, void *module_handle) { @@ -184,7 +202,6 @@ static void recTypeClass_add(struct recTypeClass **rts, RecType *rt, r->next = *rts; *rts = r; - yaz_log(YLOG_LOG, "Adding filter %s", (*rt)->name); r->module_handle = module_handle; module_handle = 0; /* so that we only store module_handle once */ r->recType = *rt;