[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC 2/4] xl: add support for channels
This adds support for channel declarations of the form: channel = [ "name=...,type=...[,path=...][,backend=...]" ] where 'name' is a label to identify the channel to the frontend. If 'type = none' then the channel is connected to /dev/null If 'type = pty' then the channel is connected to a pty in the backend domain If 'type = path' then data is read from the channel and written to the file given by 'path = ...' in the backend domain. If 'type = socket' then the channel is connected to a Unix domain socket given by 'path = ...' in the backend domain. Signed-off-by: David Scott <dave.scott@xxxxxxxxxx> --- tools/libxl/xl_cmdimpl.c | 62 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 5195914..2657b5d 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -736,7 +736,7 @@ static void parse_config_data(const char *config_source, long l; XLU_Config *config; XLU_ConfigList *cpus, *vbds, *nics, *pcis, *cvfbs, *cpuids, *vtpms; - XLU_ConfigList *ioports, *irqs, *iomem; + XLU_ConfigList *channels, *ioports, *irqs, *iomem; int num_ioports, num_irqs, num_iomem; int pci_power_mgmt = 0; int pci_msitranslate = 0; @@ -1289,6 +1289,66 @@ static void parse_config_data(const char *config_source, } } + if (!xlu_cfg_get_list (config, "channel", &channels, 0, 0)) { + d_config->num_channels = 0; + d_config->channels = NULL; + while ((buf = xlu_cfg_get_listitem (channels, d_config->num_channels)) != NULL) { + libxl_device_channel *channel; + char *buf2 = strdup(buf); + char *p, *p2; + d_config->channels = (libxl_device_channel *) realloc(d_config->channels, sizeof (libxl_device_channel) * (d_config->num_channels + 1)); + channel = d_config->channels + d_config->num_channels; + libxl_device_channel_init(channel); + channel->devid = d_config->num_channels; + + p = strtok(buf2, ","); + if (!p) + goto skip_channel; + do { + while (*p == ' ') + p++; + if ((p2 = strchr(p, '=')) == NULL) + break; + *p2 = '\0'; + if (!strcmp(p, "backend")) { + free(channel->backend_domname); + channel->backend_domname = strdup(p2 + 1); + } else if (!strcmp(p, "name")) { + free(channel->name); + channel->name = strdup(p2 + 1); + } else if (!strcmp(p, "type")) { + if (channel->type != LIBXL_CHANNEL_TYPE_NONE) { + fprintf(stderr, "a channel may have only one output," + " skipping device\n"); + goto skip_channel; + } + if (!strcmp(p2 + 1, "none")) { + channel->type = LIBXL_CHANNEL_TYPE_NONE; + } else if (!strcmp(p2 + 1, "pty")) { + channel->type = LIBXL_CHANNEL_TYPE_PTY; + } else if (!strcmp(p2 + 1, "path")) { + channel->type = LIBXL_CHANNEL_TYPE_PATH; + } else if (!strcmp(p2 + 1, "socket")) { + channel->type = LIBXL_CHANNEL_TYPE_SOCKET; + } else { + fprintf(stderr, "unknown channel type '%s'," + " skipping device\n", p2 + 1); + goto skip_channel; + } + } else if (!strcmp(p, "path")) { + free(channel->path); + channel->path = strdup(p2 + 1); + } else { + fprintf(stderr, "unknown channel parameter '%s'," + " ignoring\n", p); + } + } while ((p = strtok(NULL, ",")) != NULL); +skip_channel: + free(buf2); + d_config->num_channels++; + } + } + if (!xlu_cfg_get_list (config, "vif", &nics, 0, 0)) { d_config->num_nics = 0; d_config->nics = NULL; -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |