summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/xtables.h7
-rw-r--r--xtables.c49
2 files changed, 55 insertions, 1 deletions
diff --git a/include/xtables.h b/include/xtables.h
index 728b1aa3..5e4b2c7b 100644
--- a/include/xtables.h
+++ b/include/xtables.h
@@ -220,7 +220,11 @@ enum exittype {
OTHER_PROBLEM = 1,
PARAMETER_PROBLEM,
VERSION_PROBLEM,
- RESOURCE_PROBLEM
+ RESOURCE_PROBLEM,
+ P_ONLY_ONCE,
+ P_NO_INVERT,
+ P_BAD_VALUE,
+ P_ONE_ACTION,
};
/* this is a special 64bit data type that is 8-byte aligned */
@@ -229,6 +233,7 @@ enum exittype {
int check_inverse(const char option[], int *invert, int *optind, int argc);
void exit_error(enum exittype, const char *, ...)__attribute__((noreturn,
format(printf,2,3)));
+extern void param_act(unsigned int, const char *, ...);
extern const char *program_name, *program_version;
#ifdef NO_SHARED_LIBS
diff --git a/xtables.c b/xtables.c
index 4313f5ba..0a2fdb1d 100644
--- a/xtables.c
+++ b/xtables.c
@@ -19,6 +19,7 @@
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
+#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
@@ -639,3 +640,51 @@ void xtables_register_target(struct xtables_target *me)
me->t = NULL;
me->tflags = 0;
}
+
+void param_act(unsigned int status, const char *p1, ...)
+{
+ const char *p2, *p3;
+ va_list args;
+ bool b;
+
+ va_start(args, p1);
+
+ switch (status) {
+ case P_ONLY_ONCE:
+ p2 = va_arg(args, const char *);
+ b = va_arg(args, unsigned int);
+ if (!b)
+ return;
+ exit_error(PARAMETER_PROBLEM,
+ "%s: \"%s\" option may only be specified once",
+ p1, p2);
+ break;
+ case P_NO_INVERT:
+ p2 = va_arg(args, const char *);
+ b = va_arg(args, unsigned int);
+ if (!b)
+ return;
+ exit_error(PARAMETER_PROBLEM,
+ "%s: \"%s\" option cannot be inverted", p1, p2);
+ break;
+ case P_BAD_VALUE:
+ p2 = va_arg(args, const char *);
+ p3 = va_arg(args, const char *);
+ exit_error(PARAMETER_PROBLEM,
+ "%s: Bad value for \"%s\" option: \"%s\"",
+ p1, p2, p3);
+ break;
+ case P_ONE_ACTION:
+ b = va_arg(args, unsigned int);
+ if (!b)
+ return;
+ exit_error(PARAMETER_PROBLEM,
+ "%s: At most one action is possible", p1);
+ break;
+ default:
+ exit_error(status, p1, args);
+ break;
+ }
+
+ va_end(args);
+}