Now that qcow & qcow2 are wired up to get encryption keys via the QCryptoSecret object, all traces of code which had to deal with prompting for passwords can be ripped out.
When the image is initially opened, the encryption key must be available immediately, or an error will be reported. $ qemu-system-x86_64 -drive file=secret.qcow2 qemu-system-x86_64: -drive file=secret.qcow2: Image is encrypted but no secret is provided Users must provide the secret with -object $ echo 123456 > mypasswd.txt qemu-system-x86_64 -drive file=secret.qcow2,keysecret=sec0 -object secret,file=mypasswd.txt,id=sec0 The BDRV_O_NO_IO flag allows this error to be skipped, for use when 'qemu-img info' wants to open the file to query the headers, but not perform any actual I/O operations. Signed-off-by: Daniel P. Berrange <berra...@redhat.com> --- block/qcow.c | 7 +++++ block/qcow2.c | 13 +++++++-- hmp.c | 31 --------------------- hw/usb/dev-storage.c | 32 --------------------- include/block/block.h | 1 + include/monitor/monitor.h | 7 ----- include/qemu/osdep.h | 2 -- monitor.c | 65 ------------------------------------------- qemu-img.c | 46 ++++++++++++------------------ qemu-io.c | 21 -------------- qmp.c | 8 ------ tests/qemu-iotests/087 | 20 ++++++++++++++ tests/qemu-iotests/087.out | 2 ++ tests/qemu-iotests/134 | 17 ++++++++---- tests/qemu-iotests/134.out | 8 ------ tests/qemu-iotests/common.rc | 4 +-- util/oslib-posix.c | 66 -------------------------------------------- util/oslib-win32.c | 24 ---------------- 18 files changed, 72 insertions(+), 302 deletions(-) diff --git a/block/qcow.c b/block/qcow.c index 719ed7c..ff80ef5 100644 --- a/block/qcow.c +++ b/block/qcow.c @@ -231,6 +231,13 @@ static int qcow_open(BlockDriverState *bs, QDict *options, int flags, if (s->crypt_method_header) { bs->encrypted = 1; } + if (!(flags & BDRV_O_NO_IO) && + bs->encrypted && !s->cipher) { + error_setg(errp, "Image is encrypted but no secret is provided"); + ret = -EINVAL; + goto fail; + } + s->cluster_bits = header.cluster_bits; s->cluster_size = 1 << s->cluster_bits; s->cluster_sectors = 1 << (s->cluster_bits - 9); diff --git a/block/qcow2.c b/block/qcow2.c index 3b108b0..6ca2b25 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -1136,6 +1136,13 @@ static int qcow2_open(BlockDriverState *bs, QDict *options, int flags, goto fail; } + if (!(flags & BDRV_O_NO_IO) && + bs->encrypted && !s->cipher) { + error_setg(errp, "Image is encrypted but no secret is provided"); + ret = -EINVAL; + goto fail; + } + s->cluster_cache = g_malloc(s->cluster_size); /* one more sector for decompressed data alignment */ s->cluster_data = qemu_try_blockalign(bs->file->bs, QCOW_MAX_CRYPT_CLUSTERS @@ -2207,7 +2214,8 @@ static int qcow2_create2(const char *filename, int64_t total_size, options = qdict_new(); qdict_put(options, "driver", qstring_from_str("qcow2")); ret = bdrv_open(&bs, filename, NULL, options, - BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_NO_FLUSH, + BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_NO_FLUSH | + BDRV_O_NO_IO, &local_err); if (ret < 0) { error_propagate(errp, local_err); @@ -2261,7 +2269,8 @@ static int qcow2_create2(const char *filename, int64_t total_size, options = qdict_new(); qdict_put(options, "driver", qstring_from_str("qcow2")); ret = bdrv_open(&bs, filename, NULL, options, - BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_NO_BACKING, + BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_NO_BACKING | + BDRV_O_NO_IO, &local_err); if (local_err) { error_propagate(errp, local_err); diff --git a/hmp.c b/hmp.c index 409d05d..8036642 100644 --- a/hmp.c +++ b/hmp.c @@ -959,37 +959,12 @@ void hmp_ringbuf_read(Monitor *mon, const QDict *qdict) g_free(data); } -static void hmp_cont_cb(void *opaque, int err) -{ - if (!err) { - qmp_cont(NULL); - } -} - -static bool key_is_missing(const BlockInfo *bdev) -{ - return (bdev->inserted && bdev->inserted->encryption_key_missing); -} - void hmp_cont(Monitor *mon, const QDict *qdict) { - BlockInfoList *bdev_list, *bdev; Error *err = NULL; - bdev_list = qmp_query_block(NULL); - for (bdev = bdev_list; bdev; bdev = bdev->next) { - if (key_is_missing(bdev->value)) { - monitor_read_block_device_key(mon, bdev->value->device, - hmp_cont_cb, NULL); - goto out; - } - } - qmp_cont(&err); hmp_handle_error(mon, &err); - -out: - qapi_free_BlockInfoList(bdev_list); } void hmp_system_wakeup(Monitor *mon, const QDict *qdict) @@ -1349,12 +1324,6 @@ void hmp_change(Monitor *mon, const QDict *qdict) } qmp_change(device, target, !!arg, arg, &err); - if (err && - error_get_class(err) == ERROR_CLASS_DEVICE_ENCRYPTED) { - error_free(err); - monitor_read_block_device_key(mon, device, NULL, NULL); - return; - } hmp_handle_error(mon, &err); } diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 9a4e7dc..2122f4f 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -553,21 +553,6 @@ static void usb_msd_handle_data(USBDevice *dev, USBPacket *p) } } -static void usb_msd_password_cb(void *opaque, int err) -{ - MSDState *s = opaque; - Error *local_err = NULL; - - if (!err) { - usb_device_attach(&s->dev, &local_err); - } - - if (local_err) { - error_report_err(local_err); - qdev_unplug(&s->dev.qdev, NULL); - } -} - static void *usb_msd_load_request(QEMUFile *f, SCSIRequest *req) { MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); @@ -613,23 +598,6 @@ static void usb_msd_realize_storage(USBDevice *dev, Error **errp) return; } - bdrv_add_key(blk_bs(blk), NULL, &err); - if (err) { - if (monitor_cur_is_qmp()) { - error_propagate(errp, err); - return; - } - error_free(err); - err = NULL; - if (cur_mon) { - monitor_read_bdrv_key_start(cur_mon, blk_bs(blk), - usb_msd_password_cb, s); - s->dev.auto_attach = 0; - } else { - autostart = 0; - } - } - blkconf_serial(&s->conf, &dev->serial); blkconf_blocksizes(&s->conf); diff --git a/include/block/block.h b/include/block/block.h index 6d70eb4..ac776b2 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -90,6 +90,7 @@ typedef struct HDGeometry { #define BDRV_O_PROTOCOL 0x8000 /* if no block driver is explicitly given: select an appropriate protocol driver, ignoring the format layer */ +#define BDRV_O_NO_IO 0x10000 /* don't initialize for I/O */ #define BDRV_O_CACHE_MASK (BDRV_O_NOCACHE | BDRV_O_CACHE_WB | BDRV_O_NO_FLUSH) diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h index aa0f373..cd38020 100644 --- a/include/monitor/monitor.h +++ b/include/monitor/monitor.h @@ -21,13 +21,6 @@ void monitor_init(CharDriverState *chr, int flags); int monitor_suspend(Monitor *mon); void monitor_resume(Monitor *mon); -int monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs, - BlockCompletionFunc *completion_cb, - void *opaque); -int monitor_read_block_device_key(Monitor *mon, const char *device, - BlockCompletionFunc *completion_cb, - void *opaque); - int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp); int monitor_fd_param(Monitor *mon, const char *fdname, Error **errp); diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h index ef21efb..65aa1ea 100644 --- a/include/qemu/osdep.h +++ b/include/qemu/osdep.h @@ -284,6 +284,4 @@ 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/monitor.c b/monitor.c index 4f1ba2f..73c0633 100644 --- a/monitor.c +++ b/monitor.c @@ -4093,71 +4093,6 @@ void monitor_init(CharDriverState *chr, int flags) qemu_mutex_unlock(&monitor_lock); } -static void bdrv_password_cb(void *opaque, const char *password, - void *readline_opaque) -{ - Monitor *mon = opaque; - BlockDriverState *bs = readline_opaque; - int ret = 0; - Error *local_err = NULL; - - bdrv_add_key(bs, password, &local_err); - if (local_err) { - monitor_printf(mon, "%s\n", error_get_pretty(local_err)); - error_free(local_err); - ret = -EPERM; - } - if (mon->password_completion_cb) - mon->password_completion_cb(mon->password_opaque, ret); - - monitor_read_command(mon, 1); -} - -int monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs, - BlockCompletionFunc *completion_cb, - void *opaque) -{ - int err; - - monitor_printf(mon, "%s (%s) is encrypted.\n", bdrv_get_device_name(bs), - bdrv_get_encrypted_filename(bs)); - - mon->password_completion_cb = completion_cb; - mon->password_opaque = opaque; - - err = monitor_read_password(mon, bdrv_password_cb, bs); - - if (err && completion_cb) - completion_cb(opaque, err); - - return err; -} - -int monitor_read_block_device_key(Monitor *mon, const char *device, - BlockCompletionFunc *completion_cb, - void *opaque) -{ - Error *err = NULL; - BlockBackend *blk; - - blk = blk_by_name(device); - if (!blk) { - monitor_printf(mon, "Device not found %s\n", device); - return -1; - } - - bdrv_add_key(blk_bs(blk), NULL, &err); - if (err) { - error_free(err); - return monitor_read_bdrv_key_start(mon, blk_bs(blk), completion_cb, opaque); - } - - if (completion_cb) { - completion_cb(opaque, 0); - } - return 0; -} - QemuOptsList qemu_mon_opts = { .name = "mon", .implied_opt_name = "chardev", diff --git a/qemu-img.c b/qemu-img.c index 30869fe..76766f2 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -303,11 +303,9 @@ static BlockBackend *img_open_opts(const char *id, static BlockBackend *img_open_file(const char *id, const char *filename, const char *fmt, int flags, - bool require_io, bool quiet) + bool quiet) { BlockBackend *blk; - BlockDriverState *bs; - char password[256]; Error *local_err = NULL; QDict *options = NULL; @@ -324,18 +322,6 @@ static BlockBackend *img_open_file(const char *id, const char *filename, goto fail; } - bs = blk_bs(blk); - if (bdrv_is_encrypted(bs) && require_io) { - qprintf(quiet, "Disk image '%s' is encrypted.\n", filename); - if (qemu_read_password(password, sizeof(password)) < 0) { - error_report("No password given"); - goto fail; - } - if (bdrv_set_key(bs, password) < 0) { - error_report("invalid password"); - goto fail; - } - } return blk; fail: blk_unref(blk); @@ -727,7 +713,7 @@ static int img_check(int argc, char **argv) } blk = img_open_opts("image", opts, flags); } else { - blk = img_open_file("image", filename, fmt, flags, true, quiet); + blk = img_open_file("image", filename, fmt, flags, quiet); } if (!blk) { return 1; @@ -942,7 +928,7 @@ static int img_commit(int argc, char **argv) } blk = img_open_opts("image", opts, flags); } else { - blk = img_open_file("image", filename, fmt, flags, true, quiet); + blk = img_open_file("image", filename, fmt, flags, quiet); } if (!blk) { return 1; @@ -1312,13 +1298,13 @@ static int img_compare(int argc, char **argv) goto out3; } } else { - blk1 = img_open_file("image_1", filename1, fmt1, flags, true, quiet); + blk1 = img_open_file("image_1", filename1, fmt1, flags, quiet); if (!blk1) { ret = 2; goto out3; } - blk2 = img_open_file("image_2", filename2, fmt2, flags, true, quiet); + blk2 = img_open_file("image_2", filename2, fmt2, flags, quiet); if (!blk2) { ret = 2; goto out2; @@ -2012,7 +1998,7 @@ static int img_convert(int argc, char **argv) opts = qemu_opts_next(opts); } else { blk[bs_i] = img_open_file(id, argv[optind + bs_i], fmt, src_flags, - true, quiet); + quiet); } g_free(id); if (!blk[bs_i]) { @@ -2162,7 +2148,7 @@ static int img_convert(int argc, char **argv) * the bdrv_create() call which takes different params */ out_blk = img_open_file("target", out_filename, - out_fmt, flags, true, quiet); + out_fmt, flags, quiet); if (!out_blk) { ret = -1; goto out; @@ -2360,12 +2346,14 @@ static ImageInfoList *collect_image_info_list(QemuOpts *opts, goto err; } blk = img_open_opts("image", opts, - BDRV_O_FLAGS | BDRV_O_NO_BACKING); + BDRV_O_FLAGS | BDRV_O_NO_BACKING | + BDRV_O_NO_IO); opts = NULL; } else { blk = img_open_file("image", filename, fmt, - BDRV_O_FLAGS | BDRV_O_NO_BACKING, - false, false); + BDRV_O_FLAGS | BDRV_O_NO_BACKING | + BDRV_O_NO_IO, + false); } if (!blk) { goto err; @@ -2701,7 +2689,7 @@ static int img_map(int argc, char **argv) } blk = img_open_opts("image", opts, BDRV_O_FLAGS); } else { - blk = img_open_file("image", filename, fmt, BDRV_O_FLAGS, true, false); + blk = img_open_file("image", filename, fmt, BDRV_O_FLAGS, false); } if (!blk) { return 1; @@ -2867,7 +2855,7 @@ static int img_snapshot(int argc, char **argv) if (opts) { blk = img_open_opts("image", opts, bdrv_oflags); } else { - blk = img_open_file("image", filename, NULL, bdrv_oflags, true, quiet); + blk = img_open_file("image", filename, NULL, bdrv_oflags, quiet); } if (!blk) { return 1; @@ -3057,7 +3045,7 @@ static int img_rebase(int argc, char **argv) } blk = img_open_opts("image", opts, flags); } else { - blk = img_open_file("image", filename, fmt, flags, true, quiet); + blk = img_open_file("image", filename, fmt, flags, quiet); } if (!blk) { ret = -1; @@ -3415,7 +3403,7 @@ static int img_resize(int argc, char **argv) blk = img_open_opts("image", opts, BDRV_O_FLAGS | BDRV_O_RDWR); } else { blk = img_open_file("image", filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR, - true, quiet); + quiet); } if (!blk) { ret = -1; @@ -3592,7 +3580,7 @@ static int img_amend(int argc, char **argv) } blk = img_open_opts("image", opts, BDRV_O_FLAGS | BDRV_O_RDWR); } else { - blk = img_open_file("image", filename, fmt, flags, true, quiet); + blk = img_open_file("image", filename, fmt, flags, quiet); } if (!blk) { ret = -1; diff --git a/qemu-io.c b/qemu-io.c index fc7f81b..0018bfa 100644 --- a/qemu-io.c +++ b/qemu-io.c @@ -56,7 +56,6 @@ static const cmdinfo_t close_cmd = { static int openfile(char *name, int flags, QDict *opts) { Error *local_err = NULL; - BlockDriverState *bs; if (qemuio_blk) { fprintf(stderr, "file open already, try 'help close'\n"); @@ -73,27 +72,7 @@ static int openfile(char *name, int flags, QDict *opts) return 1; } - bs = blk_bs(qemuio_blk); - if (bdrv_is_encrypted(bs)) { - char password[256]; - printf("Disk image '%s' is encrypted.\n", name); - if (qemu_read_password(password, sizeof(password)) < 0) { - error_report("No password given"); - goto error; - } - if (bdrv_set_key(bs, password) < 0) { - error_report("invalid password"); - goto error; - } - } - - return 0; - - error: - blk_unref(qemuio_blk); - qemuio_blk = NULL; - return 1; } static void open_help(void) diff --git a/qmp.c b/qmp.c index feea847..3a9940f 100644 --- a/qmp.c +++ b/qmp.c @@ -169,7 +169,6 @@ SpiceInfo *qmp_query_spice(Error **errp) void qmp_cont(Error **errp) { - Error *local_err = NULL; BlockDriverState *bs; if (runstate_needs_reset()) { @@ -182,13 +181,6 @@ void qmp_cont(Error **errp) for (bs = bdrv_next(NULL); bs; bs = bdrv_next(bs)) { bdrv_iostatus_reset(bs); } - for (bs = bdrv_next(NULL); bs; bs = bdrv_next(bs)) { - bdrv_add_key(bs, NULL, &local_err); - if (local_err) { - error_propagate(errp, local_err); - return; - } - } if (runstate_check(RUN_STATE_INMIGRATE)) { autostart = 1; diff --git a/tests/qemu-iotests/087 b/tests/qemu-iotests/087 index 8694749..e386267 100755 --- a/tests/qemu-iotests/087 +++ b/tests/qemu-iotests/087 @@ -187,11 +187,21 @@ echo _make_test_img -o encryption=on $size run_qemu -S <<EOF { "execute": "qmp_capabilities" } +{ "execute": "object-add", + "arguments": { + "qom-type": "secret", + "id": "sec0", + "props": { + "data": "123456" + } + } +} { "execute": "blockdev-add", "arguments": { "options": { "driver": "$IMGFMT", "id": "disk", + "keyid": "sec0", "file": { "driver": "file", "filename": "$TEST_IMG" @@ -204,11 +214,21 @@ EOF run_qemu <<EOF { "execute": "qmp_capabilities" } +{ "execute": "object-add", + "arguments": { + "qom-type": "secret", + "id": "sec0", + "props": { + "data": "123456" + } + } +} { "execute": "blockdev-add", "arguments": { "options": { "driver": "$IMGFMT", "id": "disk", + "keyid": "sec0", "file": { "driver": "file", "filename": "$TEST_IMG" diff --git a/tests/qemu-iotests/087.out b/tests/qemu-iotests/087.out index c509a40..8299f81 100644 --- a/tests/qemu-iotests/087.out +++ b/tests/qemu-iotests/087.out @@ -48,6 +48,7 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 encryption=on Testing: -S QMP_VERSION {"return": {}} +{"return": {}} Encrypted images are deprecated Support for them will be removed in a future release. You can use 'qemu-img convert' to convert your image to an unencrypted one. @@ -58,6 +59,7 @@ You can use 'qemu-img convert' to convert your image to an unencrypted one. Testing: QMP_VERSION {"return": {}} +{"return": {}} Encrypted images are deprecated Support for them will be removed in a future release. You can use 'qemu-img convert' to convert your image to an unencrypted one. diff --git a/tests/qemu-iotests/134 b/tests/qemu-iotests/134 index 1c3820b..a247473 100755 --- a/tests/qemu-iotests/134 +++ b/tests/qemu-iotests/134 @@ -44,23 +44,30 @@ _supported_os Linux size=128M -IMGOPTS="encryption=on" _make_test_img $size +SECRET1=secret,id=sec0,data=astrochicken +SECRET2=secret,id=sec0,data=platypus + +EXTRA_IMG_ARGS="--object $SECRET1" IMGOPTS="encryption=on" _make_test_img $size + + +QEMU_IO_OPTIONS=`echo $QEMU_IO_OPTIONS | sed -e 's/-f qcow2//'` +TEST_IMG="driver=qcow2,file=$TEST_IMG,keyid=sec0" echo echo "== reading whole image ==" -echo "astrochicken" | $QEMU_IO -c "read 0 $size" "$TEST_IMG" | _filter_qemu_io | _filter_testdir +$QEMU_IO --object $SECRET1 -c "read 0 $size" --source "$TEST_IMG" | _filter_qemu_io | _filter_testdir echo echo "== rewriting whole image ==" -echo "astrochicken" | $QEMU_IO -c "write -P 0xa 0 $size" "$TEST_IMG" | _filter_qemu_io | _filter_testdir +$QEMU_IO --object $SECRET1 -c "write -P 0xa 0 $size" --source "$TEST_IMG" | _filter_qemu_io | _filter_testdir echo echo "== verify pattern ==" -echo "astrochicken" | $QEMU_IO -c "read -P 0xa 0 $size" "$TEST_IMG" | _filter_qemu_io | _filter_testdir +$QEMU_IO --object $SECRET1 -c "read -P 0xa 0 $size" --source "$TEST_IMG" | _filter_qemu_io | _filter_testdir echo echo "== verify pattern failure with wrong password ==" -echo "platypus" | $QEMU_IO -c "read -P 0xa 0 $size" "$TEST_IMG" | _filter_qemu_io | _filter_testdir +$QEMU_IO --object $SECRET2 -c "read -P 0xa 0 $size" --source "$TEST_IMG" | _filter_qemu_io | _filter_testdir # success, all done diff --git a/tests/qemu-iotests/134.out b/tests/qemu-iotests/134.out index a16acb8..845aa57 100644 --- a/tests/qemu-iotests/134.out +++ b/tests/qemu-iotests/134.out @@ -11,8 +11,6 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 encryption=on Encrypted images are deprecated Support for them will be removed in a future release. You can use 'qemu-img convert' to convert your image to an unencrypted one. -Disk image 'TEST_DIR/t.qcow2' is encrypted. -password: read 134217728/134217728 bytes at offset 0 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) @@ -20,8 +18,6 @@ read 134217728/134217728 bytes at offset 0 Encrypted images are deprecated Support for them will be removed in a future release. You can use 'qemu-img convert' to convert your image to an unencrypted one. -Disk image 'TEST_DIR/t.qcow2' is encrypted. -password: wrote 134217728/134217728 bytes at offset 0 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) @@ -29,8 +25,6 @@ wrote 134217728/134217728 bytes at offset 0 Encrypted images are deprecated Support for them will be removed in a future release. You can use 'qemu-img convert' to convert your image to an unencrypted one. -Disk image 'TEST_DIR/t.qcow2' is encrypted. -password: read 134217728/134217728 bytes at offset 0 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) @@ -38,8 +32,6 @@ read 134217728/134217728 bytes at offset 0 Encrypted images are deprecated Support for them will be removed in a future release. You can use 'qemu-img convert' to convert your image to an unencrypted one. -Disk image 'TEST_DIR/t.qcow2' is encrypted. -password: Pattern verification failed at offset 0, 134217728 bytes read 134217728/134217728 bytes at offset 0 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) diff --git a/tests/qemu-iotests/common.rc b/tests/qemu-iotests/common.rc index 28e4bea..405a932 100644 --- a/tests/qemu-iotests/common.rc +++ b/tests/qemu-iotests/common.rc @@ -145,9 +145,9 @@ _make_test_img() # XXX(hch): have global image options? ( if [ $use_backing = 1 ]; then - $QEMU_IMG create -f $IMGFMT $extra_img_options -b "$backing_file" "$img_name" $image_size 2>&1 + $QEMU_IMG create $EXTRA_IMG_ARGS -f $IMGFMT $extra_img_options -b "$backing_file" "$img_name" $image_size 2>&1 else - $QEMU_IMG create -f $IMGFMT $extra_img_options "$img_name" $image_size 2>&1 + $QEMU_IMG create $EXTRA_IMG_ARGS -f $IMGFMT $extra_img_options "$img_name" $image_size 2>&1 fi ) | _filter_img_create diff --git a/util/oslib-posix.c b/util/oslib-posix.c index a0fcdc2..9121ed5 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -424,69 +424,3 @@ 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' || - ch == '\n') { - ret = 0; - break; - } - if (i < (buf_size - 1)) { - buf[i++] = ch; - } - } - } - term_exit(); - buf[i] = '\0'; - printf("\n"); - return ret; -} diff --git a/util/oslib-win32.c b/util/oslib-win32.c index 08f5a9c..e27f391 100644 --- a/util/oslib-win32.c +++ b/util/oslib-win32.c @@ -472,27 +472,3 @@ 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; -} -- 2.4.3