util: move read_password method out of qemu-img into osdep/oslib
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 <berrange@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		
							parent
							
								
									8336aafae1
								
							
						
					
					
						commit
						d57e4e482e
					
				@ -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
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										93
									
								
								qemu-img.c
									
									
									
									
									
								
							
							
						
						
									
										93
									
								
								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;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            if (i < (buf_size - 1)) {
 | 
			
		||||
                buf[i++] = ch;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    term_exit();
 | 
			
		||||
    buf[i] = '\0';
 | 
			
		||||
    printf("\n");
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user