X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fstatserv.c;h=5388730d4de95db2bc7fcd0e6cc54f3ad201cc2e;hp=f84c34517e4eebbc1d8cfad9787c43c39e8d1bef;hb=0159b1dd08a8c5498fb87fffe000bff170f069f8;hpb=e7377c90323e05943dcf318c172a5728605fd9b5 diff --git a/src/statserv.c b/src/statserv.c index f84c345..5388730 100644 --- a/src/statserv.c +++ b/src/statserv.c @@ -23,6 +23,7 @@ #endif #include +#include #if HAVE_SYS_TYPES_H #include @@ -96,7 +97,6 @@ statserv_options_block control_block = { 0, /* one shot (single session) */ "", /* no PDUs */ "", /* diagnostic output to stderr */ - "tcp:@:9999", /* default listener port */ PROTO_Z3950, /* default application protocol */ 900, /* idle timeout (seconds) */ 64*1024*1024, /* maximum PDU size (approx.) to allow */ @@ -117,7 +117,6 @@ statserv_options_block control_block = { "", /* NT Service Dependencies */ "Z39.50 Server", /* NT Service Display Name */ #endif /* WIN32 */ - 0, /* SOAP handlers */ "", /* PID fname */ 0, /* background daemon */ "", /* SSL certificate filename */ @@ -287,9 +286,15 @@ int control_association(association *assoc, const char *host, int force_open) int host_match = 0; if ( !gfs->host || (host && gfs->host && !strcmp(host, gfs->host))) host_match = 1; - if (!gfs->listen_ref || - gfs->listen_ref == assoc->client_chan->chan_id) + if (!gfs->listen_ref) listen_match = 1; + else + { + int i; + for (i = 0; gfs->listen_ref[i] != -1; i++) + if (gfs->listen_ref[i] == assoc->client_chan->chan_id) + listen_match = 1; + } if (listen_match && host_match) { if (force_open || @@ -335,7 +340,7 @@ int control_association(association *assoc, const char *host, int force_open) } #if YAZ_HAVE_XML2 -static void xml_config_read(void) +static void xml_config_read(const char *base_path) { struct gfs_server **gfsp = &gfs_server_list; struct gfs_listen **gfslp = &gfs_listen_list; @@ -391,17 +396,27 @@ static void xml_config_read(void) gfs->server_node_ptr = ptr_server; if (listenref) { - int id_no; - struct gfs_listen *gl = gfs_listen_list; - for (id_no = 1; gl; gl = gl->next, id_no++) - if (gl->id && !strcmp(gl->id, listenref)) - { - gfs->listen_ref = id_no; - break; - } - if (!gl) - yaz_log(YLOG_WARN, "Non-existent listenref '%s' in server " - "config element", listenref); + char **refs; + int num, i; + nmem_strsplit(gfs_nmem, ",", listenref, &refs, &num); + gfs->listen_ref = (int*) nmem_malloc(gfs_nmem, + sizeof(int) * (num + 1)); + for (i = 0; i < num; i++) + { + int id_no; + struct gfs_listen *gl = gfs_listen_list; + gfs->listen_ref[i] = 0; + for (id_no = 1; gl; gl = gl->next, id_no++) + if (gl->id && !strcmp(gl->id, refs[i])) + { + gfs->listen_ref[i] = id_no; + break; + } + if (!gl) + yaz_log(YLOG_WARN, "Non-existent listenref '%s' " + "in server config element", refs[i]); + } + gfs->listen_ref[i] = -1; } for (ptr = ptr_server->children; ptr; ptr = ptr->next) { @@ -414,28 +429,40 @@ static void xml_config_read(void) } else if (!strcmp((const char *) ptr->name, "config")) { + char fpath[1024]; strcpy(gfs->cb.configname, nmem_dup_xml_content(gfs_nmem, ptr->children)); + + if (yaz_filepath_resolve(gfs->cb.configname, + base_path, 0, fpath)) + strcpy(gfs->cb.configname, fpath); } else if (!strcmp((const char *) ptr->name, "cql2rpn")) { - char *name = nmem_dup_xml_content(gfs_nmem, ptr->children); - gfs->cql_transform = cql_transform_open_fname(name); + char fpath[1024]; + char *fname = nmem_dup_xml_content(gfs_nmem, ptr->children); + if (yaz_filepath_resolve(fname, base_path, 0, fpath)) + fname = fpath; + + gfs->cql_transform = cql_transform_open_fname(fname); if (!gfs->cql_transform) { yaz_log(YLOG_FATAL|YLOG_ERRNO, - "open CQL transform file '%s'", name); + "open CQL transform file '%s'", fname); exit(1); } } else if (!strcmp((const char *) ptr->name, "ccl2rpn")) { - char *name; + char *fname, fpath[1024]; FILE *f; - name = nmem_dup_xml_content(gfs_nmem, ptr->children); - if ((f = fopen(name, "r")) == 0) { - yaz_log(YLOG_FATAL, "can't open CCL file '%s'", name); + fname = nmem_dup_xml_content(gfs_nmem, ptr->children); + if (yaz_filepath_resolve(fname, base_path, 0, fpath)) + fname = fpath; + + if ((f = fopen(fname, "r")) == 0) { + yaz_log(YLOG_FATAL, "can't open CCL file '%s'", fname); exit(1); } gfs->ccl_transform = ccl_qual_mk(); @@ -470,6 +497,8 @@ static void xml_config_read(void) } else if (!strcmp((const char *) ptr->name, "retrievalinfo")) { + if (base_path) + yaz_retrieval_set_path(gfs->retrieval, base_path); if (yaz_retrieval_configure(gfs->retrieval, ptr)) { yaz_log(YLOG_FATAL, "%s in config %s", @@ -494,6 +523,8 @@ static void xml_config_read(void) static void xml_config_open(void) { + const char *last_p; + const char *fname = control_block.xml_config; if (!getcwd(gfs_root_dir, FILENAME_MAX)) { yaz_log(YLOG_WARN|YLOG_ERRNO, "getcwd failed"); @@ -509,15 +540,15 @@ static void xml_config_open(void) gfs_nmem = nmem_create(); #if YAZ_HAVE_XML2 - if (control_block.xml_config[0] == '\0') + if (fname[0] == '\0') return; if (!xml_config_doc) { - xml_config_doc = xmlParseFile(control_block.xml_config); + xml_config_doc = xmlParseFile(fname); if (!xml_config_doc) { - yaz_log(YLOG_FATAL, "Could not parse %s", control_block.xml_config); + yaz_log(YLOG_FATAL, "Could not parse %s", fname); exit(1); } else @@ -526,12 +557,27 @@ static void xml_config_open(void) if (noSubstitutions == -1) { yaz_log(YLOG_WARN, "XInclude processing failed for config %s", - control_block.xml_config); + fname); exit(1); } } } - xml_config_read(); + last_p = strrchr(fname, +#ifdef WIN32 + '\\' +#else + '/' +#endif + ); + if (last_p) + { + WRBUF base_path = wrbuf_alloc(); + wrbuf_write(base_path, fname, last_p - fname); + xml_config_read(wrbuf_cstr(base_path)); + wrbuf_destroy(base_path); + } + else + xml_config_read(0); #endif } @@ -1253,8 +1299,8 @@ static int statserv_sc_main(yaz_sc_t s, int argc, char **argv) { xml_config_add_listeners(); - if (!pListener && *control_block.default_listen) - add_listener(control_block.default_listen, 0); + if (!pListener) + add_listener("tcp:@:9999", 0); #ifndef WIN32 if (control_block.dynamic) @@ -1279,8 +1325,8 @@ static int statserv_sc_main(yaz_sc_t s, int argc, char **argv) static void option_copy(char *dst, const char *src) { - strncpy(dst, src ? src : "", 127); - dst[127] = '\0'; + strncpy(dst, src ? src : "", BEND_NAME_MAX-1); + dst[BEND_NAME_MAX-1] = '\0'; } int check_options(int argc, char **argv)