summaryrefslogtreecommitdiffstats
path: root/apps/openssl.c
diff options
context:
space:
mode:
authorRich Salz <rsalz@openssl.org>2015-04-26 23:45:12 -0400
committerRich Salz <rsalz@openssl.org>2015-04-26 23:45:12 -0400
commit57d5edada75686fb1c19ce1bbf3e16f4f2784303 (patch)
tree758692372319cc897143dc63fe472a56c2513452 /apps/openssl.c
parent1bb2daead8cf3962098647efa1f74c3bce3e9009 (diff)
Add readline (etc) support
Compile with -DREADLINE and the appropriate library. Reviewed-by: Richard Levitte <levitte@openssl.org>
Diffstat (limited to 'apps/openssl.c')
-rw-r--r--apps/openssl.c32
1 files changed, 30 insertions, 2 deletions
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;