Loading blockdev.c +38 −16 Original line number Diff line number Diff line Loading @@ -717,8 +717,31 @@ void qmp_block_passwd(const char *device, const char *password, Error **errp) } } int do_change_block(Monitor *mon, const char *device, const char *filename, const char *fmt) static void qmp_bdrv_open_encrypted(BlockDriverState *bs, const char *filename, int bdrv_flags, BlockDriver *drv, const char *password, Error **errp) { if (bdrv_open(bs, filename, bdrv_flags, drv) < 0) { error_set(errp, QERR_OPEN_FILE_FAILED, filename); return; } if (bdrv_key_required(bs)) { if (password) { if (bdrv_set_key(bs, password) < 0) { error_set(errp, QERR_INVALID_PASSWORD); } } else { error_set(errp, QERR_DEVICE_ENCRYPTED, bdrv_get_device_name(bs), bdrv_get_encrypted_filename(bs)); } } else if (password) { error_set(errp, QERR_DEVICE_NOT_ENCRYPTED, bdrv_get_device_name(bs)); } } void qmp_change_blockdev(const char *device, const char *filename, bool has_format, const char *format, Error **errp) { BlockDriverState *bs; BlockDriver *drv = NULL; Loading @@ -727,29 +750,28 @@ int do_change_block(Monitor *mon, const char *device, bs = bdrv_find(device); if (!bs) { qerror_report(QERR_DEVICE_NOT_FOUND, device); return -1; error_set(errp, QERR_DEVICE_NOT_FOUND, device); return; } if (fmt) { drv = bdrv_find_whitelisted_format(fmt); if (format) { drv = bdrv_find_whitelisted_format(format); if (!drv) { qerror_report(QERR_INVALID_BLOCK_FORMAT, fmt); return -1; error_set(errp, QERR_INVALID_BLOCK_FORMAT, format); return; } } eject_device(bs, 0, &err); if (error_is_set(&err)) { qerror_report_err(err); error_free(err); return -1; error_propagate(errp, err); return; } bdrv_flags = bdrv_is_read_only(bs) ? 0 : BDRV_O_RDWR; bdrv_flags |= bdrv_is_snapshot(bs) ? BDRV_O_SNAPSHOT : 0; if (bdrv_open(bs, filename, bdrv_flags, drv) < 0) { qerror_report(QERR_OPEN_FILE_FAILED, filename); return -1; } return monitor_read_bdrv_key_start(mon, bs, NULL, NULL); qmp_bdrv_open_encrypted(bs, filename, bdrv_flags, drv, NULL, errp); } /* throttling disk I/O limits */ Loading blockdev.h +3 −2 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ #define BLOCKDEV_H #include "block.h" #include "error.h" #include "qemu-queue.h" void blockdev_mark_auto_del(BlockDriverState *bs); Loading Loading @@ -57,9 +58,9 @@ DriveInfo *drive_init(QemuOpts *arg, int default_to_scsi); DriveInfo *add_init_drive(const char *opts); void qmp_change_blockdev(const char *device, const char *filename, bool has_format, const char *format, Error **errp); void do_commit(Monitor *mon, const QDict *qdict); int do_change_block(Monitor *mon, const char *device, const char *filename, const char *fmt); int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data); int do_block_set_io_throttle(Monitor *mon, const QDict *qdict, QObject **ret_data); Loading hmp-commands.hx +1 −2 Original line number Diff line number Diff line Loading @@ -107,8 +107,7 @@ ETEXI .args_type = "device:B,target:F,arg:s?", .params = "device filename [format]", .help = "change a removable medium, optional format", .user_print = monitor_user_noop, .mhandler.cmd_new = do_change, .mhandler.cmd = hmp_change, }, STEXI Loading hmp.c +57 −0 Original line number Diff line number Diff line Loading @@ -712,3 +712,60 @@ void hmp_eject(Monitor *mon, const QDict *qdict) qmp_eject(device, true, force, &err); hmp_handle_error(mon, &err); } static void hmp_change_read_arg(Monitor *mon, const char *password, void *opaque) { qmp_change_vnc_password(password, NULL); monitor_read_command(mon, 1); } static void cb_hmp_change_bdrv_pwd(Monitor *mon, const char *password, void *opaque) { Error *encryption_err = opaque; Error *err = NULL; const char *device; device = error_get_field(encryption_err, "device"); qmp_block_passwd(device, password, &err); hmp_handle_error(mon, &err); error_free(encryption_err); monitor_read_command(mon, 1); } void hmp_change(Monitor *mon, const QDict *qdict) { const char *device = qdict_get_str(qdict, "device"); const char *target = qdict_get_str(qdict, "target"); const char *arg = qdict_get_try_str(qdict, "arg"); Error *err = NULL; if (strcmp(device, "vnc") == 0 && (strcmp(target, "passwd") == 0 || strcmp(target, "password") == 0)) { if (!arg) { monitor_read_password(mon, hmp_change_read_arg, NULL); return; } } qmp_change(device, target, !!arg, arg, &err); if (error_is_type(err, QERR_DEVICE_ENCRYPTED)) { monitor_printf(mon, "%s (%s) is encrypted.\n", error_get_field(err, "device"), error_get_field(err, "filename")); if (!monitor_get_rs(mon)) { monitor_printf(mon, "terminal does not support password prompting\n"); error_free(err); return; } readline_start(monitor_get_rs(mon), "Password: ", 1, cb_hmp_change_bdrv_pwd, err); return; } hmp_handle_error(mon, &err); } hmp.h +1 −0 Original line number Diff line number Diff line Loading @@ -52,5 +52,6 @@ void hmp_migrate_set_speed(Monitor *mon, const QDict *qdict); void hmp_set_password(Monitor *mon, const QDict *qdict); void hmp_expire_password(Monitor *mon, const QDict *qdict); void hmp_eject(Monitor *mon, const QDict *qdict); void hmp_change(Monitor *mon, const QDict *qdict); #endif Loading
blockdev.c +38 −16 Original line number Diff line number Diff line Loading @@ -717,8 +717,31 @@ void qmp_block_passwd(const char *device, const char *password, Error **errp) } } int do_change_block(Monitor *mon, const char *device, const char *filename, const char *fmt) static void qmp_bdrv_open_encrypted(BlockDriverState *bs, const char *filename, int bdrv_flags, BlockDriver *drv, const char *password, Error **errp) { if (bdrv_open(bs, filename, bdrv_flags, drv) < 0) { error_set(errp, QERR_OPEN_FILE_FAILED, filename); return; } if (bdrv_key_required(bs)) { if (password) { if (bdrv_set_key(bs, password) < 0) { error_set(errp, QERR_INVALID_PASSWORD); } } else { error_set(errp, QERR_DEVICE_ENCRYPTED, bdrv_get_device_name(bs), bdrv_get_encrypted_filename(bs)); } } else if (password) { error_set(errp, QERR_DEVICE_NOT_ENCRYPTED, bdrv_get_device_name(bs)); } } void qmp_change_blockdev(const char *device, const char *filename, bool has_format, const char *format, Error **errp) { BlockDriverState *bs; BlockDriver *drv = NULL; Loading @@ -727,29 +750,28 @@ int do_change_block(Monitor *mon, const char *device, bs = bdrv_find(device); if (!bs) { qerror_report(QERR_DEVICE_NOT_FOUND, device); return -1; error_set(errp, QERR_DEVICE_NOT_FOUND, device); return; } if (fmt) { drv = bdrv_find_whitelisted_format(fmt); if (format) { drv = bdrv_find_whitelisted_format(format); if (!drv) { qerror_report(QERR_INVALID_BLOCK_FORMAT, fmt); return -1; error_set(errp, QERR_INVALID_BLOCK_FORMAT, format); return; } } eject_device(bs, 0, &err); if (error_is_set(&err)) { qerror_report_err(err); error_free(err); return -1; error_propagate(errp, err); return; } bdrv_flags = bdrv_is_read_only(bs) ? 0 : BDRV_O_RDWR; bdrv_flags |= bdrv_is_snapshot(bs) ? BDRV_O_SNAPSHOT : 0; if (bdrv_open(bs, filename, bdrv_flags, drv) < 0) { qerror_report(QERR_OPEN_FILE_FAILED, filename); return -1; } return monitor_read_bdrv_key_start(mon, bs, NULL, NULL); qmp_bdrv_open_encrypted(bs, filename, bdrv_flags, drv, NULL, errp); } /* throttling disk I/O limits */ Loading
blockdev.h +3 −2 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ #define BLOCKDEV_H #include "block.h" #include "error.h" #include "qemu-queue.h" void blockdev_mark_auto_del(BlockDriverState *bs); Loading Loading @@ -57,9 +58,9 @@ DriveInfo *drive_init(QemuOpts *arg, int default_to_scsi); DriveInfo *add_init_drive(const char *opts); void qmp_change_blockdev(const char *device, const char *filename, bool has_format, const char *format, Error **errp); void do_commit(Monitor *mon, const QDict *qdict); int do_change_block(Monitor *mon, const char *device, const char *filename, const char *fmt); int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data); int do_block_set_io_throttle(Monitor *mon, const QDict *qdict, QObject **ret_data); Loading
hmp-commands.hx +1 −2 Original line number Diff line number Diff line Loading @@ -107,8 +107,7 @@ ETEXI .args_type = "device:B,target:F,arg:s?", .params = "device filename [format]", .help = "change a removable medium, optional format", .user_print = monitor_user_noop, .mhandler.cmd_new = do_change, .mhandler.cmd = hmp_change, }, STEXI Loading
hmp.c +57 −0 Original line number Diff line number Diff line Loading @@ -712,3 +712,60 @@ void hmp_eject(Monitor *mon, const QDict *qdict) qmp_eject(device, true, force, &err); hmp_handle_error(mon, &err); } static void hmp_change_read_arg(Monitor *mon, const char *password, void *opaque) { qmp_change_vnc_password(password, NULL); monitor_read_command(mon, 1); } static void cb_hmp_change_bdrv_pwd(Monitor *mon, const char *password, void *opaque) { Error *encryption_err = opaque; Error *err = NULL; const char *device; device = error_get_field(encryption_err, "device"); qmp_block_passwd(device, password, &err); hmp_handle_error(mon, &err); error_free(encryption_err); monitor_read_command(mon, 1); } void hmp_change(Monitor *mon, const QDict *qdict) { const char *device = qdict_get_str(qdict, "device"); const char *target = qdict_get_str(qdict, "target"); const char *arg = qdict_get_try_str(qdict, "arg"); Error *err = NULL; if (strcmp(device, "vnc") == 0 && (strcmp(target, "passwd") == 0 || strcmp(target, "password") == 0)) { if (!arg) { monitor_read_password(mon, hmp_change_read_arg, NULL); return; } } qmp_change(device, target, !!arg, arg, &err); if (error_is_type(err, QERR_DEVICE_ENCRYPTED)) { monitor_printf(mon, "%s (%s) is encrypted.\n", error_get_field(err, "device"), error_get_field(err, "filename")); if (!monitor_get_rs(mon)) { monitor_printf(mon, "terminal does not support password prompting\n"); error_free(err); return; } readline_start(monitor_get_rs(mon), "Password: ", 1, cb_hmp_change_bdrv_pwd, err); return; } hmp_handle_error(mon, &err); }
hmp.h +1 −0 Original line number Diff line number Diff line Loading @@ -52,5 +52,6 @@ void hmp_migrate_set_speed(Monitor *mon, const QDict *qdict); void hmp_set_password(Monitor *mon, const QDict *qdict); void hmp_expire_password(Monitor *mon, const QDict *qdict); void hmp_eject(Monitor *mon, const QDict *qdict); void hmp_change(Monitor *mon, const QDict *qdict); #endif