Minor fixes and cleanups to the log command
[olsrd.git] / src / olsr_switch / ohs_cmd.c
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2005, Andreas T√łnnesen(andreto@olsr.org)
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without 
8  * modification, are permitted provided that the following conditions 
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright 
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright 
14  *   notice, this list of conditions and the following disclaimer in 
15  *   the documentation and/or other materials provided with the 
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its 
18  *   contributors may be used to endorse or promote products derived 
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  * $Id: ohs_cmd.c,v 1.8 2005/05/31 14:04:21 kattemat Exp $
41  */
42
43 #include "olsr_host_switch.h"
44 #include "olsr_types.h"
45 #include "commands.h"
46 #include "link_rules.h"
47 #include <string.h>
48 #include <stdlib.h>
49 #include <sys/socket.h>
50 #include <netinet/in.h>
51 #include <arpa/inet.h>
52
53
54 #define ARG_BUF_SIZE 500
55 static char arg_buf[ARG_BUF_SIZE];
56
57 #define TOK_BUF_SIZE 500
58 static char tok_buf[TOK_BUF_SIZE];
59
60 static void
61 get_arg_buf(FILE *handle, char *buf, size_t size)
62 {
63   char c = 0;
64   int pos = 0;
65
66   while(((c = fgetc(handle)) != '\n') &&
67         pos < (size - 2))
68     {
69       buf[pos] = c;
70       pos++;
71     }
72
73   buf[pos] = 0;
74
75   printf("Args: %s\n", buf);
76 }
77
78 static int
79 get_next_token(char *src, char *dst, size_t buflen)
80 {
81   int i = 0, j = 0;
82
83   dst[0] = 0;
84   /* Skip leading spaces */
85   while(src[j] == ' ' && src[j] != 0)
86     {
87       j++;
88     }
89
90   src += j;
91   i = 0;
92   while((src[i] != ' ') && (src[i] != 0) && (i < (buflen - 1)))
93     {
94       dst[i] = src[i];
95       i++;
96     }
97   dst[i] = 0;
98
99   printf("Extracted token: %s\n", dst);
100   return i + j;
101 }
102
103 int
104 ohs_cmd_link(FILE *handle, char *args)
105 {
106   olsr_u8_t bi = 0;
107   struct ohs_connection *src, *dst;
108   struct in_addr iaddr;
109   int qual;
110   struct ohs_ip_link *link, *inv_link;
111
112   if(strlen(args) < strlen("bi"))
113     goto print_usage;
114
115   args += get_next_token(args, tok_buf, TOK_BUF_SIZE);
116
117   if(!strlen(tok_buf))
118     goto print_usage;
119
120   if(!strncmp(tok_buf, "bi", strlen("bi")))
121     {
122       bi = 1;
123       args += get_next_token(args, tok_buf, TOK_BUF_SIZE);
124
125       if(!strlen(tok_buf))
126         goto print_usage;
127     }
128
129   if(!inet_aton(tok_buf, &iaddr))
130     {
131       printf("Invalid src IP %s\n", tok_buf);
132       return -1;
133     }
134
135   src = get_client_by_addr((union olsr_ip_addr *)&iaddr.s_addr);
136
137   if(!src)
138     {
139       printf("No such client: %s!\n", tok_buf);
140       return -1;
141     }
142
143   args += get_next_token(args, tok_buf, TOK_BUF_SIZE);
144   
145   if(!strlen(tok_buf))
146     goto print_usage;
147
148   if(!inet_aton(tok_buf, &iaddr))
149     {
150       printf("Invalid src IP %s\n", tok_buf);
151       return -1;
152     }
153
154   dst = get_client_by_addr((union olsr_ip_addr *)&iaddr.s_addr);
155
156   if(!dst)
157     {
158       printf("No such client: %s!\n", tok_buf);
159       return -1;
160     }
161
162   args += get_next_token(args, tok_buf, TOK_BUF_SIZE);
163   
164   if(!strlen(tok_buf))
165     goto print_usage;
166
167   qual = atoi(tok_buf);
168
169   if(qual < 0 || qual > 100)
170     {
171       printf("Link quality out of range(0-100)\n");
172       return -1;
173     }
174   
175   printf("%s %sdirectional link %s %c=> %s quality %d\n", 
176          (qual == 100) ? "Removing" : "Setting", bi ? "bi" : "uni",
177          olsr_ip_to_string(&src->ip_addr), bi ? '<' : '=', 
178          olsr_ip_to_string(&dst->ip_addr), qual);
179
180   link = get_link(src, &dst->ip_addr);
181   if(bi)
182     inv_link = get_link(dst, &src->ip_addr);
183   else
184     inv_link = NULL;
185
186   if(qual == 100)
187     {
188       /* Remove link entry */
189       if(link)
190         remove_link(src, link);
191       if(inv_link)
192         remove_link(dst, inv_link);
193     }
194   else 
195     {
196       if(!link)
197         {
198           /* Create new link */
199             link = malloc(sizeof(link));
200             if(!link)
201               OHS_OUT_OF_MEMORY("New link");
202             /* Queue */
203             link->next = src->links;
204             src->links = link;
205             COPY_IP(&link->dst, &dst->ip_addr);
206             src->linkcnt++;
207         }
208
209       link->quality = qual;
210
211       if(bi)
212         {
213           if(!inv_link)
214             {
215               /* Create new link */
216               inv_link = malloc(sizeof(link));
217               if(!inv_link)
218                 OHS_OUT_OF_MEMORY("New link");
219               /* Queue */
220               inv_link->next = dst->links;
221               dst->links = inv_link;
222               COPY_IP(&inv_link->dst, &src->ip_addr);
223               dst->linkcnt++;
224             }
225           inv_link->quality = qual;
226         }
227     }
228
229   return 1;
230  print_usage:
231   printf("link <bi> srcIP dstIP [0-100]");
232   return -1;
233 }
234
235 int
236 ohs_cmd_list(FILE *handle, char *args)
237 {
238   struct ohs_connection *oc = ohs_conns;
239
240   printf("All connected clients:\n");
241
242   while(oc)
243     {
244       printf("\t%s - Rx: %d Tx: %d LinkCnt: %d\n", olsr_ip_to_string(&oc->ip_addr), 
245              oc->rx, oc->tx, oc->linkcnt);
246       oc = oc->next;
247     }
248
249   return 1;
250 }
251
252 int
253 ohs_cmd_help(FILE *handle, char *args)
254 {
255   int i;
256
257   printf("Olsrd host switch version %s\n", OHS_VERSION);
258   printf("Available commands:\n");
259
260   for(i = 0; ohs_commands[i].cmd; i++)
261     {
262       if(ohs_commands[i].helptext_brief)
263         printf("\t%s - %s\n", 
264                ohs_commands[i].cmd,
265                ohs_commands[i].helptext_brief);
266     }
267   printf("\nType 'help cmd' for help on a specific command(NIY)\n");
268   return i;
269 }
270
271 int
272 ohs_cmd_log(FILE *handle, char *args)
273 {
274   olsr_u8_t set = 0;
275
276   args += get_next_token(args, tok_buf, TOK_BUF_SIZE);
277   
278   if(strlen(tok_buf) &&
279      ((set = !strncmp(tok_buf, "set", strlen("set"))) || 
280       !strncmp(tok_buf, "unset", strlen("unset"))))
281     {
282         olsr_u32_t new_bit = 0;
283         
284         args += get_next_token(args, tok_buf, TOK_BUF_SIZE);
285   
286         if(!strlen(tok_buf))
287             goto print_usage;
288         
289         
290         if(!strncmp(tok_buf, "CON", strlen("CON")))
291             new_bit = LOG_CONNECT;
292         else if(!strncmp(tok_buf, "FOR", strlen("FOR")))
293             new_bit = LOG_FORWARD;
294         else if(!strncmp(tok_buf, "LIN", strlen("LIN")))
295             new_bit = LOG_LINK;
296           
297         if(!new_bit)
298             goto print_usage;
299
300         if(set)
301             logbits |= new_bit;
302         else
303             logbits &= ~new_bit;
304
305         printf("%s log bit: 0x%08x, new log: 0x%08x\n", set ? "Setting" : "Removing",
306                new_bit, logbits);
307
308     }
309   else
310     {
311       if(strlen(tok_buf))
312         goto print_usage;
313
314       printf("Log: (0x%08x) ", logbits);
315       if(logbits & LOG_CONNECT)
316         printf("CONNECT ");
317       if(logbits & LOG_FORWARD)
318         printf("FORWARD ");
319       if(logbits & LOG_LINK)
320         printf("LINK ");
321
322       printf("\n");
323     }
324   return 1;
325
326  print_usage:
327   printf("Usage: log <[set|unset] [CONNECT|FORWARD|LINK]>\n");
328   return 0;
329
330 }
331
332 int
333 ohs_cmd_exit(FILE *handle, char *args)
334 {
335
336   printf("Exitting... bye-bye!\n");
337
338 #ifdef WIN32
339   SignalHandler(0);
340 #else
341   ohs_close(0);
342 #endif
343
344   return 0;
345 }
346
347 int
348 ohs_parse_command(FILE *handle)
349 {
350   char input_data[100];
351   int i;
352
353   fscanf(handle, "%s", input_data);
354
355   get_arg_buf(handle, arg_buf, ARG_BUF_SIZE);
356
357   printf("ohs_parse_command: %s\n", input_data);
358   for(i = 0; ohs_commands[i].cmd; i++)
359     {
360       if(!strcmp(input_data, ohs_commands[i].cmd))
361         {
362           if(ohs_commands[i].cmd_cb)
363             {
364               ohs_commands[i].cmd_cb(handle, arg_buf);
365             }
366           else
367             {
368               printf("No action registered on cmd %s!\n", input_data);
369             }
370           break;
371         }
372     }
373   
374   if(!ohs_commands[i].cmd)
375     {
376       printf("%s: no such cmd!\n", input_data);
377     }
378
379
380   return 0;
381 }