]>
Commit | Line | Data |
---|---|---|
8a95d3e4 CP |
1 | #include <stdio.h> |
2 | #include <stdint.h> | |
3 | #include <time.h> | |
4 | ||
5 | int trusts_parsecidr(const char *host, uint32_t *ip, short *mask) { | |
6 | unsigned int octet1 = 0, octet2 = 0, octet3 = 0, octet4 = 0, umask = 32; | |
7 | ||
8 | if(sscanf(host, "%u.%u.%u.%u/%u", &octet1, &octet2, &octet3, &octet4, &umask) != 5) | |
9 | if(sscanf(host, "%u.%u.%u/%u", &octet1, &octet2, &octet3, &umask) != 4) | |
10 | if(sscanf(host, "%u.%u/%u", &octet1, &octet2, &umask) != 3) | |
11 | if(sscanf(host, "%u/%u", &octet1, &umask) != 2) | |
12 | if(sscanf(host, "%u.%u.%u.%u", &octet1, &octet2, &octet3, &octet4) != 4) | |
13 | return 0; | |
14 | ||
15 | if(octet1 > 255 || octet2 > 255 || octet3 > 255 || octet4 > 255 || umask > 32) | |
16 | return 0; | |
17 | ||
18 | *ip = (octet1 << 24) | (octet2 << 16) | (octet3 << 8) | octet4; | |
19 | *mask = umask; | |
20 | ||
21 | return 1; | |
22 | } | |
23 | ||
24 | /* returns mask pre-anded */ | |
25 | int trusts_str2cidr(const char *host, uint32_t *ip, uint32_t *mask) { | |
26 | uint32_t result; | |
27 | short smask; | |
28 | ||
29 | if(!trusts_parsecidr(host, &result, &smask)) | |
30 | return 0; | |
31 | ||
32 | if(smask == 0) { | |
33 | *mask = 0; | |
34 | } else { | |
35 | *mask = 0xffffffff << (32 - smask); | |
36 | } | |
37 | *ip = result & *mask; | |
38 | ||
39 | return 1; | |
40 | } | |
41 | ||
42 | char *trusts_cidr2str(uint32_t ip, uint32_t mask) { | |
43 | static char buf[100]; | |
44 | char maskbuf[10]; | |
45 | ||
46 | if(mask != 0) { | |
47 | /* count number of trailing zeros */ | |
48 | float f = (float)(mask & -mask); | |
49 | ||
50 | mask = 32 - ((*(unsigned int *)&f >> 23) - 0x7f); | |
51 | } | |
52 | ||
53 | if(mask < 32) { | |
54 | snprintf(maskbuf, sizeof(maskbuf), "/%u", mask); | |
55 | } else { | |
56 | maskbuf[0] = '\0'; | |
57 | } | |
58 | ||
59 | snprintf(buf, sizeof(buf), "%u.%u.%u.%u%s", (ip >> 24) & 0xff, (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff, maskbuf); | |
60 | ||
61 | return buf; | |
62 | } | |
63 | ||
64 | char *trusts_timetostr(time_t t) { | |
65 | static char buf[100]; | |
66 | ||
67 | strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", localtime(&t)); | |
68 | ||
69 | return buf; | |
70 | } | |
71 |