Bump copyright year
[yaz-moved-to-github.git] / src / seshigh.c
index 97c9e04..7a52adc 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2008 Index Data
+ * Copyright (C) 1995-2010 Index Data
  * See the file LICENSE for details.
  */
 /**
 
 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);
-void save_referenceId(request *reqb, Z_ReferenceId *refid);
-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;
@@ -120,21 +114,18 @@ 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, " ");    
 }
 
-
 /*
  * Create and initialize a new association-handle.
  *  channel  : iochannel for the current line.
@@ -261,7 +252,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);
 }
 
 
@@ -377,7 +368,7 @@ void ir_session(IOCHAN h, int event)
     {
         if (assoc->state != ASSOC_UP)
         {
-            yaz_log(YLOG_DEBUG, "Final timeout - closing connection.");
+            yaz_log(log_session, "Timeout. Closing connection");
             /* do we need to lod this at all */
             cs_close(conn);
             destroy_association(assoc);
@@ -385,8 +376,7 @@ void ir_session(IOCHAN h, int event)
         }
         else
         {
-            yaz_log(log_sessiondetail, 
-                    "Session idle too long. Sending close.");
+            yaz_log(log_sessiondetail, "Timeout. Sending Z39.50 Close");
             do_close(assoc, Z_Close_lackOfActivity, 0);
         }
         return;
@@ -486,7 +476,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;
@@ -509,6 +499,7 @@ static void assoc_init_reset(association *assoc)
     assoc->init->bend_explain = NULL;
     assoc->init->bend_srw_scan = NULL;
     assoc->init->bend_srw_update = NULL;
+    assoc->init->named_result_sets = 0;
 
     assoc->init->charneg_request = NULL;
     assoc->init->charneg_response = NULL;
@@ -664,7 +655,6 @@ static int retrieve_fetch(association *assoc, bend_fetch_rr *rr)
         rr->output_format = match_syntax;
     if (match_schema)
         rr->schema = odr_strdup(rr->stream, match_schema);
-    return 0;
 #else
     (*assoc->init->bend_fetch)(assoc->backend, rr);
 #endif
@@ -829,13 +819,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 */
     }
@@ -848,9 +840,10 @@ static int ccl2pqf(ODR odr, const Odr_oct *ccl, CCL_bibset bibset,
 
 static void srw_bend_search(association *assoc, request *req,
                             Z_SRW_PDU *sr,
-                            Z_SRW_searchRetrieveResponse *srw_res,
+                            Z_SRW_PDU *res,
                             int *http_code)
 {
+    Z_SRW_searchRetrieveResponse *srw_res = res->u.response;
     int srw_error = 0;
     Z_External *ext;
     Z_SRW_searchRetrieveRequest *srw_req = sr->u.request;
@@ -873,6 +866,8 @@ static void srw_bend_search(association *assoc, request *req,
         rr.partial_resultset = 0;
         rr.query = (Z_Query *) odr_malloc(assoc->decode, sizeof(*rr.query));
         rr.query->u.type_1 = 0;
+        rr.extra_args = sr->extra_args;
+        rr.extra_response_data = 0;
         
         if (srw_req->query_type == Z_SRW_query_type_cql)
         {
@@ -939,12 +934,10 @@ static void srw_bend_search(association *assoc, request *req,
             rr.stream = assoc->encode;
             rr.decode = assoc->decode;
             rr.print = assoc->print;
-            rr.request = req;
             if ( srw_req->sort.sortKeys )
                 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;
@@ -972,7 +965,8 @@ static void srw_bend_search(association *assoc, request *req,
                 int number = srw_req->maximumRecords ? *srw_req->maximumRecords : 0;
                 int start = srw_req->startRecord ? *srw_req->startRecord : 1;
                 
-                yaz_log(log_requestdetail, "Request to pack %d+%d out of %d",
+                yaz_log(log_requestdetail, "Request to pack %d+%d out of "
+                        ODR_INT_PRINTF,
                         start, number, rr.hits);
                 
                 srw_res->numberOfRecords = odr_intdup(assoc->encode, rr.hits);
@@ -1025,14 +1019,11 @@ static void srw_bend_search(association *assoc, request *req,
                         bprr->stream = assoc->encode;
                         bprr->referenceId = 0;
                         bprr->print = assoc->print;
-                        bprr->request = req;
                         bprr->association = assoc;
                         bprr->errcode = 0;
                         bprr->errstring = NULL;
                         (*assoc->init->bend_present)(assoc->backend, bprr);
                         
-                        if (!bprr->request)
-                            return;
                         if (bprr->errcode)
                         {
                             srw_error = yaz_diag_bib1_to_srw(bprr->errcode);
@@ -1093,6 +1084,11 @@ static void srw_bend_search(association *assoc, request *req,
                             srw_res->records = 0;
                     }
                 }
+                if (rr.extra_response_data)
+                {
+                    res->extraResponseData_buf = rr.extra_response_data;
+                    res->extraResponseData_len = strlen(rr.extra_response_data);
+                }
                 if (rr.estimated_hit_count || rr.partial_resultset)
                 {
                     yaz_add_srw_diagnostic(
@@ -1129,11 +1125,11 @@ static void srw_bend_search(association *assoc, request *req,
             wrbuf_printf(wr, "ERROR info:http/%d", *http_code);
         else if (srw_res->numberOfRecords)
         {
-            wrbuf_printf(wr, "OK %d",
+            wrbuf_printf(wr, "OK " ODR_INT_PRINTF,
                          (srw_res->numberOfRecords ?
                           *srw_res->numberOfRecords : 0));
         }
-        wrbuf_printf(wr, " %s %d+%d", 
+        wrbuf_printf(wr, " %s " ODR_INT_PRINTF " +%d", 
                      (srw_res->resultSetId ?
                       srw_res->resultSetId : "-"),
                      (srw_req->startRecord ? *srw_req->startRecord : 1), 
@@ -1401,7 +1397,7 @@ static void srw_bend_scan(association *assoc, request *req,
         else
             wrbuf_printf(wr, "OK - - ");
 
-        wrbuf_printf(wr, "%d+%d+0 ",
+        wrbuf_printf(wr, ODR_INT_PRINTF "+" ODR_INT_PRINTF " ",
                      (srw_req->responsePosition ? 
                       *srw_req->responsePosition : 1),
                      (srw_req->maximumTerms ?
@@ -1657,7 +1653,7 @@ static int check_path(const char *path)
     return 1;
 }
 
-static char *read_file(const char *fname, ODR o, int *sz)
+static char *read_file(const char *fname, ODR o, size_t *sz)
 {
     char *buf;
     FILE *inf = fopen(fname, "rb");
@@ -1690,6 +1686,7 @@ static void process_http_request(association *assoc, request *req)
     int num_diagnostic = 0;
     const char *host = z_HTTP_header_lookup(hreq->headers, "Host");
 
+    yaz_log(log_request, "%s %s HTTP/%s", hreq->method, hreq->path, hreq->version);
     if (!control_association(assoc, host, 0))
     {
         p = z_get_HTTP_Response(o, 404);
@@ -1710,7 +1707,7 @@ static void process_http_request(association *assoc, request *req)
         }
         else
         {
-            int content_size = 0;
+            size_t content_size = 0;
             char *content_buf = read_file(hreq->path+1, o, &content_size);
             if (!content_buf)
             {
@@ -1782,8 +1779,7 @@ static void process_http_request(association *assoc, request *req)
             }
             else
             {
-                srw_bend_search(assoc, req, sr, res->u.response, 
-                                &http_code);
+                srw_bend_search(assoc, req, sr, res, &http_code);
             }
             if (http_code == 200)
                 soap_package->u.generic->p = res;
@@ -1947,7 +1943,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;
     
@@ -1963,12 +1958,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";
@@ -1977,7 +1972,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";
@@ -1986,7 +1981,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";
@@ -1998,7 +1993,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";
@@ -2027,69 +2022,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)
@@ -2198,6 +2139,10 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb)
             assoc->init->charneg_request = negotiation;
     }
 
+    /* by default named_result_sets is 0 .. Enable it if client asks for it. */
+    if (ODR_MASK_GET(req->options, Z_Options_namedResultSets))
+        assoc->init->named_result_sets = 1;
+
     assoc->backend = 0;
     if (cb)
     {
@@ -2264,7 +2209,8 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb)
         ODR_MASK_SET(resp->options, Z_Options_extendedServices);
         strcat(options, " extendedServices");
     }
-    if (ODR_MASK_GET(req->options, Z_Options_namedResultSets))
+    if (ODR_MASK_GET(req->options, Z_Options_namedResultSets)
+        && assoc->init->named_result_sets)
     {
         ODR_MASK_SET(resp->options, Z_Options_namedResultSets);
         strcat(options, " namedresults");
@@ -2358,6 +2304,9 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb)
                              binitres->errstring);
         *resp->result = 0;
     }
+    else
+        assoc->state = ASSOC_UP;
+    
     if (log_request)
     {
         if (!req->idAuthentication)
@@ -2452,9 +2401,9 @@ static Z_NamePlusRecord *surrogatediagrec(association *assoc,
     return zget_surrogateDiagRec(assoc->encode, dbname, error, addinfo);
 }
 
-static Z_Records *pack_records(association *a, char *setname, int start,
-                               int *num, Z_RecordComposition *comp,
-                               int *next, int *pres,
+static Z_Records *pack_records(association *a, char *setname, Odr_int start,
+                               Odr_int *num, Z_RecordComposition *comp,
+                               Odr_int *next, Odr_int *pres,
                                Z_ReferenceId *referenceId,
                                Odr_oid *oid, int *errcode)
 {
@@ -2474,8 +2423,9 @@ static Z_Records *pack_records(association *a, char *setname, int start,
     *num = 0;
     *next = 0;
 
-    yaz_log(log_requestdetail, "Request to pack %d+%d %s", start, toget, setname);
-    yaz_log(log_requestdetail, "pms=%d, mrs=%d", a->preferredMessageSize,
+    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,
         a->maximumRecordSize);
     for (recno = start; reclist->num_records < toget; recno++)
     {
@@ -2520,7 +2470,7 @@ static Z_Records *pack_records(association *a, char *setname, 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)
@@ -2570,7 +2520,8 @@ static Z_Records *pack_records(association *a, char *setname, int start,
             }
             else /* too big entirely */
             {
-                yaz_log(log_requestdetail, "Record > maxrcdsz this=%d max=%d",
+                yaz_log(log_requestdetail, "Record > maxrcdsz "
+                        "this=%d max=" ODR_INT_PRINTF,
                         this_length, a->maximumRecordSize);
                 reclist->records[reclist->num_records] =
                     surrogatediagrec(a, freq.basename, 17, 0);
@@ -2599,24 +2550,22 @@ static Z_Records *pack_records(association *a, char *setname, 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->request = reqb;
     bsrr->association = assoc;
     bsrr->referenceId = req->referenceId;
-    save_referenceId (reqb, bsrr->referenceId);
     bsrr->srw_sortKeys = 0;
     bsrr->srw_setname = 0;
     bsrr->srw_setnameIdleTime = 0;
     bsrr->estimated_hit_count = 0;
     bsrr->partial_resultset = 0;
+    bsrr->extra_args = 0;
+    bsrr->extra_response_data = 0;
 
     yaz_log (log_requestdetail, "ResultSet '%s'", req->resultSetName);
     if (req->databaseNames)
@@ -2669,19 +2618,15 @@ static Z_APDU *process_searchRequest(association *assoc, request *reqb,
 
         if (!bsrr->errcode)
             (assoc->init->bend_search)(assoc->backend, bsrr);
-        if (!bsrr->request)  /* backend not ready with the search response */
-            return 0;  /* should not be used any more */
     }
     else
     { 
         /* 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
@@ -2690,15 +2635,15 @@ 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));
     Z_SearchResponse *resp = (Z_SearchResponse *)
         odr_malloc(assoc->encode, sizeof(*resp));
-    int *nulint = odr_intdup(assoc->encode, 0);
-    int *next = odr_intdup(assoc->encode, 0);
-    int *none = odr_intdup(assoc->encode, Z_SearchResponse_none);
+    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;
 
     apdu->which = Z_APDU_searchResponse;
@@ -2706,8 +2651,7 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb,
     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;
@@ -2718,24 +2662,26 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb,
         resp->resultCount = nulint;
         resp->numberOfRecordsReturned = nulint;
         resp->nextResultSetPosition = nulint;
-        resp->searchStatus = nulint;
+        resp->searchStatus = odr_booldup(assoc->encode, 0);
         resp->resultSetStatus = none;
         resp->presentStatus = 0;
     }
     else
     {
-        bool_t *sr = odr_intdup(assoc->encode, 1);
-        int *toget = odr_intdup(assoc->encode, 0);
+        bool_t *sr = odr_booldup(assoc->encode, 1);
+        Odr_int *toget = odr_intdup(assoc->encode, 0);
         Z_RecordComposition comp, *compp = 0;
 
-        yaz_log(log_requestdetail, "resultCount: %d", bsrt->hits);
+        yaz_log(log_requestdetail, "resultCount: " ODR_INT_PRINTF, bsrt->hits);
 
         resp->records = 0;
         resp->resultCount = &bsrt->hits;
 
         comp.which = Z_RecordComp_simple;
         /* how many records does the user agent want, then? */
-        if (bsrt->hits <= *req->smallSetUpperBound)
+        if (bsrt->hits < 0)
+            *toget = 0;
+        else if (bsrt->hits <= *req->smallSetUpperBound)
         {
             *toget = bsrt->hits;
             if ((comp.u.simple = req->smallSetElementSetNames))
@@ -2754,7 +2700,7 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb,
 
         if (*toget && !resp->records)
         {
-            int *presst = odr_intdup(assoc->encode, 0);
+            Odr_int *presst = odr_intdup(assoc->encode, 0);
             /* Call bend_present if defined */
             if (assoc->init->bend_present)
             {
@@ -2768,14 +2714,11 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb,
                 bprr->referenceId = req->referenceId;
                 bprr->stream = assoc->encode;
                 bprr->print = assoc->print;
-                bprr->request = reqb;
                 bprr->association = assoc;
                 bprr->errcode = 0;
                 bprr->errstring = NULL;
                 (*assoc->init->bend_present)(assoc->backend, bprr);
 
-                if (!bprr->request)
-                    return 0;
                 if (bprr->errcode)
                 {
                     resp->records = diagrec(assoc, bprr->errcode, bprr->errstring);
@@ -2822,7 +2765,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]);
@@ -2832,7 +2776,7 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb,
         if (bsrt->errcode)
             wrbuf_printf(wr, "ERROR %d", bsrt->errcode);
         else
-            wrbuf_printf(wr, "OK %d", bsrt->hits);
+            wrbuf_printf(wr, "OK " ODR_INT_PRINTF, bsrt->hits);
         wrbuf_printf(wr, " %s 1+%d ",
                      req->resultSetName, returnedrecs);
         yaz_query_to_wrbuf(wr, req->query);
@@ -2858,14 +2802,13 @@ 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;
     Z_PresentResponse *resp;
-    int *next;
-    int *num;
+    Odr_int *next;
+    Odr_int *num;
     int errcode = 0;
     const char *errstring = 0;
 
@@ -2886,14 +2829,11 @@ static Z_APDU *process_presentRequest(association *assoc, request *reqb,
         bprr->referenceId = req->referenceId;
         bprr->stream = assoc->encode;
         bprr->print = assoc->print;
-        bprr->request = reqb;
         bprr->association = assoc;
         bprr->errcode = 0;
         bprr->errstring = NULL;
         (*assoc->init->bend_present)(assoc->backend, bprr);
         
-        if (!bprr->request)
-            return 0; /* should not happen */
         if (bprr->errcode)
         {
             resp->records = diagrec(assoc, bprr->errcode, bprr->errstring);
@@ -2931,9 +2871,10 @@ static Z_APDU *process_presentRequest(association *assoc, request *reqb,
         else if (*resp->presentStatus == Z_PresentStatus_success)
             wrbuf_printf(wr, "OK -  ");
         else
-            wrbuf_printf(wr, "Partial %d - ", *resp->presentStatus);
+            wrbuf_printf(wr, "Partial " ODR_INT_PRINTF " - ",
+                         *resp->presentStatus);
 
-        wrbuf_printf(wr, " %s %d+%d ",
+        wrbuf_printf(wr, " %s " ODR_INT_PRINTF "+" ODR_INT_PRINTF " ",
                 req->resultSetId, *req->resultSetStartPoint,
                 *req->numberOfRecordsRequested);
         yaz_log(log_request, "%s", wrbuf_cstr(wr) );
@@ -2951,14 +2892,14 @@ 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));
     Z_ScanResponse *res = (Z_ScanResponse *)
         odr_malloc(assoc->encode, sizeof(*res));
-    int *scanStatus = odr_intdup(assoc->encode, Z_Scan_failure);
-    int *numberOfEntriesReturned = odr_intdup(assoc->encode, 0);
+    Odr_int *scanStatus = odr_intdup(assoc->encode, Z_Scan_failure);
+    Odr_int *numberOfEntriesReturned = odr_intdup(assoc->encode, 0);
     Z_ListEntries *ents = (Z_ListEntries *)
         odr_malloc(assoc->encode, sizeof(*ents));
     Z_DiagRecs *diagrecs_p = NULL;
@@ -3056,7 +2997,8 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd)
             *scanStatus = Z_Scan_success;
         ents->entries = tab;
         ents->num_entries = bsrr->num_entries;
-        res->numberOfEntriesReturned = &ents->num_entries;          
+        res->numberOfEntriesReturned = odr_intdup(assoc->encode, 
+                                                   ents->num_entries);
         res->positionOfTerm = &bsrr->term_position;
         for (i = 0; i < bsrr->num_entries; i++)
         {
@@ -3095,7 +3037,7 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd)
                     odr_malloc(assoc->encode, o->len = o->size =
                                strlen(bsrr->entries[i].term));
                 memcpy(o->buf, bsrr->entries[i].term, o->len);
-                yaz_log(YLOG_DEBUG, "  term #%d: '%s' (%d)", i,
+                yaz_log(YLOG_DEBUG, "  term #%d: '%s' (" ODR_INT_PRINTF ")", i,
                          bsrr->entries[i].term, bsrr->entries[i].occurrences);
             }
             else
@@ -3134,7 +3076,8 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd)
         else
             wrbuf_printf(wr, "OK"); 
 
-        wrbuf_printf(wr, " %d - %d+%d+%d",
+        wrbuf_printf(wr, " " ODR_INT_PRINTF " - " ODR_INT_PRINTF "+" 
+                     ODR_INT_PRINTF "+" ODR_INT_PRINTF,
                      res->numberOfEntriesReturned ?
                      *res->numberOfEntriesReturned : 0,
                      (req->preferredPositionInResponse ?
@@ -3154,8 +3097,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;
@@ -3231,8 +3173,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 =
@@ -3257,7 +3198,7 @@ static Z_APDU *process_deleteRequest(association *assoc, request *reqb,
     bdrr->statuses = 0;
     if (bdrr->num_setnames > 0)
     {
-        bdrr->statuses = (int*) 
+        bdrr->statuses = (Odr_int*) 
             odr_malloc(assoc->encode, sizeof(*bdrr->statuses) *
                        bdrr->num_setnames);
         for (i = 0; i < bdrr->num_setnames; i++)
@@ -3342,72 +3283,6 @@ static void process_close(association *assoc, request *reqb)
     yaz_log(log_request,"Close OK");
 }
 
-void save_referenceId(request *reqb, Z_ReferenceId *refid)
-{
-    if (refid)
-    {
-        reqb->len_refid = refid->len;
-        reqb->refid = (char *)nmem_malloc(reqb->request_mem, refid->len);
-        memcpy(reqb->refid, refid->buf, refid->len);
-    }
-    else
-    {
-        reqb->len_refid = 0;
-        reqb->refid = NULL;
-    }
-}
-
-void bend_request_send(bend_association a, bend_request req, Z_APDU *res)
-{
-    process_z_response(a, req, res);
-}
-
-bend_request bend_request_mk(bend_association a)
-{
-    request *nreq = request_get(&a->outgoing);
-    nreq->request_mem = nmem_create();
-    return nreq;
-}
-
-Z_ReferenceId *bend_request_getid(ODR odr, bend_request req)
-{
-    Z_ReferenceId *id;
-    if (!req->refid)
-        return 0;
-    id = (Odr_oct *)odr_malloc(odr, sizeof(*odr));
-    id->buf = (unsigned char *)odr_malloc(odr, req->len_refid);
-    id->len = id->size = req->len_refid;
-    memcpy(id->buf, req->refid, req->len_refid);
-    return id;
-}
-
-void bend_request_destroy(bend_request *req)
-{
-    nmem_destroy((*req)->request_mem);
-    request_release(*req);
-    *req = NULL;
-}
-
-int bend_backend_respond(bend_association a, bend_request req)
-{
-    char *msg;
-    int r;
-    r = process_z_request(a, req, &msg);
-    if (r < 0)
-        yaz_log(YLOG_WARN, "%s", msg);
-    return r;
-}
-
-void bend_request_setdata(bend_request r, void *p)
-{
-    r->clientData = p;
-}
-
-void *bend_request_getdata(bend_request r)
-{
-    return r->clientData;
-}
-
 static Z_APDU *process_segmentRequest(association *assoc, request *reqb)
 {
     bend_segment_rr req;
@@ -3423,7 +3298,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";
@@ -3440,11 +3315,9 @@ static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd)
     esrequest.print = assoc->print;
     esrequest.errcode = 0;
     esrequest.errstring = NULL;
-    esrequest.request = reqb;
     esrequest.association = assoc;
     esrequest.taskPackage = 0;
     esrequest.referenceId = req->referenceId;
-
     
     if (esrequest.esr && esrequest.esr->taskSpecificParameters)
     {
@@ -3464,10 +3337,6 @@ static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd)
 
     (*assoc->init->bend_esrequest)(assoc->backend, &esrequest);
     
-    /* If the response is being delayed, return NULL */
-    if (esrequest.request == NULL)
-        return(NULL);
-
     resp->referenceId = req->referenceId;
 
     if (esrequest.errcode == -1)
@@ -3524,6 +3393,7 @@ int bend_assoc_is_alive(bend_association assoc)
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab