2 * iwinfo - Wireless Information Library - Lua Bindings
4 * Copyright (C) 2009 Jo-Philipp Wich <xm@subsignal.org>
6 * The iwinfo library is free software: you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License version 2
8 * as published by the Free Software Foundation.
10 * The iwinfo library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 * See the GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with the iwinfo library. If not, see http://www.gnu.org/licenses/.
19 #include "iwinfo_lualib.h"
22 static int iwinfo_L_type(lua_State *L)
24 const char *ifname = luaL_checkstring(L, 1);
26 if( madwifi_probe(ifname) )
27 lua_pushstring(L, "madwifi");
29 else if( wl_probe(ifname) )
30 lua_pushstring(L, "wl");
32 else if( wext_probe(ifname) )
33 lua_pushstring(L, "wext");
41 /* Wrapper for assoclist */
42 static int iwinfo_L_assoclist(lua_State *L, int (*func)(const char *, char *, int *))
45 char rv[IWINFO_BUFSIZE];
47 const char *ifname = luaL_checkstring(L, 1);
48 struct iwinfo_assoclist_entry *e;
51 memset(rv, 0, sizeof(rv));
53 if( !(*func)(ifname, rv, &len) )
55 for( i = 0; i < len; i += sizeof(struct iwinfo_assoclist_entry) )
57 e = (struct iwinfo_assoclist_entry *) &rv[i];
59 sprintf(macstr, "%02X:%02X:%02X:%02X:%02X:%02X",
60 e->mac[0], e->mac[1], e->mac[2],
61 e->mac[3], e->mac[4], e->mac[5]);
65 lua_pushnumber(L, e->signal);
66 lua_setfield(L, -2, "signal");
68 lua_pushnumber(L, e->noise);
69 lua_setfield(L, -2, "noise");
71 lua_setfield(L, -2, macstr);
78 /* Wrapper for tx power list */
79 static int iwinfo_L_txpwrlist(lua_State *L, int (*func)(const char *, char *, int *))
82 char rv[IWINFO_BUFSIZE];
83 const char *ifname = luaL_checkstring(L, 1);
84 struct iwinfo_txpwrlist_entry *e;
87 memset(rv, 0, sizeof(rv));
89 if( !(*func)(ifname, rv, &len) )
91 for( i = 0, x = 1; i < len; i += sizeof(struct iwinfo_txpwrlist_entry), x++ )
93 e = (struct iwinfo_txpwrlist_entry *) &rv[i];
97 lua_pushnumber(L, e->mw);
98 lua_setfield(L, -2, "mw");
100 lua_pushnumber(L, e->dbm);
101 lua_setfield(L, -2, "dbm");
103 lua_rawseti(L, -2, x);
110 /* Wrapper for scan list */
111 static int iwinfo_L_scanlist(lua_State *L, int (*func)(const char *, char *, int *))
114 char rv[IWINFO_BUFSIZE];
116 const char *ifname = luaL_checkstring(L, 1);
117 struct iwinfo_scanlist_entry *e;
120 memset(rv, 0, sizeof(rv));
122 if( !(*func)(ifname, rv, &len) )
124 for( i = 0, x = 1; i < len; i += sizeof(struct iwinfo_scanlist_entry), x++ )
126 e = (struct iwinfo_scanlist_entry *) &rv[i];
131 sprintf(macstr, "%02X:%02X:%02X:%02X:%02X:%02X",
132 e->mac[0], e->mac[1], e->mac[2],
133 e->mac[3], e->mac[4], e->mac[5]);
135 lua_pushstring(L, macstr);
136 lua_setfield(L, -2, "bssid");
141 lua_pushstring(L, (char *) e->ssid);
142 lua_setfield(L, -2, "ssid");
146 lua_pushinteger(L, e->channel);
147 lua_setfield(L, -2, "channel");
150 lua_pushstring(L, (char *) e->mode);
151 lua_setfield(L, -2, "mode");
153 /* Quality, Signal */
154 lua_pushinteger(L, e->quality);
155 lua_setfield(L, -2, "quality");
157 lua_pushinteger(L, e->quality_max);
158 lua_setfield(L, -2, "quality_max");
160 lua_pushnumber(L, (e->signal - 0x100));
161 lua_setfield(L, -2, "signal");
164 lua_pushboolean(L, (!e->crypto.wpa_version && e->crypto.enabled));
165 lua_setfield(L, -2, "wep");
167 if( e->crypto.wpa_version )
169 lua_pushinteger(L, e->crypto.wpa_version);
170 lua_setfield(L, -2, "wpa");
173 for( j = 0, y = 1; j < IW_IE_CYPHER_NUM; j++ )
175 if( e->crypto.group_ciphers & (1<<j) )
177 lua_pushstring(L, iw_ie_cypher_name[j]);
178 lua_rawseti(L, -2, y++);
181 lua_setfield(L, -2, "group_ciphers");
184 for( j = 0, y = 1; j < IW_IE_CYPHER_NUM; j++ )
186 if( e->crypto.pair_ciphers & (1<<j) )
188 lua_pushstring(L, iw_ie_cypher_name[j]);
189 lua_rawseti(L, -2, y++);
192 lua_setfield(L, -2, "pair_ciphers");
195 for( j = 0, y = 1; j < IW_IE_KEY_MGMT_NUM; j++ )
197 if( e->crypto.auth_suites & (1<<j) )
199 lua_pushstring(L, iw_ie_key_mgmt_name[j]);
200 lua_rawseti(L, -2, y++);
203 lua_setfield(L, -2, "auth_suites");
206 lua_rawseti(L, -2, x);
215 LUA_WRAP_INT(wl,channel)
216 LUA_WRAP_INT(wl,frequency)
217 LUA_WRAP_INT(wl,bitrate)
218 LUA_WRAP_INT(wl,signal)
219 LUA_WRAP_INT(wl,noise)
220 LUA_WRAP_INT(wl,quality)
221 LUA_WRAP_INT(wl,quality_max)
222 LUA_WRAP_INT(wl,mbssid_support)
223 LUA_WRAP_STRING(wl,mode)
224 LUA_WRAP_STRING(wl,ssid)
225 LUA_WRAP_STRING(wl,bssid)
226 LUA_WRAP_STRING(wl,enctype)
227 LUA_WRAP_LIST(wl,assoclist)
228 LUA_WRAP_LIST(wl,txpwrlist)
229 LUA_WRAP_LIST(wl,scanlist)
232 LUA_WRAP_INT(madwifi,channel)
233 LUA_WRAP_INT(madwifi,frequency)
234 LUA_WRAP_INT(madwifi,bitrate)
235 LUA_WRAP_INT(madwifi,signal)
236 LUA_WRAP_INT(madwifi,noise)
237 LUA_WRAP_INT(madwifi,quality)
238 LUA_WRAP_INT(madwifi,quality_max)
239 LUA_WRAP_INT(madwifi,mbssid_support)
240 LUA_WRAP_STRING(madwifi,mode)
241 LUA_WRAP_STRING(madwifi,ssid)
242 LUA_WRAP_STRING(madwifi,bssid)
243 LUA_WRAP_STRING(madwifi,enctype)
244 LUA_WRAP_LIST(madwifi,assoclist)
245 LUA_WRAP_LIST(madwifi,txpwrlist)
246 LUA_WRAP_LIST(madwifi,scanlist)
249 LUA_WRAP_INT(wext,channel)
250 LUA_WRAP_INT(wext,frequency)
251 LUA_WRAP_INT(wext,bitrate)
252 LUA_WRAP_INT(wext,signal)
253 LUA_WRAP_INT(wext,noise)
254 LUA_WRAP_INT(wext,quality)
255 LUA_WRAP_INT(wext,quality_max)
256 LUA_WRAP_INT(wext,mbssid_support)
257 LUA_WRAP_STRING(wext,mode)
258 LUA_WRAP_STRING(wext,ssid)
259 LUA_WRAP_STRING(wext,bssid)
260 LUA_WRAP_STRING(wext,enctype)
261 LUA_WRAP_LIST(wext,assoclist)
262 LUA_WRAP_LIST(wext,txpwrlist)
263 LUA_WRAP_LIST(wext,scanlist)
266 static const luaL_reg R_wl[] = {
268 LUA_REG(wl,frequency),
273 LUA_REG(wl,quality_max),
278 LUA_REG(wl,assoclist),
279 LUA_REG(wl,txpwrlist),
280 LUA_REG(wl,scanlist),
281 LUA_REG(wl,mbssid_support),
286 static const luaL_reg R_madwifi[] = {
287 LUA_REG(madwifi,channel),
288 LUA_REG(madwifi,frequency),
289 LUA_REG(madwifi,bitrate),
290 LUA_REG(madwifi,signal),
291 LUA_REG(madwifi,noise),
292 LUA_REG(madwifi,quality),
293 LUA_REG(madwifi,quality_max),
294 LUA_REG(madwifi,mode),
295 LUA_REG(madwifi,ssid),
296 LUA_REG(madwifi,bssid),
297 LUA_REG(madwifi,enctype),
298 LUA_REG(madwifi,assoclist),
299 LUA_REG(madwifi,txpwrlist),
300 LUA_REG(madwifi,scanlist),
301 LUA_REG(madwifi,mbssid_support),
306 static const luaL_reg R_wext[] = {
307 LUA_REG(wext,channel),
308 LUA_REG(wext,frequency),
309 LUA_REG(wext,bitrate),
310 LUA_REG(wext,signal),
312 LUA_REG(wext,quality),
313 LUA_REG(wext,quality_max),
317 LUA_REG(wext,enctype),
318 LUA_REG(wext,assoclist),
319 LUA_REG(wext,txpwrlist),
320 LUA_REG(wext,scanlist),
321 LUA_REG(wext,mbssid_support),
326 static const luaL_reg R_common[] = {
327 { "type", iwinfo_L_type },
332 LUALIB_API int luaopen_iwinfo(lua_State *L) {
333 luaL_register(L, IWINFO_META, R_common);
335 luaL_newmetatable(L, IWINFO_WL_META);
336 luaL_register(L, NULL, R_wl);
337 lua_pushvalue(L, -1);
338 lua_setfield(L, -2, "__index");
339 lua_setfield(L, -2, "wl");
341 luaL_newmetatable(L, IWINFO_MADWIFI_META);
342 luaL_register(L, NULL, R_madwifi);
343 lua_pushvalue(L, -1);
344 lua_setfield(L, -2, "__index");
345 lua_setfield(L, -2, "madwifi");
347 luaL_newmetatable(L, IWINFO_WEXT_META);
348 luaL_register(L, NULL, R_wext);
349 lua_pushvalue(L, -1);
350 lua_setfield(L, -2, "__index");
351 lua_setfield(L, -2, "wext");