Added print of status or Error Report from xml ES
[yaz-moved-to-github.git] / client / client.c
index 82c78ca..811d957 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2007, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: client.c,v 1.342 2007-05-30 21:56:59 adam Exp $
+ * $Id: client.c,v 1.356 2007-12-27 13:27:40 adam Exp $
  */
 /** \file client.c
  *  \brief yaz-client program
@@ -90,7 +90,8 @@
 
 static file_history_t file_history = 0;
 
-static char *sru_method = "soap";
+static char sru_method[10] = "soap";
+static char sru_version[10] = "1.2";
 static char *codeset = 0;               /* character set for output */
 static int hex_dump = 0;
 static char *dump_file_prefix = 0;
@@ -171,9 +172,6 @@ static cql_transform_t cqltrans = 0; /* CQL context-set handle */
 int rl_attempted_completion_over = 0;
 #endif
 
-/* set this one to 1, to avoid decode of unknown MARCs  */
-#define AVOID_MARC_DECODE 1
-
 #define maxOtherInfosSupported 10
 struct eoi {
     Odr_oid oid[OID_SIZE];
@@ -600,29 +598,27 @@ static int set_base(const char *arg)
     return 1;
 }
 
-static int parse_cmd_doc(const char **arg, ODR out, char **buf,
-                         int *len, int opt)
+static int parse_cmd_doc(const char **arg, ODR out, char **buf, int *len)
 {
     const char *sep;
     while (**arg && strchr(" \t\n\r\f", **arg))
         (*arg)++;
-    if ((*arg)[0] == '\"' && (sep=strchr(*arg+1, '"')))
+    if (**arg == '\0')
     {
-        (*arg)++;
-        *len = sep - *arg;
-        *buf = odr_strdupn(out, *arg, *len);
-        (*arg) = sep+1;
-        return 1;
+        return 0;
     }
-    else if ((*arg)[0] && (*arg)[0] != '\"')
+    else if ((*arg)[0] == '<')
     {
         long fsize;
         FILE *inf;
-        const char *fname = *arg;
-        
+        const char *fname;
+        const char *arg_start = ++(*arg);
+    
         while (**arg != '\0' && **arg != ' ')
             (*arg)++;
             
+        fname = odr_strdupn(out, arg_start, *arg - arg_start);
+
         inf = fopen(fname, "rb");
         if (!inf)
         {
@@ -643,7 +639,8 @@ static int parse_cmd_doc(const char **arg, ODR out, char **buf,
             return 0;
         }
         *len = fsize;
-        *buf = (char *) odr_malloc(out, fsize);
+        *buf = (char *) odr_malloc(out, fsize+1);
+        (*buf)[fsize] = '\0';
         if (fread(*buf, 1, fsize, inf) != fsize)
         {
             printf("Unable to read %s\n", fname);
@@ -651,21 +648,25 @@ static int parse_cmd_doc(const char **arg, ODR out, char **buf,
             return 0;
         }
         fclose(inf);
-        return 1;
     }
-    else if (**arg == '\0')
+    else if ((*arg)[0] == '\"' && (sep=strchr(*arg+1, '"')))
     {
-        if (opt)
-        {
-            *len = 0;
-            *buf = 0;
-            return 1;
-        }
-        printf("Missing doc argument\n");
+        (*arg)++;
+        *len = sep - *arg;
+        *buf = odr_strdupn(out, *arg, *len);
+        (*arg) = sep+1;
     }
     else
-        printf("Bad doc argument %s\n", *arg);
-    return 0;
+    {
+        const char *arg_start = *arg;
+
+        while (**arg != '\0' && **arg != ' ')
+            (*arg)++;
+
+        *len = *arg - arg_start;
+        *buf = odr_strdupn(out, arg_start, *len);
+    }
+    return 1;
 }
 
 static int cmd_base(const char *arg)
@@ -723,8 +724,6 @@ int session_connect(const char *arg)
         return 0;
     }
 #if YAZ_HAVE_XML2
-    if (conn->protocol == PROTO_HTTP)
-        queryType = QueryType_CQL;
 #else
     if (conn->protocol == PROTO_HTTP)
     {
@@ -785,12 +784,16 @@ int session_connect(const char *arg)
 
 int cmd_open(const char *arg)
 {
+    int r;
     if (arg)
     {
         strncpy (cur_host, arg, sizeof(cur_host)-1);
         cur_host[sizeof(cur_host)-1] = 0;
     }
-    return session_connect(cur_host);
+    r = session_connect(cur_host);
+    if (conn && conn->protocol == PROTO_HTTP)
+        queryType = QueryType_CQL;
+    return r;
 }
 
 void try_reconnect(void)
@@ -846,8 +849,8 @@ int cmd_authentication(const char *arg)
         au.which = Z_IdAuthentication_idPass;
         au.u.idPass = &idPass;
         idPass.groupId = NULL;
-        idPass.userId = user;
-        idPass.password = group;
+        idPass.userId = !strcmp(user, "-") ? 0 : user;
+        idPass.password = !strcmp(group, "-") ? 0 : group;
         printf("Authentication set to User (%s), Pass (%s)\n", user, group);
     }
     if (r == 3)
@@ -1276,15 +1279,15 @@ static int send_srw(Z_SRW_PDU *sr)
 
     gdu = z_get_HTTP_Request_host_path(out, host_port, path);
 
-    if (!strcmp(sru_method, "get"))
+    if (!yaz_matchstr(sru_method, "get"))
     {
         yaz_sru_get_encode(gdu->u.HTTP_Request, sr, out, charset);
     }
-    else if (!strcmp(sru_method, "post"))
+    else if (!yaz_matchstr(sru_method, "post"))
     {
         yaz_sru_post_encode(gdu->u.HTTP_Request, sr, out, charset);
     }
-    else if (!strcmp(sru_method, "soap"))
+    else if (!yaz_matchstr(sru_method, "soap"))
     {
         yaz_sru_soap_encode(gdu->u.HTTP_Request, sr, out, charset);
     }
@@ -1347,7 +1350,7 @@ static int send_SRW_scanRequest(const char *arg, int pos, int num)
     Z_SRW_PDU *sr = 0;
     
     /* regular requestse .. */
-    sr = yaz_srw_get(out, Z_SRW_scan_request);
+    sr = yaz_srw_get_pdu(out, Z_SRW_scan_request, sru_version);
 
     switch(queryType)
     {
@@ -1382,10 +1385,11 @@ static int send_SRW_searchRequest(const char *arg)
     setno = 1;
 
     /* save this for later .. when fetching individual records */
-    srw_sr =  yaz_srw_get(srw_sr_odr_out, Z_SRW_searchRetrieve_request);
+    srw_sr =  yaz_srw_get_pdu(srw_sr_odr_out, Z_SRW_searchRetrieve_request,
+                              sru_version);
     
     /* regular request .. */
-    sr = yaz_srw_get(out, Z_SRW_searchRetrieve_request);
+    sr = yaz_srw_get_pdu(out, Z_SRW_searchRetrieve_request, sru_version);
 
     switch(queryType)
     {
@@ -1918,6 +1922,34 @@ void process_ESResponse(Z_ExtendedServicesResponse *res)
                 }
             }
         }
+        if (ext->which == Z_External_itemOrder)
+        {
+            Z_IOTaskPackage *otp = ext->u.itemOrder->u.taskPackage;
+
+            if (otp && otp->targetPart ) 
+            {
+                if (otp->targetPart->itemRequest) 
+                {
+                    Z_External *ext = otp->targetPart->itemRequest;                    
+                    if (ext->which == Z_External_octet)
+                    {
+                        Odr_oct *doc = ext->u.octet_aligned;
+                        printf("Got itemRequest doc %.*s\n",
+                               doc->len, doc->buf);
+                    }
+                }
+                else if (otp->targetPart->statusOrErrorReport) 
+                {
+                    Z_External *ext = otp->targetPart->statusOrErrorReport;
+                    if (ext->which == Z_External_octet)
+                    {
+                        Odr_oct *doc = ext->u.octet_aligned;
+                        printf("Got Status or Error Report doc %.*s\n",
+                               doc->len, doc->buf);
+                    }
+                }
+            } 
+        }
     }
     if (res->taskPackage && res->taskPackage->which == Z_External_octet)
     {
@@ -2037,7 +2069,9 @@ static Z_External *create_external_ILL_APDU(int which)
 }
 
 
-static Z_External *create_ItemOrderExternal(const char *type, int itemno)
+static Z_External *create_ItemOrderExternal(const char *type, int itemno,
+                                            const char *xml_buf,
+                                            int xml_len)
 {
     Z_External *r = (Z_External *) odr_malloc(out, sizeof(Z_External));
     r->direct_reference = odr_oiddup(out, yaz_oid_extserv_item_order);
@@ -2088,14 +2122,18 @@ static Z_External *create_ItemOrderExternal(const char *type, int itemno)
     }
     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_oid(out, yaz_oid_recsyn_xml, xml_buf, strlen(xml_buf));
+        printf("using XML ILL-request\n");
+
+        if (!xml_buf)
+        {
+            printf("no docoument added\n");
+            r->u.itemOrder->u.esRequest->notToKeep->itemRequest = 0;
+        }
+        else
+        {
+            r->u.itemOrder->u.esRequest->notToKeep->itemRequest =
+                z_ext_record_oid(out, yaz_oid_recsyn_xml, xml_buf, xml_len);
+        }
     }
     else
         r->u.itemOrder->u.esRequest->notToKeep->itemRequest = 0;
@@ -2103,7 +2141,8 @@ static Z_External *create_ItemOrderExternal(const char *type, int itemno)
     return r;
 }
 
-static int send_itemorder(const char *type, int itemno)
+static int send_itemorder(const char *type, int itemno,
+                          const char *xml_buf, int xml_len)
 {
     Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest);
     Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest;
@@ -2113,8 +2152,8 @@ static int send_itemorder(const char *type, int itemno)
     req->packageType = odr_oiddup(out, yaz_oid_extserv_item_order);
     req->packageName = esPackageName;
 
-    req->taskSpecificParameters = create_ItemOrderExternal(type, itemno);
-
+    req->taskSpecificParameters = create_ItemOrderExternal(type, itemno,
+                                                           xml_buf, xml_len);
     send_apdu(apdu);
     return 0;
 }
@@ -2154,17 +2193,17 @@ static int cmd_update_SRW(int action_no, const char *recid,
 
 static int cmd_update_common(const char *arg, int version)
 {
-    char action[20], recid_buf[20];
+    char *action_buf;
+    int action_len;
+    char *recid_buf;
+    int recid_len;
     const char *recid = 0;
     char *rec_buf;
     int rec_len;
     int action_no;
     int noread = 0;
 
-    *action = 0;
-    *recid_buf = 0;
-    sscanf (arg, "%19s %19s%n", action, recid_buf, &noread);
-    if (noread == 0)
+    if (parse_cmd_doc(&arg, out, &action_buf, &action_len) == 0)
     {
         printf("Use: update action recid [fname]\n");
         printf(" where action is one of insert,replace,delete.update\n");
@@ -2173,17 +2212,23 @@ static int cmd_update_common(const char *arg, int version)
         return 0;
     }
 
-    if (!strcmp (action, "insert"))
+    if (parse_cmd_doc(&arg, out, &recid_buf, &recid_len) == 0)
+    {
+        printf("Missing recid\n");
+        return 0;
+    }
+
+    if (!strcmp(action_buf, "insert"))
         action_no = Z_IUOriginPartToKeep_recordInsert;
-    else if (!strcmp (action, "replace"))
+    else if (!strcmp(action_buf, "replace"))
         action_no = Z_IUOriginPartToKeep_recordReplace;
-    else if (!strcmp (action, "delete"))
+    else if (!strcmp(action_buf, "delete"))
         action_no = Z_IUOriginPartToKeep_recordDelete;
-    else if (!strcmp (action, "update"))
+    else if (!strcmp(action_buf, "update"))
         action_no = Z_IUOriginPartToKeep_specialUpdate;
     else 
     {
-        printf ("Bad action: %s\n", action);
+        printf ("Bad action: %s\n", action_buf);
         printf ("Possible values: insert, replace, delete, update\n");
         return 0;
     }
@@ -2192,14 +2237,14 @@ static int cmd_update_common(const char *arg, int version)
         recid = recid_buf;
 
     arg += noread;
-    if (parse_cmd_doc(&arg, out, &rec_buf, &rec_len, 1) == 0)
+    if (parse_cmd_doc(&arg, out, &rec_buf, &rec_len) == 0)
         return 0;
 
 #if YAZ_HAVE_XML2
     if (protocol == PROTO_HTTP)
-        return cmd_update_SRW(action_no, recid, rec_buf, rec_len);
+        return cmd_update_SRW(action_no, recid_buf, rec_buf, rec_len);
 #endif
-    return cmd_update_Z3950(version, action_no, recid, rec_buf, rec_len);
+    return cmd_update_Z3950(version, action_no, recid_buf, rec_buf, rec_len);
 }
 
 #if YAZ_HAVE_XML2
@@ -2207,7 +2252,7 @@ static int cmd_update_SRW(int action_no, const char *recid,
                           char *rec_buf, int rec_len)
 {
     if (!conn)
-        cmd_open(0);
+        session_connect(cur_host);
     if (!conn)
         return 0;
     else
@@ -2289,6 +2334,12 @@ static int cmd_update_Z3950(int version, int action_no, const char *recid,
         
         toKeep->databaseName = databaseNames[0];
         toKeep->schema = 0;
+        if (record_schema)
+        {
+            toKeep->schema = yaz_string_to_oid_odr(yaz_oid_std(),
+                                                   CLASS_SCHEMA,
+                                                   record_schema, out);
+        }
         toKeep->elementSetName = 0;
 
         toKeep->action = (int *) odr_malloc(out, sizeof(*toKeep->action));
@@ -2331,6 +2382,12 @@ static int cmd_update_Z3950(int version, int action_no, const char *recid,
         
         toKeep->databaseName = databaseNames[0];
         toKeep->schema = 0;
+        if (record_schema)
+        {
+            toKeep->schema = yaz_string_to_oid_odr(yaz_oid_std(),
+                                                   CLASS_SCHEMA,
+                                                   record_schema, out);
+        }
         toKeep->elementSetName = 0;
         toKeep->actionQualifier = 0;
         toKeep->action = (int *) odr_malloc(out, sizeof(*toKeep->action));
@@ -2394,7 +2451,7 @@ static int cmd_xmles(const char *arg)
         }
         arg += noread;
         if (parse_cmd_doc(&arg, out, &asn_buf,
-                          &ext->u.single_ASN1_type->len, 0) == 0)
+                          &ext->u.single_ASN1_type->len) == 0)
             return 0;
 
         ext->u.single_ASN1_type->buf = (unsigned char *) asn_buf;
@@ -2421,15 +2478,19 @@ static int cmd_itemorder(const char *arg)
 {
     char type[12];
     int itemno;
+    char *xml_buf = 0;
+    int xml_len = 0;
+    int no_read = 0;
    
     if (only_z3950())
         return 1;
-    if (sscanf (arg, "%10s %d", type, &itemno) != 2)
+    if (sscanf(arg, "%10s %d%n", type, &itemno, &no_read) < 2)
         return 0;
+    arg += no_read;
+    parse_cmd_doc(&arg, out, &xml_buf, &xml_len);
 
-    printf("Item order request\n");
     fflush(stdout);
-    send_itemorder(type, itemno);
+    send_itemorder(type, itemno, xml_buf, xml_len);
     return 2;
 }
 
@@ -2471,7 +2532,7 @@ static int cmd_explain(const char *arg)
         return 0;
 #if YAZ_HAVE_XML2
     if (!conn)
-        cmd_open(0);
+        session_connect(cur_host);
     if (conn)
     {
         Z_SRW_PDU *sr = 0;
@@ -2508,19 +2569,26 @@ static int cmd_sru(const char *arg)
     if (!*arg)
     {
         printf("SRU method is: %s\n", sru_method);
+        printf("SRU version is: %s\n", sru_version);
     }
     else
     {
-        if (!yaz_matchstr(arg, "post"))
-            sru_method = "post";
-        else if (!yaz_matchstr(arg, "get"))
-            sru_method = "get";
-        else if (!yaz_matchstr(arg, "soap"))
-            sru_method = "soap";
-        else
+        int r;
+        r = sscanf(arg, "%9s %9s", sru_method, sru_version);
+        if (r >= 1)
         {
-            printf("Unknown SRU method: %s\n", arg);
-            printf("Specify one of POST, GET, SOAP\n");
+            if (!yaz_matchstr(sru_method, "post"))
+                ;
+            else if (!yaz_matchstr(sru_method, "get"))
+                ;
+            else if (!yaz_matchstr(sru_method, "soap"))
+                ;
+            else
+            {
+                strcpy(sru_method, "soap");
+                printf("Unknown SRU method: %s\n", arg);
+                printf("Specify one of POST, GET, SOAP\n");
+            }
         }
     }
     return 0;
@@ -2537,7 +2605,7 @@ static int cmd_find(const char *arg)
     {
 #if YAZ_HAVE_XML2
         if (!conn)
-            cmd_open(0);
+            session_connect(cur_host);
         if (!conn)
             return 0;
         if (!send_SRW_searchRequest(arg))
@@ -2814,7 +2882,7 @@ static int cmd_show(const char *arg)
     {
 #if YAZ_HAVE_XML2
         if (!conn)
-            cmd_open(0);
+            session_connect(cur_host);
         if (!conn)
             return 0;
         if (!send_SRW_presentRequest(arg))
@@ -3021,13 +3089,13 @@ void display_term(Z_TermInfo *t)
     if (t->displayTerm)
         printf("%s", t->displayTerm);
     else if (t->term->which == Z_Term_general)
-    {
         printf("%.*s", t->term->u.general->len, t->term->u.general->buf);
-        sprintf(last_scan_line, "%.*s", t->term->u.general->len,
-            t->term->u.general->buf);
-    }
     else
         printf("Term (not general)");
+    if (t->term->which == Z_Term_general)
+        sprintf(last_scan_line, "%.*s", t->term->u.general->len,
+            t->term->u.general->buf);
+
     if (t->globalOccurrences)
         printf (" (%d)\n", *t->globalOccurrences);
     else
@@ -3161,7 +3229,7 @@ static int cmd_scan_common(const char *set, const char *arg)
     {
 #if YAZ_HAVE_XML2
         if (!conn)
-            cmd_open(0);
+            session_connect(cur_host);
         if (!conn)
             return 0;
         if (*arg)
@@ -3750,19 +3818,42 @@ int cmd_push_command(const char* arg)
     return 1;
 }
 
-void source_rcfile(void)
+void source_rc_file(const char *rc_file)
 {
-    /*  Look for a $HOME/.yazclientrc and source it if it exists */
+    /*  If rc_file != NULL, source that. Else
+        Look for .yazclientrc and read it if it exists. 
+        If it does not exist, read  $HOME/.yazclientrc instead */
     struct stat statbuf;
-    char fname[1000];
-    char* homedir = getenv("HOME");
 
-    sprintf(fname, "%.500s%s%s", homedir ? homedir : "",
-            homedir ? "/" : "",
-            ".yazclientrc");
-
-    if (stat(fname,&statbuf)==0)
-        cmd_source(fname, 0 );
+    if (rc_file)
+    {
+        if (stat(rc_file, &statbuf) == 0)
+            cmd_source(rc_file, 0);
+        else
+        {
+            fprintf(stderr, "yaz_client: cannot source '%s'\n", rc_file);
+            exit(1);
+        }
+    }
+    else
+    {
+        char fname[1000];
+        strcpy(fname, ".yazclientrc");
+        if (stat(fname, &statbuf)==0)
+        {
+            cmd_source(fname, 0);
+        }
+        else
+        {
+            const char* homedir = getenv("HOME");
+            if (homedir)
+            {
+                sprintf(fname, "%.800s/%s", homedir, ".yazclientrc");
+                if (stat(fname, &statbuf)==0)
+                    cmd_source(fname, 0);
+            }
+        }
+    }
 }
 
 void add_to_readline_history(void *client_data, const char *line)
@@ -3773,7 +3864,7 @@ void add_to_readline_history(void *client_data, const char *line)
 #endif
 }
 
-static void initialize(void)
+static void initialize(const char *rc_file)
 {
     FILE *inf;
     int i;
@@ -3812,7 +3903,7 @@ static void initialize(void)
 
     cmd_format("usmarc");
     
-    source_rcfile();
+    source_rc_file(rc_file);
 
     file_history = file_history_new();
     file_history_load(file_history);
@@ -3923,7 +4014,7 @@ static void http_response(Z_HTTP_Response *hres)
     const char *connection_head = z_HTTP_header_lookup(hres->headers,
                                                        "Connection");
     if (!yaz_srw_check_content_type(hres))
-        printf("Content type does not appear to be XML");
+        printf("Content type does not appear to be XML\n");
     else
     {
         Z_SOAP *soap_package = 0;
@@ -4019,7 +4110,7 @@ void wait_and_handle_response(int one_response_only)
         {
             cs_close(conn);
             conn = 0;
-            cmd_open(0);
+            session_connect(cur_host);
             reconnect_ok = 0;
             if (conn)
             {
@@ -4496,7 +4587,7 @@ static struct {
     {"zversion", cmd_zversion, "", NULL, 0, NULL},
     {"help", cmd_help, "", NULL,0,NULL},
     {"init", cmd_init, "", NULL,0,NULL},
-    {"sru", cmd_sru, "", NULL,0,NULL},
+    {"sru", cmd_sru, "<method> <version>", NULL,0,NULL},
     {"exit", cmd_quit, "",NULL,0,NULL},
     {0,0,0,0,0,0}
 };
@@ -4820,6 +4911,7 @@ int main(int argc, char **argv)
     char *open_command = 0;
     char *auth_command = 0;
     char *arg;
+    const char *rc_file = 0;
     int ret;
     
 #if HAVE_LOCALE_H
@@ -4844,7 +4936,7 @@ int main(int argc, char **argv)
     ODR_MASK_SET(&z3950_options, Z_Options_delSet);
     ODR_MASK_SET(&z3950_options, Z_Options_negotiationModel);
 
-    while ((ret = options("k:c:q:a:b:m:v:p:u:t:Vxd:", argv, argc, &arg)) != -2)
+    while ((ret = options("k:c:q:a:b:m:v:p:u:t:Vxd:f:", argv, argc, &arg)) != -2)
     {
         switch (ret)
         {
@@ -4862,9 +4954,28 @@ int main(int argc, char **argv)
                 exit(1);
             }
             break;
+        case 'a':
+            if (!strcmp(arg, "-"))
+                apdu_file=stderr;
+            else
+                apdu_file=fopen(arg, "a");
+            break;
+        case 'b':
+            if (!strcmp(arg, "-"))
+                ber_file=stderr;
+            else
+                ber_file=fopen(arg, "a");
+            break;
+        case 'c':
+            strncpy (ccl_fields, arg, sizeof(ccl_fields)-1);
+            ccl_fields[sizeof(ccl_fields)-1] = '\0';
+            break;
         case 'd':
             dump_file_prefix = arg;
             break;
+        case 'f':
+            rc_file = arg;
+            break;
         case 'k':
             kilobytes = atoi(arg);
             break;
@@ -4875,34 +4986,15 @@ int main(int argc, char **argv)
                 exit (1);
             }
             break;
-        case 't':
-            outputCharset = xstrdup(arg);
-            break;
-        case 'c':
-            strncpy (ccl_fields, arg, sizeof(ccl_fields)-1);
-            ccl_fields[sizeof(ccl_fields)-1] = '\0';
+        case 'p':
+            yazProxy = xstrdup(arg);
             break;
         case 'q':
             strncpy (cql_fields, arg, sizeof(cql_fields)-1);
             cql_fields[sizeof(cql_fields)-1] = '\0';
             break;
-        case 'b':
-            if (!strcmp(arg, "-"))
-                ber_file=stderr;
-            else
-                ber_file=fopen(arg, "a");
-            break;
-        case 'a':
-            if (!strcmp(arg, "-"))
-                apdu_file=stderr;
-            else
-                apdu_file=fopen(arg, "a");
-            break;
-        case 'x':
-            hex_dump = 1;
-            break;
-        case 'p':
-            yazProxy = xstrdup(arg);
+        case 't':
+            outputCharset = xstrdup(arg);
             break;
         case 'u':
             if (!auth_command)
@@ -4918,24 +5010,31 @@ int main(int argc, char **argv)
         case 'V':
             show_version();
             break;
+        case 'x':
+            hex_dump = 1;
+            break;
         default:
             fprintf (stderr, "Usage: %s "
-                     " [-a <apdulog>]"
+                     " [-a apdulog]"
                      " [-b berdump]"
-                     " [-d dump]\n"
-                     " [-c cclfields]"
+                     " [-c cclfile]"
+                     " [-d dump]"
+                     " [-f cmdfile]"
                      " [-k size]"
-                     " [-m <marclog>]\n" 
-                     " [-p <proxy-addr>]"
-                     " [-q cqlfields]"
-                     " [-u <auth>]"
+                     " [-m marclog]" 
+                     " [-p proxy-addr]"
+                     " [-q cqlfile]"
+                     " [-t dispcharset]"
+                     " [-u auth]"
+                     " [-v loglevel]"
                      " [-V]"
-                     " [<server-addr>]\n",
+                     " [-x]"
+                     " [server-addr]\n",
                      prog);
             exit (1);
         }      
     }
-    initialize();
+    initialize(rc_file);
     if (auth_command)
     {
 #ifdef HAVE_GETTIMEOFDAY