*
*/
+#include <limits.h>
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
static void do_close_req(association *a, int reason, char *message,
request *req)
{
- Z_APDU apdu;
- Z_Close *cls = zget_Close(a->encode);
+ Z_APDU *apdu = zget_APDU(a->encode, Z_APDU_close);
+ Z_Close *cls = apdu->u.close;
/* Purge request queue */
while (request_deq(&a->incoming));
{
yaz_log(log_requestdetail, "Sending Close PDU, reason=%d, message=%s",
reason, message ? message : "none");
- apdu.which = Z_APDU_close;
- apdu.u.close = cls;
*cls->closeReason = reason;
cls->diagnosticInformation = message;
- process_z_response(a, req, &apdu);
+ process_z_response(a, req, apdu);
iochan_settimeout(a->client_chan, 20);
}
else
return 0;
}
+static int odr_int_to_int(Odr_int v)
+{
+ if (v >= INT_MAX)
+ return INT_MAX;
+ else if (v <= INT_MIN)
+ return INT_MIN;
+ else return v;
+}
static void srw_bend_search(association *assoc, request *req,
Z_SRW_PDU *sr,
}
else
{
- int number = srw_req->maximumRecords ? *srw_req->maximumRecords : 0;
- int start = srw_req->startRecord ? *srw_req->startRecord : 1;
+ int number = srw_req->maximumRecords ?
+ odr_int_to_int(*srw_req->maximumRecords) : 0;
+ int start = srw_req->startRecord ?
+ odr_int_to_int(*srw_req->startRecord) : 1;
yaz_log(log_requestdetail, "Request to pack %d+%d out of "
ODR_INT_PRINTF,
int i;
int ok = 1;
if (start + number > rr.hits)
- number = rr.hits - start + 1;
+ number = odr_int_to_int(rr.hits) - start + 1;
/* Call bend_present if defined */
if (assoc->init->bend_present)
srw_bend_init(assoc, &srw_res->diagnostics, &srw_res->num_diagnostics, sr);
if (srw_res->num_diagnostics == 0 && assoc->init)
{
+ int step_size = 0;
struct scan_entry *save_entries;
bend_scan_rr *bsrr = (bend_scan_rr *)
bsrr->basenames = &srw_req->database;
bsrr->num_entries = srw_req->maximumTerms ?
- *srw_req->maximumTerms : 10;
+ odr_int_to_int(*srw_req->maximumTerms) : 10;
bsrr->term_position = srw_req->responsePosition ?
- *srw_req->responsePosition : 1;
+ odr_int_to_int(*srw_req->responsePosition) : 1;
bsrr->errcode = 0;
bsrr->errstring = 0;
bsrr->referenceId = 0;
bsrr->stream = assoc->encode;
bsrr->print = assoc->print;
- bsrr->step_size = odr_intdup(assoc->decode, 0);
+ bsrr->step_size = &step_size;
bsrr->entries = 0;
bsrr->setname = 0;
if (*req->preferredMessageSize < assoc->preferredMessageSize)
assoc->preferredMessageSize = *req->preferredMessageSize;
- resp->preferredMessageSize = &assoc->preferredMessageSize;
- resp->maximumRecordSize = &assoc->maximumRecordSize;
+ resp->preferredMessageSize =
+ odr_intdup(assoc->encode, assoc->preferredMessageSize);
+ resp->maximumRecordSize =
+ odr_intdup(assoc->encode, assoc->maximumRecordSize);
resp->implementationId = odr_prepend(assoc->encode,
assoc->init->implementation_id,
Z_ReferenceId *referenceId,
Odr_oid *oid, int *errcode)
{
- int recno, total_length = 0, toget = *num, dumped_records = 0;
+ int recno, total_length = 0, dumped_records = 0;
+ int toget = odr_int_to_int(*num);
Z_Records *records =
(Z_Records *) odr_malloc(a->encode, sizeof(*records));
Z_NamePlusRecordList *reclist =
*next = 0;
yaz_log(log_requestdetail, "Request to pack " ODR_INT_PRINTF "+%d %s", start, toget, setname);
- yaz_log(log_requestdetail, "pms=" ODR_INT_PRINTF
- ", mrs=" ODR_INT_PRINTF, a->preferredMessageSize,
+ yaz_log(log_requestdetail, "pms=%d, mrs=%d", a->preferredMessageSize,
a->maximumRecordSize);
- for (recno = start; reclist->num_records < toget; recno++)
+ for (recno = odr_int_to_int(start); reclist->num_records < toget; recno++)
{
bend_fetch_rr freq;
Z_NamePlusRecord *thisrec;
else /* too big entirely */
{
yaz_log(log_requestdetail, "Record > maxrcdsz "
- "this=%d max=" ODR_INT_PRINTF,
+ "this=%d max=%d",
this_length, a->maximumRecordSize);
reclist->records[reclist->num_records] =
surrogatediagrec(a, freq.basename, 17, 0);
Odr_int *nulint = odr_intdup(assoc->encode, 0);
Odr_int *next = odr_intdup(assoc->encode, 0);
Odr_int *none = odr_intdup(assoc->encode, Z_SearchResponse_none);
- int returnedrecs = 0;
+ Odr_int returnedrecs = 0;
apdu->which = Z_APDU_searchResponse;
apdu->u.searchResponse = resp;
nmem_malloc(reqb->request_mem, sizeof(*bprr));
bprr->setname = req->resultSetName;
bprr->start = 1;
- bprr->number = *toget;
+ bprr->number = odr_int_to_int(*toget);
bprr->format = req->preferredRecordSyntax;
bprr->comp = compp;
bprr->referenceId = req->referenceId;
wrbuf_printf(wr, "ERROR %d", bsrt->errcode);
else
wrbuf_printf(wr, "OK " ODR_INT_PRINTF, bsrt->hits);
- wrbuf_printf(wr, " %s 1+%d ",
+ wrbuf_printf(wr, " %s 1+" ODR_INT_PRINTF " ",
req->resultSetName, returnedrecs);
yaz_query_to_wrbuf(wr, req->query);
bend_present_rr *bprr = (bend_present_rr *)
nmem_malloc(reqb->request_mem, sizeof(*bprr));
bprr->setname = req->resultSetId;
- bprr->start = *req->resultSetStartPoint;
- bprr->number = *req->numberOfRecordsRequested;
+ bprr->start = odr_int_to_int(*req->resultSetStartPoint);
+ bprr->number = odr_int_to_int(*req->numberOfRecordsRequested);
bprr->format = req->preferredRecordSyntax;
bprr->comp = req->recordComposition;
bprr->referenceId = req->referenceId;
bend_scan_rr *bsrr = (bend_scan_rr *)
odr_malloc(assoc->encode, sizeof(*bsrr));
struct scan_entry *save_entries;
+ int step_size = 0;
yaz_log(log_requestdetail, "Got ScanRequest");
res->referenceId = req->referenceId;
/* if step is absent, set it to 0 */
- res->stepSize = odr_intdup(assoc->encode, 0);
if (req->stepSize)
- *res->stepSize = *req->stepSize;
+ step_size = odr_int_to_int(*req->stepSize);
res->scanStatus = scanStatus;
res->numberOfEntriesReturned = numberOfEntriesReturned;
bsrr->errstring = 0;
bsrr->num_bases = req->num_databaseNames;
bsrr->basenames = req->databaseNames;
- bsrr->num_entries = *req->numberOfTermsRequested;
+ bsrr->num_entries = odr_int_to_int(*req->numberOfTermsRequested);
bsrr->term = req->termListAndStartPoint;
bsrr->referenceId = req->referenceId;
bsrr->stream = assoc->encode;
bsrr->print = assoc->print;
- bsrr->step_size = res->stepSize;
+ bsrr->step_size = &step_size;
bsrr->setname = yaz_oi_get_string_oid(&req->otherInfo,
yaz_oid_userinfo_scan_set, 1, 0);
bsrr->entries = 0;
log_scan_term_level(log_requestdetail, req->termListAndStartPoint,
bsrr->attributeset);
bsrr->term_position = req->preferredPositionInResponse ?
- *req->preferredPositionInResponse : 1;
+ odr_int_to_int(*req->preferredPositionInResponse) : 1;
((int (*)(void *, bend_scan_rr *))
(*assoc->init->bend_scan))(assoc->backend, bsrr);
*scanStatus = Z_Scan_partial_5;
else
*scanStatus = Z_Scan_success;
+ res->stepSize = odr_intdup(assoc->encode, step_size);
ents->entries = tab;
ents->num_entries = bsrr->num_entries;
res->numberOfEntriesReturned = odr_intdup(assoc->encode,
ents->num_entries);
- res->positionOfTerm = &bsrr->term_position;
+ res->positionOfTerm = odr_intdup(assoc->encode, bsrr->term_position);
for (i = 0; i < bsrr->num_entries; i++)
{
Z_Entry *e;
req->resultSetList[i]);
bdrr->stream = assoc->encode;
bdrr->print = assoc->print;
- bdrr->function = *req->deleteFunction;
+ bdrr->function = odr_int_to_int(*req->deleteFunction);
bdrr->referenceId = req->referenceId;
bdrr->statuses = 0;
if (bdrr->num_setnames > 0)
{
- bdrr->statuses = (Odr_int*)
+ bdrr->statuses = (int*)
odr_malloc(assoc->encode, sizeof(*bdrr->statuses) *
bdrr->num_setnames);
for (i = 0; i < bdrr->num_setnames; i++)
(Z_ListStatus *)
odr_malloc(assoc->encode,
sizeof(**res->deleteListStatuses->elements));
- res->deleteListStatuses->elements[i]->status = bdrr->statuses+i;
+ res->deleteListStatuses->elements[i]->status =
+ odr_intdup(assoc->encode, bdrr->statuses[i]);
res->deleteListStatuses->elements[i]->id =
odr_strdup(assoc->encode, bdrr->setnames[i]);
}