X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Fping_src%2Fmain.c;h=7c10e57be93477f9cc034cd0bdf94d722d025000;hb=aa5e13445f3d9ab6e0c0049780f38daed443104f;hp=792054510b72b960b4b540d8da211eb492ac5ff3;hpb=268cff7210477842399170f18bf9cdaaa1c264c6;p=tpg%2Facess2.git diff --git a/Usermode/Applications/ping_src/main.c b/Usermode/Applications/ping_src/main.c index 79205451..7c10e57b 100644 --- a/Usermode/Applications/ping_src/main.c +++ b/Usermode/Applications/ping_src/main.c @@ -1,11 +1,12 @@ /* - * Acess2 IFCONFIG command + * Acess2 ping command */ #include #include #include #include #include +#include // === 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,37 +74,52 @@ 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 = _SysOpen(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; } - ping = ioctl(fd, call, addr); - printf("ping = %i\n"); - - close(fd); } + call = _SysIOCtl(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 = _SysIOCtl(fd, call, addr); + printf("ping = %i\n", ping); + } + + _SysClose(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 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; -}