2 * Acess2 IFCONFIG command
12 #define IPSTACK_ROOT "/Devices/ip"
15 void PrintUsage(char *ProgName);
16 void PrintHelp(char *ProgName);
17 int GetAddress( char *Address, uint8_t *Addr );
20 int giNumberOfPings = 1;
24 * \fn int main(int argc, char *argv[])
27 int main(int argc, char *argv[])
37 for(i = 1; i < argc; i++)
53 char *arg = &argv[i][2];
54 if(strcmp(arg, "help") == 0) {
60 for( j = 1; argv[i][j]; j++ )
78 type = Net_ParseAddress(ipStr, addr);
80 fprintf(stderr, "Invalid IP Address\n");
86 iface = Net_GetInterface(type, addr);
88 fprintf(stderr, "Unable to find a route to '%s'\n",
89 Net_PrintAddress(type, addr)
94 printf("iface = '%s'\n", iface);
98 char *_iface = malloc( sizeof("/Devices/ip/") + strlen(iface) + 1 );
99 strcpy(_iface, "/Devices/ip/");
100 strcat(_iface, iface);
101 free(iface); // TODO: Handle when this is not heap
103 printf("iface = '%s'\n", iface);
106 fd = open(iface, OPENFLAG_EXEC);
108 fprintf(stderr, "ERROR: Unable to open interface '%s'\n", iface);
112 call = ioctl(fd, 3, "ping");
114 fprintf(stderr, "ERROR: '%s' does not have a 'ping' call\n", iface);
118 for( i = 0; i < giNumberOfPings; i ++ )
120 ping = ioctl(fd, call, addr);
121 printf("ping = %i\n", ping);
129 void PrintUsage(char *ProgName)
131 fprintf(stderr, "Usage: %s <address> [<interface>]\n", ProgName);
134 void PrintHelp(char *ProgName)
136 PrintUsage(ProgName);
137 fprintf(stderr, " -h\tPrint this message\n");
141 * \brief Read an IPv4 Address
143 int GetAddress4(char *String, uint8_t *Addr)
149 for( j = 0; String[i] && j < 4; j ++ )
152 for( ; String[i] && String[i] != '.'; i++ )
154 if('0' > String[i] || String[i] > '9') {
155 printf("0<c<9 expected, '%c' found\n", String[i]);
158 val = val*10 + String[i] - '0';
161 printf("val > 255 (%i)\n", val);
170 printf("4 parts expected, %i found\n", j);
173 if(String[i] != '\0') {
174 printf("EOS != '\\0', '%c'\n", String[i]);
181 * \brief Read an IPv6 Address
183 int GetAddress6(char *String, uint8_t *Addr)
187 int val, split = -1, end;
188 uint16_t hi[8], low[8];
190 for( j = 0; String[i] && j < 8; j ++ )
192 if(String[i] == ':') {
194 printf("Two '::'s\n");
203 for( k = 0; String[i] && String[i] != ':'; i++, k++ )
206 if('0' <= String[i] && String[i] <= '9')
207 val += String[i] - '0';
208 else if('A' <= String[i] && String[i] <= 'F')
209 val += String[i] - 'A' + 10;
210 else if('a' <= String[i] && String[i] <= 'f')
211 val += String[i] - 'a' + 10;
213 printf("%c unexpected\n", String[i]);
219 printf("val (0x%x) > 0xFFFF\n", val);
228 if( String[i] == ':' ) {
234 for( j = 0; j < split; j ++ )
236 Addr[j*2] = hi[j]>>8;
237 Addr[j*2+1] = hi[j]&0xFF;
239 for( ; j < 8 - (end - split); j++ )
245 for( ; j < 8; j ++, k++)
247 Addr[j*2] = hi[k]>>8;
248 Addr[j*2+1] = hi[k]&0xFF;
254 int GetAddress(char *String, uint8_t *Addr)
256 if( GetAddress4(String, Addr) )
259 if( GetAddress6(String, Addr) )