diff options
Diffstat (limited to 'client/acronc/main.c')
-rw-r--r-- | client/acronc/main.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/client/acronc/main.c b/client/acronc/main.c index d0e67ef..3f68553 100644 --- a/client/acronc/main.c +++ b/client/acronc/main.c @@ -14,10 +14,12 @@ #include <uv.h> #include <err.h> #include <string.h> +#include <unistd.h> static uv_loop_t lop; uv_loop_t *loop = &lop; static int current_req = -1; +static bool tty = true; static void on_close(uv_handle_t *handle); @@ -47,7 +49,17 @@ static void on_sock_closed(void) { uv_stop(loop); } +static void prompt(void) { + if (tty) { + fprintf(stderr, "> "); + } +} + static int on_input(ac_request_t *req) { + if (req->type == AC_REQUEST_CMD && ((ac_request_cmd_t *) req)->cmd[0] == '\0') { + prompt(); + return 0; + } current_req = req->id; stdin_stop(); LOGD("Stdin is paused."); @@ -56,10 +68,12 @@ static int on_input(ac_request_t *req) { } static int on_sock_ready(void) { + prompt(); return h_stdin(on_input, on_stdin_closed); } static int on_recv(ac_obj_t *obj) { + bool p = false; if (AC_IS_RESPONSE(obj->type)) { ac_response_t *resp = (ac_response_t *) obj; if (resp->id == current_req) { @@ -70,11 +84,16 @@ static int on_recv(ac_obj_t *obj) { LOGEV("Cannot resume stdin: %s", uv_strerror(r)); } else { LOGD("Stdin is resumed."); + p = true; } } } } - return handle_object(obj); + const int retval = handle_object(obj); + if (p) { + prompt(); + } + return retval; } static void on_resolv(int status, const struct addrinfo *ai, void (*on_connected)(bool)) { @@ -95,11 +114,25 @@ static void on_resolv(int status, const struct addrinfo *ai, void (*on_connected } } +static void on_int(void) { + current_req = -1; + int r = stdin_start(); + if (r && r != UV_EALREADY) { + LOGEV("Cannot resume stdin: %s", uv_strerror(r)); + } else { + printf("Interrupt\n"); + prompt(); + } +} + int main(int argc, const char **argv) { int r; if ((r = config_parse(argc, argv, ¶ms))) return r; atexit(cleanup); + if (!isatty(fileno(stdin))) { + tty = false; + } libac_config_t config = { #ifdef DEBUG .out = NULL, @@ -111,7 +144,7 @@ int main(int argc, const char **argv) { if ((r = ac_init(&config))) errx(r, "Cannot initialize Acron library."); if ((r = uv_loop_init(loop))) goto uviniterr; - if ((r = h_signal(on_stdin_closed))) goto uviniterr; + if ((r = h_signal(on_int, on_stdin_closed))) goto uviniterr; if ((r = a_dns(params.host, params.port, on_resolv))) goto uviniterr; if ((r = uv_run(loop, UV_RUN_DEFAULT))) { |