1027 |
1027 |
return 0;
|
1028 |
1028 |
}
|
1029 |
1029 |
|
1030 |
|
static void do_change_block(Monitor *mon, const char *device,
|
1031 |
|
const char *filename, const char *fmt)
|
|
1030 |
static int do_change_block(Monitor *mon, const char *device,
|
|
1031 |
const char *filename, const char *fmt)
|
1032 |
1032 |
{
|
1033 |
1033 |
BlockDriverState *bs;
|
1034 |
1034 |
BlockDriver *drv = NULL;
|
... | ... | |
1036 |
1036 |
bs = bdrv_find(device);
|
1037 |
1037 |
if (!bs) {
|
1038 |
1038 |
qemu_error_new(QERR_DEVICE_NOT_FOUND, device);
|
1039 |
|
return;
|
|
1039 |
return -1;
|
1040 |
1040 |
}
|
1041 |
1041 |
if (fmt) {
|
1042 |
1042 |
drv = bdrv_find_whitelisted_format(fmt);
|
1043 |
1043 |
if (!drv) {
|
1044 |
1044 |
qemu_error_new(QERR_INVALID_BLOCK_FORMAT, fmt);
|
1045 |
|
return;
|
|
1045 |
return -1;
|
1046 |
1046 |
}
|
1047 |
1047 |
}
|
1048 |
|
if (eject_device(mon, bs, 0) < 0)
|
1049 |
|
return;
|
1050 |
|
bdrv_open2(bs, filename, BDRV_O_RDWR, drv);
|
1051 |
|
monitor_read_bdrv_key_start(mon, bs, NULL, NULL);
|
|
1048 |
if (eject_device(mon, bs, 0) < 0) {
|
|
1049 |
return -1;
|
|
1050 |
}
|
|
1051 |
if (bdrv_open2(bs, filename, BDRV_O_RDWR, drv) < 0) {
|
|
1052 |
return -1;
|
|
1053 |
}
|
|
1054 |
return monitor_read_bdrv_key_start(mon, bs, NULL, NULL);
|
1052 |
1055 |
}
|
1053 |
1056 |
|
1054 |
|
static void change_vnc_password(const char *password)
|
|
1057 |
static int change_vnc_password(const char *password)
|
1055 |
1058 |
{
|
1056 |
|
if (vnc_display_password(NULL, password) < 0)
|
|
1059 |
if (vnc_display_password(NULL, password) < 0) {
|
1057 |
1060 |
qemu_error_new(QERR_SET_PASSWD_FAILED);
|
|
1061 |
return -1;
|
|
1062 |
}
|
1058 |
1063 |
|
|
1064 |
return 0;
|
1059 |
1065 |
}
|
1060 |
1066 |
|
1061 |
1067 |
static void change_vnc_password_cb(Monitor *mon, const char *password,
|
... | ... | |
1065 |
1071 |
monitor_read_command(mon, 1);
|
1066 |
1072 |
}
|
1067 |
1073 |
|
1068 |
|
static void do_change_vnc(Monitor *mon, const char *target, const char *arg)
|
|
1074 |
static int do_change_vnc(Monitor *mon, const char *target, const char *arg)
|
1069 |
1075 |
{
|
1070 |
1076 |
if (strcmp(target, "passwd") == 0 ||
|
1071 |
1077 |
strcmp(target, "password") == 0) {
|
... | ... | |
1073 |
1079 |
char password[9];
|
1074 |
1080 |
strncpy(password, arg, sizeof(password));
|
1075 |
1081 |
password[sizeof(password) - 1] = '\0';
|
1076 |
|
change_vnc_password(password);
|
|
1082 |
return change_vnc_password(password);
|
1077 |
1083 |
} else {
|
1078 |
|
monitor_read_password(mon, change_vnc_password_cb, NULL);
|
|
1084 |
return monitor_read_password(mon, change_vnc_password_cb, NULL);
|
1079 |
1085 |
}
|
1080 |
1086 |
} else {
|
1081 |
|
if (vnc_display_open(NULL, target) < 0)
|
|
1087 |
if (vnc_display_open(NULL, target) < 0) {
|
1082 |
1088 |
qemu_error_new(QERR_VNC_SERVER_FAILED, target);
|
|
1089 |
return -1;
|
|
1090 |
}
|
1083 |
1091 |
}
|
|
1092 |
|
|
1093 |
return 0;
|
1084 |
1094 |
}
|
1085 |
1095 |
|
1086 |
1096 |
/**
|
1087 |
1097 |
* do_change(): Change a removable medium, or VNC configuration
|
1088 |
1098 |
*/
|
1089 |
|
static void do_change(Monitor *mon, const QDict *qdict, QObject **ret_data)
|
|
1099 |
static int do_change(Monitor *mon, const QDict *qdict, QObject **ret_data)
|
1090 |
1100 |
{
|
1091 |
1101 |
const char *device = qdict_get_str(qdict, "device");
|
1092 |
1102 |
const char *target = qdict_get_str(qdict, "target");
|
1093 |
1103 |
const char *arg = qdict_get_try_str(qdict, "arg");
|
|
1104 |
int ret;
|
|
1105 |
|
1094 |
1106 |
if (strcmp(device, "vnc") == 0) {
|
1095 |
|
do_change_vnc(mon, target, arg);
|
|
1107 |
ret = do_change_vnc(mon, target, arg);
|
1096 |
1108 |
} else {
|
1097 |
|
do_change_block(mon, device, target, arg);
|
|
1109 |
ret = do_change_block(mon, device, target, arg);
|
1098 |
1110 |
}
|
|
1111 |
|
|
1112 |
return ret;
|
1099 |
1113 |
}
|
1100 |
1114 |
|
1101 |
1115 |
static void do_screen_dump(Monitor *mon, const QDict *qdict)
|
... | ... | |
4554 |
4568 |
monitor_read_command(mon, 1);
|
4555 |
4569 |
}
|
4556 |
4570 |
|
4557 |
|
void monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs,
|
4558 |
|
BlockDriverCompletionFunc *completion_cb,
|
4559 |
|
void *opaque)
|
|
4571 |
int monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs,
|
|
4572 |
BlockDriverCompletionFunc *completion_cb,
|
|
4573 |
void *opaque)
|
4560 |
4574 |
{
|
4561 |
4575 |
int err;
|
4562 |
4576 |
|
4563 |
4577 |
if (!bdrv_key_required(bs)) {
|
4564 |
4578 |
if (completion_cb)
|
4565 |
4579 |
completion_cb(opaque, 0);
|
4566 |
|
return;
|
|
4580 |
return 0;
|
4567 |
4581 |
}
|
4568 |
4582 |
|
4569 |
4583 |
if (monitor_ctrl_mode(mon)) {
|
4570 |
4584 |
qemu_error_new(QERR_DEVICE_ENCRYPTED, bdrv_get_device_name(bs));
|
4571 |
|
return;
|
|
4585 |
return -1;
|
4572 |
4586 |
}
|
4573 |
4587 |
|
4574 |
4588 |
monitor_printf(mon, "%s (%s) is encrypted.\n", bdrv_get_device_name(bs),
|
... | ... | |
4581 |
4595 |
|
4582 |
4596 |
if (err && completion_cb)
|
4583 |
4597 |
completion_cb(opaque, err);
|
|
4598 |
|
|
4599 |
return err;
|
4584 |
4600 |
}
|
4585 |
4601 |
|
4586 |
4602 |
typedef struct QemuErrorSink QemuErrorSink;
|