From: Rich Salz Date: Mon, 27 Apr 2015 03:45:12 +0000 (-0400) Subject: Add readline (etc) support X-Git-Tag: OpenSSL_1_1_0-pre1~1268 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=57d5edada75686fb1c19ce1bbf3e16f4f2784303;p=openssl Add readline (etc) support Compile with -DREADLINE and the appropriate library. Reviewed-by: Richard Levitte --- diff --git a/apps/openssl.c b/apps/openssl.c index 2a85145c91..b42d031011 100644 --- a/apps/openssl.c +++ b/apps/openssl.c @@ -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;