Add readline (etc) support
authorRich Salz <rsalz@openssl.org>
Mon, 27 Apr 2015 03:45:12 +0000 (23:45 -0400)
committerRich Salz <rsalz@openssl.org>
Mon, 27 Apr 2015 03:45:12 +0000 (23:45 -0400)
Compile with -DREADLINE and the appropriate library.

Reviewed-by: Richard Levitte <levitte@openssl.org>
apps/openssl.c

index 2a85145c91b3fd33de4bba9a6438036e648deb14..b42d03101172a27442123287e3fa4bca1cff164b 100644 (file)
@@ -448,9 +448,11 @@ int main(int argc, char *argv[])
     /* ok, lets enter interactive mode */
     for (;;) {
         ret = 0;
-        for (p = buf, n = sizeof buf, i = 0, first = 1;; first = 0) {
-            prompt = first ? "OpenSSL> " : "> ";
+        /* Read a line, continue reading if line ends with \ */
+        for (p = buf, n = sizeof buf, i = 0, first = 1; n > 0; first = 0) {
+            prompt = first ? "openssl : " : "> ";
             p[0] = '\0';
+#ifndef READLINE
             fputs(prompt, stdout);
             fflush(stdout);
             if (!fgets(p, n, stdin))
@@ -465,7 +467,33 @@ int main(int argc, char *argv[])
             i -= 2;
             p += i;
             n -= i;
+#else
+            {
+                extern char *readline(const char *);
+                extern void add_history(const char *cp);
+                char *text;
+
+                char *text = readline(prompt);
+                if (text == NULL)
+                    goto end;
+                i = strlen(text);
+                if (i == 0 || i > n)
+                    break;
+                if (text[i - 1] != '\\') {
+                    p += strlen(strcpy(p, text));
+                    free(text);
+                    add_history(buf);
+                    break;
+                }
+
+                text[i - 1] = '\0';
+                p += strlen(strcpy(p, text));
+                free(text);
+                n -= i;
+            }
+#endif
         }
+
         if (!chopup_args(&arg, buf)) {
             BIO_printf(bio_err, "Can't parse (no memory?)\n");
             break;