Fixing route determining
[tpg/acess2.git] / Usermode / Applications / ping_src / main.c
1 /*
2  * Acess2 IFCONFIG command
3  */
4 #include <stdlib.h>
5 #include <stdint.h>
6 #include <stdio.h>
7 #include <string.h>
8 #include <acess/sys.h>
9 #include <net.h>
10
11 // === CONSTANTS ===
12 #define IPSTACK_ROOT    "/Devices/ip"
13
14 // === PROTOTYPES ===
15 void    PrintUsage(char *ProgName);
16 void    PrintHelp(char *ProgName);
17  int    GetAddress( char *Address, uint8_t *Addr );
18
19 // === GLOBALS ===
20  int    giNumberOfPings = 1;
21
22 // === CODE ===
23 /**
24  * \fn int main(int argc, char *argv[])
25  * \brief Entrypoint
26  */
27 int main(int argc, char *argv[])
28 {
29         char    *ipStr = NULL;
30         char    *iface = NULL;
31          int    i, j;
32         uint8_t addr[16];
33          int    type;
34          
35          int    fd, call, ping;
36         
37         for(i = 1; i < argc; i++)
38         {
39                 if(argv[i][0] != '-')
40                 {
41                         if(!ipStr)
42                                 ipStr = argv[i];
43                         else if(!iface)
44                                 iface = argv[i];
45                         else {
46                                 PrintUsage(argv[0]);
47                                 return 1;
48                         }
49                 }
50                 
51                 if(argv[i][1] == '-')
52                 {
53                         char    *arg = &argv[i][2];
54                         if(strcmp(arg, "help") == 0) {
55                                 PrintHelp(argv[1]);
56                                 return 0;
57                         }
58                 }
59                 
60                 for( j = 1; argv[i][j]; j++ )
61                 {
62                         switch(argv[i][j])
63                         {
64                         case '?':
65                         case 'h':
66                                 PrintHelp(argv[1]);
67                                 return 0;
68                         }
69                 }
70         }
71         
72         if(!ipStr) {
73                 PrintUsage(argv[0]);
74                 return 1;
75         }
76         
77         // Read Address
78         type = Net_ParseAddress(ipStr, addr);
79         if( type == 0 ) {
80                 fprintf(stderr, "Invalid IP Address\n");
81                 return 1;
82         }
83         
84         if( !iface )
85         {
86                 iface = Net_GetInterface(type, addr);
87                 if( !iface ) {
88                         fprintf(stderr, "Unable to find a route to '%s'\n",
89                                 Net_PrintAddress(type, addr)
90                                 );
91                         return -1;
92                 }
93                 
94                 printf("iface = '%s'\n", iface);
95         }
96         
97         {
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
102                 iface = _iface;
103                 printf("iface = '%s'\n", iface);
104         }
105         
106         fd = open(iface, OPENFLAG_EXEC);
107         if(fd == -1) {
108                 fprintf(stderr, "ERROR: Unable to open interface '%s'\n", iface);
109                 return 1;
110         }
111                 
112         call = ioctl(fd, 3, "ping");
113         if(call == 0) {
114                 fprintf(stderr, "ERROR: '%s' does not have a 'ping' call\n", iface);
115                 return 1;
116         }
117         
118         for( i = 0; i < giNumberOfPings; i ++ )
119         {
120                 ping = ioctl(fd, call, addr);
121                 printf("ping = %i\n", ping);
122         }
123                 
124         close(fd);
125         
126         return 0;
127 }
128
129 void PrintUsage(char *ProgName)
130 {
131         fprintf(stderr, "Usage: %s <address> [<interface>]\n", ProgName);
132 }
133
134 void PrintHelp(char *ProgName)
135 {
136         PrintUsage(ProgName);
137         fprintf(stderr, " -h\tPrint this message\n");
138 }
139
140 /**
141  * \brief Read an IPv4 Address
142  */
143 int GetAddress4(char *String, uint8_t *Addr)
144 {
145          int    i = 0;
146          int    j;
147          int    val;
148         
149         for( j = 0; String[i] && j < 4; j ++ )
150         {
151                 val = 0;
152                 for( ; String[i] && String[i] != '.'; i++ )
153                 {
154                         if('0' > String[i] || String[i] > '9') {
155                                 printf("0<c<9 expected, '%c' found\n", String[i]);
156                                 return 0;
157                         }
158                         val = val*10 + String[i] - '0';
159                 }
160                 if(val > 255) {
161                         printf("val > 255 (%i)\n", val);
162                         return 0;
163                 }
164                 Addr[j] = val;
165                 
166                 if(String[i] == '.')
167                         i ++;
168         }
169         if( j != 4 ) {
170                 printf("4 parts expected, %i found\n", j);
171                 return 0;
172         }
173         if(String[i] != '\0') {
174                 printf("EOS != '\\0', '%c'\n", String[i]);
175                 return 0;
176         }
177         return 1;
178 }
179
180 /**
181  * \brief Read an IPv6 Address
182  */
183 int GetAddress6(char *String, uint8_t *Addr)
184 {
185          int    i = 0;
186          int    j, k;
187          int    val, split = -1, end;
188         uint16_t        hi[8], low[8];
189         
190         for( j = 0; String[i] && j < 8; j ++ )
191         {
192                 if(String[i] == ':') {
193                         if(split != -1) {
194                                 printf("Two '::'s\n");
195                                 return 0;
196                         }
197                         split = j;
198                         i ++;
199                         continue;
200                 }
201                 
202                 val = 0;
203                 for( k = 0; String[i] && String[i] != ':'; i++, k++ )
204                 {
205                         val *= 16;
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;
212                         else {
213                                 printf("%c unexpected\n", String[i]);
214                                 return 0;
215                         }
216                 }
217                 
218                 if(val > 0xFFFF) {
219                         printf("val (0x%x) > 0xFFFF\n", val);
220                         return 0;
221                 }
222                 
223                 if(split == -1)
224                         hi[j] = val;
225                 else
226                         low[j-split] = val;
227                 
228                 if( String[i] == ':' ) {
229                         i ++;
230                 }
231         }
232         end = j;
233         
234         for( j = 0; j < split; j ++ )
235         {
236                 Addr[j*2] = hi[j]>>8;
237                 Addr[j*2+1] = hi[j]&0xFF;
238         }
239         for( ; j < 8 - (end - split); j++ )
240         {
241                 Addr[j*2] = 0;
242                 Addr[j*2+1] = 0;
243         }
244         k = 0;
245         for( ; j < 8; j ++, k++)
246         {
247                 Addr[j*2] = hi[k]>>8;
248                 Addr[j*2+1] = hi[k]&0xFF;
249         }
250         
251         return 1;
252 }
253
254 int GetAddress(char *String, uint8_t *Addr)
255 {
256         if( GetAddress4(String, Addr) )
257                 return 4;
258         
259         if( GetAddress6(String, Addr) )
260                 return 6;
261         
262         return 0;
263 }

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