X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=server%2Fseshigh.c;h=252caa58b9352680520ca8bf5d95264cefb9d8cc;hp=a0e3126afa354457a057171c2156bb253ed85973;hb=5f2823e584b4b138886c985bc1490b35aa6cdd4c;hpb=dd509bd7c24e5c9f93f0c0072bfb91227142705b diff --git a/server/seshigh.c b/server/seshigh.c index a0e3126..252caa5 100644 --- a/server/seshigh.c +++ b/server/seshigh.c @@ -4,7 +4,26 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: seshigh.c,v $ - * Revision 1.25 1995-05-17 08:42:26 quinn + * Revision 1.31 1995-06-06 08:15:37 quinn + * Cosmetic. + * + * Revision 1.30 1995/06/05 10:53:32 quinn + * Added a better SCAN. + * + * 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 @@ -208,10 +227,7 @@ association *create_association(IOCHAN channel, COMSTACK link) 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; } @@ -256,6 +272,7 @@ void ir_session(IOCHAN h, int event) { logf(LOG_DEBUG, "ir_session (input)"); assert(assoc && conn); + /* We aren't speaking to this fellow */ if (assoc->rejected) { logf(LOG_LOG, "Closed connection after reject"); @@ -279,6 +296,7 @@ void ir_session(IOCHAN h, int event) iochan_setevent(h, EVENT_INPUT); /* we got a complete PDU. Let's decode it */ + logf(LOG_DEBUG, "Got PDU, %d bytes", res); req = request_get(); /* get a new request structure */ odr_reset(assoc->decode); odr_setbuf(assoc->decode, assoc->input_buffer, res, 0); @@ -326,6 +344,7 @@ void ir_session(IOCHAN h, int event) iochan_destroy(h); break; case 0: /* all sent - release the request structure */ + logf(LOG_DEBUG, "Wrote PDU, %d bytes", req->len_response); odr_release_mem(req->request_mem); request_deq(&assoc->outgoing); request_release(req); @@ -366,7 +385,7 @@ static int process_request(association *assoc) case Z_APDU_scanRequest: res = process_scanRequest(assoc, req, &fd); break; default: - logf(LOG_WARN, "Bad APDU"); + logf(LOG_WARN, "Bad APDU received"); return -1; } if (res) @@ -451,7 +470,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)) { @@ -466,19 +485,24 @@ 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 try not to do anything that would + * break a naive client. We'll toss 'em into the association block when + * we need them there. + */ static Z_APDU *process_initRequest(association *assoc, request *reqb) { Z_InitRequest *req = reqb->request->u.initRequest; - static Z_APDU apdu; - static Z_InitResponse resp; - static bool_t result = 1; - static Odr_bitmask options, protocolVersion; + Z_APDU *apdu = zget_APDU(assoc->encode, Z_APDU_initResponse); + Z_InitResponse *resp = apdu->u.initResponse; bend_initrequest binitreq; bend_initresult *binitres; @@ -499,55 +523,52 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) } assoc->backend = binitres->handle; - apdu.which = Z_APDU_initResponse; - apdu.u.initResponse = &resp; - resp.referenceId = req->referenceId; + resp->referenceId = req->referenceId; /* let's tell the client what we can do */ - ODR_MASK_ZERO(&options); if (ODR_MASK_GET(req->options, Z_Options_search)) - ODR_MASK_SET(&options, Z_Options_search); + ODR_MASK_SET(resp->options, Z_Options_search); if (ODR_MASK_GET(req->options, Z_Options_present)) - ODR_MASK_SET(&options, Z_Options_present); + ODR_MASK_SET(resp->options, Z_Options_present); #if 0 if (ODR_MASK_GET(req->options, Z_Options_delSet)) ODR_MASK_SET(&options, Z_Options_delSet); #endif if (ODR_MASK_GET(req->options, Z_Options_namedResultSets)) - ODR_MASK_SET(&options, Z_Options_namedResultSets); + ODR_MASK_SET(resp->options, Z_Options_namedResultSets); if (ODR_MASK_GET(req->options, Z_Options_scan)) - ODR_MASK_SET(&options, Z_Options_scan); + ODR_MASK_SET(resp->options, Z_Options_scan); if (ODR_MASK_GET(req->options, Z_Options_concurrentOperations)) - ODR_MASK_SET(&options, Z_Options_concurrentOperations); - resp.options = &options; + ODR_MASK_SET(resp->options, Z_Options_concurrentOperations); - ODR_MASK_ZERO(&protocolVersion); if (ODR_MASK_GET(req->protocolVersion, Z_ProtocolVersion_1)) - ODR_MASK_SET(&protocolVersion, Z_ProtocolVersion_1); + ODR_MASK_SET(resp->protocolVersion, Z_ProtocolVersion_1); if (ODR_MASK_GET(req->protocolVersion, Z_ProtocolVersion_2)) - ODR_MASK_SET(&protocolVersion, Z_ProtocolVersion_2); - resp.protocolVersion = &protocolVersion; + ODR_MASK_SET(resp->protocolVersion, Z_ProtocolVersion_2); assoc->maximumRecordSize = *req->maximumRecordSize; if (assoc->maximumRecordSize > control_block->maxrecordsize) assoc->maximumRecordSize = control_block->maxrecordsize; assoc->preferredMessageSize = *req->preferredMessageSize; if (assoc->preferredMessageSize > assoc->maximumRecordSize) assoc->preferredMessageSize = assoc->maximumRecordSize; - resp.preferredMessageSize = &assoc->preferredMessageSize; - resp.maximumRecordSize = &assoc->maximumRecordSize; - resp.result = &result; - resp.implementationId = "YAZ"; - resp.implementationName = "Index Data/YAZ Generic Frontend Server"; - resp.implementationVersion = YAZ_VERSION; - resp.userInformationField = 0; + resp->preferredMessageSize = &assoc->preferredMessageSize; + resp->maximumRecordSize = &assoc->maximumRecordSize; + resp->implementationName = "Index Data/YAZ Generic Frontend Server"; if (binitres->errcode) { logf(LOG_LOG, "Connection rejected by backend."); - result = 0; + *resp->result = 0; assoc->rejected = 1; } - return &apdu; + 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; @@ -570,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) { @@ -593,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; @@ -692,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 */ @@ -702,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)))) @@ -731,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; } @@ -904,6 +931,7 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd) bend_scanrequest srq; bend_scanresult *srs; + logf(LOG_LOG, "Got scanrequest"); apdu.which = Z_APDU_scanResponse; apdu.u.scanResponse = &res; res.referenceId = req->referenceId; @@ -928,6 +956,10 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd) srq.term = req->termListAndStartPoint; srq.term_position = req->preferredPositionInResponse ? *req->preferredPositionInResponse : 1; + if (req->termListAndStartPoint->term->which == Z_Term_general) + logf(LOG_DEBUG, " term: %.*s", + req->termListAndStartPoint->term->u.general->len, + req->termListAndStartPoint->term->u.general->buf); if (!(srs = bend_scan(assoc->backend, &srq, 0))) ents.u.nonSurrogateDiagnostics = diagrecs(assoc->proto, 2, 0); else if (srs->errcode)