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