[Libvirt-cim] [PATCH 5/8] RASD: Provider Support for Console RASDs
John Ferlan
jferlan at redhat.com
Tue Sep 10 21:11:54 UTC 2013
On 09/05/2013 11:36 AM, Viktor Mihajlovski wrote:
> From: Thilo Boehm <tboehm at linux.vnet.ibm.com>
>
> Instance support for console RASDs.
>
> The ResourceType of the returned instances is is '1' (Other) and the
> OtherResourceType is 'console'.
>
> Implemented CIM operations:
> enumerate instances
> enumerate instance names
> get instance
>
> Signed-off-by: Thilo Boehm <tboehm at linux.vnet.ibm.com>
> Signed-off-by: Viktor Mihajlovski <mihajlov at linux.vnet.ibm.com>
> Reviewed-by: Boris Fiuczynski <fiuczy at linux.vnet.ibm.com>
> ---
> src/Virt_RASD.c | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 147 insertions(+), 1 deletion(-)
>
> diff --git a/src/Virt_RASD.c b/src/Virt_RASD.c
> index 150ccd3..7d72831 100644
> --- a/src/Virt_RASD.c
> +++ b/src/Virt_RASD.c
> @@ -1,5 +1,5 @@
> /*
> - * Copyright IBM Corp. 2007
> + * Copyright IBM Corp. 2007, 2013
> *
> * Authors:
> * Dan Smith <danms at us.ibm.com>
> @@ -662,6 +662,142 @@ static CMPIStatus set_graphics_rasd_params(const struct virt_device *dev,
> return s;
> }
>
> +static char* _build_console_url(const char *protocol,
> + const char *host,
> + const char *port)
> +{
> + char* result = NULL;
> +
> + if (NULL == host)
> + goto out;
> +
> + if (STREQC("file", protocol)) {
> + /* The host string contains the file name.
> + Even if the file name does not start with a '/'
> + it is treated by libvirt as a full qualified path.
> + */
> + if ('/' == host[0]) {
> + if (asprintf(&result, "file://%s", host) < 0)
> + result = NULL;
> + goto out;
> + } else {
> + if (asprintf(&result, "file:///%s", host) < 0)
> + result = NULL;
> + goto out;
> + }
> + }
> + /* The assumption is that the host does not contain a port.
> + If the host string contains a ':',
> + the host is treated as an IPv6 address.
> + */
> + if (NULL == strchr(host, ':')) {
> + if (NULL == port) {
> + if (asprintf(&result,"%s://%s", protocol, host) < 0)
> + result = NULL;
> + goto out;
> + } else {
> + if (asprintf(&result,"%s://%s:%s", protocol,
> + host,port) < 0)
> + result = NULL;
> + goto out;
> + }
> + }
> + out:
> + return result;
> +}
> +
> +
> +static CMPIStatus set_console_rasd_params(const struct virt_device *vdev,
> + CMPIInstance *inst)
> +{
> + CMPIStatus s = {CMPI_RC_OK, NULL};
> + const struct console_device *cdev = NULL;
> + char* tmp = NULL;
> +
> + cdev = &vdev->dev.console;
> +
> + CMSetProperty(inst, "OtherResourceType", "console", CMPI_chars);
> + CMSetProperty(inst, "SourceType",
> + (CMPIValue *)&cdev->source_type, CMPI_uint16);
> + CMSetProperty(inst, "TargetType",
> + (CMPIValue *)cdev->target_type, CMPI_chars);
> +
Since libxkutil/parse_console_device() didn't do any error checking
w/r/t a NULL return on get_attr_value() calls, we could get into a lot
of trouble here, but again par for the course in libvirt-cim!
> + switch (cdev->source_type) {
> + case CIM_CHARDEV_SOURCE_TYPE_PTY:
> + CMSetProperty(inst, "SourcePath",
> + (CMPIValue *)cdev->source_dev.pty.path,
> + CMPI_chars);
> + break;
> + case CIM_CHARDEV_SOURCE_TYPE_DEV:
> + CMSetProperty(inst, "SourcePath",
> + (CMPIValue *)cdev->source_dev.dev.path,
> + CMPI_chars);
> + break;
> + case CIM_CHARDEV_SOURCE_TYPE_FILE:
> + CMSetProperty(inst, "SourcePath",
> + (CMPIValue *)cdev->source_dev.file.path,
> + CMPI_chars);
> + break;
> + case CIM_CHARDEV_SOURCE_TYPE_PIPE:
> + CMSetProperty(inst, "SourcePath",
> + (CMPIValue *)cdev->source_dev.pipe.path,
> + CMPI_chars);
> + break;
> + case CIM_CHARDEV_SOURCE_TYPE_UNIXSOCK:
> + tmp = _build_console_url("file",
> + cdev->source_dev.unixsock.path, NULL);
> + if (STREQC(cdev->source_dev.unixsock.mode, "bind"))
> + CMSetProperty(inst, "BindURL",
> + (CMPIValue *)tmp, CMPI_chars);
> +
> + if (STREQC(cdev->source_dev.unixsock.mode, "connect"))
> + CMSetProperty(inst, "ConnectURL",
> + (CMPIValue *)tmp, CMPI_chars);
> +
> + free(tmp);
> + break;
> + case CIM_CHARDEV_SOURCE_TYPE_UDP:
> + tmp = _build_console_url("udp",
> + cdev->source_dev.udp.bind_host,
> + cdev->source_dev.udp.bind_service);
Since 'tmp' can be NULL, could there be any negative repercussion in the
following?
> + CMSetProperty(inst, "BindURL",
> + (CMPIValue *)tmp, CMPI_chars);
> + free(tmp);
> +
> + tmp = _build_console_url("udp",
> + cdev->source_dev.udp.connect_host,
> + cdev->source_dev.udp.connect_service);
Same here
> + CMSetProperty(inst, "ConnectURL", (CMPIValue *)tmp, CMPI_chars);
> + free(tmp);
> + break;
> + case CIM_CHARDEV_SOURCE_TYPE_TCP:
> + tmp = _build_console_url(cdev->source_dev.tcp.protocol,
> + cdev->source_dev.tcp.host,
> + cdev->source_dev.tcp.service);
> + if (STREQC(cdev->source_dev.tcp.mode, "bind"))
Again
> + CMSetProperty(inst, "BindURL",
> + (CMPIValue *)tmp, CMPI_chars);
> +
> + if (STREQC(cdev->source_dev.tcp.mode, "connect"))
Again
let me know if there's anything that needs to be done/checked and I can
squash it in...
John
> + CMSetProperty(inst, "ConnectURL",
> + (CMPIValue *)tmp, CMPI_chars);
> +
> + free(tmp);
> + break;
> +
> + default:
> + /* Nothing to do for :
> + CIM_CHARDEV_SOURCE_TYPE_STDIO
> + CIM_CHARDEV_SOURCE_TYPE_NULL
> + CIM_CHARDEV_SOURCE_TYPE_VC
> + CIM_CHARDEV_SOURCE_TYPE_SPICEVMC
> + */
> + break;
> + }
> +
> + return s;
> +}
> +
> static CMPIStatus set_input_rasd_params(const struct virt_device *dev,
> CMPIInstance *inst)
> {
> @@ -721,6 +857,9 @@ CMPIInstance *rasd_from_vdev(const CMPIBroker *broker,
> } else if (dev->type == CIM_RES_TYPE_GRAPHICS) {
> type = CIM_RES_TYPE_GRAPHICS;
> base = "GraphicsResourceAllocationSettingData";
> + } else if (dev->type == CIM_RES_TYPE_CONSOLE) {
> + type = CIM_RES_TYPE_OTHER;
> + base = "ConsoleResourceAllocationSettingData";
> } else if (dev->type == CIM_RES_TYPE_INPUT) {
> type = CIM_RES_TYPE_INPUT;
> base = "InputResourceAllocationSettingData";
> @@ -777,6 +916,8 @@ CMPIInstance *rasd_from_vdev(const CMPIBroker *broker,
> s = set_graphics_rasd_params(dev, inst, host, CLASSNAME(ref));
> } else if (dev->type == CIM_RES_TYPE_INPUT) {
> s = set_input_rasd_params(dev, inst);
> + } else if (dev->type == CIM_RES_TYPE_CONSOLE) {
> + s = set_console_rasd_params(dev, inst);
> }
>
> /* FIXME: Put the HostResource in place */
> @@ -909,6 +1050,8 @@ CMPIrc res_type_from_rasd_classname(const char *cn, uint16_t *type)
> *type = CIM_RES_TYPE_INPUT;
> else if (STREQ(base, "StorageVolumeResourceAllocationSettingData"))
> *type = CIM_RES_TYPE_IMAGE;
> + else if (STREQ(base, "ConsoleResourceAllocationSettingData"))
> + *type = CIM_RES_TYPE_CONSOLE;
> else
> goto out;
>
> @@ -940,6 +1083,9 @@ CMPIrc rasd_classname_from_type(uint16_t type, const char **classname)
> case CIM_RES_TYPE_GRAPHICS:
> *classname = "GraphicsResourceAllocationSettingData";
> break;
> + case CIM_RES_TYPE_CONSOLE:
> + *classname = "ConsoleResourceAllocationSettingData";
> + break;
> case CIM_RES_TYPE_INPUT:
> *classname = "InputResourceAllocationSettingData";
> break;
>
More information about the Libvirt-cim
mailing list