chiark / gitweb /
2dc5928819cd543b328b7ef9788c4702f0c01753
[secnet.git] / ipaddr.c
1 #include "secnet.h"
2 #include <stdio.h>
3
4 /* This file should eventually incorporate all the functionality of
5    ipaddr.py */
6
7 bool_t subnet_match(struct subnet *s, uint32_t address)
8 {
9     return (s->prefix==(address&s->mask));
10 }
11
12 bool_t subnet_matches_list(struct subnet_list *list, uint32_t address)
13 {
14     uint32_t i;
15     for (i=0; i<list->entries; i++) {
16         if (list->list[i].prefix == (address&list->list[i].mask)) return True;
17     }
18     return False;
19 }
20
21 bool_t subnets_intersect(struct subnet a, struct subnet b)
22 {
23     uint32_t mask=a.mask&b.mask;
24     return ((a.prefix&mask)==(b.prefix&mask));
25 }
26
27 bool_t subnet_intersects_with_list(struct subnet a, struct subnet_list *b)
28 {
29     uint32_t i;
30
31     for (i=0; i<b->entries; i++) {
32         if (subnets_intersect(a,b->list[i])) return True;
33     }
34     return False;
35 }
36
37 bool_t subnet_lists_intersect(struct subnet_list *a, struct subnet_list *b)
38 {
39     uint32_t i;
40     for (i=0; i<a->entries; i++) {
41         if (subnet_intersects_with_list(a->list[i],b)) return True;
42     }
43     return False;
44 }
45
46 /* The string buffer must be at least 16 bytes long */
47 string_t ipaddr_to_string(uint32_t addr)
48 {
49     uint8_t a,b,c,d;
50     string_t s;
51
52     s=safe_malloc(16,"ipaddr_to_string");
53     a=addr>>24;
54     b=addr>>16;
55     c=addr>>8;
56     d=addr;
57     snprintf(s, 16, "%d.%d.%d.%d", a, b, c, d);
58     return s;
59 }
60
61 string_t subnet_to_string(struct subnet *sn)
62 {
63     uint32_t mask=sn->mask, addr=sn->prefix;
64     uint8_t a,b,c,d;
65     string_t s;
66     int i;
67
68     s=safe_malloc(19,"subnet_to_string");
69     a=addr>>24;
70     b=addr>>16;
71     c=addr>>8;
72     d=addr;
73     for (i=0; mask; i++) {
74         mask=(mask<<1);
75     }
76     if (i!=sn->len) {
77         fatal("subnet_to_string: invalid subnet structure!\n");
78     }
79     snprintf(s, 19, "%d.%d.%d.%d/%d", a, b, c, d, sn->len);
80     return s;
81 }