[rtems-libbsd commit] rc.conf/net: Let interface option appear on a DHCP ifconfig_ line.

Chris Johns chrisj at rtems.org
Fri Aug 12 06:10:22 UTC 2016


Module:    rtems-libbsd
Branch:    master
Commit:    ab7739a574e174b71b51ceaeef409df97463f16b
Changeset: http://git.rtems.org/rtems-libbsd/commit/?id=ab7739a574e174b71b51ceaeef409df97463f16b

Author:    Chris Johns <chrisj at rtems.org>
Date:      Fri Aug 12 13:55:37 2016 +1000

rc.conf/net: Let interface option appear on a DHCP ifconfig_ line.

An ifconfig_ line can have other options for the interface such as
ether or hardware checksum control. Allow these to be set on the
interface.

---

 rtemsbsd/rtems/rtems-bsd-rc-conf-net.c | 42 ++++++++++++++++++++++------------
 1 file changed, 28 insertions(+), 14 deletions(-)

diff --git a/rtemsbsd/rtems/rtems-bsd-rc-conf-net.c b/rtemsbsd/rtems/rtems-bsd-rc-conf-net.c
index 5437841..67b18d1 100644
--- a/rtemsbsd/rtems/rtems-bsd-rc-conf-net.c
+++ b/rtemsbsd/rtems/rtems-bsd-rc-conf-net.c
@@ -235,6 +235,8 @@ ifconfig_(rtems_bsd_rc_conf* rc_conf,
 {
   const char**      args;
   int               arg;
+  int               ifconfig_argc = 0;
+  bool              add_up = true;
   int               r;
   const char const* ifconfig_show[] = { "ifconfig", ifname, NULL };
 
@@ -249,17 +251,25 @@ ifconfig_(rtems_bsd_rc_conf* rc_conf,
     return -1;
   }
 
-  args[0] = "ifconfig";
-  args[1] = ifname;
+  args[ifconfig_argc++] = "ifconfig";
+  args[ifconfig_argc++] = ifname;
 
-  for (arg = 1; arg < argc; ++arg)
-    args[arg + 1] = argv[arg];
+  for (arg = 1; arg < argc; ++arg) {
+    if (strcasecmp("DHCP",     argv[arg]) == 0 ||
+        strcasecmp("SYNCDHCP", argv[arg]) == 0) {
+      add_up = false;
+    }
+    else {
+      args[ifconfig_argc++] = argv[arg];
+    }
+  }
 
-  args[argc + 1] = "up";
+  if (add_up)
+    args[ifconfig_argc++] = "up";
 
-  rtems_bsd_rc_conf_print_cmd(rc_conf, "ifconfig", argc + 2, args);
+  rtems_bsd_rc_conf_print_cmd(rc_conf, "ifconfig", ifconfig_argc, args);
 
-  r = rtems_bsd_command_ifconfig(argc + 2, (char**) args);
+  r = rtems_bsd_command_ifconfig(ifconfig_argc, (char**) args);
 
   free(args);
 
@@ -374,10 +384,12 @@ show_interfaces(const char* msg, struct ifaddrs* ifap)
 static int
 dhcp_check(rtems_bsd_rc_conf_argc_argv* aa)
 {
-  if (aa->argc == 2 &&
-      (strcasecmp("DHCP",     aa->argv[1]) == 0 ||
-       strcasecmp("SYNCDHCP", aa->argv[1]) == 0))
-    return true;
+  int arg;
+  for (arg = 0; arg < aa->argc; ++arg) {
+    if (strcasestr(aa->argv[1], "DHCP") != NULL ||
+        strcasestr(aa->argv[1], "SYNCDHCP") != NULL)
+      return true;
+  }
   return false;
 }
 
@@ -419,9 +431,11 @@ setup_interfaces(rtems_bsd_rc_conf*           rc_conf,
         if (dhcp_check(aa)) {
           *dhcp = true;
         }
-        else {
-          show_result(iface, ifconfig_(rc_conf, ifa->ifa_name, aa->argc, aa->argv));
-        }
+        /*
+         * A DHCP ifconfig can have other options we need to set on the
+         * interface.
+         */
+        show_result(iface, ifconfig_(rc_conf, ifa->ifa_name, aa->argc, aa->argv));
       }
     }
   }



More information about the vc mailing list