The qemu-img.c file has a read_password() method impl that is
used to prompt for passwords on the console, with impls for
POSIX and Windows. This will be needed by qemu-io.c too, so
move it into the QEMU osdep/oslib files where it can be shared
without code duplication
Signed-off-by: Daniel P. Berrange berra...@redhat.com
---
include/qemu/osdep.h | 2 ++
qemu-img.c | 93 +---
util/oslib-posix.c | 66 +
util/oslib-win32.c | 24 ++
4 files changed, 93 insertions(+), 92 deletions(-)
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
index b3300cc..3247364 100644
--- a/include/qemu/osdep.h
+++ b/include/qemu/osdep.h
@@ -259,4 +259,6 @@ void qemu_set_tty_echo(int fd, bool echo);
void os_mem_prealloc(int fd, char *area, size_t sz);
+int qemu_read_password(char *buf, int buf_size);
+
#endif
diff --git a/qemu-img.c b/qemu-img.c
index 8d30e43..60c820d 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -165,97 +165,6 @@ static int GCC_FMT_ATTR(2, 3) qprintf(bool quiet, const
char *fmt, ...)
return ret;
}
-#if defined(WIN32)
-/* XXX: put correct support for win32 */
-static int 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;
-}
-
-#else
-
-#include termios.h
-
-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);
-}
-
-static int 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') {
-ret = 0;
-break;
-}
-if (i (buf_size - 1))
-buf[i++] = ch;
-}
-}
-term_exit();
-buf[i] = '\0';
-printf(\n);
-return ret;
-}
-#endif
static int print_block_option_help(const char *filename, const char *fmt)
{
@@ -312,7 +221,7 @@ static BlockBackend *img_open(const char *id, const char
*filename,
bs = blk_bs(blk);
if (bdrv_is_encrypted(bs) require_io) {
qprintf(quiet, Disk image '%s' is encrypted.\n, filename);
-if (read_password(password, sizeof(password)) 0) {
+if (qemu_read_password(password, sizeof(password)) 0) {
error_report(No password given);
goto fail;
}
diff --git a/util/oslib-posix.c b/util/oslib-posix.c
index 37ffd96..1c23fd2 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,68 @@ 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') {
+ret = 0;
+