Networking - Reworked route table management
[tpg/acess2.git] / Usermode / Applications / ping_src / main.c
index 7920545..33113c8 100644 (file)
@@ -6,6 +6,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <acess/sys.h>
+#include <net.h>
 
 // === CONSTANTS ===
 #define IPSTACK_ROOT   "/Devices/ip"
@@ -13,7 +14,9 @@
 // === PROTOTYPES ===
 void   PrintUsage(char *ProgName);
 void   PrintHelp(char *ProgName);
- int   GetAddress( char *Address, uint8_t *Addr );
+
+// === GLOBALS ===
+ int   giNumberOfPings = 1;
 
 // === CODE ===
 /**
@@ -27,6 +30,8 @@ int main(int argc, char *argv[])
         int    i, j;
        uint8_t addr[16];
         int    type;
+        
+        int    fd, call, ping;
        
        for(i = 1; i < argc; i++)
        {
@@ -69,36 +74,51 @@ int main(int argc, char *argv[])
        }
        
        // Read Address
-       type = GetAddress(ipStr, addr);
+       type = Net_ParseAddress(ipStr, addr);
        if( type == 0 ) {
                fprintf(stderr, "Invalid IP Address\n");
                return 1;
        }
        
-       if( !iface )
+       if( iface )
        {
-               fprintf(stderr, "WARNING: \"All interfaces\" is currently uniplemented");
-               return 2;
-       }
-       else
-       {
-                int    fd = open(iface, OPENFLAG_EXEC);
-                int    call, ping;
+               char    *_iface = malloc( sizeof("/Devices/ip/") + strlen(iface) + 1 );
+               strcpy(_iface, "/Devices/ip/");
+               strcat(_iface, iface);
+               free(iface);    // TODO: Handle when this is not heap
+               iface = _iface;
+               printf("iface = '%s'\n", iface);
+               fd = open(iface, OPENFLAG_EXEC);
                if(fd == -1) {
                        fprintf(stderr, "ERROR: Unable to open interface '%s'\n", iface);
                        return 1;
                }
                
-               call = ioctl(fd, 3, "ping");
-               if(call == 0) {
-                       fprintf(stderr, "ERROR: '%s' does not have a 'ping' call\n", iface);
-                       return 1;
+       }
+       else
+       {
+               fd = Net_OpenSocket(type, addr, NULL);
+               if( fd == -1 ) {
+                       fprintf(stderr, "Unable to find a route to '%s'\n",
+                               Net_PrintAddress(type, addr)
+                               );
+                       return -1;
                }
+       }
+       
+       call = ioctl(fd, 3, "ping");
+       if(call == 0) {
+               fprintf(stderr, "ERROR: '%s' does not have a 'ping' call\n", iface);
+               return 1;
+       }
+       
+       for( i = 0; i < giNumberOfPings; i ++ )
+       {
                ping = ioctl(fd, call, addr);
-               printf("ping = %i\n");
-               
-               close(fd);
+               printf("ping = %i\n", ping);
        }
+               
+       close(fd);
        
        return 0;
 }
@@ -114,127 +134,3 @@ void PrintHelp(char *ProgName)
        fprintf(stderr, " -h\tPrint this message\n");
 }
 
-/**
- * \brief Read an IPv4 Address
- */
-int GetAddress4(char *String, uint8_t *Addr)
-{
-        int    i = 0;
-        int    j;
-        int    val;
-       
-       for( j = 0; String[i] && j < 4; j ++ )
-       {
-               val = 0;
-               for( ; String[i] && String[i] != '.'; i++ )
-               {
-                       if('0' > String[i] || String[i] > '9') {
-                               printf("0<c<9 expected, '%c' found\n", String[i]);
-                               return 0;
-                       }
-                       val = val*10 + String[i] - '0';
-               }
-               if(val > 255) {
-                       printf("val > 255 (%i)\n", val);
-                       return 0;
-               }
-               Addr[j] = val;
-               
-               if(String[i] == '.')
-                       i ++;
-       }
-       if( j != 4 ) {
-               printf("4 parts expected, %i found\n", j);
-               return 0;
-       }
-       if(String[i] != '\0') {
-               printf("EOS != '\\0', '%c'\n", String[i]);
-               return 0;
-       }
-       return 1;
-}
-
-/**
- * \brief Read an IPv6 Address
- */
-int GetAddress6(char *String, uint8_t *Addr)
-{
-        int    i = 0;
-        int    j, k;
-        int    val, split = -1, end;
-       uint16_t        hi[8], low[8];
-       
-       for( j = 0; String[i] && j < 8; j ++ )
-       {
-               if(String[i] == ':') {
-                       if(split != -1) {
-                               printf("Two '::'s\n");
-                               return 0;
-                       }
-                       split = j;
-                       i ++;
-                       continue;
-               }
-               
-               val = 0;
-               for( k = 0; String[i] && String[i] != ':'; i++, k++ )
-               {
-                       val *= 16;
-                       if('0' <= String[i] && String[i] <= '9')
-                               val += String[i] - '0';
-                       else if('A' <= String[i] && String[i] <= 'F')
-                               val += String[i] - 'A' + 10;
-                       else if('a' <= String[i] && String[i] <= 'f')
-                               val += String[i] - 'a' + 10;
-                       else {
-                               printf("%c unexpected\n", String[i]);
-                               return 0;
-                       }
-               }
-               
-               if(val > 0xFFFF) {
-                       printf("val (0x%x) > 0xFFFF\n", val);
-                       return 0;
-               }
-               
-               if(split == -1)
-                       hi[j] = val;
-               else
-                       low[j-split] = val;
-               
-               if( String[i] == ':' ) {
-                       i ++;
-               }
-       }
-       end = j;
-       
-       for( j = 0; j < split; j ++ )
-       {
-               Addr[j*2] = hi[j]>>8;
-               Addr[j*2+1] = hi[j]&0xFF;
-       }
-       for( ; j < 8 - (end - split); j++ )
-       {
-               Addr[j*2] = 0;
-               Addr[j*2+1] = 0;
-       }
-       k = 0;
-       for( ; j < 8; j ++, k++)
-       {
-               Addr[j*2] = hi[k]>>8;
-               Addr[j*2+1] = hi[k]&0xFF;
-       }
-       
-       return 1;
-}
-
-int GetAddress(char *String, uint8_t *Addr)
-{
-       if( GetAddress4(String, Addr) )
-               return 4;
-       
-       if( GetAddress6(String, Addr) )
-               return 6;
-       
-       return 0;
-}

UCC git Repository :: git.ucc.asn.au