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