]>
jfr.im git - irc/quakenet/newserv.git/blob - trusts/formats.c
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;
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)
15 if(octet1
> 255 || octet2
> 255 || octet3
> 255 || octet4
> 255 || umask
> 32)
18 *ip
= (octet1
<< 24) | (octet2
<< 16) | (octet3
<< 8) | octet4
;
24 /* returns mask pre-anded */
25 int trusts_str2cidr(const char *host
, uint32_t *ip
, uint32_t *mask
) {
29 if(!trusts_parsecidr(host
, &result
, &smask
))
35 *mask
= 0xffffffff << (32 - smask
);
42 char *trusts_cidr2str(uint32_t ip
, uint32_t mask
) {
47 /* count number of trailing zeros */
48 float f
= (float)(mask
& -mask
);
50 mask
= 32 - ((*(unsigned int *)&f
>> 23) - 0x7f);
54 snprintf(maskbuf
, sizeof(maskbuf
), "/%u", mask
);
59 snprintf(buf
, sizeof(buf
), "%u.%u.%u.%u%s", (ip
>> 24) & 0xff, (ip
>> 16) & 0xff, (ip
>> 8) & 0xff, ip
& 0xff, maskbuf
);
64 char *trusts_timetostr(time_t t
) {
67 strftime(buf
, sizeof(buf
), "%Y-%m-%d %H:%M:%S", localtime(&t
));