luci-0.9: remove libs/lpk and libs/luanet - they're unused and frequently break builds (#113)
This commit is contained in:
parent
508488e961
commit
5d98d73229
31 changed files with 0 additions and 2478 deletions
|
@ -1,2 +0,0 @@
|
|||
include ../../build/config.mk
|
||||
include ../../build/module.mk
|
|
@ -1,41 +0,0 @@
|
|||
module("luci.lpk", package.seeall)
|
||||
require("luci.lpk.util")
|
||||
require("luci.lpk.core")
|
||||
|
||||
__appname__ = "LuCI »lpk« Package Manager"
|
||||
__version__ = "0.1"
|
||||
__authors__ = "Steven Barth, Jo-Philipp Wich"
|
||||
__cpyrght__ = string.format("Copyright (c) 2008 %s", __authors__)
|
||||
|
||||
|
||||
options, arguments = luci.lpk.util.getopt(arg)
|
||||
config = luci.util.dtable()
|
||||
machine = luci.lpk.core.Machine()
|
||||
|
||||
local cfgdump = loadfile("/etc/lpk.conf")
|
||||
if cfgdump then
|
||||
setfenv(cfgdump, config)
|
||||
pcall(cfgdump)
|
||||
end
|
||||
|
||||
if #arguments < 1 then
|
||||
luci.lpk.util.splash()
|
||||
else
|
||||
local task, error = machine:task(table.remove(arguments, 1),
|
||||
unpack(arguments))
|
||||
|
||||
if task then
|
||||
local stat, error = task:perform()
|
||||
if not stat then
|
||||
luci.util.perror(error or task.register.errstr or "Unknown Error")
|
||||
os.exit(task.register.error or 1)
|
||||
end
|
||||
else
|
||||
luci.util.perror((error or "Unknown Error") .. "\n")
|
||||
luci.lpk.util.splash()
|
||||
os.exit(1)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
|
@ -1,107 +0,0 @@
|
|||
module("luci.lpk.core", package.seeall)
|
||||
require("luci.util")
|
||||
|
||||
Task = luci.util.class()
|
||||
|
||||
function Task.__init__(self, machine, register, start)
|
||||
self.machine = machine
|
||||
|
||||
-- The queue that has to be processed
|
||||
self.work = {start}
|
||||
|
||||
-- The queue that has to be processed in case of rollback
|
||||
self.done = {}
|
||||
|
||||
-- The Task register
|
||||
self.register = register
|
||||
end
|
||||
|
||||
function Task.rollback(self)
|
||||
if #self.done < 1 then
|
||||
return false
|
||||
end
|
||||
|
||||
local state = table.remove(self.done)
|
||||
if not state.rollback then
|
||||
return true
|
||||
end
|
||||
|
||||
local ret, err = pcall(state.rollback, state, self.register)
|
||||
|
||||
if ret then
|
||||
return true
|
||||
else
|
||||
return false, err
|
||||
end
|
||||
end
|
||||
|
||||
function Task.step(self)
|
||||
local state = table.remove(self.work)
|
||||
local ret, next = pcall(state.process, self.register)
|
||||
|
||||
if ret then
|
||||
if next then
|
||||
local nstate = self.machine:state(next)
|
||||
if nstate then
|
||||
table.insert(self.work, state)
|
||||
table.insert(self.work, nstate)
|
||||
else
|
||||
self.register.error = 2
|
||||
self.register.errstr = "Unknown state: " .. next
|
||||
return false
|
||||
end
|
||||
else
|
||||
table.insert(self.done, state)
|
||||
end
|
||||
|
||||
return #self.work > 0
|
||||
else
|
||||
self.register.error = next
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
function Task.perform(self)
|
||||
while self:step() do
|
||||
end
|
||||
|
||||
if not self.register.error then
|
||||
return true
|
||||
else
|
||||
local stat, err
|
||||
repeat
|
||||
stat, err = self:rollback()
|
||||
until not stat
|
||||
|
||||
if err then
|
||||
self.register.errstr = err
|
||||
self.register.error = 2
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Machine = luci.util.class()
|
||||
|
||||
function Machine.__init__(self, namespace)
|
||||
self.namespace = namespace or _NAME
|
||||
end
|
||||
|
||||
function Machine.state(self, name)
|
||||
local ret, state = pcall(require, self.namespace .. "." .. name)
|
||||
return ret and state
|
||||
end
|
||||
|
||||
function Machine.task(self, name, ...)
|
||||
local start = self:state(name)
|
||||
|
||||
if type(start) ~= "table" or not start.entry then
|
||||
return false, "No such command: " .. name
|
||||
end
|
||||
|
||||
local register = {}
|
||||
|
||||
return start.entry(register, ...) and Task(self, register, start)
|
||||
end
|
|
@ -1 +0,0 @@
|
|||
module("luci.lpk.core.download", package.seeall)
|
|
@ -1,16 +0,0 @@
|
|||
module("luci.lpk.core.install", package.seeall)
|
||||
|
||||
function entry(register, ...)
|
||||
print("Requested install of " .. table.concat(arg, ", "))
|
||||
return true
|
||||
end
|
||||
|
||||
function process(register)
|
||||
register.sometext = "Test"
|
||||
if not register.retrieved then
|
||||
print("Step down to retrieve")
|
||||
return "retrieve"
|
||||
else
|
||||
print("Coming up again")
|
||||
end
|
||||
end
|
|
@ -1,7 +0,0 @@
|
|||
module("luci.lpk.core.retrieve", package.seeall)
|
||||
|
||||
function process(register)
|
||||
print "Now in retrieve"
|
||||
print (register.sometext)
|
||||
register.retrieved = true
|
||||
end
|
|
@ -1,59 +0,0 @@
|
|||
module("luci.lpk.util", package.seeall)
|
||||
|
||||
function getopt( arg, options )
|
||||
options = options or ""
|
||||
local tab = {}
|
||||
local args = {}
|
||||
for k, v in ipairs(arg) do
|
||||
if v:sub(1, 2) == "--" then
|
||||
local x = v:find( "=", 1, true )
|
||||
if x then
|
||||
tab[ v:sub( 3, x-1 ) ] = v:sub( x+1 )
|
||||
else
|
||||
tab[ v:sub( 3 ) ] = true
|
||||
end
|
||||
elseif v:sub( 1, 1 ) == "-" then
|
||||
local y = 2
|
||||
local l = #v
|
||||
local jopt
|
||||
while ( y <= l ) do
|
||||
jopt = v:sub( y, y )
|
||||
if options:find( jopt, 1, true ) then
|
||||
if y < l then
|
||||
tab[ jopt ] = v:sub( y+1 )
|
||||
y = l
|
||||
else
|
||||
tab[ jopt ] = arg[ k + 1 ]
|
||||
arg[ k + 1 ] = ""
|
||||
end
|
||||
else
|
||||
tab[ jopt ] = true
|
||||
end
|
||||
y = y + 1
|
||||
end
|
||||
elseif #v > 0 then
|
||||
table.insert(args, v)
|
||||
end
|
||||
end
|
||||
return tab, args
|
||||
end
|
||||
|
||||
function splash()
|
||||
require("luci.lpk")
|
||||
luci.util.perror(string.format("%s v%s\n%s",
|
||||
luci.lpk.__appname__, luci.lpk.__version__, luci.lpk.__cpyrght__))
|
||||
luci.util.perror([[
|
||||
|
||||
Usage:
|
||||
lpk [options] <command> [arguments]
|
||||
lpk [options] install|remove pkg1 [pkg2] [...] [pkgn]
|
||||
|
||||
Commands:
|
||||
install - Install packages
|
||||
remove - Remove packages
|
||||
purge - Remove packages and their configuration files
|
||||
|
||||
Options:
|
||||
--force-depends - Ignore unresolvable dependencies
|
||||
]])
|
||||
end
|
|
@ -1 +0,0 @@
|
|||
backend.model = "ipkg"
|
|
@ -1,2 +0,0 @@
|
|||
#!/usr/bin/lua
|
||||
require("luci.lpk")
|
|
@ -1,18 +0,0 @@
|
|||
ifeq ($(CFLAGS),)
|
||||
MYLDFLAGS ?= -L../../../contrib/uci/dist/usr/lib/
|
||||
endif
|
||||
|
||||
include ../../build/module.mk
|
||||
include ../../build/config.mk
|
||||
include ../../build/gccconfig.mk
|
||||
|
||||
compile:
|
||||
make -Csrc \
|
||||
CFLAGS="$(CFLAGS) $(FPIC) $(LUA_CFLAGS) $(EXTRA_CFLAGS)" \
|
||||
LDFLAGS="$(LDFLAGS)" \
|
||||
MYLDFLAGS="$(MYLDFLAGS)"
|
||||
mkdir -p dist/usr/lib/lua/
|
||||
cp src/luanet.so dist/usr/lib/lua
|
||||
|
||||
clean: luaclean
|
||||
make -Csrc clean
|
|
@ -1,18 +0,0 @@
|
|||
PROGS=luanet.so
|
||||
STRIP?=strip
|
||||
CFLAGS?=
|
||||
CFLAGS+=-pedantic -Werror -Wall -I/usr/include/lua5.1/ -std=gnu99
|
||||
LDFLAGS?=
|
||||
LDFLAGS+=
|
||||
OBJS=ifconfig.o bridge.o iwconfig.o helper.o route.o vconfig.o main.o df.o base64.o
|
||||
|
||||
all: $(PROGS)
|
||||
|
||||
$(PROGS): $(OBJS)
|
||||
$(CC) $(CFLAGS) -shared -Wl,-soname,luanet -liw $(LDFLAGS) $^ -o $@
|
||||
|
||||
clean:
|
||||
rm -f $(PROGS) *.o *.so
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) -c $^ -o $@
|
|
@ -1,121 +0,0 @@
|
|||
/*
|
||||
* Base64.c
|
||||
* Copyright (c) 2006 Ryan Martell. (rdm4@martellventures.com)
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
* FFmpeg is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* FFmpeg is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with FFmpeg; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <lua.h>
|
||||
#include <lualib.h>
|
||||
#include <lauxlib.h>
|
||||
|
||||
|
||||
unsigned char map2[] =
|
||||
{
|
||||
0x3e, 0xff, 0xff, 0xff, 0x3f, 0x34, 0x35, 0x36,
|
||||
0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01,
|
||||
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
|
||||
0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
|
||||
0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x1b,
|
||||
0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
|
||||
0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
|
||||
0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33
|
||||
};
|
||||
|
||||
int b64_decode(lua_State *L)
|
||||
{
|
||||
int i, v;
|
||||
unsigned char out[512];
|
||||
unsigned char *dst = out;
|
||||
char *in;
|
||||
if(lua_gettop(L) != 1)
|
||||
{
|
||||
lua_pushstring(L, "invalid arg list");
|
||||
lua_error(L);
|
||||
return 0;
|
||||
}
|
||||
in = (char *)lua_tostring (L, 1);
|
||||
v = 0;
|
||||
for (i = 0; in[i] && in[i] != '='; i++) {
|
||||
unsigned int index= in[i]-43;
|
||||
if (index>=(sizeof(map2)/sizeof(map2[0])) || map2[index] == 0xff)
|
||||
return -1;
|
||||
v = (v << 6) + map2[index];
|
||||
if (i & 3) {
|
||||
if (dst - out < 512) {
|
||||
*dst++ = v >> (6 - 2 * (i & 3));
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!(dst - out))
|
||||
return 0;
|
||||
lua_pushlstring(L, (char*)out, dst - out);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* b64_encode: stolen from VLC's http.c
|
||||
* simplified by michael
|
||||
* fixed edge cases and made it work from data (vs. strings) by ryan.
|
||||
*****************************************************************************/
|
||||
|
||||
int b64_encode(lua_State *L)
|
||||
{
|
||||
static const char b64[] =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
char *ret, *dst, *src, tmp[1024];
|
||||
unsigned i_bits = 0;
|
||||
int i_shift = 0;
|
||||
int bytes_remaining, len;
|
||||
if(lua_gettop(L) != 1)
|
||||
{
|
||||
lua_pushstring(L, "invalid arg list");
|
||||
lua_error(L);
|
||||
return 0;
|
||||
}
|
||||
src = (char *)lua_tostring (L, 1);
|
||||
bytes_remaining = len = strlen(src);
|
||||
if (len < 512) {
|
||||
ret = dst = tmp;
|
||||
} else
|
||||
return 0;
|
||||
|
||||
if (len) { // special edge case, what should we really do here?
|
||||
while (bytes_remaining) {
|
||||
i_bits = (i_bits << 8) + *src++;
|
||||
bytes_remaining--;
|
||||
i_shift += 8;
|
||||
|
||||
do {
|
||||
*dst++ = b64[(i_bits << 6 >> i_shift) & 0x3f];
|
||||
i_shift -= 6;
|
||||
} while (i_shift > 6 || (bytes_remaining == 0 && i_shift > 0));
|
||||
}
|
||||
while ((dst - ret) & 3)
|
||||
*dst++ = '=';
|
||||
}
|
||||
*dst = '\0';
|
||||
lua_pushstring(L, tmp);
|
||||
return 1;
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
/*
|
||||
* Base64.c
|
||||
* Copyright (c) 2006 Ryan Martell. (rdm4@martellventures.com)
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
* FFmpeg is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* FFmpeg is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with FFmpeg; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
int b64_decode(lua_State *L);
|
||||
int b64_encode(lua_State *L);
|
|
@ -1,171 +0,0 @@
|
|||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Copyright (C) 2008 John Crispin <blogic@openwrt.org>
|
||||
* Copyright (C) 2008 Steven Barth <steven@midlink.org>
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <net/if.h>
|
||||
#include <linux/sockios.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <lua.h>
|
||||
#include <lualib.h>
|
||||
#include <lauxlib.h>
|
||||
|
||||
static int sock_bridge = 0;
|
||||
int bridge_startup()
|
||||
{
|
||||
if(!sock_bridge)
|
||||
sock_bridge = socket(AF_LOCAL, SOCK_STREAM, 0);
|
||||
return sock_bridge;
|
||||
}
|
||||
|
||||
void bridge_shutdown(void)
|
||||
{
|
||||
if(!sock_bridge)
|
||||
return;
|
||||
close(sock_bridge);
|
||||
sock_bridge = 0;
|
||||
}
|
||||
|
||||
static inline int _bridge_new(lua_State *L, int i)
|
||||
{
|
||||
char *ifname;
|
||||
if(lua_gettop(L) != 1)
|
||||
{
|
||||
lua_pushstring(L, "invalid arg list");
|
||||
lua_error(L);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ifname = (char *)lua_tostring (L, 1);
|
||||
if(!ioctl(sock_bridge, i, ifname))
|
||||
lua_pushboolean(L, 1);
|
||||
else
|
||||
lua_pushboolean(L, 0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int bridge_new(lua_State *L)
|
||||
{
|
||||
return _bridge_new(L, SIOCBRADDBR);
|
||||
}
|
||||
|
||||
int bridge_del(lua_State *L)
|
||||
{
|
||||
return _bridge_new(L, SIOCBRDELBR);
|
||||
}
|
||||
|
||||
static inline int _bridge_addif(lua_State *L, int i)
|
||||
{
|
||||
struct ifreq ifr;
|
||||
char *br, *ifname;
|
||||
if(lua_gettop(L) != 2)
|
||||
{
|
||||
lua_pushstring(L, "invalid arg list");
|
||||
lua_error(L);
|
||||
return 0;
|
||||
}
|
||||
br = (char *)lua_tostring (L, 1);
|
||||
ifname = (char *)lua_tostring (L, 2);
|
||||
strncpy(ifr.ifr_name, br, IFNAMSIZ);
|
||||
ifr.ifr_ifindex = if_nametoindex(ifname);
|
||||
if(ifr.ifr_ifindex == 0)
|
||||
{
|
||||
lua_pushboolean(L, 0);
|
||||
return 1;
|
||||
}
|
||||
if(!ioctl(sock_bridge, i, &ifr))
|
||||
lua_pushboolean(L, 1);
|
||||
else
|
||||
lua_pushboolean(L, 0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int bridge_addif(lua_State *L)
|
||||
{
|
||||
return _bridge_addif(L, SIOCBRADDIF);
|
||||
}
|
||||
|
||||
int bridge_delif(lua_State *L)
|
||||
{
|
||||
return _bridge_addif(L, SIOCBRDELIF);
|
||||
}
|
||||
|
||||
#define SYSFS_PATH_MAX 512
|
||||
#define SYSFS_CLASS_NET "/sys/class/net/"
|
||||
static int isbridge(const struct dirent *entry)
|
||||
{
|
||||
char path[SYSFS_PATH_MAX];
|
||||
struct stat st;
|
||||
|
||||
snprintf(path, SYSFS_PATH_MAX, SYSFS_CLASS_NET "%s/bridge", entry->d_name);
|
||||
return stat(path, &st) == 0 && S_ISDIR(st.st_mode);
|
||||
}
|
||||
|
||||
static int isdev(const struct dirent *entry)
|
||||
{
|
||||
if(*entry->d_name == '.')
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline void bridge_getifs(lua_State *L, const char *ifname)
|
||||
{
|
||||
struct dirent **namelist;
|
||||
int i, count = 0;
|
||||
char path[SYSFS_PATH_MAX];
|
||||
snprintf(path, SYSFS_PATH_MAX, SYSFS_CLASS_NET "%s/brif", ifname);
|
||||
count = scandir(path, &namelist, isdev, alphasort);
|
||||
if(count < 0)
|
||||
return;
|
||||
|
||||
for(i = 0; i < count; i++)
|
||||
{
|
||||
lua_pushinteger(L, i + 1);
|
||||
lua_pushstring(L, namelist[i]->d_name);
|
||||
lua_settable(L, -3);
|
||||
free(namelist[i]);
|
||||
}
|
||||
free(namelist);
|
||||
return;
|
||||
}
|
||||
|
||||
int bridge_getall(lua_State *L)
|
||||
{
|
||||
struct dirent **namelist;
|
||||
int i, count = 0;
|
||||
count = scandir(SYSFS_CLASS_NET, &namelist, isbridge, alphasort);
|
||||
if (count < 0)
|
||||
return 0;
|
||||
|
||||
lua_newtable(L);
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
lua_pushstring(L, namelist[i]->d_name);
|
||||
lua_newtable(L);
|
||||
bridge_getifs(L, namelist[i]->d_name);
|
||||
free(namelist[i]);
|
||||
lua_settable(L, -3);
|
||||
}
|
||||
free(namelist);
|
||||
return 1;
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Copyright (C) 2008 John Crispin <blogic@openwrt.org>
|
||||
* Copyright (C) 2008 Steven Barth <steven@midlink.org>
|
||||
*/
|
||||
|
||||
#ifndef _BRIDGE_H__
|
||||
#define _BRIDGE_H__
|
||||
int bridge_startup(void);
|
||||
void bridge_shutdown(void);
|
||||
int bridge_new(lua_State *L);
|
||||
int bridge_del(lua_State *L);
|
||||
int bridge_addif(lua_State *L);
|
||||
int bridge_delif(lua_State *L);
|
||||
int bridge_getall(lua_State *L);
|
||||
#endif
|
|
@ -1,122 +0,0 @@
|
|||
/* based on busybox code */
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <mntent.h>
|
||||
#include <sys/vfs.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <lua.h>
|
||||
#include <lualib.h>
|
||||
#include <lauxlib.h>
|
||||
|
||||
#include "helper.h"
|
||||
|
||||
struct mntent *find_mount_point(const char *name, const char *table)
|
||||
{
|
||||
struct stat s;
|
||||
dev_t mountDevice;
|
||||
FILE *mountTable;
|
||||
struct mntent *mountEntry;
|
||||
|
||||
if (stat(name, &s) != 0)
|
||||
return 0;
|
||||
|
||||
if ((s.st_mode & S_IFMT) == S_IFBLK)
|
||||
mountDevice = s.st_rdev;
|
||||
else
|
||||
mountDevice = s.st_dev;
|
||||
|
||||
|
||||
mountTable = setmntent(table ? table : "/etc/mtab", "r");
|
||||
if (!mountTable)
|
||||
return 0;
|
||||
|
||||
while ((mountEntry = getmntent(mountTable)) != 0) {
|
||||
if (strcmp(name, mountEntry->mnt_dir) == 0
|
||||
|| strcmp(name, mountEntry->mnt_fsname) == 0
|
||||
) { /* String match. */
|
||||
break;
|
||||
}
|
||||
if (stat(mountEntry->mnt_fsname, &s) == 0 && s.st_rdev == mountDevice) /* Match the device. */
|
||||
break;
|
||||
if (stat(mountEntry->mnt_dir, &s) == 0 && s.st_dev == mountDevice) /* Match the directory's mount point. */
|
||||
break;
|
||||
}
|
||||
endmntent(mountTable);
|
||||
return mountEntry;
|
||||
}
|
||||
|
||||
static unsigned long kscale(unsigned long b, unsigned long bs)
|
||||
{
|
||||
return (b * (unsigned long long) bs + 1024/2) / 1024;
|
||||
}
|
||||
|
||||
int df(lua_State *L)
|
||||
{
|
||||
unsigned long blocks_used;
|
||||
unsigned blocks_percent_used;
|
||||
FILE *mount_table;
|
||||
struct mntent *mount_entry = 0;
|
||||
struct statfs s;
|
||||
/* default display is kilobytes */
|
||||
const char *disp_units_hdr = "1k-blocks";
|
||||
int cnt = 0;
|
||||
printf("Filesystem %-15sUsed Available Use%% Mounted on\n",
|
||||
disp_units_hdr);
|
||||
|
||||
mount_table = NULL;
|
||||
mount_table = setmntent("/etc/mtab", "r");
|
||||
lua_newtable(L);
|
||||
while (1) {
|
||||
const char *device;
|
||||
const char *mount_point;
|
||||
|
||||
if (mount_table) {
|
||||
mount_entry = getmntent(mount_table);
|
||||
if (!mount_entry) {
|
||||
endmntent(mount_table);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
device = mount_entry->mnt_fsname;
|
||||
mount_point = mount_entry->mnt_dir;
|
||||
|
||||
if (statfs(mount_point, &s) != 0) {
|
||||
perror(mount_point);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((s.f_blocks > 0) || !mount_table)
|
||||
{
|
||||
blocks_used = s.f_blocks - s.f_bfree;
|
||||
blocks_percent_used = 0;
|
||||
if (blocks_used + s.f_bavail)
|
||||
{
|
||||
blocks_percent_used = (blocks_used * 100ULL + (blocks_used + s.f_bavail) / 2 )
|
||||
/ (blocks_used + s.f_bavail);
|
||||
}
|
||||
lua_pushinteger(L, ++cnt);
|
||||
lua_newtable(L);
|
||||
|
||||
add_table_entry_int(L, "blocks", kscale(s.f_blocks, s.f_bsize));
|
||||
add_table_entry_int(L, "used", kscale(s.f_blocks-s.f_bfree, s.f_bsize));
|
||||
add_table_entry_int(L, "avail", kscale(s.f_bavail, s.f_bsize));
|
||||
add_table_entry_int(L, "percent", blocks_percent_used);
|
||||
add_table_entry(L, "device", device);
|
||||
add_table_entry(L, "mountpoint", mount_point);
|
||||
add_table_entry_int(L, "blocksize", s.f_bsize);
|
||||
lua_settable(L, -3);
|
||||
|
||||
/*printf("\n%-20s" + 1, device)
|
||||
printf(" %9lu %9lu %9lu %3u%% %s\n",
|
||||
kscale(s.f_blocks, s.f_bsize),
|
||||
kscale(s.f_blocks-s.f_bfree, s.f_bsize),
|
||||
kscale(s.f_bavail, s.f_bsize),
|
||||
blocks_percent_used, mount_point);*/
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Copyright (C) 2008 John Crispin <blogic@openwrt.org>
|
||||
* Copyright (C) 2008 Steven Barth <steven@midlink.org>
|
||||
*/
|
||||
|
||||
#ifndef _DF_H__
|
||||
#define _DF_H__
|
||||
|
||||
int df(lua_State *L);
|
||||
|
||||
#endif
|
|
@ -1,73 +0,0 @@
|
|||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Copyright (C) 2008 John Crispin <blogic@openwrt.org>
|
||||
* Copyright (C) 2008 Steven Barth <steven@midlink.org>
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <lua.h>
|
||||
#include <lualib.h>
|
||||
#include <lauxlib.h>
|
||||
|
||||
int char2ipv4(char *c, char *ip)
|
||||
{
|
||||
int i;
|
||||
char *tmp = strdup(c);
|
||||
char *t = tmp;
|
||||
char *e = NULL;
|
||||
int ret = -1;
|
||||
for(i = 0; i < 4; i++)
|
||||
{
|
||||
int j = strtol(t, &e, 10);
|
||||
if((j < 0) || (j > 255))
|
||||
goto error;
|
||||
if(i != 3)
|
||||
if(*e != '.')
|
||||
goto error;
|
||||
*ip++ = j;
|
||||
t = e + 1;
|
||||
}
|
||||
ret = 0;
|
||||
error:
|
||||
free(tmp);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void ipv42char(char *b, char *ip)
|
||||
{
|
||||
sprintf(ip, "%d.%d.%d.%d", b[0] & 0xff, b[1] & 0xff, b[2] & 0xff, b[3] & 0xff);
|
||||
}
|
||||
|
||||
void mac2char(char *b, char *mac)
|
||||
{
|
||||
sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X",
|
||||
b[0] & 0xff, b[1] & 0xff, b[2] & 0xff, b[3] & 0xff, b[4] & 0xff, b[5] & 0xff);
|
||||
}
|
||||
|
||||
void add_table_entry(lua_State *L, const char *k, const char *v)
|
||||
{
|
||||
lua_pushstring(L, k);
|
||||
lua_pushstring(L, v);
|
||||
lua_settable(L, -3);
|
||||
}
|
||||
|
||||
void add_table_entry_int(lua_State *L, const char *k, int v)
|
||||
{
|
||||
lua_pushstring(L, k);
|
||||
lua_pushinteger(L, v);
|
||||
lua_settable(L, -3);
|
||||
}
|
|
@ -1,31 +0,0 @@
|
|||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Copyright (C) 2008 John Crispin <blogic@openwrt.org>
|
||||
* Copyright (C) 2008 Steven Barth <steven@midlink.org>
|
||||
*/
|
||||
|
||||
#ifndef _HELPER_H__
|
||||
#define _HELPER_H__
|
||||
|
||||
#include <lua.h>
|
||||
#include <lualib.h>
|
||||
#include <lauxlib.h>
|
||||
|
||||
int char2ipv4(char *c, char *ip);
|
||||
void ipv42char(char *b, char *ip);
|
||||
void mac2char(char *b, char *mac);
|
||||
void add_table_entry(lua_State *L, const char *k, const char *v);
|
||||
void add_table_entry_int(lua_State *L, const char *k, int v);
|
||||
|
||||
#endif
|
|
@ -1,250 +0,0 @@
|
|||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Copyright (C) 2008 John Crispin <blogic@openwrt.org>
|
||||
* Copyright (C) 2008 Steven Barth <steven@midlink.org>
|
||||
*/
|
||||
|
||||
#include <net/if.h>
|
||||
#include <net/if_arp.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <linux/sockios.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <lua.h>
|
||||
#include <lualib.h>
|
||||
#include <lauxlib.h>
|
||||
|
||||
#include "helper.h"
|
||||
|
||||
int sock_ifconfig = 0;
|
||||
|
||||
int ifc_startup(void)
|
||||
{
|
||||
if(!sock_ifconfig)
|
||||
sock_ifconfig = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
return sock_ifconfig;
|
||||
}
|
||||
|
||||
void ifc_shutdown(void)
|
||||
{
|
||||
if(!sock_ifconfig)
|
||||
return;
|
||||
close(sock_ifconfig);
|
||||
sock_ifconfig = 0;
|
||||
}
|
||||
|
||||
static int isdev(const struct dirent *entry)
|
||||
{
|
||||
if(*entry->d_name == '.')
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void ifc_addif(lua_State *L, char *ifname)
|
||||
{
|
||||
char *ip = malloc(32);
|
||||
struct ifreq ifr;
|
||||
lua_pushstring(L, ifname);
|
||||
lua_newtable(L);
|
||||
strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
|
||||
|
||||
if(!ioctl(sock_ifconfig, SIOCGIFADDR, &ifr))
|
||||
{
|
||||
ipv42char(&ifr.ifr_addr.sa_data[2], ip);
|
||||
add_table_entry(L, "ip", ip);
|
||||
}
|
||||
|
||||
if(!ioctl(sock_ifconfig, SIOCGIFNETMASK, &ifr))
|
||||
{
|
||||
ipv42char(&ifr.ifr_netmask.sa_data[2], ip);
|
||||
add_table_entry(L, "netmask", ip);
|
||||
}
|
||||
|
||||
if(!ioctl(sock_ifconfig, SIOCGIFBRDADDR, &ifr))
|
||||
{
|
||||
ipv42char(&ifr.ifr_broadaddr.sa_data[2], ip);
|
||||
add_table_entry(L, "broadaddr", ip);
|
||||
}
|
||||
|
||||
if(!ioctl(sock_ifconfig, SIOCGIFHWADDR, &ifr))
|
||||
{
|
||||
mac2char(ifr.ifr_hwaddr.sa_data, ip);
|
||||
add_table_entry(L, "mac", ip);
|
||||
}
|
||||
|
||||
if(!ioctl(sock_ifconfig, SIOCGIFFLAGS, &ifr))
|
||||
{
|
||||
if(ifr.ifr_flags & IFF_UP)
|
||||
add_table_entry(L, "up", "1");
|
||||
else
|
||||
add_table_entry(L, "up", "0");
|
||||
}
|
||||
|
||||
ioctl(sock_ifconfig, SIOCGIFMTU, &ifr);
|
||||
lua_pushstring(L, "mtu");
|
||||
lua_pushinteger(L, ifr.ifr_mtu);
|
||||
lua_settable(L, -3);
|
||||
free(ip);
|
||||
lua_settable(L, -3);
|
||||
}
|
||||
|
||||
#define SYSFS_CLASS_NET "/sys/class/net/"
|
||||
int ifc_getall(lua_State *L)
|
||||
{
|
||||
int numreqs = 50;
|
||||
struct dirent **namelist;
|
||||
int i, count = 0;
|
||||
struct ifconf ifc;
|
||||
struct ifreq *ifr;
|
||||
ifc.ifc_buf = NULL;
|
||||
count = scandir(SYSFS_CLASS_NET, &namelist, isdev, alphasort);
|
||||
if (count < 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
lua_newtable(L);
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
ifc_addif(L, namelist[i]->d_name);
|
||||
free(namelist[i]);
|
||||
}
|
||||
free(namelist);
|
||||
|
||||
ifc.ifc_len = sizeof(struct ifreq) * numreqs;
|
||||
ifc.ifc_buf = malloc(ifc.ifc_len);
|
||||
if(ioctl(sock_ifconfig, SIOCGIFCONF, &ifc) < 0)
|
||||
goto out;
|
||||
ifr = ifc.ifc_req;
|
||||
for(i = 0; i < ifc.ifc_len; i += sizeof(struct ifreq))
|
||||
{
|
||||
if(strchr(ifr->ifr_name, ':'))
|
||||
ifc_addif(L, ifr->ifr_name);
|
||||
ifr++;
|
||||
}
|
||||
out:
|
||||
free(ifc.ifc_buf);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int _ifc_setip(lua_State *L, int i)
|
||||
{
|
||||
struct ifreq ifr;
|
||||
char *ifname, *ip;
|
||||
if(lua_gettop(L) != 2)
|
||||
{
|
||||
lua_pushstring(L, "invalid arg list");
|
||||
lua_error(L);
|
||||
return 0;
|
||||
}
|
||||
ifname = (char *)lua_tostring (L, 1);
|
||||
ip = (char *)lua_tostring (L, 2);
|
||||
strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
|
||||
ifr.ifr_addr.sa_family = AF_INET;
|
||||
if(char2ipv4(ip, &ifr.ifr_addr.sa_data[2]))
|
||||
{
|
||||
lua_pushstring(L, "invalid ip");
|
||||
lua_error(L);
|
||||
return 0;
|
||||
}
|
||||
if(!ioctl(sock_ifconfig, i, &ifr))
|
||||
lua_pushboolean(L, 1);
|
||||
else
|
||||
lua_pushboolean(L, 0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ifc_setip(lua_State *L)
|
||||
{
|
||||
return _ifc_setip(L, SIOCSIFADDR);
|
||||
}
|
||||
|
||||
int ifc_setnetmask(lua_State *L)
|
||||
{
|
||||
return _ifc_setip(L, SIOCGIFNETMASK);
|
||||
}
|
||||
|
||||
int ifc_setbroadcast(lua_State *L)
|
||||
{
|
||||
return _ifc_setip(L, SIOCSIFBRDADDR);
|
||||
}
|
||||
|
||||
int ifc_setmtu(lua_State *L)
|
||||
{
|
||||
struct ifreq ifr;
|
||||
char *ifname;
|
||||
int mtu;
|
||||
if(lua_gettop(L) != 2)
|
||||
{
|
||||
lua_pushstring(L, "invalid arg list");
|
||||
lua_error(L);
|
||||
return 0;
|
||||
}
|
||||
ifname = (char *)lua_tostring (L, 1);
|
||||
mtu = (int)lua_tointeger (L, 2);
|
||||
strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
|
||||
ifr.ifr_mtu = mtu;
|
||||
if(!ioctl(sock_ifconfig, SIOCSIFMTU, &ifr))
|
||||
lua_pushboolean(L, 1);
|
||||
else
|
||||
lua_pushboolean(L, 0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int _ifc_up(lua_State *L, int up)
|
||||
{
|
||||
struct ifreq ifr;
|
||||
char *ifname;
|
||||
if(lua_gettop(L) != 1)
|
||||
{
|
||||
lua_pushstring(L, "invalid arg list");
|
||||
lua_error(L);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ifname = (char *)lua_tostring (L, 1);
|
||||
strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
|
||||
|
||||
if(ioctl(sock_ifconfig, SIOCGIFFLAGS, &ifr) < 0)
|
||||
{
|
||||
lua_pushboolean(L, 0);
|
||||
return 1;
|
||||
}
|
||||
if(up)
|
||||
ifr.ifr_flags |= IFF_UP | IFF_RUNNING;
|
||||
else
|
||||
ifr.ifr_flags &= ~IFF_UP;
|
||||
if(!ioctl(sock_ifconfig, SIOCSIFFLAGS, &ifr))
|
||||
lua_pushboolean(L, 1);
|
||||
else
|
||||
lua_pushboolean(L, 0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ifc_up(lua_State *L)
|
||||
{
|
||||
return _ifc_up(L, 1);
|
||||
}
|
||||
|
||||
int ifc_down(lua_State *L)
|
||||
{
|
||||
return _ifc_up(L, 0);
|
||||
}
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Copyright (C) 2008 John Crispin <blogic@openwrt.org>
|
||||
* Copyright (C) 2008 Steven Barth <steven@midlink.org>
|
||||
*/
|
||||
|
||||
#ifndef _IFCONFIG_H__
|
||||
#define _IFCONFIG_H__
|
||||
int ifc_startup(void);
|
||||
void ifc_shutdown(void);
|
||||
|
||||
int ifc_getall(lua_State *L);
|
||||
int ifc_setip(lua_State *L);
|
||||
int ifc_setnetmask(lua_State *L);
|
||||
int ifc_setbroadcast(lua_State *L);
|
||||
int ifc_setmtu(lua_State *L);
|
||||
int ifc_up(lua_State *L);
|
||||
int ifc_down(lua_State *L);
|
||||
#endif
|
|
@ -1,881 +0,0 @@
|
|||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Copyright (C) 2008 John Crispin <blogic@openwrt.org>
|
||||
* Copyright (C) 2008 Steven Barth <steven@midlink.org>
|
||||
* Copyright (C) 2009 Jo-Philipp Wich <xm@subsignal.org>
|
||||
*/
|
||||
|
||||
#include <net/if.h>
|
||||
#include <net/if_arp.h>
|
||||
#include <net/route.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <linux/sockios.h>
|
||||
#include "iwlib.h"
|
||||
|
||||
#include <lua.h>
|
||||
#include <lualib.h>
|
||||
#include <lauxlib.h>
|
||||
|
||||
#include "helper.h"
|
||||
|
||||
static int sock_iwconfig = 0;
|
||||
|
||||
typedef struct iwscan_state
|
||||
{
|
||||
/* State */
|
||||
int ap_num; /* Access Point number 1->N */
|
||||
int val_index; /* Value in table 0->(N-1) */
|
||||
} iwscan_state;
|
||||
|
||||
int iwc_startup(void)
|
||||
{
|
||||
if(!sock_iwconfig)
|
||||
sock_iwconfig = iw_sockets_open();
|
||||
return sock_iwconfig;
|
||||
}
|
||||
|
||||
void iwc_shutdown(void)
|
||||
{
|
||||
if(!sock_iwconfig)
|
||||
return;
|
||||
iw_sockets_close(sock_iwconfig);
|
||||
sock_iwconfig = 0;
|
||||
}
|
||||
|
||||
/* taken from wireless tools */
|
||||
static int
|
||||
get_info(char * ifname, struct wireless_info * info)
|
||||
{
|
||||
struct iwreq wrq;
|
||||
|
||||
memset((char*) info, 0, sizeof(struct wireless_info));
|
||||
|
||||
/* Get basic information */
|
||||
if(iw_get_basic_config(sock_iwconfig, ifname, &(info->b)) < 0)
|
||||
{
|
||||
/* If no wireless name : no wireless extensions */
|
||||
/* But let's check if the interface exists at all */
|
||||
struct ifreq ifr;
|
||||
|
||||
strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
|
||||
if(ioctl(sock_iwconfig, SIOCGIFFLAGS, &ifr) < 0)
|
||||
return(-ENODEV);
|
||||
else
|
||||
return(-ENOTSUP);
|
||||
}
|
||||
|
||||
/* Get ranges */
|
||||
if(iw_get_range_info(sock_iwconfig, ifname, &(info->range)) >= 0)
|
||||
info->has_range = 1;
|
||||
|
||||
/* Get AP address */
|
||||
if(iw_get_ext(sock_iwconfig, ifname, SIOCGIWAP, &wrq) >= 0)
|
||||
{
|
||||
info->has_ap_addr = 1;
|
||||
memcpy(&(info->ap_addr), &(wrq.u.ap_addr), sizeof (sockaddr));
|
||||
}
|
||||
|
||||
/* Get bit rate */
|
||||
if(iw_get_ext(sock_iwconfig, ifname, SIOCGIWRATE, &wrq) >= 0)
|
||||
{
|
||||
info->has_bitrate = 1;
|
||||
memcpy(&(info->bitrate), &(wrq.u.bitrate), sizeof(iwparam));
|
||||
}
|
||||
|
||||
/* Get Power Management settings */
|
||||
wrq.u.power.flags = 0;
|
||||
if(iw_get_ext(sock_iwconfig, ifname, SIOCGIWPOWER, &wrq) >= 0)
|
||||
{
|
||||
info->has_power = 1;
|
||||
memcpy(&(info->power), &(wrq.u.power), sizeof(iwparam));
|
||||
}
|
||||
|
||||
/* Get stats */
|
||||
if(iw_get_stats(sock_iwconfig, ifname, &(info->stats),
|
||||
&info->range, info->has_range) >= 0)
|
||||
{
|
||||
info->has_stats = 1;
|
||||
}
|
||||
|
||||
/* Get NickName */
|
||||
wrq.u.essid.pointer = (caddr_t) info->nickname;
|
||||
wrq.u.essid.length = IW_ESSID_MAX_SIZE + 1;
|
||||
wrq.u.essid.flags = 0;
|
||||
if(iw_get_ext(sock_iwconfig, ifname, SIOCGIWNICKN, &wrq) >= 0)
|
||||
if(wrq.u.data.length > 1)
|
||||
info->has_nickname = 1;
|
||||
|
||||
if((info->has_range) && (info->range.we_version_compiled > 9))
|
||||
{
|
||||
/* Get Transmit Power */
|
||||
if(iw_get_ext(sock_iwconfig, ifname, SIOCGIWTXPOW, &wrq) >= 0)
|
||||
{
|
||||
info->has_txpower = 1;
|
||||
memcpy(&(info->txpower), &(wrq.u.txpower), sizeof(iwparam));
|
||||
}
|
||||
}
|
||||
|
||||
/* Get sensitivity */
|
||||
if(iw_get_ext(sock_iwconfig, ifname, SIOCGIWSENS, &wrq) >= 0)
|
||||
{
|
||||
info->has_sens = 1;
|
||||
memcpy(&(info->sens), &(wrq.u.sens), sizeof(iwparam));
|
||||
}
|
||||
|
||||
if((info->has_range) && (info->range.we_version_compiled > 10))
|
||||
{
|
||||
/* Get retry limit/lifetime */
|
||||
if(iw_get_ext(sock_iwconfig, ifname, SIOCGIWRETRY, &wrq) >= 0)
|
||||
{
|
||||
info->has_retry = 1;
|
||||
memcpy(&(info->retry), &(wrq.u.retry), sizeof(iwparam));
|
||||
}
|
||||
}
|
||||
|
||||
/* Get RTS threshold */
|
||||
if(iw_get_ext(sock_iwconfig, ifname, SIOCGIWRTS, &wrq) >= 0)
|
||||
{
|
||||
info->has_rts = 1;
|
||||
memcpy(&(info->rts), &(wrq.u.rts), sizeof(iwparam));
|
||||
}
|
||||
|
||||
/* Get fragmentation threshold */
|
||||
if(iw_get_ext(sock_iwconfig, ifname, SIOCGIWFRAG, &wrq) >= 0)
|
||||
{
|
||||
info->has_frag = 1;
|
||||
memcpy(&(info->frag), &(wrq.u.frag), sizeof(iwparam));
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
void iwc_get(lua_State *L, char *ifname)
|
||||
{
|
||||
struct wireless_info info;
|
||||
int rc = get_info(ifname, &info);
|
||||
char buffer[128];
|
||||
if(rc)
|
||||
return;
|
||||
|
||||
lua_pushstring(L, ifname);
|
||||
lua_newtable(L);
|
||||
|
||||
if(info.b.has_essid)
|
||||
{
|
||||
if(info.b.essid_on)
|
||||
add_table_entry(L, "essid", info.b.essid);
|
||||
else
|
||||
add_table_entry(L, "essid", "off");
|
||||
}
|
||||
|
||||
if(info.b.has_mode)
|
||||
add_table_entry(L, "mode", iw_operation_mode[info.b.mode]);
|
||||
|
||||
if(info.b.has_freq)
|
||||
{
|
||||
double freq = info.b.freq; /* Frequency/channel */
|
||||
int channel = -1; /* Converted to channel */
|
||||
char tmp[4];
|
||||
if(info.has_range && (freq < KILO))
|
||||
channel = iw_channel_to_freq((int) freq, &freq, &info.range);
|
||||
iw_print_freq(buffer, sizeof(buffer), freq, -1, info.b.freq_flags);
|
||||
snprintf(tmp, 4, "%d", channel);
|
||||
add_table_entry(L, "channel", tmp);
|
||||
add_table_entry(L, "freq", buffer);
|
||||
}
|
||||
|
||||
if(info.has_ap_addr)
|
||||
add_table_entry(L, "macap", iw_sawap_ntop(&info.ap_addr, buffer));
|
||||
|
||||
if(info.has_bitrate)
|
||||
{
|
||||
iw_print_bitrate(buffer, sizeof(buffer), info.bitrate.value);
|
||||
add_table_entry(L, "bitrate", buffer);
|
||||
}
|
||||
|
||||
if(info.has_txpower)
|
||||
{
|
||||
iw_print_txpower(buffer, sizeof(buffer), &info.txpower);
|
||||
add_table_entry(L, "txpower", buffer);
|
||||
}
|
||||
lua_settable(L, -3);
|
||||
}
|
||||
|
||||
int iwc_getall(lua_State *L)
|
||||
{
|
||||
FILE *fp;
|
||||
char buffer[128];
|
||||
char *b = buffer;
|
||||
fp = fopen("/proc/net/wireless", "r");
|
||||
if(!fp)
|
||||
return -1;
|
||||
fgets(buffer, 128, fp);
|
||||
fgets(buffer, 128, fp);
|
||||
lua_newtable(L);
|
||||
while(fgets(buffer, 128, fp))
|
||||
{
|
||||
char *t;
|
||||
b = buffer;
|
||||
while(*b == ' ')
|
||||
b++;
|
||||
t = strstr(b, ":");
|
||||
if(t)
|
||||
*t = '\0';
|
||||
iwc_get(L, b);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* taken from wireless tools */
|
||||
int iwc_set_essid(lua_State *L)
|
||||
{
|
||||
struct iwreq wrq;
|
||||
int i = 1;
|
||||
char essid[IW_ESSID_MAX_SIZE + 1];
|
||||
int we_kernel_version;
|
||||
char *ifname, *e;
|
||||
if(lua_gettop(L) != 2)
|
||||
{
|
||||
lua_pushstring(L, "invalid arg list");
|
||||
lua_error(L);
|
||||
return 0;
|
||||
}
|
||||
ifname = (char *)lua_tostring (L, 1);
|
||||
e = (char *)lua_tostring (L, 2);
|
||||
|
||||
if((!strcasecmp(e, "off")) | (!strcasecmp(e, "any")))
|
||||
{
|
||||
wrq.u.essid.flags = 0;
|
||||
essid[0] = '\0';
|
||||
} else if(!strcasecmp(e, "on"))
|
||||
{
|
||||
/* Get old essid */
|
||||
memset(essid, '\0', sizeof(essid));
|
||||
wrq.u.essid.pointer = (caddr_t) essid;
|
||||
wrq.u.essid.length = IW_ESSID_MAX_SIZE + 1;
|
||||
wrq.u.essid.flags = 0;
|
||||
if(iw_get_ext(sock_iwconfig, ifname, SIOCGIWESSID, &wrq) < 0)
|
||||
return 0;
|
||||
wrq.u.essid.flags = 1;
|
||||
} else {
|
||||
wrq.u.essid.flags = 1;
|
||||
strcpy(essid, e); /* Size checked, all clear */
|
||||
i++;
|
||||
}
|
||||
|
||||
/* Get version from kernel, device may not have range... */
|
||||
we_kernel_version = iw_get_kernel_we_version();
|
||||
|
||||
/* Finally set the ESSID value */
|
||||
wrq.u.essid.pointer = (caddr_t) essid;
|
||||
wrq.u.essid.length = strlen(essid);
|
||||
if(we_kernel_version < 21)
|
||||
wrq.u.essid.length++;
|
||||
|
||||
if(!iw_set_ext(sock_iwconfig, ifname, SIOCSIWESSID, &wrq))
|
||||
lua_pushboolean(L, 1);
|
||||
else
|
||||
lua_pushboolean(L, 0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* taken from wireless tools */
|
||||
int iwc_set_mode(lua_State *L)
|
||||
{
|
||||
struct iwreq wrq;
|
||||
unsigned int k; /* Must be unsigned */
|
||||
char *ifname, *mode;
|
||||
|
||||
if(lua_gettop(L) != 2)
|
||||
{
|
||||
lua_pushstring(L, "invalid arg list");
|
||||
lua_error(L);
|
||||
return 0;
|
||||
}
|
||||
ifname = (char *)lua_tostring (L, 1);
|
||||
mode = (char *)lua_tostring (L, 2);
|
||||
|
||||
/* Check if it is a uint, otherwise get is as a string */
|
||||
if(sscanf(mode, "%ui", &k) != 1)
|
||||
{
|
||||
k = 0;
|
||||
while((k < IW_NUM_OPER_MODE) && strncasecmp(mode, iw_operation_mode[k], 3))
|
||||
k++;
|
||||
}
|
||||
if(k >= IW_NUM_OPER_MODE)
|
||||
return 0;
|
||||
|
||||
wrq.u.mode = k;
|
||||
if(!iw_set_ext(sock_iwconfig, ifname, SIOCSIWMODE, &wrq))
|
||||
lua_pushboolean(L, 1);
|
||||
else
|
||||
lua_pushboolean(L, 0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int iwc_set_channel(lua_State *L)
|
||||
{
|
||||
struct iwreq wrq;
|
||||
char *ifname;
|
||||
int channel;
|
||||
if(lua_gettop(L) != 2)
|
||||
{
|
||||
lua_pushstring(L, "invalid arg list");
|
||||
lua_error(L);
|
||||
return 0;
|
||||
}
|
||||
ifname = (char *)lua_tostring (L, 1);
|
||||
channel = (int)lua_tointeger(L, 2);
|
||||
|
||||
if(channel == -1)
|
||||
{
|
||||
wrq.u.freq.m = -1;
|
||||
wrq.u.freq.e = 0;
|
||||
wrq.u.freq.flags = 0;
|
||||
} else {
|
||||
iw_float2freq(channel, &wrq.u.freq);
|
||||
wrq.u.freq.flags = IW_FREQ_FIXED;
|
||||
}
|
||||
if(!iw_set_ext(sock_iwconfig, ifname, SIOCSIWFREQ, &wrq))
|
||||
lua_pushboolean(L, 1);
|
||||
else
|
||||
lua_pushboolean(L, 0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const char * iw_ie_cypher_name[] = {
|
||||
"none",
|
||||
"WEP-40",
|
||||
"TKIP",
|
||||
"WRAP",
|
||||
"CCMP",
|
||||
"WEP-104",
|
||||
};
|
||||
#define IW_ARRAY_LEN(x) (sizeof(x)/sizeof((x)[0]))
|
||||
#define IW_IE_CYPHER_NUM IW_ARRAY_LEN(iw_ie_cypher_name)
|
||||
|
||||
static const char * iw_ie_key_mgmt_name[] = {
|
||||
"none",
|
||||
"802.1x",
|
||||
"PSK",
|
||||
};
|
||||
#define IW_IE_KEY_MGMT_NUM IW_ARRAY_LEN(iw_ie_key_mgmt_name)
|
||||
|
||||
static inline void iw_print_ie_wpa(lua_State *L, unsigned char * iebuf, int buflen)
|
||||
{
|
||||
int ielen = iebuf[1] + 2;
|
||||
int offset = 2; /* Skip the IE id, and the length. */
|
||||
unsigned char wpa1_oui[3] = {0x00, 0x50, 0xf2};
|
||||
unsigned char wpa2_oui[3] = {0x00, 0x0f, 0xac};
|
||||
unsigned char *wpa_oui;
|
||||
int i;
|
||||
uint16_t ver = 0;
|
||||
uint16_t cnt = 0;
|
||||
int wpa1 = 0, wpa2 = 0;
|
||||
char buf[256];
|
||||
if(ielen > buflen)
|
||||
ielen = buflen;
|
||||
|
||||
switch(iebuf[0])
|
||||
{
|
||||
case 0x30: /* WPA2 */
|
||||
/* Check if we have enough data */
|
||||
if(ielen < 4)
|
||||
return;
|
||||
wpa_oui = wpa2_oui;
|
||||
break;
|
||||
|
||||
case 0xdd: /* WPA or else */
|
||||
wpa_oui = wpa1_oui;
|
||||
/* Not all IEs that start with 0xdd are WPA.
|
||||
* * So check that the OUI is valid. */
|
||||
if((ielen < 8)
|
||||
|| ((memcmp(&iebuf[offset], wpa_oui, 3) != 0)
|
||||
&& (iebuf[offset+3] == 0x01)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
offset += 4;
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
/* Pick version number (little endian) */
|
||||
ver = iebuf[offset] | (iebuf[offset + 1] << 8);
|
||||
offset += 2;
|
||||
|
||||
if(iebuf[0] == 0xdd)
|
||||
wpa1 = 1;
|
||||
if(iebuf[0] == 0x30)
|
||||
wpa2 = 1;
|
||||
|
||||
if(ielen < (offset + 4))
|
||||
{
|
||||
if(wpa1)
|
||||
{
|
||||
add_table_entry(L, "wpa1gcipher", "TKIP");
|
||||
add_table_entry(L, "wpa1pcipher", "TKIP");
|
||||
} else {
|
||||
add_table_entry(L, "wpa2gcipher", "TKIP");
|
||||
add_table_entry(L, "wpa2pcipher", "TKIP");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if(memcmp(&iebuf[offset], wpa_oui, 3) != 0)
|
||||
{
|
||||
if(wpa1)
|
||||
add_table_entry(L, "wpa1gcipher", "Proprietary");
|
||||
else
|
||||
add_table_entry(L, "wpa2gcipher", "Proprietary");
|
||||
} else {
|
||||
if(wpa1)
|
||||
add_table_entry(L, "wpa1gcipher", iebuf[offset+3][iw_ie_cypher_name]);
|
||||
else
|
||||
add_table_entry(L, "wpa2gcipher", iebuf[offset+3][iw_ie_cypher_name]);
|
||||
}
|
||||
offset += 4;
|
||||
|
||||
if(ielen < (offset + 2))
|
||||
{
|
||||
if(wpa1)
|
||||
add_table_entry(L, "wpa1pcipher", "TKIP");
|
||||
else
|
||||
add_table_entry(L, "wpa2pcipher", "TKIP");
|
||||
return;
|
||||
}
|
||||
/* Otherwise, we have some number of pairwise ciphers. */
|
||||
cnt = iebuf[offset] | (iebuf[offset + 1] << 8);
|
||||
offset += 2;
|
||||
if(ielen < (offset + 4*cnt))
|
||||
return;
|
||||
*buf = '\0';
|
||||
for(i = 0; i < cnt; i++)
|
||||
{
|
||||
if(i > 0)
|
||||
strncat(buf, " ", 256);
|
||||
if(memcmp(&iebuf[offset], wpa_oui, 3) != 0)
|
||||
{
|
||||
strncat(buf, "Proprietary", 256);
|
||||
} else {
|
||||
if(iebuf[offset+3] <= IW_IE_CYPHER_NUM)
|
||||
strncat(buf, iw_ie_cypher_name[iebuf[offset+3]], 256);
|
||||
else
|
||||
strncat(buf, "unknown", 256);
|
||||
}
|
||||
offset+=4;
|
||||
}
|
||||
if(wpa1)
|
||||
add_table_entry(L, "wpa1pcipher", buf);
|
||||
else
|
||||
add_table_entry(L, "wpa2pcipher", buf);
|
||||
|
||||
/* Check if we are done */
|
||||
if(ielen < (offset + 2))
|
||||
return;
|
||||
|
||||
/* Now, we have authentication suites. */
|
||||
cnt = iebuf[offset] | (iebuf[offset + 1] << 8);
|
||||
offset += 2;
|
||||
*buf = '\0';
|
||||
if(ielen < (offset + 4*cnt))
|
||||
return;
|
||||
|
||||
for(i = 0; i < cnt; i++)
|
||||
{
|
||||
if(i != 0)
|
||||
strncat(buf, " ", 256);
|
||||
if(memcmp(&iebuf[offset], wpa_oui, 3) != 0)
|
||||
{
|
||||
strncat(buf, "Proprietary", 256);
|
||||
} else {
|
||||
if(iebuf[offset+3] <= IW_IE_KEY_MGMT_NUM)
|
||||
strncat(buf, iw_ie_key_mgmt_name[iebuf[offset+3]], 256);
|
||||
else
|
||||
strncat(buf, "unknown", 256);
|
||||
}
|
||||
offset+=4;
|
||||
}
|
||||
if(wpa1)
|
||||
add_table_entry(L, "wpa1auth", buf);
|
||||
else
|
||||
add_table_entry(L, "wpa2auth", buf);
|
||||
/* Check if we are done */
|
||||
if(ielen < (offset + 1))
|
||||
return;
|
||||
}
|
||||
|
||||
static inline void print_scanning_token(lua_State *L, struct stream_descr *stream,
|
||||
struct iw_event *event, struct iwscan_state *state, struct iw_range *iw_range, int has_range)
|
||||
{
|
||||
char buffer[128]; /* Temporary buffer */
|
||||
|
||||
/* Now, let's decode the event */
|
||||
switch(event->cmd)
|
||||
{
|
||||
case SIOCGIWAP:
|
||||
add_table_entry(L, "addr", iw_saether_ntop(&event->u.ap_addr, buffer));
|
||||
state->ap_num++;
|
||||
break;
|
||||
case SIOCGIWFREQ:
|
||||
{
|
||||
double freq; /* Frequency/channel */
|
||||
int channel = -1; /* Converted to channel */
|
||||
freq = iw_freq2float(&(event->u.freq));
|
||||
/* Convert to channel if possible */
|
||||
if(has_range)
|
||||
channel = iw_freq_to_channel(freq, iw_range);
|
||||
snprintf(buffer, 128, "%1.3f", freq);
|
||||
add_table_entry(L, "frequency", buffer);
|
||||
snprintf(buffer, 128, "%d", channel);
|
||||
add_table_entry(L, "channel", buffer);
|
||||
//iw_print_freq(buffer, sizeof(buffer), freq, channel, event->u.freq.flags);
|
||||
//printf(" %s\n", buffer);
|
||||
}
|
||||
break;
|
||||
case SIOCGIWMODE:
|
||||
/* Note : event->u.mode is unsigned, no need to check <= 0 */
|
||||
if(event->u.mode >= IW_NUM_OPER_MODE)
|
||||
event->u.mode = IW_NUM_OPER_MODE;
|
||||
add_table_entry(L, "mode", iw_operation_mode[event->u.mode]);
|
||||
break;
|
||||
case SIOCGIWESSID:
|
||||
{
|
||||
char essid[IW_ESSID_MAX_SIZE+1];
|
||||
memset(essid, '\0', sizeof(essid));
|
||||
if((event->u.essid.pointer) && (event->u.essid.length))
|
||||
memcpy(essid, event->u.essid.pointer, event->u.essid.length);
|
||||
if(event->u.essid.flags)
|
||||
add_table_entry(L, "essid", essid);
|
||||
else
|
||||
add_table_entry(L, "essid", "off/any/hidden");
|
||||
}
|
||||
break;
|
||||
case SIOCGIWENCODE:
|
||||
{
|
||||
unsigned char key[IW_ENCODING_TOKEN_MAX];
|
||||
if(event->u.data.pointer)
|
||||
memcpy(key, event->u.data.pointer, event->u.data.length);
|
||||
else
|
||||
event->u.data.flags |= IW_ENCODE_NOKEY;
|
||||
if(event->u.data.flags & IW_ENCODE_DISABLED)
|
||||
{
|
||||
add_table_entry(L, "key", "off");
|
||||
} else {
|
||||
iw_print_key(buffer, sizeof(buffer), key, event->u.data.length,
|
||||
event->u.data.flags);
|
||||
add_table_entry(L, "key", buffer);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SIOCGIWRATE:
|
||||
if(state->val_index == 0)
|
||||
{
|
||||
lua_pushstring(L, "bitrates");
|
||||
lua_newtable(L);
|
||||
}
|
||||
//iw_print_bitrate(buffer, sizeof(buffer), event->u.bitrate.value);
|
||||
snprintf(buffer, sizeof(buffer), "%d", event->u.bitrate.value);
|
||||
lua_pushinteger(L, state->val_index + 1);
|
||||
lua_pushstring(L, buffer);
|
||||
lua_settable(L, -3);
|
||||
|
||||
/* Check for termination */
|
||||
if(stream->value == NULL)
|
||||
{
|
||||
lua_settable(L, -3);
|
||||
state->val_index = 0;
|
||||
} else
|
||||
state->val_index++;
|
||||
break;
|
||||
case IWEVGENIE:
|
||||
{
|
||||
int offset = 0;
|
||||
unsigned char *buffer = event->u.data.pointer;
|
||||
int buflen = event->u.data.length;
|
||||
while(offset <= (buflen - 2))
|
||||
{
|
||||
switch(buffer[offset])
|
||||
{
|
||||
case 0xdd: /* WPA1 (and other) */
|
||||
case 0x30: /* WPA2 */
|
||||
iw_print_ie_wpa(L, buffer + offset, buflen);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
offset += buffer[offset+1] + 2;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
} /* switch(event->cmd) */
|
||||
}
|
||||
|
||||
int iwc_scan(lua_State *L)
|
||||
{
|
||||
struct iwreq wrq;
|
||||
struct iw_scan_req scanopt; /* Options for 'set' */
|
||||
int scanflags = 0; /* Flags for scan */
|
||||
unsigned char *buffer = NULL; /* Results */
|
||||
int buflen = IW_SCAN_MAX_DATA; /* Min for compat WE<17 */
|
||||
struct iw_range range;
|
||||
int has_range;
|
||||
struct timeval tv; /* Select timeout */
|
||||
int timeout = 15000000; /* 15s */
|
||||
char *ifname;
|
||||
if(lua_gettop(L) != 1)
|
||||
{
|
||||
lua_pushstring(L, "invalid arg list");
|
||||
lua_error(L);
|
||||
return 0;
|
||||
}
|
||||
ifname = (char *)lua_tostring (L, 1);
|
||||
|
||||
/* Debugging stuff */
|
||||
if((IW_EV_LCP_PK2_LEN != IW_EV_LCP_PK_LEN) || (IW_EV_POINT_PK2_LEN != IW_EV_POINT_PK_LEN))
|
||||
{
|
||||
fprintf(stderr, "*** Please report to jt@hpl.hp.com your platform details\n");
|
||||
fprintf(stderr, "*** and the following line :\n");
|
||||
fprintf(stderr, "*** IW_EV_LCP_PK2_LEN = %zu ; IW_EV_POINT_PK2_LEN = %zu\n\n",
|
||||
IW_EV_LCP_PK2_LEN, IW_EV_POINT_PK2_LEN);
|
||||
}
|
||||
|
||||
/* Get range stuff */
|
||||
has_range = (iw_get_range_info(sock_iwconfig, ifname, &range) >= 0);
|
||||
|
||||
/* Check if the interface could support scanning. */
|
||||
if((!has_range) || (range.we_version_compiled < 14))
|
||||
{
|
||||
lua_pushstring(L, "interface does not support scanning");
|
||||
lua_error(L);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Init timeout value -> 250ms between set and first get */
|
||||
tv.tv_sec = 0;
|
||||
tv.tv_usec = 250000;
|
||||
|
||||
/* Clean up set args */
|
||||
memset(&scanopt, 0, sizeof(scanopt));
|
||||
|
||||
wrq.u.data.pointer = NULL;
|
||||
wrq.u.data.flags = 0;
|
||||
wrq.u.data.length = 0;
|
||||
|
||||
/* Initiate Scanning */
|
||||
if(iw_set_ext(sock_iwconfig, ifname, SIOCSIWSCAN, &wrq) < 0)
|
||||
{
|
||||
if((errno != EPERM) || (scanflags != 0))
|
||||
{
|
||||
lua_pushstring(L, "interface does not support scanning");
|
||||
lua_error(L);
|
||||
return 0;
|
||||
}
|
||||
/* If we don't have the permission to initiate the scan, we may
|
||||
* * still have permission to read left-over results.
|
||||
* * But, don't wait !!! */
|
||||
#if 0
|
||||
/* Not cool, it display for non wireless interfaces... */
|
||||
fprintf(stderr, "%-8.16s (Could not trigger scanning, just reading left-over results)\n", ifname);
|
||||
#endif
|
||||
tv.tv_usec = 0;
|
||||
}
|
||||
timeout -= tv.tv_usec;
|
||||
|
||||
/* Forever */
|
||||
while(1)
|
||||
{
|
||||
fd_set rfds; /* File descriptors for select */
|
||||
int last_fd; /* Last fd */
|
||||
int ret;
|
||||
|
||||
/* Guess what ? We must re-generate rfds each time */
|
||||
FD_ZERO(&rfds);
|
||||
last_fd = -1;
|
||||
/* In here, add the rtnetlink fd in the list */
|
||||
|
||||
/* Wait until something happens */
|
||||
ret = select(last_fd + 1, &rfds, NULL, NULL, &tv);
|
||||
|
||||
/* Check if there was an error */
|
||||
if(ret < 0)
|
||||
{
|
||||
if(errno == EAGAIN || errno == EINTR)
|
||||
continue;
|
||||
lua_pushstring(L, "unhandled signal");
|
||||
lua_error(L);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Check if there was a timeout */
|
||||
if(ret == 0)
|
||||
{
|
||||
unsigned char * newbuf;
|
||||
|
||||
realloc:
|
||||
/* (Re)allocate the buffer - realloc(NULL, len) == malloc(len) */
|
||||
newbuf = realloc(buffer, buflen);
|
||||
if(newbuf == NULL)
|
||||
{
|
||||
if(buffer)
|
||||
free(buffer);
|
||||
fprintf(stderr, "%s: Allocation failed\n", __FUNCTION__);
|
||||
return 0;
|
||||
}
|
||||
buffer = newbuf;
|
||||
|
||||
/* Try to read the results */
|
||||
wrq.u.data.pointer = buffer;
|
||||
wrq.u.data.flags = 0;
|
||||
wrq.u.data.length = buflen;
|
||||
if(iw_get_ext(sock_iwconfig, ifname, SIOCGIWSCAN, &wrq) < 0)
|
||||
{
|
||||
/* Check if buffer was too small (WE-17 only) */
|
||||
if((errno == E2BIG) && (range.we_version_compiled > 16))
|
||||
{
|
||||
/* Some driver may return very large scan results, either
|
||||
* because there are many cells, or because they have many
|
||||
* large elements in cells (like IWEVCUSTOM). Most will
|
||||
* only need the regular sized buffer. We now use a dynamic
|
||||
* allocation of the buffer to satisfy everybody. Of course,
|
||||
* as we don't know in advance the size of the array, we try
|
||||
* various increasing sizes. Jean II */
|
||||
|
||||
/* Check if the driver gave us any hints. */
|
||||
if(wrq.u.data.length > buflen)
|
||||
buflen = wrq.u.data.length;
|
||||
else
|
||||
buflen *= 2;
|
||||
|
||||
/* Try again */
|
||||
goto realloc;
|
||||
}
|
||||
|
||||
/* Check if results not available yet */
|
||||
if(errno == EAGAIN)
|
||||
{
|
||||
/* Restart timer for only 100ms*/
|
||||
tv.tv_sec = 0;
|
||||
tv.tv_usec = 100000;
|
||||
timeout -= tv.tv_usec;
|
||||
if(timeout > 0)
|
||||
continue; /* Try again later */
|
||||
}
|
||||
|
||||
/* Bad error */
|
||||
free(buffer);
|
||||
fprintf(stderr, "%-8.16s Failed to read scan data : %s\n\n",
|
||||
ifname, strerror(errno));
|
||||
return 0;
|
||||
} else
|
||||
/* We have the results, go to process them */
|
||||
break;
|
||||
}
|
||||
|
||||
/* In here, check if event and event type
|
||||
* * if scan event, read results. All errors bad & no reset timeout */
|
||||
}
|
||||
|
||||
if(wrq.u.data.length)
|
||||
{
|
||||
struct iw_event iwe;
|
||||
struct stream_descr stream;
|
||||
struct iwscan_state state = { .ap_num = 1, .val_index = 0 };
|
||||
int ret;
|
||||
int table = 0;
|
||||
iw_init_event_stream(&stream, (char *) buffer, wrq.u.data.length);
|
||||
lua_newtable(L);
|
||||
do
|
||||
{
|
||||
/* Extract an event and print it */
|
||||
ret = iw_extract_event_stream(&stream, &iwe,
|
||||
range.we_version_compiled);
|
||||
if(ret > 0)
|
||||
{
|
||||
if(iwe.cmd == SIOCGIWAP)
|
||||
{
|
||||
if(table)
|
||||
lua_settable(L, -3);
|
||||
table = 1;
|
||||
lua_pushinteger(L, state.ap_num);
|
||||
lua_newtable(L);
|
||||
}
|
||||
print_scanning_token(L, &stream, &iwe, &state, &range, has_range);
|
||||
}
|
||||
} while(ret > 0);
|
||||
lua_settable(L, -3);
|
||||
free(buffer);
|
||||
return 1;
|
||||
}
|
||||
free(buffer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int iwc_frequencies(lua_State *L)
|
||||
{
|
||||
int i;
|
||||
int has_range;
|
||||
char *ifname;
|
||||
struct iw_range range;
|
||||
|
||||
if(lua_gettop(L) != 1)
|
||||
{
|
||||
lua_pushstring(L, "invalid arg list");
|
||||
lua_error(L);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ifname = (char *)lua_tostring (L, 1);
|
||||
|
||||
/* Get range stuff */
|
||||
has_range = (iw_get_range_info(sock_iwconfig, ifname, &range) >= 0);
|
||||
|
||||
/* Check if the interface could support scanning. */
|
||||
if((!has_range) || (range.we_version_compiled < 14))
|
||||
{
|
||||
lua_pushstring(L, "interface does not support frequency enumeration");
|
||||
lua_error(L);
|
||||
}
|
||||
else
|
||||
{
|
||||
lua_newtable(L);
|
||||
|
||||
for(i = 0; i < range.num_frequency; i++)
|
||||
{
|
||||
lua_pushnumber(L, i + 1);
|
||||
lua_newtable(L);
|
||||
|
||||
lua_pushinteger(L, 1);
|
||||
lua_pushinteger(L, (int)range.freq[i].i);
|
||||
lua_settable(L, -3);
|
||||
|
||||
lua_pushinteger(L, 2);
|
||||
lua_pushnumber(L, iw_freq2float(&(range.freq[i])));
|
||||
lua_settable(L, -3);
|
||||
|
||||
lua_settable(L, -3);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Copyright (C) 2008 John Crispin <blogic@openwrt.org>
|
||||
* Copyright (C) 2008 Steven Barth <steven@midlink.org>
|
||||
* Copyright (C) 2009 Jo-Philipp Wich <xm@subsignal.org>
|
||||
*/
|
||||
|
||||
#ifndef _IWCONFIG_H__
|
||||
#define _IWCONFIG_H__
|
||||
int iwc_startup(void);
|
||||
void iwc_shutdown(void);
|
||||
int iwc_get(lua_State *L);
|
||||
int iwc_getall(lua_State *L);
|
||||
int iwc_set_essid(lua_State *L);
|
||||
int iwc_set_mode(lua_State *L);
|
||||
int iwc_set_channel(lua_State *L);
|
||||
int iwc_scan(lua_State *L);
|
||||
int iwc_frequencies(lua_State *L);
|
||||
#endif
|
|
@ -1,97 +0,0 @@
|
|||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Copyright (C) 2008 John Crispin <blogic@openwrt.org>
|
||||
* Copyright (C) 2008 Steven Barth <steven@midlink.org>
|
||||
* Copyright (C) 2009 Jo-Philipp Wich <xm@subsignal.org>
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <lua.h>
|
||||
#include <lualib.h>
|
||||
#include <lauxlib.h>
|
||||
|
||||
#include "route.h"
|
||||
#include "bridge.h"
|
||||
#include "ifconfig.h"
|
||||
#include "iwconfig.h"
|
||||
#include "vconfig.h"
|
||||
#include "df.h"
|
||||
#include "base64.h"
|
||||
|
||||
int psleep(lua_State *L)
|
||||
{
|
||||
int s;
|
||||
if(lua_gettop(L) != 1)
|
||||
{
|
||||
lua_pushstring(L, "invalid arg list");
|
||||
lua_error(L);
|
||||
return 0;
|
||||
}
|
||||
|
||||
s = (int)lua_tointeger (L, 1);
|
||||
sleep(s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static luaL_reg func[] = {
|
||||
{"ifc_getall", ifc_getall},
|
||||
{"ifc_setip", ifc_setip},
|
||||
{"ifc_setnetmask", ifc_setnetmask},
|
||||
{"ifc_setbroadcast", ifc_setbroadcast},
|
||||
{"ifc_setmtu", ifc_setmtu},
|
||||
{"ifc_up", ifc_up},
|
||||
{"ifc_down", ifc_down},
|
||||
{"bridge_getall", bridge_getall},
|
||||
{"bridge_new", bridge_new},
|
||||
{"bridge_del", bridge_del},
|
||||
{"bridge_addif", bridge_addif},
|
||||
{"bridge_delif", bridge_delif},
|
||||
{"iwc_getall", iwc_getall},
|
||||
{"iwc_set_essid", iwc_set_essid},
|
||||
{"iwc_set_mode", iwc_set_mode},
|
||||
{"iwc_set_channel", iwc_set_channel},
|
||||
{"iwc_scan", iwc_scan},
|
||||
{"iwc_frequencies", iwc_frequencies},
|
||||
{"vlan_getall", vlan_getall},
|
||||
{"vlan_add", vlan_add},
|
||||
{"vlan_del", vlan_del},
|
||||
{"df", df},
|
||||
{"b64_encode", b64_encode},
|
||||
{"b64_decode", b64_decode},
|
||||
{"sleep", psleep},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
int luaopen_luanet(lua_State *L)
|
||||
{
|
||||
ifc_startup();
|
||||
bridge_startup();
|
||||
iwc_startup();
|
||||
luaL_openlib(L, "luanet", func, 0);
|
||||
lua_pushstring(L, "_VERSION");
|
||||
lua_pushstring(L, "1.0");
|
||||
lua_rawset(L, -3);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int luaclose_luanet(lua_State *L)
|
||||
{
|
||||
ifc_shutdown();
|
||||
bridge_shutdown();
|
||||
iwc_shutdown();
|
||||
lua_pushstring(L, "Called");
|
||||
return 1;
|
||||
}
|
|
@ -1,45 +0,0 @@
|
|||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Copyright (C) 2008 John Crispin <blogic@openwrt.org>
|
||||
* Copyright (C) 2008 Steven Barth <steven@midlink.org>
|
||||
*/
|
||||
|
||||
#include <linux/sockios.h>
|
||||
#include <net/route.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
#include "helper.h"
|
||||
|
||||
extern int sock_ifconfig;
|
||||
|
||||
int route_add(char *dev, int flag_gateway, int flag_host, char *dst, char *gateway, char *mask)
|
||||
{
|
||||
struct rtentry r;
|
||||
char ip[4];
|
||||
r.rt_flags = RTF_UP;
|
||||
if(flag_gateway)
|
||||
r.rt_flags |= RTF_GATEWAY;
|
||||
if(flag_host)
|
||||
r.rt_flags |= RTF_HOST;
|
||||
r.rt_dst.sa_family = AF_INET;
|
||||
r.rt_gateway.sa_family = AF_INET;
|
||||
r.rt_genmask.sa_family = AF_INET;
|
||||
char2ipv4(dst, ip);
|
||||
((struct sockaddr_in *) &r.rt_dst)->sin_addr.s_addr = (unsigned int)ip;
|
||||
char2ipv4(gateway, ip);
|
||||
((struct sockaddr_in *) &r.rt_gateway)->sin_addr.s_addr = (unsigned int)ip;
|
||||
char2ipv4(mask, ip);
|
||||
((struct sockaddr_in *) &r.rt_genmask)->sin_addr.s_addr = (unsigned int)ip;
|
||||
return ioctl(sock_ifconfig, SIOCADDRT, (void *) &r);
|
||||
}
|
|
@ -1,21 +0,0 @@
|
|||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Copyright (C) 2008 John Crispin <blogic@openwrt.org>
|
||||
* Copyright (C) 2008 Steven Barth <steven@midlink.org>
|
||||
*/
|
||||
|
||||
#ifndef _ROUTE_H__
|
||||
#define _ROUTE_H__
|
||||
int route_add(char *dev, int flag_gateway, int flag_host, char *dst, char *gateway, char *mask);
|
||||
#endif
|
|
@ -1,141 +0,0 @@
|
|||
#!/usr/bin/lua
|
||||
|
||||
print("luanet test")
|
||||
local luanet = require("luanet")
|
||||
|
||||
print("sleeping 4 secs")
|
||||
luanet.sleep(4)
|
||||
|
||||
print("---ifconfig---\n")
|
||||
print("set ip wlan0 -> 192.168.1.2")
|
||||
print(luanet.ifc_setip("wlan0", "192.168.1.2"))
|
||||
print("set ip wlan0:1 -> 192.168.2.2")
|
||||
print(luanet.ifc_setip("wlan0:1", "192.168.2.2"))
|
||||
print("set mtu wlan0 -> 1400")
|
||||
print(luanet.ifc_setmtu("wlan0", "1400"))
|
||||
--print("set down wlan0 ->")
|
||||
--print(luanet.ifc_down("wlan0"))
|
||||
--print("set up wlan0 ->")
|
||||
--print(luanet.ifc_up("wlan0"))
|
||||
local devs = luanet.ifc_getall()
|
||||
for i,v in pairs(devs) do
|
||||
print("\ndev -> "..i)
|
||||
print(devs[i].ip)
|
||||
print(devs[i].netmask)
|
||||
print(devs[i].broadaddr)
|
||||
print(devs[i].mac)
|
||||
print(devs[i].mtu)
|
||||
print(devs[i].up)
|
||||
end
|
||||
|
||||
|
||||
print("\n\n---bridge---\n")
|
||||
print("add bridge br-test ->")
|
||||
print(luanet.bridge_new("br-test"))
|
||||
|
||||
print("add wlan0 to br-test ->")
|
||||
print(luanet.bridge_addif("br-test", "wlan0"))
|
||||
|
||||
print("listing bridges")
|
||||
local brs = luanet.bridge_getall()
|
||||
if brs then
|
||||
for i,v in pairs(brs) do
|
||||
print(i)
|
||||
for j,k in pairs(v) do
|
||||
print(j.."->"..k)
|
||||
end
|
||||
end
|
||||
end
|
||||
print("del wlan0 from br-test ->")
|
||||
print(luanet.bridge_delif("br-test", "wlan0"))
|
||||
|
||||
print("del bridge br-test ->")
|
||||
print(luanet.bridge_del("br-test"))
|
||||
|
||||
|
||||
print("\n\n---wifi---\n")
|
||||
print("set wlan0 essid test123")
|
||||
print(luanet.iwc_set_essid("wlan0", "test123"))
|
||||
print("set wifi channel to 3")
|
||||
print(luanet.iwc_set_channel("wlan0", 3))
|
||||
print("set wifi to managed")
|
||||
print(luanet.iwc_set_mode("wlan0", "managed"))
|
||||
print("\nget all wifi devices")
|
||||
local wifidevs = luanet.iwc_getall()
|
||||
if wifidevs then
|
||||
for i,v in pairs(wifidevs) do
|
||||
print(i)
|
||||
for j,k in pairs(v) do
|
||||
print(" "..j.."->"..k)
|
||||
end
|
||||
end
|
||||
end
|
||||
local scan = luanet.iwc_scan("wlan0")
|
||||
print("\nscanning wifi on wlan0")
|
||||
if scan then
|
||||
for i,v in pairs(scan) do
|
||||
print("\n"..i)
|
||||
print(" mac -> "..v.addr)
|
||||
print(" frequency -> "..v.frequency)
|
||||
print(" channel -> "..v.channel)
|
||||
print(" mode -> "..v.mode)
|
||||
print(" essid -> "..v.essid)
|
||||
print(" key -> "..v.key)
|
||||
print(" wpa1gcipher -> "..(v.wpa1gcipher or ""))
|
||||
print(" wpa1pcipher -> "..(v.wpa1pcipher or ""))
|
||||
print(" wpa1auth -> "..(v.wpa1auth or ""))
|
||||
print(" wpa2gcipher -> "..(v.wpa2gcipher or ""))
|
||||
print(" wpa2pcipher -> "..(v.wpa2pcipher or ""))
|
||||
print(" wpa2auth -> "..(v.wpa2auth or ""))
|
||||
print(" bitrates")
|
||||
for j,k in ipairs(v.bitrates) do
|
||||
--print(j.."->"..k)
|
||||
end
|
||||
end
|
||||
end
|
||||
local freq = luanet.iwc_frequencies("wlan0")
|
||||
print("\nfrequencies on wlan0")
|
||||
if freq then
|
||||
for _,f in ipairs(freq) do
|
||||
print(" channel -> "..f[1])
|
||||
print(" frequency -> "..f[2])
|
||||
print("")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
print("\n\n---vlan---\n")
|
||||
print("add wlan0 to vlan0")
|
||||
print(luanet.vlan_add("wlan0", 0));
|
||||
print("add wlan0 to vlan1")
|
||||
print(luanet.vlan_add("wlan0", 1));
|
||||
print("del wlan0 from all vlans")
|
||||
print(luanet.vlan_del("wlan0.0"));
|
||||
print("add wlan0 to vlan6")
|
||||
print(luanet.vlan_add("wlan0", 6));
|
||||
local vlans = luanet.vlan_getall()
|
||||
if vlans then
|
||||
for i,v in ipairs(vlans) do
|
||||
print(i.."->"..v)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
print("\n\n---df---\n")
|
||||
|
||||
print("getting disc usage")
|
||||
local discs = luanet.df()
|
||||
if discs then
|
||||
for i,v in ipairs(discs) do
|
||||
print(i.."->")
|
||||
for k,l in pairs(v) do
|
||||
print(" "..k.."->"..l)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
print("\n\n---b64---\n")
|
||||
print("test2 -->"..(luanet.b64_encode("test2") or "fail"))
|
||||
print("dGVzdDI= -->"..(luanet.b64_decode("dGVzdDI=") or "fail"))
|
||||
|
|
@ -1,93 +0,0 @@
|
|||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Copyright (C) 2008 John Crispin <blogic@openwrt.org>
|
||||
* Copyright (C) 2008 Steven Barth <steven@midlink.org>
|
||||
*/
|
||||
|
||||
#include <net/if.h>
|
||||
#include <net/if_arp.h>
|
||||
#include <net/route.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <linux/sockios.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <iwlib.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <lua.h>
|
||||
#include <lualib.h>
|
||||
#include <lauxlib.h>
|
||||
|
||||
extern int sock_ifconfig;
|
||||
|
||||
|
||||
static inline int _vlan_add(lua_State *L, int i)
|
||||
{
|
||||
struct vlan_ioctl_args ifr;
|
||||
int a = (i == ADD_VLAN_CMD)?(2):(1);
|
||||
char *ifname;
|
||||
if(lua_gettop(L) != a)
|
||||
{
|
||||
lua_pushstring(L, "invalid arg list");
|
||||
lua_error(L);
|
||||
return 0;
|
||||
}
|
||||
ifname = (char *)lua_tostring (L, 1);
|
||||
ifr.cmd = i;
|
||||
if(i == ADD_VLAN_CMD)
|
||||
ifr.u.VID = (int)lua_tointeger (L, 2);
|
||||
strncpy(ifr.device1, ifname, IFNAMSIZ);
|
||||
if(!ioctl(sock_ifconfig, SIOCSIFVLAN, &ifr))
|
||||
lua_pushboolean(L, 1);
|
||||
else
|
||||
lua_pushboolean(L, 0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int vlan_add(lua_State *L)
|
||||
{
|
||||
return _vlan_add(L, ADD_VLAN_CMD);
|
||||
}
|
||||
|
||||
int vlan_del(lua_State *L)
|
||||
{
|
||||
return _vlan_add(L, DEL_VLAN_CMD);
|
||||
}
|
||||
|
||||
int vlan_getall(lua_State *L)
|
||||
{
|
||||
struct dirent **namelist;
|
||||
int n = 0, i, count = 0;
|
||||
count = scandir("/proc/net/vlan/", &namelist, NULL, alphasort);
|
||||
if (count < 0)
|
||||
return 0;
|
||||
lua_newtable(L);
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
if(strcmp(namelist[i]->d_name, "config") && (*namelist[i]->d_name != '.'))
|
||||
{
|
||||
n++;
|
||||
lua_pushinteger(L, n);
|
||||
lua_pushstring(L, namelist[i]->d_name);
|
||||
lua_settable(L, -3);
|
||||
}
|
||||
free(namelist[i]);
|
||||
}
|
||||
free(namelist);
|
||||
return 1;
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* Copyright (C) 2008 John Crispin <blogic@openwrt.org>
|
||||
* Copyright (C) 2008 Steven Barth <steven@midlink.org>
|
||||
*/
|
||||
|
||||
#ifndef _VCONFIG_H__
|
||||
#define _VCONFIG_H__
|
||||
|
||||
int vlan_add(lua_State *L);
|
||||
int vlan_del(lua_State *L);
|
||||
int vlan_getall(lua_State *L);
|
||||
|
||||
#endif
|
Loading…
Reference in a new issue