zoomsh: do not use readline for stdin (no tty) YAZ-724
[yaz-moved-to-github.git] / zoom / zoomsh.c
index a8ec761..88536d1 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2012 Index Data
+ * Copyright (C) Index Data
  * See the file LICENSE for details.
  */
 /** \file zoomsh.c
@@ -9,6 +9,10 @@
 #include <config.h>
 #endif
 
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -17,7 +21,7 @@
 #include <yaz/options.h>
 
 #if HAVE_READLINE_READLINE_H
-#include <readline/readline.h> 
+#include <readline/readline.h>
 #endif
 #if HAVE_READLINE_HISTORY_H
 #include <readline/history.h>
@@ -148,6 +152,15 @@ static int cmd_get(ZOOM_connection *c, ZOOM_resultset *r,
     return 0;
 }
 
+static int cmd_shell(ZOOM_connection *c, ZOOM_resultset *r,
+                     ZOOM_options options, const char **args)
+{
+    int ret = system(*args);
+    if (ret)
+         printf("system command returned %d\n", ret);
+    return 0;
+}
+
 static int cmd_rget(ZOOM_connection *c, ZOOM_resultset *r,
                     ZOOM_options options,
                      const char **args)
@@ -166,7 +179,7 @@ static int cmd_rget(ZOOM_connection *c, ZOOM_resultset *r,
             const char *val;
             if (!r[i])
                 continue;
-            
+
             val = ZOOM_resultset_option_get(r[i], wrbuf_cstr(key));
             printf("%s = %s\n", wrbuf_cstr(key), val ? val : "<null>");
         }
@@ -214,14 +227,14 @@ static void display_records(ZOOM_connection c,
         size_t pos = i + start;
         ZOOM_record rec = ZOOM_resultset_record(r, pos);
         const char *db = ZOOM_record_get(rec, "database", 0);
-        
+
         if (ZOOM_record_error(rec, 0, 0, 0))
         {
             const char *msg;
             const char *addinfo;
             const char *diagset;
             int error = ZOOM_record_error(rec, &msg, &addinfo, &diagset);
-            
+
             printf("%lld %s: %s (%s:%d) %s\n", (long long) pos,
                    (db ? db : "unknown"),
                    msg, diagset, error, addinfo ? addinfo : "none");
@@ -400,7 +413,13 @@ static int cmd_ext(ZOOM_connection *c, ZOOM_resultset *r,
     int i;
     int ret = 0;
     WRBUF ext_type_str = next_token_new_wrbuf(args);
-    
+
+    if (!ext_type_str)
+    {
+        printf("es: missing type "
+               "(itemorder, create, drop, commit, update, xmlupdate)\n");
+        return 1;
+    }
     for (i = 0; i<MAX_CON; i++)
     {
         if (c[i])
@@ -462,7 +481,7 @@ static int cmd_search(ZOOM_connection *c, ZOOM_resultset *r,
     const char *query_str = *args;
     int i;
     int ret = 0;
-    
+
     s = ZOOM_query_create();
     while (*query_str == ' ')
         query_str++;
@@ -514,7 +533,7 @@ static int cmd_search(ZOOM_connection *c, ZOOM_resultset *r,
 
             printf("%s: %lld hits\n", ZOOM_connection_option_get(c[i], "host"),
                    (long long int) ZOOM_resultset_size(r[i]));
-            
+
             facet_num = ZOOM_resultset_facets_size(r[i]);
             if (facet_num)
             {
@@ -551,7 +570,7 @@ static int cmd_scan(ZOOM_connection *c, ZOOM_resultset *r,
     int i;
     int ret = 0;
     ZOOM_scanset s[MAX_CON];
-    
+
     while (*query_str == ' ')
         query_str++;
 
@@ -601,7 +620,7 @@ static int cmd_scan(ZOOM_connection *c, ZOOM_resultset *r,
                 const char *term = ZOOM_scanset_display_term(s[i], p,
                                                              &occ, &len);
                 printf("%.*s %lld\n", (int) len, term, (long long int) occ);
-            }            
+            }
             ZOOM_scanset_destroy(s[i]);
         }
     }
@@ -615,10 +634,10 @@ static int cmd_sort(ZOOM_connection *c, ZOOM_resultset *r,
     const char *sort_spec = *args;
     int i;
     int ret = 0;
-    
+
     while (*sort_spec == ' ')
         sort_spec++;
-    
+
     for (i = 0; i<MAX_CON; i++)
     {
         if (r[i])
@@ -642,6 +661,7 @@ static int cmd_help(ZOOM_connection *c, ZOOM_resultset *r,
     printf("ext <type>\n");
     printf("set <option> [<value>]\n");
     printf("get <option>\n");
+    printf("shell cmdline\n");
     printf("\n");
     printf("options:\n");
     printf(" start\n");
@@ -705,7 +725,7 @@ static int cmd_connect(ZOOM_connection *c, ZOOM_resultset *r,
     }
     c[i] = ZOOM_connection_create(options);
     ZOOM_connection_connect(c[i], wrbuf_cstr(host), 0);
-        
+
     if ((error = ZOOM_connection_error_x(c[i], &errmsg, &addinfo, &dset)))
     {
         printf("%s error: %s (%s:%d) %s\n",
@@ -727,7 +747,7 @@ static int cmd_connect(ZOOM_connection *c, ZOOM_resultset *r,
     \retval -1 EOF (no more commands or quit seen)
 */
 static int cmd_parse(ZOOM_connection *c, ZOOM_resultset *r,
-                     ZOOM_options options, 
+                     ZOOM_options options,
                      const char **buf)
 {
     int cmd_len;
@@ -736,7 +756,7 @@ static int cmd_parse(ZOOM_connection *c, ZOOM_resultset *r,
 
     cmd_len = next_token(buf, &cmd_str);
     if (cmd_len < 0)
-        return -1;
+        return 0;
     if (is_command("quit", cmd_str, cmd_len))
         return -1;
     else if (is_command("set", cmd_str, cmd_len))
@@ -771,6 +791,8 @@ static int cmd_parse(ZOOM_connection *c, ZOOM_resultset *r,
         ret = cmd_scan(c, r, options, buf);
     else if (is_command("sort", cmd_str, cmd_len))
         ret = cmd_sort(c, r, options, buf);
+    else if (is_command("shell", cmd_str, cmd_len))
+        ret = cmd_shell(c, r, options, buf);
     else
     {
         printf("unknown command %.*s\n", cmd_len, cmd_str);
@@ -785,37 +807,43 @@ static int shell(ZOOM_connection *c, ZOOM_resultset *r,
     int res = 0;
     while (res == 0)
     {
-        char buf[1000];
+        char buf[100000];
         char *cp;
         const char *bp = buf;
+        char *line_in = 0;
 #if HAVE_READLINE_READLINE_H
-        char* line_in;
-        line_in = readline("ZOOM>");
-        if (!line_in)
+        if (isatty(0))
         {
-            res = -1;
-            break;
-        }
+            line_in = readline("ZOOM>");
+            if (!line_in)
+            {
+                putchar('\n');
+                res = -1;
+                break;
+            }
 #if HAVE_READLINE_HISTORY_H
-        if (*line_in)
-            add_history(line_in);
+            if (*line_in)
+                add_history(line_in);
 #endif
-        if (strlen(line_in) > 999)
-        {
-            printf("Input line too long\n");
-            res = 1;
-            break;
+            if (strlen(line_in) > sizeof(buf)-1)
+            {
+                printf("Input line too long\n");
+                res = 1;
+                break;
+            }
+            strcpy(buf,line_in);
+            free(line_in);
         }
-        strcpy(buf,line_in);
-        free(line_in);
-#else    
-        printf("ZOOM>"); fflush(stdout);
-        if (!fgets(buf, 999, stdin))
+#endif
+        if (!line_in) /* no line buffer via readline or not enabled at all */
         {
-            res = -1;
-            break;
+            printf("ZOOM>"); fflush(stdout);
+            if (!fgets(buf, sizeof(buf)-1, stdin))
+            {
+                res = -1;
+                break;
+            }
         }
-#endif 
         if ((cp = strchr(buf, '\n')))
             *cp = '\0';
         res = cmd_parse(c, r, options, &bp);