Skip to content

Commit

Permalink
dnctl: Support reading config from file like ipfw(8)
Browse files Browse the repository at this point in the history
Extend the dnctl (dummynet config) tool to be able to read commands from
a file, just like ipfw already does.

Sponsored by:	Rubicon Communications, LLC ("Netgate")
Differential Revision:	https://reviews.freebsd.org/D33627
  • Loading branch information
kprovost committed Jan 3, 2022
1 parent 9e891d4 commit 9d406e0
Showing 1 changed file with 67 additions and 54 deletions.
121 changes: 67 additions & 54 deletions sbin/ipfw/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -519,62 +519,79 @@ ipfw_readfile(int ac, char *av[])
FILE *f = NULL;
pid_t preproc = 0;

while ((c = getopt(ac, av, "cfNnp:qS")) != -1) {
switch(c) {
case 'c':
g_co.do_compact = 1;
break;
if (is_ipfw()) {
while ((c = getopt(ac, av, "cfNnp:qS")) != -1) {
switch(c) {
case 'c':
g_co.do_compact = 1;
break;

case 'f':
g_co.do_force = 1;
break;

case 'f':
g_co.do_force = 1;
break;
case 'N':
g_co.do_resolv = 1;
break;

case 'N':
g_co.do_resolv = 1;
break;
case 'n':
g_co.test_only = 1;
break;

case 'n':
g_co.test_only = 1;
break;
case 'p':
/*
* ipfw -p cmd [args] filename
*
* We are done with getopt(). All arguments
* except the filename go to the preprocessor,
* so we need to do the following:
* - check that a filename is actually present;
* - advance av by optind-1 to skip arguments
* already processed;
* - decrease ac by optind, to remove the args
* already processed and the final filename;
* - set the last entry in av[] to NULL so
* popen() can detect the end of the array;
* - set optind=ac to let getopt() terminate.
*/
if (optind == ac)
errx(EX_USAGE, "no filename argument");
cmd = optarg;
av[ac-1] = NULL;
av += optind - 1;
ac -= optind;
optind = ac;
break;

case 'p':
/*
* ipfw -p cmd [args] filename
*
* We are done with getopt(). All arguments
* except the filename go to the preprocessor,
* so we need to do the following:
* - check that a filename is actually present;
* - advance av by optind-1 to skip arguments
* already processed;
* - decrease ac by optind, to remove the args
* already processed and the final filename;
* - set the last entry in av[] to NULL so
* popen() can detect the end of the array;
* - set optind=ac to let getopt() terminate.
*/
if (optind == ac)
errx(EX_USAGE, "no filename argument");
cmd = optarg;
av[ac-1] = NULL;
av += optind - 1;
ac -= optind;
optind = ac;
break;

case 'q':
g_co.do_quiet = 1;
break;

case 'S':
g_co.show_sets = 1;
break;

default:
errx(EX_USAGE, "bad arguments, for usage"
" summary ``ipfw''");
case 'q':
g_co.do_quiet = 1;
break;

case 'S':
g_co.show_sets = 1;
break;

default:
errx(EX_USAGE, "bad arguments, for usage"
" summary ``ipfw''");
}
}
} else {
while ((c = getopt(ac, av, "nq")) != -1) {
switch(c) {
case 'n':
g_co.test_only = 1;
break;

case 'q':
g_co.do_quiet = 1;
break;

default:
errx(EX_USAGE, "bad arguments, for usage"
" summary ``dnctl''");
}
}
}

if (cmd == NULL && ac != optind + 1)
Expand Down Expand Up @@ -676,10 +693,6 @@ main(int ac, char *av[])
*/

if (ac > 1 && av[ac - 1][0] == '/') {
if (! is_ipfw())
errx(EX_USAGE, "usage: dnctl [options]\n"
"do \"dnctl -h\" for details");

if (access(av[ac - 1], R_OK) == 0)
ipfw_readfile(ac, av);
else
Expand Down

0 comments on commit 9d406e0

Please sign in to comment.