|
[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 |