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
genmask(family,msk,mskp)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