summaryrefslogtreecommitdiffstats
path: root/contrib/ipfilter/lib/buildopts.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ipfilter/lib/buildopts.c')
-rw-r--r--contrib/ipfilter/lib/buildopts.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/contrib/ipfilter/lib/buildopts.c b/contrib/ipfilter/lib/buildopts.c
new file mode 100644
index 0000000..1d1de8c
--- /dev/null
+++ b/contrib/ipfilter/lib/buildopts.c
@@ -0,0 +1,50 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
+
+#include "ipf.h"
+
+
+u_32_t buildopts(cp, op, len)
+ char *cp, *op;
+ int len;
+{
+ struct ipopt_names *io;
+ u_32_t msk = 0;
+ char *s, *t;
+ int inc;
+
+ for (s = strtok(cp, ","); s; s = strtok(NULL, ",")) {
+ if ((t = strchr(s, '=')))
+ *t++ = '\0';
+ else
+ t = "";
+ for (io = ionames; io->on_name; io++) {
+ if (strcasecmp(s, io->on_name) || (msk & io->on_bit))
+ continue;
+ if ((inc = addipopt(op, io, len, t))) {
+ op += inc;
+ len += inc;
+ }
+ msk |= io->on_bit;
+ break;
+ }
+ if (!io->on_name) {
+ fprintf(stderr, "unknown IP option name %s\n", s);
+ return 0;
+ }
+ }
+ while ((len & 3) != 3) {
+ *op++ = IPOPT_NOP;
+ len++;
+ }
+ *op++ = IPOPT_EOL;
+ len++;
+ return len;
+}
OpenPOWER on IntegriCloud