#1 16. Dezember 2009 ipmerge Hoi, hab mir heute ein kleines Tool gecodet, welches ich schon desöfteren benötigt hätte, aber kein vergleichbares gefunden habe. vllt. findets der ein oder andere von euch ja ganz nützlich. das tool liest ips in CIDR-Notation über stdin ein und gibt anschließend eine liste mit den ips wieder aus, dabei werden doppelte oder sich überschneidende einträge entfernt. ich poste hier nur den source code, hab kein windows und kanns deshalb ned für euch compilen. unter linux funktionierts normalerweiße ohne probleme mit Code: gcc -o ipmerge ipmerge.c -lm ich weiß auch, dass der source ziemlich unschön ist, aber es musste halt schnellgehen. es gibt zumindest keine memory leaks. Code: #include <stdlib.h> #include <stdio.h> #include <string.h> #include <math.h> #include <arpa/inet.h> #include <netinet/in.h> typedef struct iprange_t { unsigned int start; unsigned int end; unsigned int cidr; } iprange; void print_ip(int ip) { struct in_addr in; in.s_addr = htonl(ip); char dest[INET_ADDRSTRLEN] = {0}; printf("%s", inet_ntop(AF_INET, &in, dest, INET_ADDRSTRLEN)); } int main(int argc, char *argv[]) { int array_count = 0; iprange *ips = NULL; while (!feof(stdin)) { char buf[100]; char *p = NULL; memset(buf, 0, 100); fgets(buf, 100, stdin); if (buf == NULL) { continue; } p = buf; if (!isdigit(*p)) break; array_count++; ips = realloc(ips, array_count*sizeof(iprange)); if (!ips) { printf("Could not alloc space for iparray"); break; } while (*p != '/') p++; p++; ips[array_count-1].cidr = atoi(p); p--; *p = 0; p = buf; ips[array_count-1].start = ntohl(inet_addr(p)); int plus = pow(2, 32-ips[array_count-1].cidr) - 1; ips[array_count-1].end = ips[array_count-1].start + plus; } iprange *new = NULL; int new_count = 0; int i; for (i=0; i<array_count; i++) { iprange curr = ips[i]; int j; int found=0; for (j=0; j<new_count; j++) { if ((curr.start >= new[j].start && curr.start < new[j].end) || (curr.end > new[j].start && curr.end <= new[j].end)) { found = 1; if (curr.start < new[j].start) new[j].start = curr.start; else if (curr.end > new[j].end) new[j].end = curr.end; } } if (!found) { new_count++; new = realloc(new, new_count*sizeof(iprange)); new[new_count-1].start = curr.start; new[new_count-1].end = curr.end; new[new_count-1].cidr = curr.cidr; } } for (i=0; i<new_count; i++) { print_ip(new[i].start); putchar(' '); print_ip(new[i].end); putchar('\n'); } free(ips); free(new); } gruß pyro + Multi-Zitat Zitieren
#2 17. Dezember 2009 AW: ipmerge Schönes Teil nur kommt nix raus... ./ipmerge sacht nüx + Multi-Zitat Zitieren
#3 18. Dezember 2009 AW: ipmerge Code: fgets(buf, 100, stdin); if (buf == NULL) { continue; } liest so lange ein bis eine Leerzeile geschickt wird. Terminal > ./ipmerge 192.168.1.0/24[Enter] 23.23.23.23/12[Enter] [Enter] 192.168.1.0 192.168.1.255 23.23.23.23 23.39.23.22 + Multi-Zitat Zitieren