]> git.gsnw.org Git - fping.git/commitdiff
finish -g rewrite
authorDavid Schweikert <david@schweikert.ch>
Thu, 16 Feb 2012 20:28:46 +0000 (21:28 +0100)
committerDavid Schweikert <david@schweikert.ch>
Thu, 16 Feb 2012 20:28:46 +0000 (21:28 +0100)
fping.c
test-c89.sh [new file with mode: 0755]

diff --git a/fping.c b/fping.c
index 149725f78e1cde1997ed6f34dfe8dff0bc0d1486..dc70f55ce956ae5eb0049780f672f6f49776994f 100644 (file)
--- a/fping.c
+++ b/fping.c
@@ -1019,10 +1019,8 @@ void add_cidr(char *addr)
     int ret;
     struct addrinfo addr_hints;
     struct addrinfo *addr_res;
-    struct in_addr in_addr_tmp;
     unsigned long net_addr;
     unsigned long net_last;
-    char buffer[20];
 
     /* Split address from mask */
     addr_end = strchr(addr, '/');
@@ -1061,6 +1059,8 @@ void add_cidr(char *addr)
 
     /* add all hosts in that network (excluding network and broadcast address) */
     while(++net_addr < net_last) {
+        struct in_addr in_addr_tmp;
+        char buffer[20];
         in_addr_tmp.s_addr = htonl(net_addr);
         inet_ntop(AF_INET, &in_addr_tmp, buffer, sizeof(buffer));
         add_name(cpystr(buffer));
@@ -1071,41 +1071,51 @@ void add_cidr(char *addr)
 
 void add_range(char *start, char *end)
 {
-//     /* IP start and end points are specified */
-//     pEnd = *argv;
-//
-//     /* parameters should be start and end ranges */
-//     if( ( inet_addr( pStart ) != INADDR_NONE ) && ( inet_addr( pEnd ) != INADDR_NONE ) )
-//     {
-//         sStart.s_addr = inet_addr( pStart );
-//         sEnd.s_addr = inet_addr( pEnd );
-//
-//     }/* IF */
-//     else
-//         usage();
-//
-//    }/* ELSE */
-//
-//    /* ensure that the end point is greater or equal to the start */
-//    if( htonl( sEnd.s_addr ) >= htonl( sStart.s_addr ) )
-//    {
-//     /* start and end points should be determined, so generate list */
-//     unsigned int uiDiff;
-//     struct in_addr sTemp;
-//     int iCount;
-//
-//     uiDiff = htonl( sEnd.s_addr ) - htonl( sStart.s_addr ) + 1;
-//
-//     for( iCount = 0; iCount < uiDiff; iCount++ )
-//     {
-//         sTemp.s_addr = sStart.s_addr + ntohl( iCount );
-//         pTemp = cpystr( inet_ntoa( sTemp ) );
-//         add_name( pTemp );
-//
-//     }/* FOR */
-//    }/* IF */
-//    else
-//     usage();
+    struct addrinfo addr_hints;
+    struct addrinfo *addr_res;
+    unsigned long start_long;
+    unsigned long end_long;
+    int ret;
+
+    /* parse start address (IPv4 only) */
+    memset(&addr_hints, 0, sizeof(struct addrinfo));
+    addr_hints.ai_family = AF_UNSPEC;
+    addr_hints.ai_flags = AI_NUMERICHOST;
+    ret = getaddrinfo(start, NULL, &addr_hints, &addr_res);
+    if(ret) {
+        fprintf(stderr, "Error: can't parse address %s: %s\n", start, gai_strerror(ret));
+        exit(2);
+    }
+    if(addr_res->ai_family != AF_INET) {
+        fprintf(stderr, "Error: -g works only with IPv4 addresses\n");
+        exit(2);
+    }
+    start_long = ntohl(((struct sockaddr_in *) addr_res->ai_addr)->sin_addr.s_addr);
+
+    /* parse end address (IPv4 only) */
+    memset(&addr_hints, 0, sizeof(struct addrinfo));
+    addr_hints.ai_family = AF_UNSPEC;
+    addr_hints.ai_flags = AI_NUMERICHOST;
+    ret = getaddrinfo(end, NULL, &addr_hints, &addr_res);
+    if(ret) {
+        fprintf(stderr, "Error: can't parse address %s: %s\n", end, gai_strerror(ret));
+        exit(2);
+    }
+    if(addr_res->ai_family != AF_INET) {
+        fprintf(stderr, "Error: -g works only with IPv4 addresses\n");
+        exit(2);
+    }
+    end_long = ntohl(((struct sockaddr_in *) addr_res->ai_addr)->sin_addr.s_addr);
+
+    /* generate */
+    while(start_long <= end_long) {
+        struct in_addr in_addr_tmp;
+        char buffer[20];
+        in_addr_tmp.s_addr = htonl(start_long);
+        inet_ntop(AF_INET, &in_addr_tmp, buffer, sizeof(buffer));
+        add_name(cpystr(buffer));
+        start_long++;
+    }
 }
 
 
diff --git a/test-c89.sh b/test-c89.sh
new file mode 100755 (executable)
index 0000000..93dc222
--- /dev/null
@@ -0,0 +1 @@
+gcc -DHAVE_CONFIG_H -D_BSD_SOURCE -D_POSIX_SOURCE -I. -Wall -std=c89 -pedantic -c -o fping.o fping.c