[C/C++] ipmerge

Dieses Thema im Forum "Projekte / Codes" wurde erstellt von pyro, 16. Dezember 2009 .

  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
     
  2. 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
     
  3. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.