svn commit: r317682 - head/sbin/ipfw
Andrey V. Elsukov
ae at FreeBSD.org
Tue May 2 17:16:25 UTC 2017
Author: ae
Date: Tue May 2 17:16:24 2017
New Revision: 317682
URL: https://svnweb.freebsd.org/changeset/base/317682
Log:
Add `ipfw table all destroy` support.
PR: 212669
MFC after: 1 week
Modified:
head/sbin/ipfw/ipfw.8
head/sbin/ipfw/tables.c
Modified: head/sbin/ipfw/ipfw.8
==============================================================================
--- head/sbin/ipfw/ipfw.8 Tue May 2 14:52:35 2017 (r317681)
+++ head/sbin/ipfw/ipfw.8 Tue May 2 17:16:24 2017 (r317682)
@@ -50,7 +50,9 @@ in-kernel NAT.
.Nm
.Oo Cm set Ar N Oc Cm table Ar name Cm create Ar create-options
.Nm
-.Oo Cm set Ar N Oc Cm table Ar name Cm destroy
+.Oo Cm set Ar N Oc Cm table
+.Brq Ar name | all
+.Cm destroy
.Nm
.Oo Cm set Ar N Oc Cm table Ar name Cm modify Ar modify-options
.Nm
Modified: head/sbin/ipfw/tables.c
==============================================================================
--- head/sbin/ipfw/tables.c Tue May 2 14:52:35 2017 (r317681)
+++ head/sbin/ipfw/tables.c Tue May 2 17:16:24 2017 (r317682)
@@ -54,6 +54,7 @@ static int table_swap(ipfw_obj_header *o
static int table_get_info(ipfw_obj_header *oh, ipfw_xtable_info *i);
static int table_show_info(ipfw_xtable_info *i, void *arg);
+static int table_destroy_one(ipfw_xtable_info *i, void *arg);
static int table_flush_one(ipfw_xtable_info *i, void *arg);
static int table_show_one(ipfw_xtable_info *i, void *arg);
static int table_do_get_list(ipfw_xtable_info *i, ipfw_obj_header **poh);
@@ -132,7 +133,7 @@ lookup_host (char *host, struct in_addr
* This one handles all table-related commands
* ipfw table NAME create ...
* ipfw table NAME modify ...
- * ipfw table NAME destroy
+ * ipfw table {NAME | all} destroy
* ipfw table NAME swap NAME
* ipfw table NAME lock
* ipfw table NAME unlock
@@ -200,6 +201,7 @@ ipfw_table_handler(int ac, char *av[])
case TOK_INFO:
case TOK_DETAIL:
case TOK_FLUSH:
+ case TOK_DESTROY:
break;
default:
if (is_all != 0)
@@ -223,13 +225,21 @@ ipfw_table_handler(int ac, char *av[])
table_modify(&oh, ac, av);
break;
case TOK_DESTROY:
- if (table_destroy(&oh) == 0)
- break;
- if (errno != ESRCH)
- err(EX_OSERR, "failed to destroy table %s", tablename);
- /* ESRCH isn't fatal, warn if not quiet mode */
- if (co.do_quiet == 0)
- warn("failed to destroy table %s", tablename);
+ if (is_all == 0) {
+ if (table_destroy(&oh) == 0)
+ break;
+ if (errno != ESRCH)
+ err(EX_OSERR, "failed to destroy table %s",
+ tablename);
+ /* ESRCH isn't fatal, warn if not quiet mode */
+ if (co.do_quiet == 0)
+ warn("failed to destroy table %s", tablename);
+ } else {
+ error = tables_foreach(table_destroy_one, &oh, 1);
+ if (error != 0)
+ err(EX_OSERR,
+ "failed to destroy tables list");
+ }
break;
case TOK_FLUSH:
if (is_all == 0) {
@@ -567,6 +577,22 @@ table_destroy(ipfw_obj_header *oh)
return (0);
}
+static int
+table_destroy_one(ipfw_xtable_info *i, void *arg)
+{
+ ipfw_obj_header *oh;
+
+ oh = (ipfw_obj_header *)arg;
+ table_fill_ntlv(&oh->ntlv, i->tablename, i->set, 1);
+ if (table_destroy(oh) != 0) {
+ if (co.do_quiet == 0)
+ warn("failed to destroy table(%s) in set %u",
+ i->tablename, i->set);
+ return (-1);
+ }
+ return (0);
+}
+
/*
* Flushes given table specified by @oh->ntlv.
* Returns 0 on success.
More information about the svn-src-head
mailing list