summaryrefslogtreecommitdiffstats
path: root/lib/hostmask.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/hostmask.c')
-rw-r--r--lib/hostmask.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/lib/hostmask.c b/lib/hostmask.c
new file mode 100644
index 0000000..4ee41e16
--- /dev/null
+++ b/lib/hostmask.c
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 1993-2001 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: hostmask.c,v 1.10 2002/01/28 06:50:46 darrenr Exp $
+ */
+
+#include "ipf.h"
+
+
+/*
+ * returns -1 if neither "hostmask/num" or "hostmask mask addr" are
+ * found in the line segments, there is an error processing this information,
+ * or there is an error processing ports information.
+ */
+int hostmask(seg, proto, ifname, sa, msk, linenum)
+char ***seg, *proto, *ifname;
+u_32_t *sa, *msk;
+int linenum;
+{
+ struct in_addr maskaddr;
+ char *s;
+
+ if ((s = strchr(**seg, '='))) {
+ *s++ = '\0';
+ if (!strcmp(**seg, "pool")) {
+ *sa = atoi(s);
+ return 1;
+ }
+ }
+
+ /*
+ * is it possibly hostname/num ?
+ */
+ if ((s = strchr(**seg, '/')) ||
+ ((s = strchr(**seg, ':')) && !strchr(s + 1, ':'))) {
+ *s++ ='\0';
+ if (genmask(s, msk) == -1) {
+ fprintf(stderr, "%d: bad mask (%s)\n", linenum, s);
+ return -1;
+ }
+ if (hostnum(sa, **seg, linenum, ifname) == -1) {
+ fprintf(stderr, "%d: bad host (%s)\n", linenum, **seg);
+ return -1;
+ }
+ *sa &= *msk;
+ (*seg)++;
+ return 0;
+ }
+
+ /*
+ * look for extra segments if "mask" found in right spot
+ */
+ if (*(*seg+1) && *(*seg+2) && !strcasecmp(*(*seg+1), "mask")) {
+ if (hostnum(sa, **seg, linenum, ifname) == -1) {
+ fprintf(stderr, "%d: bad host (%s)\n", linenum, **seg);
+ return -1;
+ }
+ (*seg)++;
+ (*seg)++;
+ if (inet_aton(**seg, &maskaddr) == 0) {
+ fprintf(stderr, "%d: bad mask (%s)\n", linenum, **seg);
+ return -1;
+ }
+ *msk = maskaddr.s_addr;
+ (*seg)++;
+ *sa &= *msk;
+ return 0;
+ }
+
+ if (**seg) {
+ u_32_t k;
+
+ if (hostnum(sa, **seg, linenum, ifname) == -1) {
+ fprintf(stderr, "%d: bad host (%s)\n", linenum, **seg);
+ return -1;
+ }
+ (*seg)++;
+ k = *sa ? 0xffffffff : 0;
+#ifdef USE_INET6
+ if (use_inet6) {
+ msk[1] = k;
+ msk[2] = k;
+ msk[3] = k;
+ }
+#endif
+ *msk = k;
+ return 0;
+ }
+ fprintf(stderr, "%d: bad host (%s)\n", linenum, **seg);
+ return -1;
+}
OpenPOWER on IntegriCloud