Joao Martins wrote:
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?
I didn't look too closely, but it appears the qemu driver will only generate the
source path once. I think the same path could be reused as long as it doesn't
include components that will change, such as domid.
Regards,
Jim