diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index e9c57f1897b8c7185fd58cf555438d1f878b0c7c..d761f51fe932587a7d7b5a7e92e9caef8c9befb5 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1068,78 +1068,6 @@ qemuMonitorSetOptions(qemuMonitorPtr mon, virJSONValuePtr options) } -/** - * Search the qom objects by it's known name. The name is compared against - * filed 'type' formatted as 'link<%name>'. - * - * This procedure will be call recursively until found or the qom-list is - * exhausted. - * - * Returns: - * - * 0 - Found - * -1 - Error bail out - * -2 - Not found - * - * NOTE: This assumes we have already called qemuDomainObjEnterMonitor() - */ -static int -qemuMonitorFindObjectPath(qemuMonitorPtr mon, - const char *curpath, - const char *name, - char **path) -{ - ssize_t i, npaths = 0; - int ret = -2; - char *nextpath = NULL; - char *type = NULL; - qemuMonitorJSONListPathPtr *paths = NULL; - - if (virAsprintf(&type, "link<%s>", name) < 0) - return -1; - - VIR_DEBUG("Searching for '%s' Object Path starting at '%s'", type, curpath); - - npaths = qemuMonitorJSONGetObjectListPaths(mon, curpath, &paths); - if (npaths < 0) - goto cleanup; - - for (i = 0; i < npaths && ret == -2; i++) { - - if (STREQ_NULLABLE(paths[i]->type, type)) { - VIR_DEBUG("Path to '%s' is '%s/%s'", type, curpath, paths[i]->name); - ret = 0; - if (virAsprintf(path, "%s/%s", curpath, paths[i]->name) < 0) { - *path = NULL; - ret = -1; - } - goto cleanup; - } - - /* Type entries that begin with "child<" are a branch that can be - * traversed looking for more entries - */ - if (paths[i]->type && STRPREFIX(paths[i]->type, "child<")) { - if (virAsprintf(&nextpath, "%s/%s", curpath, paths[i]->name) < 0) { - ret = -1; - goto cleanup; - } - - ret = qemuMonitorFindObjectPath(mon, nextpath, name, path); - VIR_FREE(nextpath); - } - } - - cleanup: - for (i = 0; i < npaths; i++) - qemuMonitorJSONListPathFree(paths[i]); - VIR_FREE(paths); - VIR_FREE(nextpath); - VIR_FREE(type); - return ret; -} - - /** * Search the qom objects for the balloon driver object by it's known name * of "virtio-balloon-pci". The entry for the driver will be found by using @@ -1183,7 +1111,7 @@ qemuMonitorFindBalloonObjectPath(qemuMonitorPtr mon, return -1; } - if (qemuMonitorFindObjectPath(mon, curpath, "virtio-balloon-pci", &path) < 0) + if (qemuMonitorJSONFindObjectPath(mon, curpath, "virtio-balloon-pci", &path) < 0) return -1; nprops = qemuMonitorJSONGetObjectListPaths(mon, path, &bprops); @@ -1232,7 +1160,7 @@ qemuMonitorUpdateVideoMemorySize(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); if (mon->json) { - ret = qemuMonitorFindObjectPath(mon, "/", videoName, &path); + ret = qemuMonitorJSONFindObjectPath(mon, "/", videoName, &path); if (ret < 0) { if (ret == -2) virReportError(VIR_ERR_INTERNAL_ERROR, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index e6da804aebb6756938f4c7612d084125ef644f83..69c342d819eb80346bf9801de8b353ddcf6a57af 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -6642,3 +6642,75 @@ qemuMonitorJSONGetMemoryDeviceInfo(qemuMonitorPtr mon, virJSONValueFree(reply); return ret; } + + +/** + * Search the qom objects by it's known name. The name is compared against + * filed 'type' formatted as 'link<%name>'. + * + * This procedure will be call recursively until found or the qom-list is + * exhausted. + * + * Returns: + * + * 0 - Found + * -1 - Error bail out + * -2 - Not found + * + * NOTE: This assumes we have already called qemuDomainObjEnterMonitor() + */ +int +qemuMonitorJSONFindObjectPath(qemuMonitorPtr mon, + const char *curpath, + const char *name, + char **path) +{ + ssize_t i, npaths = 0; + int ret = -2; + char *nextpath = NULL; + char *type = NULL; + qemuMonitorJSONListPathPtr *paths = NULL; + + if (virAsprintf(&type, "link<%s>", name) < 0) + return -1; + + VIR_DEBUG("Searching for '%s' Object Path starting at '%s'", type, curpath); + + npaths = qemuMonitorJSONGetObjectListPaths(mon, curpath, &paths); + if (npaths < 0) + goto cleanup; + + for (i = 0; i < npaths && ret == -2; i++) { + + if (STREQ_NULLABLE(paths[i]->type, type)) { + VIR_DEBUG("Path to '%s' is '%s/%s'", type, curpath, paths[i]->name); + ret = 0; + if (virAsprintf(path, "%s/%s", curpath, paths[i]->name) < 0) { + *path = NULL; + ret = -1; + } + goto cleanup; + } + + /* Type entries that begin with "child<" are a branch that can be + * traversed looking for more entries + */ + if (paths[i]->type && STRPREFIX(paths[i]->type, "child<")) { + if (virAsprintf(&nextpath, "%s/%s", curpath, paths[i]->name) < 0) { + ret = -1; + goto cleanup; + } + + ret = qemuMonitorJSONFindObjectPath(mon, nextpath, name, path); + VIR_FREE(nextpath); + } + } + + cleanup: + for (i = 0; i < npaths; i++) + qemuMonitorJSONListPathFree(paths[i]); + VIR_FREE(paths); + VIR_FREE(nextpath); + VIR_FREE(type); + return ret; +} diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 05c9b29f58dc6a28b1d535aef8e4ac31b73f1e59..fcc2c86968fc0feacc127cc8be04797c78b8a322 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -482,4 +482,8 @@ int qemuMonitorJSONGetMemoryDeviceInfo(qemuMonitorPtr mon, virHashTablePtr info) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); +int qemuMonitorJSONFindObjectPath(qemuMonitorPtr mon, + const char *curpath, + const char *name, + char **path); #endif /* QEMU_MONITOR_JSON_H */