From 35889bb3a838cd6ea10b19e9198663eccb14762a Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Thu, 20 Feb 2003 15:15:04 +0000 Subject: [PATCH] Cleanup. --- include/yaz/backend.h | 34 +------------------ server/seshigh.c | 90 +++++++++++++------------------------------------ server/statserv.c | 37 +++++++------------- 3 files changed, 37 insertions(+), 124 deletions(-) diff --git a/include/yaz/backend.h b/include/yaz/backend.h index 1e0ffff..ecd577b 100644 --- a/include/yaz/backend.h +++ b/include/yaz/backend.h @@ -23,7 +23,7 @@ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. * - * $Id: backend.h,v 1.18 2003-02-12 15:06:43 adam Exp $ + * $Id: backend.h,v 1.19 2003-02-20 15:15:04 adam Exp $ */ #ifndef BACKEND_H @@ -205,7 +205,6 @@ typedef struct bend_initrequest /* character set and language negotiation - see include/yaz/z-charneg.h */ Z_CharSetandLanguageNegotiation *charneg_request; Z_External *charneg_response; - } bend_initrequest; typedef struct bend_initresult @@ -262,35 +261,6 @@ typedef struct statserv_options_block struct bend_soap_handler *soap_handlers; } statserv_options_block; -struct bend_http_rr { - void *handle; - ODR stream; /* encoding stream */ - ODR decode; /* decoding stream */ - ODR print; /* print stream */ - Z_HTTP_Request *hreq; /* whole HTTP request */ - char *buf; - int len; -}; - -struct bend_soap_rr { - void *handle; /* user handle */ - ODR stream; - ODR decode; - ODR print; - const char *ns_env; /* SOAP NS */ - const char *ns_enc; /* SOAP Encoding NS */ - void *request_method; - void *response_body; - char *fault_code; - char *fault_string; -}; - -struct bend_soap_handler { - char *ns; - int (*handler)(struct bend_soap_rr *rr); - struct bend_soap_handler *next; -}; - YAZ_EXPORT int statserv_main( int argc, char **argv, bend_initresult *(*bend_init)(bend_initrequest *r), @@ -301,8 +271,6 @@ YAZ_EXPORT statserv_options_block *statserv_getcontrol(void); YAZ_EXPORT void statserv_setcontrol(statserv_options_block *block); YAZ_EXPORT int check_ip_tcpd(void *cd, const char *addr, int len, int type); -YAZ_EXPORT void statserv_add_soap_handler(int (*h)(struct bend_soap_rr *rr), - const char *ns); YAZ_END_CDECL diff --git a/server/seshigh.c b/server/seshigh.c index 968b284..b9f2e66 100644 --- a/server/seshigh.c +++ b/server/seshigh.c @@ -2,7 +2,7 @@ * Copyright (c) 1995-2003, Index Data * See the file LICENSE for details. * - * $Id: seshigh.c,v 1.143 2003-02-19 15:22:11 adam Exp $ + * $Id: seshigh.c,v 1.144 2003-02-20 15:15:04 adam Exp $ */ /* @@ -319,7 +319,7 @@ void ir_session(IOCHAN h, int event) assoc->input_buffer[0] & 0xff, assoc->input_buffer[1] & 0xff, assoc->input_buffer[2] & 0xff); - req = request_get(&assoc->incoming); /* get a new request structure */ + req = request_get(&assoc->incoming); /* get a new request */ odr_reset(assoc->decode); odr_setbuf(assoc->decode, assoc->input_buffer, res, 0); if (!z_GDU(assoc->decode, &req->gdu_request, 0, 0)) @@ -414,11 +414,9 @@ void ir_session(IOCHAN h, int event) static int process_z_request(association *assoc, request *req, char **msg); -static int srw_bend_init(association *assoc) +static void assoc_init_reset(association *assoc) { - bend_initresult *binitres; - statserv_options_block *cb = statserv_getcontrol(); - + xfree (assoc->init); assoc->init = (bend_initrequest *) xmalloc (sizeof(*assoc->init)); assoc->init->stream = assoc->encode; @@ -439,9 +437,20 @@ static int srw_bend_init(association *assoc) assoc->init->charneg_request = NULL; assoc->init->charneg_response = NULL; assoc->init->decode = assoc->decode; + assoc->init->peer_name = + odr_strdup (assoc->encode, cs_addrstr(assoc->client_link)); +} + +static int srw_bend_init(association *assoc) +{ + bend_initresult *binitres; + statserv_options_block *cb = statserv_getcontrol(); + + assoc_init_reset(assoc); + + assoc->maximumRecordSize = 3000000; + assoc->preferredMessageSize = 3000000; - assoc->init->peer_name = - odr_strdup (assoc->encode, cs_addrstr(assoc->client_link)); if (!(binitres = (*cb->bend_init)(assoc->init))) { yaz_log(LOG_WARN, "Bad response from backend."); @@ -521,7 +530,6 @@ static void srw_bend_search(association *assoc, request *req, Z_External *ext; yaz_log(LOG_LOG, "Got SRW SearchRetrieveRequest"); - if (!assoc->init) srw_bend_init(assoc); @@ -1084,40 +1092,14 @@ static int process_gdu_response(association *assoc, request *req, Z_GDU *res) */ static int process_z_response(association *assoc, request *req, Z_APDU *res) { - odr_setbuf(assoc->encode, req->response, req->size_response, 1); + Z_GDU *gres = (Z_GDU *) odr_malloc(assoc->encode, sizeof(*res)); + gres->which = Z_GDU_Z3950; + gres->u.z3950 = res; - if (assoc->print && !z_APDU(assoc->print, &res, 0, 0)) - { - yaz_log(LOG_WARN, "ODR print error: %s", - odr_errmsg(odr_geterror(assoc->print))); - odr_reset(assoc->print); - } - if (!z_APDU(assoc->encode, &res, 0, 0)) - { - yaz_log(LOG_WARN, "ODR error when encoding response: %s", - odr_errmsg(odr_geterror(assoc->decode))); - return -1; - } - req->response = odr_getbuf(assoc->encode, &req->len_response, - &req->size_response); - odr_setbuf(assoc->encode, 0, 0, 0); /* don'txfree if we abort later */ - odr_reset(assoc->encode); - req->state = REQUEST_IDLE; - request_enq(&assoc->outgoing, req); - /* turn the work over to the ir_session handler */ - iochan_setflag(assoc->client_chan, EVENT_OUTPUT); - assoc->cs_put_mask = EVENT_OUTPUT; - /* Is there more work to be done? give that to the input handler too */ -#if 1 - if (request_head(&assoc->incoming)) - { - yaz_log (LOG_DEBUG, "more work to be done"); - iochan_setevent(assoc->client_chan, EVENT_WORK); - } -#endif - return 0; + return process_gdu_response(assoc, req, gres); } + /* * Handle init request. * At the moment, we don't check the options @@ -1135,9 +1117,6 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) char options[140]; - xfree (assoc->init); - assoc->init = (bend_initrequest *) xmalloc (sizeof(*assoc->init)); - yaz_log(LOG_LOG, "Got initRequest"); if (req->implementationId) yaz_log(LOG_LOG, "Id: %s", req->implementationId); @@ -1146,24 +1125,10 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) if (req->implementationVersion) yaz_log(LOG_LOG, "Version: %s", req->implementationVersion); - assoc->init->stream = assoc->encode; - assoc->init->print = assoc->print; + assoc_init_reset(assoc); + assoc->init->auth = req->idAuthentication; assoc->init->referenceId = req->referenceId; - assoc->init->implementation_version = 0; - assoc->init->implementation_id = 0; - assoc->init->implementation_name = 0; - assoc->init->bend_sort = NULL; - assoc->init->bend_search = NULL; - assoc->init->bend_present = NULL; - assoc->init->bend_esrequest = NULL; - assoc->init->bend_delete = NULL; - assoc->init->bend_scan = NULL; - assoc->init->bend_segment = NULL; - assoc->init->bend_fetch = NULL; - assoc->init->charneg_request = NULL; - assoc->init->charneg_response = NULL; - assoc->init->decode = assoc->decode; if (ODR_MASK_GET(req->options, Z_Options_negotiationModel)) { @@ -1173,8 +1138,6 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) assoc->init->charneg_request = negotiation; } - assoc->init->peer_name = - odr_strdup (assoc->encode, cs_addrstr(assoc->client_link)); if (!(binitres = (*cb->bend_init)(assoc->init))) { yaz_log(LOG_WARN, "Bad response from backend."); @@ -1286,11 +1249,6 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) if (assoc->preferredMessageSize > assoc->maximumRecordSize) assoc->preferredMessageSize = assoc->maximumRecordSize; -#if 0 - assoc->maximumRecordSize = 3000000; - assoc->preferredMessageSize = 3000000; -#endif - resp->preferredMessageSize = &assoc->preferredMessageSize; resp->maximumRecordSize = &assoc->maximumRecordSize; diff --git a/server/statserv.c b/server/statserv.c index 5a71da0..be221e2 100644 --- a/server/statserv.c +++ b/server/statserv.c @@ -6,7 +6,7 @@ * NT threaded server code by * Chas Woodfield, Fretwell Downing Informatics. * - * $Id: statserv.c,v 1.94 2003-02-18 21:27:53 adam Exp $ + * $Id: statserv.c,v 1.95 2003-02-20 15:15:04 adam Exp $ */ #include @@ -370,6 +370,7 @@ void sigterm(int sig) static void *new_session (void *vp); static int no_sessions = 0; +static int max_sessions = 0; /* UNIX listener */ static void listener(IOCHAN h, int event) @@ -566,9 +567,15 @@ static void *new_session (void *vp) iochan_setdata(new_chan, newas); iochan_settimeout(new_chan, 60); +#if 1 a = cs_addrstr(new_line); +#else + a = 0; +#endif yaz_log(LOG_LOG, "Starting session %d from %s", no_sessions, a ? a : "[Unknown]"); + if (max_sessions && no_sessions == max_sessions) + control_block.one_shot = 1; if (control_block.threads) { event_loop(&new_chan); @@ -692,31 +699,8 @@ void statserv_setcontrol(statserv_options_block *block) memcpy(&control_block, block, sizeof(*block)); } -void statserv_add_soap_handler(int (*h)(struct bend_soap_rr *rr), - const char *ns) -{ - struct bend_soap_handler *sh = (struct bend_soap_handler *) - xmalloc(sizeof(*sh)); - - sh->handler = h; - sh->ns = xstrdup(ns); - sh->next = control_block.soap_handlers; - control_block.soap_handlers = sh; - yaz_log(LOG_LOG, "soap handler added"); -} - static void statserv_reset(void) { - struct bend_soap_handler *sh = control_block.soap_handlers; - - control_block.soap_handlers = 0; - while (sh) - { - struct bend_soap_handler *sh_next = sh->next; - xfree (sh->ns); - xfree (sh); - sh = sh_next; - } } int statserv_start(int argc, char **argv) @@ -802,7 +786,7 @@ int check_options(int argc, char **argv) int ret = 0, r; char *arg; - while ((ret = options("1a:iszSTl:v:u:c:w:t:k:d:", argv, argc, &arg)) != -2) + while ((ret = options("1a:iszSTl:v:u:c:w:t:k:d:D:", argv, argc, &arg)) != -2) { switch (ret) { @@ -882,6 +866,9 @@ int check_options(int argc, char **argv) return 1; } break; + case 'D': + max_sessions = atoi(arg); + break; default: fprintf(stderr, "Usage: %s [ -a -v " " -l -u -c -t " -- 1.7.10.4