+ assoc->backend = binitres->handle;
+ if ((assoc->init->bend_sort))
+ yaz_log (LOG_DEBUG, "Sort handler installed");
+ if ((assoc->init->bend_search))
+ yaz_log (LOG_DEBUG, "Search handler installed");
+ if ((assoc->init->bend_present))
+ yaz_log (LOG_DEBUG, "Present handler installed");
+ if ((assoc->init->bend_esrequest))
+ yaz_log (LOG_DEBUG, "ESRequest handler installed");
+ if ((assoc->init->bend_delete))
+ yaz_log (LOG_DEBUG, "Delete handler installed");
+ if ((assoc->init->bend_scan))
+ yaz_log (LOG_DEBUG, "Scan handler installed");
+ if ((assoc->init->bend_segment))
+ yaz_log (LOG_DEBUG, "Segment handler installed");
+
+ resp->referenceId = req->referenceId;
+ *options = '\0';
+ /* let's tell the client what we can do */
+ if (ODR_MASK_GET(req->options, Z_Options_search))
+ {
+ ODR_MASK_SET(resp->options, Z_Options_search);
+ strcat(options, "srch");
+ }
+ if (ODR_MASK_GET(req->options, Z_Options_present))
+ {
+ ODR_MASK_SET(resp->options, Z_Options_present);
+ strcat(options, " prst");
+ }
+ if (ODR_MASK_GET(req->options, Z_Options_delSet) &&
+ assoc->init->bend_delete)
+ {
+ ODR_MASK_SET(resp->options, Z_Options_delSet);
+ strcat(options, " del");
+ }
+ if (ODR_MASK_GET(req->options, Z_Options_extendedServices) &&
+ assoc->init->bend_esrequest)
+ {
+ ODR_MASK_SET(resp->options, Z_Options_extendedServices);
+ strcat (options, " extendedServices");
+ }
+ if (ODR_MASK_GET(req->options, Z_Options_namedResultSets))
+ {
+ ODR_MASK_SET(resp->options, Z_Options_namedResultSets);
+ strcat(options, " namedresults");
+ }
+ if (ODR_MASK_GET(req->options, Z_Options_scan) && assoc->init->bend_scan)
+ {
+ ODR_MASK_SET(resp->options, Z_Options_scan);
+ strcat(options, " scan");
+ }
+ if (ODR_MASK_GET(req->options, Z_Options_concurrentOperations))
+ {
+ ODR_MASK_SET(resp->options, Z_Options_concurrentOperations);
+ strcat(options, " concurrop");
+ }
+ if (ODR_MASK_GET(req->options, Z_Options_sort) && assoc->init->bend_sort)
+ {
+ ODR_MASK_SET(resp->options, Z_Options_sort);
+ strcat(options, " sort");
+ }
+
+ if (ODR_MASK_GET(req->options, Z_Options_negotiationModel)
+ && assoc->init->charneg_response)
+ {
+ Z_OtherInformation **p;
+ Z_OtherInformationUnit *p0;
+
+ yaz_oi_APDU(apdu, &p);
+
+ if ((p0=yaz_oi_update(p, assoc->encode, NULL, 0, 0))) {
+ ODR_MASK_SET(resp->options, Z_Options_negotiationModel);
+
+ p0->which = Z_OtherInfo_externallyDefinedInfo;
+ p0->information.externallyDefinedInfo =
+ assoc->init->charneg_response;
+ }
+ ODR_MASK_SET(resp->options, Z_Options_negotiationModel);
+ strcat(options, " negotiation");
+ }
+
+ if (ODR_MASK_GET(req->protocolVersion, Z_ProtocolVersion_1))
+ {
+ ODR_MASK_SET(resp->protocolVersion, Z_ProtocolVersion_1);
+ assoc->version = 2; /* 1 & 2 are equivalent */
+ }
+ if (ODR_MASK_GET(req->protocolVersion, Z_ProtocolVersion_2))
+ {
+ ODR_MASK_SET(resp->protocolVersion, Z_ProtocolVersion_2);
+ assoc->version = 2;
+ }
+ if (ODR_MASK_GET(req->protocolVersion, Z_ProtocolVersion_3))
+ {
+ ODR_MASK_SET(resp->protocolVersion, Z_ProtocolVersion_3);
+ assoc->version = 3;
+ }
+
+ yaz_log(LOG_LOG, "Negotiated to v%d: %s", assoc->version, options);