Home | History | Annotate | Line # | Download | only in lib
      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