X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=cmd.c;h=db2c9c4c5ee066ca43a9210b6fc6d25d80c40033;hb=bb6d5498c6756eba3d0779c7753fc8830a8a9078;hp=cc70311b9f2ddbcd0da1e9298692b4ac2226b66e;hpb=22a2bdcbae5aa256eb3d4179b29f1699b62dc110;p=qemu.git diff --git a/cmd.c b/cmd.c index cc70311b9..db2c9c4c5 100644 --- a/cmd.c +++ b/cmd.c @@ -24,6 +24,7 @@ #include #include "cmd.h" +#include "qemu-aio.h" #define _(x) x /* not gettext support yet */ @@ -149,10 +150,20 @@ add_args_command( args_func = af; } +static void prep_fetchline(void *opaque) +{ + int *fetchable = opaque; + + qemu_aio_set_fd_handler(STDIN_FILENO, NULL, NULL, NULL, NULL, NULL); + *fetchable= 1; +} + +static char *get_prompt(void); + void command_loop(void) { - int c, i, j = 0, done = 0; + int c, i, j = 0, done = 0, fetchable = 0, prompted = 0; char *input; char **v; const cmdinfo_t *ct; @@ -186,7 +197,21 @@ command_loop(void) free(cmdline); return; } + while (!done) { + if (!prompted) { + printf("%s", get_prompt()); + fflush(stdout); + qemu_aio_set_fd_handler(STDIN_FILENO, prep_fetchline, NULL, NULL, + NULL, &fetchable); + prompted = 1; + } + + qemu_aio_wait(); + + if (!fetchable) { + continue; + } if ((input = fetchline()) == NULL) break; v = breakline(input, &c); @@ -199,7 +224,11 @@ command_loop(void) v[0]); } doneline(input, v); + + prompted = 0; + fetchable = 0; } + qemu_aio_set_fd_handler(STDIN_FILENO, NULL, NULL, NULL, NULL, NULL); } /* from libxcmd/input.c */ @@ -270,8 +299,6 @@ fetchline(void) if (!line) return NULL; - printf("%s", get_prompt()); - fflush(stdout); if (!fgets(line, MAXREADLINESZ, stdin)) { free(line); return NULL; @@ -287,7 +314,8 @@ static char *qemu_strsep(char **input, const char *delim) { char *result = *input; if (result != NULL) { - char *p = result; + char *p; + for (p = result; *p != '\0'; p++) { if (strchr(delim, *p)) { break;