Squashed commit of the following:

commit d45d1757d24d8214f730af1a3401dd2bef4a434f
Author: Steven <steven@cyrus.homeunix.org>
Date:   Wed May 28 17:23:27 2008 +0200

    * libs/core: Removed dummymode checks in sys
    * libs/sgi-webuci: Fixes

commit b870e8d345bc8912fd8ab61d463b9d68b924a6f4
Author: Felix Fietkau <nbd@openwrt.org>
Date:   Wed May 28 15:40:10 2008 +0200

    fix path to theme

commit e3732926bd98db4cc38de6eb8018cd4e55176699
Author: Felix Fietkau <nbd@openwrt.org>
Date:   Wed May 28 14:56:03 2008 +0200

    set the proper path to the config in dummy mode

commit a75aecf46f037c98bd6e49b9e48adb735d76d150
Author: Felix Fietkau <nbd@openwrt.org>
Date:   Wed May 28 14:50:42 2008 +0200

    add some dummy mode support

commit 12bb39ef606bca6b403cc982213a6597b76dc1b3
Author: Felix Fietkau <nbd@openwrt.org>
Date:   Wed May 28 14:41:56 2008 +0200

    normalize paths

commit 7aaad1103fd2bdc75aca158baa6ef191f9a961c6
Author: Felix Fietkau <nbd@openwrt.org>
Date:   Wed May 28 14:27:26 2008 +0200

    add missing require statement

commit 5766274bd2511b00c42b474aeeeb3efaca6ded9b
Author: Felix Fietkau <nbd@openwrt.org>
Date:   Wed May 28 14:19:54 2008 +0200

    add optional luaposix package (patched for darwin support)

commit 9e257a76d03722fc0ce8312aa9952641b21424bd
Author: Felix Fietkau <nbd@openwrt.org>
Date:   Tue May 27 20:21:59 2008 +0200

    add missing files, more integration for the boa plugin, fix path to lua modules

commit dacc1a98ec946975fcb19f87076dfa7db865fca6
Author: Felix Fietkau <nbd@openwrt.org>
Date:   Tue May 27 19:42:37 2008 +0200

    use "compile" instead of "source" and rename the old version of compile to "compile-all"

commit eb14777c4fee1eb5740aba1e5603e481320da7b1
Author: Felix Fietkau <nbd@openwrt.org>
Date:   Tue May 27 19:41:59 2008 +0200

    more boa integration

commit df0afb965bf0a987b653e9d0acadf3151179a596
Author: Felix Fietkau <nbd@openwrt.org>
Date:   Tue May 27 18:33:42 2008 +0200

    build boa and the webuci.so plugin along with sgi-webuci

commit 878161dabf32066631103d199e2cbaf3f5a7fb07
Author: Felix Fietkau <nbd@openwrt.org>
Date:   Tue May 27 18:03:16 2008 +0200

    add .gitignore
This commit is contained in:
Steven Barth 2008-05-28 15:28:13 +00:00
parent 776f9957d0
commit 4365fbe2a3
22 changed files with 2851 additions and 31 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
dist/
/host

View file

@ -1,8 +1,12 @@
include build/config.mk
MODULES = applications/* libs/* modules/* themes/* i18n/*
LUA_TARGET = source
LUA_TARGET = compile
OS:=$(shell uname)
export OS
ifeq ($(OS),Darwin)
MODULES += contrib/luaposix
endif
.PHONY: all build clean host hostclean

View file

@ -1,3 +1,28 @@
OS ?= $(shell uname)
LUAC = luac
LUAC_OPTIONS = -s
LUCI_INSTALLDIR = /usr/lib/lua/luci
LUCI_INSTALLDIR = /usr/lib/lua/luci
LUA_SHLIBS = $(shell pkg-config --silence-errors --libs lua5.1)
LUA_LIBS = $(if $(LUA_SHLIBS),$(LUA_SHLIBS),$(firstword $(wildcard /usr/lib/liblua.a /usr/local/lib/liblua.a /opt/local/lib/liblua.a)))
LUA_CFLAGS = $(shell pkg-config --silence-errors --cflags lua5.1)
ifeq ($(LUA_LIBS),)
$(error LUA installation not found)
endif
CC = gcc
AR = ar
RANLIB = ranlib
CFLAGS = -O2
FPIC = -fPIC
EXTRA_CFLAGS = --std=gnu99
WFLAGS = -Wall -Werror -pedantic
CPPFLAGS =
COMPILE = $(CC) $(CPPFLAGS) $(CFLAGS) $(EXTRA_CFLAGS) $(WFLAGS)
ifeq ($(OS),Darwin)
SHLIB_FLAGS = -bundle -undefined dynamic_lookup
else
SHLIB_FLAGS = -shared
endif
LINK = $(CC)

View file

@ -1,7 +1,8 @@
.PHONY: all compile compile-module source source-module clean clean-module
all: compile
compile: compile-module
compile: source-module
compile-all: compile-module
clean: clean-module
source: source-module

2
contrib/luaposix/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
luaposix-*
patches/series

43
contrib/luaposix/Makefile Normal file
View file

@ -0,0 +1,43 @@
include ../../build/config.mk
LUAPOSIX_VERSION = 5.1.2
LUAPOSIX_SITE = http://luaforge.net/frs/download.php/3063/
LUAPOSIX_DIR = luaposix-$(LUAPOSIX_VERSION)
LUAPOSIX_FILE = $(LUAPOSIX_DIR).tar.gz
LUAPOSIX_URL = $(LUAPOSIX_SITE)/$(LUAPOSIX_FILE)
LUAPOSIX_PATCHDIR = patches
all: compile
$(LUAPOSIX_FILE):
wget -O $@ $(LUAPOSIX_URL) || rm -f $@
$(LUAPOSIX_PATCHDIR)/series:
(cd $(LUAPOSIX_PATCHDIR); ls *.patch | sort > series)
$(LUAPOSIX_DIR)/.prepared: $(LUAPOSIX_FILE)
rm -rf $(LUAPOSIX_DIR)
tar xvfz $(LUAPOSIX_FILE)
ln -s ../$(LUAPOSIX_PATCHDIR) $(LUAPOSIX_DIR)/patches
touch $@
$(LUAPOSIX_DIR)/.patched: $(LUAPOSIX_DIR)/.prepared $(LUAPOSIX_PATCHDIR)/series
(cd $(LUAPOSIX_DIR); \
if [ -x "$$(which quilt 2>/dev/null)" ]; then \
quilt push -a; \
else \
cat patches/*.patch | patch -p1; \
fi; \
)
touch $@
compile: $(LUAPOSIX_DIR)/.patched
$(MAKE) -C $(LUAPOSIX_DIR) CC=$(CC) CFLAGS="$(CFLAGS)" OS="$(OS)"
mkdir -p dist/usr/lib/lua
cp $(LUAPOSIX_DIR)/posix.so dist/usr/lib/lua/
compile-all: compile
clean:
rm -rf $(LUAPOSIX_DIR) $(LUAPOSIX_FILE)
rm -f $(LUAPOSIX_PATCHDIR)/series

View file

@ -0,0 +1,27 @@
Index: luaposix-5.1.2/Makefile
===================================================================
--- luaposix-5.1.2.orig/Makefile 2008-01-29 14:49:27.000000000 +0100
+++ luaposix-5.1.2/Makefile 2008-05-28 14:15:30.000000000 +0200
@@ -34,6 +34,13 @@
T= $(MYLIB).so
+OS=$(shell uname)
+ifeq ($(OS),Darwin)
+ LDFLAGS_SHARED=-bundle -undefined dynamic_lookup
+else
+ LDFLAGS_SHARED=-shared
+endif
+
# targets
phony += all
all: $T
@@ -43,7 +50,7 @@
$(LUA) test.lua
$T: $(OBJS)
- $(CC) $(LDFLAGS) -o $@ -shared $(OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(LDFLAGS_SHARED) $(OBJS)
$(OBJS): modemuncher.c

View file

@ -368,4 +368,4 @@ function _parse_mixed_record(cnt)
end
return data
end
end

4
libs/sgi-webuci/.gitignore vendored Normal file
View file

@ -0,0 +1,4 @@
boa-patches/series
boa-*.*
*.o
*.so

View file

@ -1,2 +1,51 @@
include ../../build/config.mk
include ../../build/module.mk
include ../../build/module.mk
BOA_VERSION = 0.94.13
BOA_SITE = http://www.boa.org
BOA_DIR = boa-$(BOA_VERSION)
BOA_FILE = $(BOA_DIR).tar.gz
BOA_URL = $(BOA_SITE)/$(BOA_FILE)
BOA_PATCHDIR = boa-patches
$(BOA_FILE):
wget -O $@ $(BOA_URL) || rm -f $@
$(BOA_PATCHDIR)/series:
(cd $(BOA_PATCHDIR); ls *.patch | sort > series)
$(BOA_DIR)/.prepared: $(BOA_FILE)
rm -rf $(BOA_DIR)
tar xvfz $(BOA_FILE)
ln -s ../$(BOA_PATCHDIR) $(BOA_DIR)/patches
touch $@
$(BOA_DIR)/.patched: $(BOA_DIR)/.prepared $(BOA_PATCHDIR)/series
(cd $(BOA_DIR); \
if [ -x "$$(which quilt 2>/dev/null)" ]; then \
quilt push -a; \
else \
cat patches/*.patch | patch -p1; \
fi; \
)
touch $@
$(BOA_DIR)/.configured: $(BOA_DIR)/.patched
(cd $(BOA_DIR)/src; ./configure --disable-debug)
touch $@
boa-compile: $(BOA_DIR)/.configured
$(MAKE) -C $(BOA_DIR)/src CC=$(CC) CFLAGS="$(CFLAGS)"
%.o: %.c
$(COMPILE) $(LUA_CFLAGS) -I$(BOA_DIR)/src $(FPIC) -c -o $@ $<
compile: boa-compile src/luci.o src/cgi.o
mkdir -p dist/usr/bin dist/usr/lib/boa
cp $(BOA_DIR)/src/boa $(BOA_DIR)/src/boa_indexer dist/usr/bin
$(LINK) $(SHLIB_FLAGS) $(LUA_SHLIBS) -o dist/usr/lib/boa/luci.so src/luci.o src/cgi.o $(LUA_LIBS)
clean:
rm -rf $(BOA_DIR) $(BOA_FILE)
rm -f boa-patches/series
rm -f src/*.o

View file

@ -0,0 +1,22 @@
diff -urN boa-0.94.13/src/util.c boa/src/util.c
--- boa-0.94.13/src/util.c 2002-07-08 01:22:18.000000000 +0200
+++ boa/src/util.c 2008-04-25 21:56:20.000000000 +0200
@@ -95,14 +95,9 @@
static char buf[30];
int time_offset;
- if (use_localtime) {
- t = localtime(&current_time);
- time_offset = TIMEZONE_OFFSET(t);
- } else {
- t = gmtime(&current_time);
- time_offset = 0;
- }
-
+ t = gmtime(&current_time);
+ time_offset = 0;
+
p = buf + 29;
*p-- = '\0';
*p-- = ' ';

File diff suppressed because it is too large Load diff

View file

@ -28,8 +28,9 @@ module("luci.sgi.webuci", package.seeall)
local status_set = false
-- Initialize the environment
function initenv(env)
function initenv(env, vars)
luci.http.env = env
luci.http.vars = vars
end
-- Returns the main dispatcher URL
@ -44,7 +45,7 @@ end
-- Returns a table of all COOKIE, GET and POST Parameters
function luci.http.formvalues()
return webuci.vars
return luci.http.vars
end
-- Gets form value from key

View file

@ -0,0 +1,16 @@
Port 8080
ErrorLog /dev/stderr
AccessLog /dev/stderr
DocumentRoot ../../www
DirectoryMaker ../../usr/lib/boa/boa_indexer
KeepAliveMax 1000
KeepAliveTimeout 10
MimeTypes ../mime.types
DefaultType text/plain
CGIPath /bin:/usr/bin:/usr/local/bin:../../bin:../../usr/bin:../../usr/local/bin
AddType application/x-httpd-cgi cgi
AddType application/x-httpd-cgi sh
ScriptAlias /cgi-bin/ ../../www/cgi-bin
PluginRoot ../../usr/lib/boa

View file

@ -0,0 +1,748 @@
###############################################################################
#
# MIME-TYPES and the extensions that represent them
#
# This file is part of the "mime-support" package. Please send email (not a
# bug report) to mime-support@packages.debian.org if you would like new types
# and/or extensions to be added.
#
# The reason that all types are managed by the mime-support package instead
# allowing individual packages to install types in much the same way as they
# add entries in to the mailcap file is so these types can be referenced by
# other programs (such as a web server) even if the specific support package
# for that type is not installed.
#
# Users can add their own types if they wish by creating a ".mime.types"
# file in their home directory. Definitions included there will take
# precedence over those listed here.
#
# Note: Compression schemes like "gzip", "bzip", and "compress" are not
# actually "mime-types". They are "encodings" and hence must _not_ have
# entries in this file to map their extensions. The "mime-type" of an
# encoded file refers to the type of data that has been encoded, not the
# type of encoding.
#
###############################################################################
application/activemessage
application/andrew-inset ez
application/applefile
application/atom atom
application/atomcat+xml atomcat
application/atomserv+xml atomsrv
application/atomicmail
application/batch-SMTP
application/beep+xml
application/cals-1840
application/cap cap pcap
application/commonground
application/cu-seeme cu
application/cybercash
application/dca-rft
application/dec-dx
application/docbook+xml
application/dsptype tsp
application/dvcs
application/edi-consent
application/edi-x12
application/edifact
application/eshop
application/font-tdpfr
application/futuresplash spl
application/ghostview
application/hta hta
application/http
application/hyperstudio
application/iges
application/index
application/index.cmd
application/index.obj
application/index.response
application/index.vnd
application/iotp
application/ipp
application/isup
application/java-archive jar
application/java-serialized-object ser
application/java-vm class
application/mac-binhex40 hqx
application/mac-compactpro cpt
application/macwriteii
application/marc
application/mathematica nb
application/mathematica-old
application/ms-tnef
application/msaccess mdb
application/msword doc dot
application/news-message-id
application/news-transmission
application/ocsp-request
application/ocsp-response
application/octet-stream bin
application/oda oda
application/ogg ogg
application/parityfec
application/pdf pdf
application/pgp-encrypted
application/pgp-keys key
application/pgp-signature pgp
application/pics-rules prf
application/pkcs10
application/pkcs7-mime
application/pkcs7-signature
application/pkix-cert
application/pkix-crl
application/pkixcmp
application/postscript ps ai eps
application/prs.alvestrand.titrax-sheet
application/prs.cww
application/prs.nprend
application/qsig
application/rar rar
application/rdf+xml rdf
application/remote-printing
application/riscos
application/rss+xml rss
application/rtf rtf
application/sdp
application/set-payment
application/set-payment-initiation
application/set-registration
application/set-registration-initiation
application/sgml
application/sgml-open-catalog
application/sieve
application/slate
application/smil smi smil
application/timestamp-query
application/timestamp-reply
application/vemmi
application/whoispp-query
application/whoispp-response
application/wita
application/wordperfect wpd
application/wordperfect5.1 wp5
application/x400-bp
application/xhtml+xml xhtml xht
application/xml xml xsl
application/xml-dtd
application/xml-external-parsed-entity
application/zip zip
application/vnd.3M.Post-it-Notes
application/vnd.accpac.simply.aso
application/vnd.accpac.simply.imp
application/vnd.acucobol
application/vnd.aether.imp
application/vnd.anser-web-certificate-issue-initiation
application/vnd.anser-web-funds-transfer-initiation
application/vnd.audiograph
application/vnd.bmi
application/vnd.businessobjects
application/vnd.canon-cpdl
application/vnd.canon-lips
application/vnd.cinderella cdy
application/vnd.claymore
application/vnd.commerce-battelle
application/vnd.commonspace
application/vnd.comsocaller
application/vnd.contact.cmsg
application/vnd.cosmocaller
application/vnd.ctc-posml
application/vnd.cups-postscript
application/vnd.cups-raster
application/vnd.cups-raw
application/vnd.cybank
application/vnd.dna
application/vnd.dpgraph
application/vnd.dxr
application/vnd.ecdis-update
application/vnd.ecowin.chart
application/vnd.ecowin.filerequest
application/vnd.ecowin.fileupdate
application/vnd.ecowin.series
application/vnd.ecowin.seriesrequest
application/vnd.ecowin.seriesupdate
application/vnd.enliven
application/vnd.epson.esf
application/vnd.epson.msf
application/vnd.epson.quickanime
application/vnd.epson.salt
application/vnd.epson.ssf
application/vnd.ericsson.quickcall
application/vnd.eudora.data
application/vnd.fdf
application/vnd.ffsns
application/vnd.flographit
application/vnd.framemaker
application/vnd.fsc.weblaunch
application/vnd.fujitsu.oasys
application/vnd.fujitsu.oasys2
application/vnd.fujitsu.oasys3
application/vnd.fujitsu.oasysgp
application/vnd.fujitsu.oasysprs
application/vnd.fujixerox.ddd
application/vnd.fujixerox.docuworks
application/vnd.fujixerox.docuworks.binder
application/vnd.fut-misnet
application/vnd.google-earth.kml+xml kml
application/vnd.google-earth.kmz kmz
application/vnd.grafeq
application/vnd.groove-account
application/vnd.groove-identity-message
application/vnd.groove-injector
application/vnd.groove-tool-message
application/vnd.groove-tool-template
application/vnd.groove-vcard
application/vnd.hhe.lesson-player
application/vnd.hp-HPGL
application/vnd.hp-PCL
application/vnd.hp-PCLXL
application/vnd.hp-hpid
application/vnd.hp-hps
application/vnd.httphone
application/vnd.hzn-3d-crossword
application/vnd.ibm.MiniPay
application/vnd.ibm.afplinedata
application/vnd.ibm.modcap
application/vnd.informix-visionary
application/vnd.intercon.formnet
application/vnd.intertrust.digibox
application/vnd.intertrust.nncp
application/vnd.intu.qbo
application/vnd.intu.qfx
application/vnd.irepository.package+xml
application/vnd.is-xpr
application/vnd.japannet-directory-service
application/vnd.japannet-jpnstore-wakeup
application/vnd.japannet-payment-wakeup
application/vnd.japannet-registration
application/vnd.japannet-registration-wakeup
application/vnd.japannet-setstore-wakeup
application/vnd.japannet-verification
application/vnd.japannet-verification-wakeup
application/vnd.koan
application/vnd.lotus-1-2-3
application/vnd.lotus-approach
application/vnd.lotus-freelance
application/vnd.lotus-notes
application/vnd.lotus-organizer
application/vnd.lotus-screencam
application/vnd.lotus-wordpro
application/vnd.mcd
application/vnd.mediastation.cdkey
application/vnd.meridian-slingshot
application/vnd.mif
application/vnd.minisoft-hp3000-save
application/vnd.mitsubishi.misty-guard.trustweb
application/vnd.mobius.daf
application/vnd.mobius.dis
application/vnd.mobius.msl
application/vnd.mobius.plc
application/vnd.mobius.txf
application/vnd.motorola.flexsuite
application/vnd.motorola.flexsuite.adsi
application/vnd.motorola.flexsuite.fis
application/vnd.motorola.flexsuite.gotap
application/vnd.motorola.flexsuite.kmr
application/vnd.motorola.flexsuite.ttc
application/vnd.motorola.flexsuite.wem
application/vnd.mozilla.xul+xml xul
application/vnd.ms-artgalry
application/vnd.ms-asf
application/vnd.ms-excel xls xlb xlt
application/vnd.ms-lrm
application/vnd.ms-pki.seccat cat
application/vnd.ms-pki.stl stl
application/vnd.ms-powerpoint ppt pps
application/vnd.ms-project
application/vnd.ms-tnef
application/vnd.ms-works
application/vnd.mseq
application/vnd.msign
application/vnd.music-niff
application/vnd.musician
application/vnd.netfpx
application/vnd.noblenet-directory
application/vnd.noblenet-sealer
application/vnd.noblenet-web
application/vnd.novadigm.EDM
application/vnd.novadigm.EDX
application/vnd.novadigm.EXT
application/vnd.oasis.opendocument.chart odc
application/vnd.oasis.opendocument.database odb
application/vnd.oasis.opendocument.formula odf
application/vnd.oasis.opendocument.graphics odg
application/vnd.oasis.opendocument.graphics-template otg
application/vnd.oasis.opendocument.image odi
application/vnd.oasis.opendocument.presentation odp
application/vnd.oasis.opendocument.presentation-template otp
application/vnd.oasis.opendocument.spreadsheet ods
application/vnd.oasis.opendocument.spreadsheet-template ots
application/vnd.oasis.opendocument.text odt
application/vnd.oasis.opendocument.text-master odm
application/vnd.oasis.opendocument.text-template ott
application/vnd.oasis.opendocument.text-web oth
application/vnd.osa.netdeploy
application/vnd.palm
application/vnd.pg.format
application/vnd.pg.osasli
application/vnd.powerbuilder6
application/vnd.powerbuilder6-s
application/vnd.powerbuilder7
application/vnd.powerbuilder7-s
application/vnd.powerbuilder75
application/vnd.powerbuilder75-s
application/vnd.previewsystems.box
application/vnd.publishare-delta-tree
application/vnd.pvi.ptid1
application/vnd.pwg-xhtml-print+xml
application/vnd.rapid
application/vnd.rim.cod cod
application/vnd.s3sms
application/vnd.seemail
application/vnd.shana.informed.formdata
application/vnd.shana.informed.formtemplate
application/vnd.shana.informed.interchange
application/vnd.shana.informed.package
application/vnd.smaf mmf
application/vnd.sss-cod
application/vnd.sss-dtf
application/vnd.sss-ntf
application/vnd.stardivision.calc sdc
application/vnd.stardivision.chart sds
application/vnd.stardivision.draw sda
application/vnd.stardivision.impress sdd
application/vnd.stardivision.math sdf
application/vnd.stardivision.writer sdw
application/vnd.stardivision.writer-global sgl
application/vnd.street-stream
application/vnd.sun.xml.calc sxc
application/vnd.sun.xml.calc.template stc
application/vnd.sun.xml.draw sxd
application/vnd.sun.xml.draw.template std
application/vnd.sun.xml.impress sxi
application/vnd.sun.xml.impress.template sti
application/vnd.sun.xml.math sxm
application/vnd.sun.xml.writer sxw
application/vnd.sun.xml.writer.global sxg
application/vnd.sun.xml.writer.template stw
application/vnd.svd
application/vnd.swiftview-ics
application/vnd.symbian.install sis
application/vnd.triscape.mxs
application/vnd.trueapp
application/vnd.truedoc
application/vnd.tve-trigger
application/vnd.ufdl
application/vnd.uplanet.alert
application/vnd.uplanet.alert-wbxml
application/vnd.uplanet.bearer-choice
application/vnd.uplanet.bearer-choice-wbxml
application/vnd.uplanet.cacheop
application/vnd.uplanet.cacheop-wbxml
application/vnd.uplanet.channel
application/vnd.uplanet.channel-wbxml
application/vnd.uplanet.list
application/vnd.uplanet.list-wbxml
application/vnd.uplanet.listcmd
application/vnd.uplanet.listcmd-wbxml
application/vnd.uplanet.signal
application/vnd.vcx
application/vnd.vectorworks
application/vnd.vidsoft.vidconference
application/vnd.visio vsd
application/vnd.vividence.scriptfile
application/vnd.wap.sic
application/vnd.wap.slc
application/vnd.wap.wbxml wbxml
application/vnd.wap.wmlc wmlc
application/vnd.wap.wmlscriptc wmlsc
application/vnd.webturbo
application/vnd.wrq-hp3000-labelled
application/vnd.wt.stf
application/vnd.xara
application/vnd.xfdl
application/vnd.yellowriver-custom-menu
application/x-123 wk
application/x-7z-compressed 7z
application/x-abiword abw
application/x-apple-diskimage dmg
application/x-bcpio bcpio
application/x-bittorrent torrent
application/x-cab cab
application/x-cbr cbr
application/x-cbz cbz
application/x-cdf cdf
application/x-cdlink vcd
application/x-chess-pgn pgn
application/x-core
application/x-cpio cpio
application/x-csh csh
application/x-debian-package deb udeb
application/x-director dcr dir dxr
application/x-dms dms
application/x-doom wad
application/x-dvi dvi
application/x-httpd-eruby rhtml
application/x-executable
application/x-flac flac
application/x-font pfa pfb gsf pcf pcf.Z
application/x-freemind mm
application/x-futuresplash spl
application/x-gnumeric gnumeric
application/x-go-sgf sgf
application/x-graphing-calculator gcf
application/x-gtar gtar tgz taz
application/x-hdf hdf
application/x-httpd-php phtml pht php
application/x-httpd-php-source phps
application/x-httpd-php3 php3
application/x-httpd-php3-preprocessed php3p
application/x-httpd-php4 php4
application/x-ica ica
application/x-internet-signup ins isp
application/x-iphone iii
application/x-iso9660-image iso
application/x-java-applet
application/x-java-bean
application/x-java-jnlp-file jnlp
application/x-javascript js
application/x-jmol jmz
application/x-kchart chrt
application/x-kdelnk
application/x-killustrator kil
application/x-koan skp skd skt skm
application/x-kpresenter kpr kpt
application/x-kspread ksp
application/x-kword kwd kwt
application/x-latex latex
application/x-lha lha
application/x-lyx lyx
application/x-lzh lzh
application/x-lzx lzx
application/x-maker frm maker frame fm fb book fbdoc
application/x-mif mif
application/x-ms-wmd wmd
application/x-ms-wmz wmz
application/x-msdos-program com exe bat dll
application/x-msi msi
application/x-netcdf nc
application/x-ns-proxy-autoconfig pac
application/x-nwc nwc
application/x-object o
application/x-oz-application oza
application/x-pkcs7-certreqresp p7r
application/x-pkcs7-crl crl
application/x-python-code pyc pyo
application/x-quicktimeplayer qtl
application/x-redhat-package-manager rpm
application/x-rx
application/x-sh sh
application/x-shar shar
application/x-shellscript
application/x-shockwave-flash swf swfl
application/x-stuffit sit sitx
application/x-sv4cpio sv4cpio
application/x-sv4crc sv4crc
application/x-tar tar
application/x-tcl tcl
application/x-tex-gf gf
application/x-tex-pk pk
application/x-texinfo texinfo texi
application/x-trash ~ % bak old sik
application/x-troff t tr roff
application/x-troff-man man
application/x-troff-me me
application/x-troff-ms ms
application/x-ustar ustar
application/x-videolan
application/x-wais-source src
application/x-wingz wz
application/x-x509-ca-cert crt
application/x-xcf xcf
application/x-xfig fig
application/x-xpinstall xpi
audio/32kadpcm
audio/3gpp
audio/basic au snd
audio/g.722.1
audio/l16
audio/midi mid midi kar
audio/mp4a-latm
audio/mpa-robust
audio/mpeg mpga mpega mp2 mp3 m4a
audio/mpegurl m3u
audio/parityfec
audio/prs.sid sid
audio/telephone-event
audio/tone
audio/vnd.cisco.nse
audio/vnd.cns.anp1
audio/vnd.cns.inf1
audio/vnd.digital-winds
audio/vnd.everad.plj
audio/vnd.lucent.voice
audio/vnd.nortel.vbk
audio/vnd.nuera.ecelp4800
audio/vnd.nuera.ecelp7470
audio/vnd.nuera.ecelp9600
audio/vnd.octel.sbc
audio/vnd.qcelp
audio/vnd.rhetorex.32kadpcm
audio/vnd.vmx.cvsd
audio/x-aiff aif aiff aifc
audio/x-gsm gsm
audio/x-mpegurl m3u
audio/x-ms-wma wma
audio/x-ms-wax wax
audio/x-pn-realaudio-plugin
audio/x-pn-realaudio ra rm ram
audio/x-realaudio ra
audio/x-scpls pls
audio/x-sd2 sd2
audio/x-wav wav
chemical/x-alchemy alc
chemical/x-cache cac cache
chemical/x-cache-csf csf
chemical/x-cactvs-binary cbin cascii ctab
chemical/x-cdx cdx
chemical/x-cerius cer
chemical/x-chem3d c3d
chemical/x-chemdraw chm
chemical/x-cif cif
chemical/x-cmdf cmdf
chemical/x-cml cml
chemical/x-compass cpa
chemical/x-crossfire bsd
chemical/x-csml csml csm
chemical/x-ctx ctx
chemical/x-cxf cxf cef
#chemical/x-daylight-smiles smi
chemical/x-embl-dl-nucleotide emb embl
chemical/x-galactic-spc spc
chemical/x-gamess-input inp gam gamin
chemical/x-gaussian-checkpoint fch fchk
chemical/x-gaussian-cube cub
chemical/x-gaussian-input gau gjc gjf
chemical/x-gaussian-log gal
chemical/x-gcg8-sequence gcg
chemical/x-genbank gen
chemical/x-hin hin
chemical/x-isostar istr ist
chemical/x-jcamp-dx jdx dx
chemical/x-kinemage kin
chemical/x-macmolecule mcm
chemical/x-macromodel-input mmd mmod
chemical/x-mdl-molfile mol
chemical/x-mdl-rdfile rd
chemical/x-mdl-rxnfile rxn
chemical/x-mdl-sdfile sd sdf
chemical/x-mdl-tgf tgf
#chemical/x-mif mif
chemical/x-mmcif mcif
chemical/x-mol2 mol2
chemical/x-molconn-Z b
chemical/x-mopac-graph gpt
chemical/x-mopac-input mop mopcrt mpc dat zmt
chemical/x-mopac-out moo
chemical/x-mopac-vib mvb
chemical/x-ncbi-asn1 asn
chemical/x-ncbi-asn1-ascii prt ent
chemical/x-ncbi-asn1-binary val aso
chemical/x-ncbi-asn1-spec asn
chemical/x-pdb pdb ent
chemical/x-rosdal ros
chemical/x-swissprot sw
chemical/x-vamas-iso14976 vms
chemical/x-vmd vmd
chemical/x-xtel xtel
chemical/x-xyz xyz
image/cgm
image/g3fax
image/gif gif
image/ief ief
image/jpeg jpeg jpg jpe
image/naplps
image/pcx pcx
image/png png
image/prs.btif
image/prs.pti
image/svg+xml svg svgz
image/tiff tiff tif
image/vnd.cns.inf2
image/vnd.djvu djvu djv
image/vnd.dwg
image/vnd.dxf
image/vnd.fastbidsheet
image/vnd.fpx
image/vnd.fst
image/vnd.fujixerox.edmics-mmr
image/vnd.fujixerox.edmics-rlc
image/vnd.mix
image/vnd.net-fpx
image/vnd.svf
image/vnd.wap.wbmp wbmp
image/vnd.xiff
image/x-cmu-raster ras
image/x-coreldraw cdr
image/x-coreldrawpattern pat
image/x-coreldrawtemplate cdt
image/x-corelphotopaint cpt
image/x-icon ico
image/x-jg art
image/x-jng jng
image/x-ms-bmp bmp
image/x-photoshop psd
image/x-portable-anymap pnm
image/x-portable-bitmap pbm
image/x-portable-graymap pgm
image/x-portable-pixmap ppm
image/x-rgb rgb
image/x-xbitmap xbm
image/x-xpixmap xpm
image/x-xwindowdump xwd
inode/chardevice
inode/blockdevice
inode/directory-locked
inode/directory
inode/fifo
inode/socket
message/delivery-status
message/disposition-notification
message/external-body
message/http
message/s-http
message/news
message/partial
message/rfc822 eml
model/iges igs iges
model/mesh msh mesh silo
model/vnd.dwf
model/vnd.flatland.3dml
model/vnd.gdl
model/vnd.gs-gdl
model/vnd.gtw
model/vnd.mts
model/vnd.vtu
model/vrml wrl vrml
multipart/alternative
multipart/appledouble
multipart/byteranges
multipart/digest
multipart/encrypted
multipart/form-data
multipart/header-set
multipart/mixed
multipart/parallel
multipart/related
multipart/report
multipart/signed
multipart/voice-message
text/calendar ics icz
text/css css
text/csv csv
text/directory
text/english
text/enriched
text/h323 323
text/html html htm shtml
text/iuls uls
text/mathml mml
text/parityfec
text/plain asc txt text pot
text/prs.lines.tag
text/rfc822-headers
text/richtext rtx
text/rtf
text/scriptlet sct wsc
text/t140
text/texmacs tm ts
text/tab-separated-values tsv
text/uri-list
text/vnd.abc
text/vnd.curl
text/vnd.DMClientScript
text/vnd.flatland.3dml
text/vnd.fly
text/vnd.fmi.flexstor
text/vnd.in3d.3dml
text/vnd.in3d.spot
text/vnd.IPTC.NewsML
text/vnd.IPTC.NITF
text/vnd.latex-z
text/vnd.motorola.reflex
text/vnd.ms-mediapackage
text/vnd.sun.j2me.app-descriptor jad
text/vnd.wap.si
text/vnd.wap.sl
text/vnd.wap.wml wml
text/vnd.wap.wmlscript wmls
text/x-bibtex bib
text/x-boo boo
text/x-c++hdr h++ hpp hxx hh
text/x-c++src c++ cpp cxx cc
text/x-chdr h
text/x-component htc
text/x-crontab
text/x-csh csh
text/x-csrc c
text/x-dsrc d
text/x-diff diff patch
text/x-haskell hs
text/x-java java
text/x-literate-haskell lhs
text/x-makefile
text/x-moc moc
text/x-pascal p pas
text/x-pcs-gcd gcd
text/x-perl pl pm
text/x-python py
text/x-server-parsed-html
text/x-setext etx
text/x-sh sh
text/x-tcl tcl tk
text/x-tex tex ltx sty cls
text/x-vcalendar vcs
text/x-vcard vcf
video/3gpp 3gp
video/dl dl
video/dv dif dv
video/fli fli
video/gl gl
video/mpeg mpeg mpg mpe
video/mp4 mp4
video/quicktime qt mov
video/mp4v-es
video/parityfec
video/pointer
video/vnd.fvt
video/vnd.motorola.video
video/vnd.motorola.videop
video/vnd.mpegurl mxu
video/vnd.mts
video/vnd.nokia.interleaved-multimedia
video/vnd.vivo
video/x-la-asf lsf lsx
video/x-mng mng
video/x-ms-asf asf asx
video/x-ms-wm wm
video/x-ms-wmv wmv
video/x-ms-wmx wmx
video/x-ms-wvx wvx
video/x-msvideo avi
video/x-sgi-movie movie
x-conference/x-cooltalk ice
x-epoc/x-sisx-app sisx
x-world/x-vrml vrm vrml wrl

View file

@ -1,20 +0,0 @@
module("webuci", package.seeall)
function prepare_req(uri)
require("luci.dispatcher").createindex()
env = {}
env.REQUEST_URI = uri
end
function handle_req(context)
env.SERVER_PROTOCOL = context.server_proto
env.REMOTE_ADDR = context.remote_addr
env.REQUEST_METHOD = context.request_method
env.PATH_INFO = context.uri
env.REMOTE_PORT = context.remote_port
env.SERVER_ADDR = context.server_addr
env.SCRIPT_NAME = env.REQUEST_URI:sub(1, #env.REQUEST_URI - #env.PATH_INFO)
luci.sgi.webuci.initenv(env)
luci.dispatcher.httpdispatch()
end

View file

@ -0,0 +1,61 @@
module("luci-plugin", package.seeall)
function normalize(path)
local newpath
while newpath ~= path do
if (newpath) then
path = newpath
end
newpath = string.gsub(path, "/[^/]+/../", "/")
end
return newpath
end
function init(path)
-- NB: path points to ROOT/usr/lib/boa, change it to /usr/lib/lua
root = normalize(path .. '/../../../')
path = normalize(path .. '/../lua/')
package.cpath = path..'?.so;'..package.cpath
package.path = path..'?.lua;'..package.path
require("luci.dispatcher")
require("luci.sgi.webuci")
require("uci")
if (root ~= '/') then
-- Entering dummy mode
uci.set_savedir(root..'/tmp/.uci')
uci.set_confdir(root..'/etc/config')
luci.sys.hostname = function() return "" end
luci.sys.loadavg = function() return 0,0,0,0,0 end
luci.sys.reboot = function() return end
luci.sys.sysinfo = function() return "","","" end
luci.sys.syslog = function() return "" end
luci.sys.net.arptable = function() return {} end
luci.sys.net.devices = function() return {} end
luci.sys.net.routes = function() return {} end
luci.sys.wifi.getiwconfig = function() return {} end
luci.sys.wifi.iwscan = function() return {} end
end
end
function prepare_req(uri)
luci.dispatcher.createindex()
env = {}
env.REQUEST_URI = uri
end
function handle_req(context)
env.SERVER_PROTOCOL = context.server_proto
env.REMOTE_ADDR = context.remote_addr
env.REQUEST_METHOD = context.request_method
env.PATH_INFO = context.uri
env.REMOTE_PORT = context.remote_port
env.SERVER_ADDR = context.server_addr
env.SCRIPT_NAME = env.REQUEST_URI:sub(1, #env.REQUEST_URI - #env.PATH_INFO)
luci.sgi.webuci.initenv(env, vars)
luci.dispatcher.httpdispatch()
end

530
libs/sgi-webuci/src/cgi.c Normal file
View file

@ -0,0 +1,530 @@
/*
* CGI routines for luci
* Copyright (C) 2008 Felix Fietkau <nbd@openwrt.org>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation.
*
* 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.
*/
/*
* Based on code from cgilib:
*
* cgi.c - Some simple routines for CGI programming
* Copyright (c) 1996-9,2007,8 Martin Schulze <joey@infodrom.org>
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#define _GNU_SOURCE 1
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdbool.h>
#include <strings.h>
#include <ctype.h>
#include <lauxlib.h>
#define BUFSIZE 128
static char *
cgiGetLine (FILE *stream)
{
static char *line = NULL;
static size_t size = 0;
char buf[BUFSIZE];
char *cp;
if (!line) {
if ((line = (char *)malloc (BUFSIZE)) == NULL)
return NULL;
size = BUFSIZE;
}
line[0] = '\0';
while (!feof (stream)) {
if ((cp = fgets (buf, sizeof (buf), stream)) == NULL)
return NULL;
if (strlen(line)+strlen(buf)+1 > size) {
if ((cp = (char *)realloc (line, size + BUFSIZE)) == NULL)
return line;
size += BUFSIZE;
line = cp;
}
strcat (line, buf);
if (line[strlen(line)-1] == '\n') {
line[strlen(line)-1] = '\0';
if (line[strlen(line)-1] == '\r')
line[strlen(line)-1] = '\0';
return line;
}
}
return NULL;
}
static const char *
luci_getenv(lua_State *L, const char *name)
{
const char *ret;
lua_getfield(L, lua_upvalueindex(2), name);
ret = lua_tostring(L, -1);
lua_pop(L, 1);
return ret;
}
static void
luci_setvar(lua_State *L, const char *name, const char *value, bool append)
{
/* Check if there is an existing value already */
lua_getfield(L, lua_upvalueindex(1), name);
if (lua_isnil(L, -1)) {
/* nope, we're safe - add a new one */
lua_pushstring(L, value);
lua_setfield(L, lua_upvalueindex(1), name);
} else if (lua_istable(L, -1) && append) {
/* it's a table already, but appending is requested
* take the last element and append the new string to it */
int tlast = lua_objlen(L, -1);
lua_rawgeti(L, -1, tlast);
lua_pushstring(L, value);
lua_pushstring(L, "\n");
lua_concat(L, 3);
lua_rawseti(L, -2, tlast);
} else if (lua_istable(L, -1)) {
/* it's a table, which means we already have two
* or more entries, add the next one */
int tnext = lua_objlen(L, -1) + 1; /* next entry */
lua_pushstring(L, value);
luaL_setn(L, -2, tnext);
lua_rawseti(L, -2, tnext);
} else if (lua_isstring(L, -1) && append) {
/* append the new string to the existing variable */
lua_pushstring(L, value);
lua_pushstring(L, "\n");
lua_concat(L, 3);
lua_setfield(L, lua_upvalueindex(1), name);
} else if (lua_isstring(L, -1)) {
/* we're trying to add a variable that already has
* a string value. convert the string value to a
* table and add our new value to the table as well
*/
lua_createtable(L, 2, 0);
lua_pushvalue(L, -2); /* copy of the initial string value */
lua_rawseti(L, -2, 1);
lua_pushstring(L, value);
lua_rawseti(L, -2, 2);
lua_setfield(L, lua_upvalueindex(1), name);
} else {
luaL_error(L, "Invalid table entry type for index '%s'", name);
}
}
char *cgiDecodeString (char *text)
{
char *cp, *xp;
for (cp=text,xp=text; *cp; cp++) {
if (*cp == '%') {
if (strchr("0123456789ABCDEFabcdef", *(cp+1))
&& strchr("0123456789ABCDEFabcdef", *(cp+2))) {
if (islower(*(cp+1)))
*(cp+1) = toupper(*(cp+1));
if (islower(*(cp+2)))
*(cp+2) = toupper(*(cp+2));
*(xp) = (*(cp+1) >= 'A' ? *(cp+1) - 'A' + 10 : *(cp+1) - '0' ) * 16
+ (*(cp+2) >= 'A' ? *(cp+2) - 'A' + 10 : *(cp+2) - '0');
xp++;cp+=2;
}
} else {
*(xp++) = *cp;
}
}
memset(xp, 0, cp-xp);
return text;
}
#if 0
/* cgiReadFile()
*
* Read and save a file fro a multipart request
*/
#include <errno.h>
char *cgiReadFile (FILE *stream, char *boundary)
{
char *crlfboundary, *buf;
size_t boundarylen;
int c;
unsigned int pivot;
char *cp;
char template[]= "/tmp/cgilibXXXXXX";
FILE *tmpfile;
int fd;
boundarylen = strlen(boundary)+3;
if ((crlfboundary = (char *)malloc (boundarylen)) == NULL)
return NULL;
sprintf (crlfboundary, "\r\n%s", boundary);
if ((buf = (char *)malloc (boundarylen)) == NULL) {
free (crlfboundary);
return NULL;
}
memset (buf, 0, boundarylen);
pivot = 0;
if ((fd = mkstemp (template)) == -1) {
free (crlfboundary);
free (buf);
return NULL;
}
if ((tmpfile = fdopen (fd, "w")) == NULL) {
free (crlfboundary);
free (buf);
unlink (template);
return NULL;
}
while (!feof (stream)) {
c = fgetc (stream);
if (c == 0) {
if (strlen (buf)) {
for (cp=buf; *cp; cp++)
putc (*cp, tmpfile);
memset (buf, 0, boundarylen);
pivot = 0;
}
putc (c, tmpfile);
continue;
}
if (strlen (buf)) {
if (crlfboundary[pivot+1] == c) {
buf[++pivot] = c;
if (strlen (buf) == strlen (crlfboundary))
break;
else
continue;
} else {
for (cp=buf; *cp; cp++)
putc (*cp, tmpfile);
memset (buf, 0, boundarylen);
pivot = 0;
}
}
if (crlfboundary[0] == c) {
buf[0] = c;
} else {
fputc (c, tmpfile);
}
}
if (!feof (stream))
fgets (buf, boundarylen, stream);
fclose (tmpfile);
free (crlfboundary);
free (buf);
return strdup (template);
}
#endif
/*
* Decode multipart/form-data
*/
#define MULTIPART_DELTA 5
void luci_parse_multipart (lua_State *L, char *boundary)
{
char *line;
char *cp, *xp;
char *name = NULL, *type = NULL;
char *fname = NULL;
int header = 1;
bool append = false;
while ((line = cgiGetLine (stdin)) != NULL) {
if (!strncmp (line, boundary, strlen(boundary))) {
header = 1;
if (name)
free(name);
if (type)
free(type);
name = NULL;
type = NULL;
append = false;
} else if (header && !name && !strncasecmp (line, "Content-Disposition: form-data; ", 32)) {
if ((cp = strstr (line, "name=\"")) == NULL)
continue;
cp += 6;
if ((xp = strchr (cp, '\"')) == NULL)
continue;
name = malloc(xp-cp + 1);
strncpy(name, cp, xp-cp);
name[xp-cp] = 0;
cgiDecodeString (name);
if ((cp = strstr (line, "filename=\"")) == NULL)
continue;
cp += 10;
if ((xp = strchr (cp, '\"')) == NULL)
continue;
fname = malloc(xp-cp + 1);
strncpy(fname, cp, xp-cp);
fname[xp-cp] = 0;
cgiDecodeString (fname);
} else if (header && !type && !strncasecmp (line, "Content-Type: ", 14)) {
cp = line + 14;
type = strdup (cp);
} else if (header) {
if (!strlen(line)) {
header = 0;
if (fname) {
#if 0
header = 1;
tmpfile = cgiReadFile (stdin, boundary);
if (!tmpfile) {
free (name);
free (fname);
if (type)
free (type);
name = fname = type = NULL;
}
cgiDebugOutput (2, "Wrote %s (%s) to file: %s", name, fname, tmpfile);
if (!strlen (fname)) {
cgiDebugOutput (3, "Found empty filename, removing");
unlink (tmpfile);
free (tmpfile);
free (name);
free (fname);
if (type)
free (type);
name = fname = type = NULL;
} else {
if ((file = (s_file *)malloc (sizeof (s_file))) == NULL) {
cgiDebugOutput (3, "malloc failed, ignoring %s=%s", name, fname);
unlink (tmpfile);
free (tmpfile);
free (name);
free (fname);
if (type)
free (type);
name = fname = type = NULL;
continue;
}
file->name = name;
file->type = type;
file->tmpfile = tmpfile;
if ((cp = rindex (fname, '/')) == NULL)
file->filename = fname;
else {
file->filename = strdup (++cp);
free (fname);
}
name = type = fname = NULL;
if (!files) {
if ((files = (s_file **)malloc(2*sizeof (s_file *))) == NULL) {
cgiDebugOutput (3, "malloc failed, ignoring %s=%s", name, fname);
unlink (tmpfile);
free (tmpfile);
free (name);
name = NULL;
if (type) {
free (type);
type = NULL;
}
free (file->filename);
free (file);
continue;
}
memset (files, 0, 2*sizeof (s_file *));
index = 0;
} else {
for (index=0; files[index]; index++);
if ((tmpf = (s_file **)realloc(files, (index+2)*sizeof (s_file *))) == NULL) {
cgiDebugOutput (3, "realloc failed, ignoring %s=%s", name, fname);
unlink (tmpfile);
free (tmpfile);
free (name);
if (type)
free (type);
free (file->filename);
free (file);
name = type = fname = NULL;
continue;
}
files = tmpf;
memset (files + index, 0, 2*sizeof (s_file *));
}
files[index] = file;
}
#else
free(fname);
fname = NULL;
#endif
}
}
} else {
if (!name)
return;
cgiDecodeString(line);
luci_setvar(L, name, line, append);
if (!append) /* beginning of variable contents */
append = true;
}
}
}
/* parse the request header and store variables
* in the array supplied as function argument 1 on the stack
*/
int luci_parse_header (lua_State *L)
{
int length;
char *line = NULL;
int numargs;
char *cp = NULL, *ip = NULL, *esp = NULL;
const char *ct, *il;
int i;
if (!lua_istable(L, lua_upvalueindex(1)))
luaL_error(L, "Invalid argument");
if (!lua_istable(L, lua_upvalueindex(2)))
luaL_error(L, "Invalid argument");
ct = luci_getenv(L, "content_type");
if (ct) {
ct = cp = strdup(ct);
}
if (cp && strstr(cp, "multipart/form-data") && strstr(cp, "boundary=")) {
cp = strstr(cp, "boundary=") + strlen ("boundary=") - 2;
*cp = *(cp+1) = '-';
luci_parse_multipart(L, cp);
free((char *) ct);
return 0;
}
free((char *) ct);
ct = luci_getenv(L, "request_method");
il = luci_getenv(L, "content_length");
if (!ct) {
fprintf(stderr, "no request method!\n");
return 0;
}
if (!strcmp(ct, "POST")) {
if (il) {
length = atoi(il);
if (length <= 0)
return 0;
line = (char *)malloc (length+2);
if (line)
fgets(line, length+1, stdin);
}
} else if (!strcmp(ct, "GET")) {
ct = luci_getenv(L, "query_string");
if (ct)
esp = strdup(ct);
if (esp && strlen(esp)) {
line = (char *)malloc (strlen(esp)+2);
if (line)
strcpy (line, esp);
}
free(esp);
}
if (!line)
return 0;
/*
* From now on all cgi variables are stored in the variable line
* and look like foo=bar&foobar=barfoo&foofoo=
*/
for (cp=line; *cp; cp++)
if (*cp == '+')
*cp = ' ';
if (strlen(line)) {
for (numargs=1,cp=line; *cp; cp++)
if (*cp == '&' || *cp == ';' ) numargs++;
} else
numargs = 0;
cp = line;
i=0;
while (*cp) {
char *name;
char *value;
if ((ip = (char *)strchr(cp, '&')) != NULL) {
*ip = '\0';
} else if ((ip = (char *)strchr(cp, ';')) != NULL) {
*ip = '\0';
} else
ip = cp + strlen(cp);
if ((esp=(char *)strchr(cp, '=')) == NULL)
goto skip;
if (!strlen(esp))
goto skip;
if (i >= numargs)
goto skip;
esp[0] = 0;
name = cp;
cgiDecodeString (name);
cp = ++esp;
value = cp;
cgiDecodeString (value);
luci_setvar(L, name, value, false);
skip:
cp = ++ip;
}
free(line);
return 0;
}

216
libs/sgi-webuci/src/luci.c Normal file
View file

@ -0,0 +1,216 @@
/*
* luci
* Copyright (C) 2008 John Crispin <blogic@openwrt.org>
* Copyright (C) 2008 Felix Fietkau <nbd@openwrt.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation
*
* 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.
*/
#include <string.h>
#include <stdio.h>
#include <boa-plugin.h>
#include <lauxlib.h>
#include <lualib.h>
#include <stdbool.h>
#include <stdlib.h>
#define LUAMAIN "luci.lua"
static lua_State *L = NULL;
extern int luci_parse_header (lua_State *L);
static int luci_init(struct httpd_plugin *p)
{
char *path = NULL;
int ret = 0;
L = luaL_newstate();
if (!L)
goto error;
luaL_openlibs(L);
path = malloc(strlen(p->dir) + sizeof(LUAMAIN) + 2);
strcpy(path, p->dir);
strcat(path, "/" LUAMAIN);
ret = luaL_dofile(L, path);
lua_getfield(L, LUA_GLOBALSINDEX, "luci-plugin");
do {
if (!lua_istable(L, -1)) {
ret = 1;
break;
}
lua_getfield(L, -1, "init");
if (!lua_isfunction(L, -1))
break;
lua_pushstring(L, p->dir);
ret = lua_pcall(L, 1, 0, 0);
} while (0);
free(path);
if (ret != 0)
goto error;
return 1;
error:
fprintf(stderr, "Error: ");
if (L) {
const char *s = lua_tostring(L, -1);
if (!s)
s = "unknown error";
fprintf(stderr, "%s\n", s);
lua_close(L);
} else {
fprintf(stderr, "Out of memory!\n");
}
return 0;
}
static void pushvar(char *name, char *val)
{
if (!val)
return;
lua_pushstring(L, val);
lua_setfield(L, -2, name);
}
static int luci_pcall(lua_State *L, char *func, int narg)
{
int ret;
ret = lua_pcall(L, narg, narg, 0);
if (ret) {
const char *s = lua_tostring(L, -1);
if (s)
fprintf(stderr, "Error running %s: %s\n", func, s);
return ret;
}
if (!narg)
return ret;
ret = lua_isnumber(L, -1);
if (!ret)
goto done;
ret = lua_tonumber(L, -1);
done:
lua_pop(L, 1);
return ret;
}
static int luci_prepare_req(struct httpd_plugin *p, struct http_context *ctx)
{
int ret;
lua_getglobal(L, "luci-plugin");
lua_getfield(L, -1, "prepare_req");
ret = lua_isfunction(L, -1);
if (!ret)
goto done;
lua_pushstring(L, ctx->uri);
ret = luci_pcall(L, "prepare_req", 1);
done:
lua_pop(L, 1);
return ret;
}
static int luci_handle_req(struct httpd_plugin *p, struct http_context *ctx)
{
int ret;
lua_newtable(L); /* new table for the http context */
/* convert http_context data structure to lua table */
#define PUSH(x) pushvar(#x, ctx->x)
PUSH(request_method);
PUSH(server_addr);
PUSH(server_proto);
PUSH(query_string);
PUSH(remote_addr);
lua_pushinteger(L, ctx->remote_port);
lua_setfield(L, -2, "remote_port");
PUSH(content_type);
PUSH(content_length);
PUSH(http_accept);
#undef PUSH
if (!strncmp(ctx->uri, p->prefix, strlen(p->prefix)))
pushvar("uri", ctx->uri + strlen(p->prefix));
else
pushvar("uri", ctx->uri);
/* make sure the global 'luci' table is prepared */
lua_getglobal(L, "luci-plugin");
if (!lua_istable(L, -1))
return 0;
lua_getfield(L, -1, "init_req");
if (!lua_isfunction(L, -1)) {
/* ignore error */
lua_pop(L, 1);
} else {
lua_pushvalue(L, -3);
luci_pcall(L, "init_req", 1);
}
/* storage space for cgi variables */
lua_newtable(L);
lua_pushvalue(L, -1); /* copy for setfield */
lua_setfield(L, -3, "vars");
lua_pushvalue(L, -3); /* the http context table */
/*
* make luci_parse_header a closure
* argument 1: the luci.vars table
* argument 2: the http context table
*/
lua_pushcclosure(L, luci_parse_header, 2);
ret = luci_pcall(L, "parse_header", 0);
lua_getfield(L, -1, "handle_req");
ret = lua_isfunction(L, -1);
if (!ret)
goto done;
lua_pushvalue(L, -3);
ret = luci_pcall(L, "handle_req", 1);
/* pop the luci and http context tables */
done:
lua_pop(L, 2);
return ret;
}
static void luci_unload(struct httpd_plugin *p)
{
lua_close(L);
}
HTTPD_PLUGIN {
.prefix = "/luci/",
.init = luci_init,
.done = luci_unload,
.prepare_req = luci_prepare_req,
.handle_req = luci_handle_req,
};

View file

@ -1,7 +1,7 @@
config core main
option lang de
option mediaurlbase /luci/fledermaus
option resourcebase /luci/resources
option mediaurlbase /luci-static/fledermaus
option resourcebase /luci-static/resources
config core brand
option title "OpenWRT Kamikaze"
@ -36,4 +36,4 @@ config internal languages
option en "English"
config internal themes
option Fledermaus "/luci/fledermaus"
option Fledermaus "/luci-static/fledermaus"

View file

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB