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