summaryrefslogtreecommitdiffstats
path: root/contrib/ipfilter/lib/hostmask.c
blob: ba33d483871c49829d47acb939961d35821235e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*	$FreeBSD$	*/

/*
 * 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