Added second half of close-handshake
[yaz-moved-to-github.git] / client / client.c
index d82a8ff..e06ad37 100644 (file)
@@ -4,7 +4,13 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: client.c,v $
- * Revision 1.18  1995-08-28 12:21:27  quinn
+ * Revision 1.20  1995-08-29 14:24:13  quinn
+ * Added second half of close-handshake
+ *
+ * Revision 1.19  1995/08/29  11:17:28  quinn
+ * Added code to receive close
+ *
+ * Revision 1.18  1995/08/28  12:21:27  quinn
  * Client can now ask for simple element set names.
  *
  * Revision 1.17  1995/08/17  12:45:02  quinn
@@ -106,6 +112,7 @@ static Z_ElementSetNames *elementSetNames = 0;
 static int setno = 1;                   /* current set offset */
 static int protocol = PROTO_Z3950;      /* current app protocol */
 static int recordsyntax = VAL_USMARC;
+static int sent_close = 0;
 static ODR_MEM session_mem;                /* memory handle for init-response */
 static Z_InitResponse *session = 0;        /* session parameters */
 static char last_scan[512] = "0";
@@ -150,6 +157,7 @@ static void send_initRequest()
 
     ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_1);
     ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_2);
+    ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_3);
 
     req->idAuthentication = auth;
 
@@ -182,7 +190,7 @@ static int process_initResponse(Z_InitResponse *res)
            odr_perror(print, "Printing userinfo\n");
            odr_reset(print);
        }
-       if (res->userInformationField->which == ODR_EXTERNAL_octet)
+       if (res->userInformationField->which == Z_External_octet)
        {
            printf("Guessing visiblestring:\n");
            printf("'%s'\n", res->userInformationField->u. octet_aligned->buf);
@@ -323,7 +331,7 @@ void display_record(Z_DatabaseRecord *p)
            odr_reset(print);
        }
     }
-    if (r->which == ODR_EXTERNAL_octet && p->u.octet_aligned->len)
+    if (r->which == Z_External_octet && p->u.octet_aligned->len)
        marc_display ((char*)p->u.octet_aligned->buf, stdout);
     else if (ent->value == VAL_SUTRS)
     {
@@ -636,6 +644,38 @@ static int send_presentRequest(char *arg)
     return 2;
 }
 
+void process_close(Z_Close *req)
+{
+    Z_APDU *apdu = zget_APDU(out, Z_APDU_close);
+    Z_Close *res = apdu->u.close;
+
+    static char *reasons[] =
+    {
+       "finished",
+       "shutdown",
+       "systemProblem",
+       "costLimit",
+       "resources",
+       "securityViolation",
+       "protocolError",
+       "lackOfActivity",
+       "peerAbort",
+       "unspecified"
+    };
+
+    printf("Reason: %s, message: %s\n", reasons[*req->closeReason],
+       req->diagnosticInformation ? req->diagnosticInformation : "NULL");
+    if (sent_close)
+    {
+       printf("Goodbye.\n");
+       exit(0);
+    }
+    *res->closeReason = Z_Close_finished;
+    send_apdu(apdu);
+    printf("Sent response.\n");
+    sent_close = 1;
+}
+
 static int cmd_show(char *arg)
 {
     if (!send_presentRequest(arg))
@@ -812,6 +852,18 @@ int cmd_elements(char *arg)
     return 1;
 }
 
+int cmd_close(char *arg)
+{
+    Z_APDU *apdu = zget_APDU(out, Z_APDU_close);
+    Z_Close *req = apdu->u.close;
+
+    *req->closeReason = Z_Close_finished;
+    send_apdu(apdu);
+    printf("Sent close request.\n");
+    sent_close = 1;
+    return 2;
+}
+
 static void initialize(void)
 {
 #ifdef RPN_QUERY
@@ -864,6 +916,7 @@ static int client(void)
        {"cancel", cmd_cancel, ""},
        {"format", cmd_format, "<recordsyntax>"},
        {"elements", cmd_elements, "<elementSetName>"},
+       {"close", cmd_close, ""},
        {0,0}
     };
     char *netbuffer= 0;
@@ -970,6 +1023,10 @@ static int client(void)
                        else
                            printf("No records.\n");
                        break;
+                   case Z_APDU_close:
+                       printf("Target has closed the association.\n");
+                       process_close(apdu->u.close);
+                       break;
                    default:
                        printf("Received unknown APDU type (%d).\n", 
                            apdu->which);