+static void display_records(Z_Records *p)
+{
+ int i;
+
+ if (p->which == Z_Records_NSD)
+ {
+ Z_DiagRec dr, *dr_p = &dr;
+ dr.which = Z_DiagRec_defaultFormat;
+ dr.u.defaultFormat = p->u.nonSurrogateDiagnostic;
+ display_diagrecs (&dr_p, 1);
+ }
+ else if (p->which == Z_Records_multipleNSD)
+ display_diagrecs (p->u.multipleNonSurDiagnostics->diagRecs,
+ p->u.multipleNonSurDiagnostics->num_diagRecs);
+ else
+ {
+ printf("Records: %d\n", p->u.databaseOrSurDiagnostics->num_records);
+ for (i = 0; i < p->u.databaseOrSurDiagnostics->num_records; i++)
+ display_nameplusrecord(p->u.databaseOrSurDiagnostics->records[i]);
+ }
+}
+
+static int send_deleteResultSetRequest(const char *arg)
+{
+ char names[8][32];
+ int i;
+
+ Z_APDU *apdu = zget_APDU(out, Z_APDU_deleteResultSetRequest);
+ Z_DeleteResultSetRequest *req = apdu->u.deleteResultSetRequest;
+
+ req->referenceId = set_refid (out);
+
+ req->num_resultSetList =
+ sscanf (arg, "%30s %30s %30s %30s %30s %30s %30s %30s",
+ names[0], names[1], names[2], names[3],
+ names[4], names[5], names[6], names[7]);
+
+ req->deleteFunction = (int *)
+ odr_malloc (out, sizeof(*req->deleteFunction));
+ if (req->num_resultSetList > 0)
+ {
+ *req->deleteFunction = Z_DeleteResultSetRequest_list;
+ req->resultSetList = (char **)
+ odr_malloc (out, sizeof(*req->resultSetList)*
+ req->num_resultSetList);
+ for (i = 0; i<req->num_resultSetList; i++)
+ req->resultSetList[i] = names[i];
+ }
+ else
+ {
+ *req->deleteFunction = Z_DeleteResultSetRequest_all;
+ req->resultSetList = 0;
+ }
+
+ send_apdu(apdu);
+ printf("Sent deleteResultSetRequest.\n");
+ return 2;
+}
+
+#if HAVE_XML2
+static int send_srw(Z_SRW_PDU *sr)
+{
+ const char *charset = negotiationCharset;
+ const char *host_port = cur_host;
+ char *path = 0;
+ char ctype[50];
+ Z_SOAP_Handler h[2] = {
+ {"http://www.loc.gov/zing/srw/", 0, (Z_SOAP_fun) yaz_srw_codec},
+ {0, 0, 0}
+ };
+ ODR o = odr_createmem(ODR_ENCODE);
+ int ret;
+ Z_SOAP *p = odr_malloc(o, sizeof(*p));
+ Z_GDU *gdu;
+
+ path = odr_malloc(out, strlen(databaseNames[0])+2);
+ *path = '/';
+ strcpy(path+1, databaseNames[0]);
+
+ gdu = z_get_HTTP_Request(out);
+ gdu->u.HTTP_Request->version = http_version;
+ gdu->u.HTTP_Request->path = odr_strdup(out, path);
+
+ if (host_port)
+ {
+ const char *cp0 = strstr(host_port, "://");
+ const char *cp1 = 0;
+ if (cp0)
+ cp0 = cp0+3;
+ else
+ cp0 = host_port;
+
+ cp1 = strchr(cp0, '/');
+ if (!cp1)
+ cp1 = cp0+strlen(cp0);
+
+ if (cp0 && cp1)
+ {
+ char *h = odr_malloc(out, cp1 - cp0 + 1);
+ memcpy (h, cp0, cp1 - cp0);
+ h[cp1-cp0] = '\0';
+ z_HTTP_header_add(out, &gdu->u.HTTP_Request->headers,
+ "Host", h);
+ }
+ }
+
+ strcpy(ctype, "text/xml");
+ if (charset && strlen(charset) < 20)
+ {
+ strcat(ctype, "; charset=");
+ strcat(ctype, charset);
+ }
+ z_HTTP_header_add(out, &gdu->u.HTTP_Request->headers,
+ "Content-Type", ctype);
+ z_HTTP_header_add(out, &gdu->u.HTTP_Request->headers,
+ "SOAPAction", "\"\"");
+ p->which = Z_SOAP_generic;
+ p->u.generic = odr_malloc(o, sizeof(*p->u.generic));
+ p->u.generic->no = 0;
+ p->u.generic->ns = 0;
+ p->u.generic->p = sr;
+ p->ns = "http://schemas.xmlsoap.org/soap/envelope/";
+
+ ret = z_soap_codec_enc(o, &p,
+ &gdu->u.HTTP_Request->content_buf,
+ &gdu->u.HTTP_Request->content_len, h,
+ charset);
+
+ if (z_GDU(out, &gdu, 0, 0))
+ {
+ /* encode OK */
+ char *buf_out;
+ int len_out;
+ int r;
+ if (apdu_file)
+ {
+ if (!z_GDU(print, &gdu, 0, 0))
+ printf ("Failed to print outgoing APDU\n");
+ odr_reset(print);
+ }
+ buf_out = odr_getbuf(out, &len_out, 0);
+
+ /* we don't odr_reset(out), since we may need the buffer again */
+
+ do_hex_dump(buf_out, len_out);
+
+ r = cs_put(conn, buf_out, len_out);
+
+ odr_destroy(o);
+
+ if (r >= 0)
+ return 2;
+ }
+ return 0;
+}
+#endif
+
+#if HAVE_XML2
+static char *encode_SRW_term(ODR o, const char *q)
+{
+ const char *in_charset = "ISO-8859-1";
+ WRBUF w = wrbuf_alloc();
+ yaz_iconv_t cd;
+ char *res;
+ if (outputCharset)
+ in_charset = outputCharset;
+ cd = yaz_iconv_open("UTF-8", in_charset);
+ if (!cd)
+ {
+ wrbuf_free(w, 1);
+ return odr_strdup(o, q);
+ }
+ wrbuf_iconv_write(w, cd, q, strlen(q));
+ if (wrbuf_len(w))
+ {
+ int len = wrbuf_len(w);
+ res = odr_strdupn(o, wrbuf_buf(w), len);
+ }
+ else
+ res = odr_strdup(o, q);
+ yaz_iconv_close(cd);
+ wrbuf_free(w, 1);
+ return res;
+}
+
+
+static int send_SRW_scanRequest(const char *arg, int pos, int num)