int system_parse_opt_rest (struct ifconfig **ifp, int argc, char *argv[]) { int i = 0; enum { EXPECT_NOTHING, EXPECT_BROADCAST, EXPECT_NETMASK, EXPECT_METRIC, EXPECT_MTU } expect = EXPECT_NOTHING; *ifp = parse_opt_new_ifs (argv[0]); while (++i < argc) { switch (expect) { case EXPECT_BROADCAST: parse_opt_set_brdaddr (*ifp, argv[i]); break; case EXPECT_NETMASK: parse_opt_set_netmask (*ifp, argv[i]); break; case EXPECT_MTU: parse_opt_set_mtu (*ifp, argv[i]); break; case EXPECT_METRIC: parse_opt_set_metric (*ifp, argv[i]); break; case EXPECT_NOTHING: break; } if (expect != EXPECT_NOTHING) expect = EXPECT_NOTHING; else if (!strcmp (argv[i], "broadcast")) expect = EXPECT_BROADCAST; else if (!strcmp (argv[i], "netmask")) expect = EXPECT_NETMASK; else if (!strcmp (argv[i], "metric")) expect = EXPECT_METRIC; else if (!strcmp (argv[i], "mtu")) expect = EXPECT_MTU; else { /* Recognize AF here. */ /* Recognize up/down. */ /* Also auto-revarp, trailers, -trailers, private, -private, arp, -arp, plumb, unplumb. */ if (!((*ifp)->valid & IF_VALID_ADDR)) parse_opt_set_address (*ifp, argv[i]); else if (!((*ifp)->valid & IF_VALID_DSTADDR)) parse_opt_set_dstaddr (*ifp, argv[i]); } } switch (expect) { case EXPECT_BROADCAST: error (0, 0, "option `broadcast' requires an argument"); break; case EXPECT_NETMASK: error (0, 0, "option `netmask' requires an argument"); break; case EXPECT_METRIC: error (0, 0, "option `metric' requires an argument"); break; case EXPECT_MTU: error (0, 0, "option `mtu' requires an argument"); break; case EXPECT_NOTHING: break; } return expect == EXPECT_NOTHING; }
int system_parse_opt_rest (struct ifconfig **ifp, int argc, char *argv[]) { int i = -1; enum { EXPECT_NOTHING, EXPECT_AF, EXPECT_NAME, EXPECT_BROADCAST, EXPECT_NETMASK, EXPECT_METRIC, } expect = EXPECT_NAME; while (++i < argc) { switch (expect) { case EXPECT_NAME: *ifp = parse_opt_new_ifs (argv[i]); break; case EXPECT_AF: parse_opt_set_af (*ifp, argv[i]); break; case EXPECT_BROADCAST: parse_opt_set_brdaddr (*ifp, argv[i]); break; case EXPECT_NETMASK: parse_opt_set_netmask (*ifp, argv[i]); break; case EXPECT_METRIC: parse_opt_set_metric (*ifp, argv[i]); break; case EXPECT_NOTHING: break; } if (expect != EXPECT_NOTHING) expect = EXPECT_NOTHING; else if (!strcmp (argv[i], "broadcast")) expect = EXPECT_BROADCAST; else if (!strcmp (argv[i], "netmask")) expect = EXPECT_NETMASK; else if (!strcmp (argv[i], "metric")) expect = EXPECT_METRIC; else { /* Recognize up/down. */ /* Also debug, -debug, trailers, -trailers, ipdst. */ if (!(*ifp->valid & IF_VALID_ADDR)) { parse_opt_set_address (*ifp, argv[i]); expect = EXPECT_AF; } else if (!(*ifp->valid & IF_VALID_DSTADDR)) parse_opt_set_dstaddr (*ifp, argv[i]); } } switch (expect) { case EXPECT_BROADCAST: error (0, 0, "option `broadcast' requires an argument"); break; case EXPECT_NETMASK: error (0, 0, "option `netmask' requires an argument"); break; case EXPECT_METRIC: error (0, 0, "option `metric' requires an argument"); break; case EXPECT_NAME: case EXPECT_AF: case EXPECT_NOTHING: expect = EXPECT_NOTHING; break; } return expect == EXPECT_NOTHING; }