GFS: fix sizeof: saved by the bell
[yaz-moved-to-github.git] / src / seshigh.c
index 1a3e794..bd1ec84 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2009 Index Data
+ * Copyright (C) 1995-2010 Index Data
  * See the file LICENSE for details.
  */
 /**
@@ -26,6 +26,7 @@
  *
  */
 
+#include <limits.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <assert.h>
 
 static void process_gdu_request(association *assoc, request *req);
 static int process_z_request(association *assoc, request *req, char **msg);
-void backend_response(IOCHAN i, int event);
 static int process_gdu_response(association *assoc, request *req, Z_GDU *res);
 static int process_z_response(association *assoc, request *req, Z_APDU *res);
 static Z_APDU *process_initRequest(association *assoc, request *reqb);
 static Z_External *init_diagnostics(ODR odr, int errcode,
                                     const char *errstring);
-static Z_APDU *process_searchRequest(association *assoc, request *reqb,
-    int *fd);
+static Z_APDU *process_searchRequest(association *assoc, request *reqb);
 static Z_APDU *response_searchRequest(association *assoc, request *reqb,
-    bend_search_rr *bsrr, int *fd);
-static Z_APDU *process_presentRequest(association *assoc, request *reqb,
-    int *fd);
-static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd);
-static Z_APDU *process_sortRequest(association *assoc, request *reqb, int *fd);
+                                      bend_search_rr *bsrr);
+static Z_APDU *process_presentRequest(association *assoc, request *reqb);
+static Z_APDU *process_scanRequest(association *assoc, request *reqb);
+static Z_APDU *process_sortRequest(association *assoc, request *reqb);
 static void process_close(association *assoc, request *reqb);
-static Z_APDU *process_deleteRequest(association *assoc, request *reqb,
-    int *fd);
+static Z_APDU *process_deleteRequest(association *assoc, request *reqb);
 static Z_APDU *process_segmentRequest(association *assoc, request *reqb);
-
-static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd);
+static Z_APDU *process_ESRequest(association *assoc, request *reqb);
 
 /* dynamic logging levels */
 static int logbits_set = 0;
@@ -119,20 +115,27 @@ static void get_logbits(void)
     }
 }
 
-
-
 static void wr_diag(WRBUF w, int error, const char *addinfo)
 {
     wrbuf_printf(w, "ERROR %d+", error);
     wrbuf_puts_replace_char(w, diagbib1_str(error), ' ', '_');
-    if (addinfo){
+    if (addinfo)
+    {
         wrbuf_puts(w, "+");
         wrbuf_puts_replace_char(w, addinfo, ' ', '_');
     }
-    
     wrbuf_puts(w, " ");    
 }
 
+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 (int) v;
+}
 
 /*
  * Create and initialize a new association-handle.
@@ -230,8 +233,8 @@ void destroy_association(association *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));
@@ -240,11 +243,9 @@ static void do_close_req(association *a, int reason, char *message,
     {
         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
@@ -260,7 +261,7 @@ static void do_close_req(association *a, int reason, char *message,
 static void do_close(association *a, int reason, char *message)
 {
     request *req = request_get(&a->outgoing);
-    do_close_req (a, reason, message, req);
+    do_close_req(a, reason, message, req);
 }
 
 
@@ -484,7 +485,7 @@ static int process_z_request(association *assoc, request *req, char **msg);
 
 static void assoc_init_reset(association *assoc)
 {
-    xfree (assoc->init);
+    xfree(assoc->init);
     assoc->init = (bend_initrequest *) xmalloc(sizeof(*assoc->init));
 
     assoc->init->stream = assoc->encode;
@@ -535,7 +536,7 @@ static int srw_bend_init(association *assoc, Z_SRW_diagnostic **d, int *num, Z_S
         {
             Z_IdAuthentication *auth = (Z_IdAuthentication *)
                 odr_malloc(assoc->decode, sizeof(*auth));
-            int len;
+            size_t len;
 
             len = strlen(sr->username) + 1;
             if (sr->password) 
@@ -827,13 +828,15 @@ static int cql2pqf_scan(ODR odr, const char *cql, cql_transform_t ct,
                    
 
 static int ccl2pqf(ODR odr, const Odr_oct *ccl, CCL_bibset bibset,
-                   bend_search_rr *bsrr) {
+                   bend_search_rr *bsrr)
+{
     char *ccl0;
     struct ccl_rpn_node *node;
     int errcode, pos;
 
     ccl0 = odr_strdupn(odr, (char*) ccl->buf, ccl->len);
-    if ((node = ccl_find_str(bibset, ccl0, &errcode, &pos)) == 0) {
+    if ((node = ccl_find_str(bibset, ccl0, &errcode, &pos)) == 0)
+    {
         bsrr->errstring = (char*) ccl_err_msg(errcode);
         return YAZ_SRW_QUERY_SYNTAX_ERROR;    /* Query syntax error */
     }
@@ -843,8 +846,7 @@ static int ccl2pqf(ODR odr, const Odr_oct *ccl, CCL_bibset bibset,
     return 0;
 }
 
-
-static void srw_bend_search(association *assoc, request *req,
+static void srw_bend_search(association *assoc,
                             Z_SRW_PDU *sr,
                             Z_SRW_PDU *res,
                             int *http_code)
@@ -944,7 +946,6 @@ static void srw_bend_search(association *assoc, request *req,
                 rr.srw_sortKeys = odr_strdup(assoc->encode, 
                                              srw_req->sort.sortKeys );
             rr.association = assoc;
-            rr.fd = 0;
             rr.hits = 0;
             rr.errcode = 0;
             rr.errstring = 0;
@@ -969,8 +970,10 @@ static void srw_bend_search(association *assoc, request *req,
             }
             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,
@@ -999,7 +1002,7 @@ static void srw_bend_search(association *assoc, request *req,
                     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)
@@ -1146,7 +1149,7 @@ static void srw_bend_search(association *assoc, request *req,
     }
 }
 
-static char *srw_bend_explain_default(void *handle, bend_explain_rr *rr)
+static char *srw_bend_explain_default(bend_explain_rr *rr)
 {
 #if YAZ_HAVE_XML2
     xmlNodePtr ptr = (xmlNode *) rr->server_node_ptr;
@@ -1182,7 +1185,7 @@ static char *srw_bend_explain_default(void *handle, bend_explain_rr *rr)
     return 0;
 }
 
-static void srw_bend_explain(association *assoc, request *req,
+static void srw_bend_explain(association *assoc,
                              Z_SRW_PDU *sr,
                              Z_SRW_explainResponse *srw_res,
                              int *http_code)
@@ -1208,7 +1211,7 @@ static void srw_bend_explain(association *assoc, request *req,
         if (assoc->init->bend_explain)
             (*assoc->init->bend_explain)(assoc->backend, &rr);
         else
-            srw_bend_explain_default(assoc->backend, &rr);
+            srw_bend_explain_default(&rr);
 
         if (rr.explain_buf)
         {
@@ -1230,7 +1233,7 @@ static void srw_bend_explain(association *assoc, request *req,
     }
 }
 
-static void srw_bend_scan(association *assoc, request *req,
+static void srw_bend_scan(association *assoc,
                           Z_SRW_PDU *sr,
                           Z_SRW_scanResponse *srw_res,
                           int *http_code)
@@ -1242,6 +1245,7 @@ static void srw_bend_scan(association *assoc, request *req,
     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 *)
@@ -1250,16 +1254,16 @@ static void srw_bend_scan(association *assoc, request *req,
         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;
 
@@ -1417,7 +1421,7 @@ static void srw_bend_scan(association *assoc, request *req,
 
 }
 
-static void srw_bend_update(association *assoc, request *req,
+static void srw_bend_update(association *assoc,
                            Z_SRW_PDU *sr,
                            Z_SRW_updateResponse *srw_res,
                            int *http_code)
@@ -1786,7 +1790,7 @@ static void process_http_request(association *assoc, request *req)
             }
             else
             {
-                srw_bend_search(assoc, req, sr, res, &http_code);
+                srw_bend_search(assoc, sr, res, &http_code);
             }
             if (http_code == 200)
                 soap_package->u.generic->p = res;
@@ -1801,8 +1805,7 @@ static void process_http_request(association *assoc, request *req)
                 res->u.explain_response->diagnostics = diagnostic;
                 res->u.explain_response->num_diagnostics = num_diagnostic;
             }
-            srw_bend_explain(assoc, req, sr,
-                             res->u.explain_response, &http_code);
+            srw_bend_explain(assoc, sr, res->u.explain_response, &http_code);
             if (http_code == 200)
                 soap_package->u.generic->p = res;
         }
@@ -1816,8 +1819,7 @@ static void process_http_request(association *assoc, request *req)
                 res->u.scan_response->diagnostics = diagnostic;
                 res->u.scan_response->num_diagnostics = num_diagnostic;
             }
-            srw_bend_scan(assoc, req, sr,
-                          res->u.scan_response, &http_code);
+            srw_bend_scan(assoc, sr, res->u.scan_response, &http_code);
             if (http_code == 200)
                 soap_package->u.generic->p = res;
         }
@@ -1832,8 +1834,7 @@ static void process_http_request(association *assoc, request *req)
                 res->u.update_response->num_diagnostics = num_diagnostic;
             }
             yaz_log(YLOG_DEBUG, "num_diag = %d", res->u.update_response->num_diagnostics );
-            srw_bend_update(assoc, req, sr,
-                            res->u.update_response, &http_code);
+            srw_bend_update(assoc, sr, res->u.update_response, &http_code);
             if (http_code == 200)
                 soap_package->u.generic->p = res;
         }
@@ -1950,7 +1951,6 @@ static void process_gdu_request(association *assoc, request *req)
  */
 static int process_z_request(association *assoc, request *req, char **msg)
 {
-    int fd = -1;
     Z_APDU *res;
     int retval;
     
@@ -1966,12 +1966,12 @@ static int process_z_request(association *assoc, request *req, char **msg)
     case Z_APDU_initRequest:
         res = process_initRequest(assoc, req); break;
     case Z_APDU_searchRequest:
-        res = process_searchRequest(assoc, req, &fd); break;
+        res = process_searchRequest(assoc, req); break;
     case Z_APDU_presentRequest:
-        res = process_presentRequest(assoc, req, &fd); break;
+        res = process_presentRequest(assoc, req); break;
     case Z_APDU_scanRequest:
         if (assoc->init->bend_scan)
-            res = process_scanRequest(assoc, req, &fd);
+            res = process_scanRequest(assoc, req);
         else
         {
             *msg = "Cannot handle Scan APDU";
@@ -1980,7 +1980,7 @@ static int process_z_request(association *assoc, request *req, char **msg)
         break;
     case Z_APDU_extendedServicesRequest:
         if (assoc->init->bend_esrequest)
-            res = process_ESRequest(assoc, req, &fd);
+            res = process_ESRequest(assoc, req);
         else
         {
             *msg = "Cannot handle Extended Services APDU";
@@ -1989,7 +1989,7 @@ static int process_z_request(association *assoc, request *req, char **msg)
         break;
     case Z_APDU_sortRequest:
         if (assoc->init->bend_sort)
-            res = process_sortRequest(assoc, req, &fd);
+            res = process_sortRequest(assoc, req);
         else
         {
             *msg = "Cannot handle Sort APDU";
@@ -2001,7 +2001,7 @@ static int process_z_request(association *assoc, request *req, char **msg)
         return 0;
     case Z_APDU_deleteResultSetRequest:
         if (assoc->init->bend_delete)
-            res = process_deleteRequest(assoc, req, &fd);
+            res = process_deleteRequest(assoc, req);
         else
         {
             *msg = "Cannot handle Delete APDU";
@@ -2030,69 +2030,15 @@ static int process_z_request(association *assoc, request *req, char **msg)
         yaz_log(YLOG_DEBUG, "  result immediately available");
         retval = process_z_response(assoc, req, res);
     }
-    else if (fd < 0)
+    else
     {
         yaz_log(YLOG_DEBUG, "  result unavailble");
-        retval = 0;
-    }
-    else /* no result yet - one will be provided later */
-    {
-        IOCHAN chan;
-
-        /* Set up an I/O handler for the fd supplied by the backend */
-
-        yaz_log(YLOG_DEBUG, "   establishing handler for result");
-        req->state = REQUEST_PENDING;
-        if (!(chan = iochan_create(fd, backend_response, EVENT_INPUT, 0)))
-            abort();
-        iochan_setdata(chan, assoc);
-        retval = 0;
+        retval = -1;
     }
     return retval;
 }
 
 /*
- * Handle message from the backend.
- */
-void backend_response(IOCHAN i, int event)
-{
-    association *assoc = (association *)iochan_getdata(i);
-    request *req = request_head(&assoc->incoming);
-    Z_APDU *res;
-    int fd;
-
-    yaz_log(YLOG_DEBUG, "backend_response");
-    assert(assoc && req && req->state != REQUEST_IDLE);
-    /* determine what it is we're waiting for */
-    switch (req->apdu_request->which)
-    {
-        case Z_APDU_searchRequest:
-            res = response_searchRequest(assoc, req, 0, &fd); break;
-#if 0
-        case Z_APDU_presentRequest:
-            res = response_presentRequest(assoc, req, 0, &fd); break;
-        case Z_APDU_scanRequest:
-            res = response_scanRequest(assoc, req, 0, &fd); break;
-#endif
-        default:
-            yaz_log(YLOG_FATAL, "Serious programmer's lapse or bug");
-            abort();
-    }
-    if ((res && process_z_response(assoc, req, res) < 0) || fd < 0)
-    {
-        yaz_log(YLOG_WARN, "Fatal error when talking to backend");
-        do_close(assoc, Z_Close_systemProblem, 0);
-        iochan_destroy(i);
-        return;
-    }
-    else if (!res) /* no result yet - try again later */
-    {
-        yaz_log(YLOG_DEBUG, "   no result yet");
-        iochan_setfd(i, fd); /* in case fd has changed */
-    }
-}
-
-/*
  * Encode response, and transfer the request structure to the outgoing queue.
  */
 static int process_gdu_response(association *assoc, request *req, Z_GDU *res)
@@ -2142,7 +2088,7 @@ static int process_gdu_response(association *assoc, request *req, Z_GDU *res)
  */
 static int process_z_response(association *assoc, request *req, Z_APDU *res)
 {
-    Z_GDU *gres = (Z_GDU *) odr_malloc(assoc->encode, sizeof(*res));
+    Z_GDU *gres = (Z_GDU *) odr_malloc(assoc->encode, sizeof(*gres));
     gres->which = Z_GDU_Z3950;
     gres->u.z3950 = res;
 
@@ -2342,13 +2288,15 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb)
     yaz_log(log_requestdetail, "Negotiated to v%d: %s", assoc->version, options);
 
     if (*req->maximumRecordSize < assoc->maximumRecordSize)
-        assoc->maximumRecordSize = *req->maximumRecordSize;
+        assoc->maximumRecordSize = odr_int_to_int(*req->maximumRecordSize);
 
     if (*req->preferredMessageSize < assoc->preferredMessageSize)
-        assoc->preferredMessageSize = *req->preferredMessageSize;
+        assoc->preferredMessageSize = odr_int_to_int(*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,
@@ -2469,27 +2417,33 @@ static Z_Records *pack_records(association *a, char *setname, Odr_int start,
                                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 =
         (Z_NamePlusRecordList *) odr_malloc(a->encode, sizeof(*reclist));
-    Z_NamePlusRecord **list =
-        (Z_NamePlusRecord **) odr_malloc(a->encode, sizeof(*list) * toget);
 
     records->which = Z_Records_DBOSD;
     records->u.databaseOrSurDiagnostics = reclist;
     reclist->num_records = 0;
-    reclist->records = list;
+
+    if (toget < 0)
+        return diagrec(a, YAZ_BIB1_PRESENT_REQUEST_OUT_OF_RANGE, 0);
+    else if (toget == 0)
+        reclist->records = odr_nullval();
+    else
+        reclist->records = (Z_NamePlusRecord **)
+            odr_malloc(a->encode, sizeof(*reclist->records) * toget);
+
     *pres = Z_PresentStatus_success;
     *num = 0;
     *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;
@@ -2532,7 +2486,7 @@ static Z_Records *pack_records(association *a, char *setname, Odr_int start,
                 if (freq.errcode == YAZ_BIB1_PRESENT_REQUEST_OUT_OF_RANGE  && 
                                 freq.errstring == 0)
                 {
-                    sprintf (s, "%d", recno);
+                    sprintf(s, "%d", recno);
                     freq.errstring = s;
                 }
                 if (errcode)
@@ -2583,7 +2537,7 @@ static Z_Records *pack_records(association *a, char *setname, Odr_int start,
             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);
@@ -2612,15 +2566,13 @@ static Z_Records *pack_records(association *a, char *setname, Odr_int start,
     return records;
 }
 
-static Z_APDU *process_searchRequest(association *assoc, request *reqb,
-    int *fd)
+static Z_APDU *process_searchRequest(association *assoc, request *reqb)
 {
     Z_SearchRequest *req = reqb->apdu_request->u.searchRequest;
     bend_search_rr *bsrr = 
         (bend_search_rr *)nmem_malloc(reqb->request_mem, sizeof(*bsrr));
     
     yaz_log(log_requestdetail, "Got SearchRequest.");
-    bsrr->fd = fd;
     bsrr->association = assoc;
     bsrr->referenceId = req->referenceId;
     bsrr->srw_sortKeys = 0;
@@ -2688,11 +2640,9 @@ static Z_APDU *process_searchRequest(association *assoc, request *reqb,
         /* FIXME - make a diagnostic for it */
         yaz_log(YLOG_WARN,"Search not supported ?!?!");
     }
-    return response_searchRequest(assoc, reqb, bsrr, fd);
+    return response_searchRequest(assoc, reqb, bsrr);
 }
 
-int bend_searchresponse(void *handle, bend_search_rr *bsrr) {return 0;}
-
 /*
  * Prepare a searchresponse based on the backend results. We probably want
  * to look at making the fetching of records nonblocking as well, but
@@ -2701,7 +2651,7 @@ int bend_searchresponse(void *handle, bend_search_rr *bsrr) {return 0;}
  * event, and we'll have to get the response for ourselves.
  */
 static Z_APDU *response_searchRequest(association *assoc, request *reqb,
-    bend_search_rr *bsrt, int *fd)
+                                      bend_search_rr *bsrt)
 {
     Z_SearchRequest *req = reqb->apdu_request->u.searchRequest;
     Z_APDU *apdu = (Z_APDU *)odr_malloc(assoc->encode, sizeof(*apdu));
@@ -2710,15 +2660,14 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb,
     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;
     resp->referenceId = req->referenceId;
     resp->additionalSearchInfo = 0;
     resp->otherInfo = 0;
-    *fd = -1;
-    if (!bsrt && !bend_searchresponse(assoc->backend, bsrt))
+    if (!bsrt)
     {
         yaz_log(YLOG_FATAL, "Bad result from backend");
         return 0;
@@ -2775,7 +2724,7 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb,
                     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;
@@ -2832,7 +2781,8 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb,
         int i;
         WRBUF wr = wrbuf_alloc();
 
-        for (i = 0 ; i < req->num_databaseNames; i++){
+        for (i = 0 ; i < req->num_databaseNames; i++)
+        {
             if (i)
                 wrbuf_printf(wr, "+");
             wrbuf_puts(wr, req->databaseNames[i]);
@@ -2843,7 +2793,7 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb,
             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);
         
@@ -2868,8 +2818,7 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb,
  * operation is more fun in operations that have an unpredictable execution
  * speed - which is normally more true for search than for present.
  */
-static Z_APDU *process_presentRequest(association *assoc, request *reqb,
-                                      int *fd)
+static Z_APDU *process_presentRequest(association *assoc, request *reqb)
 {
     Z_PresentRequest *req = reqb->apdu_request->u.presentRequest;
     Z_APDU *apdu;
@@ -2889,8 +2838,8 @@ static Z_APDU *process_presentRequest(association *assoc, request *reqb,
         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;
@@ -2959,7 +2908,7 @@ static Z_APDU *process_presentRequest(association *assoc, request *reqb,
  * Scan was implemented rather in a hurry, and with support for only the basic
  * elements of the service in the backend API. Suggestions are welcome.
  */
-static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd)
+static Z_APDU *process_scanRequest(association *assoc, request *reqb)
 {
     Z_ScanRequest *req = reqb->apdu_request->u.scanRequest;
     Z_APDU *apdu = (Z_APDU *)odr_malloc(assoc->encode, sizeof(*apdu));
@@ -2973,6 +2922,7 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd)
     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");
 
@@ -2981,9 +2931,8 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd)
     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;
@@ -3007,12 +2956,12 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd)
     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;
@@ -3044,7 +2993,7 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd)
     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);
@@ -3062,11 +3011,12 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd)
             *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;
@@ -3164,8 +3114,7 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd)
     return apdu;
 }
 
-static Z_APDU *process_sortRequest(association *assoc, request *reqb,
-    int *fd)
+static Z_APDU *process_sortRequest(association *assoc, request *reqb)
 {
     int i;
     Z_SortRequest *req = reqb->apdu_request->u.sortRequest;
@@ -3241,8 +3190,7 @@ static Z_APDU *process_sortRequest(association *assoc, request *reqb,
     return apdu;
 }
 
-static Z_APDU *process_deleteRequest(association *assoc, request *reqb,
-    int *fd)
+static Z_APDU *process_deleteRequest(association *assoc, request *reqb)
 {
     int i;
     Z_DeleteResultSetRequest *req =
@@ -3262,12 +3210,12 @@ static Z_APDU *process_deleteRequest(association *assoc, request *reqb,
                 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++)
@@ -3297,7 +3245,8 @@ static Z_APDU *process_deleteRequest(association *assoc, request *reqb,
                 (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]);
         }
@@ -3367,7 +3316,7 @@ static Z_APDU *process_segmentRequest(association *assoc, request *reqb)
     return 0;
 }
 
-static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd)
+static Z_APDU *process_ESRequest(association *assoc, request *reqb)
 {
     bend_esrequest_rr esrequest;
     const char *ext_name = "unknown";
@@ -3387,7 +3336,6 @@ static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd)
     esrequest.association = assoc;
     esrequest.taskPackage = 0;
     esrequest.referenceId = req->referenceId;
-
     
     if (esrequest.esr && esrequest.esr->taskSpecificParameters)
     {