X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=server%2Fseshigh.c;h=62c3eb3dc10d30e6538d0a099f85d6ecc1efb749;hb=3d18b35078096b9fd1feb8e2d6fd7e9e48755ad5;hp=a1509170a280b985c47ef7e418218ff98d403ef3;hpb=1e05ad915933124916c16e164cd2065646379cd7;p=yaz-moved-to-github.git diff --git a/server/seshigh.c b/server/seshigh.c index a150917..62c3eb3 100644 --- a/server/seshigh.c +++ b/server/seshigh.c @@ -3,7 +3,23 @@ * See the file LICENSE for details. * * $Log: seshigh.c,v $ - * Revision 1.113 2001-01-30 21:34:17 adam + * Revision 1.118 2001-07-19 19:51:41 adam + * Added typecasts to make C++ happy. + * + * Revision 1.117 2001/06/13 20:47:40 adam + * When error is returned from present handler, non-surrogate diagnostic + * is returned in present response (and fetch handler is no longer called). + * + * Revision 1.116 2001/05/16 07:21:36 adam + * Accept any OID for record syntax. + * + * Revision 1.115 2001/03/25 21:55:12 adam + * Added odr_intdup. Ztest server returns TaskPackage for ItemUpdate. + * + * Revision 1.114 2001/02/21 13:46:53 adam + * C++ fixes. + * + * Revision 1.113 2001/01/30 21:34:17 adam * Added step-size for Scan backend interface. * * Revision 1.112 2001/01/29 09:38:22 adam @@ -656,18 +672,18 @@ void ir_session(IOCHAN h, int event) req = request_get(&assoc->incoming); /* get a new request structure */ odr_reset(assoc->decode); odr_setbuf(assoc->decode, assoc->input_buffer, res, 0); - if (!z_APDU(assoc->decode, &req->request, 0, 0)) + if (!z_APDU(assoc->decode, &req->apdu_request, 0, 0)) { yaz_log(LOG_LOG, "ODR error on incoming PDU: %s [near byte %d] ", - odr_errmsg(odr_geterror(assoc->decode)), - odr_offset(assoc->decode)); + odr_errmsg(odr_geterror(assoc->decode)), + odr_offset(assoc->decode)); yaz_log(LOG_LOG, "PDU dump:"); odr_dumpBER(yaz_log_file(), assoc->input_buffer, res); do_close(assoc, Z_Close_protocolError, "Malformed package"); return; } req->request_mem = odr_extract_mem(assoc->decode); - if (assoc->print && !z_APDU(assoc->print, &req->request, 0, 0)) + if (assoc->print && !z_APDU(assoc->print, &req->apdu_request, 0, 0)) { yaz_log(LOG_WARN, "ODR print error: %s", odr_errmsg(odr_geterror(assoc->print))); @@ -740,12 +756,12 @@ static int process_request(association *assoc, request *req, char **msg) *msg = "Unknown Error"; assert(req && req->state == REQUEST_IDLE); - if (req->request->which != Z_APDU_initRequest && !assoc->init) + if (req->apdu_request->which != Z_APDU_initRequest && !assoc->init) { *msg = "Missing InitRequest"; return -1; } - switch (req->request->which) + switch (req->apdu_request->which) { case Z_APDU_initRequest: res = process_initRequest(assoc, req); break; @@ -846,7 +862,7 @@ void backend_response(IOCHAN i, int event) yaz_log(LOG_DEBUG, "backend_response"); assert(assoc && req && req->state != REQUEST_IDLE); /* determine what it is we're waiting for */ - switch (req->request->which) + switch (req->apdu_request->which) { case Z_APDU_searchRequest: res = response_searchRequest(assoc, req, 0, &fd); break; @@ -880,22 +896,22 @@ void backend_response(IOCHAN i, int event) static int process_response(association *assoc, request *req, Z_APDU *res) { odr_setbuf(assoc->encode, req->response, req->size_response, 1); + + 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))); - odr_reset(assoc->encode); 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 */ - 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); - } odr_reset(assoc->encode); req->state = REQUEST_IDLE; request_enq(&assoc->outgoing, req); @@ -923,14 +939,14 @@ static int process_response(association *assoc, request *req, Z_APDU *res) static Z_APDU *process_initRequest(association *assoc, request *reqb) { statserv_options_block *cb = statserv_getcontrol(); - Z_InitRequest *req = reqb->request->u.initRequest; + Z_InitRequest *req = reqb->apdu_request->u.initRequest; Z_APDU *apdu = zget_APDU(assoc->encode, Z_APDU_initResponse); Z_InitResponse *resp = apdu->u.initResponse; bend_initresult *binitres; char options[100]; xfree (assoc->init); - assoc->init = xmalloc (sizeof(*assoc->init)); + assoc->init = (bend_initrequest *) xmalloc (sizeof(*assoc->init)); yaz_log(LOG_LOG, "Got initRequest"); if (req->implementationId) @@ -1094,14 +1110,14 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) * These functions should be merged. */ -static void set_addinfo (Z_DefaultDiagFormat *dr, char *addinfo) +static void set_addinfo (Z_DefaultDiagFormat *dr, char *addinfo, ODR odr) { #if ASN_COMPILED dr->which = Z_DefaultDiagFormat_v2Addinfo; - dr->u.v2Addinfo = addinfo ? addinfo : ""; + dr->u.v2Addinfo = odr_strdup (odr, addinfo ? addinfo : ""); #else dr->which = Z_DiagForm_v2AddInfo; - dr->addinfo = addinfo ? addinfo : ""; + dr->addinfo = odr_strdup (odr, addinfo ? addinfo : ""); #endif } @@ -1114,8 +1130,7 @@ static Z_Records *diagrec(association *assoc, int error, char *addinfo) Z_Records *rec = (Z_Records *) odr_malloc (assoc->encode, sizeof(*rec)); oident bib1; - int *err = (int *) - odr_malloc (assoc->encode, sizeof(*err)); + int *err = odr_intdup(assoc->encode, error); Z_DiagRec *drec = (Z_DiagRec *) odr_malloc (assoc->encode, sizeof(*drec)); Z_DefaultDiagFormat *dr = (Z_DefaultDiagFormat *) @@ -1127,7 +1142,6 @@ static Z_Records *diagrec(association *assoc, int error, char *addinfo) yaz_log(LOG_DEBUG, "Diagnostic: %d -- %s", error, addinfo ? addinfo : "NULL"); - *err = error; rec->which = Z_Records_NSD; #if ASN_COMPILED rec->u.nonSurrogateDiagnostic = dr; @@ -1139,7 +1153,7 @@ static Z_Records *diagrec(association *assoc, int error, char *addinfo) dr->diagnosticSetId = odr_oiddup (assoc->encode, oid_ent_to_oid(&bib1, oid)); dr->condition = err; - set_addinfo (dr, addinfo); + set_addinfo (dr, addinfo, assoc->encode); return rec; } @@ -1152,7 +1166,7 @@ static Z_NamePlusRecord *surrogatediagrec(association *assoc, char *dbname, int oid[OID_SIZE]; Z_NamePlusRecord *rec = (Z_NamePlusRecord *) odr_malloc (assoc->encode, sizeof(*rec)); - int *err = (int *)odr_malloc (assoc->encode, sizeof(*err)); + int *err = odr_intdup(assoc->encode, error); oident bib1; Z_DiagRec *drec = (Z_DiagRec *)odr_malloc (assoc->encode, sizeof(*drec)); Z_DefaultDiagFormat *dr = (Z_DefaultDiagFormat *) @@ -1163,7 +1177,6 @@ static Z_NamePlusRecord *surrogatediagrec(association *assoc, char *dbname, bib1.value = VAL_BIB1; yaz_log(LOG_DEBUG, "SurrogateDiagnotic: %d -- %s", error, addinfo); - *err = error; rec->databaseName = dbname; rec->which = Z_NamePlusRecord_surrogateDiagnostic; rec->u.surrogateDiagnostic = drec; @@ -1172,7 +1185,7 @@ static Z_NamePlusRecord *surrogatediagrec(association *assoc, char *dbname, dr->diagnosticSetId = odr_oiddup (assoc->encode, oid_ent_to_oid(&bib1, oid)); dr->condition = err; - set_addinfo (dr, addinfo); + set_addinfo (dr, addinfo, assoc->encode); return rec; } @@ -1184,7 +1197,7 @@ static Z_DiagRecs *diagrecs(association *assoc, int error, char *addinfo) { int oid[OID_SIZE]; Z_DiagRecs *recs = (Z_DiagRecs *)odr_malloc (assoc->encode, sizeof(*recs)); - int *err = (int *)odr_malloc (assoc->encode, sizeof(*err)); + int *err = odr_intdup(assoc->encode, error); oident bib1; Z_DiagRec **recp = (Z_DiagRec **)odr_malloc (assoc->encode, sizeof(*recp)); Z_DiagRec *drec = (Z_DiagRec *)odr_malloc (assoc->encode, sizeof(*drec)); @@ -1195,7 +1208,6 @@ static Z_DiagRecs *diagrecs(association *assoc, int error, char *addinfo) bib1.oclass = CLASS_DIAGSET; bib1.value = VAL_BIB1; - *err = error; recs->num_diagRecs = 1; recs->diagRecs = recp; recp[0] = drec; @@ -1208,10 +1220,10 @@ static Z_DiagRecs *diagrecs(association *assoc, int error, char *addinfo) #ifdef ASN_COMPILED rec->which = Z_DefaultDiagFormat_v2Addinfo; - rec->u.v2Addinfo = addinfo ? addinfo : ""; + rec->u.v2Addinfo = odr_strdup (assoc->encode, addinfo ? addinfo : ""); #else rec->which = Z_DiagForm_v2AddInfo; - rec->addinfo = addinfo ? addinfo : ""; + rec->addinfo = odr_strdup (assoc->encode, addinfo ? addinfo : ""); #endif return recs; } @@ -1358,7 +1370,7 @@ static Z_Records *pack_records(association *a, char *setname, int start, static Z_APDU *process_searchRequest(association *assoc, request *reqb, int *fd) { - Z_SearchRequest *req = reqb->request->u.searchRequest; + Z_SearchRequest *req = reqb->apdu_request->u.searchRequest; bend_search_rr *bsrr = (bend_search_rr *)nmem_malloc (reqb->request_mem, sizeof(*bsrr)); @@ -1435,19 +1447,14 @@ int bend_searchresponse(void *handle, bend_search_rr *bsrr) {return 0;} static Z_APDU *response_searchRequest(association *assoc, request *reqb, bend_search_rr *bsrt, int *fd) { - Z_SearchRequest *req = reqb->request->u.searchRequest; + Z_SearchRequest *req = reqb->apdu_request->u.searchRequest; Z_APDU *apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu)); Z_SearchResponse *resp = (Z_SearchResponse *) odr_malloc (assoc->encode, sizeof(*resp)); - int *nulint = (int *)odr_malloc (assoc->encode, sizeof(*nulint)); - bool_t *sr = (bool_t *)odr_malloc (assoc->encode, sizeof(*sr)); - int *next = (int *)odr_malloc (assoc->encode, sizeof(*next)); - int *none = (int *)odr_malloc (assoc->encode, sizeof(*none)); - - *nulint = 0; - *sr = 1; - *next = 0; - *none = Z_RES_NONE; + int *nulint = odr_intdup (assoc->encode, 0); + bool_t *sr = odr_intdup(assoc->encode, 1); + int *next = odr_intdup(assoc->encode, 0); + int *none = odr_intdup(assoc->encode, Z_RES_NONE); apdu->which = Z_APDU_searchResponse; apdu->u.searchResponse = resp; @@ -1472,12 +1479,10 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb, } else { - int *toget = (int *)odr_malloc (assoc->encode, sizeof(*toget)); - int *presst = (int *)odr_malloc (assoc->encode, sizeof(*presst)); + int *toget = odr_intdup(assoc->encode, 0); + int *presst = odr_intdup(assoc->encode, 0); Z_RecordComposition comp, *compp = 0; - *toget = 0; - *presst = 0; resp->records = 0; resp->resultCount = &bsrt->hits; @@ -1505,8 +1510,7 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb, oident *prefformat; oid_value form; - if (!(prefformat = oid_getentbyoid(req->preferredRecordSyntax)) || - prefformat->oclass != CLASS_RECSYN) + if (!(prefformat = oid_getentbyoid(req->preferredRecordSyntax))) form = VAL_NONE; else form = prefformat->value; @@ -1553,22 +1557,23 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb, static Z_APDU *process_presentRequest(association *assoc, request *reqb, int *fd) { - Z_PresentRequest *req = reqb->request->u.presentRequest; + Z_PresentRequest *req = reqb->apdu_request->u.presentRequest; oident *prefformat; oid_value form; Z_APDU *apdu; Z_PresentResponse *resp; - int *presst; int *next; int *num; yaz_log(LOG_LOG, "Got PresentRequest."); - if (!(prefformat = oid_getentbyoid(req->preferredRecordSyntax)) || - prefformat->oclass != CLASS_RECSYN) + if (!(prefformat = oid_getentbyoid(req->preferredRecordSyntax))) form = VAL_NONE; else form = prefformat->value; + resp = (Z_PresentResponse *)odr_malloc (assoc->encode, sizeof(*resp)); + resp->records = 0; + resp->presentStatus = odr_intdup(assoc->encode, 0); if (assoc->init->bend_present) { bend_present_rr *bprr = (bend_present_rr *) @@ -1589,29 +1594,32 @@ static Z_APDU *process_presentRequest(association *assoc, request *reqb, if (!bprr->request) return 0; + if (bprr->errcode) + { + resp->records = diagrec(assoc, bprr->errcode, bprr->errstring); + *resp->presentStatus = Z_PRES_FAILURE; + } } apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu)); - resp = (Z_PresentResponse *)odr_malloc (assoc->encode, sizeof(*resp)); - presst = (int *)odr_malloc (assoc->encode, sizeof(*presst)); - next = (int *)odr_malloc (assoc->encode, sizeof(*next)); - num = (int *)odr_malloc (assoc->encode, sizeof(*num)); - *presst = 0; - *next = 0; - *num = *req->numberOfRecordsRequested; + next = odr_intdup(assoc->encode, 0); + num = odr_intdup(assoc->encode, 0); apdu->which = Z_APDU_presentResponse; apdu->u.presentResponse = resp; resp->referenceId = req->referenceId; resp->otherInfo = 0; - resp->records = - pack_records(assoc, req->resultSetId, *req->resultSetStartPoint, - num, req->recordComposition, next, presst, form, - req->referenceId, req->preferredRecordSyntax); + if (!resp->records) + { + *num = *req->numberOfRecordsRequested; + resp->records = + pack_records(assoc, req->resultSetId, *req->resultSetStartPoint, + num, req->recordComposition, next, resp->presentStatus, + form, req->referenceId, req->preferredRecordSyntax); + } if (!resp->records) return 0; resp->numberOfRecordsReturned = num; - resp->presentStatus = presst; resp->nextResultSetPosition = next; return apdu; @@ -1623,14 +1631,12 @@ static Z_APDU *process_presentRequest(association *assoc, request *reqb, */ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd) { - Z_ScanRequest *req = reqb->request->u.scanRequest; + Z_ScanRequest *req = reqb->apdu_request->u.scanRequest; Z_APDU *apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu)); Z_ScanResponse *res = (Z_ScanResponse *) odr_malloc (assoc->encode, sizeof(*res)); - int *scanStatus = (int *) - odr_malloc (assoc->encode, sizeof(*scanStatus)); - int *numberOfEntriesReturned = (int *) - odr_malloc (assoc->encode, sizeof(*numberOfEntriesReturned)); + int *scanStatus = odr_intdup(assoc->encode, Z_Scan_failure); + int *numberOfEntriesReturned = odr_intdup(assoc->encode, 0); Z_ListEntries *ents = (Z_ListEntries *) odr_malloc (assoc->encode, sizeof(*ents)); Z_DiagRecs *diagrecs_p = NULL; @@ -1638,14 +1644,12 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd) oident *attset; yaz_log(LOG_LOG, "Got ScanRequest"); - *scanStatus = Z_Scan_failure; - *numberOfEntriesReturned = 0; apdu->which = Z_APDU_scanResponse; apdu->u.scanResponse = res; res->referenceId = req->referenceId; - res->stepSize = (int*) odr_malloc (assoc->encode, sizeof(*res->stepSize)); - *res->stepSize = 0; + res->stepSize = odr_intdup(assoc->encode, 0); + if (req->stepSize) *res->stepSize = *req->stepSize; res->scanStatus = scanStatus; @@ -1763,7 +1767,7 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd) static Z_APDU *process_sortRequest(association *assoc, request *reqb, int *fd) { - Z_SortRequest *req = reqb->request->u.sortRequest; + Z_SortRequest *req = reqb->apdu_request->u.sortRequest; Z_SortResponse *res = (Z_SortResponse *) odr_malloc (assoc->encode, sizeof(*res)); bend_sort_rr *bsrr = (bend_sort_rr *) @@ -1793,9 +1797,7 @@ static Z_APDU *process_sortRequest(association *assoc, request *reqb, (*assoc->init->bend_sort)(assoc->backend, bsrr); res->referenceId = bsrr->referenceId; - res->sortStatus = (int *) - odr_malloc (assoc->encode, sizeof(*res->sortStatus)); - *res->sortStatus = bsrr->sort_status; + res->sortStatus = odr_intdup(assoc->encode, bsrr->sort_status); res->resultSetStatus = 0; if (bsrr->errcode) { @@ -1824,7 +1826,8 @@ static Z_APDU *process_sortRequest(association *assoc, request *reqb, static Z_APDU *process_deleteRequest(association *assoc, request *reqb, int *fd) { - Z_DeleteResultSetRequest *req = reqb->request->u.deleteResultSetRequest; + Z_DeleteResultSetRequest *req = + reqb->apdu_request->u.deleteResultSetRequest; Z_DeleteResultSetResponse *res = (Z_DeleteResultSetResponse *) odr_malloc (assoc->encode, sizeof(*res)); bend_delete_rr *bdrr = (bend_delete_rr *) @@ -1843,8 +1846,9 @@ static Z_APDU *process_deleteRequest(association *assoc, request *reqb, if (bdrr->num_setnames > 0) { int i; - bdrr->statuses = odr_malloc(assoc->encode, sizeof(*bdrr->statuses) * - bdrr->num_setnames); + bdrr->statuses = (int*) + odr_malloc(assoc->encode, sizeof(*bdrr->statuses) * + bdrr->num_setnames); for (i = 0; i < bdrr->num_setnames; i++) bdrr->statuses[i] = 0; } @@ -1852,24 +1856,24 @@ static Z_APDU *process_deleteRequest(association *assoc, request *reqb, res->referenceId = req->referenceId; - res->deleteOperationStatus = (int *) - odr_malloc (assoc->encode, sizeof(*res->deleteOperationStatus)); - *res->deleteOperationStatus = bdrr->delete_status; + res->deleteOperationStatus = odr_intdup(assoc->encode,bdrr->delete_status); res->deleteListStatuses = 0; if (bdrr->num_setnames > 0) { int i; - res->deleteListStatuses = odr_malloc(assoc->encode, - sizeof(*res->deleteListStatuses)); + res->deleteListStatuses = (Z_ListStatuses *) + odr_malloc(assoc->encode, sizeof(*res->deleteListStatuses)); res->deleteListStatuses->num = bdrr->num_setnames; res->deleteListStatuses->elements = - odr_malloc (assoc->encode, + (Z_ListStatus **) + odr_malloc (assoc->encode, sizeof(*res->deleteListStatuses->elements) * bdrr->num_setnames); for (i = 0; inum_setnames; i++) { res->deleteListStatuses->elements[i] = + (Z_ListStatus *) odr_malloc (assoc->encode, sizeof(**res->deleteListStatuses->elements)); res->deleteListStatuses->elements[i]->status = bdrr->statuses+i; @@ -1890,7 +1894,7 @@ static Z_APDU *process_deleteRequest(association *assoc, request *reqb, static void process_close(association *assoc, request *reqb) { - Z_Close *req = reqb->request->u.close; + Z_Close *req = reqb->apdu_request->u.close; static char *reasons[] = { "finished", @@ -1984,7 +1988,7 @@ static Z_APDU *process_segmentRequest (association *assoc, request *reqb) { bend_segment_rr request; - request.segment = reqb->request->u.segmentRequest; + request.segment = reqb->apdu_request->u.segmentRequest; request.stream = assoc->encode; request.decode = assoc->decode; request.print = assoc->print; @@ -1999,14 +2003,14 @@ static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd) { bend_esrequest_rr esrequest; - Z_ExtendedServicesRequest *req = reqb->request->u.extendedServicesRequest; + Z_ExtendedServicesRequest *req = reqb->apdu_request->u.extendedServicesRequest; Z_APDU *apdu = zget_APDU(assoc->encode, Z_APDU_extendedServicesResponse); Z_ExtendedServicesResponse *resp = apdu->u.extendedServicesResponse; yaz_log(LOG_DEBUG,"inside Process esRequest"); - esrequest.esr = reqb->request->u.extendedServicesRequest; + esrequest.esr = reqb->apdu_request->u.extendedServicesRequest; esrequest.stream = assoc->encode; esrequest.decode = assoc->decode; esrequest.print = assoc->print; @@ -2014,6 +2018,7 @@ static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd) esrequest.errstring = NULL; esrequest.request = reqb; esrequest.association = assoc; + esrequest.taskPackage = 0; esrequest.referenceId = req->referenceId; (*assoc->init->bend_esrequest)(assoc->backend, &esrequest); @@ -2048,7 +2053,10 @@ static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd) resp->diagnostics = diagRecs->diagRecs; } /* Do something with the members of bend_extendedservice */ - + if (esrequest.taskPackage) + resp->taskPackage = z_ext_record (assoc->encode, VAL_EXTENDED, + (const char *) esrequest.taskPackage, + -1); yaz_log(LOG_DEBUG,"Send the result apdu"); return apdu; }