More link command code
[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.4 2005/05/31 05:30:40 kattemat Exp $
41  */
42
43 #include "olsr_host_switch.h"
44 #include "olsr_types.h"
45 #include "commands.h"
46 #include <string.h>
47
48 #define ARG_BUF_SIZE 500
49 static char arg_buf[ARG_BUF_SIZE];
50
51 #define TOK_BUF_SIZE 500
52 static char tok_buf[TOK_BUF_SIZE];
53
54 static void
55 get_arg_buf(FILE *handle, char *buf, size_t size)
56 {
57   char c = 0;
58   int pos = 0;
59
60   while(((c = fgetc(handle)) != '\n') &&
61         pos < (size - 2))
62     {
63       buf[pos] = c;
64       pos++;
65     }
66
67   buf[pos] = 0;
68
69   printf("Args: %s\n", buf);
70 }
71
72 static int
73 get_next_token(char *src, char *dst, size_t buflen)
74 {
75   int i = 0, j = 0;
76
77   dst[0] = 0;
78   /* Skip leading spaces */
79   while(src[j] == ' ' && src[j] != 0)
80     {
81       j++;
82     }
83
84   src += j;
85   i = 0;
86   while((src[i] != ' ') && (src[i] != 0) && (i < (buflen - 1)))
87     {
88       dst[i] = src[i];
89       i++;
90     }
91   dst[i] = 0;
92
93   printf("Extracted token: %s\n", dst);
94   return i + j;
95 }
96
97 int
98 ohs_cmd_link(FILE *handle, char *args)
99 {
100   olsr_u8_t bi = 0;
101   struct ohs_connection *src, *dst;
102
103   if(strlen(args) < strlen("bi"))
104     goto print_usage;
105
106   args += get_next_token(args, tok_buf, TOK_BUF_SIZE);
107
108   if(!strlen(tok_buf))
109     goto print_usage;
110
111   if(!strncmp(tok_buf, "bi", strlen("bi")))
112     {
113       bi = 1;
114       args += get_next_token(args, tok_buf, TOK_BUF_SIZE);
115
116       if(!strlen(tok_buf))
117         goto print_usage;
118     }
119
120   printf("IP src: %s\n", tok_buf);
121
122   args += get_next_token(args, tok_buf, TOK_BUF_SIZE);
123   
124   if(!strlen(tok_buf))
125     goto print_usage;
126
127   printf("IP dst: %s\n", tok_buf);
128
129   args += get_next_token(args, tok_buf, TOK_BUF_SIZE);
130   
131   if(!strlen(tok_buf))
132     goto print_usage;
133
134   printf("Quality: %d\n", atoi(tok_buf));
135
136   printf("%sdirectional link %c=>...\n", bi ? "Bi" : "Uni",
137          bi ? '<' : '=');
138      
139   return 1;
140  print_usage:
141   printf("link <bi> srcIP dstIP [0-100]");
142   return -1;
143 }
144
145 int
146 ohs_cmd_list(FILE *handle, char *args)
147 {
148   struct ohs_connection *oc = ohs_conns;
149
150   printf("All connected clients:\n");
151
152   while(oc)
153     {
154       printf("\t%s - Rx: %d Tx: %d\n", olsr_ip_to_string(&oc->ip_addr), oc->rx, oc->tx);
155       oc = oc->next;
156     }
157
158   return 1;
159 }
160
161 int
162 ohs_cmd_help(FILE *handle, char *args)
163 {
164   int i;
165
166   printf("Olsrd host switch version %s\n", OHS_VERSION);
167   printf("Available commands:\n");
168
169   for(i = 0; ohs_commands[i].cmd; i++)
170     {
171       if(ohs_commands[i].helptext_brief)
172         printf("\t%s - %s\n", 
173                ohs_commands[i].cmd,
174                ohs_commands[i].helptext_brief);
175     }
176   printf("\nType 'help cmd' for help on a specific command(NIY)\n");
177   return i;
178 }
179
180 int
181 ohs_cmd_log(FILE *handle, char *args)
182 {
183   olsr_u8_t set = 0;
184
185   set = !strncmp(args, " set", strlen(" set"));
186
187   if(set || !strncmp(args, " unset", strlen(" unset")))
188     {
189       if(strlen(args) > (strlen("set") + 1))
190         {
191           olsr_u32_t new_bit = 0;
192           
193           if(!strncmp(&args[set ? 4 : 6], " CON", strlen(" CON")))
194             new_bit = LOG_CONNECT;
195           else if(!strncmp(&args[set ? 4 : 6], " FOR", strlen(" FOR")))
196             new_bit = LOG_CONNECT;
197           
198           if(!new_bit)
199             goto print_usage;
200
201           if(set)
202             logbits |= new_bit;
203           else
204             logbits &= ~new_bit;
205
206           printf("%s log bit: 0x%08x, new log: 0x%08x\n", set ? "Setting" : "Removing",
207                  new_bit, logbits);
208
209         }
210       else
211         {
212           goto print_usage;
213         }
214     }
215   else
216     {
217       if(strlen(args))
218         goto print_usage;
219
220       printf("Log: (0x%08x) ", logbits);
221       if(logbits & LOG_CONNECT)
222         printf("CONNECT ");
223       if(logbits & LOG_FORWARD)
224         printf("FORWARD ");
225
226       printf("\n");
227     }
228   return 1;
229
230  print_usage:
231   printf("Usage: log <[set|unset] [CONNECT|FORWARD]>\n");
232   return 0;
233
234 }
235
236 int
237 ohs_cmd_exit(FILE *handle, char *args)
238 {
239
240   printf("Exitting... bye-bye!\n");
241
242 #ifdef WIN32
243   SignalHandler(0);
244 #else
245   ohs_close(0);
246 #endif
247
248   return 0;
249 }
250
251 int
252 ohs_parse_command(FILE *handle)
253 {
254   char input_data[100];
255   int i;
256
257   fscanf(handle, "%s", input_data);
258
259   get_arg_buf(handle, arg_buf, ARG_BUF_SIZE);
260
261   printf("ohs_parse_command: %s\n", input_data);
262   for(i = 0; ohs_commands[i].cmd; i++)
263     {
264       if(!strcmp(input_data, ohs_commands[i].cmd))
265         {
266           if(ohs_commands[i].cmd_cb)
267             {
268               ohs_commands[i].cmd_cb(handle, arg_buf);
269             }
270           else
271             {
272               printf("No action registered on cmd %s!\n", input_data);
273             }
274           break;
275         }
276     }
277   
278   if(!ohs_commands[i].cmd)
279     {
280       printf("%s: no such cmd!\n", input_data);
281     }
282
283
284   return 0;
285 }