Revision 0bbc47bb monitor.c
b/monitor.c | ||
---|---|---|
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; |
Also available in: Unified diff