alist_new.c revision 172771
1/* 2 * Copyright (C) 2006 by Darren Reed. 3 * 4 * See the IPFILTER.LICENCE file for details on licencing. 5 * 6 * $Id: alist_new.c,v 1.1.2.3 2007/06/06 08:05:33 darrenr Exp $ 7 */ 8 9#include "ipf.h" 10 11alist_t * 12alist_new(int v, char *host) 13{ 14 int a, b, c, d, bits; 15 char *slash; 16 alist_t *al; 17 u_int mask; 18 19 al = calloc(1, sizeof(*al)); 20 if (al == NULL) { 21 fprintf(stderr, "alist_new out of memory\n"); 22 return NULL; 23 } 24 25 bits = -1; 26 slash = strchr(host, '/'); 27 if (slash != NULL) { 28 *slash = '\0'; 29 bits = atoi(slash + 1); 30 } 31 32 a = b = c = d = -1; 33 sscanf(host, "%d.%d.%d.%d", &a, &b, &c, &d); 34 35 if (bits > 0 && bits < 33) { 36 mask = 0xffffffff << (32 - bits); 37 } else if (b == -1) { 38 mask = 0xff000000; 39 b = c = d = 0; 40 } else if (c == -1) { 41 mask = 0xffff0000; 42 c = d = 0; 43 } else if (d == -1) { 44 mask = 0xffffff00; 45 d = 0; 46 } else { 47 mask = 0xffffffff; 48 } 49 50 if (*host == '!') { 51 al->al_not = 1; 52 host++; 53 } 54 55 if (gethost(host, &al->al_addr) == -1) { 56 if (slash != NULL) 57 *slash = '/'; 58 fprintf(stderr, "Cannot parse hostname\n"); 59 free(al); 60 return NULL; 61 } 62 al->al_mask = htonl(mask); 63 if (slash != NULL) 64 *slash = '/'; 65 return al; 66} 67