X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=server%2Fseshigh.c;h=60ad9caaef1a112de06b08f4245a2719afbbe497;hb=ee91cff35d9150fe522c72b903680ccc49bd75ba;hp=fb7a58319a9630415714acae057ac09b2f08790c;hpb=fe5f2da0c0c4ae00864cc72a36714e90405456e4;p=yaz-moved-to-github.git diff --git a/server/seshigh.c b/server/seshigh.c index fb7a583..60ad9ca 100644 --- a/server/seshigh.c +++ b/server/seshigh.c @@ -1,10 +1,32 @@ /* - * 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.22 1995-05-15 11:56:39 quinn + * Revision 1.29 1995-06-01 11:25:03 quinn + * Smallish. + * + * Revision 1.28 1995/06/01 11:21:01 quinn + * Attempting to fix a bug in pack-records. replaced break with continue + * for large records, according to standard. + * + * Revision 1.27 1995/05/29 08:12:06 quinn + * Moved oid to util + * + * 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 + * Fixed memory bug. + * + * Revision 1.22 1995/05/15 11:56:39 quinn * Asynchronous facilities. Restructuring of seshigh code. * * Revision 1.21 1995/05/02 08:53:19 quinn @@ -116,6 +138,7 @@ #include #include #include +#include "../version.h" #include @@ -158,6 +181,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 != '-') @@ -194,12 +218,10 @@ 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) - new->proto = PROTO_Z3950; - else - new->proto = PROTO_SR; + new->proto = cs_getproto(link); return new; } @@ -244,6 +266,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) { @@ -261,8 +291,7 @@ void ir_session(IOCHAN h, int event) /* we got a complete PDU. Let's decode it */ req = request_get(); /* get a new request structure */ odr_reset(assoc->decode); - odr_setbuf(assoc->decode, assoc->input_buffer, - assoc->input_apdu_len, 0); + odr_setbuf(assoc->decode, assoc->input_buffer, res, 0); if (!z_APDU(assoc->decode, &req->request, 0)) { logf(LOG_WARN, "ODR error: %s", @@ -432,7 +461,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 abort later */ 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; @@ -440,12 +476,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; @@ -465,9 +507,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; } @@ -508,13 +551,24 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) resp.preferredMessageSize = &assoc->preferredMessageSize; resp.maximumRecordSize = &assoc->maximumRecordSize; resp.result = &result; - resp.implementationId = "YAZ"; resp.implementationName = "Index Data/YAZ Generic Frontend Server"; - resp.implementationVersion = "$Revision: 1.22 $"; 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; @@ -537,6 +591,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) { @@ -560,6 +617,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; @@ -659,8 +719,8 @@ static Z_Records *pack_records(association *a, char *setname, int start, reclist.records[reclist.num_records] = surrogatediagrec(a->proto, fres->basename, 16, 0); reclist.num_records++; - *pres = Z_PRES_PARTIAL_2; - break; + total_length += 10; /* totally arbitrary */ + continue; } } else /* too big entirely */ @@ -669,8 +729,8 @@ static Z_Records *pack_records(association *a, char *setname, int start, reclist.records[reclist.num_records] = surrogatediagrec(a->proto, fres->basename, 17, 0); reclist.num_records++; - *pres = Z_PRES_PARTIAL_2; - break; + total_length += 10; /* totally arbitrary */ + continue; } } if (!(thisrec = odr_malloc(a->encode, sizeof(*thisrec)))) @@ -698,9 +758,9 @@ static Z_Records *pack_records(association *a, char *setname, int start, reclist.records[reclist.num_records] = thisrec; reclist.num_records++; total_length += fres->len; - (*num)++; *next = fres->last_in_set ? 0 : recno + 1; } + *num = reclist.num_records; return &records; }