]> jfr.im git - irc/quakenet/newserv.git/blob - trusts/formats.c
Merge.
[irc/quakenet/newserv.git] / trusts / formats.c
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