+ if (diagrecs_p)
+ {
+#ifdef ASN_COMPILED
+ ents->num_nonsurrogateDiagnostics = diagrecs_p->num_diagRecs;
+ ents->nonsurrogateDiagnostics = diagrecs_p->diagRecs;
+#else
+ ents->u.nonSurrogateDiagnostics = diagrecs_p;
+ ents->which = Z_ListEntries_nonSurrogateDiagnostics;
+#endif
+ }
+ return apdu;
+}
+
+static Z_APDU *process_sortRequest(association *assoc, request *reqb,
+ int *fd)
+{
+ Z_SortRequest *req = reqb->request->u.sortRequest;
+ Z_SortResponse *res = (Z_SortResponse *)odr_malloc (assoc->encode, sizeof(*res));
+ bend_sort_rr *bsrr = (bend_sort_rr *)odr_malloc (assoc->encode, sizeof(*bsrr));
+
+ Z_APDU *apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu));
+
+ logf(LOG_LOG, "Got SortRequest.");
+
+#ifdef ASN_COMPILED
+ bsrr->num_input_setnames = req->num_inputResultSetNames;
+ bsrr->input_setnames = req->inputResultSetNames;
+#else
+ bsrr->num_input_setnames = req->inputResultSetNames->num_strings;
+ bsrr->input_setnames = req->inputResultSetNames->strings;
+#endif
+ bsrr->output_setname = req->sortedResultSetName;
+ bsrr->sort_sequence = req->sortSequence;
+ bsrr->stream = assoc->encode;
+
+ bsrr->sort_status = Z_SortStatus_failure;
+ bsrr->errcode = 0;
+ bsrr->errstring = 0;
+
+ ((int (*)(void *, bend_sort_rr *))(*assoc->bend_sort))(assoc->backend, bsrr);
+
+ res->referenceId = req->referenceId;
+ res->sortStatus = (int *)odr_malloc (assoc->encode, sizeof(*res->sortStatus));
+ *res->sortStatus = bsrr->sort_status;
+ res->resultSetStatus = 0;
+ if (bsrr->errcode)
+ {
+ Z_DiagRecs *dr = diagrecs (assoc, bsrr->errcode, bsrr->errstring);
+#ifdef ASN_COMPILED
+ res->diagnostics = dr->diagRecs;
+ res->num_diagnostics = dr->num_diagRecs;
+#else
+ res->diagnostics = dr;
+#endif
+ }
+ else
+ {
+#ifdef ASN_COMPILED
+ res->num_diagnostics = 0;
+#endif
+ res->diagnostics = 0;
+ }
+ res->otherInfo = 0;
+
+ apdu->which = Z_APDU_sortResponse;
+ apdu->u.sortResponse = res;
+ return apdu;
+}
+
+static Z_APDU *process_deleteRequest(association *assoc, request *reqb,
+ int *fd)
+{
+ Z_DeleteResultSetRequest *req = reqb->request->u.deleteResultSetRequest;
+ Z_DeleteResultSetResponse *res = (Z_DeleteResultSetResponse *)
+ odr_malloc (assoc->encode, sizeof(*res));
+ bend_delete_rr *bdrr = (bend_delete_rr *)
+ odr_malloc (assoc->encode, sizeof(*bdrr));
+ Z_APDU *apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu));
+
+ logf(LOG_LOG, "Got DeleteRequest.");
+
+ bdrr->num_setnames = req->num_resultSetList;
+ bdrr->setnames = req->resultSetList;
+ bdrr->stream = assoc->encode;
+ bdrr->function = *req->deleteFunction;
+
+ ((int (*)(void *, bend_delete_rr *))
+ (*assoc->bend_delete))(assoc->backend, bdrr);
+
+ res->referenceId = req->referenceId;
+
+ res->deleteOperationStatus = (int *)
+ odr_malloc (assoc->encode, sizeof(*res->deleteOperationStatus));
+ *res->deleteOperationStatus = bdrr->delete_status;
+
+ res->deleteListStatuses = 0;
+ res->numberNotDeleted = 0;
+ res->bulkStatuses = 0;
+ res->deleteMessage = 0;
+ res->otherInfo = 0;
+
+ apdu->which = Z_APDU_deleteResultSetResponse;
+ apdu->u.deleteResultSetResponse = res;
+ return apdu;
+}
+
+static void process_close(association *assoc, request *reqb)
+{
+ Z_Close *req = reqb->request->u.close;
+ static char *reasons[] =
+ {
+ "finished",
+ "shutdown",
+ "systemProblem",
+ "costLimit",
+ "resources",
+ "securityViolation",
+ "protocolError",
+ "lackOfActivity",
+ "peerAbort",
+ "unspecified"
+ };
+
+ logf(LOG_LOG, "Got Close, reason %s, message %s",
+ reasons[*req->closeReason], req->diagnosticInformation ?
+ req->diagnosticInformation : "NULL");
+ if (assoc->version < 3) /* to make do_force respond with close */
+ assoc->version = 3;
+ do_close_req(assoc, Z_Close_finished, "Association terminated by client",
+ reqb);
+}
+
+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_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)
+{
+ return process_request (a, req);
+}
+
+void bend_request_setdata(bend_request r, void *p)
+{
+ r->clientData = p;
+}
+
+void *bend_request_getdata(bend_request r)
+{
+ return r->clientData;
+}
+
+/* Chas: Added in from DALI */
+static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd)
+{
+ bend_esrequest_rr esrequest;
+
+ Z_ExtendedServicesRequest *req = reqb->request->u.extendedServicesRequest;
+ Z_APDU *apdu = zget_APDU(assoc->encode, Z_APDU_extendedServicesResponse);
+
+ Z_ExtendedServicesResponse *resp = apdu->u.extendedServicesResponse;
+
+ logf(LOG_DEBUG,"inside Process esRequest");
+
+ esrequest.esr = reqb->request->u.extendedServicesRequest;
+ esrequest.stream = assoc->encode;
+ esrequest.errcode = 0;
+ esrequest.errstring = NULL;
+ esrequest.request = reqb;
+ esrequest.association = assoc;
+
+ ((int (*)(void *, bend_esrequest_rr *))(*assoc->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 == 0 )
+ {
+ /* Backend service indicates request will be processed */
+ logf(LOG_DEBUG,"Request will be processed...Good !");
+ *resp->operationStatus = Z_ExtendedServicesResponse_done;
+ }
+ else
+ {
+ /* Backend indicates error, request will not be processed */
+ logf(LOG_DEBUG,"Request will not be processed...BAD !");
+ *resp->operationStatus = Z_ExtendedServicesResponse_failure;
+ }
+ /* Do something with the members of bend_extendedservice */
+
+ logf(LOG_DEBUG,"Send the result apdu");