X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fzoom-c.c;h=2a9d43303b95eb9aa5e0c8a46d8a9148decd0270;hb=8d691989077a0addcbd840d769dce6700f3d9622;hp=e5a2a7dff6b3d4479b68faa9d801e4ede07d2020;hpb=3a7dc22954c4469ebdc6e132c69fbd23638bce57;p=yaz-moved-to-github.git diff --git a/src/zoom-c.c b/src/zoom-c.c index e5a2a7d..2a9d433 100644 --- a/src/zoom-c.c +++ b/src/zoom-c.c @@ -1,8 +1,8 @@ /* - * Copyright (C) 1995-2006, Index Data ApS + * Copyright (C) 1995-2007, Index Data ApS * See the file LICENSE for details. * - * $Id: zoom-c.c,v 1.95 2006-11-01 15:39:05 adam Exp $ + * $Id: zoom-c.c,v 1.104 2007-01-03 08:42:15 adam Exp $ */ /** * \file zoom-c.c @@ -453,9 +453,6 @@ ZOOM_API(void) else c->lang = 0; - val = ZOOM_options_get(c->options, "sru"); - c->sru_mode = get_sru_mode_from_string(val); - xfree(c->host_port); if (portnum) { @@ -497,6 +494,9 @@ ZOOM_API(void) } } + val = ZOOM_options_get(c->options, "sru"); + c->sru_mode = get_sru_mode_from_string(val); + ZOOM_options_set(c->options, "host", c->host_port); val = ZOOM_options_get(c->options, "cookie"); @@ -950,6 +950,8 @@ ZOOM_API(void) ZOOM_API(size_t) ZOOM_resultset_size(ZOOM_resultset r) { + yaz_log(log_details, "ZOOM_resultset_size r=%p count=%d", + r, r->size); return r->size; } @@ -1274,7 +1276,7 @@ static zoom_ret ZOOM_connection_send_init(ZOOM_connection c) odr_prepend(c->odr_out, "ZOOM-C", ireq->implementationName)); - version = odr_strdup(c->odr_out, "$Revision: 1.95 $"); + version = odr_strdup(c->odr_out, "$Revision: 1.104 $"); if (strlen(version) > 10) /* check for unexpanded CVS strings */ version[strlen(version)-2] = '\0'; ireq->implementationVersion = @@ -2263,6 +2265,8 @@ static void handle_records(ZOOM_connection c, Z_Records *sr, syntax, elementSetName); } *count -= i; + if (*count < 0) + *count = 0; *start += i; yaz_log(log_details, "handle_records resultset=%p start=%d count=%d", @@ -2506,15 +2510,6 @@ static zoom_ret send_present(ZOOM_connection c) count = &c->tasks->u.retrieve.count; syntax = c->tasks->u.retrieve.syntax; elementSetName = c->tasks->u.retrieve.elementSetName; - - if (*start >= resultset->size) - { - yaz_log(log_details, "%p send_present start=%d >= size=%d", - c, *start, resultset->size); - return zoom_complete; - } - if (*start + *count > resultset->size) - *count = resultset->size - *start; break; default: return zoom_complete; @@ -2522,10 +2517,13 @@ static zoom_ret send_present(ZOOM_connection c) yaz_log(log_details, "%p send_present start=%d count=%d", c, *start, *count); + if (*start < 0 || *count < 0 || *start + *count > resultset->size) + { + set_dset_error(c, YAZ_BIB1_PRESENT_REQUEST_OUT_OF_RANGE, "Bib-1", + "", 0); + } if (c->error) /* don't continue on error */ return zoom_complete; - if (*start < 0) - return zoom_complete; yaz_log(log_details, "send_present resultset=%p start=%d count=%d", resultset, *start, *count); @@ -3310,8 +3308,6 @@ static int ZOOM_connection_exec_task(ZOOM_connection c) c, task->which, task->running); if (c->error != ZOOM_ERROR_NONE) { - yaz_log(YLOG_LOG, "%p ZOOM_connection_exec_task " - "removing tasks because of error = %d", c, c->error); yaz_log(log_details, "%p ZOOM_connection_exec_task " "removing tasks because of error = %d", c, c->error); ZOOM_connection_remove_tasks(c); @@ -3442,6 +3438,16 @@ static void interpret_otherinformation_field(ZOOM_connection c, } } + +static void set_init_option(const char *name, void *clientData) { + ZOOM_connection c = clientData; + char buf[80]; + + sprintf(buf, "init_opt_%.70s", name); + ZOOM_connection_option_set(c, buf, "1"); +} + + static void recv_apdu(ZOOM_connection c, Z_APDU *apdu) { Z_InitResponse *initrs; @@ -3472,6 +3478,10 @@ static void recv_apdu(ZOOM_connection c, Z_APDU *apdu) ZOOM_connection_option_set(c, "targetImplementationVersion", initrs->implementationVersion ? initrs->implementationVersion : ""); + + /* Make initrs->options available as ZOOM-level options */ + yaz_init_opt_decode(initrs->options, set_init_option, (void*) c); + if (!*initrs->result) { Z_External *uif = initrs->userInformationField; @@ -3680,8 +3690,7 @@ static void handle_http(ZOOM_connection c, Z_HTTP_Response *hres) Z_SOAP *soap_package = 0; ODR o = c->odr_in; Z_SOAP_Handler soap_handlers[2] = { - {"http://www.loc.gov/zing/srw/", 0, - (Z_SOAP_fun) yaz_srw_codec}, + {YAZ_XMLNS_SRU_v1_1, 0, (Z_SOAP_fun) yaz_srw_codec}, {0, 0, 0} }; ret = z_soap_codec(o, &soap_package, @@ -4186,7 +4195,14 @@ ZOOM_API(int) return 0; #if HAVE_SYS_POLL_H - r = poll(pollfds, nfds, (timeout == -1 ? -1 : timeout * 1000)); + while ((r = poll(pollfds, nfds, + (timeout == -1 ? -1 : timeout * 1000))) < 0 + && errno == EINTR) + { + ; + } + if (r < 0) + yaz_log(YLOG_WARN|YLOG_ERRNO, "ZOOM_event: poll"); for (i = 0; i