b3bacc911d9c8e4b6ab71b3c4f04c2ceb9c5a14d
[olsrd.git] / lib / tas / src / glua_ext.c
1 /*
2  * The olsr.org Optimized Link-State Routing daemon (olsrd)
3  *
4  * Copyright (c) 2004, Thomas Lopatic (thomas@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: glua_ext.c,v 1.1 2005/04/12 17:17:25 tlopatic Exp $
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 static char *getToken(char **point)
56 {
57   char *localPoint = *point;
58   char *start;
59
60   start = localPoint;
61
62   while (*localPoint != '~' && *localPoint != 0)
63     localPoint++;
64
65   if (*localPoint == 0)
66     return NULL;
67
68   *localPoint++ = 0;
69
70   *point = localPoint;
71
72   return start;
73 }
74
75 int tasOlsrSendMessage(lua_State *lua)
76 {
77   const char *service;
78   const char *string;
79
80   service = luaL_checkstring(lua, 1);
81   string = luaL_checkstring(lua, 2);
82
83   sendMessage(service, string);
84   httpAddTasMessage(service, string, "localhost");
85
86   return 0;
87 }
88
89 int tasOlsrGetMessage(lua_State *lua)
90 {
91   const char *service;
92   char *string;
93   char *from;
94
95   service = luaL_checkstring(lua, 1);
96
97   if (httpGetTasMessage(service, &string, &from) < 0)
98   {
99     lua_pushnil(lua);
100     lua_pushnil(lua);
101   }
102
103   else
104   {
105     lua_pushstring(lua, string);
106     lua_pushstring(lua, from);
107
108     freeMem(string);
109     freeMem(from);
110   }
111
112   return 2;
113 }
114
115 static void addTable(lua_State *lua, char *name, void (*init)(void),
116                      int (*next)(char *buff, int len))
117 {
118   int i;
119   char buff[1024], *walker;
120
121   lua_pushstring(lua, name);
122   lua_newtable(lua);
123
124   init();
125
126   i = 0;
127
128   while (next(buff, sizeof (buff)) >= 0)
129   {
130     walker = buff;
131
132     lua_pushnumber(lua, i++);
133     lua_newtable(lua);
134
135     while (*walker != 0)
136     {
137       lua_pushstring(lua, getToken(&walker));
138       lua_pushstring(lua, getToken(&walker));
139
140       lua_settable(lua, -3);
141     }
142
143     lua_settable(lua, -3);
144   }
145
146   lua_settable(lua, -3);
147 }
148
149 int tasOlsrGetInfo(lua_State *lua)
150 {
151   lua_newtable(lua);
152
153   addTable(lua, "routes", iterRouteTabInit, iterRouteTabNext);
154   addTable(lua, "links", iterLinkTabInit, iterLinkTabNext);
155   addTable(lua, "neighbors", iterNeighTabInit, iterNeighTabNext);
156
157   return 1;
158 }