ifconfig: Parse command line for BSD.

This commit is contained in:
Mats Erik Andersson
2012-12-05 00:24:26 +01:00
parent 0d19e38f4f
commit 72e61402af
4 changed files with 110 additions and 5 deletions

View File

@@ -1,3 +1,13 @@
2012-12-04 Mats Erik Andersson <gnu@gisladisker.se>
* ifconfig/system/bsd.c (system_help): Update.
(system_parse_opt_rest): Populate function with
parser and actions for command line arguments.
* ifconfig/system/solaris.c (system_help): Update.
(system_parse_opt_rest): Implement actions for the
arguments "up" and "down" of an interface.
2012-12-03 Mats Erik Andersson <gnu@gisladisker.se>
ifconfig: Audit displaying of metrics.

View File

@@ -27,6 +27,7 @@ hpux10.20
sparc-sun-solaris-2.7
OpenSolaris
Uses the output format `unix'.
@@ -34,3 +35,9 @@ sparc-sun-solaris-2.7
alphaev56-dec-osf4.0g
Uses the output format `osf'.
*BSD
Uses output format `unix'. Basic functionality for
DragonflyBSD, FreeBSD, NetBSD, and OpenBSD.

View File

@@ -1,4 +1,4 @@
/* generic.c -- generic system code for ifconfig
/* bsd.c -- BSD specific code for ifconfig
Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
2010, 2011, 2012 Free Software Foundation, Inc.
@@ -38,7 +38,8 @@ const char *system_default_format = "unix";
/* Argument parsing stuff. */
const char *system_help = "\
NAME [ADDR [DSTADDR]] [broadcast BRDADDR] [netmask MASK] [metric N] [mtu N]";
NAME [ADDR [DSTADDR]] [broadcast BRDADDR] [netmask MASK] "
"[metric N] [mtu N] [up|down]";
struct argp_child system_argp_child;
@@ -51,7 +52,90 @@ system_parse_opt (struct ifconfig **ifp, char option, char *optarg)
int
system_parse_opt_rest (struct ifconfig **ifp, int argc, char *argv[])
{
return 0;
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 if (!strcmp (argv[i], "up"))
parse_opt_set_flag (*ifp, IFF_UP | IFF_RUNNING, 0);
else if (!strcmp (argv[i], "down"))
parse_opt_set_flag (*ifp, IFF_UP, 1);
else
{
/* Recognize AF here. */
/* Also alias, -alias, promisc, -promisc,
create, destroy, monitor, -monitor. */
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

View File

@@ -56,7 +56,8 @@ const char *system_default_format = "unix";
/* Argument parsing stuff. */
const char *system_help = "\
NAME [ADDR [DSTADDR]] [broadcast BRDADDR] [netmask MASK] [metric N] [mtu N]";
NAME [ADDR [DSTADDR]] [broadcast BRDADDR] [netmask MASK] "
"[metric N] [mtu N] [up|down]";
struct argp_child system_argp_child;
@@ -115,10 +116,13 @@ system_parse_opt_rest (struct ifconfig **ifp, int argc, char *argv[])
expect = EXPECT_METRIC;
else if (!strcmp (argv[i], "mtu"))
expect = EXPECT_MTU;
else if (!strcmp (argv[i], "up"))
parse_opt_set_flag (*ifp, IFF_UP | IFF_RUNNING, 0);
else if (!strcmp (argv[i], "down"))
parse_opt_set_flag (*ifp, IFF_UP, 1);
else
{
/* Recognize AF here. */
/* Recognize up/down. */
/* Also auto-revarp, trailers, -trailers,
private, -private, arp, -arp, plumb, unplumb. */
if (!((*ifp)->valid & IF_VALID_ADDR))