diff options
author | Chris Johns <chrisj@rtems.org> | 2016-08-12 13:55:37 +1000 |
---|---|---|
committer | Chris Johns <chrisj@rtems.org> | 2016-08-12 15:56:36 +1000 |
commit | ab7739a574e174b71b51ceaeef409df97463f16b (patch) | |
tree | 90c77dc7d270202904a8db2af116cdcd61d11f29 | |
parent | nfsclient: Only parse for options when present. (diff) | |
download | rtems-libbsd-ab7739a574e174b71b51ceaeef409df97463f16b.tar.bz2 |
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.
-rw-r--r-- | rtemsbsd/rtems/rtems-bsd-rc-conf-net.c | 42 |
1 files 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 54378414..67b18d1b 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)); } } } |