Client doesn't set VAL_PROXY otherinfo unless -p is specified.
[yaz-moved-to-github.git] / client / client.c
index 946fe49..00819c2 100644 (file)
@@ -1,10 +1,67 @@
 /*
- * Copyright (c) 1995-2000, Index Data
+ * Copyright (c) 1995-2001, Index Data
  * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: client.c,v $
- * Revision 1.110  2001-01-29 11:19:05  adam
+ * Revision 1.126  2001-08-06 20:22:23  adam
+ * Client doesn't set VAL_PROXY otherinfo unless -p is specified.
+ *
+ * Revision 1.125  2001/07/19 19:51:41  adam
+ * Added typecasts to make C++ happy.
+ *
+ * Revision 1.124  2001/07/04 20:13:51  ja7
+ * Added new commend "proxy" for ysing a yaz-proxy to connect to the target
+ * Added new command line option -p for setting the proxy host
+ *
+ * Revision 1.123  2001/06/11 12:54:47  heikki
+ * Displayng diags in EsResponse, even if they should not be there...
+ *
+ * Revision 1.122  2001/05/16 07:27:29  adam
+ * Reference id set for InitRequest.
+ *
+ * Revision 1.121  2001/04/22 12:26:17  ja7
+ * if Compiled with Command line history a open command is pushed into
+ * the command history if yaz-client is startet with a server on the
+ * command line. eg
+ *   yaz-clinet tcp:server:port/database
+ * hash the commend
+ *   open tcp:server:port/database
+ * in the command history on startup
+ *
+ * Added the refid set with setrefid to the update APDU
+ *
+ * Revision 1.120  2001/04/06 12:26:46  adam
+ * Optional CCL module. Moved atoi_n to marcdisp.h from yaz-util.h.
+ *
+ * Revision 1.119  2001/04/05 13:08:48  adam
+ * New configure options: --enable-module.
+ *
+ * Revision 1.118  2001/03/27 14:48:06  adam
+ * Fixed scan for bad CCL.
+ *
+ * Revision 1.117  2001/03/25 21:55:12  adam
+ * Added odr_intdup. Ztest server returns TaskPackage for ItemUpdate.
+ *
+ * Revision 1.116  2001/03/21 12:43:36  adam
+ * Implemented cs_create_host. Better error reporting for SSL comstack.
+ *
+ * Revision 1.115  2001/03/13 18:10:58  adam
+ * Added option -c to set CCL config file.
+ *
+ * Revision 1.114  2001/02/21 13:46:53  adam
+ * C++ fixes.
+ *
+ * Revision 1.113  2001/02/21 09:41:15  adam
+ * Fixed problem with old codecs.
+ *
+ * Revision 1.112  2001/02/20 11:25:32  adam
+ * Added ill_get_APDU and ill_get_Cancel.
+ *
+ * Revision 1.111  2001/01/30 15:52:48  ja7
+ * added command for setting packageName in ES packages!
+ * command is named packagename default is NULL for server suplyed package name
+ *
+ * Revision 1.110  2001/01/29 11:19:05  adam
  * Clients prints options in InitResponse.
  *
  * Revision 1.109  2001/01/22 10:41:47  adam
 #include <yaz/proto.h>
 #include <yaz/marcdisp.h>
 #include <yaz/diagbib1.h>
+#include <yaz/otherinfo.h>
 
 #include <yaz/pquery.h>
 
-#ifdef ASN_COMPILED
+#if YAZ_MODULE_ill
 #include <yaz/ill.h>
 #endif
 
-#if CCL2RPN
+#if YAZ_MODULE_ccl
 #include <yaz/yaz-ccl.h>
 #endif
 
@@ -417,8 +475,11 @@ static NMEM session_mem = NULL;      /* memory handle for init-response */
 static Z_InitResponse *session = 0;     /* session parameters */
 static char last_scan_line[512] = "0";
 static char last_scan_query[512] = "0";
+static char ccl_fields[512] = "default.bib";
+static char* esPackageName = 0;
+static char* yazProxy = 0;
 
-static char last_cmd[100] = "?";
+static char last_cmd[32] = "?";
 static FILE *marcdump = 0;
 static char *refid = NULL;
 
@@ -430,7 +491,7 @@ typedef enum {
 
 static QueryType queryType = QueryType_Prefix;
 
-#if CCL2RPN
+#if YAZ_MODULE_ccl
 static CCL_bibset bibset;               /* CCL bibset handle */
 #endif
 
@@ -486,7 +547,7 @@ static Z_ReferenceId *set_refid (ODR out)
 
 /* INIT SERVICE ------------------------------- */
 
-static void send_initRequest()
+static void send_initRequest(const char* type_and_host)
 {
     Z_APDU *apdu = zget_APDU(out, Z_APDU_initRequest);
     Z_InitRequest *req = apdu->u.initRequest;
@@ -509,6 +570,12 @@ static void send_initRequest()
 
     req->idAuthentication = auth;
 
+    req->referenceId = set_refid (out);
+
+    if (yazProxy) 
+        yaz_oi_set_string_oidval(&req->otherInfo, out, VAL_PROXY,
+        1, type_and_host);
+    
     send_apdu(apdu);
     printf("Sent initrequest.\n");
 }
@@ -611,7 +678,6 @@ int cmd_open(char *arg)
 {
     void *add;
     char type_and_host[101], base[101];
-    char *host = 0;
     CS_TYPE t;
 
     if (conn)
@@ -630,44 +696,37 @@ int cmd_open(char *arg)
     base[0] = '\0';
     if (sscanf (arg, "%100[^/]/%100s", type_and_host, base) < 1)
         return 0;
-    if (strncmp (type_and_host, "tcp:", 4) == 0)
-        host = type_and_host + 4;
-    else if (strncmp (type_and_host, "ssl:", 4) == 0)
-    {
-#if HAVE_OPENSSL_SSL_H
-       t = ssl_type;
-#else
-       printf ("SSL not supported\n");
-#endif
-        host = type_and_host + 4;
-    }
-    else
-        host = type_and_host;
-    if (*base)
-        cmd_base (base);
-    protocol = PROTO_Z3950;
 
-    if (!(conn = cs_create(t, 1, protocol)))
+    if(yazProxy) 
     {
-        perror("cs_create");
-        return 0;
+       conn = cs_create_host(yazProxy, 1, &add);
+    } 
+    else 
+    { 
+       conn = cs_create_host(type_and_host, 1, &add);
     }
-    if (!(add = cs_straddr(conn, host)))
+       
+    if (!conn)
     {
-        perror(arg);
-        return 0;
+       printf ("Couldn't create comstack\n");
+       return 0;
     }
     printf("Connecting...");
     fflush(stdout);
     if (cs_connect(conn, add) < 0)
     {
-        perror("connect");
+       printf ("error = %s\n", cs_strerror(conn));
+       if (conn->cerrno == CSYSERR)
+           perror("system");
         cs_close(conn);
         conn = 0;
         return 0;
     }
     printf("Ok.\n");
-    send_initRequest();
+
+    send_initRequest(type_and_host);
+    if (*base)
+        cmd_base (base);
     return 2;
 }
 
@@ -1010,7 +1069,7 @@ static int send_searchRequest(char *arg)
     Z_SearchRequest *req = apdu->u.searchRequest;
     Z_Query query;
     int oid[OID_SIZE];
-#if CCL2RPN
+#if YAZ_MODULE_ccl
     struct ccl_rpn_node *rpn = NULL;
     int error, pos;
 #endif
@@ -1018,7 +1077,7 @@ static int send_searchRequest(char *arg)
     Z_RPNQuery *RPNquery;
     Odr_oct ccl_query;
 
-#if CCL2RPN
+#if YAZ_MODULE_ccl
     if (queryType == QueryType_CCL2RPN)
     {
         rpn = ccl_find_str(bibset, arg, &error, &pos);
@@ -1086,7 +1145,7 @@ static int send_searchRequest(char *arg)
         ccl_query.buf = (unsigned char*) arg;
         ccl_query.len = strlen(arg);
         break;
-#if CCL2RPN
+#if YAZ_MODULE_ccl
     case QueryType_CCL2RPN:
         query.which = Z_Query_type_1;
         RPNquery = ccl_rpn_query(out, rpn);
@@ -1303,9 +1362,14 @@ void process_ESResponse(Z_ExtendedServicesResponse *res)
         display_diagrecs(res->diagnostics, res->num_diagnostics);
         break;
     }
+    if ( (*res->operationStatus != Z_ExtendedServicesResponse_failure) &&
+        (res->num_diagnostics != 0) ) {
+        display_diagrecs(res->diagnostics, res->num_diagnostics);
+    }
+
 }
 
-#ifdef ASN_COMPILED
+#if YAZ_MODULE_ill
 
 const char *get_ill_element (void *clientData, const char *element)
 {
@@ -1359,7 +1423,8 @@ static Z_External *create_external_itemRequest()
         
         r->u.single_ASN1_type = (Odr_oct *)
             odr_malloc (out, sizeof(*r->u.single_ASN1_type));
-        r->u.single_ASN1_type->buf = odr_malloc (out, item_request_size);
+        r->u.single_ASN1_type->buf = (unsigned char *)
+           odr_malloc (out, item_request_size);
         r->u.single_ASN1_type->len = item_request_size;
         r->u.single_ASN1_type->size = item_request_size;
         memcpy (r->u.single_ASN1_type->buf, item_request_buf,
@@ -1368,18 +1433,13 @@ static Z_External *create_external_itemRequest()
     }
     return r;
 }
-#else
-static Z_External *create_external_itemRequest()
-{
-    return 0;
-}
 #endif
 
-#ifdef ASN_COMPILED
-static Z_External *create_external_ILLRequest()
+#ifdef YAZ_MODULE_ill
+static Z_External *create_external_ILL_APDU(int which)
 {
     struct ill_get_ctl ctl;
-    ILL_Request *req;
+    ILL_APDU *ill_apdu;
     Z_External *r = 0;
     int ill_request_size = 0;
     char *ill_request_buf = 0;
@@ -1388,14 +1448,14 @@ static Z_External *create_external_ILLRequest()
     ctl.clientData = 0;
     ctl.f = get_ill_element;
 
-    req = ill_get_ILLRequest(&ctl, "ill", 0);
+    ill_apdu = ill_get_APDU(&ctl, "ill", 0);
 
-    if (!ill_Request (out, &req, 0, 0))
+    if (!ill_APDU (out, &ill_apdu, 0, 0))
     {
         if (apdu_file)
         {
             printf ("-------------------\n");
-            ill_Request(print, &req, 0, 0);
+            ill_APDU(print, &ill_apdu, 0, 0);
             odr_reset(print);
             printf ("-------------------\n");
         }
@@ -1422,7 +1482,8 @@ static Z_External *create_external_ILLRequest()
         
         r->u.single_ASN1_type = (Odr_oct *)
             odr_malloc (out, sizeof(*r->u.single_ASN1_type));
-        r->u.single_ASN1_type->buf = odr_malloc (out, ill_request_size);
+        r->u.single_ASN1_type->buf = (unsigned char *)
+           odr_malloc (out, ill_request_size);
         r->u.single_ASN1_type->len = ill_request_size;
         r->u.single_ASN1_type->size = ill_request_size;
         memcpy (r->u.single_ASN1_type->buf, ill_request_buf, ill_request_size);
@@ -1430,11 +1491,6 @@ static Z_External *create_external_ILLRequest()
     }
     return r;
 }
-#else
-static Z_External *create_external_ILLRequest()
-{
-    return 0;
-}
 #endif
 
 
@@ -1485,6 +1541,7 @@ static Z_External *create_ItemOrderExternal(const char *type, int itemno)
         (int *) odr_malloc(out, sizeof(int));
     *r->u.itemOrder->u.esRequest->notToKeep->resultSetItem->item = itemno;
 
+#if YAZ_MODULE_ill
     if (!strcmp (type, "item") || !strcmp(type, "2"))
     {
         printf ("using item-request\n");
@@ -1495,16 +1552,31 @@ static Z_External *create_ItemOrderExternal(const char *type, int itemno)
     {
         printf ("using ILL-request\n");
         r->u.itemOrder->u.esRequest->notToKeep->itemRequest = 
-            create_external_ILLRequest();
+            create_external_ILL_APDU(ILL_APDU_ILL_Request);
+    }
+    else if (!strcmp(type, "xml") || !strcmp(type, "3"))
+    {
+       const char *xml_buf =
+               "<itemorder>\n"
+               "  <type>request</type>\n"
+               "  <libraryNo>000200</libraryNo>\n"
+               "  <borrowerTicketNo> 1212 </borrowerTicketNo>\n"
+               "</itemorder>";
+        r->u.itemOrder->u.esRequest->notToKeep->itemRequest =
+            z_ext_record (out, VAL_TEXT_XML, xml_buf, strlen(xml_buf));
     }
     else
         r->u.itemOrder->u.esRequest->notToKeep->itemRequest = 0;
+
+#else
+    r->u.itemOrder->u.esRequest->notToKeep->itemRequest = 0;
+#endif
     return r;
 }
 
 static int send_itemorder(const char *type, int itemno)
 {
-    Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest );
+    Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest);
     Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest;
     oident ItemOrderRequest;
 
@@ -1512,7 +1584,7 @@ static int send_itemorder(const char *type, int itemno)
     ItemOrderRequest.oclass = CLASS_EXTSERV;
     ItemOrderRequest.value = VAL_ITEMORDER;
     req->packageType = odr_oiddup(out,oid_getoidbyent(&ItemOrderRequest));
-    req->packageName = "1.Extendedserveq";
+    req->packageName = esPackageName;
 
     req->taskSpecificParameters = create_ItemOrderExternal(type, itemno);
 
@@ -1539,7 +1611,9 @@ static int cmd_update(char *arg)
     update_oid.value = VAL_DBUPDATE;
     oid_ent_to_oid (&update_oid, oid);
     req->packageType = odr_oiddup(out,oid);
-    req->packageName = "1.Extendedserveq";
+    req->packageName = esPackageName;
+    
+    req->referenceId = set_refid (out);
 
     r = req->taskSpecificParameters = (Z_External *)
         odr_malloc (out, sizeof(*r));
@@ -1855,9 +1929,9 @@ int send_scanrequest(const char *query, int pp, int num, const char *term)
     Z_APDU *apdu = zget_APDU(out, Z_APDU_scanRequest);
     Z_ScanRequest *req = apdu->u.scanRequest;
     int use_rpn = 1;
+#if YAZ_MODULE_ccl
     int oid[OID_SIZE];
     
-#if CCL2RPN
     if (queryType == QueryType_CCL2RPN)
     {
         oident bib1;
@@ -1868,7 +1942,7 @@ int send_scanrequest(const char *query, int pp, int num, const char *term)
         if (error)
         {
             printf("CCL ERROR: %s\n", ccl_err_msg(error));
-            return 0;
+            return -1;
         }
         use_rpn = 0;
         bib1.proto = PROTO_Z3950;
@@ -1878,7 +1952,7 @@ int send_scanrequest(const char *query, int pp, int num, const char *term)
         if (!(req->termListAndStartPoint = ccl_scan_query (out, rpn)))
         {
             printf("Couldn't convert CCL to Scan term\n");
-            return 0;
+            return -1;
         }
         ccl_rpn_delete (rpn);
     }
@@ -1896,7 +1970,7 @@ int send_scanrequest(const char *query, int pp, int num, const char *term)
             req->termListAndStartPoint->term->u.general)
         {
             req->termListAndStartPoint->term->u.general->buf =
-                odr_strdup(out, term);
+                (unsigned char *) odr_strdup(out, term);
             req->termListAndStartPoint->term->u.general->len =
                 req->termListAndStartPoint->term->u.general->size =
                 strlen(term);
@@ -2279,7 +2353,7 @@ int cmd_querytype (char *arg)
         queryType = QueryType_CCL;
     else if (!strcmp (arg, "prefix") || !strcmp(arg, "rpn"))
         queryType = QueryType_Prefix;
-#if CCL2RPN
+#if YAZ_MODULE_ccl
     else if (!strcmp (arg, "ccl2rpn") || !strcmp (arg, "cclrpn"))
         queryType = QueryType_CCL2RPN;
 #endif
@@ -2288,7 +2362,7 @@ int cmd_querytype (char *arg)
         printf ("Querytype must be one of:\n");
         printf (" prefix         - Prefix query\n");
         printf (" ccl            - CCL query\n");
-#if CCL2RPN
+#if YAZ_MODULE_ccl
         printf (" ccl2rpn        - CCL query converted to RPN\n");
 #endif
         return 0;
@@ -2324,9 +2398,31 @@ int cmd_close(char *arg)
     return 2;
 }
 
+int cmd_packagename(char* arg) {
+    xfree (esPackageName);
+    esPackageName = NULL;
+    if (*arg)
+    {
+        esPackageName = (char *) xmalloc (strlen(arg)+1);
+        strcpy (esPackageName, arg);
+    }
+    return 1;
+};
+
+int cmd_proxy(char* arg) {
+    xfree (yazProxy);
+    yazProxy = NULL;
+    if (*arg)
+    {
+        yazProxy = (char *) xmalloc (strlen(arg)+1);
+        strcpy (yazProxy, arg);
+    } 
+    return 1;
+};
+
 static void initialize(void)
 {
-#if CCL2RPN
+#if YAZ_MODULE_ccl
     FILE *inf;
 #endif
     nmem_init();
@@ -2341,9 +2437,9 @@ static void initialize(void)
     if (apdu_file)
         odr_setprint(print, apdu_file);
 
-#if CCL2RPN
+#if YAZ_MODULE_ccl
     bibset = ccl_qual_mk (); 
-    inf = fopen ("default.bib", "r");
+    inf = fopen (ccl_fields, "r");
     if (inf)
     {
         ccl_qual_file (bibset, inf);
@@ -2385,6 +2481,8 @@ static int client(int wait)
         {"refid", cmd_refid, "<id>"},
         {"itemorder", cmd_itemorder, "ill|item <itemno>"},
         {"update", cmd_update, "<item>"},
+       {"packagename", cmd_packagename, "<packagename>"},
+       {"proxy", cmd_proxy, "('tcp'|'osi')':'[<tsel>'/']<host>[':'<port>]"},
 #ifdef ASN_COMPILED
         /* Server Admin Functions */
         {"adm-reindex", cmd_adm_reindex, "<database-name>"},
@@ -2414,7 +2512,7 @@ static int client(int wait)
 #ifdef USE_SELECT
         fd_set input;
 #endif
-        char line[1024], word[1024], arg[1024];
+        char line[1024], word[32], arg[1024];
         
 #ifdef USE_SELECT
         FD_ZERO(&input);
@@ -2457,7 +2555,7 @@ static int client(int wait)
             gettimeofday (&tv_start, 0);
 #endif
 
-            if ((res = sscanf(line, "%s %[^;]", word, arg)) <= 0)
+            if ((res = sscanf(line, "%31s %1023[^;]", word, arg)) <= 0)
             {
                 strcpy(word, last_cmd);
                 *arg = '\0';
@@ -2592,7 +2690,7 @@ int main(int argc, char **argv)
     int ret;
     int opened = 0;
 
-    while ((ret = options("a:m:v:", argv, argc, &arg)) != -2)
+    while ((ret = options("c:a:m:v:p:", argv, argc, &arg)) != -2)
     {
         switch (ret)
         {
@@ -2600,8 +2698,17 @@ int main(int argc, char **argv)
             if (!opened)
             {
                 initialize ();
-                if (cmd_open (arg) == 2)
-                    opened = 1;
+                if (cmd_open (arg) == 2) {
+#if HAVE_READLINE_HISTORY_H
+                 char* tmp=(char*)malloc(strlen(arg)+6);
+                 *tmp=0;
+                 strcat(tmp,"open ");
+                 strcat(tmp,arg);
+                 add_history(tmp);
+                 free(tmp);
+#endif
+                 opened = 1;
+               };
             }
             break;
         case 'm':
@@ -2611,18 +2718,25 @@ int main(int argc, char **argv)
                 exit (1);
             }
             break;
+       case 'c':
+           strncpy (ccl_fields, arg, sizeof(ccl_fields)-1);
+           ccl_fields[sizeof(ccl_fields)-1] = '\0';
+           break;
         case 'a':
             if (!strcmp(arg, "-"))
                 apdu_file=stderr;
             else
                 apdu_file=fopen(arg, "a");
             break;
+       case 'p':
+           yazProxy=strdup(arg);
+           break;
         case 'v':
             yaz_log_init (yaz_log_mask_str(arg), "", NULL);
             break;
         default:
             fprintf (stderr, "Usage: %s [-m <marclog>] [ -a <apdulog>] "
-                             "[<server-addr>]\n",
+                             "[-c cclfields] [-p <proxy-addr>] [<server-addr>]\n",
                      prog);
             exit (1);
         }