diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2015-05-22 17:20:09 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2015-05-22 17:20:09 +0100 |
commit | 0d2ed6039cf86fe3a78671e32b5e3eb17d725762 (patch) | |
tree | 96ced81e7026fb89b0e6dda603a2a757f538fe70 /util | |
parent | bb2fa17f182ee0b45b53474f76679944fc891f04 (diff) | |
parent | 4120201d2fcfc24404fe6eb6b761b66bc35bca16 (diff) | |
download | qemu-0d2ed6039cf86fe3a78671e32b5e3eb17d725762.zip qemu-0d2ed6039cf86fe3a78671e32b5e3eb17d725762.tar.gz qemu-0d2ed6039cf86fe3a78671e32b5e3eb17d725762.tar.bz2 |
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging
Block layer core and image format patches
# gpg: Signature made Fri May 22 16:21:03 2015 BST using RSA key ID C88F2FD6
# gpg: Good signature from "Kevin Wolf <kwolf@redhat.com>"
* remotes/kevin/tags/for-upstream: (22 commits)
MAINTAINERS: Split "Block QAPI, monitor, command line" off core
MAINTAINERS: Add header files to Block Layer Core section
tests: add test case for encrypted qcow2 read/write
qemu-io: prompt for encryption keys when required
util: allow \n to terminate password input
util: move read_password method out of qemu-img into osdep/oslib
qcow2/qcow: protect against uninitialized encryption key
qemu-iotests: Make debugging python tests easier
qemu-iotests: qemu-img info on afl VMDK image with a huge capacity
block: Detect multiplication overflow in bdrv_getlength
qemu-io: Use getopt() correctly
qcow2: style fixes in qcow2-cache.c
qcow2: make qcow2_cache_put() a void function
qcow2: use a hash to look for entries in the L2 cache
qcow2: remove qcow2_cache_find_entry_to_replace()
qcow2: use an LRU algorithm to replace entries from the L2 cache
qcow2: simplify qcow2_cache_put() and qcow2_cache_entry_mark_dirty()
qcow2: use one single memory block for the L2/refcount cache tables
vmdk: Fix overflow if l1_size is 0x20000000
vmdk: Fix next_cluster_sector for compressed write
...
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'util')
-rw-r--r-- | util/oslib-posix.c | 67 | ||||
-rw-r--r-- | util/oslib-win32.c | 24 |
2 files changed, 91 insertions, 0 deletions
diff --git a/util/oslib-posix.c b/util/oslib-posix.c index 37ffd96..3ae4987 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -50,6 +50,7 @@ extern int daemon(int, int); #include <termios.h> #include <unistd.h> +#include <termios.h> #include <glib/gprintf.h> @@ -415,3 +416,69 @@ void os_mem_prealloc(int fd, char *area, size_t memory) pthread_sigmask(SIG_SETMASK, &oldset, NULL); } } + + +static struct termios oldtty; + +static void term_exit(void) +{ + tcsetattr(0, TCSANOW, &oldtty); +} + +static void term_init(void) +{ + struct termios tty; + + tcgetattr(0, &tty); + oldtty = tty; + + tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP + |INLCR|IGNCR|ICRNL|IXON); + tty.c_oflag |= OPOST; + tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN); + tty.c_cflag &= ~(CSIZE|PARENB); + tty.c_cflag |= CS8; + tty.c_cc[VMIN] = 1; + tty.c_cc[VTIME] = 0; + + tcsetattr(0, TCSANOW, &tty); + + atexit(term_exit); +} + +int qemu_read_password(char *buf, int buf_size) +{ + uint8_t ch; + int i, ret; + + printf("password: "); + fflush(stdout); + term_init(); + i = 0; + for (;;) { + ret = read(0, &ch, 1); + if (ret == -1) { + if (errno == EAGAIN || errno == EINTR) { + continue; + } else { + break; + } + } else if (ret == 0) { + ret = -1; + break; + } else { + if (ch == '\r' || + ch == '\n') { + ret = 0; + break; + } + if (i < (buf_size - 1)) { + buf[i++] = ch; + } + } + } + term_exit(); + buf[i] = '\0'; + printf("\n"); + return ret; +} diff --git a/util/oslib-win32.c b/util/oslib-win32.c index 87cfbe0..730a670 100644 --- a/util/oslib-win32.c +++ b/util/oslib-win32.c @@ -470,3 +470,27 @@ void os_mem_prealloc(int fd, char *area, size_t memory) memset(area + pagesize * i, 0, 1); } } + + +/* XXX: put correct support for win32 */ +int qemu_read_password(char *buf, int buf_size) +{ + int c, i; + + printf("Password: "); + fflush(stdout); + i = 0; + for (;;) { + c = getchar(); + if (c < 0) { + buf[i] = '\0'; + return -1; + } else if (c == '\n') { + break; + } else if (i < (buf_size - 1)) { + buf[i++] = c; + } + } + buf[i] = '\0'; + return 0; +} |