qapi: More complex uses of QAPI_LIST_APPEND
These cases require a bit more thought to review; in each case, the code was appending to a list, but not with a FOOList **tail variable. Signed-off-by: Eric Blake <eblake@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Message-Id: <20210113221013.390592-6-eblake@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> [Flawed change to qmp_guest_network_get_interfaces() dropped] Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
parent
c3033fd372
commit
95b3a8c8a8
@ -514,7 +514,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
|
||||
{
|
||||
QemuOpts *opts;
|
||||
SocketAddress *gsconf = NULL;
|
||||
SocketAddressList *curr = NULL;
|
||||
SocketAddressList **tail;
|
||||
QDict *backing_options = NULL;
|
||||
Error *local_err = NULL;
|
||||
char *str = NULL;
|
||||
@ -547,6 +547,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
|
||||
}
|
||||
gconf->path = g_strdup(ptr);
|
||||
qemu_opts_del(opts);
|
||||
tail = &gconf->server;
|
||||
|
||||
for (i = 0; i < num_servers; i++) {
|
||||
str = g_strdup_printf(GLUSTER_OPT_SERVER_PATTERN"%d.", i);
|
||||
@ -655,15 +656,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
|
||||
qemu_opts_del(opts);
|
||||
}
|
||||
|
||||
if (gconf->server == NULL) {
|
||||
gconf->server = g_new0(SocketAddressList, 1);
|
||||
gconf->server->value = gsconf;
|
||||
curr = gconf->server;
|
||||
} else {
|
||||
curr->next = g_new0(SocketAddressList, 1);
|
||||
curr->next->value = gsconf;
|
||||
curr = curr->next;
|
||||
}
|
||||
QAPI_LIST_APPEND(tail, gsconf);
|
||||
gsconf = NULL;
|
||||
|
||||
qobject_unref(backing_options);
|
||||
|
14
block/qapi.c
14
block/qapi.c
@ -198,7 +198,7 @@ int bdrv_query_snapshot_info_list(BlockDriverState *bs,
|
||||
{
|
||||
int i, sn_count;
|
||||
QEMUSnapshotInfo *sn_tab = NULL;
|
||||
SnapshotInfoList *info_list, *cur_item = NULL, *head = NULL;
|
||||
SnapshotInfoList *head = NULL, **tail = &head;
|
||||
SnapshotInfo *info;
|
||||
|
||||
sn_count = bdrv_snapshot_list(bs, &sn_tab);
|
||||
@ -233,17 +233,7 @@ int bdrv_query_snapshot_info_list(BlockDriverState *bs,
|
||||
info->icount = sn_tab[i].icount;
|
||||
info->has_icount = sn_tab[i].icount != -1ULL;
|
||||
|
||||
info_list = g_new0(SnapshotInfoList, 1);
|
||||
info_list->value = info;
|
||||
|
||||
/* XXX: waiting for the qapi to support qemu-queue.h types */
|
||||
if (!cur_item) {
|
||||
head = cur_item = info_list;
|
||||
} else {
|
||||
cur_item->next = info_list;
|
||||
cur_item = info_list;
|
||||
}
|
||||
|
||||
QAPI_LIST_APPEND(tail, info);
|
||||
}
|
||||
|
||||
g_free(sn_tab);
|
||||
|
22
dump/dump.c
22
dump/dump.c
@ -2030,39 +2030,29 @@ void qmp_dump_guest_memory(bool paging, const char *file,
|
||||
|
||||
DumpGuestMemoryCapability *qmp_query_dump_guest_memory_capability(Error **errp)
|
||||
{
|
||||
DumpGuestMemoryFormatList *item;
|
||||
DumpGuestMemoryCapability *cap =
|
||||
g_malloc0(sizeof(DumpGuestMemoryCapability));
|
||||
DumpGuestMemoryFormatList **tail = &cap->formats;
|
||||
|
||||
/* elf is always available */
|
||||
item = g_malloc0(sizeof(DumpGuestMemoryFormatList));
|
||||
cap->formats = item;
|
||||
item->value = DUMP_GUEST_MEMORY_FORMAT_ELF;
|
||||
QAPI_LIST_APPEND(tail, DUMP_GUEST_MEMORY_FORMAT_ELF);
|
||||
|
||||
/* kdump-zlib is always available */
|
||||
item->next = g_malloc0(sizeof(DumpGuestMemoryFormatList));
|
||||
item = item->next;
|
||||
item->value = DUMP_GUEST_MEMORY_FORMAT_KDUMP_ZLIB;
|
||||
QAPI_LIST_APPEND(tail, DUMP_GUEST_MEMORY_FORMAT_KDUMP_ZLIB);
|
||||
|
||||
/* add new item if kdump-lzo is available */
|
||||
#ifdef CONFIG_LZO
|
||||
item->next = g_malloc0(sizeof(DumpGuestMemoryFormatList));
|
||||
item = item->next;
|
||||
item->value = DUMP_GUEST_MEMORY_FORMAT_KDUMP_LZO;
|
||||
QAPI_LIST_APPEND(tail, DUMP_GUEST_MEMORY_FORMAT_KDUMP_LZO);
|
||||
#endif
|
||||
|
||||
/* add new item if kdump-snappy is available */
|
||||
#ifdef CONFIG_SNAPPY
|
||||
item->next = g_malloc0(sizeof(DumpGuestMemoryFormatList));
|
||||
item = item->next;
|
||||
item->value = DUMP_GUEST_MEMORY_FORMAT_KDUMP_SNAPPY;
|
||||
QAPI_LIST_APPEND(tail, DUMP_GUEST_MEMORY_FORMAT_KDUMP_SNAPPY);
|
||||
#endif
|
||||
|
||||
/* Windows dump is available only if target is x86_64 */
|
||||
#ifdef TARGET_X86_64
|
||||
item->next = g_malloc0(sizeof(DumpGuestMemoryFormatList));
|
||||
item = item->next;
|
||||
item->value = DUMP_GUEST_MEMORY_FORMAT_WIN_DMP;
|
||||
QAPI_LIST_APPEND(tail, DUMP_GUEST_MEMORY_FORMAT_WIN_DMP);
|
||||
#endif
|
||||
|
||||
return cap;
|
||||
|
@ -28,11 +28,11 @@ CpuInfoList *qmp_query_cpus(Error **errp)
|
||||
{
|
||||
MachineState *ms = MACHINE(qdev_get_machine());
|
||||
MachineClass *mc = MACHINE_GET_CLASS(ms);
|
||||
CpuInfoList *head = NULL, *cur_item = NULL;
|
||||
CpuInfoList *head = NULL, **tail = &head;
|
||||
CPUState *cpu;
|
||||
|
||||
CPU_FOREACH(cpu) {
|
||||
CpuInfoList *info;
|
||||
CpuInfo *value;
|
||||
#if defined(TARGET_I386)
|
||||
X86CPU *x86_cpu = X86_CPU(cpu);
|
||||
CPUX86State *env = &x86_cpu->env;
|
||||
@ -58,53 +58,46 @@ CpuInfoList *qmp_query_cpus(Error **errp)
|
||||
|
||||
cpu_synchronize_state(cpu);
|
||||
|
||||
info = g_malloc0(sizeof(*info));
|
||||
info->value = g_malloc0(sizeof(*info->value));
|
||||
info->value->CPU = cpu->cpu_index;
|
||||
info->value->current = (cpu == first_cpu);
|
||||
info->value->halted = cpu->halted;
|
||||
info->value->qom_path = object_get_canonical_path(OBJECT(cpu));
|
||||
info->value->thread_id = cpu->thread_id;
|
||||
value = g_malloc0(sizeof(*value));
|
||||
value->CPU = cpu->cpu_index;
|
||||
value->current = (cpu == first_cpu);
|
||||
value->halted = cpu->halted;
|
||||
value->qom_path = object_get_canonical_path(OBJECT(cpu));
|
||||
value->thread_id = cpu->thread_id;
|
||||
#if defined(TARGET_I386)
|
||||
info->value->arch = CPU_INFO_ARCH_X86;
|
||||
info->value->u.x86.pc = env->eip + env->segs[R_CS].base;
|
||||
value->arch = CPU_INFO_ARCH_X86;
|
||||
value->u.x86.pc = env->eip + env->segs[R_CS].base;
|
||||
#elif defined(TARGET_PPC)
|
||||
info->value->arch = CPU_INFO_ARCH_PPC;
|
||||
info->value->u.ppc.nip = env->nip;
|
||||
value->arch = CPU_INFO_ARCH_PPC;
|
||||
value->u.ppc.nip = env->nip;
|
||||
#elif defined(TARGET_SPARC)
|
||||
info->value->arch = CPU_INFO_ARCH_SPARC;
|
||||
info->value->u.q_sparc.pc = env->pc;
|
||||
info->value->u.q_sparc.npc = env->npc;
|
||||
value->arch = CPU_INFO_ARCH_SPARC;
|
||||
value->u.q_sparc.pc = env->pc;
|
||||
value->u.q_sparc.npc = env->npc;
|
||||
#elif defined(TARGET_MIPS)
|
||||
info->value->arch = CPU_INFO_ARCH_MIPS;
|
||||
info->value->u.q_mips.PC = env->active_tc.PC;
|
||||
value->arch = CPU_INFO_ARCH_MIPS;
|
||||
value->u.q_mips.PC = env->active_tc.PC;
|
||||
#elif defined(TARGET_TRICORE)
|
||||
info->value->arch = CPU_INFO_ARCH_TRICORE;
|
||||
info->value->u.tricore.PC = env->PC;
|
||||
value->arch = CPU_INFO_ARCH_TRICORE;
|
||||
value->u.tricore.PC = env->PC;
|
||||
#elif defined(TARGET_S390X)
|
||||
info->value->arch = CPU_INFO_ARCH_S390;
|
||||
info->value->u.s390.cpu_state = env->cpu_state;
|
||||
value->arch = CPU_INFO_ARCH_S390;
|
||||
value->u.s390.cpu_state = env->cpu_state;
|
||||
#elif defined(TARGET_RISCV)
|
||||
info->value->arch = CPU_INFO_ARCH_RISCV;
|
||||
info->value->u.riscv.pc = env->pc;
|
||||
value->arch = CPU_INFO_ARCH_RISCV;
|
||||
value->u.riscv.pc = env->pc;
|
||||
#else
|
||||
info->value->arch = CPU_INFO_ARCH_OTHER;
|
||||
value->arch = CPU_INFO_ARCH_OTHER;
|
||||
#endif
|
||||
info->value->has_props = !!mc->cpu_index_to_instance_props;
|
||||
if (info->value->has_props) {
|
||||
value->has_props = !!mc->cpu_index_to_instance_props;
|
||||
if (value->has_props) {
|
||||
CpuInstanceProperties *props;
|
||||
props = g_malloc0(sizeof(*props));
|
||||
*props = mc->cpu_index_to_instance_props(ms, cpu->cpu_index);
|
||||
info->value->props = props;
|
||||
value->props = props;
|
||||
}
|
||||
|
||||
/* XXX: waiting for the qapi to support GSList */
|
||||
if (!cur_item) {
|
||||
head = cur_item = info;
|
||||
} else {
|
||||
cur_item->next = info;
|
||||
cur_item = info;
|
||||
}
|
||||
QAPI_LIST_APPEND(tail, value);
|
||||
}
|
||||
|
||||
return head;
|
||||
@ -170,39 +163,33 @@ CpuInfoFastList *qmp_query_cpus_fast(Error **errp)
|
||||
{
|
||||
MachineState *ms = MACHINE(qdev_get_machine());
|
||||
MachineClass *mc = MACHINE_GET_CLASS(ms);
|
||||
CpuInfoFastList *head = NULL, *cur_item = NULL;
|
||||
CpuInfoFastList *head = NULL, **tail = &head;
|
||||
SysEmuTarget target = qapi_enum_parse(&SysEmuTarget_lookup, TARGET_NAME,
|
||||
-1, &error_abort);
|
||||
CPUState *cpu;
|
||||
|
||||
CPU_FOREACH(cpu) {
|
||||
CpuInfoFastList *info = g_malloc0(sizeof(*info));
|
||||
info->value = g_malloc0(sizeof(*info->value));
|
||||
CpuInfoFast *value = g_malloc0(sizeof(*value));
|
||||
|
||||
info->value->cpu_index = cpu->cpu_index;
|
||||
info->value->qom_path = object_get_canonical_path(OBJECT(cpu));
|
||||
info->value->thread_id = cpu->thread_id;
|
||||
value->cpu_index = cpu->cpu_index;
|
||||
value->qom_path = object_get_canonical_path(OBJECT(cpu));
|
||||
value->thread_id = cpu->thread_id;
|
||||
|
||||
info->value->has_props = !!mc->cpu_index_to_instance_props;
|
||||
if (info->value->has_props) {
|
||||
value->has_props = !!mc->cpu_index_to_instance_props;
|
||||
if (value->has_props) {
|
||||
CpuInstanceProperties *props;
|
||||
props = g_malloc0(sizeof(*props));
|
||||
*props = mc->cpu_index_to_instance_props(ms, cpu->cpu_index);
|
||||
info->value->props = props;
|
||||
value->props = props;
|
||||
}
|
||||
|
||||
info->value->arch = sysemu_target_to_cpuinfo_arch(target);
|
||||
info->value->target = target;
|
||||
value->arch = sysemu_target_to_cpuinfo_arch(target);
|
||||
value->target = target;
|
||||
if (target == SYS_EMU_TARGET_S390X) {
|
||||
cpustate_to_cpuinfo_s390(&info->value->u.s390x, cpu);
|
||||
cpustate_to_cpuinfo_s390(&value->u.s390x, cpu);
|
||||
}
|
||||
|
||||
if (!cur_item) {
|
||||
head = cur_item = info;
|
||||
} else {
|
||||
cur_item->next = info;
|
||||
cur_item = info;
|
||||
}
|
||||
QAPI_LIST_APPEND(tail, value);
|
||||
}
|
||||
|
||||
return head;
|
||||
|
@ -199,7 +199,7 @@ out:
|
||||
MemoryDeviceInfoList *qmp_memory_device_list(void)
|
||||
{
|
||||
GSList *devices = NULL, *item;
|
||||
MemoryDeviceInfoList *list = NULL, *prev = NULL;
|
||||
MemoryDeviceInfoList *list = NULL, **tail = &list;
|
||||
|
||||
object_child_foreach(qdev_get_machine(), memory_device_build_list,
|
||||
&devices);
|
||||
@ -207,19 +207,11 @@ MemoryDeviceInfoList *qmp_memory_device_list(void)
|
||||
for (item = devices; item; item = g_slist_next(item)) {
|
||||
const MemoryDeviceState *md = MEMORY_DEVICE(item->data);
|
||||
const MemoryDeviceClass *mdc = MEMORY_DEVICE_GET_CLASS(item->data);
|
||||
MemoryDeviceInfoList *elem = g_new0(MemoryDeviceInfoList, 1);
|
||||
MemoryDeviceInfo *info = g_new0(MemoryDeviceInfo, 1);
|
||||
|
||||
mdc->fill_device_info(md, info);
|
||||
|
||||
elem->value = info;
|
||||
elem->next = NULL;
|
||||
if (prev) {
|
||||
prev->next = elem;
|
||||
} else {
|
||||
list = elem;
|
||||
}
|
||||
prev = elem;
|
||||
QAPI_LIST_APPEND(tail, info);
|
||||
}
|
||||
|
||||
g_slist_free(devices);
|
||||
|
60
hw/pci/pci.c
60
hw/pci/pci.c
@ -1683,41 +1683,34 @@ static PciDeviceInfoList *qmp_query_pci_devices(PCIBus *bus, int bus_num);
|
||||
|
||||
static PciMemoryRegionList *qmp_query_pci_regions(const PCIDevice *dev)
|
||||
{
|
||||
PciMemoryRegionList *head = NULL, *cur_item = NULL;
|
||||
PciMemoryRegionList *head = NULL, **tail = &head;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < PCI_NUM_REGIONS; i++) {
|
||||
const PCIIORegion *r = &dev->io_regions[i];
|
||||
PciMemoryRegionList *region;
|
||||
PciMemoryRegion *region;
|
||||
|
||||
if (!r->size) {
|
||||
continue;
|
||||
}
|
||||
|
||||
region = g_malloc0(sizeof(*region));
|
||||
region->value = g_malloc0(sizeof(*region->value));
|
||||
|
||||
if (r->type & PCI_BASE_ADDRESS_SPACE_IO) {
|
||||
region->value->type = g_strdup("io");
|
||||
region->type = g_strdup("io");
|
||||
} else {
|
||||
region->value->type = g_strdup("memory");
|
||||
region->value->has_prefetch = true;
|
||||
region->value->prefetch = !!(r->type & PCI_BASE_ADDRESS_MEM_PREFETCH);
|
||||
region->value->has_mem_type_64 = true;
|
||||
region->value->mem_type_64 = !!(r->type & PCI_BASE_ADDRESS_MEM_TYPE_64);
|
||||
region->type = g_strdup("memory");
|
||||
region->has_prefetch = true;
|
||||
region->prefetch = !!(r->type & PCI_BASE_ADDRESS_MEM_PREFETCH);
|
||||
region->has_mem_type_64 = true;
|
||||
region->mem_type_64 = !!(r->type & PCI_BASE_ADDRESS_MEM_TYPE_64);
|
||||
}
|
||||
|
||||
region->value->bar = i;
|
||||
region->value->address = r->addr;
|
||||
region->value->size = r->size;
|
||||
region->bar = i;
|
||||
region->address = r->addr;
|
||||
region->size = r->size;
|
||||
|
||||
/* XXX: waiting for the qapi to support GSList */
|
||||
if (!cur_item) {
|
||||
head = cur_item = region;
|
||||
} else {
|
||||
cur_item->next = region;
|
||||
cur_item = region;
|
||||
}
|
||||
QAPI_LIST_APPEND(tail, region);
|
||||
}
|
||||
|
||||
return head;
|
||||
@ -1814,23 +1807,14 @@ static PciDeviceInfo *qmp_query_pci_device(PCIDevice *dev, PCIBus *bus,
|
||||
|
||||
static PciDeviceInfoList *qmp_query_pci_devices(PCIBus *bus, int bus_num)
|
||||
{
|
||||
PciDeviceInfoList *info, *head = NULL, *cur_item = NULL;
|
||||
PciDeviceInfoList *head = NULL, **tail = &head;
|
||||
PCIDevice *dev;
|
||||
int devfn;
|
||||
|
||||
for (devfn = 0; devfn < ARRAY_SIZE(bus->devices); devfn++) {
|
||||
dev = bus->devices[devfn];
|
||||
if (dev) {
|
||||
info = g_malloc0(sizeof(*info));
|
||||
info->value = qmp_query_pci_device(dev, bus, bus_num);
|
||||
|
||||
/* XXX: waiting for the qapi to support GSList */
|
||||
if (!cur_item) {
|
||||
head = cur_item = info;
|
||||
} else {
|
||||
cur_item->next = info;
|
||||
cur_item = info;
|
||||
}
|
||||
QAPI_LIST_APPEND(tail, qmp_query_pci_device(dev, bus, bus_num));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1853,21 +1837,13 @@ static PciInfo *qmp_query_pci_bus(PCIBus *bus, int bus_num)
|
||||
|
||||
PciInfoList *qmp_query_pci(Error **errp)
|
||||
{
|
||||
PciInfoList *info, *head = NULL, *cur_item = NULL;
|
||||
PciInfoList *head = NULL, **tail = &head;
|
||||
PCIHostState *host_bridge;
|
||||
|
||||
QLIST_FOREACH(host_bridge, &pci_host_bridges, next) {
|
||||
info = g_malloc0(sizeof(*info));
|
||||
info->value = qmp_query_pci_bus(host_bridge->bus,
|
||||
pci_bus_num(host_bridge->bus));
|
||||
|
||||
/* XXX: waiting for the qapi to support GSList */
|
||||
if (!cur_item) {
|
||||
head = cur_item = info;
|
||||
} else {
|
||||
cur_item->next = info;
|
||||
cur_item = info;
|
||||
}
|
||||
QAPI_LIST_APPEND(tail,
|
||||
qmp_query_pci_bus(host_bridge->bus,
|
||||
pci_bus_num(host_bridge->bus)));
|
||||
}
|
||||
|
||||
return head;
|
||||
|
@ -793,29 +793,21 @@ void migrate_send_rp_resume_ack(MigrationIncomingState *mis, uint32_t value)
|
||||
|
||||
MigrationCapabilityStatusList *qmp_query_migrate_capabilities(Error **errp)
|
||||
{
|
||||
MigrationCapabilityStatusList *head = NULL;
|
||||
MigrationCapabilityStatusList *caps;
|
||||
MigrationCapabilityStatusList *head = NULL, **tail = &head;
|
||||
MigrationCapabilityStatus *caps;
|
||||
MigrationState *s = migrate_get_current();
|
||||
int i;
|
||||
|
||||
caps = NULL; /* silence compiler warning */
|
||||
for (i = 0; i < MIGRATION_CAPABILITY__MAX; i++) {
|
||||
#ifndef CONFIG_LIVE_BLOCK_MIGRATION
|
||||
if (i == MIGRATION_CAPABILITY_BLOCK) {
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
if (head == NULL) {
|
||||
head = g_malloc0(sizeof(*caps));
|
||||
caps = head;
|
||||
} else {
|
||||
caps->next = g_malloc0(sizeof(*caps));
|
||||
caps = caps->next;
|
||||
}
|
||||
caps->value =
|
||||
g_malloc(sizeof(*caps->value));
|
||||
caps->value->capability = i;
|
||||
caps->value->state = s->enabled_capabilities[i];
|
||||
caps = g_malloc0(sizeof(*caps));
|
||||
caps->capability = i;
|
||||
caps->state = s->enabled_capabilities[i];
|
||||
QAPI_LIST_APPEND(tail, caps);
|
||||
}
|
||||
|
||||
return head;
|
||||
|
@ -1706,7 +1706,8 @@ void hmp_closefd(Monitor *mon, const QDict *qdict)
|
||||
void hmp_sendkey(Monitor *mon, const QDict *qdict)
|
||||
{
|
||||
const char *keys = qdict_get_str(qdict, "keys");
|
||||
KeyValueList *keylist, *head = NULL, *tmp = NULL;
|
||||
KeyValue *v = NULL;
|
||||
KeyValueList *head = NULL, **tail = &head;
|
||||
int has_hold_time = qdict_haskey(qdict, "hold-time");
|
||||
int hold_time = qdict_get_try_int(qdict, "hold-time", -1);
|
||||
Error *err = NULL;
|
||||
@ -1723,16 +1724,7 @@ void hmp_sendkey(Monitor *mon, const QDict *qdict)
|
||||
keyname_len = 4;
|
||||
}
|
||||
|
||||
keylist = g_malloc0(sizeof(*keylist));
|
||||
keylist->value = g_malloc0(sizeof(*keylist->value));
|
||||
|
||||
if (!head) {
|
||||
head = keylist;
|
||||
}
|
||||
if (tmp) {
|
||||
tmp->next = keylist;
|
||||
}
|
||||
tmp = keylist;
|
||||
v = g_malloc0(sizeof(*v));
|
||||
|
||||
if (strstart(keys, "0x", NULL)) {
|
||||
char *endp;
|
||||
@ -1741,16 +1733,18 @@ void hmp_sendkey(Monitor *mon, const QDict *qdict)
|
||||
if (endp != keys + keyname_len) {
|
||||
goto err_out;
|
||||
}
|
||||
keylist->value->type = KEY_VALUE_KIND_NUMBER;
|
||||
keylist->value->u.number.data = value;
|
||||
v->type = KEY_VALUE_KIND_NUMBER;
|
||||
v->u.number.data = value;
|
||||
} else {
|
||||
int idx = index_from_key(keys, keyname_len);
|
||||
if (idx == Q_KEY_CODE__MAX) {
|
||||
goto err_out;
|
||||
}
|
||||
keylist->value->type = KEY_VALUE_KIND_QCODE;
|
||||
keylist->value->u.qcode.data = idx;
|
||||
v->type = KEY_VALUE_KIND_QCODE;
|
||||
v->u.qcode.data = idx;
|
||||
}
|
||||
QAPI_LIST_APPEND(tail, v);
|
||||
v = NULL;
|
||||
|
||||
if (!*separator) {
|
||||
break;
|
||||
@ -1762,6 +1756,7 @@ void hmp_sendkey(Monitor *mon, const QDict *qdict)
|
||||
hmp_handle_error(mon, err);
|
||||
|
||||
out:
|
||||
qapi_free_KeyValue(v);
|
||||
qapi_free_KeyValueList(head);
|
||||
return;
|
||||
|
||||
|
13
net/net.c
13
net/net.c
@ -1213,10 +1213,9 @@ RxFilterInfoList *qmp_query_rx_filter(bool has_name, const char *name,
|
||||
Error **errp)
|
||||
{
|
||||
NetClientState *nc;
|
||||
RxFilterInfoList *filter_list = NULL, *last_entry = NULL;
|
||||
RxFilterInfoList *filter_list = NULL, **tail = &filter_list;
|
||||
|
||||
QTAILQ_FOREACH(nc, &net_clients, next) {
|
||||
RxFilterInfoList *entry;
|
||||
RxFilterInfo *info;
|
||||
|
||||
if (has_name && strcmp(nc->name, name) != 0) {
|
||||
@ -1241,15 +1240,7 @@ RxFilterInfoList *qmp_query_rx_filter(bool has_name, const char *name,
|
||||
|
||||
if (nc->info->query_rx_filter) {
|
||||
info = nc->info->query_rx_filter(nc);
|
||||
entry = g_malloc0(sizeof(*entry));
|
||||
entry->value = info;
|
||||
|
||||
if (!filter_list) {
|
||||
filter_list = entry;
|
||||
} else {
|
||||
last_entry->next = entry;
|
||||
}
|
||||
last_entry = entry;
|
||||
QAPI_LIST_APPEND(tail, info);
|
||||
} else if (has_name) {
|
||||
error_setg(errp, "net client(%s) doesn't support"
|
||||
" rx-filter querying", name);
|
||||
|
@ -3138,11 +3138,10 @@ static double ga_get_login_time(struct utmpx *user_info)
|
||||
GuestUserList *qmp_guest_get_users(Error **errp)
|
||||
{
|
||||
GHashTable *cache = NULL;
|
||||
GuestUserList *head = NULL, *cur_item = NULL;
|
||||
GuestUserList *head = NULL, **tail = &head;
|
||||
struct utmpx *user_info = NULL;
|
||||
gpointer value = NULL;
|
||||
GuestUser *user = NULL;
|
||||
GuestUserList *item = NULL;
|
||||
double login_time = 0;
|
||||
|
||||
cache = g_hash_table_new(g_str_hash, g_str_equal);
|
||||
@ -3165,19 +3164,13 @@ GuestUserList *qmp_guest_get_users(Error **errp)
|
||||
continue;
|
||||
}
|
||||
|
||||
item = g_new0(GuestUserList, 1);
|
||||
item->value = g_new0(GuestUser, 1);
|
||||
item->value->user = g_strdup(user_info->ut_user);
|
||||
item->value->login_time = ga_get_login_time(user_info);
|
||||
user = g_new0(GuestUser, 1);
|
||||
user->user = g_strdup(user_info->ut_user);
|
||||
user->login_time = ga_get_login_time(user_info);
|
||||
|
||||
g_hash_table_insert(cache, item->value->user, item->value);
|
||||
g_hash_table_insert(cache, user->user, user);
|
||||
|
||||
if (!cur_item) {
|
||||
head = cur_item = item;
|
||||
} else {
|
||||
cur_item->next = item;
|
||||
cur_item = item;
|
||||
}
|
||||
QAPI_LIST_APPEND(tail, user);
|
||||
}
|
||||
endutxent();
|
||||
g_hash_table_destroy(cache);
|
||||
|
@ -1624,11 +1624,11 @@ GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
|
||||
{
|
||||
IP_ADAPTER_ADDRESSES *adptr_addrs, *addr;
|
||||
IP_ADAPTER_UNICAST_ADDRESS *ip_addr = NULL;
|
||||
GuestNetworkInterfaceList *head = NULL, *cur_item = NULL;
|
||||
GuestIpAddressList *head_addr, *cur_addr;
|
||||
GuestNetworkInterfaceList *info;
|
||||
GuestNetworkInterfaceList *head = NULL, **tail = &head;
|
||||
GuestIpAddressList *head_addr, **tail_addr;
|
||||
GuestNetworkInterface *info;
|
||||
GuestNetworkInterfaceStat *interface_stat = NULL;
|
||||
GuestIpAddressList *address_item = NULL;
|
||||
GuestIpAddress *address_item = NULL;
|
||||
unsigned char *mac_addr;
|
||||
char *addr_str;
|
||||
WORD wsa_version;
|
||||
@ -1651,30 +1651,24 @@ GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
|
||||
for (addr = adptr_addrs; addr; addr = addr->Next) {
|
||||
info = g_malloc0(sizeof(*info));
|
||||
|
||||
if (cur_item == NULL) {
|
||||
head = cur_item = info;
|
||||
} else {
|
||||
cur_item->next = info;
|
||||
cur_item = info;
|
||||
}
|
||||
QAPI_LIST_APPEND(tail, info);
|
||||
|
||||
info->value = g_malloc0(sizeof(*info->value));
|
||||
info->value->name = guest_wctomb_dup(addr->FriendlyName);
|
||||
info->name = guest_wctomb_dup(addr->FriendlyName);
|
||||
|
||||
if (addr->PhysicalAddressLength != 0) {
|
||||
mac_addr = addr->PhysicalAddress;
|
||||
|
||||
info->value->hardware_address =
|
||||
info->hardware_address =
|
||||
g_strdup_printf("%02x:%02x:%02x:%02x:%02x:%02x",
|
||||
(int) mac_addr[0], (int) mac_addr[1],
|
||||
(int) mac_addr[2], (int) mac_addr[3],
|
||||
(int) mac_addr[4], (int) mac_addr[5]);
|
||||
|
||||
info->value->has_hardware_address = true;
|
||||
info->has_hardware_address = true;
|
||||
}
|
||||
|
||||
head_addr = NULL;
|
||||
cur_addr = NULL;
|
||||
tail_addr = &head_addr;
|
||||
for (ip_addr = addr->FirstUnicastAddress;
|
||||
ip_addr;
|
||||
ip_addr = ip_addr->Next) {
|
||||
@ -1685,37 +1679,29 @@ GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
|
||||
|
||||
address_item = g_malloc0(sizeof(*address_item));
|
||||
|
||||
if (!cur_addr) {
|
||||
head_addr = cur_addr = address_item;
|
||||
} else {
|
||||
cur_addr->next = address_item;
|
||||
cur_addr = address_item;
|
||||
}
|
||||
QAPI_LIST_APPEND(tail_addr, address_item);
|
||||
|
||||
address_item->value = g_malloc0(sizeof(*address_item->value));
|
||||
address_item->value->ip_address = addr_str;
|
||||
address_item->value->prefix = guest_ip_prefix(ip_addr);
|
||||
address_item->ip_address = addr_str;
|
||||
address_item->prefix = guest_ip_prefix(ip_addr);
|
||||
if (ip_addr->Address.lpSockaddr->sa_family == AF_INET) {
|
||||
address_item->value->ip_address_type =
|
||||
GUEST_IP_ADDRESS_TYPE_IPV4;
|
||||
address_item->ip_address_type = GUEST_IP_ADDRESS_TYPE_IPV4;
|
||||
} else if (ip_addr->Address.lpSockaddr->sa_family == AF_INET6) {
|
||||
address_item->value->ip_address_type =
|
||||
GUEST_IP_ADDRESS_TYPE_IPV6;
|
||||
address_item->ip_address_type = GUEST_IP_ADDRESS_TYPE_IPV6;
|
||||
}
|
||||
}
|
||||
if (head_addr) {
|
||||
info->value->has_ip_addresses = true;
|
||||
info->value->ip_addresses = head_addr;
|
||||
info->has_ip_addresses = true;
|
||||
info->ip_addresses = head_addr;
|
||||
}
|
||||
if (!info->value->has_statistics) {
|
||||
if (!info->has_statistics) {
|
||||
interface_stat = g_malloc0(sizeof(*interface_stat));
|
||||
if (guest_get_network_stats(addr->AdapterName,
|
||||
interface_stat) == -1) {
|
||||
info->value->has_statistics = false;
|
||||
info->has_statistics = false;
|
||||
g_free(interface_stat);
|
||||
} else {
|
||||
info->value->statistics = interface_stat;
|
||||
info->value->has_statistics = true;
|
||||
info->statistics = interface_stat;
|
||||
info->has_statistics = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2082,12 +2068,11 @@ GuestUserList *qmp_guest_get_users(Error **errp)
|
||||
#define QGA_NANOSECONDS 10000000
|
||||
|
||||
GHashTable *cache = NULL;
|
||||
GuestUserList *head = NULL, *cur_item = NULL;
|
||||
GuestUserList *head = NULL, **tail = &head;
|
||||
|
||||
DWORD buffer_size = 0, count = 0, i = 0;
|
||||
GA_WTSINFOA *info = NULL;
|
||||
WTS_SESSION_INFOA *entries = NULL;
|
||||
GuestUserList *item = NULL;
|
||||
GuestUser *user = NULL;
|
||||
gpointer value = NULL;
|
||||
INT64 login = 0;
|
||||
@ -2123,23 +2108,17 @@ GuestUserList *qmp_guest_get_users(Error **errp)
|
||||
user->login_time = login_time;
|
||||
}
|
||||
} else {
|
||||
item = g_new0(GuestUserList, 1);
|
||||
item->value = g_new0(GuestUser, 1);
|
||||
user = g_new0(GuestUser, 1);
|
||||
|
||||
item->value->user = g_strdup(info->UserName);
|
||||
item->value->domain = g_strdup(info->Domain);
|
||||
item->value->has_domain = true;
|
||||
user->user = g_strdup(info->UserName);
|
||||
user->domain = g_strdup(info->Domain);
|
||||
user->has_domain = true;
|
||||
|
||||
item->value->login_time = login_time;
|
||||
user->login_time = login_time;
|
||||
|
||||
g_hash_table_add(cache, item->value->user);
|
||||
g_hash_table_add(cache, user->user);
|
||||
|
||||
if (!cur_item) {
|
||||
head = cur_item = item;
|
||||
} else {
|
||||
cur_item->next = item;
|
||||
cur_item = item;
|
||||
}
|
||||
QAPI_LIST_APPEND(tail, user);
|
||||
}
|
||||
}
|
||||
WTSFreeMemory(info);
|
||||
@ -2424,7 +2403,7 @@ static GStrv ga_get_hardware_ids(DEVINST devInstance)
|
||||
|
||||
GuestDeviceInfoList *qmp_guest_get_devices(Error **errp)
|
||||
{
|
||||
GuestDeviceInfoList *head = NULL, *cur_item = NULL, *item = NULL;
|
||||
GuestDeviceInfoList *head = NULL, **tail = &head;
|
||||
HDEVINFO dev_info = INVALID_HANDLE_VALUE;
|
||||
SP_DEVINFO_DATA dev_info_data;
|
||||
int i, j;
|
||||
@ -2522,14 +2501,7 @@ GuestDeviceInfoList *qmp_guest_get_devices(Error **errp)
|
||||
slog("driver: %s\ndriver version: %" PRId64 ",%s\n",
|
||||
device->driver_name, device->driver_date,
|
||||
device->driver_version);
|
||||
item = g_new0(GuestDeviceInfoList, 1);
|
||||
item->value = g_steal_pointer(&device);
|
||||
if (!cur_item) {
|
||||
head = cur_item = item;
|
||||
} else {
|
||||
cur_item->next = item;
|
||||
cur_item = item;
|
||||
}
|
||||
QAPI_LIST_APPEND(tail, g_steal_pointer(&device));
|
||||
}
|
||||
|
||||
if (dev_info != INVALID_HANDLE_VALUE) {
|
||||
|
@ -196,22 +196,14 @@ int tpm_config_parse(QemuOptsList *opts_list, const char *optarg)
|
||||
TPMInfoList *qmp_query_tpm(Error **errp)
|
||||
{
|
||||
TPMBackend *drv;
|
||||
TPMInfoList *info, *head = NULL, *cur_item = NULL;
|
||||
TPMInfoList *head = NULL, **tail = &head;
|
||||
|
||||
QLIST_FOREACH(drv, &tpm_backends, list) {
|
||||
if (!drv->tpmif) {
|
||||
continue;
|
||||
}
|
||||
|
||||
info = g_new0(TPMInfoList, 1);
|
||||
info->value = tpm_backend_query_tpm(drv);
|
||||
|
||||
if (!cur_item) {
|
||||
head = cur_item = info;
|
||||
} else {
|
||||
cur_item->next = info;
|
||||
cur_item = info;
|
||||
}
|
||||
QAPI_LIST_APPEND(tail, tpm_backend_query_tpm(drv));
|
||||
}
|
||||
|
||||
return head;
|
||||
@ -220,44 +212,26 @@ TPMInfoList *qmp_query_tpm(Error **errp)
|
||||
TpmTypeList *qmp_query_tpm_types(Error **errp)
|
||||
{
|
||||
unsigned int i = 0;
|
||||
TpmTypeList *head = NULL, *prev = NULL, *cur_item;
|
||||
TpmTypeList *head = NULL, **tail = &head;
|
||||
|
||||
for (i = 0; i < TPM_TYPE__MAX; i++) {
|
||||
if (!tpm_be_find_by_type(i)) {
|
||||
continue;
|
||||
}
|
||||
cur_item = g_new0(TpmTypeList, 1);
|
||||
cur_item->value = i;
|
||||
|
||||
if (prev) {
|
||||
prev->next = cur_item;
|
||||
}
|
||||
if (!head) {
|
||||
head = cur_item;
|
||||
}
|
||||
prev = cur_item;
|
||||
QAPI_LIST_APPEND(tail, i);
|
||||
}
|
||||
|
||||
return head;
|
||||
}
|
||||
TpmModelList *qmp_query_tpm_models(Error **errp)
|
||||
{
|
||||
TpmModelList *head = NULL, *prev = NULL, *cur_item;
|
||||
TpmModelList *head = NULL, **tail = &head;
|
||||
GSList *e, *l = object_class_get_list(TYPE_TPM_IF, false);
|
||||
|
||||
for (e = l; e; e = e->next) {
|
||||
TPMIfClass *c = TPM_IF_CLASS(e->data);
|
||||
|
||||
cur_item = g_new0(TpmModelList, 1);
|
||||
cur_item->value = c->model;
|
||||
|
||||
if (prev) {
|
||||
prev->next = cur_item;
|
||||
}
|
||||
if (!head) {
|
||||
head = cur_item;
|
||||
}
|
||||
prev = cur_item;
|
||||
QAPI_LIST_APPEND(tail, c->model);
|
||||
}
|
||||
g_slist_free(l);
|
||||
|
||||
|
@ -354,11 +354,11 @@ static const char *wan_compression_names[] = {
|
||||
|
||||
static SpiceChannelList *qmp_query_spice_channels(void)
|
||||
{
|
||||
SpiceChannelList *cur_item = NULL, *head = NULL;
|
||||
SpiceChannelList *head = NULL, **tail = &head;
|
||||
ChannelList *item;
|
||||
|
||||
QTAILQ_FOREACH(item, &channel_list, link) {
|
||||
SpiceChannelList *chan;
|
||||
SpiceChannel *chan;
|
||||
char host[NI_MAXHOST], port[NI_MAXSERV];
|
||||
struct sockaddr *paddr;
|
||||
socklen_t plen;
|
||||
@ -366,29 +366,22 @@ static SpiceChannelList *qmp_query_spice_channels(void)
|
||||
assert(item->info->flags & SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT);
|
||||
|
||||
chan = g_malloc0(sizeof(*chan));
|
||||
chan->value = g_malloc0(sizeof(*chan->value));
|
||||
|
||||
paddr = (struct sockaddr *)&item->info->paddr_ext;
|
||||
plen = item->info->plen_ext;
|
||||
getnameinfo(paddr, plen,
|
||||
host, sizeof(host), port, sizeof(port),
|
||||
NI_NUMERICHOST | NI_NUMERICSERV);
|
||||
chan->value->host = g_strdup(host);
|
||||
chan->value->port = g_strdup(port);
|
||||
chan->value->family = inet_netfamily(paddr->sa_family);
|
||||
chan->host = g_strdup(host);
|
||||
chan->port = g_strdup(port);
|
||||
chan->family = inet_netfamily(paddr->sa_family);
|
||||
|
||||
chan->value->connection_id = item->info->connection_id;
|
||||
chan->value->channel_type = item->info->type;
|
||||
chan->value->channel_id = item->info->id;
|
||||
chan->value->tls = item->info->flags & SPICE_CHANNEL_EVENT_FLAG_TLS;
|
||||
chan->connection_id = item->info->connection_id;
|
||||
chan->channel_type = item->info->type;
|
||||
chan->channel_id = item->info->id;
|
||||
chan->tls = item->info->flags & SPICE_CHANNEL_EVENT_FLAG_TLS;
|
||||
|
||||
/* XXX: waiting for the qapi to support GSList */
|
||||
if (!cur_item) {
|
||||
head = cur_item = chan;
|
||||
} else {
|
||||
cur_item->next = chan;
|
||||
cur_item = chan;
|
||||
}
|
||||
QAPI_LIST_APPEND(tail, chan);
|
||||
}
|
||||
|
||||
return head;
|
||||
|
Loading…
Reference in New Issue
Block a user