* Copyright (c) 1995-2003, Index Data
* See the file LICENSE for details.
*
- * $Id: client.c,v 1.209 2003-10-17 14:13:59 adam Exp $
+ * $Id: client.c,v 1.212 2003-11-02 17:59:28 adam Exp $
*/
#include <stdio.h>
static char *last_open_command = NULL;
static int auto_reconnect = 0;
+static char cur_host[200];
+
typedef enum {
QueryType_Prefix,
QueryType_CCL,
printf("Sent initrequest.\n");
}
+
+/* These two are used only from process_initResponse() */
+static void render_initUserInfo(Z_OtherInformation *ui1);
+static void render_diag(Z_DiagnosticFormat *diag);
+
static int process_initResponse(Z_InitResponse *res)
{
int ver = 0;
if (res->userInformationField)
{
Z_External *uif = res->userInformationField;
- printf("UserInformationfield:\n");
- if (!z_External(print, (Z_External**)&uif, 0, 0))
- {
- odr_perror(print, "Printing userinfo\n");
- odr_reset(print);
- }
- if (uif->which == Z_External_octet)
- {
- printf("Guessing visiblestring:\n");
- printf("'%s'\n", uif->u. octet_aligned->buf);
- } else if (uif->which == Z_External_single) {
- /* Peek at any private Init-diagnostic APDUs */
- Odr_any *sat = uif->u.single_ASN1_type;
- printf("### NAUGHTY: External is '%s'\n", sat->buf);
+ if (uif->which == Z_External_userInfo1) {
+ render_initUserInfo(uif->u.userInfo1);
+ } else {
+ printf("UserInformationfield:\n");
+ if (!z_External(print, (Z_External**)&uif, 0, 0)) {
+ odr_perror(print, "Printing userinfo\n");
+ odr_reset(print);
+ }
+ if (uif->which == Z_External_octet) {
+ printf("Guessing visiblestring:\n");
+ printf("'%s'\n", uif->u. octet_aligned->buf);
+ } else if (uif->which == Z_External_single) {
+ /* Peek at any private Init-diagnostic APDUs */
+ Odr_any *sat = uif->u.single_ASN1_type;
+ printf("### NAUGHTY: External is '%s'\n", sat->buf);
+ }
+ odr_reset (print);
}
- odr_reset (print);
}
printf ("Options:");
if (ODR_MASK_GET(res->options, Z_Options_search))
return 0;
}
+
+static void render_initUserInfo(Z_OtherInformation *ui1) {
+ int i;
+ printf("Init response contains %d otherInfo unit%s:\n",
+ ui1->num_elements, ui1->num_elements == 1 ? "" : "s");
+
+ for (i = 0; i < ui1->num_elements; i++) {
+ Z_OtherInformationUnit *unit = ui1->list[i];
+ printf(" %d: otherInfo unit contains ", i+1);
+ if (unit->which == Z_OtherInfo_externallyDefinedInfo &&
+ unit->information.externallyDefinedInfo->which ==
+ Z_External_diag1) {
+ render_diag(unit->information.externallyDefinedInfo->u.diag1);
+ } else {
+ printf("unsupported otherInfo unit type %d\n", unit->which);
+ }
+ }
+}
+
+
+/* ### should this share code with display_diagrecs()? */
+static void render_diag(Z_DiagnosticFormat *diag) {
+ int i;
+
+ printf("%d diagnostic%s:\n", diag->num, diag->num == 1 ? "" : "s");
+ for (i = 0; i < diag->num; i++) {
+ Z_DiagnosticFormat_s *ds = diag->elements[i];
+ printf(" %d: ", i+1);
+ switch (ds->which) {
+ case Z_DiagnosticFormat_s_defaultDiagRec: {
+ Z_DefaultDiagFormat *dd = ds->u.defaultDiagRec;
+ /* ### should check `dd->diagnosticSetId' */
+ printf("code=%d (%s)", *dd->condition,
+ diagbib1_str(*dd->condition));
+ /* Both types of addinfo are the same, so use type-pun */
+ if (dd->u.v2Addinfo != 0)
+ printf(",\n\taddinfo='%s'", dd->u.v2Addinfo);
+ break;
+ }
+ case Z_DiagnosticFormat_s_explicitDiagnostic:
+ printf("Explicit diagnostic (not supported)");
+ break;
+ default:
+ printf("Unrecognised diagnostic type %d", ds->which);
+ break;
+ }
+
+ if (ds->message != 0)
+ printf(", message='%s'", ds->message);
+ printf("\n");
+ }
+}
+
+
static int set_base(const char *arg)
{
int i;
int cmd_open(const char *arg)
{
- static char cur_host[200];
if (arg)
{
strncpy (cur_host, arg, sizeof(cur_host)-1);
static int send_srw(Z_SRW_PDU *sr)
{
const char *charset = negotiationCharset;
- const char *host_port = 0;
+ const char *host_port = cur_host;
char *path = 0;
char ctype[50];
Z_SOAP_Handler h[2] = {
memcpy (h, cp0, cp1 - cp0);
h[cp1-cp0] = '\0';
z_HTTP_header_add(out, &gdu->u.HTTP_Request->headers,
- "host", h);
+ "Host", h);
}
}
char *buf_out;
int len_out;
int r;
+ if (apdu_file && !z_GDU(print, &gdu, 0, 0))
+ printf ("Failed to print outgoing APDU\n");
buf_out = odr_getbuf(out, &len_out, 0);
/* we don't odr_reset(out), since we may need the buffer again */