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 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