Re: [Qemu-devel] [PATCH 2/5] util: move read_password method out of qemu-img into osdep/oslib

2015-05-12 Thread Eric Blake
On 05/12/2015 10:09 AM, Daniel P. Berrange wrote:
 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);

Should we fix it to use size_t buf_size while at it? (or as a followup,
to keep this one limited to code motion)

Reviewed-by: Eric Blake ebl...@redhat.com

-- 
Eric Blake   eblake redhat com+1-919-301-3266
Libvirt virtualization library http://libvirt.org



signature.asc
Description: OpenPGP digital signature


[Qemu-devel] [PATCH 2/5] util: move read_password method out of qemu-img into osdep/oslib

2015-05-12 Thread Daniel P. Berrange
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;
+