mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
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
4 changed files with 93 additions and 92 deletions
|
@ -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…
Reference in a new issue