On 09/20/2016 04:04 AM, Jim Fehlig wrote:
On 09/16/2016 05:43 PM, Joao Martins wrote:
> Add support for formating/parsing libxl channels.
>
> Syntax on xen libxl goes as following:
> channel=["connection=pty|socket,path=/path/to/socket,name=XXX",...]
>
> Signed-off-by: Joao Martins <joao.m.martins(a)oracle.com>
> ---
> src/xenconfig/xen_xl.c | 176 +++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 176 insertions(+)
>
> diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c
> index 7774dfc..eea24b9 100644
> --- a/src/xenconfig/xen_xl.c
> +++ b/src/xenconfig/xen_xl.c
> @@ -685,6 +685,93 @@ xenParseXLUSB(virConfPtr conf, virDomainDefPtr def)
> return 0;
> }
>
> +static int
> +xenParseXLChannel(virConfPtr conf, virDomainDefPtr def)
> +{
> + virConfValuePtr list = virConfGetValue(conf, "channel");
> + virDomainChrDefPtr channel = NULL;
> + char *name = NULL;
> + char *path = NULL;
> +
> + if (list && list->type == VIR_CONF_LIST) {
> + list = list->list;
> + while (list) {
> + char type[10];
> + char *key;
> +
> + if ((list->type != VIR_CONF_STRING) || (list->str == NULL))
> + goto skipchannel;
> +
> + key = list->str;
> + while (key) {
> + char *data;
> + char *nextkey = strchr(key, ',');
> +
> + if (!(data = strchr(key, '=')))
> + goto skipchannel;
> + data++;
> +
> + if (STRPREFIX(key, "connection=")) {
> + int len = nextkey ? (nextkey - data) : sizeof(type) - 1;
> + if (virStrncpy(type, data, len, sizeof(type)) == NULL) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("connection %s too big"), data);
> + goto skipchannel;
> + }
> + } else if (STRPREFIX(key, "name=")) {
> + int len = nextkey ? (nextkey - data) : strlen(data);
> + VIR_FREE(name);
> + if (VIR_STRNDUP(name, data, len) < 0)
> + goto cleanup;
> + } else if (STRPREFIX(key, "path=")) {
> + int len = nextkey ? (nextkey - data) : strlen(data);
> + VIR_FREE(path);
> + if (VIR_STRNDUP(path, data, len) < 0)
> + goto cleanup;
> + }
> +
> + while (nextkey && (nextkey[0] == ',' ||
> + nextkey[0] == ' ' ||
> + nextkey[0] == '\t'))
> + nextkey++;
> + key = nextkey;
> + }
> +
> + if (!(channel = virDomainChrDefNew()))
> + goto cleanup;
> +
> + if (STRPREFIX(type, "socket")) {
> + channel->source.type = VIR_DOMAIN_CHR_TYPE_UNIX;
> + channel->source.data.nix.path = path;
> + channel->source.data.nix.listen = 1;
> + } else if (STRPREFIX(type, "pty")) {
> + channel->source.type = VIR_DOMAIN_CHR_TYPE_PTY;
> + VIR_FREE(path);
> + } else {
> + goto cleanup;
> + }
> +
> + channel->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL;
> + channel->targetType = VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_XEN;
> + channel->target.name = name;
> +
> + if (VIR_APPEND_ELEMENT(def->channels, def->nchannels, channel)
< 0)
> + goto cleanup;
> +
> + skipchannel:
> + list = list->next;
> + }
> + }
> +
> + return 0;
> +
> + cleanup:
> + virDomainChrDefFree(channel);
> + VIR_FREE(path);
> + VIR_FREE(name);
> + return -1;
> +}
> +
> virDomainDefPtr
> xenParseXL(virConfPtr conf,
> virCapsPtr caps,
> @@ -720,6 +807,9 @@ xenParseXL(virConfPtr conf,
> if (xenParseXLUSBController(conf, def) < 0)
> goto cleanup;
>
> + if (xenParseXLChannel(conf, def) < 0)
> + goto cleanup;
> +
> if (virDomainDefPostParse(def, caps, VIR_DOMAIN_DEF_PARSE_ABI_UPDATE,
> xmlopt) < 0)
> goto cleanup;
> @@ -1347,6 +1437,89 @@ xenFormatXLUSB(virConfPtr conf,
> return -1;
> }
>
> +static int
> +xenFormatXLChannel(virConfValuePtr list, virDomainChrDefPtr channel)
> +{
> + virBuffer buf = VIR_BUFFER_INITIALIZER;
> + int sourceType = channel->source.type;
> + virConfValuePtr val, tmp;
> +
> + /* connection */
> + virBufferAddLit(&buf, "connection=");
> + switch (sourceType) {
> + case VIR_DOMAIN_CHR_TYPE_PTY:
> + virBufferAddLit(&buf, "pty,");
> + break;
> + case VIR_DOMAIN_CHR_TYPE_UNIX:
> + virBufferAddLit(&buf, "socket,");
> + break;
> + default:
> + goto cleanup;
> + }
> +
> + /* path */
> + if (sourceType == VIR_DOMAIN_CHR_TYPE_UNIX)
> + virBufferAsprintf(&buf, "path=%s,",
channel->source.data.nix.path);
Can this be added to the VIR_DOMAIN_CHR_TYPE_UNIX case above?
Yeap, it should have
been that way in the first place. I will amend this to the
case above.
Btw I assume that I'll have to regenerate the path for inactive XMLs that don't
have the <source> path included, right?
Looks good.
Cool!
Joao