On 10/13/2009 04:49 PM, David Lutterkort wrote:
On Tue, 2009-10-13 at 13:27 -0400, Laine Stump wrote:
> Poke around in sysfs and procfs to determine the type of an interface,
> and set the "type" attribute in the xml appropriately. If no clue is
> found, default to "ethernet", which is the current behavior elsewhere
> in netcf as well.
>
Cool .. some small nits:
It gets better - see below.
The updated patch will be along momentarily.
> diff --git a/src/drv_initscripts.c b/src/drv_initscripts.c
> index 8e36fab..ead5b9f 100644
> --- a/src/drv_initscripts.c
> +++ b/src/drv_initscripts.c
> @@ -775,6 +775,9 @@ char *drv_xml_state(struct netcf_if *nif) {
> prop = xmlNewProp(root, BAD_CAST "name", BAD_CAST nif->name);
> ERR_NOMEM(prop == NULL, ncf);
>
> + prop = xmlSetProp(root, BAD_CAST "type", BAD_CAST if_type(ncf,
nif->name));
> + ERR_NOMEM(prop == NULL, ncf);
>
This swallows errors in if_type; I'd prefer
const char *type = if_type(ncf, nif->name);
ERR_BAIL(ncf);
prop = xmlSetProp(root, BAD_CAST "type", BAD_CAST type);
ERR_NOMEM(prop == NULL, ncf);
Good point.
> diff --git a/src/dutil.c b/src/dutil.c
> index 817ec6d..9c8e575 100644
> --- a/src/dutil.c
> +++ b/src/dutil.c
> @@ -499,6 +499,39 @@ int if_ipv4_prefix(struct netcf *ncf, const char *intf) {
> return prefix;
> }
>
> +const char *if_type(struct netcf *ncf, const char *intf) {
> + char *path;
> + struct stat stats;
> + const char *ret = NULL;
> +
> + xasprintf(&path, "/proc/net/vlan/%s", intf);
> + ERR_NOMEM(path == NULL, ncf);
> + if ((stat (path,&stats) == 0)&& S_ISREG (stats.st_mode)) {
> + ret = "vlan";
> + }
> + FREE(path);
> +
> + if (ret == NULL) {
> + xasprintf(&path, "/sys/class/net/%s/bridge", intf);
> + ERR_NOMEM(path == NULL, ncf);
> + if (stat (path,&stats) == 0&& S_ISDIR (stats.st_mode))
> + return "bridge";
>
Oops. that should have been 'ret = "bridge"'.
> + FREE(path);
> + }
> + if (ret == NULL) {
> + xasprintf(&path, "/sys/class/net/%s/bonding", intf);
> + ERR_NOMEM(path == NULL, ncf);
> + if (stat (path,&stats) == 0&& S_ISDIR (stats.st_mode))
> + return "bond";
>
Likewise.
> + FREE(path);
> + }
> +
> +error:
> + if (ret == NULL)
> + ret = "ethernet";
> + return ret;
> +}
>
I'd prefer if the error return was NULL, i.e. the error label should go
two lines down.
David