zoomsh: allow shell command to be executed
[yaz-moved-to-github.git] / zoom / zoomsh.c
index 601dafc..c5019aa 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2011 Index Data
+ * Copyright (C) 1995-2012 Index Data
  * See the file LICENSE for details.
  */
 /** \file zoomsh.c
@@ -148,6 +148,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)
@@ -401,6 +410,12 @@ static int cmd_ext(ZOOM_connection *c, ZOOM_resultset *r,
     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])
@@ -642,6 +657,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");
@@ -771,6 +787,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,7 +803,7 @@ 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;
 #if HAVE_READLINE_READLINE_H
@@ -800,7 +818,7 @@ static int shell(ZOOM_connection *c, ZOOM_resultset *r,
         if (*line_in)
             add_history(line_in);
 #endif
-        if (strlen(line_in) > 999)
+        if (strlen(line_in) > sizeof(buf)-1)
         {
             printf("Input line too long\n");
             res = 1;
@@ -810,7 +828,7 @@ static int shell(ZOOM_connection *c, ZOOM_resultset *r,
         free(line_in);
 #else    
         printf("ZOOM>"); fflush(stdout);
-        if (!fgets(buf, 999, stdin))
+        if (!fgets(buf, sizeof(buf)-1, stdin))
         {
             res = -1;
             break;