Fix yaz-client command args parsing broken YAZ-855
[yaz-moved-to-github.git] / client / client.c
index 30582d3..0d686ee 100644 (file)
@@ -4538,39 +4538,37 @@ static void wait_and_handle_response(int one_response_only)
     while(conn)
     {
         res = cs_get(conn, &netbuffer, &netbufferlen);
-        if (reconnect_ok && res <= 0 && protocol == PROTO_HTTP)
+        if (res <= 0)
         {
-            cs_close(conn);
-            conn = 0;
-            session_connect();
-            reconnect_ok = 0;
-            if (conn)
+            if (reconnect_ok && protocol == PROTO_HTTP)
             {
-                char *buf_out;
-                int len_out;
-
-                buf_out = odr_getbuf(out, &len_out, 0);
-
-                do_hex_dump(buf_out, len_out);
-
-                cs_put(conn, buf_out, len_out);
-
-                odr_reset(out);
-                continue;
+                cs_close(conn);
+                conn = 0;
+                session_connect();
+                reconnect_ok = 0;
+                if (conn)
+                {
+                    char *buf_out;
+                    int len_out;
+                    buf_out = odr_getbuf(out, &len_out, 0);
+                    do_hex_dump(buf_out, len_out);
+                    cs_put(conn, buf_out, len_out);
+                    odr_reset(out);
+                    continue;
+                }
+            }
+            else
+            {
+                printf("Target closed connection\n");
+                close_session();
+                break;
             }
-        }
-        else if (res <= 0)
-        {
-            printf("Target closed connection\n");
-            close_session();
-            break;
         }
 #if HAVE_GETTIMEOFDAY
         if (got_tv_end == 0)
             gettimeofday(&tv_end, 0); /* count first one only */
         got_tv_end++;
 #endif
-        odr_reset(out);
         odr_reset(in); /* release APDU from last round */
         record_last = 0;
         do_hex_dump(netbuffer, res);
@@ -4578,21 +4576,43 @@ static void wait_and_handle_response(int one_response_only)
 
         if (!z_GDU(in, &gdu, 0, 0))
         {
-            FILE *f = ber_file ? ber_file : stdout;
-            odr_perror(in, "Decoding incoming APDU");
-            fprintf(f, "[Near %ld]\n", (long) odr_offset(in));
-            fprintf(f, "Packet dump:\n---------\n");
-            odr_dumpBER(f, netbuffer, res);
-            fprintf(f, "---------\n");
-            if (apdu_file)
+            if (reconnect_ok && protocol == PROTO_HTTP)
             {
-                z_GDU(print, &gdu, 0, 0);
-                odr_reset(print);
+                fprintf(stderr, "Decoding error. Reconnecting\n");
+                cs_close(conn);
+                conn = 0;
+                session_connect();
+                reconnect_ok = 0;
+                if (conn)
+                {
+                    char *buf_out;
+                    int len_out;
+                    buf_out = odr_getbuf(out, &len_out, 0);
+                    do_hex_dump(buf_out, len_out);
+                    cs_put(conn, buf_out, len_out);
+                    odr_reset(out);
+                    continue;
+                }
+            }
+            else
+            {
+                FILE *f = ber_file ? ber_file : stdout;
+                odr_perror(in, "Decoding incoming APDU");
+                fprintf(f, "[Near %ld]\n", (long) odr_offset(in));
+                fprintf(f, "Packet dump:\n---------\n");
+                odr_dumpBER(f, netbuffer, res);
+                fprintf(f, "---------\n");
+                if (apdu_file)
+                {
+                    z_GDU(print, &gdu, 0, 0);
+                    odr_reset(print);
+                }
+                if (conn && cs_more(conn))
+                    continue;
+                break;
             }
-            if (conn && cs_more(conn))
-                continue;
-            break;
         }
+        odr_reset(out);
         if (ber_file)
             odr_dumpBER(ber_file, netbuffer, res);
         if (apdu_file && !z_GDU(print, &gdu, 0, 0))
@@ -5164,27 +5184,31 @@ static int cmd_register_tab(const char* arg)
 static void process_cmd_line(char* line)
 {
     int i, res;
-    char word[32], arg[10240];
+    char word[32], *arg;
+    int no_read = 0;
 
 #if HAVE_GETTIMEOFDAY
     gettimeofday(&tv_start, 0);
 #endif
 
-    if ((res = sscanf(line, "%31s %10239[^;]", word, arg)) <= 0)
+    sscanf(line, "%31s%n", word, &no_read);
+    if (no_read == 0)
     {
         strcpy(word, last_cmd);
-        *arg = '\0';
+        arg = line + strlen(line);
     }
-    else if (res == 1)
-        *arg = 0;
+    else
+        arg = line + no_read;
     strcpy(last_cmd, word);
 
-    /* removed tailing spaces from the arg command */
+    /* whitespace chop */
     {
-        char* p = arg;
-        char* lastnonspace=NULL;
+        char *p;
+        char *lastnonspace = 0;
 
-        for (; *p; ++p)
+        while (*arg && yaz_isspace(*arg))
+            arg++;
+        for (p = arg; *p; ++p)
         {
             if (!yaz_isspace(*p))
                 lastnonspace = p;
@@ -5268,9 +5292,9 @@ static char **readline_completer(char *text, int start, int end)
     }
     else
     {
-        char arg[10240],word[32];
-        int i ,res;
-        if ((res = sscanf(rl_line_buffer, "%31s %10239[^;]", word, arg)) <= 0)
+        char word[32];
+        int i;
+        if (sscanf(rl_line_buffer, "%31s", word) <= 0)
         {
             rl_attempted_completion_over = 1;
             return NULL;