[libvirt] [PREPOST 03/17] src/xenxm:Refactor network config parsing code
David kiarie
davidkiarie4 at gmail.com
Wed Jul 16 13:36:24 UTC 2014
The use of virReportError,
On Wed, Jul 16, 2014 at 4:33 PM, David kiarie <davidkiarie4 at gmail.com> wrote:
> I think you comments on PCI parsing code could also apply here
>
> On Wed, Jul 16, 2014 at 12:19 AM, Jim Fehlig <jfehlig at suse.com> wrote:
>> Jim Fehlig wrote:
>>> David Kiarie wrote:
>>>
>>>> From: Kiarie Kahurani <davidkiarie4 at gmail.com>
>>>>
>>>> I introduced the function
>>>> xenFormatXMVif(virConfPtr conf, ......);
>>>> which parses network configuration
>>>>
>>>> signed-off-by: David Kiarie <davidkiarie4 at gmail.com>
>>>> ---
>>>> src/xenxs/xen_xm.c | 298 ++++++++++++++++++++++++++++-------------------------
>>>> 1 file changed, 155 insertions(+), 143 deletions(-)
>>>>
>>>> diff --git a/src/xenxs/xen_xm.c b/src/xenxs/xen_xm.c
>>>> index dc840e5..26ebd5a 100644
>>>> --- a/src/xenxs/xen_xm.c
>>>> +++ b/src/xenxs/xen_xm.c
>>>> @@ -309,6 +309,159 @@ static int xenParseXMMem(virConfPtr conf, virDomainDefPtr def)
>>>>
>>>> return 0;
>>>> }
>>>> +static int xenParseXMVif(virConfPtr conf, virDomainDefPtr def)
>>>>
>>>>
>>>
>>> Same comment here about blank lines between functions. I won't bore you
>>> with repeating myself in all the patches. Also, remember Eric's comment
>>> about function return type on one line and name and params on another.
>>> E.g.
>>>
>>> static int
>>> xenParseXMVif(virConfPtr conf, virDomainDefPtr def)
>>> {
>>> ...
>>> }
>>>
>>>
>>>> +{
>>>> + char *script = NULL;
>>>> + virDomainNetDefPtr net = NULL;
>>>> + virConfValuePtr list = virConfGetValue(conf, "vif");
>>>>
>>>>
>>>
>>> Style is to have a blank line after local variable declarations.
>>>
>>> I think you should also define a local variable ret, initialized to -1.
>>>
>>>
>>>> + if (list && list->type == VIR_CONF_LIST) {
>>>> + list = list->list;
>>>> + while (list) {
>>>> + char model[10];
>>>> + char type[10];
>>>> + char ip[16];
>>>> + char mac[18];
>>>> + char bridge[50];
>>>> + char vifname[50];
>>>> + char *key;
>>>> +
>>>> + bridge[0] = '\0';
>>>> + mac[0] = '\0';
>>>> + ip[0] = '\0';
>>>> + model[0] = '\0';
>>>> + type[0] = '\0';
>>>> + vifname[0] = '\0';
>>>> +
>>>> + if ((list->type != VIR_CONF_STRING) || (list->str == NULL))
>>>> + goto skipnic;
>>>> +
>>>> + key = list->str;
>>>> + while (key) {
>>>> + char *data;
>>>> + char *nextkey = strchr(key, ',');
>>>> +
>>>> + if (!(data = strchr(key, '=')))
>>>> + goto skipnic;
>>>> + data++;
>>>> +
>>>> + if (STRPREFIX(key, "mac=")) {
>>>> + int len = nextkey ? (nextkey - data) : sizeof(mac) - 1;
>>>> + if (virStrncpy(mac, data, len, sizeof(mac)) == NULL) {
>>>> + virReportError(VIR_ERR_INTERNAL_ERROR,
>>>> + _("MAC address %s too big for destination"),
>>>> + data);
>>>> + goto skipnic;
> here
>>>> + }
>>>> + } else if (STRPREFIX(key, "bridge=")) {
>>>> + int len = nextkey ? (nextkey - data) : sizeof(bridge) - 1;
>>>> + if (virStrncpy(bridge, data, len, sizeof(bridge)) == NULL) {
>>>> + virReportError(VIR_ERR_INTERNAL_ERROR,
>>>> + _("Bridge %s too big for destination"),
>>>> + data);
>>>> + goto skipnic;
> here
>>>> + }
>>>> + } else if (STRPREFIX(key, "script=")) {
>>>> + int len = nextkey ? (nextkey - data) : strlen(data);
>>>> + VIR_FREE(script);
>>>> + if (VIR_STRNDUP(script, data, len) < 0)
>>>> + goto cleanup;
>>>> + } else if (STRPREFIX(key, "model=")) {
>>>> + int len = nextkey ? (nextkey - data) : sizeof(model) - 1;
>>>> + if (virStrncpy(model, data, len, sizeof(model)) == NULL) {
>>>> + virReportError(VIR_ERR_INTERNAL_ERROR,
>>>> + _("Model %s too big for destination"), data);
>>>> + goto skipnic;
> here
>>>> + }
>>>> + } else if (STRPREFIX(key, "type=")) {
>>>> + int len = nextkey ? (nextkey - data) : sizeof(type) - 1;
>>>> + if (virStrncpy(type, data, len, sizeof(type)) == NULL) {
>>>> + virReportError(VIR_ERR_INTERNAL_ERROR,
>>>> + _("Type %s too big for destination"), data);
>>>> + goto skipnic;
> here
>>>> + }
>>>> + } else if (STRPREFIX(key, "vifname=")) {
>>>> + int len = nextkey ? (nextkey - data) : sizeof(vifname) - 1;
>>>> + if (virStrncpy(vifname, data, len, sizeof(vifname)) == NULL) {
>>>> + virReportError(VIR_ERR_INTERNAL_ERROR,
>>>> + _("Vifname %s too big for destination"),
>>>> + data);
>>>> + goto skipnic;
> here
>>>> + }
>>>> + } else if (STRPREFIX(key, "ip=")) {
>>>> + int len = nextkey ? (nextkey - data) : sizeof(ip) - 1;
>>>> + if (virStrncpy(ip, data, len, sizeof(ip)) == NULL) {
>>>> + virReportError(VIR_ERR_INTERNAL_ERROR,
>>>> + _("IP %s too big for destination"), data);
>>>> + goto skipnic;
> here
>>>> + }
>>>> + }
>>>> +
>>>> + while (nextkey && (nextkey[0] == ',' ||
>>>> + nextkey[0] == ' ' ||
>>>> + nextkey[0] == '\t'))
>>>> + nextkey++;
>>>> + key = nextkey;
>>>> + }
>>>> +
>>>> + if (VIR_ALLOC(net) < 0)
>>>> + goto cleanup;
>>>> +
>>>> + if (mac[0]) {
>>>> + if (virMacAddrParse(mac, &net->mac) < 0) {
>>>> + virReportError(VIR_ERR_INTERNAL_ERROR,
>>>> + _("malformed mac address '%s'"), mac);
>>>> + goto cleanup;
>>>> + }
>>>> + }
>>>> +
>>>> + if (bridge[0] || STREQ_NULLABLE(script, "vif-bridge") ||
>>>> + STREQ_NULLABLE(script, "vif-vnic")) {
>>>> + net->type = VIR_DOMAIN_NET_TYPE_BRIDGE;
>>>> + } else {
>>>> + net->type = VIR_DOMAIN_NET_TYPE_ETHERNET;
>>>> + }
>>>> +
>>>> + if (net->type == VIR_DOMAIN_NET_TYPE_BRIDGE) {
>>>> + if (bridge[0] && VIR_STRDUP(net->data.bridge.brname, bridge) < 0)
>>>> + goto cleanup;
>>>> + if (ip[0] && VIR_STRDUP(net->data.bridge.ipaddr, ip) < 0)
>>>> + goto cleanup;
>>>> + } else {
>>>> + if (ip[0] && VIR_STRDUP(net->data.ethernet.ipaddr, ip) < 0)
>>>> + goto cleanup;
>>>> + }
>>>> +
>>>> + if (script && script[0] &&
>>>> + VIR_STRDUP(net->script, script) < 0)
>>>> + goto cleanup;
>>>> +
>>>> + if (model[0] &&
>>>> + VIR_STRDUP(net->model, model) < 0)
>>>> + goto cleanup;
>>>> +
>>>> + if (!model[0] && type[0] && STREQ(type, "netfront") &&
>>>> + VIR_STRDUP(net->model, "netfront") < 0)
>>>> + goto cleanup;
>>>> +
>>>> + if (vifname[0] &&
>>>> + VIR_STRDUP(net->ifname, vifname) < 0)
>>>> + goto cleanup;
>>>> +
>>>> + if (VIR_APPEND_ELEMENT(def->nets, def->nnets, net) < 0)
>>>> + goto cleanup;
>>>> +
>>>> + VIR_FREE(script);
>>>>
>>>>
>>>
>>> Can be freed in cleanup.
>>>
>>>
>>>> + skipnic:
>>>> + list = list->next;
>>>> + virDomainNetDefFree(net);
>>>>
>>>>
>>>
>>> Set 'net = NULL' now that it has been freed.
>>>
>>
>> Ignore this comment. It is similar to the comment I made in 7/17, which
>> Eric clarified
>>
>> https://www.redhat.com/archives/libvir-list/2014-July/msg00628.html
>>
>> Regards,
>> Jim
>>
> Should I got ahead and make the changes?
More information about the libvir-list
mailing list