Skip to content

Commit

Permalink
util: move read_password method out of qemu-img into osdep/oslib
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
berrange authored and kevmw committed May 22, 2015
1 parent 8336aaf commit d57e4e4
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 92 deletions.
2 changes: 2 additions & 0 deletions include/qemu/osdep.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 1 addition & 92 deletions qemu-img.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;
}
Expand Down
66 changes: 66 additions & 0 deletions util/oslib-posix.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ extern int daemon(int, int);

#include <termios.h>
#include <unistd.h>
#include <termios.h>

#include <glib/gprintf.h>

Expand Down Expand Up @@ -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;
}
24 changes: 24 additions & 0 deletions util/oslib-win32.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

0 comments on commit d57e4e4

Please sign in to comment.