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

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