X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=server%2Fseshigh.c;h=a0e3126afa354457a057171c2156bb253ed85973;hp=5d17c40ec79c47881cda9488779b9340f55496ef;hb=dd509bd7c24e5c9f93f0c0072bfb91227142705b;hpb=9e4d074b5d72a383addc86a2c7e76ed60d3c4883 diff --git a/server/seshigh.c b/server/seshigh.c index 5d17c40..a0e3126 100644 --- a/server/seshigh.c +++ b/server/seshigh.c @@ -1,10 +1,16 @@ /* - * Copyright (C) 1994, Index Data I/S - * All rights reserved. + * Copyright (c) 1995, Index Data + * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * * $Log: seshigh.c,v $ - * Revision 1.23 1995-05-15 13:25:10 quinn + * Revision 1.25 1995-05-17 08:42:26 quinn + * Transfer auth info to backend. Allow backend to reject init gracefully. + * + * Revision 1.24 1995/05/16 08:51:04 quinn + * License, documentation, and memory fixes + * + * Revision 1.23 1995/05/15 13:25:10 quinn * Fixed memory bug. * * Revision 1.22 1995/05/15 11:56:39 quinn @@ -119,6 +125,7 @@ #include #include #include +#include "../version.h" #include @@ -161,6 +168,7 @@ association *create_association(IOCHAN channel, COMSTACK link) char filename[256]; FILE *f; + strcpy(filename, control_block->apdufile); if (!(new->print = odr_createmem(ODR_PRINT))) return 0; if (*control_block->apdufile != '-') @@ -197,6 +205,7 @@ association *create_association(IOCHAN channel, COMSTACK link) new->input_buffer = 0; new->input_buffer_len = 0; new->backend = 0; + new->rejected = 0; request_initq(&new->incoming); request_initq(&new->outgoing); if (cs_getproto(link) == CS_Z3950) @@ -247,6 +256,14 @@ void ir_session(IOCHAN h, int event) { logf(LOG_DEBUG, "ir_session (input)"); assert(assoc && conn); + if (assoc->rejected) + { + logf(LOG_LOG, "Closed connection after reject"); + cs_close(conn); + destroy_association(assoc); + iochan_destroy(h); + return; + } if ((res = cs_get(conn, &assoc->input_buffer, &assoc->input_buffer_len)) <= 0) { @@ -434,7 +451,14 @@ static int process_response(association *assoc, request *req, Z_APDU *res) } req->response = odr_getbuf(assoc->encode, &req->len_response, &req->size_response); + odr_setbuf(assoc->encode, 0, 0, 0); /* don't free if we have to quit */ odr_reset(assoc->encode); + if (assoc->print && !z_APDU(assoc->print, &res, 0)) + { + logf(LOG_WARN, "ODR print error: %s", + odr_errlist[odr_geterror(assoc->print)]); + odr_reset(assoc->print); + } /* change this when we make the backend reentrant */ assert(req == request_head(&assoc->incoming)); req->state = REQUEST_IDLE; @@ -467,9 +491,10 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) logf(LOG_LOG, "Version: %s", req->implementationVersion); binitreq.configname = "default-config"; - if (!(binitres = bend_init(&binitreq)) || binitres->errcode) + binitreq.auth = req->idAuthentication; + if (!(binitres = bend_init(&binitreq))) { - logf(LOG_WARN, "Negative response from backend"); + logf(LOG_WARN, "Bad response from backend."); return 0; } @@ -512,8 +537,14 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) resp.result = &result; resp.implementationId = "YAZ"; resp.implementationName = "Index Data/YAZ Generic Frontend Server"; - resp.implementationVersion = "$Revision: 1.23 $"; + resp.implementationVersion = YAZ_VERSION; resp.userInformationField = 0; + if (binitres->errcode) + { + logf(LOG_LOG, "Connection rejected by backend."); + result = 0; + assoc->rejected = 1; + } return &apdu; }