[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#433568: [PATCH 2/3] Impove vlan support, by not relying on '.' to detect and write out vlan raw device stanza



---
 debian/changelog  |  2 ++
 netcfg-common.c   |  1 +
 netcfg.h          |  3 +++
 vlan.c            | 16 ++++++++--------
 write_interface.c | 15 +++++++--------
 5 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/debian/changelog b/debian/changelog
index 2a5e4e6..7b7aebe 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -13,6 +13,8 @@ netcfg (1.138) UNRELEASED; urgency=medium
   * nm-conf.c: check return result of fscanf
   * Makefile: link with -lm to resolve undefined log and other functions
   * All of above resolves FTBFS
+  * Impove vlan support, by not relying on '.' to detect and write out
+    vlan raw device stanza
 
  -- Dimitri John Ledkov <xnox@ubuntu.com>  Wed, 30 Mar 2016 12:13:56 +0100
 
diff --git a/netcfg-common.c b/netcfg-common.c
index c6d1d8d..8d69b5e 100644
--- a/netcfg-common.c
+++ b/netcfg-common.c
@@ -1564,6 +1564,7 @@ void netcfg_interface_init(struct netcfg_interface *iface)
     iface->v6_stateless_config = -1;
     iface->loopback = -1;
     iface->mode = MANAGED;
+    iface->vlan_raw_device = NULL;
 }
 
 /* Parse an IP address (v4 or v6), with optional CIDR netmask, into
diff --git a/netcfg.h b/netcfg.h
index 4dfbdee..65c97d7 100644
--- a/netcfg.h
+++ b/netcfg.h
@@ -151,6 +151,9 @@ struct netcfg_interface {
 	/* WPA */
 	wpa_t wpa_supplicant_status;
 	char *passphrase;
+
+	/* VLAN */
+	char *vlan_raw_device;
 };
 
 /* Somewhere we can store both in_addr and in6_addr; convenient for all those
diff --git a/vlan.c b/vlan.c
index ec2a19b..a96c9c6 100644
--- a/vlan.c
+++ b/vlan.c
@@ -14,8 +14,8 @@ int netcfg_set_vlan(struct netcfg_interface *interface, struct debconfclient *cl
     char vlancmd_template[] = "ip link add link %s name %s type vlan id %s";
 #elif defined(__FreeBSD_kernel__)
     /*export 2 more to make it the same formt with Linux*/
-    char vlancmd_tmplate[] = "export NIC=%s; export VNIC=%s; export VLANID=%s;" 
-                             " ifconfig $VNIC create";
+    char vlancmd_tmplate[] = "export NIC=%s; export VNIC=%s; export VLANID=%s;"
+			     " ifconfig $VNIC create";
 #endif
     int vlancmd_template_len = sizeof(vlancmd_template);
 
@@ -47,15 +47,15 @@ int netcfg_set_vlan(struct netcfg_interface *interface, struct debconfclient *cl
     snprintf(vlancmd, vlancmd_len, vlancmd_template, interface->name, vlaniface, vlanid);
     if(di_exec_shell_log(vlancmd)){
        di_warning("^ Setting VLAN error: the command is \n%s", vlancmd);
-       debconf_capb(client); 
-       debconf_input(client, "critical", "netcfg/vlan_cmderror"); 
-       debconf_go(client); 
-       debconf_capb(client, "backup"); 
+       debconf_capb(client);
+       debconf_input(client, "critical", "netcfg/vlan_cmderror");
+       debconf_go(client);
+       debconf_capb(client, "backup");
        goto error;
     }
     if(interface->name){
-         free(interface->name);
-         interface->name = vlaniface;
+       interface->vlan_raw_device = interface->name;
+       interface->name = vlaniface;
     }
     free(vlancmd);
     return VLAN_SUCESSED;
diff --git a/write_interface.c b/write_interface.c
index be0d78b..09f9848 100644
--- a/write_interface.c
+++ b/write_interface.c
@@ -48,14 +48,13 @@ static int nc_wi_loopback(const struct netcfg_interface *interface, FILE *fd)
 */
 static int nc_wi_vlan(const struct netcfg_interface *interface, FILE *fd)
 {
-    char *dup_name, *strip_name;
-    dup_name = strdup(interface->name);
-    strip_name = strsep(&dup_name, ".");
-    if(strip_name != NULL){
-        fprintf(fd, "\tvlan_raw_device %s\n", strip_name);
+	int rv;
+	rv = 1;
+	if (interface && interface->vlan_raw_device &&
+	    (fprintf(fd, "\tvlan_raw_device %s\n", interface->vlan_raw_device) < 0)) {
+		rv = 0;
 	}
-    free(dup_name);
-	return 1;
+	return rv;
 }
 
 
@@ -286,7 +285,7 @@ int netcfg_write_interface(const struct netcfg_interface *interface)
 		di_debug("Writing static IPv6 stanza for %s", interface->name);
 		rv = nc_wi_static_ipv6(interface, fd);
 	}
-	if (rv && strchr(interface->name, '.')){
+	if (rv && interface && interface->vlan_raw_device) {
 		di_debug("Writing VLAN: %s", interface->name);
 		rv = nc_wi_vlan(interface, fd);
 	}
-- 
2.7.4


Reply to: