X-Git-Url: http://git.harvie.cz/?p=svn%2FPrometheus-QoS%2F.git;a=blobdiff_plain;f=parsehosts.c;h=1e8dbe6773502e9b18f580570257cba552fe20df;hp=2740c1c8c08d29936dcef4301abaa0572f85788b;hb=c2237b8a65286bff65d5bd81e48cb88fb7d2562e;hpb=1c9cae56507516acf3eda8fcfe60a74bfe923ee4;ds=sidebyside diff --git a/parsehosts.c b/parsehosts.c index 2740c1c..1e8dbe6 100644 --- a/parsehosts.c +++ b/parsehosts.c @@ -14,14 +14,57 @@ extern int class_count; extern int ip_count; extern int found_lmsid; extern int free_min; +extern const int highest_priority; +extern char *ip6prefix; -/* function implemented in prometheus.c */ -void TheIP(void); +/* This must be object oriented! This looks almost like constructor ;-) */ +void TheIP(char *ipaddr) +{ + create(ip,IP); + ip->name = ""; + ip->addr = ipaddr; + ip->sharing = NULL; + ip->prio = highest_priority+1; + ip->lmsid = -1; + ip->fixedprio = \ + ip->mark = \ + ip->min = \ + ip->max = \ + ip->desired = \ + ip->credit = \ + ip->upload = \ + ip->proxy = \ + ip->direct = \ + ip->traffic = \ + ip->pktsup = \ + ip->pktsdown = 0; + ip->keyword = keywords; + ip->v6 = (strchr(ip->addr,':')!=NULL); + push(ip,ips); + ip_count++; +} + +struct IP *lastIP6; /* == This function strips extra characters after IPv4 address and stores it = */ -void parse_ip(char *str) +parse_ip(char *str) { - char *ptr, *ipaddr = NULL, *ipname = NULL, *lmsid = NULL; + char *ptr, *ipaddr, *ip6range = NULL, *ipname = NULL, *lmsid = NULL; + + if(ip6prefix) /* Try this only if IPv6 subsystem is active... */ + { + ptr = strstr(str, "::"); + if(ptr && ptr-str > 4) + { + ptr -= 4; + duplicate(ptr, ip6range); + ptr = strstr(ip6range, "::"); + if(ptr) + { + *(ptr+2) = 0; + } + } + } ptr = strchr(str, '{'); if(ptr) @@ -54,12 +97,33 @@ void parse_ip(char *str) } *ptr=0; + if(ip6range) + { + concatenate(ip6prefix,ip6range,ptr); + ip6range=ptr; + if_exists(ip, ips, eq(ip->addr,ip6range)); + else + { + TheIP(ip6range); + } + ip->name = ip6range; + ip->keyword = defaultkeyword; /* settings for default keyword */ + if(lmsid) + { + ip->lmsid = atoi(lmsid); + } + lastIP6 = ip; + } + else + { + lastIP6 = NULL; + } + if_exists(ip, ips, eq(ip->addr,ipaddr)); else { - TheIP(); + TheIP(ipaddr); } - ip->addr = ipaddr; ip->name = ipname; if(lmsid) { @@ -91,9 +155,13 @@ void parse_hosts(char *hosts) { substring += 8; /* "sharing-" */ parse_ip(str); - ip_count++; ip->sharing = substring; ip->keyword = defaultkeyword; /* settings for default keyword */ + if(lastIP6) + { + lastIP6->sharing = substring; + lastIP6 = NULL; + } while(*substring and *substring != '\n') { substring++; @@ -107,7 +175,11 @@ void parse_hosts(char *hosts) if_exists(keyword,keywords,(substring=strstr(str,keyword->key))) { parse_ip(str); - ip_count++; + if(lastIP6) + { + lastIP6->sharing = ip->name; + lastIP6 = NULL; + } ip->keyword = keyword; keyword->ip_count++; ip->prio = keyword->default_prio;