Vollständige Version anzeigen : [C/C++] ipmerge


pyro
16.12.2009, 20:09

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
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.

#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

Hardware Preisvergleich | Amazon Blitzangebote!

Videos zum Thema
Video Loading...
boomblupp
17.12.2009, 22:48

Schönes Teil nur kommt nix raus...

;/ipmerge sacht nüx


XodoX
18.12.2009, 10:25


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


Ähnliche Themen zu [C/C++] ipmerge
  • [C/C++] 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 wie [...]



raid-rush.ws | Imprint & Contact pr