]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/ipfilter/genmask.c
MFC r368207,368607:
[FreeBSD/stable/10.git] / contrib / ipfilter / genmask.c
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 }