diff --git a/src/client.c b/src/client.c index 2493ea4..6c14e22 100644 --- a/src/client.c +++ b/src/client.c @@ -89,9 +89,35 @@ signal_handler(int signum) { } } +#ifdef WITH_READLINE + #include + #include +#else +char * +readline(const char *prompt) { + char line[INPUT_LINE_MAX]; + + while (1) { + line[0] = '\0'; + fputs(prompt, stdout); + if (!fgets(line, sizeof(line) - 1, stdin)) { + if (feof(stdin)) { + fputc('\n', stdout); + } else { + fputs("read error\n", stdout); + } + break; + } + if (line[0] == '\n') + continue; + } + return strdup(line); +} +#endif + int main(int argc, char *argv[]) { struct sigaction act; - char line[INPUT_LINE_MAX] = ""; + char *line = NULL; char opt = '\0'; int ret; @@ -99,7 +125,7 @@ int main(int argc, char *argv[]) { switch (opt) { case 'c': opts.mode = oneshot; - strlcpy(line, optarg, sizeof(line)); + line = strndup(optarg, INPUT_LINE_MAX); break; case 's': strlcpy(opts.csocket_spath, optarg, sizeof(opts.csocket_spath)); @@ -133,19 +159,10 @@ int main(int argc, char *argv[]) { exit(ret); } - while (1) { - fputs("f2b >> ", stdout); - if (!fgets(line, sizeof(line) - 1, stdin)) { - if (feof(stdin)) { - fputc('\n', stdout); - } else { - fputs("read error\n", stdout); - } - break; - } - if (line[0] == '\n') - continue; + while ((line = readline("f2b >> ")) != NULL) { handle_cmd(line); + free(line); + line = NULL; } f2b_csocket_disconnect(opts.csocket, opts.csocket_cpath);