diff options
author | 2012-09-05 13:34:08 +0800 | |
---|---|---|
committer | 2012-09-17 10:36:14 +0800 | |
commit | 4230b6c1026142ef1b78e181064b8fe4db1228ae (patch) | |
tree | 3edb63a05de683b7ba7bf96173a7fd67764eded7 /daemon | |
parent | list: Define new API virConnectListAllNodeDevices (diff) | |
download | libvirt-4230b6c1026142ef1b78e181064b8fe4db1228ae.tar.gz libvirt-4230b6c1026142ef1b78e181064b8fe4db1228ae.tar.bz2 libvirt-4230b6c1026142ef1b78e181064b8fe4db1228ae.zip |
list: Implement RPC calls for virConnectListAllNodeDevices
The RPC generator doesn't support returning list of object yet, this patch
does the work manually.
* daemon/remote.c:
Implemente the server side handler remoteDispatchConnectListAllNodeDevices.
* src/remote/remote_driver.c:
Add remote driver handler remoteConnectListAllNodeDevices.
* src/remote/remote_protocol.x:
New RPC procedure REMOTE_PROC_CONNECT_LIST_ALL_INTERFACES and
Diffstat (limited to 'daemon')
-rw-r--r-- | daemon/remote.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/daemon/remote.c b/daemon/remote.c index 12cd25cbb..c6805efab 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -4321,6 +4321,59 @@ cleanup: return rv; } +static int +remoteDispatchConnectListAllNodeDevices(virNetServerPtr server ATTRIBUTE_UNUSED, + virNetServerClientPtr client, + virNetMessagePtr msg ATTRIBUTE_UNUSED, + virNetMessageErrorPtr rerr, + remote_connect_list_all_node_devices_args *args, + remote_connect_list_all_node_devices_ret *ret) +{ + virNodeDevicePtr *devices = NULL; + int ndevices = 0; + int i; + int rv = -1; + struct daemonClientPrivate *priv = virNetServerClientGetPrivateData(client); + + if (!priv->conn) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open")); + goto cleanup; + } + + if ((ndevices = virConnectListAllNodeDevices(priv->conn, + args->need_results ? &devices : NULL, + args->flags)) < 0) + goto cleanup; + + if (devices && ndevices) { + if (VIR_ALLOC_N(ret->devices.devices_val, ndevices) < 0) { + virReportOOMError(); + goto cleanup; + } + + ret->devices.devices_len = ndevices; + + for (i = 0; i < ndevices; i++) + make_nonnull_node_device(ret->devices.devices_val + i, devices[i]); + } else { + ret->devices.devices_len = 0; + ret->devices.devices_val = NULL; + } + + ret->ret = ndevices; + + rv = 0; + +cleanup: + if (rv < 0) + virNetMessageSaveError(rerr); + if (devices) { + for (i = 0; i < ndevices; i++) + virNodeDeviceFree(devices[i]); + VIR_FREE(devices); + } + return rv; +} /*----- Helpers. -----*/ |