]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/ipfilter/lib/alist_new.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / ipfilter / lib / alist_new.c
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
11 alist_t *     
12 alist_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 }