f22e0a53caf7a5fa831749dbab8da56bde10a06d
[olsrd.git] / lib / tas / src / glua_ext.c
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon (olsrd)
4  *
5  * Copyright (c) 2004, Thomas Lopatic (thomas@olsr.org)
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * * Redistributions of source code must retain the above copyright
13  *   notice, this list of conditions and the following disclaimer.
14  * * Redistributions in binary form must reproduce the above copyright
15  *   notice, this list of conditions and the following disclaimer in
16  *   the documentation and/or other materials provided with the
17  *   distribution.
18  * * Neither the name of olsr.org, olsrd nor the names of its
19  *   contributors may be used to endorse or promote products derived
20  *   from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33  * POSSIBILITY OF SUCH DAMAGE.
34  *
35  * Visit http://www.olsr.org for more information.
36  *
37  * If you find this software useful feel free to make a donation
38  * to the project. For more information see the website or contact
39  * the copyright holders.
40  *
41  */
42
43 #include "lua/lua.h"
44 #include "lua/lauxlib.h"
45 #include "lua/lualib.h"
46
47 #include "link.h"
48 #include "plugin.h"
49 #include "lib.h"
50 #include "os_unix.h"
51 #include "http.h"
52 #include "glua.h"
53 #include "glua_ext.h"
54
55 #include <string.h>
56
57 static char *
58 getToken(char **point)
59 {
60   char *localPoint = *point;
61   char *start;
62
63   start = localPoint;
64
65   while (*localPoint != '~' && *localPoint != 0)
66     localPoint++;
67
68   if (*localPoint == 0)
69     return NULL;
70
71   *localPoint++ = 0;
72
73   *point = localPoint;
74
75   return start;
76 }
77
78 int
79 tasOlsrSendMessage(lua_State * lua)
80 {
81   const char *service;
82   const char *string;
83
84   service = luaL_checkstring(lua, 1);
85   string = luaL_checkstring(lua, 2);
86
87   sendMessage(service, string);
88   httpAddTasMessage(service, string, "localhost");
89
90   return 0;
91 }
92
93 int
94 tasOlsrGetMessage(lua_State * lua)
95 {
96   const char *service;
97   char *string;
98   char *from;
99
100   service = luaL_checkstring(lua, 1);
101
102   if (httpGetTasMessage(service, &string, &from) < 0) {
103     lua_pushnil(lua);
104     lua_pushnil(lua);
105   }
106
107   else {
108     lua_pushstring(lua, string);
109     lua_pushstring(lua, from);
110
111     freeMem(string);
112     freeMem(from);
113   }
114
115   return 2;
116 }
117
118 static void
119 addSubTable(lua_State * lua, char **walker)
120 {
121   char *token;
122   unsigned int val;
123
124   token = getToken(walker);
125
126   if (token == NULL) {
127     error("premature end of buffer\n");
128     return;
129   }
130
131   if (stringToInt(&val, token) < 0)
132     lua_pushstring(lua, token);
133
134   else
135     lua_pushnumber(lua, val);
136
137   lua_newtable(lua);
138
139   while (**walker != 0) {
140     token = getToken(walker);
141
142     if (token == NULL) {
143       error("premature end of buffer\n");
144       return;
145     }
146
147     if (strcmp(token, "]") == 0)
148       return;
149
150     if (strcmp(token, "[") == 0)
151       addSubTable(lua, walker);
152
153     else {
154       if (stringToInt(&val, token) < 0)
155         lua_pushstring(lua, token);
156
157       else
158         lua_pushnumber(lua, val);
159
160       token = getToken(walker);
161
162       if (token == NULL) {
163         error("premature end of buffer\n");
164         return;
165       }
166
167       lua_pushstring(lua, token);
168     }
169
170     lua_settable(lua, -3);
171   }
172 }
173
174 static void
175 addTable(lua_State * lua, const char *name, void (*init) (void), int (*next) (char *buff, int len))
176 {
177   int i;
178   char buff[1024], *walker, *token;
179
180   lua_pushstring(lua, name);
181   lua_newtable(lua);
182
183   init();
184
185   i = 0;
186
187   while (next(buff, sizeof(buff)) >= 0) {
188     walker = buff;
189
190     lua_pushnumber(lua, i++);
191     lua_newtable(lua);
192
193     while (*walker != 0) {
194       token = getToken(&walker);
195
196       if (token == NULL) {
197         error("premature end of buffer\n");
198         return;
199       }
200
201       if (strcmp(token, "[") == 0)
202         addSubTable(lua, &walker);
203
204       else {
205         lua_pushstring(lua, token);
206
207         token = getToken(&walker);
208
209         if (token == NULL) {
210           error("premature end of buffer\n");
211           return;
212         }
213
214         lua_pushstring(lua, token);
215       }
216
217       lua_settable(lua, -3);
218     }
219
220     lua_settable(lua, -3);
221   }
222
223   lua_settable(lua, -3);
224 }
225
226 int
227 tasOlsrGetInfo(lua_State * lua)
228 {
229   lua_newtable(lua);
230
231   addTable(lua, "routes", iterRouteTabInit, iterRouteTabNext);
232   addTable(lua, "links", iterLinkTabInit, iterLinkTabNext);
233   addTable(lua, "neighbors", iterNeighTabInit, iterNeighTabNext);
234   addTable(lua, "topology", iterTcTabInit, iterTcTabNext);
235
236   return 1;
237 }
238
239 /*
240  * Local Variables:
241  * c-basic-offset: 2
242  * indent-tabs-mode: nil
243  * End:
244  */