X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=server%2Fseshigh.c;h=8b4edb8c9a122243e5783a0125ce1a6facae4a8e;hp=9105f106d5754aa191cd09e00d117034c4d4abe0;hb=b3be6bf5b31785568d39c3c1d631759df84d90ca;hpb=99268f722648e84bf5c54eb685a1434e100f38a1 diff --git a/server/seshigh.c b/server/seshigh.c index 9105f10..8b4edb8 100644 --- a/server/seshigh.c +++ b/server/seshigh.c @@ -4,7 +4,13 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: seshigh.c,v $ - * Revision 1.24 1995-05-16 08:51:04 quinn + * Revision 1.26 1995-05-18 13:02:12 quinn + * Smallish. + * + * 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 @@ -202,6 +208,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) @@ -252,6 +259,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) { @@ -439,7 +454,7 @@ 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_setbuf(assoc->encode, 0, 0, 0); /* don't free if we abort later */ odr_reset(assoc->encode); if (assoc->print && !z_APDU(assoc->print, &res, 0)) { @@ -454,12 +469,18 @@ static int process_response(association *assoc, request *req, Z_APDU *res) request_enq(&assoc->outgoing, req); /* turn the work over to the ir_session handler */ iochan_setflag(assoc->client_chan, EVENT_OUTPUT); - /* Is there more work to be done? */ + /* Is there more work to be done? give that to the input handler too */ if (request_head(&assoc->incoming)) iochan_setevent(assoc->client_chan, EVENT_WORK); return 0; } +/* + * Handle init request. + * At the moment, we don't check the protocol version or the options + * anywhere else in the code - we just don't do anything that would + * break a naive client. + */ static Z_APDU *process_initRequest(association *assoc, request *reqb) { Z_InitRequest *req = reqb->request->u.initRequest; @@ -479,9 +500,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; } @@ -526,9 +548,22 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) resp.implementationName = "Index Data/YAZ Generic Frontend Server"; resp.implementationVersion = YAZ_VERSION; resp.userInformationField = 0; + if (binitres->errcode) + { + logf(LOG_LOG, "Connection rejected by backend."); + result = 0; + assoc->rejected = 1; + } return &apdu; } +/* + * These functions should be merged. + */ + +/* + * nonsurrogate diagnostic record. + */ static Z_Records *diagrec(oid_proto proto, int error, char *addinfo) { static Z_Records rec; @@ -551,6 +586,9 @@ static Z_Records *diagrec(oid_proto proto, int error, char *addinfo) return &rec; } +/* + * surrogate diagnostic. + */ static Z_NamePlusRecord *surrogatediagrec(oid_proto proto, char *dbname, int error, char *addinfo) { @@ -574,6 +612,9 @@ static Z_NamePlusRecord *surrogatediagrec(oid_proto proto, char *dbname, return &rec; } +/* + * multiple nonsurrogate diagnostics. + */ static Z_DiagRecs *diagrecs(oid_proto proto, int error, char *addinfo) { static Z_DiagRecs recs;