xref: /freebsd/sbin/ipf/common/genmask.c (revision 045c8f526484cb3b97f5fd693987f4376fa43c5f)
1 /*
2  * Copyright (C) 2012 by Darren Reed.
3  *
4  * See the IPFILTER.LICENCE file for details on licencing.
5  *
6  * $Id$
7  */
8 
9 #include "ipf.h"
10 
11 
12 int genmask(family, msk, mskp)
13 	int family;
14 	char *msk;
15 	i6addr_t *mskp;
16 {
17 	char *endptr = 0L;
18 	u_32_t addr;
19 	int bits;
20 
21 	if (strchr(msk, '.') || strchr(msk, 'x') || strchr(msk, ':')) {
22 		/* possibly of the form xxx.xxx.xxx.xxx
23 		 * or 0xYYYYYYYY */
24 		switch (family)
25 		{
26 #ifdef USE_INET6
27 		case AF_INET6 :
28 			if (inet_pton(AF_INET6, msk, &mskp->in4) != 1)
29 				return (-1);
30 			break;
31 #endif
32 		case AF_INET :
33 			if (inet_aton(msk, &mskp->in4) == 0)
34 				return (-1);
35 			break;
36 		default :
37 			return (-1);
38 			/*NOTREACHED*/
39 		}
40 	} else {
41 		/*
42 		 * set x most significant bits
43 		 */
44 		bits = (int)strtol(msk, &endptr, 0);
45 
46 		switch (family)
47 		{
48 		case AF_INET6 :
49 			if ((*endptr != '\0') || (bits < 0) || (bits > 128))
50 				return (-1);
51 			fill6bits(bits, mskp->i6);
52 			break;
53 		case AF_INET :
54 			if (*endptr != '\0' || bits > 32 || bits < 0)
55 				return (-1);
56 			if (bits == 0)
57 				addr = 0;
58 			else
59 				addr = htonl(0xffffffff << (32 - bits));
60 			mskp->in4.s_addr = addr;
61 			break;
62 		default :
63 			return (-1);
64 			/*NOTREACHED*/
65 		}
66 	}
67 	return (0);
68 }
69