Merge pull request #5387 from diizzyy/admin-netdata
authorchamptar <champetier.etienne@gmail.com>
Sun, 21 Jan 2018 13:38:07 +0000 (14:38 +0100)
committerGitHub <noreply@github.com>
Sun, 21 Jan 2018 13:38:07 +0000 (14:38 +0100)
admin/netdata: Update to 1.9.0

358 files changed:
.travis_do.sh
devel/diffutils/Makefile
lang/ldbus/Makefile [new file with mode: 0644]
lang/lualanes/Makefile
lang/luaposix/Makefile
lang/luarocks/Makefile
lang/php7/Makefile
lang/php7/patches/0013-Add-support-for-use-of-the-system-timezone-database.patch
lang/php7/patches/1003-Fix-dl-cross-compiling-issue.patch
lang/php7/patches/1004-disable-phar-command.patch
lang/php7/patches/1005-fix-asm-constraints-in-aarch64-multiply-macro.patch [deleted file]
lang/php7/patches/1006-multiline-syslog.patch
lang/php7/patches/1007-ext-imap-config.m4-fix-ac_cv_u8t_decompose-check.patch [deleted file]
lang/php7/patches/1008-acinclude-valgrind.patch [new file with mode: 0644]
lang/php7/patches/1010-pcrelib-NativeMIPS.patch [new file with mode: 0644]
lang/python/Flask/Makefile
lang/python/Jinja2/Makefile
lang/python/MarkupSafe/Makefile
lang/python/Werkzeug/Makefile
lang/python/chardet/Makefile
lang/python/click/Makefile
lang/python/django-appconf/Makefile
lang/python/django-compressor/Makefile
lang/python/django-constance/Makefile
lang/python/django-jsonfield/Makefile
lang/python/django-picklefield/Makefile
lang/python/django-postoffice/Makefile
lang/python/django-restframework/Makefile
lang/python/django-statici18n/Makefile
lang/python/django/Makefile
lang/python/et_xmlfile/Makefile
lang/python/flup/Makefile
lang/python/gunicorn/Makefile
lang/python/itsdangerous/Makefile
lang/python/jdcal/Makefile
lang/python/openpyxl/Makefile
lang/python/pillow/Makefile
lang/python/pyodbc/Makefile
lang/python/python-asn1crypto/Makefile
lang/python/python-attrs/Makefile
lang/python/python-automat/Makefile [new file with mode: 0644]
lang/python/python-automat/patches/001-do-not-use-setuptools-scm-m2r.patch [new file with mode: 0644]
lang/python/python-automat/patches/002-omit-visualize.patch [new file with mode: 0644]
lang/python/python-automat/patches/003-omit-tests.patch [new file with mode: 0644]
lang/python/python-cffi/Makefile
lang/python/python-constantly/Makefile [new file with mode: 0644]
lang/python/python-crcmod/Makefile
lang/python/python-crypto/Makefile
lang/python/python-crypto/patches/002-fix-endianness-detect.patch
lang/python/python-crypto/patches/003-omit-tests.patch [new file with mode: 0644]
lang/python/python-cryptography/Makefile
lang/python/python-cryptography/patches/001-disable-setup-requirements.patch
lang/python/python-cryptography/patches/002-remove-undefined-dtls-methods.patch
lang/python/python-curl/Makefile
lang/python/python-dateutil/Makefile
lang/python/python-dns/Makefile
lang/python/python-dpkt/Makefile
lang/python/python-egenix-mx-base/Makefile
lang/python/python-enum34/Makefile
lang/python/python-evdev/Makefile
lang/python/python-gmpy2/Makefile
lang/python/python-gnupg/Makefile
lang/python/python-host.mk [new file with mode: 0644]
lang/python/python-hyperlink/Makefile [new file with mode: 0644]
lang/python/python-hyperlink/patches/001-omit-tests.patch [new file with mode: 0644]
lang/python/python-idna/Makefile
lang/python/python-incremental/Makefile [new file with mode: 0644]
lang/python/python-incremental/patches/001-omit-tests.patch [new file with mode: 0644]
lang/python/python-ipaddress/Makefile
lang/python/python-ldap/Makefile
lang/python/python-lxml/Makefile
lang/python/python-mysql/Makefile
lang/python/python-package-install.sh [new file with mode: 0644]
lang/python/python-package.mk [new file with mode: 0644]
lang/python/python-packages/Makefile
lang/python/python-parsley/Makefile
lang/python/python-parsley/patches/001-omit-tests.patch [deleted file]
lang/python/python-parsley/patches/001-py3-read-utf8.patch [new file with mode: 0644]
lang/python/python-parsley/patches/002-omit-tests.patch [new file with mode: 0644]
lang/python/python-pcapy/Makefile
lang/python/python-ply/Makefile
lang/python/python-psycopg2/Makefile
lang/python/python-pyasn1-modules/Makefile
lang/python/python-pyasn1/Makefile
lang/python/python-pycparser/Makefile
lang/python/python-pyopenssl/Makefile
lang/python/python-pyptlib/Makefile
lang/python/python-pyserial/Makefile
lang/python/python-service-identity/Makefile
lang/python/python-six/Makefile
lang/python/python-txsocksx/Makefile
lang/python/python-txsocksx/patches/001-omit-tests.patch
lang/python/python-txsocksx/patches/002-do-not-use-vcversioner.patch
lang/python/python-urllib3/Makefile
lang/python/python-version.mk [new file with mode: 0644]
lang/python/python-yaml/Makefile
lang/python/python-zope-interface/Makefile [new file with mode: 0644]
lang/python/python/Makefile
lang/python/python/files/python-host.mk [deleted file]
lang/python/python/files/python-package-install.sh [deleted file]
lang/python/python/files/python-package.mk [deleted file]
lang/python/python/files/python-version.mk [deleted file]
lang/python/python/patches/012-add-support-source-date-epoch-pyc.patch [new file with mode: 0644]
lang/python/python/patches/013-getbuildinfo-date-time-source-date-epoch.patch [new file with mode: 0644]
lang/python/python3-bottle/Makefile
lang/python/python3-host.mk [new file with mode: 0644]
lang/python/python3-package.mk [new file with mode: 0644]
lang/python/python3-version.mk [new file with mode: 0644]
lang/python/python3/Makefile
lang/python/python3/files/python3-host.mk [deleted file]
lang/python/python3/files/python3-package-install.sh [deleted file]
lang/python/python3/files/python3-package.mk [deleted file]
lang/python/python3/files/python3-version.mk [deleted file]
lang/python/python3/patches/001-enable-zlib.patch
lang/python/python3/patches/003-do-not-run-distutils-tests.patch
lang/python/python3/patches/006-remove-multi-arch-and-local-paths.patch
lang/python/python3/patches/010-do-not-add-rt-lib-dirs-when-cross-compiling.patch
lang/python/python3/patches/011-fix-ncursesw-definition-colisions.patch [deleted file]
lang/python/python3/patches/012-add-support-source-date-epoch-pyc.patch [new file with mode: 0644]
lang/python/python3/patches/013-getbuildinfo-date-time-source-date-epoch.patch [new file with mode: 0644]
lang/python/python3/patches/015-abort-on-failed-modules.patch
lang/python/python3/patches/016-adjust-config-paths.patch
lang/python/pytz/Makefile
lang/python/rcssmin/Makefile
lang/python/simplejson/Makefile
lang/python/twisted/Makefile
lang/python/twisted/patches/001-fix-zsh-completion.patch [deleted file]
lang/python/twisted/patches/001-omit-tkconch-patch [new file with mode: 0644]
lang/python/twisted/patches/002-omit-tests.patch
lang/python/zope-interface/Makefile [deleted file]
lang/ruby/Makefile
lang/ruby/patches/010-configure-2.4.2.patch [deleted file]
lang/ruby/ruby_find_pkgsdeps
lang/ruby/ruby_missingfiles
libs/avahi/Makefile
libs/boost/Makefile
libs/boost/patches/010-fiber_fix_0506e46640989e1f919388ad36890bd6063cd43a.patch [deleted file]
libs/confuse/Makefile
libs/elektra/Makefile
libs/freetype/Makefile
libs/glib2/Makefile
libs/libdmapsharing/Makefile
libs/libedit/Makefile
libs/libftdi1/Makefile
libs/libgcrypt/Makefile
libs/libgcrypt/patches/002-Add-configure-option-enable-build-timestamp.patch [new file with mode: 0644]
libs/libgee/Makefile
libs/libgee/patches/libgee-0.18.0-no-introspection.patch
libs/libhttp-parser/Makefile
libs/libiio/Makefile
libs/libiio/patches/001-quote-strequal.patch [deleted file]
libs/libimobiledevice/Makefile
libs/libjpeg/Makefile
libs/libndpi/Makefile
libs/libnetconf2/Makefile
libs/libsearpc/Makefile
libs/libsodium/Makefile
libs/libsoup/Makefile
libs/libunistring/Makefile
libs/liburcu/Makefile
libs/libxerces-c/Makefile
libs/libxerces-c/patches/0001-fix-configure-cross-compiling.patch [new file with mode: 0644]
libs/libyang/Makefile
libs/postgresql/Makefile
libs/sqlite3/Makefile
libs/vips/Makefile
libs/vips/patches/001-no_cpp.patch [deleted file]
libs/vips/patches/001-no_introspection.patch [new file with mode: 0644]
libs/zmq/Makefile
mail/mutt/Makefile
mail/pigeonhole/Makefile
mail/postfix/Makefile
mail/sendmail/Makefile [new file with mode: 0644]
mail/sendmail/files/OpenWrt [new file with mode: 0644]
mail/sendmail/files/lm_getver.c [new file with mode: 0644]
mail/sendmail/files/sharedlibrary.m4 [new file with mode: 0644]
mail/sendmail/files/site.OpenWrt.m4 [new file with mode: 0644]
mail/sendmail/patches/010-enable-nonroot-install.patch [new file with mode: 0644]
mail/sendmail/patches/011-libmilter-so-version.patch [new file with mode: 0644]
mail/sendmail/patches/100-misc-os-musl-fixes.patch [new file with mode: 0644]
mail/sendmail/patches/101-fix-format-security.patch [new file with mode: 0644]
mail/sendmail/patches/102-pthreads-stack-size.patch [new file with mode: 0644]
mail/sendmail/patches/103-create-install-dirs.patch [new file with mode: 0644]
multimedia/ffmpeg/Makefile
multimedia/grilo-plugins/Makefile
multimedia/grilo-plugins/patches/0001-dmap-Add-album-disc-number-mapping.patch [deleted file]
multimedia/grilo-plugins/patches/001-grilo-plugins-0.3.5-no-itstool-xmllint.patch [new file with mode: 0644]
multimedia/grilo/Makefile
multimedia/gst1-libav/Makefile
multimedia/gst1-plugins-bad/Makefile
multimedia/gst1-plugins-base/Makefile
multimedia/gst1-plugins-good/Makefile
multimedia/gst1-plugins-ugly/Makefile
multimedia/lcdgrilo/Makefile
multimedia/v4l2rtspserver/Makefile [new file with mode: 0644]
multimedia/v4l2rtspserver/files/config.openwrt [new file with mode: 0644]
multimedia/v4l2rtspserver/files/v4l2rtspserver.config [new file with mode: 0644]
multimedia/v4l2rtspserver/files/v4l2rtspserver.init [new file with mode: 0644]
multimedia/xupnpd/Makefile
net/adblock/Makefile
net/adblock/files/README.md
net/adblock/files/adblock.conf
net/adblock/files/adblock.init
net/adblock/files/adblock.notify [new file with mode: 0644]
net/adblock/files/adblock.sh
net/announce/Makefile
net/atftp/Makefile
net/bind/Makefile
net/chrony/Makefile
net/coova-chilli/Config.in
net/coova-chilli/Makefile
net/danish/Makefile
net/ddns-scripts/Makefile
net/ddns-scripts/files/dynamic_dns_functions.sh
net/ddns-scripts/files/dynamic_dns_lucihelper.sh
net/ddns-scripts/files/dynamic_dns_updater.sh
net/ddns-scripts/files/services
net/ddns-scripts/files/services_ipv6
net/ddns-scripts/files/update_cloudflare_com_v4.sh
net/ddns-scripts/files/update_godaddy_com_v1.sh
net/ddns-scripts/files/update_route53_v1.sh [new file with mode: 0644]
net/dnscrypt-proxy/Makefile
net/dnscrypt-proxy/files/dnscrypt-proxy.config
net/dnscrypt-proxy/files/dnscrypt-resolvers.csv
net/git/Makefile
net/gnunet/Makefile
net/gnurl/Makefile
net/i2pd/Makefile
net/i2pd/files/i2pd.init
net/i2pd/patches/010-cross-compile.patch [deleted file]
net/irssi/Makefile
net/kismet/Makefile
net/knot/Makefile
net/lcdringer/Makefile
net/lighttpd/Makefile
net/lighttpd/patches/0001-mod_cgi-RFC3875-CGI-local-redir-strict-adherence-210.patch [deleted file]
net/lighttpd/patches/0002-mod_cgi-fix-CGI-local-redir-w-url.rewrite-once-fixes.patch [deleted file]
net/lighttpd/patches/0003-mod_cgi-status-200-OK-if-no-hdrs-deprecated-2786.patch [deleted file]
net/lighttpd/patches/0004-mod_cgi-cgi.local-redir-enable-disable-2108-2793.patch [deleted file]
net/nbd/Makefile
net/netopeer2/Makefile
net/netopeer2/files/netopeer2-keystored-keygen.default
net/netopeer2/files/netopeer2-keystored.default
net/netopeer2/files/netopeer2-server.default
net/netopeer2/patches/002-fix-for-cmake-build [new file with mode: 0644]
net/nfs-kernel-server/Makefile
net/nginx/Makefile
net/ntpd/Makefile
net/ntpd/files/ntp.conf [deleted file]
net/ntpd/files/ntpd.hotplug-helper
net/ntpd/files/ntpd.init
net/obfsproxy/Makefile
net/ocserv/Makefile
net/ola/Makefile
net/ola/files/olad.init
net/openconnect/Makefile
net/openssh/Makefile
net/openvswitch/Makefile
net/radicale/Makefile
net/reaver/Makefile
net/rsync/Makefile
net/rsync/patches/012-check-fname-in-recv_files-sooner.patch [new file with mode: 0644]
net/rsync/patches/013-check-daemoin-filter-against.patch [new file with mode: 0644]
net/rsync/patches/014-sanitize-xname-in-read_ndx_and_attrs.patch [new file with mode: 0644]
net/scapy/Makefile
net/seafile-ccnet/Makefile
net/seafile-seahub/Makefile
net/seafile-seahub/patches/020-Makefile-fixes.patch
net/seafile-server/Makefile
net/ser2net/Makefile
net/ser2net/files/ser2net.conf [new file with mode: 0644]
net/ser2net/files/ser2net.config [new file with mode: 0644]
net/ser2net/files/ser2net.init [new file with mode: 0644]
net/shadowsocks-libev/Makefile
net/shadowsocks-libev/files/shadowsocks-libev.init
net/shorewall-core/Makefile
net/shorewall-lite/Makefile
net/shorewall/Makefile
net/shorewall/patches/120-logfile.patch
net/shorewall/patches/130-set-path.patch [new file with mode: 0644]
net/shorewall6-lite/Makefile
net/shorewall6-lite/patches/020-set-PATH.patch
net/shorewall6-lite/patches/120-logfile.patch
net/shorewall6/Makefile
net/shorewall6/patches/130-set-path.patch [new file with mode: 0644]
net/simple-adblock/Makefile
net/simple-adblock/files/simple-adblock.conf
net/simple-adblock/files/simple-adblock.init
net/sipgrep/Makefile [deleted file]
net/sngrep/Makefile [deleted file]
net/sysrepo/Makefile
net/sysrepo/files/libsysrepo.default
net/tgt/Makefile
net/travelmate/Makefile
net/travelmate/files/travelmate.init
net/travelmate/files/travelmate.sh
net/ulogd/Makefile
net/unbound/Makefile
net/unbound/files/odhcpd.awk
net/unbound/files/unbound.sh
net/unbound/patches/001-conf.patch
net/usbip/Makefile
net/vpnc/Makefile
net/vpnc/files/vpnc.sh
net/xl2tpd/Makefile
net/xl2tpd/README [deleted file]
net/xl2tpd/README.md [new file with mode: 0644]
net/xl2tpd/files/l2tp.sh
net/xtables-addons/Makefile [new file with mode: 0644]
net/xtables-addons/patches/002-fix-kernel-version-detection.patch [new file with mode: 0644]
net/xtables-addons/patches/100-add-rtsp-conntrack.patch [new file with mode: 0644]
net/xtables-addons/patches/200-add-lua-packetscript.patch [new file with mode: 0644]
net/xtables-addons/patches/201-fix-lua-packetscript.patch [new file with mode: 0644]
net/xtables-addons/patches/300-geoip-endian-detection.patch [new file with mode: 0644]
sound/shairport-sync/Makefile
sound/shairport-sync/files/shairport-sync.config
sound/shairport-sync/files/shairport-sync.init
sound/shairport-sync/patches/100-replace_polarssl_with_mbedtls.patch [deleted file]
sound/squeezelite/Makefile
utils/btrfs-progs/Makefile
utils/collectd/Makefile
utils/coreutils/Makefile
utils/cryptodev-linux/Makefile
utils/digitemp/Makefile [new file with mode: 0644]
utils/digitemp/patches/0001_add_missing_includes.patch [new file with mode: 0644]
utils/dmidecode/Makefile
utils/dump1090/Makefile
utils/dump1090/files/dump1090.default
utils/flashrom/Makefile
utils/flashrom/patches/0001-fix_internal_bitbang.patch
utils/flashrom/patches/0002-fix-io-h-include.patch
utils/gpsd/Makefile
utils/i2c-tools/Makefile
utils/lcd4linux/Makefile
utils/lm-sensors/Makefile
utils/lm-sensors/files/lm-sensors.init [new file with mode: 0644]
utils/lvm2/Makefile
utils/minicom/Makefile
utils/minicom/patches/110-reproducible-builds.patch
utils/mksh/Makefile
utils/mksh/patches/100-dot_mkshrc
utils/mysql/Makefile
utils/nano/Makefile
utils/nano/patches/001-backport-post287-fix-for-tiny-compilation.patch [deleted file]
utils/netwhere/Makefile
utils/opensc/Makefile
utils/pciutils/Makefile
utils/pciutils/patches/104-resolv.patch
utils/pciutils/patches/105-fix-host.patch
utils/pcsc-lite/Makefile
utils/pcsc-tools/Makefile
utils/procps-ng/Makefile
utils/rtl_433/Makefile [new file with mode: 0644]
utils/slide-switch/Makefile
utils/tar/Makefile
utils/tar/patches/001-CVE-2016-6321.patch [deleted file]
utils/tio/Makefile
utils/watchcat/Makefile

index 3c88d1768dcdb2e1d1604203ea4c2bede8eb7ece..e2dae41e2c8165c1515a11981434d6c9fb735e86 100755 (executable)
@@ -113,8 +113,8 @@ EOF
                pkg_name=$(echo "$pkg_dir" | awk -F/ '{ print $NF }')
                echo_blue "=== $pkg_name: Starting quick tests"
 
-               exec_status 'WARNING|ERROR' make "package/$pkg_name/download" V=s || RET=1
-               exec_status 'WARNING|ERROR' make "package/$pkg_name/check" V=s || RET=1
+               exec_status '^ERROR' make "package/$pkg_name/download" V=s || RET=1
+               exec_status '^ERROR' make "package/$pkg_name/check" V=s || RET=1
 
                echo_blue "=== $pkg_name: quick tests done"
        done
index cf8c6df887907231b9566124c656e21f10a4b8ea..643eaf9a1f026b7e666b479e94413b34373f2254 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=diffutils
-PKG_VERSION:=3.3
-PKG_RELEASE:=2
+PKG_VERSION:=3.6
+PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=@GNU/diffutils
-PKG_HASH:=a25e89a8ab65fded1731e4186be1bb25cda967834b6df973599cdcd5abdfc19c
+PKG_HASH:=d621e8bdd4b573918c8145f7ae61817d1be9deb4c8d2328a65cea8e11d783bd6
 PKG_MAINTAINER:=Roger D <rogerdammit@gmail.com>
 PKG_LICENSE:=GPL-3.0
 
diff --git a/lang/ldbus/Makefile b/lang/ldbus/Makefile
new file mode 100644 (file)
index 0000000..4c2d2d8
--- /dev/null
@@ -0,0 +1,63 @@
+#
+# Copyright (C) 2006-2017 OpenWrt.org
+#
+# This is free software, licensed under the GPL 2 license.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=ldbus
+PKG_RELEASE:=1
+PKG_MIRROR_HASH:=0e39a80e126a77a937226e49ae0246e1fd4600a03dee6bdee5ac822963a234e1
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_VERSION:=f4a1464e915a2313c80fb40c5c40b0bee7583677
+PKG_SOURCE_DATE:=2017-10-03
+PKG_SOURCE_URL=https://github.com/daurnimator/ldbus
+PKG_MAINTAINER:=Enrico Mioso <mrkiko.rs@gmail.com>
+PKG_LICENSE:=MIT
+
+PKG_FLAGS := nonshared
+
+PKG_BUILD_DEPENDS:=luarocks/host
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/ldbus
+  SUBMENU:=Lua
+  SECTION:=lang
+  CATEGORY:=Languages
+  TITLE:=ldbus Lua DBus bindings
+  DEPENDS:=+dbus +lua
+endef
+
+define Package/ldbus/description
+  This package contains "ldbus": LUA bindings to interact with the DBUS
+  message bus system, and services connected to it.
+  See https://github.com/daurnimator/ldbus
+  for details.
+endef
+
+TARGET_CFLAGS += \
+       -I$(STAGING_DIR)/usr/include
+
+MAKE_FLAGS += \
+       FPIC="$(FPIC)" \
+       CFLAGS="$(TARGET_CFLAGS)" \
+       LDFLAGS="$(TARGET_LDFLAGS)"
+
+define Package/ldbus/install
+       $(INSTALL_DIR) $(1)/usr/lib/lua
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/ldbus.so $(1)/usr/lib/lua
+endef
+
+define Build/Compile
+  cd $(PKG_BUILD_DIR) && \
+  luarocks make --pack-binary-rock ldbus-scm-0.rockspec \
+    DBUS_INCDIR=$(STAGING_DIR)/usr/include/dbus-1.0/ \
+    DBUS_ARCH_INCDIR=$(STAGING_DIR)/usr/lib/dbus-1.0/include \
+    DBUS_LIBDIR=$(STAGING_DIR)/usr/lib \
+    CC="$(TARGET_CC)" LD="$(TARGET_CC)"
+endef
+
+$(eval $(call BuildPackage,ldbus))
index 83ede1abf81f1a22fff1a027395a1dc05e7d5b96..ca4573b4b54e5edfe072c0ba7a369fd95c1af60c 100644 (file)
@@ -22,7 +22,7 @@ PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
 PKG_INSTALL:=1
 PKG_BUILD_PARALLEL:=1
 
-PKG_BUILD_DEPENDS:=lua/host luac/host
+PKG_BUILD_DEPENDS:=lua/host
 
 include $(INCLUDE_DIR)/package.mk
 
index c9f82c0ee58dd267fd0f84ac92a0823df1c5ba81..abc1e52bbe10b64ae05b87c8900c85460c75f4b4 100644 (file)
@@ -21,6 +21,8 @@ PKG_MAINTAINER:=Maxim Storchak <m.storchak@gmail.com>
 PKG_LICENSE:=MIT
 PKG_LICENSE_FILES:=COPYING
 
+PKG_BUILD_DEPENDS:=lua/host
+
 include $(INCLUDE_DIR)/package.mk
 
 define Package/luaposix
@@ -30,7 +32,6 @@ define Package/luaposix
   TITLE:=luaposix
   URL:=http://luaforge.net/projects/luaposix/
   DEPENDS:=+lua +librt
-  PKG_BUILD_DEPENDS:=+lua/host
 endef
 
 define Package/luaposix/description
index a0943fc3f6ea35cc97c9e2ad815fdfeb1f2c0dc9..3428ef8381860951fe21e096261d9fee5a6ae1b4 100644 (file)
@@ -20,9 +20,12 @@ PKG_SOURCE_VERSION:=v$(PKG_VERSION)
 
 PKG_MAINTAINER:=Amr Hassan <amr.hassan@gmail.com>
 PKG_INSTALL=1
-PKG_BUILD_DEPENDS:=lua/host luac/host
+PKG_BUILD_DEPENDS:=lua/host
+HOST_BUILD_DEPENDS:=$(PKG_BUILD_DEPENDS)
 PKG_LICENSE=GPL
+HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/$(PKG_NAME)-$(PKG_VERSION)
 
+include $(INCLUDE_DIR)/host-build.mk
 include $(INCLUDE_DIR)/package.mk
 
 define Package/luarocks
@@ -44,6 +47,11 @@ CONFIGURE_ARGS = \
     --sysconfdir=/etc \
     --with-lua=$(STAGING_DIR_HOSTPKG)
 
+HOST_CONFIGURE_ARGS= \
+    --prefix=$(STAGING_DIR_HOSTPKG) \
+    --sysconfdir=$(STAGING_DIR_HOSTPKG)/etc \
+    --with-lua=$(STAGING_DIR_HOSTPKG)
+
 CONFIGURE_VARS = \
        LUAROCKS_UNAME_S="Linux" \
        LUAROCKS_UNAME_M="$(ARCH)"
@@ -52,6 +60,10 @@ define Build/Compile
        $(call Build/Compile/Default,build)
 endef
 
+define Host/Compile
+  $(call Host/Compile/Default,build)
+endef
+
 define Package/luarocks/install
        $(INSTALL_DIR) $(1)/usr/bin
        $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/luarocks-5.1 $(1)/usr/bin/luarocks
@@ -60,4 +72,10 @@ define Package/luarocks/install
        $(CP) $(PKG_INSTALL_DIR)/etc $(1)/etc
 endef
 
+define Host/Install
+  $(MAKE) -C $(HOST_BUILD_DIR) install
+endef
+
 $(eval $(call BuildPackage,luarocks))
+
+$(eval $(call HostBuild))
index f50f554044eaac924dfdbeb44ea2bd8458fe566f..48d98891fc5ab8d6d0e8f2a0f51aab3fdac776d6 100644 (file)
@@ -6,8 +6,8 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=php
-PKG_VERSION:=7.1.12
-PKG_RELEASE:=3
+PKG_VERSION:=7.2.1
+PKG_RELEASE:=1
 
 PKG_MAINTAINER:=Michael Heimpold <mhei@heimpold.de>
 
@@ -16,7 +16,7 @@ PKG_LICENSE_FILES:=LICENSE
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=http://www.php.net/distributions/
-PKG_HASH:=a0118850774571b1f2d4e30b4fe7a4b958ca66f07d07d65ebdc789c54ba6eeb3
+PKG_HASH:=6c6cf82fda6660ed963821eb0525214bb3547e8e29f447b9c15b2d8e6efd8822
 
 PKG_FIXUP:=libtool autoreconf
 PKG_BUILD_PARALLEL:=1
@@ -33,7 +33,7 @@ PHP7_MODULES = \
        iconv imap intl \
        json \
        ldap \
-       mbstring mcrypt mysqli \
+       mbstring mysqli \
        opcache openssl \
        pcntl pdo pdo-mysql pdo-pgsql pdo-sqlite pgsql phar \
        session shmop simplexml snmp soap sockets sqlite3 sysvmsg sysvsem sysvshm \
@@ -289,12 +289,6 @@ else
   CONFIGURE_ARGS+= --disable-mbstring
 endif
 
-ifneq ($(SDK)$(CONFIG_PACKAGE_php7-mod-mcrypt),)
-  CONFIGURE_ARGS+= --with-mcrypt=shared,"$(STAGING_DIR)/usr"
-else
-  CONFIGURE_ARGS+= --without-mcrypt
-endif
-
 ifneq ($(SDK)$(CONFIG_PACKAGE_php7-mod-mysqli),)
   CONFIGURE_ARGS+= --with-mysqli=shared,"$(STAGING_DIR)/usr/bin/mysql_config"
 else
@@ -307,7 +301,7 @@ else
   CONFIGURE_ARGS+= --disable-opcache
 endif
 
-ifneq ($(SDK)$(CONFIG_PACKAGE_php7-mod-openssl)$(CONFIG_PACKAGE_php7-mod-snmp),)
+ifneq ($(SDK)$(CONFIG_PACKAGE_php7-mod-openssl)$(CONFIG_PACKAGE_php7-mod-ftp)$(CONFIG_PACKAGE_php7-mod-imap)$(CONFIG_PACKAGE_php7-mod-snmp),)
   CONFIGURE_ARGS+= \
        --with-openssl=shared,"$(STAGING_DIR)/usr" \
        --with-kerberos=no \
@@ -475,6 +469,7 @@ CONFIGURE_VARS+= \
        iconv_impl_name="gnu_libiconv" \
        ac_cv_php_xml2_config_path="$(STAGING_DIR)/host/bin/xml2-config" \
        ac_cv_u8t_decompose=yes \
+       ac_cv_enable_valgrind_check=no \
 
 define Package/php7/conffiles
 /etc/php.ini
@@ -605,7 +600,6 @@ $(eval $(call BuildModule,intl,Internationalization Functions,+PACKAGE_php7-mod-
 $(eval $(call BuildModule,json,JSON))
 $(eval $(call BuildModule,ldap,LDAP,+PACKAGE_php7-mod-ldap:libopenldap +PACKAGE_php7-mod-ldap:libsasl2))
 $(eval $(call BuildModule,mbstring,MBString))
-$(eval $(call BuildModule,mcrypt,Mcrypt,+PACKAGE_php7-mod-mcrypt:libmcrypt +PACKAGE_php7-mod-mcrypt:libltdl))
 $(eval $(call BuildModule,mysqli,MySQL Improved Extension,+PACKAGE_php7-mod-mysqli:libmysqlclient))
 $(eval $(call BuildModule,opcache,OPcache,,,zend))
 $(eval $(call BuildModule,openssl,OpenSSL,+PACKAGE_php7-mod-openssl:libopenssl))
index 819ad1e95d4b61b1b18ead5af2d1e415778c2fea..97fd734af9c73fadba7d59513589f5fadf4740c4 100644 (file)
@@ -1,11 +1,11 @@
-From: Joe Orton <jorton@redhat.com>
-Date: Thu, 20 Oct 2016 11:44:14 +0200
-Subject: Add support for use of the system timezone database
+# License: MIT
+# http://opensource.org/licenses/MIT
 
 Add support for use of the system timezone database, rather
 than embedding a copy.  Discussed upstream but was not desired.
 
 History:
+r15: adapt for timelib 2017.05beta7 (in 7.2.0RC1)
 r14: improve check for valid tz file
 r13: adapt for upstream changes to use PHP allocator
 r12: adapt for upstream changes for new zic
@@ -25,18 +25,13 @@ r4: added "System/Localtime" tzname which uses /etc/localtime
 r3: fix a crash if /usr/share/zoneinfo doesn't exist (Raphael Geissert)
 r2: add filesystem trawl to set up name alias index
 r1: initial revision
----
- ext/date/lib/parse_tz.c | 560 +++++++++++++++++++++++++++++++++++++++++++++++-
- ext/date/lib/timelib.m4 |  13 ++
- 2 files changed, 562 insertions(+), 11 deletions(-)
 
-diff --git a/ext/date/lib/parse_tz.c b/ext/date/lib/parse_tz.c
-index 20d7eea..ed7717e 100644
---- a/ext/date/lib/parse_tz.c
-+++ b/ext/date/lib/parse_tz.c
-@@ -24,6 +24,16 @@
+diff -up ./ext/date/lib/parse_tz.c.systzdata ./ext/date/lib/parse_tz.c
+--- ./ext/date/lib/parse_tz.c.systzdata        2017-08-22 09:40:38.000000000 +0200
++++ ./ext/date/lib/parse_tz.c  2017-08-22 12:16:00.370298079 +0200
+@@ -25,8 +25,21 @@
  #include "timelib.h"
+ #include "timelib_private.h"
  
 +#ifdef HAVE_SYSTEM_TZDATA
 +#include <sys/mman.h>
@@ -46,16 +41,8 @@ index 20d7eea..ed7717e 100644
 +#include <unistd.h>
 +
 +#include "php_scandir.h"
-+#endif
 +
- #include <stdio.h>
- #ifdef HAVE_LOCALE_H
-@@ -36,8 +46,12 @@
- #include <strings.h>
- #endif
-+#ifndef HAVE_SYSTEM_TZDATA
++#else
  #define TIMELIB_SUPPORTS_V2DATA
  #include "timezonedb.h"
 +#endif
@@ -64,7 +51,7 @@ index 20d7eea..ed7717e 100644
  
  #if (defined(__APPLE__) || defined(__APPLE_CC__)) && (defined(__BIG_ENDIAN__) || defined(__LITTLE_ENDIAN__))
  # if defined(__LITTLE_ENDIAN__)
-@@ -59,6 +73,11 @@ static int read_preamble(const unsigned char **tzf, timelib_tzinfo *tz)
+@@ -67,6 +80,11 @@ static int read_php_preamble(const unsig
  {
        uint32_t version;
  
@@ -76,7 +63,7 @@ index 20d7eea..ed7717e 100644
        /* read ID */
        version = (*tzf)[3] - '0';
        *tzf += 4;
-@@ -302,7 +321,429 @@ void timelib_dump_tzinfo(timelib_tzinfo *tz)
+@@ -374,7 +392,429 @@ void timelib_dump_tzinfo(timelib_tzinfo
        }
  }
  
@@ -507,7 +494,7 @@ index 20d7eea..ed7717e 100644
  {
        int left = 0, right = tzdb->index_size - 1;
  #ifdef HAVE_SETLOCALE
-@@ -341,21 +782,88 @@ static int seek_to_tz_position(const unsigned char **tzf, char *timezone, const
+@@ -419,9 +859,48 @@ static int seek_to_tz_position(const uns
        return 0;
  }
  
@@ -555,17 +542,8 @@ index 20d7eea..ed7717e 100644
 +#endif
  }
  
- const timelib_tzdb_index_entry *timelib_timezone_builtin_identifiers_list(int *count)
- {
-+#ifdef HAVE_SYSTEM_TZDATA
-+      *count = timezonedb_system->index_size;
-+      return timezonedb_system->index;
-+#else
-       *count = sizeof(timezonedb_idx_builtin) / sizeof(*timezonedb_idx_builtin);
-       return timezonedb_idx_builtin;
-+#endif
- }
+ const timelib_tzdb_index_entry *timelib_timezone_identifiers_list(timelib_tzdb *tzdb, int *count)
+@@ -433,7 +912,30 @@ const timelib_tzdb_index_entry *timelib_
  int timelib_timezone_id_is_valid(char *timezone, const timelib_tzdb *tzdb)
  {
        const unsigned char *tzf;
@@ -596,32 +574,27 @@ index 20d7eea..ed7717e 100644
 +      return (inmem_seek_to_tz_position(&tzf, timezone, tzdb));
  }
  
- static void skip_64bit_preamble(const unsigned char **tzf, timelib_tzinfo *tz)
-@@ -380,24 +888,54 @@ static void read_64bit_header(const unsigned char **tzf, timelib_tzinfo *tz)
- timelib_tzinfo *timelib_parse_tzfile(char *timezone, const timelib_tzdb *tzdb)
+ static int skip_64bit_preamble(const unsigned char **tzf, timelib_tzinfo *tz)
+@@ -475,12 +977,14 @@ static timelib_tzinfo* timelib_tzinfo_ct
+ timelib_tzinfo *timelib_parse_tzfile(char *timezone, const timelib_tzdb *tzdb, int *error_code)
  {
        const unsigned char *tzf;
 +      char *memmap = NULL;
 +      size_t maplen;
        timelib_tzinfo *tmp;
        int version;
+       int transitions_result, types_result;
+       unsigned int type; /* TIMELIB_TZINFO_PHP or TIMELIB_TZINFO_ZONEINFO */
  
 -      if (seek_to_tz_position(&tzf, timezone, tzdb)) {
 +      if (seek_to_tz_position(&tzf, timezone, &memmap, &maplen, tzdb)) {
                tmp = timelib_tzinfo_ctor(timezone);
  
-               version = read_preamble(&tzf, tmp);
-               read_header(&tzf, tmp);
-               read_transistions(&tzf, tmp);
-               read_types(&tzf, tmp);
--              if (version == 2) {
--                      skip_64bit_preamble(&tzf, tmp);
--                      read_64bit_header(&tzf, tmp);
--                      skip_64bit_transistions(&tzf, tmp);
--                      skip_64bit_types(&tzf, tmp);
--                      skip_posix_string(&tzf, tmp);
--              }
--              read_location(&tzf, tmp);
+               version = read_preamble(&tzf, tmp, &type);
+@@ -503,6 +1007,29 @@ timelib_tzinfo *timelib_parse_tzfile(cha
+                       timelib_tzinfo_dtor(tmp);
+                       return NULL;
+               }
 +
 +#ifdef HAVE_SYSTEM_TZDATA
 +              if (memmap) {
@@ -638,34 +611,30 @@ index 20d7eea..ed7717e 100644
 +                              tmp->bc = 1;
 +                      }
 +                      else {
-+                              strcpy(tmp->location.country_code, "??");
-+                              tmp->bc = 0;
-+                              tmp->location.comments = timelib_strdup("");
++                              set_default_location_and_comments(&tzf, tmp);
 +                      }
 +
 +                      /* Now done with the mmap segment - discard it. */
 +                      munmap(memmap, maplen);
-+              } else
++              } else {
++#endif
+               if (version == 2 || version == 3) {
+                       if (!skip_64bit_preamble(&tzf, tmp)) {
+                               /* 64 bit preamble is not in place */
+@@ -520,6 +1047,9 @@ timelib_tzinfo *timelib_parse_tzfile(cha
+               } else {
+                       set_default_location_and_comments(&tzf, tmp);
+               }
++#ifdef HAVE_SYSTEM_TZDATA
++              }
 +#endif
-+              {
-+                      /* PHP-style - use the embedded info. */
-+                      if (version == 2) {
-+                              skip_64bit_preamble(&tzf, tmp);
-+                              read_64bit_header(&tzf, tmp);
-+                              skip_64bit_transistions(&tzf, tmp);
-+                              skip_64bit_types(&tzf, tmp);
-+                              skip_posix_string(&tzf, tmp);
-+                      }
-+                      read_location(&tzf, tmp);
-+              }
        } else {
+               *error_code = TIMELIB_ERROR_NO_SUCH_TIMEZONE;
                tmp = NULL;
-       }
-diff --git a/ext/date/lib/timelib.m4 b/ext/date/lib/timelib.m4
-index 99bf9fa..4bf7e46 100644
---- a/ext/date/lib/timelib.m4
-+++ b/ext/date/lib/timelib.m4
-@@ -78,3 +78,16 @@ stdlib.h
+diff -up ./ext/date/lib/timelib.m4.systzdata ./ext/date/lib/timelib.m4
+--- ./ext/date/lib/timelib.m4.systzdata        2017-08-22 09:40:38.000000000 +0200
++++ ./ext/date/lib/timelib.m4  2017-08-22 11:32:29.357799927 +0200
+@@ -81,3 +81,16 @@ io.h
  
  dnl Check for strtoll, atoll
  AC_CHECK_FUNCS(strtoll atoll strftime gettimeofday)
index 22122ec824506bc41277c426774c6af6157016c4..5359ab99708ea98a07a6aa1a71d0c690dbd455c7 100644 (file)
@@ -1,5 +1,5 @@
---- a/configure.in
-+++ b/configure.in
+--- a/configure.ac
++++ b/configure.ac
 @@ -453,7 +453,10 @@ PHP_CHECK_FUNC(gethostname, nsl)
  PHP_CHECK_FUNC(gethostbyaddr, nsl)
  PHP_CHECK_FUNC(yp_get_default_domain, nsl)
index 19837f53f5db9612e88a3569c24686ee576959f3..e6162cdfbbc8c22021611491ed0604c811c1c4c2 100644 (file)
@@ -9,8 +9,8 @@
  
    PHP_INSTALL_HEADERS([ext/phar], [php_phar.h])
  
---- a/configure.in     2016-09-20 22:26:38.000000000 +0200
-+++ b/configure.in     2016-09-20 22:42:30.380101556 +0200
+--- a/configure.ac     2016-09-20 22:26:38.000000000 +0200
++++ b/configure.ac     2016-09-20 22:42:30.380101556 +0200
 @@ -1448,13 +1448,13 @@
  INLINE_CFLAGS="$INLINE_CFLAGS $standard_libtool_flag"
  CXXFLAGS="$CXXFLAGS $standard_libtool_flag \$(PROF_FLAGS)"
diff --git a/lang/php7/patches/1005-fix-asm-constraints-in-aarch64-multiply-macro.patch b/lang/php7/patches/1005-fix-asm-constraints-in-aarch64-multiply-macro.patch
deleted file mode 100644 (file)
index 0afa951..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-From 6cbb9f4c247c5361b8c165fbb40b4118d5d7c0e5 Mon Sep 17 00:00:00 2001
-From: Andreas Schwab <schwab@linux-m68k.org>
-Date: Mon, 25 Apr 2016 11:59:14 +0200
-Subject: [PATCH] Fix asm constraints in aarch64 multiply macro
-
-All operands must be register operands and the output operands are early
-clobbered.
----
- Zend/zend_multiply.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/Zend/zend_multiply.h b/Zend/zend_multiply.h
-index dfd21f7..651dd43 100644
---- a/Zend/zend_multiply.h
-+++ b/Zend/zend_multiply.h
-@@ -53,8 +53,8 @@
-       __asm__("mul %0, %2, %3\n"                                                                              \
-               "smulh %1, %2, %3\n"                                                                            \
-               "sub %1, %1, %0, asr #63\n"                                                                     \
--                      : "=X"(__tmpvar), "=X"(usedval)                                                 \
--                      : "X"(a), "X"(b));                                                                              \
-+                      : "=&r"(__tmpvar), "=&r"(usedval)                                               \
-+                      : "r"(a), "r"(b));                                                                              \
-       if (usedval) (dval) = (double) (a) * (double) (b);                              \
-       else (lval) = __tmpvar;                                                                                 \
- } while (0)
--- 
-2.8.0
-
index 28a53b4aa373c615880e0bcdc720d0cff5222e2e..1346481f2cd7f3bda32d9a919153bf8c57dd5542 100644 (file)
@@ -1,41 +1,43 @@
-commit 4d77af8d7d349b7b9e43082deb47c1469f450115
+commit f11d40ef88f640fe4764d2731d3061472aefe556
 Author: Philip Prindeville <philipp@redfish-solutions.com>
-Date:   Fri Aug 18 12:05:44 2017 -0600
+Date:   Wed Aug 9 20:55:25 2017 -0600
 
-    Backport of fix for Issue #74860
+    Turn php_syslog() into wrapper for syslog and split lines
 
-diff --git a/configure.in b/configure.in
-index 9acf42b..559a274 100644
---- a/configure.in
-+++ b/configure.in
-@@ -1470,7 +1470,7 @@ PHP_ADD_SOURCES(main, main.c snprintf.c spprintf.c php_sprintf.c \
+diff --git a/Zend/zend_smart_string.h b/Zend/zend_smart_string.h
+index 2282202..12d755e 100644
+--- a/Zend/zend_smart_string.h
++++ b/Zend/zend_smart_string.h
+@@ -136,6 +136,10 @@ static zend_always_inline void smart_string_setl(smart_string *dest, char *src,
+       dest->c = src;
+ }
++static zend_always_inline void smart_string_reset(smart_string *str) {
++      str->len = 0;
++}
++
+ #endif
+ /*
+diff --git a/configure.ac b/configure.ac
+index cb95d86..a63354f 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1443,7 +1443,7 @@ PHP_ADD_SOURCES(main, main.c snprintf.c spprintf.c php_sprintf.c \
         php_ini.c SAPI.c rfc1867.c php_content_types.c strlcpy.c \
-        strlcat.c mergesort.c reentrancy.c php_variables.c php_ticks.c \
+        strlcat.c explicit_bzero.c mergesort.c reentrancy.c php_variables.c php_ticks.c \
         network.c php_open_temporary_file.c \
 -       output.c getopt.c, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
 +       output.c getopt.c php_syslog.c, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
  
  PHP_ADD_SOURCES_X(main, fastcgi.c, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1, PHP_FASTCGI_OBJS, no)
  
-diff --git a/ext/standard/php_smart_string.h b/ext/standard/php_smart_string.h
-index adb78c0..8d90688 100644
---- a/ext/standard/php_smart_string.h
-+++ b/ext/standard/php_smart_string.h
-@@ -146,4 +146,8 @@
- #define smart_string_sets(dest, src) \
-       smart_string_setl((dest), (src), strlen(src));
-+#define smart_string_reset(dest) do {         \
-+      (dest)->len = 0;                        \
-+} while (0)
-+
- #endif
 diff --git a/main/php_syslog.c b/main/php_syslog.c
 new file mode 100644
-index 0000000..43d1f56
+index 0000000..c351951
 --- /dev/null
 +++ b/main/php_syslog.c
-@@ -0,0 +1,80 @@
+@@ -0,0 +1,81 @@
 +/*
 +   +----------------------------------------------------------------------+
 +   | PHP Version 7                                                        |
@@ -64,7 +66,7 @@ index 0000000..43d1f56
 +#include "php_syslog.h"
 +
 +#include "zend.h"
-+#include "ext/standard/php_smart_string.h"
++#include "zend_smart_string.h"
 +
 +/*
 + * The SCO OpenServer 5 Development System (not the UDK)
@@ -79,15 +81,16 @@ index 0000000..43d1f56
 +{
 +      const char *ptr;
 +      unsigned char c;
-+      char *message = NULL;
++      smart_string fbuf = {0};
 +      smart_string sbuf = {0};
 +      va_list args;
 +
 +      va_start(args, format);
-+      vspprintf(&message, 0, format, args);
++      zend_printf_to_smart_string(&fbuf, format, args);
++      smart_string_0(&fbuf);
 +      va_end(args);
 +
-+      for (ptr = message; ; ++ptr) {
++      for (ptr = fbuf.c; ; ++ptr) {
 +              c = *ptr;
 +              if (c == '\0') {
 +                      syslog(priority, "%.*s", (int)sbuf.len, sbuf.c);
@@ -102,7 +105,7 @@ index 0000000..43d1f56
 +              }
 +      }
 +
-+      efree(message);
++      smart_string_free(&fbuf);
 +      smart_string_free(&sbuf);
 +}
 +
@@ -117,7 +120,7 @@ index 0000000..43d1f56
 + * vim<600: sw=4 ts=4
 + */
 diff --git a/main/php_syslog.h b/main/php_syslog.h
-index 33f52a3..a09f98c 100644
+index be68cc4..4c4ca4e 100644
 --- a/main/php_syslog.h
 +++ b/main/php_syslog.h
 @@ -21,6 +21,8 @@
@@ -129,7 +132,7 @@ index 33f52a3..a09f98c 100644
  #ifdef PHP_WIN32
  #include "win32/syslog.h"
  #else
-@@ -30,23 +32,8 @@
+@@ -30,26 +32,12 @@
  #endif
  #endif
  
@@ -145,22 +148,25 @@ index 33f52a3..a09f98c 100644
 -#endif
 -
 -#undef syslog
--
--#endif
--
--#ifndef php_syslog
--#define php_syslog syslog
--#endif
 +BEGIN_EXTERN_C()
 +PHPAPI void php_syslog(int, const char *format, ...);
 +END_EXTERN_C()
  
  #endif
+-#ifndef php_syslog
+-#define php_syslog syslog
+-#endif
+-
+-#endif
+ /*
+  * Local variables:
+  * tab-width: 4
 diff --git a/win32/build/config.w32 b/win32/build/config.w32
-index 1269c6e..f766e53 100644
+index 6cbb18b..71cf491 100644
 --- a/win32/build/config.w32
 +++ b/win32/build/config.w32
-@@ -237,7 +237,8 @@ ADD_FLAG("CFLAGS_BD_ZEND", "/D ZEND_ENABLE_STATIC_TSRMLS_CACHE=1");
+@@ -244,7 +244,8 @@ ADD_FLAG("CFLAGS_BD_ZEND", "/D ZEND_ENABLE_STATIC_TSRMLS_CACHE=1");
  ADD_SOURCES("main", "main.c snprintf.c spprintf.c getopt.c fopen_wrappers.c \
        php_scandir.c php_ini.c SAPI.c rfc1867.c php_content_types.c strlcpy.c \
        strlcat.c mergesort.c reentrancy.c php_variables.c php_ticks.c network.c \
@@ -168,5 +174,5 @@ index 1269c6e..f766e53 100644
 +      php_open_temporary_file.c output.c internal_functions.c php_sprintf.c \
 +      php_syslog.c");
  ADD_FLAG("CFLAGS_BD_MAIN", "/D ZEND_ENABLE_STATIC_TSRMLS_CACHE=1");
- ADD_SOURCES("win32", "inet.c fnmatch.c sockets.c");
  
+ AC_DEFINE('HAVE_STRNLEN', 1);
diff --git a/lang/php7/patches/1007-ext-imap-config.m4-fix-ac_cv_u8t_decompose-check.patch b/lang/php7/patches/1007-ext-imap-config.m4-fix-ac_cv_u8t_decompose-check.patch
deleted file mode 100644 (file)
index 88b2db4..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-From 96465be0f4ac225cfe6f52b809c91b9496807eac Mon Sep 17 00:00:00 2001
-From: Michael Heimpold <mhei@heimpold.de>
-Date: Sun, 26 Nov 2017 18:29:42 +0100
-Subject: [PATCH] ext/imap/config.m4: fix ac_cv_u8t_decompose check
-
-Once upon the time, commit c58f63a38ae19caaab339c61486fc3bd7e5894f9
-changed the check from U8T_CANONICAL to U8T_DECOMPOSE. However,
-the autoconf cache id was not renamed.
-
-Sometimes it is desirable to preseed the autoconf variables, e.g. when
-cross-compiling to avoid the tests running on the host system. In this
-case it's confusing when the cache id does not match the variable to
-set, so let's adjust it.
-
-Signed-off-by: Michael Heimpold <mhei@heimpold.de>
----
- ext/imap/config.m4 | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/ext/imap/config.m4 b/ext/imap/config.m4
-index d0b86cb..badb6e2 100644
---- a/ext/imap/config.m4
-+++ b/ext/imap/config.m4
-@@ -147,7 +147,7 @@ if test "$PHP_IMAP" != "no"; then
-     old_CFLAGS=$CFLAGS
-     CFLAGS="-I$IMAP_INC_DIR"
--    AC_CACHE_CHECK(for U8T_DECOMPOSE, ac_cv_u8t_canonical,
-+    AC_CACHE_CHECK(for U8T_DECOMPOSE, ac_cv_u8t_decompose,
-       AC_TRY_COMPILE([
- #include <c-client.h>
-       ],[
--- 
-2.7.4
-
diff --git a/lang/php7/patches/1008-acinclude-valgrind.patch b/lang/php7/patches/1008-acinclude-valgrind.patch
new file mode 100644 (file)
index 0000000..a3eae9c
--- /dev/null
@@ -0,0 +1,42 @@
+--- a/acinclude.m4     2017-11-28 10:22:53.000000000 +0100
++++ b/acinclude.m4     2017-12-22 16:28:09.361331754 +0100
+@@ -3227,20 +3227,26 @@
+ dnl PHP_CHECK_VALGRIND
+ AC_DEFUN([PHP_CHECK_VALGRIND], [
+-  AC_MSG_CHECKING([for valgrind])
++  AC_CACHE_CHECK(whether to enable the check for valgrind support,ac_cv_enable_valgrind_check,[
++    ac_cv_enable_valgrind_check=yes
++  ])
+-  SEARCH_PATH="/usr/local /usr"
+-  SEARCH_FOR="/include/valgrind/valgrind.h"
+-  for i in $SEARCH_PATH ; do
+-    if test -r $i/$SEARCH_FOR; then
+-      VALGRIND_DIR=$i
+-    fi
+-  done
++  if test "$ac_cv_enable_valgrind_check" = "yes"; then
++    AC_MSG_CHECKING([for valgrind])
++
++    SEARCH_PATH="/usr/local /usr"
++    SEARCH_FOR="/include/valgrind/valgrind.h"
++    for i in $SEARCH_PATH ; do
++      if test -r $i/$SEARCH_FOR; then
++        VALGRIND_DIR=$i
++      fi
++    done
+-  if test -z "$VALGRIND_DIR"; then
+-    AC_MSG_RESULT([not found])
+-  else
+-    AC_MSG_RESULT(found in $VALGRIND_DIR)
+-    AC_DEFINE(HAVE_VALGRIND, 1, [ ])
++    if test -z "$VALGRIND_DIR"; then
++      AC_MSG_RESULT([not found])
++    else
++      AC_MSG_RESULT(found in $VALGRIND_DIR)
++      AC_DEFINE(HAVE_VALGRIND, 1, [ ])
++    fi
+   fi
+ ])
diff --git a/lang/php7/patches/1010-pcrelib-NativeMIPS.patch b/lang/php7/patches/1010-pcrelib-NativeMIPS.patch
new file mode 100644 (file)
index 0000000..7a1ac46
--- /dev/null
@@ -0,0 +1,17 @@
+--- a/ext/pcre/pcrelib/sljit/sljitNativeMIPS_common.c  2017-11-28 02:22:57.000000000 -0700
++++ b/ext/pcre/pcrelib/sljit/sljitNativeMIPS_common.c  2017-12-29 17:35:44.231934114 -0700
+@@ -498,12 +498,13 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
+ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)
+ {
++      sljit_sw fir = 0;
++
+       switch (feature_type) {
+       case SLJIT_HAS_FPU:
+ #ifdef SLJIT_IS_FPU_AVAILABLE
+               return SLJIT_IS_FPU_AVAILABLE;
+ #elif defined(__GNUC__)
+-              sljit_sw fir;
+               asm ("cfc1 %0, $0" : "=r"(fir));
+               return (fir >> 22) & 0x1;
+ #else
index 6ff14a2583c3a5abb4b55ad80e475c2a532c43cd..5e9dcd51c6e0c9595cc58df8ffdaef28cd7ad06d 100644 (file)
@@ -20,7 +20,7 @@ PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-$(PKG_NAME)-$(PKG_VERSION)
 PKG_UNPACK=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python3-package.mk)
+include ../python3-package.mk
 
 define Package/python3-flask
   SECTION:=lang
index 8b62569618590abbc8c9aab7e4b9d66d25280a07..7ef9e0b8a2435f1262cfeb627db582ec2afb6777 100644 (file)
@@ -20,7 +20,7 @@ PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-$(PKG_NAME)-$(PKG_VERSION)
 PKG_UNPACK=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python3-package.mk)
+include ../python3-package.mk
 
 define Package/python3-jinja2
   SECTION:=lang
index 0083516e410cbea4fa6ffa94571d5ff3bb9ae757..84cd184275b968538a7e3e08c82834257efbbecc 100644 (file)
@@ -20,7 +20,7 @@ PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-$(PKG_NAME)-$(PKG_VERSION)
 PKG_UNPACK=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python3-package.mk)
+include ../python3-package.mk
 
 define Package/python3-markupsafe
   SECTION:=lang
index 8192a61de8d2bc07baddc600b02173d3e2e06bd1..0f4a51a1ef41cbb4bedb6709ce3709ad2debcb13 100644 (file)
@@ -20,7 +20,7 @@ PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-$(PKG_NAME)-$(PKG_VERSION)
 PKG_UNPACK=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python3-package.mk)
+include ../python3-package.mk
 
 define Package/python3-werkzeug
   SECTION:=lang
index 1bad60fa3279bfdb41cf8cb6e9f2465a2ddbfadb..27020c75981ce0c3f206c6b864d37029163100e5 100644 (file)
@@ -15,10 +15,9 @@ PKG_LICENSE:=LGPL-2.1
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/fc/bb/a5768c230f9ddb03acc9ef3f0d4a3cf93462473795d18e9535498c8f929d/
 PKG_HASH:=84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/chardet
   SUBMENU:=Python
index e52e99938e8c5eca5a10983d273931a01f2189c7..021357895d9833da675629ea7bcdb516b031226d 100644 (file)
@@ -20,7 +20,7 @@ PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-$(PKG_NAME)-$(PKG_VERSION)
 PKG_UNPACK=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python3-package.mk)
+include ../python3-package.mk
 
 define Package/python3-click
   SECTION:=lang
index 0053c63015c2026b84944f36981915d995dba4eb..874e850be118b9e30a6984cea733c500a964bc4c 100644 (file)
@@ -15,10 +15,9 @@ PKG_LICENSE:=BSD-3-Clause
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/34/b9/d07195652ab494b026f7cb0341dd6e5f2e6e39be177abe05e2cec8bd46e4/
 PKG_HASH:=6a4d9aea683b4c224d97ab8ee11ad2d29a37072c0c6c509896dd9857466fb261
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/django-appconf
   SUBMENU:=Python
index c45eb07845dfdc9153a531c84340ae47cdc29f03..19e0f3e787d802147edb8e39448f210eb873fa6c 100644 (file)
@@ -16,10 +16,9 @@ PKG_SOURCE:=django_compressor-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/82/76/1355459f90714517c52f264aa7245b52e59a273ec16e8f8d505fa6c342f8/
 PKG_BUILD_DIR:=$(BUILD_DIR)/django_compressor-$(PKG_VERSION)/
 PKG_HASH:=9616570e5b08e92fa9eadc7a1b1b49639cce07ef392fc27c74230ab08075b30f
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/django-compressor
   SUBMENU:=Python
index 6174af40a047596bb4644ca9989cbdbb1ff5b844..359ae8ba4058c588c673631f430984ef54b3520b 100644 (file)
@@ -15,10 +15,9 @@ PKG_LICENSE:=BSD-3-Clause
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/8a/37/4fa87dd0e43aa0a66fc419d58e67a9b6da70e1853d646c4b501c1ee7208b/
 PKG_HASH:=6eec9f3ac4e5657b93e64f3379181d1e727088df10dd34f0398cd12119b9f0b0
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/django-constance
   SUBMENU:=Python
index 34e19fd4e5e6c743f3711ab98a7c362d09700aab..d3796d2c853d6b2b45a5ee8d92e46180a09d3440 100644 (file)
@@ -15,10 +15,9 @@ PKG_LICENSE:=BSD-3-Clause
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/e4/b2/a079f0a2218e0eb7892edbf404e0bbfbb281a6bbf06966b775f5142ed159/
 PKG_HASH:=6c0afd5554739365b55d86e285cf966cc3a45682fff963463364ea1f6511ca3e
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/django-jsonfield
   SUBMENU:=Python
index 2861685bc1ddeca09222a7e71c6d043cd53d7156..4566cc6a162a0b2bec2830cf966701d11a4b9580 100644 (file)
@@ -15,10 +15,9 @@ PKG_LICENSE:=MIT
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/e8/69/232d78ef16cad8dd4c2f871b0f44d87bcde36ed6a90597416e903034600b/
 PKG_HASH:=61e3ba7f6df82d8df9e6be3a8c55ef589eb3bf926c3d25d2b7949b07eae78354
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/django-picklefield
   SUBMENU:=Python
index 315dbb260b9c03c8b6294b9795917603c4f2efcf..f3519f41f0777f9b989a8a59a4fa9905bf8dd6b0 100644 (file)
@@ -16,10 +16,9 @@ PKG_SOURCE:=django-post_office-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/0f/8c/8c7e1d8998741fd195f7df947c509bc31a03d505aca03488c39e59da11f0/
 PKG_BUILD_DIR:=$(BUILD_DIR)/django-post_office-$(PKG_VERSION)/
 PKG_HASH:=8d691b2e53ba8121d770ce448f05568874cf78a3cf63215918ad49536db5e76a
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/django-postoffice
   SUBMENU:=Python
index 862caf57ff869ebb46f8e4d0feb8007029d99b75..fb37b0e95a8562fcfd2d2f25a91c9c25bd8f4aa6 100644 (file)
@@ -16,10 +16,9 @@ PKG_SOURCE:=djangorestframework-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/d0/ab/8b991e7d3e26af7cf6327c84b341e60004fc56325d8a4d4019e1474f7456/
 PKG_BUILD_DIR:=$(BUILD_DIR)/djangorestframework-$(PKG_VERSION)
 PKG_HASH:=305b2c6564ca46d3b558ba21110ed717135c467adf1a6dfd192bd85f4bb04d50
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/django-restframework
   SUBMENU:=Python
index 41b844dd41cc36851fdde0cad0d73a9ae0a33baf..a93a022e6062cf4e3bd7839af4ae452bba162c63 100644 (file)
@@ -15,10 +15,9 @@ PKG_LICENSE:=BSD-3-Clause
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/29/4d/fd9ba0e9b86c05714d9bc945d26376b331899d38c9b0666c7b38f3f26686/
 PKG_HASH:=3cb5334d42cfabda49c9c0efb1c24f5663e318ed34b3a34fada5195232f75f65
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/django-statici18n
   SUBMENU:=Python
index efcca96629a97291c9a0d3d213952599f8c4fc32..6d59cdd71d6355e7a0271833da90603a643fd2df 100644 (file)
@@ -18,10 +18,9 @@ PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
 PKG_SOURCE_VERSION:=2d4bc5a60aa8a076689667c550ded96b87bc463e
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
 PKG_MIRROR_HASH:=c82c2cc338ae46ba8572d9960fc98dca932edc43a00f011fed102810a86185ae
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/django
     SUBMENU:=Python
index a7c4080908a01daf4b68309e449d803b2c975fac..ae706811fe07e0e365e127d9d1e5f5f148d00501 100644 (file)
@@ -15,10 +15,9 @@ PKG_LICENSE:=MIT
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://pypi.python.org/packages/source/e/et_xmlfile/
 PKG_HASH:=614d9722d572f6246302c4491846d2c393c199cfa4edc9af593437691683335b
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/et_xmlfile
   SUBMENU:=Python
index f20405d3ddbde7d4fed2d4f8391d36b37f606a3c..4a0142f323ae41c745413f5dec7fa9bf6b92357f 100644 (file)
@@ -15,10 +15,9 @@ PKG_LICENSE:=BSD-3-Clause
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://pypi.python.org/packages/source/f/flup/
 PKG_HASH:=4bad317a5fc1ce3d4fe5e9b6d846ec38a8023e16876785d4f88102f2c8097dd9
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/flup
   SUBMENU:=Python
index b1c187d4774dc1181728a90739510f741f833740..4ba2fc61b5a3249f75f057193551ca72ee41ef3f 100644 (file)
@@ -15,10 +15,9 @@ PKG_LICENSE:=MIT
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/30/3a/10bb213cede0cc4d13ac2263316c872a64bf4c819000c8ccd801f1d5f822/
 PKG_HASH:=eee1169f0ca667be05db3351a0960765620dad53f53434262ff8901b68a1b622
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/gunicorn
     SUBMENU:=Python
index e52603df2430a4ab37f192dd2d9b6b1b453f9996..e1e432ef45f282929707a2b0216f5c840aa15b53 100644 (file)
@@ -20,7 +20,7 @@ PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-$(PKG_NAME)-$(PKG_VERSION)
 PKG_UNPACK=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python3-package.mk)
+include ../python3-package.mk
 
 define Package/python3-itsdangerous
   SECTION:=lang
index 432f9292ea75648f98b0b6cd63fc510ddce6450a..2fba8a64d9c111365e45a90590e7d9a6a2340e85 100644 (file)
@@ -15,10 +15,9 @@ PKG_LICENSE:=BSD-3-Clause
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/9b/fa/40beb2aa43a13f740dd5be367a10a03270043787833409c61b79e69f1dfd/
 PKG_HASH:=b760160f8dc8cc51d17875c6b663fafe64be699e10ce34b6a95184b5aa0fdc9e
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/jdcal
   SUBMENU:=Python
index 8e3634a8e8420d1ca52be24ef9488e3b3d068149..93a3f06362ee447914ba9ad0b0f23794ac0626eb 100644 (file)
@@ -15,10 +15,9 @@ PKG_LICENSE:=MIT
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/88/3c/34fbe561fc92e6a75f297478b123c2590ca986d9f2d2dbf340d879aa24dd/
 PKG_HASH:=3b42ece7933b46b2128f8d4111c57c80fb5aa46f4d16e7f83281f169e7398ba7
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/openpyxl
   SUBMENU:=Python
index 8b55c45d7567674d3698c87bbbb4eebedf0acf7f..c1618e2f7d90858793789dcd6a6a8971c7dbf835 100644 (file)
@@ -18,10 +18,9 @@ PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
 PKG_SOURCE_VERSION:=aab33141f381d5577cdef9033b7fdff79122a10c
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
 PKG_MIRROR_HASH:=e7c36bcf89614337d9abc4d07780da0b346a745be7a9aa55b398fa427549273c
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/pillow
     SUBMENU:=Python
index 01371ad95c8022ebc29cccb5386889742925d64e..aec3e7e6329b70de3e3d05ec4d6161e8e95f5407 100644 (file)
@@ -20,8 +20,8 @@ PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-$(PKG_NAME)-$(PKG_VERSION)
 PKG_UNPACK=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
-$(call include_mk, python3-package.mk)
+include ../python-package.mk
+include ../python3-package.mk
 
 define Package/python-pyodbc/Default
   SECTION:=lang
index 7998a5a42ff274a85df7255dedbcb5160ea63f95..73e2f630597ff053f7956bcbbe5eacec00b5b6fb 100644 (file)
@@ -21,8 +21,8 @@ PKG_MAINTAINER:=Alexandru Ardelean <ardeleanalex@gmail.com>
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-asn1crypto-$(PKG_VERSION)
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
-$(call include_mk, python3-package.mk)
+include ../python-package.mk
+include ../python3-package.mk
 
 PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 
index b6aa27de08707756d95751ff9534c730fe3dba15..8430eeeb41a2ef80d3bb77b18e1a8a10a1fb7f2e 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2016 OpenWrt.org
+# Copyright (C) 2016-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -7,30 +7,45 @@
 
 include $(TOPDIR)/rules.mk
 
-PKG_NAME:=attrs
-PKG_VERSION:=16.2.0
-PKG_RELEASE:=1
+PKG_NAME:=python-attrs
+PKG_VERSION:=17.4.0
+PKG_RELEASE:=2
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
-PKG_SOURCE_URL:=https://pypi.python.org/packages/6b/71/1682316894ed80b362b9102e7a10997136d8dc1213c36a9f0515c451373a
-PKG_HASH:=136f2ec0f94ec77ff2990830feee965d608cab1e8922370e3abdded383d52001
+PKG_SOURCE:=attrs-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=https://pypi.python.org/packages/8b/0b/a06cfcb69d0cb004fde8bc6f0fd192d96d565d1b8aa2829f0f20adb796e5
+PKG_HASH:=1c7960ccfd6a005cd9f7ba884e6316b5e430a3f1a6c37c5f87d8b43f83b54ec9
 
-PKG_BUILD_DEPENDS:=python python-setuptools
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-attrs-$(PKG_VERSION)
 
 PKG_LICENSE:=MIT
 PKG_LICENSE_FILES:=LICENSE
 PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
+include ../python3-package.mk
+
+PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
+
+define Package/python-attrs/Default
+  SECTION:=lang
+  CATEGORY:=Languages
+  SUBMENU:=Python
+  URL:=https://attrs.readthedocs.org/
+endef
 
 define Package/python-attrs
-       SECTION:=lang
-       CATEGORY:=Languages
-       SUBMENU:=Python
-       TITLE:=python-attrs
-       URL:=https://attrs.readthedocs.org/
-       DEPENDS:=+python-light
+$(call Package/python-attrs/Default)
+  TITLE:=python-attrs
+  DEPENDS:=+PACKAGE_python-attrs:python-light
+  VARIANT:=python
+endef
+
+define Package/python3-attrs
+$(call Package/python-attrs/Default)
+  TITLE:=python3-attrs
+  DEPENDS:=+PACKAGE_python3-attrs:python3-light
+  VARIANT:=python3
 endef
 
 define Package/python-attrs/description
@@ -39,9 +54,16 @@ the chores of implementing the most common attribute-related object
 protocols.
 endef
 
-define Build/Compile
-       $(call Build/Compile/PyMod,,install --prefix="/usr" --root="$(PKG_INSTALL_DIR)")
+define Package/python3-attrs/description
+$(call Package/python-attrs/description)
+.
+(Variant for Python3)
 endef
 
 $(eval $(call PyPackage,python-attrs))
 $(eval $(call BuildPackage,python-attrs))
+$(eval $(call BuildPackage,python-attrs-src))
+
+$(eval $(call Py3Package,python3-attrs))
+$(eval $(call BuildPackage,python3-attrs))
+$(eval $(call BuildPackage,python3-attrs-src))
diff --git a/lang/python/python-automat/Makefile b/lang/python/python-automat/Makefile
new file mode 100644 (file)
index 0000000..8ddaad0
--- /dev/null
@@ -0,0 +1,99 @@
+#
+# Copyright (C) 2018 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=python-automat
+PKG_VERSION:=0.6.0
+PKG_RELEASE:=1
+
+PKG_SOURCE:=Automat-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=https://files.pythonhosted.org/packages/source/A/Automat
+PKG_HASH:=3c1fd04ecf08ac87b4dd3feae409542e9bf7827257097b2b6ed5692f69d6f6a8
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-automat-$(PKG_VERSION)
+
+PKG_LICENSE:=MIT
+PKG_LICENSE_FILES:=LICENSE
+PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
+
+include $(INCLUDE_DIR)/package.mk
+include ../python-package.mk
+include ../python3-package.mk
+
+PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
+
+define Package/python-automat/Default
+  SECTION:=lang
+  CATEGORY:=Languages
+  SUBMENU:=Python
+  URL:=https://github.com/glyph/Automat
+endef
+
+define Package/python-automat
+$(call Package/python-automat/Default)
+  TITLE:=Concise, idiomatic finite-state automata
+  DEPENDS:= \
+      +PACKAGE_python-automat:python-light \
+      +PACKAGE_python-automat:python-attrs \
+      +PACKAGE_python-automat:python-six
+  VARIANT:=python
+endef
+
+define Package/python3-automat
+$(call Package/python-automat/Default)
+  TITLE:=Concise, idiomatic finite-state automata
+  DEPENDS:= \
+      +PACKAGE_python3-automat:python3-light \
+      +PACKAGE_python3-automat:python3-attrs \
+      +PACKAGE_python3-automat:python3-six
+  VARIANT:=python3
+endef
+
+define Package/python-automat/description
+Automat is a library for concise, idiomatic Python expression of
+finite-state automata (particularly deterministic finite-state
+transducers).
+endef
+
+define Package/python3-automat/description
+$(call Package/python-automat/description)
+.
+(Variant for Python3)
+endef
+
+define PyPackage/python-automat/filespec
++|$(PYTHON_PKG_DIR)
+-|$(PYTHON_PKG_DIR)/automat/_visualize.py
+endef
+
+define Py3Package/python3-automat/filespec
++|$(PYTHON3_PKG_DIR)
+-|$(PYTHON3_PKG_DIR)/automat/_visualize.py
+endef
+
+define PyBuild/Compile
+       $(call Build/Compile/PyMod,, \
+               install --prefix="/usr" --root="$(PKG_INSTALL_DIR)", \
+               PKG_VERSION="$(PKG_VERSION)" \
+       )
+endef
+
+define Py3Build/Compile
+       $(call Build/Compile/Py3Mod,, \
+               install --prefix="/usr" --root="$(PKG_INSTALL_DIR)", \
+               PKG_VERSION="$(PKG_VERSION)" \
+       )
+endef
+
+$(eval $(call PyPackage,python-automat))
+$(eval $(call BuildPackage,python-automat))
+$(eval $(call BuildPackage,python-automat-src))
+
+$(eval $(call Py3Package,python3-automat))
+$(eval $(call BuildPackage,python3-automat))
+$(eval $(call BuildPackage,python3-automat-src))
diff --git a/lang/python/python-automat/patches/001-do-not-use-setuptools-scm-m2r.patch b/lang/python/python-automat/patches/001-do-not-use-setuptools-scm-m2r.patch
new file mode 100644 (file)
index 0000000..46fd241
--- /dev/null
@@ -0,0 +1,30 @@
+--- a/setup.py
++++ b/setup.py
+@@ -2,6 +2,7 @@
+ Setup file for automat
+ """
++import os
+ from setuptools import setup, find_packages
+ try:
+@@ -14,7 +15,7 @@ except(IOError, ImportError):
+ setup(
+     name='Automat',
+-    use_scm_version=True,
++    version=os.getenv('PKG_VERSION'),
+     url='https://github.com/glyph/Automat',
+     description="""
+     Self-service finite-state machines for the programmer on the go.
+@@ -22,10 +23,6 @@ setup(
+     long_description=long_description,
+     packages=find_packages(exclude=[]),
+     package_dir={'automat': 'automat'},
+-    setup_requires=[
+-        'setuptools-scm',
+-        'm2r',
+-    ],
+     install_requires=[
+         "attrs",
+         "six",
diff --git a/lang/python/python-automat/patches/002-omit-visualize.patch b/lang/python/python-automat/patches/002-omit-visualize.patch
new file mode 100644 (file)
index 0000000..bea12d3
--- /dev/null
@@ -0,0 +1,18 @@
+--- a/setup.py
++++ b/setup.py
+@@ -27,15 +27,6 @@ setup(
+         "attrs",
+         "six",
+     ],
+-    extras_require={
+-        "visualize": ["graphviz>0.5.1",
+-                      "Twisted>=16.1.1"],
+-    },
+-    entry_points={
+-        "console_scripts": [
+-            "automat-visualize = automat._visualize:tool"
+-        ],
+-    },
+     author='Glyph',
+     author_email='glyph@twistedmatrix.com',
+     include_package_data=True,
diff --git a/lang/python/python-automat/patches/003-omit-tests.patch b/lang/python/python-automat/patches/003-omit-tests.patch
new file mode 100644 (file)
index 0000000..8742aa3
--- /dev/null
@@ -0,0 +1,19 @@
+--- a/setup.py
++++ b/setup.py
+@@ -21,7 +21,7 @@ setup(
+     Self-service finite-state machines for the programmer on the go.
+     """.strip(),
+     long_description=long_description,
+-    packages=find_packages(exclude=[]),
++    packages=find_packages(exclude=["*._test", "*._test.*"]),
+     package_dir={'automat': 'automat'},
+     install_requires=[
+         "attrs",
+@@ -30,6 +30,7 @@ setup(
+     author='Glyph',
+     author_email='glyph@twistedmatrix.com',
+     include_package_data=True,
++    exclude_package_data={'':['_test/*']},
+     license="MIT",
+     keywords='fsm finite state machine automata',
+ )
index 222c0492ee77abcb22efa24beb2addbfa1191702..5e27adb1335fef2c7d4e86642aa32665613dd0f4 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2015-2016 OpenWrt.org
+# Copyright (C) 2015-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=python-cffi
-PKG_VERSION:=1.11.2
+PKG_VERSION:=1.11.4
 PKG_RELEASE:=1
 
 PKG_SOURCE:=cffi-$(PKG_VERSION).tar.gz
-PKG_SOURCE_URL:=https://pypi.python.org/packages/c9/70/89b68b6600d479034276fed316e14b9107d50a62f5627da37fafe083fde3
-PKG_HASH:=ab87dd91c0c4073758d07334c1e5f712ce8fe48f007b86f8238773963ee700a6
+PKG_SOURCE_URL:=https://pypi.python.org/packages/10/f7/3b302ff34045f25065091d40e074479d6893882faef135c96f181a57ed06
+PKG_HASH:=df9083a992b17a28cd4251a3f5c879e0198bb26c9e808c4647e0a18739f1d11d
 
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-cffi-$(PKG_VERSION)
 
@@ -21,12 +21,14 @@ PKG_LICENSE:=MIT
 PKG_LICENSE_FILES:=LICENSE
 PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>, Alexandru Ardelean <ardeleanalex@gmail.com>
 
+PKG_BUILD_DEPENDS:=libffi/host
+
 HOST_PYTHON_PACKAGE_BUILD_DEPENDS:="cffi==$(PKG_VERSION)"
 HOST_PYTHON3_PACKAGE_BUILD_DEPENDS:="cffi==$(PKG_VERSION)"
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
-$(call include_mk, python3-package.mk)
+include ../python-package.mk
+include ../python3-package.mk
 
 PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 
@@ -64,6 +66,8 @@ endef
 
 $(eval $(call PyPackage,python-cffi))
 $(eval $(call BuildPackage,python-cffi))
+$(eval $(call BuildPackage,python-cffi-src))
 
 $(eval $(call Py3Package,python3-cffi))
 $(eval $(call BuildPackage,python3-cffi))
+$(eval $(call BuildPackage,python3-cffi-src))
diff --git a/lang/python/python-constantly/Makefile b/lang/python/python-constantly/Makefile
new file mode 100644 (file)
index 0000000..e1fa855
--- /dev/null
@@ -0,0 +1,69 @@
+#
+# Copyright (C) 2018 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=python-constantly
+PKG_VERSION:=15.1.0
+PKG_RELEASE:=1
+
+PKG_SOURCE:=constantly-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=https://files.pythonhosted.org/packages/source/c/constantly
+PKG_HASH:=586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-constantly-$(PKG_VERSION)
+
+PKG_LICENSE:=MIT
+PKG_LICENSE_FILES:=LICENSE
+PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
+
+include $(INCLUDE_DIR)/package.mk
+include ../python-package.mk
+include ../python3-package.mk
+
+PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
+
+define Package/python-constantly/Default
+  SECTION:=lang
+  CATEGORY:=Languages
+  SUBMENU:=Python
+  URL:=https://github.com/twisted/constantly
+endef
+
+define Package/python-constantly
+$(call Package/python-constantly/Default)
+  TITLE:=Symbolic constants in Python
+  DEPENDS:=+PACKAGE_python-constantly:python-light
+  VARIANT:=python
+endef
+
+define Package/python3-constantly
+$(call Package/python-constantly/Default)
+  TITLE:=Symbolic constants in Python
+  DEPENDS:=+PACKAGE_python3-constantly:python3-light
+  VARIANT:=python3
+endef
+
+define Package/python-constantly/description
+A library that provides symbolic constant support. It includes
+collections and constants with text, numeric, and bit flag values.
+Originally twisted.python.constants from the Twisted project.
+endef
+
+define Package/python3-constantly/description
+$(call Package/python-constantly/description)
+.
+(Variant for Python3)
+endef
+
+$(eval $(call PyPackage,python-constantly))
+$(eval $(call BuildPackage,python-constantly))
+$(eval $(call BuildPackage,python-constantly-src))
+
+$(eval $(call Py3Package,python3-constantly))
+$(eval $(call BuildPackage,python3-constantly))
+$(eval $(call BuildPackage,python3-constantly-src))
index 3ad02584547c2585f4aed04da19f7d75765d80a1..a4873ccad66a54c9fcb41b58f8fa389de5ab593e 100644 (file)
@@ -21,7 +21,7 @@ PKG_BUILD_DIR:=$(BUILD_DIR)/crcmod-$(PKG_VERSION)
 PKG_BUILD_DEPENDS:=python
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/python-crcmod
   SUBMENU:=Python
index cdc5eebcff572994ae928652e241db3ebf5deb61..551fd94fa6806969a8813758dcc2b56a2aef8cbc 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2009-2015 OpenWrt.org
+# Copyright (C) 2009-2015, 2017-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -7,28 +7,45 @@
 
 include $(TOPDIR)/rules.mk
 
-PKG_NAME:=pycrypto
+PKG_NAME:=python-crypto
 PKG_VERSION:=2.6.1
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE:=pycrypto-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/
 PKG_HASH:=f2ce1e989b272cfcb677616763e0a2e7ec659effa67a88aa92b3a65528f60a3c
 
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-crypto-$(PKG_VERSION)
+
 PKG_LICENSE:=Public Domain
 PKG_LICENSE_FILES:=COPYRIGHT
 PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
+include ../python3-package.mk
+
+PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
+
+define Package/python-crypto/Default
+  SECTION:=lang-python
+  CATEGORY:=Languages
+  SUBMENU:=Python
+  URL:=http://www.pycrypto.org/
+endef
 
 define Package/python-crypto
-       SECTION:=lang-python
-       CATEGORY:=Languages
-       SUBMENU:=Python
-       TITLE:=python-crypto
-       URL:=http://www.pycrypto.org/
-       DEPENDS:=+python +libgmp
+$(call Package/python-crypto/Default)
+  TITLE:=python-crypto
+  DEPENDS:=+libgmp +PACKAGE_python-crypto:python
+  VARIANT:=python
+endef
+
+define Package/python3-crypto
+$(call Package/python-crypto/Default)
+  TITLE:=python3-crypto
+  DEPENDS:=+libgmp +PACKAGE_python3-crypto:python3
+  VARIANT:=python3
 endef
 
 define Package/python-crypto/description
@@ -36,19 +53,30 @@ A collection of both secure hash functions (such as MD5 and SHA),
 and various encryption algorithms (AES, DES, IDEA, RSA, ElGamal, etc.).
 endef
 
-define Build/Compile
+define Package/python3-crypto/description
+$(call Package/python-crypto/description)
+.
+(Variant for Python3)
+endef
+
+define PyBuild/Compile
        $(call Build/Compile/PyMod,,\
                install --prefix=/usr --root=$(PKG_INSTALL_DIR),\
                CONFIG_BIG_ENDIAN="$(CONFIG_BIG_ENDIAN)" \
        )
 endef
 
-define Package/python-crypto/install
-       $(INSTALL_DIR) $(1)$(PYTHON_PKG_DIR)/
-       $(CP) \
-               $(PKG_INSTALL_DIR)$(PYTHON_PKG_DIR)/* \
-               $(1)$(PYTHON_PKG_DIR)/
+define Py3Build/Compile
+       $(call Build/Compile/Py3Mod,,\
+               install --prefix=/usr --root=$(PKG_INSTALL_DIR),\
+               CONFIG_BIG_ENDIAN="$(CONFIG_BIG_ENDIAN)" \
+       )
 endef
 
 $(eval $(call PyPackage,python-crypto))
 $(eval $(call BuildPackage,python-crypto))
+$(eval $(call BuildPackage,python-crypto-src))
+
+$(eval $(call Py3Package,python3-crypto))
+$(eval $(call BuildPackage,python3-crypto))
+$(eval $(call BuildPackage,python3-crypto-src))
index baed012bf692a5ecbfffa1ef62da57010bd71506..38e5a5b624d72f7fee10adf8577a6a4bfa2d942b 100644 (file)
@@ -1,6 +1,6 @@
 --- a/setup.py
 +++ b/setup.py
-@@ -100,6 +100,10 @@
+@@ -100,6 +100,10 @@ def PrintErr(*args, **kwd):
          w(kwd.get("end", "\n"))
  
  def endianness_macro():
diff --git a/lang/python/python-crypto/patches/003-omit-tests.patch b/lang/python/python-crypto/patches/003-omit-tests.patch
new file mode 100644 (file)
index 0000000..f72bcb0
--- /dev/null
@@ -0,0 +1,19 @@
+--- a/setup.py
++++ b/setup.py
+@@ -357,16 +357,6 @@ kw = {'name':"pycrypto",
+                   "Crypto.Random",
+                   "Crypto.Random.Fortuna",
+                   "Crypto.Random.OSRNG",
+-                  "Crypto.SelfTest",
+-                  "Crypto.SelfTest.Cipher",
+-                  "Crypto.SelfTest.Hash",
+-                  "Crypto.SelfTest.Protocol",
+-                  "Crypto.SelfTest.PublicKey",
+-                  "Crypto.SelfTest.Random",
+-                  "Crypto.SelfTest.Random.Fortuna",
+-                  "Crypto.SelfTest.Random.OSRNG",
+-                  "Crypto.SelfTest.Util",
+-                  "Crypto.SelfTest.Signature",
+                   "Crypto.Protocol",
+                   "Crypto.PublicKey",
+                   "Crypto.Signature"],
index fdabd483e7c77e88b640b3b270606a4c2b76d331..02e95dabcfe2eb9d9ea0544e57d8ee93ffc5b4c0 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2015-2016 OpenWrt.org
+# Copyright (C) 2015-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=python-cryptography
-PKG_VERSION:=2.1.3
-PKG_RELEASE:=1
+PKG_VERSION:=2.1.4
+PKG_RELEASE:=2
 
 PKG_SOURCE:=cryptography-$(PKG_VERSION).tar.gz
-PKG_SOURCE_URL:=https://pypi.python.org/packages/f3/7c/ec4f94489719803cb14d35e9625d1f5a613b9c4b8d01ee52a4c77485e681
-PKG_HASH:=68a26c353627163d74ee769d4749f2ee243866e9dac43c93bb33ebd8fbed1199
+PKG_SOURCE_URL:=https://pypi.python.org/packages/78/c5/7188f15a92413096c93053d5304718e1f6ba88b818357d05d19250ebff85
+PKG_HASH:=e4d967371c5b6b2e67855066471d844c5d52d210c36c28d49a8507b96e2c5291
 
 PKG_LICENSE:=Apache-2.0 BSD-3-Clause
 PKG_LICENSE_FILES:=LICENSE.APACHE LICENSE.BSD
@@ -22,8 +22,8 @@ PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>, Alexandru Ardelean <ardeleana
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-cryptography-$(PKG_VERSION)
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
-$(call include_mk, python3-package.mk)
+include ../python-package.mk
+include ../python3-package.mk
 
 PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 
@@ -75,5 +75,8 @@ endef
 
 $(eval $(call PyPackage,python-cryptography))
 $(eval $(call BuildPackage,python-cryptography))
+$(eval $(call BuildPackage,python-cryptography-src))
+
 $(eval $(call Py3Package,python3-cryptography))
 $(eval $(call BuildPackage,python3-cryptography))
+$(eval $(call BuildPackage,python3-cryptography-src))
index 07ae483c2efe312cfe303378cbe2d1f4112bf816..65781af52708ac5264767a2a65dac0b863303dfb 100644 (file)
@@ -1,8 +1,6 @@
-diff --git a/setup.py b/setup.py
-index b5c05df..a777dd7 100644
 --- a/setup.py
 +++ b/setup.py
-@@ -266,6 +266,7 @@ class DummyPyTest(test):
+@@ -235,6 +235,7 @@ class DummyPyTest(test):
  with open(os.path.join(base_dir, "README.rst")) as f:
      long_description = f.read()
  
index 3b7aaf3967567b5fa370060de8efde4dfd4bd99c..25ad27d7c9f4ed55142bd884cffaacc0074b80b8 100644 (file)
@@ -1,8 +1,6 @@
-diff --git a/src/_cffi_src/openssl/ssl.py b/src/_cffi_src/openssl/ssl.py
-index 8bda4e0..aa81060 100644
 --- a/src/_cffi_src/openssl/ssl.py
 +++ b/src/_cffi_src/openssl/ssl.py
-@@ -595,9 +595,6 @@ static const long TLS_ST_OK = 0;
+@@ -597,9 +597,6 @@ static const long TLS_ST_OK = 0;
  
  #if defined(OPENSSL_NO_DTLS) || CRYPTOGRAPHY_OPENSSL_LESS_THAN_102
  static const long Cryptography_HAS_GENERIC_DTLS_METHOD = 0;
index 679ffef3ce9fcc24df84a0b9bd7a7f34d1be2520..12bff8fd49c71c3b3857bb90692c20e2d5e00118 100644 (file)
@@ -15,10 +15,8 @@ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://dl.bintray.com/pycurl/pycurl/
 PKG_HASH:=43231bf2bafde923a6d9bb79e2407342a5f3382c1ef0a3b2e491c6a4e50b91aa
 
-PKG_BUILD_DEPENDS:=python libcurl
-
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/python-curl
   CATEGORY:=Languages
index d687240e554e8a4411bf6048ffdecfd7d6c9582c..421758a55a69dd4575dc6e59bf2b1f44695105de 100644 (file)
@@ -15,10 +15,9 @@ PKG_LICENSE:=BSD-2-Clause
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/54/bb/f1db86504f7a49e1d9b9301531181b00a1c7325dc85a29160ee3eaa73a54/
 PKG_HASH:=891c38b2a02f5bb1be3e4793866c8df49c7d19baabf9c1bad62547e0b4866aca
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/python-dateutil
   SUBMENU:=Python
index 847ad9db0e50b09a75e041700b707974e370efc2..545a170e3b64db2ddac9009542d9734c072150eb 100644 (file)
@@ -19,7 +19,7 @@ PKG_LICENSE_FILES:=LICENSE
 PKG_BUILD_DIR:=$(BUILD_DIR)/dnspython-$(PKG_VERSION)
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/python-dns
        SECTION:=language-python
index 9bc137d2c40738d6c1713e7d24c70ce95baa7a9b..e6b0417987fa89b5dde4f979d6f1d06e36f9f97e 100644 (file)
@@ -20,10 +20,8 @@ PKG_SOURCE_VERSION:=6cd0909d613a66033ecdefaca6cc07cfa7d46d6b
 PKG_MIRROR_HASH:=fe8657552b1dbaf8b9eba50168730e200567dc88a06932aa1cf60dc93211d16b
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
 
-PKG_BUILD_DEPENDS:=python python-setuptools
-
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/python-dpkt
        SECTION:=language-python
index f6c806fd1c84415beaa29ebee6defd798f8b6d30..374258cdae2252e27b2e5b14b83dff74a0daf659 100644 (file)
@@ -22,7 +22,7 @@ PKG_BUILD_DIR:=$(BUILD_DIR)/egenix-mx-base-$(PKG_VERSION)
 PKG_BUILD_DEPENDS:=python
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/python-egenix-mx-base
   SUBMENU:=Python
index d5f55d9fec81f4e8c516d71f902611031f762769..90b54c4c14c627377604fcc5bdaa20d18385b77e 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2015-2016 OpenWrt.org
+# Copyright (C) 2015-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -7,30 +7,37 @@
 
 include $(TOPDIR)/rules.mk
 
-PKG_NAME:=enum34
+PKG_NAME:=python-enum34
 PKG_VERSION:=1.1.6
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE:=enum34-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/bf/3e/31d502c25302814a7c2f1d3959d2a3b3f78e509002ba91aea64993936876
 PKG_HASH:=8ad8c4783bf61ded74527bffb48ed9b54166685e4230386a9ed9b1279e2df5b1
 
-PKG_BUILD_DEPENDS:=python python-setuptools
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-enum34-$(PKG_VERSION)
 
 PKG_LICENSE:=BSD-3-Clause
 PKG_LICENSE_FILES:=enum/LICENSE
 PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
+
+PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
+
+define Package/python-enum34/Default
+  SECTION:=lang
+  CATEGORY:=Languages
+  SUBMENU:=Python
+  URL:=https://pypi.python.org/pypi/enum34/
+endef
 
 define Package/python-enum34
-       SECTION:=lang
-       CATEGORY:=Languages
-       SUBMENU:=Python
-       TITLE:=python-enum34
-       URL:=https://pypi.python.org/pypi/enum34/
-       DEPENDS:=+python-light
+$(call Package/python-enum34/Default)
+  TITLE:=python-enum34
+  DEPENDS:=+PACKAGE_python-enum34:python-light
+  VARIANT:=python
 endef
 
 define Package/python-enum34/description
@@ -43,9 +50,6 @@ define PyPackage/python-enum34/filespec
 -|$(PYTHON_PKG_DIR)/enum/test.py
 endef
 
-define Build/Compile
-       $(call Build/Compile/PyMod,,install --prefix=/usr --root=$(PKG_INSTALL_DIR))
-endef
-
 $(eval $(call PyPackage,python-enum34))
 $(eval $(call BuildPackage,python-enum34))
+$(eval $(call BuildPackage,python-enum34-src))
index bb2acb64181e97f3e767f501fe0bbef081fe164a..4bdf5212ffbbbb2a950bf598528e701bda89c67f 100644 (file)
@@ -22,8 +22,8 @@ PKG_HASH:=57edafc469a414f58b51af1bfb9ee2babb9f626dd2df530d71c1176871850aa1
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-evdev-$(PKG_VERSION)
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
-$(call include_mk, python3-package.mk)
+include ../python-package.mk
+include ../python3-package.mk
 
 PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 
index e3d01604050390393e9b230130f00b6c4899ff94..99174136577a396b0fece4cfb22aaeb0faec818c 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2015-2016 OpenWrt.org
+# Copyright (C) 2015-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -7,28 +7,45 @@
 
 include $(TOPDIR)/rules.mk
 
-PKG_NAME:=gmpy2
+PKG_NAME:=python-gmpy2
 PKG_VERSION:=2.0.8
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).zip
+PKG_SOURCE:=gmpy2-$(PKG_VERSION).zip
 PKG_SOURCE_URL:=https://pypi.python.org/packages/90/f4/9a2e384b325b69bc5827b9a6510a8fb4a51698c915c06a3f25a86458892a
 PKG_HASH:=dd233e3288b90f21b0bb384bcc7a7e73557bb112ccf0032ad52aa614eb373d3f
 
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-gmpy2-$(PKG_VERSION)
+
 PKG_LICENSE:=LGPL-3.0+
 PKG_LICENSE_FILES:=COPYING.LESSER
 PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
+include ../python3-package.mk
+
+PKG_UNPACK:=unzip -q -d $(PKG_BUILD_DIR) $(DL_DIR)/$(PKG_SOURCE); mv -f $(PKG_BUILD_DIR)/gmpy2-$(PKG_VERSION)/* $(PKG_BUILD_DIR)
+
+define Package/python-gmpy2/Default
+  SECTION:=lang
+  CATEGORY:=Languages
+  SUBMENU:=Python
+  URL:=http://code.google.com/p/gmpy/
+endef
 
 define Package/python-gmpy2
-       SECTION:=lang
-       CATEGORY:=Languages
-       SUBMENU:=Python
-       TITLE:=python-gmpy2
-       URL:=http://code.google.com/p/gmpy/
-       DEPENDS:=+libgmp +python-light
+$(call Package/python-gmpy2/Default)
+  TITLE:=python-gmpy2
+  DEPENDS:=+libgmp +PACKAGE_python-gmpy2:python-light
+  VARIANT:=python
+endef
+
+define Package/python3-gmpy2
+$(call Package/python-gmpy2/Default)
+  TITLE:=python3-gmpy2
+  DEPENDS:=+libgmp +PACKAGE_python3-gmpy2:python3-light
+  VARIANT:=python3
 endef
 
 define Package/python-gmpy2/description
@@ -41,9 +58,22 @@ API and naming conventions to be more consistent and support the additional
 functionality.
 endef
 
-define Build/Compile
+define Package/python3-gmpy2/description
+$(call Package/python-gmpy2/description)
+.
+(Variant for Python3)
+endef
+
+define PyBuild/Compile
        $(call Build/Compile/PyMod,,install --prefix="/usr" --root="$(PKG_INSTALL_DIR)" --nompfr)
 endef
 
+define Py3Build/Compile
+       $(call Build/Compile/Py3Mod,,install --prefix="/usr" --root="$(PKG_INSTALL_DIR)" --nompfr)
+endef
+
 $(eval $(call PyPackage,python-gmpy2))
 $(eval $(call BuildPackage,python-gmpy2))
+
+$(eval $(call Py3Package,python3-gmpy2))
+$(eval $(call BuildPackage,python3-gmpy2))
index 408464bf4abc1cbf9265dd6e1d69940b81a4f385..0c209a7519b840a640d139c0043a6804a37cb6be 100644 (file)
@@ -20,8 +20,8 @@ PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-$(PKG_NAME)-$(PKG_VERSION)
 PKG_UNPACK=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
-$(call include_mk, python3-package.mk)
+include ../python-package.mk
+include ../python3-package.mk
 
 define Package/python-gnupg/Default
   SECTION:=lang
diff --git a/lang/python/python-host.mk b/lang/python/python-host.mk
new file mode 100644 (file)
index 0000000..d4dc81f
--- /dev/null
@@ -0,0 +1,97 @@
+#
+# Copyright (C) 2015-2016 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+# Note: include this after `include $(TOPDIR)/rules.mk in your package Makefile
+#       if `python-package.mk` is included, this will already be included
+
+ifneq ($(__python_host_mk_inc),1)
+__python_host_mk_inc=1
+
+# For PYTHON_VERSION
+python_mk_path:=$(dir $(lastword $(MAKEFILE_LIST)))
+include $(python_mk_path)python-version.mk
+
+HOST_PYTHON_DIR:=$(STAGING_DIR_HOSTPKG)
+HOST_PYTHON_INC_DIR:=$(HOST_PYTHON_DIR)/include/python$(PYTHON_VERSION)
+HOST_PYTHON_LIB_DIR:=$(HOST_PYTHON_DIR)/lib/python$(PYTHON_VERSION)
+
+HOST_PYTHON_PKG_DIR:=$(HOST_PYTHON_DIR)/lib/python$(PYTHON_VERSION)/site-packages
+
+HOST_PYTHON_BIN:=$(HOST_PYTHON_DIR)/bin/python$(PYTHON_VERSION)
+
+HOST_PYTHONPATH:=$(HOST_PYTHON_LIB_DIR):$(HOST_PYTHON_PKG_DIR)
+
+define HostPython
+       if [ "$(strip $(3))" == "HOST" ]; then \
+               export PYTHONPATH="$(HOST_PYTHONPATH)"; \
+               export PYTHONDONTWRITEBYTECODE=0; \
+       else \
+               export PYTHONPATH="$(PYTHONPATH)"; \
+               export PYTHONDONTWRITEBYTECODE=1; \
+               export _python_sysroot="$(STAGING_DIR)"; \
+               export _python_prefix="/usr"; \
+               export _python_exec_prefix="/usr"; \
+       fi; \
+       export PYTHONOPTIMIZE=""; \
+       $(1) \
+       $(HOST_PYTHON_BIN) $(2);
+endef
+
+define host_python_settings
+       ARCH="$(HOST_ARCH)" \
+       CC="$(HOSTCC)" \
+       CCSHARED="$(HOSTCC) $(HOST_FPIC)" \
+       CXX="$(HOSTCXX)" \
+       LD="$(HOSTCC)" \
+       LDSHARED="$(HOSTCC) -shared" \
+       CFLAGS="$(HOST_CFLAGS)" \
+       CPPFLAGS="$(HOST_CPPFLAGS) -I$(HOST_PYTHON_INC_DIR)" \
+       LDFLAGS="$(HOST_LDFLAGS) -lpython$(PYTHON_VERSION) -Wl$(comma)-rpath=$(STAGING_DIR_HOSTPKG)/lib" \
+       _PYTHON_HOST_PLATFORM=linux2
+endef
+
+# $(1) => commands to execute before running pythons script
+# $(2) => python script and its arguments
+# $(3) => additional variables
+define Build/Compile/HostPyRunHost
+       $(call HostPython, \
+               $(if $(1),$(1);) \
+               $(call host_python_settings) \
+               $(3) \
+               , \
+               $(2) \
+               , \
+               HOST \
+       )
+endef
+
+# Note: I shamelessly copied this from Yousong's logic (from python-packages);
+HOST_PYTHON_PIP:=$(STAGING_DIR_HOSTPKG)/bin/pip$(PYTHON_VERSION)
+define host_python_pip_install
+       $(call host_python_settings) \
+       $(HOST_PYTHON_PIP) install \
+               --root=$(1) \
+               --prefix=$(2) \
+               --ignore-installed \
+               $(3)
+endef
+
+define host_python_pip_install_host
+$(call host_python_pip_install,$(STAGING_DIR_HOSTPKG),"",$(1))
+endef
+
+# $(1) => build subdir
+# $(2) => additional arguments to setup.py
+# $(3) => additional variables
+define Build/Compile/HostPyMod
+       $(call Build/Compile/HostPyRunHost, \
+               cd $(HOST_BUILD_DIR)/$(strip $(1)), \
+               ./setup.py $(2), \
+               $(3))
+endef
+
+endif # __python_host_mk_inc
diff --git a/lang/python/python-hyperlink/Makefile b/lang/python/python-hyperlink/Makefile
new file mode 100644 (file)
index 0000000..7f1d241
--- /dev/null
@@ -0,0 +1,69 @@
+#
+# Copyright (C) 2018 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=python-hyperlink
+PKG_VERSION:=17.3.1
+PKG_RELEASE:=1
+
+PKG_SOURCE:=hyperlink-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=https://files.pythonhosted.org/packages/source/h/hyperlink
+PKG_HASH:=bc4ffdbde9bdad204d507bd8f554f16bba82dd356f6130cb16f41422909c33bc
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-hyperlink-$(PKG_VERSION)
+
+PKG_LICENSE:=MIT
+PKG_LICENSE_FILES:=LICENSE
+PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
+
+include $(INCLUDE_DIR)/package.mk
+include ../python-package.mk
+include ../python3-package.mk
+
+PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
+
+define Package/python-hyperlink/Default
+  SECTION:=lang
+  CATEGORY:=Languages
+  SUBMENU:=Python
+  URL:=https://github.com/python-hyper/hyperlink
+endef
+
+define Package/python-hyperlink
+$(call Package/python-hyperlink/Default)
+  TITLE:=Pure-Python immutable URLs
+  DEPENDS:=+PACKAGE_python-hyperlink:python-light
+  VARIANT:=python
+endef
+
+define Package/python3-hyperlink
+$(call Package/python-hyperlink/Default)
+  TITLE:=Pure-Python immutable URLs
+  DEPENDS:=+PACKAGE_python3-hyperlink:python3-light
+  VARIANT:=python3
+endef
+
+define Package/python-hyperlink/description
+Hyperlink provides a pure-Python implementation of immutable URLs. Based
+on RFC 3986 and 3987, the Hyperlink URL makes working with both URIs and
+IRIs easy.
+endef
+
+define Package/python3-hyperlink/description
+$(call Package/python-hyperlink/description)
+.
+(Variant for Python3)
+endef
+
+$(eval $(call PyPackage,python-hyperlink))
+$(eval $(call BuildPackage,python-hyperlink))
+$(eval $(call BuildPackage,python-hyperlink-src))
+
+$(eval $(call Py3Package,python3-hyperlink))
+$(eval $(call BuildPackage,python3-hyperlink))
+$(eval $(call BuildPackage,python3-hyperlink-src))
diff --git a/lang/python/python-hyperlink/patches/001-omit-tests.patch b/lang/python/python-hyperlink/patches/001-omit-tests.patch
new file mode 100644 (file)
index 0000000..cd0c8b8
--- /dev/null
@@ -0,0 +1,13 @@
+--- a/setup.py
++++ b/setup.py
+@@ -24,8 +24,9 @@ setup(name='hyperlink',
+       author=__author__,
+       author_email=__contact__,
+       url=__url__,
+-      packages=['hyperlink', 'hyperlink.test'],
++      packages=['hyperlink'],
+       include_package_data=True,
++      exclude_package_data={'':['test/*']},
+       zip_safe=False,
+       license=__license__,
+       platforms='any',
index 3d17183a5a5e9a8ba7945690bed6831840d5d19e..47f4b9668624bb19fde34cca1a3427d6820f4912 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2015-2016 OpenWrt.org
+# Copyright (C) 2015-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=python-idna
 PKG_VERSION:=2.6
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=idna-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/f4/bd/0467d62790828c23c47fc1dfa1b1f052b24efdf5290f071c7a91d0d82fd3
@@ -22,8 +22,8 @@ PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>, Alexandru Ardelean <ardeleana
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-idna-$(PKG_VERSION)
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
-$(call include_mk, python3-package.mk)
+include ../python-package.mk
+include ../python3-package.mk
 
 PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 
@@ -63,5 +63,8 @@ endef
 
 $(eval $(call PyPackage,python-idna))
 $(eval $(call BuildPackage,python-idna))
+$(eval $(call BuildPackage,python-idna-src))
+
 $(eval $(call Py3Package,python3-idna))
 $(eval $(call BuildPackage,python3-idna))
+$(eval $(call BuildPackage,python3-idna-src))
diff --git a/lang/python/python-incremental/Makefile b/lang/python/python-incremental/Makefile
new file mode 100644 (file)
index 0000000..107cfaf
--- /dev/null
@@ -0,0 +1,67 @@
+#
+# Copyright (C) 2018 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=python-incremental
+PKG_VERSION:=17.5.0
+PKG_RELEASE:=1
+
+PKG_SOURCE:=incremental-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=https://files.pythonhosted.org/packages/source/i/incremental
+PKG_HASH:=7b751696aaf36eebfab537e458929e194460051ccad279c72b755a167eebd4b3
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-incremental-$(PKG_VERSION)
+
+PKG_LICENSE:=MIT
+PKG_LICENSE_FILES:=LICENSE
+PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
+
+include $(INCLUDE_DIR)/package.mk
+include ../python-package.mk
+include ../python3-package.mk
+
+PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
+
+define Package/python-incremental/Default
+  SECTION:=lang
+  CATEGORY:=Languages
+  SUBMENU:=Python
+  URL:=https://github.com/twisted/incremental
+endef
+
+define Package/python-incremental
+$(call Package/python-incremental/Default)
+  TITLE:=Versions your Python projects
+  DEPENDS:=+PACKAGE_python-incremental:python-light
+  VARIANT:=python
+endef
+
+define Package/python3-incremental
+$(call Package/python-incremental/Default)
+  TITLE:=Versions your Python projects
+  DEPENDS:=+PACKAGE_python3-incremental:python3-light
+  VARIANT:=python3
+endef
+
+define Package/python-incremental/description
+Incremental is a small library that versions your Python projects.
+endef
+
+define Package/python3-incremental/description
+$(call Package/python-incremental/description)
+.
+(Variant for Python3)
+endef
+
+$(eval $(call PyPackage,python-incremental))
+$(eval $(call BuildPackage,python-incremental))
+$(eval $(call BuildPackage,python-incremental-src))
+
+$(eval $(call Py3Package,python3-incremental))
+$(eval $(call BuildPackage,python3-incremental))
+$(eval $(call BuildPackage,python3-incremental-src))
diff --git a/lang/python/python-incremental/patches/001-omit-tests.patch b/lang/python/python-incremental/patches/001-omit-tests.patch
new file mode 100644 (file)
index 0000000..b2c0496
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/setup.py
++++ b/setup.py
+@@ -32,7 +32,7 @@ setup(
+         "Programming Language :: Python :: 3.5",
+         "Programming Language :: Python :: 3.6",
+     ],
+-    packages=find_packages("src", exclude=("exampleproj",)),
++    packages=find_packages("src", exclude=("exampleproj", "*.tests", "*.tests.*")),
+     package_dir={"": "src"},
+     extras_require={
+         "scripts": [
index 9435e16c91cabf789b5a132476823b7dd614f82b..3cafd5e3c231e79ac55ad045c0e0e2c7623a71a3 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2015-2016 OpenWrt.org
+# Copyright (C) 2015-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -7,38 +7,42 @@
 
 include $(TOPDIR)/rules.mk
 
-PKG_NAME:=ipaddress
-PKG_VERSION:=1.0.17
-PKG_RELEASE:=1
+PKG_NAME:=python-ipaddress
+PKG_VERSION:=1.0.19
+PKG_RELEASE:=2
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
-PKG_SOURCE_URL:=https://pypi.python.org/packages/bb/26/3b64955ff73f9e3155079b9ed31812afdfa5333b5c76387454d651ef593a
-PKG_HASH:=3a21c5a15f433710aaa26f1ae174b615973a25182006ae7f9c26de151cd51716
+PKG_SOURCE:=ipaddress-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=https://pypi.python.org/packages/f0/ba/860a4a3e283456d6b7e2ab39ce5cf11a3490ee1a363652ac50abf9f0f5df
+PKG_HASH:=200d8686011d470b5e4de207d803445deee427455cd0cb7c982b68cf82524f81
 
-PKG_BUILD_DEPENDS:=python python-setuptools
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-ipaddress-$(PKG_VERSION)
 
 PKG_LICENSE:=Python-2.0
 PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
+
+PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
+
+define Package/python-ipaddress/Default
+  SECTION:=lang
+  CATEGORY:=Languages
+  SUBMENU:=Python
+  URL:=https://github.com/phihag/ipaddress
+endef
 
 define Package/python-ipaddress
-       SECTION:=lang
-       CATEGORY:=Languages
-       SUBMENU:=Python
-       TITLE:=python-ipaddress
-       URL:=https://github.com/phihag/ipaddress
-       DEPENDS:=+python-light
+$(call Package/python-ipaddress/Default)
+  TITLE:=python-ipaddress
+  DEPENDS:=+PACKAGE_python-ipaddress:python-light
+  VARIANT:=python
 endef
 
 define Package/python-ipaddress/description
 Python 3.3+'s ipaddress for Python 2.6, 2.7, 3.2.
 endef
 
-define Build/Compile
-       $(call Build/Compile/PyMod,,install --prefix=/usr --root=$(PKG_INSTALL_DIR))
-endef
-
 $(eval $(call PyPackage,python-ipaddress))
 $(eval $(call BuildPackage,python-ipaddress))
+$(eval $(call BuildPackage,python-ipaddress-src))
index 5f13d208f4eb1c02639cc089f00cc0defbc7275f..a8d983de36fe989472ccdb5937f63a97e94dc3d7 100644 (file)
@@ -18,10 +18,8 @@ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/67/d9/fa0ea70d1792875745116ad62ac8d4bcb07550b15cded591bb57df6a6d9a
 PKG_HASH:=5810f1b5a9ae9255df99fb9c2dcab7352fed325687efda56c0faae1a82c5e3cb
 
-PKG_BUILD_DEPENDS:=python libopenldap
-
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/python-ldap
   SUBMENU:=Python
index 3e228bb607289a83ed39fe1632f360a215e62abe..0c543fce446ce1f5d39a5626afe070cf4ced0a01 100644 (file)
@@ -23,8 +23,8 @@ PKG_LICENSE_FILES:=LICENSES.txt
 PKG_MAINTAINER:=Alexandru Ardelean <ardeleanalex@gmail.com>
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
-$(call include_mk, python3-package.mk)
+include ../python-package.mk
+include ../python3-package.mk
 
 define Package/python-lxml/Default
   SECTION:=lang
index 0c2a5d1551dd55a849834adda720702ae9e61db8..f776b74bbaaad583ef9aee00470464f61b86ad09 100644 (file)
@@ -16,10 +16,8 @@ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).zip
 PKG_SOURCE_URL:=https://pypi.python.org/packages/source/M/MySQL-python/
 PKG_HASH:=811040b647e5d5686f84db415efd697e6250008b112b6909ba77ac059e140c74
 
-PKG_BUILD_DEPENDS:=python python-setuptools libmysqlclient
-
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/python-mysql
   SUBMENU:=Python
diff --git a/lang/python/python-package-install.sh b/lang/python/python-package-install.sh
new file mode 100644 (file)
index 0000000..d5a5032
--- /dev/null
@@ -0,0 +1,86 @@
+#!/bin/sh
+set -e
+
+process_filespec() {
+       local src_dir="$1"
+       local dst_dir="$2"
+       local filespec="$3"
+       echo "$filespec" | (
+       IFS='|'
+       while read fop fspec fperm; do
+               local fop=`echo "$fop" | tr -d ' \t\n'`
+               if [ "$fop" = "+" ]; then
+                       if [ ! -e "${src_dir}${fspec}" ]; then
+                               echo "File not found '${src_dir}${fspec}'"
+                               exit 1
+                       fi
+                       dpath=`dirname "$fspec"`
+                       if [ -z "$fperm" ]; then
+                               dperm=`stat -c "%a" ${src_dir}${dpath}`
+                       fi
+                       mkdir -p -m$dperm ${dst_dir}${dpath}
+                       echo "copying: '$fspec'"
+                       cp -fpR ${src_dir}${fspec} ${dst_dir}${dpath}/
+                       if [ -n "$fperm" ]; then
+                               chmod -R $fperm ${dst_dir}${fspec}
+                       fi
+               elif [ "$fop" = "-" ]; then
+                       echo "removing: '$fspec'"
+                       rm -fR ${dst_dir}${fspec}
+               elif [ "$fop" = "=" ]; then
+                       echo "setting permissions: '$fperm' on '$fspec'"
+                       chmod -R $fperm ${dst_dir}${fspec}
+               fi
+       done
+       )
+}
+
+ver="$1"
+src_dir="$2"
+dst_dir="$3"
+python="$4"
+mode="$5"
+filespec="$6"
+
+process_filespec "$src_dir" "$dst_dir" "$filespec" || {
+       echo "process filespec error-ed"
+       exit 1
+}
+
+if [ "$mode" == "sources" ] ; then
+       # Copy only python source files
+       find $dst_dir -not -type d -not -name "*\.py" | xargs rm -f
+
+       # Delete empty folders (if the case)
+       if [ -d "$dst_dir/usr" ] ; then
+               find $dst_dir/usr -type d | xargs rmdir --ignore-fail-on-non-empty
+               rmdir --ignore-fail-on-non-empty $dst_dir/usr
+       fi
+       exit 0
+fi
+
+legacy=
+[ "$ver" == "3" ] && legacy="-b"
+
+# XXX [So that you won't goof as I did]
+# Note: Yes, I tried to use the -O & -OO flags here.
+#       However the generated byte-codes were not portable.
+#       So, we just stuck to un-optimized byte-codes,
+#       which is still way better/faster than running
+#       Python sources all the time.
+$python -m compileall $legacy -d '/' $dst_dir || {
+       echo "python -m compileall err-ed"
+       exit 1
+}
+
+# Delete source files and pyc [ un-optimized bytecode files ]
+# We may want to make this optimization thing configurable later, but not sure atm
+find $dst_dir -type f -name "*\.py" | xargs rm -f
+
+# Delete empty folders (if the case)
+if [ -d "$dst_dir/usr" ] ; then
+       find $dst_dir/usr -type d | xargs rmdir --ignore-fail-on-non-empty
+       rmdir --ignore-fail-on-non-empty $dst_dir/usr
+fi
+
+exit 0
diff --git a/lang/python/python-package.mk b/lang/python/python-package.mk
new file mode 100644 (file)
index 0000000..66a4929
--- /dev/null
@@ -0,0 +1,139 @@
+#
+# Copyright (C) 2006-2016 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+# Note: include this after `include $(TOPDIR)/rules.mk in your package Makefile
+
+python_mk_path:=$(dir $(lastword $(MAKEFILE_LIST)))
+include $(python_mk_path)python-host.mk
+
+PYTHON_DIR:=$(STAGING_DIR)/usr
+PYTHON_BIN_DIR:=$(PYTHON_DIR)/bin
+PYTHON_INC_DIR:=$(PYTHON_DIR)/include/python$(PYTHON_VERSION)
+PYTHON_LIB_DIR:=$(PYTHON_DIR)/lib/python$(PYTHON_VERSION)
+
+PYTHON_PKG_DIR:=/usr/lib/python$(PYTHON_VERSION)/site-packages
+
+PYTHON:=python$(PYTHON_VERSION)
+
+PYTHONPATH:=$(PYTHON_LIB_DIR):$(STAGING_DIR)/$(PYTHON_PKG_DIR):$(PKG_INSTALL_DIR)/$(PYTHON_PKG_DIR)
+
+# These configure args are needed in detection of path to Python header files
+# using autotools.
+CONFIGURE_ARGS += \
+       _python_sysroot="$(STAGING_DIR)" \
+       _python_prefix="/usr" \
+       _python_exec_prefix="/usr"
+
+PKG_USE_MIPS16:=0
+# This is required in addition to PKG_USE_MIPS16:=0 because otherwise MIPS16
+# flags are inherited from the Python base package (via sysconfig module)
+ifdef CONFIG_USE_MIPS16
+  TARGET_CFLAGS += -mno-mips16 -mno-interlink-mips16
+endif
+
+define PyPackage
+
+  define Package/$(1)-src
+    $(call Package/$(1))
+    DEPENDS:=
+    TITLE+= (sources)
+  endef
+
+  define Package/$(1)-src/description
+    $(call Package/$(1)/description).
+    (Contains the Python sources for this package).
+  endef
+
+  # Add default PyPackage filespec none defined
+  ifndef PyPackage/$(1)/filespec
+    define PyPackage/$(1)/filespec
+      +|$(PYTHON_PKG_DIR)
+    endef
+  endif
+
+  ifndef PyPackage/$(1)/install
+    define PyPackage/$(1)/install
+               if [ -d $(PKG_INSTALL_DIR)/usr/bin ]; then \
+                       $(INSTALL_DIR) $$(1)/usr/bin ; \
+                       $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $$(1)/usr/bin/ ; \
+               fi
+    endef
+  endif
+
+  ifndef Package/$(1)/install
+  $(call shexport,PyPackage/$(1)/filespec)
+
+  define Package/$(1)/install
+       $(call PyPackage/$(1)/install,$$(1))
+       find $(PKG_INSTALL_DIR) -name "*\.exe" | xargs rm -f
+       $(SHELL) $(python_mk_path)python-package-install.sh "2" \
+               "$(PKG_INSTALL_DIR)" "$$(1)" \
+               "$(HOST_PYTHON_BIN)" "$$(2)" \
+               "$$$$$$$$$$(call shvar,PyPackage/$(1)/filespec)"
+  endef
+
+  define Package/$(1)-src/install
+       $$(call Package/$(1)/install,$$(1),sources)
+  endef
+  endif # Package/$(1)/install
+endef
+
+# $(1) => commands to execute before running pythons script
+# $(2) => python script and its arguments
+# $(3) => additional variables
+define Build/Compile/HostPyRunTarget
+       $(call HostPython, \
+               $(if $(1),$(1);) \
+               CC="$(TARGET_CC)" \
+               CCSHARED="$(TARGET_CC) $(FPIC)" \
+               CXX="$(TARGET_CXX)" \
+               LD="$(TARGET_CC)" \
+               LDSHARED="$(TARGET_CC) -shared" \
+               CFLAGS="$(TARGET_CFLAGS)" \
+               CPPFLAGS="$(TARGET_CPPFLAGS) -I$(PYTHON_INC_DIR)" \
+               LDFLAGS="$(TARGET_LDFLAGS) -lpython$(PYTHON_VERSION)" \
+               _PYTHON_HOST_PLATFORM=linux2 \
+               __PYVENV_LAUNCHER__="/usr/bin/$(PYTHON)" \
+               $(3) \
+               , \
+               $(2) \
+       )
+endef
+
+# $(1) => build subdir
+# $(2) => additional arguments to setup.py
+# $(3) => additional variables
+define Build/Compile/PyMod
+       $(INSTALL_DIR) $(PKG_INSTALL_DIR)/$(PYTHON_PKG_DIR)
+       $(call Build/Compile/HostPyRunTarget, \
+               cd $(PKG_BUILD_DIR)/$(strip $(1)), \
+               ./setup.py $(2), \
+               $(3))
+       find $(PKG_INSTALL_DIR) -name "*\.exe" | xargs rm -f
+endef
+
+PYTHON_PKG_SETUP_ARGS:=--single-version-externally-managed
+PYTHON_PKG_SETUP_VARS:=
+
+define PyBuild/Compile/Default
+       $(foreach pkg,$(HOST_PYTHON_PACKAGE_BUILD_DEPENDS),
+               $(call host_python_pip_install_host,$(pkg))
+       )
+       $(call Build/Compile/PyMod,, \
+               install --prefix="/usr" --root="$(PKG_INSTALL_DIR)" \
+               $(PYTHON_PKG_SETUP_ARGS), \
+               $(PYTHON_PKG_SETUP_VARS) \
+       )
+endef
+
+PyBuild/Compile=$(PyBuild/Compile/Default)
+
+ifeq ($(BUILD_VARIANT),python)
+define Build/Compile
+       $(call PyBuild/Compile)
+endef
+endif # python
index 7686e383452ac161c08c7348a7d04ad03d51f0d1..cefc2cb8693f670f6d30d6db69e216fa7ecb0e3f 100644 (file)
@@ -32,7 +32,7 @@ PKG_CONFIG_DEPENDS:= \
 PKG_BUILD_DEPENDS:=python python/host
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/python-packages
   SUBMENU:=Python
index c9d604b520ac129bfdc260009d4b0eeca770133b..53b50954c31172e5b0c8ff866b3e95d11f397358 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2015 OpenWrt.org
+# Copyright (C) 2015, 2017-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -7,37 +7,69 @@
 
 include $(TOPDIR)/rules.mk
 
-PKG_NAME:=Parsley
+PKG_NAME:=python-parsley
 PKG_VERSION:=1.3
-PKG_RELEASE:=1
+PKG_RELEASE:=3
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE:=Parsley-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/source/P/Parsley
 PKG_HASH:=9444278d47161d5f2be76a767809a3cbe6db4db822f46a4fd7481d4057208d41
 
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-parsley-$(PKG_VERSION)
+
 PKG_LICENSE:=MIT
 PKG_LICENSE_FILES:=LICENSE
 PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
+include ../python3-package.mk
+
+PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
+
+define Package/python-parsley/Default
+  SECTION:=lang
+  CATEGORY:=Languages
+  SUBMENU:=Python
+  URL:=http://launchpad.net/parsley
+endef
 
 define Package/python-parsley
-       SECTION:=lang
-       CATEGORY:=Languages
-       SUBMENU:=Python
-       TITLE:=python-parsley
-       URL:=http://launchpad.net/parsley
-       DEPENDS:=+python-light
+$(call Package/python-parsley/Default)
+  TITLE:=python-parsley
+  DEPENDS:=+PACKAGE_python-parsley:python-light
+  VARIANT:=python
+endef
+
+define Package/python3-parsley
+$(call Package/python-parsley/Default)
+  TITLE:=python3-parsley
+  DEPENDS:=+PACKAGE_python3-parsley:python3-light
+  VARIANT:=python3
 endef
 
 define Package/python-parsley/description
 Parsing and pattern matching made easy.
 endef
 
-define Build/Compile
+define Package/python3-parsley/description
+$(call Package/python-parsley/description)
+.
+(Variant for Python3)
+endef
+
+define PyBuild/Compile
        $(call Build/Compile/PyMod,,install --prefix="/usr" --root="$(PKG_INSTALL_DIR)")
 endef
 
+define Py3Build/Compile
+       $(call Build/Compile/Py3Mod,,install --prefix="/usr" --root="$(PKG_INSTALL_DIR)")
+endef
+
 $(eval $(call PyPackage,python-parsley))
 $(eval $(call BuildPackage,python-parsley))
+$(eval $(call BuildPackage,python-parsley-src))
+
+$(eval $(call Py3Package,python3-parsley))
+$(eval $(call BuildPackage,python3-parsley))
+$(eval $(call BuildPackage,python3-parsley-src))
diff --git a/lang/python/python-parsley/patches/001-omit-tests.patch b/lang/python/python-parsley/patches/001-omit-tests.patch
deleted file mode 100644 (file)
index 71bd021..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -Nur a/setup.py b/setup.py
---- a/setup.py 2015-09-09 10:45:25.000000000 +0800
-+++ b/setup.py 2015-12-01 17:31:03.143409843 +0800
-@@ -14,7 +14,6 @@
-     author_email="washort42@gmail.com",
-     license="MIT License",
-     long_description=open("README").read(),
--    packages=["ometa", "terml", "ometa._generated", "terml._generated",
--              "ometa.test", "terml.test"],
-+    packages=["ometa", "terml", "ometa._generated", "terml._generated"],
-     py_modules=["parsley"]
- )
diff --git a/lang/python/python-parsley/patches/001-py3-read-utf8.patch b/lang/python/python-parsley/patches/001-py3-read-utf8.patch
new file mode 100644 (file)
index 0000000..f3e63dc
--- /dev/null
@@ -0,0 +1,19 @@
+--- a/setup.py
++++ b/setup.py
+@@ -4,6 +4,7 @@
+ Setup script for the Parsley distribution.
+ """
++import io
+ from distutils.core import setup
+ setup(
+     name="Parsley",
+@@ -13,7 +14,7 @@ setup(
+     author="Allen Short",
+     author_email="washort42@gmail.com",
+     license="MIT License",
+-    long_description=open("README").read(),
++    long_description=io.open("README", encoding="utf-8").read(),
+     packages=["ometa", "terml", "ometa._generated", "terml._generated",
+               "ometa.test", "terml.test"],
+     py_modules=["parsley"]
diff --git a/lang/python/python-parsley/patches/002-omit-tests.patch b/lang/python/python-parsley/patches/002-omit-tests.patch
new file mode 100644 (file)
index 0000000..4fe43b8
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/setup.py
++++ b/setup.py
+@@ -15,7 +15,6 @@ setup(
+     author_email="washort42@gmail.com",
+     license="MIT License",
+     long_description=io.open("README", encoding="utf-8").read(),
+-    packages=["ometa", "terml", "ometa._generated", "terml._generated",
+-              "ometa.test", "terml.test"],
++    packages=["ometa", "terml", "ometa._generated", "terml._generated"],
+     py_modules=["parsley"]
+ )
index f672cdc3ccdd8d914fa43d8c88c99d8a61a3585b..c1dc932c26da6cd7e0f0adf477c724cd91e0b615 100644 (file)
@@ -20,10 +20,8 @@ PKG_SOURCE_URL:=https://github.com/CoreSecurity/pcapy.git
 PKG_SOURCE_VERSION:=b91a418374d1636408c435f11799ef725ef70097
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
 
-PKG_BUILD_DEPENDS:=python python-setuptools
-
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/python-pcapy
        SECTION:=language-python
index 212fdb03be1cd5c2131043b5f8439c8ebb2d1519..697020402633c9a42dd46dcb878c25ac8530b08f 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2015-2016 OpenWrt.org
+# Copyright (C) 2015-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=python-ply
 PKG_VERSION:=3.10
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=ply-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://www.dabeaz.com/ply
@@ -22,8 +22,8 @@ PKG_LICENSE_FILES:=README.md
 PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
-$(call include_mk, python3-package.mk)
+include ../python-package.mk
+include ../python3-package.mk
 
 PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 
@@ -61,6 +61,8 @@ endef
 
 $(eval $(call PyPackage,python-ply))
 $(eval $(call BuildPackage,python-ply))
+$(eval $(call BuildPackage,python-ply-src))
 
 $(eval $(call Py3Package,python3-ply))
 $(eval $(call BuildPackage,python3-ply))
+$(eval $(call BuildPackage,python3-ply-src))
index cf0cd8221d0c12bc1a8d2e1e878798c4d14d2e8a..4feaf39b4de1a43973c411299e8f6dcc1b0f2425 100644 (file)
@@ -19,10 +19,10 @@ PKG_SOURCE_URL:=http://initd.org/psycopg/tarballs/PSYCOPG-2-6/
 PKG_HASH:=70490e12ed9c5c818ecd85d185d363335cc8a8cbf7212e3c185431c79ff8c05c
 
 PKG_BUILD_DIR:=$(BUILD_DIR)/psycopg2-$(PKG_VERSION)
-PKG_BUILD_DEPENDS:=python libpq python/host
+PKG_BUILD_DEPENDS:=python/host
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/python-psycopg2
   SUBMENU:=Python
index 78072a594921370c374210f7779263e382c479d6..7ad1e1f3576aabc1f2f20fad5191832cbe51bfd1 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2015-2017 OpenWrt.org
+# Copyright (C) 2015-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=python-pyasn1-modules
-PKG_VERSION:=0.1.5
-PKG_RELEASE:=1
+PKG_VERSION:=0.2.1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=pyasn1-modules-$(PKG_VERSION).tar.gz
-PKG_SOURCE_URL:=https://pypi.python.org/packages/7e/2c/351c0c0ef88b904de50d8144eb4c365c13660c297c051b72255b4e1ad34a
-PKG_HASH:=1d303eed5aa54cafeca209d16b8c7ea2c6064735fb61f1bee2e0ed63a0816988
+PKG_SOURCE_URL:=https://pypi.python.org/packages/ab/76/36ab0e099e6bd27ed95b70c2c86c326d3affa59b9b535c63a2f892ac9f45
+PKG_HASH:=af00ea8f2022b6287dc375b2c70f31ab5af83989fc6fe9eacd4976ce26cd7ccc
 
 PKG_LICENSE:=BSD-2-Clause
 PKG_LICENSE_FILES:=LICENSE.txt
@@ -22,8 +22,8 @@ PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>, Alexandru Ardelean <ardeleana
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-pyasn1-modules-$(PKG_VERSION)
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
-$(call include_mk, python3-package.mk)
+include ../python-package.mk
+include ../python3-package.mk
 
 PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 
@@ -65,5 +65,8 @@ endef
 
 $(eval $(call PyPackage,python-pyasn1-modules))
 $(eval $(call BuildPackage,python-pyasn1-modules))
+$(eval $(call BuildPackage,python-pyasn1-modules-src))
+
 $(eval $(call Py3Package,python3-pyasn1-modules))
 $(eval $(call BuildPackage,python3-pyasn1-modules))
+$(eval $(call BuildPackage,python3-pyasn1-modules-src))
index 6c48fe2dbd26e5c309c28097e3014e86e3d7d06a..6129f3d43a2aaa3c8838f5fcf84168bdf262eaf8 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2015 OpenWrt.org
+# Copyright (C) 2015-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=python-pyasn1
-PKG_VERSION:=0.3.7
-PKG_RELEASE:=1
+PKG_VERSION:=0.4.2
+PKG_RELEASE:=2
 
 PKG_SOURCE:=pyasn1-$(PKG_VERSION).tar.gz
-PKG_SOURCE_URL:=https://pypi.python.org/packages/3c/a6/4d6c88aa1694a06f6671362cb3d0350f0d856edea4685c300785200d1cd9/
-PKG_HASH:=187f2a66d617683f8e82d5c00033b7c8a0287e1da88a9d577aebec321cad4965
+PKG_SOURCE_URL:=https://pypi.python.org/packages/eb/3d/b7d0fdf4a882e26674c68c20f40682491377c4db1439870f5b6f862f76ed
+PKG_HASH:=d258b0a71994f7770599835249cece1caef3c70def868c4915e6e5ca49b67d15
 
 PKG_LICENSE:=BSD-2-Clause
 PKG_LICENSE_FILES:=LICENSE.txt
@@ -22,8 +22,8 @@ PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>, Alexandru Ardelean <ardeleana
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-pyasn1-$(PKG_VERSION)
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
-$(call include_mk, python3-package.mk)
+include ../python-package.mk
+include ../python3-package.mk
 
 PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 
@@ -63,5 +63,8 @@ endef
 
 $(eval $(call PyPackage,python-pyasn1))
 $(eval $(call BuildPackage,python-pyasn1))
+$(eval $(call BuildPackage,python-pyasn1-src))
+
 $(eval $(call Py3Package,python3-pyasn1))
 $(eval $(call BuildPackage,python3-pyasn1))
+$(eval $(call BuildPackage,python3-pyasn1-src))
index 15aea4b5bab277ce678723d3b2eb3072a9a358a1..9a8b65caedc85dfdc22163db9649c33c73058323 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2015-2016 OpenWrt.org
+# Copyright (C) 2015-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=python-pycparser
-PKG_VERSION:=2.17
-PKG_RELEASE:=1
+PKG_VERSION:=2.18
+PKG_RELEASE:=2
 
 PKG_SOURCE:=pycparser-$(PKG_VERSION).tar.gz
-PKG_SOURCE_URL:=https://pypi.python.org/packages/be/64/1bb257ffb17d01f4a38d7ce686809a736837ad4371bcc5c42ba7a715c3ac
-PKG_HASH:=0aac31e917c24cb3357f5a4d5566f2cc91a19ca41862f6c3c22dc60a629673b6
+PKG_SOURCE_URL:=https://pypi.python.org/packages/8c/2d/aad7f16146f4197a11f8e91fb81df177adcc2073d36a17b1491fd09df6ed
+PKG_HASH:=99a8ca03e29851d96616ad0404b4aad7d9ee16f25c9f9708a11faf2810f7b226
 
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-pycparser-$(PKG_VERSION)
 
@@ -21,9 +21,12 @@ PKG_LICENSE:=BSD-3-Clause
 PKG_LICENSE_FILES:=LICENSE
 PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
 
+HOST_PYTHON_PACKAGE_BUILD_DEPENDS:="ply==3.10"
+HOST_PYTHON3_PACKAGE_BUILD_DEPENDS:="ply==3.10"
+
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
-$(call include_mk, python3-package.mk)
+include ../python-package.mk
+include ../python3-package.mk
 
 PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 
@@ -62,6 +65,8 @@ endef
 
 $(eval $(call PyPackage,python-pycparser))
 $(eval $(call BuildPackage,python-pycparser))
+$(eval $(call BuildPackage,python-pycparser-src))
 
 $(eval $(call Py3Package,python3-pycparser))
 $(eval $(call BuildPackage,python3-pycparser))
+$(eval $(call BuildPackage,python3-pycparser-src))
index dafc93cd304e59b29aa029642e02fb94e28d4936..3f8fc9058ff5cf942e1553d0896655c3cd4468d9 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2015-2017 OpenWrt.org
+# Copyright (C) 2015-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -7,13 +7,13 @@
 
 include $(TOPDIR)/rules.mk
 
-PKG_NAME:=pyOpenSSL
-PKG_VERSION:=17.3.0
-PKG_RELEASE:=1
+PKG_NAME:=python-pyopenssl
+PKG_VERSION:=17.5.0
+PKG_RELEASE:=2
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
-PKG_SOURCE_URL:=https://pypi.python.org/packages/ee/6a/cd78737dd990297205943cc4dcad3d3c502807fd2c5b18c5f33dc90ca214
-PKG_HASH:=29630b9064a82e04d8242ea01d7c93d70ec320f5e3ed48e95fcabc6b1d0f6c76
+PKG_SOURCE:=pyOpenSSL-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=https://pypi.python.org/packages/3b/15/a5d90ab1a41075e8f0fae334f13452549528f82142b3b9d0c9d86ab7178c
+PKG_HASH:=2c10cfba46a52c0b0950118981d61e72c1e5b1aac451ca1bc77de1a679456773
 
 PKG_LICENSE:=Apache-2.0
 PKG_LICENSE_FILES:=LICENSE
@@ -22,8 +22,8 @@ PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>, Alexandru Ardelean <ardeleana
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-pyopenssl-$(PKG_VERSION)
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
-$(call include_mk, python3-package.mk)
+include ../python-package.mk
+include ../python3-package.mk
 
 PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 
@@ -66,5 +66,8 @@ endef
 
 $(eval $(call PyPackage,python-pyopenssl))
 $(eval $(call BuildPackage,python-pyopenssl))
+$(eval $(call BuildPackage,python-pyopenssl-src))
+
 $(eval $(call Py3Package,python3-pyopenssl))
 $(eval $(call BuildPackage,python3-pyopenssl))
+$(eval $(call BuildPackage,python3-pyopenssl-src))
index 18d02dc46176cdfc343af656bede1a8770fed909..b003976a567935d6e9d2fc5ddb408556240da0e2 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2015 OpenWrt.org
+# Copyright (C) 2015, 2017-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -7,30 +7,37 @@
 
 include $(TOPDIR)/rules.mk
 
-PKG_NAME:=pyptlib
+PKG_NAME:=python-pyptlib
 PKG_VERSION:=0.0.6
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE:=pyptlib-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/source/p/pyptlib
 PKG_HASH:=b98472e3d9e8f4689d3913ca8f89afa5e6cc5383dcd8686987606166f9dac607
 
-PKG_BUILD_DEPENDS:=python python-setuptools
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-pyptlib-$(PKG_VERSION)
 
 PKG_LICENSE:=BSD-3-Clause
 PKG_LICENSE_FILES:=LICENSE
 PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
+
+PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
+
+define Package/python-pyptlib/Default
+  SECTION:=lang
+  CATEGORY:=Languages
+  SUBMENU:=Python
+  URL:=https://pypi.python.org/pypi/pyptlib
+endef
 
 define Package/python-pyptlib
-       SECTION:=lang
-       CATEGORY:=Languages
-       SUBMENU:=Python
-       TITLE:=python-pyptlib
-       URL:=https://pypi.python.org/pypi/pyptlib
-       DEPENDS:=+python-light
+$(call Package/python-pyptlib/Default)
+  TITLE:=python-pyptlib
+  DEPENDS:=+PACKAGE_python-pyptlib:python-light
+  VARIANT:=python
 endef
 
 define Package/python-pyptlib/description
@@ -38,9 +45,6 @@ A python implementation of the Pluggable Transports for Circumvention
 specification for Tor
 endef
 
-define Build/Compile
-       $(call Build/Compile/PyMod,,install --prefix="/usr" --root="$(PKG_INSTALL_DIR)")
-endef
-
 $(eval $(call PyPackage,python-pyptlib))
 $(eval $(call BuildPackage,python-pyptlib))
+$(eval $(call BuildPackage,python-pyptlib-src))
index 803884cc780019123f97da3b899b955bdad03b37..2342b02430dd29e481b29c57ed49213b7c76049c 100644 (file)
@@ -21,7 +21,7 @@ PKG_BUILD_DIR:=$(BUILD_DIR)/pyserial-$(PKG_VERSION)
 PKG_BUILD_DEPENDS:=python
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/python-pyserial
   SUBMENU:=Python
index ec6e132af30e6924b5d16ffc02e5d25fd9da050b..552ba3d310a042feca8acf2383010f78c5efab2d 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2016 OpenWrt.org
+# Copyright (C) 2016-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -7,30 +7,55 @@
 
 include $(TOPDIR)/rules.mk
 
-PKG_NAME:=service_identity
-PKG_VERSION:=16.0.0
-PKG_RELEASE:=1
+PKG_NAME:=python-service-identity
+PKG_VERSION:=17.0.0
+PKG_RELEASE:=2
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
-PKG_SOURCE_URL:=https://pypi.python.org/packages/source/s/service_identity
-PKG_HASH:=0630e222f59f91f3db498be46b1d879ff220955d7bbad719a5cb9ad14e3c3036
+PKG_SOURCE:=service_identity-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=https://pypi.python.org/packages/de/2a/cab6e30be82c8fcd2339ef618036720eda954cf05daef514e386661c9221
+PKG_HASH:=4001fbb3da19e0df22c47a06d29681a398473af4aa9d745eca525b3b2c2302ab
 
-PKG_BUILD_DEPENDS:=python python-setuptools
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-service-identity-$(PKG_VERSION)
 
 PKG_LICENSE:=MIT
 PKG_LICENSE_FILES:=LICENSE
 PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
+include ../python3-package.mk
+
+PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
+
+define Package/python-service-identity/Default
+  SECTION:=lang
+  CATEGORY:=Languages
+  SUBMENU:=Python
+  URL:=https://github.com/pyca/service_identity
+endef
 
 define Package/python-service-identity
-       SECTION:=lang
-       CATEGORY:=Languages
-       SUBMENU:=Python
-       TITLE:=python-service-identity
-       URL:=https://github.com/pyca/service_identity
-       DEPENDS:=+python-light +python-attrs +python-pyasn1 +python-pyasn1-modules +python-pyopenssl
+$(call Package/python-service-identity/Default)
+  TITLE:=python-service-identity
+  DEPENDS:= \
+      +PACKAGE_python-service-identity:python-light \
+      +PACKAGE_python-service-identity:python-attrs \
+      +PACKAGE_python-service-identity:python-pyasn1 \
+      +PACKAGE_python-service-identity:python-pyasn1-modules \
+      +PACKAGE_python-service-identity:python-pyopenssl
+  VARIANT:=python
+endef
+
+define Package/python3-service-identity
+$(call Package/python-service-identity/Default)
+  TITLE:=python3-service-identity
+  DEPENDS:= \
+      +PACKAGE_python3-service-identity:python3-light \
+      +PACKAGE_python3-service-identity:python3-attrs \
+      +PACKAGE_python3-service-identity:python3-pyasn1 \
+      +PACKAGE_python3-service-identity:python3-pyasn1-modules \
+      +PACKAGE_python3-service-identity:python3-pyopenssl
+  VARIANT:=python3
 endef
 
 define Package/python-service-identity/description
@@ -38,9 +63,16 @@ service_identity aspires to give you all the tools you need for
 verifying whether a certificate is valid for the intended purposes.
 endef
 
-define Build/Compile
-       $(call Build/Compile/PyMod,,install --prefix="/usr" --root="$(PKG_INSTALL_DIR)")
+define Package/python3-service-identity/description
+$(call Package/python-service-identity/description)
+.
+(Variant for Python3)
 endef
 
 $(eval $(call PyPackage,python-service-identity))
 $(eval $(call BuildPackage,python-service-identity))
+$(eval $(call BuildPackage,python-service-identity-src))
+
+$(eval $(call Py3Package,python3-service-identity))
+$(eval $(call BuildPackage,python3-service-identity))
+$(eval $(call BuildPackage,python3-service-identity-src))
index ff91bde1178266edaac9b24cb2035e859cf4cd8c..2e7e4fa5b57fe94e005f1222d51fb538ded42cfa 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2015 OpenWrt.org
+# Copyright (C) 2015, 2017-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=python-six
 PKG_VERSION:=1.11.0
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=six-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/16/d8/bc6316cf98419719bd59c91742194c111b6f2e85abac88e496adefaf7afe
@@ -25,8 +25,8 @@ PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>, Alexandru Ardelean <ardeleana
 
 include $(INCLUDE_DIR)/host-build.mk
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
-$(call include_mk, python3-package.mk)
+include ../python-package.mk
+include ../python3-package.mk
 
 PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 HOST_UNPACK:=$(HOST_TAR) -C $(HOST_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
@@ -75,5 +75,8 @@ $(eval $(call HostBuild))
 
 $(eval $(call PyPackage,python-six))
 $(eval $(call BuildPackage,python-six))
+$(eval $(call BuildPackage,python-six-src))
+
 $(eval $(call Py3Package,python3-six))
 $(eval $(call BuildPackage,python3-six))
+$(eval $(call BuildPackage,python3-six-src))
index cdaad22864c389ab06f9c9d6bebfb6a40b8846bd..e8a7605b114d607a8ec12092e23b4cfad1a99154 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2015-2016 OpenWrt.org
+# Copyright (C) 2015, 2017-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -7,30 +7,40 @@
 
 include $(TOPDIR)/rules.mk
 
-PKG_NAME:=txsocksx
+PKG_NAME:=python-txsocksx
 PKG_VERSION:=1.15.0.2
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE:=txsocksx-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/source/t/txsocksx
 PKG_HASH:=4f79b5225ce29709bfcee45e6f726e65b70fd6f1399d1898e54303dbd6f8065f
 
-PKG_BUILD_DEPENDS:=python python-setuptools
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-txsocksx-$(PKG_VERSION)
 
 PKG_LICENSE:=ISC
 PKG_LICENSE_FILES:=COPYING
 PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
+
+PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
+
+define Package/python-txsocksx/Default
+  SECTION:=lang
+  CATEGORY:=Languages
+  SUBMENU:=Python
+  URL:=https://github.com/habnabit/txsocksx
+endef
 
 define Package/python-txsocksx
-       SECTION:=lang
-       CATEGORY:=Languages
-       SUBMENU:=Python
-       TITLE:=python-txsocksx
-       URL:=https://github.com/habnabit/txsocksx
-       DEPENDS:=+python-light +python-parsley +twisted
+$(call Package/python-txsocksx/Default)
+  TITLE:=python-txsocksx
+  DEPENDS:= \
+      +PACKAGE_python-txsocksx:python-light \
+      +PACKAGE_python-txsocksx:python-parsley \
+      +PACKAGE_python-txsocksx:twisted
+  VARIANT:=python
 endef
 
 define Package/python-txsocksx/description
@@ -38,7 +48,7 @@ txsocksx is SOCKS4/4a and SOCKS5 client endpoints for Twisted 10.1 or
 greater.
 endef
 
-define Build/Compile
+define PyBuild/Compile
        $(call Build/Compile/PyMod,, \
                install --prefix="/usr" --root="$(PKG_INSTALL_DIR)", \
                PKG_VERSION="$(PKG_VERSION)" \
@@ -47,3 +57,4 @@ endef
 
 $(eval $(call PyPackage,python-txsocksx))
 $(eval $(call BuildPackage,python-txsocksx))
+$(eval $(call BuildPackage,python-txsocksx-src))
index dd4acd7c37838c192ec18fc40215b2a62b4a441b..2bed548d74892fe7f25fad50e4b7449cbbe3d3f9 100644 (file)
@@ -1,5 +1,3 @@
-diff --git a/setup.py b/setup.py
-index 7979f89..3873a1e 100644
 --- a/setup.py
 +++ b/setup.py
 @@ -35,5 +35,5 @@ setup(
index a904db1e430a106c2a16c6cc0320809f6bc5c8d7..c7c2cbbaadff6dc023eea32d146e0476880a4267 100644 (file)
@@ -1,5 +1,3 @@
-diff --git a/setup.py b/setup.py
-index 7979f89..5e1abb3 100644
 --- a/setup.py
 +++ b/setup.py
 @@ -1,6 +1,8 @@
@@ -25,5 +23,5 @@ index 7979f89..5e1abb3 100644
 +    #},
 +    version=os.environ.get('PKG_VERSION'),
      install_requires=install_requires,
-     packages=['txsocksx', 'txsocksx.test'],
+     packages=['txsocksx'],
  )
index 68886797b6a72cc49b2c499257da2497a4e331d8..e014fca099ab4aae9d176d2040cb79377127a618 100644 (file)
@@ -16,10 +16,9 @@ PKG_SOURCE:=urllib3-$(PKG_VERSION).tar.gz
 PKG_BUILD_DIR:=$(BUILD_DIR)/urllib3-$(PKG_VERSION)/
 PKG_SOURCE_URL:=https://pypi.python.org/packages/ee/11/7c59620aceedcc1ef65e156cc5ce5a24ef87be4107c2b74458464e437a5d/
 PKG_HASH:=cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/python-urllib3
   SUBMENU:=Python
diff --git a/lang/python/python-version.mk b/lang/python/python-version.mk
new file mode 100644 (file)
index 0000000..200461d
--- /dev/null
@@ -0,0 +1,13 @@
+#
+# Copyright (C) 2016 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+PYTHON_VERSION:=2.7
+PYTHON_VERSION_MICRO:=14
+
+PYTHON_SETUPTOOLS_VERSION:=28.8.0
+PYTHON_PIP_VERSION:=9.0.1
+
index c6314c8b15e6f31a94382b38b7b0f11f608dbfa7..7846ce26710b4af71e5bdf4120c8ccaeee0a0a90 100644 (file)
@@ -23,8 +23,8 @@ PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-$(PKG_NAME)-$(PKG_VERSION)
 PKG_UNPACK=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
-$(call include_mk, python3-package.mk)
+include ../python-package.mk
+include ../python3-package.mk
 
 define Package/python-yaml/Default
   SUBMENU:=Python
diff --git a/lang/python/python-zope-interface/Makefile b/lang/python/python-zope-interface/Makefile
new file mode 100644 (file)
index 0000000..42e248a
--- /dev/null
@@ -0,0 +1,82 @@
+#
+# Copyright (C) 2006-2011, 2015-2018 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=python-zope-interface
+PKG_VERSION:=4.4.3
+PKG_RELEASE:=2
+
+PKG_SOURCE:=zope.interface-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=https://pypi.python.org/packages/bd/d2/25349ed41f9dcff7b3baf87bd88a4c82396cf6e02f1f42bb68657a3132af
+PKG_HASH:=d6d26d5dfbfd60c65152938fcb82f949e8dada37c041f72916fef6621ba5c5ce
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-zope-interface-$(PKG_VERSION)
+
+PKG_LICENSE:=ZPL-2.1
+PKG_LICENSE_FILES:=LICENSE.txt
+PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
+
+include $(INCLUDE_DIR)/package.mk
+include ../python-package.mk
+include ../python3-package.mk
+
+PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
+
+define Package/python-zope-interface/Default
+  SECTION:=lang
+  CATEGORY:=Languages
+  SUBMENU:=Python
+  URL:=https://github.com/zopefoundation/zope.interface
+endef
+
+define Package/python-zope-interface
+$(call Package/python-zope-interface/Default)
+  TITLE:=python-zope-interface
+  DEPENDS:=+PACKAGE_python-zope-interface:python-light
+  VARIANT:=python
+endef
+
+define Package/python3-zope-interface
+$(call Package/python-zope-interface/Default)
+  TITLE:=python3-zope-interface
+  DEPENDS:=+PACKAGE_python3-zope-interface:python3-light
+  VARIANT:=python3
+endef
+
+define Package/python-zope-interface/description
+This package provides an implementation of "object interfaces" for
+Python. Interfaces are a mechanism for labeling objects as conforming to
+a given API or contract. So, this package can be considered as
+implementation of the Design By Contract methodology support in Python.
+endef
+
+define Package/python3-zope-interface/description
+$(call Package/python-zope-interface/description)
+.
+(Variant for Python3)
+endef
+
+define PyPackage/python-zope-interface/filespec
++|$(PYTHON_PKG_DIR)
+-|$(PYTHON_PKG_DIR)/zope/interface/common/tests
+-|$(PYTHON_PKG_DIR)/zope/interface/tests
+endef
+
+define Py3Package/python3-zope-interface/filespec
++|$(PYTHON3_PKG_DIR)
+-|$(PYTHON3_PKG_DIR)/zope/interface/common/tests
+-|$(PYTHON3_PKG_DIR)/zope/interface/tests
+endef
+
+$(eval $(call PyPackage,python-zope-interface))
+$(eval $(call BuildPackage,python-zope-interface))
+$(eval $(call BuildPackage,python-zope-interface-src))
+
+$(eval $(call Py3Package,python3-zope-interface))
+$(eval $(call BuildPackage,python3-zope-interface))
+$(eval $(call BuildPackage,python3-zope-interface-src))
index 0e0ffc25c61cffb5533433145bb301bb61256f4f..c70c486e8a93c8f8160686cf94ed0f339345b70f 100644 (file)
@@ -8,13 +8,11 @@
 include $(TOPDIR)/rules.mk
 
 # For PYTHON_VERSION
-include ./files/python-version.mk
+include ../python-version.mk
 
 PKG_NAME:=python
 PKG_VERSION:=$(PYTHON_VERSION).$(PYTHON_VERSION_MICRO)
-# XXX: reset PKG_RELEASE to 1 only if Python's pip & setuptools versions have also bumped;
-#      otherwise, keep bumping PKG_RELEASE
-PKG_RELEASE:=5
+PKG_RELEASE:=10
 
 PKG_SOURCE:=Python-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=https://www.python.org/ftp/python/$(PKG_VERSION)
@@ -24,10 +22,10 @@ PKG_LICENSE:=PSF
 PKG_LICENSE_FILES:=LICENSE Modules/_ctypes/libffi_msvc/LICENSE Modules/_ctypes/darwin/LICENSE Modules/_ctypes/libffi/LICENSE Modules/_ctypes/libffi_osx/LICENSE Tools/pybench/LICENSE
 
 # This file provides the necsessary host build variables
-include ./files/python-host.mk
+include ../python-host.mk
 
 # For PyPackage
-include ./files/python-package.mk
+include ../python-package.mk
 
 PKG_FIXUP:=autoreconf
 PKG_INSTALL:=1
@@ -42,7 +40,7 @@ PKG_CONFIG_DEPENDS:= \
        CONFIG_PYTHON_BLUETOOTH_SUPPORT
 
 PKG_BUILD_DEPENDS:=python/host
-HOST_BUILD_DEPENDS:=bzip2/host expat/host
+HOST_BUILD_DEPENDS:=bzip2/host expat/host zlib/host
 
 include $(INCLUDE_DIR)/host-build.mk
 include $(INCLUDE_DIR)/package.mk
@@ -192,16 +190,6 @@ define Build/Compile
        $(call Build/Compile/python-pip)
 endef
 
-define Build/InstallMkFiles
-       $(INSTALL_DIR) $(STAGING_DIR)/mk/
-       $(INSTALL_DATA) \
-               ./files/python-package.mk \
-               ./files/python-host.mk \
-               ./files/python-version.mk \
-               ./files/python-package-install.sh \
-               $(STAGING_DIR)/mk/
-endef
-
 define Build/InstallDev
        $(INSTALL_DIR) $(1)/usr/include/ $(1)/usr/lib/ $(1)/usr/lib/pkgconfig
        $(INSTALL_DIR) $(1)/usr/lib/python$(PYTHON_VERSION)/
@@ -220,7 +208,6 @@ define Build/InstallDev
        $(CP) \
                $(PKG_INSTALL_DIR)/usr/lib/python$(PYTHON_VERSION)/config \
                $(1)/usr/lib/python$(PYTHON_VERSION)/
-       $(call Build/InstallMkFiles)
 endef
 
 PYTHON_BASE_LIB_FILES:= \
@@ -300,7 +287,6 @@ define Host/Compile
 endef
 
 define Host/Install
-       $(call Build/InstallMkFiles)
        $(MAKE) -C $(HOST_BUILD_DIR) install
        $(INSTALL_DIR) $(HOST_PYTHON_DIR)/bin/
        $(INSTALL_BIN) $(HOST_BUILD_DIR)/Parser/pgen $(HOST_PYTHON_DIR)/bin/pgen2
@@ -324,4 +310,3 @@ $(eval $(call BuildPackage,python))
 
 $(eval $(call BuildPackage,python-base-src))
 $(eval $(call BuildPackage,python-light-src))
-$(eval $(call BuildPackage,python-src))
diff --git a/lang/python/python/files/python-host.mk b/lang/python/python/files/python-host.mk
deleted file mode 100644 (file)
index e836eae..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-#
-# Copyright (C) 2015-2016 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-
-ifneq ($(__python_host_mk_inc),1)
-__python_host_mk_inc=1
-
-# For PYTHON_VERSION
-$(call include_mk, python-version.mk)
-
-HOST_PYTHON_DIR:=$(STAGING_DIR_HOSTPKG)
-HOST_PYTHON_INC_DIR:=$(HOST_PYTHON_DIR)/include/python$(PYTHON_VERSION)
-HOST_PYTHON_LIB_DIR:=$(HOST_PYTHON_DIR)/lib/python$(PYTHON_VERSION)
-
-HOST_PYTHON_PKG_DIR:=$(HOST_PYTHON_DIR)/lib/python$(PYTHON_VERSION)/site-packages
-
-HOST_PYTHON_BIN:=$(HOST_PYTHON_DIR)/bin/python$(PYTHON_VERSION)
-
-HOST_PYTHONPATH:=$(HOST_PYTHON_LIB_DIR):$(HOST_PYTHON_PKG_DIR)
-
-define HostPython
-       if [ "$(strip $(3))" == "HOST" ]; then \
-               export PYTHONPATH="$(HOST_PYTHONPATH)"; \
-               export PYTHONDONTWRITEBYTECODE=0; \
-       else \
-               export PYTHONPATH="$(PYTHONPATH)"; \
-               export PYTHONDONTWRITEBYTECODE=1; \
-               export _python_sysroot="$(STAGING_DIR)"; \
-               export _python_prefix="/usr"; \
-               export _python_exec_prefix="/usr"; \
-       fi; \
-       export PYTHONOPTIMIZE=""; \
-       $(1) \
-       $(HOST_PYTHON_BIN) $(2);
-endef
-
-define host_python_settings
-       ARCH="$(HOST_ARCH)" \
-       CC="$(HOSTCC)" \
-       CCSHARED="$(HOSTCC) $(HOST_FPIC)" \
-       CXX="$(HOSTCXX)" \
-       LD="$(HOSTCC)" \
-       LDSHARED="$(HOSTCC) -shared" \
-       CFLAGS="$(HOST_CFLAGS)" \
-       CPPFLAGS="$(HOST_CPPFLAGS) -I$(HOST_PYTHON_INC_DIR)" \
-       LDFLAGS="$(HOST_LDFLAGS) -lpython$(PYTHON_VERSION) -Wl$(comma)-rpath=$(STAGING_DIR_HOSTPKG)/lib" \
-       _PYTHON_HOST_PLATFORM=linux2
-endef
-
-# $(1) => commands to execute before running pythons script
-# $(2) => python script and its arguments
-# $(3) => additional variables
-define Build/Compile/HostPyRunHost
-       $(call HostPython, \
-               $(if $(1),$(1);) \
-               $(call host_python_settings) \
-               $(3) \
-               , \
-               $(2) \
-               , \
-               HOST \
-       )
-endef
-
-# Note: I shamelessly copied this from Yousong's logic (from python-packages);
-HOST_PYTHON_PIP:=$(STAGING_DIR_HOSTPKG)/bin/pip$(PYTHON_VERSION)
-define host_python_pip_install
-       $(call host_python_settings) \
-       $(HOST_PYTHON_PIP) install \
-               --root=$(1) \
-               --prefix=$(2) \
-               --ignore-installed \
-               $(3)
-endef
-
-define host_python_pip_install_host
-$(call host_python_pip_install,$(STAGING_DIR_HOSTPKG),"",$(1))
-endef
-
-# $(1) => build subdir
-# $(2) => additional arguments to setup.py
-# $(3) => additional variables
-define Build/Compile/HostPyMod
-       $(call Build/Compile/HostPyRunHost, \
-               cd $(HOST_BUILD_DIR)/$(strip $(1)), \
-               ./setup.py $(2), \
-               $(3))
-endef
-
-endif # __python_host_mk_inc
diff --git a/lang/python/python/files/python-package-install.sh b/lang/python/python/files/python-package-install.sh
deleted file mode 100644 (file)
index cefbce3..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/bin/sh
-set -e
-
-process_filespec() {
-       local src_dir="$1"
-       local dst_dir="$2"
-       local filespec="$3"
-       echo "$filespec" | (
-       IFS='|'
-       while read fop fspec fperm; do
-               local fop=`echo "$fop" | tr -d ' \t\n'`
-               if [ "$fop" = "+" ]; then
-                       if [ ! -e "${src_dir}${fspec}" ]; then
-                               echo "File not found '${src_dir}${fspec}'"
-                               exit 1
-                       fi
-                       dpath=`dirname "$fspec"`
-                       if [ -z "$fperm" ]; then
-                               dperm=`stat -c "%a" ${src_dir}${dpath}`
-                       fi
-                       mkdir -p -m$dperm ${dst_dir}${dpath}
-                       echo "copying: '$fspec'"
-                       cp -fpR ${src_dir}${fspec} ${dst_dir}${dpath}/
-                       if [ -n "$fperm" ]; then
-                               chmod -R $fperm ${dst_dir}${fspec}
-                       fi
-               elif [ "$fop" = "-" ]; then
-                       echo "removing: '$fspec'"
-                       rm -fR ${dst_dir}${fspec}
-               elif [ "$fop" = "=" ]; then
-                       echo "setting permissions: '$fperm' on '$fspec'"
-                       chmod -R $fperm ${dst_dir}${fspec}
-               fi
-       done
-       )
-}
-
-src_dir="$1"
-dst_dir="$2"
-python="$3"
-mode="$4"
-filespec="$5"
-
-process_filespec "$src_dir" "$dst_dir" "$filespec" || {
-       echo "process filespec error-ed"
-       exit 1
-}
-
-# delete egg-info directories
-[ "$PYTHON_KEEP_EGGINFO" == "1" ] || \
-       find "$dst_dir" -name "*.egg-info" | xargs rm -rf
-
-if [ "$mode" == "sources" ] ; then
-       # Copy only python source files
-       find $dst_dir -not -type d -not -name "*\.py" | xargs rm -f
-
-       # Delete empty folders (if the case)
-       if [ -d "$dst_dir/usr" ] ; then
-               find $dst_dir/usr -type d | xargs rmdir --ignore-fail-on-non-empty
-               rmdir --ignore-fail-on-non-empty $dst_dir/usr
-       fi
-       exit 0
-fi
-
-# XXX [So that you won't goof as I did]
-# Note: Yes, I tried to use the -O & -OO flags here.
-#       However the generated byte-codes were not portable.
-#       So, we just stuck to un-optimized byte-codes,
-#       which is still way better/faster than running
-#       Python sources all the time.
-$python -m compileall -d '/' $dst_dir || {
-       echo "python -m compileall err-ed"
-       exit 1
-}
-
-# Delete source files and pyc [ un-optimized bytecode files ]
-# We may want to make this optimization thing configurable later, but not sure atm
-find $dst_dir -type f -name "*\.py" | xargs rm -f
-
-# Delete empty folders (if the case)
-if [ -d "$dst_dir/usr" ] ; then
-       find $dst_dir/usr -type d | xargs rmdir --ignore-fail-on-non-empty
-       rmdir --ignore-fail-on-non-empty $dst_dir/usr
-fi
-
-exit 0
diff --git a/lang/python/python/files/python-package.mk b/lang/python/python/files/python-package.mk
deleted file mode 100644 (file)
index 7e3cb2c..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-#
-# Copyright (C) 2006-2016 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-
-$(call include_mk, python-version.mk)
-
-PYTHON_DIR:=$(STAGING_DIR)/usr
-PYTHON_BIN_DIR:=$(PYTHON_DIR)/bin
-PYTHON_INC_DIR:=$(PYTHON_DIR)/include/python$(PYTHON_VERSION)
-PYTHON_LIB_DIR:=$(PYTHON_DIR)/lib/python$(PYTHON_VERSION)
-
-PYTHON_PKG_DIR:=/usr/lib/python$(PYTHON_VERSION)/site-packages
-
-PYTHON:=python$(PYTHON_VERSION)
-
-PYTHONPATH:=$(PYTHON_LIB_DIR):$(STAGING_DIR)/$(PYTHON_PKG_DIR):$(PKG_INSTALL_DIR)/$(PYTHON_PKG_DIR)
-
-# These configure args are needed in detection of path to Python header files
-# using autotools.
-CONFIGURE_ARGS += \
-       _python_sysroot="$(STAGING_DIR)" \
-       _python_prefix="/usr" \
-       _python_exec_prefix="/usr"
-
-PKG_USE_MIPS16:=0
-# This is required in addition to PKG_USE_MIPS16:=0 because otherwise MIPS16
-# flags are inherited from the Python base package (via sysconfig module)
-ifdef CONFIG_USE_MIPS16
-  TARGET_CFLAGS += -mno-mips16 -mno-interlink-mips16
-endif
-
-PYTHON_KEEP_EGGINFO ?= 0
-
-define PyPackage
-
-  define Package/$(1)-src
-    $(call Package/$(1))
-    TITLE+= (sources)
-    DEPENDS:=$$$$(foreach dep,$$$$(filter +python-%,$$$$(DEPENDS)),$$$$(dep)-src)
-  endef
-
-  define Package/$(1)-src/description
-    $(call Package/$(1)/description).
-    (Contains the Python sources for this package).
-  endef
-
-  # Add default PyPackage filespec none defined
-  ifndef PyPackage/$(1)/filespec
-    define PyPackage/$(1)/filespec
-      +|$(PYTHON_PKG_DIR)
-    endef
-  endif
-
-  ifndef PyPackage/$(1)/install
-    define PyPackage/$(1)/install
-               if [ -d $(PKG_INSTALL_DIR)/usr/bin ]; then \
-                       $(INSTALL_DIR) $$(1)/usr/bin ; \
-                       $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $$(1)/usr/bin/ ; \
-               fi
-    endef
-  endif
-
-  ifndef Package/$(1)/install
-  $(call shexport,PyPackage/$(1)/filespec)
-
-  define Package/$(1)/install
-       $(call PyPackage/$(1)/install,$$(1))
-       find $(PKG_INSTALL_DIR) -name "*\.exe" | xargs rm -f
-       if [ -e files/python-package-install.sh ] ; then \
-               PYTHON_KEEP_EGGINFO="$(PYTHON_KEEP_EGGINFO)" \
-               $(SHELL) files/python-package-install.sh \
-                       "$(PKG_INSTALL_DIR)" "$$(1)" \
-                       "$(HOST_PYTHON_BIN)" "$$(2)" \
-                       "$$$$$$$$$$(call shvar,PyPackage/$(1)/filespec)" ; \
-       elif [ -e $(STAGING_DIR)/mk/python-package-install.sh ] ; then \
-               PYTHON_KEEP_EGGINFO="$(PYTHON_KEEP_EGGINFO)" \
-               $(SHELL) $(STAGING_DIR)/mk/python-package-install.sh \
-                       "$(PKG_INSTALL_DIR)" "$$(1)" \
-                       "$(HOST_PYTHON_BIN)" "$$(2)" \
-                       "$$$$$$$$$$(call shvar,PyPackage/$(1)/filespec)" ; \
-       else \
-               echo "No 'python-package-install.sh' script found" ; \
-               exit 1 ; \
-       fi
-  endef
-
-  define Package/$(1)-src/install
-       $$(call Package/$(1)/install,$$(1),sources)
-  endef
-  endif # Package/$(1)/install
-endef
-
-$(call include_mk, python-host.mk)
-
-# $(1) => commands to execute before running pythons script
-# $(2) => python script and its arguments
-# $(3) => additional variables
-define Build/Compile/HostPyRunTarget
-       $(call HostPython, \
-               $(if $(1),$(1);) \
-               CC="$(TARGET_CC)" \
-               CCSHARED="$(TARGET_CC) $(FPIC)" \
-               CXX="$(TARGET_CXX)" \
-               LD="$(TARGET_CC)" \
-               LDSHARED="$(TARGET_CC) -shared" \
-               CFLAGS="$(TARGET_CFLAGS)" \
-               CPPFLAGS="$(TARGET_CPPFLAGS) -I$(PYTHON_INC_DIR)" \
-               LDFLAGS="$(TARGET_LDFLAGS) -lpython$(PYTHON_VERSION)" \
-               _PYTHON_HOST_PLATFORM=linux2 \
-               __PYVENV_LAUNCHER__="/usr/bin/$(PYTHON)" \
-               $(3) \
-               , \
-               $(2) \
-       )
-endef
-
-# $(1) => build subdir
-# $(2) => additional arguments to setup.py
-# $(3) => additional variables
-define Build/Compile/PyMod
-       $(INSTALL_DIR) $(PKG_INSTALL_DIR)/$(PYTHON_PKG_DIR)
-       $(call Build/Compile/HostPyRunTarget, \
-               cd $(PKG_BUILD_DIR)/$(strip $(1)), \
-               ./setup.py $(2), \
-               $(3))
-       find $(PKG_INSTALL_DIR) -name "*\.exe" | xargs rm -f
-endef
-
-define PyBuild/Compile/Default
-       $(foreach pkg,$(HOST_PYTHON_PACKAGE_BUILD_DEPENDS),
-               $(call host_python_pip_install_host,$(pkg))
-       )
-       $(call Build/Compile/PyMod,, \
-               install --prefix="/usr" --root="$(PKG_INSTALL_DIR)" \
-               --single-version-externally-managed \
-       )
-endef
-
-PyBuild/Compile=$(PyBuild/Compile/Default)
-
-ifeq ($(BUILD_VARIANT),python)
-define Build/Compile
-       $(call PyBuild/Compile)
-endef
-endif # python
diff --git a/lang/python/python/files/python-version.mk b/lang/python/python/files/python-version.mk
deleted file mode 100644 (file)
index 200461d..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#
-# Copyright (C) 2016 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-
-PYTHON_VERSION:=2.7
-PYTHON_VERSION_MICRO:=14
-
-PYTHON_SETUPTOOLS_VERSION:=28.8.0
-PYTHON_PIP_VERSION:=9.0.1
-
diff --git a/lang/python/python/patches/012-add-support-source-date-epoch-pyc.patch b/lang/python/python/patches/012-add-support-source-date-epoch-pyc.patch
new file mode 100644 (file)
index 0000000..6f33bed
--- /dev/null
@@ -0,0 +1,10 @@
+--- a/Lib/py_compile.py
++++ b/Lib/py_compile.py
+@@ -108,6 +108,7 @@ def compile(file, cfile=None, dfile=None, doraise=False):
+             timestamp = long(os.fstat(f.fileno()).st_mtime)
+         except AttributeError:
+             timestamp = long(os.stat(file).st_mtime)
++        timestamp = long(os.getenv('SOURCE_DATE_EPOCH', timestamp))
+         codestring = f.read()
+     try:
+         codeobject = __builtin__.compile(codestring, dfile or file,'exec')
diff --git a/lang/python/python/patches/013-getbuildinfo-date-time-source-date-epoch.patch b/lang/python/python/patches/013-getbuildinfo-date-time-source-date-epoch.patch
new file mode 100644 (file)
index 0000000..de7605d
--- /dev/null
@@ -0,0 +1,28 @@
+--- a/Makefile.pre.in
++++ b/Makefile.pre.in
+@@ -625,6 +625,16 @@ regen-all: regen-opcode-targets regen-gr
+ ############################################################################
+ # Special rules for object files
++DATE_FMT = %b %d %Y
++TIME_FMT = %H:%M:%S
++ifdef SOURCE_DATE_EPOCH
++      BUILD_DATE ?= $(shell date -u -d "@$(SOURCE_DATE_EPOCH)" "+$(DATE_FMT)"  2>/dev/null || date -u -r "$(SOURCE_DATE_EPOCH)" "+$(DATE_FMT)" 2>/dev/null || date -u "+$(DATE_FMT)")
++      BUILD_TIME ?= $(shell date -u -d "@$(SOURCE_DATE_EPOCH)" "+$(TIME_FMT)"  2>/dev/null || date -u -r "$(SOURCE_DATE_EPOCH)" "+$(TIME_FMT)" 2>/dev/null || date -u "+$(TIME_FMT)")
++else
++      BUILD_DATE ?= $(shell date "+$(DATE_FMT)")
++      BUILD_TIME ?= $(shell date "+$(TIME_FMT)")
++endif
++
+ Modules/getbuildinfo.o: $(PARSER_OBJS) \
+               $(OBJECT_OBJS) \
+               $(PYTHON_OBJS) \
+@@ -633,6 +643,8 @@ Modules/getbuildinfo.o: $(PARSER_OBJS) \
+               $(MODOBJS) \
+               $(srcdir)/Modules/getbuildinfo.c
+       $(CC) -c $(PY_CFLAGS) \
++            -DDATE="\"$(BUILD_DATE)\"" \
++            -DTIME="\"$(BUILD_TIME)\"" \
+             -DGITVERSION="\"`LC_ALL=C $(GITVERSION)`\"" \
+             -DGITTAG="\"`LC_ALL=C $(GITTAG)`\"" \
+             -DGITBRANCH="\"`LC_ALL=C $(GITBRANCH)`\"" \
index 8436c3a7914702c1184c0f52e593fd4a011c2114..f35913cbcbd4c4860cfb520f2001b890c5f713cf 100644 (file)
@@ -21,7 +21,7 @@ PKG_BUILD_DIR:=$(BUILD_DIR)/bottle-$(PKG_VERSION)
 PKG_UNPACK=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python3-package.mk)
+include ../python3-package.mk
 
 define Package/python3-bottle
        SECTION:=lang
diff --git a/lang/python/python3-host.mk b/lang/python/python3-host.mk
new file mode 100644 (file)
index 0000000..2a418d5
--- /dev/null
@@ -0,0 +1,97 @@
+#
+# Copyright (C) 2017 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+# Note: include this after `include $(TOPDIR)/rules.mk in your package Makefile
+#       if `python3-package.mk` is included, this will already be included
+
+ifneq ($(__python3_host_mk_inc),1)
+__python3_host_mk_inc=1
+
+# For PYTHON3_VERSION
+python3_mk_path:=$(dir $(lastword $(MAKEFILE_LIST)))
+include $(python3_mk_path)python3-version.mk
+
+HOST_PYTHON3_DIR:=$(STAGING_DIR_HOSTPKG)
+HOST_PYTHON3_INC_DIR:=$(HOST_PYTHON3_DIR)/include/python$(PYTHON3_VERSION)
+HOST_PYTHON3_LIB_DIR:=$(HOST_PYTHON3_DIR)/lib/python$(PYTHON3_VERSION)
+
+HOST_PYTHON3_PKG_DIR:=$(HOST_PYTHON3_DIR)/lib/python$(PYTHON3_VERSION)/site-packages
+
+HOST_PYTHON3_BIN:=$(HOST_PYTHON3_DIR)/bin/python$(PYTHON3_VERSION)
+
+HOST_PYTHON3PATH:=$(HOST_PYTHON3_LIB_DIR):$(HOST_PYTHON3_PKG_DIR)
+
+define HostPython3
+       if [ "$(strip $(3))" == "HOST" ]; then \
+               export PYTHONPATH="$(HOST_PYTHON3PATH)"; \
+               export PYTHONDONTWRITEBYTECODE=0; \
+       else \
+               export PYTHONPATH="$(PYTHON3PATH)"; \
+               export PYTHONDONTWRITEBYTECODE=1; \
+               export _python_sysroot="$(STAGING_DIR)"; \
+               export _python_prefix="/usr"; \
+               export _python_exec_prefix="/usr"; \
+       fi; \
+       export PYTHONOPTIMIZE=""; \
+       $(1) \
+       $(HOST_PYTHON3_BIN) $(2);
+endef
+
+define host_python3_settings
+       ARCH="$(HOST_ARCH)" \
+       CC="$(HOSTCC)" \
+       CCSHARED="$(HOSTCC) $(HOST_FPIC)" \
+       CXX="$(HOSTCXX)" \
+       LD="$(HOSTCC)" \
+       LDSHARED="$(HOSTCC) -shared" \
+       CFLAGS="$(HOST_CFLAGS)" \
+       CPPFLAGS="$(HOST_CPPFLAGS) -I$(HOST_PYTHON3_INC_DIR)" \
+       LDFLAGS="$(HOST_LDFLAGS) -lpython$(PYTHON3_VERSION) -Wl$(comma)-rpath=$(STAGING_DIR_HOSTPKG)/lib" \
+       _PYTHON_HOST_PLATFORM=linux2
+endef
+
+# $(1) => commands to execute before running pythons script
+# $(2) => python script and its arguments
+# $(3) => additional variables
+define Build/Compile/HostPy3RunHost
+       $(call HostPython3, \
+               $(if $(1),$(1);) \
+               $(call host_python3_settings) \
+               $(3) \
+               , \
+               $(2) \
+               , \
+               HOST \
+       )
+endef
+
+# Note: I shamelessly copied this from Yousong's logic (from python-packages);
+HOST_PYTHON3_PIP:=$(STAGING_DIR_HOSTPKG)/bin/pip$(PYTHON3_VERSION)
+define host_python3_pip_install
+       $(call host_python3_settings) \
+       $(HOST_PYTHON3_PIP) install \
+               --root=$(1) \
+               --prefix=$(2) \
+               --ignore-installed \
+               $(3)
+endef
+
+define host_python3_pip_install_host
+$(call host_python3_pip_install,$(STAGING_DIR_HOSTPKG),"",$(1))
+endef
+
+# $(1) => build subdir
+# $(2) => additional arguments to setup.py
+# $(3) => additional variables
+define Build/Compile/HostPy3Mod
+       $(call Build/Compile/HostPy3RunHost, \
+               cd $(HOST_BUILD_DIR)/$(strip $(1)), \
+               ./setup.py $(2), \
+               $(3))
+endef
+
+endif # __python3_host_mk_inc
diff --git a/lang/python/python3-package.mk b/lang/python/python3-package.mk
new file mode 100644 (file)
index 0000000..9e473b5
--- /dev/null
@@ -0,0 +1,138 @@
+#
+# Copyright (C) 2007-2016 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+# Note: include this after `include $(TOPDIR)/rules.mk in your package Makefile
+python3_mk_path:=$(dir $(lastword $(MAKEFILE_LIST)))
+include $(python3_mk_path)python3-host.mk
+
+PYTHON3_DIR:=$(STAGING_DIR)/usr
+PYTHON3_BIN_DIR:=$(PYTHON3_DIR)/bin
+PYTHON3_INC_DIR:=$(PYTHON3_DIR)/include/python$(PYTHON3_VERSION)
+PYTHON3_LIB_DIR:=$(PYTHON3_DIR)/lib/python$(PYTHON3_VERSION)
+
+PYTHON3_PKG_DIR:=/usr/lib/python$(PYTHON3_VERSION)/site-packages
+
+PYTHON3:=python$(PYTHON3_VERSION)
+
+PYTHON3PATH:=$(PYTHON3_LIB_DIR):$(STAGING_DIR)/$(PYTHON3_PKG_DIR):$(PKG_INSTALL_DIR)/$(PYTHON3_PKG_DIR)
+
+# These configure args are needed in detection of path to Python header files
+# using autotools.
+CONFIGURE_ARGS += \
+       _python_sysroot="$(STAGING_DIR)" \
+       _python_prefix="/usr" \
+       _python_exec_prefix="/usr"
+
+PKG_USE_MIPS16:=0
+# This is required in addition to PKG_USE_MIPS16:=0 because otherwise MIPS16
+# flags are inherited from the Python base package (via sysconfig module)
+ifdef CONFIG_USE_MIPS16
+  TARGET_CFLAGS += -mno-mips16 -mno-interlink-mips16
+endif
+
+define Py3Package
+
+  define Package/$(1)-src
+    $(call Package/$(1))
+    DEPENDS:=
+    TITLE+= (sources)
+  endef
+
+  define Package/$(1)-src/description
+    $(call Package/$(1)/description).
+    (Contains the Python3 sources for this package).
+  endef
+
+  # Add default PyPackage filespec none defined
+  ifndef Py3Package/$(1)/filespec
+    define Py3Package/$(1)/filespec
+      +|$(PYTHON3_PKG_DIR)
+    endef
+  endif
+
+  ifndef Py3Package/$(1)/install
+    define Py3Package/$(1)/install
+               if [ -d $(PKG_INSTALL_DIR)/usr/bin ]; then \
+                       $(INSTALL_DIR) $$(1)/usr/bin ; \
+                       $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $$(1)/usr/bin/ ; \
+               fi
+    endef
+  endif
+
+  ifndef Package/$(1)/install
+  $(call shexport,Py3Package/$(1)/filespec)
+
+  define Package/$(1)/install
+       $(call Py3Package/$(1)/install,$$(1))
+       find $(PKG_INSTALL_DIR) -name "*\.exe" | xargs rm -f
+       $(SHELL) $(python3_mk_path)python-package-install.sh "3" \
+               "$(PKG_INSTALL_DIR)" "$$(1)" \
+               "$(HOST_PYTHON3_BIN)" "$$(2)" \
+               "$$$$$$$$$$(call shvar,Py3Package/$(1)/filespec)"
+  endef
+
+  define Package/$(1)-src/install
+       $$(call Package/$(1)/install,$$(1),sources)
+  endef
+  endif # Package/$(1)/install
+endef
+
+# $(1) => commands to execute before running pythons script
+# $(2) => python script and its arguments
+# $(3) => additional variables
+define Build/Compile/HostPy3RunTarget
+       $(call HostPython3, \
+               $(if $(1),$(1);) \
+               CC="$(TARGET_CC)" \
+               CCSHARED="$(TARGET_CC) $(FPIC)" \
+               CXX="$(TARGET_CXX)" \
+               LD="$(TARGET_CC)" \
+               LDSHARED="$(TARGET_CC) -shared" \
+               CFLAGS="$(TARGET_CFLAGS)" \
+               CPPFLAGS="$(TARGET_CPPFLAGS) -I$(PYTHON3_INC_DIR)" \
+               LDFLAGS="$(TARGET_LDFLAGS) -lpython$(PYTHON3_VERSION)" \
+               _PYTHON_HOST_PLATFORM=linux2 \
+               __PYVENV_LAUNCHER__="/usr/bin/$(PYTHON3)" \
+               $(3) \
+               , \
+               $(2) \
+       )
+endef
+
+# $(1) => build subdir
+# $(2) => additional arguments to setup.py
+# $(3) => additional variables
+define Build/Compile/Py3Mod
+       $(INSTALL_DIR) $(PKG_INSTALL_DIR)/$(PYTHON3_PKG_DIR)
+       $(call Build/Compile/HostPy3RunTarget, \
+               cd $(PKG_BUILD_DIR)/$(strip $(1)), \
+               ./setup.py $(2), \
+               $(3))
+       find $(PKG_INSTALL_DIR) -name "*\.exe" | xargs rm -f
+endef
+
+PYTHON3_PKG_SETUP_ARGS:=--single-version-externally-managed
+PYTHON3_PKG_SETUP_VARS:=
+
+define Py3Build/Compile/Default
+       $(foreach pkg,$(HOST_PYTHON3_PACKAGE_BUILD_DEPENDS),
+               $(call host_python3_pip_install_host,$(pkg))
+       )
+       $(call Build/Compile/Py3Mod,, \
+               install --prefix="/usr" --root="$(PKG_INSTALL_DIR)" \
+               $(PYTHON3_PKG_SETUP_ARGS), \
+               $(PYTHON3_PKG_SETUP_VARS) \
+       )
+endef
+
+Py3Build/Compile=$(Py3Build/Compile/Default)
+
+ifeq ($(BUILD_VARIANT),python3)
+define Build/Compile
+       $(call Py3Build/Compile)
+endef
+endif # python3
diff --git a/lang/python/python3-version.mk b/lang/python/python3-version.mk
new file mode 100644 (file)
index 0000000..e42eeb8
--- /dev/null
@@ -0,0 +1,17 @@
+#
+# Copyright (C) 2007-2016 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+# Note: keep in sync with setuptools & pip
+PYTHON3_VERSION_MAJOR:=3
+PYTHON3_VERSION_MINOR:=6
+PYTHON3_VERSION_MICRO:=4
+
+PYTHON3_VERSION:=$(PYTHON3_VERSION_MAJOR).$(PYTHON3_VERSION_MINOR)
+
+PYTHON3_SETUPTOOLS_VERSION:=28.8.0
+PYTHON3_PIP_VERSION:=9.0.1
+
index 924fec58f050338ffd95eed9c0ee6187a04b6c61..cd97378ce535f28448e5b8714ef90f17929f9c5c 100644 (file)
@@ -8,29 +8,27 @@
 include $(TOPDIR)/rules.mk
 
 # The file included below defines PYTHON_VERSION
-include ./files/python3-version.mk
+include ../python3-version.mk
 
 PYTHON_VERSION:=$(PYTHON3_VERSION)
 PYTHON_VERSION_MICRO:=$(PYTHON3_VERSION_MICRO)
 
 PKG_NAME:=python3
-# XXX: reset PKG_RELEASE to 1 only if Python's pip & setuptools versions have also bumped;
-#      otherwise, keep bumping PKG_RELEASE
-PKG_RELEASE:=11
+PKG_RELEASE:=5
 PKG_VERSION:=$(PYTHON_VERSION).$(PYTHON_VERSION_MICRO)
 
 PKG_SOURCE:=Python-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=https://www.python.org/ftp/python/$(PKG_VERSION)
-PKG_HASH:=cda7d967c9a4bfa52337cdf551bcc5cff026b6ac50a8834e568ce4a794ca81da
+PKG_HASH:=159b932bf56aeaa76fd66e7420522d8c8853d486b8567c459b84fe2ed13bcaba
 
 PKG_LICENSE:=PSF
 PKG_LICENSE_FILES:=LICENSE Modules/_ctypes/libffi_msvc/LICENSE Modules/_ctypes/darwin/LICENSE Modules/_ctypes/libffi/LICENSE Modules/_ctypes/libffi_osx/LICENSE Tools/pybench/LICENSE
 
 # This file provides the necsessary host build variables
-include ./files/python3-host.mk
+include ../python3-host.mk
 
 # For Py3Package
-include ./files/python3-package.mk
+include ../python3-package.mk
 
 PKG_FIXUP:=autoreconf
 PKG_INSTALL:=1
@@ -45,7 +43,7 @@ PKG_CONFIG_DEPENDS:= \
        CONFIG_PYTHON3_BLUETOOTH_SUPPORT
 
 PKG_BUILD_DEPENDS:=python3/host
-HOST_BUILD_DEPENDS:=bzip2/host expat/host libffi/host
+HOST_BUILD_DEPENDS:=bzip2/host expat/host libffi/host zlib/host
 
 include $(INCLUDE_DIR)/host-build.mk
 include $(INCLUDE_DIR)/package.mk
@@ -196,16 +194,6 @@ define Build/Compile
        $(call Build/Compile/python3-pip)
 endef
 
-define Build/InstallMkFiles
-       $(INSTALL_DIR) $(STAGING_DIR)/mk/
-       $(INSTALL_DATA) \
-               ./files/python3-package.mk \
-               ./files/python3-host.mk \
-               ./files/python3-version.mk \
-               ./files/python3-package-install.sh \
-               $(STAGING_DIR)/mk/
-endef
-
 define Build/InstallDev
        $(INSTALL_DIR) $(1)/usr/include/ $(1)/usr/lib/
        $(INSTALL_DIR) $(1)/usr/lib/python$(PYTHON_VERSION)/
@@ -219,7 +207,6 @@ define Build/InstallDev
        $(CP) \
                $(PKG_INSTALL_DIR)/usr/lib/python$(PYTHON_VERSION)/config-$(PYTHON_VERSION) \
                $(1)/usr/lib/python$(PYTHON_VERSION)/
-       $(call Build/InstallMkFiles)
 endef
 
 PYTHON3_BASE_LIB_FILES:= \
@@ -297,7 +284,6 @@ define Host/Compile
 endef
 
 define Host/Install
-       $(call Build/InstallMkFiles)
        $(MAKE) -C $(HOST_BUILD_DIR) install
        $(INSTALL_DIR) $(HOST_PYTHON3_DIR)/bin/
        $(INSTALL_BIN) $(HOST_BUILD_DIR)/Parser/pgen $(HOST_PYTHON3_DIR)/bin/pgen3
@@ -321,4 +307,3 @@ $(eval $(call BuildPackage,python3))
 
 $(eval $(call BuildPackage,python3-base-src))
 $(eval $(call BuildPackage,python3-light-src))
-$(eval $(call BuildPackage,python3-src))
diff --git a/lang/python/python3/files/python3-host.mk b/lang/python/python3/files/python3-host.mk
deleted file mode 100644 (file)
index 4990d33..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-#
-# Copyright (C) 2017 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-
-ifneq ($(__python3_host_mk_inc),1)
-__python3_host_mk_inc=1
-
-# For PYTHON3_VERSION
-$(call include_mk, python3-version.mk)
-
-HOST_PYTHON3_DIR:=$(STAGING_DIR_HOSTPKG)
-HOST_PYTHON3_INC_DIR:=$(HOST_PYTHON3_DIR)/include/python$(PYTHON3_VERSION)
-HOST_PYTHON3_LIB_DIR:=$(HOST_PYTHON3_DIR)/lib/python$(PYTHON3_VERSION)
-
-HOST_PYTHON3_PKG_DIR:=$(HOST_PYTHON3_DIR)/lib/python$(PYTHON3_VERSION)/site-packages
-
-HOST_PYTHON3_BIN:=$(HOST_PYTHON3_DIR)/bin/python$(PYTHON3_VERSION)
-
-HOST_PYTHON3PATH:=$(HOST_PYTHON3_LIB_DIR):$(HOST_PYTHON3_PKG_DIR)
-
-define HostPython3
-       if [ "$(strip $(3))" == "HOST" ]; then \
-               export PYTHONPATH="$(HOST_PYTHON3PATH)"; \
-               export PYTHONDONTWRITEBYTECODE=0; \
-       else \
-               export PYTHONPATH="$(PYTHON3PATH)"; \
-               export PYTHONDONTWRITEBYTECODE=1; \
-               export _python_sysroot="$(STAGING_DIR)"; \
-               export _python_prefix="/usr"; \
-               export _python_exec_prefix="/usr"; \
-       fi; \
-       export PYTHONOPTIMIZE=""; \
-       $(1) \
-       $(HOST_PYTHON3_BIN) $(2);
-endef
-
-define host_python3_settings
-       ARCH="$(HOST_ARCH)" \
-       CC="$(HOSTCC)" \
-       CCSHARED="$(HOSTCC) $(HOST_FPIC)" \
-       CXX="$(HOSTCXX)" \
-       LD="$(HOSTCC)" \
-       LDSHARED="$(HOSTCC) -shared" \
-       CFLAGS="$(HOST_CFLAGS)" \
-       CPPFLAGS="$(HOST_CPPFLAGS) -I$(HOST_PYTHON3_INC_DIR)" \
-       LDFLAGS="$(HOST_LDFLAGS) -lpython$(PYTHON3_VERSION) -Wl$(comma)-rpath=$(STAGING_DIR_HOSTPKG)/lib" \
-       _PYTHON_HOST_PLATFORM=linux2
-endef
-
-# $(1) => commands to execute before running pythons script
-# $(2) => python script and its arguments
-# $(3) => additional variables
-define Build/Compile/HostPy3RunHost
-       $(call HostPython3, \
-               $(if $(1),$(1);) \
-               $(call host_python3_settings) \
-               $(3) \
-               , \
-               $(2) \
-               , \
-               HOST \
-       )
-endef
-
-# Note: I shamelessly copied this from Yousong's logic (from python-packages);
-HOST_PYTHON3_PIP:=$(STAGING_DIR_HOSTPKG)/bin/pip$(PYTHON3_VERSION)
-define host_python3_pip_install
-       $(call host_python3_settings) \
-       $(HOST_PYTHON3_PIP) install \
-               --root=$(1) \
-               --prefix=$(2) \
-               --ignore-installed \
-               $(3)
-endef
-
-define host_python3_pip_install_host
-$(call host_python3_pip_install,$(STAGING_DIR_HOSTPKG),"",$(1))
-endef
-
-# $(1) => build subdir
-# $(2) => additional arguments to setup.py
-# $(3) => additional variables
-define Build/Compile/HostPy3Mod
-       $(call Build/Compile/HostPy3RunHost, \
-               cd $(HOST_BUILD_DIR)/$(strip $(1)), \
-               ./setup.py $(2), \
-               $(3))
-endef
-
-endif # __python3_host_mk_inc
diff --git a/lang/python/python3/files/python3-package-install.sh b/lang/python/python3/files/python3-package-install.sh
deleted file mode 100644 (file)
index 0b68dd2..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/bin/sh
-set -e
-
-process_filespec() {
-       local src_dir="$1"
-       local dst_dir="$2"
-       local filespec="$3"
-       echo "$filespec" | (
-       IFS='|'
-       while read fop fspec fperm; do
-               local fop=`echo "$fop" | tr -d ' \t\n'`
-               if [ "$fop" = "+" ]; then
-                       if [ ! -e "${src_dir}${fspec}" ]; then
-                               echo "File not found '${src_dir}${fspec}'"
-                               exit 1
-                       fi
-                       dpath=`dirname "$fspec"`
-                       if [ -z "$fperm" ]; then
-                               dperm=`stat -c "%a" ${src_dir}${dpath}`
-                       fi
-                       mkdir -p -m$dperm ${dst_dir}${dpath}
-                       echo "copying: '$fspec'"
-                       cp -fpR ${src_dir}${fspec} ${dst_dir}${dpath}/
-                       if [ -n "$fperm" ]; then
-                               chmod -R $fperm ${dst_dir}${fspec}
-                       fi
-               elif [ "$fop" = "-" ]; then
-                       echo "removing: '$fspec'"
-                       rm -fR ${dst_dir}${fspec}
-               elif [ "$fop" = "=" ]; then
-                       echo "setting permissions: '$fperm' on '$fspec'"
-                       chmod -R $fperm ${dst_dir}${fspec}
-               fi
-       done
-       )
-}
-
-src_dir="$1"
-dst_dir="$2"
-python="$3"
-mode="$4"
-filespec="$5"
-
-process_filespec "$src_dir" "$dst_dir" "$filespec" || {
-       echo "process filespec error-ed"
-       exit 1
-}
-
-# delete egg-info directories
-[ "$PYTHON3_KEEP_EGGINFO" == "1" ] || \
-       find "$dst_dir" -name "*.egg-info" | xargs rm -rf
-
-if [ "$mode" == "sources" ] ; then
-       # Copy only python source files
-       find $dst_dir -not -type d -not -name "*\.py" | xargs rm -f
-
-       # Delete empty folders (if the case)
-       if [ -d "$dst_dir/usr" ] ; then
-               find $dst_dir/usr -type d | xargs rmdir --ignore-fail-on-non-empty
-               rmdir --ignore-fail-on-non-empty $dst_dir/usr
-       fi
-       exit 0
-fi
-
-# XXX [So that you won't goof as I did]
-# Note: Yes, I tried to use the -O & -OO flags here.
-#       However the generated byte-codes were not portable.
-#       So, we just stuck to un-optimized byte-codes,
-#       which is still way better/faster than running
-#       Python sources all the time.
-$python -m compileall -b -d '/' $dst_dir || {
-       echo "python -m compileall err-ed"
-       exit 1
-}
-
-# Delete source files and pyc [ un-optimized bytecode files ]
-# We may want to make this optimization thing configurable later, but not sure atm
-find $dst_dir -type f -name "*\.py" | xargs rm -f
-
-# Delete empty folders (if the case)
-if [ -d "$dst_dir/usr" ] ; then
-       find $dst_dir/usr -type d | xargs rmdir --ignore-fail-on-non-empty
-       rmdir --ignore-fail-on-non-empty $dst_dir/usr
-fi
-
-exit 0
diff --git a/lang/python/python3/files/python3-package.mk b/lang/python/python3/files/python3-package.mk
deleted file mode 100644 (file)
index 1d42b6d..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-#
-# Copyright (C) 2007-2016 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-
-$(call include_mk, python3-version.mk)
-
-PYTHON3_DIR:=$(STAGING_DIR)/usr
-PYTHON3_BIN_DIR:=$(PYTHON3_DIR)/bin
-PYTHON3_INC_DIR:=$(PYTHON3_DIR)/include/python$(PYTHON3_VERSION)
-PYTHON3_LIB_DIR:=$(PYTHON3_DIR)/lib/python$(PYTHON3_VERSION)
-
-PYTHON3_PKG_DIR:=/usr/lib/python$(PYTHON3_VERSION)/site-packages
-
-PYTHON3:=python$(PYTHON3_VERSION)
-
-PYTHON3PATH:=$(PYTHON3_LIB_DIR):$(STAGING_DIR)/$(PYTHON3_PKG_DIR):$(PKG_INSTALL_DIR)/$(PYTHON3_PKG_DIR)
-
-# These configure args are needed in detection of path to Python header files
-# using autotools.
-CONFIGURE_ARGS += \
-       _python_sysroot="$(STAGING_DIR)" \
-       _python_prefix="/usr" \
-       _python_exec_prefix="/usr"
-
-PKG_USE_MIPS16:=0
-# This is required in addition to PKG_USE_MIPS16:=0 because otherwise MIPS16
-# flags are inherited from the Python base package (via sysconfig module)
-ifdef CONFIG_USE_MIPS16
-  TARGET_CFLAGS += -mno-mips16 -mno-interlink-mips16
-endif
-
-PYTHON3_KEEP_EGGINFO ?= 0
-
-define Py3Package
-
-  define Package/$(1)-src
-    $(call Package/$(1))
-    TITLE+= (sources)
-    DEPENDS:=$$$$(foreach dep,$$$$(filter +python3-%,$$$$(DEPENDS)),$$$$(dep)-src)
-  endef
-
-  define Package/$(1)-src/description
-    $(call Package/$(1)/description).
-    (Contains the Python3 sources for this package).
-  endef
-
-  # Add default PyPackage filespec none defined
-  ifndef Py3Package/$(1)/filespec
-    define Py3Package/$(1)/filespec
-      +|$(PYTHON3_PKG_DIR)
-    endef
-  endif
-
-  ifndef Py3Package/$(1)/install
-    define Py3Package/$(1)/install
-               if [ -d $(PKG_INSTALL_DIR)/usr/bin ]; then \
-                       $(INSTALL_DIR) $$(1)/usr/bin ; \
-                       $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $$(1)/usr/bin/ ; \
-               fi
-    endef
-  endif
-
-  ifndef Package/$(1)/install
-  $(call shexport,Py3Package/$(1)/filespec)
-
-  define Package/$(1)/install
-       $(call Py3Package/$(1)/install,$$(1))
-       find $(PKG_INSTALL_DIR) -name "*\.exe" | xargs rm -f
-       if [ -e files/python3-package-install.sh ] ; then \
-               PYTHON3_KEEP_EGGINFO="$(PYTHON3_KEEP_EGGINFO)" \
-               $(SHELL) files/python3-package-install.sh \
-                       "$(PKG_INSTALL_DIR)" "$$(1)" \
-                       "$(HOST_PYTHON3_BIN)" "$$(2)" \
-                       "$$$$$$$$$$(call shvar,Py3Package/$(1)/filespec)" ; \
-       elif [ -e $(STAGING_DIR)/mk/python3-package-install.sh ] ; then \
-               PYTHON3_KEEP_EGGINFO="$(PYTHON3_KEEP_EGGINFO)" \
-               $(SHELL) $(STAGING_DIR)/mk/python3-package-install.sh \
-                       "$(PKG_INSTALL_DIR)" "$$(1)" \
-                       "$(HOST_PYTHON3_BIN)" "$$(2)" \
-                       "$$$$$$$$$$(call shvar,Py3Package/$(1)/filespec)" ; \
-       else \
-               echo "No 'python3-package-install.sh' script found" ; \
-               exit 1 ; \
-       fi
-  endef
-
-  define Package/$(1)-src/install
-       $$(call Package/$(1)/install,$$(1),sources)
-  endef
-  endif # Package/$(1)/install
-endef
-
-$(call include_mk, python3-host.mk)
-
-# $(1) => commands to execute before running pythons script
-# $(2) => python script and its arguments
-# $(3) => additional variables
-define Build/Compile/HostPy3RunTarget
-       $(call HostPython3, \
-               $(if $(1),$(1);) \
-               CC="$(TARGET_CC)" \
-               CCSHARED="$(TARGET_CC) $(FPIC)" \
-               CXX="$(TARGET_CXX)" \
-               LD="$(TARGET_CC)" \
-               LDSHARED="$(TARGET_CC) -shared" \
-               CFLAGS="$(TARGET_CFLAGS)" \
-               CPPFLAGS="$(TARGET_CPPFLAGS) -I$(PYTHON3_INC_DIR)" \
-               LDFLAGS="$(TARGET_LDFLAGS) -lpython$(PYTHON3_VERSION)" \
-               _PYTHON_HOST_PLATFORM=linux2 \
-               __PYVENV_LAUNCHER__="/usr/bin/$(PYTHON3)" \
-               $(3) \
-               , \
-               $(2) \
-       )
-endef
-
-# $(1) => build subdir
-# $(2) => additional arguments to setup.py
-# $(3) => additional variables
-define Build/Compile/Py3Mod
-       $(INSTALL_DIR) $(PKG_INSTALL_DIR)/$(PYTHON3_PKG_DIR)
-       $(call Build/Compile/HostPy3RunTarget, \
-               cd $(PKG_BUILD_DIR)/$(strip $(1)), \
-               ./setup.py $(2), \
-               $(3))
-       find $(PKG_INSTALL_DIR) -name "*\.exe" | xargs rm -f
-endef
-
-define Py3Build/Compile/Default
-       $(foreach pkg,$(HOST_PYTHON3_PACKAGE_BUILD_DEPENDS),
-               $(call host_python3_pip_install_host,$(pkg))
-       )
-       $(call Build/Compile/Py3Mod,, \
-               install --prefix="/usr" --root="$(PKG_INSTALL_DIR)" \
-               --single-version-externally-managed \
-       )
-endef
-
-Py3Build/Compile=$(Py3Build/Compile/Default)
-
-ifeq ($(BUILD_VARIANT),python3)
-define Build/Compile
-       $(call Py3Build/Compile)
-endef
-endif # python3
diff --git a/lang/python/python3/files/python3-version.mk b/lang/python/python3/files/python3-version.mk
deleted file mode 100644 (file)
index 2990892..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Copyright (C) 2007-2016 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-
-# Note: keep in sync with setuptools & pip
-PYTHON3_VERSION_MAJOR:=3
-PYTHON3_VERSION_MINOR:=6
-PYTHON3_VERSION_MICRO:=3
-
-PYTHON3_VERSION:=$(PYTHON3_VERSION_MAJOR).$(PYTHON3_VERSION_MINOR)
-
-PYTHON3_SETUPTOOLS_VERSION:=28.8.0
-PYTHON3_PIP_VERSION:=9.0.1
-
index 14d98cebe797f343f66ea2f614d364ee84b8cca2..1a2a68ebfeb2c83c0e29068bce14c91d7f8dd83b 100644 (file)
@@ -9,7 +9,7 @@ Subject: [PATCH] enable zlib
 
 --- a/Modules/Setup.dist
 +++ b/Modules/Setup.dist
-@@ -362,7 +362,7 @@ _symtable symtablemodule.c
+@@ -363,7 +363,7 @@ _symtable symtablemodule.c
  # Andrew Kuchling's zlib module.
  # This require zlib 1.1.3 (or later).
  # See http://www.gzip.org/zlib/
index 7e7b252200f9373b64d25b5257556b379bd420d8..5993859808179e7d78369445fc90fc52901907ad 100644 (file)
@@ -1,44 +1,18 @@
 --- a/Makefile.pre.in
 +++ b/Makefile.pre.in
-@@ -1307,41 +1307,6 @@ libinstall:     build_all $(srcdir)/Modules/
+@@ -1341,6 +1341,7 @@ libinstall:      build_all $(srcdir)/Modules/
        $(INSTALL_DATA) `cat pybuilddir.txt`/_sysconfigdata_$(ABIFLAGS)_$(MACHDEP)_$(MULTIARCH).py \
                $(DESTDIR)$(LIBDEST); \
        $(INSTALL_DATA) $(srcdir)/LICENSE $(DESTDIR)$(LIBDEST)/LICENSE.txt
--      if test -d $(DESTDIR)$(LIBDEST)/distutils/tests; then \
--              $(INSTALL_DATA) $(srcdir)/Modules/xxmodule.c \
--                      $(DESTDIR)$(LIBDEST)/distutils/tests ; \
--      fi
--      -PYTHONPATH=$(DESTDIR)$(LIBDEST)  $(RUNSHARED) \
--              $(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
--              -d $(LIBDEST) -f \
--              -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
--              $(DESTDIR)$(LIBDEST)
--      -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
--              $(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
--              -d $(LIBDEST) -f \
--              -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
--              $(DESTDIR)$(LIBDEST)
--      -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
--              $(PYTHON_FOR_BUILD) -Wi -OO $(DESTDIR)$(LIBDEST)/compileall.py \
--              -d $(LIBDEST) -f \
--              -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
--              $(DESTDIR)$(LIBDEST)
--      -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
--              $(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
--              -d $(LIBDEST)/site-packages -f \
--              -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
--      -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
--              $(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
--              -d $(LIBDEST)/site-packages -f \
--              -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
--      -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
--              $(PYTHON_FOR_BUILD) -Wi -OO $(DESTDIR)$(LIBDEST)/compileall.py \
--              -d $(LIBDEST)/site-packages -f \
--              -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
--      -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
--              $(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/Grammar.txt
--      -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
--              $(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/PatternGrammar.txt
++ifeq (@COMPILE_ALL_TESTS@,yes)
+       if test -d $(DESTDIR)$(LIBDEST)/distutils/tests; then \
+               $(INSTALL_DATA) $(srcdir)/Modules/xxmodule.c \
+                       $(DESTDIR)$(LIBDEST)/distutils/tests ; \
+@@ -1376,6 +1377,7 @@ libinstall:      build_all $(srcdir)/Modules/
+               $(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/Grammar.txt
+       -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
+               $(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/PatternGrammar.txt
++endif
  
  python-config: $(srcdir)/Misc/python-config.in Misc/python-config.sh
        # Substitution happens here, as the completely-expanded BINDIR
index 903e35d8e884f5fc1d67a40b3f464f58331eedbb..cad73edc805e3cc719ce1fd62238261c021be29e 100644 (file)
@@ -1,6 +1,6 @@
 --- a/setup.py
 +++ b/setup.py
-@@ -487,16 +487,9 @@ class PyBuildExt(build_ext):
+@@ -512,16 +512,9 @@ class PyBuildExt(build_ext):
              return ['m']
  
      def detect_modules(self):
index e593a1b719fc398956a9774efcd9357bcc6be24b..3211f73861997e69bc2cf2c693f1eca84f2f0cf7 100644 (file)
@@ -1,6 +1,6 @@
 --- a/setup.py
 +++ b/setup.py
-@@ -497,8 +497,9 @@ class PyBuildExt(build_ext):
+@@ -522,8 +522,9 @@ class PyBuildExt(build_ext):
          # directly since an inconsistently reproducible issue comes up where
          # the environment variable is not set even though the value were passed
          # into configure and stored in the Makefile (issue found on OS X 10.3).
diff --git a/lang/python/python3/patches/011-fix-ncursesw-definition-colisions.patch b/lang/python/python3/patches/011-fix-ncursesw-definition-colisions.patch
deleted file mode 100644 (file)
index 1597f4a..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
---- a/Modules/_cursesmodule.c
-+++ b/Modules/_cursesmodule.c
-@@ -116,7 +116,6 @@ char *PyCursesVersion = "2.2";
-     #defines many common symbols (such as "lines") which breaks the
-     curses module in other ways.  So the code will just specify
-     explicit prototypes here. */
--extern int setupterm(char *,int,int *);
- #ifdef __sgi
- #include <term.h>
- #endif
diff --git a/lang/python/python3/patches/012-add-support-source-date-epoch-pyc.patch b/lang/python/python3/patches/012-add-support-source-date-epoch-pyc.patch
new file mode 100644 (file)
index 0000000..4c2c2f7
--- /dev/null
@@ -0,0 +1,13 @@
+--- a/Lib/py_compile.py
++++ b/Lib/py_compile.py
+@@ -137,8 +137,9 @@ def compile(file, cfile=None, dfile=None
+     except FileExistsError:
+         pass
+     source_stats = loader.path_stats(file)
++    mtime = int(os.getenv('SOURCE_DATE_EPOCH', source_stats['mtime']))
+     bytecode = importlib._bootstrap_external._code_to_bytecode(
+-            code, source_stats['mtime'], source_stats['size'])
++            code, mtime, source_stats['size'])
+     mode = importlib._bootstrap_external._calc_mode(file)
+     importlib._bootstrap_external._write_atomic(cfile, bytecode, mode)
+     return cfile
diff --git a/lang/python/python3/patches/013-getbuildinfo-date-time-source-date-epoch.patch b/lang/python/python3/patches/013-getbuildinfo-date-time-source-date-epoch.patch
new file mode 100644 (file)
index 0000000..340e302
--- /dev/null
@@ -0,0 +1,28 @@
+--- a/Makefile.pre.in
++++ b/Makefile.pre.in
+@@ -725,6 +725,16 @@ regen-all: regen-opcode regen-opcode-tar
+ ############################################################################
+ # Special rules for object files
++DATE_FMT = %b %d %Y
++TIME_FMT = %H:%M:%S
++ifdef SOURCE_DATE_EPOCH
++      BUILD_DATE ?= $(shell date -u -d "@$(SOURCE_DATE_EPOCH)" "+$(DATE_FMT)"  2>/dev/null || date -u -r "$(SOURCE_DATE_EPOCH)" "+$(DATE_FMT)" 2>/dev/null || date -u "+$(DATE_FMT)")
++      BUILD_TIME ?= $(shell date -u -d "@$(SOURCE_DATE_EPOCH)" "+$(TIME_FMT)"  2>/dev/null || date -u -r "$(SOURCE_DATE_EPOCH)" "+$(TIME_FMT)" 2>/dev/null || date -u "+$(TIME_FMT)")
++else
++      BUILD_DATE ?= $(shell date "+$(DATE_FMT)")
++      BUILD_TIME ?= $(shell date "+$(TIME_FMT)")
++endif
++
+ Modules/getbuildinfo.o: $(PARSER_OBJS) \
+               $(OBJECT_OBJS) \
+               $(PYTHON_OBJS) \
+@@ -732,6 +742,8 @@ Modules/getbuildinfo.o: $(PARSER_OBJS) \
+               $(MODOBJS) \
+               $(srcdir)/Modules/getbuildinfo.c
+       $(CC) -c $(PY_CORE_CFLAGS) \
++            -DDATE="\"$(BUILD_DATE)\"" \
++            -DTIME="\"$(BUILD_TIME)\"" \
+             -DGITVERSION="\"`LC_ALL=C $(GITVERSION)`\"" \
+             -DGITTAG="\"`LC_ALL=C $(GITTAG)`\"" \
+             -DGITBRANCH="\"`LC_ALL=C $(GITBRANCH)`\"" \
index a49641c8d84e3da5347e4b49b5c0dc38d2a4b246..09a48af690d74c9670ef352e754b00a9ea520921 100644 (file)
@@ -1,6 +1,6 @@
 --- a/setup.py
 +++ b/setup.py
-@@ -308,6 +308,7 @@ class PyBuildExt(build_ext):
+@@ -333,6 +333,7 @@ class PyBuildExt(build_ext):
              print("Failed to build these modules:")
              print_three_column(failed)
              print()
index cca6e1ed77272da8d7a739603239029f6b494a2c..0345dd975162a42aa152e06b19e92c89b5c570b9 100644 (file)
@@ -20,7 +20,7 @@
          abi=sys.abiflags,
 --- a/Makefile.pre.in
 +++ b/Makefile.pre.in
-@@ -1304,7 +1304,7 @@ libinstall:      build_all $(srcdir)/Modules/
+@@ -1338,7 +1338,7 @@ libinstall:      build_all $(srcdir)/Modules/
                        esac; \
                done; \
        done
@@ -28,8 +28,8 @@
 +      $(INSTALL_DATA) `cat pybuilddir.txt`/_sysconfigdata*.py \
                $(DESTDIR)$(LIBDEST); \
        $(INSTALL_DATA) $(srcdir)/LICENSE $(DESTDIR)$(LIBDEST)/LICENSE.txt
-@@ -1404,7 +1404,7 @@ sharedinstall: sharedmods
+ ifeq (@COMPILE_ALL_TESTS@,yes)
+@@ -1475,7 +1475,7 @@ sharedinstall: sharedmods
                --install-scripts=$(BINDIR) \
                --install-platlib=$(DESTSHARED) \
                --root=$(DESTDIR)/
index 7a4a4a7fed2c57aca5c754a34263901626e681ae..4d9c3fd40f796e074eda69b740de6c6b3af177df 100644 (file)
@@ -15,10 +15,9 @@ PKG_LICENSE:=MIT
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).zip
 PKG_SOURCE_URL:=https://pypi.python.org/packages/a4/09/c47e57fc9c7062b4e83b075d418800d322caa87ec0ac21e6308bd3a2d519/
 PKG_HASH:=f5c056e8f62d45ba8215e5cb8f50dfccb198b4b9fbea8500674f3443e4689589
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/pytz
   SUBMENU:=Python
index fb5db23924d5c1a0277ab527e6df58a6e95ebd90..804b585764a267bbba7ef6b15871b911383fa21b 100644 (file)
@@ -18,10 +18,9 @@ PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
 PKG_SOURCE_VERSION:=4764e3bc47ca8d44be3198892e73c51d8a0a9970
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
 PKG_MIRROR_HASH:=a52728cc5653bf3c2a2f92954c6001338442a6e589bd364c497ba615c4365211
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/rcssmin
     SUBMENU:=Python
index 2d993d360d6e6aa5e8d4f33db984fa07db2682fb..aa4c662129fcffb278f8b35137262e358a4a7fd8 100644 (file)
@@ -15,10 +15,9 @@ PKG_LICENSE:=MIT
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://pypi.python.org/packages/08/48/c97b668d6da7d7bebe7ea1817a6f76394b0ec959cb04214ca833c34359df/
 PKG_HASH:=01a22d49ddd9a168b136f26cac87d9a335660ce07aa5c630b8e3607d6f4325e7
-PKG_BUILD_DEPENDS:=python python-setuptools
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
 define Package/simplejson
   SUBMENU:=Python
index f55381e4d1c114863e34f2615d1e679c01fc0afa..36c1a779df935d8bc0a568df435de4fe29717680 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2006-2011, 2015-2016 OpenWrt.org
+# Copyright (C) 2006-2011, 2015-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,51 +8,57 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=twisted
-PKG_VERSION:=16.4.1
+PKG_VERSION:=17.9.0
 PKG_RELEASE:=1
 
 PKG_SOURCE:=Twisted-$(PKG_VERSION).tar.bz2
-PKG_SOURCE_URL:=https://pypi.python.org/packages/6b/23/8dbe86fc83215015e221fbd861a545c6ec5c9e9cd7514af114d1f64084ab \
-               http://twistedmatrix.com/Releases/Twisted/16.4
-PKG_HASH:=1d8d73f006c990744effb35588359fd44d43608649ac0b6b7edc71176e88e816
+PKG_SOURCE_URL:=https://files.pythonhosted.org/packages/source/T/Twisted
+PKG_HASH:=0da1a7e35d5fcae37bc9c7978970b5feb3bc82822155b8654ec63925c05af75c
 
-PKG_BUILD_DIR:=$(BUILD_DIR)/Twisted-$(PKG_VERSION)
-PKG_BUILD_DEPENDS:=python python-setuptools USE_MUSL:librpc
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-twisted-$(PKG_VERSION)
+PKG_BUILD_DEPENDS:=USE_MUSL:librpc
 
 PKG_LICENSE:=MIT
 PKG_LICENSE_FILES:=LICENSE
 PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../python-package.mk
 
-define Package/twisted
+PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xjf $(DL_DIR)/$(PKG_SOURCE)
+
+define Package/twisted/Default
   SUBMENU:=Python
   SECTION:=lang
   CATEGORY:=Languages
-  TITLE:=Python networking engine
   URL:=http://twistedmatrix.com/
-  DEPENDS:=+python-light +zope-interface
+endef
+
+define Package/twisted
+$(call Package/twisted/Default)
+  TITLE:=Python networking engine
+  DEPENDS:= \
+      +PACKAGE_twisted:python-light \
+      +PACKAGE_twisted:python-automat \
+      +PACKAGE_twisted:python-constantly \
+      +PACKAGE_twisted:python-incremental \
+      +PACKAGE_twisted:python-hyperlink \
+      +PACKAGE_twisted:python-zope-interface
+  VARIANT:=python
 endef
 
 define Package/twisted/description
- Twisted is a networking engine written in Python, supporting numerous
- protocols. It contains a web server, numerous chat clients, chat servers,
- mail servers, and more.
+Twisted is a networking engine written in Python, supporting numerous
+protocols. It contains a web server, numerous chat clients, chat servers,
+mail servers, and more.
 endef
 
 define PyPackage/twisted/filespec
 +|/usr/bin
--|/usr/bin/tkconch
 +|$(PYTHON_PKG_DIR)
 -|$(PYTHON_PKG_DIR)/twisted/conch/scripts/tkconch.py
 endef
 
-define Build/Compile
-       $(call Build/Compile/PyMod,, \
-               install --prefix="/usr" --root="$(PKG_INSTALL_DIR)" --no-compile, \
-       )
-endef
-
 $(eval $(call PyPackage,twisted))
 $(eval $(call BuildPackage,twisted))
+$(eval $(call BuildPackage,twisted-src))
diff --git a/lang/python/twisted/patches/001-fix-zsh-completion.patch b/lang/python/twisted/patches/001-fix-zsh-completion.patch
deleted file mode 100644 (file)
index 6cb85c6..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-diff --git a/twisted/python/twisted-completion.zsh b/twisted/python/twisted-completion.zsh
-index 4d97aa5..9a8d4d8 100644
---- a/twisted/python/twisted-completion.zsh
-+++ b/twisted/python/twisted-completion.zsh
-@@ -1,4 +1,4 @@
--#compdef twistd trial conch cftp ckeygen pyhtmlizer tkconch
-+#compdef twistd trial conch cftp ckeygen pyhtmlizer
- #
- # This is the ZSH completion file for Twisted commands. It calls the current
- # command-line with the special "--_shell-completion" option which is handled
diff --git a/lang/python/twisted/patches/001-omit-tkconch-patch b/lang/python/twisted/patches/001-omit-tkconch-patch
new file mode 100644 (file)
index 0000000..05ad4c8
--- /dev/null
@@ -0,0 +1,22 @@
+diff --git a/src/twisted/python/_setup.py b/src/twisted/python/_setup.py
+index 3b5f69d4b..c69c5d13c 100644
+--- a/src/twisted/python/_setup.py
++++ b/src/twisted/python/_setup.py
+@@ -142,7 +142,6 @@ _CONSOLE_SCRIPTS = [
+     "cftp = twisted.conch.scripts.cftp:run",
+     "conch = twisted.conch.scripts.conch:run",
+     "pyhtmlizer = twisted.scripts.htmlizer:run",
+-    "tkconch = twisted.conch.scripts.tkconch:run",
+     "trial = twisted.scripts.trial:run",
+     "twist = twisted.application.twist._twist:Twist.main",
+     "twistd = twisted.scripts.twistd:run",
+diff --git a/src/twisted/python/twisted-completion.zsh b/src/twisted/python/twisted-completion.zsh
+index 4d97aa5d3..9a8d4d82e 100644
+--- a/src/twisted/python/twisted-completion.zsh
++++ b/src/twisted/python/twisted-completion.zsh
+@@ -1,4 +1,4 @@
+-#compdef twistd trial conch cftp ckeygen pyhtmlizer tkconch
++#compdef twistd trial conch cftp ckeygen pyhtmlizer
+ #
+ # This is the ZSH completion file for Twisted commands. It calls the current
+ # command-line with the special "--_shell-completion" option which is handled
index 8d545bfd6d09145ee90d156122fda351eb8052c5..46496201076b8f6dd60ede76092425d1514b6c1c 100644 (file)
@@ -1,41 +1,33 @@
-diff --git a/setup.py b/setup.py
-index e21ef70..a4d9ee8 100755
---- a/setup.py
-+++ b/setup.py
-@@ -55,13 +55,14 @@ def main(args):
-     setup_args = STATIC_PACKAGE_METADATA.copy()
+diff --git a/src/twisted/python/_setup.py b/src/twisted/python/_setup.py
+index 3b5f69d4b..2dca47aa5 100644
+--- a/src/twisted/python/_setup.py
++++ b/src/twisted/python/_setup.py
+@@ -175,11 +175,6 @@ class ConditionalExtension(Extension, object):
  
-     setup_args.update(dict(
--        packages=setuptools.find_packages(),
-+        packages=setuptools.find_packages(exclude=["*.test", "*.test.*"]),
+ # The C extensions used for Twisted.
+ _EXTENSIONS = [
+-    ConditionalExtension(
+-        "twisted.test.raiser",
+-        sources=["src/twisted/test/raiser.c"],
+-        condition=lambda _: _isCPython),
+-
+     ConditionalExtension(
+         "twisted.internet.iocpreactor.iocpsupport",
+         sources=[
+@@ -232,7 +227,7 @@ def getSetupArgs(extensions=_EXTENSIONS):
+     requirements.append("hyperlink >= 17.1.1")
+     arguments.update(dict(
+-        packages=find_packages("src"),
++        packages=find_packages("src", exclude=["*.test", "*.test.*"]),
+         use_incremental=True,
+         setup_requires=["incremental >= 16.10.1"],
          install_requires=requirements,
-         conditionalExtensions=getExtensions(),
-         entry_points={
-             'console_scripts':  getConsoleScripts()
+@@ -241,6 +236,7 @@ def getSetupArgs(extensions=_EXTENSIONS):
          },
+         cmdclass=command_classes,
          include_package_data=True,
 +        exclude_package_data={'':['test/*']},
          zip_safe=False,
          extras_require=_EXTRAS_REQUIRE,
-     ))
-diff --git a/twisted/python/dist.py b/twisted/python/dist.py
-index dfff9dc..a05b716 100644
---- a/twisted/python/dist.py
-+++ b/twisted/python/dist.py
-@@ -191,11 +191,11 @@ def getExtensions():
-     Get the C extensions used for Twisted.
-     """
-     extensions = [
--        ConditionalExtension(
--            "twisted.test.raiser",
--            ["twisted/test/raiser.c"],
--            condition=lambda _: _isCPython
--        ),
-+        #ConditionalExtension(
-+        #    "twisted.test.raiser",
-+        #    ["twisted/test/raiser.c"],
-+        #    condition=lambda _: _isCPython
-+        #),
-         ConditionalExtension(
-             "twisted.internet.iocpreactor.iocpsupport",
-             ["twisted/internet/iocpreactor/iocpsupport/iocpsupport.c",
+         package_dir={"": "src"},
diff --git a/lang/python/zope-interface/Makefile b/lang/python/zope-interface/Makefile
deleted file mode 100644 (file)
index abfd0e0..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# Copyright (C) 2006-2011, 2015-2016 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-
-include $(TOPDIR)/rules.mk
-
-PKG_NAME:=zope.interface
-PKG_VERSION:=4.3.2
-PKG_RELEASE:=1
-
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
-PKG_SOURCE_URL:=https://pypi.python.org/packages/38/1b/d55c39f2cf442bd9fb2c59760ed058c84b57d25c680819c25f3aff741e1f
-PKG_HASH:=6a0e224a052e3ce27b3a7b1300a24747513f7a507217fcc2a4cb02eb92945cee
-
-PKG_BUILD_DEPENDS:=python python-setuptools
-
-PKG_LICENSE:=ZPL-2.1
-PKG_LICENSE_FILES:=LICENSE.txt
-PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
-
-include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
-
-define Package/zope-interface
-  SECTION:=lang
-  CATEGORY:=Languages
-  SUBMENU:=Python
-  TITLE:=Zope interface
-  URL:=https://github.com/zopefoundation/zope.interface
-  DEPENDS:=+python-light
-endef
-
-define Package/zope-interface/description
-This package provides an implementation of "object interfaces" for
-Python. Interfaces are a mechanism for labeling objects as conforming to
-a given API or contract. So, this package can be considered as
-implementation of the Design By Contract methodology support in Python.
-endef
-
-define PyPackage/zope-interface/filespec
-+|$(PYTHON_PKG_DIR)
--|$(PYTHON_PKG_DIR)/zope/interface/common/tests
--|$(PYTHON_PKG_DIR)/zope/interface/tests
-endef
-
-define Build/Compile
-       $(call Build/Compile/PyMod,, \
-               install --prefix="/usr" --root="$(PKG_INSTALL_DIR)" --no-compile, \
-       )
-endef
-
-$(eval $(call PyPackage,zope-interface))
-$(eval $(call BuildPackage,zope-interface))
index 471127d6ca1a2d20be6071ab4a50436d90f1abeb..b00aaf1a2abd3bba41c3cbc78e09f182a643a111 100644 (file)
@@ -1,6 +1,6 @@
 #
 # Copyright (C) 2006-2016 OpenWrt.org
-# Copyright (C) 2017 Luiz Angelo Daros de Luca <luizluca@gmail.com>
+# Copyright (C) 2017-2018 Luiz Angelo Daros de Luca <luizluca@gmail.com>
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -11,7 +11,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=ruby
-PKG_VERSION:=2.4.2
+PKG_VERSION:=2.5.0
 PKG_RELEASE:=1
 
 # First two numbes
@@ -19,7 +19,7 @@ PKG_ABI_VERSION:=$(subst $(space),.,$(wordlist 1, 2, $(subst .,$(space),$(PKG_VE
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=https://cache.ruby-lang.org/pub/ruby/$(PKG_ABI_VERSION)/
-PKG_HASH:=748a8980d30141bd1a4124e11745bb105b436fb1890826e0d2b9ea31af27f735
+PKG_HASH:=1da0afed833a0dab94075221a615c14487b05d0c407f991c8080d576d985b49b
 PKG_MAINTAINER:=Luiz Angelo Daros de Luca <luizluca@gmail.com>
 PKG_LICENSE:=BSD-2-Clause
 PKG_LICENSE_FILES:=COPYING
@@ -213,14 +213,20 @@ define Package/ruby-cgi/files
 /usr/lib/ruby/$(PKG_ABI_VERSION)/*/cgi/escape.so
 endef
 
+define Package/ruby-cmath/files
+/usr/lib/ruby/$(PKG_ABI_VERSION)/cmath.rb
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/default/cmath-*.gemspec
+endef
+
 define Package/ruby-csv/files
 /usr/lib/ruby/$(PKG_ABI_VERSION)/csv.rb
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/default/csv-*.gemspec
 endef
 
-define Package/ruby-datetime/files
-/usr/lib/ruby/$(PKG_ABI_VERSION)/time.rb
+define Package/ruby-date/files
 /usr/lib/ruby/$(PKG_ABI_VERSION)/date.rb
 /usr/lib/ruby/$(PKG_ABI_VERSION)/*/date_core.so
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/default/date-*.gemspec
 endef
 
 define Package/ruby-dbm/description
@@ -230,6 +236,7 @@ define Package/ruby-dbm/description
 endef
 define Package/ruby-dbm/files
 /usr/lib/ruby/$(PKG_ABI_VERSION)/*/dbm.so
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/default/dbm-*.gemspec
 endef
 
 define Package/ruby-debuglib/files
@@ -251,6 +258,8 @@ define Package/ruby-did-you-mean/files-excluded
 /usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/did_you_mean-*/evaluation
 /usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/did_you_mean-*/test
 /usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/did_you_mean-*/*.md
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/did_you_mean-*/*.txt
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/did_you_mean-*/.travis.yml
 endef
 
 define Package/ruby-digest/description
@@ -302,10 +311,21 @@ define Package/ruby-erb/files
 /usr/lib/ruby/$(PKG_ABI_VERSION)/erb.rb
 endef
 
+define Package/ruby-etc/files
+/usr/lib/ruby/$(PKG_ABI_VERSION)/*/etc.so
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/default/etc-*.gemspec
+endef
+
+define Package/ruby-fcntl/files
+/usr/lib/ruby/$(PKG_ABI_VERSION)/*/fcntl.so
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/default/fcntl-*.gemspec
+endef
+
 define Package/ruby-fiddle/files
 /usr/lib/ruby/$(PKG_ABI_VERSION)/fiddle.rb
 /usr/lib/ruby/$(PKG_ABI_VERSION)/fiddle/
 /usr/lib/ruby/$(PKG_ABI_VERSION)/*/fiddle.so
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/default/fiddle-*.gemspec
 endef
 
 define Package/ruby-filelib/files
@@ -314,15 +334,19 @@ define Package/ruby-filelib/files
 /usr/lib/ruby/$(PKG_ABI_VERSION)/pathname.rb
 /usr/lib/ruby/$(PKG_ABI_VERSION)/*/pathname.so
 /usr/lib/ruby/$(PKG_ABI_VERSION)/find.rb
+endef
+
+define Package/ruby-fileutils/files
 /usr/lib/ruby/$(PKG_ABI_VERSION)/fileutils.rb
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/default/fileutils-*.gemspec
 endef
 
 define Package/ruby-gdbm/files
 /usr/lib/ruby/$(PKG_ABI_VERSION)/*/gdbm.so
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/default/gdbm-*.gemspec
 endef
 
 define Package/ruby-gems/files
-/usr/lib/ruby/$(PKG_ABI_VERSION)/ubygems.rb
 /usr/lib/ruby/$(PKG_ABI_VERSION)/rubygems.rb
 /usr/lib/ruby/$(PKG_ABI_VERSION)/rubygems
 endef
@@ -343,12 +367,18 @@ define Package/ruby-gems/install
        $(call RubyBuildPackage/install,gems,$(1))
 endef
 
+
 define Package/ruby-io-console/files
 /usr/lib/ruby/$(PKG_ABI_VERSION)/*/io/console.so
 /usr/lib/ruby/$(PKG_ABI_VERSION)/io/console/
 /usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/default/io-console-*.gemspec
 endef
 
+define Package/ruby-ipaddr/files
+/usr/lib/ruby/$(PKG_ABI_VERSION)/ipaddr.rb
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/default/ipaddr-*.gemspec
+endef
+
 define Package/ruby-irb/files
 /usr/lib/ruby/$(PKG_ABI_VERSION)/irb
 /usr/lib/ruby/$(PKG_ABI_VERSION)/irb.rb
@@ -377,9 +407,6 @@ endef
 
 define Package/ruby-math/files
 /usr/lib/ruby/$(PKG_ABI_VERSION)/prime.rb
-/usr/lib/ruby/$(PKG_ABI_VERSION)/mathn.rb
-/usr/lib/ruby/$(PKG_ABI_VERSION)/cmath.rb
-/usr/lib/ruby/$(PKG_ABI_VERSION)/*/mathn
 /usr/lib/ruby/$(PKG_ABI_VERSION)/matrix.rb
 /usr/lib/ruby/$(PKG_ABI_VERSION)/matrix
 endef
@@ -404,7 +431,6 @@ define Package/ruby-misc/files
 /usr/lib/ruby/$(PKG_ABI_VERSION)/getoptlong.rb
 /usr/lib/ruby/$(PKG_ABI_VERSION)/open3.rb
 /usr/lib/ruby/$(PKG_ABI_VERSION)/ostruct.rb
-/usr/lib/ruby/$(PKG_ABI_VERSION)/scanf.rb
 /usr/lib/ruby/$(PKG_ABI_VERSION)/securerandom.rb
 /usr/lib/ruby/$(PKG_ABI_VERSION)/set.rb
 /usr/lib/ruby/$(PKG_ABI_VERSION)/shellwords.rb
@@ -412,12 +438,8 @@ define Package/ruby-misc/files
 /usr/lib/ruby/$(PKG_ABI_VERSION)/weakref.rb
 /usr/lib/ruby/$(PKG_ABI_VERSION)/*/continuation.so
 /usr/lib/ruby/$(PKG_ABI_VERSION)/*/coverage.so
-/usr/lib/ruby/$(PKG_ABI_VERSION)/*/etc.so
-/usr/lib/ruby/$(PKG_ABI_VERSION)/*/fcntl.so
 /usr/lib/ruby/$(PKG_ABI_VERSION)/*/fiber.so
 /usr/lib/ruby/$(PKG_ABI_VERSION)/*/pty.so
-/usr/lib/ruby/$(PKG_ABI_VERSION)/*/stringio.so
-/usr/lib/ruby/$(PKG_ABI_VERSION)/*/strscan.so
 endef
 
 define Package/ruby-mkmf/files
@@ -447,6 +469,7 @@ endef
 define Package/ruby-net-telnet/files-excluded
 /usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/net-telnet-*/*.md
 /usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/net-telnet-*/*.txt
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/net-telnet-*/.travis.yml
 endef
 
 define Package/ruby-nkf/files
@@ -479,7 +502,8 @@ define Package/ruby-powerassert/files
 /usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/power_assert-*
 endef
 define Package/ruby-powerassert/files-excluded
-/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/power_assert-*/test
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/power_assert-*/*.rdoc
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/power_assert-*/.travis.yml
 endef
 
 define Package/ruby-prettyprint/files
@@ -519,20 +543,19 @@ endef
 
 define Package/ruby-rbconfig/files
 /usr/lib/ruby/$(PKG_ABI_VERSION)/*/rbconfig.rb
-/usr/lib/ruby/$(PKG_ABI_VERSION)/rbconfig/*
 /usr/lib/ruby/$(PKG_ABI_VERSION)/*/rbconfig/*.so
 endef
 
 define Package/ruby-rdoc/files
-       /usr/lib/ruby/$(PKG_ABI_VERSION)/rdoc.rb
-       /usr/lib/ruby/$(PKG_ABI_VERSION)/rdoc
-       /usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/rdoc-*
-       /usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/default/rdoc-*.gemspec
+/usr/lib/ruby/$(PKG_ABI_VERSION)/rdoc.rb
+/usr/lib/ruby/$(PKG_ABI_VERSION)/rdoc
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/rdoc-*
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/default/rdoc-*.gemspec
 endef
 define Package/ruby-rdoc/files-excluded
-       /usr/lib/ruby/$(PKG_ABI_VERSION)/rdoc/test_case.rb
-       /usr/lib/ruby/$(PKG_ABI_VERSION)/rdoc/markup/formatter_test_case.rb
-       /usr/lib/ruby/$(PKG_ABI_VERSION)/rdoc/markup/text_formatter_test_case.rb
+/usr/lib/ruby/$(PKG_ABI_VERSION)/rdoc/test_case.rb
+/usr/lib/ruby/$(PKG_ABI_VERSION)/rdoc/markup/formatter_test_case.rb
+/usr/lib/ruby/$(PKG_ABI_VERSION)/rdoc/markup/text_formatter_test_case.rb
 endef
 define Package/ruby-rdoc/install
        $(INSTALL_DIR) $(1)/usr/bin
@@ -564,8 +587,14 @@ define Package/ruby-rss/files
 /usr/lib/ruby/$(PKG_ABI_VERSION)/rss.rb
 endef
 
+define Package/ruby-scanf/files
+/usr/lib/ruby/$(PKG_ABI_VERSION)/scanf.rb
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/default/scanf-*.gemspec
+endef
+
 define Package/ruby-sdbm/files
 /usr/lib/ruby/$(PKG_ABI_VERSION)/*/sdbm.so
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/default/sdbm-*.gemspec
 endef
 
 define Package/ruby-shell/files
@@ -574,13 +603,22 @@ define Package/ruby-shell/files
 endef
 
 define Package/ruby-socket/files
-/usr/lib/ruby/$(PKG_ABI_VERSION)/ipaddr.rb
 /usr/lib/ruby/$(PKG_ABI_VERSION)/resolv-replace.rb
 /usr/lib/ruby/$(PKG_ABI_VERSION)/resolv.rb
 /usr/lib/ruby/$(PKG_ABI_VERSION)/socket.rb
 /usr/lib/ruby/$(PKG_ABI_VERSION)/*/socket.so
 endef
 
+define Package/ruby-stringio/files
+/usr/lib/ruby/$(PKG_ABI_VERSION)/*/stringio.so
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/default/stringio-*.gemspec
+endef
+
+define Package/ruby-strscan/files
+/usr/lib/ruby/$(PKG_ABI_VERSION)/*/strscan.so
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/default/strscan-*.gemspec
+endef
+
 define Package/ruby-testunit/files
 /usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/test-unit-*.gemspec
 /usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/test-unit-*
@@ -592,8 +630,11 @@ define Package/ruby-testunit/files-excluded
 /usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/test-unit-*/*.md
 endef
 
+define Package/ruby-time/files
+/usr/lib/ruby/$(PKG_ABI_VERSION)/time.rb
+endef
+
 define Package/ruby-unicodenormalize/files
-/usr/lib/ruby/$(PKG_ABI_VERSION)/unicode_normalize.rb
 /usr/lib/ruby/$(PKG_ABI_VERSION)/unicode_normalize
 endef
 
@@ -605,6 +646,7 @@ endef
 define Package/ruby-webrick/files
 /usr/lib/ruby/$(PKG_ABI_VERSION)/webrick
 /usr/lib/ruby/$(PKG_ABI_VERSION)/webrick.rb
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/default/webrick-*.gemspec
 endef
 
 define Package/ruby-xmlrpc/files
@@ -612,8 +654,9 @@ define Package/ruby-xmlrpc/files
 /usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/xmlrpc-*.gemspec
 endef
 define Package/ruby-xmlrpc/files-excluded
-/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/xmlrpc-0.2.1/*.md
-/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/xmlrpc-0.2.1/*.txt
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/xmlrpc-*/*.md
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/xmlrpc-*/*.txt
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/gems/xmlrpc-*/.travis.yml
 endef
 
 define Package/ruby-yaml/files
@@ -623,6 +666,7 @@ endef
 
 define Package/ruby-zlib/files
 /usr/lib/ruby/$(PKG_ABI_VERSION)/*/zlib.so
+/usr/lib/ruby/gems/$(PKG_ABI_VERSION)/specifications/default/zlib-*.gemspec
 endef
 
 RUBY_FILES = $(strip $(call Package/ruby-$(1)/files))
@@ -696,58 +740,67 @@ endef
 $(eval $(call BuildPackage,libruby))
 $(eval $(call BuildPackage,ruby))
 $(eval $(call RubyBuildPackage,bigdecimal,Arbitrary-precision decimal floating-point library,))
-$(eval $(call RubyBuildPackage,cgi,CGI support toolkit,+ruby-filelib +ruby-pstore))
-$(eval $(call RubyBuildPackage,csv,CSV library,+ruby-patterns +ruby-datetime +ruby-enc +ruby-misc))
-$(eval $(call RubyBuildPackage,datetime,date library))
-$(eval $(call RubyBuildPackage,dbm,support for dbm,+libdb47))
-$(eval $(call RubyBuildPackage,debuglib,debug library,+ruby-prettyprint))
+$(eval $(call RubyBuildPackage,cgi,CGI support toolkit,+ruby-filelib +ruby-pstore +ruby-stringio))
+$(eval $(call RubyBuildPackage,cmath,Trigonometric and transcendental functions for complex numbers,))
+$(eval $(call RubyBuildPackage,csv,CSV Reading and Writing,+ruby-date +ruby-enc +ruby-misc +ruby-patterns +ruby-stringio))
+$(eval $(call RubyBuildPackage,date,Comparable module for handling dates,))
+$(eval $(call RubyBuildPackage,dbm,Wrapper for the UNIX-style Database Manager Library,+libdb47))
+$(eval $(call RubyBuildPackage,debuglib,debug library,+ruby-misc +ruby-prettyprint))
 $(eval $(call RubyBuildPackage,did-you-mean,did you mean? experience,+ruby-misc))
 $(eval $(call RubyBuildPackage,digest,Digest Library,+RUBY_DIGEST_USE_OPENSSL:libopenssl))
-$(eval $(call RubyBuildPackage,drb,distributed object system,+ruby-filelib +ruby-patterns +ruby-socket))
+$(eval $(call RubyBuildPackage,drb,distributed object system,+ruby-filelib +ruby-ipaddr +ruby-patterns))
 $(eval $(call RubyBuildPackage,enc,character re-coding library charset (small subset),))
 $(eval $(call RubyBuildPackage,enc-extra,character re-coding library charset (extra subset),+ruby-enc))
-$(eval $(call RubyBuildPackage,erb,(embedded interpreter),+ruby-cgi))
-$(eval $(call RubyBuildPackage,fiddle,libffi wrapper,+libffi))
-$(eval $(call RubyBuildPackage,filelib,file utils library,+ruby-enc +ruby-misc))
-$(eval $(call RubyBuildPackage,gdbm,support for gdbm,+libgdbm))
+$(eval $(call RubyBuildPackage,erb,(embedded interpreter),+ruby-cgi +ruby-strscan))
+$(eval $(call RubyBuildPackage,etc,Access to information typically stored in UNIX /etc directory,))
+$(eval $(call RubyBuildPackage,fcntl,Loads constants defined in the OS fcntl.h C header file,))
+$(eval $(call RubyBuildPackage,fiddle,Libffi wrapper for Ruby,+libffi))
+$(eval $(call RubyBuildPackage,filelib,file utils library,+ruby-fileutils +ruby-misc))
+$(eval $(call RubyBuildPackage,fileutils,File utility methods for copying moving removing etc,+ruby-enc +ruby-etc))
+$(eval $(call RubyBuildPackage,gdbm,Ruby extension for GNU dbm,+libgdbm))
 $(eval $(call RubyBuildPackage,gems,gems packet management,+ruby-net +ruby-rdoc))
 $(eval $(call RubyBuildPackage,io-console,Console interface,))
-$(eval $(call RubyBuildPackage,irb,(interactive shell),+ruby-debuglib +ruby-filelib +ruby-math))
-$(eval $(call RubyBuildPackage,json,support for JSON,+ruby-datetime +ruby-misc))
+$(eval $(call RubyBuildPackage,ipaddr,Set of methods to manipulate an IP address,+ruby-socket))
+$(eval $(call RubyBuildPackage,irb,(interactive shell),+ruby-debuglib +ruby-filelib))
+$(eval $(call RubyBuildPackage,json,JSON Implementation for Ruby,+ruby-date +ruby-misc))
 $(eval $(call RubyBuildPackage,logger,logger and syslog library,+ruby-multithread))
 $(eval $(call RubyBuildPackage,math,math library,+ruby-patterns +ruby-misc))
 $(eval $(call RubyBuildPackage,minitest,Gem minitest,+ruby-gems))
 $(eval $(call RubyBuildPackage,misc,standard libraries subset (miscellaneous files),))
 $(eval $(call RubyBuildPackage,mkmf,makefile library,+ruby-filelib +ruby-optparse +ruby-rbconfig))
 $(eval $(call RubyBuildPackage,multithread,multithread library,+ruby-misc))
-$(eval $(call RubyBuildPackage,net,Network Protocols Library,+ruby-datetime +ruby-digest +ruby-filelib +ruby-uri))
+$(eval $(call RubyBuildPackage,net,Network Protocols Library,+ruby-time +ruby-digest +ruby-filelib +ruby-socket +ruby-stringio +ruby-strscan +ruby-uri))
 $(eval $(call RubyBuildPackage,net-telnet,telnet client,+ruby-net))
 $(eval $(call RubyBuildPackage,nkf,Network Kanji Filter,+ruby-enc))
-$(eval $(call RubyBuildPackage,openssl,support for openssl,+ruby-enc +ruby-multithread +libopenssl))
-$(eval $(call RubyBuildPackage,optparse,command-line option analysis,+ruby-misc))
+$(eval $(call RubyBuildPackage,openssl,SSL TLS and general purpose cryptography,+ruby-enc +ruby-multithread +ruby-stringio +libopenssl))
+$(eval $(call RubyBuildPackage,optparse,command-line option analysis,+ruby-misc +ruby-time))
 $(eval $(call RubyBuildPackage,patterns,design patterns implementation,))
-$(eval $(call RubyBuildPackage,powerassert,Gem power_assert,+ruby-ripper +ruby-debuglib))
-$(eval $(call RubyBuildPackage,prettyprint,PrettyPrint library,+ruby-misc))
+$(eval $(call RubyBuildPackage,powerassert,Gem power_assert,+ruby-prettyprint +ruby-ripper))
+$(eval $(call RubyBuildPackage,prettyprint,PrettyPrint library,+ruby-etc))
 $(eval $(call RubyBuildPackage,pstore,file based persistence,+ruby-digest +ruby-enc))
-$(eval $(call RubyBuildPackage,psych,YAML parser and emitter,+ruby-bigdecimal +ruby-datetime +ruby-misc +ruby-enc +libyaml))
+$(eval $(call RubyBuildPackage,psych,YAML parser and emitter,+ruby-bigdecimal +ruby-date +ruby-enc +ruby-stringio +ruby-strscan +libyaml))
 $(eval $(call RubyBuildPackage,racc,LALR parser generator,))
-$(eval $(call RubyBuildPackage,rake,Rake (make replacement),+ruby-filelib +ruby-optparse +ruby-patterns +ruby-rbconfig +ruby-multithread))
+$(eval $(call RubyBuildPackage,rake,Rake (make replacement),+ruby-fileutils +ruby-multithread +ruby-optparse +ruby-patterns +ruby-rbconfig))
 $(eval $(call RubyBuildPackage,rbconfig,RbConfig,))
-$(eval $(call RubyBuildPackage,rdoc,documentation generator,+ruby-erb +ruby-irb +ruby-json +ruby-racc +ruby-rake +ruby-yaml +ruby-zlib))
+$(eval $(call RubyBuildPackage,rdoc,RDoc produces HTML and command-line documentation for Ruby projects,+ruby-debuglib +ruby-did-you-mean +ruby-erb +ruby-json +ruby-racc +ruby-rake +ruby-ripper +ruby-yaml +ruby-zlib))
 $(eval $(call RubyBuildPackage,readline,support for readline,+libncurses +libreadline))
-$(eval $(call RubyBuildPackage,rexml,XML toolkit,+ruby-patterns +ruby-enc +ruby-misc))
+$(eval $(call RubyBuildPackage,rexml,XML toolkit,+ruby-enc +ruby-misc +ruby-patterns +ruby-stringio))
 $(eval $(call RubyBuildPackage,rinda,Linda paradigm implementation,+ruby-drb))
 $(eval $(call RubyBuildPackage,ripper,script parser,))
 $(eval $(call RubyBuildPackage,rss,RSS toolkit,+ruby-net +ruby-nkf +ruby-rexml))
+$(eval $(call RubyBuildPackage,scanf,Implementation of the C function scanf(3),))
 $(eval $(call RubyBuildPackage,sdbm,simple file-based key-value dbm implementation,))
 $(eval $(call RubyBuildPackage,shell,idiomatic Ruby interface,+ruby-patterns +ruby-multithread))
 $(eval $(call RubyBuildPackage,socket,socket support,+ruby-multithread))
+$(eval $(call RubyBuildPackage,stringio,Pseudo `IO` class from/to `String`,))
+$(eval $(call RubyBuildPackage,strscan,Lexical scanning operations on a String,))
 $(eval $(call RubyBuildPackage,testunit,Gem test-unit,+ruby-csv +ruby-erb +ruby-optparse +ruby-powerassert +ruby-rexml +ruby-yaml))
+$(eval $(call RubyBuildPackage,time,Extends Time with additional methods for parsing and converting Times,+ruby-date))
 $(eval $(call RubyBuildPackage,unicodenormalize,String additions for Unicode normalization,+ruby-enc +ruby-enc-extra))
-$(eval $(call RubyBuildPackage,uri,library to handle URI,+ruby-socket +ruby-enc))
-$(eval $(call RubyBuildPackage,webrick,Web server toolkit,+ruby-erb +ruby-net +ruby-patterns +ruby-rbconfig))
+$(eval $(call RubyBuildPackage,uri,library to handle URI,+ruby-enc))
+$(eval $(call RubyBuildPackage,webrick,HTTP server toolkit,+ruby-erb +ruby-net +ruby-patterns +ruby-rbconfig))
 $(eval $(call RubyBuildPackage,xmlrpc,XML-RPC toolkit,+ruby-rexml +ruby-webrick))
 $(eval $(call RubyBuildPackage,yaml,YAML toolkit,+ruby-dbm +ruby-pstore +ruby-psych))
-$(eval $(call RubyBuildPackage,zlib,support for zlib,+zlib))
+$(eval $(call RubyBuildPackage,zlib,compression/decompression library interface,+zlib))
 $(eval $(call BuildPackage,ruby-stdlib))
 $(eval $(call HostBuild))
diff --git a/lang/ruby/patches/010-configure-2.4.2.patch b/lang/ruby/patches/010-configure-2.4.2.patch
deleted file mode 100644 (file)
index fddd810..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-diff -pU3 a/configure b/configure
---- a/configure        2017-09-14 21:52:19.000000000 +0900
-+++ b/configure        2017-09-15 07:03:12.000000000 +0900
-@@ -10614,6 +10614,7 @@ fi
- ac_res=$ac_cv_search___gmpz_init
- if test "$ac_res" != no; then :
-   test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
-+  $as_echo "#define HAVE_LIBGMP 1" >>confdefs.h
- fi
-@@ -10683,6 +10684,7 @@ fi
- ac_res=$ac_cv_search_malloc_conf
- if test "$ac_res" != no; then :
-   test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
-+  $as_echo "#define HAVE_LIBJEMALLOC 1" >>confdefs.h
- else
-   with_jemalloc=no
-diff -pU3 a/configure.in b/configure.in
---- a/configure.in     2017-08-04 23:39:29.000000000 +0900
-+++ b/configure.in     2017-09-15 07:20:40.000000000 +0900
-@@ -1403,13 +1403,15 @@ AC_ARG_WITH([gmp],
- AS_IF([test "x$with_gmp" != xno],
-   [AC_CHECK_HEADERS(gmp.h)
-    AS_IF([test "x$ac_cv_header_gmp_h" != xno],
--     AC_SEARCH_LIBS([__gmpz_init], [gmp]))])
-+     AC_SEARCH_LIBS([__gmpz_init], [gmp],
-+       [AC_DEFINE(HAVE_LIBGMP, 1)]))])
- AC_ARG_WITH([jemalloc],
-   [AS_HELP_STRING([--with-jemalloc],[use jemalloc allocator])],
-   [with_jemalloc=$withval], [with_jemalloc=no])
- AS_IF([test "x$with_jemalloc" = xyes],[
--  AC_SEARCH_LIBS([malloc_conf], [jemalloc], [], [with_jemalloc=no])
-+  AC_SEARCH_LIBS([malloc_conf], [jemalloc],
-+    [AC_DEFINE(HAVE_LIBJEMALLOC, 1)], [with_jemalloc=no])
-   AC_CHECK_HEADER(jemalloc/jemalloc.h, [
-     AC_DEFINE(RUBY_ALTERNATIVE_MALLOC_HEADER, [<jemalloc/jemalloc.h>])
-   ])
index 15a64088d965254127c9691b98cb179791579657..d9acf37093c09f68b378865c3b804a114f11d7df 100644 (file)
@@ -25,7 +25,9 @@ require_regex_ignore=/^require ([a-zA-Z\$]|["']$|.*\/$)/
 require_ignore=%w{drb/invokemethod16 foo rubygems/defaults/operating_system win32console java Win32API
                   builder/xchar json/pure simplecov win32/sspi rdoc/markdown/literals_1_8 enumerator win32/resolv rbtree
                   nqxml/streamingparser nqxml/treeparser xmlscan/parser xmlscan/scanner xmltreebuilder xml/parser xmlparser xml/encoding-ja xmlencoding-ja
-                  iconv uconv win32ole gettext/po_parser gettext/mo libxml psych.jar psych_jars jar-dependencies thread minitest/proveit}
+                  iconv uconv win32ole gettext/po_parser gettext/mo libxml psych.jar psych_jars jar-dependencies thread minitest/proveit
+               bundler pry
+       }
 
 builtin_enc=[
        Encoding.find("ASCII-8BIT"),
index 25e5810ba3d33d8a3131e1e565c25d12e5420f0d..b76745d25bc5e97b2d9086062d69fcd3a1c7deb0 100644 (file)
@@ -5,21 +5,34 @@
 
 function list_staging_files {
        cd "$1"; find \
-               \( \( -name "root-*" -or -name "packages" -or -name "stamp" -or -name "pkginfo" -or -name "host" \) -prune \) -or -true \
+               \( \( -name "root-*" -or -name "packages" -or -name "stamp" -or -name "pkginfo" -or -name "host" -or -name man \) -prune \) -or -true \
                \( -path "*ruby*" -or -name "erb" -or -name "gem" -or -name "irb" -or -name "rake" -or -name "rdoc" -or -name "ri" -or -name "testrb" \) \
                -not -path "*/usr/include/*" -not -path "*/usr/lib/pkgconfig/*" -not -path "*/usr/lib/lib*.a" \
                -not -path "*/usr/lib/ruby/gems/*/cache/*" \
+               -not -path "*/usr/lib/libruby.so" \
+               -not -name "*test_case.rb" \
+               -not -name "*.rdoc" \
+               -not -name "*.doc" \
+               -not -name "*.md" \
+               -not -name "*.txt" \
+               -not -name "*.travis.yml" \
+               -not -regex ".*/usr/lib/ruby/gems/[^/]*/gems/[^/]*/benchmark/.*" \
+               -not -regex ".*/usr/lib/ruby/gems/[^/]*/gems/[^/]*/evaluation/.*" \
+               -not -regex ".*/usr/lib/ruby/gems/[^/]*/gems/[^/]*/sample/.*" \
+               -not -regex ".*/usr/lib/ruby/gems/[^/]*/gems/[^/]*/test/.*" \
+               -not -regex ".*/usr/lib/ruby/gems/[^/]*/gems/[^/]*/doc/.*" \
+               -not -type d \
                -print | sort
 }
 
 function list_ipkg_files {
        for OPKG; do
-        tar --to-stdout -xzf "$OPKG" ./data.tar.gz | tar tz | sed -e 's%/$%%'
-       done | sort -u
+               tar --to-stdout -xzf "$OPKG" ./data.tar.gz | tar tzv | grep -v ^d | sed -e 's,.* \./,./,;s/ -> .*//'
+       done | sort -u | grep -v ./usr/lib/ruby/ruby...-bin
 }
 
 
-echo "                          Staging                                             Packages"
+echo "                   Installed in Staging                                             Packages"
 
 : ${1:?First arg is staging_dir}
 : ${2:?Second and following args are ruby ipkg packages}
index d5c9facb8ed069c2bdf4a3f9942a74941f03a86b..ee327f5588a422b235db31f66ede1cb633a21fe4 100644 (file)
@@ -16,7 +16,7 @@ PKG_SOURCE_URL:=https://github.com/lathiat/avahi/releases/download/v$(PKG_VERSIO
 PKG_HASH:=d54991185d514a0aba54ebeb408d7575b60f5818a772e28fa0e18b98bc1db454
 PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
 
-PKG_BUILD_DEPENDS:=libexpat libdaemon libgdbm intltool/host libpthread dbus
+PKG_BUILD_DEPENDS:=intltool/host
 
 PKG_FIXUP:=autoreconf
 PKG_REMOVE_FILES:=autogen.sh
index 351d36a373f5cc0272c8648790eee32c6f105674..d9040922d592004c511dbfbab38f8c89c8114787 100644 (file)
@@ -16,15 +16,15 @@ include $(INCLUDE_DIR)/nls.mk
 include $(INCLUDE_DIR)/target.mk 
 
 PKG_NAME:=boost
-PKG_VERSION:=1.65.1
-PKG_SOURCE_VERSION:=1_65_1
-PKG_RELEASE:=2
+PKG_VERSION:=1.66.0
+PKG_SOURCE_VERSION:=1_66_0
+PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)_$(PKG_SOURCE_VERSION).tar.bz2
 PKG_SOURCE_URL:=https://sourceforge.net/projects/boost/files/boost/$(PKG_VERSION)
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)_$(PKG_SOURCE_VERSION)
 HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/$(PKG_NAME)_$(PKG_SOURCE_VERSION)
-PKG_HASH:=9807a5d16566c57fd74fb522764e0b134a8bbe6b6e8967b83afefd30dcd3be81
+PKG_HASH:=5721818253e6a0989583192f96782c4a98eb6204965316df9f5ad75819225ca9
 PKG_LICENSE:=Boost Software License <http://www.boost.org/users/license.html>
 PKG_MAINTAINER:=Carlos M. Ferreira <carlosmf.pt@gmail.com>
 
@@ -44,7 +44,7 @@ define Package/boost/Default
 endef
 
 define Package/boost/description
-This package provides the Boost v1.65.1 libraries.
+This package provides the Boost v1.66.0 libraries.
 Boost is a set of free, peer-reviewed, portable C++ source libraries.
 
 -----------------------------------------------------------------------------
@@ -82,7 +82,7 @@ This package provides the following run-time libraries:
  - regex
  - serialization and wserialization
  - signals
- - stackstrace (new in 1.65.0)
+ - stackstrace
  - system
  - thread
  - timer
@@ -90,7 +90,7 @@ This package provides the following run-time libraries:
  - wave
 
 There are many more header-only libraries supported by Boost.
-See more at http://www.boost.org/doc/libs/1_65_1/
+See more at http://www.boost.org/doc/libs/1_66_0/
 endef
 
 PKG_BUILD_DEPENDS:=boost/host PACKAGE_python:python PACKAGE_python3:python3
diff --git a/libs/boost/patches/010-fiber_fix_0506e46640989e1f919388ad36890bd6063cd43a.patch b/libs/boost/patches/010-fiber_fix_0506e46640989e1f919388ad36890bd6063cd43a.patch
deleted file mode 100644 (file)
index bcb2bad..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-Index: boost_1_65_1/libs/fiber/src/numa/linux/pin_thread.cpp
-===================================================================
---- boost_1_65_1.orig/libs/fiber/src/numa/linux/pin_thread.cpp
-+++ boost_1_65_1/libs/fiber/src/numa/linux/pin_thread.cpp
-@@ -9,6 +9,7 @@
- extern "C" {
- #include <pthread.h>
- #include <sched.h>
-+#include <string.h>
- }
- #include <system_error>
index a0ecd11adfffea78b2847c7ba00cc587e834cc0b..5378d612d1b3e16a35a610d3864907e6c74b0874 100644 (file)
@@ -14,7 +14,7 @@ PKG_RELEASE:=1
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=https://github.com/martinh/libconfuse/releases/download/v$(PKG_VERSION)
 PKG_HASH:=23c63272baf2ef4e2cbbafad2cf57de7eb81f006ec347c00b954819824add25e
-PKG_MAINTAINER:=Daniel Engberg <daniel.engberg.lists@pyret.net>
+PKG_MAINTAINER:=
 PKG_LICENSE:=ISC
 
 PKG_FIXUP:=autoreconf
index 5c75b374eb697782aa97b8713cad0d6ce76f636e..f57e02c849aa495e643c9116eb0e87c664a3a78a 100644 (file)
@@ -13,12 +13,12 @@ PKG_MAINTAINER:=Harald Geyer <harald@ccbib.org>
 
 PKG_NAME:=elektra
 PKG_LICENSE:=BSD-3-Clause
-PKG_LICENSE_FILES:=doc/COPYING
-PKG_VERSION:=0.8.19
+PKG_LICENSE_FILES:=LICENSE.md
+PKG_VERSION:=0.8.21
 PKG_RELEASE:=1
 
 # Use this for official releasees
-PKG_HASH:=cc14f09539aa95623e884f28e8be7bd67c37550d25e08288108a54fd294fd2a8
+PKG_HASH:=51892570f18d1667d0da4d0908a091e41b41c20db9835765677109a3d150cd26
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://ftp.libelektra.org/ftp/elektra/releases
 
@@ -97,10 +97,11 @@ define Package/libelektra-plugins
 endef
 
 define CONTENT_ELEKTRA_PLUGINS_TEXT
-base64 boolean cachefilter ccode conditionals csvstorage
-enum filecheck glob hexcode hidden hosts iconv keytometa
-line lineendings list mathcheck network null path profile
-shell syslog uname validation
+base64 boolean cachefilter camel ccode conditionals csvstorage
+date directoryvalue enum file filecheck glob hexcode hidden
+hosts iconv ipaddr keytometa line lineendings list mathcheck
+mini network null path profile range shell syslog uname
+validation
 endef
 
 CONTENT_ELEKTRA_PLUGINS = $(strip $(CONTENT_ELEKTRA_PLUGINS_TEXT))
@@ -158,7 +159,7 @@ endef
 define Package/libelektra-curlget
   $(call Package/libelektra/Default)
   TITLE:=Elektra curlget plugin
-  DEPENDS:=+libelektra-core +libcurl
+  DEPENDS:=+libelektra-core +libcurl +libopenssl
 endef
 
 define Package/libelektra-curlget/description
@@ -180,6 +181,21 @@ This package contains support for dbus notification on configuration
 changes.
 endef
 
+define Package/libelektra-xerces
+  $(call Package/libelektra/Default)
+  TITLE:=Elektra xerces based xml plugin
+  DEPENDS:=+libelektra-core +libstdcpp +libxerces-c
+endef
+
+define Package/libelektra-xerces/description
+$(call Package/libelektra/Default-description)
+
+The xerces plugin supplants the xmltool plugin
+and allows us to use XML files not following a specific schemata.
+Attributes are mapped to Elektra's metadata, multiple keys with the
+same names are mapped to arrays.
+endef
+
 define Package/libelektra-xml
   $(call Package/libelektra/Default)
   TITLE:=Elektra xmltool plugin
@@ -204,6 +220,19 @@ $(call Package/libelektra/Default-description)
 This package contains support for storing the key database as json files.
 endef
 
+define Package/libelektra-yamlcpp
+  $(call Package/libelektra/Default)
+  TITLE:=Elektra yaml plugin
+  DEPENDS:=+libelektra-core +libyaml-cpp
+endef
+
+define Package/libelektra-yamlcpp/description
+$(call Package/libelektra/Default-description)
+
+This package contains support for storing the key database as yaml files.
+endef
+
+
 define Package/libelektra-python2
   $(call Package/libelektra/Default)
   TITLE:=Elektra python2 plugin
@@ -247,7 +276,7 @@ define Package/libelektra-extra
 endef
 
 define CONTENT_EXTRA_PLUGINS_TEXT
-blockresolver c constants counter desktop dpkg error
+blockresolver c constants counter desktop dini dpkg error
 fcrypt fstab logchange mozprefs passwd rename required
 simplespeclang timeofday tracer
 endef
@@ -273,7 +302,7 @@ CMAKE_OPTIONS = \
        -DKDB_DEFAULT_RESOLVER=resolver_fm_pb_b \
        -DKDB_DEFAULT_STORAGE=ini \
        -DENABLE_OPTIMIZATIONS=OFF \
-       -DPLUGINS="ALL"
+       -DPLUGINS="ALL;-multifile"
 
 CMAKE_HOST_OPTIONS = \
        -DCMAKE_SKIP_RPATH=FALSE \
@@ -293,6 +322,7 @@ define Package/libelektra-core/install
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/libelektra.so* $(1)/usr/lib/
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/libelektra-core.so* $(1)/usr/lib/
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/libelektra-ease.so* $(1)/usr/lib/
+       $(CP) $(PKG_INSTALL_DIR)/usr/lib/libelektra-invoke.so* $(1)/usr/lib/
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/libelektra-kdb.so* $(1)/usr/lib/
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/libelektra-meta.so* $(1)/usr/lib/
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/libelektra-plugin.so* $(1)/usr/lib/
@@ -300,6 +330,7 @@ define Package/libelektra-core/install
        #The next is only supported with glibc, so skip it.
        #$(CP) $(PKG_INSTALL_DIR)/usr/lib/libelektraintercept-* $(1)/usr/lib/
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/libelektra-resolver_fm_pb_b.so $(1)/usr/lib/
+       $(CP) $(PKG_INSTALL_DIR)/usr/lib/libelektra-utility.so* $(1)/usr/lib/
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/libelektra-ni.so $(1)/usr/lib/
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/libelektra-ini.so $(1)/usr/lib/
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/libelektra-sync.so $(1)/usr/lib/
@@ -353,6 +384,11 @@ define Package/libelektra-dbus/install
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/libelektra-dbus.so $(1)/usr/lib/
 endef
 
+define Package/libelektra-xerces/install
+       $(INSTALL_DIR) $(1)/usr/lib/
+       $(CP) $(PKG_INSTALL_DIR)/usr/lib/libelektra-xerces.so $(1)/usr/lib/
+endef
+
 define Package/libelektra-xml/install
        $(INSTALL_DIR) $(1)/usr/lib/
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/libelektra-xmltool.so $(1)/usr/lib/
@@ -363,6 +399,11 @@ define Package/libelektra-yajl/install
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/libelektra-yajl.so $(1)/usr/lib/
 endef
 
+define Package/libelektra-yamlcpp/install
+       $(INSTALL_DIR) $(1)/usr/lib/
+       $(CP) $(PKG_INSTALL_DIR)/usr/lib/libelektra-yamlcpp.so $(1)/usr/lib/
+endef
+
 define Package/libelektra-python2/install
        $(INSTALL_DIR) $(1)/usr/lib/
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/libelektra-python2.so $(1)/usr/lib/
@@ -401,6 +442,8 @@ $(eval $(call BuildPackage,libelektra-cpp))
 $(eval $(call BuildPackage,libelektra-curlget))
 $(eval $(call BuildPackage,libelektra-crypto))
 $(eval $(call BuildPackage,libelektra-dbus))
+$(eval $(call BuildPackage,libelektra-xerces))
+$(eval $(call BuildPackage,libelektra-yamlcpp))
 $(eval $(call BuildPackage,libelektra-xml))
 $(eval $(call BuildPackage,libelektra-yajl))
 $(eval $(call BuildPackage,libelektra-python2))
index 36a540261d326edfcdcabda8b41ce51733caaa86..1c777a50cbcbc46f93b4be6c48b9dd03fc56c78f 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=freetype
-PKG_VERSION:=2.8.1
-PKG_RELEASE:=2
+PKG_VERSION:=2.9
+PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_URL:=@SF/freetype
-PKG_HASH:=e5435f02e02d2b87bb8e4efdcaa14b1f78c9cf3ab1ed80f94b6382fb6acc7d78
+PKG_HASH:=e6ffba3c8cef93f557d1f767d7bc3dee860ac7a3aaff588a521e081bc36f4c8a
 
 PKG_LICENSE:=FTL GPL-2.0 MIT ZLIB
 PKG_LICENSE_FILES:=docs/LICENSE.TXT docs/FTL.TXT docs/GPLv2.TXT src/bdf/README src/pcf/README src/gzip/zlib.h
index c203fd316b1696d36e6ea937ebfb717f814285ff..cabd69ade450860dd993b3ad98aebfd3c9849f9c 100644 (file)
@@ -8,17 +8,17 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=glib2
-PKG_VERSION:=2.55.0
+PKG_VERSION:=2.55.1
 PKG_RELEASE:=1
 
 PKG_SOURCE:=glib-$(PKG_VERSION).tar.xz
 PKG_BUILD_DIR:=$(BUILD_DIR)/glib-$(PKG_VERSION)
 PKG_SOURCE_URL:=@GNOME/glib/2.55
-PKG_HASH:=13fc009e68ca490f986f21a7d5d3a429486fb28a1f4e06298c9ac976067518f5
+PKG_HASH:=0cbb3d31c9d181bbcc97cba3d9dbe3250f75e2da25e5f7c8bf5a993fe54baf6a
 
 PKG_BUILD_PARALLEL:=1
 HOST_BUILD_PARALLEL:=1
-PKG_BUILD_DEPENDS:=glib2/host libpthread zlib libintl libffi
+PKG_BUILD_DEPENDS:=glib2/host gettext
 HOST_BUILD_DEPENDS:=gettext-full/host libiconv/host libffi/host
 PKG_INSTALL:=1
 PKG_USE_MIPS16:=0
index fd74023caba056d85c133f01952abef66eaffd5d..3c61d3df1b51096b2ecb9cc974417e5b954ce3fb 100644 (file)
@@ -10,7 +10,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libdmapsharing
-PKG_VERSION:=2.9.38
+PKG_VERSION:=2.9.39
 PKG_RELEASE:=1
 
 PKG_MAINTAINER:=W. Michael Petullo <mike@flyn.org>
@@ -20,7 +20,7 @@ PKG_LICENSE_FILES:=COPYING
 
 PKG_SOURCE:=libdmapsharing-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://www.flyn.org/projects/libdmapsharing/
-PKG_HASH:=165952dced0d0561dd7d3f2db5d40605d9ecff999ab7530db63e8a60343b0615
+PKG_HASH:=a90dc0681ae81700e46efc539f70edb6edd936b782a9a695434bea660a43a5ef
 
 PKG_FIXUP:=autoreconf
 PKG_INSTALL:=1
index 59d98bafc42d6b9335667e9bbf5a1cb33f885de9..b27435a253f5d51c7ae04bfc7c7f1cbdfd609c24 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+# Copyright (C) 2016-2018 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,7 +8,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libedit
-PKG_VERSION:=20160618-3.1
+PKG_VERSION:=20170329-3.1
 PKG_RELEASE:=1
 
 PKG_MAINTAINER:=Daniel Salzman <daniel.salzman@nic.cz>
@@ -16,7 +16,7 @@ PKG_LICENSE:=BSD-3-Clause
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://thrysoee.dk/editline/
-PKG_HASH:=b6b159c0c6ec8a7f349ea2a75d8b960efa346c462c1ac4921f1ac0de85a9f5d6
+PKG_HASH:=91f2d90fbd2a048ff6dad7131d9a39e690fd8a8fd982a353f1333dd4017dd4be
 
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
 PKG_INSTALL:=1
index 4ac03091b394f7c1949a695f54332fd44cf35987..35c3bf006145760947cb8eedf48c6d04b0c9daad 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2014-2016 OpenWrt.org
+# Copyright (C) 2014-2017 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libftdi1
-PKG_VERSION:=1.3
+PKG_VERSION:=1.4
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_URL:=http://www.intra2net.com/en/developer/libftdi/download/
-PKG_HASH:=9a8c95c94bfbcf36584a0a58a6e2003d9b133213d9202b76aec76302ffaa81f4
+PKG_HASH:=ec36fb49080f834690c24008328a5ef42d3cf584ef4060f3a35aa4681cb31b74
 PKG_MAINTAINER:=Álvaro Fernández Rojas <noltari@gmail.com>
 
 PKG_LICENSE:=LGPL-2.0
index d1894a17a9edfaf2253125a8832bc778873cbf46..6f52546f482e0f94d41ae5a214a06abe4851a167 100644 (file)
@@ -9,15 +9,15 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libgcrypt
 PKG_VERSION:=1.6.6
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
-PKG_SOURCE_URL:=ftp://ftp.gnupg.org/gcrypt/libgcrypt
+PKG_SOURCE_URL:=https://www.gnupg.org/ftp/gcrypt/libgcrypt/
 PKG_HASH:=f9461b4619bb78b273a88d468915750d418e89a3ea3b641bab0563a9af4b04d0
 PKG_LICENSE:=LGPL-2.1+ GPL-2.0+
 PKG_LICENSE_FILES:=COPYING
 
-PKG_FIXUP:=patch-libtool
+PKG_FIXUP:=autoreconf patch-libtool
 PKG_INSTALL:=1
 PKG_BUILD_PARALLEL:=1
 
diff --git a/libs/libgcrypt/patches/002-Add-configure-option-enable-build-timestamp.patch b/libs/libgcrypt/patches/002-Add-configure-option-enable-build-timestamp.patch
new file mode 100644 (file)
index 0000000..49c3991
--- /dev/null
@@ -0,0 +1,43 @@
+From a785cc3db0c4e8eb8ebbf784b833a40d2c42ec3e Mon Sep 17 00:00:00 2001
+From: Werner Koch <wk@gnupg.org>
+Date: Tue, 25 Aug 2015 21:11:05 +0200
+Subject: [PATCH] Add configure option --enable-build-timestamp.
+
+* configure.ac (BUILD_TIMESTAMP): Set to "<none>" by default.
+--
+
+This is based on
+libgpg-error commit d620005fd1a655d591fccb44639e22ea445e4554
+but changed to be disabled by default.  Check there for some
+background.
+
+Signed-off-by: Werner Koch <wk@gnupg.org>
+---
+ configure.ac | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+diff --git a/configure.ac b/configure.ac
+index 48e217947287..2acfa3630cac 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -2272,7 +2272,16 @@ changequote([,])dnl
+ BUILD_FILEVERSION="${BUILD_FILEVERSION}mym4_revision_dec"
+ AC_SUBST(BUILD_FILEVERSION)
+-BUILD_TIMESTAMP=`date -u +%Y-%m-%dT%H:%M+0000 2>/dev/null || date`
++AC_ARG_ENABLE([build-timestamp],
++  AC_HELP_STRING([--enable-build-timestamp],
++                 [set an explicit build timestamp for reproducibility.
++                  (default is the current time in ISO-8601 format)]),
++     [if test "$enableval" = "yes"; then
++        BUILD_TIMESTAMP=`date -u +%Y-%m-%dT%H:%M+0000 2>/dev/null || date`
++      else
++        BUILD_TIMESTAMP="$enableval"
++      fi],
++     [BUILD_TIMESTAMP="<none>"])
+ AC_SUBST(BUILD_TIMESTAMP)
+ AC_DEFINE_UNQUOTED(BUILD_TIMESTAMP, "$BUILD_TIMESTAMP",
+                    [The time this package was configured for a build])
+-- 
+2.15.1
+
index 1c6bcb018f05cb8864a2b6b93e20b80138e886fa..645bf307a31363dae7a86bebd0b87745f635a553 100644 (file)
@@ -8,7 +8,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libgee
-PKG_VERSION:=0.18.0
+PKG_VERSION:=0.20.0
 PKG_RELEASE:=1
 
 PKG_MAINTAINER:=W. Michael Petullo <mike@flyn.org>
@@ -17,8 +17,8 @@ PKG_LICENSE:=LGPL-2.1
 PKG_LICENSE_FILES:=COPYING
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
-PKG_SOURCE_URL:=@GNOME/libgee/0.18/
-PKG_HASH:=4ad99ef937d071b4883c061df40bfe233f7649d50c354cf81235f180b4244399
+PKG_SOURCE_URL:=@GNOME/libgee/0.20/
+PKG_HASH:=21308ba3ed77646dda2e724c0e8d5a2f8d101fb05e078975a532d7887223c2bb
 
 PKG_FIXUP:=autoreconf
 PKG_INSTALL:=1
index caa6e16e6c620a7454967ed40dad5bd9b4780025..fd30e4507afbf1c73c06055d144414b0002b5efd 100644 (file)
@@ -1,10 +1,11 @@
-diff -u --recursive libgee-0.18.0-vanilla/configure.ac libgee-0.18.0/configure.ac
---- libgee-0.18.0-vanilla/configure.ac 2015-03-23 23:24:39.000000000 -0400
-+++ libgee-0.18.0/configure.ac 2015-10-18 07:25:39.474698663 -0400
-@@ -64,10 +64,6 @@
+diff -u --recursive libgee-0.20.0-vanilla/configure.ac libgee-0.20.0/configure.ac
+--- libgee-0.20.0-vanilla/configure.ac 2018-01-07 20:42:52.827537620 -0500
++++ libgee-0.20.0/configure.ac 2018-01-07 20:43:25.128645499 -0500
+@@ -65,11 +65,6 @@
                enable_consistency_check=$enableval, enable_consistency_check=no)
  AS_IF([test "x$enable_consistency_check" != xno], [VALA_ADD_VALAFLAGS(-D CONSISTENCY_CHECKS)])
  
+-AX_REQUIRE_DEFINED([GOBJECT_INTROSPECTION_CHECK])
 -GOBJECT_INTROSPECTION_CHECK([0.9.0])
 -
 -VALA_CHECK([0.25.1])
@@ -12,9 +13,9 @@ diff -u --recursive libgee-0.18.0-vanilla/configure.ac libgee-0.18.0/configure.a
  AC_OUTPUT([Makefile
             gee-0.8.pc
             benchmark/Makefile
-diff -u --recursive libgee-0.18.0-vanilla/gee/Makefile.am libgee-0.18.0/gee/Makefile.am
---- libgee-0.18.0-vanilla/gee/Makefile.am      2015-03-16 11:23:57.000000000 -0400
-+++ libgee-0.18.0/gee/Makefile.am      2015-10-18 10:41:49.759314756 -0400
+diff -u --recursive libgee-0.20.0-vanilla/gee/Makefile.am libgee-0.20.0/gee/Makefile.am
+--- libgee-0.20.0-vanilla/gee/Makefile.am      2018-01-07 20:42:52.829537627 -0500
++++ libgee-0.20.0/gee/Makefile.am      2018-01-07 20:43:48.332722990 -0500
 @@ -146,29 +146,6 @@
        gee-0.8.vapi \
        $(NULL)
@@ -45,10 +46,10 @@ diff -u --recursive libgee-0.18.0-vanilla/gee/Makefile.am libgee-0.18.0/gee/Make
  MOSTLYCLEANFILES = \
        $(libgee_0_8_la_VALASOURCES:.vala=.c) \
        libgee_0_8_la_vala.stamp \
-diff -u --recursive libgee-0.18.0-vanilla/gee/Makefile.in libgee-0.18.0/gee/Makefile.in
---- libgee-0.18.0-vanilla/gee/Makefile.in      2015-03-23 23:25:03.000000000 -0400
-+++ libgee-0.18.0/gee/Makefile.in      2015-10-18 11:02:34.888709559 -0400
-@@ -285,14 +285,6 @@
+diff -u --recursive libgee-0.20.0-vanilla/gee/Makefile.in libgee-0.20.0/gee/Makefile.in
+--- libgee-0.20.0-vanilla/gee/Makefile.in      2018-01-07 20:42:52.830537630 -0500
++++ libgee-0.20.0/gee/Makefile.in      2018-01-07 20:44:18.433823516 -0500
+@@ -297,14 +297,6 @@
  INSTALL_PROGRAM = @INSTALL_PROGRAM@
  INSTALL_SCRIPT = @INSTALL_SCRIPT@
  INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
@@ -63,7 +64,7 @@ diff -u --recursive libgee-0.18.0-vanilla/gee/Makefile.in libgee-0.18.0/gee/Make
  LCOV = @LCOV@
  LD = @LD@
  LDFLAGS = @LDFLAGS@
-@@ -531,25 +523,6 @@
+@@ -544,25 +536,6 @@
        gee-0.8.vapi \
        $(NULL)
  
@@ -89,7 +90,7 @@ diff -u --recursive libgee-0.18.0-vanilla/gee/Makefile.in libgee-0.18.0/gee/Make
  MOSTLYCLEANFILES = \
        $(libgee_0_8_la_VALASOURCES:.vala=.c) \
        libgee_0_8_la_vala.stamp \
-@@ -1607,9 +1580,6 @@
+@@ -1621,9 +1594,6 @@
  
  $(libgee_0_8_la_VALASOURCES:.vala=.c): libgee_0_8_la_vala.stamp
  gee-0.8.vapi gee-internals-0.8.vapi gee.h gee-internals.h: libgee_0_8_la_vala.stamp
index d8bc5cfa633aab98a97b034fd8d4d14ad61b24ee..3667b2beb9ee7165419c2fa79b2b1266f0004458 100644 (file)
@@ -8,18 +8,18 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libhttp-parser
-PKG_VERSION:=2.3.0
+PKG_VERSION:=2.7.1
 PKG_RELEASE=1
 PKG_MAINTAINER:=Ramanathan Sivagurunathan <ramzthecoder@gmail.com>
 PKG_LICENSE:=MIT
 PKG_LICENSE_FILES:=LICENSE-MIT
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
-PKG_MIRROR_HASH:=721ee45b09e8d999e814afe60508bcf0c8d35940cb71417ee96c0db5cdc161ff
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
+PKG_MIRROR_HASH:=20e6acc415ae8a47f39c6821685dbba09d99ff5079902fe1a0f580c2c88ae18a
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
 PKG_SOURCE_URL:=git://github.com/joyent/http-parser.git
 PKG_SOURCE_PROTO:=git
-PKG_SOURCE_VERSION:=56f7ad0e2e5a80f79d214015c91e1f17d11d109f
+PKG_SOURCE_VERSION:=v$(PKG_VERSION)
 
 
 include $(INCLUDE_DIR)/package.mk
index 4ed08e398e44b926e1a26d73c655184b071d3219..184d6cc69afd466665beb9097a53de7ed58d79df 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libiio
-PKG_VERSION:=0.11
-PKG_RELEASE:=2
+PKG_VERSION:=0.12
+PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://codeload.github.com/analogdevicesinc/libiio/tar.gz/v$(PKG_VERSION)?
-PKG_HASH:=0174111b028d84f18fb3716b22834a372a1f2575938f87e20e5cbd76747d0fdb
+PKG_HASH:=36e164fc00535762c819db209928ee2704fc81657d41060ea47873bccfd5c4bc
 
 PKG_LICENSE:=LGPL-2.1
 PKG_LICENSE_FILES:=COPYING.txt
@@ -34,7 +34,7 @@ define Package/libiio
   TITLE:=Library for interfacing with Linux IIO devices
   URL:=https://github.com/analogdevicesinc/libiio
   DEPENDS:=+PACKAGE_libaio:libaio +PACKAGE_libusb-1.0:libusb-1.0 \
-           +PACKAGE_libavahi-common:libavahi-common +PACKAGE_libavahi-client:libavahi-client +libxml2
+           +PACKAGE_libavahi-client:libavahi-client +libxml2
 endef
 
 define Package/libiio/description
diff --git a/libs/libiio/patches/001-quote-strequal.patch b/libs/libiio/patches/001-quote-strequal.patch
deleted file mode 100644 (file)
index d8b91f8..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/CMakeLists.txt   2017-10-23 22:24:46.000000000 +0200
-+++ b/CMakeLists.txt   2017-11-18 20:31:27.943838662 +0100
-@@ -111,7 +111,7 @@
-               OUTPUT_STRIP_TRAILING_WHITESPACE
-       )
--      if (${LIBIIO_GIT_REPO} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR})
-+      if ("${LIBIIO_GIT_REPO}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
-               execute_process(
-                       COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
-                       WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
index ddc863813783be2dbbd75a03327db4819190fd54..b0d49838e8532ea9412b5f5cb278bf5b47b6ea77 100644 (file)
@@ -27,7 +27,7 @@ PKG_INSTALL:=1
 
 include $(INCLUDE_DIR)/package.mk
 include $(INCLUDE_DIR)/nls.mk
-$(call include_mk, python-package.mk)
+include ../../lang/python/python-package.mk
 
 define Package/libimobiledevice/Default
   TITLE:=A library that talks to Apple devices.
index bbc2edd7f91cd6acadec235315d89b7f39ecc80c..4c73d4c108467a7e096cacf488618f5c15c81ec4 100644 (file)
@@ -20,7 +20,7 @@ PKG_LICENSE:=IJG
 PKG_LICENSE_FILES:=README
 
 PKG_BUILD_PARALLEL:=1
-PKG_BUILD_DEPENDS:=libltdl
+PKG_BUILD_DEPENDS:=libtool
 
 include $(INCLUDE_DIR)/host-build.mk
 include $(INCLUDE_DIR)/package.mk
index 35518935bb2311d366a3cb0531e9f9027fd3d023..e66ddba70c1cbfb45912b23501a306cef3526b9e 100644 (file)
@@ -8,17 +8,17 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libndpi
-PKG_VERSION:=2.0
+PKG_VERSION:=2.2
 PKG_RELEASE:=1
 PKG_MAINTAINER:=Banglang Huang <banglang.huang@foxmail.com>
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL:=https://github.com/ntop/nDPI.git
-PKG_SOURCE_VERSION:=6607c33cb8d0d942e97fe28b1a3a51da06b7426a
+PKG_SOURCE_VERSION:=56dcf659de5de5385406068704a89c6a39e34041
 
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
-PKG_MIRROR_HASH:=800554afbb7c742786c554ca553c4d866bc4dcf61154858ce6b40511e7d7be39
+PKG_MIRROR_HASH:=425f48e21295d4b522d0190181bd5943ae0664c20a3aa47f3c62611dd4c7b93f
 PKG_LICENSE:=LGPLv3
 
 PKG_INSTALL:=1
index 4bff516417ba0b5b313926c56c4dccec38735e92..96b59c0b48adf1f13284542c5745fa6ba7c27c04 100644 (file)
@@ -12,11 +12,11 @@ PKG_NAME:=libnetconf2
 PKG_LICENSE:=BSD-3-Clause
 PKG_MAINTAINER:=Mislav Novakovic <mislav.novakovic@sartura.hr>
 
-PKG_VERSION:=0.9.22
+PKG_VERSION:=0.10.17
 
 PKG_SOURCE_PROTO:=git
-PKG_SOURCE_VERSION:=8aafe1286cb4036b87054e6e1ca5edc34a31595c
-PKG_MIRROR_HASH:=ac6fca84ba903825958afe313ff0795c34eb0865ed7b5003b7112afcb24b9d94
+PKG_SOURCE_VERSION:=bd93b091d6e4414283c6c764dc451aee61e09997
+PKG_MIRROR_HASH:=499847be79d202cb0c933aad8133a38ebca7099344a1194404e488aa4d10ff08
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.xz
 PKG_SOURCE_URL:=https://github.com/cesnet/libnetconf2/
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION)
index bf05c6d92454d5e08212f81d3411f00303f577d6..b6cba662451d32d416ffae96bebe2e23fec4af36 100644 (file)
@@ -23,7 +23,7 @@ PKG_INSTALL:=1
 
 include $(INCLUDE_DIR)/package.mk
 include $(INCLUDE_DIR)/nls.mk
-$(call include_mk, python-package.mk)
+include ../../lang/python/python-package.mk
 
 define Package/libsearpc
     SECTION:=libs
index 9aaf8082160e700e05a63b50457dc6dde55adb2f..704e32efebf6ef511d19c35e2efc48b93bb58405 100644 (file)
@@ -8,13 +8,13 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libsodium
-PKG_VERSION:=1.0.12
+PKG_VERSION:=1.0.16
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://download.libsodium.org/libsodium/releases \
 https://github.com/jedisct1/libsodium/releases/download/$(PKG_VERSION)
-PKG_HASH:=b8648f1bb3a54b0251cf4ffa4f0d76ded13977d4fa7517d988f4c902dd8e2f95
+PKG_HASH:=eeadc7e1e1bcef09680fb4837d448fbdf57224978f865ac1c16745868fbd0533
 
 PKG_FIXUP:=libtool autoreconf
 PKG_USE_MIPS16:=0
index 3035d1890d1355e5d4b8c46c45e74d094b3e9b99..90f04c645a3ce55d22b71e97ed2f94c5a557dd2d 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libsoup
-PKG_VERSION:=2.54.1
+PKG_VERSION:=2.60.2
 PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
-PKG_SOURCE_URL:=@GNOME/$(PKG_NAME)/2.54
-PKG_HASH:=47b42c232034734d66e5f093025843a5d8cc4b2357c011085a2fd04ef02dd633
+PKG_SOURCE_URL:=@GNOME/$(PKG_NAME)/2.60
+PKG_HASH:=7263cfe18872e2e652c196f5667e514616d9c97c861dfca82a65a55f45f0da01
 
 PKG_LICENSE:=GPL-2.0
 PKG_LICENSE_FILES:=COPYING
index b8ce3639536a4440d00b77a36c978b521aaaecc6..cef29893c90ce14d91828541f5dc9d17a50527fc 100644 (file)
@@ -8,9 +8,9 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libunistring
-PKG_VERSION:=0.9.6
+PKG_VERSION:=0.9.8
 PKG_RELEASE:=1
-PKG_HASH:=9625eec2507f4789ebb6fc48ebda98be0e0168979a2f68aa8b680bf8eeabbd47
+PKG_HASH:=b792f2bd05d0fa7b339e39e353da7232b2e514e0db2cf5ed95beeff3feb53cf5
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=@GNU/libunistring
index 6b2d96b1462fe38dec27fc1eb4d569000964bdfb..65282ff9f190002222e4a90b26e2528a0d6a2e1c 100644 (file)
@@ -1,6 +1,6 @@
 #
 # Copyright (C) 2015 OpenWrt.org
-# Copyright (C) 2014-2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+# Copyright (C) 2014-2018 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -9,7 +9,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=liburcu
-PKG_VERSION:=0.9.2
+PKG_VERSION:=0.9.4
 PKG_RELEASE:=1
 
 PKG_MAINTAINER:=Daniel Salzman <daniel.salzman@nic.cz>
@@ -17,7 +17,7 @@ PKG_LICENSE:=LGPL-2.1 GPL-2.0 GPL-3.0 MIT
 
 PKG_SOURCE:=userspace-rcu-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_URL:=https://lttng.org/files/urcu/
-PKG_HASH:=8f7fa313b1e0a3f742cea24ce63a39c0efe63e615a769e2961e55bd2663ecaa3
+PKG_HASH:=ec6c909249040dfa59bb34686482b62072ce5477f5e2e2153dac47de50b36b68
 
 PKG_BUILD_DIR:=$(BUILD_DIR)/userspace-rcu-$(PKG_VERSION)
 PKG_BUILD_PARALLEL:=1
index c38170c76f245a108bef6ba9fbc1b78180728fb3..e13a0201c89c3b24d0efbe6ce4bb54de3347da29 100644 (file)
@@ -8,12 +8,13 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=xerces-c
-PKG_VERSION:=3.1.4
-PKG_RELEASE:=2
+PKG_MAIN_VER:=3.2
+PKG_VERSION:=3.2.0
+PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=@APACHE/xerces/c/3/sources
-PKG_HASH:=9973cc79481803f8b6652c52faf5195d963f50d209d4f681ec97e2aa014b6241
+PKG_HASH:=35d8db18ebe6db353850903981cd07cca64abeba071602e7e32596714352de08
 PKG_MAINTAINER:=Álvaro Fernández Rojas <noltari@gmail.com>
 
 PKG_LICENSE:=Apache-2.0
@@ -72,14 +73,14 @@ define Build/InstallDev
        $(INSTALL_DIR) $(1)/usr/include/xercesc/
        $(CP) $(PKG_INSTALL_DIR)/usr/include/xercesc/* $(1)/usr/include/xercesc/
        $(INSTALL_DIR) $(1)/usr/lib
-       $(CP) $(PKG_INSTALL_DIR)/usr/lib/{libxerces-c.a,libxerces-c-3.1.so,libxerces-c.so} $(1)/usr/lib/
+       $(CP) $(PKG_INSTALL_DIR)/usr/lib/{libxerces-c.a,libxerces-c-$(PKG_MAIN_VER).so,libxerces-c.so} $(1)/usr/lib/
        $(INSTALL_DIR) $(1)/usr/lib/pkgconfig/
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/xerces-c.pc $(1)/usr/lib/pkgconfig/xerces-c.pc
 endef
 
 define Package/libxerces-c/install
        $(INSTALL_DIR) $(1)/usr/lib
-       $(CP) $(PKG_INSTALL_DIR)/usr/lib/{libxerces-c-3.1.so,libxerces-c.so} $(1)/usr/lib/
+       $(CP) $(PKG_INSTALL_DIR)/usr/lib/{libxerces-c-$(PKG_MAIN_VER).so,libxerces-c.so} $(1)/usr/lib/
 endef
 
 define Package/libxerces-c-samples/install
diff --git a/libs/libxerces-c/patches/0001-fix-configure-cross-compiling.patch b/libs/libxerces-c/patches/0001-fix-configure-cross-compiling.patch
new file mode 100644 (file)
index 0000000..9e639ac
--- /dev/null
@@ -0,0 +1,20 @@
+--- a/configure.ac
++++ b/configure.ac
+@@ -194,7 +194,7 @@ AC_COMPILE_IFELSE(  [AC_LANG_PROGRAM([[#
+                     ]
+                  )
+ AC_MSG_CHECKING([for wcsrtombs])
+-AC_RUN_IFELSE(  [AC_LANG_PROGRAM([[#include <wchar.h>
++AC_COMPILE_IFELSE(  [AC_LANG_PROGRAM([[#include <wchar.h>
+ #include <string.h>]],
+                                  [[
+ mbstate_t st;
+@@ -216,7 +216,7 @@ else
+                     ]
+                  )
+ AC_MSG_CHECKING([for mbsrtowcs])
+-AC_RUN_IFELSE(  [AC_LANG_PROGRAM([[#include <wchar.h>
++AC_COMPILE_IFELSE(  [AC_LANG_PROGRAM([[#include <wchar.h>
+ #include <string.h>]],
+                                  [[
+ mbstate_t st;
index cb198c04988696a7dbd87c3a316610f1d36ad667..902951967def2d44f9743661b171c1ab630400ad 100644 (file)
@@ -8,15 +8,15 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libyang
-PKG_VERSION:=0.13.75
+PKG_VERSION:=0.14.53
 PKG_RELEASE=$(PKG_SOURCE_VERSION)
 
 PKG_LICENSE:=GPL-2.0+
 PKG_MAINTAINER:=Mislav Novakovic <mislav.novakovic@sartura.hr>
 
 PKG_SOURCE_PROTO:=git
-PKG_SOURCE_VERSION:=e11255e32a63fdafe31764f5d594bed46d08f6a9
-PKG_MIRROR_HASH:=916cbfd52a04c6b306afa5fb684299f202c1c235689d8b57546a6b4eb4cc5a39
+PKG_SOURCE_VERSION:=2698bd6484526facbf82b1263810b938b82a2f23
+PKG_MIRROR_HASH:=3bfe4fd8236f0d1903d275aa76e039645d1093ef4204ab3b9bef46aecbe68f72
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.xz
 PKG_SOURCE_URL:=https://github.com/CESNET/libyang.git
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION)
index 39ccca698dd0781a57362d11739d445f9e75b962..19932fb06f2af4f1804055014efb85014987f280 100644 (file)
@@ -5,7 +5,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=postgresql
-PKG_VERSION:=9.6.5
+PKG_VERSION:=9.6.6
 PKG_RELEASE:=1
 PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
 PKG_LICENSE:=PostgreSQL
@@ -16,7 +16,7 @@ PKG_SOURCE_URL:=\
        http://ftp.postgresql.org/pub/source/v$(PKG_VERSION) \
        ftp://ftp.postgresql.org/pub/source/v$(PKG_VERSION)
 
-PKG_HASH:=06da12a7e3dddeb803962af8309fa06da9d6989f49e22865335f0a14bad0744c
+PKG_HASH:=399cdffcb872f785ba67e25d275463d74521566318cfef8fe219050d063c8154
 
 PKG_USE_MIPS16:=0
 PKG_FIXUP:=autoreconf
index 815c3a12836f5a554698df0830526081a8e16c73..b254f7f3756e0d444d44b307360c83c867168e40 100644 (file)
@@ -19,7 +19,6 @@ PKG_LICENSE:=PUBLICDOMAIN
 PKG_LICENSE_FILES:=
 
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-autoconf-$(PKG_VERSION)
-PKG_BUILD_DEPENDS:=libncurses libreadline
 
 PKG_FIXUP:=autoreconf
 
index 2a495214f21bf4389f9d3d8e794248d68ea93083..c1cb3a884d1d540025d5802376a543b64eaad86f 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=vips
-PKG_VERSION:=7.42.1
+PKG_VERSION:=8.6.1
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
-PKG_SOURCE_URL:=http://www.vips.ecs.soton.ac.uk/supported/7.42/
-PKG_HASH:=5ee272b11e4ca61c148d7392cbc01ad35f577b503727f479e38923e5bcfe6abf
+PKG_SOURCE_URL:=https://github.com/jcupitt/libvips/releases/download/v8.6.1/
+PKG_HASH:=f9ba6235ebc3e4d20af5f1604436bcd9686a3fecbe40838325d542f0c21a9270
 PKG_FIXUP:=autoreconf
 PKG_CHECK_FORMAT_SECURITY:=0
 
@@ -29,7 +29,7 @@ define Package/vips
   TITLE:=An image manipulation library
   URL:=http://www.vips.ecs.soton.ac.uk/
   MAINTAINER:=W. Michael Petullo <mike@flyn.org>
-  DEPENDS:=+glib2 +libexif +libjpeg +libpng +libxml2 $(INTL_DEPENDS)
+  DEPENDS:=+glib2 +libexif +libexpat +libjpeg +libpng +libstdcpp +libxml2 $(INTL_DEPENDS)
 endef
 
 TARGET_LDFLAGS+= \
diff --git a/libs/vips/patches/001-no_cpp.patch b/libs/vips/patches/001-no_cpp.patch
deleted file mode 100644 (file)
index 72e841c..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-diff -u --recursive --new-file vips-7.42.1-vanilla/configure.ac vips-7.42.1/configure.ac
---- vips-7.42.1-vanilla/configure.ac   2014-12-29 17:45:59.576995574 -0500
-+++ vips-7.42.1/configure.ac   2014-12-29 17:59:03.698808601 -0500
-@@ -264,7 +264,6 @@
- AC_PROG_AWK
- AC_PROG_CC
- AC_PROG_CC_STDC
--AC_PROG_CXX
- AC_C_CONST
- AC_C_RESTRICT
- AC_PROG_RANLIB
-@@ -272,19 +271,6 @@
- AC_PROG_LN_S
- AM_WITH_DMALLOC
--# vips_PROG_CXX_WORKS
--# Check whether the C++ compiler works.
--AC_DEFUN([vips_PROG_CXX_WORKS],
--  [AC_REQUIRE([AC_PROG_CXX])dnl
--   AC_CACHE_CHECK([whether the C++ compiler works],
--   [vips_cv_prog_cxx_works],
--   [AC_LANG_PUSH([C++])
--    AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])],
--                   [vips_cv_prog_cxx_works=yes],
--                   [vips_cv_prog_cxx_works=no])
--    AC_LANG_POP([C++])])
--])
--
- # option to build without C++
- # handy for some embedded applications
- # also, including C++ source causes link problems on some
-@@ -292,24 +278,8 @@
- AC_ARG_ENABLE(cxx, 
-   AS_HELP_STRING([--enable-cxx], [build C++ components (default: test)]))
--if test x"$enable_cxx" != x"no"; then
--  vips_PROG_CXX_WORKS
--  if test x"$vips_cv_prog_cxx_works" = x"yes"; then 
--    AC_DEFINE(ENABLE_CXX,1,[build C++ components])
--    AM_CONDITIONAL(ENABLE_CXX, true)
--    # need -lstdc++ for (eg.) the C++ format loaders
--    # this gets added to vips.pc to help mingw and friends link programs
--    # using libvips
--    if test x"$vips_needs_stdcpp" != x"no"; then
--      VIPS_CXX_LIBS="-lstdc++"
--    fi
--    enable_cxx=yes
--  fi
--fi
--
- if test x"$enable_cxx" != x"yes"; then
-   AM_CONDITIONAL(ENABLE_CXX, false)
--  VIPS_CXX_LIBS=""
-   enable_cxx=no
- fi
-@@ -817,7 +787,6 @@
- AC_SUBST(VIPS_CFLAGS)
- AC_SUBST(VIPS_INCLUDES)
- AC_SUBST(VIPS_LIBS)
--AC_SUBST(VIPS_CXX_LIBS)
- AC_SUBST(PACKAGES_USED)
- AC_SUBST(EXTRA_LIBS_USED)
-@@ -850,12 +819,6 @@
-       libvips/create/Makefile 
-       libvips/resample/Makefile 
-       libvips/video/Makefile 
--      libvipsCC/include/Makefile 
--      libvipsCC/include/vips/Makefile 
--      libvipsCC/Makefile 
--      cplusplus/include/Makefile 
--      cplusplus/include/vips/Makefile 
--      cplusplus/Makefile 
-       tools/Makefile 
-       tools/batch_crop 
-       tools/batch_image_convert 
-@@ -866,7 +829,6 @@
-       test/Makefile 
-       test/variables.sh
-       swig/Makefile 
--      swig/vipsCC/Makefile 
-       man/Makefile
-       doc/Makefile
-       doc/reference/Makefile
-diff -u --recursive --new-file vips-7.42.1-vanilla/libvips/Makefile.am vips-7.42.1/libvips/Makefile.am
---- vips-7.42.1-vanilla/libvips/Makefile.am    2014-12-29 17:45:59.590996100 -0500
-+++ vips-7.42.1/libvips/Makefile.am    2014-12-29 17:59:32.053375826 -0500
-@@ -33,14 +33,6 @@
- # empty means default to C linking
- libvips_la_SOURCES = 
--# if we have C++ components enabled, make sure we link the top-level with c++
--#
--# sadly the if/endif isn't enough to stop automake detecting a c++ link even
--# when c++ is disabled ... comment out this line if you have linking problems
--if ENABLE_CXX
--nodist_EXTRA_libvips_la_SOURCES = resample/dummy2.cc
--endif
--
- # DLLs need dependant libs there too ... put @VIPS_LIBS@ at the end
- libvips_la_LIBADD = \
-       resample/libresample.la \
-diff -u --recursive --new-file vips-7.42.1-vanilla/libvips/resample/Makefile.am vips-7.42.1/libvips/resample/Makefile.am
---- vips-7.42.1-vanilla/libvips/resample/Makefile.am   2014-12-29 17:45:59.591996138 -0500
-+++ vips-7.42.1/libvips/resample/Makefile.am   2014-12-29 18:01:57.107188019 -0500
-@@ -1,30 +1,3 @@
--# only build the C++ stuff if ENABLE_CXX
--# you'd think we could just define a couple of variables, but that seems to
--# confuse libtool and make it link the library with g++
--# instead, have two completely different paths
--if ENABLE_CXX
--
--libresample_la_SOURCES = \
--      affine.c \
--      quadratic.c \
--      resample.c \
--      similarity.c \
--      resize.c \
--      presample.h \
--      shrink.c \
--      interpolate.c \
--      transform.c \
--      bicubic.cpp \
--      lbb.cpp \
--      nohalo.cpp \
--      vsqbs.cpp \
--      templates.h 
--
--EXTRA_DIST = \
--      dummy2.cc 
--
--else
--
- libresample_la_SOURCES = \
-       resample.c \
-       similarity.c \
-@@ -36,16 +9,6 @@
-       quadratic.c \
-       transform.c 
--EXTRA_DIST = \
--      dummy2.cc \
--      bicubic.cpp \
--      lbb.cpp \
--      nohalo.cpp \
--      vsqbs.cpp \
--      templates.h 
--
--endif
--
- noinst_LTLIBRARIES = libresample.la
- AM_CPPFLAGS = -I${top_srcdir}/libvips/include @VIPS_CFLAGS@ @VIPS_INCLUDES@ 
diff --git a/libs/vips/patches/001-no_introspection.patch b/libs/vips/patches/001-no_introspection.patch
new file mode 100644 (file)
index 0000000..54db292
--- /dev/null
@@ -0,0 +1,73 @@
+diff -u --recursive vips-8.6.1-vanilla/configure.ac vips-8.6.1/configure.ac
+--- vips-8.6.1-vanilla/configure.ac    2018-01-13 17:27:19.375813474 -0500
++++ vips-8.6.1/configure.ac    2018-01-13 17:27:38.486871756 -0500
+@@ -53,9 +53,6 @@
+ AC_SUBST(LIBRARY_REVISION)
+ AC_SUBST(LIBRARY_AGE)
+-# init introspection support
+-GOBJECT_INTROSPECTION_CHECK([1.30.0])
+-
+ # gir needs a list of source files to scan for introspection
+ #
+ # build with a glob and a list of files to exclude from scanning
+diff -u --recursive vips-8.6.1-vanilla/libvips/Makefile.am vips-8.6.1/libvips/Makefile.am
+--- vips-8.6.1-vanilla/libvips/Makefile.am     2018-01-13 17:27:19.366813446 -0500
++++ vips-8.6.1/libvips/Makefile.am     2018-01-13 17:27:57.256929001 -0500
+@@ -70,56 +70,3 @@
+       echo "#define VIPS_SONAME \"$$dlname\"" >> soname.h && \
+       cp soname.h $(DESTDIR)$(pkgincludedir) && \
+       rm soname.h
+-
+--include $(INTROSPECTION_MAKEFILE)
+-INTROSPECTION_GIRS =
+-INTROSPECTION_SCANNER_ARGS = --add-include-path=$(srcdir)
+-INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
+-
+-if HAVE_INTROSPECTION
+-
+-AM_CPPFLAGS = \
+-            -I${top_srcdir}/libvips/include \
+-            @VIPS_CFLAGS@ \
+-            @VIPS_INCLUDES@ \
+-            @INTROSPECTION_CFLAGS@ 
+-AM_LDFLAGS = \
+-           @INTROSPECTION_LIBS@ \
+-           @LDFLAGS@ 
+-LDADD = @INTROSPECTION_LIBS@ @VIPS_CFLAGS@ libvips.la @VIPS_LIBS@ 
+-
+-noinst_PROGRAMS = \
+-      introspect
+-introspect_SOURCES = \
+-      introspect.c
+-
+-# we can't get the _SOURCES lists from the subdirs directly, we get passed it
+-# by configure instead
+-introspection_sources = @vips_introspection_sources@
+-
+-# we make the vips8 API
+-Vips-8.0.gir: introspect
+-Vips_8_0_gir_INCLUDES = GObject-2.0
+-Vips_8_0_gir_CFLAGS = $(INCLUDES) -I${top_srcdir}/libvips/include
+-Vips_8_0_gir_LIBS = libvips.la
+-Vips_8_0_gir_FILES = $(introspection_sources)
+-INTROSPECTION_GIRS += Vips-8.0.gir
+-
+-# don't use
+-#   --warn-all --verbose
+-# too annoying
+-Vips_8_0_gir_SCANNERFLAGS = \
+-      --program=./introspect$(EXEEXT) \
+-      --identifier-prefix=Vips \
+-      --identifier-prefix=vips \
+-      --symbol-prefix=vips \
+-      --c-include=vips/vips.h
+-
+-girdir = $(datadir)/gir-1.0
+-gir_DATA = $(INTROSPECTION_GIRS)
+-
+-typelibdir = $(libdir)/girepository-1.0
+-typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
+-
+-CLEANFILES += $(gir_DATA) $(typelib_DATA)
+-endif
index 7df530f6ec6cbfaac5779ee2371758b3e11d55f8..a82a70eecea493b83828e26e49591843616feb3c 100644 (file)
@@ -21,7 +21,6 @@ PKG_SOURCE_URL:= https://github.com/zeromq/zeromq4-1/releases/download/v$(PKG_VE
 PKG_HASH:=e99f44fde25c2e4cb84ce440f87ca7d3fe3271c2b8cfbc67d55e4de25e6fe378
 
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
-PKG_BUILD_DEPENDS:=libuuid
 
 PKG_FIXUP:=autoreconf
 
index 2621c768d731c7d13c722619529311ef41c815d6..b4144711ca56174c6c50998afe311e92202bfc1f 100644 (file)
@@ -8,13 +8,13 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=mutt
-PKG_VERSION:=1.9.1
+PKG_VERSION:=1.9.2
 PKG_RELEASE:=1
 
 PKG_SOURCE_URL:=ftp://ftp.mutt.org/pub/mutt/ \
                https://bitbucket.org/mutt/mutt/downloads/
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
-PKG_HASH:=749b83a96373c6e2101ebe8c4b9a651735e02c478edb750750a5146a15d91bb1
+PKG_HASH:=a2e152a352bbf02d222d54074199d9c53821c19f700c4cb85f78fa85faed7896
 
 PKG_LICENSE:=GPL-2.0+
 PKG_LICENSE_FILES:=GPL
@@ -29,7 +29,7 @@ include $(INCLUDE_DIR)/package.mk
 define Package/mutt
   SECTION:=mail
   CATEGORY:=Mail
-  DEPENDS:=+libopenssl +libncursesw +zlib
+  DEPENDS:=+libopenssl +libncursesw +terminfo +zlib
   TITLE:=Console mail client
   URL:=http://www.mutt.org/
 endef
index 6e52f142ad4c9652233932d719cbf02cf26db3e5..9add29e7862eab7d3daf89eab3b0fe69a5b981d9 100644 (file)
@@ -8,7 +8,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=dovecot-pigeonhole
-PKG_VERSION_PLUGIN:=0.4.20
+PKG_VERSION_PLUGIN:=0.4.21
 PKG_VERSION_DOVECOT:=$(shell make --no-print-directory -C ../dovecot/ val.PKG_VERSION V=s)
 PKG_VERSION:=$(PKG_VERSION_DOVECOT)-$(PKG_VERSION_PLUGIN)
 PKG_RELEASE:=2
@@ -17,7 +17,7 @@ DOVECOT_VERSION:=2.2
 
 PKG_SOURCE:=dovecot-$(DOVECOT_VERSION)-pigeonhole-$(PKG_VERSION_PLUGIN).tar.gz
 PKG_SOURCE_URL:=https://pigeonhole.dovecot.org/releases/$(DOVECOT_VERSION)
-PKG_HASH:=6fe17d0b8f25f2ad580e01ad81ce47a9e965255e383a1f80e455f9ca0f00be5b
+PKG_HASH:=4ae09cb788c5334d167f5a89ee70b0616c3231e5904ad258ce408e4953cfdd6a
 PKG_LICENSE:=LGPL-2.1
 PKG_LICENSE_FILES:=COPYING COPYING.LGPL
 
index 530950788ec77f114130b652637f5836fa3fb0a7..9d4d2389e379168e0e4dd516372a22a727bff5f2 100644 (file)
@@ -19,7 +19,7 @@ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_MAINTAINER:=Denis Shulyaka <Shulyaka@gmail.com>
 PKG_LICENSE:=IPL-1.0
 PKG_LICENSE_FILES:=LICENSE
-PKG_BUILD_DEPENDS:=+POSTFIX_CDB:tinycdb
+PKG_BUILD_DEPENDS:=POSTFIX_CDB:tinycdb
 PKG_CONFIG_DEPENDS:= \
        CONFIG_POSTFIX_TLS \
        CONFIG_POSTFIX_SASL \
diff --git a/mail/sendmail/Makefile b/mail/sendmail/Makefile
new file mode 100644 (file)
index 0000000..b61ac65
--- /dev/null
@@ -0,0 +1,133 @@
+#
+# Copyright (C) 2017 Val Kulkov <val.kulkov@gmail.com>
+#
+# This is free software, licensed under the GNU General Public License v3.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=sendmail
+PKG_VERSION:=8.15.2
+PKG_RELEASE:=1
+
+PKG_SOURCE:=$(PKG_NAME).$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=http://artfiles.org/sendmail.org/pub/sendmail/ \
+ftp://ftp.cs.berkeley.edu/ucb/sendmail/ \
+http://www.netgull.com/sendmail/
+PKG_HASH:=24f94b5fd76705f15897a78932a5f2439a32b1a2fdc35769bb1a5f5d9b4db439
+PKG_MAINTAINER:=Val Kulkov <val.kulkov@gmail.com>
+
+PKG_LICENSE:=Sendmail
+PKG_LICENSE_FILES:=LICENSE
+
+PKG_INSTALL:=1
+
+include $(INCLUDE_DIR)/package.mk
+
+TARGET_OS:=OpenWrt
+SITECONFIG:=site.$(TARGET_OS).m4
+
+#
+# Uncomment the following sections that are currently commented out
+# to enable building and packaging Sendmail executables and default
+# configuration files into the "sendmail" package.
+#
+# Note that in this edition of the "sendmail" package:
+#   1. No init script is provided to start the Sendmail daemon.
+#   2. The initial configuration files in /etc/mail are likely inadequate
+#      for running the Sendmail daemon on your LEDE/OpenWrt device.
+#   3. You may have to "opkg install m4" to build Sendmail configuration files
+#      from customized mc files on your LEDE/OpenWrt device using m4, or
+#      alternatively you may use a Linux computer to build configuration
+#      files from customized mc files.
+#   4. Compiling and building the "sendmail" package will likely fail at
+#      the packaging stage if you have already selected and built the "ssmtp"
+#      package. "ssmtp" installs /usr/sbin/sendmail in the form of a symlink
+#      to /usr/sbin/ssmtp. Where /usr/sbin/sendmail is already present,
+#      copying the sendmail executable into /usr/sbin/sendmail results in
+#      an error:
+#        cp: not writing through dangling symlink
+#        ...
+#        lede/source/include/toplevel.mk:206: recipe for target 'package/feeds/packages/libmilter/compile' failed
+#
+# ANYONE WHO IS READING THIS MAKEFILE AND WHO HAS THE KNOWLEDGE AND DESIRE
+# TO COMPLETE PORTING OF SENDMAIL TO LEDE/OPENWRT PLATFORM IS ENCOURAGED
+# TO DO SO AND TAKE OVER THE MAINTAINERSHIP OF THIS PACKAGE FROM VAL KULKOV.
+#
+#define Package/sendmail
+#  SECTION:=mail
+#  CATEGORY:=Mail
+#  DEPENDS:=+libopenssl
+#  TITLE:=A general purpose internetwork mail routing facility
+#  URL:=http://sendmail.org/
+#endef
+#
+#define Package/sendmail/description
+#   Sendmail is a general purpose internetwork email routing facility that
+#   supports many kinds of mail-transfer and delivery methods, including
+#   the Simple Mail Transfer Protocol (SMTP) used for email transport over
+#   the Internet.
+#endef
+#
+#define Package/sendmail/conffiles
+#/etc/mail/helpfile
+#/etc/mail/sendmail.cf
+#/etc/mail/submit.cf
+#/etc/mail/statistics
+#endef
+
+define Package/libmilter-sendmail
+  SECTION:=libs
+  CATEGORY:=Libraries
+  DEPENDS:=+libpthread
+  TITLE:=The sendmail Mail Filter API (Milter) library
+  URL:=http://sendmail.org/
+endef
+
+define Package/libmilter-sendmail/description
+  The sendmail Mail Filter API (Milter) is designed to allow third-party
+programs access to mail messages as they are being processed in order to
+filter meta-information and content.
+endef
+
+TARGET_CFLAGS += $(FPIC)
+
+define Build/Prepare
+       $(Build/Prepare/Default)
+       $(CP) files/lm_getver.c $(PKG_BUILD_DIR)/libmilter/
+       $(CP) files/$(SITECONFIG) $(PKG_BUILD_DIR)/devtools/Site/
+       $(CP) files/$(TARGET_OS) $(PKG_BUILD_DIR)/devtools/OS/
+       $(CP) files/sharedlibrary.m4 $(PKG_BUILD_DIR)/devtools/M4/UNIX/
+       $(CP) $(PKG_BUILD_DIR)/cf/cf/generic-linux.mc $(PKG_BUILD_DIR)/cf/cf/sendmail.mc
+       $(SED) 's@TARGET_CC@$(TARGET_CC)@g' $(PKG_BUILD_DIR)/devtools/Site/$(SITECONFIG)
+       $(SED) 's@TARGET_CFLAGS@$(TARGET_CFLAGS)@g' $(PKG_BUILD_DIR)/devtools/Site/$(SITECONFIG)
+endef
+
+define Build/Compile
+       $(call Build/Compile/Default,)
+       $(MAKE_VARS) $(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/libmilter $(MAKE_FLAGS) all
+       $(MAKE_VARS) $(MAKE) -C $(PKG_BUILD_DIR)/libmilter $(MAKE_FLAGS) DESTDIR="$(PKG_INSTALL_DIR)" install
+       $(MAKE_VARS) $(MAKE) -C $(PKG_BUILD_DIR)/cf/cf $(MAKE_FLAGS) DESTDIR="$(PKG_INSTALL_DIR)" install-cf
+endef
+
+define Build/InstallDev
+       $(INSTALL_DIR) $(1)/usr/include/libmilter $(1)/usr/lib
+       $(CP) $(PKG_INSTALL_DIR)/usr/include/libmilter/* $(1)/usr/include/libmilter/
+       $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmilter.so* $(1)/usr/lib/
+endef
+
+define Package/libmilter-sendmail/install
+       $(INSTALL_DIR) $(1)/usr/lib
+       $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmilter.so* $(1)/usr/lib/
+endef
+
+#define Package/sendmail/install
+#      $(INSTALL_DIR) $(1)/etc/mail $(1)/usr/bin $(1)/usr/sbin
+#      $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/mail/* $(1)/etc/mail/
+#      $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
+#      $(CP) $(PKG_INSTALL_DIR)/usr/sbin/* $(1)/usr/sbin/
+#endef
+
+$(eval $(call BuildPackage,libmilter-sendmail))
+#$(eval $(call BuildPackage,sendmail))
+
diff --git a/mail/sendmail/files/OpenWrt b/mail/sendmail/files/OpenWrt
new file mode 100644 (file)
index 0000000..bdcaad2
--- /dev/null
@@ -0,0 +1,60 @@
+dnl    DO NOT EDIT THIS FILE.
+dnl    Place personal settings in devtools/Site/site.config.m4
+
+define(`confDEPEND_TYPE', `CC-M')
+define(`confCCOPTS_SO', `-fPIC')
+define(`confSM_OS_HEADER', `sm_os_linux')
+define(`confLIBS', `-ldl')
+define(`confEBINDIR', `/usr/sbin')
+define(`confMKDIR', `mkdir')
+APPENDDEF(`confLIBSEARCH', `crypt nsl')
+
+define(`confMTCCOPTS', `-D_REENTRANT')
+define(`confMTLDOPTS', `-lpthread')
+define(`confLDOPTS_SO', `-shared')
+define(`confSONAME',`-soname')
+
+define(`currentuser', esyscmd(`id -nu'))
+define(`currentgroup', esyscmd(`id -ng'))
+
+define(`confDONT_INSTALL_CATMAN',)
+define(`confNO_MAN_BUILD',)
+define(`confINCOWN', currentuser)
+define(`confINCGRP', currentgroup)
+define(`confINCMODE', `644')
+define(`confLIBOWN', currentuser)
+define(`confLIBGRP', currentgroup)
+define(`confLIBMODE', `644')
+define(`confMBINOWN', currentuser)
+define(`confMBINGRP', currentgroup)
+define(`confMBINMODE', `750')
+define(`confSBINOWN', currentuser)
+define(`confSBINGRP', currentgroup)
+define(`confSBINMODE', `755')
+define(`confUBINOWN', currentuser)
+define(`confUBINGRP', currentgroup)
+define(`confUBINMODE', `755')
+define(`confGBINOWN', currentuser)
+define(`confGBINGRP', currentgroup)
+define(`confGBINMODE', `755')
+define(`confMSPQOWN', currentuser)
+
+ifelse(confBLDVARIANT, `DEBUG',
+dnl Debug build
+`
+       define(`confOPTIMIZE',`-g -Wall')
+',
+dnl Optimized build
+confBLDVARIANT, `OPTIMIZED',
+`
+       define(`confOPTIMIZE',`-O2')
+',
+dnl Purify build
+confBLDVARIANT, `PURIFY',
+`
+       define(`confOPTIMIZE',`-g')
+',
+dnl default
+`
+       define(`confOPTIMIZE',`-O2')
+')
diff --git a/mail/sendmail/files/lm_getver.c b/mail/sendmail/files/lm_getver.c
new file mode 100644 (file)
index 0000000..c12d1e7
--- /dev/null
@@ -0,0 +1,9 @@
+#include <stdio.h>
+#include "libmilter/mfapi.h"
+int main() {
+       printf("%d.%d.%d",
+               SM_LM_VRS_MAJOR(SMFI_VERSION),
+               SM_LM_VRS_MINOR(SMFI_VERSION),
+               SM_LM_VRS_PLVL(SMFI_VERSION)
+       );
+}
diff --git a/mail/sendmail/files/sharedlibrary.m4 b/mail/sendmail/files/sharedlibrary.m4
new file mode 100644 (file)
index 0000000..2c131be
--- /dev/null
@@ -0,0 +1,25 @@
+divert(0)dnl
+include(confBUILDTOOLSDIR`/M4/'bldM4_TYPE_DIR`/links.m4')dnl
+bldLIST_PUSH_ITEM(`bldC_PRODUCTS', bldCURRENT_PRODUCT)dnl
+bldPUSH_TARGET(bldCURRENT_PRODUCT.so.confSOVER)dnl
+bldPUSH_INSTALL_TARGET(`install-'bldCURRENT_PRODUCT)dnl
+bldPUSH_CLEAN_TARGET(bldCURRENT_PRODUCT`-clean')dnl
+
+include(confBUILDTOOLSDIR`/M4/'bldM4_TYPE_DIR`/defines.m4')
+divert(bldTARGETS_SECTION)
+
+bldCURRENT_PRODUCT.so.confSOVER: ${BEFORE} ${bldCURRENT_PRODUCT`OBJS'}
+       ${LD} ${LDOPTS_SO} -o bldCURRENT_PRODUCT.so.confSOVER confSONAME bldCURRENT_PRODUCT.so.confSOVER ${bldCURRENT_PRODUCT`OBJS'}
+ifdef(`bldLINK_SOURCES', `bldMAKE_SOURCE_LINKS(bldLINK_SOURCES)')
+
+install-`'bldCURRENT_PRODUCT: bldCURRENT_PRODUCT.so.confSOVER
+
+ifdef(`bldINSTALLABLE', `      ifdef(`confMKDIR', `if [ ! -d ${DESTDIR}${LIBDIR} ]; then confMKDIR -p ${DESTDIR}${LIBDIR}; else :; fi ')
+       ${LN} ${LNOPTS} bldCURRENT_PRODUCT.so.confSOVER ${DESTDIR}${LIBDIR}/bldCURRENT_PRODUCT.so
+       ${INSTALL} -c -m 644 bldCURRENT_PRODUCT.so.confSOVER ${DESTDIR}${LIBDIR}')
+
+bldCURRENT_PRODUCT-clean:
+       rm -f ${OBJS} bldCURRENT_PRODUCT.so* ${MANPAGES}
+
+divert(0)
+COPTS+= confCCOPTS_SO
diff --git a/mail/sendmail/files/site.OpenWrt.m4 b/mail/sendmail/files/site.OpenWrt.m4
new file mode 100644 (file)
index 0000000..9c485e4
--- /dev/null
@@ -0,0 +1,5 @@
+define(`confCC', `TARGET_CC')
+define(`confCCOPTS', `TARGET_CFLAGS')
+APPENDDEF(`confENVDEF',`-DSTARTTLS')
+APPENDDEF(`confLIBS', `-lssl -lcrypto')
+
diff --git a/mail/sendmail/patches/010-enable-nonroot-install.patch b/mail/sendmail/patches/010-enable-nonroot-install.patch
new file mode 100644 (file)
index 0000000..ff6e8b3
--- /dev/null
@@ -0,0 +1,17 @@
+Index: sendmail-8.15.2/cf/cf/Makefile
+===================================================================
+--- sendmail-8.15.2.orig/cf/cf/Makefile
++++ sendmail-8.15.2/cf/cf/Makefile
+@@ -80,10 +80,10 @@ install:
+ install-cf:  install-sendmail-cf install-submit-cf
+ install-sendmail-cf: $(CF).cf
+-      $(INSTALL) -c -o $(CFOWN) -g $(CFGRP) -m $(CFMODE) $(CF).cf ${DESTDIR}$(MAILDIR)/sendmail.cf
++      $(INSTALL) -c -m $(CFMODE) $(CF).cf ${DESTDIR}$(MAILDIR)/sendmail.cf
+ install-submit-cf: $(SUBMIT).cf
+-      $(INSTALL) -c -o $(CFOWN) -g $(CFGRP) -m $(CFMODE) $(SUBMIT).cf ${DESTDIR}$(MAILDIR)/submit.cf
++      $(INSTALL) -c -m $(CFMODE) $(SUBMIT).cf ${DESTDIR}$(MAILDIR)/submit.cf
+ depend:
diff --git a/mail/sendmail/patches/011-libmilter-so-version.patch b/mail/sendmail/patches/011-libmilter-so-version.patch
new file mode 100644 (file)
index 0000000..fdd5eee
--- /dev/null
@@ -0,0 +1,16 @@
+Index: sendmail-8.15.2/libmilter/Makefile.m4
+===================================================================
+--- sendmail-8.15.2.orig/libmilter/Makefile.m4
++++ sendmail-8.15.2/libmilter/Makefile.m4
+@@ -9,7 +9,10 @@ define(`confMT', `true')
+ SMSRCDIR=ifdef(`confSMSRCDIR', `confSMSRCDIR', `${SRCDIR}/sendmail')
+ PREPENDDEF(`confINCDIRS', `-I${SMSRCDIR} ')
+-bldPRODUCT_START(`library', `libmilter')
++# obtain libmilter version
++define(`confSOVER', `esyscmd(`gcc -I../include -o lm_getver lm_getver.c && ./lm_getver')')
++
++bldPRODUCT_START(`sharedlibrary', `libmilter')
+ define(`bldINSTALLABLE', `true')
+ define(`LIBMILTER_EXTRAS', `errstring.c strl.c')
+ APPENDDEF(`confENVDEF', `-DNOT_SENDMAIL -Dsm_snprintf=snprintf')
diff --git a/mail/sendmail/patches/100-misc-os-musl-fixes.patch b/mail/sendmail/patches/100-misc-os-musl-fixes.patch
new file mode 100644 (file)
index 0000000..dbe1517
--- /dev/null
@@ -0,0 +1,49 @@
+--- a/include/sm/conf.h
++++ b/include/sm/conf.h
+@@ -57,7 +57,7 @@
+ # endif /* ! HASNICE */
+ # ifndef HASRRESVPORT
+-#  define HASRRESVPORT        1       /* has rrsevport(3) call */
++#  define HASRRESVPORT        0       /* has rrsevport(3) call */
+ # endif /* ! HASRRESVPORT */
+ /**********************************************************************
+@@ -1470,7 +1470,9 @@ extern void              *malloc();
+ #  define SM_CONF_GETOPT      0       /* need a replacement for getopt(3) */
+ #  define HASUNAME    1       /* use System V uname(2) system call */
+ #  define HASUNSETENV 1       /* has unsetenv(3) call */
+-#  define ERRLIST_PREDEFINED  /* don't declare sys_errlist */
++#  ifdef __GLIBC__
++#   define ERRLIST_PREDEFINED /* don't declare sys_errlist */
++#  endif /* __GLIBC__ */
+ #  define GIDSET_T    gid_t   /* from <linux/types.h> */
+ #  ifndef HASGETUSERSHELL
+ #   define HASGETUSERSHELL 0  /* getusershell(3) broken in Slackware 2.0 */
+@@ -1508,6 +1510,7 @@ extern void              *malloc();
+ #  if defined(__GLIBC__) && defined(__GLIBC_MINOR__)
+ #   define HASSTRERROR        1       /* has strerror(3) */
+ #  endif /* defined(__GLIBC__) && defined(__GLIBC_MINOR__) */
++#  define HASSTRERROR 1       /* Patch for LEDE/OpenWRT: has strerror(3) */
+ #  ifndef TZ_TYPE
+ #   define TZ_TYPE    TZ_NONE         /* no standard for Linux */
+ #  endif /* ! TZ_TYPE */
+--- a/devtools/bin/Build
++++ b/devtools/bin/Build
+@@ -320,6 +320,16 @@ then
+       rel=`/usr/apollo/bin/bldt | grep Domain | awk '{ print $4 }' | sed -e 's/,//g'`
+ fi
++#
++# LEDE/OpenWrt build system
++#
++if [ -n "$STAGING_DIR" -a -n "$OPENWRT_BUILD" ]
++then
++      os="OpenWrt"
++      rel="any"
++      arch="any"
++fi
++
+ if [ ! "$arch" -a ! "$os" -a ! "$rel" ]
+ then
+       arch=`uname -m | sed -e 's/ //g' -e 's/\//-/g'`
diff --git a/mail/sendmail/patches/101-fix-format-security.patch b/mail/sendmail/patches/101-fix-format-security.patch
new file mode 100644 (file)
index 0000000..f559d96
--- /dev/null
@@ -0,0 +1,109 @@
+Index: sendmail-8.15.2/sendmail/envelope.c
+===================================================================
+--- sendmail-8.15.2.orig/sendmail/envelope.c
++++ sendmail-8.15.2/sendmail/envelope.c
+@@ -323,7 +323,7 @@ dropenvelope(e, fulldrop, split)
+                       /* don't free, allocated from e_rpool */
+                       e->e_message = sm_rpool_strdup_x(e->e_rpool, buf);
+-                      message(buf);
++                      message("%s", buf);
+                       e->e_flags |= EF_CLRQUEUE;
+               }
+               if (msg_timeout == MSG_NOT_BY)
+@@ -420,7 +420,7 @@ dropenvelope(e, fulldrop, split)
+                               /* don't free, allocated from e_rpool */
+                               e->e_message = sm_rpool_strdup_x(e->e_rpool,
+                                                                buf);
+-                              message(buf);
++                              message("%s", buf);
+                               e->e_flags |= EF_WARNING;
+                       }
+                       if (msg_timeout == MSG_WARN_BY)
+Index: sendmail-8.15.2/sendmail/parseaddr.c
+===================================================================
+--- sendmail-8.15.2.orig/sendmail/parseaddr.c
++++ sendmail-8.15.2/sendmail/parseaddr.c
+@@ -218,7 +218,7 @@ parseaddr(addr, a, flags, delim, delimpt
+                       msg = "Deferring message until queue run";
+               if (tTd(20, 1))
+                       sm_dprintf("parseaddr: queueing message\n");
+-              message(msg);
++              message("%s", msg);
+               if (e->e_message == NULL && e->e_sendmode != SM_DEFER)
+                       e->e_message = sm_rpool_strdup_x(e->e_rpool, msg);
+               a->q_state = QS_QUEUEUP;
+Index: sendmail-8.15.2/sendmail/srvrsmtp.c
+===================================================================
+--- sendmail-8.15.2.orig/sendmail/srvrsmtp.c
++++ sendmail-8.15.2/sendmail/srvrsmtp.c
+@@ -578,13 +578,13 @@ static bool      smtp_data __P((SMTP_T *, ENV
+                               bool tsave = QuickAbort;                \
+                                                                       \
+                               QuickAbort = false;                     \
+-                              usrerr(response);                       \
++                              usrerr("%s", response);                 \
+                               QuickAbort = tsave;                     \
+                               e->e_sendqueue = NULL;                  \
+                               goto doquit;                            \
+                       }                                               \
+                       else                                            \
+-                              usrerr(response);                       \
++                              usrerr("%s", response);                 \
+                       break;                                          \
+                                                                       \
+                 case SMFIR_REJECT:                                    \
+@@ -615,7 +615,7 @@ static bool        smtp_data __P((SMTP_T *, ENV
+                                         str, addr, MSG_TEMPFAIL);     \
+                               LogUsrErrs = false;                     \
+                       }                                               \
+-                      usrerr(MSG_TEMPFAIL);                           \
++                      usrerr("%s", MSG_TEMPFAIL);                             \
+                       break;                                          \
+                 default:                                              \
+                       milter_cmd_fail = false;                        \
+@@ -931,7 +931,7 @@ smtp(nullserver, d_flags, e)
+       }
+       else if (strncmp(nullserver, "421 ", 4) == 0)
+       {
+-              message(nullserver);
++              message("%s", nullserver);
+               goto doquit;
+       }
+@@ -1849,7 +1849,7 @@ smtp(nullserver, d_flags, e)
+                               if (nullserver != NULL)
+                               {
+                                       if (ISSMTPREPLY(nullserver))
+-                                              usrerr(nullserver);
++                                              usrerr("%s", nullserver);
+                                       else
+                                               usrerr("550 5.0.0 %s",
+                                                      nullserver);
+@@ -2452,7 +2452,7 @@ smtp(nullserver, d_flags, e)
+                                       tempfail = true;
+                                       smtp.sm_milterize = false;
+                                       if (response != NULL)
+-                                              usrerr(response);
++                                              usrerr("%s", response);
+                                       else
+                                               message("421 4.7.0 %s closing connection",
+                                                       MyHostName);
+@@ -3659,7 +3659,7 @@ smtp_data(smtp, e)
+                               (void) extenhsc(response + 4, ' ', e->e_enhsc);
+ #endif /* _FFR_MILTER_ENHSC */
+-                      usrerr(response);
++                      usrerr("%s", response);
+                       if (strncmp(response, "421 ", 4) == 0
+                           || strncmp(response, "421-", 4) == 0)
+                       {
+@@ -3779,7 +3779,7 @@ smtp_data(smtp, e)
+                       if (ISSMTPCODE(response))
+                               (void) extenhsc(response + 4, ' ', e->e_enhsc);
+ #endif /* _FFR_MILTER_ENHSC */
+-                      usrerr(response);
++                      usrerr("%s", response);
+                       if (strncmp(response, "421 ", 4) == 0
+                           || strncmp(response, "421-", 4) == 0)
+                               rv = false;
diff --git a/mail/sendmail/patches/102-pthreads-stack-size.patch b/mail/sendmail/patches/102-pthreads-stack-size.patch
new file mode 100644 (file)
index 0000000..a2e10d6
--- /dev/null
@@ -0,0 +1,48 @@
+This patch increases the stack size for pthreads from 80 KB, the default
+stack size for musl libc, to 2 MB. The default stack size for glibc is 8 MB.
+
+OpenDKIM, an application that depends on libmilter, segfaults if the stack
+size for pthreads is left unchanged at the musl default value of 80 KB.
+Apparently, OpenDKIM allocates blocks of 64 KB multiple times, which causes
+libmilter and therefore OpenDKIM to crash:
+https://git.alpinelinux.org/cgit/aports/commit/?id=95724d1bd53ae87f72e6388cb7323dbd8f84be9d
+
+This patch follows the patch suggested by an Alpine Linux user in bug report
+above. Also, a bug report has been filed upstream:
+https://sourceforge.net/p/opendkim/bugs/258/
+
+
+Index: sendmail-8.15.2/libmilter/libmilter.h
+===================================================================
+--- sendmail-8.15.2.orig/libmilter/libmilter.h
++++ sendmail-8.15.2/libmilter/libmilter.h
+@@ -127,10 +127,10 @@ struct smfi_str
+ # define MI_SOCK_READ(s, b, l)        read(s, b, l)
+ # define MI_SOCK_READ_FAIL(x) ((x) < 0)
+ # define MI_SOCK_WRITE(s, b, l)       write(s, b, l)
+-
+-# define thread_create(ptid,wr,arg) pthread_create(ptid, NULL, wr, arg)
+ # define sthread_get_id()     pthread_self()
++extern int thread_create(pthread_t *ptid, void *(*wr) (void *), void *arg);
++
+ typedef pthread_mutex_t smutex_t;
+ # define smutex_init(mp)      (pthread_mutex_init(mp, NULL) == 0)
+ # define smutex_destroy(mp)   (pthread_mutex_destroy(mp) == 0)
+Index: sendmail-8.15.2/libmilter/main.c
+===================================================================
+--- sendmail-8.15.2.orig/libmilter/main.c
++++ sendmail-8.15.2/libmilter/main.c
+@@ -16,6 +16,12 @@ SM_RCSID("@(#)$Id: main.c,v 8.85 2013-11
+ #include <fcntl.h>
+ #include <sys/stat.h>
++int thread_create(pthread_t *ptid, void *(*wr) (void *), void *arg) {
++      pthread_attr_t attr;
++      pthread_attr_init(&attr);
++      pthread_attr_setstacksize(&attr,2*1024*1024);
++      return pthread_create(ptid, &attr, wr, arg);
++}
+ static smfiDesc_ptr smfi = NULL;
diff --git a/mail/sendmail/patches/103-create-install-dirs.patch b/mail/sendmail/patches/103-create-install-dirs.patch
new file mode 100644 (file)
index 0000000..fa99810
--- /dev/null
@@ -0,0 +1,42 @@
+--- a/sendmail/Makefile.m4
++++ b/sendmail/Makefile.m4
+@@ -71,6 +71,7 @@ install-set-user-id: bldCURRENT_PRODUCT
+       ${INSTALL} -c -o ${S`'BINOWN} -g ${S`'BINGRP} -m ${S`'BINMODE} bldCURRENT_PRODUCT ${DESTDIR}${M`'BINDIR}
+       for i in ${sendmailTARGET_LINKS}; do \
+               rm -f $$i; \
++              mkdir -p $$(dirname $$i); \
+               ${LN} ${LNOPTS} ${M`'BINDIR}/sendmail $$i; \
+       done
+@@ -79,6 +80,7 @@ install-sm-mta: bldCURRENT_PRODUCT
+       ${INSTALL} -c -o ${M`'BINOWN} -g ${M`'BINGRP} -m ${M`'BINMODE} bldCURRENT_PRODUCT ${DESTDIR}${M`'BINDIR}/sm-mta
+       for i in confMTA_LINKS; do \
+               rm -f $$i; \
++              mkdir -p $$(dirname $$i); \
+               ${LN} ${LNOPTS} ${M`'BINDIR}/sm-mta $$i; \
+       done
+--- a/devtools/M4/UNIX/links.m4
++++ b/devtools/M4/UNIX/links.m4
+@@ -23,6 +23,7 @@ define(`bldMAKE_SOURCE_LINKS',
+ define(`bldMAKE_TARGET_LINKS',
+ `     for i in $2; do \
+               rm -f $$i; \
++              mkdir -p $$(dirname $$i); \
+               ln -s $1 $$i; \
+       done'
+ )dnl
+--- a/cf/cf/Makefile
++++ b/cf/cf/Makefile
+@@ -80,9 +80,11 @@ install:
+ install-cf:  install-sendmail-cf install-submit-cf
+ install-sendmail-cf: $(CF).cf
++      mkdir -p ${DESTDIR}$(MAILDIR)
+       $(INSTALL) -c -m $(CFMODE) $(CF).cf ${DESTDIR}$(MAILDIR)/sendmail.cf
+ install-submit-cf: $(SUBMIT).cf
++      mkdir -p ${DESTDIR}$(MAILDIR)
+       $(INSTALL) -c -m $(CFMODE) $(SUBMIT).cf ${DESTDIR}$(MAILDIR)/submit.cf
+ depend:
index 0ab9c3991873e8ff18db321cfb0eb41136854290..d499b17694a1cdfe6493de97377db294e4107cd6 100644 (file)
@@ -215,12 +215,6 @@ PKG_CONFIG_DEPENDS:= \
        $(patsubst %,CONFIG_FFMPEG_CUSTOM_PARSER_%,$(FFMPEG_CUSTOM_PARSERS)) \
        $(patsubst %,CONFIG_FFMPEG_CUSTOM_PROTOCOL_%,$(FFMPEG_CUSTOM_PROTOCOLS))
 
-PKG_BUILD_DEPENDS:= \
-       PACKAGE_shine:shine \
-       PACKAGE_libx264:libx264 \
-       PACKAGE_lame-lib:lame-lib \
-       PACKAGE_libopus:libopus
-
 include $(INCLUDE_DIR)/package.mk
 
 define Package/ffmpeg/Default
index 3791eacc2c067bb05a288df7b184134391e2229e..6fdbce2b35428d15fb7691b36cc3453d50a0ca7e 100644 (file)
@@ -8,7 +8,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=grilo-plugins
-PKG_VERSION:=0.3.2
+PKG_VERSION:=0.3.5
 PKG_RELEASE:=1
 
 PKG_MAINTAINER:=W. Michael Petullo <mike@flyn.org>
@@ -18,7 +18,7 @@ PKG_LICENSE_FILES:=COPYING
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=@GNOME/grilo-plugins/0.3/
-PKG_HASH:=791b89289781272c001545931a8f58f499d14e46e038a9caa82dfe2494301afd
+PKG_HASH:=2977827b8ecb3e15535236180e57dc35e85058d111349bdb6a1597e62a5068fb
 
 PKG_BUILD_DEPENDS:=glib2 grilo
 
diff --git a/multimedia/grilo-plugins/patches/0001-dmap-Add-album-disc-number-mapping.patch b/multimedia/grilo-plugins/patches/0001-dmap-Add-album-disc-number-mapping.patch
deleted file mode 100644 (file)
index 89c3656..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-From 3cd7fb6af73ca7fdef2557ad31b5c4180534d775 Mon Sep 17 00:00:00 2001
-From: "W. Michael Petullo" <mike@flyn.org>
-Date: Sat, 9 Jul 2016 09:50:00 -0400
-Subject: [PATCH] dmap: Add album disc number mapping
-
-Signed-off-by: W. Michael Petullo <mike@flyn.org>
----
- src/dmap/grl-daap-db.c | 7 +++++++
- src/dmap/grl-daap.c    | 1 +
- 2 files changed, 8 insertions(+)
-
-diff --git a/src/dmap/grl-daap-db.c b/src/dmap/grl-daap-db.c
-index 4850073..5bcd804 100644
---- a/src/dmap/grl-daap-db.c
-+++ b/src/dmap/grl-daap-db.c
-@@ -161,6 +161,7 @@ grl_daap_db_add (DMAPDb *_db, DMAPRecord *_record)
-   gint   duration = 0;
-   gint32  bitrate = 0,
-+             disc = 0,
-             track = 0;
-   gchar  *id_s    = NULL,
-          *title   = NULL,
-@@ -186,6 +187,8 @@ grl_daap_db_add (DMAPDb *_db, DMAPRecord *_record)
-                &title,
-                "track",
-                &track,
-+               "disc",
-+               &disc,
-                "location",
-                &url,
-                "has-video",
-@@ -217,6 +220,10 @@ grl_daap_db_add (DMAPDb *_db, DMAPRecord *_record)
-     grl_media_set_bitrate      (media, bitrate);
-     grl_media_set_track_number (media, track);
-+    if (disc != 0) {
-+      grl_media_set_album_disc_number (media, disc);
-+    }
-+
-     if (album) {
-       grl_media_set_album (media, album);
-     }
-diff --git a/src/dmap/grl-daap.c b/src/dmap/grl-daap.c
-index 59aa981..796234d 100644
---- a/src/dmap/grl-daap.c
-+++ b/src/dmap/grl-daap.c
-@@ -365,6 +365,7 @@ grl_daap_source_supported_keys (GrlSource *source)
-   if (!keys) {
-     keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ALBUM,
-+                                      GRL_METADATA_KEY_ALBUM_DISC_NUMBER,
-                                       GRL_METADATA_KEY_ARTIST,
-                                       GRL_METADATA_KEY_BITRATE,
-                                       GRL_METADATA_KEY_DURATION,
--- 
-2.7.4
-
diff --git a/multimedia/grilo-plugins/patches/001-grilo-plugins-0.3.5-no-itstool-xmllint.patch b/multimedia/grilo-plugins/patches/001-grilo-plugins-0.3.5-no-itstool-xmllint.patch
new file mode 100644 (file)
index 0000000..af60233
--- /dev/null
@@ -0,0 +1,122 @@
+diff -u --recursive grilo-plugins-0.3.5-vanilla/configure grilo-plugins-0.3.5/configure
+--- grilo-plugins-0.3.5-vanilla/configure      2018-01-07 21:45:18.874540074 -0500
++++ grilo-plugins-0.3.5/configure      2018-01-07 21:46:31.145749381 -0500
+@@ -638,8 +638,6 @@
+ LTLIBOBJS
+ LIBOBJS
+ YELP_HELP_RULES
+-XMLLINT
+-ITSTOOL
+ HELP_DIR
+ YELP_LC_DIST
+ YELP_LC_MEDIA_LINKS
+@@ -1084,9 +1082,7 @@
+ GOM_CFLAGS
+ GOM_LIBS
+ TRACKER_SPARQL_CFLAGS
+-TRACKER_SPARQL_LIBS
+-ITSTOOL
+-XMLLINT'
++TRACKER_SPARQL_LIBS'
+ # Initialize some variables set by options.
+@@ -1855,8 +1851,6 @@
+               C compiler flags for TRACKER_SPARQL, overriding pkg-config
+   TRACKER_SPARQL_LIBS
+               linker flags for TRACKER_SPARQL, overriding pkg-config
+-  ITSTOOL     Path to the `itstool` command
+-  XMLLINT     Path to the `xmllint` command
+ Use these variables to override the choices made by `configure' or to help
+ it to find libraries and programs with nonstandard names/locations.
+@@ -16976,89 +16970,6 @@
+-# Extract the first word of "itstool", so it can be a program name with args.
+-set dummy itstool; ac_word=$2
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+-$as_echo_n "checking for $ac_word... " >&6; }
+-if ${ac_cv_prog_ITSTOOL+:} false; then :
+-  $as_echo_n "(cached) " >&6
+-else
+-  if test -n "$ITSTOOL"; then
+-  ac_cv_prog_ITSTOOL="$ITSTOOL" # Let the user override the test.
+-else
+-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+-for as_dir in $PATH
+-do
+-  IFS=$as_save_IFS
+-  test -z "$as_dir" && as_dir=.
+-    for ac_exec_ext in '' $ac_executable_extensions; do
+-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+-    ac_cv_prog_ITSTOOL="itstool"
+-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+-    break 2
+-  fi
+-done
+-  done
+-IFS=$as_save_IFS
+-
+-fi
+-fi
+-ITSTOOL=$ac_cv_prog_ITSTOOL
+-if test -n "$ITSTOOL"; then
+-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ITSTOOL" >&5
+-$as_echo "$ITSTOOL" >&6; }
+-else
+-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+-$as_echo "no" >&6; }
+-fi
+-
+-
+-if test x"$ITSTOOL" = x; then
+-  as_fn_error $? "itstool not found" "$LINENO" 5
+-fi
+-
+-
+-# Extract the first word of "xmllint", so it can be a program name with args.
+-set dummy xmllint; ac_word=$2
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+-$as_echo_n "checking for $ac_word... " >&6; }
+-if ${ac_cv_prog_XMLLINT+:} false; then :
+-  $as_echo_n "(cached) " >&6
+-else
+-  if test -n "$XMLLINT"; then
+-  ac_cv_prog_XMLLINT="$XMLLINT" # Let the user override the test.
+-else
+-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+-for as_dir in $PATH
+-do
+-  IFS=$as_save_IFS
+-  test -z "$as_dir" && as_dir=.
+-    for ac_exec_ext in '' $ac_executable_extensions; do
+-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+-    ac_cv_prog_XMLLINT="xmllint"
+-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+-    break 2
+-  fi
+-done
+-  done
+-IFS=$as_save_IFS
+-
+-fi
+-fi
+-XMLLINT=$ac_cv_prog_XMLLINT
+-if test -n "$XMLLINT"; then
+-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XMLLINT" >&5
+-$as_echo "$XMLLINT" >&6; }
+-else
+-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+-$as_echo "no" >&6; }
+-fi
+-
+-
+-if test x"$XMLLINT" = x; then
+-  as_fn_error $? "xmllint not found" "$LINENO" 5
+-fi
+-
+ YELP_HELP_RULES='
+ HELP_ID ?=
+ HELP_POT ?=
index 80bd615ec5073ad1e24bc1930b6aaf314082a02c..67e05f1689264b1574deae4a8f3d6112fa756d3e 100644 (file)
@@ -8,7 +8,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=grilo
-PKG_VERSION:=0.3.1
+PKG_VERSION:=0.3.4
 PKG_RELEASE:=1
 
 PKG_MAINTAINER:=W. Michael Petullo <mike@flyn.org>
@@ -18,7 +18,7 @@ PKG_LICENSE_FILES:=COPYING
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=@GNOME/grilo/0.3/
-PKG_HASH:=ebbdc61dc7920a8cac436895e8625a0ee64d6a4b352987fb5d361ef87243cd4c
+PKG_HASH:=7c6964053b42574c2f14715d2392a02ea5cbace955eb73e067c77aa3e43b066e
 
 PKG_BUILD_DEPENDS:=glib2 libsoup libxml2
 
index b0b00df00ca45aae7380be8540e3aac17aefedd6..27e3a3330ccef59ad53319d0ac5dae7fd654df4a 100644 (file)
@@ -109,8 +109,6 @@ PKG_CONFIG_DEPENDS:= \
        $(patsubst %,CONFIG_GST1_LIBAV_PARSER_%,$(LIBAV_PARSERS)) \
        $(patsubst %,CONFIG_GST1_LIBAV_PROTOCOL_%,$(LIBAV_PROTOCOLS))
 
-PKG_BUILD_DEPENDS:= libgstreamer1 gstreamer1-plugins-base
-
 include $(INCLUDE_DIR)/package.mk
 include $(INCLUDE_DIR)/nls.mk
 
index ab9f61ef8c51caf03bf80d81246ebb5935726fd8..d35fde0084dfc86e82e861011f06aa0c8a099113 100644 (file)
@@ -22,8 +22,6 @@ PKG_SOURCE:=gst-plugins-bad-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=http://gstreamer.freedesktop.org/src/gst-plugins-bad/
 PKG_HASH:=c5806040bb83b43be86ce592e6a19c5d83d7776f7d9f434eb4b911c4efff3573
 
-PKG_BUILD_DEPENDS:= libgstreamer1 gst1-plugins-base libgst1basecamerabinsrc libgst1photography libgst1adaptivedemux libgst1uridownloader libgst1badbase
-
 PKG_FIXUP:=autoreconf
 PKG_INSTALL:=1
 
index cf52c7b1e1b4864dc20913a01f0cc8ee09f18aed..6a1c4e817e83d9a132e85488b7a1dfa94322781e 100644 (file)
@@ -22,7 +22,6 @@ PKG_SOURCE:=gst-plugins-base-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=http://gstreamer.freedesktop.org/src/gst-plugins-base/
 PKG_HASH:=1c401a79bd1e4521c6ef1b66579bddedd9136e164e54792aab4bfcf3485bf9a7
 
-PKG_BUILD_DEPENDS:= libgstreamer1
 PKG_CONFIG_DEPENDS:= \
        CONFIG_PACKAGE_gst1-mod-alsa \
        CONFIG_PACKAGE_gst1-mod-app \
index 514e759e083fef56e859a315dc3cf1543d46ab75..ec1b00854258785559abde891fcc2f4dcef5704b 100644 (file)
@@ -22,8 +22,6 @@ PKG_SOURCE:=gst-plugins-good-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=http://gstreamer.freedesktop.org/src/gst-plugins-good/
 PKG_HASH:=be053f6ed716eeb517cec148cec637cdce571c6e04d5c21409e2876fb76c7639
 
-PKG_BUILD_DEPENDS:= libgstreamer1 gst1-plugins-base
-
 PKG_FIXUP:=autoreconf
 PKG_INSTALL:=1
 
index a85230663b3a903d2217682c2e35568d345c453a..e9d4052f003601e81460f2e6cd8d290bf892a5e5 100644 (file)
@@ -22,7 +22,6 @@ PKG_SOURCE:=gst-plugins-ugly-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=http://gstreamer.freedesktop.org/src/gst-plugins-ugly/
 PKG_HASH:=d6edc046350809c967f5b058c5c2e534d99d1d69fe1b26acd849e87781a7d7fc
 
-PKG_BUILD_DEPENDS:= libgstreamer1 gstreamer1-plugins-base
 PKG_CONFIG_DEPENDS:= \
        CONFIG_PACKAGE_gst1-mod-asf \
        CONFIG_PACKAGE_gst1-mod-lame \
index 9f9fcd4b9e1f57ebccf3693344dff92c563fe16a..d4994ece6f10efa80f0ec587763d01c478f486cc 100644 (file)
@@ -19,7 +19,7 @@ PKG_LICENSE_FILES:=COPYING
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://www.flyn.org/projects/lcdgrilo
 PKG_HASH:=f5e6635864bd2156557e894ab0f95ea50c01fefebb6225d9b39c95622efd67a2
-PKG_BUILD_DEPENDS:=+vala
+PKG_BUILD_DEPENDS:=vala
 
 PKG_INSTALL:=1
 
diff --git a/multimedia/v4l2rtspserver/Makefile b/multimedia/v4l2rtspserver/Makefile
new file mode 100644 (file)
index 0000000..9d442ec
--- /dev/null
@@ -0,0 +1,85 @@
+#
+# Copyright (C) 2017 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+
+include $(TOPDIR)/rules.mk
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL:=https://github.com/mpromonet/v4l2rtspserver.git
+PKG_SOURCE_VERSION:=d7e8dd4d35a802219222642a2e3b28f2dc5069c1
+PKG_DATE:=2017-12-20
+
+PKG_NAME:=v4l2rtspserver
+PKG_VERSION:=$(PKG_DATE)-$(PKG_SOURCE_VERSION)
+PKG_RELEASE:=1
+PKG_MAINTAINER:=Roger Dammit <rogerdammit@gmail.com>
+
+LIVE555_VERSION:=2017.10.28
+LIVE555_MD5SUM:=a5acd14c4fa7b50f7270304d3b4a70ae
+LIVE555_FILE:=live.$(LIVE555_VERSION).tar.gz
+
+CMAKE_INSTALL:=1 
+
+include $(INCLUDE_DIR)/package.mk
+include $(INCLUDE_DIR)/cmake.mk
+
+define Package/v4l2rtspserver
+       SECTION:=multimedia
+       CATEGORY:=Multimedia
+       TITLE:=v4l2rtspserver
+       DEPENDS:=+libstdcpp
+       URL:=https://github.com/mpromonet/v4l2rtspserver
+endef  
+
+define Package/v4l2rtspserver/description
+       RTSP server for v4L2 video sources
+endef
+
+define Package/v4l2rtspserver/conffiles
+       /etc/config/v4l2rtspserver
+endef
+
+define Download/live555
+       URL:=https://download.videolan.org/pub/contrib/live555/
+       FILE:=$(LIVE555_FILE)
+       MD5SUM:=$(LIVE555_MD5SUM)
+endef
+
+define Build/Prepare
+       $(Build/Prepare/Default)
+
+       ## need to compile some dependencies so that cmake will find them
+
+       # build live555
+        $(eval $(call Download,live555))
+
+       mkdir -p $(PKG_BUILD_DIR)/live555
+       $(TAR) -xf $(DL_DIR)/$(LIVE555_FILE) --strip=1 -C $(PKG_BUILD_DIR)/live555
+       $(CP) files/config.openwrt $(PKG_BUILD_DIR)/live555
+       ( cd $(PKG_BUILD_DIR)/live555; ./genMakefiles openwrt )
+
+       $(MAKE) $(MAKE_FLAGS) -C $(PKG_BUILD_DIR)/live555 
+       $(MAKE) -C $(PKG_BUILD_DIR)/live555 PREFIX="$(STAGING_DIR)/usr/" install
+
+       # build v4l2wrapper
+       $(MAKE) $(MAKE_FLAGS) -C $(PKG_BUILD_DIR)/v4l2wrapper CFLAGS="$(TARGET_CFLAGS) -I $(PKG_BUILD_DIR)/v4l2wrapper/inc"
+       $(CP) $(PKG_BUILD_DIR)/v4l2wrapper/libv4l2wrapper.a $(PKG_BUILD_DIR)
+
+       # patch cmake file
+       $(SED) 's/DEBUG/RELEASE/' $(PKG_BUILD_DIR)/CMakeLists.txt
+endef
+
+define Package/v4l2rtspserver/install
+       $(INSTALL_DIR) $(1)/usr/bin
+       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/v4l2rtspserver-$(PKG_VERSION) $(1)/usr/bin/
+       mv $(1)/usr/bin/v4l2rtspserver-$(PKG_VERSION) $(1)/usr/bin/v4l2rtspserver
+
+       $(INSTALL_DIR) $(1)/etc/init.d
+       $(INSTALL_BIN) files/v4l2rtspserver.init $(1)/etc/init.d/v4l2rtspserver
+       $(INSTALL_DIR) $(1)/etc/config
+       $(INSTALL_CONF) files/v4l2rtspserver.config $(1)/etc/config/v4l2rtspserver
+endef 
+
+$(eval $(call BuildPackage,v4l2rtspserver))
diff --git a/multimedia/v4l2rtspserver/files/config.openwrt b/multimedia/v4l2rtspserver/files/config.openwrt
new file mode 100644 (file)
index 0000000..0c87988
--- /dev/null
@@ -0,0 +1,19 @@
+COMPILE_OPTS =                 $(INCLUDES) -I. -DSOCKLEN_T=socklen_t -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -DLOCALE_NOT_USED -DNO_SSTREAM=1 -DALLOW_RTSP_SERVER_PORT_REUSE=1 
+C =                            c
+C_COMPILER =                   $(GCC)
+CFLAGS +=                      $(COMPILE_OPTS)
+C_FLAGS =                      $(CFLAGS)
+CPP =                          cpp
+CPLUSPLUS_COMPILER =           $(AS) # optimizations are only in AR apparently, so use instead of CXX
+CPLUSPLUS_FLAGS =              $(COMPILE_OPTS) -Wall -DBSD=1
+CPLUSPLUS_FLAGS +=             $(CPPFLAGS) -fexceptions
+OBJ =                          o
+LINK =                         $(CXX) -o
+LINK_OPTS =                    -L. $(LDFLAGS)
+CONSOLE_LINK_OPTS =            $(LINK_OPTS)
+LIBRARY_LINK =                 $(AR) cr 
+LIBRARY_LINK_OPTS =    
+LIB_SUFFIX =                   a
+LIBS_FOR_CONSOLE_APPLICATION = $(CXXLIBS)
+LIBS_FOR_GUI_APPLICATION =     $(LIBS_FOR_CONSOLE_APPLICATION)
+EXE =
diff --git a/multimedia/v4l2rtspserver/files/v4l2rtspserver.config b/multimedia/v4l2rtspserver/files/v4l2rtspserver.config
new file mode 100644 (file)
index 0000000..7561362
--- /dev/null
@@ -0,0 +1,10 @@
+config v4l2rtspserver 'core'
+       option enabled '0'
+       option device '/dev/video0'
+       option port '554'
+       option resolution '640x480'
+       option fps '15'
+       option path 'stream'
+       option username 'openwrt'
+       option password 'openwrt'
+       option format 'h264'
diff --git a/multimedia/v4l2rtspserver/files/v4l2rtspserver.init b/multimedia/v4l2rtspserver/files/v4l2rtspserver.init
new file mode 100644 (file)
index 0000000..e4c837e
--- /dev/null
@@ -0,0 +1,83 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2017 OpenWrt.org
+
+# TODO: 
+# * support start multiple streams with one server
+# * support multiple usernames
+# * support HLS, etc.
+
+START=90
+STOP=10
+
+USE_PROCD=1
+
+SERVICE=v4l2rtspserver
+PROG=/usr/bin/$SERVICE
+
+error() {
+        logger -t "$SERVICE" "$@"
+}
+
+start_instance() {
+       local s="$1"
+
+       config_get_bool enabled "$1" 'enabled' 0
+       [ $enabled -eq 0 ] && return
+
+       # validate device
+       config_get device "$s" 'device'
+       if [ ! -c "$device" ]; then
+               error "device '$device' does not exist"
+               return 1
+       fi
+
+       # get options
+       config_get port "$s" 'port'
+       config_get resolution "$s" 'resolution'
+       config_get fps "$s" 'fps'
+       config_get username "$s" 'username'
+       config_get password "$s" 'password'
+       config_get path "$s" 'path'
+       config_get format "$s" 'format'
+
+       # pull out resolution width and height from string
+       local w="$(echo $resolution | cut -d'x' -f1)"
+       local h="$(echo $resolution | cut -d'x' -f2)"
+       
+       # make sure format is uppercase
+       format="$(echo $format | tr a-z A-Z)"
+
+       # build args
+       local args="-s"
+       args="$args -P $port"
+       args="$args -u ${path}"
+       args="$args -F $fps"
+       args="$args -W $w"
+       args="$args -H $h"
+       args="$args -f$format"
+       args="$args -c" # fixes issue with corrupt frames with H264
+               
+       if [ -n "$username" ]; then
+               args="$args -U ${username}:${password}"
+       fi
+
+       cmd="$PROG $args $device"
+
+       # procd stuff
+       procd_open_instance
+       procd_set_param file /etc/config/$SERVICE
+       procd_set_param command $cmd
+       procd_set_param stdout 1
+       procd_set_param stderr 1
+       procd_add_mdns "rtsp" "tcp" "$port" "daemon=$SERVICE" "path=/$path"
+       procd_close_instance
+}
+
+start_service() {
+       config_load "$SERVICE"
+       config_foreach start_instance "$SERVICE"
+}
+
+service_triggers() {
+       procd_add_reload_trigger "$SERVICE"
+}
index f27b1dda7ac604dc1a42a17ffbc304b19aa5ed9c..346494170b7b90dd40d8da4f5685835af6ac6fba 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2013-2016 OpenWrt.org
+# Copyright (C) 2013-2017 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,8 +8,8 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=xupnpd
-PKG_REV:=5c08c051caa0062cc1c401b2d26d1f36dffe9c55
-PKG_VERSION:=2016-07-06
+PKG_REV:=7ff74b2d5288fbc35c4f6fcb94466d408b1f853c
+PKG_VERSION:=2017-10-31
 PKG_RELEASE:=1
 
 PKG_SOURCE_PROTO:=git
@@ -26,7 +26,7 @@ PKG_MAINTAINER:=Álvaro Fernández Rojas <noltari@gmail.com>
 
 include $(INCLUDE_DIR)/package.mk
 
-LUA_FLAGS:=-llua
+LUA_FLAGS:=-llua -lssl -lcrypto
 
 define Build/Compile
        (cd $(PKG_BUILD_DIR)/src; $(TARGET_CC) -v $(LUA_FLAGS) $(TARGET_CFLAGS) -fno-exceptions -fno-rtti -DWITH_URANDOM $(TARGET_CPPFLAGS) $(TARGET_LDFLAGS) -lm -ldl -lcrypt -o xupnpd *.c *.cpp)
@@ -35,7 +35,7 @@ endef
 define Package/xupnpd
   SECTION:=multimedia
   CATEGORY:=Multimedia
-  DEPENDS:=+liblua
+  DEPENDS:=+liblua +libopenssl
   TITLE:=eXtensible UPnP agent
   URL:=http://xupnpd.org/
 endef
index 28a7feeffe0c0184b8aac27becca19838dc50ebc..e40e18c2b7d7f8fe253135d33263c9515bb0a688 100644 (file)
@@ -1,12 +1,12 @@
 #
-# Copyright (c) 2015-2017 Dirk Brenken (dev@brenken.org)
+# Copyright (c) 2015-2018 Dirk Brenken (dev@brenken.org)
 # This is free software, licensed under the GNU General Public License v3.
 #
 
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=adblock
-PKG_VERSION:=3.1.1
+PKG_VERSION:=3.4.3
 PKG_RELEASE:=1
 PKG_LICENSE:=GPL-3.0+
 PKG_MAINTAINER:=Dirk Brenken <dev@brenken.org>
@@ -16,12 +16,13 @@ include $(INCLUDE_DIR)/package.mk
 define Package/adblock
        SECTION:=net
        CATEGORY:=Network
-       TITLE:=Powerful adblock script to block ad/abuse domains
+       TITLE:=Powerful adblock script to block ad/abuse domains by using DNS
+       DEPENDS:=+jshn +jsonfilter
        PKGARCH:=all
 endef
 
 define Package/adblock/description
-Powerful adblock script to block ad/abuse domains via dnsmasq, unbound or bind dns backend.
+Powerful adblock script to block ad/abuse domains via dnsmasq, unbound, named, kresd or dnscrypt-proxy.
 The script supports many domain blacklist sites plus manual black- and whitelist overrides.
 Please see https://github.com/openwrt/packages/blob/master/net/adblock/files/README.md for further information.
 
@@ -53,6 +54,7 @@ define Package/adblock/install
        $(INSTALL_CONF) ./files/adblock.conf $(1)/etc/config/adblock
 
        $(INSTALL_DIR) $(1)/etc/adblock
+       $(INSTALL_CONF) ./files/adblock.notify $(1)/etc/adblock/
        $(INSTALL_CONF) ./files/adblock.blacklist $(1)/etc/adblock/
        $(INSTALL_CONF) ./files/adblock.whitelist $(1)/etc/adblock/
 endef
index 6b373da52f54eea83e542f418c8d3a91813303b6..71d67ef4f90af3ac04cec99672d9c63543cd5311 100644 (file)
@@ -43,8 +43,6 @@ A lot of people already use adblocker plugins within their desktop browsers, but
     * => regional blocklist for Romania, weekly updates, approx. 600 entries
     * [reg_ru](https://code.google.com/p/ruadlist)
     * => regional blocklist for Russia, weekly updates, approx. 2.000 entries
-    * [securemecca](http://www.securemecca.com)
-    * => infrequent updates, approx. 25.000 entries
     * [shallalist](http://www.shallalist.de) (categories "adv" "costtraps" "spyware" "tracker" "warez" enabled by default)
     * => daily updates, approx. 32.000 entries (a short description of all shallalist categories can be found [online](http://www.shallalist.de/categories.html))
     * [spam404](http://www.spam404.com)
@@ -64,7 +62,7 @@ A lot of people already use adblocker plugins within their desktop browsers, but
 * zero-conf like automatic installation & setup, usually no manual changes needed
 * simple but yet powerful adblock engine: adblock does not use error prone external iptables rulesets, http pixel server instances and things like that
 * supports five different dns backends / blocklist formats: dnsmasq, unbound, named (bind), kresd and dnscrypt-proxy
-* automatically selects uclient-fetch or wget as download utility (other tools like curl or aria2c are supported as well)
+* supports six different download utilities: uclient-fetch, wget, curl, aria2c, wget-nossl, busybox-wget
 * provides 'http only' mode without installed ssl library for all non-SSL blocklist sources
 * supports a wide range of router modes, even AP modes are supported
 * full IPv4 and IPv6 support
@@ -76,6 +74,7 @@ A lot of people already use adblocker plugins within their desktop browsers, but
 * minimal status & error logging to syslog, enable debug logging to receive more output
 * procd based init system support (start/stop/restart/reload/suspend/resume/query/status)
 * procd network interface trigger support or classic time based startup
+* keep the dns cache intact after adblock processing (currently supported by unbound and named)
 * conditional dns backend restarts by old/new blocklist comparison with sha256sum (default) or md5sum
 * suspend & resume adblock actions temporarily without blocklist reloading
 * output comprehensive runtime information via LuCI or via 'status' init command
@@ -86,6 +85,7 @@ A lot of people already use adblocker plugins within their desktop browsers, but
 * optional: automatic blocklist backup & restore, they will be used in case of download errors or during startup in backup mode
 * optional: 'backup mode' to re-use blocklist backups during startup, get fresh lists only via reload or restart action
 * optional: 'whitelist mode' to block access to all domains except those explicitly listed in the whitelist file
+* optional: send notification emails in case of a processing error or if the overall domain count is &le; 0
 * optional: add new adblock sources on your own via uci config
 
 ## Prerequisites
@@ -120,31 +120,37 @@ A lot of people already use adblocker plugins within their desktop browsers, but
 * **disable active dns probing in windows 10:** to prevent a yellow exclamation mark on your internet connection icon (which wrongly means connected, but no internet), please change the following registry key/value from "1" to "0" _HKLM\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet\EnableActiveProbing_
 
 ## Further adblock config options
-* usually the pre-configured adblock setup works quite well and no manual config overrides are needed, all listed options apply to the 'global' config section:
+* usually the pre-configured adblock setup works quite well and no manual overrides are needed
+* the following options apply to the 'global' config section:
     * adb\_enabled => main switch to enable/disable adblock service (default: '0', disabled)
     * adb\_debug => enable/disable adblock debug output (default: '0', disabled)
+    * adb\_fetchutil => name of the used download utility: 'uclient-fetch', 'wget', 'curl', 'aria2c', 'wget-nossl'. 'busybox' (default: 'uclient-fetch')
+    * adb\_fetchparm => special config options for the download utility (default: not set)
     * adb\_dns => select the dns backend for your environment: 'dnsmasq', 'unbound', 'named', 'kresd' or 'dnscrypt-proxy' (default: 'dnsmasq')
     * adb\_dnsdir => target directory for the generated blocklist 'adb_list.overall' (default: not set, use dns backend default)
     * adb\_trigger => set the startup trigger to a certain interface, to 'timed' or to 'none' (default: 'wan')
+
+* the following options apply to the 'extra' config section:
     * adb\_triggerdelay => additional trigger delay in seconds before adblock processing begins (default: '1')
-    * adb\_fetch => full path to a dedicated download utility, see example below (default: not set, use wget default)
-    * adb\_fetchparm => options for the download utility, see example below (default: not set, use wget default options)
     * adb\_forcedns => force dns requests to local resolver (default: '0', disabled)
     * adb\_forcesrt => force overall sort on low memory devices with less than 64 MB RAM (default: '0', disabled)
     * adb\_backup_mode => do not automatically update blocklists during startup, use backups instead (default: '0', disabled)
     * adb\_whitelist_mode => block access to all domains except those explicitly listed in the whitelist file (default: '0', disabled)
+    * adb\_dnsflush => flush DNS cache after adblock processing, i.e. enable the old restart behavior (default: '0', disabled)
+    * adb\_notify => send notification emails in case of a processing error or if the overall domain count is &le; 0 (default: '0', disabled)
+    * adb\_notifycnt => Raise minimum domain count email notification trigger (default: '0')
 
 ## Examples
-**change default dns backend to 'unbound':**  
+**change default dns backend to 'unbound':**
 
-Adblock deposits the final blocklist 'adb_list.overall' in '/var/lib/unbound' where unbound can find them in its jail. If you use manual configuration for unbound, then just include the following line in your 'server' clause:
-<pre><code>
-  include: "/var/lib/unbound/adb_list.overall"
-</code></pre>
+Adblock deposits the final blocklist 'adb_list.overall' in '/var/lib/unbound' where unbound can find them in its jail.  
+To preserve the DNS cache after adblock processing you need to install 'unbound-control'.  
   
-**change default dns backend to 'named' (bind):**  
+**change default dns backend to 'named' (bind):**
 
-Adblock deposits the final blocklist 'adb_list.overall' in '/var/lib/bind'. To use the blocklist please modify '/etc/bind/named.conf':
+Adblock deposits the final blocklist 'adb_list.overall' in '/var/lib/bind'.  
+To preserve the DNS cache after adblock processing you need to install & configure 'bind-rdnc'.  
+To use the blocklist please modify '/etc/bind/named.conf':
 <pre><code>
 in the 'options' namespace add:
   response-policy { zone "rpz"; };
@@ -158,58 +164,65 @@ and at the end of the file add:
   };
 </code></pre>
   
-**change default dns backend to 'kresd':**  
+**change default dns backend to 'kresd':**
 
-The knot-resolver (kresd) is only available on turris omnia devices. Adblock deposits the final blocklist 'adb_list.overall' in '/etc/kresd'. To use the blocklist please modify '/etc/config/resolver':
-<pre><code>
-    list rpz_file '/etc/kresd/adb_list.overall'
-</code></pre>
+The knot-resolver (kresd) is only available on Turris Omnia devices.  
+Adblock deposits the final blocklist 'adb_list.overall' in '/etc/kresd', no further configuration needed.
   
-**change default dns backend to 'dnscrypt-proxy':**  
+**change default dns backend to 'dnscrypt-proxy':**
 
-The required 'blacklist' option of dnscrypt-proxy is not enabled by default, because the package will be compiled without plugins support. Take a custom LEDE build with plugins support to use this feature. Adblock deposits the final blocklist 'adb_list.overall' in '/tmp'. To use the blocklist please modify '/etc/config/dnscrypt-proxy' per instance:
+The required 'blacklist' option of dnscrypt-proxy is not enabled by default, because the package will be compiled without plugins support.  
+Take a custom LEDE build with plugins support to use this feature. Adblock deposits the final blocklist 'adb_list.overall' in '/tmp'.  
+To use the blocklist please modify '/etc/config/dnscrypt-proxy' per instance:
 <pre><code>
   list blacklist 'domains:/tmp/adb_list.overall'
 </code></pre>
   
-**configuration for different download utilities:**
-<pre><code>
-wget (default):
-  option adb_fetch '/usr/bin/wget'
-  option adb_fetchparm '--quiet --no-cache --no-cookies --max-redirect=0 --timeout=10 --no-check-certificate -O'
-
-aria2c:
-  option adb_fetch '/usr/bin/aria2c'
-  option adb_fetchparm '-q --timeout=10 --allow-overwrite=true --auto-file-renaming=false --check-certificate=false -o'
+**enable email notification via msmtp:**
 
-uclient-fetch:
-  option adb_fetch '/bin/uclient-fetch'
-  option adb_fetchparm '-q --timeout=10 --no-check-certificate -O'
-
-curl:
-  option adb_fetch '/usr/bin/curl'
-  option adb_fetchparm '-s --connect-timeout 10 --insecure -o'
+To use the email notification you have to install & configure the package 'msmtp'.  
+Modify the file '/etc/msmtprc':
+<pre><code>
+[...]
+defaults
+auth            on
+tls             on
+tls_certcheck   off
+timeout         5
+syslog          LOG_MAIL
+[...]
+account         adb_notify
+host            smtp.gmail.com
+port            587
+from            dev.adblock@gmail.com
+user            dev.adblock
+password        xxx
 </code></pre>
+Edit the file '/etc/adblock/adblock.notify' and change at least the 'mail_receiver'.  
+Finally make this file executable via 'chmod' and test it directly. If no more errors come up you can comment 'mail_debug', too.
   
 **receive adblock runtime information:**
+
 <pre><code>
 /etc/init.d/adblock status
 ::: adblock runtime information
   + adblock_status  : enabled
-  + adblock_version : 3.1.0
-  + overall_domains : 5117
+  + adblock_version : 3.4.0
+  + overall_domains : 5167 (normal/backup mode)
   + fetch_utility   : wget (built-in)
   + dns_backend     : kresd (/etc/kresd)
-  + last_rundate    : 03.11.2017 22:57:41
-  + system_release  : Turris Omnia, OpenWrt omnia 15.05/3.8.4
+  + last_rundate    : 27.12.2017 20:52:35
+  + system_release  : Turris Omnia, OpenWrt omnia 15.05/3.9.1
 </code></pre>
   
 **cronjob for a regular block list update (/etc/crontabs/root):**
+
 <pre><code>
 0 06 * * *    /etc/init.d/adblock reload
 </code></pre>
   
 **blacklist entry (/etc/adblock/adblock.blacklist):**
+
 <pre><code>
 ads.example.com
 
@@ -224,6 +237,7 @@ This entry does not block:
 </code></pre>
   
 **whitelist entry (/etc/adblock/adblock.whitelist):**
+
 <pre><code>
 here.com
 
@@ -236,7 +250,7 @@ This entry does not remove:
   www.adwhere.com
 </code></pre>
   
-**query the active blocklist for a certain (sub-)domain, e.g. for whitelisting:**  
+**query the active blocklist for a certain (sub-)domain, e.g. for whitelisting:**
 
 The query function checks against the submitted (sub-)domain and recurses automatically to the upper top level domain. For every (sub-)domain it returns the first ten relevant results.
 <pre><code>
@@ -255,7 +269,7 @@ The query function checks against the submitted (sub-)domain and recurses automa
   + www-google-analytics.l.google.com
 </code></pre>
   
-**add a new blocklist source:**  
+**add a new blocklist source:**
 
 1. the easy way ...  
 example: https://easylist-downloads.adblockplus.org/rolist+easylist.txt  
index da2f6fe3b8c572c9ca4daa0064355c9335ec97b4..16a3436f1e17ec2cab18f36da0f9708ef7b9405e 100644 (file)
@@ -4,6 +4,7 @@
 config adblock 'global'
        option adb_enabled '0'
        option adb_dns 'dnsmasq'
+       option adb_fetchutil 'uclient-fetch'
        option adb_trigger 'wan'
 
 config adblock 'extra'
@@ -31,7 +32,7 @@ config source 'bitcoin'
        option adb_src_desc 'focus on malicious bitcoin mining sites, infrequent updates, approx. 20 entries'
 
 config source 'blacklist'
-       option enabled '0'
+       option enabled '1'
        option adb_src '/etc/adblock/adblock.blacklist'
        option adb_src_rset '\$0~/^([[:alnum:]_-]+\.){1,}[[:alpha:]]+([[:space:]]|$)/{print tolower(\$1)}'
        option adb_src_desc 'static local domain blacklist, always deny these domains'
@@ -62,7 +63,7 @@ config source 'hphosts'
 
 config source 'malware'
        option enabled '0'
-       option adb_src 'https://mirror.cedia.org.ec/malwaredomains/justdomains'
+       option adb_src 'https://mirror.espoch.edu.ec/malwaredomains/justdomains'
        option adb_src_rset '\$0~/^([[:alnum:]_-]+\.){1,}[[:alpha:]]+([[:space:]]|$)/{print tolower(\$1)}'
        option adb_src_desc 'broad blocklist, daily updates, approx. 18.300 entries'
 
@@ -126,12 +127,6 @@ config source 'reg_ru'
        option adb_src_rset 'BEGIN{FS=\"[|^]\"}\$0~/^\|\|([[:alnum:]_-]+\.){1,}[[:alpha:]]+\^("\\\$third-party")?$/{print tolower(\$3)}'
        option adb_src_desc 'focus on russian ads plus generic easylist additions, weekly updates, approx. 14.500 entries'
 
-config source 'securemecca'
-       option enabled '0'
-       option adb_src 'http://securemecca.com/Downloads/hosts.txt'
-       option adb_src_rset '\$0~/^127\.0\.0\.1[[:space:]]+([[:alnum:]_-]+\.){1,}[[:alpha:]]+([[:space:]]|$)/{print tolower(\$2)}'
-       option adb_src_desc 'broad blocklist, infrequent updates, approx. 13.700 entries'
-
 config source 'shalla'
        option enabled '0'
        option adb_src 'http://www.shallalist.de/Downloads/shallalist.tar.gz'
index d49c6ea2de38f2ae4baccb7491bfc30a0eb8d09a..5ca4d1176a8e9be0af9c5b6f064f95c51d59b06d 100755 (executable)
@@ -12,6 +12,7 @@ EXTRA_HELP="  suspend Suspend adblock processing
 
 adb_init="/etc/init.d/adblock"
 adb_script="/usr/bin/adblock.sh"
+adb_pidfile="/var/run/adblock.pid"
 
 boot()
 {
@@ -33,6 +34,7 @@ start_service()
         fi
         procd_open_instance "adblock"
         procd_set_param command "${adb_script}" "${@}"
+        procd_set_param pidfile "${adb_pidfile}"
         procd_set_param stdout 1
         procd_set_param stderr 1
         procd_close_instance
@@ -57,32 +59,51 @@ restart()
 
 suspend()
 {
+    [ -s "${adb_pidfile}" ] && return 1
     rc_procd "${adb_script}" suspend
 }
 
 resume()
 {
+    [ -s "${adb_pidfile}" ] && return 1
     rc_procd "${adb_script}" resume
 }
 
 query()
 {
+    [ -s "${adb_pidfile}" ] && return 1
     rc_procd "${adb_script}" query "${1}"
 }
 
 status()
 {
-    rc_procd "${adb_script}" status
+    local key keylist value rtfile="$(uci_get adblock.extra.adb_rtfile)"
+
+    rtfile="${rtfile:-"/tmp/adb_runtime.json"}"
+    if [ -s "${rtfile}" ]
+    then
+        printf "%s\n" "::: adblock runtime information"
+        json_load "$(cat "${rtfile}" 2>/dev/null)"
+        json_select data
+        json_get_keys keylist
+        for key in ${keylist}
+        do
+            json_get_var value "${key}"
+            printf "  + %-15s : %s\n" "${key}" "${value}"
+        done
+    else
+        printf "%s\n" "::: no adblock runtime information available"
+    fi
 }
 
 service_triggers()
 {
     local trigger="$(uci_get adblock.global.adb_trigger)"
-    local delay="$(uci_get adblock.global.adb_triggerdelay)"
+    local delay="$(uci_get adblock.extra.adb_triggerdelay)"
 
     if [ "${trigger}" != "none" ] && [ "${trigger}" != "timed" ]
     then
-        PROCD_RELOAD_DELAY=$((${delay:=1} * 1000))
+        PROCD_RELOAD_DELAY=$((${delay:-2} * 1000))
         procd_add_interface_trigger "interface.*.up" "${trigger}" "${adb_init}" start
     fi
     procd_add_reload_trigger "adblock"
diff --git a/net/adblock/files/adblock.notify b/net/adblock/files/adblock.notify
new file mode 100644 (file)
index 0000000..dc5acf5
--- /dev/null
@@ -0,0 +1,56 @@
+#!/bin/sh
+#
+# adblock send mail script for mstmp
+# written by Dirk Brenken (dev@brenken.org)
+# Please note: you have to install and configure the package 'mstmp' before using this script.
+
+# This is free software, licensed under the GNU General Public License v3.
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+LC_ALL=C
+PATH="/usr/sbin:/usr/bin:/sbin:/bin"
+mail_ver="1.0.1"
+mail_daemon="$(command -v msmtp)"
+mail_profile="adb_notify"
+mail_debug="--debug"
+mail_rc=1
+
+if [ ! -x "${mail_daemon}" ]
+then
+    mail_daemon="$(command -v sendmail)"
+fi
+
+if [ -f "/var/log/messages" ]
+then
+    logfile="$(cat /var/log/messages | grep "adblock-")"
+else
+    logfile="$(logread -e "adblock-")"
+fi
+
+# mail header
+#
+mail_sender="no-reply@adblock"
+mail_receiver="!!!ChangeMe!!!"
+mail_topic="adblock notification"
+mail_head="From: ${mail_sender}\nTo: ${mail_receiver}\nSubject: ${mail_topic}\nReply-to: ${mail_sender}\n\n"
+
+# mail body
+#
+mail_text="adblock status, generated at $(date 2>&1)!"
+mail_text="${mail_text}\n++\n++ System Information ++\n++\n$(cat /etc/banner 2>&1)"
+mail_text="${mail_text}\n\n++\n++ Adblock Information ++\n++\n$(/etc/init.d/adblock status 2>&1)"
+mail_text="${mail_text}\n\n++\n++ Logfile Information ++\n++\n${logfile}\n++\n++\n"
+
+# send mail
+#
+if [ -x "${mail_daemon}" ]
+then
+    printf "%b" "${mail_head}${mail_text}" 2>/dev/null | "${mail_daemon}" ${mail_debug} -a "${mail_profile}" "${mail_receiver}" >/dev/null 2>&1
+    mail_rc=${?}
+    logger -p "info" -t "adblock-notify-[${mail_ver}]" "mail sent to '${mail_receiver}' with rc '${mail_rc}'"
+else
+    logger -p "err" -t "adblock-notify-[${mail_ver}]" "msmtp mail daemon not found"
+fi
+
+exit ${mail_rc}
index 209fc00fece3037827c9786c85e190a28d8a49fc..465da07c8a260b70dbe9cf025891cd50dca55a16 100755 (executable)
@@ -10,7 +10,7 @@
 #
 LC_ALL=C
 PATH="/usr/sbin:/usr/bin:/sbin:/bin"
-adb_ver="3.1.1"
+adb_ver="3.4.3"
 adb_sysver="unknown"
 adb_enabled=0
 adb_debug=0
@@ -18,22 +18,27 @@ adb_backup_mode=0
 adb_whitelist_mode=0
 adb_forcesrt=0
 adb_forcedns=0
+adb_notify=0
+adb_notifycnt=0
 adb_triggerdelay=0
 adb_backup=0
 adb_backupdir="/mnt"
-adb_fetch="/usr/bin/wget"
-adb_fetchparm="--quiet --no-cache --no-cookies --max-redirect=0 --timeout=10 --no-check-certificate -O"
+adb_fetchutil="uclient-fetch"
 adb_dns="dnsmasq"
 adb_dnsprefix="adb_list"
 adb_dnsfile="${adb_dnsprefix}.overall"
+adb_dnsflush=0
 adb_whitelist="/etc/adblock/adblock.whitelist"
 adb_rtfile="/tmp/adb_runtime.json"
-adb_hashsum="$(command -v sha256sum)"
-adb_action="${1:-"start"}"
+adb_hashutil="$(command -v sha256sum)"
+adb_hashold=""
+adb_hashnew=""
 adb_cnt=0
 adb_rc=0
+adb_action="${1:-"start"}"
+adb_pidfile="/var/run/adblock.pid"
 
-# f_envload: load adblock environment
+# load adblock environment
 #
 f_envload()
 {
@@ -54,6 +59,13 @@ f_envload()
         adb_sysver="${sys_model}, ${sys_desc}"
     fi
 
+    # check hash utility
+    #
+    if [ ! -x "${adb_hashutil}" ]
+    then
+        adb_hashutil="$(command -v md5sum)"
+    fi
+
     # source in system libraries
     #
     if [ -r "/lib/functions.sh" ] && [ -r "/usr/share/libubox/jshn.sh" ]
@@ -61,7 +73,7 @@ f_envload()
         . "/lib/functions.sh"
         . "/usr/share/libubox/jshn.sh"
     else
-        f_log "error" "system libraries not found"
+        f_log "err" "system libraries not found"
     fi
 
     # parse 'global' and 'extra' section by callback
@@ -103,30 +115,35 @@ f_envload()
     config_load adblock
     config_foreach parse_config source
 
-    # set/check dns backend environment
+    # check dns backend
     #
     case "${adb_dns}" in
         dnsmasq)
+            adb_dnsinstance="${adb_dnsinstance:-"0"}"
             adb_dnsuser="${adb_dnsuser:-"dnsmasq"}"
-            adb_dnsdir="${adb_dnsdir:-"/tmp/dnsmasq.d"}"
-            adb_dnsformat="awk '{print \"local=/\"\$0\"/\"}'"
+            adb_dnsdir="${adb_dnsdir:-"/tmp"}"
+            adb_dnsheader=""
+            adb_dnsformat="awk '{print \"server=/\"\$0\"/\"}'"
             if [ ${adb_whitelist_mode} -eq 1 ]
             then
-                adb_dnsformat="awk '{print \"local=/\"\$0\"/#\"}'"
-                adb_dnsblock="local=/#/"
+                adb_dnsformat="awk '{print \"server=/\"\$0\"/#\"}'"
+                adb_dnsblock="server=/#/"
             fi
-            ;;
+        ;;
         unbound)
+            adb_dnsinstance="${adb_dnsinstance:-"0"}"
             adb_dnsuser="${adb_dnsuser:-"unbound"}"
             adb_dnsdir="${adb_dnsdir:-"/var/lib/unbound"}"
+            adb_dnsheader=""
             adb_dnsformat="awk '{print \"local-zone: \042\"\$0\"\042 static\"}'"
             if [ ${adb_whitelist_mode} -eq 1 ]
             then
                 adb_dnsformat="awk '{print \"local-zone: \042\"\$0\"\042 transparent\"}'"
                 adb_dnsblock="local-zone: \".\" static"
             fi
-            ;;
+        ;;
         named)
+            adb_dnsinstance="${adb_dnsinstance:-"0"}"
             adb_dnsuser="${adb_dnsuser:-"bind"}"
             adb_dnsdir="${adb_dnsdir:-"/var/lib/bind"}"
             adb_dnsheader="\$TTL 2h"$'\n'"@ IN SOA localhost. root.localhost. (1 6h 1h 1w 2h)"$'\n'"  IN NS localhost."
@@ -136,8 +153,9 @@ f_envload()
                 adb_dnsformat="awk '{print \"\"\$0\" CNAME rpz-passthru.\n*.\"\$0\" CNAME rpz-passthru.\"}'"
                 adb_dnsblock="* CNAME ."
             fi
-            ;;
+        ;;
         kresd)
+            adb_dnsinstance="${adb_dnsinstance:-"0"}"
             adb_dnsuser="${adb_dnsuser:-"root"}"
             adb_dnsdir="${adb_dnsdir:-"/etc/kresd"}"
             adb_dnsheader="\$TTL 2h"$'\n'"@ IN SOA localhost. root.localhost. (1 6h 1h 1w 2h)"$'\n'"  IN NS  localhost."
@@ -147,43 +165,42 @@ f_envload()
                 adb_dnsformat="awk '{print \"\"\$0\" CNAME rpz-passthru.\n*.\"\$0\" CNAME rpz-passthru.\"}'"
                 adb_dnsblock="* CNAME ."
             fi
-            ;;
+        ;;
         dnscrypt-proxy)
+            adb_dnsinstance="${adb_dnsinstance:-"0"}"
             adb_dnsuser="${adb_dnsuser:-"nobody"}"
             adb_dnsdir="${adb_dnsdir:-"/tmp"}"
+            adb_dnsheader=""
             adb_dnsformat="awk '{print \$0}'"
-            ;;
+        ;;
     esac
 
     # check adblock status
     #
     if [ ${adb_enabled} -eq 0 ]
     then
-        if [ -s "${adb_dnsdir}/${adb_dnsfile}" ]
-        then
-            f_rmdns
-            f_dnsrestart
-        fi
         f_extconf
-        f_jsnupdate
-        f_log "info " "adblock is currently disabled, please set adb_enabled to '1' to use this service"
+        f_temp
+        f_rmdns
+        f_jsnup
+        f_log "info" "adblock is currently disabled, please set adb_enabled to '1' to use this service"
         exit 0
     fi
 
+    if [ "${adb_dns}" = "dnsmasq" ] && [ ${adb_dnsinstance} -ne 0 ]
+    then
+        adb_dnsfile="${adb_dnsprefix}.overall.${adb_dnsinstance}"
+    fi
+
     if [ -d "${adb_dnsdir}" ] && [ ! -f "${adb_dnsdir}/${adb_dnsfile}" ]
     then
-        > "${adb_dnsdir}/${adb_dnsfile}"
+        printf '%s\n' "${adb_dnsheader}" > "${adb_dnsdir}/${adb_dnsfile}"
     fi
 
-    case "${adb_action}" in
-        start|restart|reload)
-            > "${adb_rtfile}"
-            if [ "${adb_action}" = "start" ] && [ "${adb_trigger}" = "timed" ]
-            then
-                sleep ${adb_triggerdelay}
-            fi
-        ;;
-    esac
+    if [ "${adb_action}" = "start" ] && [ "${adb_trigger}" = "timed" ]
+    then
+        sleep ${adb_triggerdelay}
+    fi
 
     while [ ${cnt} -le 30 ]
     do
@@ -198,11 +215,11 @@ f_envload()
 
     if [ -z "${adb_dns}" ] || [ -z "${adb_dnsformat}" ] || [ ! -x "$(command -v ${adb_dns})" ] || [ ! -d "${adb_dnsdir}" ]
     then
-        f_log "error" "'${adb_dns}' not running, DNS backend not found"
+        f_log "err" "'${adb_dns}' not running, DNS backend not found"
     fi
 }
 
-# f_envcheck: check/set environment prerequisites
+# check environment
 #
 f_envcheck()
 {
@@ -214,77 +231,184 @@ f_envcheck()
 
     # check fetch utility
     #
-    ssl_lib="-"
-    if [ -x "${adb_fetch}" ]
-    then
-        if [ "$(readlink -fn "${adb_fetch}")" = "/usr/bin/wget-nossl" ]
-        then
-            adb_fetchparm="--quiet --no-cache --no-cookies --max-redirect=0 --timeout=10 -O"
-        elif [ "$(readlink -fn "${adb_fetch}")" = "/bin/busybox" ] ||
-            ([ "$(readlink -fn "/bin/wget")" = "/bin/busybox" ] && [ "$(readlink -fn "${adb_fetch}")" != "/usr/bin/wget" ])
-        then
-            adb_fetch="/bin/busybox"
-            adb_fetchparm="-q -O"
-        else
+    case "${adb_fetchutil}" in
+        uclient-fetch)
+            if [ -f "/lib/libustream-ssl.so" ]
+            then
+                adb_fetchparm="${adb_fetchparm:-"--timeout=10 --no-check-certificate -O"}"
+                ssl_lib="libustream-ssl"
+            else
+                adb_fetchparm="${adb_fetchparm:-"--timeout=10 -O"}"
+            fi
+        ;;
+        wget)
+            adb_fetchparm="${adb_fetchparm:-"--no-cache --no-cookies --max-redirect=0 --timeout=10 --no-check-certificate -O"}"
             ssl_lib="built-in"
-        fi
+        ;;
+        wget-nossl)
+            adb_fetchparm="${adb_fetchparm:-"--no-cache --no-cookies --max-redirect=0 --timeout=10 -O"}"
+        ;;
+        busybox)
+            adb_fetchparm="${adb_fetchparm:-"-O"}"
+        ;;
+        curl)
+            adb_fetchparm="${adb_fetchparm:-"--connect-timeout 10 --insecure -o"}"
+            ssl_lib="built-in"
+        ;;
+        aria2c)
+            adb_fetchparm="${adb_fetchparm:-"--timeout=10 --allow-overwrite=true --auto-file-renaming=false --check-certificate=false -o"}"
+            ssl_lib="built-in"
+        ;;
+    esac
+    adb_fetchutil="$(command -v "${adb_fetchutil}")"
+
+    if [ ! -x "${adb_fetchutil}" ] || [ -z "${adb_fetchutil}" ] || [ -z "${adb_fetchparm}" ]
+    then
+        f_log "err" "download utility not found, please install 'uclient-fetch' with 'libustream-mbedtls' or the full 'wget' package"
     fi
-    if [ ! -x "${adb_fetch}" ] && [ "$(readlink -fn "/bin/wget")" = "/bin/uclient-fetch" ]
+    adb_fetchinfo="${adb_fetchutil} (${ssl_lib:-"-"})"
+
+    f_temp
+    f_jsnup "running"
+    f_log "info" "start adblock processing (${adb_action})"
+}
+
+# create temporay files and directories
+#
+f_temp()
+{
+    if [ -z "${adb_tmpdir}" ]
     then
-        adb_fetch="/bin/uclient-fetch"
-        if [ -f "/lib/libustream-ssl.so" ]
-        then
-            adb_fetchparm="-q --timeout=10 --no-check-certificate -O"
-            ssl_lib="libustream-ssl"
-        else
-            adb_fetchparm="-q --timeout=10 -O"
-        fi
+        adb_tmpdir="$(mktemp -p /tmp -d)"
+        adb_tmpload="$(mktemp -tu)"
+        adb_tmpfile="$(mktemp -tu)"
     fi
-    if [ ! -x "${adb_fetch}" ] || [ -z "${adb_fetch}" ] || [ -z "${adb_fetchparm}" ]
+    if [ ! -s "${adb_pidfile}" ]
     then
-        f_log "error" "no download utility found, please install 'uclient-fetch' with 'libustream-mbedtls' or the full 'wget' package"
+        printf '%s' "${$}" > "${adb_pidfile}"
     fi
-    adb_fetchinfo="${adb_fetch##*/} (${ssl_lib})"
+}
 
-    # check hashsum utility
-    #
-    if [ ! -x "${adb_hashsum}" ]
+# remove temporay files and directories
+#
+f_rmtemp()
+{
+    if [ -d "${adb_tmpdir}" ]
     then
-        adb_hashsum="$(command -v md5sum)"
+        rm -rf "${adb_tmpdir}"
+        rm -f "${adb_tmpload}"
+        rm -f "${adb_tmpfile}"
     fi
-
-    # initialize temp files and directories
-    #
-    adb_tmpload="$(mktemp -tu)"
-    adb_tmpfile="$(mktemp -tu)"
-    adb_tmpdir="$(mktemp -p /tmp -d)"
-    > "${adb_tmpdir}/tmp.whitelist"
+    > "${adb_pidfile}"
 }
 
-# f_extconf: set external config options
+# remove dns related files and directories
 #
-f_extconf()
+f_rmdns()
 {
-    # kresd related options
-    #
-    if [ "${adb_dns}" = "kresd" ]
+    if [ -n "${adb_dns}" ]
     then
-        if [ ${adb_enabled} -eq 1 ] && [ -z "$(uci -q get resolver.kresd.rpz_file | grep -Fo "${adb_dnsdir}/${adb_dnsfile}")" ]
+        f_hash
+        printf '%s\n' "${adb_dnsheader}" > "${adb_dnsdir}/${adb_dnsfile}"
+        > "${adb_dnsdir}/.${adb_dnsfile}"
+        > "${adb_rtfile}"
+        rm -f "${adb_backupdir}/${adb_dnsprefix}"*.gz
+        f_hash
+        if [ ${?} -eq 1 ]
         then
-            uci -q add_list resolver.kresd.rpz_file="${adb_dnsdir}/${adb_dnsfile}"
-        elif [ ${adb_enabled} -eq 0 ] && [ -n "$(uci -q get resolver.kresd.rpz_file | grep -Fo "${adb_dnsdir}/${adb_dnsfile}")" ]
+            f_dnsup
+        fi
+        f_rmtemp
+    fi
+    f_log "debug" "f_rmdns::: dns: ${adb_dns}, dns_dir: ${adb_dnsdir}, dns_prefix: ${adb_dnsprefix}, dns_file: ${adb_dnsfile}, rt_file: ${adb_rtfile}, backup_dir: ${adb_backupdir}"
+}
+
+# commit uci changes
+#
+f_uci()
+{
+    local change config="${1}"
+
+    if [ -n "${config}" ]
+    then
+        change="$(uci -q changes "${config}" | awk '{ORS=" "; print $0}')"
+        if [ -n "${change}" ]
         then
-            uci -q del_list resolver.kresd.rpz_file="${adb_dnsdir}/${adb_dnsfile}"
+            uci -q commit "${config}"
+            case "${config}" in
+                firewall)
+                    /etc/init.d/firewall reload >/dev/null 2>&1
+                ;;
+                *)
+                    /etc/init.d/"${adb_dns}" reload >/dev/null 2>&1
+                ;;
+            esac
         fi
-        if [ -n "$(uci -q changes resolver)" ]
+    fi
+    f_log "debug" "f_uci  ::: config: ${config}, change: ${change}"
+}
+
+# list/overall count
+#
+f_count()
+{
+    local mode="${1}"
+
+    adb_cnt=0
+    if [ -s "${adb_dnsdir}/${adb_dnsfile}" ] && ([ -z "${mode}" ] || [ "${mode}" = "final" ])
+    then
+        if [ "${adb_dns}" = "named" ] || [ "${adb_dns}" = "kresd" ]
         then
-            uci -q commit resolver
+            adb_cnt="$(( ($(wc -l 2>/dev/null < "${adb_dnsdir}/${adb_dnsfile}") - $(printf "%s" "${adb_dnsheader}" | grep -c "^")) / 2 ))"
+        else
+            adb_cnt="$(wc -l 2>/dev/null < "${adb_dnsdir}/${adb_dnsfile}")"
         fi
+    elif [ -s "${adb_tmpfile}" ]
+    then
+        adb_cnt="$(wc -l 2>/dev/null < "${adb_tmpfile}")"
     fi
+}
 
-    # firewall related options
-    #
-    if [ ${adb_enabled} -eq 1 ] && [ ${adb_forcedns} -eq 1 ] && [ -z "$(uci -q get firewall.adblock_dns)" ]
+# set external config options
+#
+f_extconf()
+{
+    local uci_config
+
+    case "${adb_dns}" in
+        dnsmasq)
+            uci_config="dhcp"
+            if [ ${adb_enabled} -eq 1 ] && [ -z "$(uci -q get dhcp.@dnsmasq[${adb_dnsinstance}].serversfile | grep -Fo "${adb_dnsdir}/${adb_dnsfile}")" ]
+            then
+                uci -q set dhcp.@dnsmasq[${adb_dnsinstance}].serversfile="${adb_dnsdir}/${adb_dnsfile}"
+            elif [ ${adb_enabled} -eq 0 ] && [ -n "$(uci -q get dhcp.@dnsmasq[${adb_dnsinstance}].serversfile | grep -Fo "${adb_dnsdir}/${adb_dnsfile}")" ]
+            then
+                uci -q delete dhcp.@dnsmasq[${adb_dnsinstance}].serversfile
+            fi
+        ;;
+        kresd)
+            uci_config="resolver"
+            if [ ${adb_enabled} -eq 1 ] && [ -z "$(uci -q get resolver.kresd.rpz_file | grep -Fo "${adb_dnsdir}/${adb_dnsfile}")" ]
+            then
+                uci -q add_list resolver.kresd.rpz_file="${adb_dnsdir}/${adb_dnsfile}"
+            elif [ ${adb_enabled} -eq 0 ] && [ -n "$(uci -q get resolver.kresd.rpz_file | grep -Fo "${adb_dnsdir}/${adb_dnsfile}")" ]
+            then
+                uci -q del_list resolver.kresd.rpz_file="${adb_dnsdir}/${adb_dnsfile}"
+            fi
+            if [ ${adb_enabled} -eq 1 ] && [ ${adb_dnsflush} -eq 0 ] && [ "$(uci -q get resolver.kresd.keep_cache)" != "1" ]
+            then
+                uci -q set resolver.kresd.keep_cache="1"
+            elif [ ${adb_enabled} -eq 0 ] || ([ ${adb_dnsflush} -eq 1 ] && [ "$(uci -q get resolver.kresd.keep_cache)" = "1" ])
+            then
+                uci -q delete resolver.kresd.keep_cache
+            fi
+        ;;
+    esac
+    f_uci "${uci_config}"
+
+    uci_config="firewall"
+    if [ ${adb_enabled} -eq 1 ] && [ ${adb_forcedns} -eq 1 ] && \
+       [ -z "$(uci -q get firewall.adblock_dns)" ] && [ $(/etc/init.d/firewall enabled; printf "%u" ${?}) -eq 0 ]
     then
         uci -q set firewall.adblock_dns="redirect"
         uci -q set firewall.adblock_dns.name="Adblock DNS"
@@ -297,157 +421,217 @@ f_extconf()
     then
         uci -q delete firewall.adblock_dns
     fi
-    if [ -n "$(uci -q changes firewall)" ]
-    then
-        uci -q commit firewall
-        if [ $(/etc/init.d/firewall enabled; printf "%u" ${?}) -eq 0 ]
-        then
-            /etc/init.d/firewall reload >/dev/null 2>&1
-        fi
-    fi
+    f_uci "${uci_config}"
 }
 
-# f_rmtemp: remove temporary files & directories
+# restart of the dns backend
 #
-f_rmtemp()
+f_dnsup()
 {
-    if [ -d "${adb_tmpdir}" ]
-    then
-        rm -f "${adb_tmpload}"
-        rm -f "${adb_tmpfile}"
-        rm -rf "${adb_tmpdir}"
-    fi
-}
+    local dns_up cache_util cache_rc cnt=0
 
-# f_rmdns: remove dns related files & directories
-#
-f_rmdns()
-{
-    if [ -n "${adb_dns}" ]
+    if [ ${adb_dnsflush} -eq 0 ] && [ ${adb_enabled} -eq 1 ] && [ "${adb_rc}" -eq 0 ]
     then
-        > "${adb_dnsdir}/${adb_dnsfile}"
-        > "${adb_rtfile}"
-        rm -f "${adb_dnsdir}/.${adb_dnsfile}"
-        rm -f "${adb_backupdir}/${adb_dnsprefix}"*.gz
+        case "${adb_dns}" in
+            dnsmasq)
+                killall -q -HUP "${adb_dns}"
+                cache_rc=${?}
+            ;;
+            unbound)
+                cache_util="$(command -v unbound-control)"
+                if [ -x "${cache_util}" ] && [ -d "${adb_tmpdir}" ] && [ -f "${adb_dnsdir}"/unbound.conf ]
+                then
+                    "${cache_util}" -c "${adb_dnsdir}"/unbound.conf dump_cache > "${adb_tmpdir}"/adb_cache.dump 2>/dev/null
+                fi
+                "/etc/init.d/${adb_dns}" restart >/dev/null 2>&1
+            ;;
+            kresd)
+                cache_util="keep_cache"
+                "/etc/init.d/${adb_dns}" restart >/dev/null 2>&1
+                cache_rc=${?}
+            ;;
+            named)
+                cache_util="$(command -v rndc)"
+                if [ -x "${cache_util}" ] && [ -f /etc/bind/rndc.conf ]
+                then
+                    "${cache_util}" -c /etc/bind/rndc.conf reload >/dev/null 2>&1
+                    cache_rc=${?}
+                else
+                    "/etc/init.d/${adb_dns}" restart >/dev/null 2>&1
+                fi
+            ;;
+            *)
+                "/etc/init.d/${adb_dns}" restart >/dev/null 2>&1
+            ;;
+        esac
+    else
+        "/etc/init.d/${adb_dns}" restart >/dev/null 2>&1
     fi
-}
-
-# f_dnsrestart: restart the dns backend
-#
-f_dnsrestart()
-{
-    local dns_up cnt=0
 
-    "/etc/init.d/${adb_dns}" restart >/dev/null 2>&1
+    adb_rc=1
     while [ ${cnt} -le 10 ]
     do
         dns_up="$(ubus -S call service list "{\"name\":\"${adb_dns}\"}" | jsonfilter -l1 -e "@[\"${adb_dns}\"].instances.*.running")"
         if [ "${dns_up}" = "true" ]
         then
-            return 0
+            case "${adb_dns}" in
+                unbound)
+                    cache_util="$(command -v unbound-control)"
+                    if [ -x "${cache_util}" ] && [ -d "${adb_tmpdir}" ] && [ -s "${adb_tmpdir}"/adb_cache.dump ]
+                    then
+                        while [ ${cnt} -le 10 ]
+                        do
+                            "${cache_util}" -c "${adb_dnsdir}"/unbound.conf load_cache < "${adb_tmpdir}"/adb_cache.dump >/dev/null 2>&1
+                            cache_rc=${?}
+                            if [ ${cache_rc} -eq 0 ]
+                            then
+                                break
+                            fi
+                            cnt=$((cnt+1))
+                            sleep 1
+                        done
+                    fi
+                ;;
+            esac
+            adb_rc=0
+            break
         fi
         cnt=$((cnt+1))
         sleep 1
     done
-    return 1
+    f_log "debug" "f_dnsup::: cache_util: ${cache_util:-"-"}, cache_rc: ${cache_rc:-"-"}, cache_flush: ${adb_dnsflush}, cache_cnt: ${cnt}, out_rc: ${adb_rc}"
 }
 
-# f_list: backup/restore/remove blocklists
+# backup/restore/remove blocklists
 #
 f_list()
 {
-    local mode="${1}" in_rc="${adb_rc}" cnt=0
+    local mode="${1}" in_rc="${adb_rc}"
 
     case "${mode}" in
         backup)
-            cnt="$(wc -l < "${adb_tmpfile}")"
-            if [ ${adb_backup} -eq 1 ] && [ -d "${adb_backupdir}" ]
+            if [ -d "${adb_backupdir}" ]
             then
-                gzip -cf "${adb_tmpfile}" > "${adb_backupdir}/${adb_dnsprefix}.${src_name}.gz"
+                gzip -cf "${adb_tmpfile}" > "${adb_backupdir}/${adb_dnsprefix}.${src_name}.gz" 2>/dev/null
                 adb_rc=${?}
             fi
-            ;;
+        ;;
         restore)
-            if [ ${adb_backup} -eq 1 ] && [ -d "${adb_backupdir}" ] &&
-                [ -f "${adb_backupdir}/${adb_dnsprefix}.${src_name}.gz" ]
+            if [ -d "${adb_backupdir}" ] && [ -f "${adb_backupdir}/${adb_dnsprefix}.${src_name}.gz" ]
             then
-                gunzip -cf "${adb_backupdir}/${adb_dnsprefix}.${src_name}.gz" > "${adb_tmpfile}"
+                gunzip -cf "${adb_backupdir}/${adb_dnsprefix}.${src_name}.gz" > "${adb_tmpfile}" 2>/dev/null
                 adb_rc=${?}
             fi
-            ;;
+        ;;
         remove)
             if [ -d "${adb_backupdir}" ]
             then
                 rm -f "${adb_backupdir}/${adb_dnsprefix}.${src_name}.gz"
             fi
             adb_rc=${?}
-            ;;
+        ;;
         merge)
             if [ -s "${adb_tmpfile}" ]
             then
                 cat "${adb_tmpfile}" >> "${adb_tmpdir}/${adb_dnsfile}"
                 adb_rc=${?}
             fi
-            ;;
-        format)
+        ;;
+        final)
             if [ -s "${adb_tmpdir}/tmp.whitelist" ]
             then
                 grep -vf "${adb_tmpdir}/tmp.whitelist" "${adb_tmpdir}/${adb_dnsfile}" | eval "${adb_dnsformat}" > "${adb_dnsdir}/${adb_dnsfile}"
             else
                 eval "${adb_dnsformat}" "${adb_tmpdir}/${adb_dnsfile}" > "${adb_dnsdir}/${adb_dnsfile}"
             fi
-            if [ -n "${adb_dnsheader}" ]
+            if [ ${?} -eq 0 ] && [ -n "${adb_dnsheader}" ]
             then
                 printf '%s\n' "${adb_dnsheader}" | cat - "${adb_dnsdir}/${adb_dnsfile}" > "${adb_tmpdir}/${adb_dnsfile}"
                 cat "${adb_tmpdir}/${adb_dnsfile}" > "${adb_dnsdir}/${adb_dnsfile}"
             fi
             adb_rc=${?}
-            ;;
+        ;;
     esac
-    f_log "debug" "name: ${src_name}, mode: ${mode}, count: ${cnt}, in_rc: ${in_rc}, out_rc: ${adb_rc}"
+    f_count "${mode}"
+    f_log "debug" "f_list ::: mode: ${mode}, cnt: ${adb_cnt}, in_rc: ${in_rc}, out_rc: ${adb_rc}"
 }
 
-# f_tldcompression: top level domain compression
+# top level domain compression
 #
-f_tldcompression()
+f_tld()
 {
-    local source="${1}" temp="${adb_tmpload}"
+    local cnt cnt_srt cnt_tld source="${1}" temp="${adb_tmpload}"
+
+    cnt="$(wc -l 2>/dev/null < "${source}")"
+    awk -F "." '{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' "${source}" 2>/dev/null | sort -u > "${temp}"
+    cnt_srt="$(wc -l 2>/dev/null < "${temp}")"
+    awk '{if(NR==1){tld=$NF};while(getline){if($NF!~tld"\\."){print tld;tld=$NF}}print tld}' "${temp}" 2>/dev/null |\
+    awk -F "." '{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' 2>/dev/null | sort > "${source}"
+    cnt_tld="$(wc -l 2>/dev/null < "${source}")"
+    f_log "debug" "f_tld  ::: source: ${source}, cnt: ${cnt}, cnt_srt: ${cnt_srt}, cnt_tld: ${cnt_tld}"
+}
+
+# blocklist hash compare
+#
+f_hash()
+{
+    local hash hash_rc=1
 
-    awk -F "." '{for(f=NF;f > 1;f--) printf "%s.", $f;print $1}' "${source}" 2>/dev/null | sort -u > "${temp}"
-    awk '{if(NR==1){tld=$NF};while(getline){if($NF !~ tld"\\."){print tld;tld=$NF}}print tld}' "${temp}" 2>/dev/null > "${source}"
-    awk -F "." '{for(f=NF;f > 1;f--) printf "%s.", $f;print $1}' "${source}" 2>/dev/null > "${temp}"
-    sort -u "${temp}" > "${source}"
+    if [ -x "${adb_hashutil}" ] && [ -f "${adb_dnsdir}/${adb_dnsfile}" ]
+    then
+        hash="$(${adb_hashutil} "${adb_dnsdir}/${adb_dnsfile}" 2>/dev/null | awk '{print $1}')"
+        if [ -z "${adb_hashold}" ] && [ -n "${hash}" ]
+        then
+            adb_hashold="${hash}"
+        elif [ -z "${adb_hashnew}" ] && [ -n "${hash}" ]
+        then
+            adb_hashnew="${hash}"
+        fi
+        if [ -n "${adb_hashold}" ] && [ -n "${adb_hashnew}" ]
+        then
+            if [ "${adb_hashold}" = "${adb_hashnew}" ]
+            then
+                hash_rc=0
+            fi
+            adb_hashold=""
+            adb_hashnew=""
+        fi
+    fi
+    f_log "debug" "f_hash ::: hash_util: ${adb_hashutil}, hash: ${hash}, out_rc: ${hash_rc}"
+    return ${hash_rc}
 }
 
-# f_switch: suspend/resume adblock processing
+# suspend/resume adblock processing
 #
 f_switch()
 {
-    local source target status mode="${1}"
+    local mode="${1}"
 
-    if [ -s "${adb_dnsdir}/${adb_dnsfile}" ] && [ "${mode}" = "suspend" ]
+    if [ ! -s "${adb_dnsdir}/.${adb_dnsfile}" ] && [ "${mode}" = "suspend" ]
     then
-        source="${adb_dnsdir}/${adb_dnsfile}"
-        target="${adb_dnsdir}/.${adb_dnsfile}"
-        status="suspended"
+        f_hash
+        cat "${adb_dnsdir}/${adb_dnsfile}" > "${adb_dnsdir}/.${adb_dnsfile}"
+        printf '%s\n' "${adb_dnsheader}" > "${adb_dnsdir}/${adb_dnsfile}"
+        f_hash
     elif [ -s "${adb_dnsdir}/.${adb_dnsfile}" ] && [ "${mode}" = "resume" ]
     then
-        source="${adb_dnsdir}/.${adb_dnsfile}"
-        target="${adb_dnsdir}/${adb_dnsfile}"
-        status="resumed"
+        f_hash
+        cat "${adb_dnsdir}/.${adb_dnsfile}" > "${adb_dnsdir}/${adb_dnsfile}"
+        > "${adb_dnsdir}/.${adb_dnsfile}"
+        f_hash
     fi
-    if [ -n "${status}" ]
-    then
-        cat "${source}" > "${target}"
-        > "${source}"
-        chown "${adb_dnsuser}" "${target}" 2>/dev/null
-        f_dnsrestart
-        f_jsnupdate
-        f_log "info " "adblock processing ${status}"
+    if [ ${?} -eq 1 ]
+    then
+        f_temp
+        f_dnsup
+        f_jsnup
+        f_log "info" "${mode} adblock processing"
+        f_rmtemp
+        exit 0
     fi
 }
 
-# f_query: query blocklist for certain (sub-)domains
+# query blocklist for certain (sub-)domains
 #
 f_query()
 {
@@ -455,10 +639,7 @@ f_query()
     local domain="${1}"
     local tld="${domain#*.}"
 
-    if [ ! -s "${adb_dnsdir}/${adb_dnsfile}" ]
-    then
-         printf "%s\n" "::: no active blocklist found, please start / resume adblock first"
-    elif [ -z "${domain}" ] || [ "${domain}" = "${tld}" ]
+    if [ -z "${domain}" ] || [ "${domain}" = "${tld}" ]
     then
         printf "%s\n" "::: invalid domain input, please submit a single domain, e.g. 'doubleclick.net'"
     else
@@ -472,7 +653,7 @@ f_query()
             else
                 result="$(awk "/(^[^\*][[:alpha:]]*[\.]+${search}|^${search})/{i++;{printf(\"  + %s\n\",\$1)};if(i>9){exit}}" "${adb_dnsfile}")"
             fi
-            printf "%s\n" "::: max. ten results for domain '${domain}'"
+            printf "%s\n" "::: results for domain '${domain}' (max. 10)"
             printf "%s\n" "${result:-"  - no match"}"
             domain="${tld}"
             tld="${domain#*.}"
@@ -480,34 +661,38 @@ f_query()
     fi
 }
 
-# f_jsnupdate: update runtime information
+# update runtime information
 #
-f_jsnupdate()
+f_jsnup()
 {
-    local status rundate="$(/bin/date "+%d.%m.%Y %H:%M:%S")"
+    local bg_pid rundate status="${1}" mode="normal mode"
 
-    if [ ${adb_rc} -gt 0 ]
-    then
-        status="error"
-    elif [ ${adb_enabled} -eq 0 ]
+    if [ -z "${status}" ]
     then
-        status="disabled"
-    elif [ -s "${adb_dnsdir}/.${adb_dnsfile}" ]
-    then
-        status="paused"
-    else
-        status="enabled"
-        if [ -s "${adb_dnsdir}/${adb_dnsfile}" ]
+        rundate="$(/bin/date "+%d.%m.%Y %H:%M:%S")"
+        if [ ${adb_rc} -gt 0 ]
         then
-            if [ "${adb_dns}" = "named" ] || [ "${adb_dns}" = "kresd" ]
-            then
-                adb_cnt="$(( ( $(wc -l < "${adb_dnsdir}/${adb_dnsfile}") - $(printf "%s" "${adb_dnsheader}" | grep -c "^") ) / 2 ))"
-            else
-                adb_cnt="$(wc -l < "${adb_dnsdir}/${adb_dnsfile}")"
-            fi
+            status="error"
+        elif [ ${adb_enabled} -eq 0 ]
+        then
+            status="disabled"
+        elif [ -s "${adb_dnsdir}/.${adb_dnsfile}" ]
+        then
+            status="paused"
+        else
+            status="enabled"
+            f_count
         fi
     fi
 
+    if [ ${adb_backup_mode} -eq 1 ]
+    then
+        mode="normal/backup mode"
+    elif [ ${adb_whitelist_mode} -eq 1 ]
+    then
+        mode="whitelist mode"
+    fi
+
     if [ -z "${adb_fetchinfo}" ] && [ -s "${adb_rtfile}" ]
     then
         json_load "$(cat "${adb_rtfile}" 2>/dev/null)"
@@ -519,36 +704,24 @@ f_jsnupdate()
     json_add_object "data"
     json_add_string "adblock_status" "${status}"
     json_add_string "adblock_version" "${adb_ver}"
-    json_add_string "overall_domains" "${adb_cnt}"
-    json_add_string "fetch_utility" "${adb_fetchinfo}"
+    json_add_string "overall_domains" "${adb_cnt} (${mode})"
+    json_add_string "fetch_utility" "${adb_fetchinfo:-"-"}"
     json_add_string "dns_backend" "${adb_dns} (${adb_dnsdir})"
-    json_add_string "last_rundate" "${rundate}"
+    json_add_string "last_rundate" "${rundate:-"-"}"
     json_add_string "system_release" "${adb_sysver}"
     json_close_object
     json_dump > "${adb_rtfile}"
-}
-
-# f_status: output runtime information
-#
-f_status()
-{
-    local key keylist value
 
-    if [ -s "${adb_rtfile}" ]
+    if [ ${adb_notify} -eq 1 ] && [ -x /etc/adblock/adblock.notify ] && ([ "${status}" = "error" ] ||\
+        ([ "${status}" = "enabled" ] && [ ${adb_whitelist_mode} -eq 0 ] && [ ${adb_cnt} -le ${adb_notifycnt} ]))
     then
-        printf "%s\n" "::: adblock runtime information"
-        json_load "$(cat "${adb_rtfile}" 2>/dev/null)"
-        json_select data
-        json_get_keys keylist
-        for key in ${keylist}
-        do
-            json_get_var value "${key}"
-            printf "  + %-15s : %s\n" "${key}" "${value}"
-        done
+        (/etc/adblock/adblock.notify >/dev/null 2>&1) &
+        bg_pid=${!}
     fi
+    f_log "debug" "f_jsnup::: status: ${status}, mode: ${mode}, cnt: ${adb_cnt}, notify: ${adb_notify}, notify_cnt: ${adb_notifycnt}, notify_pid: ${bg_pid:-"-"}"
 }
 
-# f_log: write to syslog, exit on error
+# write to syslog
 #
 f_log()
 {
@@ -556,18 +729,12 @@ f_log()
 
     if [ -n "${log_msg}" ] && ([ "${class}" != "debug" ] || [ ${adb_debug} -eq 1 ])
     then
-        logger -t "adblock-[${adb_ver}] ${class}" "${log_msg}"
-        if [ "${class}" = "error" ]
+        logger -p "${class}" -t "adblock-[${adb_ver}]" "${log_msg}"
+        if [ "${class}" = "err" ]
         then
-            logger -t "adblock-[${adb_ver}] ${class}" "Please check 'https://github.com/openwrt/packages/blob/master/net/adblock/files/README.md' (${adb_sysver})"
-            f_rmtemp
-            if [ -s "${adb_dnsdir}/${adb_dnsfile}" ]
-            then
-                f_rmdns
-                f_dnsrestart
-            fi
-            adb_rc=1
-            f_jsnupdate
+            f_rmdns
+            f_jsnup
+            logger -p "${class}" -t "adblock-[${adb_ver}]" "Please also check 'https://github.com/openwrt/packages/blob/master/net/adblock/files/README.md' (${adb_sysver})"
             exit 1
         fi
     fi
@@ -577,13 +744,11 @@ f_log()
 #
 f_main()
 {
-    local src_name src_rset shalla_archive enabled url hash_old hash_new
-    local mem_total="$(awk '/^MemTotal/ {print int($2/1000)}' "/proc/meminfo")"
+    local src_name src_rset src_log src_arc enabled url mem_total="$(awk '/^MemTotal/ {print int($2/1000)}' "/proc/meminfo")"
 
-    f_log "info " "start adblock processing ..."
-    f_log "debug" "action: ${adb_action}, dns: ${adb_dns}, fetch: ${adb_fetchinfo}, hashsum: ${adb_hashsum}, backup: ${adb_backup}, backup_mode: ${adb_backup_mode}, whitelist_mode: ${adb_whitelist_mode}, force_srt/_dns: ${adb_forcesrt}/${adb_forcedns}, mem_total: ${mem_total}"
-    > "${adb_rtfile}"
+    f_log "debug" "f_main ::: dns: ${adb_dns}, fetch_util: ${adb_fetchinfo}, backup: ${adb_backup}, backup_mode: ${adb_backup_mode}, whitelist_mode: ${adb_whitelist_mode}, force_srt: ${adb_forcesrt}, force_dns: ${adb_forcedns}, mem_total: ${mem_total}"
     > "${adb_dnsdir}/.${adb_dnsfile}"
+    > "${adb_tmpdir}/tmp.whitelist"
 
     # prepare whitelist entries
     #
@@ -598,11 +763,12 @@ f_main()
         awk "${adb_whitelist_rset}" "${adb_whitelist}" > "${adb_tmpdir}/tmp.whitelist"
     fi
 
-    # whitelist mode
+    # whitelist mode processing
     #
     if [ ${adb_whitelist_mode} -eq 1 ] && [ "${adb_dns}" != "dnscrypt-proxy" ]
     then
-        f_tldcompression "${adb_tmpdir}/tmp.whitelist"
+        f_hash
+        f_tld "${adb_tmpdir}/tmp.whitelist"
         eval "${adb_dnsformat}" "${adb_tmpdir}/tmp.whitelist" > "${adb_dnsdir}/${adb_dnsfile}"
         printf '%s\n' "${adb_dnsblock}" >> "${adb_dnsdir}/${adb_dnsfile}"
         if [ -n "${adb_dnsheader}" ]
@@ -610,18 +776,22 @@ f_main()
             printf '%s\n' "${adb_dnsheader}" | cat - "${adb_dnsdir}/${adb_dnsfile}" > "${adb_tmpdir}/${adb_dnsfile}"
             cat "${adb_tmpdir}/${adb_dnsfile}" > "${adb_dnsdir}/${adb_dnsfile}"
         fi
-        f_dnsrestart
-        if [ ${?} -eq 0 ]
+        f_hash
+        if [ ${?} -eq 1 ]
+        then
+            f_dnsup
+        fi
+        f_jsnup
+        if [ ${adb_rc} -eq 0 ]
         then
-            f_jsnupdate "${adb_cnt}"
-            f_log "info " "whitelist with overall ${adb_cnt} domains loaded successfully (${adb_sysver})"
+            f_log "info" "whitelist with overall ${adb_cnt} domains loaded successfully (${adb_sysver})"
+            return 0
         else
-            f_log "error" "dns backend restart with active whitelist failed"
+            f_log "err" "dns backend restart with active whitelist failed"
         fi
-        return
     fi
 
-    # normal & backup mode
+    # normal & backup mode processing
     #
     for src_name in ${adb_sources}
     do
@@ -630,11 +800,11 @@ f_main()
         eval "src_rset=\"\${adb_src_rset_${src_name}}\""
         > "${adb_tmpload}"
         > "${adb_tmpfile}"
-        adb_rc=4
+        adb_rc=1
 
         # basic pre-checks
         #
-        f_log "debug" "name: ${src_name}, enabled: ${enabled}, url: ${url}, rset: ${src_rset}"
+        f_log "debug" "f_main ::: name: ${src_name}, enabled: ${enabled}"
         if [ "${enabled}" != "1" ] || [ -z "${url}" ] || [ -z "${src_rset}" ]
         then
             f_list remove
@@ -655,20 +825,23 @@ f_main()
 
         # download blocklist
         #
-        if [ "${src_name}" = "blacklist" ] && [ -s "${url}" ]
+        if [ "${src_name}" = "blacklist" ]
         then
-            cat "${url}" > "${adb_tmpload}"
-            adb_rc=${?}
+            if [ -s "${url}" ]
+            then
+                cat "${url}" > "${adb_tmpload}"
+                adb_rc=${?}
+            fi
         elif [ "${src_name}" = "shalla" ]
         then
-            shalla_archive="${adb_tmpdir}/shallalist.tar.gz"
-            "${adb_fetch}" ${adb_fetchparm} "${shalla_archive}" "${url}" 2>/dev/null
+            src_arc="${adb_tmpdir}/shallalist.tar.gz"
+            src_log="$("${adb_fetchutil}" ${adb_fetchparm} "${src_arc}" "${url}" 2>&1)"
             adb_rc=${?}
             if [ ${adb_rc} -eq 0 ]
             then
                 for category in ${adb_src_cat_shalla}
                 do
-                    tar -xOzf "${shalla_archive}" "BL/${category}/domains" >> "${adb_tmpload}"
+                    tar -xOzf "${src_arc}" "BL/${category}/domains" >> "${adb_tmpload}"
                     adb_rc=${?}
                     if [ ${adb_rc} -ne 0 ]
                     then
@@ -676,29 +849,38 @@ f_main()
                     fi
                 done
             fi
-            rm -f "${shalla_archive}"
+            rm -f "${src_arc}"
             rm -rf "${adb_tmpdir}/BL"
         else
-            "${adb_fetch}" ${adb_fetchparm} "${adb_tmpload}" "${url}" 2>/dev/null
+            src_log="$("${adb_fetchutil}" ${adb_fetchparm} "${adb_tmpload}" "${url}" 2>&1)"
             adb_rc=${?}
         fi
+        if [ ${adb_rc} -ne 0 ] && [ "${src_name}" != "blacklist" ]
+        then
+            f_log "debug" "f_main ::: url: ${url}, rc: ${adb_rc}, src_log: ${src_log:-"-"}"
+        fi
 
-        # check download result and prepare list output (incl. tld compression, list backup & restore)
+        # check download result and prepare list output
         #
         if [ ${adb_rc} -eq 0 ] && [ -s "${adb_tmpload}" ]
         then
             awk "${src_rset}" "${adb_tmpload}" 2>/dev/null > "${adb_tmpfile}"
             if [ -s "${adb_tmpfile}" ]
             then
-                f_tldcompression "${adb_tmpfile}"
-                if [ "${src_name}" != "blacklist" ]
+                if [ ${mem_total} -lt 64 ] && [ ${adb_forcesrt} -eq 0 ]
+                then
+                    f_tld "${adb_tmpfile}"
+                fi
+                if [ ${adb_backup} -eq 1 ] && [ "${src_name}" != "blacklist" ]
                 then
                     f_list backup
                 fi
-            else
+            elif [ ${adb_backup} -eq 1 ]
+            then
                 f_list restore
             fi
-        else
+        elif [ ${adb_backup} -eq 1 ] && [ "${src_name}" != "blacklist" ]
+        then
             f_list restore
         fi
 
@@ -716,42 +898,35 @@ f_main()
         fi
     done
 
-    # hash preparation, whitelist removal and overall sort
+    # overall sort and conditional dns restart
     #
-    if [ -x "${adb_hashsum}" ] && [ -f "${adb_dnsdir}/${adb_dnsfile}" ]
-    then
-        hash_old="$(${adb_hashsum} "${adb_dnsdir}/${adb_dnsfile}" 2>/dev/null | awk '{print $1}')"
-    fi
+    f_hash
     if [ -s "${adb_tmpdir}/${adb_dnsfile}" ]
     then
         if [ ${mem_total} -ge 64 ] || [ ${adb_forcesrt} -eq 1 ]
         then
-            f_tldcompression "${adb_tmpdir}/${adb_dnsfile}"
+            f_tld "${adb_tmpdir}/${adb_dnsfile}"
         fi
-        f_list format
+        f_list final
     else
         > "${adb_dnsdir}/${adb_dnsfile}"
     fi
     chown "${adb_dnsuser}" "${adb_dnsdir}/${adb_dnsfile}" 2>/dev/null
-    f_rmtemp
 
-    # conditional restart of the dns backend and runtime information export
-    #
-    if [ -x "${adb_hashsum}" ] && [ -f "${adb_dnsdir}/${adb_dnsfile}" ]
-    then
-        hash_new="$(${adb_hashsum} "${adb_dnsdir}/${adb_dnsfile}" 2>/dev/null | awk '{print $1}')"
-    fi
-    if [ -z "${hash_old}" ] || [ -z "${hash_new}" ] || [ "${hash_old}" != "${hash_new}" ]
+    f_hash
+    if [ ${?} -eq 1 ]
     then
-        f_dnsrestart
+        f_dnsup
     fi
-    if [ ${?} -eq 0 ]
+    f_jsnup
+    if [ ${adb_rc} -eq 0 ]
     then
-        f_jsnupdate "${adb_cnt}"
-        f_log "info " "blocklist with overall ${adb_cnt} domains loaded successfully (${adb_sysver})"
+        f_log "info" "blocklist with overall ${adb_cnt} domains loaded successfully (${adb_sysver})"
     else
-        f_log "error" "dns backend restart with active blocklist failed"
+        f_log "err" "dns backend restart with active blocklist failed"
     fi
+    f_rmtemp
+    exit ${adb_rc}
 }
 
 # handle different adblock actions
@@ -759,31 +934,24 @@ f_main()
 f_envload
 case "${adb_action}" in
     stop)
-        f_rmtemp
         f_rmdns
-        f_dnsrestart
-        ;;
+    ;;
     restart)
-        f_rmtemp
         f_rmdns
         f_envcheck
         f_main
-        ;;
+    ;;
     suspend)
         f_switch suspend
-        ;;
+    ;;
     resume)
         f_switch resume
-        ;;
+    ;;
     query)
         f_query "${2}"
-        ;;
-    status)
-        f_status
-        ;;
-    *)
+    ;;
+    start|reload)
         f_envcheck
         f_main
-        ;;
+    ;;
 esac
-exit 0
index fdf4c4660f995898501fa240c0589fc8d2098e15..bcada092192d9d8e48fc915d73d5f88ba47c9327 100644 (file)
@@ -26,8 +26,6 @@ PKG_BUILD_PARALLEL:=1
 
 include $(INCLUDE_DIR)/package.mk
 
-PKG_BUILD_DEPENDS:= +libpthread
-
 define Package/announce
        SECTION:=net
        CATEGORY:=Network
index 06c48c6be8271f4a33d670af8281003b2c261459..429aa50ce4a090386b7dacecf28bc872c38ddd40 100644 (file)
@@ -16,8 +16,6 @@ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=@SF/$(PKG_NAME)
 PKG_HASH:=ae4c6f09cadb8d2150c3ce32d88f19036a54e8211f22d723e97864bb5e18f92d
 
-PKG_BUILD_DEPENDS:=libpcre libreadline
-
 include $(INCLUDE_DIR)/package.mk
 
 define Package/atftp/Default
index 229e1006ec1b40316a5c661b7696fbc095d0b46e..1005eae3acea41415f74b110ad8c71434205a95e 100644 (file)
@@ -9,8 +9,8 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=bind
-PKG_VERSION:=9.11.2
-PKG_RELEASE:=3
+PKG_VERSION:=9.11.2-P1
+PKG_RELEASE:=1
 USERID:=bind=57:bind=57
 
 PKG_MAINTAINER:=Noah Meyerhans <frodo@morgul.net>
@@ -20,7 +20,7 @@ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:= \
        http://www.mirrorservice.org/sites/ftp.isc.org/isc/bind9/$(PKG_VERSION) \
        http://ftp.isc.org/isc/bind9/$(PKG_VERSION)
-PKG_HASH:=7f46ad8620f7c3b0ac375d7a5211b15677708fda84ce25d7aeb7222fe2e3c77a
+PKG_HASH:=cec31548832fca3f85d95178d4019b7d702039e8595d4c93914feba337df1212
 
 PKG_FIXUP:=autoreconf
 PKG_REMOVE_FILES:=aclocal.m4 libtool.m4
index 81fe8267d7653fc7669b3fe0f3aaabeccb923be0..d4f0dc6470cfb9318ae0614c21c16411770115b2 100644 (file)
@@ -19,7 +19,7 @@ PKG_MAINTAINER:=Miroslav Lichvar <mlichvar0@gmail.com>
 PKG_LICENSE:=GPL-2.0
 PKG_LICENSE_FILES:=COPYING
 
-PKG_BUILD_DEPENDS:=+pps-tools
+PKG_BUILD_DEPENDS:=pps-tools
 
 include $(INCLUDE_DIR)/package.mk
 
index c0c671f033f6907e6fde27ed3a545547bba75ec4..8c93f4592e05f434edf8eb64052a6809696d0ad0 100644 (file)
@@ -38,9 +38,6 @@ choice
 config COOVACHILLI_NOSSL
        bool "No SSL support"
 
-config COOVACHILLI_MATRIXSSL
-       bool "MatrixSSL"
-
 config COOVACHILLI_CYASSL
        bool "CyaSSL"
 
index 016bfb2052d3be5e3e00957a246e85bfe0da0caf..a6e4c400c5a922f4458d262e8eeeeb615b0513f4 100644 (file)
@@ -12,7 +12,7 @@ PKG_VERSION:=1.3.0+20141128
 PKG_MAINTAINER:=Imre Kaloz <kaloz@openwrt.org>
 PKG_LICENSE:=GPL-2.0+
 PKG_LICENSE_FILES:=COPYING
-PKG_RELEASE:=4
+PKG_RELEASE:=5
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL:=git://github.com/coova/coova-chilli
@@ -31,7 +31,6 @@ PKG_CONFIG_DEPENDS := \
   COOVACHILLI_UAMDOMAINFILE \
   COOVACHILLI_LARGELIMITS \
   COOVACHILLI_NOSSL \
-  COOVACHILLI_MATRIXSSL \
   COOVACHILLI_CYASSL \
   COOVACHILLI_OPENSSL
 
@@ -42,7 +41,7 @@ define Package/coova-chilli
   SUBMENU:=Captive Portals
   SECTION:=net
   CATEGORY:=Network
-  DEPENDS:=+kmod-tun +librt +COOVACHILLI_MATRIXSSL:libmatrixssl +COOVACHILLI_CYASSL:libcyassl +COOVACHILLI_OPENSSL:libopenssl
+  DEPENDS:=+kmod-tun +librt +COOVACHILLI_CYASSL:libcyassl +COOVACHILLI_OPENSSL:libopenssl
   TITLE:=Wireless LAN HotSpot controller (Coova Chilli Version)
   URL:=http://www.coova.org/CoovaChilli
   MENU:=1
@@ -112,7 +111,6 @@ define Build/Configure
        $(if $(CONFIG_COOVACHILLI_USERAGENT),--enable,--disable)-useragent \
        $(if $(CONFIG_COOVACHILLI_LARGELIMITS),--enable,--disable)-largelimits \
        $(if $(CONFIG_COOVACHILLI_UAMDOMAINFILE),--enable,--disable)-uamdomainfile \
-       $(if $(CONFIG_COOVACHILLI_MATRIXSSL),--with,--without)-matrixssl \
        $(if $(CONFIG_COOVACHILLI_CYASSL),--with,--without)-cyassl \
        $(if $(CONFIG_COOVACHILLI_OPENSSL),--with,--without)-openssl \
        $(if $(CONFIG_PACKAGE_kmod-ipt-coova),--with-nfcoova) \
index 2e3d4329da9e058225ca8ae4dadb5c544803ec6a..7b59594119a4068dd64c2c088793d114a7578226 100644 (file)
@@ -20,10 +20,8 @@ PKG_SOURCE_VERSION:=f726656a4e37c46c037f61334ac48b35b7de25be
 PKG_MIRROR_HASH:=cb0b4bb7a210091d807ee8e4a2876865f32a9bf195836eb2e1edf6c5975d1130
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
 
-PKG_BUILD_DEPENDS:=python python-setuptools
-
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../../lang/python/python-package.mk
 
 define Package/danish
        SECTION:=net
index d4023c01fa88bd8ffe3d5b9196c10462af1f3c96..30ef883e5b82d0d45b093c3416928c0c1c45843e 100755 (executable)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2008-2017 OpenWrt.org
+# Copyright (C) 2008-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 #
@@ -9,10 +9,10 @@ include $(TOPDIR)/rules.mk
 PKG_NAME:=ddns-scripts
 # Version == major.minor.patch
 # increase on new functionality (minor) or patches (patch)
-PKG_VERSION:=2.7.6
+PKG_VERSION:=2.7.7
 # Release == build
 # increase on changes of services files or tld_names.dat
-PKG_RELEASE:=21
+PKG_RELEASE:=3
 
 PKG_LICENSE:=GPL-2.0
 PKG_MAINTAINER:=Christian Schoenebeck <christian.schoenebeck@gmail.com>
@@ -112,6 +112,21 @@ define Package/ddns-scripts_nsupdate/config
 
 endef
 
+###### *************************************************************************
+define Package/ddns-scripts_route53-v1
+    $(call Package/ddns-scripts/Default)
+    TITLE:=Amazon AWS Route 53 API v1
+    DEPENDS:=ddns-scripts +curl +openssl-util
+endef
+define Package/ddns-scripts_route53-v1/description
+       Dynamic DNS Client scripts extension for Amazon AWS Route53. Note: You
+       must also install ca-certificate or ca-bundle.
+       It requires:
+       "option username" to be a valid AWS access key id
+       "option password" to be the matching AWS secret key id
+       "option domain" to contain the hosted zone ID
+endef
+
 ###### *************************************************************************
 define Build/Configure
 endef
@@ -387,6 +402,47 @@ define Package/ddns-scripts_nsupdate/prerm
        exit 0  # suppress errors
 endef
 
+###### *************************************************************************
+define Package/ddns-scripts_route53-v1/preinst
+       #!/bin/sh
+       # if NOT run buildroot then stop service
+       [ -z "$${IPKG_INSTROOT}" ] && /etc/init.d/ddns stop >/dev/null 2>&1
+       exit 0  # suppress errors
+endef
+define Package/ddns-scripts_route53-v1/install
+       $(INSTALL_DIR) $(1)/etc/uci-defaults
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/files/ddns.defaults $(1)/etc/uci-defaults/ddns_route53-v1
+       $(INSTALL_DIR) $(1)/usr/lib/ddns
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/files/update_route53_v1.sh $(1)/usr/lib/ddns
+endef
+define Package/ddns-scripts_route53-v1/postinst
+       #!/bin/sh
+       # remove old services file entries
+       /bin/sed -i '/route53-v1/d' $${IPKG_INSTROOT}/etc/ddns/services         >/dev/null 2>&1
+       /bin/sed -i '/route53-v1/d' $${IPKG_INSTROOT}/etc/ddns/services_ipv6    >/dev/null 2>&1
+       # and create new
+       printf "%s\\t%s\\n" '"route53-v1"' '"update_route53_v1.sh"' >> $${IPKG_INSTROOT}/etc/ddns/services
+       printf "%s\\t%s\\n" '"route53-v1"' '"update_route53_v1.sh"' >> $${IPKG_INSTROOT}/etc/ddns/services_ipv6
+       # on real system restart service if enabled
+       [ -z "$${IPKG_INSTROOT}" ] && {
+               [ -x /etc/uci-defaults/ddns_route53-v1 ] && \
+                       /etc/uci-defaults/ddns_route53-v1 && \
+                               rm -f /etc/uci-defaults/route53.com-v1 >/dev/null 2>&1
+               /etc/init.d/ddns enabled \
+                       && /etc/init.d/ddns start >/dev/null 2>&1
+       }
+       exit 0  # suppress errors
+endef
+define Package/ddns-scripts_route53-v1/prerm
+       #!/bin/sh
+       # if NOT run buildroot then stop service
+       [ -z "$${IPKG_INSTROOT}" ] && /etc/init.d/ddns stop                             >/dev/null 2>&1
+       # remove services file entries
+       /bin/sed -i 'route53-v1/d' $${IPKG_INSTROOT}/etc/ddns/services          >/dev/null 2>&1
+       /bin/sed -i 'route53-v1/d' $${IPKG_INSTROOT}/etc/ddns/services_ipv6     >/dev/null 2>&1
+       exit 0  # suppress errors
+endef
+
 ###### *************************************************************************
 $(eval $(call BuildPackage,ddns-scripts))
 $(eval $(call BuildPackage,ddns-scripts_cloudflare))
@@ -394,3 +450,4 @@ $(eval $(call BuildPackage,ddns-scripts_cloudflare.com-v4))
 $(eval $(call BuildPackage,ddns-scripts_godaddy.com-v1))
 $(eval $(call BuildPackage,ddns-scripts_no-ip_com))
 $(eval $(call BuildPackage,ddns-scripts_nsupdate))
+$(eval $(call BuildPackage,ddns-scripts_route53-v1))
index c8b3962aae0da75ea2f6a94625f42711cc4a3e07..90501ac695a507c2203eb350fde59512e7d136af 100755 (executable)
@@ -6,7 +6,7 @@
 # (Loosely) based on the script on the one posted by exobyte in the forums here:
 # http://forum.openwrt.org/viewtopic.php?id=14040
 # extended and partial rewritten
-#.2014-2017 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
+#.2014-2018 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
 #
 # function timeout
 # copied from http://www.ict.griffith.edu.au/anthony/software/timeout.sh
@@ -21,7 +21,7 @@
 . /lib/functions/network.sh
 
 # GLOBAL VARIABLES #
-VERSION="2.7.6-13"
+VERSION="2.7.7-2"
 SECTION_ID=""          # hold config's section name
 VERBOSE=0              # default mode is log to console, but easily changed with parameter
 MYPROG=$(basename $0)  # my program call name
@@ -31,6 +31,7 @@ PIDFILE=""            # pid file
 UPDFILE=""             # store UPTIME of last update
 DATFILE=""             # save stdout data of WGet and other external programs called
 ERRFILE=""             # save stderr output of WGet and other external programs called
+IPFILE=""              # store registered IP for read by LuCI status
 TLDFILE=/usr/share/public_suffix_list.dat.gz   # TLD file used by split_FQDN
 
 CHECK_SECONDS=0                # calculated seconds out of given
@@ -81,7 +82,7 @@ CURL=$(which curl)
 # CURL_SSL not empty then SSL support available
 CURL_SSL=$($(which curl) -V 2>/dev/null | grep "Protocols:" | grep -F "https")
 # CURL_PROXY not empty then Proxy support available
-CURL_PROXY=$(find /lib /usr/lib -name libcurl.so* -exec grep -i "all_proxy" {} 2>/dev/null \;)
+CURL_PROXY=$(find /lib /usr/lib -name libcurl.so* -exec strings {} 2>/dev/null \; | grep -im1 "all_proxy")
 
 UCLIENT_FETCH=$(which uclient-fetch)
 # UCLIENT_FETCH_SSL not empty then SSL support available
@@ -261,7 +262,9 @@ write_log() {
        [ $VERBOSE -gt 0 -o $__EXIT -gt 0 ] && echo -e "$__MSG"
        # write to logfile
        if [ ${use_logfile:-1} -eq 1 -o $VERBOSE -gt 1 ]; then
-               echo -e "$__MSG" >> $LOGFILE
+               printf "%s\n" "$__MSG" | \
+                       sed -e "s/$password/*password*/g; \
+                               s/$URL_PASS/*URL_PASS*/g" >> $LOGFILE
                # VERBOSE > 1 then NO loop so NO truncate log to $ddns_loglines lines
                [ $VERBOSE -gt 1 ] || sed -i -e :a -e '$q;N;'$ddns_loglines',$D;ba' $LOGFILE
        fi
@@ -894,6 +897,7 @@ get_local_ip () {
        while : ; do
                if [ -n "$ip_network" ]; then
                        # set correct program
+                       network_flush_cache     # force re-read data from ubus
                        [ $use_ipv6 -eq 0 ] && __RUNPROG="network_get_ipaddr" \
                                            || __RUNPROG="network_get_ipaddr6"
                        eval "$__RUNPROG __DATA $ip_network" || \
@@ -1140,12 +1144,14 @@ get_registered_ip() {
                        fi
                        [ -n "$__DATA" ] && {
                                write_log 7 "Registered IP '$__DATA' detected"
+                               [ -z "$IPFILE" ] || echo "$__DATA" > $IPFILE
                                eval "$1=\"$__DATA\""   # valid data found
                                return 0                # leave here
                        }
                        write_log 4 "NO valid IP found"
                        __ERR=127
                fi
+               [ -z "$IPFILE" ] || echo "" > $IPFILE
 
                [ -n "$LUCI_HELPER" ] && return $__ERR  # no retry if called by LuCI helper script
                [ -n "$2" ] && return $__ERR            # $2 is given -> no retry
index 4948e981504ea382625b6ff352b9cf6e848eab42..ab3eb78e725e35ce3218bc4d39c945e560bd8fc9 100755 (executable)
@@ -2,7 +2,7 @@
 # /usr/lib/ddns/dynamic_dns_lucihelper.sh
 #
 #.Distributed under the terms of the GNU General Public License (GPL) version 2.0
-#.2014-2017 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
+#.2014-2018 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
 # This script is used by luci-app-ddns
 #
 # variables in small chars are read from /etc/config/ddns as parameter given here
@@ -104,6 +104,7 @@ case "$1" in
        get_registered_ip)
                [ -z "$lookup_host" ] && usage_err "command 'get_registered_ip': 'lookup_host' not set" 
                write_log 7 "-----> get_registered_ip IP"
+               [ -z "$SECTION" ] || IPFILE="$ddns_rundir/$SECTION.ip"
                IP=""
                get_registered_ip IP
                __RET=$?
index 46e5842908e48beefe039a9a299c52756e3c0925..b2baae231bd20a7030b1aa5b7a639380c30fda76 100755 (executable)
@@ -6,7 +6,7 @@
 # (Loosely) based on the script on the one posted by exobyte in the forums here:
 # http://forum.openwrt.org/viewtopic.php?id=14040
 # extended and partial rewritten
-#.2014-2017 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
+#.2014-2018 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
 #
 # variables in small chars are read from /etc/config/ddns
 # variables in big chars are defined inside these scripts as global vars
@@ -101,6 +101,7 @@ PIDFILE="$ddns_rundir/$SECTION_ID.pid"      # Process ID file
 UPDFILE="$ddns_rundir/$SECTION_ID.update"      # last update successful send (system uptime)
 DATFILE="$ddns_rundir/$SECTION_ID.dat" # save stdout data of WGet and other extern programs called
 ERRFILE="$ddns_rundir/$SECTION_ID.err" # save stderr output of WGet and other extern programs called
+IPFILE="$ddns_rundir/$SECTION_ID.ip"   #
 LOGFILE="$ddns_logdir/$SECTION_ID.log" # log file
 
 # VERBOSE > 1 delete logfile if exist to create an empty one
index c66c34b46c681ab0a193f3f6d4abd2b0bc54a247..a5e43b3a4d89248c03591d4cb133c8d07f597b87 100644 (file)
@@ -37,6 +37,7 @@
 #.cloudflare.com-v4    !!! Please install additional package "ddns-scripts_cloudflare.com-v4"
 #.godaddy.com-v1       !!! Please install additional package "ddns-scripts_godaddy.com-v1"
 #.no-ip.com / noip.com !!! Please install additional package "ddns-scripts_no-ip_com"
+#.route53-v1           !!! Please install additional package "ddns-scripts_route53-v1"
 
 "3322.org"             "http://[USERNAME]:[PASSWORD]@members.3322.org/dyndns/update?system=dyndns&hostname=[DOMAIN]&myip=[IP]"
 
@@ -66,6 +67,8 @@
 
 "dnsdynamic.org"       "http://[USERNAME]:[PASSWORD]@www.dnsdynamic.org/api/?hostname=[DOMAIN]&myip=[IP]"      "good|nochg"
 
+"dnsever.com"          "http://[USERNAME]:[PASSWORD]@dyna.dnsever.com/update.php?host[[DOMAIN]]"
+
 "dnsexit.com"          "http://update.dnsexit.com/RemoteUpdate.sv?login=[USERNAME]&password=[PASSWORD]&host=[DOMAIN]&myip=[IP]"
 
 "dnshome.de"           "http://[USERNAME]:[PASSWORD]@www.dnshome.de/dyndns.php?hostname=[DOMAIN]&ip=[IP]"
 
 "mydns.jp"             "http://www.mydns.jp/directip.html?MID=[USERNAME]&PWD=[PASSWORD]&IPV4ADDR=[IP]"
 
+"myip.co.ua"           "http://[USERNAME]:[PASSWORD]@myip.co.ua/update?hostname=[DOMAIN]&myip=[IP]"    "good"
+
 "myonlineportal.net"   "http://[USERNAME]:[PASSWORD]@myonlineportal.net/updateddns?hostname=[DOMAIN]&ip=[IP]"  "good|nochg"
 
 "mythic-beasts.com"    "http://dnsapi4.mythic-beasts.com/?domain=[USERNAME]&password=[PASSWORD]&command=REPLACE%20[DOMAIN]%2060%20A%20DYNAMIC_IP&origin=."
index 3ea2974b166eac243c1d8f8cc50bddd56b046f26..409aea376bae9073cc2b0565316a61a836985345 100644 (file)
@@ -37,6 +37,7 @@
 #.cloudflare.com-v4    !!! Please install additional package "ddns-scripts_cloudflare.com-v4"
 #.godaddy.com-v1       !!! Please install additional package "ddns-scripts_godaddy.com-v1"
 #.no-ip.com / noip.com !!! Please install additional package "ddns-scripts_no-ip_com"
+#.route53-v1           !!! Please install additional package "ddns-scripts_route53-v1"
 
 "afraid.org-basicauth" "http://[USERNAME]:[PASSWORD]@freedns.afraid.org/nic/update?hostname=[DOMAIN]&myip=[IP]"
 "afraid.org-keyauth"   "http://freedns.afraid.org/dynamic/update.php?[PASSWORD]&address=[IP]"
@@ -65,7 +66,7 @@
 "dyn.com"              "http://[USERNAME]:[PASSWORD]@members.dyndns.org/nic/update?hostname=[DOMAIN]&myip=[IP]"        "good|nochg"
 "dyndns.org"           "http://[USERNAME]:[PASSWORD]@members.dyndns.org/nic/update?hostname=[DOMAIN]&myip=[IP]"        "good|nochg"
 
-"dynu.com"    "http://api.dynu.com/nic/update?hostname=[DOMAIN]&myipv6=[IP]&username=[USERNAME]&password=[PASSWORD]"
+"dynu.com"             "http://api.dynu.com/nic/update?hostname=[DOMAIN]&myipv6=[IP]&username=[USERNAME]&password=[PASSWORD]"
 
 "dynv6.com"            "http://dynv6.com/api/update?hostname=[DOMAIN]&token=[PASSWORD]&ipv6=[IP]"      "updated|unchanged"
 
index aef3b7327955469ab0402c00ddcced1084f70c66..0c77e8b2bba27d0f2ca7e094b0f20acca12147f6 100755 (executable)
@@ -5,15 +5,16 @@
 # script for sending updates to cloudflare.com
 #.based on Ben Kulbertis cloudflare-update-record.sh found at http://gist.github.com/benkulbertis
 #.and on George Johnson's cf-ddns.sh found at https://github.com/gstuartj/cf-ddns.sh
-#.2016-2017 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
+#.2016-2018 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
 # CloudFlare API documentation at https://api.cloudflare.com/
 #
 # This script is parsed by dynamic_dns_functions.sh inside send_update() function
 #
 # using following options from /etc/config/ddns
-# option username - your cloudflare e-mail
-# option password - cloudflare api key, you can get it from cloudflare.com/my-account/
-# option domain   - "hostname@yourdomain.TLD"  # syntax changed to remove split_FQDN() function and tld_names.dat.gz
+# option username  - your cloudflare e-mail
+# option password  - cloudflare api key, you can get it from cloudflare.com/my-account/
+# option domain    - "hostname@yourdomain.TLD" # syntax changed to remove split_FQDN() function and tld_names.dat.gz
+# option param_opt - Whether the record is receiving the performance and security benefits of Cloudflare (not empty => false)
 #
 # variable __IP already defined with the ip-address to use for update
 #
@@ -25,7 +26,7 @@
 [ $use_https -eq 0 ] && use_https=1    # force HTTPS
 
 # used variables
-local __HOST __DOMAIN __TYPE __URLBASE __PRGBASE __RUNPROG __DATA __IPV6 __ZONEID __RECID
+local __HOST __DOMAIN __TYPE __URLBASE __PRGBASE __RUNPROG __DATA __IPV6 __ZONEID __RECID __PROXIED
 local __URLBASE="https://api.cloudflare.com/client/v4"
 
 # split __HOST __DOMAIN from $domain
@@ -174,10 +175,16 @@ __DATA=$(grep -o '"content":"[^"]*' $DATFILE | grep -o '[^"]*$' | head -1)
 }
 
 # update is needed
-# let's build data to send,
+# let's build data to send
+# set proxied parameter (default "true")
+[ -z "$param_opt" ] && __PROXIED="true" || {
+       __PROXIED="false"
+       write_log 7 "Cloudflare 'proxied' disabled"
+}
+
 # use file to work around " needed for json
 cat > $DATFILE << EOF
-{"id":"$__ZONEID","type":"$__TYPE","name":"$__HOST","content":"$__IP"}
+{"id":"$__ZONEID","type":"$__TYPE","name":"$__HOST","content":"$__IP","proxied":$__PROXIED}
 EOF
 
 # let's complete transfer command
index 9633b4e245569741855b13a9d6edb3b75e1cbdf6..9845d20a0abbc124ec7f30a3f0ab03357747cd95 100755 (executable)
@@ -4,7 +4,7 @@
 #
 # script for sending updates to godaddy.com
 #.based on GoDaddy.sh v1.0 by Nazar78 @ TeaNazaR.com
-#.2017 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
+#.2017-2018 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
 # GoDaddy Documentation at https://developer.godaddy.com/doc
 #
 # This script is parsed by dynamic_dns_functions.sh inside send_update() function
@@ -85,6 +85,7 @@ godaddy_transfer() {
                write_log 7 "$(cat $DATFILE)"
                return 1
        }
+       return 0
 }
 
 # Build base command to use
diff --git a/net/ddns-scripts/files/update_route53_v1.sh b/net/ddns-scripts/files/update_route53_v1.sh
new file mode 100644 (file)
index 0000000..6b9b029
--- /dev/null
@@ -0,0 +1,97 @@
+#!/bin/sh
+#.Distributed under the terms of the GNU General Public License (GPL) version 2.0
+#.based on Yuval Adam's route53.sh found at https://github.com/yuvadm/route53-ddns/blob/master/route53.sh
+#.2017 Max Berger <max at berger dot name>
+[ -z "$CURL_SSL" ] && write_log 14 "Amazon AWS Route53 communication require cURL with SSL support. Please install"
+[ -z "$username" ] && write_log 14 "Service section not configured correctly! Missing key as 'username'"
+[ -z "$password" ] && write_log 14 "Service section not configured correctly! Missing secret as 'password'"
+[ -z "$domain" ] && write_log 14 "Service section not configured correctly! Missing zone id as 'domain'"
+
+set -euo pipefail
+IFS=$'\n\t'
+
+ENDPOINT="route53.amazonaws.com"
+RECORD_TTL=300
+RECORD_NAME="$lookup_host".
+[ $use_ipv6 -eq 0 ] && RECORD_TYPE="A"
+[ $use_ipv6 -eq 1 ] && RECORD_TYPE="AAAA"
+RECORD_VALUE="$LOCAL_IP"
+HOSTED_ZONE_ID="$domain"
+API_PATH="/2013-04-01/hostedzone/${HOSTED_ZONE_ID}/rrset/"
+
+AWS_ACCESS_KEY_ID="$username"
+AWS_SECRET_ACCESS_KEY="$password"
+AWS_REGION='us-east-1'
+AWS_SERVICE='route53'
+
+hash() {
+    msg=$1
+    echo -en "$msg" | openssl dgst -sha256 | sed 's/^.* //'
+}
+
+sign_plain() {
+    # Sign message using a plaintext key
+    key=$1
+    msg=$2
+    echo -en "$msg" | openssl dgst -hex -sha256 -hmac "$key" | sed 's/^.* //'
+}
+
+sign() {
+    # Sign message using a hex formatted key
+    key=$1
+    msg=$2
+    echo -en "$msg" | openssl dgst -hex -sha256 -mac HMAC -macopt "hexkey:${key}" | sed 's/^.* //'
+}
+
+request_body="<?xml version=\"1.0\" encoding=\"UTF-8\"?> \
+<ChangeResourceRecordSetsRequest xmlns=\"https://route53.amazonaws.com/doc/2013-04-01/\"> \
+<ChangeBatch> \
+   <Changes> \
+      <Change> \
+         <Action>UPSERT</Action> \
+         <ResourceRecordSet> \
+            <Name>${RECORD_NAME}</Name> \
+            <Type>${RECORD_TYPE}</Type> \
+            <TTL>${RECORD_TTL}</TTL> \
+            <ResourceRecords> \
+               <ResourceRecord> \
+                  <Value>${RECORD_VALUE}</Value> \
+               </ResourceRecord> \
+            </ResourceRecords> \
+         </ResourceRecordSet> \
+      </Change> \
+   </Changes> \
+</ChangeBatch> \
+</ChangeResourceRecordSetsRequest>"
+
+fulldate=$(date --utc +%Y%m%dT%H%M%SZ)
+shortdate=$(date --utc +%Y%m%d)
+signed_headers="host;x-amz-date"
+request_hash=$(hash "$request_body")
+canonical_request="POST\n${API_PATH}\n\nhost:route53.amazonaws.com\nx-amz-date:${fulldate}\n\n${signed_headers}\n${request_hash}"
+
+date_key=$(sign_plain "AWS4${AWS_SECRET_ACCESS_KEY}" "${shortdate}")
+region_key=$(sign "$date_key" $AWS_REGION)
+service_key=$(sign "$region_key" $AWS_SERVICE)
+signing_key=$(sign "$service_key" aws4_request)
+
+credential="${shortdate}/${AWS_REGION}/${AWS_SERVICE}/aws4_request"
+sigmsg="AWS4-HMAC-SHA256\n${fulldate}\n${credential}\n$(hash "$canonical_request")"
+
+signature=$(sign "$signing_key" "$sigmsg")
+
+authorization="AWS4-HMAC-SHA256 Credential=${AWS_ACCESS_KEY_ID}/${credential}, SignedHeaders=${signed_headers}, Signature=${signature}"
+
+ANSWER=$(curl \
+    -X "POST" \
+    -H "Host: route53.amazonaws.com" \
+    -H "X-Amz-Date: ${fulldate}" \
+    -H "Authorization: ${authorization}" \
+    -H "Content-Type: text/xml" \
+    -d "$request_body" \
+    "https://${ENDPOINT}${API_PATH}")
+write_log 7 "${ANSWER}"
+
+echo ${ANSWER} | grep Error >/dev/null && return 1
+echo ${ANSWER} | grep ChangeInfo >/dev/null && return 0
+return 2
index 9329706d722edd023e29f7d9fd40c17b250ba29f..ddaca8954970bea97e38307a26e4404a4d599b13 100644 (file)
@@ -1,7 +1,5 @@
 #
-# Copyright (C) 2016 OpenWrt.org
-# Copyright (C) 2012-2016 Black Roland and contributors (https://github.com/black-roland/exOpenWrt/graphs/contributors)
-# Copyright (C) 2011-2012 Entware
+# Copyright (C) 2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -11,12 +9,15 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=dnscrypt-proxy
 PKG_VERSION:=1.9.5
-PKG_RELEASE:=7
+PKG_RELEASE:=8
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
+PKG_SOURCE_VERSION:=f71ca699aa3399f0c103c1f13ce1a86f9ce9638c
+PKG_SOURCE_URL:=https://github.com/dyne/dnscrypt-proxy
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_MIRROR_HASH:=a3a52f7f85b390184695db688c9837bf51cf25c4cb2c1093bb315640dbd2a54f
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
-PKG_SOURCE_URL:=http://download.dnscrypt.org/dnscrypt-proxy \
-https://github.com/jedisct1/dnscrypt-proxy/releases/download/$(PKG_VERSION)
-PKG_HASH:=e89f5b9039979ab392302faf369ef7593155d5ea21580402a75bbc46329d1bb6
 PKG_FIXUP:=autoreconf
 PKG_INSTALL:=1
 
@@ -31,7 +32,7 @@ define Package/dnscrypt-proxy/Default
   SECTION:=net
   CATEGORY:=Network
   SUBMENU:=IP Addresses and Names
-  URL:=http://dnscrypt.org/
+  URL:=https://github.com/dyne/dnscrypt-proxy
   MAINTAINER:=Damiano Renfer <damiano.renfer@gmail.com>
 endef
 
@@ -54,7 +55,7 @@ endef
 define Package/dnscrypt-proxy-resolvers
   $(call Package/dnscrypt-proxy/Default)
   TITLE:=Package with current list of dnscrypt-proxy resolvers
-  VERSION:=$(PKG_VERSION)+git-20170530-60baef4-$(PKG_RELEASE)
+  VERSION:=$(PKG_VERSION)+git-20171001-2d43be3-$(PKG_RELEASE)
 endef
 
 define Package/dnscrypt-proxy-resolvers/description
index 3b3935ca0b3a8b47c3a032c39df1041d34cddda8..635422a1419453c49c6c22e76aacae2860d706e0 100644 (file)
@@ -8,20 +8,21 @@ config dnscrypt-proxy ns1
        option address '127.0.0.1'
        option port '5353'
        option resolver 'fvz-anyone'
+       # more details about the following options can be found in:
+       #    https://github.com/dyne/dnscrypt-proxy/blob/master/dnscrypt-proxy.conf
        # option resolvers_list '/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv'
        # ephemeral keys option requires extra CPU cycles and can cause huge system load
        # option ephemeral_keys '0'
-       # more details at https://github.com/jedisct1/dnscrypt-proxy#public-key-client-authentication
        # option client_key '/path/to/client_key'
        # option log_level '6'
        # option syslog '1'
        # option syslog_prefix 'dnscrypt-proxy'
        # option query_log_file '/path/to/logfile'
-       # enable cache may speed up dnscrypt-proxy, see https://github.com/jedisct1/dnscrypt-proxy/wiki/Go-faster
+       # enable cache may speed up dnscrypt-proxy
        # option local_cache '0'
-       # disable IPv6 may also speed up dnscrypt-proxy, see https://github.com/jedisct1/dnscrypt-proxy/wiki/Go-faster
+       # disable IPv6 may also speed up dnscrypt-proxy
        # option block_ipv6 '0'
-       # Blacklists allow you to block domains, ip, ... see https://github.com/jedisct1/dnscrypt-proxy/wiki/Filtering
+       # Blacklists allow you to block domains, ip, ...
        # list blacklist 'domains:/path/to/domains-blacklist-file.txt'
        # list blacklist 'domains:/path/to/domains-blacklist2-file.txt'
 
index 703d54b723955e831a8d3ba387b5bfde1c342f3d..e2cf7b1324aa5ed127a68f4f7edfa5131b85edf1 100644 (file)
-Name,"Full name","Description","Location","Coordinates",URL,Version,DNSSEC validation,No logs,Namecoin,Resolver address,Provider name,Provider public key,Provider public key TXT record\r
-adguard-dns-family-ns1,"Adguard DNS Family Protection 1","Adguard DNS with safesearch and adult content blocking","Anycast","",https://adguard.com/en/adguard-dns/overview.html,1,no,yes,no,176.103.130.132:5443,2.dnscrypt.family.ns1.adguard.com,B831:5DD7:B14B:6EE3:20A4:70DC:2ED6:B1AA:398C:C9E5:86F8:5D45:45D6:B8C9:B500:5ABA,pk.family.ns1.adguard.com\r
-adguard-dns-family-ns2,"Adguard DNS Family Protection 2","Adguard DNS with safesearch and adult content blocking","Anycast","",https://adguard.com/en/adguard-dns/overview.html,1,no,yes,no,176.103.130.134:5443,2.dnscrypt.family.ns2.adguard.com,8C21:17A9:EBC1:57D6:FB64:056F:0ADB:C11C:5D83:6734:73C4:6E25:8D9B:2F57:D4EE:351F,pk.family.ns2.adguard.com\r
-adguard-dns-ns1,"Adguard DNS 1","Remove ads and protect your computer from malware","Anycast","",https://adguard.com/en/adguard-dns/overview.html,1,no,yes,no,176.103.130.130:5443,2.dnscrypt.default.ns1.adguard.com,D12B:47F2:52DC:F2C2:BBF8:9910:86EA:F79C:E449:5D8B:16C8:A0C4:322E:52CA:3F39:0873,pk.default.ns1.adguard.com\r
-adguard-dns-ns2,"Adguard DNS 2","Remove ads and protect your computer from malware","Anycast","",https://adguard.com/en/adguard-dns/overview.html,1,no,yes,no,176.103.130.131:5443,2.dnscrypt.default.ns2.adguard.com,81D0:02D3:6A4C:A50C:473B:7479:650F:E12E:02B3:21CB:6138:562A:208E:403D:FDC5:5E94,pk.default.ns2.adguard.com\r
-bn-ca0,"Babylon Network Canada 0","Non-logging, uncensored DNS resolver provided by Babylon Network","Quebec, Canada","",https://babylon.network,1,no,yes,no,149.56.229.28:5353,2.dnscrypt-cert.babylon.network,8794:070A:143D:35CA:1CA6:32E7:B189:3028:4EAE:5DAF:EBB4:01E3:DF52:E9F0:37AB:D182,pk.ca0.dnscrypt.babylon.network\r
-bn-ca0-ipv6,"Babylon Network Canada 0 (IPv6)","Non-logging, uncensored IPv6 DNS resolver provided by Babylon Network","Quebec, Canada","",https://babylon.network,1,no,yes,no,[2607:5300:60:3a71::28]:5353,2.dnscrypt-cert.babylon.network,8794:070A:143D:35CA:1CA6:32E7:B189:3028:4EAE:5DAF:EBB4:01E3:DF52:E9F0:37AB:D182,pk.ca0.dnscrypt.babylon.network\r
-bn-fr0,"Babylon Network France 0","Non-logging, uncensored DNS resolver provided by Babylon Network","Roubaix, France","",https://babylon.network,1,no,yes,no,5.135.66.222:5353,2.dnscrypt-cert.babylon.network,8794:070A:143D:35CA:1CA6:32E7:B189:3028:4EAE:5DAF:EBB4:01E3:DF52:E9F0:37AB:D182,pk.fr0.dnscrypt.babylon.network\r
-bn-fr0-ipv6,"Babylon Network France 0 (IPv6)","Non-logging, uncensored IPv6 DNS resolver provided by Babylon Network","Roubaix, France","",https://babylon.network,1,no,yes,no,[2001:41d0:8:4480::222]:5353,2.dnscrypt-cert.babylon.network,8794:070A:143D:35CA:1CA6:32E7:B189:3028:4EAE:5DAF:EBB4:01E3:DF52:E9F0:37AB:D182,pk.fr0.dnscrypt.babylon.network\r
-bn-fr1,"Babylon Network France 1","Non-logging, uncensored DNS resolver provided by Babylon Network","Roubaix, France","",https://babylon.network,1,no,yes,no,149.202.98.173:5353,2.dnscrypt-cert.babylon.network,8794:070A:143D:35CA:1CA6:32E7:B189:3028:4EAE:5DAF:EBB4:01E3:DF52:E9F0:37AB:D182,pk.fr1.dnscrypt.babylon.network\r
-bn-fr1-ipv6,"Babylon Network France 1 (IPv6)","Non-logging, uncensored IPv6 DNS resolver provided by Babylon Network","Roubaix, France","",https://babylon.network,1,no,yes,no,[2001:41d0:8:4528::173]:5353,2.dnscrypt-cert.babylon.network,8794:070A:143D:35CA:1CA6:32E7:B189:3028:4EAE:5DAF:EBB4:01E3:DF52:E9F0:37AB:D182,pk.fr1.dnscrypt.babylon.network\r
-cisco,"Cisco OpenDNS","Remove your DNS blind spot","Anycast","",https://www.opendns.com,1,no,no,no,208.67.220.220,2.dnscrypt-cert.opendns.com,B735:1140:206F:225D:3E2B:D822:D7FD:691E:A1C3:3CC8:D666:8D0C:BE04:BFAB:CA43:FB79,\r
-cisco-familyshield,"Cisco OpenDNS with FamilyShield","Block websites not suitable for children","Anycast","",https://www.opendns.com/home-internet-security/parental-controls/,1,no,no,no,208.67.220.123,2.dnscrypt-cert.opendns.com,B735:1140:206F:225D:3E2B:D822:D7FD:691E:A1C3:3CC8:D666:8D0C:BE04:BFAB:CA43:FB79,\r
-cisco-ipv6,"Cisco OpenDNS over IPv6","Cisco OpenDNS IPv6 sandbox","Anycast","",https://www.opendns.com/about/innovations/ipv6/,1,no,no,no,[2620:0:ccc::2]:443,2.dnscrypt-cert.opendns.com,B735:1140:206F:225D:3E2B:D822:D7FD:691E:A1C3:3CC8:D666:8D0C:BE04:BFAB:CA43:FB79,\r
-cs-caeast,"CS Canada east DNSCrypt server","provided by cryptostorm.is","Montreal, CA","",https://cryptostorm.is,1,no,yes,no,167.114.84.132:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-cawest,"CS Canada west DNSCrypt server","provided by cryptostorm.is","Vancouver, CA","",https://cryptostorm.is,1,no,yes,no,162.221.207.228:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-cfi,"CS cryptofree France DNSCrypt server","provided by cryptostorm.is","Paris, France","",https://cryptostorm.is,1,no,yes,no,212.83.175.31:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-cfii,"CS secondary cryptofree France DNSCrypt server","provided by cryptostorm.is","Paris, France","",https://cryptostorm.is,1,no,yes,no,195.154.61.33:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-ch,"CS Switzerland DNSCrypt server","provided by cryptostorm.is","Baar, Switzerland","",https://cryptostorm.is,1,no,yes,no,185.60.147.77:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-de,"CS Frankfurt, DE DNSCrypt server","provided by cryptostorm.is","Frankfurt, Germany","",https://cryptostorm.is,1,no,yes,no,46.165.222.246:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-de2,"CS secondary Frankfurt, DE DNSCrypt server","provided by cryptostorm.is","Frankfurt, Germany","",https://cryptostorm.is,1,no,yes,no,46.165.240.171:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-de3,"CS Dusseldorf, DE DNSCrypt server","provided by cryptostorm.is","Dusseldorf, Germany","",https://cryptostorm.is,1,no,yes,no,89.163.214.174:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-dk,"CS Denmark DNSCrypt server","provided by cryptostorm.is","Copenhagen, Denmark","",https://cryptostorm.is,1,no,yes,no,82.103.131.172:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-fi,"CS Finland DNSCrypt server","provided by cryptostorm.is","Helsinki, Finland","",https://cryptostorm.is,1,no,yes,no,185.117.118.20:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-fr,"CS France DNSCrypt server","provided by cryptostorm.is","Paris, France","",https://cryptostorm.is,1,no,yes,yes,212.129.46.86:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-fr2,"CS secondary France DNSCrypt server","provided by cryptostorm.is","Paris, France","",https://cryptostorm.is,1,no,yes,yes,212.129.46.32:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-lt,"CS Lithuania DNSCrypt server","provided by cryptostorm.is","Vilnius, Lithuania","",https://cryptostorm.is,1,no,yes,no,46.166.170.10:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-lv,"CS Latvia DNSCrypt server","provided by cryptostorm.is","Riga, Latvia","",https://cryptostorm.is,1,no,yes,no,80.233.134.52:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-md,"CS Moldova DNSCrypt server","provided by cryptostorm.is","Chisinau, Moldova","",https://cryptostorm.is,1,no,yes,no,176.123.3.249:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-nl,"CS Netherlands DNSCrypt server","provided by cryptostorm.is","Rotterdam, Netherlands","",https://cryptostorm.is,1,no,yes,no,213.163.64.208:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-pl,"CS Poland DNSCrypt server","provided by cryptostorm.is","Warsaw, Poland","",https://cryptostorm.is,1,no,yes,no,5.133.8.187:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-pt,"CS Portugal DNSCrypt server","provided by cryptostorm.is","Lisbon, Portugal","",https://cryptostorm.is,1,no,yes,yes,109.71.42.228:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-ro,"CS Romania DNSCrypt server","provided by cryptostorm.is","Romania","",https://cryptostorm.is,1,no,yes,no,5.254.96.195:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-rome,"CS Italy DNSCrypt server","provided by cryptostorm.is","Rome, Italy","",https://cryptostorm.is,1,no,yes,no,95.141.47.58:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-ru,"CS Russia DNSCrypt server","provided by cryptostorm.is","Saint Petersburg, Russia","",https://cryptostorm.is,1,no,yes,no,78.155.222.163:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-uk,"CS England DNSCrypt server","provided by cryptostorm.is","Rugby, England","",https://cryptostorm.is,1,no,yes,no,5.101.137.251:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-useast,"CS New York City NY US DNSCrypt server","provided by cryptostorm.is","Buffalo, NY","",https://cryptostorm.is,1,no,yes,no,173.234.159.235:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-usnorth,"CS Chicago IL US DNSCrypt server","provided by cryptostorm.is","Chicago, IL","",https://cryptostorm.is,1,no,yes,no,173.234.56.115:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-ussouth,"CS Dallas TX US DNSCrypt server","provided by cryptostorm.is","Dallas, TX","",https://cryptostorm.is,1,no,yes,no,70.32.38.67:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-ussouth2,"CS Atlanta GA US DNSCrypt server","provided by cryptostorm.is","Atlanta, GA","",https://cryptostorm.is,1,no,yes,no,108.62.19.131:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-uswest2,"CS Las Vegas NV US DNSCrypt server","provided by cryptostorm.is","Las Vegas, NV","",https://cryptostorm.is,1,no,yes,no,104.238.194.235:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-uswest3,"CS secondary Las Vegas NV US DNSCrypt server","provided by cryptostorm.is","Las Vegas, NV","",https://cryptostorm.is,1,no,yes,no,104.238.195.139:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-cs-uswest4,"CS Phoenix AZ US DNSCrypt server","provided by cryptostorm.is","Phoenix, AZ","",https://cryptostorm.is,1,no,yes,no,23.105.70.204:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,\r
-d0wn-at-ns1,"D0wn Resolver Austria 01","Server provided by Martin 'd0wn' Albus","Austria","",https://dns.d0wn.biz,1,yes,yes,no,79.133.33.52,2.dnscrypt-cert.at.d0wn.biz,717E:5DF4:1841:CD4B:D92E:CE16:ECCC:443D:B305:B03D:86E6:69B7:4AC1:FBB6:18D0:2BB4,pubkey.at.dnscrypt.d0wn.biz\r
-d0wn-bg-ns1,"D0wn Resolver Bulgaria 01","Server provided by Martin 'd0wn' Albus","Bulgaria","",https://dns.d0wn.biz,1,yes,yes,no,217.12.203.133,2.dnscrypt-cert.bg.d0wn.biz,423C:D823:B3EA:2015:F027:ECF1:5704:3EB7:764A:D02D:9447:56E6:51FD:D06F:E571:2FCC,pubkey.bg.dnscrypt.d0wn.biz\r
-d0wn-cr-ns1,"D0wn Resolver Costa Rica 01","Server provided by Martin 'd0wn' Albus","Costa Rica","",https://dns.d0wn.biz,1,yes,yes,no,138.59.17.208,2.dnscrypt-cert.cr.d0wn.biz,408B:5064:1EF0:575F:EC9A:BBF6:FC0A:F83A:F434:22BD:03FA:2663:81B3:DADD:1312:5A85,pubkey.cr.dnscrypt.d0wn.biz\r
-d0wn-cy-ns1,"D0wn Resolver Cyprus 01","Server provided by Martin 'd0wn' Albus","Cyprus","",https://dns.d0wn.biz,1,yes,yes,no,213.169.148.11,2.dnscrypt-cert.cy.d0wn.biz,2144:4FE7:59C3:13B9:FABB:FC2A:F975:9F9C:CD9A:2ED7:0978:3A25:7347:4B83:8F86:EA2B,pubkey.cy.dnscrypt.d0wn.biz\r
-d0wn-cz-ns1,"D0wn Resolver Czech Republic 01","Server provided by Martin 'd0wn' Albus","Czech Republic","",https://dns.d0wn.biz,1,yes,yes,no,81.2.237.32,2.dnscrypt-cert.cz.d0wn.biz,EE21:5055:4DA0:1367:BAC3:768A:7C1E:24BF:D777:ACD5:77A4:44F8:BDF3:84E0:5966:D855,pubkey.cz.dnscrypt.d0wn.biz\r
-d0wn-de-ns1,"D0wn Resolver Germany 01","Server provided by Martin 'd0wn' Albus","Germany","",https://dns.d0wn.biz,1,yes,yes,no,82.211.31.248,2.dnscrypt-cert.de.d0wn.biz,B040:19F8:8D49:4682:41E3:EB58:5F61:173F:EF8E:55DA:0597:2DB7:27BB:C153:1DD8:D109,pubkey.de.dnscrypt.d0wn.biz\r
-d0wn-de-ns1-ipv6,"D0wn Resolver Germany 01 over IPv6","Server provided by Martin 'd0wn' Albus","Germany","",https://dns.d0wn.biz,1,yes,yes,no,[2001:1608:10:195:3:dead:beef:cafe]:443,2.dnscrypt-cert.de.d0wn.biz,B040:19F8:8D49:4682:41E3:EB58:5F61:173F:EF8E:55DA:0597:2DB7:27BB:C153:1DD8:D109,pubkey.de.dnscrypt.d0wn.biz\r
-d0wn-de-ns2,"D0wn Resolver Germany 02","Server provided by Martin 'd0wn' Albus","Germany","",https://dns.d0wn.biz,1,yes,yes,no,185.137.15.105,2.dnscrypt-cert.de2.d0wn.biz,8C62:691A:A7EA:69D3:8A25:86AA:2715:87F0:9B11:9159:0663:55FC:1CD0:61C5:C863:1940,pubkey.de2.dnscrypt.d0wn.biz\r
-d0wn-dk-ns1,"D0wn Resolver Denmark 01","Server provided by Martin 'd0wn' Albus","Denmark","",https://dns.d0wn.biz,1,yes,yes,no,77.66.108.93,2.dnscrypt-cert.dk.d0wn.biz,0838:C9CF:2292:2D4C:4DB7:4A5E:ED10:DD36:66DD:9551:7238:6387:B7A0:2FA0:885A:5F77,pubkey.dk.dnscrypt.d0wn.biz\r
-d0wn-es-ns1,"D0wn Resolver Spain 01","Server provided by Martin 'd0wn' Albus","Spain","",https://dns.d0wn.biz,1,yes,yes,no,91.142.220.29,2.dnscrypt-cert.es.d0wn.biz,EB09:E854:AEDA:9705:CB47:ED69:EADD:4156:3653:82C5:C88D:A2E3:6917:3B54:4774:7505,pubkey.es.dnscrypt.d0wn.biz\r
-d0wn-fr-ns1,"D0wn Resolver France 01","Server provided by Martin 'd0wn' Albus","France","",https://dns.d0wn.biz,1,yes,yes,no,151.80.7.115:1053,2.dnscrypt-cert.fr.d0wn.biz,58A8:22D3:29EB:C14F:BCEB:45AF:42EB:2F58:C797:0AD3:ED31:397D:1D34:8636:2375:7251,pubkey.fr.dnscrypt.d0wn.biz\r
-d0wn-fr-ns2,"D0wn Resolver France 02","Server provided by Martin 'd0wn' Albus","France","",https://dns.d0wn.biz,1,yes,yes,no,37.187.0.40,2.dnscrypt-cert.fr2.d0wn.biz,25A7:DB7B:7835:55D5:7DA4:7C0C:57F8:9C5F:0220:3D09:67E3:585A:723E:E0D1:CB38:F767,pubkey.fr2.dnscrypt.d0wn.biz\r
-d0wn-fr-ns2-ipv6,"D0wn Resolver France 02 over IPv6","Server provided by Martin 'd0wn' Albus","France","",https://dns.d0wn.biz,1,yes,yes,no,[2001:41D0:A:0028::1]:443,2.dnscrypt-cert.fr2.d0wn.biz,25A7:DB7B:7835:55D5:7DA4:7C0C:57F8:9C5F:0220:3D09:67E3:585A:723E:E0D1:CB38:F767,pubkey.fr2.dnscrypt.d0wn.biz\r
-d0wn-gr-ns1,"D0wn Resolver Greece 01","Server provided by Martin 'd0wn' Albus","Greece","",https://dns.d0wn.biz,1,yes,yes,no,85.25.105.193,2.dnscrypt-cert.gr.d0wn.biz,B19C:0B5C:48F2:58FA:0BE4:67F4:5F50:BC7F:985F:C544:8A4F:BC9D:5574:5A35:5701:8009,pubkey.gr.dnscrypt.d0wn.biz\r
-d0wn-hk-ns1,"D0wn Resolver Hongkong 01","Server provided by Martin 'd0wn' Albus","Hongkong","",https://dns.d0wn.biz,1,yes,yes,no,45.124.66.200,2.dnscrypt-cert.hk.d0wn.biz,84ED:0DFF:7967:5DBD:2D93:65A2:A6AB:7F90:146F:A50B:048C:8C75:651B:AA55:7129:6740,pubkey.hk.dnscrypt.d0wn.biz\r
-d0wn-id-ns1,"D0wn Resolver Indonesia 01","Server provided by Martin 'd0wn' Albus","Indonesia","",https://dns.d0wn.biz,1,yes,yes,no,45.114.118.195,2.dnscrypt-cert.id.d0wn.biz,BE93:B3F1:2A3B:2448:8F33:F91F:9461:5F73:D5CA:56D6:C789:96DE:7A18:D4DE:5182:094D,pubkey.id.dnscrypt.d0wn.biz\r
-d0wn-is-ns1,"D0wn Resolver Iceland 01","Server provided by Martin 'd0wn' Albus","Iceland","",https://dns.d0wn.biz,1,yes,yes,no,37.235.49.61,2.dnscrypt-cert.is.d0wn.biz,2B28:974E:073A:6B38:722A:5BE1:F7A0:250C:508F:A809:238F:8F3D:76D8:6098:20D7:B2D9,pubkey.is.dnscrypt.d0wn.biz\r
-d0wn-is-ns2,"D0wn Resolver Iceland 02","Server provided by Martin 'd0wn' Albus","Iceland","",https://dns.d0wn.biz,1,yes,yes,no,93.95.226.165,2.dnscrypt-cert.is2.d0wn.biz,8460:34A9:C630:CA3C:04AC:4A90:1625:F17A:87B2:ACB9:4180:AC48:1E2C:10E8:CEDE:1A6F,pubkey.is2.dnscrypt.d0wn.biz\r
-d0wn-it-ns1,"D0wn Resolver Italy 01","Server provided by Martin 'd0wn' Albus","Italy","",https://dns.d0wn.biz,1,yes,yes,no,31.14.133.188,2.dnscrypt-cert.it.d0wn.biz,2DEC:CEF8:A4D0:57DE:0D1A:CE8E:0A3C:BEB8:2135:61A8:BF0E:7373:0BA0:EC38:C876:3B50,pubkey.it.dnscrypt.d0wn.biz\r
-d0wn-lv-ns1,"D0wn Resolver Latvia 01","Server provided by Martin 'd0wn' Albus","Latvia","",https://dns.d0wn.biz,1,yes,yes,no,89.111.13.60,2.dnscrypt-cert.lv.d0wn.biz,9AC3:6B4C:7ADB:E7D6:D697:B6BF:151C:151A:B291:8C5D:B912:15F8:B986:5926:33A4:A5E1,pubkey.lv.dnscrypt.d0wn.biz\r
-d0wn-lv-ns2,"D0wn Resolver Latvia 02","Server provided by Martin 'd0wn' Albus","Latvia","",https://dns.d0wn.biz,1,yes,yes,no,185.86.151.28,2.dnscrypt-cert.lv2.d0wn.biz,B111:F80C:E3E0:1C36:CC73:0995:009E:6351:EF08:0503:309D:9417:7AA3:8C67:916D:0CDF,pubkey.lv.dnscrypt.d0wn.biz\r
-d0wn-lv-ns2-ipv6,"D0wn Resolver Latvia 01 over IPv6","Server provided by Martin 'd0wn' Albus","Latvia","",https://dns.d0wn.biz,1,yes,yes,no,[2a02:7aa0:1201::f60e:2719]:443,2.dnscrypt-cert.lv2.d0wn.biz,B111:F80C:E3E0:1C36:CC73:0995:009E:6351:EF08:0503:309D:9417:7AA3:8C67:916D:0CDF,pubkey.lv.dnscrypt.d0wn.biz\r
-d0wn-md-ns1,"D0wn Resolver Moldova 01","Server provided by Martin 'd0wn' Albus","Moldova","",https://dns.d0wn.biz,1,yes,yes,no,178.17.170.67:1053,2.dnscrypt-cert.md.d0wn.biz,3DB2:C4CB:39E2:6B82:FDDF:6D91:1A65:D164:F4F0:D237:8CDD:0C37:469F:24BA:B9A0:F9FF,pubkey.md.dnscrypt.d0wn.biz\r
-d0wn-md-ns1-ipv6,"D0wn Resolver Moldova 01 over IPv6","Server provided by Martin 'd0wn' Albus","Moldova","",https://dns.d0wn.biz,1,yes,yes,no,[2a00:1dc0:cafe::ad86:fa7e]:1053,2.dnscrypt-cert.md.d0wn.biz,3DB2:C4CB:39E2:6B82:FDDF:6D91:1A65:D164:F4F0:D237:8CDD:0C37:469F:24BA:B9A0:F9FF,pubkey.md.dnscrypt.d0wn.biz\r
-d0wn-mx-ns1,"D0wn Resolver Mexico 01","Server provided by Martin 'd0wn' Albus","Mexico","",https://dns.d0wn.biz,1,yes,yes,no,201.131.126.212,2.dnscrypt-cert.mx.d0wn.biz,999E:63F0:0DE7:C171:3A72:5625:2A3F:097B:EC3A:D28F:BE28:7569:5C37:E80D:3D55:4FD0,pubkey.mx.dnscrypt.d0wn.biz\r
-d0wn-nl-ns1,"D0wn Resolver Netherlands 01","Server provided by Martin 'd0wn' Albus","Netherlands","",https://dns.d0wn.biz,1,yes,yes,no,95.85.9.86:1053,2.dnscrypt-cert.nl.d0wn.biz,7BE6:68FE:A505:FFA7:4C27:C2CA:F881:59DA:038C:5741:13AA:2556:A4D2:2D0B:B6F0:009E,pubkey.nl.dnscrypt.d0wn.biz\r
-d0wn-nl-ns1-ipv6,"D0wn Resolver Netherlands 01 over IPv6","Server provided by Martin 'd0wn' Albus","Netherlands","",https://dns.d0wn.biz,1,yes,yes,no,[2a03:b0c0:0:1010::62:f001]:1053,2.dnscrypt-cert.nl.d0wn.biz,7BE6:68FE:A505:FFA7:4C27:C2CA:F881:59DA:038C:5741:13AA:2556:A4D2:2D0B:B6F0:009E,pubkey.nl.dnscrypt.d0wn.biz\r
-d0wn-nl-ns2,"D0wn Resolver Netherlands 02","Server provided by Martin 'd0wn' Albus","Netherlands","",https://dns.d0wn.biz,1,yes,yes,no,185.83.217.248:1053,2.dnscrypt-cert.nl2.d0wn.biz,DFAA:B7D8:29E6:1F34:4FED:2610:4221:70C9:ADC7:7E9F:A65F:4A46:0BAE:A735:3186:3B99,pubkey.nl2.dnscrypt.d0wn.biz\r
-d0wn-nl-ns2-ipv6,"D0wn Resolver Netherlands 02 over IPv6","Server provided by Martin 'd0wn' Albus","Netherlands","",https://dns.d0wn.biz,1,yes,yes,no,[2a02:2ca0:64:22::2]:1053,2.dnscrypt-cert.nl2.d0wn.biz,DFAA:B7D8:29E6:1F34:4FED:2610:4221:70C9:ADC7:7E9F:A65F:4A46:0BAE:A735:3186:3B99,pubkey.nl2.dnscrypt.d0wn.biz\r
-d0wn-nl-ns3,"D0wn Resolver Netherlands 03","Server provided by Martin 'd0wn' Albus","Netherlands","",https://dns.d0wn.biz,1,yes,yes,no,185.133.72.116,2.dnscrypt-cert.nl3.d0wn.biz,01FC:1AA9:F71F:F09E:55CE:0D04:9ACA:2B11:9536:319E:04A9:C3AE:77CB:127D:4C53:0651,pubkey.nl3.dnscrypt.d0wn.biz\r
-d0wn-nl-ns3-ipv6,"D0wn Resolver Netherlands 03 over IPv6","Server provided by Martin 'd0wn' Albus","Netherlands","",https://dns.d0wn.biz,1,yes,yes,no,[2a06:7240:5:601:dead:beef:e3e7:7a9d]:443,2.dnscrypt-cert.nl3.d0wn.biz,01FC:1AA9:F71F:F09E:55CE:0D04:9ACA:2B11:9536:319E:04A9:C3AE:77CB:127D:4C53:0651,pubkey.nl3.dnscrypt.d0wn.biz\r
-d0wn-nl-ns4,"D0wn Resolver Netherlands 04","Server provided by Martin 'd0wn' Albus","Netherlands","",https://dns.d0wn.biz,1,yes,yes,no,31.220.43.105,2.dnscrypt-cert.nl4.d0wn.biz,2A4F:4389:5CE6:3230:B4C5:76A5:AC38:6418:4D12:6949:B160:FDB0:9166:ABB4:CEC6:0672,pubkey.nl4.dnscrypt.d0wn.biz\r
-d0wn-random-ns2,"D0wn Resolver Netherlands Random 02","Server provided by Martin 'd0wn' Albus","Netherlands","",https://dns.d0wn.biz,1,yes,yes,no,185.14.29.140,2.dnscrypt-cert.random2.d0wn.biz,7D73:F486:3C01:4CC9:B278:D107:F254:7A4F:1EA2:1081:07B0:CB82:645A:D8A4:B98A:B327,pubkey.random2.dnscrypt.d0wn.biz\r
-d0wn-random-ns2-ipv6,"D0wn Resolver Netherlands Random 02 over IPv6","Server provided by Martin 'd0wn' Albus","Netherlands","",https://dns.d0wn.biz,1,yes,yes,no,[2a00:1ca8:a7::1e9]:443,2.dnscrypt-cert.random2.d0wn.biz,7D73:F486:3C01:4CC9:B278:D107:F254:7A4F:1EA2:1081:07B0:CB82:645A:D8A4:B98A:B327,pubkey.random2.dnscrypt.d0wn.biz\r
-d0wn-ro-ns1,"D0wn Resolver Romania 01","Server provided by Martin 'd0wn' Albus","Romania","",https://dns.d0wn.biz,1,yes,yes,no,77.81.104.121,2.dnscrypt-cert.ro.d0wn.biz,DA9E:6882:B0F8:335E:B5F4:A059:1B7D:EE6F:BD55:4451:93B4:13BF:AFFC:7D26:4527:CE1A,pubkey.ro.dnscrypt.d0wn.biz\r
-d0wn-ro-ns1-ipv6,"D0wn Resolver Romania 01 over IPv6","Server provided by Martin 'd0wn' Albus","Romania","",https://dns.d0wn.biz,1,yes,yes,no,[2a04:9dc0:c1:7::cb9:f785]:443,2.dnscrypt-cert.ro.d0wn.biz,DA9E:6882:B0F8:335E:B5F4:A059:1B7D:EE6F:BD55:4451:93B4:13BF:AFFC:7D26:4527:CE1A,pubkey.ro.dnscrypt.d0wn.biz\r
-d0wn-ru-ns1,"D0wn Resolver Russia 01","Server provided by Martin 'd0wn' Albus","Russia","",https://dns.d0wn.biz,1,yes,yes,no,91.214.71.181,2.dnscrypt-cert.ru.d0wn.biz,0ECA:BC40:E0A1:335F:0221:4240:AB86:2919:D16A:2393:CCEB:4B40:9EB9:4F24:3077:ED99,pubkey.ru.dnscrypt.d0wn.biz\r
-d0wn-se-ns1,"D0wn Resolver Sweden 01","Server provided by Martin 'd0wn' Albus","Sweden","",https://dns.d0wn.biz,1,yes,yes,no,95.215.44.124,2.dnscrypt-cert.se.d0wn.biz,9D4F:762B:DD24:F77A:64B4:7E0F:F5C6:93FD:A02A:39E9:8FEC:0CEE:F252:3A5F:A403:C032,pubkey.se.dnscrypt.d0wn.biz\r
-d0wn-se-ns1-ipv6,"D0wn Resolver Sweden 01 over IPv6","Server provided by Martin 'd0wn' Albus","Sweden","",https://dns.d0wn.biz,1,yes,yes,no,[2a02:7aa0:1619::4f50:a69]:443,2.dnscrypt-cert.se.d0wn.biz,9D4F:762B:DD24:F77A:64B4:7E0F:F5C6:93FD:A02A:39E9:8FEC:0CEE:F252:3A5F:A403:C032,pubkey.se.dnscrypt.d0wn.biz\r
-d0wn-se-ns2,"D0wn Resolver Sweden 02","Server provided by Martin 'd0wn' Albus","Sweden","",https://dns.d0wn.biz,1,yes,yes,no,31.220.5.186,2.dnscrypt-cert.se2.d0wn.biz,C57D:D6A4:178E:ADE2:D0C0:B138:A4D4:074A:DF59:1488:8711:5CAC:EB60:A37B:3492:DA15,pubkey.se2.dnscrypt.d0wn.biz\r
-d0wn-sg-ns1,"D0wn Resolver Singapore 01","Server provided by Martin 'd0wn' Albus","Singapore","",https://dns.d0wn.biz,1,yes,yes,no,128.199.248.105,2.dnscrypt-cert.sg.d0wn.biz,D82B:2B76:1DA0:8470:B55B:820C:FAAB:9F32:D632:E9E0:5616:2CE7:7D21:E970:98FF:4A34,pubkey.sg.dnscrypt.d0wn.biz\r
-d0wn-sg-ns1-ipv6,"D0wn Resolver Singapore 01 over IPv6","Server provided by Martin 'd0wn' Albus","Singapore","",https://dns.d0wn.biz,1,yes,yes,no,[2400:6180:0:d0::38:d001]:443,2.dnscrypt-cert.sg.d0wn.biz,D82B:2B76:1DA0:8470:B55B:820C:FAAB:9F32:D632:E9E0:5616:2CE7:7D21:E970:98FF:4A34,pubkey.sg.dnscrypt.d0wn.biz\r
-d0wn-sg-ns2,"D0wn Resolver Singapore 02","Server provided by Martin 'd0wn' Albus","Singapore","",https://dns.d0wn.biz,1,yes,yes,no,210.16.120.139,2.dnscrypt-cert.sg2.d0wn.biz,0F00:63C4:6EAF:29C3:29CD:E125:2033:6F0A:0C72:7CDD:F1F4:3D47:F95D:02BC:07F7:9FFC,pubkey.sg2.dnscrypt.d0wn.biz\r
-d0wn-sg-ns2-ipv6,"D0wn Resolver Singapore 02 over IPv6","Server provided by Martin 'd0wn' Albus","Singapore","",https://dns.d0wn.biz,1,yes,yes,no,[2403:5680::1:200f]:443,2.dnscrypt-cert.sg2.d0wn.biz,0F00:63C4:6EAF:29C3:29CD:E125:2033:6F0A:0C72:7CDD:F1F4:3D47:F95D:02BC:07F7:9FFC,pubkey.sg2.dnscrypt.d0wn.biz\r
-d0wn-tz-ns1,"D0wn Resolver Tanzania 01","Server provided by Martin 'd0wn' Albus","Tanzania","",https://dns.d0wn.biz,1,yes,yes,no,41.79.69.13,2.dnscrypt-cert.tz.d0wn.biz,D606:15FB:D145:3BA1:4E76:8A3E:5C5C:B3AC:1746:1331:463D:A0AF:8CF7:DF04:DA4D:756D,pubkey.tz.dnscrypt.d0wn.biz\r
-d0wn-tz-ns1-ipv6,"D0wn Resolver Tanzania 01 over IPv6","Server provided by Martin 'd0wn' Albus","Tanzania","",https://dns.d0wn.biz,1,yes,yes,no,[2c0f:fda8:5::2ed1:d2ec]:443,2.dnscrypt-cert.tz.d0wn.biz,D606:15FB:D145:3BA1:4E76:8A3E:5C5C:B3AC:1746:1331:463D:A0AF:8CF7:DF04:DA4D:756D,pubkey.tz.dnscrypt.d0wn.biz\r
-d0wn-us-ns1,"D0wn Resolver United States of America 01","Server provided by Martin 'd0wn' Albus","United States of America","",https://dns.d0wn.biz,1,yes,yes,no,107.181.187.219,2.dnscrypt-cert.us.d0wn.biz,04BB:6100:7CFF:C72B:AF91:8942:F9DC:12A9:61A1:C6F2:177F:7CF9:F3C9:1B43:9FBE:6B80,pubkey.us.dnscrypt.d0wn.biz\r
-d0wn-us-ns2,"D0wn Resolver United States of America 02","Server provided by Martin 'd0wn' Albus","United States of America","",https://dns.d0wn.biz,1,yes,yes,no,192.252.222.24,2.dnscrypt-cert.us2.d0wn.biz,729B:FABE:2295:D469:E911:F97E:3EE4:F6DB:0190:EA6F:7CF3:F7EE:BB6B:99B1:698A:237D,pubkey.us2.dnscrypt.d0wn.biz\r
-d0wn-us-ns4,"D0wn Resolver United States of America 04","Server provided by Martin 'd0wn' Albus","United States of America","",https://dns.d0wn.biz,1,yes,yes,no,107.181.168.52,2.dnscrypt-cert.us4.d0wn.biz,F392:5D53:A315:66C2:ACF2:B2D2:8A69:6739:B066:1B8C:EF1B:3AFD:E828:0D83:D4EA:6D7D,pubkey.us4.dnscrypt.d0wn.biz\r
-d0wn-za-ns1,"D0wn Resolver South Africa 01","Server provided by Martin 'd0wn' Albus","South Africa","",https://dns.d0wn.biz,1,yes,yes,no,169.239.181.3,2.dnscrypt-cert.za.d0wn.biz,FBBD:0F3A:AF2B:B1BB:CD8F:9324:D5F6:A68C:E722:3890:8B90:92CF:F6D2:BF7C:9EC1:1368,pubkey.za.dnscrypt.d0wn.biz\r
-dnscrypt.eu-dk,"DNSCrypt.eu Denmark","Free, non-logged, uncensored. Hosted by Netgroup.","Denmark","",https://dnscrypt.eu,1,yes,yes,no,77.66.84.233,2.dnscrypt-cert.resolver2.dnscrypt.eu,3748:5585:E3B9:D088:FD25:AD36:B037:01F5:520C:D648:9E9A:DD52:1457:4955:9F0A:9955,pubkey.resolver2.dnscrypt.eu\r
-dnscrypt.eu-dk-ipv6,"DNSCrypt.eu Denmark over IPv6","Free, non-logged, uncensored. Hosted by Netgroup.","Denmark","",https://dnscrypt.eu,1,yes,yes,no,[2001:1448:243::dc2]:443,2.dnscrypt-cert.resolver2.dnscrypt.eu,3748:5585:E3B9:D088:FD25:AD36:B037:01F5:520C:D648:9E9A:DD52:1457:4955:9F0A:9955,pubkey.resolver2.dnscrypt.eu\r
-dnscrypt.eu-nl,"DNSCrypt.eu Holland","Free, non-logged, uncensored. Hosted by RamNode.","Netherlands","",https://dnscrypt.eu,1,yes,yes,no,176.56.237.171,2.dnscrypt-cert.resolver1.dnscrypt.eu,67C0:0F2C:21C5:5481:45DD:7CB4:6A27:1AF2:EB96:9931:40A3:09B6:2B8D:1653:1185:9C66,pubkey.resolver1.dnscrypt.eu\r
-dnscrypt.eu-nl-ipv6,"DNSCrypt.eu Holland over IPv6","Free, non-logged, uncensored. Hosted by RamNode.","Netherlands","",https://dnscrypt.eu,1,yes,yes,no,[2a00:d880:3:1::a6c1:2e89]:443,2.dnscrypt-cert.resolver1.dnscrypt.eu,67C0:0F2C:21C5:5481:45DD:7CB4:6A27:1AF2:EB96:9931:40A3:09B6:2B8D:1653:1185:9C66,pubkey.resolver1.dnscrypt.eu\r
-dnscrypt.nl-ns0,"DNSCrypt.nl The Netherlands (NL)","Public DNSCrypt server in Amsterdam, the Netherlands","Netherlands","",https://dnscrypt.nl,1,yes,yes,no,45.76.35.212,2.dnscrypt-cert.ns0.dnscrypt.nl,4C84:FB8C:0511:5DFA:5F97:C5ED:0329:1370:C78A:BCD6:4E15:DD53:AB08:DE72:FB84:4ACA,pkey.ns0.dnscrypt.nl\r
-dnscrypt.nl-ns0-ipv6,"DNSCrypt.nl The Netherlands (NL) over IPv6","Public DNSCrypt server in Amsterdam, the Netherlands","Netherlands","",https://dnscrypt.nl,1,yes,yes,no,[2001:19f0:5001:30a:5400:ff:fe58:7140]:443,2.dnscrypt-cert.ns0.dnscrypt.nl,4C84:FB8C:0511:5DFA:5F97:C5ED:0329:1370:C78A:BCD6:4E15:DD53:AB08:DE72:FB84:4ACA,pkey.ns0.dnscrypt.nl\r
-dnscrypt.org-fr,"DNSCrypt.org France","DNSSEC/Non-logged/Uncensored - ARM server donated by Scaleway.com","Paris, France","",https://fr.dnscrypt.org,2,yes,yes,no,212.47.228.136,2.dnscrypt-cert.fr.dnscrypt.org,E801:B84E:A606:BFB0:BAC0:CE43:445B:B15E:BA64:B02F:A3C4:AA31:AE10:636A:0790:324D,pubkey.fr.dnscrypt.org\r
-freetsa.org,"FreeTSA USA DNSCrypt server","Non-logged/Uncensored provided by freetsa.org","California","","https://freetsa.org",1,"yes","yes","no",205.185.116.116:553,2.dnscrypt-cert.freetsa.org,D8FF:BB42:E031:BE7A:7973:0B45:568D:496A:4E8A:CB59:AA83:66FD:6AB9:1E27:2A7D:16E4,pubkey.freetsa.org\r
-fvz-anyone,"Primary OpenNIC Anycast DNS Resolver","Fusl's public primary OpenNIC Tier2 Anycast DNS Resolver","Anycast","",http://dnsrec.meo.ws/,1,no,yes,no,185.121.177.177,2.dnscrypt-cert.dnsrec.meo.ws,1A6A:D0A3:2B4C:5A61:A695:D153:670D:69AB:1690:3F9E:C3F7:F64F:13E5:35A3:18B2:28A5,\r
-fvz-anyone-ipv6,"Primary OpenNIC Anycast DNS IPv6 Resolver","Fusl's public primary OpenNIC Tier2 Anycast DNS Resolver","Anycast","",http://dnsrec.meo.ws/,1,no,yes,no,[2a05:dfc7:5::53],2.dnscrypt-cert.dnsrec.meo.ws,1A6A:D0A3:2B4C:5A61:A695:D153:670D:69AB:1690:3F9E:C3F7:F64F:13E5:35A3:18B2:28A5,\r
-fvz-anytwo,"Secondary OpenNIC Anycast DNS Resolver","Fusl's public secondary OpenNIC Tier2 Anycast DNS Resolver","Anycast","",http://dnsrec.meo.ws/,1,no,yes,no,169.239.202.202,2.dnscrypt-cert.dnsrec.meo.ws,1A6A:D0A3:2B4C:5A61:A695:D153:670D:69AB:1690:3F9E:C3F7:F64F:13E5:35A3:18B2:28A5,\r
-fvz-anytwo-ipv6,"Secondary OpenNIC Anycast DNS IPv6 Resolver","Fusl's public secondary OpenNIC Tier2 Anycast DNS Resolver","Anycast","",http://dnsrec.meo.ws/,1,no,yes,no,[2a05:dfc7:5::5353],2.dnscrypt-cert.dnsrec.meo.ws,1A6A:D0A3:2B4C:5A61:A695:D153:670D:69AB:1690:3F9E:C3F7:F64F:13E5:35A3:18B2:28A5,\r
-ipredator,"Ipredator.se Server","Public DNSCrypt server in Sweden provided by Ipredator.se","Sweden","",https://www.ipredator.se,1,yes,yes,no,194.132.32.32,2.dnscrypt-cert.ipredator.se,C44C:566A:A8D6:46C4:32B1:04F5:3D00:961B:32DC:71CF:1C04:BD9E:B013:E480:E7A4:7828,pubkey.resolver2.ipredator.se\r
-ns0.dnscrypt.is,"ns0.dnscrypt.is in Reykjavík, Iceland","DNSSEC enabled, non-logging, uncensored. Sponsored by 1984 Hosting.","Reykjavík, Iceland","",https://dnscrypt.is,1,yes,yes,no,93.95.228.87,2.dnscrypt-cert.ns0.dnscrypt.is,EE41:6A83:451C:218F:37B2:B736:78C4:999F:7DE6:89D1:31D2:7866:7C8E:A8BB:1C95:B402,pubkey.ns0.dnscrypt.is\r
-nxd.ist,"nxd.ist","DNSSEC enabled, non-logging, uncensored.","San Francisco CA","",https://nxd.ist,1,yes,yes,no,104.196.239.247,2.dnscrypt-cert.nxd.ist,146D:E394:BDCD:25F5:AA68:822A:A9D7:4792:C07E:5DF2:7172:3CBD:2347:161A:4433:8F59,pubkey.nxd.ist\r
-okturtles,"okTurtles","For a surveillance-free world. HTTPS is broken. DNSChain fixes it.","Georgia, US","33.032501, -83.895699",http://okturtles.com/,1,no,yes,no,23.226.227.93,2.dnscrypt-cert.okturtles.com,1D85:3953:E34F:AFD0:05F9:4C6F:D1CC:E635:D411:9904:0D48:D19A:5D35:0B6A:7C81:73CB,\r
-opennic-tumabox,"TumaBox","Public DNS server operated by TumaBox.org","Germany","",http://wiki.tumabox.org/doku.php?id=dns,1,no,yes,no,130.255.73.90:5353,2.tumabox.org,D591:7B11:6A35:3114:C238:AA99:A6EB:0C28:7CF7:6805:41AC:5DBF:A8A0:239E:228C:5B06,\r
-opennic-tumabox-ipv6,"TumaBox over IPv6","Public DNS server operated by TumaBox.org","Germany","",http://wiki.tumabox.org/doku.php?id=dns,1,no,yes,no,[2a02:e00:fffd:139::9]:5353,2.tumabox.org,D591:7B11:6A35:3114:C238:AA99:A6EB:0C28:7CF7:6805:41AC:5DBF:A8A0:239E:228C:5B06,\r
-ovpnse,"OVPN.se Integritet AB","Public DNS server in Sweden by OVPN.se","Sweden","59.2877011, 18.0771273",https://www.ovpn.se,1,no,yes,no,46.227.67.134:55,2.dnscrypt-cert.dnscrypt01.ovpn.se,B0D6:3658:E23F:5AE1:495C:03C2:319D:D6F1:F2E1:E067:BD23:6F56:503F:27A8:C5D9:2390,\r
-soltysiak,"Soltysiak","Public DNSCrypt server in Poland","Poland","52.4014619, 16.9278078",http://dc1.soltysiak.com/,1,yes,yes,yes,178.216.201.222:2053,2.dnscrypt-cert.soltysiak.com,25C4:E188:2915:4697:8F9C:2BBD:B6A7:AFA4:01ED:A051:0508:5D53:03E7:1928:C066:8F21,pubkey.dc1.soltysiak.com\r
-soltysiak-ipv6,"Soltysiak over IPv6","Public DNSCrypt server in Poland","Poland","52.4014619, 16.9278078",http://dc1.soltysiak.com/,1,yes,yes,yes,[2001:470:70:4ff::2]:2053,2.dnscrypt-cert.soltysiak.com,25C4:E188:2915:4697:8F9C:2BBD:B6A7:AFA4:01ED:A051:0508:5D53:03E7:1928:C066:8F21,pubkey.dc1.soltysiak.com\r
-ventricle.us,"Anatomical DNS","Public DNSCrypt resolver provided by Jacob Henner","New York, NY","",https://jacobhenner.com,1,yes,yes,no,107.170.57.34,2.dnscrypt-cert.dnscrypt.ventricle.us,E985:F118:AD4E:3CC6:5FF2:2520:1890:C6F5:58B7:5B5A:52F5:6B17:CFEA:C100:5C8B:9BAA,pubkey.dnscrypt.ventricle.us\r
-yandex,"Yandex","Yandex public DNS server","Anycast","",https://www.yandex.com,1,no,no,no,77.88.8.78:15353,2.dnscrypt-cert.browser.yandex.net,D384:C071:C9F7:4662:AF2A:CCD5:7B5D:CC97:14D4:07B6:AD36:01E1:AEDC:06D5:6D49:6327,\r
+Name,"Full name","Description","Location","Coordinates",URL,Version,DNSSEC validation,No logs,Namecoin,Resolver address,Provider name,Provider public key,Provider public key TXT record
+adguard-dns-family-ns1,"Adguard DNS Family Protection 1","Adguard DNS with safesearch and adult content blocking","Anycast","",https://adguard.com/en/adguard-dns/overview.html,1,no,yes,no,176.103.130.132:5443,2.dnscrypt.family.ns1.adguard.com,B831:5DD7:B14B:6EE3:20A4:70DC:2ED6:B1AA:398C:C9E5:86F8:5D45:45D6:B8C9:B500:5ABA,pk.family.ns1.adguard.com
+adguard-dns-family-ns2,"Adguard DNS Family Protection 2","Adguard DNS with safesearch and adult content blocking","Anycast","",https://adguard.com/en/adguard-dns/overview.html,1,no,yes,no,176.103.130.134:5443,2.dnscrypt.family.ns2.adguard.com,8C21:17A9:EBC1:57D6:FB64:056F:0ADB:C11C:5D83:6734:73C4:6E25:8D9B:2F57:D4EE:351F,pk.family.ns2.adguard.com
+adguard-dns-ns1,"Adguard DNS 1","Remove ads and protect your computer from malware","Anycast","",https://adguard.com/en/adguard-dns/overview.html,1,no,yes,no,176.103.130.130:5443,2.dnscrypt.default.ns1.adguard.com,D12B:47F2:52DC:F2C2:BBF8:9910:86EA:F79C:E449:5D8B:16C8:A0C4:322E:52CA:3F39:0873,pk.default.ns1.adguard.com
+adguard-dns-ns2,"Adguard DNS 2","Remove ads and protect your computer from malware","Anycast","",https://adguard.com/en/adguard-dns/overview.html,1,no,yes,no,176.103.130.131:5443,2.dnscrypt.default.ns2.adguard.com,81D0:02D3:6A4C:A50C:473B:7479:650F:E12E:02B3:21CB:6138:562A:208E:403D:FDC5:5E94,pk.default.ns2.adguard.com
+bikinhappy-sg,"BikinHappy Singapore","provided by bikinhappy.com","Singapore","",http://dns.bikinhappy.com,1,yes,yes,no,172.104.46.253:443,2.dnscrypt-cert.dns.bikinhappy.com,7167:91A0:745E:17ED:1E73:D426:C697:E8DF:EE4B:476B:149F:8449:62DD:4615:BD71:5C70,
+bn-fr0,"Babylon Network France 0","Non-logging, uncensored DNS resolver provided by Babylon Network","Roubaix, France","",https://babylon.network,1,no,yes,no,5.135.66.222:5353,2.dnscrypt-cert.babylon.network,8794:070A:143D:35CA:1CA6:32E7:B189:3028:4EAE:5DAF:EBB4:01E3:DF52:E9F0:37AB:D182,pk.fr0.dnscrypt.babylon.network
+bn-fr0-ipv6,"Babylon Network France 0 (IPv6)","Non-logging, uncensored IPv6 DNS resolver provided by Babylon Network","Roubaix, France","",https://babylon.network,1,no,yes,no,[2001:41d0:8:4480::222]:5353,2.dnscrypt-cert.babylon.network,8794:070A:143D:35CA:1CA6:32E7:B189:3028:4EAE:5DAF:EBB4:01E3:DF52:E9F0:37AB:D182,pk.fr0.dnscrypt.babylon.network
+bn-fr1,"Babylon Network France 1","Non-logging, uncensored DNS resolver provided by Babylon Network","Roubaix, France","",https://babylon.network,1,no,yes,no,164.132.130.171:5353,2.dnscrypt-cert.babylon.network,8794:070A:143D:35CA:1CA6:32E7:B189:3028:4EAE:5DAF:EBB4:01E3:DF52:E9F0:37AB:D182,pk.fr1.dnscrypt.babylon.network
+bn-fr1-ipv6,"Babylon Network France 1 (IPv6)","Non-logging, uncensored IPv6 DNS resolver provided by Babylon Network","Roubaix, France","",https://babylon.network,1,no,yes,no,[2001:41d0:1:82b5::171]:5353,2.dnscrypt-cert.babylon.network,8794:070A:143D:35CA:1CA6:32E7:B189:3028:4EAE:5DAF:EBB4:01E3:DF52:E9F0:37AB:D182,pk.fr1.dnscrypt.babylon.network
+bn-nl0,"Babylon Network Netherlands 0","Non-logging, uncensored DNS resolver provided by Babylon Network","Amsterdam, The Netherlands","",https://babylon.network,1,no,yes,no,87.253.152.190:5353,2.dnscrypt-cert.babylon.network,8794:070A:143D:35CA:1CA6:32E7:B189:3028:4EAE:5DAF:EBB4:01E3:DF52:E9F0:37AB:D182,pk.nl0.dnscrypt.babylon.network
+bn-nl0-ipv6,"Babylon Network Netherlands 0 (IPv6)","Non-logging, uncensored IPv6 DNS resolver provided by Babylon Network","Amsterdam, The Netherlands","",https://babylon.network,1,no,yes,no,[2a01:7c8:c020:3::190]:5353,2.dnscrypt-cert.babylon.network,8794:070A:143D:35CA:1CA6:32E7:B189:3028:4EAE:5DAF:EBB4:01E3:DF52:E9F0:37AB:D182,pk.nl0.dnscrypt.babylon.network
+cisco,"Cisco OpenDNS","Remove your DNS blind spot","Anycast","",https://www.opendns.com,1,no,no,no,208.67.220.220,2.dnscrypt-cert.opendns.com,B735:1140:206F:225D:3E2B:D822:D7FD:691E:A1C3:3CC8:D666:8D0C:BE04:BFAB:CA43:FB79,
+cisco-familyshield,"Cisco OpenDNS with FamilyShield","Block websites not suitable for children","Anycast","",https://www.opendns.com/home-internet-security/parental-controls/,1,no,no,no,208.67.220.123,2.dnscrypt-cert.opendns.com,B735:1140:206F:225D:3E2B:D822:D7FD:691E:A1C3:3CC8:D666:8D0C:BE04:BFAB:CA43:FB79,
+cisco-ipv6,"Cisco OpenDNS over IPv6","Cisco OpenDNS IPv6 sandbox","Anycast","",https://www.opendns.com/about/innovations/ipv6/,1,no,no,no,[2620:0:ccc::2]:443,2.dnscrypt-cert.opendns.com,B735:1140:206F:225D:3E2B:D822:D7FD:691E:A1C3:3CC8:D666:8D0C:BE04:BFAB:CA43:FB79,
+cpunks-ru,"Cypherpunks.ru","Cypherpunks.ru public DNS server",Russia,,http://www.cypherpunks.ru/DNSCrypt.html,1,no,yes,no,77.51.181.209:5353,2.dnscrypt-cert.cypherpunks.ru,1838:CCA3:D953:0A66:3433:5D50:05BD:3758:44E3:977E:E868:2B6C:5528:12BD:A78D:2E99,
+cs-caeast,"CS Canada east DNSCrypt server","provided by cryptostorm.is","Montreal, CA",,"https://cryptostorm.is",1,"no","yes","yes",167.114.84.132:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-cawest,"CS Canada west DNSCrypt server","provided by cryptostorm.is","Vancouver, CA",,"https://cryptostorm.is",1,"no","yes","yes",162.221.207.228:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-cfi,"CS cryptofree France DNSCrypt server","provided by cryptostorm.is","Paris, France",,"https://cryptostorm.is",1,"no","yes","yes",212.83.175.31:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-cfii,"CS secondary cryptofree France DNSCrypt server","provided by cryptostorm.is","Paris, France",,"https://cryptostorm.is",1,"no","yes","yes",23.105.70.204:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-ch,"CS Switzerland DNSCrypt server","provided by cryptostorm.is","Baar, Switzerland",,"https://cryptostorm.is",1,"no","yes","yes",185.60.147.77:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-de,"CS Frankfurt, DE DNSCrypt server","provided by cryptostorm.is","Frankfurt, Germany",,"https://cryptostorm.is",1,"no","yes","yes",84.16.240.43:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-de3,"CS Dusseldorf, DE DNSCrypt server","provided by cryptostorm.is","Dusseldorf, Germany",,"https://cryptostorm.is",1,"no","yes","yes",89.163.214.174:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-dk,"CS Denmark DNSCrypt server","provided by cryptostorm.is","Copenhagen, Denmark",,"https://cryptostorm.is",1,"no","yes","yes",82.103.131.172:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-dk2,"CS secondary Denmark DNSCrypt server","provided by cryptostorm.is","Copenhagen, Denmark",,"https://cryptostorm.is",1,"no","yes","yes",185.212.169.139:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-es,"CS Spain DNSCrypt server","provided by cryptostorm.is","Valencia, Spain",,"https://cryptostorm.is",1,"no","yes","yes",185.140.114.51:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-fi,"CS Finland DNSCrypt server","provided by cryptostorm.is","Helsinki, Finland",,"https://cryptostorm.is",1,"no","yes","yes",185.117.118.20:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-fr,"CS France DNSCrypt server","provided by cryptostorm.is","Paris, France",,"https://cryptostorm.is",1,"no","yes","yes",212.129.46.86:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-fr2,"CS secondary France DNSCrypt server","provided by cryptostorm.is","Paris, France",,"https://cryptostorm.is",1,"no","yes","yes",212.129.46.32:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-lt,"CS Lithuania DNSCrypt server","provided by cryptostorm.is","Vilnius, Lithuania",,"https://cryptostorm.is",1,"no","yes","yes",46.166.170.10:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-lv,"CS Latvia DNSCrypt server","provided by cryptostorm.is","Riga, Latvia",,"https://cryptostorm.is",1,"no","yes","yes",80.233.134.52:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-md,"CS Moldova DNSCrypt server","provided by cryptostorm.is","Chisinau, Moldova",,"https://cryptostorm.is",1,"no","yes","yes",176.123.3.249:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-nl,"CS Netherlands DNSCrypt server","provided by cryptostorm.is","Rotterdam, Netherlands",,"https://cryptostorm.is",1,"no","yes","yes",213.163.64.208:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-pl,"CS Poland DNSCrypt server","provided by cryptostorm.is","Warsaw, Poland",,"https://cryptostorm.is",1,"no","yes","yes",5.133.8.187:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-pt,"CS Portugal DNSCrypt server","provided by cryptostorm.is","Lisbon, Portugal",,"https://cryptostorm.is",1,"no","yes","yes",109.71.42.228:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-ro,"CS Romania DNSCrypt server","provided by cryptostorm.is","Romania",,"https://cryptostorm.is",1,"no","yes","yes",5.254.96.195:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-rome,"CS Italy DNSCrypt server","provided by cryptostorm.is","Rome, Italy",,"https://cryptostorm.is",1,"no","yes","yes",185.94.193.234:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-uk,"CS England DNSCrypt server","provided by cryptostorm.is","Rugby, England",,"https://cryptostorm.is",1,"no","yes","yes",5.101.137.251:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-useast,"CS New York City NY US DNSCrypt server","provided by cryptostorm.is","Buffalo, NY",,"https://cryptostorm.is",1,"no","yes","yes",173.234.159.235:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-useast2,"CS Washington DC US DNSCrypt server","provided by cryptostorm.is","Washington, DC",,"https://cryptostorm.is",1,"no","yes","yes",198.7.58.227:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-usnorth,"CS Chicago IL US DNSCrypt server","provided by cryptostorm.is","Chicago, IL",,"https://cryptostorm.is",1,"no","yes","yes",173.234.56.115:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-ussouth,"CS Dallas TX US DNSCrypt server","provided by cryptostorm.is","Dallas, TX",,"https://cryptostorm.is",1,"no","yes","yes",70.32.38.67:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-ussouth2,"CS Atlanta GA US DNSCrypt server","provided by cryptostorm.is","Atlanta, GA",,"https://cryptostorm.is",1,"no","yes","yes",108.62.19.131:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-uswest,"CS Seattle WA US DNSCrypt server","provided by cryptostorm.is","Seattle, WA",,"https://cryptostorm.is",1,"no","yes","yes",64.120.5.251:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-uswest3,"CS secondary Las Vegas NV US DNSCrypt server","provided by cryptostorm.is","Las Vegas, NV",,"https://cryptostorm.is",1,"no","yes","yes",104.238.195.139:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+cs-uswest5,"CS Los Angeles CA US DNSCrypt server","provided by cryptostorm.is","Los Angeles, CA",,"https://cryptostorm.is",1,"no","yes","yes",173.208.95.75:443,2.dnscrypt-cert.cryptostorm.is,3133:72AD:5956:32C2:416B:872F:098F:851B:DDB9:6528:4C6C:BE9A:4F19:0964:30DB:A95A,
+d0wn-at-ns1,"D0wn Resolver Austria 01","Server provided by Martin 'd0wn' Albus","Austria","",https://dns.d0wn.biz,1,yes,yes,no,79.133.33.52,2.dnscrypt-cert.at.d0wn.biz,717E:5DF4:1841:CD4B:D92E:CE16:ECCC:443D:B305:B03D:86E6:69B7:4AC1:FBB6:18D0:2BB4,pubkey.at.dnscrypt.d0wn.biz
+d0wn-cz-ns1,"D0wn Resolver Czech Republic 01","Server provided by Martin 'd0wn' Albus","Czech Republic","",https://dns.d0wn.biz,1,yes,yes,no,81.2.237.32,2.dnscrypt-cert.cz.d0wn.biz,EE21:5055:4DA0:1367:BAC3:768A:7C1E:24BF:D777:ACD5:77A4:44F8:BDF3:84E0:5966:D855,pubkey.cz.dnscrypt.d0wn.biz
+d0wn-de-ns1,"D0wn Resolver Germany 01","Server provided by Martin 'd0wn' Albus","Germany","",https://dns.d0wn.biz,1,yes,yes,no,82.211.31.248,2.dnscrypt-cert.de.d0wn.biz,B040:19F8:8D49:4682:41E3:EB58:5F61:173F:EF8E:55DA:0597:2DB7:27BB:C153:1DD8:D109,pubkey.de.dnscrypt.d0wn.biz
+d0wn-de-ns1-ipv6,"D0wn Resolver Germany 01 over IPv6","Server provided by Martin 'd0wn' Albus","Germany","",https://dns.d0wn.biz,1,yes,yes,no,[2001:1608:10:195:3:dead:beef:cafe]:443,2.dnscrypt-cert.de.d0wn.biz,B040:19F8:8D49:4682:41E3:EB58:5F61:173F:EF8E:55DA:0597:2DB7:27BB:C153:1DD8:D109,pubkey.de.dnscrypt.d0wn.biz
+d0wn-es-ns1,"D0wn Resolver Spain 01","Server provided by Martin 'd0wn' Albus","Spain","",https://dns.d0wn.biz,1,yes,yes,no,91.142.220.29,2.dnscrypt-cert.es.d0wn.biz,EB09:E854:AEDA:9705:CB47:ED69:EADD:4156:3653:82C5:C88D:A2E3:6917:3B54:4774:7505,pubkey.es.dnscrypt.d0wn.biz
+d0wn-fr-ns1,"D0wn Resolver France 01","Server provided by Martin 'd0wn' Albus","France","",https://dns.d0wn.biz,1,yes,yes,no,151.80.7.115:1053,2.dnscrypt-cert.fr.d0wn.biz,58A8:22D3:29EB:C14F:BCEB:45AF:42EB:2F58:C797:0AD3:ED31:397D:1D34:8636:2375:7251,pubkey.fr.dnscrypt.d0wn.biz
+d0wn-fr-ns2,"D0wn Resolver France 02","Server provided by Martin 'd0wn' Albus","France","",https://dns.d0wn.biz,1,yes,yes,no,37.187.0.40,2.dnscrypt-cert.fr2.d0wn.biz,25A7:DB7B:7835:55D5:7DA4:7C0C:57F8:9C5F:0220:3D09:67E3:585A:723E:E0D1:CB38:F767,pubkey.fr2.dnscrypt.d0wn.biz
+d0wn-fr-ns2-ipv6,"D0wn Resolver France 02 over IPv6","Server provided by Martin 'd0wn' Albus","France","",https://dns.d0wn.biz,1,yes,yes,no,[2001:41D0:A:0028::1]:443,2.dnscrypt-cert.fr2.d0wn.biz,25A7:DB7B:7835:55D5:7DA4:7C0C:57F8:9C5F:0220:3D09:67E3:585A:723E:E0D1:CB38:F767,pubkey.fr2.dnscrypt.d0wn.biz
+d0wn-gr-ns1,"D0wn Resolver Greece 01","Server provided by Martin 'd0wn' Albus","Greece","",https://dns.d0wn.biz,1,yes,yes,no,85.25.105.193,2.dnscrypt-cert.gr.d0wn.biz,B19C:0B5C:48F2:58FA:0BE4:67F4:5F50:BC7F:985F:C544:8A4F:BC9D:5574:5A35:5701:8009,pubkey.gr.dnscrypt.d0wn.biz
+d0wn-id-ns1,"D0wn Resolver Indonesia 01","Server provided by Martin 'd0wn' Albus","Indonesia","",https://dns.d0wn.biz,1,yes,yes,no,45.114.118.195,2.dnscrypt-cert.id.d0wn.biz,BE93:B3F1:2A3B:2448:8F33:F91F:9461:5F73:D5CA:56D6:C789:96DE:7A18:D4DE:5182:094D,pubkey.id.dnscrypt.d0wn.biz
+d0wn-is-ns1,"D0wn Resolver Iceland 01","Server provided by Martin 'd0wn' Albus","Iceland","",https://dns.d0wn.biz,1,yes,yes,no,37.235.49.61,2.dnscrypt-cert.is.d0wn.biz,2B28:974E:073A:6B38:722A:5BE1:F7A0:250C:508F:A809:238F:8F3D:76D8:6098:20D7:B2D9,pubkey.is.dnscrypt.d0wn.biz
+d0wn-is-ns2,"D0wn Resolver Iceland 02","Server provided by Martin 'd0wn' Albus","Iceland","",https://dns.d0wn.biz,1,yes,yes,no,93.95.226.165,2.dnscrypt-cert.is2.d0wn.biz,8460:34A9:C630:CA3C:04AC:4A90:1625:F17A:87B2:ACB9:4180:AC48:1E2C:10E8:CEDE:1A6F,pubkey.is2.dnscrypt.d0wn.biz
+d0wn-it-ns1,"D0wn Resolver Italy 01","Server provided by Martin 'd0wn' Albus","Italy","",https://dns.d0wn.biz,1,yes,yes,no,31.14.133.188,2.dnscrypt-cert.it.d0wn.biz,2DEC:CEF8:A4D0:57DE:0D1A:CE8E:0A3C:BEB8:2135:61A8:BF0E:7373:0BA0:EC38:C876:3B50,pubkey.it.dnscrypt.d0wn.biz
+d0wn-lv-ns1,"D0wn Resolver Latvia 01","Server provided by Martin 'd0wn' Albus","Latvia","",https://dns.d0wn.biz,1,yes,yes,no,89.111.13.60,2.dnscrypt-cert.lv.d0wn.biz,9AC3:6B4C:7ADB:E7D6:D697:B6BF:151C:151A:B291:8C5D:B912:15F8:B986:5926:33A4:A5E1,pubkey.lv.dnscrypt.d0wn.biz
+d0wn-lv-ns2,"D0wn Resolver Latvia 02","Server provided by Martin 'd0wn' Albus","Latvia","",https://dns.d0wn.biz,1,yes,yes,no,185.86.151.28,2.dnscrypt-cert.lv2.d0wn.biz,B111:F80C:E3E0:1C36:CC73:0995:009E:6351:EF08:0503:309D:9417:7AA3:8C67:916D:0CDF,pubkey.lv.dnscrypt.d0wn.biz
+d0wn-lv-ns2-ipv6,"D0wn Resolver Latvia 01 over IPv6","Server provided by Martin 'd0wn' Albus","Latvia","",https://dns.d0wn.biz,1,yes,yes,no,[2a02:7aa0:1201::f60e:2719]:443,2.dnscrypt-cert.lv2.d0wn.biz,B111:F80C:E3E0:1C36:CC73:0995:009E:6351:EF08:0503:309D:9417:7AA3:8C67:916D:0CDF,pubkey.lv.dnscrypt.d0wn.biz
+d0wn-md-ns1,"D0wn Resolver Moldova 01","Server provided by Martin 'd0wn' Albus","Moldova","",https://dns.d0wn.biz,1,yes,yes,no,178.17.170.67:1053,2.dnscrypt-cert.md.d0wn.biz,3DB2:C4CB:39E2:6B82:FDDF:6D91:1A65:D164:F4F0:D237:8CDD:0C37:469F:24BA:B9A0:F9FF,pubkey.md.dnscrypt.d0wn.biz
+d0wn-md-ns1-ipv6,"D0wn Resolver Moldova 01 over IPv6","Server provided by Martin 'd0wn' Albus","Moldova","",https://dns.d0wn.biz,1,yes,yes,no,[2a00:1dc0:cafe::ad86:fa7e]:1053,2.dnscrypt-cert.md.d0wn.biz,3DB2:C4CB:39E2:6B82:FDDF:6D91:1A65:D164:F4F0:D237:8CDD:0C37:469F:24BA:B9A0:F9FF,pubkey.md.dnscrypt.d0wn.biz
+d0wn-mx-ns1,"D0wn Resolver Mexico 01","Server provided by Martin 'd0wn' Albus","Mexico","",https://dns.d0wn.biz,1,yes,yes,no,201.131.126.212,2.dnscrypt-cert.mx.d0wn.biz,999E:63F0:0DE7:C171:3A72:5625:2A3F:097B:EC3A:D28F:BE28:7569:5C37:E80D:3D55:4FD0,pubkey.mx.dnscrypt.d0wn.biz
+d0wn-nl-ns1,"D0wn Resolver Netherlands 01","Server provided by Martin 'd0wn' Albus","Netherlands","",https://dns.d0wn.biz,1,yes,yes,no,95.85.9.86:1053,2.dnscrypt-cert.nl.d0wn.biz,7BE6:68FE:A505:FFA7:4C27:C2CA:F881:59DA:038C:5741:13AA:2556:A4D2:2D0B:B6F0:009E,pubkey.nl.dnscrypt.d0wn.biz
+d0wn-nl-ns1-ipv6,"D0wn Resolver Netherlands 01 over IPv6","Server provided by Martin 'd0wn' Albus","Netherlands","",https://dns.d0wn.biz,1,yes,yes,no,[2a03:b0c0:0:1010::62:f001]:1053,2.dnscrypt-cert.nl.d0wn.biz,7BE6:68FE:A505:FFA7:4C27:C2CA:F881:59DA:038C:5741:13AA:2556:A4D2:2D0B:B6F0:009E,pubkey.nl.dnscrypt.d0wn.biz
+d0wn-nl-ns2,"D0wn Resolver Netherlands 02","Server provided by Martin 'd0wn' Albus","Netherlands","",https://dns.d0wn.biz,1,yes,yes,no,185.83.217.248:1053,2.dnscrypt-cert.nl2.d0wn.biz,DFAA:B7D8:29E6:1F34:4FED:2610:4221:70C9:ADC7:7E9F:A65F:4A46:0BAE:A735:3186:3B99,pubkey.nl2.dnscrypt.d0wn.biz
+d0wn-nl-ns2-ipv6,"D0wn Resolver Netherlands 02 over IPv6","Server provided by Martin 'd0wn' Albus","Netherlands","",https://dns.d0wn.biz,1,yes,yes,no,[2a02:2ca0:64:22::2]:1053,2.dnscrypt-cert.nl2.d0wn.biz,DFAA:B7D8:29E6:1F34:4FED:2610:4221:70C9:ADC7:7E9F:A65F:4A46:0BAE:A735:3186:3B99,pubkey.nl2.dnscrypt.d0wn.biz
+d0wn-nl-ns4,"D0wn Resolver Netherlands 04","Server provided by Martin 'd0wn' Albus","Netherlands","",https://dns.d0wn.biz,1,yes,yes,no,31.220.43.105,2.dnscrypt-cert.nl4.d0wn.biz,2A4F:4389:5CE6:3230:B4C5:76A5:AC38:6418:4D12:6949:B160:FDB0:9166:ABB4:CEC6:0672,pubkey.nl4.dnscrypt.d0wn.biz
+d0wn-random-ns1,"D0wn Resolver Moldova Random 01","Server provided by Martin 'd0wn' Albus","Moldova","",https://dns.d0wn.biz,1,yes,yes,no,178.17.170.133:443,2.dnscrypt-cert.random.d0wn.biz,A420:867F:ED5C:024C:C86A:EECE:AA05:194B:017F:D2FF:9E72:385A:874F:8CE5:6832:ED2E,pubkey.random.dnscrypt.d0wn.biz
+d0wn-random-ns1-ipv6,"D0wn Resolver Moldova Random 01 over IPv6","Server provided by Martin 'd0wn' Albus","Moldova","",https://dns.d0wn.biz,1,yes,yes,no,[2a00:1dc0:cafe::c6af:c19d]:443,2.dnscrypt-cert.random.d0wn.biz,A420:867F:ED5C:024C:C86A:EECE:AA05:194B:017F:D2FF:9E72:385A:874F:8CE5:6832:ED2E,pubkey.random.dnscrypt.d0wn.biz
+d0wn-random-ns2,"D0wn Resolver Netherlands Random 02","Server provided by Martin 'd0wn' Albus","Netherlands","",https://dns.d0wn.biz,1,yes,yes,no,185.14.29.140,2.dnscrypt-cert.random2.d0wn.biz,7D73:F486:3C01:4CC9:B278:D107:F254:7A4F:1EA2:1081:07B0:CB82:645A:D8A4:B98A:B327,pubkey.random2.dnscrypt.d0wn.biz
+d0wn-random-ns2-ipv6,"D0wn Resolver Netherlands Random 02 over IPv6","Server provided by Martin 'd0wn' Albus","Netherlands","",https://dns.d0wn.biz,1,yes,yes,no,[2a00:1ca8:a7::1e9]:443,2.dnscrypt-cert.random2.d0wn.biz,7D73:F486:3C01:4CC9:B278:D107:F254:7A4F:1EA2:1081:07B0:CB82:645A:D8A4:B98A:B327,pubkey.random2.dnscrypt.d0wn.biz
+d0wn-ru-ns1,"D0wn Resolver Russia 01","Server provided by Martin 'd0wn' Albus","Russia","",https://dns.d0wn.biz,1,yes,yes,no,91.214.71.181,2.dnscrypt-cert.ru.d0wn.biz,0ECA:BC40:E0A1:335F:0221:4240:AB86:2919:D16A:2393:CCEB:4B40:9EB9:4F24:3077:ED99,pubkey.ru.dnscrypt.d0wn.biz
+d0wn-se-ns1,"D0wn Resolver Sweden 01","Server provided by Martin 'd0wn' Albus","Sweden","",https://dns.d0wn.biz,1,yes,yes,no,95.215.44.124,2.dnscrypt-cert.se.d0wn.biz,9D4F:762B:DD24:F77A:64B4:7E0F:F5C6:93FD:A02A:39E9:8FEC:0CEE:F252:3A5F:A403:C032,pubkey.se.dnscrypt.d0wn.biz
+d0wn-se-ns1-ipv6,"D0wn Resolver Sweden 01 over IPv6","Server provided by Martin 'd0wn' Albus","Sweden","",https://dns.d0wn.biz,1,yes,yes,no,[2a02:7aa0:1619::4f50:a69]:443,2.dnscrypt-cert.se.d0wn.biz,9D4F:762B:DD24:F77A:64B4:7E0F:F5C6:93FD:A02A:39E9:8FEC:0CEE:F252:3A5F:A403:C032,pubkey.se.dnscrypt.d0wn.biz
+d0wn-se-ns2,"D0wn Resolver Sweden 02","Server provided by Martin 'd0wn' Albus","Sweden","",https://dns.d0wn.biz,1,yes,yes,no,31.220.5.186,2.dnscrypt-cert.se2.d0wn.biz,C57D:D6A4:178E:ADE2:D0C0:B138:A4D4:074A:DF59:1488:8711:5CAC:EB60:A37B:3492:DA15,pubkey.se2.dnscrypt.d0wn.biz
+d0wn-sg-ns1,"D0wn Resolver Singapore 01","Server provided by Martin 'd0wn' Albus","Singapore","",https://dns.d0wn.biz,1,yes,yes,no,128.199.248.105,2.dnscrypt-cert.sg.d0wn.biz,D82B:2B76:1DA0:8470:B55B:820C:FAAB:9F32:D632:E9E0:5616:2CE7:7D21:E970:98FF:4A34,pubkey.sg.dnscrypt.d0wn.biz
+d0wn-sg-ns1-ipv6,"D0wn Resolver Singapore 01 over IPv6","Server provided by Martin 'd0wn' Albus","Singapore","",https://dns.d0wn.biz,1,yes,yes,no,[2400:6180:0:d0::38:d001]:443,2.dnscrypt-cert.sg.d0wn.biz,D82B:2B76:1DA0:8470:B55B:820C:FAAB:9F32:D632:E9E0:5616:2CE7:7D21:E970:98FF:4A34,pubkey.sg.dnscrypt.d0wn.biz
+d0wn-tz-ns1,"D0wn Resolver Tanzania 01","Server provided by Martin 'd0wn' Albus","Tanzania","",https://dns.d0wn.biz,1,yes,yes,no,41.79.69.13,2.dnscrypt-cert.tz.d0wn.biz,D606:15FB:D145:3BA1:4E76:8A3E:5C5C:B3AC:1746:1331:463D:A0AF:8CF7:DF04:DA4D:756D,pubkey.tz.dnscrypt.d0wn.biz
+d0wn-tz-ns1-ipv6,"D0wn Resolver Tanzania 01 over IPv6","Server provided by Martin 'd0wn' Albus","Tanzania","",https://dns.d0wn.biz,1,yes,yes,no,[2c0f:fda8:5::2ed1:d2ec]:443,2.dnscrypt-cert.tz.d0wn.biz,D606:15FB:D145:3BA1:4E76:8A3E:5C5C:B3AC:1746:1331:463D:A0AF:8CF7:DF04:DA4D:756D,pubkey.tz.dnscrypt.d0wn.biz
+d0wn-us-ns1,"D0wn Resolver United States of America 01","Server provided by Martin 'd0wn' Albus","United States of America","",https://dns.d0wn.biz,1,yes,yes,no,107.181.187.219,2.dnscrypt-cert.us.d0wn.biz,04BB:6100:7CFF:C72B:AF91:8942:F9DC:12A9:61A1:C6F2:177F:7CF9:F3C9:1B43:9FBE:6B80,pubkey.us.dnscrypt.d0wn.biz
+d0wn-us-ns2,"D0wn Resolver United States of America 02","Server provided by Martin 'd0wn' Albus","United States of America","",https://dns.d0wn.biz,1,yes,yes,no,192.252.222.24,2.dnscrypt-cert.us2.d0wn.biz,729B:FABE:2295:D469:E911:F97E:3EE4:F6DB:0190:EA6F:7CF3:F7EE:BB6B:99B1:698A:237D,pubkey.us2.dnscrypt.d0wn.biz
+d0wn-us-ns4,"D0wn Resolver United States of America 04","Server provided by Martin 'd0wn' Albus","United States of America","",https://dns.d0wn.biz,1,yes,yes,no,107.181.168.52,2.dnscrypt-cert.us4.d0wn.biz,F392:5D53:A315:66C2:ACF2:B2D2:8A69:6739:B066:1B8C:EF1B:3AFD:E828:0D83:D4EA:6D7D,pubkey.us4.dnscrypt.d0wn.biz
+d0wn-za-ns1,"D0wn Resolver South Africa 01","Server provided by Martin 'd0wn' Albus","South Africa","",https://dns.d0wn.biz,1,yes,yes,no,169.239.181.3,2.dnscrypt-cert.za.d0wn.biz,FBBD:0F3A:AF2B:B1BB:CD8F:9324:D5F6:A68C:E722:3890:8B90:92CF:F6D2:BF7C:9EC1:1368,pubkey.za.dnscrypt.d0wn.biz
+dnscrypt.ca-1,"dnscrypt.ca Server 1","Uncensored DNSSEC validating and log-free","Montreal, Canada","","https://dnscrypt.ca/",1,yes,yes,no,"199.167.130.118:5353","2.dnscrypt-cert.dnscrypt.ca-1",74F7:4555:17BC:26F7:1177:E56D:7293:2788:6C72:915B:3F46:2830:3F91:0C47:C38E:8279,
+dnscrypt.ca-2,"dnscrypt.ca Server 2","Uncensored DNSSEC validating and log-free","Montreal, Canada","","https://dnscrypt.ca/",1,yes,yes,no,"199.167.128.112:5353","2.dnscrypt-cert.dnscrypt.ca-2",43D5:2C82:5922:96C2:DB6F:8D48:CE22:4FDC:C726:26E1:06F6:E388:6193:FA00:9029:631B,
+dnscrypt.eu-dk,"DNSCrypt.eu Denmark","Free, non-logged, uncensored. Hosted by Netgroup.","Denmark","",https://dnscrypt.eu,1,yes,yes,no,77.66.84.233,2.dnscrypt-cert.resolver2.dnscrypt.eu,3748:5585:E3B9:D088:FD25:AD36:B037:01F5:520C:D648:9E9A:DD52:1457:4955:9F0A:9955,pubkey.resolver2.dnscrypt.eu
+dnscrypt.eu-dk-ipv6,"DNSCrypt.eu Denmark over IPv6","Free, non-logged, uncensored. Hosted by Netgroup.","Denmark","",https://dnscrypt.eu,1,yes,yes,no,[2001:1448:243::dc2]:443,2.dnscrypt-cert.resolver2.dnscrypt.eu,3748:5585:E3B9:D088:FD25:AD36:B037:01F5:520C:D648:9E9A:DD52:1457:4955:9F0A:9955,pubkey.resolver2.dnscrypt.eu
+dnscrypt.eu-nl,"DNSCrypt.eu Holland","Free, non-logged, uncensored. Hosted by RamNode.","Netherlands","",https://dnscrypt.eu,1,yes,yes,no,176.56.237.171,2.dnscrypt-cert.resolver1.dnscrypt.eu,67C0:0F2C:21C5:5481:45DD:7CB4:6A27:1AF2:EB96:9931:40A3:09B6:2B8D:1653:1185:9C66,pubkey.resolver1.dnscrypt.eu
+dnscrypt.nl-ns0,"DNSCrypt.nl The Netherlands (NL)","Public DNSCrypt server in Amsterdam, the Netherlands","Netherlands","",https://dnscrypt.nl,1,yes,yes,no,45.76.35.212,2.dnscrypt-cert.ns0.dnscrypt.nl,4C84:FB8C:0511:5DFA:5F97:C5ED:0329:1370:C78A:BCD6:4E15:DD53:AB08:DE72:FB84:4ACA,pkey.ns0.dnscrypt.nl
+dnscrypt.nl-ns0-ipv6,"DNSCrypt.nl The Netherlands (NL) over IPv6","Public DNSCrypt server in Amsterdam, the Netherlands","Netherlands","",https://dnscrypt.nl,1,yes,yes,no,[2001:19f0:5001:30a:5400:ff:fe58:7140]:443,2.dnscrypt-cert.ns0.dnscrypt.nl,4C84:FB8C:0511:5DFA:5F97:C5ED:0329:1370:C78A:BCD6:4E15:DD53:AB08:DE72:FB84:4ACA,pkey.ns0.dnscrypt.nl
+dnscrypt.org-fr,"DNSCrypt.org France","DNSSEC/Non-logged/Uncensored - ARM server donated by Scaleway.com","Paris, France","",https://fr.dnscrypt.org,2,yes,yes,no,212.47.228.136,2.dnscrypt-cert.fr.dnscrypt.org,E801:B84E:A606:BFB0:BAC0:CE43:445B:B15E:BA64:B02F:A3C4:AA31:AE10:636A:0790:324D,pubkey.fr.dnscrypt.org
+fvz-anyone,"Primary OpenNIC Anycast DNS Resolver","Fusl's public primary OpenNIC Tier2 Anycast DNS Resolver","Anycast","",http://dnsrec.meo.ws/,1,no,yes,no,185.121.177.177,2.dnscrypt-cert.dnsrec.meo.ws,1A6A:D0A3:2B4C:5A61:A695:D153:670D:69AB:1690:3F9E:C3F7:F64F:13E5:35A3:18B2:28A5,
+fvz-anytwo,"Secondary OpenNIC Anycast DNS Resolver","Fusl's public secondary OpenNIC Tier2 Anycast DNS Resolver","Anycast","",http://dnsrec.meo.ws/,1,no,yes,no,169.239.202.202,2.dnscrypt-cert.dnsrec.meo.ws,1A6A:D0A3:2B4C:5A61:A695:D153:670D:69AB:1690:3F9E:C3F7:F64F:13E5:35A3:18B2:28A5,
+ipredator,"Ipredator.se Server","Public DNSCrypt server in Sweden provided by Ipredator.se","Sweden","",https://www.ipredator.se,1,yes,yes,no,194.132.32.32,2.dnscrypt-cert.ipredator.se,C44C:566A:A8D6:46C4:32B1:04F5:3D00:961B:32DC:71CF:1C04:BD9E:B013:E480:E7A4:7828,pubkey.resolver2.ipredator.se
+ns0.dnscrypt.is,"ns0.dnscrypt.is in Reykjavík, Iceland","DNSSEC enabled, non-logging, uncensored. Sponsored by 1984 Hosting.","Reykjavík, Iceland","",https://dnscrypt.is,1,yes,yes,no,93.95.228.87,2.dnscrypt-cert.ns0.dnscrypt.is,EE41:6A83:451C:218F:37B2:B736:78C4:999F:7DE6:89D1:31D2:7866:7C8E:A8BB:1C95:B402,pubkey.ns0.dnscrypt.is
+okturtles,"okTurtles","For a surveillance-free world. HTTPS is broken. DNSChain fixes it.","Georgia, US","33.032501, -83.895699",http://okturtles.com/,1,no,yes,no,23.226.227.93,2.dnscrypt-cert.okturtles.com,1D85:3953:E34F:AFD0:05F9:4C6F:D1CC:E635:D411:9904:0D48:D19A:5D35:0B6A:7C81:73CB,
+opennic-tumabox,"TumaBox","Public DNS server operated by TumaBox.org","Germany","",http://wiki.tumabox.org/doku.php?id=dns,1,no,yes,no,130.255.73.90:5353,2.tumabox.org,D591:7B11:6A35:3114:C238:AA99:A6EB:0C28:7CF7:6805:41AC:5DBF:A8A0:239E:228C:5B06,
+opennic-tumabox-ipv6,"TumaBox over IPv6","Public DNS server operated by TumaBox.org","Germany","",http://wiki.tumabox.org/doku.php?id=dns,1,no,yes,no,[2a02:e00:fffd:139::9]:5353,2.tumabox.org,D591:7B11:6A35:3114:C238:AA99:A6EB:0C28:7CF7:6805:41AC:5DBF:A8A0:239E:228C:5B06,
+securedns,SecureDNS,Uncensored and no logging,"Amsterdam, Netherlands",,https://securedns.eu,1,yes,yes,no,146.185.167.43:5353,2.dnscrypt-cert.securedns.eu,B3A5:9769:1457:5B04:89E1:9FAE:9C43:E679:FAF2:8C57:1897:0031:7F7B:B496:291F:B095,2.dnscrypt-cert.securedns.eu
+securedns-ipv6,SecureDNS over IPv6,Uncensored and no logging,"Amsterdam, Netherlands",,https://securedns.eu,1,yes,yes,no,[2a03:b0c0:0:1010::e9a:3001]:5353,2.dnscrypt-cert.securedns.eu,B3A5:9769:1457:5B04:89E1:9FAE:9C43:E679:FAF2:8C57:1897:0031:7F7B:B496:291F:B095,2.dnscrypt-cert.securedns.eu
+soltysiak,"Soltysiak","Public DNSCrypt server in Poland","Poland","52.4014619, 16.9278078",http://dc1.soltysiak.com/,1,yes,yes,yes,178.216.201.222:2053,2.dnscrypt-cert.soltysiak.com,25C4:E188:2915:4697:8F9C:2BBD:B6A7:AFA4:01ED:A051:0508:5D53:03E7:1928:C066:8F21,pubkey.dc1.soltysiak.com
+soltysiak-ipv6,"Soltysiak over IPv6","Public DNSCrypt server in Poland","Poland","52.4014619, 16.9278078",http://dc1.soltysiak.com/,1,yes,yes,yes,[2001:470:70:4ff::2]:2053,2.dnscrypt-cert.soltysiak.com,25C4:E188:2915:4697:8F9C:2BBD:B6A7:AFA4:01ED:A051:0508:5D53:03E7:1928:C066:8F21,pubkey.dc1.soltysiak.com
+ventricle.us,"Anatomical DNS","Public DNSCrypt resolver provided by Jacob Henner","New York, NY","",https://jacobhenner.com,1,yes,yes,no,107.170.57.34,2.dnscrypt-cert.dnscrypt.ventricle.us,E985:F118:AD4E:3CC6:5FF2:2520:1890:C6F5:58B7:5B5A:52F5:6B17:CFEA:C100:5C8B:9BAA,pubkey.dnscrypt.ventricle.us
+yandex,"Yandex","Yandex public DNS server","Anycast","",https://www.yandex.com,1,no,no,no,77.88.8.78:15353,2.dnscrypt-cert.browser.yandex.net,D384:C071:C9F7:4662:AF2A:CCD5:7B5D:CC97:14D4:07B6:AD36:01E1:AEDC:06D5:6D49:6327,
index cc6b58b4484b47fca2e7d156ea165415a8f7a38a..25275d13c9f83cf06c77b30bc3eeaae3573f273f 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2009-2016 OpenWrt.org
+# Copyright (C) 2009-2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=git
 PKG_VERSION:=2.15.1
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=@KERNEL/software/scm/git/
@@ -111,6 +111,7 @@ define Package/git/install
        $(CP) $(PKG_INSTALL_DIR)/usr/bin/git-* $(1)/usr/bin
        $(INSTALL_DIR) $(1)/usr/lib/git-core
        $(LN) /usr/bin/git $(1)/usr/lib/git-core/git
+       $(INSTALL_DIR) $(1)/usr/share/git-core/templates
        ( cd $(PKG_INSTALL_DIR); $(TAR) \
                --exclude=usr/lib/git-core/git-http-backend \
                --exclude=usr/lib/git-core/git-http-fetch \
@@ -120,8 +121,8 @@ define Package/git/install
                --exclude=usr/lib/git-core/git-remote-https \
                -cf - \
                usr/lib/git-core \
+               usr/share/git-core/templates \
        ) | ( cd $(1); $(TAR) -xf - )
-       $(INSTALL_DIR) $(1)/usr/share/git-core/templates
 endef
 
 define Package/git-http/install
index 405118dc840f2fc5174cea7677c393a5d1a3a9a5..9eb43f084113202ff782e634b6b8086c651aa787 100644 (file)
@@ -1,10 +1,10 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=gnunet
-PKG_SOURCE_VERSION:=a3dace8401c482f18bddbad37da108433c1b08c7
-PKG_MIRROR_HASH:=00ab1eaed040e8479a38b9bfa2a59f029d6273cb2e275b637d1c501200bbbfd9
+PKG_SOURCE_VERSION:=21350d07dbaf0f0c1c94bf498667f3c893cc420b
+PKG_MIRROR_HASH:=34a7d80f689548ae6e7eb501a758ab5794ba8ea85be2741664847a2c5bdb215a
 
-PKG_VERSION:=0.10.2-git-20171108-$(PKG_SOURCE_VERSION)
+PKG_VERSION:=0.10.2-git-20180118-$(PKG_SOURCE_VERSION)
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
@@ -228,7 +228,7 @@ DEPENDS_gns:=+gnunet-vpn +iptables-mod-extra
 USERID_gns:=gnunet=958:gnunetdns=452
 BIN_gns:=gns gns-import.sh namecache namestore resolver
 LIB_gns:=gns gnsrecord namecache namestore
-PLUGIN_gns:=block_dns block_gns gnsrecord_dns gnsrecord_gns gnsrecord_identity
+PLUGIN_gns:=block_dns block_gns gnsrecord_conversation gnsrecord_dns gnsrecord_gns
 LIBEXEC_gns:=dns2gns helper-dns service-dns service-gns service-namecache service-namestore service-resolver service-zonemaster
 CONF_gns:=dns gns namecache namestore resolver zonemaster
 
index daa61dd97820a658f785f6bd7acb233aca968e31..b4c75501465a109a28b051aa01f64fa1e0189743 100644 (file)
@@ -8,13 +8,13 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=gnurl
-PKG_VERSION:=7.56.1
+PKG_VERSION:=7.57.0
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_URL:=https://gnunet.org/sites/default/files
 
-PKG_HASH:=c8069972327e47fa7e4f36754cbaa5d27e75ebb3de11a9b10ba628c0e9d00b5e
+PKG_HASH:=2ccd2a641a9815df924b6a79ee47d12a27ee43bd05a3c6ba958108564580d3b7
 
 PKG_LICENSE:=MIT
 PKG_LICENSE_FILES:=COPYING
index e78e7b0c341f5de56975d09aeb4e57493a58098b..95dea0b1898ca6f108a92d3f09871fc6f184867c 100644 (file)
@@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=i2pd
 PKG_VERSION:=2.17.0
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 PKG_BUILD_PARALLEL:=1
 
 PKG_SOURCE_PROTO:=git
@@ -26,10 +26,11 @@ include $(INCLUDE_DIR)/package.mk
 define Package/i2pd
        SECTION:=net
        CATEGORY:=Network
-       DEPENDS:=+libopenssl +boost +boost-system +boost-filesystem +boost-regex \
-                +boost-program_options +boost-date_time +libatomic +zlib
+       DEPENDS:=+libopenssl +boost +boost-system +boost-filesystem \
+                +boost-program_options +boost-date_time +libatomic +zlib
        TITLE:=full-featured C++ implementation of I2P client
        URL:=https://github.com/PurpleI2P/i2pd
+       USERID:=i2pd:i2pd
        MAINTAINER:=David Yang <mmyangfl@gmail.com>
 endef
 
@@ -45,13 +46,22 @@ define Package/i2pd/conffiles
        /etc/i2pd/tunnels.conf
 endef
 
+TARGET_LDFLAGS+=-latomic
 MAKE_FLAGS+=USE_AESNI=no USE_AVX=no
 
 define Package/i2pd/install
        $(INSTALL_DIR) $(1)/usr/sbin
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/i2pd $(1)/usr/sbin
+       $(INSTALL_DIR) $(1)/usr/share/i2pd
+       $(CP) $(PKG_BUILD_DIR)/contrib/certificates  $(1)/usr/share/i2pd
        $(INSTALL_DIR) $(1)/etc/i2pd
+       $(LN) /usr/share/i2pd/certificates $(1)/etc/i2pd/certificates
+       $(LN) /var/lib/i2pd/peerProfiles $(1)/etc/i2pd/peerProfiles
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/contrib/i2pd.conf $(1)/etc/i2pd
+       $(SED) ' \
+               s/127.0.0.1/192.168.1.1/g; \
+               s/datadir = \/var\/lib/datadir = \/etc/ \
+       ' $(1)/etc/i2pd/i2pd.conf
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/contrib/subscriptions.txt $(1)/etc/i2pd
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/contrib/tunnels.conf $(1)/etc/i2pd
        $(INSTALL_DIR) $(1)/etc/init.d
index 36a19906f2288d70bc402570900dd62feb06e79d..f1c394a0e85e848c8d31267b74e5e478c0606a3b 100755 (executable)
@@ -1,15 +1,39 @@
 #!/bin/sh /etc/rc.common
 # Copyright (C) 2017 OpenWrt.org
 
-START=70
-STOP=70
-
 USE_PROCD=1
+
+START=90
+STOP=10
+
 PROG=/usr/sbin/i2pd
+USER="i2pd"
+GROUP="i2pd"
+PIDFILE=/var/run/i2pd.pid
+DATADIR=/etc/i2pd
+PEERDIR=/var/lib/i2pd/peerProfiles
 
 
 start_service() {
+       ## RAM
+       if [ ! -d $PEERDIR ]; then
+               mkdir -p $PEERDIR
+               chown $USER:$GROUP $PEERDIR
+       fi
+
+       ## We need permissions
+       chown -R $USER:$GROUP $DATADIR
+       touch $PIDFILE
+       chown $USER:adm $PIDFILE
+
        procd_open_instance
-       procd_set_param command $PROG --conf=/etc/i2pd/i2pd.conf
+       procd_set_param command $PROG --service --conf=/etc/i2pd/i2pd.conf
+       ## Don't know about i2pd user's HOME
+       procd_set_param env HOME=$DATADIR
+       procd_set_param limits nofile=4096
+       procd_set_param stdout 1
+       procd_set_param stderr 1
+       procd_set_param user $USER
+       procd_set_param pidfile $PIDFILE
        procd_close_instance
 }
diff --git a/net/i2pd/patches/010-cross-compile.patch b/net/i2pd/patches/010-cross-compile.patch
deleted file mode 100644 (file)
index 614de4a..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/Makefile.linux   2017-11-14 03:20:41.000000000 +0800
-+++ b/Makefile.linux   2017-11-29 23:55:38.919136211 +0800
-@@ -44,7 +44,7 @@
-       LDLIBS += -lpthread -static-libstdc++ -static-libgcc -lrt -ldl
-       USE_AESNI := no
- else
--      LDLIBS = -lcrypto -lssl -lz -lboost_system -lboost_date_time -lboost_filesystem -lboost_program_options -lpthread
-+      LDLIBS = -latomic -lcrypto -lssl -lz -lboost_system -lboost_date_time -lboost_filesystem -lboost_program_options -lpthread
- endif
- # UPNP Support (miniupnpc 1.5 and higher)
index b64ffd79d1277ff279ff6b010720fa1bddbda3cb..1e0dc2cfe32dd584e0ba5c7bef8731f9ce7249e1 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=irssi
-PKG_VERSION:=1.0.5
+PKG_VERSION:=1.0.6
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
-PKG_SOURCE_URL:=https://github.com/irssi/irssi/releases/download/1.0.5/
-PKG_HASH:=c2556427e12eb06cabfed40839ac6f57eb8b1aa6365fab6dfcd331b7a04bb914
+PKG_SOURCE_URL:=https://github.com/irssi/irssi/releases/download/1.0.6/
+PKG_HASH:=029e884f3ebf337f7266d8ed4e1a035ca56d9f85015d74c868b488f279de8585
 
 PKG_FIXUP:=autoreconf
 PKG_INSTALL:=1
index d78754da0e80b1f057eae61e220d6441c5d6ceb3..97f56fe8905d5d8a987280db34ea5a9810176f64 100644 (file)
@@ -17,8 +17,6 @@ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=http://www.kismetwireless.net/code
 PKG_HASH:=bdb21f153311f1ff3b16621bf0d6740f66369bf0982b0a289c9a12af8847e237
 
-PKG_BUILD_DEPENDS:=libpcap libncurses libpcre
-
 include $(INCLUDE_DIR)/uclibc++.mk
 include $(INCLUDE_DIR)/package.mk
 
index 648183a724113f2d0ea20d29720158cdb2e148b4..faf411aca826c23dc6af05b974355e052476319d 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2014-2017 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+# Copyright (C) 2014-2018 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=knot
-PKG_VERSION:=2.5.6
+PKG_VERSION:=2.6.4
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=https://secure.nic.cz/files/knot-dns/
-PKG_HASH:=37d1625c2aaefe2394c85f6742a6ae9421e8348318c13119a6c451796c387cfc
+PKG_HASH:=1d0d37b5047ecd554d927519d5565c29c1ba9b501c100eb5f3a5af184d75386a
 
 PKG_MAINTAINER:=Daniel Salzman <daniel.salzman@nic.cz>
 PKG_LICENSE:=GPL-3.0 LGPL-2.0 0BSD MIT OLDAP-2.8
index 936df64820a20c5f4d13d4196150a4200eecffe0..9c1b3abc6a961fb67c0b5e757dc29c78097f536d 100644 (file)
@@ -19,7 +19,7 @@ PKG_LICENSE_FILES:=COPYING
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://www.flyn.org/projects/lcdringer
 PKG_HASH:=34f8a5325cb20bf404ac1a10fe63d013a077a12814c4558df4e55d95262ff618
-PKG_BUILD_DEPENDS:=+vala
+PKG_BUILD_DEPENDS:=vala
 
 PKG_INSTALL:=1
 
index a071c718879233d5bc6128329d0181b3345ef7ed..fc22b1b980741e066746eeb13f4dd3a0890ddc19 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=lighttpd
-PKG_VERSION:=1.4.45
-PKG_RELEASE:=7
+PKG_VERSION:=1.4.48
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=https://download.lighttpd.net/lighttpd/releases-1.4.x
-PKG_HASH:=1c97225deea33eefba6d4158c2cef27913d47553263516bbe9d2e2760fc43a3f
+PKG_HASH:=0f8ad5aac7529d7b948b9d7e8cd0b4a9e177309d85d6bf6516e28e6e40d74f36
 
 PKG_LICENSE:=BSD-3c
 PKG_LICENSE_FILES:=COPYING
@@ -21,6 +21,10 @@ PKG_LICENSE_FILES:=COPYING
 PKG_FIXUP:=autoreconf
 PKG_INSTALL:=1
 
+REBUILD_MODULES=authn_gssapi authn_ldap authn_mysql cml magnet mysql_vhost trigger_b4_dl webdav
+
+PKG_CONFIG_DEPENDS:=CONFIG_LIGHTTPD_SSL $(patsubst %,CONFIG_PACKAGE_lighttpd-mod-%,$(REBUILD_MODULES))
+
 include $(INCLUDE_DIR)/package.mk
 
 define Package/lighttpd/Default
@@ -49,6 +53,8 @@ config LIGHTTPD_SSL
          lighttpd confguration file.
 endef
 
+BASE_MODULES:=dirlisting indexfile staticfile
+
 CONFIGURE_ARGS+= \
        --libdir=/usr/lib/lighttpd \
        --sysconfdir=/etc/lighttpd \
@@ -68,6 +74,7 @@ CONFIGURE_VARS+= \
 ifneq ($(strip $(CONFIG_LIGHTTPD_SSL)),)
   CONFIGURE_ARGS+= \
        --with-openssl="$(STAGING_DIR)/usr"
+  BASE_MODULES+= openssl
 else
   CONFIGURE_ARGS+= \
        --without-openssl
@@ -153,7 +160,7 @@ define Package/lighttpd/install
        $(INSTALL_DIR) $(1)/etc/init.d
        $(INSTALL_BIN) ./files/lighttpd.init $(1)/etc/init.d/lighttpd
        $(INSTALL_DIR) $(1)/usr/lib/lighttpd
-       for m in dirlisting indexfile staticfile; do \
+       for m in $(BASE_MODULES); do \
                $(CP) $(PKG_INSTALL_DIR)/usr/lib/lighttpd/mod_$$$${m}.so $(1)/usr/lib/lighttpd/ ; \
        done
        $(INSTALL_DIR) $(1)/usr/sbin
diff --git a/net/lighttpd/patches/0001-mod_cgi-RFC3875-CGI-local-redir-strict-adherence-210.patch b/net/lighttpd/patches/0001-mod_cgi-RFC3875-CGI-local-redir-strict-adherence-210.patch
deleted file mode 100644 (file)
index 9b797ac..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-From dde50f1939e22926d17342b5d812e9a3034e7e98 Mon Sep 17 00:00:00 2001
-From: Glenn Strauss <gstrauss@gluelogic.com>
-Date: Wed, 25 Jan 2017 11:22:39 -0500
-Subject: [PATCH] [mod_cgi] RFC3875 CGI local-redir strict adherence (#2108)
-
-RFC3875 CGI local-redir stricter adherence
-
-do not apply local-redir if any response headers besides "Location"
-do not apply local-redir if any response body has been received
-(though it might not have been received yet, and we do not wait to find
- out, if lighttpd is configured to stream response body back to client)
-
-x-ref:
-  RFC3875 CGI 1.1 specification section 6.2.2 Local Redirect Response
-  http://www.ietf.org/rfc/rfc3875
-  "CGI local redirect not implemented correctly"
-  https://redmine.lighttpd.net/issues/2108
----
- src/mod_cgi.c | 25 ++++++++++++++++++++++++-
- 1 file changed, 24 insertions(+), 1 deletion(-)
-
---- a/src/mod_cgi.c
-+++ b/src/mod_cgi.c
-@@ -527,6 +527,27 @@ static int cgi_demux_response(server *sr
-                                       /* parse the response header */
-                                       cgi_response_parse(srv, con, p, hctx->response_header);
-+                                      /* [RFC3875] 6.2.2 Local Redirect Response
-+                                       *
-+                                       *    The CGI script can return a URI path and query-string
-+                                       *    ('local-pathquery') for a local resource in a Location header field.
-+                                       *    This indicates to the server that it should reprocess the request
-+                                       *    using the path specified.
-+                                       *
-+                                       *      local-redir-response = local-Location NL
-+                                       *
-+                                       *    The script MUST NOT return any other header fields or a message-body,
-+                                       *    and the server MUST generate the response that it would have produced
-+                                       *    in response to a request containing the URL
-+                                       *
-+                                       *      scheme "://" server-name ":" server-port local-pathquery
-+                                       *
-+                                       * (Might not have begun to receive body yet, but do skip local-redir
-+                                       *  if we already have started receiving a response body (blen > 0))
-+                                       * (Also, while not required by the RFC, do not send local-redir back
-+                                       *  to same URL, since CGI should have handled it internally if it
-+                                       *  really wanted to do that internally)
-+                                       */
-                                       if (con->http_status >= 300 && con->http_status < 400) {
-                                               /*(con->parsed_response & HTTP_LOCATION)*/
-                                               size_t ulen = buffer_string_length(con->uri.path);
-@@ -535,7 +556,9 @@ static int cgi_demux_response(server *sr
-                                                   && ds->value->ptr[0] == '/'
-                                                   && (0 != strncmp(ds->value->ptr, con->uri.path->ptr, ulen)
-                                                       || (ds->value->ptr[ulen] != '\0' && ds->value->ptr[ulen] != '/' && ds->value->ptr[ulen] != '?'))
--                                                  && NULL == array_get_element(con->response.headers, "Set-Cookie")) {
-+                                                  && 0 == blen
-+                                                  && !(con->parsed_response & HTTP_STATUS) /* no "Status" or NPH response line */
-+                                                  && 1 == con->response.headers->used) {
-                                                       if (++con->loops_per_request > 5) {
-                                                               log_error_write(srv, __FILE__, __LINE__, "sb", "too many internal loops while processing request:", con->request.orig_uri);
-                                                               con->http_status = 500; /* Internal Server Error */
diff --git a/net/lighttpd/patches/0002-mod_cgi-fix-CGI-local-redir-w-url.rewrite-once-fixes.patch b/net/lighttpd/patches/0002-mod_cgi-fix-CGI-local-redir-w-url.rewrite-once-fixes.patch
deleted file mode 100644 (file)
index e8e1cef..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-From ab85841b142c62c47f69fc45c0b54f080d54ddc9 Mon Sep 17 00:00:00 2001
-From: Glenn Strauss <gstrauss@gluelogic.com>
-Date: Mon, 20 Feb 2017 14:47:13 -0500
-Subject: [PATCH] [mod_cgi] fix CGI local-redir w/ url.rewrite-once (fixes
- #2793)
-
-x-ref:
-  "1.4.40 regression: broken redirect (using Location) between url.rewrite-once URLs"
-  https://redmine.lighttpd.net/issues/2793
----
- src/mod_cgi.c | 5 ++---
- 1 file changed, 2 insertions(+), 3 deletions(-)
-
---- a/src/mod_cgi.c
-+++ b/src/mod_cgi.c
-@@ -583,8 +583,7 @@ static int cgi_demux_response(server *sr
-                                                       }
-                                                       connection_response_reset(srv, con); /*(includes con->http_status = 0)*/
--
--                                                      con->mode = DIRECT;
-+                                                      plugins_call_connection_reset(srv, con);
-                                                       return FDEVENT_HANDLED_COMEBACK;
-                                               }
-                                       }
-@@ -803,7 +802,7 @@ static int cgi_recv_response(server *srv
-                       /* if we get a IN|HUP and have read everything don't exec the close twice */
-                       return HANDLER_FINISHED;
-               case FDEVENT_HANDLED_COMEBACK:
--                      cgi_connection_close(srv, hctx);
-+                      /*cgi_connection_close(srv, hctx);*//*(already cleaned up and hctx is now invalid)*/
-                       return HANDLER_COMEBACK;
-               case FDEVENT_HANDLED_ERROR:
-                       log_error_write(srv, __FILE__, __LINE__, "s", "demuxer failed: ");
diff --git a/net/lighttpd/patches/0003-mod_cgi-status-200-OK-if-no-hdrs-deprecated-2786.patch b/net/lighttpd/patches/0003-mod_cgi-status-200-OK-if-no-hdrs-deprecated-2786.patch
deleted file mode 100644 (file)
index 7e7d9ee..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-From 51ff7ac504f7001dc54807f9b2a72de891ab9ee5 Mon Sep 17 00:00:00 2001
-From: Glenn Strauss <gstrauss@gluelogic.com>
-Date: Wed, 22 Feb 2017 11:58:21 -0500
-Subject: [PATCH] [mod_cgi] status 200 OK if no hdrs (deprecated) (#2786)
-
-set status 200 OK if CGI does not return CGI headers
-
-Note:
-This mode in lighttpd is deprecated and may be removed in the next major
-release of lighttpd.  CGI scripts should return a proper CGI header in
-the response, even if that header is empty and followed by a blank line,
-before return response body.
-
-Without a proper CGI response header, the first line(s) of the response
-might be incorrectly construed as being CGI response headers, especially
-if they contain ':', and response may be corrupted.  That is why this
-mode is deprecated (and not supported in numerous other web servers).
-
-The minimal valid CGI response header is "\n", which lighttpd will treat
-as equivalent to "Status: 200\n\n"
-
-x-ref:
-  "error 500 (mod_cgi.c.601) cgi died"
-  https://redmine.lighttpd.net/issues/2786
----
- src/mod_cgi.c | 2 ++
- 1 file changed, 2 insertions(+)
-
---- a/src/mod_cgi.c
-+++ b/src/mod_cgi.c
-@@ -502,6 +502,7 @@ static int cgi_demux_response(server *sr
-                                       if (0 != http_chunk_append_buffer(srv, con, hctx->response_header)) {
-                                               return FDEVENT_HANDLED_ERROR;
-                                       }
-+                                      if (0 == con->http_status) con->http_status = 200; /* OK */
-                               } else {
-                                       const char *bstart;
-                                       size_t blen;
-@@ -846,6 +847,7 @@ static handler_t cgi_handle_fdevent(serv
-                               cgi_connection_close(srv, hctx);
-                               return HANDLER_ERROR;
-                       }
-+                      if (0 == con->http_status) con->http_status = 200; /* OK */
-               } else {
- # if 0
-                       log_error_write(srv, __FILE__, __LINE__, "sddd", "got HUP from cgi", con->fd, hctx->fd, revents);
diff --git a/net/lighttpd/patches/0004-mod_cgi-cgi.local-redir-enable-disable-2108-2793.patch b/net/lighttpd/patches/0004-mod_cgi-cgi.local-redir-enable-disable-2108-2793.patch
deleted file mode 100644 (file)
index 327b080..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-From 57ab20ace504fdb6e0944ef6fa6e0ce35adc4446 Mon Sep 17 00:00:00 2001
-From: Glenn Strauss <gstrauss@gluelogic.com>
-Date: Sun, 26 Feb 2017 17:49:47 -0500
-Subject: [PATCH] [mod_cgi] cgi.local-redir = [enable|disable] (#2108, #2793)
-
-new directive cgi.local-redir = [enable|disable]
-
-*disable* RFC3875 6.2.2 local-redir by default.
-(behavior change from when local-redir support added in lighttpd 1.4.40)
-
-The reason for this behavior change is that CGI local-redir support
-(RFC3875 6.2.2) is an optimization.  Absence of support may result in
-additional latency in servicing a request due the additional round-trip
-to the client, but that was the prior behavior (before lighttpd 1.4.40)
-and is the behavior of web servers which do not support CGI local-redir.
-
-However, enabling CGI local-redir by default may result in broken links
-in the case where a user config (unaware of CGI local-redir behavior)
-returns HTML pages containing *relative* paths (not root-relative paths)
-which are relative to the location of the local-redir target document,
-and the local-redir target document is located at a different URL-path
-from the original CGI request.
-
-x-ref:
-  RFC3875 CGI 1.1 specification section 6.2.2 Local Redirect Response
-  http://www.ietf.org/rfc/rfc3875
-  "CGI local redirect not implemented correctly"
-  https://redmine.lighttpd.net/issues/2108
-  "1.4.40 regression: broken redirect (using Location) between url.rewrite-once URLs"
-  https://redmine.lighttpd.net/issues/2793
----
- src/mod_cgi.c       | 9 ++++++++-
- tests/lighttpd.conf | 1 +
- 2 files changed, 9 insertions(+), 1 deletion(-)
-
---- a/src/mod_cgi.c
-+++ b/src/mod_cgi.c
-@@ -66,6 +66,7 @@ typedef struct {
- typedef struct {
-       array *cgi;
-       unsigned short execute_x_only;
-+      unsigned short local_redir;
-       unsigned short xsendfile_allow;
-       array *xsendfile_docroot;
- } plugin_config;
-@@ -172,6 +173,7 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_default
-               { "cgi.execute-x-only",          NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION },     /* 1 */
-               { "cgi.x-sendfile",              NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION },     /* 2 */
-               { "cgi.x-sendfile-docroot",      NULL, T_CONFIG_ARRAY,   T_CONFIG_SCOPE_CONNECTION },     /* 3 */
-+              { "cgi.local-redir",             NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION },     /* 4 */
-               { NULL,                          NULL, T_CONFIG_UNSET, T_CONFIG_SCOPE_UNSET}
-       };
-@@ -189,6 +191,7 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_default
-               s->cgi    = array_init();
-               s->execute_x_only = 0;
-+              s->local_redir    = 0;
-               s->xsendfile_allow= 0;
-               s->xsendfile_docroot = array_init();
-@@ -196,6 +199,7 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_default
-               cv[1].destination = &(s->execute_x_only);
-               cv[2].destination = &(s->xsendfile_allow);
-               cv[3].destination = s->xsendfile_docroot;
-+              cv[4].destination = &(s->local_redir);
-               p->config_storage[i] = s;
-@@ -549,7 +553,7 @@ static int cgi_demux_response(server *sr
-                                        *  to same URL, since CGI should have handled it internally if it
-                                        *  really wanted to do that internally)
-                                        */
--                                      if (con->http_status >= 300 && con->http_status < 400) {
-+                                      if (hctx->conf.local_redir && con->http_status >= 300 && con->http_status < 400) {
-                                               /*(con->parsed_response & HTTP_LOCATION)*/
-                                               size_t ulen = buffer_string_length(con->uri.path);
-                                               data_string *ds;
-@@ -1321,6 +1325,7 @@ static int mod_cgi_patch_connection(serv
-       PATCH(cgi);
-       PATCH(execute_x_only);
-+      PATCH(local_redir);
-       PATCH(xsendfile_allow);
-       PATCH(xsendfile_docroot);
-@@ -1340,6 +1345,8 @@ static int mod_cgi_patch_connection(serv
-                               PATCH(cgi);
-                       } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("cgi.execute-x-only"))) {
-                               PATCH(execute_x_only);
-+                      } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("cgi.local-redir"))) {
-+                              PATCH(local_redir);
-                       } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("cgi.x-sendfile"))) {
-                               PATCH(xsendfile_allow);
-                       } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("cgi.x-sendfile-docroot"))) {
---- a/tests/lighttpd.conf
-+++ b/tests/lighttpd.conf
-@@ -110,6 +110,7 @@ fastcgi.server = (
-       ) ),
- )
-+cgi.local-redir = "enable"
- cgi.assign = (
-       ".pl"  => env.PERL,
-       ".cgi" => env.PERL,
index 8107891b5c4e4d3dc1d9ba3d9fa39fa2ba5938db..4f726e2147cf25b34e73740a46c8a47a74b874d8 100644 (file)
@@ -24,7 +24,7 @@ include $(INCLUDE_DIR)/package.mk
 # -liconv due to glib2, to be revisited later
 include $(INCLUDE_DIR)/nls.mk
 
-PKG_BUILD_DEPENDS:=glib2 libintl
+PKG_BUILD_DEPENDS:=glib2 gettext
 
 define Package/nbd
   SECTION:=net
index 25da6cc1dad63a57c29fac5d73784de5bdd20e46..b9f296866996a23bfb74b9602945b3b5e369531b 100644 (file)
@@ -14,11 +14,11 @@ PKG_NAME:=netopeer2
 PKG_LICENSE:=BSD-3-Clause
 PKG_MAINTAINER:=Mislav Novakovic <mislav.novakovic@sartura.hr>
 
-PKG_VERSION:=0.4.3
+PKG_VERSION:=0.4.13
 
 PKG_SOURCE_PROTO:=git
-PKG_SOURCE_VERSION:=e7c821cde14df31a03d23293f84e0aed9cb1a457
-PKG_MIRROR_HASH:=88a4c06e9cdb81879de7311138acbfe9fe5207db14fbb93c5ba4d6947d616aec
+PKG_SOURCE_VERSION:=ae560bef2e70d274f6d028b59e3cb398ea2a621d
+PKG_MIRROR_HASH:=43b7f9c436afc76de539a7426b1462249326318b9b836f1d49282106a730a6b8
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.xz
 PKG_SOURCE_URL:=https://github.com/CESNET/Netopeer2.git
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION)
@@ -76,40 +76,17 @@ CMAKE_OPTIONS += \
        -DCMAKE_BUILD_TYPE:STRING=Release \
        -DKEYSTORED_KEYS_DIR:STRING=/etc/keystored/keys
 
-define Build/Configure
-       $(eval PKG_BUILD_DIR:=$(PKG_BUILD_ROOT)/server)
-       $(call Build/Configure/Default)
-
-       $(eval PKG_BUILD_DIR:=$(PKG_BUILD_ROOT)/cli)
-       $(call Build/Configure/Default)
-
-       $(eval PKG_BUILD_DIR:=$(PKG_BUILD_ROOT)/keystored)
-       $(call Build/Configure/Default)
-endef
-
-define Build/Compile
-       $(eval PKG_BUILD_DIR:=$(PKG_BUILD_ROOT)/server)
-       $(call Build/Compile/Default)
-
-       $(eval PKG_BUILD_DIR:=$(PKG_BUILD_ROOT)/cli)
-       $(call Build/Compile/Default)
-
-       $(eval PKG_BUILD_DIR:=$(PKG_BUILD_ROOT)/keystored)
-       $(call Build/Compile/Default)
-endef
-
 define Package/netopeer2-server/install
        $(INSTALL_DIR) $(1)/bin
        $(INSTALL_BIN) $(PKG_BUILD_ROOT)/server/netopeer2-server $(1)/bin/
 
        $(INSTALL_DIR) $(1)/etc/sysrepo/yang
-       $(INSTALL_DATA) $(PKG_BUILD_ROOT)/modules/ietf-ssh-server.yang $(1)/etc/sysrepo/yang/
-       $(INSTALL_DATA) $(PKG_BUILD_ROOT)/modules/ietf-tls-server.yang $(1)/etc/sysrepo/yang/
-       $(INSTALL_DATA) $(PKG_BUILD_ROOT)/modules/iana-crypt-hash.yang $(1)/etc/sysrepo/yang/
-       $(INSTALL_DATA) $(PKG_BUILD_ROOT)/modules/ietf-x509-cert-to-name.yang $(1)/etc/sysrepo/yang/
-       $(INSTALL_DATA) $(PKG_BUILD_ROOT)/modules/ietf-netconf-server.yang $(1)/etc/sysrepo/yang/
-       $(INSTALL_DATA) $(PKG_BUILD_ROOT)/modules/ietf-netconf-server.yang $(1)/etc/sysrepo/yang/
-       $(INSTALL_DATA) $(PKG_BUILD_ROOT)/modules/ietf-system.yang $(1)/etc/sysrepo/yang/
+       $(INSTALL_DATA) $(PKG_BUILD_ROOT)/modules/ietf-ssh-server.yang $(1)/etc/sysrepo/yang/ietf-ssh-server@2016-11-02.yang
+       $(INSTALL_DATA) $(PKG_BUILD_ROOT)/modules/ietf-tls-server.yang $(1)/etc/sysrepo/yang/ietf-tls-server@2016-11-02.yang
+       $(INSTALL_DATA) $(PKG_BUILD_ROOT)/modules/iana-crypt-hash.yang $(1)/etc/sysrepo/yang/iana-crypt-hash@2014-08-06.yang
+       $(INSTALL_DATA) $(PKG_BUILD_ROOT)/modules/ietf-x509-cert-to-name.yang $(1)/etc/sysrepo/yang/ietf-x509-cert-to-name@2014-12-10.yang
+       $(INSTALL_DATA) $(PKG_BUILD_ROOT)/modules/ietf-netconf-server.yang $(1)/etc/sysrepo/yang/ietf-netconf-server@2016-11-02.yang
+       $(INSTALL_DATA) $(PKG_BUILD_ROOT)/modules/ietf-system.yang $(1)/etc/sysrepo/yang/ietf-system@2014-08-06.yang
 
        $(INSTALL_DIR) $(1)/etc/uci-defaults
        $(INSTALL_BIN) ./files/netopeer2-server.default $(1)/etc/uci-defaults/99_netopeer2-server
@@ -131,7 +108,7 @@ define Package/netopeer2-keystored/install
        $(INSTALL_BIN) $(PKG_BUILD_ROOT)/keystored/libkeystored.so $(1)/usr/lib/sysrepo/plugins/
 
        $(INSTALL_DIR) $(1)/etc/sysrepo/yang
-       $(INSTALL_DATA) $(PKG_BUILD_ROOT)/modules/ietf-keystore.yang $(1)/etc/sysrepo/yang
+       $(INSTALL_DATA) $(PKG_BUILD_ROOT)/modules/ietf-keystore.yang $(1)/etc/sysrepo/yang/ietf-keystore@2016-10-31.yang
 
        $(INSTALL_DIR) $(1)/etc/uci-defaults
 
index 6c9c10559d7b259af61850bb52753ce095e25758..df28081c7d59b0e95e9e77da13a9f94370213372 100644 (file)
@@ -3,9 +3,9 @@
 # Warning, problems can occur if the device restarts in the middle of this uci-default script
 
 if [ -x /bin/sysrepoctl ]; then
-       match=$(sysrepoctl -l | grep "ietf-keystore\ ")
+       match=$(sysrepoctl -l | grep "ietf-keystore ")
        if [ ! "$match" ]; then
-               sysrepoctl --install --yang=/etc/sysrepo/yang/ietf-keystore.yang -o root:root -p 600
+               sysrepoctl --install --yang=/etc/sysrepo/yang/ietf-keystore@2016-10-31.yang -o root:root -p 600
                if [ -x /bin/sysrepocfg ]; then
                        sysrepocfg -d startup -i /usr/share/netopeer2-keystored/stock_key_config.xml ietf-keystore
                        rm /usr/share/netopeer2-keystored/stock_key_config.xml
index 9faeedc2215aea400ec0a2a757cb9369bca7261c..dda6f4517b3a8b12ec25983c818fc06ed3fe7281 100644 (file)
@@ -3,9 +3,9 @@
 # Warning, problems can occur if the device restarts in the middle of this uci-default script
 
 if [ -x /bin/sysrepoctl ]; then
-       match=$(sysrepoctl -l | grep "ietf-keystore\ ")
+       match=$(sysrepoctl -l | grep "ietf-keystore ")
        if [ ! "$match" ]; then
-               sysrepoctl --install --yang=/etc/sysrepo/yang/ietf-keystore.yang -o root:root -p 600
+               sysrepoctl --install --yang=/etc/sysrepo/yang/ietf-keystore@2016-10-31.yang -o root:root -p 600
                if [ -x /bin/sysrepocfg ]; then
                        sysrepocfg -d startup -i /usr/share/netopeer2-keystored/stock_key_config.xml ietf-keystore
                        rm /usr/share/netopeer2-keystored/stock_key_config.xml
index d2a699bb1389d25cb831ccc6ff59c53192a646bc..8a7b7fe7e1215d72b9d93e3b5739cc31e4081d74 100644 (file)
@@ -3,29 +3,29 @@
 # Warning, problems can occur if the device restarts in the middle of this uci-default script
 
 if [ -x /bin/sysrepoctl ]; then
-       match=$(sysrepoctl -l | grep "ietf-ssh-server\ ")
+       match=$(sysrepoctl -l | grep "ietf-ssh-server ")
        if [ ! "$match" ]; then
-               sysrepoctl --install --yang=/etc/sysrepo/yang/ietf-ssh-server.yang -p 600
+               sysrepoctl --install --yang=/etc/sysrepo/yang/ietf-ssh-server@2016-11-02.yang -p 600
        fi
 
-       match=$(sysrepoctl -l | grep "ietf-tls-server\ ")
+       match=$(sysrepoctl -l | grep "ietf-tls-server ")
        if [ ! "$match" ]; then
-               sysrepoctl --install --yang=/etc/sysrepo/yang/ietf-tls-server.yang -p 600
+               sysrepoctl --install --yang=/etc/sysrepo/yang/ietf-tls-server@2016-11-02.yang -p 600
        fi
 
-       match=$(sysrepoctl -l | grep "iana-crypt-hash\ ")
+       match=$(sysrepoctl -l | grep "iana-crypt-hash ")
        if [ ! "$match" ]; then
-               sysrepoctl --install --yang=/etc/sysrepo/yang/iana-crypt-hash.yang -p 600
+               sysrepoctl --install --yang=/etc/sysrepo/yang/iana-crypt-hash@2014-08-06.yang -p 600
        fi
 
-       match=$(sysrepoctl -l | grep "ietf-x509-cert-to-name\ ")
+       match=$(sysrepoctl -l | grep "ietf-x509-cert-to-name ")
        if [ ! "$match" ]; then
-               sysrepoctl --install --yang=/etc/sysrepo/yang/ietf-x509-cert-to-name.yang -p 600
+               sysrepoctl --install --yang=/etc/sysrepo/yang/ietf-x509-cert-to-name@2014-12-10.yang -p 600
        fi
 
-       match=$(sysrepoctl -l | grep "ietf-netconf-server\ ")
+       match=$(sysrepoctl -l | grep "ietf-netconf-server ")
        if [ ! "$match" ]; then
-               sysrepoctl --install --yang=/etc/sysrepo/yang/ietf-netconf-server.yang -o root:root -p 600
+               sysrepoctl --install --yang=/etc/sysrepo/yang/ietf-netconf-server@2016-11-02.yang -o root:root -p 600
                sysrepoctl -m ietf-netconf-server -e listen
                sysrepoctl -m ietf-netconf-server -e ssh-listen
                if [ -x /bin/sysrepocfg ]; then
@@ -34,9 +34,9 @@ if [ -x /bin/sysrepoctl ]; then
                fi
        fi
 
-       match=$(sysrepoctl -l | grep "ietf-system\ ")
+       match=$(sysrepoctl -l | grep "ietf-system ")
        if [ ! "$match" ]; then
-               sysrepoctl --install --yang=/etc/sysrepo/yang/ietf-system.yang -o root:root -p 600
+               sysrepoctl --install --yang=/etc/sysrepo/yang/ietf-system@2014-08-06.yang -o root:root -p 600
                sysrepoctl -m ietf-system -e authentication
                sysrepoctl -m ietf-system -e local-users
        fi
diff --git a/net/netopeer2/patches/002-fix-for-cmake-build b/net/netopeer2/patches/002-fix-for-cmake-build
new file mode 100644 (file)
index 0000000..bd29d4d
--- /dev/null
@@ -0,0 +1,58 @@
+Index: netopeer2-0.4.13-ae560bef2e70d274f6d028b59e3cb398ea2a621d/CMakeLists.txt
+===================================================================
+--- /dev/null
++++ netopeer2-0.4.13-ae560bef2e70d274f6d028b59e3cb398ea2a621d/CMakeLists.txt
+@@ -0,0 +1,5 @@
++cmake_minimum_required(VERSION 2.6)
++
++add_subdirectory(server)
++add_subdirectory(cli)
++add_subdirectory(keystored)
+Index: netopeer2-0.4.13-ae560bef2e70d274f6d028b59e3cb398ea2a621d/cli/CMakeLists.txt
+===================================================================
+--- netopeer2-0.4.13-ae560bef2e70d274f6d028b59e3cb398ea2a621d.orig/cli/CMakeLists.txt
++++ netopeer2-0.4.13-ae560bef2e70d274f6d028b59e3cb398ea2a621d/cli/CMakeLists.txt
+@@ -1,7 +1,7 @@
+ cmake_minimum_required(VERSION 2.6)
+ # include custom Modules
+-set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/../CMakeModules/")
++set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMakeModules/")
+ project(netopeer2-cli C)
+ include(GNUInstallDirs)
+@@ -83,7 +83,7 @@ endif()
+ install(FILES ${PROJECT_SOURCE_DIR}/doc/${PROJECT_NAME}.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
+ # clean cmake cache
+-add_custom_target(cleancache
++add_custom_target(cleancache_cli
+                   COMMAND make clean
+                   COMMAND find . -iname '*cmake*' -not -name CMakeLists.txt -exec rm -rf {} +
+                   COMMAND rm -rf Makefile Doxyfile
+Index: netopeer2-0.4.13-ae560bef2e70d274f6d028b59e3cb398ea2a621d/keystored/CMakeLists.txt
+===================================================================
+--- netopeer2-0.4.13-ae560bef2e70d274f6d028b59e3cb398ea2a621d.orig/keystored/CMakeLists.txt
++++ netopeer2-0.4.13-ae560bef2e70d274f6d028b59e3cb398ea2a621d/keystored/CMakeLists.txt
+@@ -1,7 +1,7 @@
+ cmake_minimum_required(VERSION 2.6)
+ # include custom Modules
+-set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/../CMakeModules/")
++set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMakeModules/")
+ project(keystored C)
+ include(GNUInstallDirs)
+Index: netopeer2-0.4.13-ae560bef2e70d274f6d028b59e3cb398ea2a621d/server/CMakeLists.txt
+===================================================================
+--- netopeer2-0.4.13-ae560bef2e70d274f6d028b59e3cb398ea2a621d.orig/server/CMakeLists.txt
++++ netopeer2-0.4.13-ae560bef2e70d274f6d028b59e3cb398ea2a621d/server/CMakeLists.txt
+@@ -1,7 +1,7 @@
+ cmake_minimum_required(VERSION 2.8.9)
+ # include custom Modules
+-set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/../CMakeModules/")
++set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMakeModules/")
+ project(netopeer2-server C)
+ include(GNUInstallDirs)
index d16e722caee33c5b565d8b9e3b51d00fdf958553..06f78f7e90af143bf8f81faff1b87042e321edf5 100644 (file)
@@ -7,9 +7,9 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=nfs-kernel-server
-PKG_VERSION:=2.2.1
+PKG_VERSION:=2.3.1
 PKG_RELEASE:=1
-PKG_HASH:=0d819d8da358bea6e005e1a6cf0f6fa0c5507a78747d36bc87a0182e6af14291
+PKG_HASH:=ca92f1ab86b2af4dcd62d7716d46a6cdec268e83fe8d564cd8ff1464cc495989
 
 PKG_SOURCE_URL:=@SF/nfs
 PKG_SOURCE:=nfs-utils-$(PKG_VERSION).tar.bz2
index 6552b46020d9333b925b2445a96c58988d9feb64..d018514aa2c9556472bb76f19b5a11c9a15bdff1 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=nginx
-PKG_VERSION:=1.12.1
+PKG_VERSION:=1.12.2
 PKG_RELEASE:=1
 
 PKG_SOURCE:=nginx-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://nginx.org/download/
-PKG_HASH:=8793bf426485a30f91021b6b945a9fd8a84d87d17b566562c3797aba8fac76fb
+PKG_HASH:=305f379da1d5fb5aefa79e45c829852ca6983c7cd2a79328f8e084a324cf0416
 PKG_MAINTAINER:=Thomas Heil <heil@terminal-consulting.de>
 PKG_LICENSE:=2-clause BSD-like license
 
index ad3b5e715ca78d664a34f95a9083654e38b342bb..bead2a0128d152f2af071c90556e8cf0cafa21d4 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=ntp
 PKG_VERSION:=4.2.8p10
-PKG_RELEASE:=2
+PKG_RELEASE:=4
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/
@@ -87,10 +87,6 @@ $(call Package/ntpd/Default/description)
  This package contains the ntp-keygen.
 endef
 
-define Package/ntpd/conffiles
-/etc/ntp.conf
-endef
-
 CONFIGURE_VARS += \
        ac_cv_header_md5_h=no \
        ac_cv_lib_rt_sched_setscheduler=no \
@@ -118,8 +114,6 @@ define Package/ntpd/install
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/ntpd/ntpd $(1)/sbin/
        $(INSTALL_DIR) $(1)/usr/sbin
        $(INSTALL_BIN) ./files/ntpd.hotplug-helper $(1)/usr/sbin/
-       $(INSTALL_DIR) $(1)/etc
-       $(INSTALL_CONF) ./files/ntp.conf $(1)/etc/
        $(INSTALL_DIR) $(1)/etc/init.d
        $(INSTALL_BIN) ./files/ntpd.init $(1)/etc/init.d/ntpd
        $(INSTALL_DIR) $(1)/etc/hotplug.d/iface
diff --git a/net/ntpd/files/ntp.conf b/net/ntpd/files/ntp.conf
deleted file mode 100644 (file)
index 8bfb8e3..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-# use a random selection of 4 public stratum 2 servers
-# see http://twiki.ntp.org/bin/view/Servers/NTPPoolServers
-
-#restrict default nomodify notrap noquery
-#restrict default noquery
-
-restrict 127.0.0.1
-
-driftfile  /var/lib/ntp/ntp.drift
-
-server 0.openwrt.pool.ntp.org iburst
-server 1.openwrt.pool.ntp.org iburst
-server 2.openwrt.pool.ntp.org iburst
-server 3.openwrt.pool.ntp.org iburst
-
-
-# GPS(NMEA)+PPS
-#server 127.127.20.0 minpoll 4 prefer
-#fudge 127.127.20.0 flag3 1 flag2 0
-
-# SMA PPS
-#server 127.127.28.0 minpoll 4 prefer
-#fudge 127.127.28.0 refid PPS flag3 1
-
-#server 192.168.1.253
-
index 555825c64839514e3f15e55e0dc6d995422ed98b..eacf4c55d399c7970e9057d8e62c30c41f38788b 100644 (file)
@@ -1,13 +1,15 @@
 #!/bin/sh
 
+SLEEPTIME=10
+
 while true
 do
        STATUS="$(/usr/sbin/ntpq -c 'rv 0 stratum'|awk -F '=' '{ print $2 }')"
 
-       if [ -n "$STATUS" ] && [ "$STATUS" -lt "16" ]
+       if [[ -n "$STATUS" && "$STATUS" -lt "16" ]]
        then
                ACTION="stratum" /sbin/hotplug-call ntp
-               exit 0
+               SLEEPTIME=660
        fi
-       sleep 10
+       sleep $SLEEPTIME
 done
index 0ed663750a8c25586f29cd84e59d4137b77e47dc..0aaf132a4406a198acd6b981658e5ab71a8a2e1e 100644 (file)
@@ -68,7 +68,10 @@ start_service() {
                emit ""
        fi
 
-       emit "server $server iburst"
+       for i in $server
+       do
+               emit "server $i iburst"
+       done
 
        mkdir -p /var/lib/ntp
        chown -R ntp:ntp /var/lib/ntp
index 80f0e02a3bd53e15a81d65002a37f44325bd3bd1..fbf308e412b728af5bbb58a1e686dc2ebbe8b8e7 100644 (file)
@@ -20,7 +20,7 @@ PKG_LICENSE_FILES:=LICENSE
 PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../../lang/python/python-package.mk
 
 define Package/obfsproxy
        SECTION:=net
index 793829de575629a0ab063d8e1beebe614976a778..26ff64546bbb0ea81ec4e51d204789c2a8ffa1ad 100644 (file)
@@ -8,14 +8,14 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=ocserv
-PKG_VERSION:=0.11.9
+PKG_VERSION:=0.11.10
 PKG_RELEASE:=1
 PKG_USE_MIPS16:=0
 
 PKG_BUILD_DIR :=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=ftp://ftp.infradead.org/pub/ocserv/
-PKG_HASH:=23e274fd6a0e44df90eeb79276b1057f6508a2b4a842ce2f589a8353a51268eb
+PKG_HASH:=52c821dcd234a8f0d61f440ce3c80d0b23051d7fbd74c6d47dc2b884ae25966a
 
 PKG_LICENSE:=GPLv2+
 PKG_LICENSE_FILES:=COPYING
index 2c9528c5dd8090e381b0c2fd65c886a982c93a17..eca389d6ba49ea4d27583a8fb32d9fb02259b639 100644 (file)
@@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=ola
 PKG_VERSION:=0.10.5
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL:=https://github.com/OpenLightingProject/ola.git
@@ -38,7 +38,7 @@ define Package/ola
   TITLE:=Open Lighting Architecture Daemon
   URL:=https://www.openlighting.org/
   MAINTAINER:=Christian Beier <dontmind@freeshell.org>
-  DEPENDS:=+protobuf +libusb-1.0 +libuuid +libstdcpp +libpthread +librt +zlib +libncurses +liblo +sudo
+  DEPENDS:=+protobuf +libusb-1.0 +libuuid +libstdcpp +libpthread +librt +zlib +libncurses +liblo
 endef
 
 define Package/ola/description
index f1dff362de81d33baf7b82105bd838a2e0547374..e99239e6bc0ac3b07a0245633de187fbb8813d2d 100644 (file)
@@ -8,7 +8,8 @@ START=90
 
 start_service() {
        procd_open_instance
-       procd_set_param command sudo -u nobody /usr/bin/olad --syslog --log-level 2 --config-dir /etc/ola
+       procd_set_param user nobody
+       procd_set_param command /usr/bin/olad --syslog --log-level 2 --config-dir /etc/ola
        procd_set_param respawn
        procd_close_instance
 }
index 604a00557196de6c1aab1d40f7436826f161fd14..a0e6c66ae708cc4626a4e7aaed4b42683c5e6fb9 100644 (file)
@@ -53,6 +53,8 @@ CONFIGURE_ARGS += \
        --with-vpnc-script=/lib/netifd/vpnc-script \
        --without-libpcsclite \
        --without-stoken \
+       --without-libpskc \
+       --without-gssapi \
        --without-lz4
 
 ifeq ($(CONFIG_OPENCONNECT_OPENSSL),y)
index e2bf01b6f867b0ef2060b2242e97a653b91d223b..3a19387b0d0110fc5c25d7ffccb524a61c0588c4 100644 (file)
@@ -23,8 +23,6 @@ PKG_LICENSE_FILES:=LICENCE
 
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
 
-PKG_BUILD_DEPENDS:=libopenssl
-
 include $(INCLUDE_DIR)/package.mk
 
 define Package/openssh/Default
index 235f313581cf08308ef970a749add194942ba4f8..ee3cd0aaaa7ba91c8b191663ef571dcdb71c78c4 100644 (file)
@@ -32,7 +32,7 @@ PKG_INSTALL:=1
 SUPPORTED_KERNELS:=LINUX_3_18||LINUX_4_1||LINUX_4_3||LINUX_4_4||LINUX_4_9
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../../lang/python/python-package.mk
 
 define Package/openvswitch/Default
   SECTION:=net
@@ -159,6 +159,7 @@ TARGET_CFLAGS += -flto -std=gnu99
 CONFIGURE_VARS += \
        ovs_cv_flake8=no \
        ovs_cv_python3=no \
+       ovs_cv_sphinx=no \
        KARCH=$(LINUX_KARCH)
 
 MAKE_FLAGS += \
index b3f60d183b7e05d5f2519c755c2edbd58c394f5d..513e0bbac8a121c42b123f993dc9e329866329f3 100644 (file)
@@ -22,8 +22,8 @@ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_SUBDIR=$(PKG_NAME)-$(PKG_VERSION)
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
-$(call include_mk, python3-package.mk)
+include ../../lang/python/python-package.mk
+include ../../lang/python/python3-package.mk
 
 # no default dependencies
 PKG_DEFAULT_DEPENDS:=
index 137aaeae3273f64bac4771d140c924b6bcf3ea4b..0f2949c85ee45b10947c345975a8b0ba251465ac 100644 (file)
@@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=reaver
 PKG_VERSION:=1.6.3
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 PKG_MAINTAINER:=Yousong Zhou <yszhou4tech@gmail.com>
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
@@ -28,6 +28,8 @@ include $(INCLUDE_DIR)/package.mk
 CONFIGURE_PATH:=src
 MAKE_PATH:=src
 
+CONFIGURE_ARGS += --enable-savetocurrent
+
 define Package/reaver
   SECTION:=net
   CATEGORY:=Network
index 006c16f64a1258a8b2b35d6a26eb711d0bb41b36..e7c03beba9dd15ea5f9e204f67e4fa40f9314503 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=rsync
 PKG_VERSION:=3.1.2
-PKG_RELEASE:=3
+PKG_RELEASE:=4
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://download.samba.org/pub/rsync/src
diff --git a/net/rsync/patches/012-check-fname-in-recv_files-sooner.patch b/net/rsync/patches/012-check-fname-in-recv_files-sooner.patch
new file mode 100644 (file)
index 0000000..5cdbaf8
--- /dev/null
@@ -0,0 +1,36 @@
+commit 3e06d40029cfdce9d0f73d87cfd4edaf54be9c51
+Author: Jeriko One <jeriko.one@gmx.us>
+Date:   Thu Nov 2 23:44:19 2017 -0700
+
+    Check fname in recv_files sooner.
+
+diff --git a/receiver.c b/receiver.c
+index baae3a9..9fdafa1 100644
+--- a/receiver.c
++++ b/receiver.c
+@@ -574,6 +574,12 @@ int recv_files(int f_in, int f_out, char *local_name)
+                       file = dir_flist->files[cur_flist->parent_ndx];
+               fname = local_name ? local_name : f_name(file, fbuf);
++              if (daemon_filter_list.head
++                  && check_filter(&daemon_filter_list, FLOG, fname, 0) < 0) {
++                      rprintf(FERROR, "attempt to hack rsync failed.\n");
++                      exit_cleanup(RERR_PROTOCOL);
++              }
++
+               if (DEBUG_GTE(RECV, 1))
+                       rprintf(FINFO, "recv_files(%s)\n", fname);
+@@ -645,12 +651,6 @@ int recv_files(int f_in, int f_out, char *local_name)
+               cleanup_got_literal = 0;
+-              if (daemon_filter_list.head
+-                  && check_filter(&daemon_filter_list, FLOG, fname, 0) < 0) {
+-                      rprintf(FERROR, "attempt to hack rsync failed.\n");
+-                      exit_cleanup(RERR_PROTOCOL);
+-              }
+-
+               if (read_batch) {
+                       int wanted = redoing
+                                  ? we_want_redo(ndx)
diff --git a/net/rsync/patches/013-check-daemoin-filter-against.patch b/net/rsync/patches/013-check-daemoin-filter-against.patch
new file mode 100644 (file)
index 0000000..8090e19
--- /dev/null
@@ -0,0 +1,19 @@
+commit 5509597decdbd7b91994210f700329d8a35e70a1
+Author: Jeriko One <jeriko.one@gmx.us>
+Date:   Thu Nov 16 17:26:03 2017 -0800
+
+    Check daemon filter against fnamecmp in recv_files().
+
+diff --git a/receiver.c b/receiver.c
+index 9fdafa1..9c46242 100644
+--- a/receiver.c
++++ b/receiver.c
+@@ -722,7 +722,7 @@ int recv_files(int f_in, int f_out, char *local_name)
+                               break;
+                       }
+                       if (!fnamecmp || (daemon_filter_list.head
+-                        && check_filter(&daemon_filter_list, FLOG, fname, 0) < 0)) {
++                        && check_filter(&daemon_filter_list, FLOG, fnamecmp, 0) < 0)) {
+                               fnamecmp = fname;
+                               fnamecmp_type = FNAMECMP_FNAME;
+                       }
diff --git a/net/rsync/patches/014-sanitize-xname-in-read_ndx_and_attrs.patch b/net/rsync/patches/014-sanitize-xname-in-read_ndx_and_attrs.patch
new file mode 100644 (file)
index 0000000..d362d97
--- /dev/null
@@ -0,0 +1,30 @@
+commit 70aeb5fddd1b2f8e143276f8d5a085db16c593b9
+Author: Jeriko One <jeriko.one@gmx.us>
+Date:   Thu Nov 16 17:05:42 2017 -0800
+
+    Sanitize xname in read_ndx_and_attrs.
+
+diff --git a/rsync.c b/rsync.c
+index b82e598..a0945ba 100644
+--- a/rsync.c
++++ b/rsync.c
+@@ -49,6 +49,7 @@ extern int flist_eof;
+ extern int file_old_total;
+ extern int keep_dirlinks;
+ extern int make_backups;
++extern int sanitize_paths;
+ extern struct file_list *cur_flist, *first_flist, *dir_flist;
+ extern struct chmod_mode_struct *daemon_chmod_modes;
+ #ifdef ICONV_OPTION
+@@ -396,6 +397,11 @@ int read_ndx_and_attrs(int f_in, int f_out, int *iflag_ptr, uchar *type_ptr,
+       if (iflags & ITEM_XNAME_FOLLOWS) {
+               if ((len = read_vstring(f_in, buf, MAXPATHLEN)) < 0)
+                       exit_cleanup(RERR_PROTOCOL);
++
++              if (sanitize_paths) {
++                      sanitize_path(buf, buf, "", 0, SP_DEFAULT);
++                      len = strlen(buf);
++              }
+       } else {
+               *buf = '\0';
+               len = -1;
index c7d89299f0692cda90093fe0718ca8d6a758c5b8..c03a14e857459618275b8d5502621e4173147c50 100644 (file)
@@ -17,10 +17,8 @@ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).zip
 PKG_SOURCE_URL:=https://bitbucket.org/secdev/scapy/downloads/
 PKG_HASH:=8972c02e39a826a10c02c2bdd5025f7251dce9589c57befd9bb55c65f02e4934
 
-PKG_BUILD_DEPENDS:=python python-setuptools
-
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../../lang/python/python-package.mk
 
 define Package/scapy
   SECTION:=net
index 30def93ea1158b07cabfc05cfd943661005675bb..64603ed8fe551dd25a9ca674ec124fc3148342f9 100644 (file)
@@ -23,7 +23,7 @@ PKG_INSTALL:=1
 
 include $(INCLUDE_DIR)/package.mk
 include $(INCLUDE_DIR)/nls.mk
-$(call include_mk, python-package.mk)
+include ../../lang/python/python-package.mk
 
 define Package/seafile-ccnet
     SECTION:=net
index 332739caee8b2546149a73a4b3b5bb16b74fce9d..2cf27aef1f1cb2fbb724196c0263d9e1e08d8594 100644 (file)
@@ -20,7 +20,7 @@ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
 PKG_MIRROR_HASH:=511500c40dd7b1009f77109c6df810df1cf2c17a84a8f6841d592a9e05d22064
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
+include ../../lang/python/python-package.mk
 
 define Package/seafile-seahub
     SECTION:=net
index c25f3d5552275c4495294e17f1ba2258605d6e38..efae34d131262ceefd22af0847f84c1f55e415e7 100644 (file)
@@ -3,7 +3,7 @@ diff -rupN seafile-seahub-6.2.2.orig/Makefile seafile-seahub-6.2.2/Makefile
 +++ seafile-seahub-6.2.2/Makefile      2017-10-22 22:46:18.007470936 +0200
 @@ -1,3 +1,6 @@
 +include $(TOPDIR)/rules.mk
-+$(call include_mk, python-package.mk)
++include $(TOPDIR)/feeds/packages/lang/python/python-package.mk
 +
  PROJECT=seahub
  
index 0a0506b38fa51d3ef36384ba83d85034ed7497ee..12b2b2c471a0f2249a8dda93bc9aa53a258aab90 100644 (file)
@@ -23,7 +23,7 @@ PKG_INSTALL:=1
 
 include $(INCLUDE_DIR)/package.mk
 include $(INCLUDE_DIR)/nls.mk
-$(call include_mk, python-package.mk)
+include ../../lang/python/python-package.mk
 
 define Package/seafile-server
     SECTION:=net
index 3b7c67775605d03ed3213ef8771ede81f46f0120..da33832c7ea9d1041c21fc6035528533092142e1 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=ser2net
 PKG_VERSION:=3.5
-PKG_RELEASE:=1
+PKG_RELEASE:=3
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=@SF/ser2net
@@ -43,9 +43,16 @@ endef
 
 define Package/ser2net/install
        $(INSTALL_DIR) $(1)/usr/sbin
-       $(CP) $(PKG_INSTALL_DIR)/usr/sbin/ser2net $(1)/usr/sbin/
+       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ser2net $(1)/usr/sbin/
+
        $(INSTALL_DIR) $(1)/etc
-       $(INSTALL_CONF) $(PKG_BUILD_DIR)/ser2net.conf $(1)/etc/
+       $(INSTALL_CONF) ./files/ser2net.conf $(1)/etc/
+
+       $(INSTALL_DIR) $(1)/etc/config
+       $(INSTALL_CONF) ./files/ser2net.config $(1)/etc/config/ser2net
+
+       $(INSTALL_DIR) $(1)/etc/init.d
+       $(INSTALL_BIN) ./files/ser2net.init $(1)/etc/init.d/ser2net
 endef
 
 $(eval $(call BuildPackage,ser2net))
diff --git a/net/ser2net/files/ser2net.conf b/net/ser2net/files/ser2net.conf
new file mode 100644 (file)
index 0000000..2c9605b
--- /dev/null
@@ -0,0 +1,70 @@
+#
+# This is a minimal example configuration file for ser2net. For a version with
+# detailed comments and all possible configuration directives, please visit:
+# https://github.com/cminyard/ser2net/blob/master/ser2net.conf
+#
+# On OpenWrt/LEDE systems, this configuration serves as a base configuration.
+# During boot of the system, the UCI configuration file /etc/config/ser2net is
+# parsed and converted to additional configuration lines which are _appended_
+# to this file. The ser2net daemon is then started with the combined
+# configuration file /tmp/ser2net.conf.
+#
+# A basic service configuration line has the following format:
+# <network port>:<state>:<timeout>:<device>:<options>
+#      network port
+#              Name or number of the port to accept connections
+#              from for this device.  A port number may be of the form
+#              [ipv4,|ipv6,][tcp,|udp,][host,]port, such as
+#              127.0.0.1,2000 or ipv4,tcp,localhost,2000.  If the host is
+#              specified, it will only bind to the IP address
+#              specified. Otherwise it will bind to all the ports on the
+#              machine.  If ipv4 or ipv6 is specified, it will only bind
+#              to that network type.
+#
+#      state
+#              Either raw or rawlp or telnet or off.  off disables
+#              the  port  from  accepting  connections.  It can be
+#              turned on later from the control port.  raw enables
+#              the port and  transfers  all data as-is between the
+#              port  and  the long.  rawlp  enables  the port  and
+#              transfers  all input data to device, device is open
+#              without  any  termios  setting.  It  allow  to  use
+#              /dev/lpX  devices  and  printers connected to them.
+#              telnet enables the port and runs the telnet  proto-
+#              col  on the port to set up telnet parameters.  This
+#              is most useful for using telnet.
+#
+#      timeout
+#              The time (in seconds) before the port will be  dis-
+#              connected  if  there  is no activity on it.  A zero
+#              value disables this function.
+#
+#      device
+#              The  name  of  the  device   to  connect  to.  This
+#              must be in the form of /dev/<device>.
+#
+#      options
+#              Sets  operational  parameters  for the serial port.
+#              For a serial device (not IPMI SOL):
+#              Options 300, 1200, 2400, 4800, 9600, 19200, 38400,
+#              57600, 115200 set the various baud rates.  EVEN,
+#              ODD, NONE (MARK and SPACE if supported) set the parity.
+#              Note that MARK and SPACE are not available on all systems
+#              or hardware, if it is not supported then it will be
+#              silently set to ODD or EVEN parity.
+#              1STOPBIT, 2STOPBITS set
+#              the number of stop bits.  5DATABITS, 6DATABITS,
+#              7DATABITS, 8DATABITS set the number of data bits.
+#              [-]XONXOFF turns on (- off) XON/XOFF support.
+#              [-]RTSCTS turns on (- off) hardware flow control,
+#              [-]LOCAL turns off (- on) monitoring of the modem lines,
+#              and [-]HANGUP_WHEN_DONE turns on (- off) lowering the
+#              modem control lines when the connection is done.
+#              [-]NOBREAK disables automatic setting of the break
+#              setting of the serial port.
+#
+#              The "[-]remctl" option allow remote control (ala RFC
+#              2217) of serial-port configuration.
+#
+# Example:
+# 5000:telnet:0:/dev/ttyAPP0:115200 8DATABITS NONE 1STOPBIT -XONXOFF -LOCAL -RTSCTS remctl
diff --git a/net/ser2net/files/ser2net.config b/net/ser2net/files/ser2net.config
new file mode 100644 (file)
index 0000000..8ea5216
--- /dev/null
@@ -0,0 +1,67 @@
+config ser2net global
+       option enabled 1
+
+config controlport
+       option enabled 0
+       option host localhost
+       option port 2000
+
+config default
+       option speed 115200
+       option databits 8
+       option parity 'none'
+       option stopbits 1
+       option rtscts false
+       option local false
+       option remctl true
+
+#config led rx
+#      option driver sysfs
+#      option device 'duckbill:green:rs485'
+#      option duration 20
+#      option state 1
+
+#config led tx
+#      option driver sysfs
+#      option device 'duckbill:red:rs485'
+#      option duration 20
+#      option state 1
+
+config proxy
+       option enabled 0
+       option port 5000
+       option protocol telnet
+       option timeout 0
+       option device '/dev/ttyAPP0'
+       option baudrate 115200
+       option databits 8
+       option parity 'none'
+       option stopbits 1
+#      option led_tx 'tx'
+#      option led_rx 'rx'
+       option rtscts false
+       option local false
+       option xonxoff false
+       list options ''
+
+config proxy
+       option enabled 0
+       option port 5001
+       option protocol telnet
+       option timeout 0
+       option device '/dev/ttyUSB0'
+       option baudrate 115200
+       option databits 8
+       option parity 'none'
+       option stopbits 1
+
+config proxy
+       option enabled 0
+       option port 5002
+       option protocol raw
+       option timeout 0
+       option device '/dev/ttyUSB1'
+       option baudrate 9600
+       option databits 8
+       option parity 'none'
+       option stopbits 1
diff --git a/net/ser2net/files/ser2net.init b/net/ser2net/files/ser2net.init
new file mode 100644 (file)
index 0000000..2f7a3d5
--- /dev/null
@@ -0,0 +1,186 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2017 Michael Heimpold
+
+START=75
+STOP=10
+
+USE_PROCD=1
+PROG=/usr/sbin/ser2net
+
+STATICCFGFILE="/etc/ser2net.conf"
+DYNAMICCFGFILE="/tmp/ser2net.conf"
+
+list_cb_append() {
+       local var="$2"
+       local value="$1"
+       local sep="${3:- }"
+
+       eval "export ${NO_EXPORT:+-n} -- \"$var=\${$var:+\${$var}\${value:+\$sep}}\$value\""
+}
+
+append_bool() {
+       local var="$1"
+       local key="$2"
+       local val="$3"
+       local uc="$4"
+       local s=""
+
+       [ "$uc" -eq 1 ] && key=`echo "$key" | tr '[a-z]' '[A-Z]'`
+       [ "$val" -eq 0 ] && s="-"
+
+       append "$var" "$s$key"
+}
+
+ser2net_default() {
+       local cfg="$1"
+       local key val
+
+       for key in speed baudrate databits stopbits parity chardelay_scale chardelay_min; do
+               config_get val "$cfg" "$key"
+               [ -n "$val" ] || continue
+
+               case "$key" in
+                       baudrate) key="speed" ;;
+                       hangup_when_done) ;;
+                       telnet_brk_on_sync) ;;
+                       deassert_CTS_DCD_DSR_on_connect) ;;
+                       *) key=`echo "$key" | tr '_' '-'`
+               esac
+
+               echo "DEFAULT:$key:$val"
+       done
+
+       for key in chardelay deassert_CTS_DCD_DSR_on_connect hangup_when_done kickolduser \
+                  local nobreak remctl rtscts telnet_brk_on_sync xonxoff; do
+               config_get_bool val "$cfg" "$key"
+               [ -n "$val" ] || continue
+               [ "$val" -eq 0 ] && val="false" || val="true"
+               echo "DEFAULT:$key:$val"
+       done
+
+       echo
+}
+
+ser2net_controlport() {
+       local cfg="$1"
+       local enabled host port
+
+       config_get_bool enabled "$cfg" enabled 0
+       [ "$enabled" -eq 0 ] && return 0
+
+       config_get host "$cfg" host
+       config_get port "$cfg" port
+
+       echo -e "CONTROLPORT:${host:+$host,}$port\n"
+}
+
+ser2net_led() {
+       local cfg="$1"
+       local driver device state duration
+
+       config_get driver "$cfg" driver sysfs
+       config_get device "$cfg" device
+       config_get state "$cfg" state 1
+       config_get duration "$cfg" duration 20
+
+       echo -e "LED:$cfg:$driver:device=$device state=$state duration=$duration\n"
+}
+
+ser2net_proxy() {
+       local cfg="$1"
+       local enabled port protocol timeout device baudrate databits parity stopbits
+       local led_tx led_rx key boolval options
+
+       config_get_bool enabled "$cfg" enabled 0
+       [ "$enabled" -eq 0 ] && return 0
+
+       config_get port "$cfg" port
+       [ "$port" -le 0 -o "$port" -gt 65535 ] && return 1
+
+       config_get protocol "$cfg" protocol
+       case "$protocol" in
+               raw|rawlp|telnet|off) ;;
+               *) return 1
+       esac
+
+       config_get timeout "$cfg" timeout 0
+       config_get device "$cfg" device
+       [ -z "$device" ] && return 1
+
+       config_get baudrate "$cfg" baudrate
+       [ -n "$baudrate" ] && append options "$baudrate"
+
+       config_get databits "$cfg" databits
+       if [ -n "$databits" ]; then
+               [ "$databits" -lt 5 -o "$databits" -gt 8 ] && return 1
+               append options "${databits}DATABITS"
+       fi
+
+       config_get parity "$cfg" parity
+       parity=`echo "$parity" | tr '[a-z]' '[A-Z]'`
+       case "$parity" in
+               EVEN|ODD|NONE|MARK|SPACE) append options "$parity" ;;
+               "") ;;
+               *) return 1
+       esac
+
+       config_get stopbits "$cfg" stopbits
+       case "$stopbits" in
+               1) append options "${stopbits}STOPBIT" ;;
+               2) append options "${stopbits}STOPBITS" ;;
+               "") ;;
+               *) return 1
+       esac
+
+       config_get led_tx "$cfg" led_tx
+       [ -n "$led_tx" ] && append options "led-tx=$led_tx"
+
+       config_get led_rx "$cfg" led_rx
+       [ -n "$led_rx" ] && append options "led-rx=$led_rx"
+
+       for key in rtscts local xonxoff nobreak hangup_when_done; do
+               config_get_bool boolval "$cfg" "$key"
+               [ -n "$boolval" ] || continue
+               append_bool options "$key" "$boolval" 1
+       done
+
+       for key in chardelay telnet_brk_on_sync kickolduser remctl; do
+               config_get_bool boolval "$cfg" "$key"
+               [ -n "$boolval" ] || continue
+               append_bool options "$key" "$boolval" 0
+       done
+
+       config_list_foreach "$cfg" options list_cb_append options
+
+       if [ "`echo "$device" | sed 's/://g'`" != "$device" ]; then
+               echo "DEVICE:$cfg:$device"
+               device="$cfg"
+       fi
+
+       echo -e "$port:$protocol:$timeout:$device:$options\n"
+}
+
+start_service() {
+       local enabled
+
+       config_load ser2net
+
+       config_get_bool enabled global enabled 0
+       [ "$enabled" -gt 0 ] || return 0
+
+       cat "$STATICCFGFILE" - 2>/dev/null <<-EOF > "$DYNAMICCFGFILE"
+       
+       #
+       # Following part is auto-generated from UCI settings in /etc/config/ser2net
+       #
+       EOF
+
+       config_foreach ser2net_controlport controlport >> "$DYNAMICCFGFILE"
+       config_foreach ser2net_default default >> "$DYNAMICCFGFILE"
+       config_foreach ser2net_led led >> "$DYNAMICCFGFILE"
+       config_foreach ser2net_proxy proxy >> "$DYNAMICCFGFILE"
+
+       procd_open_instance
+       procd_set_param command "$PROG" -n -c "$DYNAMICCFGFILE"
+       procd_close_instance
+}
index 47b17f7f9bb98ef0f20d6e6ca5450e4cc70b1ca0..26dd782a696f01135cf1eb7e05082660552db344 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2017 Yousong Zhou <yszhou4tech@gmail.com>
+# Copyright (C) 2017-2018 Yousong Zhou <yszhou4tech@gmail.com>
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -13,12 +13,12 @@ include $(TOPDIR)/rules.mk
 # - check if default mode has changed from being tcp_only
 #
 PKG_NAME:=shadowsocks-libev
-PKG_VERSION:=3.1.1
-PKG_RELEASE:=1
+PKG_VERSION:=3.1.2
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://github.com/shadowsocks/shadowsocks-libev/releases/download/v$(PKG_VERSION)
-PKG_HASH:=24a002c100fbe9b4481e3134273cb1a2f25a4026eb030760e7e7eb57f8466ef6
+PKG_HASH:=3611f09793af923d988ecbd15ad89fb66839e51a0059685d8f88c0131658e4a7
 
 PKG_MAINTAINER:=Yousong Zhou <yszhou4tech@gmail.com>
 
index 1b08f41df2cee4ff6c94018c41e2bd071304d0b5..7564f348e3022007598dc55d9be89419dfd99c39 100644 (file)
@@ -115,8 +115,8 @@ ss_xxx() {
                procd_open_instance "$cfgtype.$cfg"
                procd_set_param command "$bin" -c "$confjson"
                [ "$verbose" = 0 ] || procd_append_param command -v
+               [ "$no_delay" = 0 ] || procd_append_param command --no-delay
                [ -z "$bind_address" ] || procd_append_param command -b "$bind_address"
-               [ -z "$manager_address" ] || procd_append_param command --manager-address "$manager_address"
                procd_set_param file "$confjson"
                procd_set_param respawn
                procd_close_instance
@@ -258,6 +258,7 @@ validate_common_options_() {
                'disabled:bool:0' \
                'fast_open:bool:0' \
                'ipv6_first:bool:0' \
+               'no_delay:bool:0' \
                'reuse_port:bool:0' \
                'verbose:bool:0' \
                'mode:or("tcp_only", "udp_only", "tcp_and_udp"):tcp_only' \
@@ -304,8 +305,7 @@ validate_ss_server_section() {
        validate_common_server_options_ ss_server "$1" \
                validate_common_options_ \
                "${2}" \
-               'bind_address:ipaddr' \
-               'manager_address:host'
+               'bind_address:ipaddr'
 }
 
 validate_ss_tunnel_section() {
index cc8c9cbfb0269369a38680865f1a90ac64356c87..24b0fa1eee1053eb44f31a4c31b38079896bee6a 100644 (file)
@@ -10,8 +10,8 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=shorewall-core
 PKG_MAJOR_MINOR_VERSION:=5.1
-PKG_BUGFIX_MAJOR_VERSION:=9
-PKG_BUGFIX_MINOR_VERSION:=
+PKG_BUGFIX_MAJOR_VERSION:=10
+PKG_BUGFIX_MINOR_VERSION:=.2
 PKG_VERSION:=$(PKG_MAJOR_MINOR_VERSION).$(PKG_BUGFIX_MAJOR_VERSION)$(PKG_BUGFIX_MINOR_VERSION)
 PKG_DIRECTORY:=$(PKG_MAJOR_MINOR_VERSION).$(PKG_BUGFIX_MAJOR_VERSION)
 PKG_RELEASE:=1
@@ -22,7 +22,7 @@ PKG_SOURCE_URL:=http://www.shorewall.net/pub/shorewall/$(PKG_MAJOR_MINOR_VERSION
        http://shorewall.de/pub/shorewall/$(PKG_MAJOR_MINOR_VERSION)/shorewall-$(PKG_DIRECTORY)/ \
        http://www.shorewall.com.au/$(PKG_MAJOR_MINOR_VERSION)/shorewall-$(PKG_DIRECTORY)/
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
-PKG_HASH:=a7735b31305678e1c4d21fabb026fbd37bdb8b3e0f5d8887f60ab2969a485e46
+PKG_HASH:=33d43545b430ba48166b89ca32e375f0afc7cfafa4d4cfb020520ac4b64c400a
 
 PKG_MAINTAINER:=Willem van den Akker <wvdakker@wilsoft.nl>
 PKG_LICENSE:=GPL-2.0+
index abd726e917699792aa598274a0f571af3585197c..c3a92a8cfbd2ae34c71838ed49a4b43559e3d970 100644 (file)
@@ -10,11 +10,11 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=shorewall-lite
 PKG_MAJOR_MINOR_VERSION:=5.1
-PKG_BUGFIX_MAJOR_VERSION:=9
-PKG_BUGFIX_MINOR_VERSION:=
+PKG_BUGFIX_MAJOR_VERSION:=10
+PKG_BUGFIX_MINOR_VERSION:=.2
 PKG_VERSION:=$(PKG_MAJOR_MINOR_VERSION).$(PKG_BUGFIX_MAJOR_VERSION)$(PKG_BUGFIX_MINOR_VERSION)
 PKG_DIRECTORY:=$(PKG_MAJOR_MINOR_VERSION).$(PKG_BUGFIX_MAJOR_VERSION)
-PKG_RELEASE:=2
+PKG_RELEASE:=1
 
 PKG_SOURCE_URL:=http://www.shorewall.net/pub/shorewall/$(PKG_MAJOR_MINOR_VERSION)/shorewall-$(PKG_DIRECTORY)/ \
        http://www1.shorewall.net/pub/shorewall/$(PKG_MAJOR_MINOR_VERSION)/shorewall-$(PKG_DIRECTORY)/ \
@@ -22,7 +22,7 @@ PKG_SOURCE_URL:=http://www.shorewall.net/pub/shorewall/$(PKG_MAJOR_MINOR_VERSION
        http://shorewall.de/pub/shorewall/$(PKG_MAJOR_MINOR_VERSION)/shorewall-$(PKG_DIRECTORY)/ \
        http://www.shorewall.com.au/$(PKG_MAJOR_MINOR_VERSION)/shorewall-$(PKG_DIRECTORY)/
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
-PKG_HASH:=ed4041004f03d6d0baefa3c3f5be76c5d2e21ad7004c044a95006e95450404d5
+PKG_HASH:=d368209804fb339a7085e220049c9cc7a683c9af657c71cefe3a13423e955498
 
 PKG_MAINTAINER:=Willem van den Akker <wvdakker@wilsoft.nl>
 PKG_LICENSE:=GPL-2.0+
@@ -63,19 +63,19 @@ define Build/Compile
 endef
 
 define Package/shorewall-lite/install
-       $(INSTALL_DIR) $(1)/usr/sbin/
-       $(INSTALL_DIR) $(1)/etc/init.d/
        $(INSTALL_DIR) $(1)/etc/hotplug.d/iface/
+       $(INSTALL_DIR) $(1)/etc/init.d/
        $(INSTALL_DIR) $(1)/etc/shorewall-lite/state/
+       $(INSTALL_DIR) $(1)/usr/sbin/
        $(INSTALL_DIR) $(1)/usr/share/shorewall-lite/
-       $(INSTALL_BIN) ./files/hotplug_iface $(1)/etc/hotplug.d/iface/05-shorewall-lite
+       $(CP) $(PKG_INSTALL_DIR)/etc/shorewall-lite/ $(1)/etc/
        $(CP) $(PKG_INSTALL_DIR)/usr/share/shorewall-lite/ $(1)/usr/share/
        $(CP) $(PKG_INSTALL_DIR)/usr/sbin/shorewall-lite $(1)/usr/sbin/
        $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/shorewall-lite/shorecap $(1)/usr/share/shorewall-lite/
        $(INSTALL_BIN) ./files/hostname $(1)/usr/share/shorewall-lite/
-       $(CP) $(PKG_INSTALL_DIR)/etc/shorewall-lite/ $(1)/etc/
+       $(INSTALL_BIN) ./files/hotplug_iface $(1)/etc/hotplug.d/iface/05-shorewall-lite
        $(INSTALL_BIN) ./files/shorewall-lite.init $(1)/etc/init.d/shorewall-lite
-       $(CP) ./files/vardir $(1)/etc/shorewall-lite/
+       $(INSTALL_BIN) ./files/vardir $(1)/etc/shorewall-lite/
 endef
 
 $(eval $(call BuildPackage,shorewall-lite))
index f8f7af75173e290d08e3f9725b1858c11bb934d9..3265661e16634b5653f08d05bc6d56c6235a5f9b 100644 (file)
@@ -10,8 +10,8 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=shorewall
 PKG_MAJOR_MINOR_VERSION:=5.1
-PKG_BUGFIX_MAJOR_VERSION:=9
-PKG_BUGFIX_MINOR_VERSION:=
+PKG_BUGFIX_MAJOR_VERSION:=10
+PKG_BUGFIX_MINOR_VERSION:=.2
 PKG_VERSION:=$(PKG_MAJOR_MINOR_VERSION).$(PKG_BUGFIX_MAJOR_VERSION)$(PKG_BUGFIX_MINOR_VERSION)
 PKG_DIRECTORY:=$(PKG_MAJOR_MINOR_VERSION).$(PKG_BUGFIX_MAJOR_VERSION)
 PKG_RELEASE:=1
@@ -22,7 +22,7 @@ PKG_SOURCE_URL:=http://www.shorewall.net/pub/shorewall/$(PKG_MAJOR_MINOR_VERSION
        http://shorewall.de/pub/shorewall/$(PKG_MAJOR_MINOR_VERSION)/shorewall-$(PKG_DIRECTORY)/ \
        http://www.shorewall.com.au/$(PKG_MAJOR_MINOR_VERSION)/shorewall-$(PKG_DIRECTORY)/
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
-PKG_HASH:=e6375b360e370d4f3f0e161431ff93c6b7a3aa8799f5e8be8dee48b409c35007
+PKG_HASH:=c38e7894c0db663233e5ab6d2cf21951fe373bdcbc778ba19c5be20c2c7ef95d
 
 PKG_MAINTAINER:=Willem van den Akker <wvdakker@wilsoft.nl>
 PKG_LICENSE:=GPL-2.0+
index e36019dc8790b3a9833ede5d72b1f759dbd3f288..5b65ff04ceba18926d99f96b4ecb70113a8b0b85 100644 (file)
@@ -1,8 +1,6 @@
-Index: shorewall-5.1.4.1/configfiles/shorewall.conf
-===================================================================
---- shorewall-5.1.4.1.orig/configfiles/shorewall.conf  2017-10-05 11:18:41.586275516 +0200
-+++ shorewall-5.1.4.1/configfiles/shorewall.conf       2017-10-05 11:26:11.825609382 +0200
-@@ -33,7 +33,7 @@
+--- a/configfiles/shorewall.conf
++++ b/configfiles/shorewall.conf
+@@ -33,7 +33,7 @@ FIREWALL=
  #                            L O G G I N G
  ###############################################################################
  
@@ -11,7 +9,7 @@ Index: shorewall-5.1.4.1/configfiles/shorewall.conf
  
  BLACKLIST_LOG_LEVEL=
  
-@@ -101,7 +101,7 @@
+@@ -101,7 +101,7 @@ RESTOREFILE=restore
  
  SHOREWALL_SHELL=/bin/sh
  
diff --git a/net/shorewall/patches/130-set-path.patch b/net/shorewall/patches/130-set-path.patch
new file mode 100644 (file)
index 0000000..78e0c67
--- /dev/null
@@ -0,0 +1,13 @@
+Index: shorewall-5.1.9/configfiles/shorewall.conf
+===================================================================
+--- shorewall-5.1.9.orig/configfiles/shorewall.conf    2017-12-18 08:09:12.043625770 +0100
++++ shorewall-5.1.9/configfiles/shorewall.conf 2017-12-18 08:09:54.353402257 +0100
+@@ -93,7 +93,7 @@
+ NFACCT=
+-PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin"
++PATH="/usr/sbin:/usr/bin:/sbin:/bin"
+ PERL=/usr/bin/perl
index ff7d0318229b214d917abce51f92551236406d3e..77711d79eaab5930a128443f73ec433f9f02619c 100644 (file)
@@ -10,11 +10,11 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=shorewall6-lite
 PKG_MAJOR_MINOR_VERSION:=5.1
-PKG_BUGFIX_MAJOR_VERSION:=9
-PKG_BUGFIX_MINOR_VERSION:=
+PKG_BUGFIX_MAJOR_VERSION:=10
+PKG_BUGFIX_MINOR_VERSION:=.2
 PKG_VERSION:=$(PKG_MAJOR_MINOR_VERSION).$(PKG_BUGFIX_MAJOR_VERSION)$(PKG_BUGFIX_MINOR_VERSION)
 PKG_DIRECTORY:=$(PKG_MAJOR_MINOR_VERSION).$(PKG_BUGFIX_MAJOR_VERSION)
-PKG_RELEASE:=2
+PKG_RELEASE:=1
 
 PKG_SOURCE_URL:=http://www.shorewall.net/pub/shorewall/$(PKG_MAJOR_MINOR_VERSION)/shorewall-$(PKG_DIRECTORY)/ \
        http://www1.shorewall.net/pub/shorewall/$(PKG_MAJOR_MINOR_VERSION)/shorewall-$(PKG_DIRECTORY)/ \
@@ -22,7 +22,7 @@ PKG_SOURCE_URL:=http://www.shorewall.net/pub/shorewall/$(PKG_MAJOR_MINOR_VERSION
        http://shorewall.de/pub/shorewall/$(PKG_MAJOR_MINOR_VERSION)/shorewall-$(PKG_DIRECTORY)/ \
        http://www.shorewall.com.au/$(PKG_MAJOR_MINOR_VERSION)/shorewall-$(PKG_DIRECTORY)/
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
-PKG_HASH:=ccb2bdb749ad487cf26f5d236068b5fb736011387fae226e703e504adf6ec86d
+PKG_HASH:=7971f8d906122f65ac59a782051a137d0be5f6288ed06e0fd773fb95e95d37c4
 
 PKG_MAINTAINER:=Willem van den Akker <wvdakker@wilsoft.nl>
 PKG_LICENSE:=GPL-2.0+
@@ -64,19 +64,19 @@ define Build/Compile
 endef
 
 define Package/shorewall6-lite/install
-       $(INSTALL_DIR) $(1)/usr/sbin/
-       $(INSTALL_DIR) $(1)/etc/init.d/
        $(INSTALL_DIR) $(1)/etc/hotplug.d/iface/
+       $(INSTALL_DIR) $(1)/etc/init.d/
        $(INSTALL_DIR) $(1)/etc/shorewall6-lite/state/
+       $(INSTALL_DIR) $(1)/usr/sbin/
        $(INSTALL_DIR) $(1)/usr/share/shorewall6-lite/
-       $(INSTALL_BIN) ./files/hotplug_iface $(1)/etc/hotplug.d/iface/05-shorewall6-lite
+       $(CP) $(PKG_INSTALL_DIR)/etc/shorewall6-lite/ $(1)/etc/
        $(CP) $(PKG_INSTALL_DIR)/usr/share/shorewall6-lite/ $(1)/usr/share/
        $(CP) $(PKG_INSTALL_DIR)/usr/sbin/shorewall6-lite $(1)/usr/sbin/
        $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/shorewall6-lite/shorecap $(1)/usr/share/shorewall6-lite/
        $(INSTALL_BIN) ./files/hostname $(1)/usr/share/shorewall6-lite/
-       $(CP) $(PKG_INSTALL_DIR)/etc/shorewall6-lite/ $(1)/etc/
+       $(INSTALL_BIN) ./files/hotplug_iface $(1)/etc/hotplug.d/iface/05-shorewall6-lite
        $(INSTALL_BIN) ./files/shorewall6-lite.init $(1)/etc/init.d/shorewall6-lite
-       $(CP) ./files/vardir $(1)/etc/shorewall6-lite/
+       $(INSTALL_BIN) ./files/vardir $(1)/etc/shorewall6-lite/
 endef
 
 $(eval $(call BuildPackage,shorewall6-lite))
index 3d332c10de2e74aa83d1b227369f9ec7760834e5..a75cc6905d39f9110fdb61d9d755d72e757e137a 100644 (file)
@@ -2,7 +2,7 @@
 +++ shorewall6-lite-5.1.9/shorewall6-lite.conf 2017-12-17 09:05:55.769714392 -0500
 @@ -36,7 +36,7 @@
  
- IPTABLES=
+ IP6TABLES=
  
 -PATH=
 +PATH=/usr/sbin:/usr/bin:/sbin:/bin
index 143d5839718b17c0d1673efe913420cc69dc20bc..6afb39d2aa37697b0192d952f3425be672d8856d 100644 (file)
@@ -1,7 +1,7 @@
-Index: shorewall6-lite-5.1.7.2/shorewall6-lite.conf
+Index: shorewall6-lite-5.1.10.2/shorewall6-lite.conf
 ===================================================================
---- shorewall6-lite-5.1.7.2.orig/shorewall6-lite.conf  2017-10-11 15:36:41.037818015 +0200
-+++ shorewall6-lite-5.1.7.2/shorewall6-lite.conf       2017-10-11 15:36:41.033818232 +0200
+--- shorewall6-lite-5.1.10.2.orig/shorewall6-lite.conf 2018-01-04 22:09:34.461951267 +0100
++++ shorewall6-lite-5.1.10.2/shorewall6-lite.conf      2018-01-04 22:10:23.559291269 +0100
 @@ -28,7 +28,7 @@
  #                            L O G G I N G
  ###############################################################################
index 387f640132783d7faf50d740f172221ab1848d62..4935c9ac71f108c8ea34f7f8b533e2ea73de9489 100644 (file)
@@ -10,8 +10,8 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=shorewall6
 PKG_MAJOR_MINOR_VERSION:=5.1
-PKG_BUGFIX_MAJOR_VERSION:=9
-PKG_BUGFIX_MINOR_VERSION:=
+PKG_BUGFIX_MAJOR_VERSION:=10
+PKG_BUGFIX_MINOR_VERSION:=.2
 PKG_VERSION:=$(PKG_MAJOR_MINOR_VERSION).$(PKG_BUGFIX_MAJOR_VERSION)$(PKG_BUGFIX_MINOR_VERSION)
 PKG_DIRECTORY:=$(PKG_MAJOR_MINOR_VERSION).$(PKG_BUGFIX_MAJOR_VERSION)
 PKG_RELEASE:=1
@@ -22,7 +22,7 @@ PKG_SOURCE_URL:=http://www.shorewall.net/pub/shorewall/$(PKG_MAJOR_MINOR_VERSION
        http://shorewall.de/pub/shorewall/$(PKG_MAJOR_MINOR_VERSION)/shorewall-$(PKG_DIRECTORY)/ \
        http://www.shorewall.com.au/$(PKG_MAJOR_MINOR_VERSION)/shorewall-$(PKG_DIRECTORY)/
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
-PKG_HASH:=bb07e55944800b4cc541b9ba51274110387e3e25694a24965aada7d91a4510a6
+PKG_HASH:=f86937c117346d7dbd1a1e7410cf45189a93ec7cd3f6fb5d0419b3e398b681df
 
 PKG_MAINTAINER:=Willem van den Akker <wvdakker@wilsoft.nl>
 PKG_LICENSE:=GPL-2.0+
diff --git a/net/shorewall6/patches/130-set-path.patch b/net/shorewall6/patches/130-set-path.patch
new file mode 100644 (file)
index 0000000..f020ae7
--- /dev/null
@@ -0,0 +1,13 @@
+Index: shorewall6-5.1.9/configfiles/shorewall6.conf
+===================================================================
+--- shorewall6-5.1.9.orig/configfiles/shorewall6.conf  2017-12-18 08:13:01.999494346 +0100
++++ shorewall6-5.1.9/configfiles/shorewall6.conf       2017-12-18 08:13:37.253618974 +0100
+@@ -92,7 +92,7 @@
+ PERL=/usr/bin/perl
+-PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin"
++PATH="/usr/sbin:/usr/bin:/sbin:/bin"
+ RESTOREFILE=restore
index e6fcdf954e5a6cea024e5774e60e37891f6c9b3f..8a22176d615c591a5855094e79e8feb2606b8290 100644 (file)
@@ -5,7 +5,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=simple-adblock
 PKG_VERSION:=1.5.7
-PKG_RELEASE:=2
+PKG_RELEASE:=10
 PKG_LICENSE:=GPL-3.0+
 PKG_MAINTAINER:=Stan Grishin <stangri@melmac.net>
 
index 1884abf8e29de0b3d04b229811a45a5417bc2497..7ab2e4bdb503cf7744e9579f4b3bc186f33b1019 100644 (file)
@@ -2,7 +2,7 @@ config simple-adblock 'config'
        option enabled '0'
        option verbosity '2'
        option force_dns '1'
-       option run_in_background '1'
+       option run_in_background '0'
        option hosts_file '/var/dnsmasq.d/simple-adblock'
   list whitelist_domain 'raw.githubusercontent.com'
 #      list blacklist_hosts_url 'http://support.it-mate.co.uk/downloads/hosts.txt'
@@ -20,7 +20,7 @@ config simple-adblock 'config'
        list blacklist_domains_url 'https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt'
        list blacklist_domains_url 'https://s3.amazonaws.com/lists.disconnect.me/simple_tracking.txt'
        list blacklist_domains_url 'https://ransomwaretracker.abuse.ch/downloads/RW_DOMBL.txt'
-       list blacklist_domains_url 'https://gitlab.com/gwillem/public-snippets/snippets/28813/raw'
+       list blacklist_domains_url 'https://ssl.bblck.me/blacklists/domain-list.txt'
        list blacklist_domains_url 'http://dshield.org/feeds/suspiciousdomains_High.txt'
 #      list blacklist_domains_url 'http://dshield.org/feeds/suspiciousdomains_Medium.txt'
 #      list blacklist_domains_url 'http://dshield.org/feeds/suspiciousdomains_Low.txt'
index 8ac04c99c0be8d437d42565146b47d59283116b5..e5c9002beb8869052fb5948d577c41ee82d77f8e 100644 (file)
@@ -18,27 +18,28 @@ readonly __ok__='\033[0;32m[\xe2\x9c\x93]\033[0m'
 readonly __fail__='\033[0;31m[\xe2\x9c\x97]\033[0m'
 readonly _error_='\033[0;31mERROR\033[0m'
 
-export verbosity=2 force_dns=1 bgrun=0 debug=0 hosts_file='/var/dnsmasq.d/simple-adblock' led wan_if wan_gw wanphysdev
-
+readonly packageName="simple-adblock"
+readonly serviceName="$packageName $PKG_VERSION"
 ok() { case $verbosity in 1) output "$_ok_";; 2) output "$__ok__\n";; esac; }
 okn() { case $verbosity in 1) output "$_ok_\n";; 2) output "$__ok__\n";; esac; }
 fail() { case $verbosity in 1) output "$_fail_";; 2) output "$__fail__\n";; esac; }
 failn() { case $verbosity in 1) output "$_fail_\n";; 2) output "$__fail__\n";; esac; }
-output() { [[ $# -ne 1 ]] && { [[ ! $((verbosity & $1)) -gt 0 ]] && return 0 || shift; }; local msg; msg=$(echo -n "${1/$p_name /service }" | sed 's|\\033\[[0-9]\?;\?[0-9]\?[0-9]\?m||g'); [[ -t 1 ]] && echo -e -n "$1"; [[ $(echo -e -n "$msg" | wc -l) -gt 0 ]] && logger -t "${PKG_NAME:-service} [$$]" "$(echo -e -n ${logmsg}${msg})" && logmsg='' || logmsg=${logmsg}${msg}; }
-PKG_NAME="${PKG_NAME:-simple-adblock}"; p_name="${PKG_NAME} ${PKG_VERSION}"
-
+output() { [[ $# -ne 1 ]] && { [[ ! $((verbosity & $1)) -gt 0 ]] && return 0 || shift; }; local msg; msg=$(echo -n "${1/$serviceName /service }" | sed 's|\\033\[[0-9]\?;\?[0-9]\?[0-9]\?m||g'); [[ -t 1 ]] && echo -e -n "$1"; [[ $(echo -e -n "$msg" | wc -l) -gt 0 ]] && logger -t "${packageName:-service} [$$]" "$(echo -e -n ${logmsg}${msg})" && logmsg='' || logmsg=${logmsg}${msg}; }
 led_on(){ [[ -n "$led" && -e "$led/trigger" ]] && echo "default-on" > "$led/trigger"; }
 led_off(){ [[ -n "$led" && -e "$led/trigger" ]] && echo "none" > "$led/trigger"; }
+export verbosity force_dns bgrun debug led wan_if wan_gw wanphysdev hosts_file
+
+boot() { ( sleep 120 && rc_procd start_service && rc_procd service_triggers | cat &); }
 
 is_enabled () {
                local c=1 enabled
-               config_load $PKG_NAME
+               config_load $packageName
                config_get_bool enabled   'config' 'enabled' 1
                config_get_bool bgrun     'config' 'run_in_background' 0
                config_get_bool force_dns 'config' 'force_dns' 1
                config_get_bool debug     'config' 'debug' 0
                config_get verbosity      'config' 'verbosity' '2'
-               config_get hosts_file     'config' 'hosts_file' '/var/dnsmasq.d/simple-adblock'
+               config_get hosts_file     'config' 'hosts_file' "/var/dnsmasq.d/${packageName}"
                config_get led            'config' 'led'
 
                if [ "$debug" -ne 0 ]; then
@@ -48,21 +49,21 @@ is_enabled () {
                fi
 
                led="${led:+/sys/class/leds/$led}"
-               [[ $enabled -gt 0 ]] || { output "$_error_: $p_name is not enabled.\n"; return 1; }
+               [[ $enabled -gt 0 ]] || { output "$_error_: $serviceName is not enabled.\n"; return 1; }
                source  /lib/functions/network.sh
                while : ; do
-                       network_find_wan wan_if;        [ -n "$wan_if" ] && network_get_gateway wan_gw $wan_if;
+                       network_flush_cache; network_find_wan wan_if;   network_get_gateway wan_gw $wan_if;
                        [[ $c -ge 25 || -n "$wan_gw" ]] && break
-                       output "$p_name waiting for wan gateway...\n"; sleep 2; network_flush_cache; let "c+=1";
+                       output "$serviceName waiting for wan gateway...\n"; sleep 2; let "c+=1";
                done
-               [ -n "$wan_gw" ] && return 0 || { output "$_error_: $p_name failed to discover WAN gateway.\n"; return 1; }
+               [ -n "$wan_gw" ] && return 0 || { output "$_error_: $serviceName failed to discover WAN gateway.\n"; return 1; }
 }
 
 reset_iptables() {
   [[ $force_dns -eq 0 ]] && return 0
-       [ -z "$PKG_NAME" ] && return 1
-       iptables-save | grep -Fv -- "$PKG_NAME" | iptables-restore
-       lsmod | grep -q ip6table_nat && ip6tables-save | grep -Fv -- "$PKG_NAME" | ip6tables-restore
+       [ -z "$packageName" ] && return 1
+       iptables-save | grep -Fv -- "$packageName" | iptables-restore
+       lsmod | grep -q ip6table_nat && ip6tables-save | grep -Fv -- "$packageName" | ip6tables-restore
        [ ! "$1" == "quiet" ] && output 'No longer forcing local DNS server.\n'
 }
 
@@ -72,16 +73,16 @@ set_iptables() {
        ipv6wan=$(ifconfig $wanphysdev | grep inet6 | awk '{print $3}')
 
        if [[ $force_dns -ne 0 ]]; then
-               [ -n "$ip" ] && iptables -t nat -A prerouting_rule -i $brname -p tcp --dport 53 -j DNAT --to $ip -m comment --comment "$PKG_NAME"
-               [ -n "$ip" ] && iptables -t nat -A prerouting_rule -i $brname -p udp --dport 53 -j DNAT --to $ip -m comment --comment "$PKG_NAME"
+               [ -n "$ip" ] && iptables -t nat -A prerouting_rule -i $brname -p tcp --dport 53 -j DNAT --to $ip -m comment --comment "$packageName"
+               [ -n "$ip" ] && iptables -t nat -A prerouting_rule -i $brname -p udp --dport 53 -j DNAT --to $ip -m comment --comment "$packageName"
                if [[ -n "$ipv6" && -n "$ipv6wan" ]] && lsmod | grep -q ip6table_nat; then
-                       ip6tables -t nat -A PREROUTING -i $brname -p tcp --dport 53 -j DNAT --to-destination [$ipv6] -m comment --comment "$PKG_NAME"
-                       ip6tables -t nat -A PREROUTING -i $brname -p udp --dport 53 -j DNAT --to-destination [$ipv6] -m comment --comment "$PKG_NAME"
+                       ip6tables -t nat -A PREROUTING -i $brname -p tcp --dport 53 -j DNAT --to-destination [$ipv6] -m comment --comment "$packageName"
+                       ip6tables -t nat -A PREROUTING -i $brname -p udp --dport 53 -j DNAT --to-destination [$ipv6] -m comment --comment "$packageName"
                        label="$ip/$ipv6"
                else
                        label="$ip"
                fi
-               [ -n "$label" ] && output "Forcing local DNS server: $label.\n" || output "$_error_: $p_name failed to obtain LAN IP address for DNS forcing!\n"
+               [ -n "$label" ] && output "Forcing local DNS server: $label.\n" || output "$_error_: $serviceName failed to obtain LAN IP address for DNS forcing!\n"
        fi
 }
 
@@ -89,8 +90,8 @@ stop_adblocking () {
     [ -f $hosts_file ] && mv $hosts_file $T_TMP
     output 3 "Restarting dnsmasq "
                led_off
-    /etc/init.d/dnsmasq restart >/dev/null  2>&1
-               [[ $? -eq 0 ]] && { okn; output "$p_name stopped.\n"; } || { failn; output "$_error_: $p_name failed to reload dnsmasq!\n"; }
+    /etc/init.d/dnsmasq restart >/dev/null 2>&1
+               [[ $? -eq 0 ]] && { okn; output "$serviceName stopped.\n"; } || { failn; output "$_error_: $serviceName failed to reload dnsmasq!\n"; }
 }
 
 process_url() {
@@ -99,8 +100,8 @@ process_url() {
        local url=$1
        [ "$2" == "hosts" ] && label="Hosts: $(echo $1 | cut -d'/' -f3)" filter="$h_filter" || label="Domains: $(echo $1 | cut -d'/' -f3)" filter="$d_filter"
        [ "$3" == "blocked" ] && { type='Blocked'; D_TMP="$B_TMP"; } || { type='Allowed'; D_TMP="$A_TMP"; }
-       R_TMP="/var/simple-adblock_$(head /dev/urandom | tr -dc 'A-Za-z0-9' | head -c10)"
-       while [ -e "$R_TMP" ]; do R_TMP="/var/simple-adblock_$(head /dev/urandom | tr -dc 'A-Za-z0-9' | head -c10)"; done
+       R_TMP="/var/simple-adblock_$(head -c40 /dev/urandom 2>/dev/null | tr -dc 'A-Za-z0-9' 2>/dev/null)"
+       while [ -e "$R_TMP" ]; do R_TMP="/var/simple-adblock_$(head -c40 /dev/urandom 2>/dev/null | tr -dc 'A-Za-z0-9' 2>/dev/null)"; done
        touch "$R_TMP"
     output 2 "[DL] $type $label "
     $dl "${url}" > "$R_TMP" 2>/dev/null && ok || fail
@@ -122,7 +123,11 @@ start_adblocking () {
                output 3 'Found existing data file, reusing it '
                mv $T_TMP $hosts_file && okn || failn
        else
-               [ -f $A_TMP ] && rm -f $A_TMP; [ -f $B_TMP ] && rm -f $B_TMP; [ -f $T_TMP ] && rm -f $T_TMP; [ -f $hosts_file ] && rm -f $hosts_file
+               [ -f $A_TMP ] && rm -f $A_TMP; [ -f $B_TMP ] && rm -f $B_TMP; [ -f $T_TMP ] && rm -f $T_TMP; [ -f $hosts_file ] && rm -f $hosts_file;
+               if [ "$(awk '/^MemFree/ {print int($2/1000)}' "/proc/meminfo")" -lt 32 ]; then
+                       output 1 'Low free memory, restarting dnsmasq...'
+                       /etc/init.d/dnsmasq restart >/dev/null 2>&1 && okn || failn
+               fi
     touch $A_TMP; touch $B_TMP; touch $T_TMP;
     if [ -n "$blacklist_hosts_urls" ]; then
            output 1 '[DL] Blocked Hosts '
@@ -158,38 +163,39 @@ start_adblocking () {
 
        if [ -s $hosts_file ]; then
                output 3 'Restarting dnsmasq '
-               /etc/init.d/dnsmasq restart >/dev/null  2>&1
+               /etc/init.d/dnsmasq restart >/dev/null 2>&1
                if [[ $? -eq 0 ]]; then
                        led_on; okn;
-                       output "$p_name blocking $(wc -l < $hosts_file) domains $_ok_\n"
+                       output "$serviceName blocking $(wc -l < $hosts_file) domains $_ok_\n"
                else
-                       failn; output "$_error_: $p_name failed to reload dnsmasq!\n";
+                       failn; output "$_error_: $serviceName failed to reload dnsmasq!\n";
                        exit 1
                fi
        else
-               output "$_error_: $p_name failed to create its data file!\n"
+               output "$_error_: $serviceName failed to create its data file!\n"
                exit 1
        fi
 }
 
-boot() { sleep 10; rc_procd start_service; rc_procd service_triggers; }
-
 reload_service () {
   is_enabled || return 1
-       [[ -t 1 && $bgrun -eq 1 ]] && (start_adblocking 'reload' | cat &) || start_adblocking 'reload'
+       [[ -t 1 && $bgrun -eq 1 ]] && output "Reloading $serviceName...\n"
+       [[ ! -t 1 || $bgrun -eq 1 ]] && (start_adblocking 'reload' | cat &) || start_adblocking 'reload'
 }
 
 start_service () {
   is_enabled || return 1
+       [[ -t 1 && $bgrun -eq 1 ]] && output "Starting $serviceName...\n"
        reset_iptables quiet
        set_iptables
-       [[ -t 1 && $bgrun -eq 1 ]] && (start_adblocking $1 | cat &) || start_adblocking $1
+       [[ ! -t 1 || $bgrun -eq 1 ]] && (start_adblocking $1 | cat &) || start_adblocking $1
 }
 
 stop_service () {
   is_enabled || return 1
+       [[ -t 1 && $bgrun -eq 1 ]] && output "Stopping $serviceName...\n"
        reset_iptables
-       [[ -t 1 && $bgrun -eq 1 ]] && (stop_adblocking | cat &) || stop_adblocking
+       [[ ! -t 1 || $bgrun -eq 1 ]] && (stop_adblocking | cat &) || stop_adblocking
 }
 
 service_triggers () {
diff --git a/net/sipgrep/Makefile b/net/sipgrep/Makefile
deleted file mode 100644 (file)
index 4329b82..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-#
-# Copyright (C) 2016 Daniel Engberg <daniel.engberg.lists@pyret.net>
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-
-include $(TOPDIR)/rules.mk
-
-PKG_NAME:=sipgrep
-PKG_VERSION:=20160914-devel
-PKG_RELEASE:=1
-PKG_MAINTAINER:=Daniel Engberg <daniel.engberg.lists@pyret.net>
-PKG_LICENSE:=GPL-3.0
-PKG_LICENSE_FILES:=COPYING
-
-PKG_SOURCE_PROTO:=git
-PKG_SOURCE_URL:=https://github.com/sipcapture/sipgrep
-PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
-PKG_SOURCE_VERSION:=df8a95b066569be92aa38cad01086ea595b36863
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
-PKG_MIRROR_HASH:=a9131ae443bdce760e3dadd83dcf115d51a894381fc18461cbe62522618418fa
-
-PKG_FIXUP:=autoreconf
-
-include $(INCLUDE_DIR)/package.mk
-
-define Package/sipgrep
-  SECTION:=net
-  CATEGORY:=Network
-  DEPENDS:=+libpcap +libpcre +libncursesw
-  TITLE:=Display and Troubleshoot SIP signaling in CLI
-  URL:=https://github.com/sipcapture/sipgrep
-endef
-
-define Package/sipgrep/description
-  SipGrep is a utility for displaying and troubleshooting SIP signaling.
-endef
-
-CONFIGURE_ARGS += \
-       --enable-ncurses
-
-define Package/sipgrep/install
-       $(INSTALL_DIR) $(1)/usr/sbin
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/sipgrep $(1)/usr/sbin/
-endef
-
-$(eval $(call BuildPackage,sipgrep))
diff --git a/net/sngrep/Makefile b/net/sngrep/Makefile
deleted file mode 100644 (file)
index 7ebfe5d..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# Copyright (C) 2016 Daniel Engberg <daniel.engberg.lists@pyret.net>
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-
-include $(TOPDIR)/rules.mk
-
-PKG_NAME:=sngrep
-PKG_VERSION=1.4.4-rc2
-PKG_RELEASE:=1
-PKG_MAINTAINER:=Daniel Engberg <daniel.engberg.lists@pyret.net>
-PKG_LICENSE:=GPL-3.0
-PKG_LICENSE_FILES:=COPYING
-
-PKG_SOURCE_PROTO:=git
-PKG_SOURCE_URL:=https://github.com/irontec/sngrep
-PKG_SOURCE_SUBDIR=$(PKG_NAME)-$(PKG_VERSION)
-PKG_SOURCE_VERSION:=cf5e1da49d00bc7ab1afe9d63daa240db2b9b19c
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
-PKG_MIRROR_HASH:=a6cee2caa108a618134fe87d7c04862e93aa2fdf9647d81dfe4abe91a6c9c19f
-
-PKG_FIXUP:=autoreconf
-
-include $(INCLUDE_DIR)/package.mk
-
-define Package/sngrep
-  SECTION:=net
-  CATEGORY:=Network
-  DEPENDS:=+libpcap +libpthread +libpcre +libncursesw
-  TITLE:=Display SIP calls message flows
-  URL:=https://github.com/irontec/sngrep
-endef
-
-define Package/sngrep/description
-  sngrep is a tool for displaying SIP calls message flows from terminal.
-  It supports live capture to display realtime SIP packets and can also be used as PCAP viewer.
-endef
-
-CONFIGURE_ARGS += \
-       --with-pcre \
-       --enable-unicode \
-
-define Package/sngrep/install
-       $(INSTALL_DIR) $(1)/usr/sbin
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/sngrep $(1)/usr/sbin/
-endef
-
-$(eval $(call BuildPackage,sngrep))
index 3741dbc8a9de820883ab476456c24f32bed71f0e..e73d415d0fcfb4421f45152db19542c0e121ab91 100644 (file)
@@ -11,12 +11,12 @@ PKG_LICENSE:=ASL-2.0
 PKG_MAINTAINER:=Mislav Novakovic <mislav.novakovic@sartura.hr>
 
 PKG_NAME:=sysrepo
-PKG_VERSION:=0.7.1
+PKG_VERSION:=0.7.2
 PKG_RELEASE:=2
 
 PKG_SOURCE_PROTO:=git
-PKG_SOURCE_VERSION:=0b36f308574a60d7ee36b1a3118b999618bb40d8
-PKG_MIRROR_HASH:=d28ff0356b6ac4b934bb45ff77973efe7964b86a54270d11e1fd06a2af9bdbc8
+PKG_SOURCE_VERSION:=8a188c515ad113adbe0d393fe54dc0cad2d0167a
+PKG_MIRROR_HASH:=b8a387a6ee6692c455815226f27a572984d997ce0c0c85ac0d15a81e8e9c62a3
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.xz
 PKG_SOURCE_URL:=https://github.com/sysrepo/sysrepo.git
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION)
@@ -96,11 +96,11 @@ define Package/libsysrepo/install
        $(INSTALL_CONF) $(PKG_BUILD_DIR)/yang/sysrepo-persistent-data.yang $(1)/etc/sysrepo/yang/internal
 
        $(INSTALL_DIR) $(1)/etc/sysrepo/yang
-       $(INSTALL_DATA) $(PKG_BUILD_DIR)/yang/ietf-netconf-acm@2012-02-22.yang $(1)/etc/sysrepo/yang/
-       $(INSTALL_DATA) $(PKG_BUILD_DIR)/yang/ietf-netconf-notifications.yang $(1)/etc/sysrepo/yang/
-       $(INSTALL_DATA) $(PKG_BUILD_DIR)/yang/nc-notifications.yang $(1)/etc/sysrepo/yang/
-       $(INSTALL_DATA) $(PKG_BUILD_DIR)/yang/notifications.yang $(1)/etc/sysrepo/yang/
-       $(INSTALL_DATA) $(PKG_BUILD_DIR)/yang/ietf-netconf@2011-06-01.yang $(1)/etc/sysrepo/yang/
+       $(INSTALL_DATA) $(PKG_BUILD_DIR)/yang/ietf-netconf-acm@2012-02-22.yang $(1)/etc/sysrepo/yang/ietf-netconf-acm@2012-02-22.yang
+       $(INSTALL_DATA) $(PKG_BUILD_DIR)/yang/ietf-netconf-notifications.yang $(1)/etc/sysrepo/yang/ietf-netconf-notifications@2012-02-06..yang
+       $(INSTALL_DATA) $(PKG_BUILD_DIR)/yang/nc-notifications.yang $(1)/etc/sysrepo/yang/nc-notifications@2008-07-14.yang
+       $(INSTALL_DATA) $(PKG_BUILD_DIR)/yang/notifications.yang $(1)/etc/sysrepo/yang/notifications@2008-07-14.yang
+       $(INSTALL_DATA) $(PKG_BUILD_DIR)/yang/ietf-netconf@2011-06-01.yang $(1)/etc/sysrepo/yang/ietf-netconf@2011-06-01.yang
 
        $(INSTALL_DIR) $(1)/etc/sysrepo/data/internal
        $(INSTALL_DIR) $(1)/etc/sysrepo/data/notifications
index ae2af81f841a8458bc1505a0358e2d4caa37ec1d..35b56f67de51e7b4e9f0c1567ee82eda7cae8fe9 100644 (file)
@@ -3,27 +3,27 @@
 # Warning, problems can occur if the device restarts in the middle of this uci-default script
 
 if [ -x /bin/sysrepoctl ]; then
-       match=$(sysrepoctl -l | grep "ietf-netconf-acm\ ")
+       match=$(sysrepoctl -l | grep "ietf-netconf-acm ")
        if [ ! "$match" ]; then
                sysrepoctl --install --yang=/etc/sysrepo/yang/ietf-netconf-acm@2012-02-22.yang -p 644
        fi
 
-       match=$(sysrepoctl -l | grep "ietf-netconf-notifications\ ")
+       match=$(sysrepoctl -l | grep "ietf-netconf-notifications ")
        if [ ! "$match" ]; then
-               sysrepoctl --install --yang=/etc/sysrepo/yang/ietf-netconf-notifications.yang -p 600
+               sysrepoctl --install --yang=/etc/sysrepo/yang/ietf-netconf-notifications@2012-02-06..yang -p 600
        fi
 
-       match=$(sysrepoctl -l | grep "nc-notifications\ ")
+       match=$(sysrepoctl -l | grep "nc-notifications ")
        if [ ! "$match" ]; then
-               sysrepoctl --install --yang=/etc/sysrepo/yang/nc-notifications.yang -p 666
+               sysrepoctl --install --yang=/etc/sysrepo/yang/nc-notifications@2008-07-14.yang -p 666
        fi
 
-       match=$(sysrepoctl -l | grep "notifications\ ")
+       match=$(sysrepoctl -l | grep "notifications ")
        if [ ! "$match" ]; then
-               sysrepoctl --install --yang=/etc/sysrepo/yang/notifications.yang -p 666
+               sysrepoctl --install --yang=/etc/sysrepo/yang/notifications@2008-07-14.yang -p 666
        fi
 
-       match=$(sysrepoctl -l | grep "ietf-netconf\ ")
+       match=$(sysrepoctl -l | grep "ietf-netconf ")
        if [ ! "$match" ]; then
                sysrepoctl --install --yang=/etc/sysrepo/yang/ietf-netconf@2011-06-01.yang -p 600
        fi
index 43f98243bb011fc8d7253f03a251dc18d1430bc8..e6d3aaa76ab6196a9104c43b41e1f46d659d916d 100644 (file)
@@ -7,9 +7,9 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=tgt
-PKG_VERSION:=1.0.72
-PKG_REV:=8f94634a7bd0a0e15a5a0f7a398341ff0f896752
-PKG_MIRROR_HASH:=3cc0fc63c45cf87b97c28a29f946b9ec54486ad761b5cadb36ce6e07928f5045
+PKG_VERSION:=1.0.73
+PKG_REV:=013223dc886a03719ca02db52162056249d99448
+PKG_MIRROR_HASH:=649bd012ab0944644ff83cc2974e7a5c374d568e0f4328d9f8d352d4b59f73bb
 PKG_RELEASE:=1
 PKG_USE_MIPS16:=0
 
index 35867bbd5bf128e83eb414a1e4dd7e123532d91a..71e196c42ed02d6456710ed9f1c85ddc6128d64e 100644 (file)
@@ -1,12 +1,12 @@
 #
-# Copyright (c) 2016-2017 Dirk Brenken (dev@brenken.org)
+# Copyright (c) 2016-2018 Dirk Brenken (dev@brenken.org)
 # This is free software, licensed under the GNU General Public License v3.
 #
 
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=travelmate
-PKG_VERSION:=1.0.0
+PKG_VERSION:=1.0.2
 PKG_RELEASE:=1
 PKG_LICENSE:=GPL-3.0+
 PKG_MAINTAINER:=Dirk Brenken <dev@brenken.org>
index 831ab8dc749402f3864b1e318c0afb4c9f3cb42e..52609c01704df7fb96ba0984fb156a1ae76e420c 100755 (executable)
@@ -31,14 +31,30 @@ stop_service()
 {
     local rtfile="$(uci -q get travelmate.global.trm_rtfile)"
 
-    rtfile="${rtfile:="/tmp/trm_runtime.json"}"
+    rtfile="${rtfile:-"/tmp/trm_runtime.json"}"
     > "${rtfile}"
     rc_procd start_service
 }
 
 status()
 {
-    rc_procd "${trm_script}" status
+    local key keylist value rtfile="$(uci_get travelmate.global.trm_rtfile)"
+
+    rtfile="${rtfile:-"/tmp/trm_runtime.json"}"
+    if [ -s "${rtfile}" ]
+    then
+        printf "%s\n" "::: travelmate runtime information"
+        json_load "$(cat "${rtfile}" 2>/dev/null)"
+        json_select data
+        json_get_keys keylist
+        for key in ${keylist}
+        do
+            json_get_var value "${key}"
+            printf "  + %-18s : %s\n" "${key}" "${value}"
+        done
+    else
+        printf "%s\n" "::: no travelmate runtime information available"
+    fi
 }
 
 service_triggers()
index 1ad5959edc96056bfe84ebaf036b1cf8f56095f4..39bc79e11e9a8db2f54ff7935d976d142f830258 100755 (executable)
@@ -10,7 +10,7 @@
 #
 LC_ALL=C
 PATH="/usr/sbin:/usr/bin:/sbin:/bin"
-trm_ver="1.0.0"
+trm_ver="1.0.2"
 trm_sysver="unknown"
 trm_enabled=0
 trm_debug=0
@@ -23,7 +23,7 @@ trm_radio=""
 trm_rtfile="/tmp/trm_runtime.json"
 trm_wpa="$(command -v wpa_supplicant)"
 
-# f_envload: load travelmate environment
+# load travelmate environment
 #
 f_envload()
 {
@@ -62,7 +62,7 @@ f_envload()
 
     if [ ${trm_enabled} -ne 1 ]
     then
-        f_log "info " "travelmate is currently disabled, please set 'trm_enabled' to '1' to use this service"
+        f_log "info" "travelmate is currently disabled, please set 'trm_enabled' to '1' to use this service"
         exit 0
     fi
 
@@ -71,9 +71,9 @@ f_envload()
     trm_eap="$("${trm_wpa}" -veap >/dev/null 2>&1; printf "%u" ${?})"
 }
 
-# f_prepare: gather radio information & bring down all STA interfaces
+# gather radio information & bring down all STA interfaces
 #
-f_prepare()
+f_prep()
 {
     local config="${1}"
     local mode="$(uci -q get wireless."${config}".mode)"
@@ -98,38 +98,44 @@ f_prepare()
             trm_stalist="${trm_stalist} ${config}_${radio}"
         fi
     fi
-    f_log "debug" "prepare: ${config}, mode: ${mode}, network: ${network}, radio: ${radio}, eap: ${trm_eap}, disabled: ${disabled}"
+    f_log "debug" "f_prep ::: config: ${config}, mode: ${mode}, network: ${network}, radio: ${radio}, disabled: ${disabled}"
 }
 
-# f_check: check interface status
+# check interface status
 #
 f_check()
 {
-    local ifname radio status cnt=1 mode="${1}"
+    local ifname radio dev_status cnt=1 mode="${1}" status="${2:-"false"}"
 
     trm_ifstatus="false"
     ubus call network reload
     while [ ${cnt} -le ${trm_maxwait} ]
     do
-        status="$(ubus -S call network.wireless status 2>/dev/null)"
-        if [ -n "${status}" ]
+        dev_status="$(ubus -S call network.wireless status 2>/dev/null)"
+        if [ -n "${dev_status}" ]
         then
             if [ "${mode}" = "dev" ]
             then
+                if [ "${trm_ifstatus}" != "${status}" ]
+                then
+                    trm_ifstatus="${status}"
+                    f_jsnup
+                fi
                 for radio in ${trm_radiolist}
                 do
-                    trm_ifstatus="$(printf "%s" "${status}" | jsonfilter -l1 -e "@.${radio}.up")"
-                    if [ "${trm_ifstatus}" = "true" ]
+                    trm_ifstatus="$(printf "%s" "${dev_status}" | jsonfilter -l1 -e "@.${radio}.up")"
+                    if [ "${trm_ifstatus}" = "true" ] && [ -z "$(printf "%s" "${trm_devlist}" | grep -Fo " ${radio}")" ]
                     then
                         trm_devlist="${trm_devlist} ${radio}"
-                    else
-                        trm_devlist=""
-                        break
                     fi
                 done
-                ifname="${trm_devlist}"
+                if [ "${trm_radiolist}" = "${trm_devlist}" ] || [ ${cnt} -eq ${trm_maxwait} ] || [ "${status}" = "false" ]
+                then
+                    ifname="${trm_devlist}"
+                    break
+                fi
             else
-                ifname="$(printf "%s" "${status}" | jsonfilter -l1 -e '@.*.interfaces[@.config.mode="sta"].ifname')"
+                ifname="$(printf "%s" "${dev_status}" | jsonfilter -l1 -e '@.*.interfaces[@.config.mode="sta"].ifname')"
                 if [ -n "${ifname}" ]
                 then
                     trm_ifstatus="$(ubus -S call network.interface dump 2>/dev/null | jsonfilter -l1 -e "@.interface[@.device=\"${ifname}\"].up")"
@@ -137,55 +143,53 @@ f_check()
             fi
             if [ "${mode}" = "initial" ] || [ "${trm_ifstatus}" = "true" ]
             then
+                if [ "${mode}" != "initial" ] && [ "${trm_ifstatus}" != "${status}" ]
+                then
+                    f_jsnup
+                fi
                 break
             fi
         fi
         cnt=$((cnt+1))
         sleep 1
     done
-    f_log "debug" "check: ${mode}, name: ${ifname}, status: ${trm_ifstatus}, count: ${cnt}, max-wait: ${trm_maxwait}, automatic: ${trm_automatic}"
+    f_log "debug" "f_check::: mode: ${mode}, name: ${ifname}, status: ${trm_ifstatus}, cnt: ${cnt}, max-wait: ${trm_maxwait}, automatic: ${trm_automatic}"
 }
 
-# f_jsnupdate: update runtime information
+# update runtime information
 #
-f_jsnupdate()
+f_jsnup()
 {
-    local iface="${1}" radio="${2}" essid="${3:-"-"}" bssid="${4:-"-"}"
+    local status iface="${1}" radio="${2}" essid="${3}" bssid="${4}"
+
+    if [ "${trm_ifstatus}" = "true" ]
+    then
+        status="connected"
+    elif [ "${trm_ifstatus}" = "false" ]
+    then
+        status="not connected"
+    elif [ "${trm_ifstatus}" = "running" ]
+    then
+        status="running"
+    elif [ "${trm_ifstatus}" = "error" ]
+    then
+        status="error"
+    fi
 
     json_init
     json_add_object "data"
+    json_add_string "travelmate_status" "${status}"
     json_add_string "travelmate_version" "${trm_ver}"
-    json_add_string "station_connection" "${trm_ifstatus}"
-    json_add_string "station_id" "${essid}/${bssid}"
-    json_add_string "station_interface" "${iface}"
-    json_add_string "station_radio" "${radio}"
+    json_add_string "station_id" "${essid:-"-"}/${bssid:-"-"}"
+    json_add_string "station_interface" "${iface:-"n/a"}"
+    json_add_string "station_radio" "${radio:-"n/a"}"
     json_add_string "last_rundate" "$(/bin/date "+%d.%m.%Y %H:%M:%S")"
     json_add_string "system" "${trm_sysver}"
     json_close_object
     json_dump > "${trm_rtfile}"
 }
 
-# f_status: output runtime information
-#
-f_status()
-{
-    local key keylist value
-
-    if [ -s "${trm_rtfile}" ]
-    then
-        printf "%s\n" "::: travelmate runtime information"
-        json_load "$(cat "${trm_rtfile}" 2>/dev/null)"
-        json_select data
-        json_get_keys keylist
-        for key in ${keylist}
-        do
-            json_get_var value "${key}"
-            printf " %-18s : %s\n" "${key}" "${value}"
-        done
-    fi
-}
-
-# f_log: write to syslog, exit on error
+# write to syslog
 #
 f_log()
 {
@@ -194,16 +198,18 @@ f_log()
 
     if [ -n "${log_msg}" ] && ([ "${class}" != "debug" ] || [ ${trm_debug} -eq 1 ])
     then
-        logger -t "travelmate-[${trm_ver}] ${class}" "${log_msg}"
-        if [ "${class}" = "error" ]
+        logger -p "${class}" -t "travelmate-[${trm_ver}]" "${log_msg}"
+        if [ "${class}" = "err" ]
         then
-            logger -t "travelmate-[${trm_ver}] ${class}" "Please check 'https://github.com/openwrt/packages/blob/master/net/travelmate/files/README.md' (${trm_sysver})"
-            exit 255
+            trm_ifstatus="error"
+            f_jsnup
+            logger -p "${class}" -t "travelmate-[${trm_ver}]" "Please check 'https://github.com/openwrt/packages/blob/master/net/travelmate/files/README.md' (${trm_sysver})"
+            exit 1
         fi
     fi
 }
 
-# f_main: main function for connection handling
+# main function for connection handling
 #
 f_main()
 {
@@ -212,15 +218,14 @@ f_main()
     f_check "initial"
     if [ "${trm_ifstatus}" != "true" ]
     then
-        > "${trm_rtfile}"
         config_load wireless
-        config_foreach f_prepare wifi-iface
+        config_foreach f_prep wifi-iface
         if [ -n "$(uci -q changes wireless)" ]
         then
             uci -q commit wireless
         fi
-        f_check "dev"
-        f_log "debug" "main: ${trm_devlist}, sta-list: ${trm_stalist}"
+        f_check "dev" "running"
+        f_log "debug" "f_main ::: iwinfo: ${trm_iwinfo}, eap_rc: ${trm_eap}, dev_list: ${trm_devlist}, sta_list: ${trm_stalist}"
         for dev in ${trm_devlist}
         do
             cnt=1
@@ -233,9 +238,7 @@ f_main()
                 raw_scan="$(${trm_iwinfo} "${dev}" scan)"
                 essid_list="$(printf "%s" "${raw_scan}" | awk '/ESSID: "/{ORS=" ";if (!seen[$0]++) for(i=2; i<=NF; i++) print $i}')"
                 bssid_list="$(printf "%s" "${raw_scan}" | awk '/Address: /{ORS=" ";if (!seen[$5]++) print $5}')"
-                f_log "debug" "main: ${trm_iwinfo}, dev: ${dev}"
-                f_log "debug" "main: ${essid_list}"
-                f_log "debug" "main: ${bssid_list}"
+                f_log "debug" "f_main ::: dev: ${dev}, ssid_list: ${essid_list}, bssid_list: ${bssid_list}"
                 if [ -n "${essid_list}" ] || [ -n "${bssid_list}" ]
                 then
                     for sta in ${trm_stalist}
@@ -255,8 +258,8 @@ f_main()
                             if [ "${trm_ifstatus}" = "true" ]
                             then
                                 uci -q commit wireless
-                                f_log "info " "interface '${sta_iface}' on '${sta_radio}' connected to uplink '${sta_essid:-"-"}/${sta_bssid:-"-"}' (${trm_sysver})"
-                                f_jsnupdate "${sta_iface}" "${sta_radio}" "${sta_essid}" "${sta_bssid}"
+                                f_log "info" "interface '${sta_iface}' on '${sta_radio}' connected to uplink '${sta_essid:-"-"}/${sta_bssid:-"-"}' (${trm_sysver})"
+                                f_jsnup "${sta_iface}" "${sta_radio}" "${sta_essid}" "${sta_bssid}"
                                 return 0
                             elif [ ${trm_maxretry} -ne 0 ] && [ ${cnt} -eq ${trm_maxretry} ]
                             then
@@ -271,7 +274,7 @@ f_main()
                                 fi
                                 uci -q commit wireless
                                 f_check "dev"
-                                f_log "info " "can't connect to uplink '${sta_essid:-"-"}/${sta_bssid:-"-"}' (${cnt}/${trm_maxretry}), uplink disabled (${trm_sysver})"
+                                f_log "info" "can't connect to uplink '${sta_essid:-"-"}/${sta_bssid:-"-"}' (${cnt}/${trm_maxretry}), uplink disabled (${trm_sysver})"
                             else
                                 if [ ${trm_maxretry} -eq 0 ]
                                 then
@@ -279,9 +282,9 @@ f_main()
                                 fi
                                 uci -q revert wireless
                                 f_check "dev"
-                                f_log "info " "can't connect to uplink '${sta_essid:-"-"}/${sta_bssid:-"-"}' (${cnt}/${trm_maxretry}) (${trm_sysver})"
+                                f_log "info" "can't connect to uplink '${sta_essid:-"-"}/${sta_bssid:-"-"}' (${cnt}/${trm_maxretry}) (${trm_sysver})"
                             fi
-                            f_jsnupdate "${sta_iface}" "${sta_radio}" "${sta_essid}" "${sta_bssid}"
+                            f_jsnup "${sta_iface}" "${sta_radio}" "${sta_essid}" "${sta_bssid}"
                         fi
                     done
                 fi
@@ -292,7 +295,7 @@ f_main()
         if [ ! -s "${trm_rtfile}" ]
         then
             trm_ifstatus="false"
-            f_jsnupdate "n/a" "n/a"
+            f_jsnup
         fi
     else
         if [ ! -s "${trm_rtfile}" ]
@@ -302,7 +305,7 @@ f_main()
             sta_essid="$(uci -q get wireless."${config}".ssid)"
             sta_bssid="$(uci -q get wireless."${config}".bssid)"
             sta_iface="$(uci -q get wireless."${config}".network)"
-            f_jsnupdate "${sta_iface}" "${sta_radio}" "${sta_essid}" "${sta_bssid}"
+            f_jsnup "${sta_iface}" "${sta_radio}" "${sta_essid}" "${sta_bssid}"
         fi
     fi
 }
@@ -314,24 +317,17 @@ then
     . "/lib/functions.sh"
     . "/usr/share/libubox/jshn.sh"
 else
-    f_log "error" "system libraries not found"
+    f_log "err" "system libraries not found"
 fi
 
-# handle different travelmate actions
+# control travelmate actions
 #
 f_envload
-case "${1}" in
-    status)
-        f_status
-        ;;
-    *)
-        f_main
-        while [ ${trm_automatic} -eq 1 ]
-        do
-            sleep ${trm_timeout}
-            f_envload
-            f_main
-        done
-        ;;
-esac
+f_main
+while [ ${trm_automatic} -eq 1 ]
+do
+    sleep ${trm_timeout}
+    f_envload
+    f_main
+done
 exit 0
index a3c8a15078ad0b756a16a92aa273e9c5ad5698f0..f82d57bf2b799221eead771cb16d0decf208e50b 100644 (file)
@@ -46,55 +46,55 @@ endef
 
 define Package/ulogd-mod-dbi
   $(call Package/ulogd/Default)
-  DEPENDS:=ulogd +libdbi
+  DEPENDS:=ulogd +PACKAGE_ulogd-mod-dbi:libdbi
   TITLE:=Output plugin for logging to a database using libdbi
 endef
 
 define Package/ulogd-mod-json
   $(call Package/ulogd/Default)
-  DEPENDS:=ulogd +jansson
+  DEPENDS:=ulogd +PACKAGE_ulogd-mod-json:jansson
   TITLE:=JSON output plugin
 endef
 
 define Package/ulogd-mod-mysql
   $(call Package/ulogd/Default)
-  DEPENDS:=ulogd +libmysqlclient
+  DEPENDS:=ulogd +PACKAGE_ulogd-mod-mysql:libmysqlclient
   TITLE:=Output plugin for logging to a MySQL database
 endef
 
 define Package/ulogd-mod-nfacct
   $(call Package/ulogd/Default)
-  DEPENDS:=ulogd +libnetfilter-acct
+  DEPENDS:=ulogd +PACKAGE_ulogd-mod-nfacct:libnetfilter-acct
   TITLE:=Input plugin for flow-based logging (accounting)
 endef
 
 define Package/ulogd-mod-nfct
   $(call Package/ulogd/Default)
-  DEPENDS:=ulogd +libnetfilter-conntrack
+  DEPENDS:=ulogd +PACKAGE_ulogd-mod-nfct:libnetfilter-conntrack
   TITLE:=Input plugin for flow-based logging (conntracking)
 endef
 
 define Package/ulogd-mod-nflog
   $(call Package/ulogd/Default)
-  DEPENDS:=ulogd +libnetfilter-log
+  DEPENDS:=ulogd +PACKAGE_ulogd-mod-nflog:libnetfilter-log
   TITLE:=Input plugin using NFLOG
 endef
 
 define Package/ulogd-mod-pcap
   $(call Package/ulogd/Default)
-  DEPENDS:=ulogd +libpcap
+  DEPENDS:=ulogd +PACKAGE_ulogd-mod-pcap:libpcap
   TITLE:=Output plugin for logging in pcap format
 endef
 
 define Package/ulogd-mod-pgsql
   $(call Package/ulogd/Default)
-  DEPENDS:=ulogd +libpq
+  DEPENDS:=ulogd +PACKAGE_ulogd-mod-pgsql:libpq
   TITLE:=Output plugin for logging to a PostgreSQL database
 endef
 
 define Package/ulogd-mod-sqlite
   $(call Package/ulogd/Default)
-  DEPENDS:=ulogd +libsqlite3
+  DEPENDS:=ulogd +PACKAGE_ulogd-mod-sqlite:libsqlite3
   TITLE:=Output plugin for logging to an SQLite database
 endef
 
@@ -106,7 +106,7 @@ endef
 
 define Package/ulogd-mod-xml
   $(call Package/ulogd/Default)
-  DEPENDS:=ulogd +libnetfilter-acct +libnetfilter-conntrack +libnetfilter-log
+  DEPENDS:=ulogd +PACKAGE_ulogd-mod-xml:libnetfilter-acct +PACKAGE_ulogd-mod-xml:libnetfilter-conntrack +PACKAGE_ulogd-mod-xml:libnetfilter-log
   TITLE:=XML output plugin
 endef
 
index b3e966c223da69687bd71ddf3110fdf50f1f0d58..5adcd867e7d27b07ed63a5edee7847749e9516fe 100644 (file)
@@ -8,7 +8,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=unbound
-PKG_VERSION:=1.6.7
+PKG_VERSION:=1.6.8
 PKG_RELEASE:=1
 
 PKG_LICENSE:=BSD-3-Clause
@@ -17,9 +17,8 @@ PKG_MAINTAINER:=Eric Luehrsen <ericluehrsen@hotmail.com>
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://www.unbound.net/downloads
-PKG_HASH:=4e7bd43d827004c6d51bef73adf941798e4588bdb40de5e79d89034d69751c9f
+PKG_HASH:=e3b428e33f56a45417107448418865fe08d58e0e7fea199b855515f60884dd49
 
-PKG_BUILD_DEPENDS:=libexpat
 PKG_BUILD_PARALLEL:=1
 PKG_FIXUP:=autoreconf
 PKG_INSTALL:=1
index 58f28d29a75aba9a8a27c8a09aca0878d385d606..fa2e41edfc88de422ade0ae7cc3bdacee6b483b6 100644 (file)
@@ -87,6 +87,7 @@
 
         while ( ( cmd | getline adr ) > 0 ) {
           if (( substr( adr, 1, 5 ) <= "fd00:" ) \
+          && ( index( adr, "anycast" ) == 0 ) \
           && ( index( adr, "via" ) == 0 )) {
             # GA or ULA routed addresses only (not LL or MC)
             sub( /\/.*/, "", adr ) ;
index e0a1e52540954a5243521f00e29a223878313903..7e0043a2a7ad98908c1ee4f4f13e7fa3b4ded47c 100644 (file)
@@ -60,6 +60,8 @@ UNBOUND_TXT_DOMAIN=lan
 UNBOUND_TXT_FWD_ZONE=""
 UNBOUND_TXT_HOSTNAME=thisrouter
 
+UNBOUND_LIST_INSECURE=""
+
 ##############################################################################
 
 # keep track of local-domain: assignments during inserted resource records
@@ -394,7 +396,7 @@ create_access_control() {
 ##############################################################################
 
 create_domain_insecure() {
-  echo "  domain-insecure: \"$1\"" >> $UNBOUND_CONFFILE
+  UNBOUND_LIST_INSECURE="$UNBOUND_LIST_INSECURE $1"
 }
 
 ##############################################################################
@@ -568,8 +570,7 @@ unbound_control() {
 ##############################################################################
 
 unbound_conf() {
-  local cfg="$1"
-  local rt_mem rt_conn modulestring
+  local rt_mem rt_conn modulestring domain
 
   # Make fresh conf file
   echo > $UNBOUND_CONFFILE
@@ -862,9 +863,15 @@ unbound_conf() {
   fi
 
 
-  # Except and accept domains as insecure (DNSSEC); work around broken domains
-  config_list_foreach "$cfg" "domain_insecure" create_domain_insecure
-  echo >> $UNBOUND_CONFFILE
+  if  [ -n "$UNBOUND_LIST_INSECURE" ] ; then
+    for domain in $UNBOUND_LIST_INSECURE ; do
+      # Except and accept domains without (DNSSEC); work around broken domains
+      echo "  domain-insecure: \"$domain\"" >> $UNBOUND_CONFFILE
+    done
+
+
+    echo >> $UNBOUND_CONFFILE
+  fi
 }
 
 ##############################################################################
@@ -1043,6 +1050,8 @@ unbound_uci() {
   config_get UNBOUND_TTL_MIN     "$cfg" ttl_min 120
   config_get UNBOUND_TXT_DOMAIN  "$cfg" domain lan
 
+  config_list_foreach "$cfg" "domain_insecure" create_domain_insecure
+
   UNBOUND_LIST_DOMAINS="nowhere $UNBOUND_TXT_DOMAIN"
 
   if [ "$UNBOUND_D_DHCP_LINK" = "none" ] ; then
@@ -1163,6 +1172,7 @@ unbound_start() {
     unbound_access
     unbound_adblock
 
+
     if [ "$UNBOUND_D_DHCP_LINK" = "dnsmasq" ] ; then
       dnsmasq_link
     else
index 01d6bb839d3f1a454896e2ccb375fd0536bb387c..4fd77d6d93f96fb7517df61b1e0fb921df39a6a2 100644 (file)
@@ -6,7 +6,7 @@ index 5396029..cbb51ec 100644
 -#
 -# Example configuration file.
 -#
--# See unbound.conf(5) man page, version 1.6.7.
+-# See unbound.conf(5) man page, version 1.6.8.
 -#
 -# this is a comment.
 +##############################################################################
index bfb819057f5756c332de83dfe4aa1ba682a222e6..fb52e7d72c8aa6179fa06ded0a1894df2dca7fb7 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2010-2015 OpenWrt.org
+# Copyright (C) 2010-2017 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=usbip
-PKG_RELEASE:=6
+PKG_RELEASE:=9
 PKG_LICENSE:=GPL-2.0
 
 # Since kernel 2.6.39.1 userspace tools are inside the kernel tree
@@ -79,18 +79,20 @@ endef
 
 CFLAGS+="$(TARGET_CFLAGS) -I$(STAGING_DIR)/usr/include"
 
+USB_IDS_REV:=0a6be488b4c1485d30c9efee1cc895af5d4a1383
+USB_IDS_FILE:=usb.ids.$(USB_IDS_REV)
 define Download/usb.ids
-  URL:=http://www.linux-usb.org/
-  HASH:=47dc941dca801b89f1529e09f0d338755d8fbb0ce75f526e1dcccc4fbf8fc66c
-  FILE:=usb.ids
-  MD5SUM:=
+  FILE:=$(USB_IDS_FILE)
+  URL_FILE:=usb.ids
+  URL:=@GITHUB/gentoo/hwids/$(USB_IDS_REV)
+  HASH:=2d0403ffccc0ff7150e32c0bf8e2878816b76ba08d2c3bb1059f33627a3da30f
 endef
 
 define Package/usbip/install
        $(INSTALL_DIR) $(1)/usr/lib
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/libusbip.so.* $(1)/usr/lib/
        $(INSTALL_DIR) $(1)/usr/share/hwdata
-       $(CP) $(DL_DIR)/usb.ids $(1)/usr/share/hwdata/
+       $(CP) $(DL_DIR)/usb.ids.$(USB_IDS_REV) $(1)/usr/share/hwdata/usb.ids
 endef
 
 define Package/usbip-client/install
index db70b18f40885aac1f86976b23807ff5c5cdc4d6..2941aecd5b98f8434e336671a4873fd78f69bc43 100644 (file)
@@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
 PKG_NAME:=vpnc
 PKG_REV:=550
 PKG_VERSION:=0.5.3.r$(PKG_REV)
-PKG_RELEASE:=5
+PKG_RELEASE:=6
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://svn.unix-ag.uni-kl.de/vpnc/trunk/
index 971b823b8d668fb07436fc78a3eb0849c197876d..bc3f912b36c83ce5683f9f1daed1ddb4697fe24c 100755 (executable)
@@ -43,7 +43,7 @@ proto_vpnc_setup() {
        logger -t vpnc "initializing..."
        serv_addr=
        for ip in $(resolveip -t 10 "$server"); do
-               ( proto_add_host_dependency "vpn-$config" "$ip" $interface )
+               ( proto_add_host_dependency "$config" "$ip" $interface )
                serv_addr=1
        done
        [ -n "$serv_addr" ] || {
index a8d9ef86fc4fbf6c1f40732ac473ed34191c2bbc..19cd435a667cdb41869c8fd363b798d39366bd2c 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=xl2tpd
 PKG_VERSION:=1.3.10
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 PKG_MAINTAINER:=Yousong Zhou <yszhou4tech@gmail.com>
 PKG_LICENSE:=GPL-2.0
 PKG_LICENSE_FILES:=LICENSE
diff --git a/net/xl2tpd/README b/net/xl2tpd/README
deleted file mode 100644 (file)
index aadc26e..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-OpenWRT Package for xl2tpd
-
-xl2tpd is a development from the original l2tpd package originally written by
-Mark Spencer, subsequently forked by Scott Balmos and David Stipp, inherited
-by Jeff McAdams, modified substantially by Jacco de Leeuw and then forked 
-again by Xelerance (after it was abandoned by l2tpd.org).
-
-Rationale for inclusion in OpenWRT:
-
-l2tpd has some serious alignment problems on RISC platforms. It also runs 
-purely in userspace.
-
-Some of the features added in this fork include:
-
-1. IPSec SA reference tracking inconjunction with openswan's IPSec transport
-   mode, which adds support for multiple clients behind the same NAT router
-        and multiple clients on the same internal IP behind different NAT routers.
-
-2. Support for the pppol2tp kernel mode L2TP.
-
-3. Alignment and endian problems resolved.
-
-hcg
diff --git a/net/xl2tpd/README.md b/net/xl2tpd/README.md
new file mode 100644 (file)
index 0000000..ea8a6e2
--- /dev/null
@@ -0,0 +1,45 @@
+# OpenWrt Package for xl2tpd
+
+xl2tpd is a development from the original l2tpd package originally written by
+Mark Spencer, subsequently forked by Scott Balmos and David Stipp, inherited
+by Jeff McAdams, modified substantially by Jacco de Leeuw and then forked
+again by Xelerance (after it was abandoned by l2tpd.org).
+
+## Rationale for inclusion in OpenWrt
+
+l2tpd has some serious alignment problems on RISC platforms. It also runs
+purely in userspace.
+
+Some of the features added in this fork include:
+
+1. IPSec SA reference tracking inconjunction with openswan's IPSec transport
+   mode, which adds support for multiple clients behind the same NAT router
+   and multiple clients on the same internal IP behind different NAT routers.
+
+2. Support for the pppol2tp kernel mode L2TP.
+
+3. Alignment and endian problems resolved.
+
+hcg
+
+## UCI options
+
+`server` takes the form `host[:port]` with port defaults to `1701`.  It
+specifies the l2tp server's address.
+
+`checkup_interval` tells netifd to check after that many seconds since last
+setup attempt to see if the interface is up.  If not it should issue another
+teardown/setup round to retry the negotiation.  This option defaults to 0 and
+netifd will not do the check and retry.
+
+The following are generic ppp options and should have the same format and
+semantics as with other ppp-related protocols.  See
+[uci/network#protocol_ppp](https://wiki.openwrt.org/doc/uci/network#protocol_ppp_ppp_over_modem)
+for details.
+
+       username
+       password
+       keepalive
+       ipv6
+       mtu
+       pppd_options
index 38c80256bbf7a4a14eec0b2fbbacac9064ecd6d4..c565d6baa90096ee4260aacf353fedafa386c913 100644 (file)
@@ -14,7 +14,6 @@ proto_l2tp_init_config() {
        proto_config_add_string "keepalive"
        proto_config_add_string "pppd_options"
        proto_config_add_boolean "ipv6"
-       proto_config_add_int "demand"
        proto_config_add_int "mtu"
        proto_config_add_int "checkup_interval"
        proto_config_add_string "server"
@@ -58,14 +57,9 @@ proto_l2tp_setup() {
                done
        fi
 
-       local ipv6 demand keepalive username password pppd_options mtu
-       json_get_vars ipv6 demand keepalive username password pppd_options mtu
+       local ipv6 keepalive username password pppd_options mtu
+       json_get_vars ipv6 keepalive username password pppd_options mtu
        [ "$ipv6" = 1 ] || ipv6=""
-       if [ "${demand:-0}" -gt 0 ]; then
-               demand="precompiled-active-filter /etc/ppp/filter demand idle $demand"
-       else
-               demand="persist"
-       fi
 
        local interval="${keepalive##*[, ]}"
        [ "$interval" != "$keepalive" ] || interval=5
diff --git a/net/xtables-addons/Makefile b/net/xtables-addons/Makefile
new file mode 100644 (file)
index 0000000..45908bf
--- /dev/null
@@ -0,0 +1,168 @@
+#
+# Copyright (C) 2009-2013 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+include $(INCLUDE_DIR)/kernel.mk
+
+PKG_NAME:=xtables-addons
+PKG_VERSION:=2.14
+PKG_RELEASE:=2
+PKG_HASH:=d215a9a8b8e66aae04b982fa2e1228e8a71e7dfe42320df99e34e5000cbdf152
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
+PKG_SOURCE_URL:=@SF/xtables-addons
+PKG_BUILD_DEPENDS:=iptables
+PKG_INSTALL:=1
+PKG_BUILD_PARALLEL:=1
+PKG_CHECK_FORMAT_SECURITY:=0
+
+PKG_MAINTAINER:=Jo-Philipp Wich <jo@mein.io>
+PKG_LICENSE:=GPL-2.0
+
+PKG_FIXUP:=autoreconf
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/xtables-addons
+  SECTION:=net
+  CATEGORY:=Network
+  SUBMENU:=Firewall
+  TITLE:=Extensions not distributed in the main Xtables
+  URL:=http://xtables-addons.sourceforge.net/
+endef
+
+# uses GNU configure
+
+CONFIGURE_ARGS+= \
+       --with-kbuild="$(LINUX_DIR)" \
+       --with-xtlibdir="/usr/lib/iptables" \
+
+define Build/Compile
+       +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \
+               $(KERNEL_MAKE_FLAGS) \
+               DESTDIR="$(PKG_INSTALL_DIR)" \
+               DEPMOD="/bin/true" \
+               all
+endef
+
+define Build/Install
+       $(MAKE) -C $(PKG_BUILD_DIR) \
+               $(KERNEL_MAKE_FLAGS) \
+               DESTDIR="$(PKG_INSTALL_DIR)" \
+               DEPMOD="/bin/true" \
+               install
+endef
+
+# 1: extension/module suffix used in package name
+# 2: extension/module display name used in package title/description
+# 3: list of extensions to package
+# 4: list of modules to package
+# 5: module load priority
+# 6: module depends
+define BuildTemplate
+
+ ifneq ($(3),)
+  define Package/iptables-mod-$(1)
+    $$(call Package/xtables-addons)
+    CATEGORY:=Network
+    TITLE:=$(2) iptables extension
+    DEPENDS:=iptables $(if $(4),+kmod-ipt-$(1))
+  endef
+
+  define Package/iptables-mod-$(1)/install
+       $(INSTALL_DIR) $$(1)/usr/lib/iptables
+       for m in $(3); do \
+               $(CP) \
+                       $(PKG_INSTALL_DIR)/usr/lib/iptables/lib$$$$$$$${m}.so \
+                       $$(1)/usr/lib/iptables/ ; \
+       done
+  endef
+
+  $$(eval $$(call BuildPackage,iptables-mod-$(1)))
+ endif
+
+ ifneq ($(4),)
+  define KernelPackage/ipt-$(1)
+    SUBMENU:=Netfilter Extensions
+    TITLE:=$(2) netfilter module
+    DEPENDS:=+kmod-ipt-core $(5)
+    FILES:=$(foreach mod,$(4),$(PKG_BUILD_DIR)/extensions/$(mod).$(LINUX_KMOD_SUFFIX))
+    AUTOLOAD:=$(call AutoProbe,$(notdir $(4)))
+  endef
+
+  $$(eval $$(call KernelPackage,ipt-$(1)))
+ endif
+
+endef
+
+
+define Package/iptaccount
+  $(call Package/xtables-addons)
+  CATEGORY:=Network
+  TITLE:=iptables-mod-account control utility
+  DEPENDS:=iptables +iptables-mod-account
+endef
+
+define Package/iptaccount/install
+       $(INSTALL_DIR) $(1)/usr/lib
+       $(INSTALL_DIR) $(1)/usr/sbin
+       $(CP) \
+               $(PKG_INSTALL_DIR)/usr/lib/libxt_ACCOUNT_cl.so* \
+               $(1)/usr/lib/
+       $(CP) \
+               $(PKG_INSTALL_DIR)/usr/sbin/iptaccount \
+               $(1)/usr/sbin/
+endef
+
+
+define Package/iptgeoip
+  $(call Package/xtables-addons)
+  CATEGORY:=Network
+  TITLE:=iptables-mod-geoip support scripts for MaxMind GeoIP databases
+  # we could also use wget-nossl but that's more complicated than our
+  # syntax of dependencies permits...
+  DEPENDS:=iptables +iptables-mod-geoip \
+               +perl +perlbase-getopt +perlbase-io +perl-text-csv_xs \
+               +!BUSYBOX_CONFIG_WGET:wget +!BUSYBOX_CONFIG_GZIP:gzip +!BUSYBOX_CONFIG_UNZIP:unzip
+endef
+
+define Package/iptgeoip/install
+       $(INSTALL_DIR) $(1)/usr/lib/xtables-addons
+       $(CP) \
+               $(PKG_INSTALL_DIR)/usr/lib/xtables-addons/xt_geoip_{build,dl} \
+               $(1)/usr/lib/xtables-addons/
+endef
+
+
+#$(eval $(call BuildTemplate,SUFFIX,DESCRIPTION,EXTENSION,MODULE,PRIORITY,DEPENDS))
+
+$(eval $(call BuildTemplate,compat-xtables,API compatibilty layer,,compat_xtables,+IPV6:kmod-ip6tables))
+$(eval $(call BuildTemplate,nathelper-rtsp,RTSP Conntrack and NAT,,rtsp/nf_conntrack_rtsp rtsp/nf_nat_rtsp,+kmod-ipt-conntrack-extra +kmod-ipt-nat))
+
+$(eval $(call BuildTemplate,account,ACCOUNT,xt_ACCOUNT,ACCOUNT/xt_ACCOUNT,+kmod-ipt-compat-xtables))
+$(eval $(call BuildTemplate,chaos,CHAOS,xt_CHAOS,xt_CHAOS,+kmod-ipt-compat-xtables +kmod-ipt-delude +kmod-ipt-tarpit))
+$(eval $(call BuildTemplate,condition,Condition,xt_condition,xt_condition,))
+$(eval $(call BuildTemplate,delude,DELUDE,xt_DELUDE,xt_DELUDE,+kmod-ipt-compat-xtables))
+$(eval $(call BuildTemplate,dhcpmac,DHCPMAC,xt_DHCPMAC,xt_DHCPMAC,+kmod-ipt-compat-xtables))
+$(eval $(call BuildTemplate,dnetmap,DNETMAP,xt_DNETMAP,xt_DNETMAP,+kmod-ipt-compat-xtables +kmod-ipt-nat))
+$(eval $(call BuildTemplate,fuzzy,fuzzy,xt_fuzzy,xt_fuzzy,))
+$(eval $(call BuildTemplate,geoip,geoip,xt_geoip,xt_geoip,))
+$(eval $(call BuildTemplate,iface,iface,xt_iface,xt_iface,))
+$(eval $(call BuildTemplate,ipmark,IPMARK,xt_IPMARK,xt_IPMARK,+kmod-ipt-compat-xtables))
+$(eval $(call BuildTemplate,ipp2p,IPP2P,xt_ipp2p,xt_ipp2p,+kmod-ipt-compat-xtables))
+$(eval $(call BuildTemplate,ipv4options,ipv4options,xt_ipv4options,xt_ipv4options,))
+$(eval $(call BuildTemplate,length2,length2,xt_length2,xt_length2,+kmod-ipt-compat-xtables))
+$(eval $(call BuildTemplate,logmark,LOGMARK,xt_LOGMARK,xt_LOGMARK,+kmod-ipt-compat-xtables))
+$(eval $(call BuildTemplate,lscan,lscan,xt_lscan,xt_lscan,))
+$(eval $(call BuildTemplate,lua,Lua PacketScript,xt_LUA,LUA/xt_LUA,+kmod-ipt-conntrack-extra))
+$(eval $(call BuildTemplate,psd,psd,xt_psd,xt_psd,))
+$(eval $(call BuildTemplate,quota2,quota2,xt_quota2,xt_quota2,))
+$(eval $(call BuildTemplate,sysrq,SYSRQ,xt_SYSRQ,xt_SYSRQ,+kmod-ipt-compat-xtables +kmod-crypto-hash))
+$(eval $(call BuildTemplate,tarpit,TARPIT,xt_TARPIT,xt_TARPIT,+kmod-ipt-compat-xtables))
+
+$(eval $(call BuildPackage,iptaccount))
+$(eval $(call BuildPackage,iptgeoip))
diff --git a/net/xtables-addons/patches/002-fix-kernel-version-detection.patch b/net/xtables-addons/patches/002-fix-kernel-version-detection.patch
new file mode 100644 (file)
index 0000000..775ccf6
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/configure.ac
++++ b/configure.ac
+@@ -44,7 +44,7 @@ regular_CFLAGS="-Wall -Waggregate-return
+ if test -n "$kbuilddir"; then
+       AC_MSG_CHECKING([kernel version that we will build against])
+-      krel="$(make -sC "$kbuilddir" M=$PWD kernelrelease | $AWK -v 'FS=[[^0-9.]]' '{print $1; exit}')"
++      krel="$(make -sC "$kbuilddir" M=$PWD kernelversion | $AWK -v 'FS=[[^0-9.]]' '{print $1; exit}')"
+       save_IFS="$IFS"
+       IFS='.'
+       set x $krel
diff --git a/net/xtables-addons/patches/100-add-rtsp-conntrack.patch b/net/xtables-addons/patches/100-add-rtsp-conntrack.patch
new file mode 100644 (file)
index 0000000..bd49d92
--- /dev/null
@@ -0,0 +1,1526 @@
+--- /dev/null
++++ b/extensions/rtsp/Kbuild
+@@ -0,0 +1,4 @@
++# -*- Makefile -*-
++
++obj-m += nf_nat_rtsp.o
++obj-m += nf_conntrack_rtsp.o
+--- /dev/null
++++ b/extensions/rtsp/netfilter_helpers.h
+@@ -0,0 +1,133 @@
++/*
++ * Helpers for netfiler modules.  This file provides implementations for basic
++ * functions such as strncasecmp(), etc.
++ *
++ * gcc will warn for defined but unused functions, so we only include the
++ * functions requested.  The following macros are used:
++ *   NF_NEED_STRNCASECMP        nf_strncasecmp()
++ *   NF_NEED_STRTOU16           nf_strtou16()
++ *   NF_NEED_STRTOU32           nf_strtou32()
++ */
++#ifndef _NETFILTER_HELPERS_H
++#define _NETFILTER_HELPERS_H
++
++/* Only include these functions for kernel code. */
++#ifdef __KERNEL__
++
++#include <linux/ctype.h>
++#define iseol(c) ( (c) == '\r' || (c) == '\n' )
++
++/*
++ * The standard strncasecmp()
++ */
++#ifdef NF_NEED_STRNCASECMP
++static int
++nf_strncasecmp(const char* s1, const char* s2, u_int32_t len)
++{
++    if (s1 == NULL || s2 == NULL)
++    {
++        if (s1 == NULL && s2 == NULL)
++        {
++            return 0;
++        }
++        return (s1 == NULL) ? -1 : 1;
++    }
++    while (len > 0 && tolower(*s1) == tolower(*s2))
++    {
++        len--;
++        s1++;
++        s2++;
++    }
++    return ( (len == 0) ? 0 : (tolower(*s1) - tolower(*s2)) );
++}
++#endif /* NF_NEED_STRNCASECMP */
++
++/*
++ * Parse a string containing a 16-bit unsigned integer.
++ * Returns the number of chars used, or zero if no number is found.
++ */
++#ifdef NF_NEED_STRTOU16
++static int
++nf_strtou16(const char* pbuf, u_int16_t* pval)
++{
++    int n = 0;
++
++    *pval = 0;
++    while (isdigit(pbuf[n]))
++    {
++        *pval = (*pval * 10) + (pbuf[n] - '0');
++        n++;
++    }
++
++    return n;
++}
++#endif /* NF_NEED_STRTOU16 */
++
++/*
++ * Parse a string containing a 32-bit unsigned integer.
++ * Returns the number of chars used, or zero if no number is found.
++ */
++#ifdef NF_NEED_STRTOU32
++static int
++nf_strtou32(const char* pbuf, u_int32_t* pval)
++{
++    int n = 0;
++
++    *pval = 0;
++    while (pbuf[n] >= '0' && pbuf[n] <= '9')
++    {
++        *pval = (*pval * 10) + (pbuf[n] - '0');
++        n++;
++    }
++
++    return n;
++}
++#endif /* NF_NEED_STRTOU32 */
++
++/*
++ * Given a buffer and length, advance to the next line and mark the current
++ * line.
++ */
++#ifdef NF_NEED_NEXTLINE
++static int
++nf_nextline(char* p, uint len, uint* poff, uint* plineoff, uint* plinelen)
++{
++    uint    off = *poff;
++    uint    physlen = 0;
++
++    if (off >= len)
++    {
++        return 0;
++    }
++
++    while (p[off] != '\n')
++    {
++        if (len-off <= 1)
++        {
++            return 0;
++        }
++
++        physlen++;
++        off++;
++    }
++
++    /* if we saw a crlf, physlen needs adjusted */
++    if (physlen > 0 && p[off] == '\n' && p[off-1] == '\r')
++    {
++        physlen--;
++    }
++
++    /* advance past the newline */
++    off++;
++
++    *plineoff = *poff;
++    *plinelen = physlen;
++    *poff = off;
++
++    return 1;
++}
++#endif /* NF_NEED_NEXTLINE */
++
++#endif /* __KERNEL__ */
++
++#endif /* _NETFILTER_HELPERS_H */
+--- /dev/null
++++ b/extensions/rtsp/netfilter_mime.h
+@@ -0,0 +1,89 @@
++/*
++ * MIME functions for netfilter modules.  This file provides implementations
++ * for basic MIME parsing.  MIME headers are used in many protocols, such as
++ * HTTP, RTSP, SIP, etc.
++ *
++ * gcc will warn for defined but unused functions, so we only include the
++ * functions requested.  The following macros are used:
++ *   NF_NEED_MIME_NEXTLINE      nf_mime_nextline()
++ */
++#ifndef _NETFILTER_MIME_H
++#define _NETFILTER_MIME_H
++
++/* Only include these functions for kernel code. */
++#ifdef __KERNEL__
++
++#include <linux/ctype.h>
++
++/*
++ * Given a buffer and length, advance to the next line and mark the current
++ * line.  If the current line is empty, *plinelen will be set to zero.  If
++ * not, it will be set to the actual line length (including CRLF).
++ *
++ * 'line' in this context means logical line (includes LWS continuations).
++ * Returns 1 on success, 0 on failure.
++ */
++#ifdef NF_NEED_MIME_NEXTLINE
++static int
++nf_mime_nextline(char* p, uint len, uint* poff, uint* plineoff, uint* plinelen)
++{
++    uint    off = *poff;
++    uint    physlen = 0;
++    int     is_first_line = 1;
++
++    if (off >= len)
++    {
++        return 0;
++    }
++
++    do
++    {
++        while (p[off] != '\n')
++        {
++            if (len-off <= 1)
++            {
++                return 0;
++            }
++
++            physlen++;
++            off++;
++        }
++
++        /* if we saw a crlf, physlen needs adjusted */
++        if (physlen > 0 && p[off] == '\n' && p[off-1] == '\r')
++        {
++            physlen--;
++        }
++
++        /* advance past the newline */
++        off++;
++
++        /* check for an empty line */
++        if (physlen == 0)
++        {
++            break;
++        }
++
++        /* check for colon on the first physical line */
++        if (is_first_line)
++        {
++            is_first_line = 0;
++            if (memchr(p+(*poff), ':', physlen) == NULL)
++            {
++                return 0;
++            }
++        }
++    }
++    while (p[off] == ' ' || p[off] == '\t');
++
++    *plineoff = *poff;
++    *plinelen = (physlen == 0) ? 0 : (off - *poff);
++    *poff = off;
++
++    return 1;
++}
++#endif /* NF_NEED_MIME_NEXTLINE */
++
++#endif /* __KERNEL__ */
++
++#endif /* _NETFILTER_MIME_H */
+--- /dev/null
++++ b/extensions/rtsp/nf_conntrack_rtsp.c
+@@ -0,0 +1,576 @@
++/*
++ * RTSP extension for IP connection tracking
++ * (C) 2003 by Tom Marshall <tmarshall at real.com>
++ *
++ * 2005-02-13: Harald Welte <laforge at netfilter.org>
++ *    - port to 2.6
++ *    - update to recent post-2.6.11 api changes
++ * 2006-09-14: Steven Van Acker <deepstar at singularity.be>
++ *    - removed calls to NAT code from conntrack helper: NAT no longer needed to use rtsp-conntrack
++ * 2007-04-18: Michael Guntsche <mike at it-loops.com>
++ *                    - Port to new NF API
++ * 2013-03-04: Il'inykh Sergey <sergeyi at inango-sw.com>. Inango Systems Ltd
++ *    - fixed rtcp nat mapping and other port mapping fixes
++ *    - simple TEARDOWN request handling
++ *    - codestyle fixes and other less significant bug fixes 
++ *
++ * based on ip_conntrack_irc.c
++ *
++ *      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.
++ *
++ * Module load syntax:
++ *   insmod nf_conntrack_rtsp.o ports=port1,port2,...port<MAX_PORTS>
++ *                              max_outstanding=n setup_timeout=secs
++ *
++ * If no ports are specified, the default will be port 554.
++ *
++ * With max_outstanding you can define the maximum number of not yet
++ * answered SETUP requests per RTSP session (default 8).
++ * With setup_timeout you can specify how long the system waits for
++ * an expected data channel (default 300 seconds).
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/netfilter.h>
++#include <linux/ip.h>
++#include <linux/inet.h>
++#include <net/tcp.h>
++
++#include <net/netfilter/nf_conntrack.h>
++#include <net/netfilter/nf_conntrack_expect.h>
++#include <net/netfilter/nf_conntrack_helper.h>
++#include "nf_conntrack_rtsp.h"
++
++#define NF_NEED_STRNCASECMP
++#define NF_NEED_STRTOU16
++#define NF_NEED_STRTOU32
++#define NF_NEED_NEXTLINE
++#include "netfilter_helpers.h"
++#define NF_NEED_MIME_NEXTLINE
++#include "netfilter_mime.h"
++
++#include <linux/ctype.h>
++
++#define MAX_PORTS 8
++static int ports[MAX_PORTS];
++static int num_ports = 0;
++static int max_outstanding = 8;
++static unsigned int setup_timeout = 300;
++
++MODULE_AUTHOR("Tom Marshall <tmarshall at real.com>");
++MODULE_DESCRIPTION("RTSP connection tracking module");
++MODULE_LICENSE("GPL");
++module_param_array(ports, int, &num_ports, 0400);
++MODULE_PARM_DESC(ports, "port numbers of RTSP servers");
++module_param(max_outstanding, int, 0400);
++MODULE_PARM_DESC(max_outstanding, "max number of outstanding SETUP requests per RTSP session");
++module_param(setup_timeout, int, 0400);
++MODULE_PARM_DESC(setup_timeout, "timeout on for unestablished data channels");
++
++static char *rtsp_buffer;
++static DEFINE_SPINLOCK(rtsp_buffer_lock);
++
++static struct nf_conntrack_expect_policy rtsp_exp_policy;
++
++unsigned int (*nf_nat_rtsp_hook)(struct sk_buff *skb,
++                               enum ip_conntrack_info ctinfo,
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++                               unsigned int protoff,
++#endif
++                               unsigned int matchoff, unsigned int matchlen,
++                               struct ip_ct_rtsp_expect* prtspexp,
++                               struct nf_conntrack_expect *rtp_exp,
++                               struct nf_conntrack_expect *rtcp_exp);
++
++EXPORT_SYMBOL_GPL(nf_nat_rtsp_hook);
++
++/*
++ * Max mappings we will allow for one RTSP connection (for RTP, the number
++ * of allocated ports is twice this value).  Note that SMIL burns a lot of
++ * ports so keep this reasonably high.  If this is too low, you will see a
++ * lot of "no free client map entries" messages.
++ */
++#define MAX_PORT_MAPS 16
++
++/*** default port list was here in the masq code: 554, 3030, 4040 ***/
++
++#define SKIP_WSPACE(ptr,len,off) while(off < len && isspace(*(ptr+off))) { off++; }
++
++/*
++ * Parse an RTSP packet.
++ *
++ * Returns zero if parsing failed.
++ *
++ * Parameters:
++ *  IN      ptcp        tcp data pointer
++ *  IN      tcplen      tcp data len
++ *  IN/OUT  ptcpoff     points to current tcp offset
++ *  OUT     phdrsoff    set to offset of rtsp headers
++ *  OUT     phdrslen    set to length of rtsp headers
++ *  OUT     pcseqoff    set to offset of CSeq header
++ *  OUT     pcseqlen    set to length of CSeq header
++ */
++static int
++rtsp_parse_message(char* ptcp, uint tcplen, uint* ptcpoff,
++                 uint* phdrsoff, uint* phdrslen,
++                 uint* pcseqoff, uint* pcseqlen,
++                 uint* transoff, uint* translen)
++{
++      uint    entitylen = 0;
++      uint    lineoff;
++      uint    linelen;
++      
++      if (!nf_nextline(ptcp, tcplen, ptcpoff, &lineoff, &linelen))
++              return 0;
++      
++      *phdrsoff = *ptcpoff;
++      while (nf_mime_nextline(ptcp, tcplen, ptcpoff, &lineoff, &linelen)) {
++              if (linelen == 0) {
++                      if (entitylen > 0)
++                              *ptcpoff += min(entitylen, tcplen - *ptcpoff);
++                      break;
++              }
++              if (lineoff+linelen > tcplen) {
++                      pr_info("!! overrun !!\n");
++                      break;
++              }
++
++              if (nf_strncasecmp(ptcp+lineoff, "CSeq:", 5) == 0) {
++                      *pcseqoff = lineoff;
++                      *pcseqlen = linelen;
++              } 
++
++              if (nf_strncasecmp(ptcp+lineoff, "Transport:", 10) == 0) {
++                      *transoff = lineoff;
++                      *translen = linelen;
++              }
++              
++              if (nf_strncasecmp(ptcp+lineoff, "Content-Length:", 15) == 0) {
++                      uint off = lineoff+15;
++                      SKIP_WSPACE(ptcp+lineoff, linelen, off);
++                      nf_strtou32(ptcp+off, &entitylen);
++              }
++      }
++      *phdrslen = (*ptcpoff) - (*phdrsoff);
++      
++      return 1;
++}
++
++/*
++ * Find lo/hi client ports (if any) in transport header
++ * In:
++ *   ptcp, tcplen = packet
++ *   tranoff, tranlen = buffer to search
++ *
++ * Out:
++ *   pport_lo, pport_hi = lo/hi ports (host endian)
++ *
++ * Returns nonzero if any client ports found
++ *
++ * Note: it is valid (and expected) for the client to request multiple
++ * transports, so we need to parse the entire line.
++ */
++static int
++rtsp_parse_transport(char* ptran, uint tranlen,
++                   struct ip_ct_rtsp_expect* prtspexp)
++{
++      int  rc = 0;
++      uint off = 0;
++      
++      if (tranlen < 10 || !iseol(ptran[tranlen-1]) ||
++          nf_strncasecmp(ptran, "Transport:", 10) != 0) {
++              pr_info("sanity check failed\n");
++              return 0;
++      }
++      
++      pr_debug("tran='%.*s'\n", (int)tranlen, ptran);
++      off += 10;
++      SKIP_WSPACE(ptran, tranlen, off);
++      
++      /* Transport: tran;field;field=val,tran;field;field=val,... */
++      while (off < tranlen) {
++              const char* pparamend;
++              uint        nextparamoff;
++              
++              pparamend = memchr(ptran+off, ',', tranlen-off);
++              pparamend = (pparamend == NULL) ? ptran+tranlen : pparamend+1;
++              nextparamoff = pparamend-ptran;
++              
++              while (off < nextparamoff) {
++                      const char* pfieldend;
++                      uint        nextfieldoff;
++                      
++                      pfieldend = memchr(ptran+off, ';', nextparamoff-off);
++                      nextfieldoff = (pfieldend == NULL) ? nextparamoff : pfieldend-ptran+1;
++                 
++                      if (strncmp(ptran+off, "client_port=", 12) == 0) {
++                              u_int16_t   port;
++                              uint        numlen;
++
++                              off += 12;
++                              numlen = nf_strtou16(ptran+off, &port);
++                              off += numlen;
++                              if (prtspexp->loport != 0 && prtspexp->loport != port)
++                                      pr_debug("multiple ports found, port %hu ignored\n", port);
++                              else {
++                                      pr_debug("lo port found : %hu\n", port);
++                                      prtspexp->loport = prtspexp->hiport = port;
++                                      if (ptran[off] == '-') {
++                                              off++;
++                                              numlen = nf_strtou16(ptran+off, &port);
++                                              off += numlen;
++                                              prtspexp->pbtype = pb_range;
++                                              prtspexp->hiport = port;
++                                              
++                                              // If we have a range, assume rtp:
++                                              // loport must be even, hiport must be loport+1
++                                              if ((prtspexp->loport & 0x0001) != 0 ||
++                                                  prtspexp->hiport != prtspexp->loport+1) {
++                                                      pr_debug("incorrect range: %hu-%hu, correcting\n",
++                                                             prtspexp->loport, prtspexp->hiport);
++                                                      prtspexp->loport &= 0xfffe;
++                                                      prtspexp->hiport = prtspexp->loport+1;
++                                              }
++                                      } else if (ptran[off] == '/') {
++                                              off++;
++                                              numlen = nf_strtou16(ptran+off, &port);
++                                              off += numlen;
++                                              prtspexp->pbtype = pb_discon;
++                                              prtspexp->hiport = port;
++                                      }
++                                      rc = 1;
++                              }
++                      }
++                      
++                      /*
++                       * Note we don't look for the destination parameter here.
++                       * If we are using NAT, the NAT module will handle it.  If not,
++                       * and the client is sending packets elsewhere, the expectation
++                       * will quietly time out.
++                       */
++                      
++                      off = nextfieldoff;
++              }
++              
++              off = nextparamoff;
++      }
++      
++      return rc;
++}
++
++
++/*** conntrack functions ***/
++
++/* outbound packet: client->server */
++
++static inline int
++help_out(struct sk_buff *skb, unsigned char *rb_ptr, unsigned int datalen,
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++       struct nf_conn *ct, enum ip_conntrack_info ctinfo,
++       unsigned int protoff)
++#else
++       struct nf_conn *ct, enum ip_conntrack_info ctinfo)
++#endif
++{
++      struct ip_ct_rtsp_expect expinfo;
++      
++      int dir = CTINFO2DIR(ctinfo);   /* = IP_CT_DIR_ORIGINAL */
++      //struct  tcphdr* tcph = (void*)iph + iph->ihl * 4;
++      //uint    tcplen = pktlen - iph->ihl * 4;
++      char*   pdata = rb_ptr;
++      //uint    datalen = tcplen - tcph->doff * 4;
++      uint    dataoff = 0;
++      int ret = NF_ACCEPT;
++      
++      struct nf_conntrack_expect *rtp_exp;
++      struct nf_conntrack_expect *rtcp_exp = NULL;
++      
++      __be16 be_loport;
++      __be16 be_hiport;
++      
++      typeof(nf_nat_rtsp_hook) nf_nat_rtsp;
++
++      memset(&expinfo, 0, sizeof(expinfo));
++      
++      while (dataoff < datalen) {
++              uint cmdoff = dataoff;
++              uint hdrsoff = 0;
++              uint hdrslen = 0;
++              uint cseqoff = 0;
++              uint cseqlen = 0;
++              uint transoff = 0;
++              uint translen = 0;
++              uint off;
++              
++              if (!rtsp_parse_message(pdata, datalen, &dataoff,
++                                      &hdrsoff, &hdrslen,
++                                      &cseqoff, &cseqlen,
++                                      &transoff, &translen))
++                      break;      /* not a valid message */
++
++              if (strncmp(pdata+cmdoff, "TEARDOWN ", 9) == 0) {
++                      pr_debug("teardown handled\n");
++                      nf_ct_remove_expectations(ct); /* FIXME must be session id aware */
++                      break;
++              }
++
++              if (strncmp(pdata+cmdoff, "SETUP ", 6) != 0)
++                      continue;   /* not a SETUP message */
++
++              pr_debug("found a setup message\n");
++
++              off = 0;
++              if(translen)
++                      rtsp_parse_transport(pdata+transoff, translen, &expinfo);
++
++              if (expinfo.loport == 0) {
++                      pr_debug("no udp transports found\n");
++                      continue;   /* no udp transports found */
++              }
++
++              pr_debug("udp transport found, ports=(%d,%hu,%hu)\n",
++                       (int)expinfo.pbtype, expinfo.loport, expinfo.hiport);
++
++
++              be_loport = htons(expinfo.loport);
++
++              rtp_exp = nf_ct_expect_alloc(ct);
++              if (rtp_exp == NULL) {
++                      ret = NF_DROP;
++                      goto out;
++              }
++
++              nf_ct_expect_init(rtp_exp, NF_CT_EXPECT_CLASS_DEFAULT,
++                                nf_ct_l3num(ct),
++                                NULL, /* &ct->tuplehash[!dir].tuple.src.u3, */
++                                &ct->tuplehash[!dir].tuple.dst.u3,
++                                IPPROTO_UDP, NULL, &be_loport);
++
++              rtp_exp->flags = 0;
++
++              if (expinfo.pbtype == pb_range) {
++                      pr_debug("setup expectation for rtcp\n");
++
++                      be_hiport = htons(expinfo.hiport);
++                      rtcp_exp = nf_ct_expect_alloc(ct);
++                      if (rtcp_exp == NULL) {
++                              ret = NF_DROP;
++                              goto out1;
++                      }
++
++                      nf_ct_expect_init(rtcp_exp, NF_CT_EXPECT_CLASS_DEFAULT,
++                                        nf_ct_l3num(ct),
++                                        NULL, /* &ct->tuplehash[!dir].tuple.src.u3, */
++                                        &ct->tuplehash[!dir].tuple.dst.u3,
++                                        IPPROTO_UDP, NULL, &be_hiport);
++
++                      rtcp_exp->flags = 0;
++
++                      pr_debug("expect_related %pI4:%u-%u-%pI4:%u-%u\n",
++                                 &rtp_exp->tuple.src.u3.ip,
++                                 ntohs(rtp_exp->tuple.src.u.udp.port),
++                                 ntohs(rtcp_exp->tuple.src.u.udp.port),
++                                 &rtp_exp->tuple.dst.u3.ip,
++                                 ntohs(rtp_exp->tuple.dst.u.udp.port),
++                                 ntohs(rtcp_exp->tuple.dst.u.udp.port));
++              } else {
++                      pr_debug("expect_related %pI4:%u-%pI4:%u\n",
++                                      &rtp_exp->tuple.src.u3.ip,
++                                      ntohs(rtp_exp->tuple.src.u.udp.port),
++                                      &rtp_exp->tuple.dst.u3.ip,
++                                      ntohs(rtp_exp->tuple.dst.u.udp.port));
++              }
++
++              nf_nat_rtsp = rcu_dereference(nf_nat_rtsp_hook);
++              if (nf_nat_rtsp && ct->status & IPS_NAT_MASK)
++                      /* pass the request off to the nat helper */
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++                      ret = nf_nat_rtsp(skb, ctinfo, protoff, hdrsoff, hdrslen,
++                                        &expinfo, rtp_exp, rtcp_exp);
++#else
++                      ret = nf_nat_rtsp(skb, ctinfo, hdrsoff, hdrslen,
++                                        &expinfo, rtp_exp, rtcp_exp);
++#endif
++              else {
++                      if (nf_ct_expect_related(rtp_exp) == 0) {
++                              if (rtcp_exp && nf_ct_expect_related(rtcp_exp) != 0) {
++                                      nf_ct_unexpect_related(rtp_exp);
++                                      pr_info("nf_conntrack_expect_related failed for rtcp\n");
++                                      ret = NF_DROP;
++                              }
++                      } else {
++                              pr_info("nf_conntrack_expect_related failed for rtp\n");
++                              ret = NF_DROP;
++                      }
++              }
++              if (rtcp_exp) {
++                      nf_ct_expect_put(rtcp_exp);
++              }
++out1:
++              nf_ct_expect_put(rtp_exp);
++              goto out;
++      }
++out:
++
++      return ret;
++}
++
++
++static inline int
++help_in(struct sk_buff *skb, size_t pktlen,
++      struct nf_conn* ct, enum ip_conntrack_info ctinfo)
++{
++      return NF_ACCEPT;
++}
++
++static int help(struct sk_buff *skb, unsigned int protoff,
++              struct nf_conn *ct, enum ip_conntrack_info ctinfo) 
++{
++      struct tcphdr _tcph, *th;
++      unsigned int dataoff, datalen;
++      char *rb_ptr;
++      int ret = NF_DROP;
++
++      /* Until there's been traffic both ways, don't look in packets. */
++      if (ctinfo != IP_CT_ESTABLISHED && 
++          ctinfo != IP_CT_ESTABLISHED + IP_CT_IS_REPLY) {
++              pr_debug("conntrackinfo = %u\n", ctinfo);
++              return NF_ACCEPT;
++      } 
++
++      /* Not whole TCP header? */
++      th = skb_header_pointer(skb, protoff, sizeof(_tcph), &_tcph);
++
++      if (!th)
++              return NF_ACCEPT;
++   
++      /* No data ? */
++      dataoff = protoff + th->doff*4;
++      datalen = skb->len - dataoff;
++      if (dataoff >= skb->len)
++              return NF_ACCEPT;
++
++      spin_lock_bh(&rtsp_buffer_lock);
++      rb_ptr = skb_header_pointer(skb, dataoff,
++                                  skb->len - dataoff, rtsp_buffer);
++      BUG_ON(rb_ptr == NULL);
++
++#if 0
++      /* Checksum invalid?  Ignore. */
++      /* FIXME: Source route IP option packets --RR */
++      if (tcp_v4_check(tcph, tcplen, iph->saddr, iph->daddr,
++                       csum_partial((char*)tcph, tcplen, 0)))
++      {
++              DEBUGP("bad csum: %p %u %u.%u.%u.%u %u.%u.%u.%u\n",
++                     tcph, tcplen, NIPQUAD(iph->saddr), NIPQUAD(iph->daddr));
++              return NF_ACCEPT;
++      }
++#endif
++
++      switch (CTINFO2DIR(ctinfo)) {
++      case IP_CT_DIR_ORIGINAL:
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++              ret = help_out(skb, rb_ptr, datalen, ct, ctinfo, protoff);
++#else
++              ret = help_out(skb, rb_ptr, datalen, ct, ctinfo);
++#endif
++              break;
++      case IP_CT_DIR_REPLY:
++              pr_debug("IP_CT_DIR_REPLY\n");
++              /* inbound packet: server->client */
++              ret = NF_ACCEPT;
++              break;
++      }
++
++      spin_unlock_bh(&rtsp_buffer_lock);
++
++      return ret;
++}
++
++static struct nf_conntrack_helper rtsp_helpers[MAX_PORTS];
++static char rtsp_names[MAX_PORTS][10];
++
++/* This function is intentionally _NOT_ defined as __exit */
++static void
++fini(void)
++{
++      int i;
++      for (i = 0; i < num_ports; i++) {
++              pr_debug("unregistering port %d\n", ports[i]);
++              nf_conntrack_helper_unregister(&rtsp_helpers[i]);
++      }
++      kfree(rtsp_buffer);
++}
++
++static int __init
++init(void)
++{
++      int i, ret;
++      struct nf_conntrack_helper *hlpr;
++      char *tmpname;
++
++      printk("nf_conntrack_rtsp v" IP_NF_RTSP_VERSION " loading\n");
++
++      if (max_outstanding < 1) {
++              printk("nf_conntrack_rtsp: max_outstanding must be a positive integer\n");
++              return -EBUSY;
++      }
++      if (setup_timeout < 0) {
++              printk("nf_conntrack_rtsp: setup_timeout must be a positive integer\n");
++              return -EBUSY;
++      }
++
++      rtsp_exp_policy.max_expected = max_outstanding;
++      rtsp_exp_policy.timeout = setup_timeout;
++      
++      rtsp_buffer = kmalloc(65536, GFP_KERNEL);
++      if (!rtsp_buffer) 
++              return -ENOMEM;
++
++      /* If no port given, default to standard rtsp port */
++      if (ports[0] == 0) {
++              ports[0] = RTSP_PORT;
++              num_ports = 1;
++      }
++
++      for (i = 0; (i < MAX_PORTS) && ports[i]; i++) {
++              hlpr = &rtsp_helpers[i];
++              memset(hlpr, 0, sizeof(struct nf_conntrack_helper));
++              hlpr->tuple.src.l3num = AF_INET;
++              hlpr->tuple.src.u.tcp.port = htons(ports[i]);
++              hlpr->tuple.dst.protonum = IPPROTO_TCP;
++              hlpr->expect_policy = &rtsp_exp_policy;
++              hlpr->me = THIS_MODULE;
++              hlpr->help = help;
++
++              tmpname = &rtsp_names[i][0];
++              if (ports[i] == RTSP_PORT) {
++                      sprintf(tmpname, "rtsp");
++              } else {
++                      sprintf(tmpname, "rtsp-%d", i);
++              }
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)
++              strlcpy(hlpr->name, tmpname, sizeof(hlpr->name));
++#else
++              hlpr->name = tmpname;
++#endif
++              pr_debug("port #%d: %d\n", i, ports[i]);
++
++              ret = nf_conntrack_helper_register(hlpr);
++
++              if (ret) {
++                      printk("nf_conntrack_rtsp: ERROR registering port %d\n", ports[i]);
++                      fini();
++                      return -EBUSY;
++              }
++      }
++      return 0;
++}
++
++module_init(init);
++module_exit(fini);
+--- /dev/null
++++ b/extensions/rtsp/nf_conntrack_rtsp.h
+@@ -0,0 +1,72 @@
++/*
++ * RTSP extension for IP connection tracking.
++ * (C) 2003 by Tom Marshall <tmarshall at real.com>
++ * based on ip_conntrack_irc.h
++ *
++ *      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.
++ *
++ * 2013-03-04: Il'inykh Sergey <sergeyi at inango-sw.com>. Inango Systems Ltd
++ *    - conditional compilation for kernel 3.7
++ *    - port mapping improvements
++*/
++#ifndef _IP_CONNTRACK_RTSP_H
++#define _IP_CONNTRACK_RTSP_H
++
++#include <linux/version.h>
++
++//#define IP_NF_RTSP_DEBUG 1
++#define IP_NF_RTSP_VERSION "0.7"
++
++#ifdef __KERNEL__
++/* port block types */
++typedef enum {
++    pb_single,  /* client_port=x */
++    pb_range,   /* client_port=x-y */
++    pb_discon   /* client_port=x/y (rtspbis) */
++} portblock_t;
++
++/* We record seq number and length of rtsp headers here, all in host order. */
++
++/*
++ * This structure is per expected connection.  It is a member of struct
++ * ip_conntrack_expect.  The TCP SEQ for the conntrack expect is stored
++ * there and we are expected to only store the length of the data which
++ * needs replaced.  If a packet contains multiple RTSP messages, we create
++ * one expected connection per message.
++ *
++ * We use these variables to mark the entire header block.  This may seem
++ * like overkill, but the nature of RTSP requires it.  A header may appear
++ * multiple times in a message.  We must treat two Transport headers the
++ * same as one Transport header with two entries.
++ */
++struct ip_ct_rtsp_expect
++{
++    u_int32_t   len;        /* length of header block */
++    portblock_t pbtype;     /* Type of port block that was requested */
++    u_int16_t   loport;     /* Port that was requested, low or first */
++    u_int16_t   hiport;     /* Port that was requested, high or second */
++#if 0
++    uint        method;     /* RTSP method */
++    uint        cseq;       /* CSeq from request */
++#endif
++};
++
++extern unsigned int (*nf_nat_rtsp_hook)(struct sk_buff *skb,
++                                      enum ip_conntrack_info ctinfo,
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++                                      unsigned int protoff,
++#endif
++                                      unsigned int matchoff,
++                                      unsigned int matchlen,
++                                      struct ip_ct_rtsp_expect *prtspexp,
++                                      struct nf_conntrack_expect *rtp_exp,
++                                      struct nf_conntrack_expect *rtcp_exp);
++
++#define RTSP_PORT   554
++
++#endif /* __KERNEL__ */
++
++#endif /* _IP_CONNTRACK_RTSP_H */
+--- /dev/null
++++ b/extensions/rtsp/nf_nat_rtsp.c
+@@ -0,0 +1,617 @@
++/*
++ * RTSP extension for TCP NAT alteration
++ * (C) 2003 by Tom Marshall <tmarshall at real.com>
++ *
++ * 2013-03-04: Il'inykh Sergey <sergeyi at inango-sw.com>. Inango Systems Ltd
++ *    - fixed rtcp nat mapping and other port mapping fixes
++ *    - fixed system hard lock because of bug in the parser
++ *    - codestyle fixes and less significant fixes
++ *
++ * based on ip_nat_irc.c
++ *
++ *    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.
++ *
++ * Module load syntax:
++ *    insmod nf_nat_rtsp.o ports=port1,port2,...port<MAX_PORTS>
++ *                         stunaddr=<address>
++ *                         destaction=[auto|strip|none]
++ *
++ * If no ports are specified, the default will be port 554 only.
++ *
++ * stunaddr specifies the address used to detect that a client is using STUN.
++ * If this address is seen in the destination parameter, it is assumed that
++ * the client has already punched a UDP hole in the firewall, so we don't
++ * mangle the client_port.  If none is specified, it is autodetected.  It
++ * only needs to be set if you have multiple levels of NAT.  It should be
++ * set to the external address that the STUN clients detect.  Note that in
++ * this case, it will not be possible for clients to use UDP with servers
++ * between the NATs.
++ *
++ * If no destaction is specified, auto is used.
++ *   destaction=auto:  strip destination parameter if it is not stunaddr.
++ *   destaction=strip: always strip destination parameter (not recommended).
++ *   destaction=none:  do not touch destination parameter (not recommended).
++ */
++
++#include <linux/module.h>
++#include <linux/version.h>
++#include <net/tcp.h>
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++# include <net/netfilter/nf_nat.h>
++#else
++# include <net/netfilter/nf_nat_rule.h>
++#endif
++#include <net/netfilter/nf_nat_helper.h>
++#include "nf_conntrack_rtsp.h"
++#include <net/netfilter/nf_conntrack_expect.h>
++
++#include <linux/inet.h>
++#include <linux/ctype.h>
++#define NF_NEED_STRNCASECMP
++#define NF_NEED_STRTOU16
++#include "netfilter_helpers.h"
++#define NF_NEED_MIME_NEXTLINE
++#include "netfilter_mime.h"
++
++#define MAX_PORTS     8
++#define DSTACT_AUTO   0
++#define DSTACT_STRIP  1
++#define DSTACT_NONE   2
++
++static char* stunaddr = NULL;
++static char* destaction = NULL;
++
++static u_int32_t extip = 0;
++static int       dstact = 0;
++
++static void nf_nat_rtsp_expected(struct nf_conn* ct, struct nf_conntrack_expect *exp);
++
++MODULE_AUTHOR("Tom Marshall <tmarshall at real.com>");
++MODULE_DESCRIPTION("RTSP network address translation module");
++MODULE_LICENSE("GPL");
++module_param(stunaddr, charp, 0644);
++MODULE_PARM_DESC(stunaddr, "Address for detecting STUN");
++module_param(destaction, charp, 0644);
++MODULE_PARM_DESC(destaction, "Action for destination parameter (auto/strip/none)");
++
++#define SKIP_WSPACE(ptr,len,off) while(off < len && isspace(*(ptr+off))) { off++; }
++
++/*** helper functions ***/
++
++static void
++get_skb_tcpdata(struct sk_buff* skb, char** pptcpdata, uint* ptcpdatalen)
++{
++      struct iphdr*   iph  = ip_hdr(skb);
++      struct tcphdr*  tcph = (void *)iph + ip_hdrlen(skb);
++
++      *pptcpdata = (char*)tcph +  tcph->doff*4;
++      *ptcpdatalen = ((char*)skb_transport_header(skb) + skb->len) - *pptcpdata;
++}
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++/* copy of sip_sprintf_addr */
++static int rtsp_sprintf_addr(const struct nf_conn *ct, char *buffer,
++                           const union nf_inet_addr *addr, bool delim)
++{
++      if (nf_ct_l3num(ct) == NFPROTO_IPV4) {
++              return sprintf(buffer, "%pI4", &addr->ip);
++      } else {
++              if (delim)
++                      return sprintf(buffer, "[%pI6c]", &addr->ip6);
++              else
++                      return sprintf(buffer, "%pI6c", &addr->ip6);
++      }
++}
++#endif
++
++/*** nat functions ***/
++
++/*
++ * Mangle the "Transport:" header:
++ *   - Replace all occurences of "client_port=<spec>"
++ *   - Handle destination parameter
++ *
++ * In:
++ *   ct, ctinfo = conntrack context
++ *   skb        = packet
++ *   tranoff    = Transport header offset from TCP data
++ *   tranlen    = Transport header length (incl. CRLF)
++ *   rport_lo   = replacement low  port (host endian)
++ *   rport_hi   = replacement high port (host endian)
++ *
++ * Returns packet size difference.
++ *
++ * Assumes that a complete transport header is present, ending with CR or LF
++ */
++static int
++rtsp_mangle_tran(enum ip_conntrack_info ctinfo,
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++               unsigned int protoff,
++#endif
++               struct nf_conntrack_expect* rtp_exp,
++               struct nf_conntrack_expect* rtcp_exp,
++               struct ip_ct_rtsp_expect* prtspexp,
++               struct sk_buff* skb, uint tranoff, uint tranlen)
++{
++      char*  ptcp;
++      uint   tcplen;
++      char*  ptran;
++      char   rbuf1[16];         /* Replacement buffer (one port) */
++      uint   rbuf1len;          /* Replacement len (one port) */
++      char   rbufa[16];         /* Replacement buffer (all ports) */
++      uint   rbufalen;          /* Replacement len (all ports) */
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++      union nf_inet_addr newip;
++#else
++      u_int32_t  newip;
++#endif
++      u_int16_t loport, hiport;
++      uint      off = 0;
++      uint      diff;            /* Number of bytes we removed */
++
++      struct nf_conn *ct = rtp_exp->master;
++      /* struct nf_conn *ct = nf_ct_get(skb, &ctinfo); */
++      struct nf_conntrack_tuple *rtp_t;
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++      char szextaddr[INET6_ADDRSTRLEN];
++#else
++      char szextaddr[INET_ADDRSTRLEN];
++#endif
++      uint extaddrlen;
++      int  is_stun;
++
++      get_skb_tcpdata(skb, &ptcp, &tcplen);
++      ptran = ptcp+tranoff;
++
++      if (tranoff+tranlen > tcplen || tcplen-tranoff < tranlen ||
++          tranlen < 10 || !iseol(ptran[tranlen-1]) ||
++          nf_strncasecmp(ptran, "Transport:", 10) != 0) {
++              pr_info("sanity check failed\n");
++              return 0;
++      }
++      off += 10;
++      SKIP_WSPACE(ptcp+tranoff, tranlen, off);
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++      newip = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3;
++      rtp_t = &rtp_exp->tuple;
++      rtp_t->dst.u3 = newip;
++      if (rtcp_exp) {
++              rtcp_exp->tuple.dst.u3 = newip;
++      }
++      extaddrlen = rtsp_sprintf_addr(ct, szextaddr, &newip, true); // FIXME handle extip
++      pr_debug("stunaddr=%s (auto)\n", szextaddr);
++#else
++      newip = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip;
++      rtp_t = &rtp_exp->tuple;
++      rtp_t->dst.u3.ip = newip;
++      if (rtcp_exp) {
++              rtcp_exp->tuple.dst.u3.ip = newip;
++      }
++      extaddrlen = extip ? sprintf(szextaddr, "%pI4", &extip)
++                         : sprintf(szextaddr, "%pI4", &newip);
++      pr_debug("stunaddr=%s (%s)\n", szextaddr, (extip?"forced":"auto"));
++#endif
++      hiport = 0;
++      rbuf1len = rbufalen = 0;
++      switch (prtspexp->pbtype) {
++      case pb_single:
++              for (loport = prtspexp->loport; loport != 0; loport++) { /* XXX: improper wrap? */
++                      rtp_t->dst.u.udp.port = htons(loport);
++                      if (nf_ct_expect_related(rtp_exp) == 0) {
++                              pr_debug("using port %hu\n", loport);
++                              break;
++                      }
++              }
++              if (loport != 0) {
++                      rbuf1len = sprintf(rbuf1, "%hu", loport);
++                      rbufalen = sprintf(rbufa, "%hu", loport);
++              }
++              break;
++      case pb_range:
++              for (loport = prtspexp->loport; loport != 0; loport += 2) { /* XXX: improper wrap? */
++                      rtp_t->dst.u.udp.port = htons(loport);
++                      if (nf_ct_expect_related(rtp_exp) != 0) {
++                              continue;
++                      }
++                      hiport = loport + 1;
++                      rtcp_exp->tuple.dst.u.udp.port = htons(hiport);
++                      if (nf_ct_expect_related(rtcp_exp) != 0) {
++                              nf_ct_unexpect_related(rtp_exp);
++                              continue;
++                      }
++
++                      /* FIXME: invalid print in case of ipv6 */
++                      pr_debug("nat expect_related %pI4:%u-%u-%pI4:%u-%u\n",
++                               &rtp_exp->tuple.src.u3.ip,
++                               ntohs(rtp_exp->tuple.src.u.udp.port),
++                               ntohs(rtcp_exp->tuple.src.u.udp.port),
++                               &rtp_exp->tuple.dst.u3.ip,
++                               ntohs(rtp_exp->tuple.dst.u.udp.port),
++                               ntohs(rtcp_exp->tuple.dst.u.udp.port));
++                      break;
++              }
++              if (loport != 0) {
++                      rbuf1len = sprintf(rbuf1, "%hu", loport);
++                      rbufalen = sprintf(rbufa, "%hu-%hu", loport, hiport);
++              }
++              break;
++      case pb_discon:
++              for (loport = prtspexp->loport; loport != 0; loport++) { /* XXX: improper wrap? */
++                      rtp_t->dst.u.udp.port = htons(loport);
++                      if (nf_ct_expect_related(rtp_exp) == 0) {
++                              pr_debug("using port %hu (1 of 2)\n", loport);
++                              break;
++                      }
++              }
++              for (hiport = prtspexp->hiport; hiport != 0; hiport++) { /* XXX: improper wrap? */
++                      rtp_t->dst.u.udp.port = htons(hiport);
++                      if (nf_ct_expect_related(rtp_exp) == 0) {
++                              pr_debug("using port %hu (2 of 2)\n", hiport);
++                              break;
++                      }
++              }
++              if (loport != 0 && hiport != 0) {
++                      rbuf1len = sprintf(rbuf1, "%hu", loport);
++                      rbufalen = sprintf(rbufa, hiport == loport+1 ?
++                                         "%hu-%hu":"%hu/%hu", loport, hiport);
++              }
++              break;
++      }
++
++      if (rbuf1len == 0)
++              return 0;   /* cannot get replacement port(s) */
++
++      /* Transport: tran;field;field=val,tran;field;field=val,...
++         `off` is set to the start of Transport value from start of line
++      */
++      while (off < tranlen) {
++              uint        saveoff;
++              const char* pparamend;
++              uint        nextparamoff;
++
++              pparamend = memchr(ptran+off, ',', tranlen-off);
++              pparamend = (pparamend == NULL) ? ptran+tranlen : pparamend+1;
++              nextparamoff = pparamend-ptran;
++
++              /*
++               * We pass over each param twice.  On the first pass, we look for a
++               * destination= field.  It is handled by the security policy.  If it
++               * is present, allowed, and equal to our external address, we assume
++               * that STUN is being used and we leave the client_port= field alone.
++               */
++              is_stun = 0;
++              saveoff = off;
++              while (off < nextparamoff) {
++                      const char* pfieldend;
++                      uint        nextfieldoff;
++
++                      pfieldend = memchr(ptran+off, ';', nextparamoff-off);
++                      nextfieldoff = (pfieldend == NULL) ? nextparamoff : pfieldend-ptran+1;
++
++                      if (dstact != DSTACT_NONE && strncmp(ptran+off, "destination=", 12) == 0) {
++                              if (strncmp(ptran+off+12, szextaddr, extaddrlen) == 0)
++                                      is_stun = 1;
++
++                              if (dstact == DSTACT_STRIP || (dstact == DSTACT_AUTO && !is_stun)) {
++                                      uint dstoff = (ptran-ptcp)+off;
++                                      uint dstlen = nextfieldoff-off;
++                                      char* pdstrep = NULL;
++                                      uint dstreplen = 0;
++                                      diff = dstlen;
++                                      if (dstact == DSTACT_AUTO && !is_stun) {
++                                              pr_debug("RTSP: replace dst addr\n");
++                                              dstoff += 12;
++                                              dstlen -= 13;
++                                              pdstrep = szextaddr;
++                                              dstreplen = extaddrlen;
++                                              diff = nextfieldoff-off-13-extaddrlen;
++                                      }
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++                                      if (!nf_nat_mangle_tcp_packet(skb, ct, ctinfo, protoff,
++                                                                    dstoff, dstlen, pdstrep, dstreplen)) {
++#else
++                                      if (!nf_nat_mangle_tcp_packet(skb, ct, ctinfo,
++                                                                    dstoff, dstlen, pdstrep, dstreplen)) {
++#endif
++                                              /* mangle failed, all we can do is bail */
++                                              nf_ct_unexpect_related(rtp_exp);
++                                              if (rtcp_exp)
++                                                      nf_ct_unexpect_related(rtcp_exp);
++                                              return 0;
++                                      }
++                                      get_skb_tcpdata(skb, &ptcp, &tcplen);
++                                      ptran = ptcp+tranoff;
++                                      tranlen -= diff;
++                                      nextparamoff -= diff;
++                                      nextfieldoff -= diff;
++                              }
++                      }
++
++                      off = nextfieldoff;
++              }
++
++              if (is_stun)
++                      continue;
++
++              off = saveoff;
++              while (off < nextparamoff) {
++                      const char* pfieldend;
++                      uint        nextfieldoff;
++
++                      pfieldend = memchr(ptran+off, ';', nextparamoff-off);
++                      nextfieldoff = (pfieldend == NULL) ? nextparamoff : pfieldend-ptran+1;
++
++                      if (strncmp(ptran+off, "client_port=", 12) == 0) {
++                              u_int16_t port;
++                              uint      numlen;
++                              uint      origoff;
++                              uint      origlen;
++                              char*     rbuf = rbuf1;
++                              uint      rbuflen = rbuf1len;
++
++                              off += 12;
++                              origoff = (ptran-ptcp)+off;
++                              origlen = 0;
++                              numlen = nf_strtou16(ptran+off, &port);
++                              off += numlen;
++                              origlen += numlen;
++                              if (port != prtspexp->loport) {
++                                      pr_debug("multiple ports found, port %hu ignored\n", port);
++                              } else {
++                                      if (ptran[off] == '-' || ptran[off] == '/') {
++                                              off++;
++                                              origlen++;
++                                              numlen = nf_strtou16(ptran+off, &port);
++                                              off += numlen;
++                                              origlen += numlen;
++                                              rbuf = rbufa;
++                                              rbuflen = rbufalen;
++                                      }
++
++                                      /*
++                                       * note we cannot just memcpy() if the sizes are the same.
++                                       * the mangle function does skb resizing, checks for a
++                                       * cloned skb, and updates the checksums.
++                                       *
++                                       * parameter 4 below is offset from start of tcp data.
++                                       */
++                                      diff = origlen-rbuflen;
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++                                      if (!nf_nat_mangle_tcp_packet(skb, ct, ctinfo, protoff,
++                                                                    origoff, origlen, rbuf, rbuflen)) {
++#else
++                                      if (!nf_nat_mangle_tcp_packet(skb, ct, ctinfo,
++                                                                    origoff, origlen, rbuf, rbuflen)) {
++#endif
++                                              /* mangle failed, all we can do is bail */
++                                              nf_ct_unexpect_related(rtp_exp);
++                                              if (rtcp_exp)
++                                                      nf_ct_unexpect_related(rtcp_exp);
++                                              return 0;
++                                      }
++                                      get_skb_tcpdata(skb, &ptcp, &tcplen);
++                                      ptran = ptcp+tranoff;
++                                      tranlen -= diff;
++                                      nextparamoff -= diff;
++                                      nextfieldoff -= diff;
++                              }
++                      }
++
++                      off = nextfieldoff;
++              }
++
++              off = nextparamoff;
++      }
++
++      return 1;
++}
++
++static uint
++help_out(struct sk_buff *skb, enum ip_conntrack_info ctinfo,
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++       unsigned int protoff,
++#endif
++       unsigned int matchoff, unsigned int matchlen,
++       struct ip_ct_rtsp_expect* prtspexp,
++       struct nf_conntrack_expect* rtp_exp,
++       struct nf_conntrack_expect* rtcp_exp)
++{
++      char* ptcp;
++      uint  tcplen;
++      uint  hdrsoff;
++      uint  hdrslen;
++      uint  lineoff;
++      uint  linelen;
++      uint  off;
++      int   dir = CTINFO2DIR(ctinfo);
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++      union nf_inet_addr saddr = rtp_exp->master->tuplehash[dir].tuple.src.u3;
++#else
++      __be32 saddr = rtp_exp->master->tuplehash[dir].tuple.src.u3.ip;
++#endif
++
++      //struct iphdr* iph = (struct iphdr*)(*pskb)->nh.iph;
++      //struct tcphdr* tcph = (struct tcphdr*)((void*)iph + iph->ihl*4);
++
++      get_skb_tcpdata(skb, &ptcp, &tcplen);
++      hdrsoff = matchoff;//exp->seq - ntohl(tcph->seq);
++      hdrslen = matchlen;
++      off = hdrsoff;
++      pr_debug("NAT rtsp help_out\n");
++
++      while (nf_mime_nextline(ptcp, hdrsoff+hdrslen, &off, &lineoff, &linelen)) {
++              if (linelen == 0)
++                      break;
++
++              if (off > hdrsoff+hdrslen) {
++                      pr_info("!! overrun !!");
++                      break;
++              }
++              pr_debug("hdr: len=%u, %.*s", linelen, (int)linelen, ptcp+lineoff);
++
++              if (nf_strncasecmp(ptcp+lineoff, "Transport:", 10) == 0) {
++                      uint oldtcplen = tcplen;
++                      pr_debug("hdr: Transport\n");
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++                      if (!rtsp_mangle_tran(ctinfo, protoff, rtp_exp, rtcp_exp,
++                                            prtspexp, skb, lineoff, linelen)) {
++#else
++                      if (!rtsp_mangle_tran(ctinfo, rtp_exp, rtcp_exp, prtspexp,
++                                            skb, lineoff, linelen)) {
++#endif
++                              pr_debug("hdr: Transport mangle failed");
++                              break;
++                      }
++                      rtp_exp->expectfn = nf_nat_rtsp_expected;
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++                      rtp_exp->saved_addr = saddr;
++#else
++                      rtp_exp->saved_ip = saddr;
++#endif
++                      rtp_exp->saved_proto.udp.port = htons(prtspexp->loport);
++                      rtp_exp->dir = !dir;
++                      if (rtcp_exp) {
++                              rtcp_exp->expectfn = nf_nat_rtsp_expected;
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++                              rtcp_exp->saved_addr = saddr;
++#else
++                              rtcp_exp->saved_ip = saddr;
++#endif
++                              rtcp_exp->saved_proto.udp.port = htons(prtspexp->hiport);
++                              rtcp_exp->dir = !dir;
++                      }
++                      get_skb_tcpdata(skb, &ptcp, &tcplen);
++                      hdrslen -= (oldtcplen-tcplen);
++                      off -= (oldtcplen-tcplen);
++                      lineoff -= (oldtcplen-tcplen);
++                      linelen -= (oldtcplen-tcplen);
++                      pr_debug("rep: len=%u, %.*s", linelen, (int)linelen, ptcp+lineoff);
++              }
++      }
++
++      return NF_ACCEPT;
++}
++
++static unsigned int
++nf_nat_rtsp(struct sk_buff *skb, enum ip_conntrack_info ctinfo,
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++          unsigned int protoff,
++#endif
++          unsigned int matchoff, unsigned int matchlen,
++          struct ip_ct_rtsp_expect* prtspexp,
++          struct nf_conntrack_expect* rtp_exp,
++          struct nf_conntrack_expect* rtcp_exp)
++{
++      int dir = CTINFO2DIR(ctinfo);
++      int rc = NF_ACCEPT;
++
++      switch (dir) {
++      case IP_CT_DIR_ORIGINAL:
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++              rc = help_out(skb, ctinfo, protoff, matchoff, matchlen, prtspexp,
++                            rtp_exp, rtcp_exp);
++#else
++              rc = help_out(skb, ctinfo, matchoff, matchlen, prtspexp,
++                            rtp_exp, rtcp_exp);
++#endif
++              break;
++      case IP_CT_DIR_REPLY:
++              pr_debug("unmangle ! %u\n", ctinfo);
++              /* XXX: unmangle */
++              rc = NF_ACCEPT;
++              break;
++      }
++      //UNLOCK_BH(&ip_rtsp_lock);
++
++      return rc;
++}
++
++static void nf_nat_rtsp_expected(struct nf_conn* ct, struct nf_conntrack_expect *exp)
++{
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0) || LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++      struct nf_nat_range range;
++#else
++      struct nf_nat_ipv4_range range;
++#endif
++
++      /* This must be a fresh one. */
++      BUG_ON(ct->status & IPS_NAT_DONE_MASK);
++
++      /* For DST manip, map port here to where it's expected. */
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++      range.min_proto = range.max_proto = exp->saved_proto;
++      range.min_addr = range.max_addr = exp->saved_addr;
++#else
++      range.min = range.max = exp->saved_proto;
++      range.min_ip = range.max_ip = exp->saved_ip;
++#endif
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)
++      range.flags = (NF_NAT_RANGE_MAP_IPS | NF_NAT_RANGE_PROTO_SPECIFIED);
++      nf_nat_setup_info(ct, &range, NF_NAT_MANIP_DST);
++#else
++      range.flags = (IP_NAT_RANGE_MAP_IPS | IP_NAT_RANGE_PROTO_SPECIFIED);
++      nf_nat_setup_info(ct, &range, IP_NAT_MANIP_DST);
++#endif
++
++      /* Change src to where master sends to, but only if the connection
++       * actually came from the same source. */
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++      if (nf_inet_addr_cmp(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3,
++                           &ct->master->tuplehash[exp->dir].tuple.src.u3)) {
++              range.min_addr = range.max_addr
++                      = ct->master->tuplehash[!exp->dir].tuple.dst.u3;
++#else
++      if (ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip ==
++          ct->master->tuplehash[exp->dir].tuple.src.u3.ip) {
++              range.min_ip = range.max_ip
++                      = ct->master->tuplehash[!exp->dir].tuple.dst.u3.ip;
++#endif
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)
++              range.flags = NF_NAT_RANGE_MAP_IPS;
++              nf_nat_setup_info(ct, &range, NF_NAT_MANIP_SRC);
++#else
++              range.flags = IP_NAT_RANGE_MAP_IPS;
++              nf_nat_setup_info(ct, &range, IP_NAT_MANIP_SRC);
++#endif
++      }
++}
++
++
++static void __exit fini(void)
++{
++      rcu_assign_pointer(nf_nat_rtsp_hook, NULL);
++      synchronize_net();
++}
++
++static int __init init(void)
++{
++      printk("nf_nat_rtsp v" IP_NF_RTSP_VERSION " loading\n");
++
++      BUG_ON(nf_nat_rtsp_hook);
++      rcu_assign_pointer(nf_nat_rtsp_hook, nf_nat_rtsp);
++
++      if (stunaddr != NULL)
++              extip = in_aton(stunaddr);
++
++      if (destaction != NULL) {
++              if (strcmp(destaction, "auto") == 0)
++                      dstact = DSTACT_AUTO;
++
++              if (strcmp(destaction, "strip") == 0)
++                      dstact = DSTACT_STRIP;
++
++              if (strcmp(destaction, "none") == 0)
++                      dstact = DSTACT_NONE;
++      }
++
++      return 0;
++}
++
++module_init(init);
++module_exit(fini);
+--- a/extensions/Kbuild
++++ b/extensions/Kbuild
+@@ -26,6 +26,7 @@ obj-${build_lscan}       += xt_lscan.o
+ obj-${build_pknock}      += pknock/
+ obj-${build_psd}         += xt_psd.o
+ obj-${build_quota2}      += xt_quota2.o
++obj-${build_rtsp}        += rtsp/
+ -include ${M}/*.Kbuild
+ -include ${M}/Kbuild.*
+--- a/mconfig
++++ b/mconfig
+@@ -22,3 +22,4 @@ build_lscan=m
+ build_pknock=m
+ build_psd=m
+ build_quota2=m
++build_rtsp=m
diff --git a/net/xtables-addons/patches/200-add-lua-packetscript.patch b/net/xtables-addons/patches/200-add-lua-packetscript.patch
new file mode 100644 (file)
index 0000000..33d0d74
--- /dev/null
@@ -0,0 +1,18158 @@
+--- /dev/null
++++ b/extensions/LUA/byte_array.c
+@@ -0,0 +1,145 @@
++/*
++ *    Copyright (C) 2010 University of Basel <http://cn.cs.unibas.ch/>
++ *    by Andre Graf <andre@dergraf.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, see <http://www.gnu.org/licenses/>.
++ */
++#include "controller.h"
++
++/* Initialization helper function. This function should be used whenever
++ * a new byte array need to be initialized. Depending on the arguments it
++ * initializes the array in a different way. Have a look at the inline
++ * comments */
++lua_packet_segment * init_byte_array(lua_State *L, unsigned char * start, int length, int do_copy)
++{
++      lua_packet_segment *array;
++
++      if (length < 0)
++              luaL_error(L, "init_byte_array, requested size < 0");
++
++      if (start && do_copy) {
++              /* we have a start address where we copy from */
++              array = lua_newuserdata(L, sizeof(lua_packet_segment) + length);
++              array->start = (unsigned char *)array + sizeof(lua_packet_segment); /* aligning pointer */
++              memcpy(array->start, start, length);
++      }else if (start && !do_copy) {
++              /* just link the start pointer, in this case you have to free the memory yourself */
++              array = lua_newuserdata(L, sizeof(lua_packet_segment));
++              array->start = start;
++      }else{
++              /* create an empty array, fully managed by Lua */
++              array = lua_newuserdata(L, sizeof(lua_packet_segment) + length);
++              array->start = (unsigned char *)array + sizeof(lua_packet_segment); /* aligning pointer */
++              memset(array->start, 0, length);
++      }
++
++      array->length = length;
++      array->offset = 0;
++      array->changes = NULL;
++
++      luaL_getmetatable(L, LUA_BYTE_ARRAY);
++      lua_setmetatable(L, -2);
++
++      return array;
++}
++
++
++
++/* LUA_API: get one byte of the given byte array 
++ * access-pattern: array[<index>] */
++static int32_t get_byte_array(lua_State *L)
++{
++      lua_packet_segment * array = checkbytearray(L, 1);
++      int32_t index = luaL_checkinteger(L, 2); /* array starts with index 0 (not 1 as usual in Lua) */
++
++      luaL_argcheck(L, 0 <= index && index < array->length, 1, "index out of range");
++      lua_pushinteger(L, (array->start + array->offset)[index]);
++
++      return 1;
++}
++
++/* LUA_API: set one byte of the given byte array
++ * access-pattern: array[<index>]= 0xFF */
++static int32_t set_byte_array(lua_State *L)
++{
++      lua_packet_segment * array = checkbytearray(L, 1);
++      uint8_t byte;
++      int32_t index = luaL_checkinteger(L, 2);    /* array starts with index 0 (not 1 as usual in Lua) */
++      int32_t val = luaL_checkinteger(L, 3);
++      uint32_t  nob = 1 << CHAR_BIT;               /* we should use something like 1 << CHAR_BIT */
++
++      luaL_argcheck(L, 0 <= index && index < array->length, 1, "index out of range");
++      luaL_argcheck(L, 0 <= val && val < nob, 2, "cannot cast value to char");
++
++      byte = (uint8_t)val;
++
++      (array->start + array->offset)[index] = byte;
++
++      return 0;
++}
++
++/* LUA_API: get size of the given byte array
++ * access-pattern: #array (__length meta-method) */
++static int32_t get_byte_array_size(lua_State *L)
++{
++      lua_packet_segment * array = checkbytearray(L, 1);
++
++      lua_pushnumber(L, array->length);
++
++      return 1;
++}
++
++
++/* LUA_API: converts a given byte array to a string. 
++ * access-pattern: implicit through functions calling the
++ * __to_string() metamethod , e.g. print32_t */
++static int32_t byte_array_to_string(lua_State *L)
++{
++      lua_packet_segment * array = checkbytearray(L, 1);
++      uint8_t buf[(array->length * 3) + 255];
++      uint8_t hexval[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
++      char res[255 + (array->length * 3)]; /* make sure the buffer is big enough*/
++      int32_t i, n;
++      uint8_t *ptr = array->start + array->offset;
++
++      for (i = 0; i < array->length; i++) {
++              buf[i * 3] = hexval[(ptr[i] >> 4) & 0xF];
++              buf[(i * 3) + 1] = hexval[ptr[i] & 0x0F];
++              buf[(i * 3) + 2] = ' '; /* seperator */
++      }
++
++      buf[array->length * 3] = '\0';
++      n = sprintf(res, "byte_array: length: %d  value: %s", array->length, buf);
++
++      lua_pushlstring(L, res, n);
++
++      return 1;
++}
++
++static const struct luaL_Reg bytearray_lib_m [] = {
++      { "__len",      get_byte_array_size  },
++      { "__newindex", set_byte_array       },
++      { "__index",    get_byte_array       },
++      { "__tostring", byte_array_to_string },
++      { NULL,         NULL                 }
++};
++
++void luaopen_bytearraylib(lua_State *L)
++{
++      luaL_newmetatable(L, LUA_BYTE_ARRAY);
++      luaL_register(L, NULL, bytearray_lib_m);
++      lua_pop(L, 1);
++}
++
++
+--- /dev/null
++++ b/extensions/LUA/controller.c
+@@ -0,0 +1,604 @@
++/*
++ *    Copyright (C) 2010 University of Basel <http://cn.cs.unibas.ch/>
++ *    by Andre Graf <andre@dergraf.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, see <http://www.gnu.org/licenses/>.
++ */
++
++#if defined(__KERNEL__)
++      #include <linux/mm.h>
++#endif
++#include "controller.h"
++
++/* the array 'supported_protocols' holds all pointers to the 
++ * static and dynamic protocol buffers. It is filled by the 
++ * call to register_protbuf */
++static struct protocol_buf * supported_protocols[MAX_NR_OF_PROTOCOLS];
++
++/* C_API: the function 'get_protocol_buf' returns the pointer 
++ * to the protocol buffer of a given protocol id. */
++struct protocol_buf * get_protocol_buf(uint32_t  protocol_id)
++{
++      return (struct protocol_buf *)supported_protocols[protocol_id];
++}
++
++
++/* LUA_INT: the function 'gc_packet_segment' is triggered by the 
++ * garbage collector whenever a userdata annotated with one of 
++ * the protocol buffer metatable should be collected. */
++static int32_t gc_packet_segment(lua_State *L)
++{
++      lua_packet_segment * seg = (lua_packet_segment *)lua_touserdata(L, 1);
++      if (seg && seg->changes) {
++              seg->changes->ref_count--;
++              if (seg->changes->ref_count <= 0) {
++                      kfree(seg->changes->field_length_changes);
++                      kfree(seg->changes->field_offset_changes);
++                      kfree(seg->changes);
++                      seg->changes = NULL;
++              }
++      }
++      return 0;
++}
++
++
++/* LUA_API: the function 'set_raw' is used to set the bytes of a segment 
++ * in 'raw' mode. The function is per default available in each protocol 
++ * buffer until it gets overridden by a specific setter function inside 
++ * a protocol buffer.
++ * 
++ * Parameters:
++ * 1. lua_packet_segment (implicit)
++ * 2. int32_t byte_value
++ *
++ * Upvalues:
++ * 1.  struct protocol_buf*
++ * 2.  int32_t field index, not used in this function
++ *
++ * Return: void
++ */
++static int32_t set_raw(lua_State *L)
++{
++      int32_t i;
++      uint32_t  nob;
++      uint8_t byte;
++      uint8_t *ptr;
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++
++      int32_t val = luaL_checkinteger(L, 2);
++
++      nob = 1 << CHAR_BIT;
++
++      luaL_argcheck(L, 0 <= val && val < nob, 2, "cannot cast value to char");
++
++      byte = (uint8_t)val;
++      ptr = seg->start + seg->offset;
++
++      for (i = 0; i < seg->length; i++)
++              ptr[i] = byte;
++
++      return 0;
++}
++
++/* LUA_API: the function 'get_raw' is used to get the bytes of a segment 
++ * in 'raw' mode. The function is per default available in each protocol 
++ * buffer until it gets overridden by a specific getter function inside 
++ * a protocol buffer.
++ *
++ * Parameters:
++ * 1. lua_packet_segment (implicit)
++ * 2. uint32_t  offset
++ * 3. uint32_t  length 
++ *
++ * Upvalues:
++ * 1.  struct protocol_buf*
++ * 2.  int32_t field index, not used in this function
++ *
++ * Return: 
++ * the byte array representing the given array
++ */
++static int32_t get_raw(lua_State *L)
++{
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++
++      init_byte_array(L, seg->start + seg->offset,  seg->length, 1);
++
++      return 1;
++}
++/* LUA_API: The function 'get_segment' is used to get a new segment in 'raw' mode. 
++ * Typically this function is applied on another raw segment in order 
++ * to extract a part of the segment as new segment.
++ *
++ * Parameters:
++ * 1.  lua_packet_segment, implicit through object oriented access seg:raw(..)
++ * 2.  uint32_t  offset, this indicates where to start the new segment, see e.g below.
++ * 3.  uint32_t  length, this indicates the size of the new segment
++ *
++ * Upvalues:
++ * 1.  struct protocol_buf*
++ * 2.  int32_t field index, not used in this function
++ *
++ * Return:
++ * 1.  A lua_packet_segment annotated with the according metatable or False in
++ *     case the input data is not valid
++ *
++ * Example:
++ *
++ * +------------------------+---------------------------------------+
++ * | function call          | resulting lua_packet_segment          |
++ * +========================+===+===+===+===+===+===+===+===+===+===+
++ * | seg = packet:raw(0,10) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
++ * +------------------------+---+---+---+---+---+---+---+---+---+---+
++ * | 1st_half = seg:raw(0,5)| 0 | 1 | 2 | 3 | 4 |                   |
++ * +------------------------+---+---+---+---+---+---+---+---+---+---+
++ * | 2nd_half = seg:raw(5,5)|                   | 5 | 6 | 7 | 8 | 9 |
++ * +------------------------+-------------------+---+---+---+---+---+
++ */
++static int32_t get_segment(lua_State *L)
++{
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++      uint32_t  offset = luaL_checkinteger(L, 2);
++      uint32_t  length = luaL_checkinteger(L, 3);
++      lua_packet_segment * new = (lua_packet_segment *)lua_newuserdata(L, sizeof(lua_packet_segment));
++
++      new->start = seg->start;
++      new->offset = seg->offset + offset;
++      new->changes = NULL;
++      /* we allow a seg->length == 0 , this enables processing packets where the packetsize is not fixed (0 = not fixed)*/
++      if (seg->length != 0 && length > seg->length) {
++              lua_pushboolean(L, 0);
++              return 1;
++      }
++
++      new->length = length;
++      luaL_getmetatable(L, prot_buf->name);
++      lua_setmetatable(L, -2);
++
++      return 1;
++}
++
++/* LUA_API: the function 'get_segment_size' is used to get the size of a segment.
++ * 
++ * Parameters:
++ * 1.  lua_packet_segment, implicit through object oriented access seg:raw(..)
++ *
++ * Upvalues:
++ * 1.  struct protocol_buf*
++ * 2.  int32_t field index, not used in this function
++ *
++ * Return:
++ * 1.  Size as lua_Number
++ */
++static int32_t get_segment_size(lua_State *L)
++{
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++
++      lua_pushnumber(L, seg->length);
++      return 1;
++}
++
++/* LUA_API: the function 'get_segment_offset' is used to get the real offset 
++ * of a segment. This function returns the offset of the segment to the start
++ * of the buffer. This means the following
++ *     seg1 = packet:raw(2,10)
++ *     seg2 = seg1:raw(3,5)
++ *   offset = seg2:get_offset()
++ *
++ * will give an offset of 5, since the seg1 starts at offset 2, and seg2 starts
++ * at offset (seg1:get_offset() + 3).
++ * 
++ * Parameters:
++ * 1.  lua_packet_segment, implicit through object oriented access seg:raw(..)
++ *
++ * Upvalues:
++ * 1.  struct protocol_buf*
++ * 2.  int32_t field index, not used in this function
++ *
++ * Return:
++ * 1.  Offset as lua_Number
++ */
++static int32_t get_segment_offset(lua_State *L)
++{
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++
++      lua_pushnumber(L, seg->offset);
++      return 1;
++}
++
++/* LUA_API: overwrites the __tostring function of a lua_packet_segment.
++ * this will print32_t a nicely formated string, including length,
++ * offset and name of the protocol buffer.
++ *
++ * Parameters:
++ * 1. lua_packet_segment (implicit)
++ *
++ * Returns:
++ * 1. the representing string
++ */
++static int32_t packet_segment_tostring(lua_State *L)
++{
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++      int32_t n;
++      char buf[128];
++
++      n = sprintf(buf, "type: %s, offset: %d, length: %d", prot_buf->name, seg->offset, seg->length);
++      lua_pushlstring(L, buf, n);
++
++      return 1;
++}
++
++
++static const struct luaL_Reg seg_access_functions [] = {
++      { "set",        set_raw                 },
++      { "get",        get_raw                 },
++      { "raw",        get_segment             },
++      { "get_offset", get_segment_offset      },
++      { "get_size",   get_segment_size        },
++      { "to_bytes",   get_raw                 },
++      { "__tostring", packet_segment_tostring },
++      { "__gc",       gc_packet_segment       },
++      { NULL,         NULL                    }
++};
++
++/* C_API: the function 'get_metatable_from_protocol_type' is a helper
++ * used in controller.c as well as it may find usage in the static 
++ * protocol buffers and byte array implementation. */
++void get_metatable_from_protocol_type(lua_State *L, int32_t type)
++{
++      char * table;
++      lua_getglobal(L, SUPPORTED_PROTOCOL_TABLE);
++      lua_rawgeti(L, -1, type);
++      table = (char *)luaL_checkstring(L, -1);
++      lua_pop(L, 2); /* pop the table SUPPORTED_PROTOCOL_TABLE and the string pushed by lua_gettable */
++      luaL_getmetatable(L, table);
++      return;
++}
++
++/* C_INT: the function 'payload_contains_protocol' is used internally. 
++ * Depending if static or dynamic protocol buffer it calls the right
++ * validation function. */
++static int32_t payload_contains_protocol(lua_State *L, struct protocol_buf *prot_buf, lua_packet_segment *seg, uint32_t  prot_type)
++{
++      if (prot_buf->is_dynamic)
++              return has_protocol_dynamic(L, prot_buf, seg, prot_type);
++      else
++              return prot_buf->has_protocol(L, prot_buf, seg, prot_type);
++}
++
++/* C_INT: the function 'protocol_get_field_changes' is used interally. 
++ * It requests the field_changes struct calling the protocol buffers
++ * 'get_field_changes' function. This funciton is called, whenever
++ * the payload field with a given protocol type is requested inside 
++ * the function 'get_protocol_field' */
++static struct field_changes * protocol_get_field_changes(lua_State *L, struct protocol_buf *prot_buf, lua_packet_segment * seg)
++{
++      struct field_changes * changes = NULL;
++
++      if (prot_buf->get_field_changes) {
++              if (prot_buf->is_dynamic)
++                      changes = get_field_changes_dynamic(L, prot_buf, seg);
++              else
++                      changes = prot_buf->get_field_changes(L, seg);
++               /* is already 1 when set by helper 'get_allocated_field_changes,
++                * since not every prot_buf may use this function we enforce it. */
++              changes->ref_count = 1;
++      }
++      return changes;
++}
++
++/* C_INT: the function 'get_field_offset_in_bytes' wrapps the logic of 
++ * calculating the new length with considering the optional field_changes. */
++static int32_t get_field_offset_in_bytes(struct protocol_field * field, lua_packet_segment * seg, int32_t field_index)
++{
++      uint32_t  nr_of_bits, nr_of_bytes, field_offset;
++
++      field_offset = field->offset;
++      /* do we need to manipulate the default values stored inside the protocol buffer ?? */
++      if (seg->changes)
++              field_offset += seg->changes->field_offset_changes[field_index];
++      /* how many bits remain */
++      nr_of_bits = field_offset & (CHAR_BIT - 1);
++      /* assuming CHAR_BIT == 2 ^ 3 */
++      nr_of_bytes = (field_offset - nr_of_bits) >> 3;
++
++      return seg->offset + nr_of_bytes;
++}
++
++/* C_INT: the function 'get_field_length_in_bytes' wrapps the logic of 
++ * calculating the new offset with considering the optional field_changes. */
++static int32_t get_field_length_in_bytes(struct protocol_field * field, lua_packet_segment * seg, int32_t field_index)
++{
++      uint32_t  nr_of_bits, nr_of_bytes, field_length;
++
++      field_length = field->length;
++      /* if the field length is smaller than 1 byte, we take the size of one byte
++       * we treat the case where field_length == 0 in a special way ...*/
++      if (field_length < CHAR_BIT && field_length > 0)
++              field_length = CHAR_BIT;
++
++      /* do we need to manipulate the default values stored inside the protocol buffer ?? */
++      if (seg->changes)
++              field_length += seg->changes->field_length_changes[field_index];
++      /* how many bits remain */
++      nr_of_bits = field_length & (CHAR_BIT - 1);
++      /* assuming CHAR_BIT == 2 ^ 3 */
++      nr_of_bytes = (field_length - nr_of_bits) >> 3;
++      return nr_of_bytes;
++}
++
++/* C_INT: the function 'initialize_field_getter_and_setter' initializes 
++ * the setter and getter function of the field, considering the optional
++ * field manipulator functions defined inside the protocol buffers. */
++static void initialize_field_getter_and_setter(lua_State *L, struct protocol_buf *prot_buf, int32_t field_index)
++{
++      /* lets check if there is a metatable on top of the stack */
++      struct protocol_field * f = (struct protocol_field *)&prot_buf->protocol_fields[field_index];
++
++      if (!lua_istable(L, -1)) luaL_error(L, "cannot initialize getter and setter for field %s->%s, "
++                                          "not a table on top of the stack, is '%s'", prot_buf->name, f->name, lua_typename(L, lua_type(L, -1)));
++
++      /* is there a 'getter' to initialize ? */
++      lua_pushlightuserdata(L, prot_buf);     /* push upvalue 1 */
++      lua_pushinteger(L, field_index);        /* push upvalue 2 */
++      if (f->get) {
++              if (prot_buf->is_dynamic)
++                      lua_pushcclosure(L, field_dynamic_getter, 2);
++              else
++                      lua_pushcclosure(L, f->get, 2);
++      }else
++              /* there is no specific getter defined - fall back to 'get_raw'  */
++              lua_pushcclosure(L, get_raw, 2);
++       /* set the metatable field 'get' */
++      lua_setfield(L, -2, "get");
++
++      /* is there a 'setter' to initialize ? */
++      lua_pushlightuserdata(L, prot_buf);     /* push upvalue 1 */
++      lua_pushinteger(L, field_index);        /* push upvalue 2 */
++      if (f->set) {
++              if (prot_buf->is_dynamic)
++                      lua_pushcclosure(L, field_dynamic_setter, 2);
++              else
++                      lua_pushcclosure(L, f->set, 2);
++      }else
++              /* there is no specific setter defined - fall back to 'set_raw'  */
++              lua_pushcclosure(L, set_raw, 2);
++       /* set the metatable field 'set' */
++      lua_setfield(L, -2, "set");
++}
++
++/* LUA_API: 'get_protocol_field' is used in Lua as a closure for each field of a protocol
++ * buffer. E.g a call to ip = packet:data(packet_ip) will go to this function,
++ * and trigger the conversion of the raw packet to a ip packet. Each call
++ * to a field function of an IP packet, like ip:daddr() uses this function
++ * to to return the right data. In each case you will end up either with a
++ * new packet segment (annotated with the proper metatable) or a boolean
++ * value (False) if something went wrong. In the case everything went fine,
++ * the newly created lua_packet_segment is annotated with the proper
++ * metatable where the fields get and set also contain the specific getter
++ * and setter functions given by the protocol buffer. E.g. the function call
++ * ip:daddr():get() or ip:daddr():set(...) will call the proper function
++ * defined inside the corresponding field definition.
++ *
++ * Parameters:
++ * 1.  lua_packet_segment, implicit through object oriented access seg:raw(..)
++ * 2.  type of the protocol buffer, optional, and only used if the accessed
++ *     field is the payload field. If a type is provided for the access of the
++ *     payload field, the function tries to convert the data pointed to by the
++ *     payload field to the given type. To check if such a conversion is
++ *     possible, it calls the function pointed to by the protocol buffer member
++ *     has_protocol. If this function returns True, the conversion takes place.
++ *
++ * Upvalues:
++ * 1.  struct protocol_buf*
++ * 2.  int32_t field index
++ *
++ * Return:
++ * 1.  A lua_packet_segment annotated with the according metatable or False in
++ *     case the input data is not valid
++ */
++static int32_t get_protocol_field(lua_State *L)
++{
++      int32_t prot_type;
++      lua_packet_segment * seg, *new;
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      int32_t field_index = lua_tointeger(L, lua_upvalueindex(2));
++      struct protocol_field * field = &prot_buf->protocol_fields[field_index];
++
++      /* get the current packet segment */
++      seg = checkpacketseg(L, 1, prot_buf->name);
++
++      /* initialize the new packet segment */
++      new = (lua_packet_segment *)lua_newuserdata(L, sizeof(lua_packet_segment));
++      new->start = seg->start;         /* the start is unchanged */
++      new->offset = get_field_offset_in_bytes(field, seg, field_index);
++      new->length = get_field_length_in_bytes(field, seg, field_index);
++
++      /* if new->length == 0 then no configuration was done, we guess the size by subtracting the
++       * new offset from the packet length. since the old length is getting initialized by the
++       * netfilter extension this assumption holds for the very last field of the protocol.
++       * this 'feature' should be used by protocol buffers containing a payload, whereas the
++       * payload field is the last field of the buffer. However, at compile-time unknown field
++       * sizes (and offsets) of fields not being placed at the end of the protocol should be
++       * initialized using the 'get_field_changes' hook system. */
++      if (new->length == 0)
++              new->length = (seg->length + seg->offset) - (new->offset);
++               /*
++                               printf("%s->%s:: seg->offset %i, seg->length %i, new->offset %i, new->length %i\n",
++                                               prot_buf->name, field->name, seg->offset, seg->length, new->offset, new->length);
++                */
++      /* special care for packet payload requests */
++      if (prot_buf->payload_field != NULL && strcmp(prot_buf->payload_field, field->name) == 0) {
++              /* we know the payload field is requested */
++              /* the requested payload can be delivered either as a common segment or as
++               * an other packet type, such a conversion needs an extra protocol parameter
++               * ... so lets check */
++
++              if (lua_isnumber(L, 2)) {
++                      /* we have an extra parameter, ... lets see if it is a valid protocol
++                       * the parameter is the index of the 'supported_protocols'-array member */
++                      prot_type = lua_tointeger(L, 2);
++                      if (prot_type >= 0 && prot_type < PACKET_SENTINEL) {
++                              /* we are sure the purpose of the request is to get the payload data,
++                               * converted to the given protocol.  lets check if the payload contains
++                               * data of the given protocol */
++                              if (payload_contains_protocol(L, prot_buf, seg, prot_type)) {
++                                      /* success, we can  push the metatable for the given protocol */
++                                      get_metatable_from_protocol_type(L, prot_type);
++                                      if (!lua_isnil(L, -1))  /* check if the metatable was found */
++                                              /* perhaps the field offsets and lengths of the containing protocol
++                                               * are not set correctly. request the optional 'field_changes' structure
++                                               * holding the changes for lengths and offsets. */
++                                              new->changes = protocol_get_field_changes(L, get_protocol_buf(prot_type), new);
++                                      else{
++                                              /* failed, the requested protocol is not available
++                                               * we push false and return */
++                                              lua_pop(L, 1); /* pop the userdata */
++                                              lua_pushboolean(L, 0);
++                                              return 1;
++                                      }
++                              }else{
++                                      /* payload does not carry the provided protocol */
++                                      /* we push false and return */
++                                      lua_pop(L, 1); /* pop the userdata */
++                                      lua_pushboolean(L, 0);
++                                      return 1;
++                              }
++                      }else{
++                              /* unknown protocol */
++                              lua_pop(L, 1); /* pop the userdata */
++                              luaL_error(L, "provided protocol is unknown");
++                      }
++              }
++      }
++
++      /* if there is still the 'new' userdata on the top, we push our own metatable */
++      if (lua_isuserdata(L, -1)) {
++              luaL_getmetatable(L, prot_buf->name);
++              new->changes = seg->changes;
++              if (seg->changes)
++                      new->changes->ref_count++;
++      }
++
++      /* a new packet segment is at index -2 , and the proper metatable at index -1 of the stack
++       * lets set the propper setter and getter function for the requested field */
++      initialize_field_getter_and_setter(L, prot_buf, field_index);
++
++      lua_setmetatable(L, -2);
++      return 1;
++}
++
++/* C_API: 'register_protbuf' is only used internally. This function takes a
++ * pointer to a fully initialized protocol buffer struct and registers it
++ * inside the Lua state. Registering means:
++ *
++ * 1.  it creates a new metatable with the name of the protocol buffer.
++ * 2.  it registers the default functions which are stored in the luaL_Reg
++ *     array seg_access_functions.
++ * 3.  it loops over the protocol fields stored at prot_buf->protocol_fields
++ *     and registers a new function (using the field name) inside the
++ *     metatable. Each field points to the function 'get_protocol_field'
++ *     which acts as a closure taking a pointer to the protocol buffer as
++ *     well as the index of the field as upvalues.
++ * 4.  The protocol index, serves as numerical identifier of this protocol
++ *     buffer or even of the protocol itself. This index is stored as a
++ *     global value inside the Lua state as well as inside the Lua table
++ *     'supported_protocols'. Assuming the name of a procotol buffer is
++ *     "packet_ip" the following statements are true:
++ * 
++ *       supported_protocols[protocol_index] == "packet_ip"
++ *                                 packet_ip == protocol_index
++ *
++ *     This allows you to get all registered protocols from within Lua. This
++ *     is especially usefull for the dynamic protocol buffers where you have
++ *     to provide your own "has_protocol"-function, which probably needs the
++ *     information on which protocols it is able to contain.
++ */
++void register_protbuf(lua_State *L, struct protocol_buf * prot_buf, uint32_t  protocol_index)
++{
++      int32_t field_index;
++      luaL_Reg *reg = (struct luaL_Reg *)seg_access_functions;
++      struct protocol_field * field = prot_buf->protocol_fields;
++
++      luaL_newmetatable(L, prot_buf->name);
++
++      /* metatable.__index = metatable */
++      lua_pushvalue(L, -1);   /* duplicates the metatable */
++      lua_setfield(L, -2, "__index");
++
++      /* pushing default functions */
++      for (; reg->name; reg++) {
++              lua_pushlightuserdata(L, (void *)prot_buf);
++              lua_pushcclosure(L, reg->func, 1);
++              lua_setfield(L, -2, reg->name);
++      }
++
++      /* pushing functions specific to the protocol buffer */
++      for (field_index = 0; field->name; field++, field_index++) {
++              lua_pushlightuserdata(L, (void *)prot_buf);             /* upvalue: prot_buf */
++              lua_pushinteger(L, field_index);                        /* upvalue: index of protocol field */
++              lua_pushcclosure(L, get_protocol_field, 2);
++              lua_setfield(L, -2, field->name);
++      }
++      /* pop the metatable */
++      lua_pop(L, 1);
++
++      /* registering the array-index as the protocol_id*/
++      lua_getglobal(L, "_G");
++      lua_pushinteger(L, protocol_index);
++      lua_setfield(L, -2, prot_buf->name);
++      lua_pop(L, 1); /* pop _G */
++
++      lua_getglobal(L, SUPPORTED_PROTOCOL_TABLE);
++      lua_pushstring(L, prot_buf->name);
++      lua_rawseti(L, -2, protocol_index);
++
++      lua_pop(L, 1);  /* pop SUPPORTED_PROTOCOL_TABLE */
++
++      supported_protocols[protocol_index] = prot_buf;
++}
++
++void luaopen_controller(lua_State *L)
++{
++      /* registering a table inside the _G with table[protocol_index] = prot_buf->name */
++      lua_getglobal(L, "_G");
++      lua_newtable(L);
++      lua_setfield(L, -2, SUPPORTED_PROTOCOL_TABLE);
++      lua_pop(L, 1); /* pop _G */                   
++      
++      luaopen_protbuf_raw(L);
++      luaopen_protbuf_eth(L);
++      luaopen_protbuf_ip(L);
++      luaopen_protbuf_icmp(L);
++      luaopen_protbuf_tcp(L);
++      luaopen_protbuf_tcp_options(L);
++      luaopen_protbuf_udp(L);
++      luaopen_protbuf_tftp(L);
++      luaopen_protbuf_dynamic(L);
++      /* should follow all other static buffers */
++#if defined(__KERNEL__)
++      luaopen_nflib(L);
++#endif
++
++      luaopen_bytearraylib(L);
++}
++
++
++
++
+--- /dev/null
++++ b/extensions/LUA/controller.h
+@@ -0,0 +1,264 @@
++/*
++ *    Copyright (C) 2010 University of Basel <http://cn.cs.unibas.ch/>
++ *    by Andre Graf <andre@dergraf.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, see <http://www.gnu.org/licenses/>.
++ */
++
++#ifndef CONTROLLER_H_
++#define CONTROLLER_H_
++
++#include "stdlib.h"     /* wrapper */
++#include "string.h"     /* wrapper */
++#include "lua.h"
++#include "lualib.h"
++#include "lauxlib.h"
++
++#if defined(__KERNEL__)
++#include <linux/skbuff.h>
++#include <linux/slab.h>
++#include <linux/vmalloc.h>
++#endif
++
++
++/* to compile the stuff in userspace (for testing)*/
++#if !defined(__KERNEL__)
++#include <stdint.h>
++#define pr_debug printf;
++
++#define kmalloc(size, type) malloc(size)
++#define kfree(ptr) free(ptr)
++
++#endif
++
++
++/**********************************************************************/
++/* nf Lua configuration                                               */
++/**********************************************************************/
++#define MAX_NR_OF_PROTOCOLS 16
++#define SUPPORTED_PROTOCOL_TABLE "supported_protocols"
++
++#define MAX_NR_OF_FIELDS_IN_DYN_PROT_BUF 32
++
++
++/**********************************************************************/
++/* Static Protocol Buffer configuration                               */
++/**********************************************************************/
++
++/* the definitions of the stringified expression of the prot_bufs...
++ * make sure all static prot_bufs are listed and are unique */
++#define LUA_PACKET_SEG_RAW "packet_raw"
++#define LUA_PACKET_SEG_ETH "packet_eth"
++#define LUA_PACKET_SEG_ICMP "packet_icmp"
++#define LUA_PACKET_SEG_IP "packet_ip"
++#define LUA_PACKET_SEG_TCP "packet_tcp"
++#define LUA_PACKET_SEG_TCP_OPT "packet_tcp_opt"
++#define LUA_PACKET_SEG_UDP "packet_udp"
++#define LUA_PACKET_SEG_TFTP "packet_tftp"
++
++/* the enum holding all static prot_bufs... make sure it contains all
++ * static prot_bufs */
++enum PROT_BUF {
++      PACKET_RAW,
++      PACKET_ETH,
++      PACKET_IP,
++      PACKET_ICMP,
++      PACKET_TCP,
++      PACKET_TCP_OPTIONS,
++      PACKET_UDP,
++      PACKET_TFTP,
++      PACKET_DYNAMIC,
++      PACKET_SENTINEL
++};
++
++/* the luaopen-function of the prot_bufs... make sure it is called
++ * inside luaopen_controller */
++void luaopen_protbuf_raw(lua_State *L);
++void luaopen_protbuf_eth(lua_State *L);
++void luaopen_protbuf_ip(lua_State *L);
++void luaopen_protbuf_icmp(lua_State *L);
++void luaopen_protbuf_tcp(lua_State *L);
++void luaopen_protbuf_tcp_options(lua_State *L);
++void luaopen_protbuf_udp(lua_State *L);
++void luaopen_protbuf_tftp(lua_State *L);
++void luaopen_protbuf_dynamic(lua_State *L);
++
++/**********************************************************************/
++/* field changes                                                      */
++/**********************************************************************/
++struct field_changes {
++      int ref_count;
++      int *field_length_changes;
++      int *field_offset_changes;
++};
++
++/**********************************************************************/
++/* lua packet segment                                                                                           */
++/* ------------------                                                 */
++/* The struct lua_packet_segment is the integral part of a Lua packet.*/
++/* At the very beginning, when a new packet arrives in `lua_tg`_ such */
++/* a struct is initialized. The field start then points to the lowest */
++/* available header inside the sk_buff structure. During packet       */
++/* processing the start pointer remains the same, only the offset and */
++/* length value change.                                               */
++/**********************************************************************/
++#define checkpacketseg(L, i, seg_type) \
++      (lua_packet_segment *)luaL_checkudata(L, i, seg_type)
++
++typedef struct lua_packet_segment {
++      unsigned int offset;
++      unsigned int length;
++      struct field_changes * changes;
++      unsigned char * start;  /* need to be at the end because of the memory alignment */
++} lua_packet_segment;
++
++/**********************************************************************/
++/* protocol field                                                     */
++/* --------------                                                                                                       */
++/* This structure is a container for the field definitions used by the*/
++/* protocol buffer. Each protocol field is expressed using this struct*/
++/* Have a look at the protocol buffers to see how the struct gets     */
++/* initialized.                                                                                                                 */
++/*                                                                                                                                      */
++/* name:                                                                                                                    */
++/*   This member expresses the name of the field, ending                        */
++/*   in its own Lua function to access the field.                                       */
++/* offset / length:                                                                                                     */
++/*   These members do specify the position inside the protocol header */
++/*   in bits (not bytes!).                                                                                      */
++/* get / set:                                                                                                           */
++/*   The get and set functions take a function pointer pointing to the*/
++/*   specific getter and setter function for this field.                        */
++/**********************************************************************/
++struct protocol_field {
++      const char * name;
++      uint32_t offset;
++      uint32_t length;
++      lua_CFunction get;
++      lua_CFunction set;
++};
++#define PROT_FIELD_SENTINEL { NULL, 0, 0, NULL, NULL }
++
++
++/**********************************************************************/
++/* protocol_buf                                                       */
++/**********************************************************************/
++/* This structure is a container for all the information needed for a
++ * protocol buffer. It gets initialized in each protocol buffer header
++ * file or for the dynamic protocol buffers on runtime using the
++ * 'register_dynamic_protocol_buffer' function.
++ *
++ * name:
++ *   This member is used throughout the system. It is also exported
++ *   to Lua as a variable name holding the index of the 'supported_protocols'
++ *   array. The name is also used as the name of the generated Lua
++ *   metatable, that is why inside the macro checkpacketseg_ it
++ *   is always the name of a protocol buffer that is passed as the
++ *   second parameter.
++ * payload_field:
++ *   This member holds the string of the field responsible for payload
++ *   data. The payload field of a protocol has an extra property, since
++ *   it can be used to invoke another protocol buffer that is applied to
++ *   the payload content.
++ * has_protocol:
++ *   This member is used together with the payload_field. Since we must
++ *   be sure that the payload content does really contain a protocol
++ *   of type X. The function pointed to by has_protocol checks if the
++ *   protocol buffer X can be applied on the payload_data.
++ * protocol_fields:
++ *   This member points to the array of 'protocol_field' structures
++ * get_field_changes:
++ *   This member is optional. It is used to return a pointer to an initialized
++ *   field_changes struct. The function is called, whenever the payload field
++ *   is requested with a given protocol type. Usually this function will
++ *   initialize the field_changes struct depending on the content of the 
++ *   payload data. e.g.
++ *     tcp = ip:data(packet_tcp)
++ *   such a request will call the 'get_field_changes' function of the tcp
++ *   protocol buffer. This enables, that the tcp options field have the proper
++ *   length as well as the tcp data start at the right offset. 
++ */
++struct protocol_buf {
++      int is_dynamic;
++      const char * name;
++      char * payload_field;
++      int (*has_protocol)(lua_State *L, struct protocol_buf *prot_buf, lua_packet_segment * seg, int type);
++      struct protocol_field * protocol_fields;
++      struct field_changes * (*get_field_changes)(lua_State *L, lua_packet_segment * seg);
++};
++
++/**********************************************************************/
++/* lua byte array library                                             */
++/**********************************************************************/
++#define LUA_BYTE_ARRAY "byte_array"
++#define checkbytearray(L, i) \
++      (lua_packet_segment *)luaL_checkudata(L, i, LUA_BYTE_ARRAY)
++lua_packet_segment * init_byte_array(lua_State *L, unsigned char * start, int length, int do_copy);
++void luaopen_bytearraylib(lua_State *L);
++
++
++/**********************************************************************/
++/* lua netfilter environment library                                  */
++/**********************************************************************/
++#define NETFILTER_LIB "nf"
++#if defined(__KERNEL__)
++      struct lua_env {
++              lua_State *L;
++              /* perhaps more to come here (e.g. a state per CPU) */
++      }; 
++      #define LUA_ENV "lua_env"
++      #define checkluaenv(L, i) \
++      (struct lua_env *)luaL_checkudata(L, i, LUA_ENV)
++
++      void luaopen_nflib(lua_State *L);
++#endif
++
++void cleanup_dynamic_prot_bufs(void); /* freeing all dynamic prot bufs */
++/**********************************************************************/
++/* lua protbuf helpers                                                */
++/**********************************************************************/
++int get_1_bit_generic(lua_State *L);
++int set_1_bit_generic(lua_State *L);
++int get_lower_4_bit_generic(lua_State *L);
++int set_lower_4_bit_generic(lua_State *L);
++int get_upper_4_bit_generic(lua_State *L);
++int set_upper_4_bit_generic(lua_State *L);
++int get_8_bit_generic(lua_State *L);
++int set_8_bit_generic(lua_State *L);
++int get_16_bit_generic(lua_State *L);
++int set_16_bit_generic(lua_State *L);
++int get_32_bit_generic(lua_State *L);
++int set_32_bit_generic(lua_State *L);
++int set_data_generic(lua_State *L);
++int get_string_generic(lua_State *L);
++int get_byte_generic_str(lua_State *L);
++struct field_changes * get_allocated_field_changes(lua_State *L, int nr_of_fields);
++
++/* only used by the dynamic prot buf subsystem */
++#define MAX_NR_OF_DYN_PROT_BUFS 16
++int field_dynamic_setter(lua_State *L);
++int field_dynamic_getter(lua_State *L);
++int has_protocol_dynamic(lua_State *L, struct protocol_buf * prot_buf, lua_packet_segment * seg, int type);
++struct field_changes * get_field_changes_dynamic(lua_State *L, struct protocol_buf *prot_buf, lua_packet_segment * seg);
++
++/**********************************************************************/
++/* lua controller API                                                 */
++/**********************************************************************/
++void luaopen_controller(lua_State *L);
++struct protocol_buf * get_protocol_buf(unsigned int protocol_id);
++void get_metatable_from_protocol_type(lua_State *L, int type);
++void register_protbuf(lua_State *L, struct protocol_buf * prot_buf, unsigned int protocol_index);
++
++
++#endif /* CONTROLLER_H_ */
+--- /dev/null
++++ b/extensions/LUA/Kbuild
+@@ -0,0 +1,49 @@
++# -*- Makefile -*-
++
++# Adding debug options
++EXTRA_CFLAGS += -DDEBUG
++
++obj-m += xt_LUA.o
++
++EXTRA_CFLAGS += -I$(src)/prot_buf_new
++xt_LUA-y += xt_LUA_target.o \
++
++xt_LUA-y += nf_lua.o \
++                      prot_buf_helpers.o \
++                      byte_array.o \
++                      controller.o \
++                      prot_buf_ethernet.o \
++                      prot_buf_icmp.o \
++                      prot_buf_ip.o \
++                      prot_buf_raw.o \
++                      prot_buf_tcp.o \
++                      prot_buf_udp.o \
++                      prot_buf_tftp.o \
++                      prot_buf_dynamic.o \
++
++
++# Adding Lua Support
++EXTRA_CFLAGS += -I$(src)/lua -I$(src)/lua/include 
++xt_LUA-y += lua/lapi.o \
++                      lua/lbaselib.o \
++                      lua/lcode.o \
++                      lua/ldebug.o \
++                      lua/ldo.o \
++                      lua/ldump.o \
++                      lua/lfunc.o \
++                      lua/lgc.o \
++                      lua/llex.o \
++                      lua/lmem.o \
++                      lua/lobject.o \
++                      lua/lopcodes.o \
++                      lua/lparser.o \
++                      lua/lstate.o \
++                      lua/lstring.o \
++                      lua/lstrlib.o \
++                      lua/ltable.o \
++                      lua/ltablib.o \
++                      lua/ltm.o \
++                      lua/lundump.o \
++                      lua/lvm.o \
++                      lua/lzio.o \
++                      lua/lauxlib.o \
+--- /dev/null
++++ b/extensions/LUA/libxt_LUA.c
+@@ -0,0 +1,191 @@
++/*
++ *    Copyright (C) 2010 University of Basel <http://cn.cs.unibas.ch/>
++ *    by Andre Graf <andre@dergraf.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, see <http://www.gnu.org/licenses/>.
++ */
++
++#include <getopt.h>
++#include <stdio.h>
++#include <stdbool.h>
++#include <stdlib.h>
++#include <string.h>
++#include <xtables.h>
++#include <linux/netfilter.h>
++#include <linux/netfilter/x_tables.h>
++#include "xt_LUA.h"
++
++enum {
++      FLAG_SCRIPT   = 1 << 0,
++      FLAG_STATE    = 1 << 1,
++      FLAG_FUNCTION = 1 << 2,
++};
++
++static const struct option lua_tg_opts[] = {
++      { .name = "script",   .has_arg = true, .val = 's' },
++      { .name = "state",    .has_arg = true, .val = 'l' },
++      { .name = "function", .has_arg = true, .val = 'f' },
++      { NULL },
++};
++
++
++static void lua_tg_help(void)
++{
++      printf(
++              "LUA target options:\n"
++              "  --script SCRIPT      Process packet with the Lua script given by SCRIPT\n"
++              "                                                                       \n"
++              "  --state ID           Process packet within the Lua state given by ID.\n"
++              "                       Omitting --state infers the ID 0, which can be\n"
++              "                       refered to the 'global' state.\n"
++              "                                                                       \n"
++              "  --function FUNCTION  Name of the function that processes the Lua packet\n"
++              "\n");
++}
++
++static void
++lua_tg_init(struct xt_entry_target *target)
++{
++      struct xt_lua_tginfo *info = (void *)target->data;
++
++      info->state_id = 0;
++      strncpy(info->function, "process_packet\0", sizeof("process_packet\0"));
++}
++
++static int
++lua_tg_parse(int32_t c, char **argv, int32_t invert, uint32_t  *flags,
++           const void *entry, struct xt_entry_target **target)
++{
++      struct xt_lua_tginfo *info = (void *)(*target)->data;
++      char buf[MAX_SCRIPT_SIZE];
++      long script_size;
++      uint32_t  state_id;
++      FILE *file;
++
++      switch (c) {
++      case 's':
++              if (*flags & FLAG_SCRIPT)
++                      xtables_error(PARAMETER_PROBLEM,
++                                    "LUA: Cannot specify --script more than once");
++
++              if (strlen(optarg) > sizeof(info->filename))
++                      xtables_error(PARAMETER_PROBLEM,
++                                    "LUA: Maximum script length is %zu",
++                                    sizeof(info->filename));
++
++              if (strchr(optarg, '\n'))
++                      xtables_error(PARAMETER_PROBLEM,
++                                    "LUA: Newlines not allowed in script name");
++              file = fopen(optarg, "rb");
++              if (file != NULL) {
++                      fseek(file, 0, SEEK_END);
++                      script_size = ftell(file);
++                      if (script_size > MAX_SCRIPT_SIZE)
++                              xtables_error(PARAMETER_PROBLEM,
++                                            "LUA: The size of the script is too big");
++
++                      fseek(file, 0, SEEK_SET);
++                      fread(buf, script_size, 1, file);
++                      fclose(file);
++              } else
++                      xtables_error(PARAMETER_PROBLEM,
++                                    "LUA: Cannot open script %s", optarg);
++
++              strncpy(info->filename, optarg, sizeof(info->filename));
++              strncpy(info->buf, buf, sizeof(info->buf));
++              info->script_size = script_size;
++
++              *flags |= FLAG_SCRIPT;
++              return true;
++
++      case 'l':
++              if (*flags & FLAG_STATE)
++                      xtables_error(PARAMETER_PROBLEM,
++                                    "LUA: Cannot specify --state more than once");
++
++              if (!xtables_strtoui(optarg, NULL, &state_id, 0, 8))
++                      xtables_error(PARAMETER_PROBLEM,
++                                    "LUA: Invalid --state %s", optarg);
++
++              info->state_id = state_id;
++              *flags |= FLAG_STATE;
++              return true;
++
++      case 'f':
++              if (*flags & FLAG_FUNCTION)
++                      xtables_error(PARAMETER_PROBLEM,
++                                    "LUA: Cannot specify --function more than once");
++              if (strlen(optarg) > sizeof(info->function))
++                      xtables_error(PARAMETER_PROBLEM,
++                                    "LUA: Maximum function length is %zu",
++                                    sizeof(info->function));
++
++              if (strchr(optarg, '\n'))
++                      xtables_error(PARAMETER_PROBLEM,
++                                    "LUA: Newlines not allowed in function name");
++
++              strncpy(info->function, optarg, sizeof(info->function));
++
++              *flags |= FLAG_FUNCTION;
++              return true;
++      }
++
++      return false;
++}
++
++static void
++lua_tg_check(uint32_t  flags)
++{
++      if (flags == 0)
++              xtables_error(PARAMETER_PROBLEM, "LUA: --script parameter required");
++}
++
++static void
++lua_tg_print(const void *entry, const struct xt_entry_target *target,
++           int32_t numeric)
++{
++      const struct xt_lua_tginfo *info = (const void *)target->data;
++
++      printf("LUA script: %s ", info->filename);
++}
++
++static void
++lua_tg_save(const void *entry, const struct xt_entry_target *target)
++{
++      const struct xt_lua_tginfo *info = (const void *)target->data;
++
++      printf("--script %s ", info->filename);
++}
++
++static struct xtables_target lua_tg_reg = {
++      .name                   = "LUA",
++      .version                = XTABLES_VERSION,
++      .revision               = 0,
++      .family                 = NFPROTO_UNSPEC,
++      .size                   = XT_ALIGN(sizeof(struct xt_lua_tginfo)),
++      .userspacesize          = XT_ALIGN(sizeof(struct xt_lua_tginfo)),
++      .help                   = lua_tg_help,
++      .init                   = lua_tg_init,
++      .parse                  = lua_tg_parse,
++      .final_check            = lua_tg_check,
++      .print                  = lua_tg_print,
++      .save                   = lua_tg_save,
++      .extra_opts             = lua_tg_opts,
++};
++
++static __attribute__((constructor)) void lua_tg_ldr(void)
++{
++      xtables_register_target(&lua_tg_reg);
++}
++
+--- /dev/null
++++ b/extensions/LUA/libxt_LUA.man
+@@ -0,0 +1 @@
++Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+--- /dev/null
++++ b/extensions/LUA/lua/include/ctype.h
+@@ -0,0 +1,11 @@
++#include <linux/ctype.h>
++#undef  isalnum
++#define isalnum(c)      (((__ismask(c)&(_U|_L|_D)) != 0) && (c > 0))
++#undef  isalpha
++#define isalpha(c)      (((__ismask(c)&(_U|_L)) != 0) && (c > 0))
++#undef  iscntrl
++#define iscntrl(c)      (((__ismask(c)&(_C)) != 0) && (c > 0))
++#undef  isdigit
++#define isdigit(c)      (((__ismask(c)&(_D)) != 0) && (c > 0))
++#undef  isspace
++#define isspace(c)      (((__ismask(c)&(_S)) != 0) && (c > 0))
+--- /dev/null
++++ b/extensions/LUA/lua/include/errno.h
+@@ -0,0 +1 @@
++#include <linux/errno.h>
+--- /dev/null
++++ b/extensions/LUA/lua/include/locale.h
+@@ -0,0 +1,5 @@
++struct lconv {
++   char * decimal_point ;
++} ;
++
++#define localeconv()          NULL
+--- /dev/null
++++ b/extensions/LUA/lua/include/setjmp.h
+@@ -0,0 +1,26 @@
++/*
++ * arch/um/include/sysdep-i386/archsetjmp.h
++ */
++
++#ifndef _KLIBC_ARCHSETJMP_H
++#define _KLIBC_ARCHSETJMP_H
++
++struct __jmp_buf {
++      unsigned int __ebx;
++      unsigned int __esp;
++      unsigned int __ebp;
++      unsigned int __esi;
++      unsigned int __edi;
++      unsigned int __eip;
++};
++
++typedef struct __jmp_buf jmp_buf[1];
++
++#define JB_IP __eip
++#define JB_SP __esp
++
++int setjmp(jmp_buf);
++void longjmp(jmp_buf, int);
++
++#endif                                /* _SETJMP_H */
++
+--- /dev/null
++++ b/extensions/LUA/lua/include/stdio.h
+@@ -0,0 +1 @@
++#include <linux/kernel.h>
+--- /dev/null
++++ b/extensions/LUA/lua/include/stdlib.h
+@@ -0,0 +1,7 @@
++#include <linux/kernel.h>
++
++#define exit(E)         return
++#define strtoul               simple_strtoul
++#define strcoll               strcmp
++
++#define CHAR_BIT 8
+--- /dev/null
++++ b/extensions/LUA/lua/include/string.h
+@@ -0,0 +1 @@
++#include <linux/string.h>
+--- /dev/null
++++ b/extensions/LUA/lua/lapi.c
+@@ -0,0 +1,1086 @@
++/*
++** $Id: lapi.c,v 2.55.1.5 2008/07/04 18:41:18 roberto Exp $
++** Lua API
++** See Copyright Notice in lua.h
++*/
++
++#include <stdarg.h>
++#include <math.h>
++#include <assert.h>
++#include <string.h>
++
++#define lapi_c
++#define LUA_CORE
++
++#include "lua.h"
++
++#include "lapi.h"
++#include "ldebug.h"
++#include "ldo.h"
++#include "lfunc.h"
++#include "lgc.h"
++#include "lmem.h"
++#include "lobject.h"
++#include "lstate.h"
++#include "lstring.h"
++#include "ltable.h"
++#include "ltm.h"
++#include "lundump.h"
++#include "lvm.h"
++
++
++
++const char lua_ident[] =
++  "$Lua: " LUA_RELEASE " " LUA_COPYRIGHT " $\n"
++  "$Authors: " LUA_AUTHORS " $\n"
++  "$URL: www.lua.org $\n";
++
++
++
++#define api_checknelems(L, n) api_check(L, (n) <= (L->top - L->base))
++
++#define api_checkvalidindex(L, i)     api_check(L, (i) != luaO_nilobject)
++
++#define api_incr_top(L)   {api_check(L, L->top < L->ci->top); L->top++;}
++
++
++
++static TValue *index2adr (lua_State *L, int idx) {
++  if (idx > 0) {
++    TValue *o = L->base + (idx - 1);
++    api_check(L, idx <= L->ci->top - L->base);
++    if (o >= L->top) return cast(TValue *, luaO_nilobject);
++    else return o;
++  }
++  else if (idx > LUA_REGISTRYINDEX) {
++    api_check(L, idx != 0 && -idx <= L->top - L->base);
++    return L->top + idx;
++  }
++  else switch (idx) {  /* pseudo-indices */
++    case LUA_REGISTRYINDEX: return registry(L);
++    case LUA_ENVIRONINDEX: {
++      Closure *func = curr_func(L);
++      sethvalue(L, &L->env, func->c.env);
++      return &L->env;
++    }
++    case LUA_GLOBALSINDEX: return gt(L);
++    default: {
++      Closure *func = curr_func(L);
++      idx = LUA_GLOBALSINDEX - idx;
++      return (idx <= func->c.nupvalues)
++                ? &func->c.upvalue[idx-1]
++                : cast(TValue *, luaO_nilobject);
++    }
++  }
++}
++
++
++static Table *getcurrenv (lua_State *L) {
++  if (L->ci == L->base_ci)  /* no enclosing function? */
++    return hvalue(gt(L));  /* use global table as environment */
++  else {
++    Closure *func = curr_func(L);
++    return func->c.env;
++  }
++}
++
++
++void luaA_pushobject (lua_State *L, const TValue *o) {
++  setobj2s(L, L->top, o);
++  api_incr_top(L);
++}
++
++
++LUA_API int lua_checkstack (lua_State *L, int size) {
++  int res = 1;
++  lua_lock(L);
++  if (size > LUAI_MAXCSTACK || (L->top - L->base + size) > LUAI_MAXCSTACK)
++    res = 0;  /* stack overflow */
++  else if (size > 0) {
++    luaD_checkstack(L, size);
++    if (L->ci->top < L->top + size)
++      L->ci->top = L->top + size;
++  }
++  lua_unlock(L);
++  return res;
++}
++
++
++LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) {
++  int i;
++  if (from == to) return;
++  lua_lock(to);
++  api_checknelems(from, n);
++  api_check(from, G(from) == G(to));
++  api_check(from, to->ci->top - to->top >= n);
++  from->top -= n;
++  for (i = 0; i < n; i++) {
++    setobj2s(to, to->top++, from->top + i);
++  }
++  lua_unlock(to);
++}
++
++
++LUA_API void lua_setlevel (lua_State *from, lua_State *to) {
++  to->nCcalls = from->nCcalls;
++}
++
++
++LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) {
++  lua_CFunction old;
++  lua_lock(L);
++  old = G(L)->panic;
++  G(L)->panic = panicf;
++  lua_unlock(L);
++  return old;
++}
++
++
++LUA_API lua_State *lua_newthread (lua_State *L) {
++  lua_State *L1;
++  lua_lock(L);
++  luaC_checkGC(L);
++  L1 = luaE_newthread(L);
++  setthvalue(L, L->top, L1);
++  api_incr_top(L);
++  lua_unlock(L);
++  luai_userstatethread(L, L1);
++  return L1;
++}
++
++
++
++/*
++** basic stack manipulation
++*/
++
++
++LUA_API int lua_gettop (lua_State *L) {
++  return cast_int(L->top - L->base);
++}
++
++
++LUA_API void lua_settop (lua_State *L, int idx) {
++  lua_lock(L);
++  if (idx >= 0) {
++    api_check(L, idx <= L->stack_last - L->base);
++    while (L->top < L->base + idx)
++      setnilvalue(L->top++);
++    L->top = L->base + idx;
++  }
++  else {
++    api_check(L, -(idx+1) <= (L->top - L->base));
++    L->top += idx+1;  /* `subtract' index (index is negative) */
++  }
++  lua_unlock(L);
++}
++
++
++LUA_API void lua_remove (lua_State *L, int idx) {
++  StkId p;
++  lua_lock(L);
++  p = index2adr(L, idx);
++  api_checkvalidindex(L, p);
++  while (++p < L->top) setobjs2s(L, p-1, p);
++  L->top--;
++  lua_unlock(L);
++}
++
++
++LUA_API void lua_insert (lua_State *L, int idx) {
++  StkId p;
++  StkId q;
++  lua_lock(L);
++  p = index2adr(L, idx);
++  api_checkvalidindex(L, p);
++  for (q = L->top; q>p; q--) setobjs2s(L, q, q-1);
++  setobjs2s(L, p, L->top);
++  lua_unlock(L);
++}
++
++
++LUA_API void lua_replace (lua_State *L, int idx) {
++  StkId o;
++  lua_lock(L);
++  /* explicit test for incompatible code */
++  if (idx == LUA_ENVIRONINDEX && L->ci == L->base_ci)
++    luaG_runerror(L, "no calling environment");
++  api_checknelems(L, 1);
++  o = index2adr(L, idx);
++  api_checkvalidindex(L, o);
++  if (idx == LUA_ENVIRONINDEX) {
++    Closure *func = curr_func(L);
++    api_check(L, ttistable(L->top - 1)); 
++    func->c.env = hvalue(L->top - 1);
++    luaC_barrier(L, func, L->top - 1);
++  }
++  else {
++    setobj(L, o, L->top - 1);
++    if (idx < LUA_GLOBALSINDEX)  /* function upvalue? */
++      luaC_barrier(L, curr_func(L), L->top - 1);
++  }
++  L->top--;
++  lua_unlock(L);
++}
++
++
++LUA_API void lua_pushvalue (lua_State *L, int idx) {
++  lua_lock(L);
++  setobj2s(L, L->top, index2adr(L, idx));
++  api_incr_top(L);
++  lua_unlock(L);
++}
++
++
++
++/*
++** access functions (stack -> C)
++*/
++
++
++LUA_API int lua_type (lua_State *L, int idx) {
++  StkId o = index2adr(L, idx);
++  return (o == luaO_nilobject) ? LUA_TNONE : ttype(o);
++}
++
++
++LUA_API const char *lua_typename (lua_State *L, int t) {
++  UNUSED(L);
++  return (t == LUA_TNONE) ? "no value" : luaT_typenames[t];
++}
++
++
++LUA_API int lua_iscfunction (lua_State *L, int idx) {
++  StkId o = index2adr(L, idx);
++  return iscfunction(o);
++}
++
++
++LUA_API int lua_isnumber (lua_State *L, int idx) {
++  TValue n;
++  const TValue *o = index2adr(L, idx);
++  return tonumber(o, &n);
++}
++
++
++LUA_API int lua_isstring (lua_State *L, int idx) {
++  int t = lua_type(L, idx);
++  return (t == LUA_TSTRING || t == LUA_TNUMBER);
++}
++
++
++LUA_API int lua_isuserdata (lua_State *L, int idx) {
++  const TValue *o = index2adr(L, idx);
++  return (ttisuserdata(o) || ttislightuserdata(o));
++}
++
++
++LUA_API int lua_rawequal (lua_State *L, int index1, int index2) {
++  StkId o1 = index2adr(L, index1);
++  StkId o2 = index2adr(L, index2);
++  return (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0
++         : luaO_rawequalObj(o1, o2);
++}
++
++
++LUA_API int lua_equal (lua_State *L, int index1, int index2) {
++  StkId o1, o2;
++  int i;
++  lua_lock(L);  /* may call tag method */
++  o1 = index2adr(L, index1);
++  o2 = index2adr(L, index2);
++  i = (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0 : equalobj(L, o1, o2);
++  lua_unlock(L);
++  return i;
++}
++
++
++LUA_API int lua_lessthan (lua_State *L, int index1, int index2) {
++  StkId o1, o2;
++  int i;
++  lua_lock(L);  /* may call tag method */
++  o1 = index2adr(L, index1);
++  o2 = index2adr(L, index2);
++  i = (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0
++       : luaV_lessthan(L, o1, o2);
++  lua_unlock(L);
++  return i;
++}
++
++
++
++LUA_API lua_Number lua_tonumber (lua_State *L, int idx) {
++  TValue n;
++  const TValue *o = index2adr(L, idx);
++  if (tonumber(o, &n))
++    return nvalue(o);
++  else
++    return 0;
++}
++
++
++LUA_API lua_Integer lua_tointeger (lua_State *L, int idx) {
++  TValue n;
++  const TValue *o = index2adr(L, idx);
++  if (tonumber(o, &n)) {
++    lua_Integer res;
++    lua_Number num = nvalue(o);
++    lua_number2integer(res, num);
++    return res;
++  }
++  else
++    return 0;
++}
++
++
++LUA_API int lua_toboolean (lua_State *L, int idx) {
++  const TValue *o = index2adr(L, idx);
++  return !l_isfalse(o);
++}
++
++
++LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) {
++  StkId o = index2adr(L, idx);
++  if (!ttisstring(o)) {
++    lua_lock(L);  /* `luaV_tostring' may create a new string */
++    if (!luaV_tostring(L, o)) {  /* conversion failed? */
++      if (len != NULL) *len = 0;
++      lua_unlock(L);
++      return NULL;
++    }
++    luaC_checkGC(L);
++    o = index2adr(L, idx);  /* previous call may reallocate the stack */
++    lua_unlock(L);
++  }
++  if (len != NULL) *len = tsvalue(o)->len;
++  return svalue(o);
++}
++
++
++LUA_API size_t lua_objlen (lua_State *L, int idx) {
++  StkId o = index2adr(L, idx);
++  switch (ttype(o)) {
++    case LUA_TSTRING: return tsvalue(o)->len;
++    case LUA_TUSERDATA: return uvalue(o)->len;
++    case LUA_TTABLE: return luaH_getn(hvalue(o));
++    case LUA_TNUMBER: {
++      size_t l;
++      lua_lock(L);  /* `luaV_tostring' may create a new string */
++      l = (luaV_tostring(L, o) ? tsvalue(o)->len : 0);
++      lua_unlock(L);
++      return l;
++    }
++    default: return 0;
++  }
++}
++
++
++LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) {
++  StkId o = index2adr(L, idx);
++  return (!iscfunction(o)) ? NULL : clvalue(o)->c.f;
++}
++
++
++LUA_API void *lua_touserdata (lua_State *L, int idx) {
++  StkId o = index2adr(L, idx);
++  switch (ttype(o)) {
++    case LUA_TUSERDATA: return (rawuvalue(o) + 1);
++    case LUA_TLIGHTUSERDATA: return pvalue(o);
++    default: return NULL;
++  }
++}
++
++
++LUA_API lua_State *lua_tothread (lua_State *L, int idx) {
++  StkId o = index2adr(L, idx);
++  return (!ttisthread(o)) ? NULL : thvalue(o);
++}
++
++
++LUA_API const void *lua_topointer (lua_State *L, int idx) {
++  StkId o = index2adr(L, idx);
++  switch (ttype(o)) {
++    case LUA_TTABLE: return hvalue(o);
++    case LUA_TFUNCTION: return clvalue(o);
++    case LUA_TTHREAD: return thvalue(o);
++    case LUA_TUSERDATA:
++    case LUA_TLIGHTUSERDATA:
++      return lua_touserdata(L, idx);
++    default: return NULL;
++  }
++}
++
++
++
++/*
++** push functions (C -> stack)
++*/
++
++
++LUA_API void lua_pushnil (lua_State *L) {
++  lua_lock(L);
++  setnilvalue(L->top);
++  api_incr_top(L);
++  lua_unlock(L);
++}
++
++
++LUA_API void lua_pushnumber (lua_State *L, lua_Number n) {
++  lua_lock(L);
++  setnvalue(L->top, n);
++  api_incr_top(L);
++  lua_unlock(L);
++}
++
++
++LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) {
++  lua_lock(L);
++  setnvalue(L->top, cast_num(n));
++  api_incr_top(L);
++  lua_unlock(L);
++}
++
++
++LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) {
++  lua_lock(L);
++  luaC_checkGC(L);
++  setsvalue2s(L, L->top, luaS_newlstr(L, s, len));
++  api_incr_top(L);
++  lua_unlock(L);
++}
++
++
++LUA_API void lua_pushstring (lua_State *L, const char *s) {
++  if (s == NULL)
++    lua_pushnil(L);
++  else
++    lua_pushlstring(L, s, strlen(s));
++}
++
++
++LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt,
++                                      va_list argp) {
++  const char *ret;
++  lua_lock(L);
++  luaC_checkGC(L);
++  ret = luaO_pushvfstring(L, fmt, argp);
++  lua_unlock(L);
++  return ret;
++}
++
++
++LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) {
++  const char *ret;
++  va_list argp;
++  lua_lock(L);
++  luaC_checkGC(L);
++  va_start(argp, fmt);
++  ret = luaO_pushvfstring(L, fmt, argp);
++  va_end(argp);
++  lua_unlock(L);
++  return ret;
++}
++
++
++LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {
++  Closure *cl;
++  lua_lock(L);
++  luaC_checkGC(L);
++  api_checknelems(L, n);
++  cl = luaF_newCclosure(L, n, getcurrenv(L));
++  cl->c.f = fn;
++  L->top -= n;
++  while (n--)
++    setobj2n(L, &cl->c.upvalue[n], L->top+n);
++  setclvalue(L, L->top, cl);
++  lua_assert(iswhite(obj2gco(cl)));
++  api_incr_top(L);
++  lua_unlock(L);
++}
++
++
++LUA_API void lua_pushboolean (lua_State *L, int b) {
++  lua_lock(L);
++  setbvalue(L->top, (b != 0));  /* ensure that true is 1 */
++  api_incr_top(L);
++  lua_unlock(L);
++}
++
++
++LUA_API void lua_pushlightuserdata (lua_State *L, void *p) {
++  lua_lock(L);
++  setpvalue(L->top, p);
++  api_incr_top(L);
++  lua_unlock(L);
++}
++
++
++LUA_API int lua_pushthread (lua_State *L) {
++  lua_lock(L);
++  setthvalue(L, L->top, L);
++  api_incr_top(L);
++  lua_unlock(L);
++  return (G(L)->mainthread == L);
++}
++
++
++
++/*
++** get functions (Lua -> stack)
++*/
++
++
++LUA_API void lua_gettable (lua_State *L, int idx) {
++  StkId t;
++  lua_lock(L);
++  t = index2adr(L, idx);
++  api_checkvalidindex(L, t);
++  luaV_gettable(L, t, L->top - 1, L->top - 1);
++  lua_unlock(L);
++}
++
++
++LUA_API void lua_getfield (lua_State *L, int idx, const char *k) {
++  StkId t;
++  TValue key;
++  lua_lock(L);
++  t = index2adr(L, idx);
++  api_checkvalidindex(L, t);
++  setsvalue(L, &key, luaS_new(L, k));
++  luaV_gettable(L, t, &key, L->top);
++  api_incr_top(L);
++  lua_unlock(L);
++}
++
++
++LUA_API void lua_rawget (lua_State *L, int idx) {
++  StkId t;
++  lua_lock(L);
++  t = index2adr(L, idx);
++  api_check(L, ttistable(t));
++  setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1));
++  lua_unlock(L);
++}
++
++
++LUA_API void lua_rawgeti (lua_State *L, int idx, int n) {
++  StkId o;
++  lua_lock(L);
++  o = index2adr(L, idx);
++  api_check(L, ttistable(o));
++  setobj2s(L, L->top, luaH_getnum(hvalue(o), n));
++  api_incr_top(L);
++  lua_unlock(L);
++}
++
++
++LUA_API void lua_createtable (lua_State *L, int narray, int nrec) {
++  lua_lock(L);
++  luaC_checkGC(L);
++  sethvalue(L, L->top, luaH_new(L, narray, nrec));
++  api_incr_top(L);
++  lua_unlock(L);
++}
++
++
++LUA_API int lua_getmetatable (lua_State *L, int objindex) {
++  const TValue *obj;
++  Table *mt = NULL;
++  int res;
++  lua_lock(L);
++  obj = index2adr(L, objindex);
++  switch (ttype(obj)) {
++    case LUA_TTABLE:
++      mt = hvalue(obj)->metatable;
++      break;
++    case LUA_TUSERDATA:
++      mt = uvalue(obj)->metatable;
++      break;
++    default:
++      mt = G(L)->mt[ttype(obj)];
++      break;
++  }
++  if (mt == NULL)
++    res = 0;
++  else {
++    sethvalue(L, L->top, mt);
++    api_incr_top(L);
++    res = 1;
++  }
++  lua_unlock(L);
++  return res;
++}
++
++
++LUA_API void lua_getfenv (lua_State *L, int idx) {
++  StkId o;
++  lua_lock(L);
++  o = index2adr(L, idx);
++  api_checkvalidindex(L, o);
++  switch (ttype(o)) {
++    case LUA_TFUNCTION:
++      sethvalue(L, L->top, clvalue(o)->c.env);
++      break;
++    case LUA_TUSERDATA:
++      sethvalue(L, L->top, uvalue(o)->env);
++      break;
++    case LUA_TTHREAD:
++      setobj2s(L, L->top,  gt(thvalue(o)));
++      break;
++    default:
++      setnilvalue(L->top);
++      break;
++  }
++  api_incr_top(L);
++  lua_unlock(L);
++}
++
++
++/*
++** set functions (stack -> Lua)
++*/
++
++
++LUA_API void lua_settable (lua_State *L, int idx) {
++  StkId t;
++  lua_lock(L);
++  api_checknelems(L, 2);
++  t = index2adr(L, idx);
++  api_checkvalidindex(L, t);
++  luaV_settable(L, t, L->top - 2, L->top - 1);
++  L->top -= 2;  /* pop index and value */
++  lua_unlock(L);
++}
++
++
++LUA_API void lua_setfield (lua_State *L, int idx, const char *k) {
++  StkId t;
++  TValue key;
++  lua_lock(L);
++  api_checknelems(L, 1);
++  t = index2adr(L, idx);
++  api_checkvalidindex(L, t);
++  setsvalue(L, &key, luaS_new(L, k));
++  luaV_settable(L, t, &key, L->top - 1);
++  L->top--;  /* pop value */
++  lua_unlock(L);
++}
++
++
++LUA_API void lua_rawset (lua_State *L, int idx) {
++  StkId t;
++  lua_lock(L);
++  api_checknelems(L, 2);
++  t = index2adr(L, idx);
++  api_check(L, ttistable(t));
++  setobj2t(L, luaH_set(L, hvalue(t), L->top-2), L->top-1);
++  luaC_barriert(L, hvalue(t), L->top-1);
++  L->top -= 2;
++  lua_unlock(L);
++}
++
++
++LUA_API void lua_rawseti (lua_State *L, int idx, int n) {
++  StkId o;
++  lua_lock(L);
++  api_checknelems(L, 1);
++  o = index2adr(L, idx);
++  api_check(L, ttistable(o));
++  setobj2t(L, luaH_setnum(L, hvalue(o), n), L->top-1);
++  luaC_barriert(L, hvalue(o), L->top-1);
++  L->top--;
++  lua_unlock(L);
++}
++
++
++LUA_API int lua_setmetatable (lua_State *L, int objindex) {
++  TValue *obj;
++  Table *mt;
++  lua_lock(L);
++  api_checknelems(L, 1);
++  obj = index2adr(L, objindex);
++  api_checkvalidindex(L, obj);
++  if (ttisnil(L->top - 1))
++    mt = NULL;
++  else {
++    api_check(L, ttistable(L->top - 1));
++    mt = hvalue(L->top - 1);
++  }
++  switch (ttype(obj)) {
++    case LUA_TTABLE: {
++      hvalue(obj)->metatable = mt;
++      if (mt)
++        luaC_objbarriert(L, hvalue(obj), mt);
++      break;
++    }
++    case LUA_TUSERDATA: {
++      uvalue(obj)->metatable = mt;
++      if (mt)
++        luaC_objbarrier(L, rawuvalue(obj), mt);
++      break;
++    }
++    default: {
++      G(L)->mt[ttype(obj)] = mt;
++      break;
++    }
++  }
++  L->top--;
++  lua_unlock(L);
++  return 1;
++}
++
++
++LUA_API int lua_setfenv (lua_State *L, int idx) {
++  StkId o;
++  int res = 1;
++  lua_lock(L);
++  api_checknelems(L, 1);
++  o = index2adr(L, idx);
++  api_checkvalidindex(L, o);
++  api_check(L, ttistable(L->top - 1));
++  switch (ttype(o)) {
++    case LUA_TFUNCTION:
++      clvalue(o)->c.env = hvalue(L->top - 1);
++      break;
++    case LUA_TUSERDATA:
++      uvalue(o)->env = hvalue(L->top - 1);
++      break;
++    case LUA_TTHREAD:
++      sethvalue(L, gt(thvalue(o)), hvalue(L->top - 1));
++      break;
++    default:
++      res = 0;
++      break;
++  }
++  if (res) luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1));
++  L->top--;
++  lua_unlock(L);
++  return res;
++}
++
++
++/*
++** `load' and `call' functions (run Lua code)
++*/
++
++
++#define adjustresults(L,nres) \
++    { if (nres == LUA_MULTRET && L->top >= L->ci->top) L->ci->top = L->top; }
++
++
++#define checkresults(L,na,nr) \
++     api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na)))
++      
++
++LUA_API void lua_call (lua_State *L, int nargs, int nresults) {
++  StkId func;
++  lua_lock(L);
++  api_checknelems(L, nargs+1);
++  checkresults(L, nargs, nresults);
++  func = L->top - (nargs+1);
++  luaD_call(L, func, nresults);
++  adjustresults(L, nresults);
++  lua_unlock(L);
++}
++
++
++
++/*
++** Execute a protected call.
++*/
++struct CallS {  /* data to `f_call' */
++  StkId func;
++  int nresults;
++};
++
++
++static void f_call (lua_State *L, void *ud) {
++  struct CallS *c = cast(struct CallS *, ud);
++  luaD_call(L, c->func, c->nresults);
++}
++
++
++
++LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc) {
++  struct CallS c;
++  int status;
++  ptrdiff_t func;
++  lua_lock(L);
++  api_checknelems(L, nargs+1);
++  checkresults(L, nargs, nresults);
++  if (errfunc == 0)
++    func = 0;
++  else {
++    StkId o = index2adr(L, errfunc);
++    api_checkvalidindex(L, o);
++    func = savestack(L, o);
++  }
++  c.func = L->top - (nargs+1);  /* function to be called */
++  c.nresults = nresults;
++  status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func);
++  adjustresults(L, nresults);
++  lua_unlock(L);
++  return status;
++}
++
++
++/*
++** Execute a protected C call.
++*/
++struct CCallS {  /* data to `f_Ccall' */
++  lua_CFunction func;
++  void *ud;
++};
++
++
++static void f_Ccall (lua_State *L, void *ud) {
++  struct CCallS *c = cast(struct CCallS *, ud);
++  Closure *cl;
++  cl = luaF_newCclosure(L, 0, getcurrenv(L));
++  cl->c.f = c->func;
++  setclvalue(L, L->top, cl);  /* push function */
++  api_incr_top(L);
++  setpvalue(L->top, c->ud);  /* push only argument */
++  api_incr_top(L);
++  luaD_call(L, L->top - 2, 0);
++}
++
++
++LUA_API int lua_cpcall (lua_State *L, lua_CFunction func, void *ud) {
++  struct CCallS c;
++  int status;
++  lua_lock(L);
++  c.func = func;
++  c.ud = ud;
++  status = luaD_pcall(L, f_Ccall, &c, savestack(L, L->top), 0);
++  lua_unlock(L);
++  return status;
++}
++
++
++LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data,
++                      const char *chunkname) {
++  ZIO z;
++  int status;
++  lua_lock(L);
++  if (!chunkname) chunkname = "?";
++  luaZ_init(L, &z, reader, data);
++  status = luaD_protectedparser(L, &z, chunkname);
++  lua_unlock(L);
++  return status;
++}
++
++
++LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data) {
++  int status;
++  TValue *o;
++  lua_lock(L);
++  api_checknelems(L, 1);
++  o = L->top - 1;
++  if (isLfunction(o))
++    status = luaU_dump(L, clvalue(o)->l.p, writer, data, 0);
++  else
++    status = 1;
++  lua_unlock(L);
++  return status;
++}
++
++
++LUA_API int  lua_status (lua_State *L) {
++  return L->status;
++}
++
++
++/*
++** Garbage-collection function
++*/
++
++LUA_API int lua_gc (lua_State *L, int what, int data) {
++  int res = 0;
++  global_State *g;
++  lua_lock(L);
++  g = G(L);
++  switch (what) {
++    case LUA_GCSTOP: {
++      g->GCthreshold = MAX_LUMEM;
++      break;
++    }
++    case LUA_GCRESTART: {
++      g->GCthreshold = g->totalbytes;
++      break;
++    }
++    case LUA_GCCOLLECT: {
++      luaC_fullgc(L);
++      break;
++    }
++    case LUA_GCCOUNT: {
++      /* GC values are expressed in Kbytes: #bytes/2^10 */
++      res = cast_int(g->totalbytes >> 10);
++      break;
++    }
++    case LUA_GCCOUNTB: {
++      res = cast_int(g->totalbytes & 0x3ff);
++      break;
++    }
++    case LUA_GCSTEP: {
++      lu_mem a = (cast(lu_mem, data) << 10);
++      if (a <= g->totalbytes)
++        g->GCthreshold = g->totalbytes - a;
++      else
++        g->GCthreshold = 0;
++      while (g->GCthreshold <= g->totalbytes) {
++        luaC_step(L);
++        if (g->gcstate == GCSpause) {  /* end of cycle? */
++          res = 1;  /* signal it */
++          break;
++        }
++      }
++      break;
++    }
++    case LUA_GCSETPAUSE: {
++      res = g->gcpause;
++      g->gcpause = data;
++      break;
++    }
++    case LUA_GCSETSTEPMUL: {
++      res = g->gcstepmul;
++      g->gcstepmul = data;
++      break;
++    }
++    default: res = -1;  /* invalid option */
++  }
++  lua_unlock(L);
++  return res;
++}
++
++
++
++/*
++** miscellaneous functions
++*/
++
++
++LUA_API int lua_error (lua_State *L) {
++  lua_lock(L);
++  api_checknelems(L, 1);
++  luaG_errormsg(L);
++  lua_unlock(L);
++  return 0;  /* to avoid warnings */
++}
++
++
++LUA_API int lua_next (lua_State *L, int idx) {
++  StkId t;
++  int more;
++  lua_lock(L);
++  t = index2adr(L, idx);
++  api_check(L, ttistable(t));
++  more = luaH_next(L, hvalue(t), L->top - 1);
++  if (more) {
++    api_incr_top(L);
++  }
++  else  /* no more elements */
++    L->top -= 1;  /* remove key */
++  lua_unlock(L);
++  return more;
++}
++
++
++LUA_API void lua_concat (lua_State *L, int n) {
++  lua_lock(L);
++  api_checknelems(L, n);
++  if (n >= 2) {
++    luaC_checkGC(L);
++    luaV_concat(L, n, cast_int(L->top - L->base) - 1);
++    L->top -= (n-1);
++  }
++  else if (n == 0) {  /* push empty string */
++    setsvalue2s(L, L->top, luaS_newlstr(L, "", 0));
++    api_incr_top(L);
++  }
++  /* else n == 1; nothing to do */
++  lua_unlock(L);
++}
++
++
++LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) {
++  lua_Alloc f;
++  lua_lock(L);
++  if (ud) *ud = G(L)->ud;
++  f = G(L)->frealloc;
++  lua_unlock(L);
++  return f;
++}
++
++
++LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) {
++  lua_lock(L);
++  G(L)->ud = ud;
++  G(L)->frealloc = f;
++  lua_unlock(L);
++}
++
++
++LUA_API void *lua_newuserdata (lua_State *L, size_t size) {
++  Udata *u;
++  lua_lock(L);
++  luaC_checkGC(L);
++  u = luaS_newudata(L, size, getcurrenv(L));
++  setuvalue(L, L->top, u);
++  api_incr_top(L);
++  lua_unlock(L);
++  return u + 1;
++}
++
++
++
++
++static const char *aux_upvalue (StkId fi, int n, TValue **val) {
++  Closure *f;
++  if (!ttisfunction(fi)) return NULL;
++  f = clvalue(fi);
++  if (f->c.isC) {
++    if (!(1 <= n && n <= f->c.nupvalues)) return NULL;
++    *val = &f->c.upvalue[n-1];
++    return "";
++  }
++  else {
++    Proto *p = f->l.p;
++    if (!(1 <= n && n <= p->sizeupvalues)) return NULL;
++    *val = f->l.upvals[n-1]->v;
++    return getstr(p->upvalues[n-1]);
++  }
++}
++
++
++LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) {
++  const char *name;
++  TValue *val;
++  lua_lock(L);
++  name = aux_upvalue(index2adr(L, funcindex), n, &val);
++  if (name) {
++    setobj2s(L, L->top, val);
++    api_incr_top(L);
++  }
++  lua_unlock(L);
++  return name;
++}
++
++
++LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {
++  const char *name;
++  TValue *val;
++  StkId fi;
++  lua_lock(L);
++  fi = index2adr(L, funcindex);
++  api_checknelems(L, 1);
++  name = aux_upvalue(fi, n, &val);
++  if (name) {
++    L->top--;
++    setobj(L, val, L->top);
++    luaC_barrier(L, clvalue(fi), L->top);
++  }
++  lua_unlock(L);
++  return name;
++}
++
+--- /dev/null
++++ b/extensions/LUA/lua/lapi.h
+@@ -0,0 +1,16 @@
++/*
++** $Id: lapi.h,v 2.2.1.1 2007/12/27 13:02:25 roberto Exp $
++** Auxiliary functions from Lua API
++** See Copyright Notice in lua.h
++*/
++
++#ifndef lapi_h
++#define lapi_h
++
++
++#include "lobject.h"
++
++
++LUAI_FUNC void luaA_pushobject (lua_State *L, const TValue *o);
++
++#endif
+--- /dev/null
++++ b/extensions/LUA/lua/lauxlib.c
+@@ -0,0 +1,674 @@
++/*
++** $Id: lauxlib.c,v 1.159.1.3 2008/01/21 13:20:51 roberto Exp $
++** Auxiliary functions for building Lua libraries
++** See Copyright Notice in lua.h
++*/
++
++#include <stdarg.h>
++
++#if !defined(__KERNEL__)
++#include <ctype.h>
++#include <errno.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#else
++#include <linux/ctype.h>
++#include <linux/errno.h>
++#include <linux/kernel.h>
++#include <linux/slab.h>
++#include <linux/string.h>
++#endif
++
++/* This file uses only the official API of Lua.
++** Any function declared here could be written as an application function.
++*/
++
++#define lauxlib_c
++#define LUA_LIB
++
++#include "lua.h"
++
++#include "lauxlib.h"
++
++
++#define FREELIST_REF  0       /* free list of references */
++
++
++/* convert a stack index to positive */
++#define abs_index(L, i)               ((i) > 0 || (i) <= LUA_REGISTRYINDEX ? (i) : \
++                                      lua_gettop(L) + (i) + 1)
++
++
++/*
++** {======================================================
++** Error-report functions
++** =======================================================
++*/
++
++
++LUALIB_API int luaL_argerror (lua_State *L, int narg, const char *extramsg) {
++  lua_Debug ar;
++  if (!lua_getstack(L, 0, &ar))  /* no stack frame? */
++    return luaL_error(L, "bad argument #%d (%s)", narg, extramsg);
++  lua_getinfo(L, "n", &ar);
++  if (strcmp(ar.namewhat, "method") == 0) {
++    narg--;  /* do not count `self' */
++    if (narg == 0)  /* error is in the self argument itself? */
++      return luaL_error(L, "calling " LUA_QS " on bad self (%s)",
++                           ar.name, extramsg);
++  }
++  if (ar.name == NULL)
++    ar.name = "?";
++  return luaL_error(L, "bad argument #%d to " LUA_QS " (%s)",
++                        narg, ar.name, extramsg);
++}
++
++
++LUALIB_API int luaL_typerror (lua_State *L, int narg, const char *tname) {
++  const char *msg = lua_pushfstring(L, "%s expected, got %s",
++                                    tname, luaL_typename(L, narg));
++  return luaL_argerror(L, narg, msg);
++}
++
++
++static void tag_error (lua_State *L, int narg, int tag) {
++  luaL_typerror(L, narg, lua_typename(L, tag));
++}
++
++
++LUALIB_API void luaL_where (lua_State *L, int level) {
++  lua_Debug ar;
++  if (lua_getstack(L, level, &ar)) {  /* check function at level */
++    lua_getinfo(L, "Sl", &ar);  /* get info about it */
++    if (ar.currentline > 0) {  /* is there info? */
++      lua_pushfstring(L, "%s:%d: ", ar.short_src, ar.currentline);
++      return;
++    }
++  }
++  lua_pushliteral(L, "");  /* else, no information available... */
++}
++
++
++LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) {
++  va_list argp;
++  va_start(argp, fmt);
++  luaL_where(L, 1);
++  lua_pushvfstring(L, fmt, argp);
++  va_end(argp);
++  lua_concat(L, 2);
++  return lua_error(L);
++}
++
++/* }====================================================== */
++
++
++LUALIB_API int luaL_checkoption (lua_State *L, int narg, const char *def,
++                                 const char *const lst[]) {
++  const char *name = (def) ? luaL_optstring(L, narg, def) :
++                             luaL_checkstring(L, narg);
++  int i;
++  for (i=0; lst[i]; i++)
++    if (strcmp(lst[i], name) == 0)
++      return i;
++  return luaL_argerror(L, narg,
++                       lua_pushfstring(L, "invalid option " LUA_QS, name));
++}
++
++
++LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) {
++  lua_getfield(L, LUA_REGISTRYINDEX, tname);  /* get registry.name */
++  if (!lua_isnil(L, -1))  /* name already in use? */
++    return 0;  /* leave previous value on top, but return 0 */
++  lua_pop(L, 1);
++  lua_newtable(L);  /* create metatable */
++  lua_pushvalue(L, -1);
++  lua_setfield(L, LUA_REGISTRYINDEX, tname);  /* registry.name = metatable */
++  return 1;
++}
++
++
++LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) {
++  void *p = lua_touserdata(L, ud);
++  if (p != NULL) {  /* value is a userdata? */
++    if (lua_getmetatable(L, ud)) {  /* does it have a metatable? */
++      lua_getfield(L, LUA_REGISTRYINDEX, tname);  /* get correct metatable */
++      if (lua_rawequal(L, -1, -2)) {  /* does it have the correct mt? */
++        lua_pop(L, 2);  /* remove both metatables */
++        return p;
++      }
++    }
++  }
++  luaL_typerror(L, ud, tname);  /* else error */
++  return NULL;  /* to avoid warnings */
++}
++
++
++LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *mes) {
++  if (!lua_checkstack(L, space))
++    luaL_error(L, "stack overflow (%s)", mes);
++}
++
++
++LUALIB_API void luaL_checktype (lua_State *L, int narg, int t) {
++  if (lua_type(L, narg) != t)
++    tag_error(L, narg, t);
++}
++
++
++LUALIB_API void luaL_checkany (lua_State *L, int narg) {
++  if (lua_type(L, narg) == LUA_TNONE)
++    luaL_argerror(L, narg, "value expected");
++}
++
++
++LUALIB_API const char *luaL_checklstring (lua_State *L, int narg, size_t *len) {
++  const char *s = lua_tolstring(L, narg, len);
++  if (!s) tag_error(L, narg, LUA_TSTRING);
++  return s;
++}
++
++
++LUALIB_API const char *luaL_optlstring (lua_State *L, int narg,
++                                        const char *def, size_t *len) {
++  if (lua_isnoneornil(L, narg)) {
++    if (len)
++      *len = (def ? strlen(def) : 0);
++    return def;
++  }
++  else return luaL_checklstring(L, narg, len);
++}
++
++
++LUALIB_API lua_Number luaL_checknumber (lua_State *L, int narg) {
++  lua_Number d = lua_tonumber(L, narg);
++  if (d == 0 && !lua_isnumber(L, narg))  /* avoid extra test when d is not 0 */
++    tag_error(L, narg, LUA_TNUMBER);
++  return d;
++}
++
++
++LUALIB_API lua_Number luaL_optnumber (lua_State *L, int narg, lua_Number def) {
++  return luaL_opt(L, luaL_checknumber, narg, def);
++}
++
++
++LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int narg) {
++  lua_Integer d = lua_tointeger(L, narg);
++  if (d == 0 && !lua_isnumber(L, narg))  /* avoid extra test when d is not 0 */
++    tag_error(L, narg, LUA_TNUMBER);
++  return d;
++}
++
++
++LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int narg,
++                                                      lua_Integer def) {
++  return luaL_opt(L, luaL_checkinteger, narg, def);
++}
++
++
++LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *event) {
++  if (!lua_getmetatable(L, obj))  /* no metatable? */
++    return 0;
++  lua_pushstring(L, event);
++  lua_rawget(L, -2);
++  if (lua_isnil(L, -1)) {
++    lua_pop(L, 2);  /* remove metatable and metafield */
++    return 0;
++  }
++  else {
++    lua_remove(L, -2);  /* remove only metatable */
++    return 1;
++  }
++}
++
++
++LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) {
++  obj = abs_index(L, obj);
++  if (!luaL_getmetafield(L, obj, event))  /* no metafield? */
++    return 0;
++  lua_pushvalue(L, obj);
++  lua_call(L, 1, 1);
++  return 1;
++}
++
++
++LUALIB_API void (luaL_register) (lua_State *L, const char *libname,
++                                const luaL_Reg *l) {
++  luaI_openlib(L, libname, l, 0);
++}
++
++
++static int libsize (const luaL_Reg *l) {
++  int size = 0;
++  for (; l->name; l++) size++;
++  return size;
++}
++
++
++LUALIB_API void luaI_openlib (lua_State *L, const char *libname,
++                              const luaL_Reg *l, int nup) {
++  if (libname) {
++    int size = libsize(l);
++    /* check whether lib already exists */
++    luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1);
++    lua_getfield(L, -1, libname);  /* get _LOADED[libname] */
++    if (!lua_istable(L, -1)) {  /* not found? */
++      lua_pop(L, 1);  /* remove previous result */
++      /* try global variable (and create one if it does not exist) */
++      if (luaL_findtable(L, LUA_GLOBALSINDEX, libname, size) != NULL)
++        luaL_error(L, "name conflict for module " LUA_QS, libname);
++      lua_pushvalue(L, -1);
++      lua_setfield(L, -3, libname);  /* _LOADED[libname] = new table */
++    }
++    lua_remove(L, -2);  /* remove _LOADED table */
++    lua_insert(L, -(nup+1));  /* move library table to below upvalues */
++  }
++  for (; l->name; l++) {
++    int i;
++    for (i=0; i<nup; i++)  /* copy upvalues to the top */
++      lua_pushvalue(L, -nup);
++    lua_pushcclosure(L, l->func, nup);
++    lua_setfield(L, -(nup+2), l->name);
++  }
++  lua_pop(L, nup);  /* remove upvalues */
++}
++
++
++
++/*
++** {======================================================
++** getn-setn: size for arrays
++** =======================================================
++*/
++
++#if defined(LUA_COMPAT_GETN)
++
++static int checkint (lua_State *L, int topop) {
++  int n = (lua_type(L, -1) == LUA_TNUMBER) ? lua_tointeger(L, -1) : -1;
++  lua_pop(L, topop);
++  return n;
++}
++
++
++static void getsizes (lua_State *L) {
++  lua_getfield(L, LUA_REGISTRYINDEX, "LUA_SIZES");
++  if (lua_isnil(L, -1)) {  /* no `size' table? */
++    lua_pop(L, 1);  /* remove nil */
++    lua_newtable(L);  /* create it */
++    lua_pushvalue(L, -1);  /* `size' will be its own metatable */
++    lua_setmetatable(L, -2);
++    lua_pushliteral(L, "kv");
++    lua_setfield(L, -2, "__mode");  /* metatable(N).__mode = "kv" */
++    lua_pushvalue(L, -1);
++    lua_setfield(L, LUA_REGISTRYINDEX, "LUA_SIZES");  /* store in register */
++  }
++}
++
++
++LUALIB_API void luaL_setn (lua_State *L, int t, int n) {
++  t = abs_index(L, t);
++  lua_pushliteral(L, "n");
++  lua_rawget(L, t);
++  if (checkint(L, 1) >= 0) {  /* is there a numeric field `n'? */
++    lua_pushliteral(L, "n");  /* use it */
++    lua_pushinteger(L, n);
++    lua_rawset(L, t);
++  }
++  else {  /* use `sizes' */
++    getsizes(L);
++    lua_pushvalue(L, t);
++    lua_pushinteger(L, n);
++    lua_rawset(L, -3);  /* sizes[t] = n */
++    lua_pop(L, 1);  /* remove `sizes' */
++  }
++}
++
++
++LUALIB_API int luaL_getn (lua_State *L, int t) {
++  int n;
++  t = abs_index(L, t);
++  lua_pushliteral(L, "n");  /* try t.n */
++  lua_rawget(L, t);
++  if ((n = checkint(L, 1)) >= 0) return n;
++  getsizes(L);  /* else try sizes[t] */
++  lua_pushvalue(L, t);
++  lua_rawget(L, -2);
++  if ((n = checkint(L, 2)) >= 0) return n;
++  return (int)lua_objlen(L, t);
++}
++
++#endif
++
++/* }====================================================== */
++
++
++
++LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const char *p,
++                                                               const char *r) {
++  const char *wild;
++  size_t l = strlen(p);
++  luaL_Buffer *b = (luaL_Buffer *)kmalloc(sizeof(luaL_Buffer) + BUFSIZ, GFP_ATOMIC);
++  if(!b) luaL_error(L, "luaL_gsub: cannot allocate memory");
++  luaL_buffinit(L, b);
++  while ((wild = strstr(s, p)) != NULL) {
++    luaL_addlstring(b, s, wild - s);  /* push prefix */
++    luaL_addstring(b, r);  /* push replacement in place of pattern */
++    s = wild + l;  /* continue after `p' */
++  }
++  luaL_addstring(b, s);  /* push last suffix */
++  luaL_pushresult(b);
++  kfree(b);
++  return lua_tostring(L, -1);
++}
++
++
++LUALIB_API const char *luaL_findtable (lua_State *L, int idx,
++                                       const char *fname, int szhint) {
++  const char *e;
++  lua_pushvalue(L, idx);
++  do {
++    e = strchr(fname, '.');
++    if (e == NULL) e = fname + strlen(fname);
++    lua_pushlstring(L, fname, e - fname);
++    lua_rawget(L, -2);
++    if (lua_isnil(L, -1)) {  /* no such field? */
++      lua_pop(L, 1);  /* remove this nil */
++      lua_createtable(L, 0, (*e == '.' ? 1 : szhint)); /* new table for field */
++      lua_pushlstring(L, fname, e - fname);
++      lua_pushvalue(L, -2);
++      lua_settable(L, -4);  /* set new table into field */
++    }
++    else if (!lua_istable(L, -1)) {  /* field has a non-table value? */
++      lua_pop(L, 2);  /* remove table and value */
++      return fname;  /* return problematic part of the name */
++    }
++    lua_remove(L, -2);  /* remove previous table */
++    fname = e + 1;
++  } while (*e == '.');
++  return NULL;
++}
++
++
++
++/*
++** {======================================================
++** Generic Buffer manipulation
++** =======================================================
++*/
++
++
++#define bufflen(B)    ((B)->p - (B)->buffer)
++#define bufffree(B)   ((size_t)(LUAL_BUFFERSIZE - bufflen(B)))
++
++#define LIMIT (LUA_MINSTACK/2)
++
++
++static int emptybuffer (luaL_Buffer *B) {
++  size_t l = bufflen(B);
++  if (l == 0) return 0;  /* put nothing on stack */
++  else {
++    lua_pushlstring(B->L, B->buffer, l);
++    B->p = B->buffer;
++    B->lvl++;
++    return 1;
++  }
++}
++
++
++static void adjuststack (luaL_Buffer *B) {
++  if (B->lvl > 1) {
++    lua_State *L = B->L;
++    int toget = 1;  /* number of levels to concat */
++    size_t toplen = lua_strlen(L, -1);
++    do {
++      size_t l = lua_strlen(L, -(toget+1));
++      if (B->lvl - toget + 1 >= LIMIT || toplen > l) {
++        toplen += l;
++        toget++;
++      }
++      else break;
++    } while (toget < B->lvl);
++    lua_concat(L, toget);
++    B->lvl = B->lvl - toget + 1;
++  }
++}
++
++
++LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B) {
++  if (emptybuffer(B))
++    adjuststack(B);
++  return B->buffer;
++}
++
++
++LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) {
++  while (l--)
++    luaL_addchar(B, *s++);
++}
++
++
++LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) {
++  luaL_addlstring(B, s, strlen(s));
++}
++
++
++LUALIB_API void luaL_pushresult (luaL_Buffer *B) {
++  emptybuffer(B);
++  lua_concat(B->L, B->lvl);
++  B->lvl = 1;
++}
++
++
++LUALIB_API void luaL_addvalue (luaL_Buffer *B) {
++  lua_State *L = B->L;
++  size_t vl;
++  const char *s = lua_tolstring(L, -1, &vl);
++  if (vl <= bufffree(B)) {  /* fit into buffer? */
++    memcpy(B->p, s, vl);  /* put it there */
++    B->p += vl;
++    lua_pop(L, 1);  /* remove from stack */
++  }
++  else {
++    if (emptybuffer(B))
++      lua_insert(L, -2);  /* put buffer before new value */
++    B->lvl++;  /* add new value into B stack */
++    adjuststack(B);
++  }
++}
++
++
++LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) {
++  B->L = L;
++  B->p = B->buffer;
++  B->lvl = 0;
++}
++
++/* }====================================================== */
++
++
++LUALIB_API int luaL_ref (lua_State *L, int t) {
++  int ref;
++  t = abs_index(L, t);
++  if (lua_isnil(L, -1)) {
++    lua_pop(L, 1);  /* remove from stack */
++    return LUA_REFNIL;  /* `nil' has a unique fixed reference */
++  }
++  lua_rawgeti(L, t, FREELIST_REF);  /* get first free element */
++  ref = (int)lua_tointeger(L, -1);  /* ref = t[FREELIST_REF] */
++  lua_pop(L, 1);  /* remove it from stack */
++  if (ref != 0) {  /* any free element? */
++    lua_rawgeti(L, t, ref);  /* remove it from list */
++    lua_rawseti(L, t, FREELIST_REF);  /* (t[FREELIST_REF] = t[ref]) */
++  }
++  else {  /* no free elements */
++    ref = (int)lua_objlen(L, t);
++    ref++;  /* create new reference */
++  }
++  lua_rawseti(L, t, ref);
++  return ref;
++}
++
++
++LUALIB_API void luaL_unref (lua_State *L, int t, int ref) {
++  if (ref >= 0) {
++    t = abs_index(L, t);
++    lua_rawgeti(L, t, FREELIST_REF);
++    lua_rawseti(L, t, ref);  /* t[ref] = t[FREELIST_REF] */
++    lua_pushinteger(L, ref);
++    lua_rawseti(L, t, FREELIST_REF);  /* t[FREELIST_REF] = ref */
++  }
++}
++
++
++
++/*
++** {======================================================
++** Load functions
++** =======================================================
++*/
++
++#if !defined(__KERNEL__)
++typedef struct LoadF {
++  int extraline;
++  FILE *f;
++  char buff[LUAL_BUFFERSIZE];
++} LoadF;
++
++
++static const char *getF (lua_State *L, void *ud, size_t *size) {
++  LoadF *lf = (LoadF *)ud;
++  (void)L;
++  if (lf->extraline) {
++    lf->extraline = 0;
++    *size = 1;
++    return "\n";
++  }
++  if (feof(lf->f)) return NULL;
++  *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f);
++  return (*size > 0) ? lf->buff : NULL;
++}
++
++
++static int errfile (lua_State *L, const char *what, int fnameindex) {
++  const char *serr = strerror(errno);
++  const char *filename = lua_tostring(L, fnameindex) + 1;
++  lua_pushfstring(L, "cannot %s %s: %s", what, filename, serr);
++  lua_remove(L, fnameindex);
++  return LUA_ERRFILE;
++}
++
++
++LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) {
++  LoadF lf;
++  int status, readstatus;
++  int c;
++  int fnameindex = lua_gettop(L) + 1;  /* index of filename on the stack */
++  lf.extraline = 0;
++  if (filename == NULL) {
++    lua_pushliteral(L, "=stdin");
++    lf.f = stdin;
++  }
++  else {
++    lua_pushfstring(L, "@%s", filename);
++    lf.f = fopen(filename, "r");
++    if (lf.f == NULL) return errfile(L, "open", fnameindex);
++  }
++  c = getc(lf.f);
++  if (c == '#') {  /* Unix exec. file? */
++    lf.extraline = 1;
++    while ((c = getc(lf.f)) != EOF && c != '\n') ;  /* skip first line */
++    if (c == '\n') c = getc(lf.f);
++  }
++  if (c == LUA_SIGNATURE[0] && filename) {  /* binary file? */
++    lf.f = freopen(filename, "rb", lf.f);  /* reopen in binary mode */
++    if (lf.f == NULL) return errfile(L, "reopen", fnameindex);
++    /* skip eventual `#!...' */
++   while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ;
++    lf.extraline = 0;
++  }
++  ungetc(c, lf.f);
++  status = lua_load(L, getF, &lf, lua_tostring(L, -1));
++  readstatus = ferror(lf.f);
++  if (filename) fclose(lf.f);  /* close file (even in case of errors) */
++  if (readstatus) {
++    lua_settop(L, fnameindex);  /* ignore results from `lua_load' */
++    return errfile(L, "read", fnameindex);
++  }
++  lua_remove(L, fnameindex);
++  return status;
++}
++#endif
++
++typedef struct LoadS {
++  const char *s;
++  size_t size;
++} LoadS;
++
++
++static const char *getS (lua_State *L, void *ud, size_t *size) {
++  LoadS *ls = (LoadS *)ud;
++  (void)L;
++  if (ls->size == 0) return NULL;
++  *size = ls->size;
++  ls->size = 0;
++  return ls->s;
++}
++
++
++LUALIB_API int luaL_loadbuffer (lua_State *L, const char *buff, size_t size,
++                                const char *name) {
++  LoadS ls;
++  ls.s = buff;
++  ls.size = size;
++  return lua_load(L, getS, &ls, name);
++}
++
++
++LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s) {
++  return luaL_loadbuffer(L, s, strlen(s), s);
++}
++
++
++
++/* }====================================================== */
++
++
++static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
++  (void)ud;
++  (void)osize;
++  if (nsize == 0) {
++#if !defined(__KERNEL__)
++    free(ptr);
++#else
++    kfree(ptr);
++#endif
++    return NULL;
++  }
++  else
++#if !defined(__KERNEL__)
++    return realloc(ptr, nsize);
++#else
++    return krealloc(ptr, nsize, GFP_ATOMIC);
++#endif
++}
++
++
++static int lpanic (lua_State *L) {
++  (void)L;  /* to avoid warnings */
++#if !defined(__KERNEL__)
++  fprintf(stderr, "PANIC: unprotected error in call to Lua API (%s)\n",
++#else
++  printk( "PANIC: unprotected error in call to Lua API (%s)\n",
++#endif
++                   lua_tostring(L, -1));
++  return 0;
++}
++
++
++LUALIB_API lua_State *luaL_newstate (void) {
++  lua_State *L = lua_newstate(l_alloc, NULL);
++  if (L) lua_atpanic(L, &lpanic);
++  return L;
++}
++
+--- /dev/null
++++ b/extensions/LUA/lua/lauxlib.h
+@@ -0,0 +1,184 @@
++/*
++** $Id: lauxlib.h,v 1.88.1.1 2007/12/27 13:02:25 roberto Exp $
++** Auxiliary functions for building Lua libraries
++** See Copyright Notice in lua.h
++*/
++
++
++#ifndef lauxlib_h
++#define lauxlib_h
++
++
++#include <stddef.h>
++#include <linux/slab.h>       /* for kmalloc and kfree when allocating luaL_Buffer */
++
++#if !defined(__KERNEL__)
++#include <stdio.h>
++#endif
++
++#include "lua.h"
++
++
++#if defined(LUA_COMPAT_GETN)
++LUALIB_API int (luaL_getn) (lua_State *L, int t);
++LUALIB_API void (luaL_setn) (lua_State *L, int t, int n);
++#else
++#define luaL_getn(L,i)          ((int)lua_objlen(L, i))
++#define luaL_setn(L,i,j)        ((void)0)  /* no op! */
++#endif
++
++#if defined(LUA_COMPAT_OPENLIB)
++#define luaI_openlib  luaL_openlib
++#endif
++
++
++/* extra error code for `luaL_load' */
++#define LUA_ERRFILE     (LUA_ERRERR+1)
++
++
++typedef struct luaL_Reg {
++  const char *name;
++  lua_CFunction func;
++} luaL_Reg;
++
++
++
++LUALIB_API void (luaI_openlib) (lua_State *L, const char *libname,
++                                const luaL_Reg *l, int nup);
++LUALIB_API void (luaL_register) (lua_State *L, const char *libname,
++                                const luaL_Reg *l);
++LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e);
++LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e);
++LUALIB_API int (luaL_typerror) (lua_State *L, int narg, const char *tname);
++LUALIB_API int (luaL_argerror) (lua_State *L, int numarg, const char *extramsg);
++LUALIB_API const char *(luaL_checklstring) (lua_State *L, int numArg,
++                                                          size_t *l);
++LUALIB_API const char *(luaL_optlstring) (lua_State *L, int numArg,
++                                          const char *def, size_t *l);
++LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int numArg);
++LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int nArg, lua_Number def);
++
++LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg);
++LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg,
++                                          lua_Integer def);
++
++LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg);
++LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t);
++LUALIB_API void (luaL_checkany) (lua_State *L, int narg);
++
++LUALIB_API int   (luaL_newmetatable) (lua_State *L, const char *tname);
++LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname);
++
++LUALIB_API void (luaL_where) (lua_State *L, int lvl);
++LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...);
++
++LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def,
++                                   const char *const lst[]);
++
++LUALIB_API int (luaL_ref) (lua_State *L, int t);
++LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);
++
++#if !defined(__KERNEL__)
++LUALIB_API int (luaL_loadfile) (lua_State *L, const char *filename);
++#endif
++
++LUALIB_API int (luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz,
++                                  const char *name);
++LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s);
++
++LUALIB_API lua_State *(luaL_newstate) (void);
++
++
++LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p,
++                                                  const char *r);
++
++LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx,
++                                         const char *fname, int szhint);
++
++
++
++
++/*
++** ===============================================================
++** some useful macros
++** ===============================================================
++*/
++
++#define luaL_argcheck(L, cond,numarg,extramsg)        \
++              ((void)((cond) || luaL_argerror(L, (numarg), (extramsg))))
++#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL))
++#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL))
++#define luaL_checkint(L,n)    ((int)luaL_checkinteger(L, (n)))
++#define luaL_optint(L,n,d)    ((int)luaL_optinteger(L, (n), (d)))
++#define luaL_checklong(L,n)   ((long)luaL_checkinteger(L, (n)))
++#define luaL_optlong(L,n,d)   ((long)luaL_optinteger(L, (n), (d)))
++
++#define luaL_typename(L,i)    lua_typename(L, lua_type(L,(i)))
++
++#if !defined(__KERNEL__)
++#define luaL_dofile(L, fn) \
++      (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))
++#endif
++
++#define luaL_dostring(L, s) \
++      (luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0))
++
++#define luaL_getmetatable(L,n)        (lua_getfield(L, LUA_REGISTRYINDEX, (n)))
++
++#define luaL_opt(L,f,n,d)     (lua_isnoneornil(L,(n)) ? (d) : f(L,(n)))
++
++/*
++** {======================================================
++** Generic Buffer manipulation
++** =======================================================
++*/
++
++
++
++typedef struct luaL_Buffer {
++  char *p;                    /* current position in buffer */
++  int lvl;  /* number of strings in the stack (level) */
++  lua_State *L;
++  char buffer[LUAL_BUFFERSIZE];
++} luaL_Buffer;
++
++#define luaL_addchar(B,c) \
++  ((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \
++   (*(B)->p++ = (char)(c)))
++
++/* compatibility only */
++#define luaL_putchar(B,c)     luaL_addchar(B,c)
++
++#define luaL_addsize(B,n)     ((B)->p += (n))
++
++
++LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B);
++LUALIB_API char *(luaL_prepbuffer) (luaL_Buffer *B);
++LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l);
++LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s);
++LUALIB_API void (luaL_addvalue) (luaL_Buffer *B);
++LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);
++
++
++/* }====================================================== */
++
++
++/* compatibility with ref system */
++
++/* pre-defined references */
++#define LUA_NOREF       (-2)
++#define LUA_REFNIL      (-1)
++
++#define lua_ref(L,lock) ((lock) ? luaL_ref(L, LUA_REGISTRYINDEX) : \
++      (lua_pushstring(L, "unlocked references are obsolete"), lua_error(L), 0))
++
++#define lua_unref(L,ref)        luaL_unref(L, LUA_REGISTRYINDEX, (ref))
++
++#define lua_getref(L,ref)       lua_rawgeti(L, LUA_REGISTRYINDEX, (ref))
++
++
++#define luaL_reg      luaL_Reg
++
++#endif
++
++
+--- /dev/null
++++ b/extensions/LUA/lua/lbaselib.c
+@@ -0,0 +1,647 @@
++/*
++** $Id: lbaselib.c,v 1.191.1.6 2008/02/14 16:46:22 roberto Exp $
++** Basic library
++** See Copyright Notice in lua.h
++*/
++
++
++#include <linux/kernel.h>
++#include <linux/ctype.h>
++#include <linux/string.h>
++
++#define lbaselib_c
++#define LUA_LIB
++
++#include "lua.h"
++
++#include "lauxlib.h"
++#include "lualib.h"
++
++
++
++
++/*
++** If your system does not support `stdout', you can just remove this function.
++** If you need, you can define your own `print' function, following this
++** model but changing `fputs' to put the strings at a proper place
++** (a console window or a log file, for instance).
++*/
++static int luaB_print (lua_State *L) {
++  int n = lua_gettop(L);  /* number of arguments */
++  int i;
++  lua_getglobal(L, "tostring");
++  for (i=1; i<=n; i++) {
++    const char *s;
++    lua_pushvalue(L, -1);  /* function to be called */
++    lua_pushvalue(L, i);   /* value to print */
++    lua_call(L, 1, 1);
++    s = lua_tostring(L, -1);  /* get result */
++    if (s == NULL)
++      return luaL_error(L, LUA_QL("tostring") " must return a string to "
++                           LUA_QL("print"));
++    printk(KERN_INFO "LUA[print]: %s", s);
++    lua_pop(L, 1);  /* pop result */
++  }
++  return 0;
++}
++
++
++static int luaB_tonumber (lua_State *L) {
++  int base = luaL_optint(L, 2, 10);
++  if (base == 10) {  /* standard conversion */
++    luaL_checkany(L, 1);
++    if (lua_isnumber(L, 1)) {
++      lua_pushnumber(L, lua_tonumber(L, 1));
++      return 1;
++    }
++  }
++  else {
++    const char *s1 = luaL_checkstring(L, 1);
++    char *s2;
++    unsigned long n;
++    luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range");
++    n = simple_strtoul(s1, &s2, base);
++    if (s1 != s2) {  /* at least one valid digit? */
++      while (isspace((unsigned char)(*s2))) s2++;  /* skip trailing spaces */
++      if (*s2 == '\0') {  /* no invalid trailing characters? */
++        lua_pushnumber(L, (lua_Number)n);
++        return 1;
++      }
++    }
++  }
++  lua_pushnil(L);  /* else not a number */
++  return 1;
++}
++
++
++static int luaB_error (lua_State *L) {
++  int level = luaL_optint(L, 2, 1);
++  lua_settop(L, 1);
++  if (lua_isstring(L, 1) && level > 0) {  /* add extra information? */
++    luaL_where(L, level);
++    lua_pushvalue(L, 1);
++    lua_concat(L, 2);
++  }
++  return lua_error(L);
++}
++
++
++static int luaB_getmetatable (lua_State *L) {
++  luaL_checkany(L, 1);
++  if (!lua_getmetatable(L, 1)) {
++    lua_pushnil(L);
++    return 1;  /* no metatable */
++  }
++  luaL_getmetafield(L, 1, "__metatable");
++  return 1;  /* returns either __metatable field (if present) or metatable */
++}
++
++
++static int luaB_setmetatable (lua_State *L) {
++  int t = lua_type(L, 2);
++  luaL_checktype(L, 1, LUA_TTABLE);
++  luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2,
++                    "nil or table expected");
++  if (luaL_getmetafield(L, 1, "__metatable"))
++    luaL_error(L, "cannot change a protected metatable");
++  lua_settop(L, 2);
++  lua_setmetatable(L, 1);
++  return 1;
++}
++
++
++static void getfunc (lua_State *L, int opt) {
++  if (lua_isfunction(L, 1)) lua_pushvalue(L, 1);
++  else {
++    lua_Debug ar;
++    int level = opt ? luaL_optint(L, 1, 1) : luaL_checkint(L, 1);
++    luaL_argcheck(L, level >= 0, 1, "level must be non-negative");
++    if (lua_getstack(L, level, &ar) == 0)
++      luaL_argerror(L, 1, "invalid level");
++    lua_getinfo(L, "f", &ar);
++    if (lua_isnil(L, -1))
++      luaL_error(L, "no function environment for tail call at level %d",
++                    level);
++  }
++}
++
++
++static int luaB_getfenv (lua_State *L) {
++  getfunc(L, 1);
++  if (lua_iscfunction(L, -1))  /* is a C function? */
++    lua_pushvalue(L, LUA_GLOBALSINDEX);  /* return the thread's global env. */
++  else
++    lua_getfenv(L, -1);
++  return 1;
++}
++
++
++static int luaB_setfenv (lua_State *L) {
++  luaL_checktype(L, 2, LUA_TTABLE);
++  getfunc(L, 0);
++  lua_pushvalue(L, 2);
++  if (lua_isnumber(L, 1) && lua_tonumber(L, 1) == 0) {
++    /* change environment of current thread */
++    lua_pushthread(L);
++    lua_insert(L, -2);
++    lua_setfenv(L, -2);
++    return 0;
++  }
++  else if (lua_iscfunction(L, -2) || lua_setfenv(L, -2) == 0)
++    luaL_error(L,
++          LUA_QL("setfenv") " cannot change environment of given object");
++  return 1;
++}
++
++
++static int luaB_rawequal (lua_State *L) {
++  luaL_checkany(L, 1);
++  luaL_checkany(L, 2);
++  lua_pushboolean(L, lua_rawequal(L, 1, 2));
++  return 1;
++}
++
++
++static int luaB_rawget (lua_State *L) {
++  luaL_checktype(L, 1, LUA_TTABLE);
++  luaL_checkany(L, 2);
++  lua_settop(L, 2);
++  lua_rawget(L, 1);
++  return 1;
++}
++
++static int luaB_rawset (lua_State *L) {
++  luaL_checktype(L, 1, LUA_TTABLE);
++  luaL_checkany(L, 2);
++  luaL_checkany(L, 3);
++  lua_settop(L, 3);
++  lua_rawset(L, 1);
++  return 1;
++}
++
++
++static int luaB_gcinfo (lua_State *L) {
++  lua_pushinteger(L, lua_getgccount(L));
++  return 1;
++}
++
++static int luaB_collectgarbage (lua_State *L) {
++  static const char *const opts[] = {"stop", "restart", "collect",
++    "count", "step", "setpause", "setstepmul", NULL};
++  static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT,
++    LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL};
++  int o = luaL_checkoption(L, 1, "collect", opts);
++  int ex = luaL_optint(L, 2, 0);
++  int res = lua_gc(L, optsnum[o], ex);
++  switch (optsnum[o]) {
++    case LUA_GCCOUNT: {
++      int b = lua_gc(L, LUA_GCCOUNTB, 0);
++      lua_pushnumber(L, res + ((lua_Number)b/1024));
++      return 1;
++    }
++    case LUA_GCSTEP: {
++      lua_pushboolean(L, res);
++      return 1;
++    }
++    default: {
++      lua_pushnumber(L, res);
++      return 1;
++    }
++  }
++}
++
++
++static int luaB_type (lua_State *L) {
++  luaL_checkany(L, 1);
++  lua_pushstring(L, luaL_typename(L, 1));
++  return 1;
++}
++
++
++static int luaB_next (lua_State *L) {
++  luaL_checktype(L, 1, LUA_TTABLE);
++  lua_settop(L, 2);  /* create a 2nd argument if there isn't one */
++  if (lua_next(L, 1))
++    return 2;
++  else {
++    lua_pushnil(L);
++    return 1;
++  }
++}
++
++
++static int luaB_pairs (lua_State *L) {
++  luaL_checktype(L, 1, LUA_TTABLE);
++  lua_pushvalue(L, lua_upvalueindex(1));  /* return generator, */
++  lua_pushvalue(L, 1);  /* state, */
++  lua_pushnil(L);  /* and initial value */
++  return 3;
++}
++
++
++static int ipairsaux (lua_State *L) {
++  int i = luaL_checkint(L, 2);
++  luaL_checktype(L, 1, LUA_TTABLE);
++  i++;  /* next value */
++  lua_pushinteger(L, i);
++  lua_rawgeti(L, 1, i);
++  return (lua_isnil(L, -1)) ? 0 : 2;
++}
++
++
++static int luaB_ipairs (lua_State *L) {
++  luaL_checktype(L, 1, LUA_TTABLE);
++  lua_pushvalue(L, lua_upvalueindex(1));  /* return generator, */
++  lua_pushvalue(L, 1);  /* state, */
++  lua_pushinteger(L, 0);  /* and initial value */
++  return 3;
++}
++
++
++static int load_aux (lua_State *L, int status) {
++  if (status == 0)  /* OK? */
++    return 1;
++  else {
++    lua_pushnil(L);
++    lua_insert(L, -2);  /* put before error message */
++    return 2;  /* return nil plus error message */
++  }
++}
++
++
++static int luaB_loadstring (lua_State *L) {
++  size_t l;
++  const char *s = luaL_checklstring(L, 1, &l);
++  const char *chunkname = luaL_optstring(L, 2, s);
++  return load_aux(L, luaL_loadbuffer(L, s, l, chunkname));
++}
++
++/*
++static int luaB_loadfile (lua_State *L) {
++  const char *fname = luaL_optstring(L, 1, NULL);
++  return load_aux(L, luaL_loadfile(L, fname));
++}
++*/
++
++/*
++** Reader for generic `load' function: `lua_load' uses the
++** stack for internal stuff, so the reader cannot change the
++** stack top. Instead, it keeps its resulting string in a
++** reserved slot inside the stack.
++*/
++static const char *generic_reader (lua_State *L, void *ud, size_t *size) {
++  (void)ud;  /* to avoid warnings */
++  luaL_checkstack(L, 2, "too many nested functions");
++  lua_pushvalue(L, 1);  /* get function */
++  lua_call(L, 0, 1);  /* call it */
++  if (lua_isnil(L, -1)) {
++    *size = 0;
++    return NULL;
++  }
++  else if (lua_isstring(L, -1)) {
++    lua_replace(L, 3);  /* save string in a reserved stack slot */
++    return lua_tolstring(L, 3, size);
++  }
++  else luaL_error(L, "reader function must return a string");
++  return NULL;  /* to avoid warnings */
++}
++
++
++static int luaB_load (lua_State *L) {
++  int status;
++  const char *cname = luaL_optstring(L, 2, "=(load)");
++  luaL_checktype(L, 1, LUA_TFUNCTION);
++  lua_settop(L, 3);  /* function, eventual name, plus one reserved slot */
++  status = lua_load(L, generic_reader, NULL, cname);
++  return load_aux(L, status);
++}
++
++/*
++static int luaB_dofile (lua_State *L) {
++  const char *fname = luaL_optstring(L, 1, NULL);
++  int n = lua_gettop(L);
++  if (luaL_loadfile(L, fname) != 0) lua_error(L);
++  lua_call(L, 0, LUA_MULTRET);
++  return lua_gettop(L) - n;
++}
++*/
++
++static int luaB_assert (lua_State *L) {
++  luaL_checkany(L, 1);
++  if (!lua_toboolean(L, 1))
++    return luaL_error(L, "%s", luaL_optstring(L, 2, "assertion failed!"));
++  return lua_gettop(L);
++}
++
++
++static int luaB_unpack (lua_State *L) {
++  int i, e, n;
++  luaL_checktype(L, 1, LUA_TTABLE);
++  i = luaL_optint(L, 2, 1);
++  e = luaL_opt(L, luaL_checkint, 3, luaL_getn(L, 1));
++  if (i > e) return 0;  /* empty range */
++  n = e - i + 1;  /* number of elements */
++  if (n <= 0 || !lua_checkstack(L, n))  /* n <= 0 means arith. overflow */
++    return luaL_error(L, "too many results to unpack");
++  lua_rawgeti(L, 1, i);  /* push arg[i] (avoiding overflow problems) */
++  while (i++ < e)  /* push arg[i + 1...e] */
++    lua_rawgeti(L, 1, i);
++  return n;
++}
++
++
++static int luaB_select (lua_State *L) {
++  int n = lua_gettop(L);
++  if (lua_type(L, 1) == LUA_TSTRING && *lua_tostring(L, 1) == '#') {
++    lua_pushinteger(L, n-1);
++    return 1;
++  }
++  else {
++    int i = luaL_checkint(L, 1);
++    if (i < 0) i = n + i;
++    else if (i > n) i = n;
++    luaL_argcheck(L, 1 <= i, 1, "index out of range");
++    return n - i;
++  }
++}
++
++
++static int luaB_pcall (lua_State *L) {
++  int status;
++  luaL_checkany(L, 1);
++  status = lua_pcall(L, lua_gettop(L) - 1, LUA_MULTRET, 0);
++  lua_pushboolean(L, (status == 0));
++  lua_insert(L, 1);
++  return lua_gettop(L);  /* return status + all results */
++}
++
++
++static int luaB_xpcall (lua_State *L) {
++  int status;
++  luaL_checkany(L, 2);
++  lua_settop(L, 2);
++  lua_insert(L, 1);  /* put error function under function to be called */
++  status = lua_pcall(L, 0, LUA_MULTRET, 1);
++  lua_pushboolean(L, (status == 0));
++  lua_replace(L, 1);
++  return lua_gettop(L);  /* return status + all results */
++}
++
++
++static int luaB_tostring (lua_State *L) {
++  luaL_checkany(L, 1);
++  if (luaL_callmeta(L, 1, "__tostring"))  /* is there a metafield? */
++    return 1;  /* use its value */
++  switch (lua_type(L, 1)) {
++    case LUA_TNUMBER:
++      lua_pushstring(L, lua_tostring(L, 1));
++      break;
++    case LUA_TSTRING:
++      lua_pushvalue(L, 1);
++      break;
++    case LUA_TBOOLEAN:
++      lua_pushstring(L, (lua_toboolean(L, 1) ? "true" : "false"));
++      break;
++    case LUA_TNIL:
++      lua_pushliteral(L, "nil");
++      break;
++    default:
++      lua_pushfstring(L, "%s: %p", luaL_typename(L, 1), lua_topointer(L, 1));
++      break;
++  }
++  return 1;
++}
++
++
++static int luaB_newproxy (lua_State *L) {
++  lua_settop(L, 1);
++  lua_newuserdata(L, 0);  /* create proxy */
++  if (lua_toboolean(L, 1) == 0)
++    return 1;  /* no metatable */
++  else if (lua_isboolean(L, 1)) {
++    lua_newtable(L);  /* create a new metatable `m' ... */
++    lua_pushvalue(L, -1);  /* ... and mark `m' as a valid metatable */
++    lua_pushboolean(L, 1);
++    lua_rawset(L, lua_upvalueindex(1));  /* weaktable[m] = true */
++  }
++  else {
++    int validproxy = 0;  /* to check if weaktable[metatable(u)] == true */
++    if (lua_getmetatable(L, 1)) {
++      lua_rawget(L, lua_upvalueindex(1));
++      validproxy = lua_toboolean(L, -1);
++      lua_pop(L, 1);  /* remove value */
++    }
++    luaL_argcheck(L, validproxy, 1, "boolean or proxy expected");
++    lua_getmetatable(L, 1);  /* metatable is valid; get it */
++  }
++  lua_setmetatable(L, 2);
++  return 1;
++}
++
++
++static const luaL_Reg base_funcs[] = {
++  {"assert", luaB_assert},
++  {"collectgarbage", luaB_collectgarbage},
++//  {"dofile", luaB_dofile},
++  {"error", luaB_error},
++  {"gcinfo", luaB_gcinfo},
++  {"getfenv", luaB_getfenv},
++  {"getmetatable", luaB_getmetatable},
++//  {"loadfile", luaB_loadfile},
++  {"load", luaB_load},
++  {"loadstring", luaB_loadstring},
++  {"next", luaB_next},
++  {"pcall", luaB_pcall},
++  {"print", luaB_print},
++  {"rawequal", luaB_rawequal},
++  {"rawget", luaB_rawget},
++  {"rawset", luaB_rawset},
++  {"select", luaB_select},
++  {"setfenv", luaB_setfenv},
++  {"setmetatable", luaB_setmetatable},
++  {"tonumber", luaB_tonumber},
++  {"tostring", luaB_tostring},
++  {"type", luaB_type},
++  {"unpack", luaB_unpack},
++  {"xpcall", luaB_xpcall},
++  {NULL, NULL}
++};
++
++
++/*
++** {======================================================
++** Coroutine library
++** =======================================================
++*/
++
++#define CO_RUN        0       /* running */
++#define CO_SUS        1       /* suspended */
++#define CO_NOR        2       /* 'normal' (it resumed another coroutine) */
++#define CO_DEAD       3
++
++static const char *const statnames[] =
++    {"running", "suspended", "normal", "dead"};
++
++static int costatus (lua_State *L, lua_State *co) {
++  if (L == co) return CO_RUN;
++  switch (lua_status(co)) {
++    case LUA_YIELD:
++      return CO_SUS;
++    case 0: {
++      lua_Debug ar;
++      if (lua_getstack(co, 0, &ar) > 0)  /* does it have frames? */
++        return CO_NOR;  /* it is running */
++      else if (lua_gettop(co) == 0)
++          return CO_DEAD;
++      else
++        return CO_SUS;  /* initial state */
++    }
++    default:  /* some error occured */
++      return CO_DEAD;
++  }
++}
++
++
++static int luaB_costatus (lua_State *L) {
++  lua_State *co = lua_tothread(L, 1);
++  luaL_argcheck(L, co, 1, "coroutine expected");
++  lua_pushstring(L, statnames[costatus(L, co)]);
++  return 1;
++}
++
++
++static int auxresume (lua_State *L, lua_State *co, int narg) {
++  int status = costatus(L, co);
++  if (!lua_checkstack(co, narg))
++    luaL_error(L, "too many arguments to resume");
++  if (status != CO_SUS) {
++    lua_pushfstring(L, "cannot resume %s coroutine", statnames[status]);
++    return -1;  /* error flag */
++  }
++  lua_xmove(L, co, narg);
++  lua_setlevel(L, co);
++  status = lua_resume(co, narg);
++  if (status == 0 || status == LUA_YIELD) {
++    int nres = lua_gettop(co);
++    if (!lua_checkstack(L, nres + 1))
++      luaL_error(L, "too many results to resume");
++    lua_xmove(co, L, nres);  /* move yielded values */
++    return nres;
++  }
++  else {
++    lua_xmove(co, L, 1);  /* move error message */
++    return -1;  /* error flag */
++  }
++}
++
++
++static int luaB_coresume (lua_State *L) {
++  lua_State *co = lua_tothread(L, 1);
++  int r;
++  luaL_argcheck(L, co, 1, "coroutine expected");
++  r = auxresume(L, co, lua_gettop(L) - 1);
++  if (r < 0) {
++    lua_pushboolean(L, 0);
++    lua_insert(L, -2);
++    return 2;  /* return false + error message */
++  }
++  else {
++    lua_pushboolean(L, 1);
++    lua_insert(L, -(r + 1));
++    return r + 1;  /* return true + `resume' returns */
++  }
++}
++
++
++static int luaB_auxwrap (lua_State *L) {
++  lua_State *co = lua_tothread(L, lua_upvalueindex(1));
++  int r = auxresume(L, co, lua_gettop(L));
++  if (r < 0) {
++    if (lua_isstring(L, -1)) {  /* error object is a string? */
++      luaL_where(L, 1);  /* add extra info */
++      lua_insert(L, -2);
++      lua_concat(L, 2);
++    }
++    lua_error(L);  /* propagate error */
++  }
++  return r;
++}
++
++
++static int luaB_cocreate (lua_State *L) {
++  lua_State *NL = lua_newthread(L);
++  luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), 1,
++    "Lua function expected");
++  lua_pushvalue(L, 1);  /* move function to top */
++  lua_xmove(L, NL, 1);  /* move function from L to NL */
++  return 1;
++}
++
++
++static int luaB_cowrap (lua_State *L) {
++  luaB_cocreate(L);
++  lua_pushcclosure(L, luaB_auxwrap, 1);
++  return 1;
++}
++
++
++static int luaB_yield (lua_State *L) {
++  return lua_yield(L, lua_gettop(L));
++}
++
++
++static int luaB_corunning (lua_State *L) {
++  if (lua_pushthread(L))
++    lua_pushnil(L);  /* main thread is not a coroutine */
++  return 1;
++}
++
++
++static const luaL_Reg co_funcs[] = {
++  {"create", luaB_cocreate},
++  {"resume", luaB_coresume},
++  {"running", luaB_corunning},
++  {"status", luaB_costatus},
++  {"wrap", luaB_cowrap},
++  {"yield", luaB_yield},
++  {NULL, NULL}
++};
++
++/* }====================================================== */
++
++
++static void auxopen (lua_State *L, const char *name,
++                     lua_CFunction f, lua_CFunction u) {
++  lua_pushcfunction(L, u);
++  lua_pushcclosure(L, f, 1);
++  lua_setfield(L, -2, name);
++}
++
++
++static void base_open (lua_State *L) {
++  /* set global _G */
++  lua_pushvalue(L, LUA_GLOBALSINDEX);
++  lua_setglobal(L, "_G");
++  /* open lib into global table */
++  luaL_register(L, "_G", base_funcs);
++  lua_pushliteral(L, LUA_VERSION);
++  lua_setglobal(L, "_VERSION");  /* set global _VERSION */
++  /* `ipairs' and `pairs' need auxliliary functions as upvalues */
++  auxopen(L, "ipairs", luaB_ipairs, ipairsaux);
++  auxopen(L, "pairs", luaB_pairs, luaB_next);
++  /* `newproxy' needs a weaktable as upvalue */
++  lua_createtable(L, 0, 1);  /* new table `w' */
++  lua_pushvalue(L, -1);  /* `w' will be its own metatable */
++  lua_setmetatable(L, -2);
++  lua_pushliteral(L, "kv");
++  lua_setfield(L, -2, "__mode");  /* metatable(w).__mode = "kv" */
++  lua_pushcclosure(L, luaB_newproxy, 1);
++  lua_setglobal(L, "newproxy");  /* set global `newproxy' */
++}
++
++
++LUALIB_API int luaopen_base (lua_State *L) {
++  base_open(L);
++  luaL_register(L, LUA_COLIBNAME, co_funcs);
++  return 2;
++}
+--- /dev/null
++++ b/extensions/LUA/lua/lcode.c
+@@ -0,0 +1,838 @@
++/*
++** $Id: lcode.c,v 2.25.1.3 2007/12/28 15:32:23 roberto Exp $
++** Code generator for Lua
++** See Copyright Notice in lua.h
++*/
++
++#include <stdlib.h>
++
++#define lcode_c
++#define LUA_CORE
++
++#include "lua.h"
++
++#include "lcode.h"
++#include "ldebug.h"
++#include "ldo.h"
++#include "lgc.h"
++#include "llex.h"
++#include "lmem.h"
++#include "lobject.h"
++#include "lopcodes.h"
++#include "lparser.h"
++#include "ltable.h"
++
++
++#define hasjumps(e)   ((e)->t != (e)->f)
++
++
++static int isnumeral(expdesc *e) {
++  return (e->k == VKNUM && e->t == NO_JUMP && e->f == NO_JUMP);
++}
++
++
++void luaK_nil (FuncState *fs, int from, int n) {
++  Instruction *previous;
++  if (fs->pc > fs->lasttarget) {  /* no jumps to current position? */
++    if (fs->pc == 0) {  /* function start? */
++      if (from >= fs->nactvar)
++        return;  /* positions are already clean */
++    }
++    else {
++      previous = &fs->f->code[fs->pc-1];
++      if (GET_OPCODE(*previous) == OP_LOADNIL) {
++        int pfrom = GETARG_A(*previous);
++        int pto = GETARG_B(*previous);
++        if (pfrom <= from && from <= pto+1) {  /* can connect both? */
++          if (from+n-1 > pto)
++            SETARG_B(*previous, from+n-1);
++          return;
++        }
++      }
++    }
++  }
++  luaK_codeABC(fs, OP_LOADNIL, from, from+n-1, 0);  /* else no optimization */
++}
++
++
++int luaK_jump (FuncState *fs) {
++  int jpc = fs->jpc;  /* save list of jumps to here */
++  int j;
++  fs->jpc = NO_JUMP;
++  j = luaK_codeAsBx(fs, OP_JMP, 0, NO_JUMP);
++  luaK_concat(fs, &j, jpc);  /* keep them on hold */
++  return j;
++}
++
++
++void luaK_ret (FuncState *fs, int first, int nret) {
++  luaK_codeABC(fs, OP_RETURN, first, nret+1, 0);
++}
++
++
++static int condjump (FuncState *fs, OpCode op, int A, int B, int C) {
++  luaK_codeABC(fs, op, A, B, C);
++  return luaK_jump(fs);
++}
++
++
++static void fixjump (FuncState *fs, int pc, int dest) {
++  Instruction *jmp = &fs->f->code[pc];
++  int offset = dest-(pc+1);
++  lua_assert(dest != NO_JUMP);
++  if (abs(offset) > MAXARG_sBx)
++    luaX_syntaxerror(fs->ls, "control structure too long");
++  SETARG_sBx(*jmp, offset);
++}
++
++
++/*
++** returns current `pc' and marks it as a jump target (to avoid wrong
++** optimizations with consecutive instructions not in the same basic block).
++*/
++int luaK_getlabel (FuncState *fs) {
++  fs->lasttarget = fs->pc;
++  return fs->pc;
++}
++
++
++static int getjump (FuncState *fs, int pc) {
++  int offset = GETARG_sBx(fs->f->code[pc]);
++  if (offset == NO_JUMP)  /* point to itself represents end of list */
++    return NO_JUMP;  /* end of list */
++  else
++    return (pc+1)+offset;  /* turn offset into absolute position */
++}
++
++
++static Instruction *getjumpcontrol (FuncState *fs, int pc) {
++  Instruction *pi = &fs->f->code[pc];
++  if (pc >= 1 && testTMode(GET_OPCODE(*(pi-1))))
++    return pi-1;
++  else
++    return pi;
++}
++
++
++/*
++** check whether list has any jump that do not produce a value
++** (or produce an inverted value)
++*/
++static int need_value (FuncState *fs, int list) {
++  for (; list != NO_JUMP; list = getjump(fs, list)) {
++    Instruction i = *getjumpcontrol(fs, list);
++    if (GET_OPCODE(i) != OP_TESTSET) return 1;
++  }
++  return 0;  /* not found */
++}
++
++
++static int patchtestreg (FuncState *fs, int node, int reg) {
++  Instruction *i = getjumpcontrol(fs, node);
++  if (GET_OPCODE(*i) != OP_TESTSET)
++    return 0;  /* cannot patch other instructions */
++  if (reg != NO_REG && reg != GETARG_B(*i))
++    SETARG_A(*i, reg);
++  else  /* no register to put value or register already has the value */
++    *i = CREATE_ABC(OP_TEST, GETARG_B(*i), 0, GETARG_C(*i));
++
++  return 1;
++}
++
++
++static void removevalues (FuncState *fs, int list) {
++  for (; list != NO_JUMP; list = getjump(fs, list))
++      patchtestreg(fs, list, NO_REG);
++}
++
++
++static void patchlistaux (FuncState *fs, int list, int vtarget, int reg,
++                          int dtarget) {
++  while (list != NO_JUMP) {
++    int next = getjump(fs, list);
++    if (patchtestreg(fs, list, reg))
++      fixjump(fs, list, vtarget);
++    else
++      fixjump(fs, list, dtarget);  /* jump to default target */
++    list = next;
++  }
++}
++
++
++static void dischargejpc (FuncState *fs) {
++  patchlistaux(fs, fs->jpc, fs->pc, NO_REG, fs->pc);
++  fs->jpc = NO_JUMP;
++}
++
++
++void luaK_patchlist (FuncState *fs, int list, int target) {
++  if (target == fs->pc)
++    luaK_patchtohere(fs, list);
++  else {
++    lua_assert(target < fs->pc);
++    patchlistaux(fs, list, target, NO_REG, target);
++  }
++}
++
++
++void luaK_patchtohere (FuncState *fs, int list) {
++  luaK_getlabel(fs);
++  luaK_concat(fs, &fs->jpc, list);
++}
++
++
++void luaK_concat (FuncState *fs, int *l1, int l2) {
++  if (l2 == NO_JUMP) return;
++  else if (*l1 == NO_JUMP)
++    *l1 = l2;
++  else {
++    int list = *l1;
++    int next;
++    while ((next = getjump(fs, list)) != NO_JUMP)  /* find last element */
++      list = next;
++    fixjump(fs, list, l2);
++  }
++}
++
++
++void luaK_checkstack (FuncState *fs, int n) {
++  int newstack = fs->freereg + n;
++  if (newstack > fs->f->maxstacksize) {
++    if (newstack >= MAXSTACK)
++      luaX_syntaxerror(fs->ls, "function or expression too complex");
++    fs->f->maxstacksize = cast_byte(newstack);
++  }
++}
++
++
++void luaK_reserveregs (FuncState *fs, int n) {
++  luaK_checkstack(fs, n);
++  fs->freereg += n;
++}
++
++
++static void freereg (FuncState *fs, int reg) {
++  if (!ISK(reg) && reg >= fs->nactvar) {
++    fs->freereg--;
++    lua_assert(reg == fs->freereg);
++  }
++}
++
++
++static void freeexp (FuncState *fs, expdesc *e) {
++  if (e->k == VNONRELOC)
++    freereg(fs, e->u.s.info);
++}
++
++
++static int addk (FuncState *fs, TValue *k, TValue *v) {
++  lua_State *L = fs->L;
++  TValue *idx = luaH_set(L, fs->h, k);
++  Proto *f = fs->f;
++  int oldsize = f->sizek;
++  if (ttisnumber(idx)) {
++    lua_assert(luaO_rawequalObj(&fs->f->k[cast_int(nvalue(idx))], v));
++    return cast_int(nvalue(idx));
++  }
++  else {  /* constant not found; create a new entry */
++    setnvalue(idx, cast_num(fs->nk));
++    luaM_growvector(L, f->k, fs->nk, f->sizek, TValue,
++                    MAXARG_Bx, "constant table overflow");
++    while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]);
++    setobj(L, &f->k[fs->nk], v);
++    luaC_barrier(L, f, v);
++    return fs->nk++;
++  }
++}
++
++
++int luaK_stringK (FuncState *fs, TString *s) {
++  TValue o;
++  setsvalue(fs->L, &o, s);
++  return addk(fs, &o, &o);
++}
++
++
++int luaK_numberK (FuncState *fs, lua_Number r) {
++  TValue o;
++  setnvalue(&o, r);
++  return addk(fs, &o, &o);
++}
++
++
++static int boolK (FuncState *fs, int b) {
++  TValue o;
++  setbvalue(&o, b);
++  return addk(fs, &o, &o);
++}
++
++
++static int nilK (FuncState *fs) {
++  TValue k, v;
++  setnilvalue(&v);
++  /* cannot use nil as key; instead use table itself to represent nil */
++  sethvalue(fs->L, &k, fs->h);
++  return addk(fs, &k, &v);
++}
++
++
++void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) {
++  if (e->k == VCALL) {  /* expression is an open function call? */
++    SETARG_C(getcode(fs, e), nresults+1);
++  }
++  else if (e->k == VVARARG) {
++    SETARG_B(getcode(fs, e), nresults+1);
++    SETARG_A(getcode(fs, e), fs->freereg);
++    luaK_reserveregs(fs, 1);
++  }
++}
++
++
++void luaK_setoneret (FuncState *fs, expdesc *e) {
++  if (e->k == VCALL) {  /* expression is an open function call? */
++    e->k = VNONRELOC;
++    e->u.s.info = GETARG_A(getcode(fs, e));
++  }
++  else if (e->k == VVARARG) {
++    SETARG_B(getcode(fs, e), 2);
++    e->k = VRELOCABLE;  /* can relocate its simple result */
++  }
++}
++
++
++void luaK_dischargevars (FuncState *fs, expdesc *e) {
++  switch (e->k) {
++    case VLOCAL: {
++      e->k = VNONRELOC;
++      break;
++    }
++    case VUPVAL: {
++      e->u.s.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.s.info, 0);
++      e->k = VRELOCABLE;
++      break;
++    }
++    case VGLOBAL: {
++      e->u.s.info = luaK_codeABx(fs, OP_GETGLOBAL, 0, e->u.s.info);
++      e->k = VRELOCABLE;
++      break;
++    }
++    case VINDEXED: {
++      freereg(fs, e->u.s.aux);
++      freereg(fs, e->u.s.info);
++      e->u.s.info = luaK_codeABC(fs, OP_GETTABLE, 0, e->u.s.info, e->u.s.aux);
++      e->k = VRELOCABLE;
++      break;
++    }
++    case VVARARG:
++    case VCALL: {
++      luaK_setoneret(fs, e);
++      break;
++    }
++    default: break;  /* there is one value available (somewhere) */
++  }
++}
++
++
++static int code_label (FuncState *fs, int A, int b, int jump) {
++  luaK_getlabel(fs);  /* those instructions may be jump targets */
++  return luaK_codeABC(fs, OP_LOADBOOL, A, b, jump);
++}
++
++
++static void discharge2reg (FuncState *fs, expdesc *e, int reg) {
++  luaK_dischargevars(fs, e);
++  switch (e->k) {
++    case VNIL: {
++      luaK_nil(fs, reg, 1);
++      break;
++    }
++    case VFALSE:  case VTRUE: {
++      luaK_codeABC(fs, OP_LOADBOOL, reg, e->k == VTRUE, 0);
++      break;
++    }
++    case VK: {
++      luaK_codeABx(fs, OP_LOADK, reg, e->u.s.info);
++      break;
++    }
++    case VKNUM: {
++      luaK_codeABx(fs, OP_LOADK, reg, luaK_numberK(fs, e->u.nval));
++      break;
++    }
++    case VRELOCABLE: {
++      Instruction *pc = &getcode(fs, e);
++      SETARG_A(*pc, reg);
++      break;
++    }
++    case VNONRELOC: {
++      if (reg != e->u.s.info)
++        luaK_codeABC(fs, OP_MOVE, reg, e->u.s.info, 0);
++      break;
++    }
++    default: {
++      lua_assert(e->k == VVOID || e->k == VJMP);
++      return;  /* nothing to do... */
++    }
++  }
++  e->u.s.info = reg;
++  e->k = VNONRELOC;
++}
++
++
++static void discharge2anyreg (FuncState *fs, expdesc *e) {
++  if (e->k != VNONRELOC) {
++    luaK_reserveregs(fs, 1);
++    discharge2reg(fs, e, fs->freereg-1);
++  }
++}
++
++
++static void exp2reg (FuncState *fs, expdesc *e, int reg) {
++  discharge2reg(fs, e, reg);
++  if (e->k == VJMP)
++    luaK_concat(fs, &e->t, e->u.s.info);  /* put this jump in `t' list */
++  if (hasjumps(e)) {
++    int final;  /* position after whole expression */
++    int p_f = NO_JUMP;  /* position of an eventual LOAD false */
++    int p_t = NO_JUMP;  /* position of an eventual LOAD true */
++    if (need_value(fs, e->t) || need_value(fs, e->f)) {
++      int fj = (e->k == VJMP) ? NO_JUMP : luaK_jump(fs);
++      p_f = code_label(fs, reg, 0, 1);
++      p_t = code_label(fs, reg, 1, 0);
++      luaK_patchtohere(fs, fj);
++    }
++    final = luaK_getlabel(fs);
++    patchlistaux(fs, e->f, final, reg, p_f);
++    patchlistaux(fs, e->t, final, reg, p_t);
++  }
++  e->f = e->t = NO_JUMP;
++  e->u.s.info = reg;
++  e->k = VNONRELOC;
++}
++
++
++void luaK_exp2nextreg (FuncState *fs, expdesc *e) {
++  luaK_dischargevars(fs, e);
++  freeexp(fs, e);
++  luaK_reserveregs(fs, 1);
++  exp2reg(fs, e, fs->freereg - 1);
++}
++
++
++int luaK_exp2anyreg (FuncState *fs, expdesc *e) {
++  luaK_dischargevars(fs, e);
++  if (e->k == VNONRELOC) {
++    if (!hasjumps(e)) return e->u.s.info;  /* exp is already in a register */
++    if (e->u.s.info >= fs->nactvar) {  /* reg. is not a local? */
++      exp2reg(fs, e, e->u.s.info);  /* put value on it */
++      return e->u.s.info;
++    }
++  }
++  luaK_exp2nextreg(fs, e);  /* default */
++  return e->u.s.info;
++}
++
++
++void luaK_exp2val (FuncState *fs, expdesc *e) {
++  if (hasjumps(e))
++    luaK_exp2anyreg(fs, e);
++  else
++    luaK_dischargevars(fs, e);
++}
++
++
++int luaK_exp2RK (FuncState *fs, expdesc *e) {
++  luaK_exp2val(fs, e);
++  switch (e->k) {
++    case VKNUM:
++    case VTRUE:
++    case VFALSE:
++    case VNIL: {
++      if (fs->nk <= MAXINDEXRK) {  /* constant fit in RK operand? */
++        e->u.s.info = (e->k == VNIL)  ? nilK(fs) :
++                      (e->k == VKNUM) ? luaK_numberK(fs, e->u.nval) :
++                                        boolK(fs, (e->k == VTRUE));
++        e->k = VK;
++        return RKASK(e->u.s.info);
++      }
++      else break;
++    }
++    case VK: {
++      if (e->u.s.info <= MAXINDEXRK)  /* constant fit in argC? */
++        return RKASK(e->u.s.info);
++      else break;
++    }
++    default: break;
++  }
++  /* not a constant in the right range: put it in a register */
++  return luaK_exp2anyreg(fs, e);
++}
++
++
++void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) {
++  switch (var->k) {
++    case VLOCAL: {
++      freeexp(fs, ex);
++      exp2reg(fs, ex, var->u.s.info);
++      return;
++    }
++    case VUPVAL: {
++      int e = luaK_exp2anyreg(fs, ex);
++      luaK_codeABC(fs, OP_SETUPVAL, e, var->u.s.info, 0);
++      break;
++    }
++    case VGLOBAL: {
++      int e = luaK_exp2anyreg(fs, ex);
++      luaK_codeABx(fs, OP_SETGLOBAL, e, var->u.s.info);
++      break;
++    }
++    case VINDEXED: {
++      int e = luaK_exp2RK(fs, ex);
++      luaK_codeABC(fs, OP_SETTABLE, var->u.s.info, var->u.s.aux, e);
++      break;
++    }
++    default: {
++      lua_assert(0);  /* invalid var kind to store */
++      break;
++    }
++  }
++  freeexp(fs, ex);
++}
++
++
++void luaK_self (FuncState *fs, expdesc *e, expdesc *key) {
++  int func;
++  luaK_exp2anyreg(fs, e);
++  freeexp(fs, e);
++  func = fs->freereg;
++  luaK_reserveregs(fs, 2);
++  luaK_codeABC(fs, OP_SELF, func, e->u.s.info, luaK_exp2RK(fs, key));
++  freeexp(fs, key);
++  e->u.s.info = func;
++  e->k = VNONRELOC;
++}
++
++
++static void invertjump (FuncState *fs, expdesc *e) {
++  Instruction *pc = getjumpcontrol(fs, e->u.s.info);
++  lua_assert(testTMode(GET_OPCODE(*pc)) && GET_OPCODE(*pc) != OP_TESTSET &&
++                                           GET_OPCODE(*pc) != OP_TEST);
++  SETARG_A(*pc, !(GETARG_A(*pc)));
++}
++
++
++static int jumponcond (FuncState *fs, expdesc *e, int cond) {
++  if (e->k == VRELOCABLE) {
++    Instruction ie = getcode(fs, e);
++    if (GET_OPCODE(ie) == OP_NOT) {
++      fs->pc--;  /* remove previous OP_NOT */
++      return condjump(fs, OP_TEST, GETARG_B(ie), 0, !cond);
++    }
++    /* else go through */
++  }
++  discharge2anyreg(fs, e);
++  freeexp(fs, e);
++  return condjump(fs, OP_TESTSET, NO_REG, e->u.s.info, cond);
++}
++
++
++void luaK_goiftrue (FuncState *fs, expdesc *e) {
++  int pc;  /* pc of last jump */
++  luaK_dischargevars(fs, e);
++  switch (e->k) {
++    case VK: case VKNUM: case VTRUE: {
++      pc = NO_JUMP;  /* always true; do nothing */
++      break;
++    }
++    case VFALSE: {
++      pc = luaK_jump(fs);  /* always jump */
++      break;
++    }
++    case VJMP: {
++      invertjump(fs, e);
++      pc = e->u.s.info;
++      break;
++    }
++    default: {
++      pc = jumponcond(fs, e, 0);
++      break;
++    }
++  }
++  luaK_concat(fs, &e->f, pc);  /* insert last jump in `f' list */
++  luaK_patchtohere(fs, e->t);
++  e->t = NO_JUMP;
++}
++
++
++static void luaK_goiffalse (FuncState *fs, expdesc *e) {
++  int pc;  /* pc of last jump */
++  luaK_dischargevars(fs, e);
++  switch (e->k) {
++    case VNIL: case VFALSE: {
++      pc = NO_JUMP;  /* always false; do nothing */
++      break;
++    }
++    case VTRUE: {
++      pc = luaK_jump(fs);  /* always jump */
++      break;
++    }
++    case VJMP: {
++      pc = e->u.s.info;
++      break;
++    }
++    default: {
++      pc = jumponcond(fs, e, 1);
++      break;
++    }
++  }
++  luaK_concat(fs, &e->t, pc);  /* insert last jump in `t' list */
++  luaK_patchtohere(fs, e->f);
++  e->f = NO_JUMP;
++}
++
++
++static void codenot (FuncState *fs, expdesc *e) {
++  luaK_dischargevars(fs, e);
++  switch (e->k) {
++    case VNIL: case VFALSE: {
++      e->k = VTRUE;
++      break;
++    }
++    case VK: case VKNUM: case VTRUE: {
++      e->k = VFALSE;
++      break;
++    }
++    case VJMP: {
++      invertjump(fs, e);
++      break;
++    }
++    case VRELOCABLE:
++    case VNONRELOC: {
++      discharge2anyreg(fs, e);
++      freeexp(fs, e);
++      e->u.s.info = luaK_codeABC(fs, OP_NOT, 0, e->u.s.info, 0);
++      e->k = VRELOCABLE;
++      break;
++    }
++    default: {
++      lua_assert(0);  /* cannot happen */
++      break;
++    }
++  }
++  /* interchange true and false lists */
++  { int temp = e->f; e->f = e->t; e->t = temp; }
++  removevalues(fs, e->f);
++  removevalues(fs, e->t);
++}
++
++
++void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) {
++  t->u.s.aux = luaK_exp2RK(fs, k);
++  t->k = VINDEXED;
++}
++
++
++static int constfolding (OpCode op, expdesc *e1, expdesc *e2) {
++  lua_Number v1, v2, r;
++  if (!isnumeral(e1) || !isnumeral(e2)) return 0;
++  v1 = e1->u.nval;
++  v2 = e2->u.nval;
++  switch (op) {
++    case OP_ADD: r = luai_numadd(v1, v2); break;
++    case OP_SUB: r = luai_numsub(v1, v2); break;
++    case OP_MUL: r = luai_nummul(v1, v2); break;
++    case OP_DIV:
++      if (v2 == 0) return 0;  /* do not attempt to divide by 0 */
++      r = luai_numdiv(v1, v2); break;
++    case OP_MOD:
++      if (v2 == 0) return 0;  /* do not attempt to divide by 0 */
++      r = luai_nummod(v1, v2); break;
++    case OP_POW: r = luai_numpow(v1, v2); break;
++    case OP_UNM: r = luai_numunm(v1); break;
++    case OP_LEN: return 0;  /* no constant folding for 'len' */
++    default: lua_assert(0); r = 0; break;
++  }
++  if (luai_numisnan(r)) return 0;  /* do not attempt to produce NaN */
++  e1->u.nval = r;
++  return 1;
++}
++
++
++static void codearith (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) {
++  if (constfolding(op, e1, e2))
++    return;
++  else {
++    int o2 = (op != OP_UNM && op != OP_LEN) ? luaK_exp2RK(fs, e2) : 0;
++    int o1 = luaK_exp2RK(fs, e1);
++    if (o1 > o2) {
++      freeexp(fs, e1);
++      freeexp(fs, e2);
++    }
++    else {
++      freeexp(fs, e2);
++      freeexp(fs, e1);
++    }
++    e1->u.s.info = luaK_codeABC(fs, op, 0, o1, o2);
++    e1->k = VRELOCABLE;
++  }
++}
++
++
++static void codecomp (FuncState *fs, OpCode op, int cond, expdesc *e1,
++                                                          expdesc *e2) {
++  int o1 = luaK_exp2RK(fs, e1);
++  int o2 = luaK_exp2RK(fs, e2);
++  freeexp(fs, e2);
++  freeexp(fs, e1);
++  if (cond == 0 && op != OP_EQ) {
++    int temp;  /* exchange args to replace by `<' or `<=' */
++    temp = o1; o1 = o2; o2 = temp;  /* o1 <==> o2 */
++    cond = 1;
++  }
++  e1->u.s.info = condjump(fs, op, cond, o1, o2);
++  e1->k = VJMP;
++}
++
++
++void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e) {
++  expdesc e2;
++  e2.t = e2.f = NO_JUMP; e2.k = VKNUM; e2.u.nval = 0;
++  switch (op) {
++    case OPR_MINUS: {
++      if (!isnumeral(e))
++        luaK_exp2anyreg(fs, e);  /* cannot operate on non-numeric constants */
++      codearith(fs, OP_UNM, e, &e2);
++      break;
++    }
++    case OPR_NOT: codenot(fs, e); break;
++    case OPR_LEN: {
++      luaK_exp2anyreg(fs, e);  /* cannot operate on constants */
++      codearith(fs, OP_LEN, e, &e2);
++      break;
++    }
++    default: lua_assert(0);
++  }
++}
++
++
++void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) {
++  switch (op) {
++    case OPR_AND: {
++      luaK_goiftrue(fs, v);
++      break;
++    }
++    case OPR_OR: {
++      luaK_goiffalse(fs, v);
++      break;
++    }
++    case OPR_CONCAT: {
++      luaK_exp2nextreg(fs, v);  /* operand must be on the `stack' */
++      break;
++    }
++    case OPR_ADD: case OPR_SUB: case OPR_MUL: case OPR_DIV:
++    case OPR_MOD: case OPR_POW: {
++      if (!isnumeral(v)) luaK_exp2RK(fs, v);
++      break;
++    }
++    default: {
++      luaK_exp2RK(fs, v);
++      break;
++    }
++  }
++}
++
++
++void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) {
++  switch (op) {
++    case OPR_AND: {
++      lua_assert(e1->t == NO_JUMP);  /* list must be closed */
++      luaK_dischargevars(fs, e2);
++      luaK_concat(fs, &e2->f, e1->f);
++      *e1 = *e2;
++      break;
++    }
++    case OPR_OR: {
++      lua_assert(e1->f == NO_JUMP);  /* list must be closed */
++      luaK_dischargevars(fs, e2);
++      luaK_concat(fs, &e2->t, e1->t);
++      *e1 = *e2;
++      break;
++    }
++    case OPR_CONCAT: {
++      luaK_exp2val(fs, e2);
++      if (e2->k == VRELOCABLE && GET_OPCODE(getcode(fs, e2)) == OP_CONCAT) {
++        lua_assert(e1->u.s.info == GETARG_B(getcode(fs, e2))-1);
++        freeexp(fs, e1);
++        SETARG_B(getcode(fs, e2), e1->u.s.info);
++        e1->k = VRELOCABLE; e1->u.s.info = e2->u.s.info;
++      }
++      else {
++        luaK_exp2nextreg(fs, e2);  /* operand must be on the 'stack' */
++        codearith(fs, OP_CONCAT, e1, e2);
++      }
++      break;
++    }
++    case OPR_ADD: codearith(fs, OP_ADD, e1, e2); break;
++    case OPR_SUB: codearith(fs, OP_SUB, e1, e2); break;
++    case OPR_MUL: codearith(fs, OP_MUL, e1, e2); break;
++    case OPR_DIV: codearith(fs, OP_DIV, e1, e2); break;
++    case OPR_MOD: codearith(fs, OP_MOD, e1, e2); break;
++    case OPR_POW: codearith(fs, OP_POW, e1, e2); break;
++    case OPR_EQ: codecomp(fs, OP_EQ, 1, e1, e2); break;
++    case OPR_NE: codecomp(fs, OP_EQ, 0, e1, e2); break;
++    case OPR_LT: codecomp(fs, OP_LT, 1, e1, e2); break;
++    case OPR_LE: codecomp(fs, OP_LE, 1, e1, e2); break;
++    case OPR_GT: codecomp(fs, OP_LT, 0, e1, e2); break;
++    case OPR_GE: codecomp(fs, OP_LE, 0, e1, e2); break;
++    default: lua_assert(0);
++  }
++}
++
++
++void luaK_fixline (FuncState *fs, int line) {
++  fs->f->lineinfo[fs->pc - 1] = line;
++}
++
++
++static int luaK_code (FuncState *fs, Instruction i, int line) {
++  Proto *f = fs->f;
++  dischargejpc(fs);  /* `pc' will change */
++  /* put new instruction in code array */
++  luaM_growvector(fs->L, f->code, fs->pc, f->sizecode, Instruction,
++                  MAX_INT, "code size overflow");
++  f->code[fs->pc] = i;
++  /* save corresponding line information */
++  luaM_growvector(fs->L, f->lineinfo, fs->pc, f->sizelineinfo, int,
++                  MAX_INT, "code size overflow");
++  f->lineinfo[fs->pc] = line;
++  return fs->pc++;
++}
++
++
++int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) {
++  lua_assert(getOpMode(o) == iABC);
++  lua_assert(getBMode(o) != OpArgN || b == 0);
++  lua_assert(getCMode(o) != OpArgN || c == 0);
++  return luaK_code(fs, CREATE_ABC(o, a, b, c), fs->ls->lastline);
++}
++
++
++int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) {
++  lua_assert(getOpMode(o) == iABx || getOpMode(o) == iAsBx);
++  lua_assert(getCMode(o) == OpArgN);
++  return luaK_code(fs, CREATE_ABx(o, a, bc), fs->ls->lastline);
++}
++
++
++void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) {
++  int c =  (nelems - 1)/LFIELDS_PER_FLUSH + 1;
++  int b = (tostore == LUA_MULTRET) ? 0 : tostore;
++  lua_assert(tostore != 0);
++  if (c <= MAXARG_C)
++    luaK_codeABC(fs, OP_SETLIST, base, b, c);
++  else {
++    luaK_codeABC(fs, OP_SETLIST, base, b, 0);
++    luaK_code(fs, cast(Instruction, c), fs->ls->lastline);
++  }
++  fs->freereg = base + 1;  /* free registers with list values */
++}
++
+--- /dev/null
++++ b/extensions/LUA/lua/lcode.h
+@@ -0,0 +1,76 @@
++/*
++** $Id: lcode.h,v 1.48.1.1 2007/12/27 13:02:25 roberto Exp $
++** Code generator for Lua
++** See Copyright Notice in lua.h
++*/
++
++#ifndef lcode_h
++#define lcode_h
++
++#include "llex.h"
++#include "lobject.h"
++#include "lopcodes.h"
++#include "lparser.h"
++
++
++/*
++** Marks the end of a patch list. It is an invalid value both as an absolute
++** address, and as a list link (would link an element to itself).
++*/
++#define NO_JUMP (-1)
++
++
++/*
++** grep "ORDER OPR" if you change these enums
++*/
++typedef enum BinOpr {
++  OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_MOD, OPR_POW,
++  OPR_CONCAT,
++  OPR_NE, OPR_EQ,
++  OPR_LT, OPR_LE, OPR_GT, OPR_GE,
++  OPR_AND, OPR_OR,
++  OPR_NOBINOPR
++} BinOpr;
++
++
++typedef enum UnOpr { OPR_MINUS, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;
++
++
++#define getcode(fs,e) ((fs)->f->code[(e)->u.s.info])
++
++#define luaK_codeAsBx(fs,o,A,sBx)     luaK_codeABx(fs,o,A,(sBx)+MAXARG_sBx)
++
++#define luaK_setmultret(fs,e) luaK_setreturns(fs, e, LUA_MULTRET)
++
++LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx);
++LUAI_FUNC int luaK_codeABC (FuncState *fs, OpCode o, int A, int B, int C);
++LUAI_FUNC void luaK_fixline (FuncState *fs, int line);
++LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n);
++LUAI_FUNC void luaK_reserveregs (FuncState *fs, int n);
++LUAI_FUNC void luaK_checkstack (FuncState *fs, int n);
++LUAI_FUNC int luaK_stringK (FuncState *fs, TString *s);
++LUAI_FUNC int luaK_numberK (FuncState *fs, lua_Number r);
++LUAI_FUNC void luaK_dischargevars (FuncState *fs, expdesc *e);
++LUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e);
++LUAI_FUNC void luaK_exp2nextreg (FuncState *fs, expdesc *e);
++LUAI_FUNC void luaK_exp2val (FuncState *fs, expdesc *e);
++LUAI_FUNC int luaK_exp2RK (FuncState *fs, expdesc *e);
++LUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key);
++LUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k);
++LUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e);
++LUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e);
++LUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults);
++LUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e);
++LUAI_FUNC int luaK_jump (FuncState *fs);
++LUAI_FUNC void luaK_ret (FuncState *fs, int first, int nret);
++LUAI_FUNC void luaK_patchlist (FuncState *fs, int list, int target);
++LUAI_FUNC void luaK_patchtohere (FuncState *fs, int list);
++LUAI_FUNC void luaK_concat (FuncState *fs, int *l1, int l2);
++LUAI_FUNC int luaK_getlabel (FuncState *fs);
++LUAI_FUNC void luaK_prefix (FuncState *fs, UnOpr op, expdesc *v);
++LUAI_FUNC void luaK_infix (FuncState *fs, BinOpr op, expdesc *v);
++LUAI_FUNC void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1, expdesc *v2);
++LUAI_FUNC void luaK_setlist (FuncState *fs, int base, int nelems, int tostore);
++
++
++#endif
+--- /dev/null
++++ b/extensions/LUA/lua/ldebug.c
+@@ -0,0 +1,637 @@
++/*
++** $Id: ldebug.c,v 2.29.1.6 2008/05/08 16:56:26 roberto Exp $
++** Debug Interface
++** See Copyright Notice in lua.h
++*/
++
++
++#include <stdarg.h>
++#include <stddef.h>
++#include <string.h>
++
++#define ldebug_c
++#define LUA_CORE
++
++#include "lua.h"
++
++#include "lapi.h"
++#include "lcode.h"
++#include "ldebug.h"
++#include "ldo.h"
++#include "lfunc.h"
++#include "lobject.h"
++#include "lopcodes.h"
++#include "lstate.h"
++#include "lstring.h"
++#include "ltable.h"
++#include "ltm.h"
++#include "lvm.h"
++
++
++
++static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name);
++
++
++static int currentpc (lua_State *L, CallInfo *ci) {
++  if (!isLua(ci)) return -1;  /* function is not a Lua function? */
++  if (ci == L->ci)
++    ci->savedpc = L->savedpc;
++  return pcRel(ci->savedpc, ci_func(ci)->l.p);
++}
++
++
++static int currentline (lua_State *L, CallInfo *ci) {
++  int pc = currentpc(L, ci);
++  if (pc < 0)
++    return -1;  /* only active lua functions have current-line information */
++  else
++    return getline(ci_func(ci)->l.p, pc);
++}
++
++
++/*
++** this function can be called asynchronous (e.g. during a signal)
++*/
++LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count) {
++  if (func == NULL || mask == 0) {  /* turn off hooks? */
++    mask = 0;
++    func = NULL;
++  }
++  L->hook = func;
++  L->basehookcount = count;
++  resethookcount(L);
++  L->hookmask = cast_byte(mask);
++  return 1;
++}
++
++
++LUA_API lua_Hook lua_gethook (lua_State *L) {
++  return L->hook;
++}
++
++
++LUA_API int lua_gethookmask (lua_State *L) {
++  return L->hookmask;
++}
++
++
++LUA_API int lua_gethookcount (lua_State *L) {
++  return L->basehookcount;
++}
++
++
++LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) {
++  int status;
++  CallInfo *ci;
++  lua_lock(L);
++  for (ci = L->ci; level > 0 && ci > L->base_ci; ci--) {
++    level--;
++    if (f_isLua(ci))  /* Lua function? */
++      level -= ci->tailcalls;  /* skip lost tail calls */
++  }
++  if (level == 0 && ci > L->base_ci) {  /* level found? */
++    status = 1;
++    ar->i_ci = cast_int(ci - L->base_ci);
++  }
++  else if (level < 0) {  /* level is of a lost tail call? */
++    status = 1;
++    ar->i_ci = 0;
++  }
++  else status = 0;  /* no such level */
++  lua_unlock(L);
++  return status;
++}
++
++
++static Proto *getluaproto (CallInfo *ci) {
++  return (isLua(ci) ? ci_func(ci)->l.p : NULL);
++}
++
++
++static const char *findlocal (lua_State *L, CallInfo *ci, int n) {
++  const char *name;
++  Proto *fp = getluaproto(ci);
++  if (fp && (name = luaF_getlocalname(fp, n, currentpc(L, ci))) != NULL)
++    return name;  /* is a local variable in a Lua function */
++  else {
++    StkId limit = (ci == L->ci) ? L->top : (ci+1)->func;
++    if (limit - ci->base >= n && n > 0)  /* is 'n' inside 'ci' stack? */
++      return "(*temporary)";
++    else
++      return NULL;
++  }
++}
++
++
++LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) {
++  CallInfo *ci = L->base_ci + ar->i_ci;
++  const char *name = findlocal(L, ci, n);
++  lua_lock(L);
++  if (name)
++      luaA_pushobject(L, ci->base + (n - 1));
++  lua_unlock(L);
++  return name;
++}
++
++
++LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) {
++  CallInfo *ci = L->base_ci + ar->i_ci;
++  const char *name = findlocal(L, ci, n);
++  lua_lock(L);
++  if (name)
++      setobjs2s(L, ci->base + (n - 1), L->top - 1);
++  L->top--;  /* pop value */
++  lua_unlock(L);
++  return name;
++}
++
++
++static void funcinfo (lua_Debug *ar, Closure *cl) {
++  if (cl->c.isC) {
++    ar->source = "=[C]";
++    ar->linedefined = -1;
++    ar->lastlinedefined = -1;
++    ar->what = "C";
++  }
++  else {
++    ar->source = getstr(cl->l.p->source);
++    ar->linedefined = cl->l.p->linedefined;
++    ar->lastlinedefined = cl->l.p->lastlinedefined;
++    ar->what = (ar->linedefined == 0) ? "main" : "Lua";
++  }
++  luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE);
++}
++
++
++static void info_tailcall (lua_Debug *ar) {
++  ar->name = ar->namewhat = "";
++  ar->what = "tail";
++  ar->lastlinedefined = ar->linedefined = ar->currentline = -1;
++  ar->source = "=(tail call)";
++  luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE);
++  ar->nups = 0;
++}
++
++
++static void collectvalidlines (lua_State *L, Closure *f) {
++  if (f == NULL || f->c.isC) {
++    setnilvalue(L->top);
++  }
++  else {
++    Table *t = luaH_new(L, 0, 0);
++    int *lineinfo = f->l.p->lineinfo;
++    int i;
++    for (i=0; i<f->l.p->sizelineinfo; i++)
++      setbvalue(luaH_setnum(L, t, lineinfo[i]), 1);
++    sethvalue(L, L->top, t); 
++  }
++  incr_top(L);
++}
++
++
++static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar,
++                    Closure *f, CallInfo *ci) {
++  int status = 1;
++  if (f == NULL) {
++    info_tailcall(ar);
++    return status;
++  }
++  for (; *what; what++) {
++    switch (*what) {
++      case 'S': {
++        funcinfo(ar, f);
++        break;
++      }
++      case 'l': {
++        ar->currentline = (ci) ? currentline(L, ci) : -1;
++        break;
++      }
++      case 'u': {
++        ar->nups = f->c.nupvalues;
++        break;
++      }
++      case 'n': {
++        ar->namewhat = (ci) ? getfuncname(L, ci, &ar->name) : NULL;
++        if (ar->namewhat == NULL) {
++          ar->namewhat = "";  /* not found */
++          ar->name = NULL;
++        }
++        break;
++      }
++      case 'L':
++      case 'f':  /* handled by lua_getinfo */
++        break;
++      default: status = 0;  /* invalid option */
++    }
++  }
++  return status;
++}
++
++
++LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {
++  int status;
++  Closure *f = NULL;
++  CallInfo *ci = NULL;
++  lua_lock(L);
++  if (*what == '>') {
++    StkId func = L->top - 1;
++    luai_apicheck(L, ttisfunction(func));
++    what++;  /* skip the '>' */
++    f = clvalue(func);
++    L->top--;  /* pop function */
++  }
++  else if (ar->i_ci != 0) {  /* no tail call? */
++    ci = L->base_ci + ar->i_ci;
++    lua_assert(ttisfunction(ci->func));
++    f = clvalue(ci->func);
++  }
++  status = auxgetinfo(L, what, ar, f, ci);
++  if (strchr(what, 'f')) {
++    if (f == NULL) setnilvalue(L->top);
++    else setclvalue(L, L->top, f);
++    incr_top(L);
++  }
++  if (strchr(what, 'L'))
++    collectvalidlines(L, f);
++  lua_unlock(L);
++  return status;
++}
++
++
++/*
++** {======================================================
++** Symbolic Execution and code checker
++** =======================================================
++*/
++
++#define check(x)              if (!(x)) return 0;
++
++#define checkjump(pt,pc)      check(0 <= pc && pc < pt->sizecode)
++
++#define checkreg(pt,reg)      check((reg) < (pt)->maxstacksize)
++
++
++
++static int precheck (const Proto *pt) {
++  check(pt->maxstacksize <= MAXSTACK);
++  check(pt->numparams+(pt->is_vararg & VARARG_HASARG) <= pt->maxstacksize);
++  check(!(pt->is_vararg & VARARG_NEEDSARG) ||
++              (pt->is_vararg & VARARG_HASARG));
++  check(pt->sizeupvalues <= pt->nups);
++  check(pt->sizelineinfo == pt->sizecode || pt->sizelineinfo == 0);
++  check(pt->sizecode > 0 && GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN);
++  return 1;
++}
++
++
++#define checkopenop(pt,pc)    luaG_checkopenop((pt)->code[(pc)+1])
++
++int luaG_checkopenop (Instruction i) {
++  switch (GET_OPCODE(i)) {
++    case OP_CALL:
++    case OP_TAILCALL:
++    case OP_RETURN:
++    case OP_SETLIST: {
++      check(GETARG_B(i) == 0);
++      return 1;
++    }
++    default: return 0;  /* invalid instruction after an open call */
++  }
++}
++
++
++static int checkArgMode (const Proto *pt, int r, enum OpArgMask mode) {
++  switch (mode) {
++    case OpArgN: check(r == 0); break;
++    case OpArgU: break;
++    case OpArgR: checkreg(pt, r); break;
++    case OpArgK:
++      check(ISK(r) ? INDEXK(r) < pt->sizek : r < pt->maxstacksize);
++      break;
++  }
++  return 1;
++}
++
++
++static Instruction symbexec (const Proto *pt, int lastpc, int reg) {
++  int pc;
++  int last;  /* stores position of last instruction that changed `reg' */
++  last = pt->sizecode-1;  /* points to final return (a `neutral' instruction) */
++  check(precheck(pt));
++  for (pc = 0; pc < lastpc; pc++) {
++    Instruction i = pt->code[pc];
++    OpCode op = GET_OPCODE(i);
++    int a = GETARG_A(i);
++    int b = 0;
++    int c = 0;
++    check(op < NUM_OPCODES);
++    checkreg(pt, a);
++    switch (getOpMode(op)) {
++      case iABC: {
++        b = GETARG_B(i);
++        c = GETARG_C(i);
++        check(checkArgMode(pt, b, getBMode(op)));
++        check(checkArgMode(pt, c, getCMode(op)));
++        break;
++      }
++      case iABx: {
++        b = GETARG_Bx(i);
++        if (getBMode(op) == OpArgK) check(b < pt->sizek);
++        break;
++      }
++      case iAsBx: {
++        b = GETARG_sBx(i);
++        if (getBMode(op) == OpArgR) {
++          int dest = pc+1+b;
++          check(0 <= dest && dest < pt->sizecode);
++          if (dest > 0) {
++            int j;
++            /* check that it does not jump to a setlist count; this
++               is tricky, because the count from a previous setlist may
++               have the same value of an invalid setlist; so, we must
++               go all the way back to the first of them (if any) */
++            for (j = 0; j < dest; j++) {
++              Instruction d = pt->code[dest-1-j];
++              if (!(GET_OPCODE(d) == OP_SETLIST && GETARG_C(d) == 0)) break;
++            }
++            /* if 'j' is even, previous value is not a setlist (even if
++               it looks like one) */
++            check((j&1) == 0);
++          }
++        }
++        break;
++      }
++    }
++    if (testAMode(op)) {
++      if (a == reg) last = pc;  /* change register `a' */
++    }
++    if (testTMode(op)) {
++      check(pc+2 < pt->sizecode);  /* check skip */
++      check(GET_OPCODE(pt->code[pc+1]) == OP_JMP);
++    }
++    switch (op) {
++      case OP_LOADBOOL: {
++        if (c == 1) {  /* does it jump? */
++          check(pc+2 < pt->sizecode);  /* check its jump */
++          check(GET_OPCODE(pt->code[pc+1]) != OP_SETLIST ||
++                GETARG_C(pt->code[pc+1]) != 0);
++        }
++        break;
++      }
++      case OP_LOADNIL: {
++        if (a <= reg && reg <= b)
++          last = pc;  /* set registers from `a' to `b' */
++        break;
++      }
++      case OP_GETUPVAL:
++      case OP_SETUPVAL: {
++        check(b < pt->nups);
++        break;
++      }
++      case OP_GETGLOBAL:
++      case OP_SETGLOBAL: {
++        check(ttisstring(&pt->k[b]));
++        break;
++      }
++      case OP_SELF: {
++        checkreg(pt, a+1);
++        if (reg == a+1) last = pc;
++        break;
++      }
++      case OP_CONCAT: {
++        check(b < c);  /* at least two operands */
++        break;
++      }
++      case OP_TFORLOOP: {
++        check(c >= 1);  /* at least one result (control variable) */
++        checkreg(pt, a+2+c);  /* space for results */
++        if (reg >= a+2) last = pc;  /* affect all regs above its base */
++        break;
++      }
++      case OP_FORLOOP:
++      case OP_FORPREP:
++        checkreg(pt, a+3);
++        /* go through */
++      case OP_JMP: {
++        int dest = pc+1+b;
++        /* not full check and jump is forward and do not skip `lastpc'? */
++        if (reg != NO_REG && pc < dest && dest <= lastpc)
++          pc += b;  /* do the jump */
++        break;
++      }
++      case OP_CALL:
++      case OP_TAILCALL: {
++        if (b != 0) {
++          checkreg(pt, a+b-1);
++        }
++        c--;  /* c = num. returns */
++        if (c == LUA_MULTRET) {
++          check(checkopenop(pt, pc));
++        }
++        else if (c != 0)
++          checkreg(pt, a+c-1);
++        if (reg >= a) last = pc;  /* affect all registers above base */
++        break;
++      }
++      case OP_RETURN: {
++        b--;  /* b = num. returns */
++        if (b > 0) checkreg(pt, a+b-1);
++        break;
++      }
++      case OP_SETLIST: {
++        if (b > 0) checkreg(pt, a + b);
++        if (c == 0) {
++          pc++;
++          check(pc < pt->sizecode - 1);
++        }
++        break;
++      }
++      case OP_CLOSURE: {
++        int nup, j;
++        check(b < pt->sizep);
++        nup = pt->p[b]->nups;
++        check(pc + nup < pt->sizecode);
++        for (j = 1; j <= nup; j++) {
++          OpCode op1 = GET_OPCODE(pt->code[pc + j]);
++          check(op1 == OP_GETUPVAL || op1 == OP_MOVE);
++        }
++        if (reg != NO_REG)  /* tracing? */
++          pc += nup;  /* do not 'execute' these pseudo-instructions */
++        break;
++      }
++      case OP_VARARG: {
++        check((pt->is_vararg & VARARG_ISVARARG) &&
++             !(pt->is_vararg & VARARG_NEEDSARG));
++        b--;
++        if (b == LUA_MULTRET) check(checkopenop(pt, pc));
++        checkreg(pt, a+b-1);
++        break;
++      }
++      default: break;
++    }
++  }
++  return pt->code[last];
++}
++
++#undef check
++#undef checkjump
++#undef checkreg
++
++/* }====================================================== */
++
++
++int luaG_checkcode (const Proto *pt) {
++  return (symbexec(pt, pt->sizecode, NO_REG) != 0);
++}
++
++
++static const char *kname (Proto *p, int c) {
++  if (ISK(c) && ttisstring(&p->k[INDEXK(c)]))
++    return svalue(&p->k[INDEXK(c)]);
++  else
++    return "?";
++}
++
++
++static const char *getobjname (lua_State *L, CallInfo *ci, int stackpos,
++                               const char **name) {
++  if (isLua(ci)) {  /* a Lua function? */
++    Proto *p = ci_func(ci)->l.p;
++    int pc = currentpc(L, ci);
++    Instruction i;
++    *name = luaF_getlocalname(p, stackpos+1, pc);
++    if (*name)  /* is a local? */
++      return "local";
++    i = symbexec(p, pc, stackpos);  /* try symbolic execution */
++    lua_assert(pc != -1);
++    switch (GET_OPCODE(i)) {
++      case OP_GETGLOBAL: {
++        int g = GETARG_Bx(i);  /* global index */
++        lua_assert(ttisstring(&p->k[g]));
++        *name = svalue(&p->k[g]);
++        return "global";
++      }
++      case OP_MOVE: {
++        int a = GETARG_A(i);
++        int b = GETARG_B(i);  /* move from `b' to `a' */
++        if (b < a)
++          return getobjname(L, ci, b, name);  /* get name for `b' */
++        break;
++      }
++      case OP_GETTABLE: {
++        int k = GETARG_C(i);  /* key index */
++        *name = kname(p, k);
++        return "field";
++      }
++      case OP_GETUPVAL: {
++        int u = GETARG_B(i);  /* upvalue index */
++        *name = p->upvalues ? getstr(p->upvalues[u]) : "?";
++        return "upvalue";
++      }
++      case OP_SELF: {
++        int k = GETARG_C(i);  /* key index */
++        *name = kname(p, k);
++        return "method";
++      }
++      default: break;
++    }
++  }
++  return NULL;  /* no useful name found */
++}
++
++
++static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) {
++  Instruction i;
++  if ((isLua(ci) && ci->tailcalls > 0) || !isLua(ci - 1))
++    return NULL;  /* calling function is not Lua (or is unknown) */
++  ci--;  /* calling function */
++  i = ci_func(ci)->l.p->code[currentpc(L, ci)];
++  if (GET_OPCODE(i) == OP_CALL || GET_OPCODE(i) == OP_TAILCALL ||
++      GET_OPCODE(i) == OP_TFORLOOP)
++    return getobjname(L, ci, GETARG_A(i), name);
++  else
++    return NULL;  /* no useful name can be found */
++}
++
++
++/* only ANSI way to check whether a pointer points to an array */
++static int isinstack (CallInfo *ci, const TValue *o) {
++  StkId p;
++  for (p = ci->base; p < ci->top; p++)
++    if (o == p) return 1;
++  return 0;
++}
++
++
++void luaG_typeerror (lua_State *L, const TValue *o, const char *op) {
++  const char *name = NULL;
++  const char *t = luaT_typenames[ttype(o)];
++  const char *kind = (isinstack(L->ci, o)) ?
++                         getobjname(L, L->ci, cast_int(o - L->base), &name) :
++                         NULL;
++  if (kind)
++    luaG_runerror(L, "attempt to %s %s " LUA_QS " (a %s value)",
++                op, kind, name, t);
++  else
++    luaG_runerror(L, "attempt to %s a %s value", op, t);
++}
++
++
++void luaG_concaterror (lua_State *L, StkId p1, StkId p2) {
++  if (ttisstring(p1) || ttisnumber(p1)) p1 = p2;
++  lua_assert(!ttisstring(p1) && !ttisnumber(p1));
++  luaG_typeerror(L, p1, "concatenate");
++}
++
++
++void luaG_aritherror (lua_State *L, const TValue *p1, const TValue *p2) {
++  TValue temp;
++  if (luaV_tonumber(p1, &temp) == NULL)
++    p2 = p1;  /* first operand is wrong */
++  luaG_typeerror(L, p2, "perform arithmetic on");
++}
++
++
++int luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) {
++  const char *t1 = luaT_typenames[ttype(p1)];
++  const char *t2 = luaT_typenames[ttype(p2)];
++  if (t1[2] == t2[2])
++    luaG_runerror(L, "attempt to compare two %s values", t1);
++  else
++    luaG_runerror(L, "attempt to compare %s with %s", t1, t2);
++  return 0;
++}
++
++
++static void addinfo (lua_State *L, const char *msg) {
++  CallInfo *ci = L->ci;
++  if (isLua(ci)) {  /* is Lua code? */
++    char buff[LUA_IDSIZE];  /* add file:line information */
++    int line = currentline(L, ci);
++    luaO_chunkid(buff, getstr(getluaproto(ci)->source), LUA_IDSIZE);
++    luaO_pushfstring(L, "%s:%d: %s", buff, line, msg);
++  }
++}
++
++
++void luaG_errormsg (lua_State *L) {
++  if (L->errfunc != 0) {  /* is there an error handling function? */
++    StkId errfunc = restorestack(L, L->errfunc);
++    if (!ttisfunction(errfunc)) luaD_throw(L, LUA_ERRERR);
++    setobjs2s(L, L->top, L->top - 1);  /* move argument */
++    setobjs2s(L, L->top - 1, errfunc);  /* push function */
++    incr_top(L);
++    luaD_call(L, L->top - 2, 1);  /* call it */
++  }
++  luaD_throw(L, LUA_ERRRUN);
++}
++
++
++void luaG_runerror (lua_State *L, const char *fmt, ...) {
++  va_list argp;
++  va_start(argp, fmt);
++  addinfo(L, luaO_pushvfstring(L, fmt, argp));
++  va_end(argp);
++  luaG_errormsg(L);
++}
++
+--- /dev/null
++++ b/extensions/LUA/lua/ldebug.h
+@@ -0,0 +1,33 @@
++/*
++** $Id: ldebug.h,v 2.3.1.1 2007/12/27 13:02:25 roberto Exp $
++** Auxiliary functions from Debug Interface module
++** See Copyright Notice in lua.h
++*/
++
++#ifndef ldebug_h
++#define ldebug_h
++
++
++#include "lstate.h"
++
++
++#define pcRel(pc, p)  (cast(int, (pc) - (p)->code) - 1)
++
++#define getline(f,pc) (((f)->lineinfo) ? (f)->lineinfo[pc] : 0)
++
++#define resethookcount(L)     (L->hookcount = L->basehookcount)
++
++
++LUAI_FUNC void luaG_typeerror (lua_State *L, const TValue *o,
++                                             const char *opname);
++LUAI_FUNC void luaG_concaterror (lua_State *L, StkId p1, StkId p2);
++LUAI_FUNC void luaG_aritherror (lua_State *L, const TValue *p1,
++                                              const TValue *p2);
++LUAI_FUNC int luaG_ordererror (lua_State *L, const TValue *p1,
++                                             const TValue *p2);
++LUAI_FUNC void luaG_runerror (lua_State *L, const char *fmt, ...);
++LUAI_FUNC void luaG_errormsg (lua_State *L);
++LUAI_FUNC int luaG_checkcode (const Proto *pt);
++LUAI_FUNC int luaG_checkopenop (Instruction i);
++
++#endif
+--- /dev/null
++++ b/extensions/LUA/lua/ldo.c
+@@ -0,0 +1,515 @@
++/*
++** $Id: ldo.c,v 2.38.1.3 2008/01/18 22:31:22 roberto Exp $
++** Stack and Call structure of Lua
++** See Copyright Notice in lua.h
++*/
++
++#include <setjmp.h>
++#include <stdlib.h>
++#include <string.h>
++
++#define ldo_c
++#define LUA_CORE
++
++#include "lua.h"
++
++#include "ldebug.h"
++#include "ldo.h"
++#include "lfunc.h"
++#include "lgc.h"
++#include "lmem.h"
++#include "lobject.h"
++#include "lopcodes.h"
++#include "lparser.h"
++#include "lstate.h"
++#include "lstring.h"
++#include "ltable.h"
++#include "ltm.h"
++#include "lundump.h"
++#include "lvm.h"
++#include "lzio.h"
++
++
++
++/*
++** {======================================================
++** Error-recovery functions
++** =======================================================
++*/
++
++
++/* chain list of long jump buffers */
++struct lua_longjmp {
++  struct lua_longjmp *previous;
++  luai_jmpbuf b;
++  volatile int status;  /* error code */
++};
++
++
++void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) {
++  switch (errcode) {
++    case LUA_ERRMEM: {
++      setsvalue2s(L, oldtop, luaS_newliteral(L, MEMERRMSG));
++      break;
++    }
++    case LUA_ERRERR: {
++      setsvalue2s(L, oldtop, luaS_newliteral(L, "error in error handling"));
++      break;
++    }
++    case LUA_ERRSYNTAX:
++    case LUA_ERRRUN: {
++      setobjs2s(L, oldtop, L->top - 1);  /* error message on current top */
++      break;
++    }
++  }
++  L->top = oldtop + 1;
++}
++
++
++static void restore_stack_limit (lua_State *L) {
++  lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1);
++  if (L->size_ci > LUAI_MAXCALLS) {  /* there was an overflow? */
++    int inuse = cast_int(L->ci - L->base_ci);
++    if (inuse + 1 < LUAI_MAXCALLS)  /* can `undo' overflow? */
++      luaD_reallocCI(L, LUAI_MAXCALLS);
++  }
++}
++
++
++static void resetstack (lua_State *L, int status) {
++  L->ci = L->base_ci;
++  L->base = L->ci->base;
++  luaF_close(L, L->base);  /* close eventual pending closures */
++  luaD_seterrorobj(L, status, L->base);
++  L->nCcalls = L->baseCcalls;
++  L->allowhook = 1;
++  restore_stack_limit(L);
++  L->errfunc = 0;
++  L->errorJmp = NULL;
++}
++
++
++void luaD_throw (lua_State *L, int errcode) {
++  if (L->errorJmp) {
++    L->errorJmp->status = errcode;
++    LUAI_THROW(L, L->errorJmp);
++  }
++  else {
++    L->status = cast_byte(errcode);
++    if (G(L)->panic) {
++      resetstack(L, errcode);
++      lua_unlock(L);
++      G(L)->panic(L);
++    }
++    exit(EXIT_FAILURE);
++  }
++}
++
++
++int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {
++  struct lua_longjmp lj;
++  lj.status = 0;
++  lj.previous = L->errorJmp;  /* chain new error handler */
++  L->errorJmp = &lj;
++  LUAI_TRY(L, &lj,
++    (*f)(L, ud);
++  );
++  L->errorJmp = lj.previous;  /* restore old error handler */
++  return lj.status;
++}
++
++/* }====================================================== */
++
++
++static void correctstack (lua_State *L, TValue *oldstack) {
++  CallInfo *ci;
++  GCObject *up;
++  L->top = (L->top - oldstack) + L->stack;
++  for (up = L->openupval; up != NULL; up = up->gch.next)
++    gco2uv(up)->v = (gco2uv(up)->v - oldstack) + L->stack;
++  for (ci = L->base_ci; ci <= L->ci; ci++) {
++    ci->top = (ci->top - oldstack) + L->stack;
++    ci->base = (ci->base - oldstack) + L->stack;
++    ci->func = (ci->func - oldstack) + L->stack;
++  }
++  L->base = (L->base - oldstack) + L->stack;
++}
++
++
++void luaD_reallocstack (lua_State *L, int newsize) {
++  TValue *oldstack = L->stack;
++  int realsize = newsize + 1 + EXTRA_STACK;
++  lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1);
++  luaM_reallocvector(L, L->stack, L->stacksize, realsize, TValue);
++  L->stacksize = realsize;
++  L->stack_last = L->stack+newsize;
++  correctstack(L, oldstack);
++}
++
++
++void luaD_reallocCI (lua_State *L, int newsize) {
++  CallInfo *oldci = L->base_ci;
++  luaM_reallocvector(L, L->base_ci, L->size_ci, newsize, CallInfo);
++  L->size_ci = newsize;
++  L->ci = (L->ci - oldci) + L->base_ci;
++  L->end_ci = L->base_ci + L->size_ci - 1;
++}
++
++
++void luaD_growstack (lua_State *L, int n) {
++  if (n <= L->stacksize)  /* double size is enough? */
++    luaD_reallocstack(L, 2*L->stacksize);
++  else
++    luaD_reallocstack(L, L->stacksize + n);
++}
++
++
++static CallInfo *growCI (lua_State *L) {
++  if (L->size_ci > LUAI_MAXCALLS)  /* overflow while handling overflow? */
++    luaD_throw(L, LUA_ERRERR);
++  else {
++    luaD_reallocCI(L, 2*L->size_ci);
++    if (L->size_ci > LUAI_MAXCALLS)
++      luaG_runerror(L, "stack overflow");
++  }
++  return ++L->ci;
++}
++
++
++void luaD_callhook (lua_State *L, int event, int line) {
++  lua_Hook hook = L->hook;
++  if (hook && L->allowhook) {
++    ptrdiff_t top = savestack(L, L->top);
++    ptrdiff_t ci_top = savestack(L, L->ci->top);
++    lua_Debug ar;
++    ar.event = event;
++    ar.currentline = line;
++    if (event == LUA_HOOKTAILRET)
++      ar.i_ci = 0;  /* tail call; no debug information about it */
++    else
++      ar.i_ci = cast_int(L->ci - L->base_ci);
++    luaD_checkstack(L, LUA_MINSTACK);  /* ensure minimum stack size */
++    L->ci->top = L->top + LUA_MINSTACK;
++    lua_assert(L->ci->top <= L->stack_last);
++    L->allowhook = 0;  /* cannot call hooks inside a hook */
++    lua_unlock(L);
++    (*hook)(L, &ar);
++    lua_lock(L);
++    lua_assert(!L->allowhook);
++    L->allowhook = 1;
++    L->ci->top = restorestack(L, ci_top);
++    L->top = restorestack(L, top);
++  }
++}
++
++
++static StkId adjust_varargs (lua_State *L, Proto *p, int actual) {
++  int i;
++  int nfixargs = p->numparams;
++  Table *htab = NULL;
++  StkId base, fixed;
++  for (; actual < nfixargs; ++actual)
++    setnilvalue(L->top++);
++#if defined(LUA_COMPAT_VARARG)
++  if (p->is_vararg & VARARG_NEEDSARG) { /* compat. with old-style vararg? */
++    int nvar = actual - nfixargs;  /* number of extra arguments */
++    lua_assert(p->is_vararg & VARARG_HASARG);
++    luaC_checkGC(L);
++    htab = luaH_new(L, nvar, 1);  /* create `arg' table */
++    for (i=0; i<nvar; i++)  /* put extra arguments into `arg' table */
++      setobj2n(L, luaH_setnum(L, htab, i+1), L->top - nvar + i);
++    /* store counter in field `n' */
++    setnvalue(luaH_setstr(L, htab, luaS_newliteral(L, "n")), cast_num(nvar));
++  }
++#endif
++  /* move fixed parameters to final position */
++  fixed = L->top - actual;  /* first fixed argument */
++  base = L->top;  /* final position of first argument */
++  for (i=0; i<nfixargs; i++) {
++    setobjs2s(L, L->top++, fixed+i);
++    setnilvalue(fixed+i);
++  }
++  /* add `arg' parameter */
++  if (htab) {
++    sethvalue(L, L->top++, htab);
++    lua_assert(iswhite(obj2gco(htab)));
++  }
++  return base;
++}
++
++
++static StkId tryfuncTM (lua_State *L, StkId func) {
++  const TValue *tm = luaT_gettmbyobj(L, func, TM_CALL);
++  StkId p;
++  ptrdiff_t funcr = savestack(L, func);
++  if (!ttisfunction(tm))
++    luaG_typeerror(L, func, "call");
++  /* Open a hole inside the stack at `func' */
++  for (p = L->top; p > func; p--) setobjs2s(L, p, p-1);
++  incr_top(L);
++  func = restorestack(L, funcr);  /* previous call may change stack */
++  setobj2s(L, func, tm);  /* tag method is the new function to be called */
++  return func;
++}
++
++
++
++#define inc_ci(L) \
++  ((L->ci == L->end_ci) ? growCI(L) : \
++   (condhardstacktests(luaD_reallocCI(L, L->size_ci)), ++L->ci))
++
++
++int luaD_precall (lua_State *L, StkId func, int nresults) {
++  LClosure *cl;
++  ptrdiff_t funcr;
++  if (!ttisfunction(func)) /* `func' is not a function? */
++    func = tryfuncTM(L, func);  /* check the `function' tag method */
++  funcr = savestack(L, func);
++  cl = &clvalue(func)->l;
++  L->ci->savedpc = L->savedpc;
++  if (!cl->isC) {  /* Lua function? prepare its call */
++    CallInfo *ci;
++    StkId st, base;
++    Proto *p = cl->p;
++    luaD_checkstack(L, p->maxstacksize);
++    func = restorestack(L, funcr);
++    if (!p->is_vararg) {  /* no varargs? */
++      base = func + 1;
++      if (L->top > base + p->numparams)
++        L->top = base + p->numparams;
++    }
++    else {  /* vararg function */
++      int nargs = cast_int(L->top - func) - 1;
++      base = adjust_varargs(L, p, nargs);
++      func = restorestack(L, funcr);  /* previous call may change the stack */
++    }
++    ci = inc_ci(L);  /* now `enter' new function */
++    ci->func = func;
++    L->base = ci->base = base;
++    ci->top = L->base + p->maxstacksize;
++    lua_assert(ci->top <= L->stack_last);
++    L->savedpc = p->code;  /* starting point */
++    ci->tailcalls = 0;
++    ci->nresults = nresults;
++    for (st = L->top; st < ci->top; st++)
++      setnilvalue(st);
++    L->top = ci->top;
++    if (L->hookmask & LUA_MASKCALL) {
++      L->savedpc++;  /* hooks assume 'pc' is already incremented */
++      luaD_callhook(L, LUA_HOOKCALL, -1);
++      L->savedpc--;  /* correct 'pc' */
++    }
++    return PCRLUA;
++  }
++  else {  /* if is a C function, call it */
++    CallInfo *ci;
++    int n;
++    luaD_checkstack(L, LUA_MINSTACK);  /* ensure minimum stack size */
++    ci = inc_ci(L);  /* now `enter' new function */
++    ci->func = restorestack(L, funcr);
++    L->base = ci->base = ci->func + 1;
++    ci->top = L->top + LUA_MINSTACK;
++    lua_assert(ci->top <= L->stack_last);
++    ci->nresults = nresults;
++    if (L->hookmask & LUA_MASKCALL)
++      luaD_callhook(L, LUA_HOOKCALL, -1);
++    lua_unlock(L);
++    n = (*curr_func(L)->c.f)(L);  /* do the actual call */
++    lua_lock(L);
++    if (n < 0)  /* yielding? */
++      return PCRYIELD;
++    else {
++      luaD_poscall(L, L->top - n);
++      return PCRC;
++    }
++  }
++}
++
++
++static StkId callrethooks (lua_State *L, StkId firstResult) {
++  ptrdiff_t fr = savestack(L, firstResult);  /* next call may change stack */
++  luaD_callhook(L, LUA_HOOKRET, -1);
++  if (f_isLua(L->ci)) {  /* Lua function? */
++    while ((L->hookmask & LUA_MASKRET) && L->ci->tailcalls--) /* tail calls */
++      luaD_callhook(L, LUA_HOOKTAILRET, -1);
++  }
++  return restorestack(L, fr);
++}
++
++
++int luaD_poscall (lua_State *L, StkId firstResult) {
++  StkId res;
++  int wanted, i;
++  CallInfo *ci;
++  if (L->hookmask & LUA_MASKRET)
++    firstResult = callrethooks(L, firstResult);
++  ci = L->ci--;
++  res = ci->func;  /* res == final position of 1st result */
++  wanted = ci->nresults;
++  L->base = (ci - 1)->base;  /* restore base */
++  L->savedpc = (ci - 1)->savedpc;  /* restore savedpc */
++  /* move results to correct place */
++  for (i = wanted; i != 0 && firstResult < L->top; i--)
++    setobjs2s(L, res++, firstResult++);
++  while (i-- > 0)
++    setnilvalue(res++);
++  L->top = res;
++  return (wanted - LUA_MULTRET);  /* 0 iff wanted == LUA_MULTRET */
++}
++
++
++/*
++** Call a function (C or Lua). The function to be called is at *func.
++** The arguments are on the stack, right after the function.
++** When returns, all the results are on the stack, starting at the original
++** function position.
++*/
++void luaD_call (lua_State *L, StkId func, int nResults) {
++  if (++L->nCcalls >= LUAI_MAXCCALLS) {
++    if (L->nCcalls == LUAI_MAXCCALLS)
++      luaG_runerror(L, "C stack overflow");
++    else if (L->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3)))
++      luaD_throw(L, LUA_ERRERR);  /* error while handing stack error */
++  }
++  if (luaD_precall(L, func, nResults) == PCRLUA)  /* is a Lua function? */
++    luaV_execute(L, 1);  /* call it */
++  L->nCcalls--;
++  luaC_checkGC(L);
++}
++
++
++static void resume (lua_State *L, void *ud) {
++  StkId firstArg = cast(StkId, ud);
++  CallInfo *ci = L->ci;
++  if (L->status == 0) {  /* start coroutine? */
++    lua_assert(ci == L->base_ci && firstArg > L->base);
++    if (luaD_precall(L, firstArg - 1, LUA_MULTRET) != PCRLUA)
++      return;
++  }
++  else {  /* resuming from previous yield */
++    lua_assert(L->status == LUA_YIELD);
++    L->status = 0;
++    if (!f_isLua(ci)) {  /* `common' yield? */
++      /* finish interrupted execution of `OP_CALL' */
++      lua_assert(GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_CALL ||
++                 GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_TAILCALL);
++      if (luaD_poscall(L, firstArg))  /* complete it... */
++        L->top = L->ci->top;  /* and correct top if not multiple results */
++    }
++    else  /* yielded inside a hook: just continue its execution */
++      L->base = L->ci->base;
++  }
++  luaV_execute(L, cast_int(L->ci - L->base_ci));
++}
++
++
++static int resume_error (lua_State *L, const char *msg) {
++  L->top = L->ci->base;
++  setsvalue2s(L, L->top, luaS_new(L, msg));
++  incr_top(L);
++  lua_unlock(L);
++  return LUA_ERRRUN;
++}
++
++
++LUA_API int lua_resume (lua_State *L, int nargs) {
++  int status;
++  lua_lock(L);
++  if (L->status != LUA_YIELD && (L->status != 0 || L->ci != L->base_ci))
++      return resume_error(L, "cannot resume non-suspended coroutine");
++  if (L->nCcalls >= LUAI_MAXCCALLS)
++    return resume_error(L, "C stack overflow");
++  luai_userstateresume(L, nargs);
++  lua_assert(L->errfunc == 0);
++  L->baseCcalls = ++L->nCcalls;
++  status = luaD_rawrunprotected(L, resume, L->top - nargs);
++  if (status != 0) {  /* error? */
++    L->status = cast_byte(status);  /* mark thread as `dead' */
++    luaD_seterrorobj(L, status, L->top);
++    L->ci->top = L->top;
++  }
++  else {
++    lua_assert(L->nCcalls == L->baseCcalls);
++    status = L->status;
++  }
++  --L->nCcalls;
++  lua_unlock(L);
++  return status;
++}
++
++
++LUA_API int lua_yield (lua_State *L, int nresults) {
++  luai_userstateyield(L, nresults);
++  lua_lock(L);
++  if (L->nCcalls > L->baseCcalls)
++    luaG_runerror(L, "attempt to yield across metamethod/C-call boundary");
++  L->base = L->top - nresults;  /* protect stack slots below */
++  L->status = LUA_YIELD;
++  lua_unlock(L);
++  return -1;
++}
++
++
++int luaD_pcall (lua_State *L, Pfunc func, void *u,
++                ptrdiff_t old_top, ptrdiff_t ef) {
++  int status;
++  unsigned short oldnCcalls = L->nCcalls;
++  ptrdiff_t old_ci = saveci(L, L->ci);
++  lu_byte old_allowhooks = L->allowhook;
++  ptrdiff_t old_errfunc = L->errfunc;
++  L->errfunc = ef;
++  status = luaD_rawrunprotected(L, func, u);
++  if (status != 0) {  /* an error occurred? */
++    StkId oldtop = restorestack(L, old_top);
++    luaF_close(L, oldtop);  /* close eventual pending closures */
++    luaD_seterrorobj(L, status, oldtop);
++    L->nCcalls = oldnCcalls;
++    L->ci = restoreci(L, old_ci);
++    L->base = L->ci->base;
++    L->savedpc = L->ci->savedpc;
++    L->allowhook = old_allowhooks;
++    restore_stack_limit(L);
++  }
++  L->errfunc = old_errfunc;
++  return status;
++}
++
++
++
++/*
++** Execute a protected parser.
++*/
++struct SParser {  /* data to `f_parser' */
++  ZIO *z;
++  Mbuffer buff;  /* buffer to be used by the scanner */
++  const char *name;
++};
++
++static void f_parser (lua_State *L, void *ud) {
++  int i;
++  Proto *tf;
++  Closure *cl;
++  struct SParser *p = cast(struct SParser *, ud);
++  int c = luaZ_lookahead(p->z);
++  luaC_checkGC(L);
++  tf = ((c == LUA_SIGNATURE[0]) ? luaU_undump : luaY_parser)(L, p->z,
++                                                             &p->buff, p->name);
++  cl = luaF_newLclosure(L, tf->nups, hvalue(gt(L)));
++  cl->l.p = tf;
++  for (i = 0; i < tf->nups; i++)  /* initialize eventual upvalues */
++    cl->l.upvals[i] = luaF_newupval(L);
++  setclvalue(L, L->top, cl);
++  incr_top(L);
++}
++
++
++int luaD_protectedparser (lua_State *L, ZIO *z, const char *name) {
++  struct SParser p;
++  int status;
++  p.z = z; p.name = name;
++  luaZ_initbuffer(L, &p.buff);
++  status = luaD_pcall(L, f_parser, &p, savestack(L, L->top), L->errfunc);
++  luaZ_freebuffer(L, &p.buff);
++  return status;
++}
++
+--- /dev/null
++++ b/extensions/LUA/lua/ldo.h
+@@ -0,0 +1,57 @@
++/*
++** $Id: ldo.h,v 2.7.1.1 2007/12/27 13:02:25 roberto Exp $
++** Stack and Call structure of Lua
++** See Copyright Notice in lua.h
++*/
++
++#ifndef ldo_h
++#define ldo_h
++
++
++#include "lobject.h"
++#include "lstate.h"
++#include "lzio.h"
++
++
++#define luaD_checkstack(L,n)  \
++  if ((char *)L->stack_last - (char *)L->top <= (n)*(int)sizeof(TValue)) \
++    luaD_growstack(L, n); \
++  else condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1));
++
++
++#define incr_top(L) {luaD_checkstack(L,1); L->top++;}
++
++#define savestack(L,p)                ((char *)(p) - (char *)L->stack)
++#define restorestack(L,n)     ((TValue *)((char *)L->stack + (n)))
++
++#define saveci(L,p)           ((char *)(p) - (char *)L->base_ci)
++#define restoreci(L,n)                ((CallInfo *)((char *)L->base_ci + (n)))
++
++
++/* results from luaD_precall */
++#define PCRLUA                0       /* initiated a call to a Lua function */
++#define PCRC          1       /* did a call to a C function */
++#define PCRYIELD      2       /* C funtion yielded */
++
++
++/* type of protected functions, to be ran by `runprotected' */
++typedef void (*Pfunc) (lua_State *L, void *ud);
++
++LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name);
++LUAI_FUNC void luaD_callhook (lua_State *L, int event, int line);
++LUAI_FUNC int luaD_precall (lua_State *L, StkId func, int nresults);
++LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults);
++LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u,
++                                        ptrdiff_t oldtop, ptrdiff_t ef);
++LUAI_FUNC int luaD_poscall (lua_State *L, StkId firstResult);
++LUAI_FUNC void luaD_reallocCI (lua_State *L, int newsize);
++LUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize);
++LUAI_FUNC void luaD_growstack (lua_State *L, int n);
++
++LUAI_FUNC void luaD_throw (lua_State *L, int errcode);
++LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud);
++
++LUAI_FUNC void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop);
++
++#endif
++
+--- /dev/null
++++ b/extensions/LUA/lua/ldump.c
+@@ -0,0 +1,164 @@
++/*
++** $Id: ldump.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $
++** save precompiled Lua chunks
++** See Copyright Notice in lua.h
++*/
++
++#include <stddef.h>
++
++#define ldump_c
++#define LUA_CORE
++
++#include "lua.h"
++
++#include "lobject.h"
++#include "lstate.h"
++#include "lundump.h"
++
++typedef struct {
++ lua_State* L;
++ lua_Writer writer;
++ void* data;
++ int strip;
++ int status;
++} DumpState;
++
++#define DumpMem(b,n,size,D)   DumpBlock(b,(n)*(size),D)
++#define DumpVar(x,D)          DumpMem(&x,1,sizeof(x),D)
++
++static void DumpBlock(const void* b, size_t size, DumpState* D)
++{
++ if (D->status==0)
++ {
++  lua_unlock(D->L);
++  D->status=(*D->writer)(D->L,b,size,D->data);
++  lua_lock(D->L);
++ }
++}
++
++static void DumpChar(int y, DumpState* D)
++{
++ char x=(char)y;
++ DumpVar(x,D);
++}
++
++static void DumpInt(int x, DumpState* D)
++{
++ DumpVar(x,D);
++}
++
++static void DumpNumber(lua_Number x, DumpState* D)
++{
++ DumpVar(x,D);
++}
++
++static void DumpVector(const void* b, int n, size_t size, DumpState* D)
++{
++ DumpInt(n,D);
++ DumpMem(b,n,size,D);
++}
++
++static void DumpString(const TString* s, DumpState* D)
++{
++ if (s==NULL || getstr(s)==NULL)
++ {
++  size_t size=0;
++  DumpVar(size,D);
++ }
++ else
++ {
++  size_t size=s->tsv.len+1;           /* include trailing '\0' */
++  DumpVar(size,D);
++  DumpBlock(getstr(s),size,D);
++ }
++}
++
++#define DumpCode(f,D)  DumpVector(f->code,f->sizecode,sizeof(Instruction),D)
++
++static void DumpFunction(const Proto* f, const TString* p, DumpState* D);
++
++static void DumpConstants(const Proto* f, DumpState* D)
++{
++ int i,n=f->sizek;
++ DumpInt(n,D);
++ for (i=0; i<n; i++)
++ {
++  const TValue* o=&f->k[i];
++  DumpChar(ttype(o),D);
++  switch (ttype(o))
++  {
++   case LUA_TNIL:
++      break;
++   case LUA_TBOOLEAN:
++      DumpChar(bvalue(o),D);
++      break;
++   case LUA_TNUMBER:
++      DumpNumber(nvalue(o),D);
++      break;
++   case LUA_TSTRING:
++      DumpString(rawtsvalue(o),D);
++      break;
++   default:
++      lua_assert(0);                  /* cannot happen */
++      break;
++  }
++ }
++ n=f->sizep;
++ DumpInt(n,D);
++ for (i=0; i<n; i++) DumpFunction(f->p[i],f->source,D);
++}
++
++static void DumpDebug(const Proto* f, DumpState* D)
++{
++ int i,n;
++ n= (D->strip) ? 0 : f->sizelineinfo;
++ DumpVector(f->lineinfo,n,sizeof(int),D);
++ n= (D->strip) ? 0 : f->sizelocvars;
++ DumpInt(n,D);
++ for (i=0; i<n; i++)
++ {
++  DumpString(f->locvars[i].varname,D);
++  DumpInt(f->locvars[i].startpc,D);
++  DumpInt(f->locvars[i].endpc,D);
++ }
++ n= (D->strip) ? 0 : f->sizeupvalues;
++ DumpInt(n,D);
++ for (i=0; i<n; i++) DumpString(f->upvalues[i],D);
++}
++
++static void DumpFunction(const Proto* f, const TString* p, DumpState* D)
++{
++ DumpString((f->source==p || D->strip) ? NULL : f->source,D);
++ DumpInt(f->linedefined,D);
++ DumpInt(f->lastlinedefined,D);
++ DumpChar(f->nups,D);
++ DumpChar(f->numparams,D);
++ DumpChar(f->is_vararg,D);
++ DumpChar(f->maxstacksize,D);
++ DumpCode(f,D);
++ DumpConstants(f,D);
++ DumpDebug(f,D);
++}
++
++static void DumpHeader(DumpState* D)
++{
++ char h[LUAC_HEADERSIZE];
++ luaU_header(h);
++ DumpBlock(h,LUAC_HEADERSIZE,D);
++}
++
++/*
++** dump Lua function as precompiled chunk
++*/
++int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip)
++{
++ DumpState D;
++ D.L=L;
++ D.writer=w;
++ D.data=data;
++ D.strip=strip;
++ D.status=0;
++ DumpHeader(&D);
++ DumpFunction(f,NULL,&D);
++ return D.status;
++}
+--- /dev/null
++++ b/extensions/LUA/lua/lfunc.c
+@@ -0,0 +1,174 @@
++/*
++** $Id: lfunc.c,v 2.12.1.2 2007/12/28 14:58:43 roberto Exp $
++** Auxiliary functions to manipulate prototypes and closures
++** See Copyright Notice in lua.h
++*/
++
++
++#include <stddef.h>
++
++#define lfunc_c
++#define LUA_CORE
++
++#include "lua.h"
++
++#include "lfunc.h"
++#include "lgc.h"
++#include "lmem.h"
++#include "lobject.h"
++#include "lstate.h"
++
++
++
++Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e) {
++  Closure *c = cast(Closure *, luaM_malloc(L, sizeCclosure(nelems)));
++  luaC_link(L, obj2gco(c), LUA_TFUNCTION);
++  c->c.isC = 1;
++  c->c.env = e;
++  c->c.nupvalues = cast_byte(nelems);
++  return c;
++}
++
++
++Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e) {
++  Closure *c = cast(Closure *, luaM_malloc(L, sizeLclosure(nelems)));
++  luaC_link(L, obj2gco(c), LUA_TFUNCTION);
++  c->l.isC = 0;
++  c->l.env = e;
++  c->l.nupvalues = cast_byte(nelems);
++  while (nelems--) c->l.upvals[nelems] = NULL;
++  return c;
++}
++
++
++UpVal *luaF_newupval (lua_State *L) {
++  UpVal *uv = luaM_new(L, UpVal);
++  luaC_link(L, obj2gco(uv), LUA_TUPVAL);
++  uv->v = &uv->u.value;
++  setnilvalue(uv->v);
++  return uv;
++}
++
++
++UpVal *luaF_findupval (lua_State *L, StkId level) {
++  global_State *g = G(L);
++  GCObject **pp = &L->openupval;
++  UpVal *p;
++  UpVal *uv;
++  while (*pp != NULL && (p = ngcotouv(*pp))->v >= level) {
++    lua_assert(p->v != &p->u.value);
++    if (p->v == level) {  /* found a corresponding upvalue? */
++      if (isdead(g, obj2gco(p)))  /* is it dead? */
++        changewhite(obj2gco(p));  /* ressurect it */
++      return p;
++    }
++    pp = &p->next;
++  }
++  uv = luaM_new(L, UpVal);  /* not found: create a new one */
++  uv->tt = LUA_TUPVAL;
++  uv->marked = luaC_white(g);
++  uv->v = level;  /* current value lives in the stack */
++  uv->next = *pp;  /* chain it in the proper position */
++  *pp = obj2gco(uv);
++  uv->u.l.prev = &g->uvhead;  /* double link it in `uvhead' list */
++  uv->u.l.next = g->uvhead.u.l.next;
++  uv->u.l.next->u.l.prev = uv;
++  g->uvhead.u.l.next = uv;
++  lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv);
++  return uv;
++}
++
++
++static void unlinkupval (UpVal *uv) {
++  lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv);
++  uv->u.l.next->u.l.prev = uv->u.l.prev;  /* remove from `uvhead' list */
++  uv->u.l.prev->u.l.next = uv->u.l.next;
++}
++
++
++void luaF_freeupval (lua_State *L, UpVal *uv) {
++  if (uv->v != &uv->u.value)  /* is it open? */
++    unlinkupval(uv);  /* remove from open list */
++  luaM_free(L, uv);  /* free upvalue */
++}
++
++
++void luaF_close (lua_State *L, StkId level) {
++  UpVal *uv;
++  global_State *g = G(L);
++  while (L->openupval != NULL && (uv = ngcotouv(L->openupval))->v >= level) {
++    GCObject *o = obj2gco(uv);
++    lua_assert(!isblack(o) && uv->v != &uv->u.value);
++    L->openupval = uv->next;  /* remove from `open' list */
++    if (isdead(g, o))
++      luaF_freeupval(L, uv);  /* free upvalue */
++    else {
++      unlinkupval(uv);
++      setobj(L, &uv->u.value, uv->v);
++      uv->v = &uv->u.value;  /* now current value lives here */
++      luaC_linkupval(L, uv);  /* link upvalue into `gcroot' list */
++    }
++  }
++}
++
++
++Proto *luaF_newproto (lua_State *L) {
++  Proto *f = luaM_new(L, Proto);
++  luaC_link(L, obj2gco(f), LUA_TPROTO);
++  f->k = NULL;
++  f->sizek = 0;
++  f->p = NULL;
++  f->sizep = 0;
++  f->code = NULL;
++  f->sizecode = 0;
++  f->sizelineinfo = 0;
++  f->sizeupvalues = 0;
++  f->nups = 0;
++  f->upvalues = NULL;
++  f->numparams = 0;
++  f->is_vararg = 0;
++  f->maxstacksize = 0;
++  f->lineinfo = NULL;
++  f->sizelocvars = 0;
++  f->locvars = NULL;
++  f->linedefined = 0;
++  f->lastlinedefined = 0;
++  f->source = NULL;
++  return f;
++}
++
++
++void luaF_freeproto (lua_State *L, Proto *f) {
++  luaM_freearray(L, f->code, f->sizecode, Instruction);
++  luaM_freearray(L, f->p, f->sizep, Proto *);
++  luaM_freearray(L, f->k, f->sizek, TValue);
++  luaM_freearray(L, f->lineinfo, f->sizelineinfo, int);
++  luaM_freearray(L, f->locvars, f->sizelocvars, struct LocVar);
++  luaM_freearray(L, f->upvalues, f->sizeupvalues, TString *);
++  luaM_free(L, f);
++}
++
++
++void luaF_freeclosure (lua_State *L, Closure *c) {
++  int size = (c->c.isC) ? sizeCclosure(c->c.nupvalues) :
++                          sizeLclosure(c->l.nupvalues);
++  luaM_freemem(L, c, size);
++}
++
++
++/*
++** Look for n-th local variable at line `line' in function `func'.
++** Returns NULL if not found.
++*/
++const char *luaF_getlocalname (const Proto *f, int local_number, int pc) {
++  int i;
++  for (i = 0; i<f->sizelocvars && f->locvars[i].startpc <= pc; i++) {
++    if (pc < f->locvars[i].endpc) {  /* is variable active? */
++      local_number--;
++      if (local_number == 0)
++        return getstr(f->locvars[i].varname);
++    }
++  }
++  return NULL;  /* not found */
++}
++
+--- /dev/null
++++ b/extensions/LUA/lua/lfunc.h
+@@ -0,0 +1,34 @@
++/*
++** $Id: lfunc.h,v 2.4.1.1 2007/12/27 13:02:25 roberto Exp $
++** Auxiliary functions to manipulate prototypes and closures
++** See Copyright Notice in lua.h
++*/
++
++#ifndef lfunc_h
++#define lfunc_h
++
++
++#include "lobject.h"
++
++
++#define sizeCclosure(n)       (cast(int, sizeof(CClosure)) + \
++                         cast(int, sizeof(TValue)*((n)-1)))
++
++#define sizeLclosure(n)       (cast(int, sizeof(LClosure)) + \
++                         cast(int, sizeof(TValue *)*((n)-1)))
++
++
++LUAI_FUNC Proto *luaF_newproto (lua_State *L);
++LUAI_FUNC Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e);
++LUAI_FUNC Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e);
++LUAI_FUNC UpVal *luaF_newupval (lua_State *L);
++LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level);
++LUAI_FUNC void luaF_close (lua_State *L, StkId level);
++LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f);
++LUAI_FUNC void luaF_freeclosure (lua_State *L, Closure *c);
++LUAI_FUNC void luaF_freeupval (lua_State *L, UpVal *uv);
++LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number,
++                                         int pc);
++
++
++#endif
+--- /dev/null
++++ b/extensions/LUA/lua/lgc.c
+@@ -0,0 +1,711 @@
++/*
++** $Id: lgc.c,v 2.38.1.1 2007/12/27 13:02:25 roberto Exp $
++** Garbage Collector
++** See Copyright Notice in lua.h
++*/
++
++#include <string.h>
++
++#define lgc_c
++#define LUA_CORE
++
++#include "lua.h"
++
++#include "ldebug.h"
++#include "ldo.h"
++#include "lfunc.h"
++#include "lgc.h"
++#include "lmem.h"
++#include "lobject.h"
++#include "lstate.h"
++#include "lstring.h"
++#include "ltable.h"
++#include "ltm.h"
++
++
++#define GCSTEPSIZE    1024u
++#define GCSWEEPMAX    40
++#define GCSWEEPCOST   10
++#define GCFINALIZECOST        100
++
++
++#define maskmarks     cast_byte(~(bitmask(BLACKBIT)|WHITEBITS))
++
++#define makewhite(g,x)        \
++   ((x)->gch.marked = cast_byte(((x)->gch.marked & maskmarks) | luaC_white(g)))
++
++#define white2gray(x) reset2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT)
++#define black2gray(x) resetbit((x)->gch.marked, BLACKBIT)
++
++#define stringmark(s) reset2bits((s)->tsv.marked, WHITE0BIT, WHITE1BIT)
++
++
++#define isfinalized(u)                testbit((u)->marked, FINALIZEDBIT)
++#define markfinalized(u)      l_setbit((u)->marked, FINALIZEDBIT)
++
++
++#define KEYWEAK         bitmask(KEYWEAKBIT)
++#define VALUEWEAK       bitmask(VALUEWEAKBIT)
++
++
++
++#define markvalue(g,o) { checkconsistency(o); \
++  if (iscollectable(o) && iswhite(gcvalue(o))) reallymarkobject(g,gcvalue(o)); }
++
++#define markobject(g,t) { if (iswhite(obj2gco(t))) \
++              reallymarkobject(g, obj2gco(t)); }
++
++
++#define setthreshold(g)  (g->GCthreshold = (g->estimate/100) * g->gcpause)
++
++
++static void removeentry (Node *n) {
++  lua_assert(ttisnil(gval(n)));
++  if (iscollectable(gkey(n)))
++    setttype(gkey(n), LUA_TDEADKEY);  /* dead key; remove it */
++}
++
++
++static void reallymarkobject (global_State *g, GCObject *o) {
++  lua_assert(iswhite(o) && !isdead(g, o));
++  white2gray(o);
++  switch (o->gch.tt) {
++    case LUA_TSTRING: {
++      return;
++    }
++    case LUA_TUSERDATA: {
++      Table *mt = gco2u(o)->metatable;
++      gray2black(o);  /* udata are never gray */
++      if (mt) markobject(g, mt);
++      markobject(g, gco2u(o)->env);
++      return;
++    }
++    case LUA_TUPVAL: {
++      UpVal *uv = gco2uv(o);
++      markvalue(g, uv->v);
++      if (uv->v == &uv->u.value)  /* closed? */
++        gray2black(o);  /* open upvalues are never black */
++      return;
++    }
++    case LUA_TFUNCTION: {
++      gco2cl(o)->c.gclist = g->gray;
++      g->gray = o;
++      break;
++    }
++    case LUA_TTABLE: {
++      gco2h(o)->gclist = g->gray;
++      g->gray = o;
++      break;
++    }
++    case LUA_TTHREAD: {
++      gco2th(o)->gclist = g->gray;
++      g->gray = o;
++      break;
++    }
++    case LUA_TPROTO: {
++      gco2p(o)->gclist = g->gray;
++      g->gray = o;
++      break;
++    }
++    default: lua_assert(0);
++  }
++}
++
++
++static void marktmu (global_State *g) {
++  GCObject *u = g->tmudata;
++  if (u) {
++    do {
++      u = u->gch.next;
++      makewhite(g, u);  /* may be marked, if left from previous GC */
++      reallymarkobject(g, u);
++    } while (u != g->tmudata);
++  }
++}
++
++
++/* move `dead' udata that need finalization to list `tmudata' */
++size_t luaC_separateudata (lua_State *L, int all) {
++  global_State *g = G(L);
++  size_t deadmem = 0;
++  GCObject **p = &g->mainthread->next;
++  GCObject *curr;
++  while ((curr = *p) != NULL) {
++    if (!(iswhite(curr) || all) || isfinalized(gco2u(curr)))
++      p = &curr->gch.next;  /* don't bother with them */
++    else if (fasttm(L, gco2u(curr)->metatable, TM_GC) == NULL) {
++      markfinalized(gco2u(curr));  /* don't need finalization */
++      p = &curr->gch.next;
++    }
++    else {  /* must call its gc method */
++      deadmem += sizeudata(gco2u(curr));
++      markfinalized(gco2u(curr));
++      *p = curr->gch.next;
++      /* link `curr' at the end of `tmudata' list */
++      if (g->tmudata == NULL)  /* list is empty? */
++        g->tmudata = curr->gch.next = curr;  /* creates a circular list */
++      else {
++        curr->gch.next = g->tmudata->gch.next;
++        g->tmudata->gch.next = curr;
++        g->tmudata = curr;
++      }
++    }
++  }
++  return deadmem;
++}
++
++
++static int traversetable (global_State *g, Table *h) {
++  int i;
++  int weakkey = 0;
++  int weakvalue = 0;
++  const TValue *mode;
++  if (h->metatable)
++    markobject(g, h->metatable);
++  mode = gfasttm(g, h->metatable, TM_MODE);
++  if (mode && ttisstring(mode)) {  /* is there a weak mode? */
++    weakkey = (strchr(svalue(mode), 'k') != NULL);
++    weakvalue = (strchr(svalue(mode), 'v') != NULL);
++    if (weakkey || weakvalue) {  /* is really weak? */
++      h->marked &= ~(KEYWEAK | VALUEWEAK);  /* clear bits */
++      h->marked |= cast_byte((weakkey << KEYWEAKBIT) |
++                             (weakvalue << VALUEWEAKBIT));
++      h->gclist = g->weak;  /* must be cleared after GC, ... */
++      g->weak = obj2gco(h);  /* ... so put in the appropriate list */
++    }
++  }
++  if (weakkey && weakvalue) return 1;
++  if (!weakvalue) {
++    i = h->sizearray;
++    while (i--)
++      markvalue(g, &h->array[i]);
++  }
++  i = sizenode(h);
++  while (i--) {
++    Node *n = gnode(h, i);
++    lua_assert(ttype(gkey(n)) != LUA_TDEADKEY || ttisnil(gval(n)));
++    if (ttisnil(gval(n)))
++      removeentry(n);  /* remove empty entries */
++    else {
++      lua_assert(!ttisnil(gkey(n)));
++      if (!weakkey) markvalue(g, gkey(n));
++      if (!weakvalue) markvalue(g, gval(n));
++    }
++  }
++  return weakkey || weakvalue;
++}
++
++
++/*
++** All marks are conditional because a GC may happen while the
++** prototype is still being created
++*/
++static void traverseproto (global_State *g, Proto *f) {
++  int i;
++  if (f->source) stringmark(f->source);
++  for (i=0; i<f->sizek; i++)  /* mark literals */
++    markvalue(g, &f->k[i]);
++  for (i=0; i<f->sizeupvalues; i++) {  /* mark upvalue names */
++    if (f->upvalues[i])
++      stringmark(f->upvalues[i]);
++  }
++  for (i=0; i<f->sizep; i++) {  /* mark nested protos */
++    if (f->p[i])
++      markobject(g, f->p[i]);
++  }
++  for (i=0; i<f->sizelocvars; i++) {  /* mark local-variable names */
++    if (f->locvars[i].varname)
++      stringmark(f->locvars[i].varname);
++  }
++}
++
++
++
++static void traverseclosure (global_State *g, Closure *cl) {
++  markobject(g, cl->c.env);
++  if (cl->c.isC) {
++    int i;
++    for (i=0; i<cl->c.nupvalues; i++)  /* mark its upvalues */
++      markvalue(g, &cl->c.upvalue[i]);
++  }
++  else {
++    int i;
++    lua_assert(cl->l.nupvalues == cl->l.p->nups);
++    markobject(g, cl->l.p);
++    for (i=0; i<cl->l.nupvalues; i++)  /* mark its upvalues */
++      markobject(g, cl->l.upvals[i]);
++  }
++}
++
++
++static void checkstacksizes (lua_State *L, StkId max) {
++  int ci_used = cast_int(L->ci - L->base_ci);  /* number of `ci' in use */
++  int s_used = cast_int(max - L->stack);  /* part of stack in use */
++  if (L->size_ci > LUAI_MAXCALLS)  /* handling overflow? */
++    return;  /* do not touch the stacks */
++  if (4*ci_used < L->size_ci && 2*BASIC_CI_SIZE < L->size_ci)
++    luaD_reallocCI(L, L->size_ci/2);  /* still big enough... */
++  condhardstacktests(luaD_reallocCI(L, ci_used + 1));
++  if (4*s_used < L->stacksize &&
++      2*(BASIC_STACK_SIZE+EXTRA_STACK) < L->stacksize)
++    luaD_reallocstack(L, L->stacksize/2);  /* still big enough... */
++  condhardstacktests(luaD_reallocstack(L, s_used));
++}
++
++
++static void traversestack (global_State *g, lua_State *l) {
++  StkId o, lim;
++  CallInfo *ci;
++  markvalue(g, gt(l));
++  lim = l->top;
++  for (ci = l->base_ci; ci <= l->ci; ci++) {
++    lua_assert(ci->top <= l->stack_last);
++    if (lim < ci->top) lim = ci->top;
++  }
++  for (o = l->stack; o < l->top; o++)
++    markvalue(g, o);
++  for (; o <= lim; o++)
++    setnilvalue(o);
++  checkstacksizes(l, lim);
++}
++
++
++/*
++** traverse one gray object, turning it to black.
++** Returns `quantity' traversed.
++*/
++static l_mem propagatemark (global_State *g) {
++  GCObject *o = g->gray;
++  lua_assert(isgray(o));
++  gray2black(o);
++  switch (o->gch.tt) {
++    case LUA_TTABLE: {
++      Table *h = gco2h(o);
++      g->gray = h->gclist;
++      if (traversetable(g, h))  /* table is weak? */
++        black2gray(o);  /* keep it gray */
++      return sizeof(Table) + sizeof(TValue) * h->sizearray +
++                             sizeof(Node) * sizenode(h);
++    }
++    case LUA_TFUNCTION: {
++      Closure *cl = gco2cl(o);
++      g->gray = cl->c.gclist;
++      traverseclosure(g, cl);
++      return (cl->c.isC) ? sizeCclosure(cl->c.nupvalues) :
++                           sizeLclosure(cl->l.nupvalues);
++    }
++    case LUA_TTHREAD: {
++      lua_State *th = gco2th(o);
++      g->gray = th->gclist;
++      th->gclist = g->grayagain;
++      g->grayagain = o;
++      black2gray(o);
++      traversestack(g, th);
++      return sizeof(lua_State) + sizeof(TValue) * th->stacksize +
++                                 sizeof(CallInfo) * th->size_ci;
++    }
++    case LUA_TPROTO: {
++      Proto *p = gco2p(o);
++      g->gray = p->gclist;
++      traverseproto(g, p);
++      return sizeof(Proto) + sizeof(Instruction) * p->sizecode +
++                             sizeof(Proto *) * p->sizep +
++                             sizeof(TValue) * p->sizek + 
++                             sizeof(int) * p->sizelineinfo +
++                             sizeof(LocVar) * p->sizelocvars +
++                             sizeof(TString *) * p->sizeupvalues;
++    }
++    default: lua_assert(0); return 0;
++  }
++}
++
++
++static size_t propagateall (global_State *g) {
++  size_t m = 0;
++  while (g->gray) m += propagatemark(g);
++  return m;
++}
++
++
++/*
++** The next function tells whether a key or value can be cleared from
++** a weak table. Non-collectable objects are never removed from weak
++** tables. Strings behave as `values', so are never removed too. for
++** other objects: if really collected, cannot keep them; for userdata
++** being finalized, keep them in keys, but not in values
++*/
++static int iscleared (const TValue *o, int iskey) {
++  if (!iscollectable(o)) return 0;
++  if (ttisstring(o)) {
++    stringmark(rawtsvalue(o));  /* strings are `values', so are never weak */
++    return 0;
++  }
++  return iswhite(gcvalue(o)) ||
++    (ttisuserdata(o) && (!iskey && isfinalized(uvalue(o))));
++}
++
++
++/*
++** clear collected entries from weaktables
++*/
++static void cleartable (GCObject *l) {
++  while (l) {
++    Table *h = gco2h(l);
++    int i = h->sizearray;
++    lua_assert(testbit(h->marked, VALUEWEAKBIT) ||
++               testbit(h->marked, KEYWEAKBIT));
++    if (testbit(h->marked, VALUEWEAKBIT)) {
++      while (i--) {
++        TValue *o = &h->array[i];
++        if (iscleared(o, 0))  /* value was collected? */
++          setnilvalue(o);  /* remove value */
++      }
++    }
++    i = sizenode(h);
++    while (i--) {
++      Node *n = gnode(h, i);
++      if (!ttisnil(gval(n)) &&  /* non-empty entry? */
++          (iscleared(key2tval(n), 1) || iscleared(gval(n), 0))) {
++        setnilvalue(gval(n));  /* remove value ... */
++        removeentry(n);  /* remove entry from table */
++      }
++    }
++    l = h->gclist;
++  }
++}
++
++
++static void freeobj (lua_State *L, GCObject *o) {
++  switch (o->gch.tt) {
++    case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break;
++    case LUA_TFUNCTION: luaF_freeclosure(L, gco2cl(o)); break;
++    case LUA_TUPVAL: luaF_freeupval(L, gco2uv(o)); break;
++    case LUA_TTABLE: luaH_free(L, gco2h(o)); break;
++    case LUA_TTHREAD: {
++      lua_assert(gco2th(o) != L && gco2th(o) != G(L)->mainthread);
++      luaE_freethread(L, gco2th(o));
++      break;
++    }
++    case LUA_TSTRING: {
++      G(L)->strt.nuse--;
++      luaM_freemem(L, o, sizestring(gco2ts(o)));
++      break;
++    }
++    case LUA_TUSERDATA: {
++      luaM_freemem(L, o, sizeudata(gco2u(o)));
++      break;
++    }
++    default: lua_assert(0);
++  }
++}
++
++
++
++#define sweepwholelist(L,p)   sweeplist(L,p,MAX_LUMEM)
++
++
++static GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count) {
++  GCObject *curr;
++  global_State *g = G(L);
++  int deadmask = otherwhite(g);
++  while ((curr = *p) != NULL && count-- > 0) {
++    if (curr->gch.tt == LUA_TTHREAD)  /* sweep open upvalues of each thread */
++      sweepwholelist(L, &gco2th(curr)->openupval);
++    if ((curr->gch.marked ^ WHITEBITS) & deadmask) {  /* not dead? */
++      lua_assert(!isdead(g, curr) || testbit(curr->gch.marked, FIXEDBIT));
++      makewhite(g, curr);  /* make it white (for next cycle) */
++      p = &curr->gch.next;
++    }
++    else {  /* must erase `curr' */
++      lua_assert(isdead(g, curr) || deadmask == bitmask(SFIXEDBIT));
++      *p = curr->gch.next;
++      if (curr == g->rootgc)  /* is the first element of the list? */
++        g->rootgc = curr->gch.next;  /* adjust first */
++      freeobj(L, curr);
++    }
++  }
++  return p;
++}
++
++
++static void checkSizes (lua_State *L) {
++  global_State *g = G(L);
++  /* check size of string hash */
++  if (g->strt.nuse < cast(lu_int32, g->strt.size/4) &&
++      g->strt.size > MINSTRTABSIZE*2)
++    luaS_resize(L, g->strt.size/2);  /* table is too big */
++  /* check size of buffer */
++  if (luaZ_sizebuffer(&g->buff) > LUA_MINBUFFER*2) {  /* buffer too big? */
++    size_t newsize = luaZ_sizebuffer(&g->buff) / 2;
++    luaZ_resizebuffer(L, &g->buff, newsize);
++  }
++}
++
++
++static void GCTM (lua_State *L) {
++  global_State *g = G(L);
++  GCObject *o = g->tmudata->gch.next;  /* get first element */
++  Udata *udata = rawgco2u(o);
++  const TValue *tm;
++  /* remove udata from `tmudata' */
++  if (o == g->tmudata)  /* last element? */
++    g->tmudata = NULL;
++  else
++    g->tmudata->gch.next = udata->uv.next;
++  udata->uv.next = g->mainthread->next;  /* return it to `root' list */
++  g->mainthread->next = o;
++  makewhite(g, o);
++  tm = fasttm(L, udata->uv.metatable, TM_GC);
++  if (tm != NULL) {
++    lu_byte oldah = L->allowhook;
++    lu_mem oldt = g->GCthreshold;
++    L->allowhook = 0;  /* stop debug hooks during GC tag method */
++    g->GCthreshold = 2*g->totalbytes;  /* avoid GC steps */
++    setobj2s(L, L->top, tm);
++    setuvalue(L, L->top+1, udata);
++    L->top += 2;
++    luaD_call(L, L->top - 2, 0);
++    L->allowhook = oldah;  /* restore hooks */
++    g->GCthreshold = oldt;  /* restore threshold */
++  }
++}
++
++
++/*
++** Call all GC tag methods
++*/
++void luaC_callGCTM (lua_State *L) {
++  while (G(L)->tmudata)
++    GCTM(L);
++}
++
++
++void luaC_freeall (lua_State *L) {
++  global_State *g = G(L);
++  int i;
++  g->currentwhite = WHITEBITS | bitmask(SFIXEDBIT);  /* mask to collect all elements */
++  sweepwholelist(L, &g->rootgc);
++  for (i = 0; i < g->strt.size; i++)  /* free all string lists */
++    sweepwholelist(L, &g->strt.hash[i]);
++}
++
++
++static void markmt (global_State *g) {
++  int i;
++  for (i=0; i<NUM_TAGS; i++)
++    if (g->mt[i]) markobject(g, g->mt[i]);
++}
++
++
++/* mark root set */
++static void markroot (lua_State *L) {
++  global_State *g = G(L);
++  g->gray = NULL;
++  g->grayagain = NULL;
++  g->weak = NULL;
++  markobject(g, g->mainthread);
++  /* make global table be traversed before main stack */
++  markvalue(g, gt(g->mainthread));
++  markvalue(g, registry(L));
++  markmt(g);
++  g->gcstate = GCSpropagate;
++}
++
++
++static void remarkupvals (global_State *g) {
++  UpVal *uv;
++  for (uv = g->uvhead.u.l.next; uv != &g->uvhead; uv = uv->u.l.next) {
++    lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv);
++    if (isgray(obj2gco(uv)))
++      markvalue(g, uv->v);
++  }
++}
++
++
++static void atomic (lua_State *L) {
++  global_State *g = G(L);
++  size_t udsize;  /* total size of userdata to be finalized */
++  /* remark occasional upvalues of (maybe) dead threads */
++  remarkupvals(g);
++  /* traverse objects cautch by write barrier and by 'remarkupvals' */
++  propagateall(g);
++  /* remark weak tables */
++  g->gray = g->weak;
++  g->weak = NULL;
++  lua_assert(!iswhite(obj2gco(g->mainthread)));
++  markobject(g, L);  /* mark running thread */
++  markmt(g);  /* mark basic metatables (again) */
++  propagateall(g);
++  /* remark gray again */
++  g->gray = g->grayagain;
++  g->grayagain = NULL;
++  propagateall(g);
++  udsize = luaC_separateudata(L, 0);  /* separate userdata to be finalized */
++  marktmu(g);  /* mark `preserved' userdata */
++  udsize += propagateall(g);  /* remark, to propagate `preserveness' */
++  cleartable(g->weak);  /* remove collected objects from weak tables */
++  /* flip current white */
++  g->currentwhite = cast_byte(otherwhite(g));
++  g->sweepstrgc = 0;
++  g->sweepgc = &g->rootgc;
++  g->gcstate = GCSsweepstring;
++  g->estimate = g->totalbytes - udsize;  /* first estimate */
++}
++
++
++static l_mem singlestep (lua_State *L) {
++  global_State *g = G(L);
++  /*lua_checkmemory(L);*/
++  switch (g->gcstate) {
++    case GCSpause: {
++      markroot(L);  /* start a new collection */
++      return 0;
++    }
++    case GCSpropagate: {
++      if (g->gray)
++        return propagatemark(g);
++      else {  /* no more `gray' objects */
++        atomic(L);  /* finish mark phase */
++        return 0;
++      }
++    }
++    case GCSsweepstring: {
++      lu_mem old = g->totalbytes;
++      sweepwholelist(L, &g->strt.hash[g->sweepstrgc++]);
++      if (g->sweepstrgc >= g->strt.size)  /* nothing more to sweep? */
++        g->gcstate = GCSsweep;  /* end sweep-string phase */
++      lua_assert(old >= g->totalbytes);
++      g->estimate -= old - g->totalbytes;
++      return GCSWEEPCOST;
++    }
++    case GCSsweep: {
++      lu_mem old = g->totalbytes;
++      g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX);
++      if (*g->sweepgc == NULL) {  /* nothing more to sweep? */
++        checkSizes(L);
++        g->gcstate = GCSfinalize;  /* end sweep phase */
++      }
++      lua_assert(old >= g->totalbytes);
++      g->estimate -= old - g->totalbytes;
++      return GCSWEEPMAX*GCSWEEPCOST;
++    }
++    case GCSfinalize: {
++      if (g->tmudata) {
++        GCTM(L);
++        if (g->estimate > GCFINALIZECOST)
++          g->estimate -= GCFINALIZECOST;
++        return GCFINALIZECOST;
++      }
++      else {
++        g->gcstate = GCSpause;  /* end collection */
++        g->gcdept = 0;
++        return 0;
++      }
++    }
++    default: lua_assert(0); return 0;
++  }
++}
++
++
++void luaC_step (lua_State *L) {
++  global_State *g = G(L);
++  l_mem lim = (GCSTEPSIZE/100) * g->gcstepmul;
++  if (lim == 0)
++    lim = (MAX_LUMEM-1)/2;  /* no limit */
++  g->gcdept += g->totalbytes - g->GCthreshold;
++  do {
++    lim -= singlestep(L);
++    if (g->gcstate == GCSpause)
++      break;
++  } while (lim > 0);
++  if (g->gcstate != GCSpause) {
++    if (g->gcdept < GCSTEPSIZE)
++      g->GCthreshold = g->totalbytes + GCSTEPSIZE;  /* - lim/g->gcstepmul;*/
++    else {
++      g->gcdept -= GCSTEPSIZE;
++      g->GCthreshold = g->totalbytes;
++    }
++  }
++  else {
++    lua_assert(g->totalbytes >= g->estimate);
++    setthreshold(g);
++  }
++}
++
++
++void luaC_fullgc (lua_State *L) {
++  global_State *g = G(L);
++  if (g->gcstate <= GCSpropagate) {
++    /* reset sweep marks to sweep all elements (returning them to white) */
++    g->sweepstrgc = 0;
++    g->sweepgc = &g->rootgc;
++    /* reset other collector lists */
++    g->gray = NULL;
++    g->grayagain = NULL;
++    g->weak = NULL;
++    g->gcstate = GCSsweepstring;
++  }
++  lua_assert(g->gcstate != GCSpause && g->gcstate != GCSpropagate);
++  /* finish any pending sweep phase */
++  while (g->gcstate != GCSfinalize) {
++    lua_assert(g->gcstate == GCSsweepstring || g->gcstate == GCSsweep);
++    singlestep(L);
++  }
++  markroot(L);
++  while (g->gcstate != GCSpause) {
++    singlestep(L);
++  }
++  setthreshold(g);
++}
++
++
++void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v) {
++  global_State *g = G(L);
++  lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o));
++  lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause);
++  lua_assert(ttype(&o->gch) != LUA_TTABLE);
++  /* must keep invariant? */
++  if (g->gcstate == GCSpropagate)
++    reallymarkobject(g, v);  /* restore invariant */
++  else  /* don't mind */
++    makewhite(g, o);  /* mark as white just to avoid other barriers */
++}
++
++
++void luaC_barrierback (lua_State *L, Table *t) {
++  global_State *g = G(L);
++  GCObject *o = obj2gco(t);
++  lua_assert(isblack(o) && !isdead(g, o));
++  lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause);
++  black2gray(o);  /* make table gray (again) */
++  t->gclist = g->grayagain;
++  g->grayagain = o;
++}
++
++
++void luaC_link (lua_State *L, GCObject *o, lu_byte tt) {
++  global_State *g = G(L);
++  o->gch.next = g->rootgc;
++  g->rootgc = o;
++  o->gch.marked = luaC_white(g);
++  o->gch.tt = tt;
++}
++
++
++void luaC_linkupval (lua_State *L, UpVal *uv) {
++  global_State *g = G(L);
++  GCObject *o = obj2gco(uv);
++  o->gch.next = g->rootgc;  /* link upvalue into `rootgc' list */
++  g->rootgc = o;
++  if (isgray(o)) { 
++    if (g->gcstate == GCSpropagate) {
++      gray2black(o);  /* closed upvalues need barrier */
++      luaC_barrier(L, uv, uv->v);
++    }
++    else {  /* sweep phase: sweep it (turning it into white) */
++      makewhite(g, o);
++      lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause);
++    }
++  }
++}
++
+--- /dev/null
++++ b/extensions/LUA/lua/lgc.h
+@@ -0,0 +1,110 @@
++/*
++** $Id: lgc.h,v 2.15.1.1 2007/12/27 13:02:25 roberto Exp $
++** Garbage Collector
++** See Copyright Notice in lua.h
++*/
++
++#ifndef lgc_h
++#define lgc_h
++
++
++#include "lobject.h"
++
++
++/*
++** Possible states of the Garbage Collector
++*/
++#define GCSpause      0
++#define GCSpropagate  1
++#define GCSsweepstring        2
++#define GCSsweep      3
++#define GCSfinalize   4
++
++
++/*
++** some userful bit tricks
++*/
++#define resetbits(x,m)        ((x) &= cast(lu_byte, ~(m)))
++#define setbits(x,m)  ((x) |= (m))
++#define testbits(x,m) ((x) & (m))
++#define bitmask(b)    (1<<(b))
++#define bit2mask(b1,b2)       (bitmask(b1) | bitmask(b2))
++#define l_setbit(x,b) setbits(x, bitmask(b))
++#define resetbit(x,b) resetbits(x, bitmask(b))
++#define testbit(x,b)  testbits(x, bitmask(b))
++#define set2bits(x,b1,b2)     setbits(x, (bit2mask(b1, b2)))
++#define reset2bits(x,b1,b2)   resetbits(x, (bit2mask(b1, b2)))
++#define test2bits(x,b1,b2)    testbits(x, (bit2mask(b1, b2)))
++
++
++
++/*
++** Layout for bit use in `marked' field:
++** bit 0 - object is white (type 0)
++** bit 1 - object is white (type 1)
++** bit 2 - object is black
++** bit 3 - for userdata: has been finalized
++** bit 3 - for tables: has weak keys
++** bit 4 - for tables: has weak values
++** bit 5 - object is fixed (should not be collected)
++** bit 6 - object is "super" fixed (only the main thread)
++*/
++
++
++#define WHITE0BIT     0
++#define WHITE1BIT     1
++#define BLACKBIT      2
++#define FINALIZEDBIT  3
++#define KEYWEAKBIT    3
++#define VALUEWEAKBIT  4
++#define FIXEDBIT      5
++#define SFIXEDBIT     6
++#define WHITEBITS     bit2mask(WHITE0BIT, WHITE1BIT)
++
++
++#define iswhite(x)      test2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT)
++#define isblack(x)      testbit((x)->gch.marked, BLACKBIT)
++#define isgray(x)     (!isblack(x) && !iswhite(x))
++
++#define otherwhite(g) (g->currentwhite ^ WHITEBITS)
++#define isdead(g,v)   ((v)->gch.marked & otherwhite(g) & WHITEBITS)
++
++#define changewhite(x)        ((x)->gch.marked ^= WHITEBITS)
++#define gray2black(x) l_setbit((x)->gch.marked, BLACKBIT)
++
++#define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x)))
++
++#define luaC_white(g) cast(lu_byte, (g)->currentwhite & WHITEBITS)
++
++
++#define luaC_checkGC(L) { \
++  condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1)); \
++  if (G(L)->totalbytes >= G(L)->GCthreshold) \
++      luaC_step(L); }
++
++
++#define luaC_barrier(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p)))  \
++      luaC_barrierf(L,obj2gco(p),gcvalue(v)); }
++
++#define luaC_barriert(L,t,v) { if (valiswhite(v) && isblack(obj2gco(t)))  \
++      luaC_barrierback(L,t); }
++
++#define luaC_objbarrier(L,p,o)  \
++      { if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \
++              luaC_barrierf(L,obj2gco(p),obj2gco(o)); }
++
++#define luaC_objbarriert(L,t,o)  \
++   { if (iswhite(obj2gco(o)) && isblack(obj2gco(t))) luaC_barrierback(L,t); }
++
++LUAI_FUNC size_t luaC_separateudata (lua_State *L, int all);
++LUAI_FUNC void luaC_callGCTM (lua_State *L);
++LUAI_FUNC void luaC_freeall (lua_State *L);
++LUAI_FUNC void luaC_step (lua_State *L);
++LUAI_FUNC void luaC_fullgc (lua_State *L);
++LUAI_FUNC void luaC_link (lua_State *L, GCObject *o, lu_byte tt);
++LUAI_FUNC void luaC_linkupval (lua_State *L, UpVal *uv);
++LUAI_FUNC void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v);
++LUAI_FUNC void luaC_barrierback (lua_State *L, Table *t);
++
++
++#endif
+--- /dev/null
++++ b/extensions/LUA/lua/llex.c
+@@ -0,0 +1,460 @@
++/*
++** $Id: llex.c,v 2.20.1.1 2007/12/27 13:02:25 roberto Exp $
++** Lexical Analyzer
++** See Copyright Notice in lua.h
++*/
++
++#include <ctype.h>
++#include <locale.h>
++#include <string.h>
++
++#define llex_c
++#define LUA_CORE
++
++#include "lua.h"
++
++#include "ldo.h"
++#include "llex.h"
++#include "lobject.h"
++#include "lparser.h"
++#include "lstate.h"
++#include "lstring.h"
++#include "ltable.h"
++#include "lzio.h"
++
++
++
++#define next(ls) (ls->current = zgetc(ls->z))
++
++
++
++
++#define currIsNewline(ls)     (ls->current == '\n' || ls->current == '\r')
++
++
++/* ORDER RESERVED */
++const char *const luaX_tokens [] = {
++    "and", "break", "do", "else", "elseif",
++    "end", "false", "for", "function", "if",
++    "in", "local", "nil", "not", "or", "repeat",
++    "return", "then", "true", "until", "while",
++    "..", "...", "==", ">=", "<=", "~=",
++    "<number>", "<name>", "<string>", "<eof>",
++    NULL
++};
++
++
++#define save_and_next(ls) (save(ls, ls->current), next(ls))
++
++
++static void save (LexState *ls, int c) {
++  Mbuffer *b = ls->buff;
++  if (b->n + 1 > b->buffsize) {
++    size_t newsize;
++    if (b->buffsize >= MAX_SIZET/2)
++      luaX_lexerror(ls, "lexical element too long", 0);
++    newsize = b->buffsize * 2;
++    luaZ_resizebuffer(ls->L, b, newsize);
++  }
++  b->buffer[b->n++] = cast(char, c);
++}
++
++
++void luaX_init (lua_State *L) {
++  int i;
++  for (i=0; i<NUM_RESERVED; i++) {
++    TString *ts = luaS_new(L, luaX_tokens[i]);
++    luaS_fix(ts);  /* reserved words are never collected */
++    lua_assert(strlen(luaX_tokens[i])+1 <= TOKEN_LEN);
++    ts->tsv.reserved = cast_byte(i+1);  /* reserved word */
++  }
++}
++
++
++#define MAXSRC          80
++
++
++const char *luaX_token2str (LexState *ls, int token) {
++  if (token < FIRST_RESERVED) {
++    lua_assert(token == cast(unsigned char, token));
++    return (iscntrl(token)) ? luaO_pushfstring(ls->L, "char(%d)", token) :
++                              luaO_pushfstring(ls->L, "%c", token);
++  }
++  else
++    return luaX_tokens[token-FIRST_RESERVED];
++}
++
++
++static const char *txtToken (LexState *ls, int token) {
++  switch (token) {
++    case TK_NAME:
++    case TK_STRING:
++    case TK_NUMBER:
++      save(ls, '\0');
++      return luaZ_buffer(ls->buff);
++    default:
++      return luaX_token2str(ls, token);
++  }
++}
++
++
++void luaX_lexerror (LexState *ls, const char *msg, int token) {
++  char buff[MAXSRC];
++  luaO_chunkid(buff, getstr(ls->source), MAXSRC);
++  msg = luaO_pushfstring(ls->L, "%s:%d: %s", buff, ls->linenumber, msg);
++  if (token)
++    luaO_pushfstring(ls->L, "%s near " LUA_QS, msg, txtToken(ls, token));
++  luaD_throw(ls->L, LUA_ERRSYNTAX);
++}
++
++
++void luaX_syntaxerror (LexState *ls, const char *msg) {
++  luaX_lexerror(ls, msg, ls->t.token);
++}
++
++
++TString *luaX_newstring (LexState *ls, const char *str, size_t l) {
++  lua_State *L = ls->L;
++  TString *ts = luaS_newlstr(L, str, l);
++  TValue *o = luaH_setstr(L, ls->fs->h, ts);  /* entry for `str' */
++  if (ttisnil(o))
++    setbvalue(o, 1);  /* make sure `str' will not be collected */
++  return ts;
++}
++
++
++static void inclinenumber (LexState *ls) {
++  int old = ls->current;
++  lua_assert(currIsNewline(ls));
++  next(ls);  /* skip `\n' or `\r' */
++  if (currIsNewline(ls) && ls->current != old)
++    next(ls);  /* skip `\n\r' or `\r\n' */
++  if (++ls->linenumber >= MAX_INT)
++    luaX_syntaxerror(ls, "chunk has too many lines");
++}
++
++
++void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source) {
++  ls->decpoint = '.';
++  ls->L = L;
++  ls->lookahead.token = TK_EOS;  /* no look-ahead token */
++  ls->z = z;
++  ls->fs = NULL;
++  ls->linenumber = 1;
++  ls->lastline = 1;
++  ls->source = source;
++  luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER);  /* initialize buffer */
++  next(ls);  /* read first char */
++}
++
++
++
++/*
++** =======================================================
++** LEXICAL ANALYZER
++** =======================================================
++*/
++
++
++
++static int check_next (LexState *ls, const char *set) {
++  if (!strchr(set, ls->current))
++    return 0;
++  save_and_next(ls);
++  return 1;
++}
++
++
++static void buffreplace (LexState *ls, char from, char to) {
++  size_t n = luaZ_bufflen(ls->buff);
++  char *p = luaZ_buffer(ls->buff);
++  while (n--)
++    if (p[n] == from) p[n] = to;
++}
++
++
++static void trydecpoint (LexState *ls, SemInfo *seminfo) {
++  /* format error: try to update decimal point separator */
++  char old = ls->decpoint;
++  struct lconv *cv = localeconv();
++  ls->decpoint = (cv ? cv->decimal_point[0] : '.');
++  buffreplace(ls, old, ls->decpoint);  /* try updated decimal separator */
++  if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) {
++    /* format error with correct decimal point: no more options */
++    buffreplace(ls, ls->decpoint, '.');  /* undo change (for error message) */
++    luaX_lexerror(ls, "malformed number", TK_NUMBER);
++  }
++}
++
++
++/* LUA_NUMBER */
++static void read_numeral (LexState *ls, SemInfo *seminfo) {
++  lua_assert(isdigit(ls->current));
++  do {
++    save_and_next(ls);
++  } while (isdigit(ls->current) || ls->current == '.');
++  if (check_next(ls, "Ee"))  /* `E'? */
++    check_next(ls, "+-");  /* optional exponent sign */
++  while (isalnum(ls->current) || ls->current == '_')
++    save_and_next(ls);
++  save(ls, '\0');
++  buffreplace(ls, '.', ls->decpoint);  /* follow locale for decimal point */
++  if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r))  /* format error? */
++    trydecpoint(ls, seminfo); /* try to update decimal point separator */
++}
++
++
++static int skip_sep (LexState *ls) {
++  int count = 0;
++  int s = ls->current;
++  lua_assert(s == '[' || s == ']');
++  save_and_next(ls);
++  while (ls->current == '=') {
++    save_and_next(ls);
++    count++;
++  }
++  return (ls->current == s) ? count : (-count) - 1;
++}
++
++
++static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) {
++  int cont = 0;
++  (void)(cont);  /* avoid warnings when `cont' is not used */
++  save_and_next(ls);  /* skip 2nd `[' */
++  if (currIsNewline(ls))  /* string starts with a newline? */
++    inclinenumber(ls);  /* skip it */
++  for (;;) {
++    switch (ls->current) {
++      case EOZ:
++        luaX_lexerror(ls, (seminfo) ? "unfinished long string" :
++                                   "unfinished long comment", TK_EOS);
++        break;  /* to avoid warnings */
++#if defined(LUA_COMPAT_LSTR)
++      case '[': {
++        if (skip_sep(ls) == sep) {
++          save_and_next(ls);  /* skip 2nd `[' */
++          cont++;
++#if LUA_COMPAT_LSTR == 1
++          if (sep == 0)
++            luaX_lexerror(ls, "nesting of [[...]] is deprecated", '[');
++#endif
++        }
++        break;
++      }
++#endif
++      case ']': {
++        if (skip_sep(ls) == sep) {
++          save_and_next(ls);  /* skip 2nd `]' */
++#if defined(LUA_COMPAT_LSTR) && LUA_COMPAT_LSTR == 2
++          cont--;
++          if (sep == 0 && cont >= 0) break;
++#endif
++          goto endloop;
++        }
++        break;
++      }
++      case '\n':
++      case '\r': {
++        save(ls, '\n');
++        inclinenumber(ls);
++        if (!seminfo) luaZ_resetbuffer(ls->buff);  /* avoid wasting space */
++        break;
++      }
++      default: {
++        if (seminfo) save_and_next(ls);
++        else next(ls);
++      }
++    }
++  } endloop:
++  if (seminfo)
++    seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + (2 + sep),
++                                     luaZ_bufflen(ls->buff) - 2*(2 + sep));
++}
++
++
++static void read_string (LexState *ls, int del, SemInfo *seminfo) {
++  save_and_next(ls);
++  while (ls->current != del) {
++    switch (ls->current) {
++      case EOZ:
++        luaX_lexerror(ls, "unfinished string", TK_EOS);
++        continue;  /* to avoid warnings */
++      case '\n':
++      case '\r':
++        luaX_lexerror(ls, "unfinished string", TK_STRING);
++        continue;  /* to avoid warnings */
++      case '\\': {
++        int c;
++        next(ls);  /* do not save the `\' */
++        switch (ls->current) {
++          case 'a': c = '\a'; break;
++          case 'b': c = '\b'; break;
++          case 'f': c = '\f'; break;
++          case 'n': c = '\n'; break;
++          case 'r': c = '\r'; break;
++          case 't': c = '\t'; break;
++          case 'v': c = '\v'; break;
++          case '\n':  /* go through */
++          case '\r': save(ls, '\n'); inclinenumber(ls); continue;
++          case EOZ: continue;  /* will raise an error next loop */
++          default: {
++            if (!isdigit(ls->current))
++              save_and_next(ls);  /* handles \\, \", \', and \? */
++            else {  /* \xxx */
++              int i = 0;
++              c = 0;
++              do {
++                c = 10*c + (ls->current-'0');
++                next(ls);
++              } while (++i<3 && isdigit(ls->current));
++              if (c > UCHAR_MAX)
++                luaX_lexerror(ls, "escape sequence too large", TK_STRING);
++              save(ls, c);
++            }
++            continue;
++          }
++        }
++        save(ls, c);
++        next(ls);
++        continue;
++      }
++      default:
++        save_and_next(ls);
++    }
++  }
++  save_and_next(ls);  /* skip delimiter */
++  seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + 1,
++                                   luaZ_bufflen(ls->buff) - 2);
++}
++
++
++static int llex (LexState *ls, SemInfo *seminfo) {
++  luaZ_resetbuffer(ls->buff);
++  for (;;) {
++    switch (ls->current) {
++      case '\n':
++      case '\r': {
++        inclinenumber(ls);
++        continue;
++      }
++      case '-': {
++        next(ls);
++        if (ls->current != '-') return '-';
++        /* else is a comment */
++        next(ls);
++        if (ls->current == '[') {
++          int sep = skip_sep(ls);
++          luaZ_resetbuffer(ls->buff);  /* `skip_sep' may dirty the buffer */
++          if (sep >= 0) {
++            read_long_string(ls, NULL, sep);  /* long comment */
++            luaZ_resetbuffer(ls->buff);
++            continue;
++          }
++        }
++        /* else short comment */
++        while (!currIsNewline(ls) && ls->current != EOZ)
++          next(ls);
++        continue;
++      }
++      case '[': {
++        int sep = skip_sep(ls);
++        if (sep >= 0) {
++          read_long_string(ls, seminfo, sep);
++          return TK_STRING;
++        }
++        else if (sep == -1) return '[';
++        else luaX_lexerror(ls, "invalid long string delimiter", TK_STRING);
++      }
++      case '=': {
++        next(ls);
++        if (ls->current != '=') return '=';
++        else { next(ls); return TK_EQ; }
++      }
++      case '<': {
++        next(ls);
++        if (ls->current != '=') return '<';
++        else { next(ls); return TK_LE; }
++      }
++      case '>': {
++        next(ls);
++        if (ls->current != '=') return '>';
++        else { next(ls); return TK_GE; }
++      }
++      case '~': {
++        next(ls);
++        if (ls->current != '=') return '~';
++        else { next(ls); return TK_NE; }
++      }
++      case '"':
++      case '\'': {
++        read_string(ls, ls->current, seminfo);
++        return TK_STRING;
++      }
++      case '.': {
++        save_and_next(ls);
++        if (check_next(ls, ".")) {
++          if (check_next(ls, "."))
++            return TK_DOTS;   /* ... */
++          else return TK_CONCAT;   /* .. */
++        }
++        else if (!isdigit(ls->current)) return '.';
++        else {
++          read_numeral(ls, seminfo);
++          return TK_NUMBER;
++        }
++      }
++      case EOZ: {
++        return TK_EOS;
++      }
++      default: {
++        if (isspace(ls->current)) {
++          lua_assert(!currIsNewline(ls));
++          next(ls);
++          continue;
++        }
++        else if (isdigit(ls->current)) {
++          read_numeral(ls, seminfo);
++          return TK_NUMBER;
++        }
++        else if (isalpha(ls->current) || ls->current == '_') {
++          /* identifier or reserved word */
++          TString *ts;
++          do {
++            save_and_next(ls);
++          } while (isalnum(ls->current) || ls->current == '_');
++          ts = luaX_newstring(ls, luaZ_buffer(ls->buff),
++                                  luaZ_bufflen(ls->buff));
++          if (ts->tsv.reserved > 0)  /* reserved word? */
++            return ts->tsv.reserved - 1 + FIRST_RESERVED;
++          else {
++            seminfo->ts = ts;
++            return TK_NAME;
++          }
++        }
++        else {
++          int c = ls->current;
++          next(ls);
++          return c;  /* single-char tokens (+ - / ...) */
++        }
++      }
++    }
++  }
++}
++
++
++void luaX_next (LexState *ls) {
++  ls->lastline = ls->linenumber;
++  if (ls->lookahead.token != TK_EOS) {  /* is there a look-ahead token? */
++    ls->t = ls->lookahead;  /* use this one */
++    ls->lookahead.token = TK_EOS;  /* and discharge it */
++  }
++  else
++    ls->t.token = llex(ls, &ls->t.seminfo);  /* read next token */
++}
++
++
++void luaX_lookahead (LexState *ls) {
++  lua_assert(ls->lookahead.token == TK_EOS);
++  ls->lookahead.token = llex(ls, &ls->lookahead.seminfo);
++}
++
+--- /dev/null
++++ b/extensions/LUA/lua/llex.h
+@@ -0,0 +1,81 @@
++/*
++** $Id: llex.h,v 1.58.1.1 2007/12/27 13:02:25 roberto Exp $
++** Lexical Analyzer
++** See Copyright Notice in lua.h
++*/
++
++#ifndef llex_h
++#define llex_h
++
++#include "lobject.h"
++#include "lzio.h"
++
++
++#define FIRST_RESERVED        257
++
++/* maximum length of a reserved word */
++#define TOKEN_LEN     (sizeof("function")/sizeof(char))
++
++
++/*
++* WARNING: if you change the order of this enumeration,
++* grep "ORDER RESERVED"
++*/
++enum RESERVED {
++  /* terminal symbols denoted by reserved words */
++  TK_AND = FIRST_RESERVED, TK_BREAK,
++  TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION,
++  TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT,
++  TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE,
++  /* other terminal symbols */
++  TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, TK_NUMBER,
++  TK_NAME, TK_STRING, TK_EOS
++};
++
++/* number of reserved words */
++#define NUM_RESERVED  (cast(int, TK_WHILE-FIRST_RESERVED+1))
++
++
++/* array with token `names' */
++LUAI_DATA const char *const luaX_tokens [];
++
++
++typedef union {
++  lua_Number r;
++  TString *ts;
++} SemInfo;  /* semantics information */
++
++
++typedef struct Token {
++  int token;
++  SemInfo seminfo;
++} Token;
++
++
++typedef struct LexState {
++  int current;  /* current character (charint) */
++  int linenumber;  /* input line counter */
++  int lastline;  /* line of last token `consumed' */
++  Token t;  /* current token */
++  Token lookahead;  /* look ahead token */
++  struct FuncState *fs;  /* `FuncState' is private to the parser */
++  struct lua_State *L;
++  ZIO *z;  /* input stream */
++  Mbuffer *buff;  /* buffer for tokens */
++  TString *source;  /* current source name */
++  char decpoint;  /* locale decimal point */
++} LexState;
++
++
++LUAI_FUNC void luaX_init (lua_State *L);
++LUAI_FUNC void luaX_setinput (lua_State *L, LexState *ls, ZIO *z,
++                              TString *source);
++LUAI_FUNC TString *luaX_newstring (LexState *ls, const char *str, size_t l);
++LUAI_FUNC void luaX_next (LexState *ls);
++LUAI_FUNC void luaX_lookahead (LexState *ls);
++LUAI_FUNC void luaX_lexerror (LexState *ls, const char *msg, int token);
++LUAI_FUNC void luaX_syntaxerror (LexState *ls, const char *s);
++LUAI_FUNC const char *luaX_token2str (LexState *ls, int token);
++
++
++#endif
+--- /dev/null
++++ b/extensions/LUA/lua/llimits.h
+@@ -0,0 +1,125 @@
++/*
++** $Id: llimits.h,v 1.69.1.1 2007/12/27 13:02:25 roberto Exp $
++** Limits, basic types, and some other `installation-dependent' definitions
++** See Copyright Notice in lua.h
++*/
++
++#ifndef llimits_h
++#define llimits_h
++
++#include <stddef.h>
++#include <limits.h>
++
++#include "lua.h"
++
++typedef LUAI_UINT32 lu_int32;
++
++typedef LUAI_UMEM lu_mem;
++
++typedef LUAI_MEM l_mem;
++
++
++
++/* chars used as small naturals (so that `char' is reserved for characters) */
++typedef unsigned char lu_byte;
++
++
++#define MAX_SIZET     ((size_t)(~(size_t)0)-2)
++
++#define MAX_LUMEM     ((lu_mem)(~(lu_mem)0)-2)
++
++
++#define MAX_INT (LUA_INT_MAX-2)  /* maximum value of an int (-2 for safety) */
++
++/*
++** conversion of pointer to integer
++** this is for hashing only; there is no problem if the integer
++** cannot hold the whole pointer value
++*/
++#define IntPoint(p)  ((unsigned int)(lu_mem)(p))
++
++
++
++/* type to ensure maximum alignment */
++typedef LUAI_USER_ALIGNMENT_T L_Umaxalign;
++
++
++/* result of a `usual argument conversion' over lua_Number */
++typedef LUAI_UACNUMBER l_uacNumber;
++
++
++/* internal assertions for in-house debugging */
++#ifdef lua_assert
++
++#define check_exp(c,e)                (lua_assert(c), (e))
++#define api_check(l,e)                lua_assert(e)
++
++#else
++
++#define lua_assert(c)         ((void)0)
++#define check_exp(c,e)                (e)
++#define api_check             luai_apicheck
++
++#endif
++
++
++#ifndef UNUSED
++#define UNUSED(x)     ((void)(x))     /* to avoid warnings */
++#endif
++
++
++#ifndef cast
++#define cast(t, exp)  ((t)(exp))
++#endif
++
++#define cast_byte(i)  cast(lu_byte, (i))
++#define cast_num(i)   cast(lua_Number, (i))
++#define cast_int(i)   cast(int, (i))
++
++
++
++/*
++** type for virtual-machine instructions
++** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h)
++*/
++typedef lu_int32 Instruction;
++
++
++
++/* maximum stack for a Lua function */
++#define MAXSTACK      250
++
++
++
++/* minimum size for the string table (must be power of 2) */
++#ifndef MINSTRTABSIZE
++#define MINSTRTABSIZE 32
++#endif
++
++
++/* minimum size for string buffer */
++#ifndef LUA_MINBUFFER
++#define LUA_MINBUFFER 32
++#endif
++
++
++#ifndef lua_lock
++#define lua_lock(L)     ((void) 0) 
++#define lua_unlock(L)   ((void) 0)
++#endif
++
++#ifndef luai_threadyield
++#define luai_threadyield(L)     {lua_unlock(L); lua_lock(L);}
++#endif
++
++
++/*
++** macro to control inclusion of some hard tests on stack reallocation
++*/ 
++#ifndef HARDSTACKTESTS
++#define condhardstacktests(x) ((void)0)
++#else
++#define condhardstacktests(x) x
++#endif
++
++#endif
+--- /dev/null
++++ b/extensions/LUA/lua/lmem.c
+@@ -0,0 +1,86 @@
++/*
++** $Id: lmem.c,v 1.70.1.1 2007/12/27 13:02:25 roberto Exp $
++** Interface to Memory Manager
++** See Copyright Notice in lua.h
++*/
++
++
++#include <stddef.h>
++
++#define lmem_c
++#define LUA_CORE
++
++#include "lua.h"
++
++#include "ldebug.h"
++#include "ldo.h"
++#include "lmem.h"
++#include "lobject.h"
++#include "lstate.h"
++
++
++
++/*
++** About the realloc function:
++** void * frealloc (void *ud, void *ptr, size_t osize, size_t nsize);
++** (`osize' is the old size, `nsize' is the new size)
++**
++** Lua ensures that (ptr == NULL) iff (osize == 0).
++**
++** * frealloc(ud, NULL, 0, x) creates a new block of size `x'
++**
++** * frealloc(ud, p, x, 0) frees the block `p'
++** (in this specific case, frealloc must return NULL).
++** particularly, frealloc(ud, NULL, 0, 0) does nothing
++** (which is equivalent to free(NULL) in ANSI C)
++**
++** frealloc returns NULL if it cannot create or reallocate the area
++** (any reallocation to an equal or smaller size cannot fail!)
++*/
++
++
++
++#define MINSIZEARRAY  4
++
++
++void *luaM_growaux_ (lua_State *L, void *block, int *size, size_t size_elems,
++                     int limit, const char *errormsg) {
++  void *newblock;
++  int newsize;
++  if (*size >= limit/2) {  /* cannot double it? */
++    if (*size >= limit)  /* cannot grow even a little? */
++      luaG_runerror(L, errormsg);
++    newsize = limit;  /* still have at least one free place */
++  }
++  else {
++    newsize = (*size)*2;
++    if (newsize < MINSIZEARRAY)
++      newsize = MINSIZEARRAY;  /* minimum size */
++  }
++  newblock = luaM_reallocv(L, block, *size, newsize, size_elems);
++  *size = newsize;  /* update only when everything else is OK */
++  return newblock;
++}
++
++
++void *luaM_toobig (lua_State *L) {
++  luaG_runerror(L, "memory allocation error: block too big");
++  return NULL;  /* to avoid warnings */
++}
++
++
++
++/*
++** generic allocation routine.
++*/
++void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) {
++  global_State *g = G(L);
++  lua_assert((osize == 0) == (block == NULL));
++  block = (*g->frealloc)(g->ud, block, osize, nsize);
++  if (block == NULL && nsize > 0)
++    luaD_throw(L, LUA_ERRMEM);
++  lua_assert((nsize == 0) == (block == NULL));
++  g->totalbytes = (g->totalbytes - osize) + nsize;
++  return block;
++}
++
+--- /dev/null
++++ b/extensions/LUA/lua/lmem.h
+@@ -0,0 +1,49 @@
++/*
++** $Id: lmem.h,v 1.31.1.1 2007/12/27 13:02:25 roberto Exp $
++** Interface to Memory Manager
++** See Copyright Notice in lua.h
++*/
++
++#ifndef lmem_h
++#define lmem_h
++
++
++#include <stddef.h>
++
++#include "llimits.h"
++#include "lua.h"
++
++#define MEMERRMSG     "not enough memory"
++
++
++#define luaM_reallocv(L,b,on,n,e) \
++      ((cast(size_t, (n)+1) <= MAX_SIZET/(e)) ?  /* +1 to avoid warnings */ \
++              luaM_realloc_(L, (b), (on)*(e), (n)*(e)) : \
++              luaM_toobig(L))
++
++#define luaM_freemem(L, b, s) luaM_realloc_(L, (b), (s), 0)
++#define luaM_free(L, b)               luaM_realloc_(L, (b), sizeof(*(b)), 0)
++#define luaM_freearray(L, b, n, t)   luaM_reallocv(L, (b), n, 0, sizeof(t))
++
++#define luaM_malloc(L,t)      luaM_realloc_(L, NULL, 0, (t))
++#define luaM_new(L,t)         cast(t *, luaM_malloc(L, sizeof(t)))
++#define luaM_newvector(L,n,t) \
++              cast(t *, luaM_reallocv(L, NULL, 0, n, sizeof(t)))
++
++#define luaM_growvector(L,v,nelems,size,t,limit,e) \
++          if ((nelems)+1 > (size)) \
++            ((v)=cast(t *, luaM_growaux_(L,v,&(size),sizeof(t),limit,e)))
++
++#define luaM_reallocvector(L, v,oldn,n,t) \
++   ((v)=cast(t *, luaM_reallocv(L, v, oldn, n, sizeof(t))))
++
++
++LUAI_FUNC void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize,
++                                                          size_t size);
++LUAI_FUNC void *luaM_toobig (lua_State *L);
++LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int *size,
++                               size_t size_elem, int limit,
++                               const char *errormsg);
++
++#endif
++
+--- /dev/null
++++ b/extensions/LUA/lua/lobject.c
+@@ -0,0 +1,215 @@
++/*
++** $Id: lobject.c,v 2.22.1.1 2007/12/27 13:02:25 roberto Exp $
++** Some generic functions over Lua objects
++** See Copyright Notice in lua.h
++*/
++
++#include <stdarg.h>
++
++#include <ctype.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++
++#define lobject_c
++#define LUA_CORE
++
++#include "lua.h"
++
++#include "ldo.h"
++#include "lmem.h"
++#include "lobject.h"
++#include "lstate.h"
++#include "lstring.h"
++#include "lvm.h"
++
++
++
++const TValue luaO_nilobject_ = {{NULL}, LUA_TNIL};
++
++
++/*
++** converts an integer to a "floating point byte", represented as
++** (eeeeexxx), where the real value is (1xxx) * 2^(eeeee - 1) if
++** eeeee != 0 and (xxx) otherwise.
++*/
++int luaO_int2fb (unsigned int x) {
++  int e = 0;  /* expoent */
++  while (x >= 16) {
++    x = (x+1) >> 1;
++    e++;
++  }
++  if (x < 8) return x;
++  else return ((e+1) << 3) | (cast_int(x) - 8);
++}
++
++
++/* converts back */
++int luaO_fb2int (int x) {
++  int e = (x >> 3) & 31;
++  if (e == 0) return x;
++  else return ((x & 7)+8) << (e - 1);
++}
++
++
++int luaO_log2 (unsigned int x) {
++  static const lu_byte log_2[256] = {
++    0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
++    6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
++    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
++    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
++    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
++    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
++    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
++    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
++  };
++  int l = -1;
++  while (x >= 256) { l += 8; x >>= 8; }
++  return l + log_2[x];
++
++}
++
++
++int luaO_rawequalObj (const TValue *t1, const TValue *t2) {
++  if (ttype(t1) != ttype(t2)) return 0;
++  else switch (ttype(t1)) {
++    case LUA_TNIL:
++      return 1;
++    case LUA_TNUMBER:
++      return luai_numeq(nvalue(t1), nvalue(t2));
++    case LUA_TBOOLEAN:
++      return bvalue(t1) == bvalue(t2);  /* boolean true must be 1 !! */
++    case LUA_TLIGHTUSERDATA:
++      return pvalue(t1) == pvalue(t2);
++    default:
++      lua_assert(iscollectable(t1));
++      return gcvalue(t1) == gcvalue(t2);
++  }
++}
++
++
++int luaO_str2d (const char *s, lua_Number *result) {
++  char *endptr;
++  *result = lua_str2number(s, &endptr);
++  if (endptr == s) return 0;  /* conversion failed */
++  if (*endptr == 'x' || *endptr == 'X')  /* maybe an hexadecimal constant? */
++    *result = cast_num(strtoul(s, &endptr, 16));
++  if (*endptr == '\0') return 1;  /* most common case */
++  while (isspace(cast(unsigned char, *endptr))) endptr++;
++  if (*endptr != '\0') return 0;  /* invalid trailing characters? */
++  return 1;
++}
++
++
++
++static void pushstr (lua_State *L, const char *str) {
++  setsvalue2s(L, L->top, luaS_new(L, str));
++  incr_top(L);
++}
++
++
++/* this function handles only `%d', `%c', %f, %p, and `%s' formats */
++const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) {
++  int n = 1;
++  pushstr(L, "");
++  for (;;) {
++    const char *e = strchr(fmt, '%');
++    if (e == NULL) break;
++    setsvalue2s(L, L->top, luaS_newlstr(L, fmt, e-fmt));
++    incr_top(L);
++    switch (*(e+1)) {
++      case 's': {
++        const char *s = va_arg(argp, char *);
++        if (s == NULL) s = "(null)";
++        pushstr(L, s);
++        break;
++      }
++      case 'c': {
++        char buff[2];
++        buff[0] = cast(char, va_arg(argp, int));
++        buff[1] = '\0';
++        pushstr(L, buff);
++        break;
++      }
++      case 'd': {
++        setnvalue(L->top, cast_num(va_arg(argp, int)));
++        incr_top(L);
++        break;
++      }
++      case 'f': {
++        setnvalue(L->top, cast_num(va_arg(argp, l_uacNumber)));
++        incr_top(L);
++        break;
++      }
++      case 'p': {
++        char buff[4*sizeof(void *) + 8]; /* should be enough space for a `%p' */
++        sprintf(buff, "%p", va_arg(argp, void *));
++        pushstr(L, buff);
++        break;
++      }
++      case '%': {
++        pushstr(L, "%");
++        break;
++      }
++      default: {
++        char buff[3];
++        buff[0] = '%';
++        buff[1] = *(e+1);
++        buff[2] = '\0';
++        pushstr(L, buff);
++        break;
++      }
++    }
++    n += 2;
++    fmt = e+2;
++  }
++  pushstr(L, fmt);
++  luaV_concat(L, n+1, cast_int(L->top - L->base) - 1);
++  L->top -= n;
++  return svalue(L->top - 1);
++}
++
++
++const char *luaO_pushfstring (lua_State *L, const char *fmt, ...) {
++  const char *msg;
++  va_list argp;
++  va_start(argp, fmt);
++  msg = luaO_pushvfstring(L, fmt, argp);
++  va_end(argp);
++  return msg;
++}
++
++
++void luaO_chunkid (char *out, const char *source, size_t bufflen) {
++  if (*source == '=') {
++    strncpy(out, source+1, bufflen);  /* remove first char */
++    out[bufflen-1] = '\0';  /* ensures null termination */
++  }
++  else {  /* out = "source", or "...source" */
++    if (*source == '@') {
++      size_t l;
++      source++;  /* skip the `@' */
++      bufflen -= sizeof(" '...' ");
++      l = strlen(source);
++      strcpy(out, "");
++      if (l > bufflen) {
++        source += (l-bufflen);  /* get last part of file name */
++        strcat(out, "...");
++      }
++      strcat(out, source);
++    }
++    else {  /* out = [string "string"] */
++      size_t len = strcspn(source, "\n\r");  /* stop at first newline */
++      bufflen -= sizeof(" [string \"...\"] ");
++      if (len > bufflen) len = bufflen;
++      strcpy(out, "[string \"");
++      if (source[len] != '\0') {  /* must truncate? */
++        strncat(out, source, len);
++        strcat(out, "...");
++      }
++      else
++        strcat(out, source);
++      strcat(out, "\"]");
++    }
++  }
++}
+--- /dev/null
++++ b/extensions/LUA/lua/lobject.h
+@@ -0,0 +1,381 @@
++/*
++** $Id: lobject.h,v 2.20.1.2 2008/08/06 13:29:48 roberto Exp $
++** Type definitions for Lua objects
++** See Copyright Notice in lua.h
++*/
++
++
++#ifndef lobject_h
++#define lobject_h
++
++
++#include <stdarg.h>
++
++
++#include "llimits.h"
++#include "lua.h"
++
++
++/* tags for values visible from Lua */
++#define LAST_TAG      LUA_TTHREAD
++
++#define NUM_TAGS      (LAST_TAG+1)
++
++
++/*
++** Extra tags for non-values
++*/
++#define LUA_TPROTO    (LAST_TAG+1)
++#define LUA_TUPVAL    (LAST_TAG+2)
++#define LUA_TDEADKEY  (LAST_TAG+3)
++
++
++/*
++** Union of all collectable objects
++*/
++typedef union GCObject GCObject;
++
++
++/*
++** Common Header for all collectable objects (in macro form, to be
++** included in other objects)
++*/
++#define CommonHeader  GCObject *next; lu_byte tt; lu_byte marked
++
++
++/*
++** Common header in struct form
++*/
++typedef struct GCheader {
++  CommonHeader;
++} GCheader;
++
++
++
++
++/*
++** Union of all Lua values
++*/
++typedef union {
++  GCObject *gc;
++  void *p;
++  lua_Number n;
++  int b;
++} Value;
++
++
++/*
++** Tagged Values
++*/
++
++#define TValuefields  Value value; int tt
++
++typedef struct lua_TValue {
++  TValuefields;
++} TValue;
++
++
++/* Macros to test type */
++#define ttisnil(o)    (ttype(o) == LUA_TNIL)
++#define ttisnumber(o) (ttype(o) == LUA_TNUMBER)
++#define ttisstring(o) (ttype(o) == LUA_TSTRING)
++#define ttistable(o)  (ttype(o) == LUA_TTABLE)
++#define ttisfunction(o)       (ttype(o) == LUA_TFUNCTION)
++#define ttisboolean(o)        (ttype(o) == LUA_TBOOLEAN)
++#define ttisuserdata(o)       (ttype(o) == LUA_TUSERDATA)
++#define ttisthread(o) (ttype(o) == LUA_TTHREAD)
++#define ttislightuserdata(o)  (ttype(o) == LUA_TLIGHTUSERDATA)
++
++/* Macros to access values */
++#define ttype(o)      ((o)->tt)
++#define gcvalue(o)    check_exp(iscollectable(o), (o)->value.gc)
++#define pvalue(o)     check_exp(ttislightuserdata(o), (o)->value.p)
++#define nvalue(o)     check_exp(ttisnumber(o), (o)->value.n)
++#define rawtsvalue(o) check_exp(ttisstring(o), &(o)->value.gc->ts)
++#define tsvalue(o)    (&rawtsvalue(o)->tsv)
++#define rawuvalue(o)  check_exp(ttisuserdata(o), &(o)->value.gc->u)
++#define uvalue(o)     (&rawuvalue(o)->uv)
++#define clvalue(o)    check_exp(ttisfunction(o), &(o)->value.gc->cl)
++#define hvalue(o)     check_exp(ttistable(o), &(o)->value.gc->h)
++#define bvalue(o)     check_exp(ttisboolean(o), (o)->value.b)
++#define thvalue(o)    check_exp(ttisthread(o), &(o)->value.gc->th)
++
++#define l_isfalse(o)  (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0))
++
++/*
++** for internal debug only
++*/
++#define checkconsistency(obj) \
++  lua_assert(!iscollectable(obj) || (ttype(obj) == (obj)->value.gc->gch.tt))
++
++#define checkliveness(g,obj) \
++  lua_assert(!iscollectable(obj) || \
++  ((ttype(obj) == (obj)->value.gc->gch.tt) && !isdead(g, (obj)->value.gc)))
++
++
++/* Macros to set values */
++#define setnilvalue(obj) ((obj)->tt=LUA_TNIL)
++
++#define setnvalue(obj,x) \
++  { TValue *i_o=(obj); i_o->value.n=(x); i_o->tt=LUA_TNUMBER; }
++
++#define setpvalue(obj,x) \
++  { TValue *i_o=(obj); i_o->value.p=(x); i_o->tt=LUA_TLIGHTUSERDATA; }
++
++#define setbvalue(obj,x) \
++  { TValue *i_o=(obj); i_o->value.b=(x); i_o->tt=LUA_TBOOLEAN; }
++
++#define setsvalue(L,obj,x) \
++  { TValue *i_o=(obj); \
++    i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TSTRING; \
++    checkliveness(G(L),i_o); }
++
++#define setuvalue(L,obj,x) \
++  { TValue *i_o=(obj); \
++    i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TUSERDATA; \
++    checkliveness(G(L),i_o); }
++
++#define setthvalue(L,obj,x) \
++  { TValue *i_o=(obj); \
++    i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TTHREAD; \
++    checkliveness(G(L),i_o); }
++
++#define setclvalue(L,obj,x) \
++  { TValue *i_o=(obj); \
++    i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TFUNCTION; \
++    checkliveness(G(L),i_o); }
++
++#define sethvalue(L,obj,x) \
++  { TValue *i_o=(obj); \
++    i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TTABLE; \
++    checkliveness(G(L),i_o); }
++
++#define setptvalue(L,obj,x) \
++  { TValue *i_o=(obj); \
++    i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TPROTO; \
++    checkliveness(G(L),i_o); }
++
++
++
++
++#define setobj(L,obj1,obj2) \
++  { const TValue *o2=(obj2); TValue *o1=(obj1); \
++    o1->value = o2->value; o1->tt=o2->tt; \
++    checkliveness(G(L),o1); }
++
++
++/*
++** different types of sets, according to destination
++*/
++
++/* from stack to (same) stack */
++#define setobjs2s     setobj
++/* to stack (not from same stack) */
++#define setobj2s      setobj
++#define setsvalue2s   setsvalue
++#define sethvalue2s   sethvalue
++#define setptvalue2s  setptvalue
++/* from table to same table */
++#define setobjt2t     setobj
++/* to table */
++#define setobj2t      setobj
++/* to new object */
++#define setobj2n      setobj
++#define setsvalue2n   setsvalue
++
++#define setttype(obj, tt) (ttype(obj) = (tt))
++
++
++#define iscollectable(o)      (ttype(o) >= LUA_TSTRING)
++
++
++
++typedef TValue *StkId;  /* index to stack elements */
++
++
++/*
++** String headers for string table
++*/
++typedef union TString {
++  L_Umaxalign dummy;  /* ensures maximum alignment for strings */
++  struct {
++    CommonHeader;
++    lu_byte reserved;
++    unsigned int hash;
++    size_t len;
++  } tsv;
++} TString;
++
++
++#define getstr(ts)    cast(const char *, (ts) + 1)
++#define svalue(o)       getstr(rawtsvalue(o))
++
++
++
++typedef union Udata {
++  L_Umaxalign dummy;  /* ensures maximum alignment for `local' udata */
++  struct {
++    CommonHeader;
++    struct Table *metatable;
++    struct Table *env;
++    size_t len;
++  } uv;
++} Udata;
++
++
++
++
++/*
++** Function Prototypes
++*/
++typedef struct Proto {
++  CommonHeader;
++  TValue *k;  /* constants used by the function */
++  Instruction *code;
++  struct Proto **p;  /* functions defined inside the function */
++  int *lineinfo;  /* map from opcodes to source lines */
++  struct LocVar *locvars;  /* information about local variables */
++  TString **upvalues;  /* upvalue names */
++  TString  *source;
++  int sizeupvalues;
++  int sizek;  /* size of `k' */
++  int sizecode;
++  int sizelineinfo;
++  int sizep;  /* size of `p' */
++  int sizelocvars;
++  int linedefined;
++  int lastlinedefined;
++  GCObject *gclist;
++  lu_byte nups;  /* number of upvalues */
++  lu_byte numparams;
++  lu_byte is_vararg;
++  lu_byte maxstacksize;
++} Proto;
++
++
++/* masks for new-style vararg */
++#define VARARG_HASARG         1
++#define VARARG_ISVARARG               2
++#define VARARG_NEEDSARG               4
++
++
++typedef struct LocVar {
++  TString *varname;
++  int startpc;  /* first point where variable is active */
++  int endpc;    /* first point where variable is dead */
++} LocVar;
++
++
++
++/*
++** Upvalues
++*/
++
++typedef struct UpVal {
++  CommonHeader;
++  TValue *v;  /* points to stack or to its own value */
++  union {
++    TValue value;  /* the value (when closed) */
++    struct {  /* double linked list (when open) */
++      struct UpVal *prev;
++      struct UpVal *next;
++    } l;
++  } u;
++} UpVal;
++
++
++/*
++** Closures
++*/
++
++#define ClosureHeader \
++      CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist; \
++      struct Table *env
++
++typedef struct CClosure {
++  ClosureHeader;
++  lua_CFunction f;
++  TValue upvalue[1];
++} CClosure;
++
++
++typedef struct LClosure {
++  ClosureHeader;
++  struct Proto *p;
++  UpVal *upvals[1];
++} LClosure;
++
++
++typedef union Closure {
++  CClosure c;
++  LClosure l;
++} Closure;
++
++
++#define iscfunction(o)        (ttype(o) == LUA_TFUNCTION && clvalue(o)->c.isC)
++#define isLfunction(o)        (ttype(o) == LUA_TFUNCTION && !clvalue(o)->c.isC)
++
++
++/*
++** Tables
++*/
++
++typedef union TKey {
++  struct {
++    TValuefields;
++    struct Node *next;  /* for chaining */
++  } nk;
++  TValue tvk;
++} TKey;
++
++
++typedef struct Node {
++  TValue i_val;
++  TKey i_key;
++} Node;
++
++
++typedef struct Table {
++  CommonHeader;
++  lu_byte flags;  /* 1<<p means tagmethod(p) is not present */ 
++  lu_byte lsizenode;  /* log2 of size of `node' array */
++  struct Table *metatable;
++  TValue *array;  /* array part */
++  Node *node;
++  Node *lastfree;  /* any free position is before this position */
++  GCObject *gclist;
++  int sizearray;  /* size of `array' array */
++} Table;
++
++
++
++/*
++** `module' operation for hashing (size is always a power of 2)
++*/
++#define lmod(s,size) \
++      (check_exp((size&(size-1))==0, (cast(int, (s) & ((size)-1)))))
++
++
++#define twoto(x)      (1<<(x))
++#define sizenode(t)   (twoto((t)->lsizenode))
++
++
++#define luaO_nilobject                (&luaO_nilobject_)
++
++LUAI_DATA const TValue luaO_nilobject_;
++
++#define ceillog2(x)   (luaO_log2((x)-1) + 1)
++
++LUAI_FUNC int luaO_log2 (unsigned int x);
++LUAI_FUNC int luaO_int2fb (unsigned int x);
++LUAI_FUNC int luaO_fb2int (int x);
++LUAI_FUNC int luaO_rawequalObj (const TValue *t1, const TValue *t2);
++LUAI_FUNC int luaO_str2d (const char *s, lua_Number *result);
++LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt,
++                                                       va_list argp);
++LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...);
++LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len);
++
++
++#endif
++
+--- /dev/null
++++ b/extensions/LUA/lua/lopcodes.c
+@@ -0,0 +1,102 @@
++/*
++** $Id: lopcodes.c,v 1.37.1.1 2007/12/27 13:02:25 roberto Exp $
++** See Copyright Notice in lua.h
++*/
++
++
++#define lopcodes_c
++#define LUA_CORE
++
++
++#include "lopcodes.h"
++
++
++/* ORDER OP */
++
++const char *const luaP_opnames[NUM_OPCODES+1] = {
++  "MOVE",
++  "LOADK",
++  "LOADBOOL",
++  "LOADNIL",
++  "GETUPVAL",
++  "GETGLOBAL",
++  "GETTABLE",
++  "SETGLOBAL",
++  "SETUPVAL",
++  "SETTABLE",
++  "NEWTABLE",
++  "SELF",
++  "ADD",
++  "SUB",
++  "MUL",
++  "DIV",
++  "MOD",
++  "POW",
++  "UNM",
++  "NOT",
++  "LEN",
++  "CONCAT",
++  "JMP",
++  "EQ",
++  "LT",
++  "LE",
++  "TEST",
++  "TESTSET",
++  "CALL",
++  "TAILCALL",
++  "RETURN",
++  "FORLOOP",
++  "FORPREP",
++  "TFORLOOP",
++  "SETLIST",
++  "CLOSE",
++  "CLOSURE",
++  "VARARG",
++  NULL
++};
++
++
++#define opmode(t,a,b,c,m) (((t)<<7) | ((a)<<6) | ((b)<<4) | ((c)<<2) | (m))
++
++const lu_byte luaP_opmodes[NUM_OPCODES] = {
++/*       T  A    B       C     mode              opcode       */
++  opmode(0, 1, OpArgR, OpArgN, iABC)          /* OP_MOVE */
++ ,opmode(0, 1, OpArgK, OpArgN, iABx)          /* OP_LOADK */
++ ,opmode(0, 1, OpArgU, OpArgU, iABC)          /* OP_LOADBOOL */
++ ,opmode(0, 1, OpArgR, OpArgN, iABC)          /* OP_LOADNIL */
++ ,opmode(0, 1, OpArgU, OpArgN, iABC)          /* OP_GETUPVAL */
++ ,opmode(0, 1, OpArgK, OpArgN, iABx)          /* OP_GETGLOBAL */
++ ,opmode(0, 1, OpArgR, OpArgK, iABC)          /* OP_GETTABLE */
++ ,opmode(0, 0, OpArgK, OpArgN, iABx)          /* OP_SETGLOBAL */
++ ,opmode(0, 0, OpArgU, OpArgN, iABC)          /* OP_SETUPVAL */
++ ,opmode(0, 0, OpArgK, OpArgK, iABC)          /* OP_SETTABLE */
++ ,opmode(0, 1, OpArgU, OpArgU, iABC)          /* OP_NEWTABLE */
++ ,opmode(0, 1, OpArgR, OpArgK, iABC)          /* OP_SELF */
++ ,opmode(0, 1, OpArgK, OpArgK, iABC)          /* OP_ADD */
++ ,opmode(0, 1, OpArgK, OpArgK, iABC)          /* OP_SUB */
++ ,opmode(0, 1, OpArgK, OpArgK, iABC)          /* OP_MUL */
++ ,opmode(0, 1, OpArgK, OpArgK, iABC)          /* OP_DIV */
++ ,opmode(0, 1, OpArgK, OpArgK, iABC)          /* OP_MOD */
++ ,opmode(0, 1, OpArgK, OpArgK, iABC)          /* OP_POW */
++ ,opmode(0, 1, OpArgR, OpArgN, iABC)          /* OP_UNM */
++ ,opmode(0, 1, OpArgR, OpArgN, iABC)          /* OP_NOT */
++ ,opmode(0, 1, OpArgR, OpArgN, iABC)          /* OP_LEN */
++ ,opmode(0, 1, OpArgR, OpArgR, iABC)          /* OP_CONCAT */
++ ,opmode(0, 0, OpArgR, OpArgN, iAsBx)         /* OP_JMP */
++ ,opmode(1, 0, OpArgK, OpArgK, iABC)          /* OP_EQ */
++ ,opmode(1, 0, OpArgK, OpArgK, iABC)          /* OP_LT */
++ ,opmode(1, 0, OpArgK, OpArgK, iABC)          /* OP_LE */
++ ,opmode(1, 1, OpArgR, OpArgU, iABC)          /* OP_TEST */
++ ,opmode(1, 1, OpArgR, OpArgU, iABC)          /* OP_TESTSET */
++ ,opmode(0, 1, OpArgU, OpArgU, iABC)          /* OP_CALL */
++ ,opmode(0, 1, OpArgU, OpArgU, iABC)          /* OP_TAILCALL */
++ ,opmode(0, 0, OpArgU, OpArgN, iABC)          /* OP_RETURN */
++ ,opmode(0, 1, OpArgR, OpArgN, iAsBx)         /* OP_FORLOOP */
++ ,opmode(0, 1, OpArgR, OpArgN, iAsBx)         /* OP_FORPREP */
++ ,opmode(1, 0, OpArgN, OpArgU, iABC)          /* OP_TFORLOOP */
++ ,opmode(0, 0, OpArgU, OpArgU, iABC)          /* OP_SETLIST */
++ ,opmode(0, 0, OpArgN, OpArgN, iABC)          /* OP_CLOSE */
++ ,opmode(0, 1, OpArgU, OpArgN, iABx)          /* OP_CLOSURE */
++ ,opmode(0, 1, OpArgU, OpArgN, iABC)          /* OP_VARARG */
++};
++
+--- /dev/null
++++ b/extensions/LUA/lua/lopcodes.h
+@@ -0,0 +1,268 @@
++/*
++** $Id: lopcodes.h,v 1.125.1.1 2007/12/27 13:02:25 roberto Exp $
++** Opcodes for Lua virtual machine
++** See Copyright Notice in lua.h
++*/
++
++#ifndef lopcodes_h
++#define lopcodes_h
++
++#include "llimits.h"
++
++
++/*===========================================================================
++  We assume that instructions are unsigned numbers.
++  All instructions have an opcode in the first 6 bits.
++  Instructions can have the following fields:
++      `A' : 8 bits
++      `B' : 9 bits
++      `C' : 9 bits
++      `Bx' : 18 bits (`B' and `C' together)
++      `sBx' : signed Bx
++
++  A signed argument is represented in excess K; that is, the number
++  value is the unsigned value minus K. K is exactly the maximum value
++  for that argument (so that -max is represented by 0, and +max is
++  represented by 2*max), which is half the maximum for the corresponding
++  unsigned argument.
++===========================================================================*/
++
++
++enum OpMode {iABC, iABx, iAsBx};  /* basic instruction format */
++
++
++/*
++** size and position of opcode arguments.
++*/
++#define SIZE_C                9
++#define SIZE_B                9
++#define SIZE_Bx               (SIZE_C + SIZE_B)
++#define SIZE_A                8
++
++#define SIZE_OP               6
++
++#define POS_OP                0
++#define POS_A         (POS_OP + SIZE_OP)
++#define POS_C         (POS_A + SIZE_A)
++#define POS_B         (POS_C + SIZE_C)
++#define POS_Bx                POS_C
++
++
++/*
++** limits for opcode arguments.
++** we use (signed) int to manipulate most arguments,
++** so they must fit in LUAI_BITSINT-1 bits (-1 for sign)
++*/
++#if SIZE_Bx < LUAI_BITSINT-1
++#define MAXARG_Bx        ((1<<SIZE_Bx)-1)
++#define MAXARG_sBx        (MAXARG_Bx>>1)         /* `sBx' is signed */
++#else
++#define MAXARG_Bx        MAX_INT
++#define MAXARG_sBx        MAX_INT
++#endif
++
++
++#define MAXARG_A        ((1<<SIZE_A)-1)
++#define MAXARG_B        ((1<<SIZE_B)-1)
++#define MAXARG_C        ((1<<SIZE_C)-1)
++
++
++/* creates a mask with `n' 1 bits at position `p' */
++#define MASK1(n,p)    ((~((~(Instruction)0)<<n))<<p)
++
++/* creates a mask with `n' 0 bits at position `p' */
++#define MASK0(n,p)    (~MASK1(n,p))
++
++/*
++** the following macros help to manipulate instructions
++*/
++
++#define GET_OPCODE(i) (cast(OpCode, ((i)>>POS_OP) & MASK1(SIZE_OP,0)))
++#define SET_OPCODE(i,o)       ((i) = (((i)&MASK0(SIZE_OP,POS_OP)) | \
++              ((cast(Instruction, o)<<POS_OP)&MASK1(SIZE_OP,POS_OP))))
++
++#define GETARG_A(i)   (cast(int, ((i)>>POS_A) & MASK1(SIZE_A,0)))
++#define SETARG_A(i,u) ((i) = (((i)&MASK0(SIZE_A,POS_A)) | \
++              ((cast(Instruction, u)<<POS_A)&MASK1(SIZE_A,POS_A))))
++
++#define GETARG_B(i)   (cast(int, ((i)>>POS_B) & MASK1(SIZE_B,0)))
++#define SETARG_B(i,b) ((i) = (((i)&MASK0(SIZE_B,POS_B)) | \
++              ((cast(Instruction, b)<<POS_B)&MASK1(SIZE_B,POS_B))))
++
++#define GETARG_C(i)   (cast(int, ((i)>>POS_C) & MASK1(SIZE_C,0)))
++#define SETARG_C(i,b) ((i) = (((i)&MASK0(SIZE_C,POS_C)) | \
++              ((cast(Instruction, b)<<POS_C)&MASK1(SIZE_C,POS_C))))
++
++#define GETARG_Bx(i)  (cast(int, ((i)>>POS_Bx) & MASK1(SIZE_Bx,0)))
++#define SETARG_Bx(i,b)        ((i) = (((i)&MASK0(SIZE_Bx,POS_Bx)) | \
++              ((cast(Instruction, b)<<POS_Bx)&MASK1(SIZE_Bx,POS_Bx))))
++
++#define GETARG_sBx(i) (GETARG_Bx(i)-MAXARG_sBx)
++#define SETARG_sBx(i,b)       SETARG_Bx((i),cast(unsigned int, (b)+MAXARG_sBx))
++
++
++#define CREATE_ABC(o,a,b,c)   ((cast(Instruction, o)<<POS_OP) \
++                      | (cast(Instruction, a)<<POS_A) \
++                      | (cast(Instruction, b)<<POS_B) \
++                      | (cast(Instruction, c)<<POS_C))
++
++#define CREATE_ABx(o,a,bc)    ((cast(Instruction, o)<<POS_OP) \
++                      | (cast(Instruction, a)<<POS_A) \
++                      | (cast(Instruction, bc)<<POS_Bx))
++
++
++/*
++** Macros to operate RK indices
++*/
++
++/* this bit 1 means constant (0 means register) */
++#define BITRK         (1 << (SIZE_B - 1))
++
++/* test whether value is a constant */
++#define ISK(x)                ((x) & BITRK)
++
++/* gets the index of the constant */
++#define INDEXK(r)     ((int)(r) & ~BITRK)
++
++#define MAXINDEXRK    (BITRK - 1)
++
++/* code a constant index as a RK value */
++#define RKASK(x)      ((x) | BITRK)
++
++
++/*
++** invalid register that fits in 8 bits
++*/
++#define NO_REG                MAXARG_A
++
++
++/*
++** R(x) - register
++** Kst(x) - constant (in constant table)
++** RK(x) == if ISK(x) then Kst(INDEXK(x)) else R(x)
++*/
++
++
++/*
++** grep "ORDER OP" if you change these enums
++*/
++
++typedef enum {
++/*----------------------------------------------------------------------
++name          args    description
++------------------------------------------------------------------------*/
++OP_MOVE,/*    A B     R(A) := R(B)                                    */
++OP_LOADK,/*   A Bx    R(A) := Kst(Bx)                                 */
++OP_LOADBOOL,/*        A B C   R(A) := (Bool)B; if (C) pc++                    */
++OP_LOADNIL,/* A B     R(A) := ... := R(B) := nil                      */
++OP_GETUPVAL,/*        A B     R(A) := UpValue[B]                              */
++
++OP_GETGLOBAL,/*       A Bx    R(A) := Gbl[Kst(Bx)]                            */
++OP_GETTABLE,/*        A B C   R(A) := R(B)[RK(C)]                             */
++
++OP_SETGLOBAL,/*       A Bx    Gbl[Kst(Bx)] := R(A)                            */
++OP_SETUPVAL,/*        A B     UpValue[B] := R(A)                              */
++OP_SETTABLE,/*        A B C   R(A)[RK(B)] := RK(C)                            */
++
++OP_NEWTABLE,/*        A B C   R(A) := {} (size = B,C)                         */
++
++OP_SELF,/*    A B C   R(A+1) := R(B); R(A) := R(B)[RK(C)]             */
++
++OP_ADD,/*     A B C   R(A) := RK(B) + RK(C)                           */
++OP_SUB,/*     A B C   R(A) := RK(B) - RK(C)                           */
++OP_MUL,/*     A B C   R(A) := RK(B) * RK(C)                           */
++OP_DIV,/*     A B C   R(A) := RK(B) / RK(C)                           */
++OP_MOD,/*     A B C   R(A) := RK(B) % RK(C)                           */
++OP_POW,/*     A B C   R(A) := RK(B) ^ RK(C)                           */
++OP_UNM,/*     A B     R(A) := -R(B)                                   */
++OP_NOT,/*     A B     R(A) := not R(B)                                */
++OP_LEN,/*     A B     R(A) := length of R(B)                          */
++
++OP_CONCAT,/*  A B C   R(A) := R(B).. ... ..R(C)                       */
++
++OP_JMP,/*     sBx     pc+=sBx                                 */
++
++OP_EQ,/*      A B C   if ((RK(B) == RK(C)) ~= A) then pc++            */
++OP_LT,/*      A B C   if ((RK(B) <  RK(C)) ~= A) then pc++            */
++OP_LE,/*      A B C   if ((RK(B) <= RK(C)) ~= A) then pc++            */
++
++OP_TEST,/*    A C     if not (R(A) <=> C) then pc++                   */ 
++OP_TESTSET,/* A B C   if (R(B) <=> C) then R(A) := R(B) else pc++     */ 
++
++OP_CALL,/*    A B C   R(A), ... ,R(A+C-2) := R(A)(R(A+1), ... ,R(A+B-1)) */
++OP_TAILCALL,/*        A B C   return R(A)(R(A+1), ... ,R(A+B-1))              */
++OP_RETURN,/*  A B     return R(A), ... ,R(A+B-2)      (see note)      */
++
++OP_FORLOOP,/* A sBx   R(A)+=R(A+2);
++                      if R(A) <?= R(A+1) then { pc+=sBx; R(A+3)=R(A) }*/
++OP_FORPREP,/* A sBx   R(A)-=R(A+2); pc+=sBx                           */
++
++OP_TFORLOOP,/*        A C     R(A+3), ... ,R(A+2+C) := R(A)(R(A+1), R(A+2)); 
++                        if R(A+3) ~= nil then R(A+2)=R(A+3) else pc++ */ 
++OP_SETLIST,/* A B C   R(A)[(C-1)*FPF+i] := R(A+i), 1 <= i <= B        */
++
++OP_CLOSE,/*   A       close all variables in the stack up to (>=) R(A)*/
++OP_CLOSURE,/* A Bx    R(A) := closure(KPROTO[Bx], R(A), ... ,R(A+n))  */
++
++OP_VARARG/*   A B     R(A), R(A+1), ..., R(A+B-1) = vararg            */
++} OpCode;
++
++
++#define NUM_OPCODES   (cast(int, OP_VARARG) + 1)
++
++
++
++/*===========================================================================
++  Notes:
++  (*) In OP_CALL, if (B == 0) then B = top. C is the number of returns - 1,
++      and can be 0: OP_CALL then sets `top' to last_result+1, so
++      next open instruction (OP_CALL, OP_RETURN, OP_SETLIST) may use `top'.
++
++  (*) In OP_VARARG, if (B == 0) then use actual number of varargs and
++      set top (like in OP_CALL with C == 0).
++
++  (*) In OP_RETURN, if (B == 0) then return up to `top'
++
++  (*) In OP_SETLIST, if (B == 0) then B = `top';
++      if (C == 0) then next `instruction' is real C
++
++  (*) For comparisons, A specifies what condition the test should accept
++      (true or false).
++
++  (*) All `skips' (pc++) assume that next instruction is a jump
++===========================================================================*/
++
++
++/*
++** masks for instruction properties. The format is:
++** bits 0-1: op mode
++** bits 2-3: C arg mode
++** bits 4-5: B arg mode
++** bit 6: instruction set register A
++** bit 7: operator is a test
++*/  
++
++enum OpArgMask {
++  OpArgN,  /* argument is not used */
++  OpArgU,  /* argument is used */
++  OpArgR,  /* argument is a register or a jump offset */
++  OpArgK   /* argument is a constant or register/constant */
++};
++
++LUAI_DATA const lu_byte luaP_opmodes[NUM_OPCODES];
++
++#define getOpMode(m)  (cast(enum OpMode, luaP_opmodes[m] & 3))
++#define getBMode(m)   (cast(enum OpArgMask, (luaP_opmodes[m] >> 4) & 3))
++#define getCMode(m)   (cast(enum OpArgMask, (luaP_opmodes[m] >> 2) & 3))
++#define testAMode(m)  (luaP_opmodes[m] & (1 << 6))
++#define testTMode(m)  (luaP_opmodes[m] & (1 << 7))
++
++
++LUAI_DATA const char *const luaP_opnames[NUM_OPCODES+1];  /* opcode names */
++
++
++/* number of list items to accumulate before a SETLIST instruction */
++#define LFIELDS_PER_FLUSH     50
++
++
++#endif
+--- /dev/null
++++ b/extensions/LUA/lua/lparser.c
+@@ -0,0 +1,1339 @@
++/*
++** $Id: lparser.c,v 2.42.1.3 2007/12/28 15:32:23 roberto Exp $
++** Lua Parser
++** See Copyright Notice in lua.h
++*/
++
++
++#include <string.h>
++
++#define lparser_c
++#define LUA_CORE
++
++#include "lua.h"
++
++#include "lcode.h"
++#include "ldebug.h"
++#include "ldo.h"
++#include "lfunc.h"
++#include "llex.h"
++#include "lmem.h"
++#include "lobject.h"
++#include "lopcodes.h"
++#include "lparser.h"
++#include "lstate.h"
++#include "lstring.h"
++#include "ltable.h"
++
++
++
++#define hasmultret(k)         ((k) == VCALL || (k) == VVARARG)
++
++#define getlocvar(fs, i)      ((fs)->f->locvars[(fs)->actvar[i]])
++
++#define luaY_checklimit(fs,v,l,m)     if ((v)>(l)) errorlimit(fs,l,m)
++
++
++/*
++** nodes for block list (list of active blocks)
++*/
++typedef struct BlockCnt {
++  struct BlockCnt *previous;  /* chain */
++  int breaklist;  /* list of jumps out of this loop */
++  lu_byte nactvar;  /* # active locals outside the breakable structure */
++  lu_byte upval;  /* true if some variable in the block is an upvalue */
++  lu_byte isbreakable;  /* true if `block' is a loop */
++} BlockCnt;
++
++
++
++/*
++** prototypes for recursive non-terminal functions
++*/
++static void chunk (LexState *ls);
++static void expr (LexState *ls, expdesc *v);
++
++
++static void anchor_token (LexState *ls) {
++  if (ls->t.token == TK_NAME || ls->t.token == TK_STRING) {
++    TString *ts = ls->t.seminfo.ts;
++    luaX_newstring(ls, getstr(ts), ts->tsv.len);
++  }
++}
++
++
++static void error_expected (LexState *ls, int token) {
++  luaX_syntaxerror(ls,
++      luaO_pushfstring(ls->L, LUA_QS " expected", luaX_token2str(ls, token)));
++}
++
++
++static void errorlimit (FuncState *fs, int limit, const char *what) {
++  const char *msg = (fs->f->linedefined == 0) ?
++    luaO_pushfstring(fs->L, "main function has more than %d %s", limit, what) :
++    luaO_pushfstring(fs->L, "function at line %d has more than %d %s",
++                            fs->f->linedefined, limit, what);
++  luaX_lexerror(fs->ls, msg, 0);
++}
++
++
++static int testnext (LexState *ls, int c) {
++  if (ls->t.token == c) {
++    luaX_next(ls);
++    return 1;
++  }
++  else return 0;
++}
++
++
++static void check (LexState *ls, int c) {
++  if (ls->t.token != c)
++    error_expected(ls, c);
++}
++
++static void checknext (LexState *ls, int c) {
++  check(ls, c);
++  luaX_next(ls);
++}
++
++
++#define check_condition(ls,c,msg)     { if (!(c)) luaX_syntaxerror(ls, msg); }
++
++
++
++static void check_match (LexState *ls, int what, int who, int where) {
++  if (!testnext(ls, what)) {
++    if (where == ls->linenumber)
++      error_expected(ls, what);
++    else {
++      luaX_syntaxerror(ls, luaO_pushfstring(ls->L,
++             LUA_QS " expected (to close " LUA_QS " at line %d)",
++              luaX_token2str(ls, what), luaX_token2str(ls, who), where));
++    }
++  }
++}
++
++
++static TString *str_checkname (LexState *ls) {
++  TString *ts;
++  check(ls, TK_NAME);
++  ts = ls->t.seminfo.ts;
++  luaX_next(ls);
++  return ts;
++}
++
++
++static void init_exp (expdesc *e, expkind k, int i) {
++  e->f = e->t = NO_JUMP;
++  e->k = k;
++  e->u.s.info = i;
++}
++
++
++static void codestring (LexState *ls, expdesc *e, TString *s) {
++  init_exp(e, VK, luaK_stringK(ls->fs, s));
++}
++
++
++static void checkname(LexState *ls, expdesc *e) {
++  codestring(ls, e, str_checkname(ls));
++}
++
++
++static int registerlocalvar (LexState *ls, TString *varname) {
++  FuncState *fs = ls->fs;
++  Proto *f = fs->f;
++  int oldsize = f->sizelocvars;
++  luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars,
++                  LocVar, SHRT_MAX, "too many local variables");
++  while (oldsize < f->sizelocvars) f->locvars[oldsize++].varname = NULL;
++  f->locvars[fs->nlocvars].varname = varname;
++  luaC_objbarrier(ls->L, f, varname);
++  return fs->nlocvars++;
++}
++
++
++#define new_localvarliteral(ls,v,n) \
++  new_localvar(ls, luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char))-1), n)
++
++
++static void new_localvar (LexState *ls, TString *name, int n) {
++  FuncState *fs = ls->fs;
++  luaY_checklimit(fs, fs->nactvar+n+1, LUAI_MAXVARS, "local variables");
++  fs->actvar[fs->nactvar+n] = cast(unsigned short, registerlocalvar(ls, name));
++}
++
++
++static void adjustlocalvars (LexState *ls, int nvars) {
++  FuncState *fs = ls->fs;
++  fs->nactvar = cast_byte(fs->nactvar + nvars);
++  for (; nvars; nvars--) {
++    getlocvar(fs, fs->nactvar - nvars).startpc = fs->pc;
++  }
++}
++
++
++static void removevars (LexState *ls, int tolevel) {
++  FuncState *fs = ls->fs;
++  while (fs->nactvar > tolevel)
++    getlocvar(fs, --fs->nactvar).endpc = fs->pc;
++}
++
++
++static int indexupvalue (FuncState *fs, TString *name, expdesc *v) {
++  int i;
++  Proto *f = fs->f;
++  int oldsize = f->sizeupvalues;
++  for (i=0; i<f->nups; i++) {
++    if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->u.s.info) {
++      lua_assert(f->upvalues[i] == name);
++      return i;
++    }
++  }
++  /* new one */
++  luaY_checklimit(fs, f->nups + 1, LUAI_MAXUPVALUES, "upvalues");
++  luaM_growvector(fs->L, f->upvalues, f->nups, f->sizeupvalues,
++                  TString *, MAX_INT, "");
++  while (oldsize < f->sizeupvalues) f->upvalues[oldsize++] = NULL;
++  f->upvalues[f->nups] = name;
++  luaC_objbarrier(fs->L, f, name);
++  lua_assert(v->k == VLOCAL || v->k == VUPVAL);
++  fs->upvalues[f->nups].k = cast_byte(v->k);
++  fs->upvalues[f->nups].info = cast_byte(v->u.s.info);
++  return f->nups++;
++}
++
++
++static int searchvar (FuncState *fs, TString *n) {
++  int i;
++  for (i=fs->nactvar-1; i >= 0; i--) {
++    if (n == getlocvar(fs, i).varname)
++      return i;
++  }
++  return -1;  /* not found */
++}
++
++
++static void markupval (FuncState *fs, int level) {
++  BlockCnt *bl = fs->bl;
++  while (bl && bl->nactvar > level) bl = bl->previous;
++  if (bl) bl->upval = 1;
++}
++
++
++static int singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) {
++  if (fs == NULL) {  /* no more levels? */
++    init_exp(var, VGLOBAL, NO_REG);  /* default is global variable */
++    return VGLOBAL;
++  }
++  else {
++    int v = searchvar(fs, n);  /* look up at current level */
++    if (v >= 0) {
++      init_exp(var, VLOCAL, v);
++      if (!base)
++        markupval(fs, v);  /* local will be used as an upval */
++      return VLOCAL;
++    }
++    else {  /* not found at current level; try upper one */
++      if (singlevaraux(fs->prev, n, var, 0) == VGLOBAL)
++        return VGLOBAL;
++      var->u.s.info = indexupvalue(fs, n, var);  /* else was LOCAL or UPVAL */
++      var->k = VUPVAL;  /* upvalue in this level */
++      return VUPVAL;
++    }
++  }
++}
++
++
++static void singlevar (LexState *ls, expdesc *var) {
++  TString *varname = str_checkname(ls);
++  FuncState *fs = ls->fs;
++  if (singlevaraux(fs, varname, var, 1) == VGLOBAL)
++    var->u.s.info = luaK_stringK(fs, varname);  /* info points to global name */
++}
++
++
++static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) {
++  FuncState *fs = ls->fs;
++  int extra = nvars - nexps;
++  if (hasmultret(e->k)) {
++    extra++;  /* includes call itself */
++    if (extra < 0) extra = 0;
++    luaK_setreturns(fs, e, extra);  /* last exp. provides the difference */
++    if (extra > 1) luaK_reserveregs(fs, extra-1);
++  }
++  else {
++    if (e->k != VVOID) luaK_exp2nextreg(fs, e);  /* close last expression */
++    if (extra > 0) {
++      int reg = fs->freereg;
++      luaK_reserveregs(fs, extra);
++      luaK_nil(fs, reg, extra);
++    }
++  }
++}
++
++
++static void enterlevel (LexState *ls) {
++  if (++ls->L->nCcalls > LUAI_MAXCCALLS)
++      luaX_lexerror(ls, "chunk has too many syntax levels", 0);
++}
++
++
++#define leavelevel(ls)        ((ls)->L->nCcalls--)
++
++
++static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isbreakable) {
++  bl->breaklist = NO_JUMP;
++  bl->isbreakable = isbreakable;
++  bl->nactvar = fs->nactvar;
++  bl->upval = 0;
++  bl->previous = fs->bl;
++  fs->bl = bl;
++  lua_assert(fs->freereg == fs->nactvar);
++}
++
++
++static void leaveblock (FuncState *fs) {
++  BlockCnt *bl = fs->bl;
++  fs->bl = bl->previous;
++  removevars(fs->ls, bl->nactvar);
++  if (bl->upval)
++    luaK_codeABC(fs, OP_CLOSE, bl->nactvar, 0, 0);
++  /* a block either controls scope or breaks (never both) */
++  lua_assert(!bl->isbreakable || !bl->upval);
++  lua_assert(bl->nactvar == fs->nactvar);
++  fs->freereg = fs->nactvar;  /* free registers */
++  luaK_patchtohere(fs, bl->breaklist);
++}
++
++
++static void pushclosure (LexState *ls, FuncState *func, expdesc *v) {
++  FuncState *fs = ls->fs;
++  Proto *f = fs->f;
++  int oldsize = f->sizep;
++  int i;
++  luaM_growvector(ls->L, f->p, fs->np, f->sizep, Proto *,
++                  MAXARG_Bx, "constant table overflow");
++  while (oldsize < f->sizep) f->p[oldsize++] = NULL;
++  f->p[fs->np++] = func->f;
++  luaC_objbarrier(ls->L, f, func->f);
++  init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np-1));
++  for (i=0; i<func->f->nups; i++) {
++    OpCode o = (func->upvalues[i].k == VLOCAL) ? OP_MOVE : OP_GETUPVAL;
++    luaK_codeABC(fs, o, 0, func->upvalues[i].info, 0);
++  }
++}
++
++
++static void open_func (LexState *ls, FuncState *fs) {
++  lua_State *L = ls->L;
++  Proto *f = luaF_newproto(L);
++  fs->f = f;
++  fs->prev = ls->fs;  /* linked list of funcstates */
++  fs->ls = ls;
++  fs->L = L;
++  ls->fs = fs;
++  fs->pc = 0;
++  fs->lasttarget = -1;
++  fs->jpc = NO_JUMP;
++  fs->freereg = 0;
++  fs->nk = 0;
++  fs->np = 0;
++  fs->nlocvars = 0;
++  fs->nactvar = 0;
++  fs->bl = NULL;
++  f->source = ls->source;
++  f->maxstacksize = 2;  /* registers 0/1 are always valid */
++  fs->h = luaH_new(L, 0, 0);
++  /* anchor table of constants and prototype (to avoid being collected) */
++  sethvalue2s(L, L->top, fs->h);
++  incr_top(L);
++  setptvalue2s(L, L->top, f);
++  incr_top(L);
++}
++
++
++static void close_func (LexState *ls) {
++  lua_State *L = ls->L;
++  FuncState *fs = ls->fs;
++  Proto *f = fs->f;
++  removevars(ls, 0);
++  luaK_ret(fs, 0, 0);  /* final return */
++  luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction);
++  f->sizecode = fs->pc;
++  luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int);
++  f->sizelineinfo = fs->pc;
++  luaM_reallocvector(L, f->k, f->sizek, fs->nk, TValue);
++  f->sizek = fs->nk;
++  luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *);
++  f->sizep = fs->np;
++  luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar);
++  f->sizelocvars = fs->nlocvars;
++  luaM_reallocvector(L, f->upvalues, f->sizeupvalues, f->nups, TString *);
++  f->sizeupvalues = f->nups;
++  lua_assert(luaG_checkcode(f));
++  lua_assert(fs->bl == NULL);
++  ls->fs = fs->prev;
++  L->top -= 2;  /* remove table and prototype from the stack */
++  /* last token read was anchored in defunct function; must reanchor it */
++  if (fs) anchor_token(ls);
++}
++
++
++Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) {
++  struct LexState lexstate;
++  struct FuncState funcstate;
++  lexstate.buff = buff;
++  luaX_setinput(L, &lexstate, z, luaS_new(L, name));
++  open_func(&lexstate, &funcstate);
++  funcstate.f->is_vararg = VARARG_ISVARARG;  /* main func. is always vararg */
++  luaX_next(&lexstate);  /* read first token */
++  chunk(&lexstate);
++  check(&lexstate, TK_EOS);
++  close_func(&lexstate);
++  lua_assert(funcstate.prev == NULL);
++  lua_assert(funcstate.f->nups == 0);
++  lua_assert(lexstate.fs == NULL);
++  return funcstate.f;
++}
++
++
++
++/*============================================================*/
++/* GRAMMAR RULES */
++/*============================================================*/
++
++
++static void field (LexState *ls, expdesc *v) {
++  /* field -> ['.' | ':'] NAME */
++  FuncState *fs = ls->fs;
++  expdesc key;
++  luaK_exp2anyreg(fs, v);
++  luaX_next(ls);  /* skip the dot or colon */
++  checkname(ls, &key);
++  luaK_indexed(fs, v, &key);
++}
++
++
++static void yindex (LexState *ls, expdesc *v) {
++  /* index -> '[' expr ']' */
++  luaX_next(ls);  /* skip the '[' */
++  expr(ls, v);
++  luaK_exp2val(ls->fs, v);
++  checknext(ls, ']');
++}
++
++
++/*
++** {======================================================================
++** Rules for Constructors
++** =======================================================================
++*/
++
++
++struct ConsControl {
++  expdesc v;  /* last list item read */
++  expdesc *t;  /* table descriptor */
++  int nh;  /* total number of `record' elements */
++  int na;  /* total number of array elements */
++  int tostore;  /* number of array elements pending to be stored */
++};
++
++
++static void recfield (LexState *ls, struct ConsControl *cc) {
++  /* recfield -> (NAME | `['exp1`]') = exp1 */
++  FuncState *fs = ls->fs;
++  int reg = ls->fs->freereg;
++  expdesc key, val;
++  int rkkey;
++  if (ls->t.token == TK_NAME) {
++    luaY_checklimit(fs, cc->nh, MAX_INT, "items in a constructor");
++    checkname(ls, &key);
++  }
++  else  /* ls->t.token == '[' */
++    yindex(ls, &key);
++  cc->nh++;
++  checknext(ls, '=');
++  rkkey = luaK_exp2RK(fs, &key);
++  expr(ls, &val);
++  luaK_codeABC(fs, OP_SETTABLE, cc->t->u.s.info, rkkey, luaK_exp2RK(fs, &val));
++  fs->freereg = reg;  /* free registers */
++}
++
++
++static void closelistfield (FuncState *fs, struct ConsControl *cc) {
++  if (cc->v.k == VVOID) return;  /* there is no list item */
++  luaK_exp2nextreg(fs, &cc->v);
++  cc->v.k = VVOID;
++  if (cc->tostore == LFIELDS_PER_FLUSH) {
++    luaK_setlist(fs, cc->t->u.s.info, cc->na, cc->tostore);  /* flush */
++    cc->tostore = 0;  /* no more items pending */
++  }
++}
++
++
++static void lastlistfield (FuncState *fs, struct ConsControl *cc) {
++  if (cc->tostore == 0) return;
++  if (hasmultret(cc->v.k)) {
++    luaK_setmultret(fs, &cc->v);
++    luaK_setlist(fs, cc->t->u.s.info, cc->na, LUA_MULTRET);
++    cc->na--;  /* do not count last expression (unknown number of elements) */
++  }
++  else {
++    if (cc->v.k != VVOID)
++      luaK_exp2nextreg(fs, &cc->v);
++    luaK_setlist(fs, cc->t->u.s.info, cc->na, cc->tostore);
++  }
++}
++
++
++static void listfield (LexState *ls, struct ConsControl *cc) {
++  expr(ls, &cc->v);
++  luaY_checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor");
++  cc->na++;
++  cc->tostore++;
++}
++
++
++static void constructor (LexState *ls, expdesc *t) {
++  /* constructor -> ?? */
++  FuncState *fs = ls->fs;
++  int line = ls->linenumber;
++  int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0);
++  struct ConsControl cc;
++  cc.na = cc.nh = cc.tostore = 0;
++  cc.t = t;
++  init_exp(t, VRELOCABLE, pc);
++  init_exp(&cc.v, VVOID, 0);  /* no value (yet) */
++  luaK_exp2nextreg(ls->fs, t);  /* fix it at stack top (for gc) */
++  checknext(ls, '{');
++  do {
++    lua_assert(cc.v.k == VVOID || cc.tostore > 0);
++    if (ls->t.token == '}') break;
++    closelistfield(fs, &cc);
++    switch(ls->t.token) {
++      case TK_NAME: {  /* may be listfields or recfields */
++        luaX_lookahead(ls);
++        if (ls->lookahead.token != '=')  /* expression? */
++          listfield(ls, &cc);
++        else
++          recfield(ls, &cc);
++        break;
++      }
++      case '[': {  /* constructor_item -> recfield */
++        recfield(ls, &cc);
++        break;
++      }
++      default: {  /* constructor_part -> listfield */
++        listfield(ls, &cc);
++        break;
++      }
++    }
++  } while (testnext(ls, ',') || testnext(ls, ';'));
++  check_match(ls, '}', '{', line);
++  lastlistfield(fs, &cc);
++  SETARG_B(fs->f->code[pc], luaO_int2fb(cc.na)); /* set initial array size */
++  SETARG_C(fs->f->code[pc], luaO_int2fb(cc.nh));  /* set initial table size */
++}
++
++/* }====================================================================== */
++
++
++
++static void parlist (LexState *ls) {
++  /* parlist -> [ param { `,' param } ] */
++  FuncState *fs = ls->fs;
++  Proto *f = fs->f;
++  int nparams = 0;
++  f->is_vararg = 0;
++  if (ls->t.token != ')') {  /* is `parlist' not empty? */
++    do {
++      switch (ls->t.token) {
++        case TK_NAME: {  /* param -> NAME */
++          new_localvar(ls, str_checkname(ls), nparams++);
++          break;
++        }
++        case TK_DOTS: {  /* param -> `...' */
++          luaX_next(ls);
++#if defined(LUA_COMPAT_VARARG)
++          /* use `arg' as default name */
++          new_localvarliteral(ls, "arg", nparams++);
++          f->is_vararg = VARARG_HASARG | VARARG_NEEDSARG;
++#endif
++          f->is_vararg |= VARARG_ISVARARG;
++          break;
++        }
++        default: luaX_syntaxerror(ls, "<name> or " LUA_QL("...") " expected");
++      }
++    } while (!f->is_vararg && testnext(ls, ','));
++  }
++  adjustlocalvars(ls, nparams);
++  f->numparams = cast_byte(fs->nactvar - (f->is_vararg & VARARG_HASARG));
++  luaK_reserveregs(fs, fs->nactvar);  /* reserve register for parameters */
++}
++
++
++static void body (LexState *ls, expdesc *e, int needself, int line) {
++  /* body ->  `(' parlist `)' chunk END */
++  FuncState new_fs;
++  open_func(ls, &new_fs);
++  new_fs.f->linedefined = line;
++  checknext(ls, '(');
++  if (needself) {
++    new_localvarliteral(ls, "self", 0);
++    adjustlocalvars(ls, 1);
++  }
++  parlist(ls);
++  checknext(ls, ')');
++  chunk(ls);
++  new_fs.f->lastlinedefined = ls->linenumber;
++  check_match(ls, TK_END, TK_FUNCTION, line);
++  close_func(ls);
++  pushclosure(ls, &new_fs, e);
++}
++
++
++static int explist1 (LexState *ls, expdesc *v) {
++  /* explist1 -> expr { `,' expr } */
++  int n = 1;  /* at least one expression */
++  expr(ls, v);
++  while (testnext(ls, ',')) {
++    luaK_exp2nextreg(ls->fs, v);
++    expr(ls, v);
++    n++;
++  }
++  return n;
++}
++
++
++static void funcargs (LexState *ls, expdesc *f) {
++  FuncState *fs = ls->fs;
++  expdesc args;
++  int base, nparams;
++  int line = ls->linenumber;
++  switch (ls->t.token) {
++    case '(': {  /* funcargs -> `(' [ explist1 ] `)' */
++      if (line != ls->lastline)
++        luaX_syntaxerror(ls,"ambiguous syntax (function call x new statement)");
++      luaX_next(ls);
++      if (ls->t.token == ')')  /* arg list is empty? */
++        args.k = VVOID;
++      else {
++        explist1(ls, &args);
++        luaK_setmultret(fs, &args);
++      }
++      check_match(ls, ')', '(', line);
++      break;
++    }
++    case '{': {  /* funcargs -> constructor */
++      constructor(ls, &args);
++      break;
++    }
++    case TK_STRING: {  /* funcargs -> STRING */
++      codestring(ls, &args, ls->t.seminfo.ts);
++      luaX_next(ls);  /* must use `seminfo' before `next' */
++      break;
++    }
++    default: {
++      luaX_syntaxerror(ls, "function arguments expected");
++      return;
++    }
++  }
++  lua_assert(f->k == VNONRELOC);
++  base = f->u.s.info;  /* base register for call */
++  if (hasmultret(args.k))
++    nparams = LUA_MULTRET;  /* open call */
++  else {
++    if (args.k != VVOID)
++      luaK_exp2nextreg(fs, &args);  /* close last argument */
++    nparams = fs->freereg - (base+1);
++  }
++  init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2));
++  luaK_fixline(fs, line);
++  fs->freereg = base+1;  /* call remove function and arguments and leaves
++                            (unless changed) one result */
++}
++
++
++
++
++/*
++** {======================================================================
++** Expression parsing
++** =======================================================================
++*/
++
++
++static void prefixexp (LexState *ls, expdesc *v) {
++  /* prefixexp -> NAME | '(' expr ')' */
++  switch (ls->t.token) {
++    case '(': {
++      int line = ls->linenumber;
++      luaX_next(ls);
++      expr(ls, v);
++      check_match(ls, ')', '(', line);
++      luaK_dischargevars(ls->fs, v);
++      return;
++    }
++    case TK_NAME: {
++      singlevar(ls, v);
++      return;
++    }
++    default: {
++      luaX_syntaxerror(ls, "unexpected symbol");
++      return;
++    }
++  }
++}
++
++
++static void primaryexp (LexState *ls, expdesc *v) {
++  /* primaryexp ->
++        prefixexp { `.' NAME | `[' exp `]' | `:' NAME funcargs | funcargs } */
++  FuncState *fs = ls->fs;
++  prefixexp(ls, v);
++  for (;;) {
++    switch (ls->t.token) {
++      case '.': {  /* field */
++        field(ls, v);
++        break;
++      }
++      case '[': {  /* `[' exp1 `]' */
++        expdesc key;
++        luaK_exp2anyreg(fs, v);
++        yindex(ls, &key);
++        luaK_indexed(fs, v, &key);
++        break;
++      }
++      case ':': {  /* `:' NAME funcargs */
++        expdesc key;
++        luaX_next(ls);
++        checkname(ls, &key);
++        luaK_self(fs, v, &key);
++        funcargs(ls, v);
++        break;
++      }
++      case '(': case TK_STRING: case '{': {  /* funcargs */
++        luaK_exp2nextreg(fs, v);
++        funcargs(ls, v);
++        break;
++      }
++      default: return;
++    }
++  }
++}
++
++
++static void simpleexp (LexState *ls, expdesc *v) {
++  /* simpleexp -> NUMBER | STRING | NIL | true | false | ... |
++                  constructor | FUNCTION body | primaryexp */
++  switch (ls->t.token) {
++    case TK_NUMBER: {
++      init_exp(v, VKNUM, 0);
++      v->u.nval = ls->t.seminfo.r;
++      break;
++    }
++    case TK_STRING: {
++      codestring(ls, v, ls->t.seminfo.ts);
++      break;
++    }
++    case TK_NIL: {
++      init_exp(v, VNIL, 0);
++      break;
++    }
++    case TK_TRUE: {
++      init_exp(v, VTRUE, 0);
++      break;
++    }
++    case TK_FALSE: {
++      init_exp(v, VFALSE, 0);
++      break;
++    }
++    case TK_DOTS: {  /* vararg */
++      FuncState *fs = ls->fs;
++      check_condition(ls, fs->f->is_vararg,
++                      "cannot use " LUA_QL("...") " outside a vararg function");
++      fs->f->is_vararg &= ~VARARG_NEEDSARG;  /* don't need 'arg' */
++      init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 1, 0));
++      break;
++    }
++    case '{': {  /* constructor */
++      constructor(ls, v);
++      return;
++    }
++    case TK_FUNCTION: {
++      luaX_next(ls);
++      body(ls, v, 0, ls->linenumber);
++      return;
++    }
++    default: {
++      primaryexp(ls, v);
++      return;
++    }
++  }
++  luaX_next(ls);
++}
++
++
++static UnOpr getunopr (int op) {
++  switch (op) {
++    case TK_NOT: return OPR_NOT;
++    case '-': return OPR_MINUS;
++    case '#': return OPR_LEN;
++    default: return OPR_NOUNOPR;
++  }
++}
++
++
++static BinOpr getbinopr (int op) {
++  switch (op) {
++    case '+': return OPR_ADD;
++    case '-': return OPR_SUB;
++    case '*': return OPR_MUL;
++    case '/': return OPR_DIV;
++    case '%': return OPR_MOD;
++    case '^': return OPR_POW;
++    case TK_CONCAT: return OPR_CONCAT;
++    case TK_NE: return OPR_NE;
++    case TK_EQ: return OPR_EQ;
++    case '<': return OPR_LT;
++    case TK_LE: return OPR_LE;
++    case '>': return OPR_GT;
++    case TK_GE: return OPR_GE;
++    case TK_AND: return OPR_AND;
++    case TK_OR: return OPR_OR;
++    default: return OPR_NOBINOPR;
++  }
++}
++
++
++static const struct {
++  lu_byte left;  /* left priority for each binary operator */
++  lu_byte right; /* right priority */
++} priority[] = {  /* ORDER OPR */
++   {6, 6}, {6, 6}, {7, 7}, {7, 7}, {7, 7},  /* `+' `-' `/' `%' */
++   {10, 9}, {5, 4},                 /* power and concat (right associative) */
++   {3, 3}, {3, 3},                  /* equality and inequality */
++   {3, 3}, {3, 3}, {3, 3}, {3, 3},  /* order */
++   {2, 2}, {1, 1}                   /* logical (and/or) */
++};
++
++#define UNARY_PRIORITY        8  /* priority for unary operators */
++
++
++/*
++** subexpr -> (simpleexp | unop subexpr) { binop subexpr }
++** where `binop' is any binary operator with a priority higher than `limit'
++*/
++static BinOpr subexpr (LexState *ls, expdesc *v, unsigned int limit) {
++  BinOpr op;
++  UnOpr uop;
++  enterlevel(ls);
++  uop = getunopr(ls->t.token);
++  if (uop != OPR_NOUNOPR) {
++    luaX_next(ls);
++    subexpr(ls, v, UNARY_PRIORITY);
++    luaK_prefix(ls->fs, uop, v);
++  }
++  else simpleexp(ls, v);
++  /* expand while operators have priorities higher than `limit' */
++  op = getbinopr(ls->t.token);
++  while (op != OPR_NOBINOPR && priority[op].left > limit) {
++    expdesc v2;
++    BinOpr nextop;
++    luaX_next(ls);
++    luaK_infix(ls->fs, op, v);
++    /* read sub-expression with higher priority */
++    nextop = subexpr(ls, &v2, priority[op].right);
++    luaK_posfix(ls->fs, op, v, &v2);
++    op = nextop;
++  }
++  leavelevel(ls);
++  return op;  /* return first untreated operator */
++}
++
++
++static void expr (LexState *ls, expdesc *v) {
++  subexpr(ls, v, 0);
++}
++
++/* }==================================================================== */
++
++
++
++/*
++** {======================================================================
++** Rules for Statements
++** =======================================================================
++*/
++
++
++static int block_follow (int token) {
++  switch (token) {
++    case TK_ELSE: case TK_ELSEIF: case TK_END:
++    case TK_UNTIL: case TK_EOS:
++      return 1;
++    default: return 0;
++  }
++}
++
++
++static void block (LexState *ls) {
++  /* block -> chunk */
++  FuncState *fs = ls->fs;
++  BlockCnt bl;
++  enterblock(fs, &bl, 0);
++  chunk(ls);
++  lua_assert(bl.breaklist == NO_JUMP);
++  leaveblock(fs);
++}
++
++
++/*
++** structure to chain all variables in the left-hand side of an
++** assignment
++*/
++struct LHS_assign {
++  struct LHS_assign *prev;
++  expdesc v;  /* variable (global, local, upvalue, or indexed) */
++};
++
++
++/*
++** check whether, in an assignment to a local variable, the local variable
++** is needed in a previous assignment (to a table). If so, save original
++** local value in a safe place and use this safe copy in the previous
++** assignment.
++*/
++static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) {
++  FuncState *fs = ls->fs;
++  int extra = fs->freereg;  /* eventual position to save local variable */
++  int conflict = 0;
++  for (; lh; lh = lh->prev) {
++    if (lh->v.k == VINDEXED) {
++      if (lh->v.u.s.info == v->u.s.info) {  /* conflict? */
++        conflict = 1;
++        lh->v.u.s.info = extra;  /* previous assignment will use safe copy */
++      }
++      if (lh->v.u.s.aux == v->u.s.info) {  /* conflict? */
++        conflict = 1;
++        lh->v.u.s.aux = extra;  /* previous assignment will use safe copy */
++      }
++    }
++  }
++  if (conflict) {
++    luaK_codeABC(fs, OP_MOVE, fs->freereg, v->u.s.info, 0);  /* make copy */
++    luaK_reserveregs(fs, 1);
++  }
++}
++
++
++static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) {
++  expdesc e;
++  check_condition(ls, VLOCAL <= lh->v.k && lh->v.k <= VINDEXED,
++                      "syntax error");
++  if (testnext(ls, ',')) {  /* assignment -> `,' primaryexp assignment */
++    struct LHS_assign nv;
++    nv.prev = lh;
++    primaryexp(ls, &nv.v);
++    if (nv.v.k == VLOCAL)
++      check_conflict(ls, lh, &nv.v);
++    luaY_checklimit(ls->fs, nvars, LUAI_MAXCCALLS - ls->L->nCcalls,
++                    "variables in assignment");
++    assignment(ls, &nv, nvars+1);
++  }
++  else {  /* assignment -> `=' explist1 */
++    int nexps;
++    checknext(ls, '=');
++    nexps = explist1(ls, &e);
++    if (nexps != nvars) {
++      adjust_assign(ls, nvars, nexps, &e);
++      if (nexps > nvars)
++        ls->fs->freereg -= nexps - nvars;  /* remove extra values */
++    }
++    else {
++      luaK_setoneret(ls->fs, &e);  /* close last expression */
++      luaK_storevar(ls->fs, &lh->v, &e);
++      return;  /* avoid default */
++    }
++  }
++  init_exp(&e, VNONRELOC, ls->fs->freereg-1);  /* default assignment */
++  luaK_storevar(ls->fs, &lh->v, &e);
++}
++
++
++static int cond (LexState *ls) {
++  /* cond -> exp */
++  expdesc v;
++  expr(ls, &v);  /* read condition */
++  if (v.k == VNIL) v.k = VFALSE;  /* `falses' are all equal here */
++  luaK_goiftrue(ls->fs, &v);
++  return v.f;
++}
++
++
++static void breakstat (LexState *ls) {
++  FuncState *fs = ls->fs;
++  BlockCnt *bl = fs->bl;
++  int upval = 0;
++  while (bl && !bl->isbreakable) {
++    upval |= bl->upval;
++    bl = bl->previous;
++  }
++  if (!bl)
++    luaX_syntaxerror(ls, "no loop to break");
++  if (upval)
++    luaK_codeABC(fs, OP_CLOSE, bl->nactvar, 0, 0);
++  luaK_concat(fs, &bl->breaklist, luaK_jump(fs));
++}
++
++
++static void whilestat (LexState *ls, int line) {
++  /* whilestat -> WHILE cond DO block END */
++  FuncState *fs = ls->fs;
++  int whileinit;
++  int condexit;
++  BlockCnt bl;
++  luaX_next(ls);  /* skip WHILE */
++  whileinit = luaK_getlabel(fs);
++  condexit = cond(ls);
++  enterblock(fs, &bl, 1);
++  checknext(ls, TK_DO);
++  block(ls);
++  luaK_patchlist(fs, luaK_jump(fs), whileinit);
++  check_match(ls, TK_END, TK_WHILE, line);
++  leaveblock(fs);
++  luaK_patchtohere(fs, condexit);  /* false conditions finish the loop */
++}
++
++
++static void repeatstat (LexState *ls, int line) {
++  /* repeatstat -> REPEAT block UNTIL cond */
++  int condexit;
++  FuncState *fs = ls->fs;
++  int repeat_init = luaK_getlabel(fs);
++  BlockCnt bl1, bl2;
++  enterblock(fs, &bl1, 1);  /* loop block */
++  enterblock(fs, &bl2, 0);  /* scope block */
++  luaX_next(ls);  /* skip REPEAT */
++  chunk(ls);
++  check_match(ls, TK_UNTIL, TK_REPEAT, line);
++  condexit = cond(ls);  /* read condition (inside scope block) */
++  if (!bl2.upval) {  /* no upvalues? */
++    leaveblock(fs);  /* finish scope */
++    luaK_patchlist(ls->fs, condexit, repeat_init);  /* close the loop */
++  }
++  else {  /* complete semantics when there are upvalues */
++    breakstat(ls);  /* if condition then break */
++    luaK_patchtohere(ls->fs, condexit);  /* else... */
++    leaveblock(fs);  /* finish scope... */
++    luaK_patchlist(ls->fs, luaK_jump(fs), repeat_init);  /* and repeat */
++  }
++  leaveblock(fs);  /* finish loop */
++}
++
++
++static int exp1 (LexState *ls) {
++  expdesc e;
++  int k;
++  expr(ls, &e);
++  k = e.k;
++  luaK_exp2nextreg(ls->fs, &e);
++  return k;
++}
++
++
++static void forbody (LexState *ls, int base, int line, int nvars, int isnum) {
++  /* forbody -> DO block */
++  BlockCnt bl;
++  FuncState *fs = ls->fs;
++  int prep, endfor;
++  adjustlocalvars(ls, 3);  /* control variables */
++  checknext(ls, TK_DO);
++  prep = isnum ? luaK_codeAsBx(fs, OP_FORPREP, base, NO_JUMP) : luaK_jump(fs);
++  enterblock(fs, &bl, 0);  /* scope for declared variables */
++  adjustlocalvars(ls, nvars);
++  luaK_reserveregs(fs, nvars);
++  block(ls);
++  leaveblock(fs);  /* end of scope for declared variables */
++  luaK_patchtohere(fs, prep);
++  endfor = (isnum) ? luaK_codeAsBx(fs, OP_FORLOOP, base, NO_JUMP) :
++                     luaK_codeABC(fs, OP_TFORLOOP, base, 0, nvars);
++  luaK_fixline(fs, line);  /* pretend that `OP_FOR' starts the loop */
++  luaK_patchlist(fs, (isnum ? endfor : luaK_jump(fs)), prep + 1);
++}
++
++
++static void fornum (LexState *ls, TString *varname, int line) {
++  /* fornum -> NAME = exp1,exp1[,exp1] forbody */
++  FuncState *fs = ls->fs;
++  int base = fs->freereg;
++  new_localvarliteral(ls, "(for index)", 0);
++  new_localvarliteral(ls, "(for limit)", 1);
++  new_localvarliteral(ls, "(for step)", 2);
++  new_localvar(ls, varname, 3);
++  checknext(ls, '=');
++  exp1(ls);  /* initial value */
++  checknext(ls, ',');
++  exp1(ls);  /* limit */
++  if (testnext(ls, ','))
++    exp1(ls);  /* optional step */
++  else {  /* default step = 1 */
++    luaK_codeABx(fs, OP_LOADK, fs->freereg, luaK_numberK(fs, 1));
++    luaK_reserveregs(fs, 1);
++  }
++  forbody(ls, base, line, 1, 1);
++}
++
++
++static void forlist (LexState *ls, TString *indexname) {
++  /* forlist -> NAME {,NAME} IN explist1 forbody */
++  FuncState *fs = ls->fs;
++  expdesc e;
++  int nvars = 0;
++  int line;
++  int base = fs->freereg;
++  /* create control variables */
++  new_localvarliteral(ls, "(for generator)", nvars++);
++  new_localvarliteral(ls, "(for state)", nvars++);
++  new_localvarliteral(ls, "(for control)", nvars++);
++  /* create declared variables */
++  new_localvar(ls, indexname, nvars++);
++  while (testnext(ls, ','))
++    new_localvar(ls, str_checkname(ls), nvars++);
++  checknext(ls, TK_IN);
++  line = ls->linenumber;
++  adjust_assign(ls, 3, explist1(ls, &e), &e);
++  luaK_checkstack(fs, 3);  /* extra space to call generator */
++  forbody(ls, base, line, nvars - 3, 0);
++}
++
++
++static void forstat (LexState *ls, int line) {
++  /* forstat -> FOR (fornum | forlist) END */
++  FuncState *fs = ls->fs;
++  TString *varname;
++  BlockCnt bl;
++  enterblock(fs, &bl, 1);  /* scope for loop and control variables */
++  luaX_next(ls);  /* skip `for' */
++  varname = str_checkname(ls);  /* first variable name */
++  switch (ls->t.token) {
++    case '=': fornum(ls, varname, line); break;
++    case ',': case TK_IN: forlist(ls, varname); break;
++    default: luaX_syntaxerror(ls, LUA_QL("=") " or " LUA_QL("in") " expected");
++  }
++  check_match(ls, TK_END, TK_FOR, line);
++  leaveblock(fs);  /* loop scope (`break' jumps to this point) */
++}
++
++
++static int test_then_block (LexState *ls) {
++  /* test_then_block -> [IF | ELSEIF] cond THEN block */
++  int condexit;
++  luaX_next(ls);  /* skip IF or ELSEIF */
++  condexit = cond(ls);
++  checknext(ls, TK_THEN);
++  block(ls);  /* `then' part */
++  return condexit;
++}
++
++
++static void ifstat (LexState *ls, int line) {
++  /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */
++  FuncState *fs = ls->fs;
++  int flist;
++  int escapelist = NO_JUMP;
++  flist = test_then_block(ls);  /* IF cond THEN block */
++  while (ls->t.token == TK_ELSEIF) {
++    luaK_concat(fs, &escapelist, luaK_jump(fs));
++    luaK_patchtohere(fs, flist);
++    flist = test_then_block(ls);  /* ELSEIF cond THEN block */
++  }
++  if (ls->t.token == TK_ELSE) {
++    luaK_concat(fs, &escapelist, luaK_jump(fs));
++    luaK_patchtohere(fs, flist);
++    luaX_next(ls);  /* skip ELSE (after patch, for correct line info) */
++    block(ls);  /* `else' part */
++  }
++  else
++    luaK_concat(fs, &escapelist, flist);
++  luaK_patchtohere(fs, escapelist);
++  check_match(ls, TK_END, TK_IF, line);
++}
++
++
++static void localfunc (LexState *ls) {
++  expdesc v, b;
++  FuncState *fs = ls->fs;
++  new_localvar(ls, str_checkname(ls), 0);
++  init_exp(&v, VLOCAL, fs->freereg);
++  luaK_reserveregs(fs, 1);
++  adjustlocalvars(ls, 1);
++  body(ls, &b, 0, ls->linenumber);
++  luaK_storevar(fs, &v, &b);
++  /* debug information will only see the variable after this point! */
++  getlocvar(fs, fs->nactvar - 1).startpc = fs->pc;
++}
++
++
++static void localstat (LexState *ls) {
++  /* stat -> LOCAL NAME {`,' NAME} [`=' explist1] */
++  int nvars = 0;
++  int nexps;
++  expdesc e;
++  do {
++    new_localvar(ls, str_checkname(ls), nvars++);
++  } while (testnext(ls, ','));
++  if (testnext(ls, '='))
++    nexps = explist1(ls, &e);
++  else {
++    e.k = VVOID;
++    nexps = 0;
++  }
++  adjust_assign(ls, nvars, nexps, &e);
++  adjustlocalvars(ls, nvars);
++}
++
++
++static int funcname (LexState *ls, expdesc *v) {
++  /* funcname -> NAME {field} [`:' NAME] */
++  int needself = 0;
++  singlevar(ls, v);
++  while (ls->t.token == '.')
++    field(ls, v);
++  if (ls->t.token == ':') {
++    needself = 1;
++    field(ls, v);
++  }
++  return needself;
++}
++
++
++static void funcstat (LexState *ls, int line) {
++  /* funcstat -> FUNCTION funcname body */
++  int needself;
++  expdesc v, b;
++  luaX_next(ls);  /* skip FUNCTION */
++  needself = funcname(ls, &v);
++  body(ls, &b, needself, line);
++  luaK_storevar(ls->fs, &v, &b);
++  luaK_fixline(ls->fs, line);  /* definition `happens' in the first line */
++}
++
++
++static void exprstat (LexState *ls) {
++  /* stat -> func | assignment */
++  FuncState *fs = ls->fs;
++  struct LHS_assign v;
++  primaryexp(ls, &v.v);
++  if (v.v.k == VCALL)  /* stat -> func */
++    SETARG_C(getcode(fs, &v.v), 1);  /* call statement uses no results */
++  else {  /* stat -> assignment */
++    v.prev = NULL;
++    assignment(ls, &v, 1);
++  }
++}
++
++
++static void retstat (LexState *ls) {
++  /* stat -> RETURN explist */
++  FuncState *fs = ls->fs;
++  expdesc e;
++  int first, nret;  /* registers with returned values */
++  luaX_next(ls);  /* skip RETURN */
++  if (block_follow(ls->t.token) || ls->t.token == ';')
++    first = nret = 0;  /* return no values */
++  else {
++    nret = explist1(ls, &e);  /* optional return values */
++    if (hasmultret(e.k)) {
++      luaK_setmultret(fs, &e);
++      if (e.k == VCALL && nret == 1) {  /* tail call? */
++        SET_OPCODE(getcode(fs,&e), OP_TAILCALL);
++        lua_assert(GETARG_A(getcode(fs,&e)) == fs->nactvar);
++      }
++      first = fs->nactvar;
++      nret = LUA_MULTRET;  /* return all values */
++    }
++    else {
++      if (nret == 1)  /* only one single value? */
++        first = luaK_exp2anyreg(fs, &e);
++      else {
++        luaK_exp2nextreg(fs, &e);  /* values must go to the `stack' */
++        first = fs->nactvar;  /* return all `active' values */
++        lua_assert(nret == fs->freereg - first);
++      }
++    }
++  }
++  luaK_ret(fs, first, nret);
++}
++
++
++static int statement (LexState *ls) {
++  int line = ls->linenumber;  /* may be needed for error messages */
++  switch (ls->t.token) {
++    case TK_IF: {  /* stat -> ifstat */
++      ifstat(ls, line);
++      return 0;
++    }
++    case TK_WHILE: {  /* stat -> whilestat */
++      whilestat(ls, line);
++      return 0;
++    }
++    case TK_DO: {  /* stat -> DO block END */
++      luaX_next(ls);  /* skip DO */
++      block(ls);
++      check_match(ls, TK_END, TK_DO, line);
++      return 0;
++    }
++    case TK_FOR: {  /* stat -> forstat */
++      forstat(ls, line);
++      return 0;
++    }
++    case TK_REPEAT: {  /* stat -> repeatstat */
++      repeatstat(ls, line);
++      return 0;
++    }
++    case TK_FUNCTION: {
++      funcstat(ls, line);  /* stat -> funcstat */
++      return 0;
++    }
++    case TK_LOCAL: {  /* stat -> localstat */
++      luaX_next(ls);  /* skip LOCAL */
++      if (testnext(ls, TK_FUNCTION))  /* local function? */
++        localfunc(ls);
++      else
++        localstat(ls);
++      return 0;
++    }
++    case TK_RETURN: {  /* stat -> retstat */
++      retstat(ls);
++      return 1;  /* must be last statement */
++    }
++    case TK_BREAK: {  /* stat -> breakstat */
++      luaX_next(ls);  /* skip BREAK */
++      breakstat(ls);
++      return 1;  /* must be last statement */
++    }
++    default: {
++      exprstat(ls);
++      return 0;  /* to avoid warnings */
++    }
++  }
++}
++
++
++static void chunk (LexState *ls) {
++  /* chunk -> { stat [`;'] } */
++  int islast = 0;
++  enterlevel(ls);
++  while (!islast && !block_follow(ls->t.token)) {
++    islast = statement(ls);
++    testnext(ls, ';');
++    lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg &&
++               ls->fs->freereg >= ls->fs->nactvar);
++    ls->fs->freereg = ls->fs->nactvar;  /* free registers */
++  }
++  leavelevel(ls);
++}
++
++/* }====================================================================== */
+--- /dev/null
++++ b/extensions/LUA/lua/lparser.h
+@@ -0,0 +1,82 @@
++/*
++** $Id: lparser.h,v 1.57.1.1 2007/12/27 13:02:25 roberto Exp $
++** Lua Parser
++** See Copyright Notice in lua.h
++*/
++
++#ifndef lparser_h
++#define lparser_h
++
++#include "llimits.h"
++#include "lobject.h"
++#include "lzio.h"
++
++
++/*
++** Expression descriptor
++*/
++
++typedef enum {
++  VVOID,      /* no value */
++  VNIL,
++  VTRUE,
++  VFALSE,
++  VK,         /* info = index of constant in `k' */
++  VKNUM,      /* nval = numerical value */
++  VLOCAL,     /* info = local register */
++  VUPVAL,       /* info = index of upvalue in `upvalues' */
++  VGLOBAL,    /* info = index of table; aux = index of global name in `k' */
++  VINDEXED,   /* info = table register; aux = index register (or `k') */
++  VJMP,               /* info = instruction pc */
++  VRELOCABLE, /* info = instruction pc */
++  VNONRELOC,  /* info = result register */
++  VCALL,      /* info = instruction pc */
++  VVARARG     /* info = instruction pc */
++} expkind;
++
++typedef struct expdesc {
++  expkind k;
++  union {
++    struct { int info, aux; } s;
++    lua_Number nval;
++  } u;
++  int t;  /* patch list of `exit when true' */
++  int f;  /* patch list of `exit when false' */
++} expdesc;
++
++
++typedef struct upvaldesc {
++  lu_byte k;
++  lu_byte info;
++} upvaldesc;
++
++
++struct BlockCnt;  /* defined in lparser.c */
++
++
++/* state needed to generate code for a given function */
++typedef struct FuncState {
++  Proto *f;  /* current function header */
++  Table *h;  /* table to find (and reuse) elements in `k' */
++  struct FuncState *prev;  /* enclosing function */
++  struct LexState *ls;  /* lexical state */
++  struct lua_State *L;  /* copy of the Lua state */
++  struct BlockCnt *bl;  /* chain of current blocks */
++  int pc;  /* next position to code (equivalent to `ncode') */
++  int lasttarget;   /* `pc' of last `jump target' */
++  int jpc;  /* list of pending jumps to `pc' */
++  int freereg;  /* first free register */
++  int nk;  /* number of elements in `k' */
++  int np;  /* number of elements in `p' */
++  short nlocvars;  /* number of elements in `locvars' */
++  lu_byte nactvar;  /* number of active local variables */
++  upvaldesc upvalues[LUAI_MAXUPVALUES];  /* upvalues */
++  unsigned short actvar[LUAI_MAXVARS];  /* declared-variable stack */
++} FuncState;
++
++
++LUAI_FUNC Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff,
++                                            const char *name);
++
++
++#endif
+--- /dev/null
++++ b/extensions/LUA/lua/lstate.c
+@@ -0,0 +1,214 @@
++/*
++** $Id: lstate.c,v 2.36.1.2 2008/01/03 15:20:39 roberto Exp $
++** Global State
++** See Copyright Notice in lua.h
++*/
++
++
++#include <stddef.h>
++
++#define lstate_c
++#define LUA_CORE
++
++#include "lua.h"
++
++#include "ldebug.h"
++#include "ldo.h"
++#include "lfunc.h"
++#include "lgc.h"
++#include "llex.h"
++#include "lmem.h"
++#include "lstate.h"
++#include "lstring.h"
++#include "ltable.h"
++#include "ltm.h"
++
++
++#define state_size(x) (sizeof(x) + LUAI_EXTRASPACE)
++#define fromstate(l)  (cast(lu_byte *, (l)) - LUAI_EXTRASPACE)
++#define tostate(l)   (cast(lua_State *, cast(lu_byte *, l) + LUAI_EXTRASPACE))
++
++
++/*
++** Main thread combines a thread state and the global state
++*/
++typedef struct LG {
++  lua_State l;
++  global_State g;
++} LG;
++  
++
++
++static void stack_init (lua_State *L1, lua_State *L) {
++  /* initialize CallInfo array */
++  L1->base_ci = luaM_newvector(L, BASIC_CI_SIZE, CallInfo);
++  L1->ci = L1->base_ci;
++  L1->size_ci = BASIC_CI_SIZE;
++  L1->end_ci = L1->base_ci + L1->size_ci - 1;
++  /* initialize stack array */
++  L1->stack = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, TValue);
++  L1->stacksize = BASIC_STACK_SIZE + EXTRA_STACK;
++  L1->top = L1->stack;
++  L1->stack_last = L1->stack+(L1->stacksize - EXTRA_STACK)-1;
++  /* initialize first ci */
++  L1->ci->func = L1->top;
++  setnilvalue(L1->top++);  /* `function' entry for this `ci' */
++  L1->base = L1->ci->base = L1->top;
++  L1->ci->top = L1->top + LUA_MINSTACK;
++}
++
++
++static void freestack (lua_State *L, lua_State *L1) {
++  luaM_freearray(L, L1->base_ci, L1->size_ci, CallInfo);
++  luaM_freearray(L, L1->stack, L1->stacksize, TValue);
++}
++
++
++/*
++** open parts that may cause memory-allocation errors
++*/
++static void f_luaopen (lua_State *L, void *ud) {
++  global_State *g = G(L);
++  UNUSED(ud);
++  stack_init(L, L);  /* init stack */
++  sethvalue(L, gt(L), luaH_new(L, 0, 2));  /* table of globals */
++  sethvalue(L, registry(L), luaH_new(L, 0, 2));  /* registry */
++  luaS_resize(L, MINSTRTABSIZE);  /* initial size of string table */
++  luaT_init(L);
++  luaX_init(L);
++  luaS_fix(luaS_newliteral(L, MEMERRMSG));
++  g->GCthreshold = 4*g->totalbytes;
++}
++
++
++static void preinit_state (lua_State *L, global_State *g) {
++  G(L) = g;
++  L->stack = NULL;
++  L->stacksize = 0;
++  L->errorJmp = NULL;
++  L->hook = NULL;
++  L->hookmask = 0;
++  L->basehookcount = 0;
++  L->allowhook = 1;
++  resethookcount(L);
++  L->openupval = NULL;
++  L->size_ci = 0;
++  L->nCcalls = L->baseCcalls = 0;
++  L->status = 0;
++  L->base_ci = L->ci = NULL;
++  L->savedpc = NULL;
++  L->errfunc = 0;
++  setnilvalue(gt(L));
++}
++
++
++static void close_state (lua_State *L) {
++  global_State *g = G(L);
++  luaF_close(L, L->stack);  /* close all upvalues for this thread */
++  luaC_freeall(L);  /* collect all objects */
++  lua_assert(g->rootgc == obj2gco(L));
++  lua_assert(g->strt.nuse == 0);
++  luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size, TString *);
++  luaZ_freebuffer(L, &g->buff);
++  freestack(L, L);
++  lua_assert(g->totalbytes == sizeof(LG));
++  (*g->frealloc)(g->ud, fromstate(L), state_size(LG), 0);
++}
++
++
++lua_State *luaE_newthread (lua_State *L) {
++  lua_State *L1 = tostate(luaM_malloc(L, state_size(lua_State)));
++  luaC_link(L, obj2gco(L1), LUA_TTHREAD);
++  preinit_state(L1, G(L));
++  stack_init(L1, L);  /* init stack */
++  setobj2n(L, gt(L1), gt(L));  /* share table of globals */
++  L1->hookmask = L->hookmask;
++  L1->basehookcount = L->basehookcount;
++  L1->hook = L->hook;
++  resethookcount(L1);
++  lua_assert(iswhite(obj2gco(L1)));
++  return L1;
++}
++
++
++void luaE_freethread (lua_State *L, lua_State *L1) {
++  luaF_close(L1, L1->stack);  /* close all upvalues for this thread */
++  lua_assert(L1->openupval == NULL);
++  luai_userstatefree(L1);
++  freestack(L, L1);
++  luaM_freemem(L, fromstate(L1), state_size(lua_State));
++}
++
++
++LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {
++  int i;
++  lua_State *L;
++  global_State *g;
++  void *l = (*f)(ud, NULL, 0, state_size(LG));
++  if (l == NULL) return NULL;
++  L = tostate(l);
++  g = &((LG *)L)->g;
++  L->next = NULL;
++  L->tt = LUA_TTHREAD;
++  g->currentwhite = bit2mask(WHITE0BIT, FIXEDBIT);
++  L->marked = luaC_white(g);
++  set2bits(L->marked, FIXEDBIT, SFIXEDBIT);
++  preinit_state(L, g);
++  g->frealloc = f;
++  g->ud = ud;
++  g->mainthread = L;
++  g->uvhead.u.l.prev = &g->uvhead;
++  g->uvhead.u.l.next = &g->uvhead;
++  g->GCthreshold = 0;  /* mark it as unfinished state */
++  g->strt.size = 0;
++  g->strt.nuse = 0;
++  g->strt.hash = NULL;
++  setnilvalue(registry(L));
++  luaZ_initbuffer(L, &g->buff);
++  g->panic = NULL;
++  g->gcstate = GCSpause;
++  g->rootgc = obj2gco(L);
++  g->sweepstrgc = 0;
++  g->sweepgc = &g->rootgc;
++  g->gray = NULL;
++  g->grayagain = NULL;
++  g->weak = NULL;
++  g->tmudata = NULL;
++  g->totalbytes = sizeof(LG);
++  g->gcpause = LUAI_GCPAUSE;
++  g->gcstepmul = LUAI_GCMUL;
++  g->gcdept = 0;
++  for (i=0; i<NUM_TAGS; i++) g->mt[i] = NULL;
++  if (luaD_rawrunprotected(L, f_luaopen, NULL) != 0) {
++    /* memory allocation error: free partial state */
++    close_state(L);
++    L = NULL;
++  }
++  else
++    luai_userstateopen(L);
++  return L;
++}
++
++
++static void callallgcTM (lua_State *L, void *ud) {
++  UNUSED(ud);
++  luaC_callGCTM(L);  /* call GC metamethods for all udata */
++}
++
++
++LUA_API void lua_close (lua_State *L) {
++  L = G(L)->mainthread;  /* only the main thread can be closed */
++  lua_lock(L);
++  luaF_close(L, L->stack);  /* close all upvalues for this thread */
++  luaC_separateudata(L, 1);  /* separate udata that have GC metamethods */
++  L->errfunc = 0;  /* no error function during GC metamethods */
++  do {  /* repeat until no more errors */
++    L->ci = L->base_ci;
++    L->base = L->top = L->ci->base;
++    L->nCcalls = L->baseCcalls = 0;
++  } while (luaD_rawrunprotected(L, callallgcTM, NULL) != 0);
++  lua_assert(G(L)->tmudata == NULL);
++  luai_userstateclose(L);
++  close_state(L);
++}
++
+--- /dev/null
++++ b/extensions/LUA/lua/lstate.h
+@@ -0,0 +1,169 @@
++/*
++** $Id: lstate.h,v 2.24.1.2 2008/01/03 15:20:39 roberto Exp $
++** Global State
++** See Copyright Notice in lua.h
++*/
++
++#ifndef lstate_h
++#define lstate_h
++
++#include "lua.h"
++
++#include "lobject.h"
++#include "ltm.h"
++#include "lzio.h"
++
++
++
++struct lua_longjmp;  /* defined in ldo.c */
++
++
++/* table of globals */
++#define gt(L) (&L->l_gt)
++
++/* registry */
++#define registry(L)   (&G(L)->l_registry)
++
++
++/* extra stack space to handle TM calls and some other extras */
++#define EXTRA_STACK   5
++
++
++#define BASIC_CI_SIZE           8
++
++#define BASIC_STACK_SIZE        (2*LUA_MINSTACK)
++
++
++
++typedef struct stringtable {
++  GCObject **hash;
++  lu_int32 nuse;  /* number of elements */
++  int size;
++} stringtable;
++
++
++/*
++** informations about a call
++*/
++typedef struct CallInfo {
++  StkId base;  /* base for this function */
++  StkId func;  /* function index in the stack */
++  StkId       top;  /* top for this function */
++  const Instruction *savedpc;
++  int nresults;  /* expected number of results from this function */
++  int tailcalls;  /* number of tail calls lost under this entry */
++} CallInfo;
++
++
++
++#define curr_func(L)  (clvalue(L->ci->func))
++#define ci_func(ci)   (clvalue((ci)->func))
++#define f_isLua(ci)   (!ci_func(ci)->c.isC)
++#define isLua(ci)     (ttisfunction((ci)->func) && f_isLua(ci))
++
++
++/*
++** `global state', shared by all threads of this state
++*/
++typedef struct global_State {
++  stringtable strt;  /* hash table for strings */
++  lua_Alloc frealloc;  /* function to reallocate memory */
++  void *ud;         /* auxiliary data to `frealloc' */
++  lu_byte currentwhite;
++  lu_byte gcstate;  /* state of garbage collector */
++  int sweepstrgc;  /* position of sweep in `strt' */
++  GCObject *rootgc;  /* list of all collectable objects */
++  GCObject **sweepgc;  /* position of sweep in `rootgc' */
++  GCObject *gray;  /* list of gray objects */
++  GCObject *grayagain;  /* list of objects to be traversed atomically */
++  GCObject *weak;  /* list of weak tables (to be cleared) */
++  GCObject *tmudata;  /* last element of list of userdata to be GC */
++  Mbuffer buff;  /* temporary buffer for string concatentation */
++  lu_mem GCthreshold;
++  lu_mem totalbytes;  /* number of bytes currently allocated */
++  lu_mem estimate;  /* an estimate of number of bytes actually in use */
++  lu_mem gcdept;  /* how much GC is `behind schedule' */
++  int gcpause;  /* size of pause between successive GCs */
++  int gcstepmul;  /* GC `granularity' */
++  lua_CFunction panic;  /* to be called in unprotected errors */
++  TValue l_registry;
++  struct lua_State *mainthread;
++  UpVal uvhead;  /* head of double-linked list of all open upvalues */
++  struct Table *mt[NUM_TAGS];  /* metatables for basic types */
++  TString *tmname[TM_N];  /* array with tag-method names */
++} global_State;
++
++
++/*
++** `per thread' state
++*/
++struct lua_State {
++  CommonHeader;
++  lu_byte status;
++  StkId top;  /* first free slot in the stack */
++  StkId base;  /* base of current function */
++  global_State *l_G;
++  CallInfo *ci;  /* call info for current function */
++  const Instruction *savedpc;  /* `savedpc' of current function */
++  StkId stack_last;  /* last free slot in the stack */
++  StkId stack;  /* stack base */
++  CallInfo *end_ci;  /* points after end of ci array*/
++  CallInfo *base_ci;  /* array of CallInfo's */
++  int stacksize;
++  int size_ci;  /* size of array `base_ci' */
++  unsigned short nCcalls;  /* number of nested C calls */
++  unsigned short baseCcalls;  /* nested C calls when resuming coroutine */
++  lu_byte hookmask;
++  lu_byte allowhook;
++  int basehookcount;
++  int hookcount;
++  lua_Hook hook;
++  TValue l_gt;  /* table of globals */
++  TValue env;  /* temporary place for environments */
++  GCObject *openupval;  /* list of open upvalues in this stack */
++  GCObject *gclist;
++  struct lua_longjmp *errorJmp;  /* current error recover point */
++  ptrdiff_t errfunc;  /* current error handling function (stack index) */
++};
++
++
++#define G(L)  (L->l_G)
++
++
++/*
++** Union of all collectable objects
++*/
++union GCObject {
++  GCheader gch;
++  union TString ts;
++  union Udata u;
++  union Closure cl;
++  struct Table h;
++  struct Proto p;
++  struct UpVal uv;
++  struct lua_State th;  /* thread */
++};
++
++
++/* macros to convert a GCObject into a specific value */
++#define rawgco2ts(o)  check_exp((o)->gch.tt == LUA_TSTRING, &((o)->ts))
++#define gco2ts(o)     (&rawgco2ts(o)->tsv)
++#define rawgco2u(o)   check_exp((o)->gch.tt == LUA_TUSERDATA, &((o)->u))
++#define gco2u(o)      (&rawgco2u(o)->uv)
++#define gco2cl(o)     check_exp((o)->gch.tt == LUA_TFUNCTION, &((o)->cl))
++#define gco2h(o)      check_exp((o)->gch.tt == LUA_TTABLE, &((o)->h))
++#define gco2p(o)      check_exp((o)->gch.tt == LUA_TPROTO, &((o)->p))
++#define gco2uv(o)     check_exp((o)->gch.tt == LUA_TUPVAL, &((o)->uv))
++#define ngcotouv(o) \
++      check_exp((o) == NULL || (o)->gch.tt == LUA_TUPVAL, &((o)->uv))
++#define gco2th(o)     check_exp((o)->gch.tt == LUA_TTHREAD, &((o)->th))
++
++/* macro to convert any Lua object into a GCObject */
++#define obj2gco(v)    (cast(GCObject *, (v)))
++
++
++LUAI_FUNC lua_State *luaE_newthread (lua_State *L);
++LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1);
++
++#endif
++
+--- /dev/null
++++ b/extensions/LUA/lua/lstring.c
+@@ -0,0 +1,110 @@
++/*
++** $Id: lstring.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $
++** String table (keeps all strings handled by Lua)
++** See Copyright Notice in lua.h
++*/
++
++#include <string.h>
++
++#define lstring_c
++#define LUA_CORE
++
++#include "lua.h"
++
++#include "lmem.h"
++#include "lobject.h"
++#include "lstate.h"
++#include "lstring.h"
++
++
++
++void luaS_resize (lua_State *L, int newsize) {
++  GCObject **newhash;
++  stringtable *tb;
++  int i;
++  if (G(L)->gcstate == GCSsweepstring)
++    return;  /* cannot resize during GC traverse */
++  newhash = luaM_newvector(L, newsize, GCObject *);
++  tb = &G(L)->strt;
++  for (i=0; i<newsize; i++) newhash[i] = NULL;
++  /* rehash */
++  for (i=0; i<tb->size; i++) {
++    GCObject *p = tb->hash[i];
++    while (p) {  /* for each node in the list */
++      GCObject *next = p->gch.next;  /* save next */
++      unsigned int h = gco2ts(p)->hash;
++      int h1 = lmod(h, newsize);  /* new position */
++      lua_assert(cast_int(h%newsize) == lmod(h, newsize));
++      p->gch.next = newhash[h1];  /* chain it */
++      newhash[h1] = p;
++      p = next;
++    }
++  }
++  luaM_freearray(L, tb->hash, tb->size, TString *);
++  tb->size = newsize;
++  tb->hash = newhash;
++}
++
++
++static TString *newlstr (lua_State *L, const char *str, size_t l,
++                                       unsigned int h) {
++  TString *ts;
++  stringtable *tb;
++  if (l+1 > (MAX_SIZET - sizeof(TString))/sizeof(char))
++    luaM_toobig(L);
++  ts = cast(TString *, luaM_malloc(L, (l+1)*sizeof(char)+sizeof(TString)));
++  ts->tsv.len = l;
++  ts->tsv.hash = h;
++  ts->tsv.marked = luaC_white(G(L));
++  ts->tsv.tt = LUA_TSTRING;
++  ts->tsv.reserved = 0;
++  memcpy(ts+1, str, l*sizeof(char));
++  ((char *)(ts+1))[l] = '\0';  /* ending 0 */
++  tb = &G(L)->strt;
++  h = lmod(h, tb->size);
++  ts->tsv.next = tb->hash[h];  /* chain new entry */
++  tb->hash[h] = obj2gco(ts);
++  tb->nuse++;
++  if (tb->nuse > cast(lu_int32, tb->size) && tb->size <= MAX_INT/2)
++    luaS_resize(L, tb->size*2);  /* too crowded */
++  return ts;
++}
++
++
++TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
++  GCObject *o;
++  unsigned int h = cast(unsigned int, l);  /* seed */
++  size_t step = (l>>5)+1;  /* if string is too long, don't hash all its chars */
++  size_t l1;
++  for (l1=l; l1>=step; l1-=step)  /* compute hash */
++    h = h ^ ((h<<5)+(h>>2)+cast(unsigned char, str[l1-1]));
++  for (o = G(L)->strt.hash[lmod(h, G(L)->strt.size)];
++       o != NULL;
++       o = o->gch.next) {
++    TString *ts = rawgco2ts(o);
++    if (ts->tsv.len == l && (memcmp(str, getstr(ts), l) == 0)) {
++      /* string may be dead */
++      if (isdead(G(L), o)) changewhite(o);
++      return ts;
++    }
++  }
++  return newlstr(L, str, l, h);  /* not found */
++}
++
++
++Udata *luaS_newudata (lua_State *L, size_t s, Table *e) {
++  Udata *u;
++  if (s > MAX_SIZET - sizeof(Udata))
++    luaM_toobig(L);
++  u = cast(Udata *, luaM_malloc(L, s + sizeof(Udata)));
++  u->uv.marked = luaC_white(G(L));  /* is not finalized */
++  u->uv.tt = LUA_TUSERDATA;
++  u->uv.len = s;
++  u->uv.metatable = NULL;
++  u->uv.env = e;
++  /* chain it on udata list (after main thread) */
++  u->uv.next = G(L)->mainthread->next;
++  G(L)->mainthread->next = obj2gco(u);
++  return u;
++}
++
+--- /dev/null
++++ b/extensions/LUA/lua/lstring.h
+@@ -0,0 +1,31 @@
++/*
++** $Id: lstring.h,v 1.43.1.1 2007/12/27 13:02:25 roberto Exp $
++** String table (keep all strings handled by Lua)
++** See Copyright Notice in lua.h
++*/
++
++#ifndef lstring_h
++#define lstring_h
++
++
++#include "lgc.h"
++#include "lobject.h"
++#include "lstate.h"
++
++
++#define sizestring(s) (sizeof(union TString)+((s)->len+1)*sizeof(char))
++
++#define sizeudata(u)  (sizeof(union Udata)+(u)->len)
++
++#define luaS_new(L, s)        (luaS_newlstr(L, s, strlen(s)))
++#define luaS_newliteral(L, s) (luaS_newlstr(L, "" s, \
++                                 (sizeof(s)/sizeof(char))-1))
++
++#define luaS_fix(s)   l_setbit((s)->tsv.marked, FIXEDBIT)
++
++LUAI_FUNC void luaS_resize (lua_State *L, int newsize);
++LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s, Table *e);
++LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l);
++
++
++#endif
+--- /dev/null
++++ b/extensions/LUA/lua/lstrlib.c
+@@ -0,0 +1,883 @@
++/*
++** $Id: lstrlib.c,v 1.132.1.4 2008/07/11 17:27:21 roberto Exp $
++** Standard library for string operations and pattern-matching
++** See Copyright Notice in lua.h
++*/
++
++
++#include <ctype.h>
++#include <stddef.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++
++#define lstrlib_c
++#define LUA_LIB
++
++#include "lua.h"
++
++#include "lauxlib.h"
++#include "lualib.h"
++
++
++/* macro to `unsign' a character */
++#define uchar(c)        ((unsigned char)(c))
++
++
++
++static int str_len (lua_State *L) {
++  size_t l;
++  luaL_checklstring(L, 1, &l);
++  lua_pushinteger(L, l);
++  return 1;
++}
++
++
++static ptrdiff_t posrelat (ptrdiff_t pos, size_t len) {
++  /* relative string position: negative means back from end */
++  if (pos < 0) pos += (ptrdiff_t)len + 1;
++  return (pos >= 0) ? pos : 0;
++}
++
++
++static int str_sub (lua_State *L) {
++  size_t l;
++  const char *s = luaL_checklstring(L, 1, &l);
++  ptrdiff_t start = posrelat(luaL_checkinteger(L, 2), l);
++  ptrdiff_t end = posrelat(luaL_optinteger(L, 3, -1), l);
++  if (start < 1) start = 1;
++  if (end > (ptrdiff_t)l) end = (ptrdiff_t)l;
++  if (start <= end)
++    lua_pushlstring(L, s+start-1, end-start+1);
++  else lua_pushliteral(L, "");
++  return 1;
++}
++
++
++static int str_reverse (lua_State *L) {
++  size_t l;
++  const char *s = luaL_checklstring(L, 1, &l);
++  luaL_Buffer *b = (luaL_Buffer *)kmalloc(sizeof(luaL_Buffer) + BUFSIZ, GFP_ATOMIC);
++  if(!b) luaL_error(L, "str_reverse: cannot allocate memory");
++  luaL_buffinit(L, b);
++  while (l--) luaL_addchar(b, s[l]);
++  luaL_pushresult(b);
++  kfree(b);
++  return 1;
++}
++
++
++static int str_lower (lua_State *L) {
++  size_t l;
++  size_t i;
++  const char *s = luaL_checklstring(L, 1, &l);
++  luaL_Buffer *b = (luaL_Buffer *)kmalloc(sizeof(luaL_Buffer) + BUFSIZ, GFP_ATOMIC);
++  if(!b) luaL_error(L, "str_lower: cannot allocate memory");
++  luaL_buffinit(L, b);
++  for (i=0; i<l; i++)
++    luaL_addchar(b, tolower(uchar(s[i])));
++  luaL_pushresult(b);
++  kfree(b);
++  return 1;
++}
++
++
++static int str_upper (lua_State *L) {
++  size_t l;
++  size_t i;
++  const char *s = luaL_checklstring(L, 1, &l);
++  luaL_Buffer *b = (luaL_Buffer *)kmalloc(sizeof(luaL_Buffer) + BUFSIZ, GFP_ATOMIC);
++  if(!b) luaL_error(L, "str_upper: cannot allocate memory");
++  luaL_buffinit(L, b);
++  for (i=0; i<l; i++)
++    luaL_addchar(b, toupper(uchar(s[i])));
++  luaL_pushresult(b);
++  kfree(b);
++  return 1;
++}
++
++static int str_rep (lua_State *L) {
++  size_t l;
++  const char *s = luaL_checklstring(L, 1, &l);
++  int n = luaL_checkint(L, 2);
++  luaL_Buffer *b = (luaL_Buffer *)kmalloc(sizeof(luaL_Buffer) + BUFSIZ, GFP_ATOMIC);
++  if(!b) luaL_error(L, "str_rep: cannot allocate memory");
++  luaL_buffinit(L, b);
++  while (n-- > 0)
++    luaL_addlstring(b, s, l);
++  luaL_pushresult(b);
++  kfree(b);
++  return 1;
++}
++
++
++static int str_byte (lua_State *L) {
++  size_t l;
++  const char *s = luaL_checklstring(L, 1, &l);
++  ptrdiff_t posi = posrelat(luaL_optinteger(L, 2, 1), l);
++  ptrdiff_t pose = posrelat(luaL_optinteger(L, 3, posi), l);
++  int n, i;
++  if (posi <= 0) posi = 1;
++  if ((size_t)pose > l) pose = l;
++  if (posi > pose) return 0;  /* empty interval; return no values */
++  n = (int)(pose -  posi + 1);
++  if (posi + n <= pose)  /* overflow? */
++    luaL_error(L, "string slice too long");
++  luaL_checkstack(L, n, "string slice too long");
++  for (i=0; i<n; i++)
++    lua_pushinteger(L, uchar(s[posi+i-1]));
++  return n;
++}
++
++
++static int str_char (lua_State *L) {
++  int n = lua_gettop(L);  /* number of arguments */
++  int i;
++  luaL_Buffer *b = (luaL_Buffer *)kmalloc(sizeof(luaL_Buffer) + BUFSIZ, GFP_ATOMIC);
++  if(!b) luaL_error(L, "str_char: cannot allocate memory");
++  luaL_buffinit(L, b);
++  for (i=1; i<=n; i++) {
++    int c = luaL_checkint(L, i);
++    luaL_argcheck(L, uchar(c) == c, i, "invalid value");
++    luaL_addchar(b, uchar(c));
++  }
++  luaL_pushresult(b);
++  kfree(b);
++  return 1;
++}
++
++
++static int writer (lua_State *L, const void* b, size_t size, void* B) {
++  (void)L;
++  luaL_addlstring((luaL_Buffer*) B, (const char *)b, size);
++  return 0;
++}
++
++
++static int str_dump (lua_State *L) {
++  luaL_Buffer *b = (luaL_Buffer *)kmalloc(sizeof(luaL_Buffer) + BUFSIZ, GFP_ATOMIC);
++  if(!b) luaL_error(L, "str_dump: cannot allocate memory");
++  luaL_checktype(L, 1, LUA_TFUNCTION);
++  lua_settop(L, 1);
++  luaL_buffinit(L,b);
++  if (lua_dump(L, writer, b) != 0){
++        kfree(b);
++        luaL_error(L, "unable to dump given function");
++  }
++
++  luaL_pushresult(b);
++  kfree(b);
++  return 1;
++}
++
++
++
++/*
++** {======================================================
++** PATTERN MATCHING
++** =======================================================
++*/
++
++
++#define CAP_UNFINISHED        (-1)
++#define CAP_POSITION  (-2)
++
++typedef struct MatchState {
++  const char *src_init;  /* init of source string */
++  const char *src_end;  /* end (`\0') of source string */
++  lua_State *L;
++  int level;  /* total number of captures (finished or unfinished) */
++  struct {
++    const char *init;
++    ptrdiff_t len;
++  } capture[LUA_MAXCAPTURES];
++} MatchState;
++
++
++#define L_ESC         '%'
++#define SPECIALS      "^$*+?.([%-"
++
++
++static int check_capture (MatchState *ms, int l) {
++  l -= '1';
++  if (l < 0 || l >= ms->level || ms->capture[l].len == CAP_UNFINISHED)
++    return luaL_error(ms->L, "invalid capture index");
++  return l;
++}
++
++
++static int capture_to_close (MatchState *ms) {
++  int level = ms->level;
++  for (level--; level>=0; level--)
++    if (ms->capture[level].len == CAP_UNFINISHED) return level;
++  return luaL_error(ms->L, "invalid pattern capture");
++}
++
++
++static const char *classend (MatchState *ms, const char *p) {
++  switch (*p++) {
++    case L_ESC: {
++      if (*p == '\0')
++        luaL_error(ms->L, "malformed pattern (ends with " LUA_QL("%%") ")");
++      return p+1;
++    }
++    case '[': {
++      if (*p == '^') p++;
++      do {  /* look for a `]' */
++        if (*p == '\0')
++          luaL_error(ms->L, "malformed pattern (missing " LUA_QL("]") ")");
++        if (*(p++) == L_ESC && *p != '\0')
++          p++;  /* skip escapes (e.g. `%]') */
++      } while (*p != ']');
++      return p+1;
++    }
++    default: {
++      return p;
++    }
++  }
++}
++
++
++static int match_class (int c, int cl) {
++  int res;
++  switch (tolower(cl)) {
++    case 'a' : res = isalpha(c); break;
++    case 'c' : res = iscntrl(c); break;
++    case 'd' : res = isdigit(c); break;
++    case 'l' : res = islower(c); break;
++    case 'p' : res = ispunct(c); break;
++    case 's' : res = isspace(c); break;
++    case 'u' : res = isupper(c); break;
++    case 'w' : res = isalnum(c); break;
++    case 'x' : res = isxdigit(c); break;
++    case 'z' : res = (c == 0); break;
++    default: return (cl == c);
++  }
++  return (islower(cl) ? res : !res);
++}
++
++
++static int matchbracketclass (int c, const char *p, const char *ec) {
++  int sig = 1;
++  if (*(p+1) == '^') {
++    sig = 0;
++    p++;  /* skip the `^' */
++  }
++  while (++p < ec) {
++    if (*p == L_ESC) {
++      p++;
++      if (match_class(c, uchar(*p)))
++        return sig;
++    }
++    else if ((*(p+1) == '-') && (p+2 < ec)) {
++      p+=2;
++      if (uchar(*(p-2)) <= c && c <= uchar(*p))
++        return sig;
++    }
++    else if (uchar(*p) == c) return sig;
++  }
++  return !sig;
++}
++
++
++static int singlematch (int c, const char *p, const char *ep) {
++  switch (*p) {
++    case '.': return 1;  /* matches any char */
++    case L_ESC: return match_class(c, uchar(*(p+1)));
++    case '[': return matchbracketclass(c, p, ep-1);
++    default:  return (uchar(*p) == c);
++  }
++}
++
++
++static const char *match (MatchState *ms, const char *s, const char *p);
++
++
++static const char *matchbalance (MatchState *ms, const char *s,
++                                   const char *p) {
++  if (*p == 0 || *(p+1) == 0)
++    luaL_error(ms->L, "unbalanced pattern");
++  if (*s != *p) return NULL;
++  else {
++    int b = *p;
++    int e = *(p+1);
++    int cont = 1;
++    while (++s < ms->src_end) {
++      if (*s == e) {
++        if (--cont == 0) return s+1;
++      }
++      else if (*s == b) cont++;
++    }
++  }
++  return NULL;  /* string ends out of balance */
++}
++
++
++static const char *max_expand (MatchState *ms, const char *s,
++                                 const char *p, const char *ep) {
++  ptrdiff_t i = 0;  /* counts maximum expand for item */
++  while ((s+i)<ms->src_end && singlematch(uchar(*(s+i)), p, ep))
++    i++;
++  /* keeps trying to match with the maximum repetitions */
++  while (i>=0) {
++    const char *res = match(ms, (s+i), ep+1);
++    if (res) return res;
++    i--;  /* else didn't match; reduce 1 repetition to try again */
++  }
++  return NULL;
++}
++
++
++static const char *min_expand (MatchState *ms, const char *s,
++                                 const char *p, const char *ep) {
++  for (;;) {
++    const char *res = match(ms, s, ep+1);
++    if (res != NULL)
++      return res;
++    else if (s<ms->src_end && singlematch(uchar(*s), p, ep))
++      s++;  /* try with one more repetition */
++    else return NULL;
++  }
++}
++
++
++static const char *start_capture (MatchState *ms, const char *s,
++                                    const char *p, int what) {
++  const char *res;
++  int level = ms->level;
++  if (level >= LUA_MAXCAPTURES) luaL_error(ms->L, "too many captures");
++  ms->capture[level].init = s;
++  ms->capture[level].len = what;
++  ms->level = level+1;
++  if ((res=match(ms, s, p)) == NULL)  /* match failed? */
++    ms->level--;  /* undo capture */
++  return res;
++}
++
++
++static const char *end_capture (MatchState *ms, const char *s,
++                                  const char *p) {
++  int l = capture_to_close(ms);
++  const char *res;
++  ms->capture[l].len = s - ms->capture[l].init;  /* close capture */
++  if ((res = match(ms, s, p)) == NULL)  /* match failed? */
++    ms->capture[l].len = CAP_UNFINISHED;  /* undo capture */
++  return res;
++}
++
++
++static const char *match_capture (MatchState *ms, const char *s, int l) {
++  size_t len;
++  l = check_capture(ms, l);
++  len = ms->capture[l].len;
++  if ((size_t)(ms->src_end-s) >= len &&
++      memcmp(ms->capture[l].init, s, len) == 0)
++    return s+len;
++  else return NULL;
++}
++
++
++static const char *match (MatchState *ms, const char *s, const char *p) {
++  init: /* using goto's to optimize tail recursion */
++  switch (*p) {
++    case '(': {  /* start capture */
++      if (*(p+1) == ')')  /* position capture? */
++        return start_capture(ms, s, p+2, CAP_POSITION);
++      else
++        return start_capture(ms, s, p+1, CAP_UNFINISHED);
++    }
++    case ')': {  /* end capture */
++      return end_capture(ms, s, p+1);
++    }
++    case L_ESC: {
++      switch (*(p+1)) {
++        case 'b': {  /* balanced string? */
++          s = matchbalance(ms, s, p+2);
++          if (s == NULL) return NULL;
++          p+=4; goto init;  /* else return match(ms, s, p+4); */
++        }
++        case 'f': {  /* frontier? */
++          const char *ep; char previous;
++          p += 2;
++          if (*p != '[')
++            luaL_error(ms->L, "missing " LUA_QL("[") " after "
++                               LUA_QL("%%f") " in pattern");
++          ep = classend(ms, p);  /* points to what is next */
++          previous = (s == ms->src_init) ? '\0' : *(s-1);
++          if (matchbracketclass(uchar(previous), p, ep-1) ||
++             !matchbracketclass(uchar(*s), p, ep-1)) return NULL;
++          p=ep; goto init;  /* else return match(ms, s, ep); */
++        }
++        default: {
++          if (isdigit(uchar(*(p+1)))) {  /* capture results (%0-%9)? */
++            s = match_capture(ms, s, uchar(*(p+1)));
++            if (s == NULL) return NULL;
++            p+=2; goto init;  /* else return match(ms, s, p+2) */
++          }
++          goto dflt;  /* case default */
++        }
++      }
++    }
++    case '\0': {  /* end of pattern */
++      return s;  /* match succeeded */
++    }
++    case '$': {
++      if (*(p+1) == '\0')  /* is the `$' the last char in pattern? */
++        return (s == ms->src_end) ? s : NULL;  /* check end of string */
++      else goto dflt;
++    }
++    default: dflt: {  /* it is a pattern item */
++      const char *ep = classend(ms, p);  /* points to what is next */
++      int m = s<ms->src_end && singlematch(uchar(*s), p, ep);
++      switch (*ep) {
++        case '?': {  /* optional */
++          const char *res;
++          if (m && ((res=match(ms, s+1, ep+1)) != NULL))
++            return res;
++          p=ep+1; goto init;  /* else return match(ms, s, ep+1); */
++        }
++        case '*': {  /* 0 or more repetitions */
++          return max_expand(ms, s, p, ep);
++        }
++        case '+': {  /* 1 or more repetitions */
++          return (m ? max_expand(ms, s+1, p, ep) : NULL);
++        }
++        case '-': {  /* 0 or more repetitions (minimum) */
++          return min_expand(ms, s, p, ep);
++        }
++        default: {
++          if (!m) return NULL;
++          s++; p=ep; goto init;  /* else return match(ms, s+1, ep); */
++        }
++      }
++    }
++  }
++}
++
++
++
++static const char *lmemfind (const char *s1, size_t l1,
++                               const char *s2, size_t l2) {
++  if (l2 == 0) return s1;  /* empty strings are everywhere */
++  else if (l2 > l1) return NULL;  /* avoids a negative `l1' */
++  else {
++    const char *init;  /* to search for a `*s2' inside `s1' */
++    l2--;  /* 1st char will be checked by `memchr' */
++    l1 = l1-l2;  /* `s2' cannot be found after that */
++    while (l1 > 0 && (init = (const char *)memchr(s1, *s2, l1)) != NULL) {
++      init++;   /* 1st char is already checked */
++      if (memcmp(init, s2+1, l2) == 0)
++        return init-1;
++      else {  /* correct `l1' and `s1' to try again */
++        l1 -= init-s1;
++        s1 = init;
++      }
++    }
++    return NULL;  /* not found */
++  }
++}
++
++
++static void push_onecapture (MatchState *ms, int i, const char *s,
++                                                    const char *e) {
++  if (i >= ms->level) {
++    if (i == 0)  /* ms->level == 0, too */
++      lua_pushlstring(ms->L, s, e - s);  /* add whole match */
++    else
++      luaL_error(ms->L, "invalid capture index");
++  }
++  else {
++    ptrdiff_t l = ms->capture[i].len;
++    if (l == CAP_UNFINISHED) luaL_error(ms->L, "unfinished capture");
++    if (l == CAP_POSITION)
++      lua_pushinteger(ms->L, ms->capture[i].init - ms->src_init + 1);
++    else
++      lua_pushlstring(ms->L, ms->capture[i].init, l);
++  }
++}
++
++
++static int push_captures (MatchState *ms, const char *s, const char *e) {
++  int i;
++  int nlevels = (ms->level == 0 && s) ? 1 : ms->level;
++  luaL_checkstack(ms->L, nlevels, "too many captures");
++  for (i = 0; i < nlevels; i++)
++    push_onecapture(ms, i, s, e);
++  return nlevels;  /* number of strings pushed */
++}
++
++
++static int str_find_aux (lua_State *L, int find) {
++  size_t l1, l2;
++  const char *s = luaL_checklstring(L, 1, &l1);
++  const char *p = luaL_checklstring(L, 2, &l2);
++  ptrdiff_t init = posrelat(luaL_optinteger(L, 3, 1), l1) - 1;
++  if (init < 0) init = 0;
++  else if ((size_t)(init) > l1) init = (ptrdiff_t)l1;
++  if (find && (lua_toboolean(L, 4) ||  /* explicit request? */
++      strpbrk(p, SPECIALS) == NULL)) {  /* or no special characters? */
++    /* do a plain search */
++    const char *s2 = lmemfind(s+init, l1-init, p, l2);
++    if (s2) {
++      lua_pushinteger(L, s2-s+1);
++      lua_pushinteger(L, s2-s+l2);
++      return 2;
++    }
++  }
++  else {
++    MatchState ms;
++    int anchor = (*p == '^') ? (p++, 1) : 0;
++    const char *s1=s+init;
++    ms.L = L;
++    ms.src_init = s;
++    ms.src_end = s+l1;
++    do {
++      const char *res;
++      ms.level = 0;
++      if ((res=match(&ms, s1, p)) != NULL) {
++        if (find) {
++          lua_pushinteger(L, s1-s+1);  /* start */
++          lua_pushinteger(L, res-s);   /* end */
++          return push_captures(&ms, NULL, 0) + 2;
++        }
++        else
++          return push_captures(&ms, s1, res);
++      }
++    } while (s1++ < ms.src_end && !anchor);
++  }
++  lua_pushnil(L);  /* not found */
++  return 1;
++}
++
++
++static int str_find (lua_State *L) {
++  return str_find_aux(L, 1);
++}
++
++
++static int str_match (lua_State *L) {
++  return str_find_aux(L, 0);
++}
++
++
++static int gmatch_aux (lua_State *L) {
++  MatchState ms;
++  size_t ls;
++  const char *s = lua_tolstring(L, lua_upvalueindex(1), &ls);
++  const char *p = lua_tostring(L, lua_upvalueindex(2));
++  const char *src;
++  ms.L = L;
++  ms.src_init = s;
++  ms.src_end = s+ls;
++  for (src = s + (size_t)lua_tointeger(L, lua_upvalueindex(3));
++       src <= ms.src_end;
++       src++) {
++    const char *e;
++    ms.level = 0;
++    if ((e = match(&ms, src, p)) != NULL) {
++      lua_Integer newstart = e-s;
++      if (e == src) newstart++;  /* empty match? go at least one position */
++      lua_pushinteger(L, newstart);
++      lua_replace(L, lua_upvalueindex(3));
++      return push_captures(&ms, src, e);
++    }
++  }
++  return 0;  /* not found */
++}
++
++
++static int gmatch (lua_State *L) {
++  luaL_checkstring(L, 1);
++  luaL_checkstring(L, 2);
++  lua_settop(L, 2);
++  lua_pushinteger(L, 0);
++  lua_pushcclosure(L, gmatch_aux, 3);
++  return 1;
++}
++
++
++static int gfind_nodef (lua_State *L) {
++  return luaL_error(L, LUA_QL("string.gfind") " was renamed to "
++                       LUA_QL("string.gmatch"));
++}
++
++
++static void add_s (MatchState *ms, luaL_Buffer *b, const char *s,
++                                                   const char *e) {
++  size_t l, i;
++  const char *news = lua_tolstring(ms->L, 3, &l);
++  for (i = 0; i < l; i++) {
++    if (news[i] != L_ESC)
++      luaL_addchar(b, news[i]);
++    else {
++      i++;  /* skip ESC */
++      if (!isdigit(uchar(news[i])))
++        luaL_addchar(b, news[i]);
++      else if (news[i] == '0')
++          luaL_addlstring(b, s, e - s);
++      else {
++        push_onecapture(ms, news[i] - '1', s, e);
++        luaL_addvalue(b);  /* add capture to accumulated result */
++      }
++    }
++  }
++}
++
++
++static void add_value (MatchState *ms, luaL_Buffer *b, const char *s,
++                                                       const char *e) {
++  lua_State *L = ms->L;
++  switch (lua_type(L, 3)) {
++    case LUA_TNUMBER:
++    case LUA_TSTRING: {
++      add_s(ms, b, s, e);
++      return;
++    }
++    case LUA_TFUNCTION: {
++      int n;
++      lua_pushvalue(L, 3);
++      n = push_captures(ms, s, e);
++      lua_call(L, n, 1);
++      break;
++    }
++    case LUA_TTABLE: {
++      push_onecapture(ms, 0, s, e);
++      lua_gettable(L, 3);
++      break;
++    }
++  }
++  if (!lua_toboolean(L, -1)) {  /* nil or false? */
++    lua_pop(L, 1);
++    lua_pushlstring(L, s, e - s);  /* keep original text */
++  }
++  else if (!lua_isstring(L, -1))
++    luaL_error(L, "invalid replacement value (a %s)", luaL_typename(L, -1));
++  luaL_addvalue(b);  /* add result to accumulator */
++}
++
++
++static int str_gsub (lua_State *L) {
++  size_t srcl;
++  const char *src = luaL_checklstring(L, 1, &srcl);
++  const char *p = luaL_checkstring(L, 2);
++  int  tr = lua_type(L, 3);
++  int max_s = luaL_optint(L, 4, srcl+1);
++  int anchor = (*p == '^') ? (p++, 1) : 0;
++  int n = 0;
++  MatchState ms;
++  luaL_Buffer *b = (luaL_Buffer *)kmalloc(sizeof(luaL_Buffer) + BUFSIZ, GFP_ATOMIC);
++  if(!b) luaL_error(L, "str_gsub: cannot allocate memory");
++  luaL_argcheck(L, tr == LUA_TNUMBER || tr == LUA_TSTRING ||
++                   tr == LUA_TFUNCTION || tr == LUA_TTABLE, 3,
++                      "string/function/table expected");
++  luaL_buffinit(L, b);
++  ms.L = L;
++  ms.src_init = src;
++  ms.src_end = src+srcl;
++  while (n < max_s) {
++    const char *e;
++    ms.level = 0;
++    e = match(&ms, src, p);
++    if (e) {
++      n++;
++      add_value(&ms, b, src, e);
++    }
++    if (e && e>src) /* non empty match? */
++      src = e;  /* skip it */
++    else if (src < ms.src_end)
++      luaL_addchar(b, *src++);
++    else break;
++    if (anchor) break;
++  }
++  luaL_addlstring(b, src, ms.src_end-src);
++  luaL_pushresult(b);
++  lua_pushinteger(L, n);  /* number of substitutions */
++  kfree(b);
++  return 2;
++}
++
++/* }====================================================== */
++
++
++/* maximum size of each formatted item (> len(format('%99.99f', -1e308))) */
++#define MAX_ITEM      512
++/* valid flags in a format specification */
++#define FLAGS "-+ #0"
++/*
++** maximum size of each format specification (such as '%-099.99d')
++** (+10 accounts for %99.99x plus margin of error)
++*/
++#define MAX_FORMAT    (sizeof(FLAGS) + sizeof(LUA_INTFRMLEN) + 10)
++
++
++static void addquoted (lua_State *L, luaL_Buffer *b, int arg) {
++  size_t l;
++  const char *s = luaL_checklstring(L, arg, &l);
++  luaL_addchar(b, '"');
++  while (l--) {
++    switch (*s) {
++      case '"': case '\\': case '\n': {
++        luaL_addchar(b, '\\');
++        luaL_addchar(b, *s);
++        break;
++      }
++      case '\r': {
++        luaL_addlstring(b, "\\r", 2);
++        break;
++      }
++      case '\0': {
++        luaL_addlstring(b, "\\000", 4);
++        break;
++      }
++      default: {
++        luaL_addchar(b, *s);
++        break;
++      }
++    }
++    s++;
++  }
++  luaL_addchar(b, '"');
++}
++
++static const char *scanformat (lua_State *L, const char *strfrmt, char *form) {
++  const char *p = strfrmt;
++  while (*p != '\0' && strchr(FLAGS, *p) != NULL) p++;  /* skip flags */
++  if ((size_t)(p - strfrmt) >= sizeof(FLAGS))
++    luaL_error(L, "invalid format (repeated flags)");
++  if (isdigit(uchar(*p))) p++;  /* skip width */
++  if (isdigit(uchar(*p))) p++;  /* (2 digits at most) */
++  if (*p == '.') {
++    p++;
++    if (isdigit(uchar(*p))) p++;  /* skip precision */
++    if (isdigit(uchar(*p))) p++;  /* (2 digits at most) */
++  }
++  if (isdigit(uchar(*p)))
++    luaL_error(L, "invalid format (width or precision too long)");
++  *(form++) = '%';
++  strncpy(form, strfrmt, p - strfrmt + 1);
++  form += p - strfrmt + 1;
++  *form = '\0';
++  return p;
++}
++
++
++static void addintlen (char *form) {
++  size_t l = strlen(form);
++  char spec = form[l - 1];
++  strcpy(form + l - 1, LUA_INTFRMLEN);
++  form[l + sizeof(LUA_INTFRMLEN) - 2] = spec;
++  form[l + sizeof(LUA_INTFRMLEN) - 1] = '\0';
++}
++
++
++static int str_format (lua_State *L) {
++  int arg = 1;
++  size_t sfl;
++  const char *strfrmt = luaL_checklstring(L, arg, &sfl);
++  const char *strfrmt_end = strfrmt+sfl;
++  luaL_Buffer *b = (luaL_Buffer *)kmalloc(sizeof(luaL_Buffer) + BUFSIZ, GFP_ATOMIC);
++  if(!b) luaL_error(L, "str_format: cannot allocate memory");
++  luaL_buffinit(L, b);
++  while (strfrmt < strfrmt_end) {
++    if (*strfrmt != L_ESC)
++      luaL_addchar(b, *strfrmt++);
++    else if (*++strfrmt == L_ESC)
++      luaL_addchar(b, *strfrmt++);  /* %% */
++    else { /* format item */
++      char form[MAX_FORMAT];  /* to store the format (`%...') */
++      char buff[MAX_ITEM];  /* to store the formatted item */
++      arg++;
++      strfrmt = scanformat(L, strfrmt, form);
++      switch (*strfrmt++) {
++        case 'c': {
++          sprintf(buff, form, (int)luaL_checknumber(L, arg));
++          break;
++        }
++        case 'd':  case 'i': {
++          addintlen(form);
++          sprintf(buff, form, (LUA_INTFRM_T)luaL_checknumber(L, arg));
++          break;
++        }
++        case 'o':  case 'u':  case 'x':  case 'X': {
++          addintlen(form);
++          sprintf(buff, form, (unsigned LUA_INTFRM_T)luaL_checknumber(L, arg));
++          break;
++        }
++        case 'q': {
++          addquoted(L, b, arg);
++          continue;  /* skip the 'addsize' at the end */
++        }
++        case 's': {
++          size_t l;
++          const char *s = luaL_checklstring(L, arg, &l);
++          if (!strchr(form, '.') && l >= 100) {
++            /* no precision and string is too long to be formatted;
++               keep original string */
++            lua_pushvalue(L, arg);
++            luaL_addvalue(b);
++            continue;  /* skip the `addsize' at the end */
++          }
++          else {
++            sprintf(buff, form, s);
++            break;
++          }
++        }
++        default: {  /* also treat cases `pnLlh' */
++          kfree(b);
++          return luaL_error(L, "invalid option " LUA_QL("%%%c") " to "
++                               LUA_QL("format"), *(strfrmt - 1));
++        }
++      }
++      luaL_addlstring(b, buff, strlen(buff));
++    }
++  }
++  luaL_pushresult(b);
++  kfree(b);
++  return 1;
++}
++
++
++static const luaL_Reg strlib[] = {
++  {"byte", str_byte},
++  {"char", str_char},
++  {"dump", str_dump},
++  {"find", str_find},
++  {"format", str_format},
++  {"gfind", gfind_nodef},
++  {"gmatch", gmatch},
++  {"gsub", str_gsub},
++  {"len", str_len},
++  {"lower", str_lower},
++  {"match", str_match},
++  {"rep", str_rep},
++  {"reverse", str_reverse},
++  {"sub", str_sub},
++  {"upper", str_upper},
++  {NULL, NULL}
++};
++
++
++static void createmetatable (lua_State *L) {
++  lua_createtable(L, 0, 1);  /* create metatable for strings */
++  lua_pushliteral(L, "");  /* dummy string */
++  lua_pushvalue(L, -2);
++  lua_setmetatable(L, -2);  /* set string metatable */
++  lua_pop(L, 1);  /* pop dummy string */
++  lua_pushvalue(L, -2);  /* string library... */
++  lua_setfield(L, -2, "__index");  /* ...is the __index metamethod */
++  lua_pop(L, 1);  /* pop metatable */
++}
++
++
++/*
++** Open string library
++*/
++LUALIB_API int luaopen_string (lua_State *L) {
++  luaL_register(L, LUA_STRLIBNAME, strlib);
++#if defined(LUA_COMPAT_GFIND)
++  lua_getfield(L, -1, "gmatch");
++  lua_setfield(L, -2, "gfind");
++#endif
++  createmetatable(L);
++  return 1;
++}
+--- /dev/null
++++ b/extensions/LUA/lua/ltable.c
+@@ -0,0 +1,588 @@
++/*
++** $Id: ltable.c,v 2.32.1.2 2007/12/28 15:32:23 roberto Exp $
++** Lua tables (hash)
++** See Copyright Notice in lua.h
++*/
++
++
++/*
++** Implementation of tables (aka arrays, objects, or hash tables).
++** Tables keep its elements in two parts: an array part and a hash part.
++** Non-negative integer keys are all candidates to be kept in the array
++** part. The actual size of the array is the largest `n' such that at
++** least half the slots between 0 and n are in use.
++** Hash uses a mix of chained scatter table with Brent's variation.
++** A main invariant of these tables is that, if an element is not
++** in its main position (i.e. the `original' position that its hash gives
++** to it), then the colliding element is in its own main position.
++** Hence even when the load factor reaches 100%, performance remains good.
++*/
++
++#include <math.h>
++#include <string.h>
++
++#define ltable_c
++#define LUA_CORE
++
++#include "lua.h"
++
++#include "ldebug.h"
++#include "ldo.h"
++#include "lgc.h"
++#include "lmem.h"
++#include "lobject.h"
++#include "lstate.h"
++#include "ltable.h"
++
++
++/*
++** max size of array part is 2^MAXBITS
++*/
++#if LUAI_BITSINT > 26
++#define MAXBITS               26
++#else
++#define MAXBITS               (LUAI_BITSINT-2)
++#endif
++
++#define MAXASIZE      (1 << MAXBITS)
++
++
++#define hashpow2(t,n)      (gnode(t, lmod((n), sizenode(t))))
++  
++#define hashstr(t,str)  hashpow2(t, (str)->tsv.hash)
++#define hashboolean(t,p)        hashpow2(t, p)
++
++
++/*
++** for some types, it is better to avoid modulus by power of 2, as
++** they tend to have many 2 factors.
++*/
++#define hashmod(t,n)  (gnode(t, ((n) % ((sizenode(t)-1)|1))))
++
++
++#define hashpointer(t,p)      hashmod(t, IntPoint(p))
++
++
++/*
++** number of ints inside a lua_Number
++*/
++#define numints               cast_int(sizeof(lua_Number)/sizeof(int))
++
++
++
++#define dummynode             (&dummynode_)
++
++static const Node dummynode_ = {
++  {{NULL}, LUA_TNIL},  /* value */
++  {{{NULL}, LUA_TNIL, NULL}}  /* key */
++};
++
++
++/*
++** hash for lua_Numbers
++*/
++static Node *hashnum (const Table *t, lua_Number n) {
++  unsigned int a[numints];
++  int i;
++  if (luai_numeq(n, 0))  /* avoid problems with -0 */
++    return gnode(t, 0);
++  memcpy(a, &n, sizeof(a));
++  for (i = 1; i < numints; i++) a[0] += a[i];
++  return hashmod(t, a[0]);
++}
++
++
++
++/*
++** returns the `main' position of an element in a table (that is, the index
++** of its hash value)
++*/
++static Node *mainposition (const Table *t, const TValue *key) {
++  switch (ttype(key)) {
++    case LUA_TNUMBER:
++      return hashnum(t, nvalue(key));
++    case LUA_TSTRING:
++      return hashstr(t, rawtsvalue(key));
++    case LUA_TBOOLEAN:
++      return hashboolean(t, bvalue(key));
++    case LUA_TLIGHTUSERDATA:
++      return hashpointer(t, pvalue(key));
++    default:
++      return hashpointer(t, gcvalue(key));
++  }
++}
++
++
++/*
++** returns the index for `key' if `key' is an appropriate key to live in
++** the array part of the table, -1 otherwise.
++*/
++static int arrayindex (const TValue *key) {
++  if (ttisnumber(key)) {
++    lua_Number n = nvalue(key);
++    int k;
++    lua_number2int(k, n);
++    if (luai_numeq(cast_num(k), n))
++      return k;
++  }
++  return -1;  /* `key' did not match some condition */
++}
++
++
++/*
++** returns the index of a `key' for table traversals. First goes all
++** elements in the array part, then elements in the hash part. The
++** beginning of a traversal is signalled by -1.
++*/
++static int findindex (lua_State *L, Table *t, StkId key) {
++  int i;
++  if (ttisnil(key)) return -1;  /* first iteration */
++  i = arrayindex(key);
++  if (0 < i && i <= t->sizearray)  /* is `key' inside array part? */
++    return i-1;  /* yes; that's the index (corrected to C) */
++  else {
++    Node *n = mainposition(t, key);
++    do {  /* check whether `key' is somewhere in the chain */
++      /* key may be dead already, but it is ok to use it in `next' */
++      if (luaO_rawequalObj(key2tval(n), key) ||
++            (ttype(gkey(n)) == LUA_TDEADKEY && iscollectable(key) &&
++             gcvalue(gkey(n)) == gcvalue(key))) {
++        i = cast_int(n - gnode(t, 0));  /* key index in hash table */
++        /* hash elements are numbered after array ones */
++        return i + t->sizearray;
++      }
++      else n = gnext(n);
++    } while (n);
++    luaG_runerror(L, "invalid key to " LUA_QL("next"));  /* key not found */
++    return 0;  /* to avoid warnings */
++  }
++}
++
++
++int luaH_next (lua_State *L, Table *t, StkId key) {
++  int i = findindex(L, t, key);  /* find original element */
++  for (i++; i < t->sizearray; i++) {  /* try first array part */
++    if (!ttisnil(&t->array[i])) {  /* a non-nil value? */
++      setnvalue(key, cast_num(i+1));
++      setobj2s(L, key+1, &t->array[i]);
++      return 1;
++    }
++  }
++  for (i -= t->sizearray; i < sizenode(t); i++) {  /* then hash part */
++    if (!ttisnil(gval(gnode(t, i)))) {  /* a non-nil value? */
++      setobj2s(L, key, key2tval(gnode(t, i)));
++      setobj2s(L, key+1, gval(gnode(t, i)));
++      return 1;
++    }
++  }
++  return 0;  /* no more elements */
++}
++
++
++/*
++** {=============================================================
++** Rehash
++** ==============================================================
++*/
++
++
++static int computesizes (int nums[], int *narray) {
++  int i;
++  int twotoi;  /* 2^i */
++  int a = 0;  /* number of elements smaller than 2^i */
++  int na = 0;  /* number of elements to go to array part */
++  int n = 0;  /* optimal size for array part */
++  for (i = 0, twotoi = 1; twotoi/2 < *narray; i++, twotoi *= 2) {
++    if (nums[i] > 0) {
++      a += nums[i];
++      if (a > twotoi/2) {  /* more than half elements present? */
++        n = twotoi;  /* optimal size (till now) */
++        na = a;  /* all elements smaller than n will go to array part */
++      }
++    }
++    if (a == *narray) break;  /* all elements already counted */
++  }
++  *narray = n;
++  lua_assert(*narray/2 <= na && na <= *narray);
++  return na;
++}
++
++
++static int countint (const TValue *key, int *nums) {
++  int k = arrayindex(key);
++  if (0 < k && k <= MAXASIZE) {  /* is `key' an appropriate array index? */
++    nums[ceillog2(k)]++;  /* count as such */
++    return 1;
++  }
++  else
++    return 0;
++}
++
++
++static int numusearray (const Table *t, int *nums) {
++  int lg;
++  int ttlg;  /* 2^lg */
++  int ause = 0;  /* summation of `nums' */
++  int i = 1;  /* count to traverse all array keys */
++  for (lg=0, ttlg=1; lg<=MAXBITS; lg++, ttlg*=2) {  /* for each slice */
++    int lc = 0;  /* counter */
++    int lim = ttlg;
++    if (lim > t->sizearray) {
++      lim = t->sizearray;  /* adjust upper limit */
++      if (i > lim)
++        break;  /* no more elements to count */
++    }
++    /* count elements in range (2^(lg-1), 2^lg] */
++    for (; i <= lim; i++) {
++      if (!ttisnil(&t->array[i-1]))
++        lc++;
++    }
++    nums[lg] += lc;
++    ause += lc;
++  }
++  return ause;
++}
++
++
++static int numusehash (const Table *t, int *nums, int *pnasize) {
++  int totaluse = 0;  /* total number of elements */
++  int ause = 0;  /* summation of `nums' */
++  int i = sizenode(t);
++  while (i--) {
++    Node *n = &t->node[i];
++    if (!ttisnil(gval(n))) {
++      ause += countint(key2tval(n), nums);
++      totaluse++;
++    }
++  }
++  *pnasize += ause;
++  return totaluse;
++}
++
++
++static void setarrayvector (lua_State *L, Table *t, int size) {
++  int i;
++  luaM_reallocvector(L, t->array, t->sizearray, size, TValue);
++  for (i=t->sizearray; i<size; i++)
++     setnilvalue(&t->array[i]);
++  t->sizearray = size;
++}
++
++
++static void setnodevector (lua_State *L, Table *t, int size) {
++  int lsize;
++  if (size == 0) {  /* no elements to hash part? */
++    t->node = cast(Node *, dummynode);  /* use common `dummynode' */
++    lsize = 0;
++  }
++  else {
++    int i;
++    lsize = ceillog2(size);
++    if (lsize > MAXBITS)
++      luaG_runerror(L, "table overflow");
++    size = twoto(lsize);
++    t->node = luaM_newvector(L, size, Node);
++    for (i=0; i<size; i++) {
++      Node *n = gnode(t, i);
++      gnext(n) = NULL;
++      setnilvalue(gkey(n));
++      setnilvalue(gval(n));
++    }
++  }
++  t->lsizenode = cast_byte(lsize);
++  t->lastfree = gnode(t, size);  /* all positions are free */
++}
++
++
++static void resize (lua_State *L, Table *t, int nasize, int nhsize) {
++  int i;
++  int oldasize = t->sizearray;
++  int oldhsize = t->lsizenode;
++  Node *nold = t->node;  /* save old hash ... */
++  if (nasize > oldasize)  /* array part must grow? */
++    setarrayvector(L, t, nasize);
++  /* create new hash part with appropriate size */
++  setnodevector(L, t, nhsize);  
++  if (nasize < oldasize) {  /* array part must shrink? */
++    t->sizearray = nasize;
++    /* re-insert elements from vanishing slice */
++    for (i=nasize; i<oldasize; i++) {
++      if (!ttisnil(&t->array[i]))
++        setobjt2t(L, luaH_setnum(L, t, i+1), &t->array[i]);
++    }
++    /* shrink array */
++    luaM_reallocvector(L, t->array, oldasize, nasize, TValue);
++  }
++  /* re-insert elements from hash part */
++  for (i = twoto(oldhsize) - 1; i >= 0; i--) {
++    Node *old = nold+i;
++    if (!ttisnil(gval(old)))
++      setobjt2t(L, luaH_set(L, t, key2tval(old)), gval(old));
++  }
++  if (nold != dummynode)
++    luaM_freearray(L, nold, twoto(oldhsize), Node);  /* free old array */
++}
++
++
++void luaH_resizearray (lua_State *L, Table *t, int nasize) {
++  int nsize = (t->node == dummynode) ? 0 : sizenode(t);
++  resize(L, t, nasize, nsize);
++}
++
++
++static void rehash (lua_State *L, Table *t, const TValue *ek) {
++  int nasize, na;
++  int nums[MAXBITS+1];  /* nums[i] = number of keys between 2^(i-1) and 2^i */
++  int i;
++  int totaluse;
++  for (i=0; i<=MAXBITS; i++) nums[i] = 0;  /* reset counts */
++  nasize = numusearray(t, nums);  /* count keys in array part */
++  totaluse = nasize;  /* all those keys are integer keys */
++  totaluse += numusehash(t, nums, &nasize);  /* count keys in hash part */
++  /* count extra key */
++  nasize += countint(ek, nums);
++  totaluse++;
++  /* compute new size for array part */
++  na = computesizes(nums, &nasize);
++  /* resize the table to new computed sizes */
++  resize(L, t, nasize, totaluse - na);
++}
++
++
++
++/*
++** }=============================================================
++*/
++
++
++Table *luaH_new (lua_State *L, int narray, int nhash) {
++  Table *t = luaM_new(L, Table);
++  luaC_link(L, obj2gco(t), LUA_TTABLE);
++  t->metatable = NULL;
++  t->flags = cast_byte(~0);
++  /* temporary values (kept only if some malloc fails) */
++  t->array = NULL;
++  t->sizearray = 0;
++  t->lsizenode = 0;
++  t->node = cast(Node *, dummynode);
++  setarrayvector(L, t, narray);
++  setnodevector(L, t, nhash);
++  return t;
++}
++
++
++void luaH_free (lua_State *L, Table *t) {
++  if (t->node != dummynode)
++    luaM_freearray(L, t->node, sizenode(t), Node);
++  luaM_freearray(L, t->array, t->sizearray, TValue);
++  luaM_free(L, t);
++}
++
++
++static Node *getfreepos (Table *t) {
++  while (t->lastfree-- > t->node) {
++    if (ttisnil(gkey(t->lastfree)))
++      return t->lastfree;
++  }
++  return NULL;  /* could not find a free place */
++}
++
++
++
++/*
++** inserts a new key into a hash table; first, check whether key's main 
++** position is free. If not, check whether colliding node is in its main 
++** position or not: if it is not, move colliding node to an empty place and 
++** put new key in its main position; otherwise (colliding node is in its main 
++** position), new key goes to an empty position. 
++*/
++static TValue *newkey (lua_State *L, Table *t, const TValue *key) {
++  Node *mp = mainposition(t, key);
++  if (!ttisnil(gval(mp)) || mp == dummynode) {
++    Node *othern;
++    Node *n = getfreepos(t);  /* get a free place */
++    if (n == NULL) {  /* cannot find a free place? */
++      rehash(L, t, key);  /* grow table */
++      return luaH_set(L, t, key);  /* re-insert key into grown table */
++    }
++    lua_assert(n != dummynode);
++    othern = mainposition(t, key2tval(mp));
++    if (othern != mp) {  /* is colliding node out of its main position? */
++      /* yes; move colliding node into free position */
++      while (gnext(othern) != mp) othern = gnext(othern);  /* find previous */
++      gnext(othern) = n;  /* redo the chain with `n' in place of `mp' */
++      *n = *mp;  /* copy colliding node into free pos. (mp->next also goes) */
++      gnext(mp) = NULL;  /* now `mp' is free */
++      setnilvalue(gval(mp));
++    }
++    else {  /* colliding node is in its own main position */
++      /* new node will go into free position */
++      gnext(n) = gnext(mp);  /* chain new position */
++      gnext(mp) = n;
++      mp = n;
++    }
++  }
++  gkey(mp)->value = key->value; gkey(mp)->tt = key->tt;
++  luaC_barriert(L, t, key);
++  lua_assert(ttisnil(gval(mp)));
++  return gval(mp);
++}
++
++
++/*
++** search function for integers
++*/
++const TValue *luaH_getnum (Table *t, int key) {
++  /* (1 <= key && key <= t->sizearray) */
++  if (cast(unsigned int, key-1) < cast(unsigned int, t->sizearray))
++    return &t->array[key-1];
++  else {
++    lua_Number nk = cast_num(key);
++    Node *n = hashnum(t, nk);
++    do {  /* check whether `key' is somewhere in the chain */
++      if (ttisnumber(gkey(n)) && luai_numeq(nvalue(gkey(n)), nk))
++        return gval(n);  /* that's it */
++      else n = gnext(n);
++    } while (n);
++    return luaO_nilobject;
++  }
++}
++
++
++/*
++** search function for strings
++*/
++const TValue *luaH_getstr (Table *t, TString *key) {
++  Node *n = hashstr(t, key);
++  do {  /* check whether `key' is somewhere in the chain */
++    if (ttisstring(gkey(n)) && rawtsvalue(gkey(n)) == key)
++      return gval(n);  /* that's it */
++    else n = gnext(n);
++  } while (n);
++  return luaO_nilobject;
++}
++
++
++/*
++** main search function
++*/
++const TValue *luaH_get (Table *t, const TValue *key) {
++  switch (ttype(key)) {
++    case LUA_TNIL: return luaO_nilobject;
++    case LUA_TSTRING: return luaH_getstr(t, rawtsvalue(key));
++    case LUA_TNUMBER: {
++      int k;
++      lua_Number n = nvalue(key);
++      lua_number2int(k, n);
++      if (luai_numeq(cast_num(k), nvalue(key))) /* index is int? */
++        return luaH_getnum(t, k);  /* use specialized version */
++      /* else go through */
++    }
++    default: {
++      Node *n = mainposition(t, key);
++      do {  /* check whether `key' is somewhere in the chain */
++        if (luaO_rawequalObj(key2tval(n), key))
++          return gval(n);  /* that's it */
++        else n = gnext(n);
++      } while (n);
++      return luaO_nilobject;
++    }
++  }
++}
++
++
++TValue *luaH_set (lua_State *L, Table *t, const TValue *key) {
++  const TValue *p = luaH_get(t, key);
++  t->flags = 0;
++  if (p != luaO_nilobject)
++    return cast(TValue *, p);
++  else {
++    if (ttisnil(key)) luaG_runerror(L, "table index is nil");
++    else if (ttisnumber(key) && luai_numisnan(nvalue(key)))
++      luaG_runerror(L, "table index is NaN");
++    return newkey(L, t, key);
++  }
++}
++
++
++TValue *luaH_setnum (lua_State *L, Table *t, int key) {
++  const TValue *p = luaH_getnum(t, key);
++  if (p != luaO_nilobject)
++    return cast(TValue *, p);
++  else {
++    TValue k;
++    setnvalue(&k, cast_num(key));
++    return newkey(L, t, &k);
++  }
++}
++
++
++TValue *luaH_setstr (lua_State *L, Table *t, TString *key) {
++  const TValue *p = luaH_getstr(t, key);
++  if (p != luaO_nilobject)
++    return cast(TValue *, p);
++  else {
++    TValue k;
++    setsvalue(L, &k, key);
++    return newkey(L, t, &k);
++  }
++}
++
++
++static int unbound_search (Table *t, unsigned int j) {
++  unsigned int i = j;  /* i is zero or a present index */
++  j++;
++  /* find `i' and `j' such that i is present and j is not */
++  while (!ttisnil(luaH_getnum(t, j))) {
++    i = j;
++    j *= 2;
++    if (j > cast(unsigned int, MAX_INT)) {  /* overflow? */
++      /* table was built with bad purposes: resort to linear search */
++      i = 1;
++      while (!ttisnil(luaH_getnum(t, i))) i++;
++      return i - 1;
++    }
++  }
++  /* now do a binary search between them */
++  while (j - i > 1) {
++    unsigned int m = (i+j)/2;
++    if (ttisnil(luaH_getnum(t, m))) j = m;
++    else i = m;
++  }
++  return i;
++}
++
++
++/*
++** Try to find a boundary in table `t'. A `boundary' is an integer index
++** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil).
++*/
++int luaH_getn (Table *t) {
++  unsigned int j = t->sizearray;
++  if (j > 0 && ttisnil(&t->array[j - 1])) {
++    /* there is a boundary in the array part: (binary) search for it */
++    unsigned int i = 0;
++    while (j - i > 1) {
++      unsigned int m = (i+j)/2;
++      if (ttisnil(&t->array[m - 1])) j = m;
++      else i = m;
++    }
++    return i;
++  }
++  /* else must find a boundary in hash part */
++  else if (t->node == dummynode)  /* hash part is empty? */
++    return j;  /* that is easy... */
++  else return unbound_search(t, j);
++}
++
++
++
++#if defined(LUA_DEBUG)
++
++Node *luaH_mainposition (const Table *t, const TValue *key) {
++  return mainposition(t, key);
++}
++
++int luaH_isdummy (Node *n) { return n == dummynode; }
++
++#endif
+--- /dev/null
++++ b/extensions/LUA/lua/ltable.h
+@@ -0,0 +1,40 @@
++/*
++** $Id: ltable.h,v 2.10.1.1 2007/12/27 13:02:25 roberto Exp $
++** Lua tables (hash)
++** See Copyright Notice in lua.h
++*/
++
++#ifndef ltable_h
++#define ltable_h
++
++#include "lobject.h"
++
++
++#define gnode(t,i)    (&(t)->node[i])
++#define gkey(n)               (&(n)->i_key.nk)
++#define gval(n)               (&(n)->i_val)
++#define gnext(n)      ((n)->i_key.nk.next)
++
++#define key2tval(n)   (&(n)->i_key.tvk)
++
++
++LUAI_FUNC const TValue *luaH_getnum (Table *t, int key);
++LUAI_FUNC TValue *luaH_setnum (lua_State *L, Table *t, int key);
++LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key);
++LUAI_FUNC TValue *luaH_setstr (lua_State *L, Table *t, TString *key);
++LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key);
++LUAI_FUNC TValue *luaH_set (lua_State *L, Table *t, const TValue *key);
++LUAI_FUNC Table *luaH_new (lua_State *L, int narray, int lnhash);
++LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, int nasize);
++LUAI_FUNC void luaH_free (lua_State *L, Table *t);
++LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key);
++LUAI_FUNC int luaH_getn (Table *t);
++
++
++#if defined(LUA_DEBUG)
++LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key);
++LUAI_FUNC int luaH_isdummy (Node *n);
++#endif
++
++
++#endif
+--- /dev/null
++++ b/extensions/LUA/lua/ltablib.c
+@@ -0,0 +1,288 @@
++/*
++** $Id: ltablib.c,v 1.38.1.3 2008/02/14 16:46:58 roberto Exp $
++** Library for Table Manipulation
++** See Copyright Notice in lua.h
++*/
++
++
++#include <stddef.h>
++
++#define ltablib_c
++#define LUA_LIB
++
++#include "lua.h"
++
++#include "lauxlib.h"
++#include "lualib.h"
++
++
++#define aux_getn(L,n) (luaL_checktype(L, n, LUA_TTABLE), luaL_getn(L, n))
++
++
++static int foreachi (lua_State *L) {
++  int i;
++  int n = aux_getn(L, 1);
++  luaL_checktype(L, 2, LUA_TFUNCTION);
++  for (i=1; i <= n; i++) {
++    lua_pushvalue(L, 2);  /* function */
++    lua_pushinteger(L, i);  /* 1st argument */
++    lua_rawgeti(L, 1, i);  /* 2nd argument */
++    lua_call(L, 2, 1);
++    if (!lua_isnil(L, -1))
++      return 1;
++    lua_pop(L, 1);  /* remove nil result */
++  }
++  return 0;
++}
++
++
++static int foreach (lua_State *L) {
++  luaL_checktype(L, 1, LUA_TTABLE);
++  luaL_checktype(L, 2, LUA_TFUNCTION);
++  lua_pushnil(L);  /* first key */
++  while (lua_next(L, 1)) {
++    lua_pushvalue(L, 2);  /* function */
++    lua_pushvalue(L, -3);  /* key */
++    lua_pushvalue(L, -3);  /* value */
++    lua_call(L, 2, 1);
++    if (!lua_isnil(L, -1))
++      return 1;
++    lua_pop(L, 2);  /* remove value and result */
++  }
++  return 0;
++}
++
++
++static int maxn (lua_State *L) {
++  lua_Number max = 0;
++  luaL_checktype(L, 1, LUA_TTABLE);
++  lua_pushnil(L);  /* first key */
++  while (lua_next(L, 1)) {
++    lua_pop(L, 1);  /* remove value */
++    if (lua_type(L, -1) == LUA_TNUMBER) {
++      lua_Number v = lua_tonumber(L, -1);
++      if (v > max) max = v;
++    }
++  }
++  lua_pushnumber(L, max);
++  return 1;
++}
++
++
++static int getn (lua_State *L) {
++  lua_pushinteger(L, aux_getn(L, 1));
++  return 1;
++}
++
++
++static int setn (lua_State *L) {
++  luaL_checktype(L, 1, LUA_TTABLE);
++#ifndef luaL_setn
++  luaL_setn(L, 1, luaL_checkint(L, 2));
++#else
++  luaL_error(L, LUA_QL("setn") " is obsolete");
++#endif
++  lua_pushvalue(L, 1);
++  return 1;
++}
++
++
++static int tinsert (lua_State *L) {
++  int e = aux_getn(L, 1) + 1;  /* first empty element */
++  int pos;  /* where to insert new element */
++  switch (lua_gettop(L)) {
++    case 2: {  /* called with only 2 arguments */
++      pos = e;  /* insert new element at the end */
++      break;
++    }
++    case 3: {
++      int i;
++      pos = luaL_checkint(L, 2);  /* 2nd argument is the position */
++      if (pos > e) e = pos;  /* `grow' array if necessary */
++      for (i = e; i > pos; i--) {  /* move up elements */
++        lua_rawgeti(L, 1, i-1);
++        lua_rawseti(L, 1, i);  /* t[i] = t[i-1] */
++      }
++      break;
++    }
++    default: {
++      return luaL_error(L, "wrong number of arguments to " LUA_QL("insert"));
++    }
++  }
++  luaL_setn(L, 1, e);  /* new size */
++  lua_rawseti(L, 1, pos);  /* t[pos] = v */
++  return 0;
++}
++
++
++static int tremove (lua_State *L) {
++  int e = aux_getn(L, 1);
++  int pos = luaL_optint(L, 2, e);
++  if (!(1 <= pos && pos <= e))  /* position is outside bounds? */
++   return 0;  /* nothing to remove */
++  luaL_setn(L, 1, e - 1);  /* t.n = n-1 */
++  lua_rawgeti(L, 1, pos);  /* result = t[pos] */
++  for ( ;pos<e; pos++) {
++    lua_rawgeti(L, 1, pos+1);
++    lua_rawseti(L, 1, pos);  /* t[pos] = t[pos+1] */
++  }
++  lua_pushnil(L);
++  lua_rawseti(L, 1, e);  /* t[e] = nil */
++  return 1;
++}
++
++
++static void addfield (lua_State *L, luaL_Buffer *b, int i) {
++  lua_rawgeti(L, 1, i);
++  if (!lua_isstring(L, -1))
++    luaL_error(L, "invalid value (%s) at index %d in table for "
++                  LUA_QL("concat"), luaL_typename(L, -1), i);
++    luaL_addvalue(b);
++}
++
++
++static int tconcat (lua_State *L) {
++  size_t lsep;
++  int i, last;
++  const char *sep = luaL_optlstring(L, 2, "", &lsep);
++  luaL_Buffer *b = (luaL_Buffer *)kmalloc(sizeof(luaL_Buffer) + BUFSIZ, GFP_ATOMIC);
++  if(!b) luaL_error(L, "tconcat: cannot allocate memory");
++  luaL_checktype(L, 1, LUA_TTABLE);
++  i = luaL_optint(L, 3, 1);
++  last = luaL_opt(L, luaL_checkint, 4, luaL_getn(L, 1));
++  luaL_buffinit(L, b);
++  for (; i < last; i++) {
++    addfield(L, b, i);
++    luaL_addlstring(b, sep, lsep);
++  }
++  if (i == last)  /* add last value (if interval was not empty) */
++    addfield(L, b, i);
++  luaL_pushresult(b);
++  kfree(b);
++  return 1;
++}
++
++
++
++/*
++** {======================================================
++** Quicksort
++** (based on `Algorithms in MODULA-3', Robert Sedgewick;
++**  Addison-Wesley, 1993.)
++*/
++
++
++static void set2 (lua_State *L, int i, int j) {
++  lua_rawseti(L, 1, i);
++  lua_rawseti(L, 1, j);
++}
++
++static int sort_comp (lua_State *L, int a, int b) {
++  if (!lua_isnil(L, 2)) {  /* function? */
++    int res;
++    lua_pushvalue(L, 2);
++    lua_pushvalue(L, a-1);  /* -1 to compensate function */
++    lua_pushvalue(L, b-2);  /* -2 to compensate function and `a' */
++    lua_call(L, 2, 1);
++    res = lua_toboolean(L, -1);
++    lua_pop(L, 1);
++    return res;
++  }
++  else  /* a < b? */
++    return lua_lessthan(L, a, b);
++}
++
++static void auxsort (lua_State *L, int l, int u) {
++  while (l < u) {  /* for tail recursion */
++    int i, j;
++    /* sort elements a[l], a[(l+u)/2] and a[u] */
++    lua_rawgeti(L, 1, l);
++    lua_rawgeti(L, 1, u);
++    if (sort_comp(L, -1, -2))  /* a[u] < a[l]? */
++      set2(L, l, u);  /* swap a[l] - a[u] */
++    else
++      lua_pop(L, 2);
++    if (u-l == 1) break;  /* only 2 elements */
++    i = (l+u)/2;
++    lua_rawgeti(L, 1, i);
++    lua_rawgeti(L, 1, l);
++    if (sort_comp(L, -2, -1))  /* a[i]<a[l]? */
++      set2(L, i, l);
++    else {
++      lua_pop(L, 1);  /* remove a[l] */
++      lua_rawgeti(L, 1, u);
++      if (sort_comp(L, -1, -2))  /* a[u]<a[i]? */
++        set2(L, i, u);
++      else
++        lua_pop(L, 2);
++    }
++    if (u-l == 2) break;  /* only 3 elements */
++    lua_rawgeti(L, 1, i);  /* Pivot */
++    lua_pushvalue(L, -1);
++    lua_rawgeti(L, 1, u-1);
++    set2(L, i, u-1);
++    /* a[l] <= P == a[u-1] <= a[u], only need to sort from l+1 to u-2 */
++    i = l; j = u-1;
++    for (;;) {  /* invariant: a[l..i] <= P <= a[j..u] */
++      /* repeat ++i until a[i] >= P */
++      while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) {
++        if (i>u) luaL_error(L, "invalid order function for sorting");
++        lua_pop(L, 1);  /* remove a[i] */
++      }
++      /* repeat --j until a[j] <= P */
++      while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) {
++        if (j<l) luaL_error(L, "invalid order function for sorting");
++        lua_pop(L, 1);  /* remove a[j] */
++      }
++      if (j<i) {
++        lua_pop(L, 3);  /* pop pivot, a[i], a[j] */
++        break;
++      }
++      set2(L, i, j);
++    }
++    lua_rawgeti(L, 1, u-1);
++    lua_rawgeti(L, 1, i);
++    set2(L, u-1, i);  /* swap pivot (a[u-1]) with a[i] */
++    /* a[l..i-1] <= a[i] == P <= a[i+1..u] */
++    /* adjust so that smaller half is in [j..i] and larger one in [l..u] */
++    if (i-l < u-i) {
++      j=l; i=i-1; l=i+2;
++    }
++    else {
++      j=i+1; i=u; u=j-2;
++    }
++    auxsort(L, j, i);  /* call recursively the smaller one */
++  }  /* repeat the routine for the larger one */
++}
++
++static int sort (lua_State *L) {
++  int n = aux_getn(L, 1);
++  luaL_checkstack(L, 40, "");  /* assume array is smaller than 2^40 */
++  if (!lua_isnoneornil(L, 2))  /* is there a 2nd argument? */
++    luaL_checktype(L, 2, LUA_TFUNCTION);
++  lua_settop(L, 2);  /* make sure there is two arguments */
++  auxsort(L, 1, n);
++  return 0;
++}
++
++/* }====================================================== */
++
++
++static const luaL_Reg tab_funcs[] = {
++  {"concat", tconcat},
++  {"foreach", foreach},
++  {"foreachi", foreachi},
++  {"getn", getn},
++  {"maxn", maxn},
++  {"insert", tinsert},
++  {"remove", tremove},
++  {"setn", setn},
++  {"sort", sort},
++  {NULL, NULL}
++};
++
++
++LUALIB_API int luaopen_table (lua_State *L) {
++  luaL_register(L, LUA_TABLIBNAME, tab_funcs);
++  return 1;
++}
+--- /dev/null
++++ b/extensions/LUA/lua/ltm.c
+@@ -0,0 +1,74 @@
++/*
++** $Id: ltm.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $
++** Tag methods
++** See Copyright Notice in lua.h
++*/
++
++#include <string.h>
++
++#define ltm_c
++#define LUA_CORE
++
++#include "lua.h"
++
++#include "lobject.h"
++#include "lstate.h"
++#include "lstring.h"
++#include "ltable.h"
++#include "ltm.h"
++
++
++
++const char *const luaT_typenames[] = {
++  "nil", "boolean", "userdata", "number",
++  "string", "table", "function", "userdata", "thread",
++  "proto", "upval"
++};
++
++
++void luaT_init (lua_State *L) {
++  static const char *const luaT_eventname[] = {  /* ORDER TM */
++    "__index", "__newindex",
++    "__gc", "__mode", "__eq",
++    "__add", "__sub", "__mul", "__div", "__mod",
++    "__pow", "__unm", "__len", "__lt", "__le",
++    "__concat", "__call"
++  };
++  int i;
++  for (i=0; i<TM_N; i++) {
++    G(L)->tmname[i] = luaS_new(L, luaT_eventname[i]);
++    luaS_fix(G(L)->tmname[i]);  /* never collect these names */
++  }
++}
++
++
++/*
++** function to be used with macro "fasttm": optimized for absence of
++** tag methods
++*/
++const TValue *luaT_gettm (Table *events, TMS event, TString *ename) {
++  const TValue *tm = luaH_getstr(events, ename);
++  lua_assert(event <= TM_EQ);
++  if (ttisnil(tm)) {  /* no tag method? */
++    events->flags |= cast_byte(1u<<event);  /* cache this fact */
++    return NULL;
++  }
++  else return tm;
++}
++
++
++const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) {
++  Table *mt;
++  switch (ttype(o)) {
++    case LUA_TTABLE:
++      mt = hvalue(o)->metatable;
++      break;
++    case LUA_TUSERDATA:
++      mt = uvalue(o)->metatable;
++      break;
++    default:
++      mt = G(L)->mt[ttype(o)];
++  }
++  return (mt ? luaH_getstr(mt, G(L)->tmname[event]) : luaO_nilobject);
++}
++
+--- /dev/null
++++ b/extensions/LUA/lua/ltm.h
+@@ -0,0 +1,54 @@
++/*
++** $Id: ltm.h,v 2.6.1.1 2007/12/27 13:02:25 roberto Exp $
++** Tag methods
++** See Copyright Notice in lua.h
++*/
++
++#ifndef ltm_h
++#define ltm_h
++
++
++#include "lobject.h"
++
++
++/*
++* WARNING: if you change the order of this enumeration,
++* grep "ORDER TM"
++*/
++typedef enum {
++  TM_INDEX,
++  TM_NEWINDEX,
++  TM_GC,
++  TM_MODE,
++  TM_EQ,  /* last tag method with `fast' access */
++  TM_ADD,
++  TM_SUB,
++  TM_MUL,
++  TM_DIV,
++  TM_MOD,
++  TM_POW,
++  TM_UNM,
++  TM_LEN,
++  TM_LT,
++  TM_LE,
++  TM_CONCAT,
++  TM_CALL,
++  TM_N                /* number of elements in the enum */
++} TMS;
++
++
++
++#define gfasttm(g,et,e) ((et) == NULL ? NULL : \
++  ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e]))
++
++#define fasttm(l,et,e)        gfasttm(G(l), et, e)
++
++LUAI_DATA const char *const luaT_typenames[];
++
++
++LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename);
++LUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o,
++                                                       TMS event);
++LUAI_FUNC void luaT_init (lua_State *L);
++
++#endif
+--- /dev/null
++++ b/extensions/LUA/lua/luaconf.h
+@@ -0,0 +1,797 @@
++/*
++** $Id: luaconf.h,v 1.82.1.7 2008/02/11 16:25:08 roberto Exp $
++** Configuration file for Lua
++** See Copyright Notice in lua.h
++*/
++
++
++#ifndef lconfig_h
++#define lconfig_h
++
++#include <stddef.h>
++
++#if !defined(__KERNEL__)
++#include <limits.h>
++#else
++#define UCHAR_MAX     255
++#define SHRT_MAX        32767
++#define BUFSIZ                8192
++#define NO_FPU
++#endif
++
++/*
++** ==================================================================
++** Search for "@@" to find all configurable definitions.
++** ===================================================================
++*/
++
++
++/*
++@@ LUA_ANSI controls the use of non-ansi features.
++** CHANGE it (define it) if you want Lua to avoid the use of any
++** non-ansi feature or library.
++*/
++#if defined(__STRICT_ANSI__)
++#define LUA_ANSI
++#endif
++
++
++#if !defined(LUA_ANSI) && defined(_WIN32)
++#define LUA_WIN
++#endif
++
++#if defined(LUA_USE_LINUX)
++#define LUA_USE_POSIX
++#define LUA_USE_DLOPEN                /* needs an extra library: -ldl */
++#define LUA_USE_READLINE      /* needs some extra libraries */
++#endif
++
++#if defined(LUA_USE_MACOSX)
++#define LUA_USE_POSIX
++#define LUA_DL_DYLD           /* does not need extra library */
++#endif
++
++
++
++/*
++@@ LUA_USE_POSIX includes all functionallity listed as X/Open System
++@* Interfaces Extension (XSI).
++** CHANGE it (define it) if your system is XSI compatible.
++*/
++#if defined(LUA_USE_POSIX)
++#define LUA_USE_MKSTEMP
++#define LUA_USE_ISATTY
++#define LUA_USE_POPEN
++#define LUA_USE_ULONGJMP
++#endif
++
++
++/*
++@@ LUA_PATH and LUA_CPATH are the names of the environment variables that
++@* Lua check to set its paths.
++@@ LUA_INIT is the name of the environment variable that Lua
++@* checks for initialization code.
++** CHANGE them if you want different names.
++*/
++#define LUA_PATH        "LUA_PATH"
++#define LUA_CPATH       "LUA_CPATH"
++#define LUA_INIT      "LUA_INIT"
++
++
++/*
++@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for
++@* Lua libraries.
++@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for
++@* C libraries.
++** CHANGE them if your machine has a non-conventional directory
++** hierarchy or if you want to install your libraries in
++** non-conventional directories.
++*/
++#if defined(_WIN32)
++/*
++** In Windows, any exclamation mark ('!') in the path is replaced by the
++** path of the directory of the executable file of the current process.
++*/
++#define LUA_LDIR      "!\\lua\\"
++#define LUA_CDIR      "!\\"
++#define LUA_PATH_DEFAULT  \
++              ".\\?.lua;"  LUA_LDIR"?.lua;"  LUA_LDIR"?\\init.lua;" \
++                           LUA_CDIR"?.lua;"  LUA_CDIR"?\\init.lua"
++#define LUA_CPATH_DEFAULT \
++      ".\\?.dll;"  LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll"
++
++#else
++#define LUA_ROOT      "/usr/local/"
++#define LUA_LDIR      LUA_ROOT "share/lua/5.1/"
++#define LUA_CDIR      LUA_ROOT "lib/lua/5.1/"
++#define LUA_PATH_DEFAULT  \
++              "./?.lua;"  LUA_LDIR"?.lua;"  LUA_LDIR"?/init.lua;" \
++                          LUA_CDIR"?.lua;"  LUA_CDIR"?/init.lua"
++#define LUA_CPATH_DEFAULT \
++      "./?.so;"  LUA_CDIR"?.so;" LUA_CDIR"loadall.so"
++#endif
++
++
++/*
++@@ LUA_DIRSEP is the directory separator (for submodules).
++** CHANGE it if your machine does not use "/" as the directory separator
++** and is not Windows. (On Windows Lua automatically uses "\".)
++*/
++#if defined(_WIN32)
++#define LUA_DIRSEP    "\\"
++#else
++#define LUA_DIRSEP    "/"
++#endif
++
++
++/*
++@@ LUA_PATHSEP is the character that separates templates in a path.
++@@ LUA_PATH_MARK is the string that marks the substitution points in a
++@* template.
++@@ LUA_EXECDIR in a Windows path is replaced by the executable's
++@* directory.
++@@ LUA_IGMARK is a mark to ignore all before it when bulding the
++@* luaopen_ function name.
++** CHANGE them if for some reason your system cannot use those
++** characters. (E.g., if one of those characters is a common character
++** in file/directory names.) Probably you do not need to change them.
++*/
++#define LUA_PATHSEP   ";"
++#define LUA_PATH_MARK "?"
++#define LUA_EXECDIR   "!"
++#define LUA_IGMARK    "-"
++
++
++/*
++@@ LUA_INTEGER is the integral type used by lua_pushinteger/lua_tointeger.
++** CHANGE that if ptrdiff_t is not adequate on your machine. (On most
++** machines, ptrdiff_t gives a good choice between int or long.)
++*/
++#define LUA_INTEGER   ptrdiff_t
++
++
++/*
++@@ LUA_API is a mark for all core API functions.
++@@ LUALIB_API is a mark for all standard library functions.
++** CHANGE them if you need to define those functions in some special way.
++** For instance, if you want to create one Windows DLL with the core and
++** the libraries, you may want to use the following definition (define
++** LUA_BUILD_AS_DLL to get it).
++*/
++#if defined(LUA_BUILD_AS_DLL)
++
++#if defined(LUA_CORE) || defined(LUA_LIB)
++#define LUA_API __declspec(dllexport)
++#else
++#define LUA_API __declspec(dllimport)
++#endif
++
++#else
++
++#define LUA_API               extern
++
++#endif
++
++/* more often than not the libs go together with the core */
++#define LUALIB_API    LUA_API
++
++
++/*
++@@ LUAI_FUNC is a mark for all extern functions that are not to be
++@* exported to outside modules.
++@@ LUAI_DATA is a mark for all extern (const) variables that are not to
++@* be exported to outside modules.
++** CHANGE them if you need to mark them in some special way. Elf/gcc
++** (versions 3.2 and later) mark them as "hidden" to optimize access
++** when Lua is compiled as a shared library.
++*/
++#if defined(luaall_c)
++#define LUAI_FUNC     static
++#define LUAI_DATA     /* empty */
++
++#elif defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \
++      defined(__ELF__)
++#define LUAI_FUNC     __attribute__((visibility("hidden"))) extern
++#define LUAI_DATA     LUAI_FUNC
++
++#else
++#define LUAI_FUNC     extern
++#define LUAI_DATA     extern
++#endif
++
++
++
++/*
++@@ LUA_QL describes how error messages quote program elements.
++** CHANGE it if you want a different appearance.
++*/
++#define LUA_QL(x)     "'" x "'"
++#define LUA_QS                LUA_QL("%s")
++
++
++/*
++@@ LUA_IDSIZE gives the maximum size for the description of the source
++@* of a function in debug information.
++** CHANGE it if you want a different size.
++*/
++#define LUA_IDSIZE    60
++
++
++/*
++** {==================================================================
++** Stand-alone configuration
++** ===================================================================
++*/
++
++#if defined(lua_c) || defined(luaall_c)
++
++/*
++@@ lua_stdin_is_tty detects whether the standard input is a 'tty' (that
++@* is, whether we're running lua interactively).
++** CHANGE it if you have a better definition for non-POSIX/non-Windows
++** systems.
++*/
++#if defined(LUA_USE_ISATTY)
++#include <unistd.h>
++#define lua_stdin_is_tty()    isatty(0)
++#elif defined(LUA_WIN)
++#include <io.h>
++#include <stdio.h>
++#define lua_stdin_is_tty()    _isatty(_fileno(stdin))
++#else
++#define lua_stdin_is_tty()    1  /* assume stdin is a tty */
++#endif
++
++
++/*
++@@ LUA_PROMPT is the default prompt used by stand-alone Lua.
++@@ LUA_PROMPT2 is the default continuation prompt used by stand-alone Lua.
++** CHANGE them if you want different prompts. (You can also change the
++** prompts dynamically, assigning to globals _PROMPT/_PROMPT2.)
++*/
++#define LUA_PROMPT            "> "
++#define LUA_PROMPT2           ">> "
++
++
++/*
++@@ LUA_PROGNAME is the default name for the stand-alone Lua program.
++** CHANGE it if your stand-alone interpreter has a different name and
++** your system is not able to detect that name automatically.
++*/
++#define LUA_PROGNAME          "lua"
++
++
++/*
++@@ LUA_MAXINPUT is the maximum length for an input line in the
++@* stand-alone interpreter.
++** CHANGE it if you need longer lines.
++*/
++#define LUA_MAXINPUT  512
++
++
++/*
++@@ lua_readline defines how to show a prompt and then read a line from
++@* the standard input.
++@@ lua_saveline defines how to "save" a read line in a "history".
++@@ lua_freeline defines how to free a line read by lua_readline.
++** CHANGE them if you want to improve this functionality (e.g., by using
++** GNU readline and history facilities).
++*/
++#if defined(LUA_USE_READLINE)
++#include <stdio.h>
++#include <readline/readline.h>
++#include <readline/history.h>
++#define lua_readline(L,b,p)   ((void)L, ((b)=readline(p)) != NULL)
++#define lua_saveline(L,idx) \
++      if (lua_strlen(L,idx) > 0)  /* non-empty line? */ \
++        add_history(lua_tostring(L, idx));  /* add it to history */
++#define lua_freeline(L,b)     ((void)L, free(b))
++#else
++#define lua_readline(L,b,p)   \
++      ((void)L, fputs(p, stdout), fflush(stdout),  /* show prompt */ \
++      fgets(b, LUA_MAXINPUT, stdin) != NULL)  /* get line */
++#define lua_saveline(L,idx)   { (void)L; (void)idx; }
++#define lua_freeline(L,b)     { (void)L; (void)b; }
++#endif
++
++#endif
++
++/* }================================================================== */
++
++
++/*
++@@ LUAI_GCPAUSE defines the default pause between garbage-collector cycles
++@* as a percentage.
++** CHANGE it if you want the GC to run faster or slower (higher values
++** mean larger pauses which mean slower collection.) You can also change
++** this value dynamically.
++*/
++#define LUAI_GCPAUSE  200  /* 200% (wait memory to double before next GC) */
++
++
++/*
++@@ LUAI_GCMUL defines the default speed of garbage collection relative to
++@* memory allocation as a percentage.
++** CHANGE it if you want to change the granularity of the garbage
++** collection. (Higher values mean coarser collections. 0 represents
++** infinity, where each step performs a full collection.) You can also
++** change this value dynamically.
++*/
++#define LUAI_GCMUL    200 /* GC runs 'twice the speed' of memory allocation */
++
++
++
++/*
++@@ LUA_COMPAT_GETN controls compatibility with old getn behavior.
++** CHANGE it (define it) if you want exact compatibility with the
++** behavior of setn/getn in Lua 5.0.
++*/
++#undef LUA_COMPAT_GETN
++
++/*
++@@ LUA_COMPAT_LOADLIB controls compatibility about global loadlib.
++** CHANGE it to undefined as soon as you do not need a global 'loadlib'
++** function (the function is still available as 'package.loadlib').
++*/
++#undef LUA_COMPAT_LOADLIB
++
++/*
++@@ LUA_COMPAT_VARARG controls compatibility with old vararg feature.
++** CHANGE it to undefined as soon as your programs use only '...' to
++** access vararg parameters (instead of the old 'arg' table).
++*/
++#define LUA_COMPAT_VARARG
++
++/*
++@@ LUA_COMPAT_MOD controls compatibility with old math.mod function.
++** CHANGE it to undefined as soon as your programs use 'math.fmod' or
++** the new '%' operator instead of 'math.mod'.
++*/
++#define LUA_COMPAT_MOD
++
++/*
++@@ LUA_COMPAT_LSTR controls compatibility with old long string nesting
++@* facility.
++** CHANGE it to 2 if you want the old behaviour, or undefine it to turn
++** off the advisory error when nesting [[...]].
++*/
++#define LUA_COMPAT_LSTR               1
++
++/*
++@@ LUA_COMPAT_GFIND controls compatibility with old 'string.gfind' name.
++** CHANGE it to undefined as soon as you rename 'string.gfind' to
++** 'string.gmatch'.
++*/
++#define LUA_COMPAT_GFIND
++
++/*
++@@ LUA_COMPAT_OPENLIB controls compatibility with old 'luaL_openlib'
++@* behavior.
++** CHANGE it to undefined as soon as you replace to 'luaL_register'
++** your uses of 'luaL_openlib'
++*/
++#define LUA_COMPAT_OPENLIB
++
++
++
++/*
++@@ luai_apicheck is the assert macro used by the Lua-C API.
++** CHANGE luai_apicheck if you want Lua to perform some checks in the
++** parameters it gets from API calls. This may slow down the interpreter
++** a bit, but may be quite useful when debugging C code that interfaces
++** with Lua. A useful redefinition is to use assert.h.
++*/
++#if defined(LUA_USE_APICHECK)
++#include <assert.h>
++#define luai_apicheck(L,o)    { (void)L; assert(o); }
++#else
++#define luai_apicheck(L,o)    { (void)L; }
++#endif
++
++
++/*
++@@ LUAI_BITSINT defines the number of bits in an int.
++** CHANGE here if Lua cannot automatically detect the number of bits of
++** your machine. Probably you do not need to change this.
++*/
++/* avoid overflows in comparison */
++#if !defined(__KERNEL__)
++#include <limits.h>
++#define LUA_INT_MAX INT_MAX
++#else
++#define LUA_INT_MAX (~0U>>1)
++#endif
++
++#if LUA_INT_MAX-20 < 32760
++#define LUAI_BITSINT  16
++#elif LUA_INT_MAX > 2147483640L
++/* int has at least 32 bits */
++#define LUAI_BITSINT  32
++#else
++#error "you must define LUA_BITSINT with number of bits in an integer"
++#endif
++
++
++/*
++@@ LUAI_UINT32 is an unsigned integer with at least 32 bits.
++@@ LUAI_INT32 is an signed integer with at least 32 bits.
++@@ LUAI_UMEM is an unsigned integer big enough to count the total
++@* memory used by Lua.
++@@ LUAI_MEM is a signed integer big enough to count the total memory
++@* used by Lua.
++** CHANGE here if for some weird reason the default definitions are not
++** good enough for your machine. (The definitions in the 'else'
++** part always works, but may waste space on machines with 64-bit
++** longs.) Probably you do not need to change this.
++*/
++#if LUAI_BITSINT >= 32
++#define LUAI_UINT32   unsigned int
++#define LUAI_INT32    int
++#define LUAI_MAXINT32 INT_MAX
++#define LUAI_UMEM     size_t
++#define LUAI_MEM      ptrdiff_t
++#else
++/* 16-bit ints */
++#define LUAI_UINT32   unsigned long
++#define LUAI_INT32    long
++#define LUAI_MAXINT32 LONG_MAX
++#define LUAI_UMEM     unsigned long
++#define LUAI_MEM      long
++#endif
++
++
++/*
++@@ LUAI_MAXCALLS limits the number of nested calls.
++** CHANGE it if you need really deep recursive calls. This limit is
++** arbitrary; its only purpose is to stop infinite recursion before
++** exhausting memory.
++*/
++#define LUAI_MAXCALLS 20000
++
++
++/*
++@@ LUAI_MAXCSTACK limits the number of Lua stack slots that a C function
++@* can use.
++** CHANGE it if you need lots of (Lua) stack space for your C
++** functions. This limit is arbitrary; its only purpose is to stop C
++** functions to consume unlimited stack space. (must be smaller than
++** -LUA_REGISTRYINDEX)
++*/
++#define LUAI_MAXCSTACK        8000
++
++
++
++/*
++** {==================================================================
++** CHANGE (to smaller values) the following definitions if your system
++** has a small C stack. (Or you may want to change them to larger
++** values if your system has a large C stack and these limits are
++** too rigid for you.) Some of these constants control the size of
++** stack-allocated arrays used by the compiler or the interpreter, while
++** others limit the maximum number of recursive calls that the compiler
++** or the interpreter can perform. Values too large may cause a C stack
++** overflow for some forms of deep constructs.
++** ===================================================================
++*/
++
++
++/*
++@@ LUAI_MAXCCALLS is the maximum depth for nested C calls (short) and
++@* syntactical nested non-terminals in a program.
++*/
++#define LUAI_MAXCCALLS                200
++
++
++/*
++@@ LUAI_MAXVARS is the maximum number of local variables per function
++@* (must be smaller than 250).
++*/
++#define LUAI_MAXVARS          200
++
++
++/*
++@@ LUAI_MAXUPVALUES is the maximum number of upvalues per function
++@* (must be smaller than 250).
++*/
++#define LUAI_MAXUPVALUES      60
++
++
++/*
++@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system.
++*/
++#define LUAL_BUFFERSIZE               BUFSIZ
++
++/* }================================================================== */
++
++
++
++
++/*
++** {==================================================================
++@@ LUA_NUMBER is the type of numbers in Lua.
++** CHANGE the following definitions only if you want to build Lua
++** with a number type different from double. You may also need to
++** change lua_number2int & lua_number2integer.
++** ===================================================================
++*/
++#if !defined(NO_FPU)
++#define LUA_NUMBER_DOUBLE
++#define LUA_NUMBER    double
++#else
++#define LUA_NUMBER    long
++#endif
++
++/*
++@@ LUAI_UACNUMBER is the result of an 'usual argument conversion'
++@* over a number.
++*/
++#define LUAI_UACNUMBER        LUA_NUMBER
++
++
++/*
++@@ LUA_NUMBER_SCAN is the format for reading numbers.
++@@ LUA_NUMBER_FMT is the format for writing numbers.
++@@ lua_number2str converts a number to a string.
++@@ LUAI_MAXNUMBER2STR is maximum size of previous conversion.
++@@ lua_str2number converts a string to a number.
++*/
++#if !defined(NO_FPU)
++#define LUA_NUMBER_SCAN               "%lf"
++#define LUA_NUMBER_FMT                "%.14g"
++#define lua_str2number(s,p)   strtod((s), (p))
++#else
++#define LUA_NUMBER_SCAN               "%ld"
++#define LUA_NUMBER_FMT                "%ld"
++#if !defined(__KERNEL__)
++#define lua_str2number(s,p)   strtol((s), (p), 10)
++#else
++#define lua_str2number(s,p)   simple_strtol((s), (p), 10)
++#endif
++#endif
++
++#define LUAI_MAXNUMBER2STR    32 /* 16 digits, sign, point, and \0 */
++#define lua_number2str(s,n)   sprintf((s), LUA_NUMBER_FMT, (n))
++
++/*
++@@ The luai_num* macros define the primitive operations over numbers.
++*/
++#if defined(LUA_CORE)
++#define luai_numadd(a,b)      ((a)+(b))
++#define luai_numsub(a,b)      ((a)-(b))
++#define luai_nummul(a,b)      ((a)*(b))
++#define luai_numdiv(a,b)      ((a)/(b))
++#define luai_numunm(a)                (-(a))
++#define luai_numeq(a,b)               ((a)==(b))
++#define luai_numlt(a,b)               ((a)<(b))
++#define luai_numle(a,b)               ((a)<=(b))
++#define luai_numisnan(a)      (!luai_numeq((a), (a)))
++#if !defined(NO_FPU)
++#include <math.h>
++#define luai_nummod(a,b)      ((a) - floor((a)/(b))*(b))
++#define luai_numpow(a,b)      (pow(a,b))
++#else
++#define luai_nummod(a,b)      ((a)%(b))
++#define luai_numpow(a,b)      luai_nummul(a,b)
++#endif
++#endif
++
++
++/*
++@@ lua_number2int is a macro to convert lua_Number to int.
++@@ lua_number2integer is a macro to convert lua_Number to lua_Integer.
++** CHANGE them if you know a faster way to convert a lua_Number to
++** int (with any rounding method and without throwing errors) in your
++** system. In Pentium machines, a naive typecast from double to int
++** in C is extremely slow, so any alternative is worth trying.
++*/
++
++/* On a Pentium, resort to a trick */
++#if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) && !defined(__SSE2__) && \
++    (defined(__i386) || defined (_M_IX86) || defined(__i386__))
++
++/* On a Microsoft compiler, use assembler */
++#if defined(_MSC_VER)
++
++#define lua_number2int(i,d)   __asm fld d   __asm fistp i
++#define lua_number2integer(i,n)               lua_number2int(i, n)
++
++/* the next trick should work on any Pentium, but sometimes clashes
++   with a DirectX idiosyncrasy */
++#else
++
++union luai_Cast { double l_d; long l_l; };
++#define lua_number2int(i,d) \
++  { volatile union luai_Cast u; u.l_d = (d) + 6755399441055744.0; (i) = u.l_l; }
++#define lua_number2integer(i,n)               lua_number2int(i, n)
++
++#endif
++
++
++/* this option always works, but may be slow */
++#else
++#define lua_number2int(i,d)   ((i)=(int)(d))
++#define lua_number2integer(i,d)       ((i)=(lua_Integer)(d))
++
++#endif
++
++/* }================================================================== */
++
++
++/*
++@@ LUAI_USER_ALIGNMENT_T is a type that requires maximum alignment.
++** CHANGE it if your system requires alignments larger than double. (For
++** instance, if your system supports long doubles and they must be
++** aligned in 16-byte boundaries, then you should add long double in the
++** union.) Probably you do not need to change this.
++*/
++#define LUAI_USER_ALIGNMENT_T union { double u; void *s; long l; }
++
++
++/*
++@@ LUAI_THROW/LUAI_TRY define how Lua does exception handling.
++** CHANGE them if you prefer to use longjmp/setjmp even with C++
++** or if want/don't to use _longjmp/_setjmp instead of regular
++** longjmp/setjmp. By default, Lua handles errors with exceptions when
++** compiling as C++ code, with _longjmp/_setjmp when asked to use them,
++** and with longjmp/setjmp otherwise.
++*/
++#if defined(__KERNEL__)
++#undef LUA_USE_ULONGJMP
++#endif
++
++#if defined(__cplusplus)
++/* C++ exceptions */
++#define LUAI_THROW(L,c)       throw(c)
++#define LUAI_TRY(L,c,a)       try { a } catch(...) \
++      { if ((c)->status == 0) (c)->status = -1; }
++#define luai_jmpbuf   int  /* dummy variable */
++
++#elif defined(LUA_USE_ULONGJMP)
++/* in Unix, try _longjmp/_setjmp (more efficient) */
++#define LUAI_THROW(L,c)       _longjmp((c)->b, 1)
++#define LUAI_TRY(L,c,a)       if (_setjmp((c)->b) == 0) { a }
++#define luai_jmpbuf   jmp_buf
++
++#else
++/* default handling with long jumps */
++#define LUAI_THROW(L,c)       longjmp((c)->b, 1)
++#define LUAI_TRY(L,c,a)       if (setjmp((c)->b) == 0) { a }
++#define luai_jmpbuf   jmp_buf
++
++#endif
++
++
++/*
++@@ LUA_MAXCAPTURES is the maximum number of captures that a pattern
++@* can do during pattern-matching.
++** CHANGE it if you need more captures. This limit is arbitrary.
++*/
++#define LUA_MAXCAPTURES               32
++
++
++/*
++@@ lua_tmpnam is the function that the OS library uses to create a
++@* temporary name.
++@@ LUA_TMPNAMBUFSIZE is the maximum size of a name created by lua_tmpnam.
++** CHANGE them if you have an alternative to tmpnam (which is considered
++** insecure) or if you want the original tmpnam anyway.  By default, Lua
++** uses tmpnam except when POSIX is available, where it uses mkstemp.
++*/
++#if defined(loslib_c) || defined(luaall_c)
++
++#if defined(LUA_USE_MKSTEMP)
++#include <unistd.h>
++#define LUA_TMPNAMBUFSIZE     32
++#define lua_tmpnam(b,e)       { \
++      strcpy(b, "/tmp/lua_XXXXXX"); \
++      e = mkstemp(b); \
++      if (e != -1) close(e); \
++      e = (e == -1); }
++
++#else
++#define LUA_TMPNAMBUFSIZE     L_tmpnam
++#define lua_tmpnam(b,e)               { e = (tmpnam(b) == NULL); }
++#endif
++
++#endif
++
++
++/*
++@@ lua_popen spawns a new process connected to the current one through
++@* the file streams.
++** CHANGE it if you have a way to implement it in your system.
++*/
++#if defined(LUA_USE_POPEN)
++
++#define lua_popen(L,c,m)      ((void)L, fflush(NULL), popen(c,m))
++#define lua_pclose(L,file)    ((void)L, (pclose(file) != -1))
++
++#elif defined(LUA_WIN)
++
++#define lua_popen(L,c,m)      ((void)L, _popen(c,m))
++#define lua_pclose(L,file)    ((void)L, (_pclose(file) != -1))
++
++#else
++
++#define lua_popen(L,c,m)      ((void)((void)c, m),  \
++              luaL_error(L, LUA_QL("popen") " not supported"), (FILE*)0)
++#define lua_pclose(L,file)            ((void)((void)L, file), 0)
++
++#endif
++
++/*
++@@ LUA_DL_* define which dynamic-library system Lua should use.
++** CHANGE here if Lua has problems choosing the appropriate
++** dynamic-library system for your platform (either Windows' DLL, Mac's
++** dyld, or Unix's dlopen). If your system is some kind of Unix, there
++** is a good chance that it has dlopen, so LUA_DL_DLOPEN will work for
++** it.  To use dlopen you also need to adapt the src/Makefile (probably
++** adding -ldl to the linker options), so Lua does not select it
++** automatically.  (When you change the makefile to add -ldl, you must
++** also add -DLUA_USE_DLOPEN.)
++** If you do not want any kind of dynamic library, undefine all these
++** options.
++** By default, _WIN32 gets LUA_DL_DLL and MAC OS X gets LUA_DL_DYLD.
++*/
++#if defined(LUA_USE_DLOPEN)
++#define LUA_DL_DLOPEN
++#endif
++
++#if defined(LUA_WIN)
++#define LUA_DL_DLL
++#endif
++
++
++/*
++@@ LUAI_EXTRASPACE allows you to add user-specific data in a lua_State
++@* (the data goes just *before* the lua_State pointer).
++** CHANGE (define) this if you really need that. This value must be
++** a multiple of the maximum alignment required for your machine.
++*/
++#define LUAI_EXTRASPACE               0
++
++
++/*
++@@ luai_userstate* allow user-specific actions on threads.
++** CHANGE them if you defined LUAI_EXTRASPACE and need to do something
++** extra when a thread is created/deleted/resumed/yielded.
++*/
++#define luai_userstateopen(L)         ((void)L)
++#define luai_userstateclose(L)                ((void)L)
++#define luai_userstatethread(L,L1)    ((void)L)
++#define luai_userstatefree(L)         ((void)L)
++#define luai_userstateresume(L,n)     ((void)L)
++#define luai_userstateyield(L,n)      ((void)L)
++
++
++/*
++@@ LUA_INTFRMLEN is the length modifier for integer conversions
++@* in 'string.format'.
++@@ LUA_INTFRM_T is the integer type correspoding to the previous length
++@* modifier.
++** CHANGE them if your system supports long long or does not support long.
++*/
++
++#if defined(LUA_USELONGLONG)
++
++#define LUA_INTFRMLEN         "ll"
++#define LUA_INTFRM_T          long long
++
++#else
++
++#define LUA_INTFRMLEN         "l"
++#define LUA_INTFRM_T          long
++
++#endif
++
++/* =================================================================== */
++
++/*
++** Local configuration. You can use this space to add your redefinitions
++** without modifying the main part of the file.
++*/
++
++
++
++#endif
++
+--- /dev/null
++++ b/extensions/LUA/lua/lua.h
+@@ -0,0 +1,387 @@
++/*
++** $Id: lua.h,v 1.218.1.5 2008/08/06 13:30:12 roberto Exp $
++** Lua - An Extensible Extension Language
++** Lua.org, PUC-Rio, Brazil (http://www.lua.org)
++** See Copyright Notice at the end of this file
++*/
++
++
++#ifndef lua_h
++#define lua_h
++
++#include <stdarg.h>
++#include <stddef.h>
++
++#include "luaconf.h"
++
++
++#define LUA_VERSION   "Lua 5.1"
++#define LUA_RELEASE   "Lua 5.1.4"
++#define LUA_VERSION_NUM       501
++#define LUA_COPYRIGHT "Copyright (C) 1994-2008 Lua.org, PUC-Rio"
++#define LUA_AUTHORS   "R. Ierusalimschy, L. H. de Figueiredo & W. Celes"
++
++
++/* mark for precompiled code (`<esc>Lua') */
++#define       LUA_SIGNATURE   "\033Lua"
++
++/* option for multiple returns in `lua_pcall' and `lua_call' */
++#define LUA_MULTRET   (-1)
++
++
++/*
++** pseudo-indices
++*/
++#define LUA_REGISTRYINDEX     (-10000)
++#define LUA_ENVIRONINDEX      (-10001)
++#define LUA_GLOBALSINDEX      (-10002)
++#define lua_upvalueindex(i)   (LUA_GLOBALSINDEX-(i))
++
++
++/* thread status; 0 is OK */
++#define LUA_YIELD     1
++#define LUA_ERRRUN    2
++#define LUA_ERRSYNTAX 3
++#define LUA_ERRMEM    4
++#define LUA_ERRERR    5
++
++
++typedef struct lua_State lua_State;
++
++typedef int (*lua_CFunction) (lua_State *L);
++
++
++/*
++** functions that read/write blocks when loading/dumping Lua chunks
++*/
++typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz);
++
++typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud);
++
++
++/*
++** prototype for memory-allocation functions
++*/
++typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);
++
++
++/*
++** basic types
++*/
++#define LUA_TNONE             (-1)
++
++#define LUA_TNIL              0
++#define LUA_TBOOLEAN          1
++#define LUA_TLIGHTUSERDATA    2
++#define LUA_TNUMBER           3
++#define LUA_TSTRING           4
++#define LUA_TTABLE            5
++#define LUA_TFUNCTION         6
++#define LUA_TUSERDATA         7
++#define LUA_TTHREAD           8
++
++
++
++/* minimum Lua stack available to a C function */
++#define LUA_MINSTACK  20
++
++
++/*
++** generic extra include file
++*/
++#if defined(LUA_USER_H)
++#include LUA_USER_H
++#endif
++
++
++/* type of numbers in Lua */
++typedef LUA_NUMBER lua_Number;
++
++
++/* type for integer functions */
++typedef LUA_INTEGER lua_Integer;
++
++
++
++/*
++** state manipulation
++*/
++LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud);
++LUA_API void       (lua_close) (lua_State *L);
++LUA_API lua_State *(lua_newthread) (lua_State *L);
++
++LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf);
++
++
++/*
++** basic stack manipulation
++*/
++LUA_API int   (lua_gettop) (lua_State *L);
++LUA_API void  (lua_settop) (lua_State *L, int idx);
++LUA_API void  (lua_pushvalue) (lua_State *L, int idx);
++LUA_API void  (lua_remove) (lua_State *L, int idx);
++LUA_API void  (lua_insert) (lua_State *L, int idx);
++LUA_API void  (lua_replace) (lua_State *L, int idx);
++LUA_API int   (lua_checkstack) (lua_State *L, int sz);
++
++LUA_API void  (lua_xmove) (lua_State *from, lua_State *to, int n);
++
++
++/*
++** access functions (stack -> C)
++*/
++
++LUA_API int             (lua_isnumber) (lua_State *L, int idx);
++LUA_API int             (lua_isstring) (lua_State *L, int idx);
++LUA_API int             (lua_iscfunction) (lua_State *L, int idx);
++LUA_API int             (lua_isuserdata) (lua_State *L, int idx);
++LUA_API int             (lua_type) (lua_State *L, int idx);
++LUA_API const char     *(lua_typename) (lua_State *L, int tp);
++
++LUA_API int            (lua_equal) (lua_State *L, int idx1, int idx2);
++LUA_API int            (lua_rawequal) (lua_State *L, int idx1, int idx2);
++LUA_API int            (lua_lessthan) (lua_State *L, int idx1, int idx2);
++
++LUA_API lua_Number      (lua_tonumber) (lua_State *L, int idx);
++LUA_API lua_Integer     (lua_tointeger) (lua_State *L, int idx);
++LUA_API int             (lua_toboolean) (lua_State *L, int idx);
++LUA_API const char     *(lua_tolstring) (lua_State *L, int idx, size_t *len);
++LUA_API size_t          (lua_objlen) (lua_State *L, int idx);
++LUA_API lua_CFunction   (lua_tocfunction) (lua_State *L, int idx);
++LUA_API void         *(lua_touserdata) (lua_State *L, int idx);
++LUA_API lua_State      *(lua_tothread) (lua_State *L, int idx);
++LUA_API const void     *(lua_topointer) (lua_State *L, int idx);
++
++
++/*
++** push functions (C -> stack)
++*/
++LUA_API void  (lua_pushnil) (lua_State *L);
++LUA_API void  (lua_pushnumber) (lua_State *L, lua_Number n);
++LUA_API void  (lua_pushinteger) (lua_State *L, lua_Integer n);
++LUA_API void  (lua_pushlstring) (lua_State *L, const char *s, size_t l);
++LUA_API void  (lua_pushstring) (lua_State *L, const char *s);
++LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt,
++                                                      va_list argp);
++LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...);
++LUA_API void  (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n);
++LUA_API void  (lua_pushboolean) (lua_State *L, int b);
++LUA_API void  (lua_pushlightuserdata) (lua_State *L, void *p);
++LUA_API int   (lua_pushthread) (lua_State *L);
++
++
++/*
++** get functions (Lua -> stack)
++*/
++LUA_API void  (lua_gettable) (lua_State *L, int idx);
++LUA_API void  (lua_getfield) (lua_State *L, int idx, const char *k);
++LUA_API void  (lua_rawget) (lua_State *L, int idx);
++LUA_API void  (lua_rawgeti) (lua_State *L, int idx, int n);
++LUA_API void  (lua_createtable) (lua_State *L, int narr, int nrec);
++LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz);
++LUA_API int   (lua_getmetatable) (lua_State *L, int objindex);
++LUA_API void  (lua_getfenv) (lua_State *L, int idx);
++
++
++/*
++** set functions (stack -> Lua)
++*/
++LUA_API void  (lua_settable) (lua_State *L, int idx);
++LUA_API void  (lua_setfield) (lua_State *L, int idx, const char *k);
++LUA_API void  (lua_rawset) (lua_State *L, int idx);
++LUA_API void  (lua_rawseti) (lua_State *L, int idx, int n);
++LUA_API int   (lua_setmetatable) (lua_State *L, int objindex);
++LUA_API int   (lua_setfenv) (lua_State *L, int idx);
++
++
++/*
++** `load' and `call' functions (load and run Lua code)
++*/
++LUA_API void  (lua_call) (lua_State *L, int nargs, int nresults);
++LUA_API int   (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc);
++LUA_API int   (lua_cpcall) (lua_State *L, lua_CFunction func, void *ud);
++LUA_API int   (lua_load) (lua_State *L, lua_Reader reader, void *dt,
++                                        const char *chunkname);
++
++LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data);
++
++
++/*
++** coroutine functions
++*/
++LUA_API int  (lua_yield) (lua_State *L, int nresults);
++LUA_API int  (lua_resume) (lua_State *L, int narg);
++LUA_API int  (lua_status) (lua_State *L);
++
++/*
++** garbage-collection function and options
++*/
++
++#define LUA_GCSTOP            0
++#define LUA_GCRESTART         1
++#define LUA_GCCOLLECT         2
++#define LUA_GCCOUNT           3
++#define LUA_GCCOUNTB          4
++#define LUA_GCSTEP            5
++#define LUA_GCSETPAUSE                6
++#define LUA_GCSETSTEPMUL      7
++
++LUA_API int (lua_gc) (lua_State *L, int what, int data);
++
++
++/*
++** miscellaneous functions
++*/
++
++LUA_API int   (lua_error) (lua_State *L);
++
++LUA_API int   (lua_next) (lua_State *L, int idx);
++
++LUA_API void  (lua_concat) (lua_State *L, int n);
++
++LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud);
++LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);
++
++
++
++/* 
++** ===============================================================
++** some useful macros
++** ===============================================================
++*/
++
++#define lua_pop(L,n)          lua_settop(L, -(n)-1)
++
++#define lua_newtable(L)               lua_createtable(L, 0, 0)
++
++#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))
++
++#define lua_pushcfunction(L,f)        lua_pushcclosure(L, (f), 0)
++
++#define lua_strlen(L,i)               lua_objlen(L, (i))
++
++#define lua_isfunction(L,n)   (lua_type(L, (n)) == LUA_TFUNCTION)
++#define lua_istable(L,n)      (lua_type(L, (n)) == LUA_TTABLE)
++#define lua_islightuserdata(L,n)      (lua_type(L, (n)) == LUA_TLIGHTUSERDATA)
++#define lua_isnil(L,n)                (lua_type(L, (n)) == LUA_TNIL)
++#define lua_isboolean(L,n)    (lua_type(L, (n)) == LUA_TBOOLEAN)
++#define lua_isthread(L,n)     (lua_type(L, (n)) == LUA_TTHREAD)
++#define lua_isnone(L,n)               (lua_type(L, (n)) == LUA_TNONE)
++#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0)
++
++#define lua_pushliteral(L, s) \
++      lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1)
++
++#define lua_setglobal(L,s)    lua_setfield(L, LUA_GLOBALSINDEX, (s))
++#define lua_getglobal(L,s)    lua_getfield(L, LUA_GLOBALSINDEX, (s))
++
++#define lua_tostring(L,i)     lua_tolstring(L, (i), NULL)
++
++
++
++/*
++** compatibility macros and functions
++*/
++
++#define lua_open()    luaL_newstate()
++
++#define lua_getregistry(L)    lua_pushvalue(L, LUA_REGISTRYINDEX)
++
++#define lua_getgccount(L)     lua_gc(L, LUA_GCCOUNT, 0)
++
++#define lua_Chunkreader               lua_Reader
++#define lua_Chunkwriter               lua_Writer
++
++
++/* hack */
++LUA_API void lua_setlevel     (lua_State *from, lua_State *to);
++
++
++/*
++** {======================================================================
++** Debug API
++** =======================================================================
++*/
++
++
++/*
++** Event codes
++*/
++#define LUA_HOOKCALL  0
++#define LUA_HOOKRET   1
++#define LUA_HOOKLINE  2
++#define LUA_HOOKCOUNT 3
++#define LUA_HOOKTAILRET 4
++
++
++/*
++** Event masks
++*/
++#define LUA_MASKCALL  (1 << LUA_HOOKCALL)
++#define LUA_MASKRET   (1 << LUA_HOOKRET)
++#define LUA_MASKLINE  (1 << LUA_HOOKLINE)
++#define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT)
++
++typedef struct lua_Debug lua_Debug;  /* activation record */
++
++
++/* Functions to be called by the debuger in specific events */
++typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);
++
++
++LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar);
++LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);
++LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n);
++LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n);
++LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n);
++LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n);
++
++LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count);
++LUA_API lua_Hook lua_gethook (lua_State *L);
++LUA_API int lua_gethookmask (lua_State *L);
++LUA_API int lua_gethookcount (lua_State *L);
++
++
++struct lua_Debug {
++  int event;
++  const char *name;   /* (n) */
++  const char *namewhat;       /* (n) `global', `local', `field', `method' */
++  const char *what;   /* (S) `Lua', `C', `main', `tail' */
++  const char *source; /* (S) */
++  int currentline;    /* (l) */
++  int nups;           /* (u) number of upvalues */
++  int linedefined;    /* (S) */
++  int lastlinedefined;        /* (S) */
++  char short_src[LUA_IDSIZE]; /* (S) */
++  /* private part */
++  int i_ci;  /* active function */
++};
++
++/* }====================================================================== */
++
++
++/******************************************************************************
++* Copyright (C) 1994-2008 Lua.org, PUC-Rio.  All rights reserved.
++*
++* Permission is hereby granted, free of charge, to any person obtaining
++* a copy of this software and associated documentation files (the
++* "Software"), to deal in the Software without restriction, including
++* without limitation the rights to use, copy, modify, merge, publish,
++* distribute, sublicense, and/or sell copies of the Software, and to
++* permit persons to whom the Software is furnished to do so, subject to
++* the following conditions:
++*
++* The above copyright notice and this permission notice shall be
++* included in all copies or substantial portions of the Software.
++*
++* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
++* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
++* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
++* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
++* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
++******************************************************************************/
++
++
++#endif
+--- /dev/null
++++ b/extensions/LUA/lua/lualib.h
+@@ -0,0 +1,55 @@
++/*
++** $Id: lualib.h,v 1.36.1.1 2007/12/27 13:02:25 roberto Exp $
++** Lua standard libraries
++** See Copyright Notice in lua.h
++*/
++
++
++#ifndef lualib_h
++#define lualib_h
++
++#include "lua.h"
++
++
++/* Key to file-handle type */
++#define LUA_FILEHANDLE                "FILE*"
++
++
++#define LUA_COLIBNAME "coroutine"
++LUALIB_API int (luaopen_base) (lua_State *L);
++
++#define LUA_TABLIBNAME        "table"
++LUALIB_API int (luaopen_table) (lua_State *L);
++/*
++#define LUA_IOLIBNAME "io"
++LUALIB_API int (luaopen_io) (lua_State *L);
++
++#define LUA_OSLIBNAME "os"
++LUALIB_API int (luaopen_os) (lua_State *L);
++*/
++
++#define LUA_STRLIBNAME        "string"
++LUALIB_API int (luaopen_string) (lua_State *L);
++
++/*
++#define LUA_MATHLIBNAME       "math"
++LUALIB_API int (luaopen_math) (lua_State *L);
++
++#define LUA_DBLIBNAME "debug"
++LUALIB_API int (luaopen_debug) (lua_State *L);
++
++#define LUA_LOADLIBNAME       "package"
++LUALIB_API int (luaopen_package) (lua_State *L);
++*/
++
++/* open all previous libraries */
++LUALIB_API void (luaL_openlibs) (lua_State *L);
++
++
++
++#ifndef lua_assert
++#define lua_assert(x) ((void)0)
++#endif
++
++
++#endif
+--- /dev/null
++++ b/extensions/LUA/lua/lundump.c
+@@ -0,0 +1,227 @@
++/*
++** $Id: lundump.c,v 2.7.1.4 2008/04/04 19:51:41 roberto Exp $
++** load precompiled Lua chunks
++** See Copyright Notice in lua.h
++*/
++
++#include <string.h>
++
++#define lundump_c
++#define LUA_CORE
++
++#include "lua.h"
++
++#include "ldebug.h"
++#include "ldo.h"
++#include "lfunc.h"
++#include "lmem.h"
++#include "lobject.h"
++#include "lstring.h"
++#include "lundump.h"
++#include "lzio.h"
++
++typedef struct {
++ lua_State* L;
++ ZIO* Z;
++ Mbuffer* b;
++ const char* name;
++} LoadState;
++
++#ifdef LUAC_TRUST_BINARIES
++#define IF(c,s)
++#define error(S,s)
++#else
++#define IF(c,s)               if (c) error(S,s)
++
++static void error(LoadState* S, const char* why)
++{
++ luaO_pushfstring(S->L,"%s: %s in precompiled chunk",S->name,why);
++ luaD_throw(S->L,LUA_ERRSYNTAX);
++}
++#endif
++
++#define LoadMem(S,b,n,size)   LoadBlock(S,b,(n)*(size))
++#define       LoadByte(S)             (lu_byte)LoadChar(S)
++#define LoadVar(S,x)          LoadMem(S,&x,1,sizeof(x))
++#define LoadVector(S,b,n,size)        LoadMem(S,b,n,size)
++
++static void LoadBlock(LoadState* S, void* b, size_t size)
++{
++ size_t r=luaZ_read(S->Z,b,size);
++ IF (r!=0, "unexpected end");
++}
++
++static int LoadChar(LoadState* S)
++{
++ char x;
++ LoadVar(S,x);
++ return x;
++}
++
++static int LoadInt(LoadState* S)
++{
++ int x;
++ LoadVar(S,x);
++ IF (x<0, "bad integer");
++ return x;
++}
++
++static lua_Number LoadNumber(LoadState* S)
++{
++ lua_Number x;
++ LoadVar(S,x);
++ return x;
++}
++
++static TString* LoadString(LoadState* S)
++{
++ size_t size;
++ LoadVar(S,size);
++ if (size==0)
++  return NULL;
++ else
++ {
++  char* s=luaZ_openspace(S->L,S->b,size);
++  LoadBlock(S,s,size);
++  return luaS_newlstr(S->L,s,size-1);         /* remove trailing '\0' */
++ }
++}
++
++static void LoadCode(LoadState* S, Proto* f)
++{
++ int n=LoadInt(S);
++ f->code=luaM_newvector(S->L,n,Instruction);
++ f->sizecode=n;
++ LoadVector(S,f->code,n,sizeof(Instruction));
++}
++
++static Proto* LoadFunction(LoadState* S, TString* p);
++
++static void LoadConstants(LoadState* S, Proto* f)
++{
++ int i,n;
++ n=LoadInt(S);
++ f->k=luaM_newvector(S->L,n,TValue);
++ f->sizek=n;
++ for (i=0; i<n; i++) setnilvalue(&f->k[i]);
++ for (i=0; i<n; i++)
++ {
++  TValue* o=&f->k[i];
++  int t=LoadChar(S);
++  switch (t)
++  {
++   case LUA_TNIL:
++      setnilvalue(o);
++      break;
++   case LUA_TBOOLEAN:
++      setbvalue(o,LoadChar(S)!=0);
++      break;
++   case LUA_TNUMBER:
++      setnvalue(o,LoadNumber(S));
++      break;
++   case LUA_TSTRING:
++      setsvalue2n(S->L,o,LoadString(S));
++      break;
++   default:
++      error(S,"bad constant");
++      break;
++  }
++ }
++ n=LoadInt(S);
++ f->p=luaM_newvector(S->L,n,Proto*);
++ f->sizep=n;
++ for (i=0; i<n; i++) f->p[i]=NULL;
++ for (i=0; i<n; i++) f->p[i]=LoadFunction(S,f->source);
++}
++
++static void LoadDebug(LoadState* S, Proto* f)
++{
++ int i,n;
++ n=LoadInt(S);
++ f->lineinfo=luaM_newvector(S->L,n,int);
++ f->sizelineinfo=n;
++ LoadVector(S,f->lineinfo,n,sizeof(int));
++ n=LoadInt(S);
++ f->locvars=luaM_newvector(S->L,n,LocVar);
++ f->sizelocvars=n;
++ for (i=0; i<n; i++) f->locvars[i].varname=NULL;
++ for (i=0; i<n; i++)
++ {
++  f->locvars[i].varname=LoadString(S);
++  f->locvars[i].startpc=LoadInt(S);
++  f->locvars[i].endpc=LoadInt(S);
++ }
++ n=LoadInt(S);
++ f->upvalues=luaM_newvector(S->L,n,TString*);
++ f->sizeupvalues=n;
++ for (i=0; i<n; i++) f->upvalues[i]=NULL;
++ for (i=0; i<n; i++) f->upvalues[i]=LoadString(S);
++}
++
++static Proto* LoadFunction(LoadState* S, TString* p)
++{
++ Proto* f;
++ if (++S->L->nCcalls > LUAI_MAXCCALLS) error(S,"code too deep");
++ f=luaF_newproto(S->L);
++ setptvalue2s(S->L,S->L->top,f); incr_top(S->L);
++ f->source=LoadString(S); if (f->source==NULL) f->source=p;
++ f->linedefined=LoadInt(S);
++ f->lastlinedefined=LoadInt(S);
++ f->nups=LoadByte(S);
++ f->numparams=LoadByte(S);
++ f->is_vararg=LoadByte(S);
++ f->maxstacksize=LoadByte(S);
++ LoadCode(S,f);
++ LoadConstants(S,f);
++ LoadDebug(S,f);
++ IF (!luaG_checkcode(f), "bad code");
++ S->L->top--;
++ S->L->nCcalls--;
++ return f;
++}
++
++static void LoadHeader(LoadState* S)
++{
++ char h[LUAC_HEADERSIZE];
++ char s[LUAC_HEADERSIZE];
++ luaU_header(h);
++ LoadBlock(S,s,LUAC_HEADERSIZE);
++ IF (memcmp(h,s,LUAC_HEADERSIZE)!=0, "bad header");
++}
++
++/*
++** load precompiled chunk
++*/
++Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name)
++{
++ LoadState S;
++ if (*name=='@' || *name=='=')
++  S.name=name+1;
++ else if (*name==LUA_SIGNATURE[0])
++  S.name="binary string";
++ else
++  S.name=name;
++ S.L=L;
++ S.Z=Z;
++ S.b=buff;
++ LoadHeader(&S);
++ return LoadFunction(&S,luaS_newliteral(L,"=?"));
++}
++
++/*
++* make header
++*/
++void luaU_header (char* h)
++{
++ int x=1;
++ memcpy(h,LUA_SIGNATURE,sizeof(LUA_SIGNATURE)-1);
++ h+=sizeof(LUA_SIGNATURE)-1;
++ *h++=(char)LUAC_VERSION;
++ *h++=(char)LUAC_FORMAT;
++ *h++=(char)*(char*)&x;                               /* endianness */
++ *h++=(char)sizeof(int);
++ *h++=(char)sizeof(size_t);
++ *h++=(char)sizeof(Instruction);
++ *h++=(char)sizeof(lua_Number);
++ *h++=(char)(((lua_Number)0.5)==0);           /* is lua_Number integral? */
++}
+--- /dev/null
++++ b/extensions/LUA/lua/lundump.h
+@@ -0,0 +1,36 @@
++/*
++** $Id: lundump.h,v 1.37.1.1 2007/12/27 13:02:25 roberto Exp $
++** load precompiled Lua chunks
++** See Copyright Notice in lua.h
++*/
++
++#ifndef lundump_h
++#define lundump_h
++
++#include "lobject.h"
++#include "lzio.h"
++
++/* load one chunk; from lundump.c */
++LUAI_FUNC Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name);
++
++/* make header; from lundump.c */
++LUAI_FUNC void luaU_header (char* h);
++
++/* dump one chunk; from ldump.c */
++LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip);
++
++#ifdef luac_c
++/* print one chunk; from print.c */
++LUAI_FUNC void luaU_print (const Proto* f, int full);
++#endif
++
++/* for header of binary files -- this is Lua 5.1 */
++#define LUAC_VERSION          0x51
++
++/* for header of binary files -- this is the official format */
++#define LUAC_FORMAT           0
++
++/* size of header of binary files */
++#define LUAC_HEADERSIZE               12
++
++#endif
+--- /dev/null
++++ b/extensions/LUA/lua/lvm.c
+@@ -0,0 +1,762 @@
++/*
++** $Id: lvm.c,v 2.63.1.3 2007/12/28 15:32:23 roberto Exp $
++** Lua virtual machine
++** See Copyright Notice in lua.h
++*/
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++
++#define lvm_c
++#define LUA_CORE
++
++#include "lua.h"
++
++#include "ldebug.h"
++#include "ldo.h"
++#include "lfunc.h"
++#include "lgc.h"
++#include "lobject.h"
++#include "lopcodes.h"
++#include "lstate.h"
++#include "lstring.h"
++#include "ltable.h"
++#include "ltm.h"
++#include "lvm.h"
++
++
++
++/* limit for table tag-method chains (to avoid loops) */
++#define MAXTAGLOOP    100
++
++
++const TValue *luaV_tonumber (const TValue *obj, TValue *n) {
++  lua_Number num;
++  if (ttisnumber(obj)) return obj;
++  if (ttisstring(obj) && luaO_str2d(svalue(obj), &num)) {
++    setnvalue(n, num);
++    return n;
++  }
++  else
++    return NULL;
++}
++
++
++int luaV_tostring (lua_State *L, StkId obj) {
++  if (!ttisnumber(obj))
++    return 0;
++  else {
++    char s[LUAI_MAXNUMBER2STR];
++    lua_Number n = nvalue(obj);
++    lua_number2str(s, n);
++    setsvalue2s(L, obj, luaS_new(L, s));
++    return 1;
++  }
++}
++
++
++static void traceexec (lua_State *L, const Instruction *pc) {
++  lu_byte mask = L->hookmask;
++  const Instruction *oldpc = L->savedpc;
++  L->savedpc = pc;
++  if ((mask & LUA_MASKCOUNT) && L->hookcount == 0) {
++    resethookcount(L);
++    luaD_callhook(L, LUA_HOOKCOUNT, -1);
++  }
++  if (mask & LUA_MASKLINE) {
++    Proto *p = ci_func(L->ci)->l.p;
++    int npc = pcRel(pc, p);
++    int newline = getline(p, npc);
++    /* call linehook when enter a new function, when jump back (loop),
++       or when enter a new line */
++    if (npc == 0 || pc <= oldpc || newline != getline(p, pcRel(oldpc, p)))
++      luaD_callhook(L, LUA_HOOKLINE, newline);
++  }
++}
++
++
++static void callTMres (lua_State *L, StkId res, const TValue *f,
++                        const TValue *p1, const TValue *p2) {
++  ptrdiff_t result = savestack(L, res);
++  setobj2s(L, L->top, f);  /* push function */
++  setobj2s(L, L->top+1, p1);  /* 1st argument */
++  setobj2s(L, L->top+2, p2);  /* 2nd argument */
++  luaD_checkstack(L, 3);
++  L->top += 3;
++  luaD_call(L, L->top - 3, 1);
++  res = restorestack(L, result);
++  L->top--;
++  setobjs2s(L, res, L->top);
++}
++
++
++
++static void callTM (lua_State *L, const TValue *f, const TValue *p1,
++                    const TValue *p2, const TValue *p3) {
++  setobj2s(L, L->top, f);  /* push function */
++  setobj2s(L, L->top+1, p1);  /* 1st argument */
++  setobj2s(L, L->top+2, p2);  /* 2nd argument */
++  setobj2s(L, L->top+3, p3);  /* 3th argument */
++  luaD_checkstack(L, 4);
++  L->top += 4;
++  luaD_call(L, L->top - 4, 0);
++}
++
++
++void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) {
++  int loop;
++  for (loop = 0; loop < MAXTAGLOOP; loop++) {
++    const TValue *tm;
++    if (ttistable(t)) {  /* `t' is a table? */
++      Table *h = hvalue(t);
++      const TValue *res = luaH_get(h, key); /* do a primitive get */
++      if (!ttisnil(res) ||  /* result is no nil? */
++          (tm = fasttm(L, h->metatable, TM_INDEX)) == NULL) { /* or no TM? */
++        setobj2s(L, val, res);
++        return;
++      }
++      /* else will try the tag method */
++    }
++    else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX)))
++      luaG_typeerror(L, t, "index");
++    if (ttisfunction(tm)) {
++      callTMres(L, val, tm, t, key);
++      return;
++    }
++    t = tm;  /* else repeat with `tm' */ 
++  }
++  luaG_runerror(L, "loop in gettable");
++}
++
++
++void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) {
++  int loop;
++  for (loop = 0; loop < MAXTAGLOOP; loop++) {
++    const TValue *tm;
++    if (ttistable(t)) {  /* `t' is a table? */
++      Table *h = hvalue(t);
++      TValue *oldval = luaH_set(L, h, key); /* do a primitive set */
++      if (!ttisnil(oldval) ||  /* result is no nil? */
++          (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */
++        setobj2t(L, oldval, val);
++        luaC_barriert(L, h, val);
++        return;
++      }
++      /* else will try the tag method */
++    }
++    else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX)))
++      luaG_typeerror(L, t, "index");
++    if (ttisfunction(tm)) {
++      callTM(L, tm, t, key, val);
++      return;
++    }
++    t = tm;  /* else repeat with `tm' */ 
++  }
++  luaG_runerror(L, "loop in settable");
++}
++
++
++static int call_binTM (lua_State *L, const TValue *p1, const TValue *p2,
++                       StkId res, TMS event) {
++  const TValue *tm = luaT_gettmbyobj(L, p1, event);  /* try first operand */
++  if (ttisnil(tm))
++    tm = luaT_gettmbyobj(L, p2, event);  /* try second operand */
++  if (ttisnil(tm)) return 0;
++  callTMres(L, res, tm, p1, p2);
++  return 1;
++}
++
++
++static const TValue *get_compTM (lua_State *L, Table *mt1, Table *mt2,
++                                  TMS event) {
++  const TValue *tm1 = fasttm(L, mt1, event);
++  const TValue *tm2;
++  if (tm1 == NULL) return NULL;  /* no metamethod */
++  if (mt1 == mt2) return tm1;  /* same metatables => same metamethods */
++  tm2 = fasttm(L, mt2, event);
++  if (tm2 == NULL) return NULL;  /* no metamethod */
++  if (luaO_rawequalObj(tm1, tm2))  /* same metamethods? */
++    return tm1;
++  return NULL;
++}
++
++
++static int call_orderTM (lua_State *L, const TValue *p1, const TValue *p2,
++                         TMS event) {
++  const TValue *tm1 = luaT_gettmbyobj(L, p1, event);
++  const TValue *tm2;
++  if (ttisnil(tm1)) return -1;  /* no metamethod? */
++  tm2 = luaT_gettmbyobj(L, p2, event);
++  if (!luaO_rawequalObj(tm1, tm2))  /* different metamethods? */
++    return -1;
++  callTMres(L, L->top, tm1, p1, p2);
++  return !l_isfalse(L->top);
++}
++
++
++static int l_strcmp (const TString *ls, const TString *rs) {
++  const char *l = getstr(ls);
++  size_t ll = ls->tsv.len;
++  const char *r = getstr(rs);
++  size_t lr = rs->tsv.len;
++  for (;;) {
++    int temp = strcoll(l, r);
++    if (temp != 0) return temp;
++    else {  /* strings are equal up to a `\0' */
++      size_t len = strlen(l);  /* index of first `\0' in both strings */
++      if (len == lr)  /* r is finished? */
++        return (len == ll) ? 0 : 1;
++      else if (len == ll)  /* l is finished? */
++        return -1;  /* l is smaller than r (because r is not finished) */
++      /* both strings longer than `len'; go on comparing (after the `\0') */
++      len++;
++      l += len; ll -= len; r += len; lr -= len;
++    }
++  }
++}
++
++
++int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) {
++  int res;
++  if (ttype(l) != ttype(r))
++    return luaG_ordererror(L, l, r);
++  else if (ttisnumber(l))
++    return luai_numlt(nvalue(l), nvalue(r));
++  else if (ttisstring(l))
++    return l_strcmp(rawtsvalue(l), rawtsvalue(r)) < 0;
++  else if ((res = call_orderTM(L, l, r, TM_LT)) != -1)
++    return res;
++  return luaG_ordererror(L, l, r);
++}
++
++
++static int lessequal (lua_State *L, const TValue *l, const TValue *r) {
++  int res;
++  if (ttype(l) != ttype(r))
++    return luaG_ordererror(L, l, r);
++  else if (ttisnumber(l))
++    return luai_numle(nvalue(l), nvalue(r));
++  else if (ttisstring(l))
++    return l_strcmp(rawtsvalue(l), rawtsvalue(r)) <= 0;
++  else if ((res = call_orderTM(L, l, r, TM_LE)) != -1)  /* first try `le' */
++    return res;
++  else if ((res = call_orderTM(L, r, l, TM_LT)) != -1)  /* else try `lt' */
++    return !res;
++  return luaG_ordererror(L, l, r);
++}
++
++
++int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2) {
++  const TValue *tm;
++  lua_assert(ttype(t1) == ttype(t2));
++  switch (ttype(t1)) {
++    case LUA_TNIL: return 1;
++    case LUA_TNUMBER: return luai_numeq(nvalue(t1), nvalue(t2));
++    case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2);  /* true must be 1 !! */
++    case LUA_TLIGHTUSERDATA: return pvalue(t1) == pvalue(t2);
++    case LUA_TUSERDATA: {
++      if (uvalue(t1) == uvalue(t2)) return 1;
++      tm = get_compTM(L, uvalue(t1)->metatable, uvalue(t2)->metatable,
++                         TM_EQ);
++      break;  /* will try TM */
++    }
++    case LUA_TTABLE: {
++      if (hvalue(t1) == hvalue(t2)) return 1;
++      tm = get_compTM(L, hvalue(t1)->metatable, hvalue(t2)->metatable, TM_EQ);
++      break;  /* will try TM */
++    }
++    default: return gcvalue(t1) == gcvalue(t2);
++  }
++  if (tm == NULL) return 0;  /* no TM? */
++  callTMres(L, L->top, tm, t1, t2);  /* call TM */
++  return !l_isfalse(L->top);
++}
++
++
++void luaV_concat (lua_State *L, int total, int last) {
++  do {
++    StkId top = L->base + last + 1;
++    int n = 2;  /* number of elements handled in this pass (at least 2) */
++    if (!(ttisstring(top-2) || ttisnumber(top-2)) || !tostring(L, top-1)) {
++      if (!call_binTM(L, top-2, top-1, top-2, TM_CONCAT))
++        luaG_concaterror(L, top-2, top-1);
++    } else if (tsvalue(top-1)->len == 0)  /* second op is empty? */
++      (void)tostring(L, top - 2);  /* result is first op (as string) */
++    else {
++      /* at least two string values; get as many as possible */
++      size_t tl = tsvalue(top-1)->len;
++      char *buffer;
++      int i;
++      /* collect total length */
++      for (n = 1; n < total && tostring(L, top-n-1); n++) {
++        size_t l = tsvalue(top-n-1)->len;
++        if (l >= MAX_SIZET - tl) luaG_runerror(L, "string length overflow");
++        tl += l;
++      }
++      buffer = luaZ_openspace(L, &G(L)->buff, tl);
++      tl = 0;
++      for (i=n; i>0; i--) {  /* concat all strings */
++        size_t l = tsvalue(top-i)->len;
++        memcpy(buffer+tl, svalue(top-i), l);
++        tl += l;
++      }
++      setsvalue2s(L, top-n, luaS_newlstr(L, buffer, tl));
++    }
++    total -= n-1;  /* got `n' strings to create 1 new */
++    last -= n-1;
++  } while (total > 1);  /* repeat until only 1 result left */
++}
++
++
++static void Arith (lua_State *L, StkId ra, const TValue *rb,
++                   const TValue *rc, TMS op) {
++  TValue tempb, tempc;
++  const TValue *b, *c;
++  if ((b = luaV_tonumber(rb, &tempb)) != NULL &&
++      (c = luaV_tonumber(rc, &tempc)) != NULL) {
++    lua_Number nb = nvalue(b), nc = nvalue(c);
++    switch (op) {
++      case TM_ADD: setnvalue(ra, luai_numadd(nb, nc)); break;
++      case TM_SUB: setnvalue(ra, luai_numsub(nb, nc)); break;
++      case TM_MUL: setnvalue(ra, luai_nummul(nb, nc)); break;
++      case TM_DIV: setnvalue(ra, luai_numdiv(nb, nc)); break;
++      case TM_MOD: setnvalue(ra, luai_nummod(nb, nc)); break;
++      case TM_POW: setnvalue(ra, luai_numpow(nb, nc)); break;
++      case TM_UNM: setnvalue(ra, luai_numunm(nb)); break;
++      default: lua_assert(0); break;
++    }
++  }
++  else if (!call_binTM(L, rb, rc, ra, op))
++    luaG_aritherror(L, rb, rc);
++}
++
++
++
++/*
++** some macros for common tasks in `luaV_execute'
++*/
++
++#define runtime_check(L, c)   { if (!(c)) break; }
++
++#define RA(i) (base+GETARG_A(i))
++/* to be used after possible stack reallocation */
++#define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i))
++#define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i))
++#define RKB(i)        check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \
++      ISK(GETARG_B(i)) ? k+INDEXK(GETARG_B(i)) : base+GETARG_B(i))
++#define RKC(i)        check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \
++      ISK(GETARG_C(i)) ? k+INDEXK(GETARG_C(i)) : base+GETARG_C(i))
++#define KBx(i)        check_exp(getBMode(GET_OPCODE(i)) == OpArgK, k+GETARG_Bx(i))
++
++
++#define dojump(L,pc,i)        {(pc) += (i); luai_threadyield(L);}
++
++
++#define Protect(x)    { L->savedpc = pc; {x;}; base = L->base; }
++
++
++#define arith_op(op,tm) { \
++        TValue *rb = RKB(i); \
++        TValue *rc = RKC(i); \
++        if (ttisnumber(rb) && ttisnumber(rc)) { \
++          lua_Number nb = nvalue(rb), nc = nvalue(rc); \
++          setnvalue(ra, op(nb, nc)); \
++        } \
++        else \
++          Protect(Arith(L, ra, rb, rc, tm)); \
++      }
++
++
++
++void luaV_execute (lua_State *L, int nexeccalls) {
++  LClosure *cl;
++  StkId base;
++  TValue *k;
++  const Instruction *pc;
++ reentry:  /* entry point */
++  lua_assert(isLua(L->ci));
++  pc = L->savedpc;
++  cl = &clvalue(L->ci->func)->l;
++  base = L->base;
++  k = cl->p->k;
++  /* main loop of interpreter */
++  for (;;) {
++    const Instruction i = *pc++;
++    StkId ra;
++    if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) &&
++        (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) {
++      traceexec(L, pc);
++      if (L->status == LUA_YIELD) {  /* did hook yield? */
++        L->savedpc = pc - 1;
++        return;
++      }
++      base = L->base;
++    }
++    /* warning!! several calls may realloc the stack and invalidate `ra' */
++    ra = RA(i);
++    lua_assert(base == L->base && L->base == L->ci->base);
++    lua_assert(base <= L->top && L->top <= L->stack + L->stacksize);
++    lua_assert(L->top == L->ci->top || luaG_checkopenop(i));
++    switch (GET_OPCODE(i)) {
++      case OP_MOVE: {
++        setobjs2s(L, ra, RB(i));
++        continue;
++      }
++      case OP_LOADK: {
++        setobj2s(L, ra, KBx(i));
++        continue;
++      }
++      case OP_LOADBOOL: {
++        setbvalue(ra, GETARG_B(i));
++        if (GETARG_C(i)) pc++;  /* skip next instruction (if C) */
++        continue;
++      }
++      case OP_LOADNIL: {
++        TValue *rb = RB(i);
++        do {
++          setnilvalue(rb--);
++        } while (rb >= ra);
++        continue;
++      }
++      case OP_GETUPVAL: {
++        int b = GETARG_B(i);
++        setobj2s(L, ra, cl->upvals[b]->v);
++        continue;
++      }
++      case OP_GETGLOBAL: {
++        TValue g;
++        TValue *rb = KBx(i);
++        sethvalue(L, &g, cl->env);
++        lua_assert(ttisstring(rb));
++        Protect(luaV_gettable(L, &g, rb, ra));
++        continue;
++      }
++      case OP_GETTABLE: {
++        Protect(luaV_gettable(L, RB(i), RKC(i), ra));
++        continue;
++      }
++      case OP_SETGLOBAL: {
++        TValue g;
++        sethvalue(L, &g, cl->env);
++        lua_assert(ttisstring(KBx(i)));
++        Protect(luaV_settable(L, &g, KBx(i), ra));
++        continue;
++      }
++      case OP_SETUPVAL: {
++        UpVal *uv = cl->upvals[GETARG_B(i)];
++        setobj(L, uv->v, ra);
++        luaC_barrier(L, uv, ra);
++        continue;
++      }
++      case OP_SETTABLE: {
++        Protect(luaV_settable(L, ra, RKB(i), RKC(i)));
++        continue;
++      }
++      case OP_NEWTABLE: {
++        int b = GETARG_B(i);
++        int c = GETARG_C(i);
++        sethvalue(L, ra, luaH_new(L, luaO_fb2int(b), luaO_fb2int(c)));
++        Protect(luaC_checkGC(L));
++        continue;
++      }
++      case OP_SELF: {
++        StkId rb = RB(i);
++        setobjs2s(L, ra+1, rb);
++        Protect(luaV_gettable(L, rb, RKC(i), ra));
++        continue;
++      }
++      case OP_ADD: {
++        arith_op(luai_numadd, TM_ADD);
++        continue;
++      }
++      case OP_SUB: {
++        arith_op(luai_numsub, TM_SUB);
++        continue;
++      }
++      case OP_MUL: {
++        arith_op(luai_nummul, TM_MUL);
++        continue;
++      }
++      case OP_DIV: {
++        arith_op(luai_numdiv, TM_DIV);
++        continue;
++      }
++      case OP_MOD: {
++        arith_op(luai_nummod, TM_MOD);
++        continue;
++      }
++      case OP_POW: {
++        arith_op(luai_numpow, TM_POW);
++        continue;
++      }
++      case OP_UNM: {
++        TValue *rb = RB(i);
++        if (ttisnumber(rb)) {
++          lua_Number nb = nvalue(rb);
++          setnvalue(ra, luai_numunm(nb));
++        }
++        else {
++          Protect(Arith(L, ra, rb, rb, TM_UNM));
++        }
++        continue;
++      }
++      case OP_NOT: {
++        int res = l_isfalse(RB(i));  /* next assignment may change this value */
++        setbvalue(ra, res);
++        continue;
++      }
++      case OP_LEN: {
++        const TValue *rb = RB(i);
++        switch (ttype(rb)) {
++          case LUA_TTABLE: {
++            setnvalue(ra, cast_num(luaH_getn(hvalue(rb))));
++            break;
++          }
++          case LUA_TSTRING: {
++            setnvalue(ra, cast_num(tsvalue(rb)->len));
++            break;
++          }
++          default: {  /* try metamethod */
++            Protect(
++              if (!call_binTM(L, rb, luaO_nilobject, ra, TM_LEN))
++                luaG_typeerror(L, rb, "get length of");
++            )
++          }
++        }
++        continue;
++      }
++      case OP_CONCAT: {
++        int b = GETARG_B(i);
++        int c = GETARG_C(i);
++        Protect(luaV_concat(L, c-b+1, c); luaC_checkGC(L));
++        setobjs2s(L, RA(i), base+b);
++        continue;
++      }
++      case OP_JMP: {
++        dojump(L, pc, GETARG_sBx(i));
++        continue;
++      }
++      case OP_EQ: {
++        TValue *rb = RKB(i);
++        TValue *rc = RKC(i);
++        Protect(
++          if (equalobj(L, rb, rc) == GETARG_A(i))
++            dojump(L, pc, GETARG_sBx(*pc));
++        )
++        pc++;
++        continue;
++      }
++      case OP_LT: {
++        Protect(
++          if (luaV_lessthan(L, RKB(i), RKC(i)) == GETARG_A(i))
++            dojump(L, pc, GETARG_sBx(*pc));
++        )
++        pc++;
++        continue;
++      }
++      case OP_LE: {
++        Protect(
++          if (lessequal(L, RKB(i), RKC(i)) == GETARG_A(i))
++            dojump(L, pc, GETARG_sBx(*pc));
++        )
++        pc++;
++        continue;
++      }
++      case OP_TEST: {
++        if (l_isfalse(ra) != GETARG_C(i))
++          dojump(L, pc, GETARG_sBx(*pc));
++        pc++;
++        continue;
++      }
++      case OP_TESTSET: {
++        TValue *rb = RB(i);
++        if (l_isfalse(rb) != GETARG_C(i)) {
++          setobjs2s(L, ra, rb);
++          dojump(L, pc, GETARG_sBx(*pc));
++        }
++        pc++;
++        continue;
++      }
++      case OP_CALL: {
++        int b = GETARG_B(i);
++        int nresults = GETARG_C(i) - 1;
++        if (b != 0) L->top = ra+b;  /* else previous instruction set top */
++        L->savedpc = pc;
++        switch (luaD_precall(L, ra, nresults)) {
++          case PCRLUA: {
++            nexeccalls++;
++            goto reentry;  /* restart luaV_execute over new Lua function */
++          }
++          case PCRC: {
++            /* it was a C function (`precall' called it); adjust results */
++            if (nresults >= 0) L->top = L->ci->top;
++            base = L->base;
++            continue;
++          }
++          default: {
++            return;  /* yield */
++          }
++        }
++      }
++      case OP_TAILCALL: {
++        int b = GETARG_B(i);
++        if (b != 0) L->top = ra+b;  /* else previous instruction set top */
++        L->savedpc = pc;
++        lua_assert(GETARG_C(i) - 1 == LUA_MULTRET);
++        switch (luaD_precall(L, ra, LUA_MULTRET)) {
++          case PCRLUA: {
++            /* tail call: put new frame in place of previous one */
++            CallInfo *ci = L->ci - 1;  /* previous frame */
++            int aux;
++            StkId func = ci->func;
++            StkId pfunc = (ci+1)->func;  /* previous function index */
++            if (L->openupval) luaF_close(L, ci->base);
++            L->base = ci->base = ci->func + ((ci+1)->base - pfunc);
++            for (aux = 0; pfunc+aux < L->top; aux++)  /* move frame down */
++              setobjs2s(L, func+aux, pfunc+aux);
++            ci->top = L->top = func+aux;  /* correct top */
++            lua_assert(L->top == L->base + clvalue(func)->l.p->maxstacksize);
++            ci->savedpc = L->savedpc;
++            ci->tailcalls++;  /* one more call lost */
++            L->ci--;  /* remove new frame */
++            goto reentry;
++          }
++          case PCRC: {  /* it was a C function (`precall' called it) */
++            base = L->base;
++            continue;
++          }
++          default: {
++            return;  /* yield */
++          }
++        }
++      }
++      case OP_RETURN: {
++        int b = GETARG_B(i);
++        if (b != 0) L->top = ra+b-1;
++        if (L->openupval) luaF_close(L, base);
++        L->savedpc = pc;
++        b = luaD_poscall(L, ra);
++        if (--nexeccalls == 0)  /* was previous function running `here'? */
++          return;  /* no: return */
++        else {  /* yes: continue its execution */
++          if (b) L->top = L->ci->top;
++          lua_assert(isLua(L->ci));
++          lua_assert(GET_OPCODE(*((L->ci)->savedpc - 1)) == OP_CALL);
++          goto reentry;
++        }
++      }
++      case OP_FORLOOP: {
++        lua_Number step = nvalue(ra+2);
++        lua_Number idx = luai_numadd(nvalue(ra), step); /* increment index */
++        lua_Number limit = nvalue(ra+1);
++        if (luai_numlt(0, step) ? luai_numle(idx, limit)
++                                : luai_numle(limit, idx)) {
++          dojump(L, pc, GETARG_sBx(i));  /* jump back */
++          setnvalue(ra, idx);  /* update internal index... */
++          setnvalue(ra+3, idx);  /* ...and external index */
++        }
++        continue;
++      }
++      case OP_FORPREP: {
++        const TValue *init = ra;
++        const TValue *plimit = ra+1;
++        const TValue *pstep = ra+2;
++        L->savedpc = pc;  /* next steps may throw errors */
++        if (!tonumber(init, ra))
++          luaG_runerror(L, LUA_QL("for") " initial value must be a number");
++        else if (!tonumber(plimit, ra+1))
++          luaG_runerror(L, LUA_QL("for") " limit must be a number");
++        else if (!tonumber(pstep, ra+2))
++          luaG_runerror(L, LUA_QL("for") " step must be a number");
++        setnvalue(ra, luai_numsub(nvalue(ra), nvalue(pstep)));
++        dojump(L, pc, GETARG_sBx(i));
++        continue;
++      }
++      case OP_TFORLOOP: {
++        StkId cb = ra + 3;  /* call base */
++        setobjs2s(L, cb+2, ra+2);
++        setobjs2s(L, cb+1, ra+1);
++        setobjs2s(L, cb, ra);
++        L->top = cb+3;  /* func. + 2 args (state and index) */
++        Protect(luaD_call(L, cb, GETARG_C(i)));
++        L->top = L->ci->top;
++        cb = RA(i) + 3;  /* previous call may change the stack */
++        if (!ttisnil(cb)) {  /* continue loop? */
++          setobjs2s(L, cb-1, cb);  /* save control variable */
++          dojump(L, pc, GETARG_sBx(*pc));  /* jump back */
++        }
++        pc++;
++        continue;
++      }
++      case OP_SETLIST: {
++        int n = GETARG_B(i);
++        int c = GETARG_C(i);
++        int last;
++        Table *h;
++        if (n == 0) {
++          n = cast_int(L->top - ra) - 1;
++          L->top = L->ci->top;
++        }
++        if (c == 0) c = cast_int(*pc++);
++        runtime_check(L, ttistable(ra));
++        h = hvalue(ra);
++        last = ((c-1)*LFIELDS_PER_FLUSH) + n;
++        if (last > h->sizearray)  /* needs more space? */
++          luaH_resizearray(L, h, last);  /* pre-alloc it at once */
++        for (; n > 0; n--) {
++          TValue *val = ra+n;
++          setobj2t(L, luaH_setnum(L, h, last--), val);
++          luaC_barriert(L, h, val);
++        }
++        continue;
++      }
++      case OP_CLOSE: {
++        luaF_close(L, ra);
++        continue;
++      }
++      case OP_CLOSURE: {
++        Proto *p;
++        Closure *ncl;
++        int nup, j;
++        p = cl->p->p[GETARG_Bx(i)];
++        nup = p->nups;
++        ncl = luaF_newLclosure(L, nup, cl->env);
++        ncl->l.p = p;
++        for (j=0; j<nup; j++, pc++) {
++          if (GET_OPCODE(*pc) == OP_GETUPVAL)
++            ncl->l.upvals[j] = cl->upvals[GETARG_B(*pc)];
++          else {
++            lua_assert(GET_OPCODE(*pc) == OP_MOVE);
++            ncl->l.upvals[j] = luaF_findupval(L, base + GETARG_B(*pc));
++          }
++        }
++        setclvalue(L, ra, ncl);
++        Protect(luaC_checkGC(L));
++        continue;
++      }
++      case OP_VARARG: {
++        int b = GETARG_B(i) - 1;
++        int j;
++        CallInfo *ci = L->ci;
++        int n = cast_int(ci->base - ci->func) - cl->p->numparams - 1;
++        if (b == LUA_MULTRET) {
++          Protect(luaD_checkstack(L, n));
++          ra = RA(i);  /* previous call may change the stack */
++          b = n;
++          L->top = ra + n;
++        }
++        for (j = 0; j < b; j++) {
++          if (j < n) {
++            setobjs2s(L, ra + j, ci->base - n + j);
++          }
++          else {
++            setnilvalue(ra + j);
++          }
++        }
++        continue;
++      }
++    }
++  }
++}
++
+--- /dev/null
++++ b/extensions/LUA/lua/lvm.h
+@@ -0,0 +1,36 @@
++/*
++** $Id: lvm.h,v 2.5.1.1 2007/12/27 13:02:25 roberto Exp $
++** Lua virtual machine
++** See Copyright Notice in lua.h
++*/
++
++#ifndef lvm_h
++#define lvm_h
++
++
++#include "ldo.h"
++#include "lobject.h"
++#include "ltm.h"
++
++
++#define tostring(L,o) ((ttype(o) == LUA_TSTRING) || (luaV_tostring(L, o)))
++
++#define tonumber(o,n) (ttype(o) == LUA_TNUMBER || \
++                         (((o) = luaV_tonumber(o,n)) != NULL))
++
++#define equalobj(L,o1,o2) \
++      (ttype(o1) == ttype(o2) && luaV_equalval(L, o1, o2))
++
++
++LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r);
++LUAI_FUNC int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2);
++LUAI_FUNC const TValue *luaV_tonumber (const TValue *obj, TValue *n);
++LUAI_FUNC int luaV_tostring (lua_State *L, StkId obj);
++LUAI_FUNC void luaV_gettable (lua_State *L, const TValue *t, TValue *key,
++                                            StkId val);
++LUAI_FUNC void luaV_settable (lua_State *L, const TValue *t, TValue *key,
++                                            StkId val);
++LUAI_FUNC void luaV_execute (lua_State *L, int nexeccalls);
++LUAI_FUNC void luaV_concat (lua_State *L, int total, int last);
++
++#endif
+--- /dev/null
++++ b/extensions/LUA/lua/lzio.c
+@@ -0,0 +1,81 @@
++/*
++** $Id: lzio.c,v 1.31.1.1 2007/12/27 13:02:25 roberto Exp $
++** a generic input stream interface
++** See Copyright Notice in lua.h
++*/
++
++#include <string.h>
++
++#define lzio_c
++#define LUA_CORE
++
++#include "lua.h"
++
++#include "llimits.h"
++#include "lmem.h"
++#include "lstate.h"
++#include "lzio.h"
++
++
++int luaZ_fill (ZIO *z) {
++  size_t size;
++  lua_State *L = z->L;
++  const char *buff;
++  lua_unlock(L);
++  buff = z->reader(L, z->data, &size);
++  lua_lock(L);
++  if (buff == NULL || size == 0) return EOZ;
++  z->n = size - 1;
++  z->p = buff;
++  return char2int(*(z->p++));
++}
++
++
++int luaZ_lookahead (ZIO *z) {
++  if (z->n == 0) {
++    if (luaZ_fill(z) == EOZ)
++      return EOZ;
++    else {
++      z->n++;  /* luaZ_fill removed first byte; put back it */
++      z->p--;
++    }
++  }
++  return char2int(*z->p);
++}
++
++
++void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) {
++  z->L = L;
++  z->reader = reader;
++  z->data = data;
++  z->n = 0;
++  z->p = NULL;
++}
++
++
++/* --------------------------------------------------------------- read --- */
++size_t luaZ_read (ZIO *z, void *b, size_t n) {
++  while (n) {
++    size_t m;
++    if (luaZ_lookahead(z) == EOZ)
++      return n;  /* return number of missing bytes */
++    m = (n <= z->n) ? n : z->n;  /* min. between n and z->n */
++    memcpy(b, z->p, m);
++    z->n -= m;
++    z->p += m;
++    b = (char *)b + m;
++    n -= m;
++  }
++  return 0;
++}
++
++/* ------------------------------------------------------------------------ */
++char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n) {
++  if (n > buff->buffsize) {
++    if (n < LUA_MINBUFFER) n = LUA_MINBUFFER;
++    luaZ_resizebuffer(L, buff, n);
++  }
++  return buff->buffer;
++}
++
++
+--- /dev/null
++++ b/extensions/LUA/lua/lzio.h
+@@ -0,0 +1,67 @@
++/*
++** $Id: lzio.h,v 1.21.1.1 2007/12/27 13:02:25 roberto Exp $
++** Buffered streams
++** See Copyright Notice in lua.h
++*/
++
++
++#ifndef lzio_h
++#define lzio_h
++
++#include "lua.h"
++
++#include "lmem.h"
++
++
++#define EOZ   (-1)                    /* end of stream */
++
++typedef struct Zio ZIO;
++
++#define char2int(c)   cast(int, cast(unsigned char, (c)))
++
++#define zgetc(z)  (((z)->n--)>0 ?  char2int(*(z)->p++) : luaZ_fill(z))
++
++typedef struct Mbuffer {
++  char *buffer;
++  size_t n;
++  size_t buffsize;
++} Mbuffer;
++
++#define luaZ_initbuffer(L, buff) ((buff)->buffer = NULL, (buff)->buffsize = 0)
++
++#define luaZ_buffer(buff)     ((buff)->buffer)
++#define luaZ_sizebuffer(buff) ((buff)->buffsize)
++#define luaZ_bufflen(buff)    ((buff)->n)
++
++#define luaZ_resetbuffer(buff) ((buff)->n = 0)
++
++
++#define luaZ_resizebuffer(L, buff, size) \
++      (luaM_reallocvector(L, (buff)->buffer, (buff)->buffsize, size, char), \
++      (buff)->buffsize = size)
++
++#define luaZ_freebuffer(L, buff)      luaZ_resizebuffer(L, buff, 0)
++
++
++LUAI_FUNC char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n);
++LUAI_FUNC void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader,
++                                        void *data);
++LUAI_FUNC size_t luaZ_read (ZIO* z, void* b, size_t n);       /* read next n bytes */
++LUAI_FUNC int luaZ_lookahead (ZIO *z);
++
++
++
++/* --------- Private Part ------------------ */
++
++struct Zio {
++  size_t n;                   /* bytes still unread */
++  const char *p;              /* current position in buffer */
++  lua_Reader reader;
++  void* data;                 /* additional data */
++  lua_State *L;                       /* Lua state (for reader) */
++};
++
++
++LUAI_FUNC int luaZ_fill (ZIO *z);
++
++#endif
+--- /dev/null
++++ b/extensions/LUA/Makefile
+@@ -0,0 +1,389 @@
++# Makefile.in generated by automake 1.11.1 from Makefile.am.
++# extensions/LUA/Makefile.  Generated from Makefile.in by configure.
++
++# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
++# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
++# Inc.
++# This Makefile.in is free software; the Free Software Foundation
++# gives unlimited permission to copy and/or distribute it,
++# with or without modifications, as long as this notice is preserved.
++
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
++# PARTICULAR PURPOSE.
++
++
++
++# -*- Makefile -*-
++# AUTOMAKE
++
++pkgdatadir = $(datadir)/xtables-addons
++pkgincludedir = $(includedir)/xtables-addons
++pkglibdir = $(libdir)/xtables-addons
++pkglibexecdir = $(libexecdir)/xtables-addons
++am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
++install_sh_DATA = $(install_sh) -c -m 644
++install_sh_PROGRAM = $(install_sh) -c
++install_sh_SCRIPT = $(install_sh) -c
++INSTALL_HEADER = $(INSTALL_DATA)
++transform = $(program_transform_name)
++NORMAL_INSTALL = :
++PRE_INSTALL = :
++POST_INSTALL = :
++NORMAL_UNINSTALL = :
++PRE_UNINSTALL = :
++POST_UNINSTALL = :
++build_triplet = i686-pc-linux-gnu
++host_triplet = i686-pc-linux-gnu
++DIST_COMMON = $(srcdir)/../../Makefile.extra $(srcdir)/Makefile.am \
++      $(srcdir)/Makefile.in
++subdir = extensions/LUA
++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
++am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
++      $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
++      $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
++      $(top_srcdir)/configure.ac
++am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
++      $(ACLOCAL_M4)
++mkinstalldirs = $(install_sh) -d
++CONFIG_HEADER = $(top_builddir)/config.h
++CONFIG_CLEAN_FILES =
++CONFIG_CLEAN_VPATH_FILES =
++SOURCES =
++DIST_SOURCES =
++DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
++ACLOCAL = ${SHELL} /home/andre/Dropbox/xtables-addons/missing --run aclocal-1.11
++AMTAR = ${SHELL} /home/andre/Dropbox/xtables-addons/missing --run tar
++AR = ar
++AUTOCONF = ${SHELL} /home/andre/Dropbox/xtables-addons/missing --run autoconf
++AUTOHEADER = ${SHELL} /home/andre/Dropbox/xtables-addons/missing --run autoheader
++AUTOMAKE = ${SHELL} /home/andre/Dropbox/xtables-addons/missing --run automake-1.11
++AWK = mawk
++CC = gcc
++CCDEPMODE = depmode=gcc3
++CFLAGS = -g -O2
++CPP = gcc -E
++CPPFLAGS = 
++CYGPATH_W = echo
++DEFS = -DHAVE_CONFIG_H
++DEPDIR = .deps
++DSYMUTIL = 
++DUMPBIN = 
++ECHO_C = 
++ECHO_N = -n
++ECHO_T = 
++EGREP = /bin/grep -E
++EXEEXT = 
++FGREP = /bin/grep -F
++GREP = /bin/grep
++INSTALL = /usr/bin/install -c
++INSTALL_DATA = ${INSTALL} -m 644
++INSTALL_PROGRAM = ${INSTALL}
++INSTALL_SCRIPT = ${INSTALL}
++INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
++LD = /usr/bin/ld
++LDFLAGS = 
++LIBOBJS = 
++LIBS = 
++LIBTOOL = $(SHELL) $(top_builddir)/libtool
++LIPO = 
++LN_S = ln -s
++LTLIBOBJS = 
++MAKEINFO = ${SHELL} /home/andre/Dropbox/xtables-addons/missing --run makeinfo
++MKDIR_P = /bin/mkdir -p
++NM = /usr/bin/nm -B
++NMEDIT = 
++OBJDUMP = objdump
++OBJEXT = o
++OTOOL = 
++OTOOL64 = 
++PACKAGE = xtables-addons
++PACKAGE_BUGREPORT = 
++PACKAGE_NAME = xtables-addons
++PACKAGE_STRING = xtables-addons 1.21
++PACKAGE_TARNAME = xtables-addons
++PACKAGE_URL = 
++PACKAGE_VERSION = 1.21
++PATH_SEPARATOR = :
++PKG_CONFIG = /usr/bin/pkg-config
++RANLIB = ranlib
++SED = /bin/sed
++SET_MAKE = 
++SHELL = /bin/bash
++STRIP = strip
++VERSION = 1.21
++abs_builddir = /home/andre/Dropbox/xtables-addons/extensions/LUA
++abs_srcdir = /home/andre/Dropbox/xtables-addons/extensions/LUA
++abs_top_builddir = /home/andre/Dropbox/xtables-addons
++abs_top_srcdir = /home/andre/Dropbox/xtables-addons
++ac_ct_CC = gcc
++ac_ct_DUMPBIN = 
++am__include = include
++am__leading_dot = .
++am__quote = 
++am__tar = ${AMTAR} chof - "$$tardir"
++am__untar = ${AMTAR} xf -
++bindir = ${exec_prefix}/bin
++build = i686-pc-linux-gnu
++build_alias = 
++build_cpu = i686
++build_os = linux-gnu
++build_vendor = pc
++builddir = .
++datadir = ${datarootdir}
++datarootdir = ${prefix}/share
++docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
++dvidir = ${docdir}
++exec_prefix = ${prefix}
++host = i686-pc-linux-gnu
++host_alias = 
++host_cpu = i686
++host_os = linux-gnu
++host_vendor = pc
++htmldir = ${docdir}
++includedir = ${prefix}/include
++infodir = ${datarootdir}/info
++install_sh = ${SHELL} /home/andre/Dropbox/xtables-addons/install-sh
++kbuilddir = /lib/modules/2.6.33-020633-generic/build
++kinclude_CFLAGS =  -I /lib/modules/2.6.33-020633-generic/build/include
++ksourcedir = 
++libdir = ${exec_prefix}/lib
++libexecdir = ${exec_prefix}/libexec
++libxtables_CFLAGS =  
++libxtables_LIBS = -L/lib -lxtables  
++localedir = ${datarootdir}/locale
++localstatedir = ${prefix}/var
++lt_ECHO = echo
++mandir = ${datarootdir}/man
++mkdir_p = /bin/mkdir -p
++oldincludedir = /usr/include
++pdfdir = ${docdir}
++prefix = /usr/local
++program_transform_name = s,x,x,
++psdir = ${docdir}
++regular_CFLAGS = -D_LARGEFILE_SOURCE=1 -D_LARGE_FILES -D_FILE_OFFSET_BITS=64  -D_REENTRANT -Wall -Waggregate-return -Wmissing-declarations    -Wmissing-prototypes -Wredundant-decls -Wshadow -Wstrict-prototypes     -Winline -pipe -DXTABLES_LIBDIR=\"${xtlibdir}\"
++sbindir = ${exec_prefix}/sbin
++sharedstatedir = ${prefix}/com
++srcdir = .
++sysconfdir = ${prefix}/etc
++target_alias = 
++top_build_prefix = ../../
++top_builddir = ../..
++top_srcdir = ../..
++xtlibdir = ${libexecdir}/xtables
++XA_SRCDIR = ${srcdir}
++XA_TOPSRCDIR = ${top_srcdir}
++XA_ABSTOPSRCDIR = ${abs_top_srcdir}
++_mcall = -f ${top_builddir}/Makefile.iptrules
++all: all-am
++
++.SUFFIXES:
++$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/../../Makefile.extra $(am__configure_deps)
++      @for dep in $?; do \
++        case '$(am__configure_deps)' in \
++          *$$dep*) \
++            ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
++              && { if test -f $@; then exit 0; else break; fi; }; \
++            exit 1;; \
++        esac; \
++      done; \
++      echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign extensions/LUA/Makefile'; \
++      $(am__cd) $(top_srcdir) && \
++        $(AUTOMAKE) --foreign extensions/LUA/Makefile
++.PRECIOUS: Makefile
++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
++      @case '$?' in \
++        *config.status*) \
++          cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
++        *) \
++          echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
++          cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
++      esac;
++
++$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
++      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++
++$(top_srcdir)/configure:  $(am__configure_deps)
++      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
++      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++$(am__aclocal_m4_deps):
++
++mostlyclean-libtool:
++      -rm -f *.lo
++
++clean-libtool:
++      -rm -rf .libs _libs
++tags: TAGS
++TAGS:
++
++ctags: CTAGS
++CTAGS:
++
++
++distdir: $(DISTFILES)
++      @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
++      topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
++      list='$(DISTFILES)'; \
++        dist_files=`for file in $$list; do echo $$file; done | \
++        sed -e "s|^$$srcdirstrip/||;t" \
++            -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
++      case $$dist_files in \
++        */*) $(MKDIR_P) `echo "$$dist_files" | \
++                         sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
++                         sort -u` ;; \
++      esac; \
++      for file in $$dist_files; do \
++        if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
++        if test -d $$d/$$file; then \
++          dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
++          if test -d "$(distdir)/$$file"; then \
++            find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
++          fi; \
++          if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
++            cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
++            find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
++          fi; \
++          cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
++        else \
++          test -f "$(distdir)/$$file" \
++          || cp -p $$d/$$file "$(distdir)/$$file" \
++          || exit 1; \
++        fi; \
++      done
++check-am: all-am
++check: check-am
++all-am: Makefile all-local
++installdirs:
++install: install-am
++install-exec: install-exec-am
++install-data: install-data-am
++uninstall: uninstall-am
++
++install-am: all-am
++      @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
++
++installcheck: installcheck-am
++install-strip:
++      $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
++        install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
++        `test -z '$(STRIP)' || \
++          echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
++mostlyclean-generic:
++
++clean-generic:
++
++distclean-generic:
++      -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
++      -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
++
++maintainer-clean-generic:
++      @echo "This command is intended for maintainers to use"
++      @echo "it deletes files that may require special tools to rebuild."
++clean: clean-am
++
++clean-am: clean-generic clean-libtool clean-local mostlyclean-am
++
++distclean: distclean-am
++      -rm -f Makefile
++distclean-am: clean-am distclean-generic
++
++dvi: dvi-am
++
++dvi-am:
++
++html: html-am
++
++html-am:
++
++info: info-am
++
++info-am:
++
++install-data-am:
++
++install-dvi: install-dvi-am
++
++install-dvi-am:
++
++install-exec-am: install-exec-local
++
++install-html: install-html-am
++
++install-html-am:
++
++install-info: install-info-am
++
++install-info-am:
++
++install-man:
++
++install-pdf: install-pdf-am
++
++install-pdf-am:
++
++install-ps: install-ps-am
++
++install-ps-am:
++
++installcheck-am:
++
++maintainer-clean: maintainer-clean-am
++      -rm -f Makefile
++maintainer-clean-am: distclean-am maintainer-clean-generic
++
++mostlyclean: mostlyclean-am
++
++mostlyclean-am: mostlyclean-generic mostlyclean-libtool
++
++pdf: pdf-am
++
++pdf-am:
++
++ps: ps-am
++
++ps-am:
++
++uninstall-am:
++
++.MAKE: install-am install-strip
++
++.PHONY: all all-am all-local check check-am clean clean-generic \
++      clean-libtool clean-local distclean distclean-generic \
++      distclean-libtool distdir dvi dvi-am html html-am info info-am \
++      install install-am install-data install-data-am install-dvi \
++      install-dvi-am install-exec install-exec-am install-exec-local \
++      install-html install-html-am install-info install-info-am \
++      install-man install-pdf install-pdf-am install-ps \
++      install-ps-am install-strip installcheck installcheck-am \
++      installdirs maintainer-clean maintainer-clean-generic \
++      mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
++      ps ps-am uninstall uninstall-am
++
++export XA_SRCDIR
++export XA_TOPSRCDIR
++export XA_ABSTOPSRCDIR
++
++all-local: user-all-local
++
++install-exec-local: user-install-local
++
++clean-local: user-clean-local
++
++user-all-local:
++      ${MAKE} ${_mcall} all;
++
++# Have no user-install-data-local ATM
++user-install-local: user-install-exec-local
++
++user-install-exec-local:
++      ${MAKE} ${_mcall} install;
++
++user-clean-local:
++      ${MAKE} ${_mcall} clean;
++
++# Tell versions [3.59,3.63) of GNU make to not export all variables.
++# Otherwise a system limit (for SysV at least) may be exceeded.
++.NOEXPORT:
++
+--- /dev/null
++++ b/extensions/LUA/Makefile.am
+@@ -0,0 +1 @@
++include ../../Makefile.extra
+--- /dev/null
++++ b/extensions/LUA/Makefile.in
+@@ -0,0 +1,389 @@
++# Makefile.in generated by automake 1.11.1 from Makefile.am.
++# @configure_input@
++
++# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
++# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
++# Inc.
++# This Makefile.in is free software; the Free Software Foundation
++# gives unlimited permission to copy and/or distribute it,
++# with or without modifications, as long as this notice is preserved.
++
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
++# PARTICULAR PURPOSE.
++
++@SET_MAKE@
++
++# -*- Makefile -*-
++# AUTOMAKE
++VPATH = @srcdir@
++pkgdatadir = $(datadir)/@PACKAGE@
++pkgincludedir = $(includedir)/@PACKAGE@
++pkglibdir = $(libdir)/@PACKAGE@
++pkglibexecdir = $(libexecdir)/@PACKAGE@
++am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
++install_sh_DATA = $(install_sh) -c -m 644
++install_sh_PROGRAM = $(install_sh) -c
++install_sh_SCRIPT = $(install_sh) -c
++INSTALL_HEADER = $(INSTALL_DATA)
++transform = $(program_transform_name)
++NORMAL_INSTALL = :
++PRE_INSTALL = :
++POST_INSTALL = :
++NORMAL_UNINSTALL = :
++PRE_UNINSTALL = :
++POST_UNINSTALL = :
++build_triplet = @build@
++host_triplet = @host@
++DIST_COMMON = $(srcdir)/../../Makefile.extra $(srcdir)/Makefile.am \
++      $(srcdir)/Makefile.in
++subdir = extensions/LUA
++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
++am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
++      $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
++      $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
++      $(top_srcdir)/configure.ac
++am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
++      $(ACLOCAL_M4)
++mkinstalldirs = $(install_sh) -d
++CONFIG_HEADER = $(top_builddir)/config.h
++CONFIG_CLEAN_FILES =
++CONFIG_CLEAN_VPATH_FILES =
++SOURCES =
++DIST_SOURCES =
++DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
++ACLOCAL = @ACLOCAL@
++AMTAR = @AMTAR@
++AR = @AR@
++AUTOCONF = @AUTOCONF@
++AUTOHEADER = @AUTOHEADER@
++AUTOMAKE = @AUTOMAKE@
++AWK = @AWK@
++CC = @CC@
++CCDEPMODE = @CCDEPMODE@
++CFLAGS = @CFLAGS@
++CPP = @CPP@
++CPPFLAGS = @CPPFLAGS@
++CYGPATH_W = @CYGPATH_W@
++DEFS = @DEFS@
++DEPDIR = @DEPDIR@
++DSYMUTIL = @DSYMUTIL@
++DUMPBIN = @DUMPBIN@
++ECHO_C = @ECHO_C@
++ECHO_N = @ECHO_N@
++ECHO_T = @ECHO_T@
++EGREP = @EGREP@
++EXEEXT = @EXEEXT@
++FGREP = @FGREP@
++GREP = @GREP@
++INSTALL = @INSTALL@
++INSTALL_DATA = @INSTALL_DATA@
++INSTALL_PROGRAM = @INSTALL_PROGRAM@
++INSTALL_SCRIPT = @INSTALL_SCRIPT@
++INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
++LD = @LD@
++LDFLAGS = @LDFLAGS@
++LIBOBJS = @LIBOBJS@
++LIBS = @LIBS@
++LIBTOOL = @LIBTOOL@
++LIPO = @LIPO@
++LN_S = @LN_S@
++LTLIBOBJS = @LTLIBOBJS@
++MAKEINFO = @MAKEINFO@
++MKDIR_P = @MKDIR_P@
++NM = @NM@
++NMEDIT = @NMEDIT@
++OBJDUMP = @OBJDUMP@
++OBJEXT = @OBJEXT@
++OTOOL = @OTOOL@
++OTOOL64 = @OTOOL64@
++PACKAGE = @PACKAGE@
++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
++PACKAGE_NAME = @PACKAGE_NAME@
++PACKAGE_STRING = @PACKAGE_STRING@
++PACKAGE_TARNAME = @PACKAGE_TARNAME@
++PACKAGE_URL = @PACKAGE_URL@
++PACKAGE_VERSION = @PACKAGE_VERSION@
++PATH_SEPARATOR = @PATH_SEPARATOR@
++PKG_CONFIG = @PKG_CONFIG@
++RANLIB = @RANLIB@
++SED = @SED@
++SET_MAKE = @SET_MAKE@
++SHELL = @SHELL@
++STRIP = @STRIP@
++VERSION = @VERSION@
++abs_builddir = @abs_builddir@
++abs_srcdir = @abs_srcdir@
++abs_top_builddir = @abs_top_builddir@
++abs_top_srcdir = @abs_top_srcdir@
++ac_ct_CC = @ac_ct_CC@
++ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
++am__include = @am__include@
++am__leading_dot = @am__leading_dot@
++am__quote = @am__quote@
++am__tar = @am__tar@
++am__untar = @am__untar@
++bindir = @bindir@
++build = @build@
++build_alias = @build_alias@
++build_cpu = @build_cpu@
++build_os = @build_os@
++build_vendor = @build_vendor@
++builddir = @builddir@
++datadir = @datadir@
++datarootdir = @datarootdir@
++docdir = @docdir@
++dvidir = @dvidir@
++exec_prefix = @exec_prefix@
++host = @host@
++host_alias = @host_alias@
++host_cpu = @host_cpu@
++host_os = @host_os@
++host_vendor = @host_vendor@
++htmldir = @htmldir@
++includedir = @includedir@
++infodir = @infodir@
++install_sh = @install_sh@
++kbuilddir = @kbuilddir@
++kinclude_CFLAGS = @kinclude_CFLAGS@
++ksourcedir = @ksourcedir@
++libdir = @libdir@
++libexecdir = @libexecdir@
++libxtables_CFLAGS = @libxtables_CFLAGS@
++libxtables_LIBS = @libxtables_LIBS@
++localedir = @localedir@
++localstatedir = @localstatedir@
++lt_ECHO = @lt_ECHO@
++mandir = @mandir@
++mkdir_p = @mkdir_p@
++oldincludedir = @oldincludedir@
++pdfdir = @pdfdir@
++prefix = @prefix@
++program_transform_name = @program_transform_name@
++psdir = @psdir@
++regular_CFLAGS = @regular_CFLAGS@
++sbindir = @sbindir@
++sharedstatedir = @sharedstatedir@
++srcdir = @srcdir@
++sysconfdir = @sysconfdir@
++target_alias = @target_alias@
++top_build_prefix = @top_build_prefix@
++top_builddir = @top_builddir@
++top_srcdir = @top_srcdir@
++xtlibdir = @xtlibdir@
++XA_SRCDIR = ${srcdir}
++XA_TOPSRCDIR = ${top_srcdir}
++XA_ABSTOPSRCDIR = ${abs_top_srcdir}
++_mcall = -f ${top_builddir}/Makefile.iptrules
++all: all-am
++
++.SUFFIXES:
++$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/../../Makefile.extra $(am__configure_deps)
++      @for dep in $?; do \
++        case '$(am__configure_deps)' in \
++          *$$dep*) \
++            ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
++              && { if test -f $@; then exit 0; else break; fi; }; \
++            exit 1;; \
++        esac; \
++      done; \
++      echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign extensions/LUA/Makefile'; \
++      $(am__cd) $(top_srcdir) && \
++        $(AUTOMAKE) --foreign extensions/LUA/Makefile
++.PRECIOUS: Makefile
++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
++      @case '$?' in \
++        *config.status*) \
++          cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
++        *) \
++          echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
++          cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
++      esac;
++
++$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
++      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++
++$(top_srcdir)/configure:  $(am__configure_deps)
++      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
++      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++$(am__aclocal_m4_deps):
++
++mostlyclean-libtool:
++      -rm -f *.lo
++
++clean-libtool:
++      -rm -rf .libs _libs
++tags: TAGS
++TAGS:
++
++ctags: CTAGS
++CTAGS:
++
++
++distdir: $(DISTFILES)
++      @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
++      topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
++      list='$(DISTFILES)'; \
++        dist_files=`for file in $$list; do echo $$file; done | \
++        sed -e "s|^$$srcdirstrip/||;t" \
++            -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
++      case $$dist_files in \
++        */*) $(MKDIR_P) `echo "$$dist_files" | \
++                         sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
++                         sort -u` ;; \
++      esac; \
++      for file in $$dist_files; do \
++        if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
++        if test -d $$d/$$file; then \
++          dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
++          if test -d "$(distdir)/$$file"; then \
++            find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
++          fi; \
++          if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
++            cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
++            find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
++          fi; \
++          cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
++        else \
++          test -f "$(distdir)/$$file" \
++          || cp -p $$d/$$file "$(distdir)/$$file" \
++          || exit 1; \
++        fi; \
++      done
++check-am: all-am
++check: check-am
++all-am: Makefile all-local
++installdirs:
++install: install-am
++install-exec: install-exec-am
++install-data: install-data-am
++uninstall: uninstall-am
++
++install-am: all-am
++      @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
++
++installcheck: installcheck-am
++install-strip:
++      $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
++        install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
++        `test -z '$(STRIP)' || \
++          echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
++mostlyclean-generic:
++
++clean-generic:
++
++distclean-generic:
++      -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
++      -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
++
++maintainer-clean-generic:
++      @echo "This command is intended for maintainers to use"
++      @echo "it deletes files that may require special tools to rebuild."
++clean: clean-am
++
++clean-am: clean-generic clean-libtool clean-local mostlyclean-am
++
++distclean: distclean-am
++      -rm -f Makefile
++distclean-am: clean-am distclean-generic
++
++dvi: dvi-am
++
++dvi-am:
++
++html: html-am
++
++html-am:
++
++info: info-am
++
++info-am:
++
++install-data-am:
++
++install-dvi: install-dvi-am
++
++install-dvi-am:
++
++install-exec-am: install-exec-local
++
++install-html: install-html-am
++
++install-html-am:
++
++install-info: install-info-am
++
++install-info-am:
++
++install-man:
++
++install-pdf: install-pdf-am
++
++install-pdf-am:
++
++install-ps: install-ps-am
++
++install-ps-am:
++
++installcheck-am:
++
++maintainer-clean: maintainer-clean-am
++      -rm -f Makefile
++maintainer-clean-am: distclean-am maintainer-clean-generic
++
++mostlyclean: mostlyclean-am
++
++mostlyclean-am: mostlyclean-generic mostlyclean-libtool
++
++pdf: pdf-am
++
++pdf-am:
++
++ps: ps-am
++
++ps-am:
++
++uninstall-am:
++
++.MAKE: install-am install-strip
++
++.PHONY: all all-am all-local check check-am clean clean-generic \
++      clean-libtool clean-local distclean distclean-generic \
++      distclean-libtool distdir dvi dvi-am html html-am info info-am \
++      install install-am install-data install-data-am install-dvi \
++      install-dvi-am install-exec install-exec-am install-exec-local \
++      install-html install-html-am install-info install-info-am \
++      install-man install-pdf install-pdf-am install-ps \
++      install-ps-am install-strip installcheck installcheck-am \
++      installdirs maintainer-clean maintainer-clean-generic \
++      mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
++      ps ps-am uninstall uninstall-am
++
++export XA_SRCDIR
++export XA_TOPSRCDIR
++export XA_ABSTOPSRCDIR
++
++all-local: user-all-local
++
++install-exec-local: user-install-local
++
++clean-local: user-clean-local
++
++user-all-local:
++      ${MAKE} ${_mcall} all;
++
++# Have no user-install-data-local ATM
++user-install-local: user-install-exec-local
++
++user-install-exec-local:
++      ${MAKE} ${_mcall} install;
++
++user-clean-local:
++      ${MAKE} ${_mcall} clean;
++
++# Tell versions [3.59,3.63) of GNU make to not export all variables.
++# Otherwise a system limit (for SysV at least) may be exceeded.
++.NOEXPORT:
++
+--- /dev/null
++++ b/extensions/LUA/Mbuild
+@@ -0,0 +1,3 @@
++# -*- Makefile -*-
++
++obj-${build_LUA}     += libxt_LUA.so
+--- /dev/null
++++ b/extensions/LUA/nf_lua.c
+@@ -0,0 +1,64 @@
++#if defined(__KERNEL__)
++
++#include <linux/kernel.h>
++#include <linux/slab.h>
++#include <linux/string.h>
++#include <linux/timer.h>
++#include <linux/random.h>
++#include <linux/netfilter/x_tables.h>
++
++#endif
++
++#include "lua.h"
++#include "lobject.h" /*sizeof(udata) */
++#include "lauxlib.h"
++#include "controller.h"
++
++#if defined(__KERNEL__) /* reachs until luaopen_nflib */
++
++
++static int32_t nf_get_random(lua_State *L)
++{
++      uint32_t  rand = 0;
++
++      get_random_bytes(&rand, sizeof(uint32_t ));
++      lua_pushnumber(L, rand);
++      return 1;
++}
++
++static int32_t nf_get_time(lua_State *L)
++{
++      lua_pushnumber(L, jiffies_to_msecs(jiffies_64));
++      return 1;
++}
++
++static const struct luaL_Reg nf_lua_lib_f [] = {
++      { "get_random",    nf_get_random    },
++      { "get_time",      nf_get_time      },
++      { NULL,            NULL             }
++};
++
++void luaopen_nflib(lua_State *L)
++{
++      int32_t top;
++
++      luaL_register(L, NETFILTER_LIB, nf_lua_lib_f);
++      lua_pop(L, 1);
++
++      /* registering verdicts inside the _G */
++      lua_getglobal(L, "_G");
++      top = lua_gettop(L);
++
++      lua_pushinteger(L, XT_CONTINUE);
++      lua_setfield(L, top, "XT_CONTINUE");    /* continiue with next rule */
++
++      lua_pushinteger(L, NF_DROP);
++      lua_setfield(L, top, "NF_DROP");        /* stop traversal in the current table hook and drop packet */
++
++      lua_pushinteger(L, NF_ACCEPT);
++      lua_setfield(L, top, "NF_ACCEPT");      /* stop traversal in the current table hook and accept packet */
++
++      lua_pop(L, 1);                          /* pop _G */
++}
++
++#endif
+--- /dev/null
++++ b/extensions/LUA/prot_buf_dynamic.c
+@@ -0,0 +1,486 @@
++/*
++ *    Copyright (C) 2010 University of Basel <http://cn.cs.unibas.ch/>
++ *    by Andre Graf <andre@dergraf.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, see <http://www.gnu.org/licenses/>.
++ */
++
++#include "controller.h"
++
++
++
++struct protocol_buf * dyn_prot_buf_array[MAX_NR_OF_DYN_PROT_BUFS] = { NULL }; 
++
++
++/* LUA_API: the function 'field_dynamic_setter' acts as a wrapper around
++ * a given Lua field setter function of a dynamic protocol buffer. The 
++ * string containing the lua function name was piggybacked in the 'set'
++ * member of the protocol_field. We call this function passing the actual
++ * segment as byte array and the set value.
++ * 
++ * Paramters:
++ * 1.  lua_packet_segment (implicit)
++ * 2.  some lua value 
++ *
++ * Upvalues:
++ * 1.  pointer to the protocol buffer 
++ * 2.  field index 
++ *
++ * Returns:
++ * 1.  true or false if the 'set' was successful
++ */
++int32_t field_dynamic_setter(lua_State *L)
++{
++      size_t nbytes;
++      lua_packet_segment * array;
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++
++      int32_t field_index = lua_tointeger(L, lua_upvalueindex(2));
++    
++      /* the function name is piggybacked as a string */
++      lua_getglobal(L, (char *)prot_buf->protocol_fields[field_index].set);
++      if (!lua_isfunction(L, -1)) {
++              lua_pushboolean(L, 0);
++              return 1;
++      }
++
++      nbytes = sizeof(lua_packet_segment) + seg->length * sizeof(uint8_t);
++      array = (lua_packet_segment *)lua_newuserdata(L, nbytes);
++      array->length = seg->length;
++      array->start = seg->start + seg->offset;
++      array->changes = NULL;
++
++      luaL_getmetatable(L, LUA_BYTE_ARRAY);
++      lua_setmetatable(L, -2);
++      lua_pushvalue(L, 2); /* push value to set */
++      if (lua_pcall(L, 2, 1, 0) != 0) {
++              pr_debug("Error: %s \n", lua_tostring(L, -1));
++              lua_pop(L, 1);
++              lua_pushboolean(L, 0);
++      }
++      return 1;
++}
++
++/* LUA_API: the function 'field_dynamic_getter' acts as a wrapper around
++ * a given Lua field getter function of a dynamic protocol buffer. The 
++ * string containing the lua function name was piggybacked in the 'get'
++ * member of the protocol_field. We call this function passing the actual
++ * segment as byte array.
++ * 
++ * Paramters:
++ * 1.  lua_packet_segment (implicit)
++ *
++ * Upvalues:
++ * 1.  pointer to the protocol buffer 
++ * 2.  field index 
++ *
++ * Returns:
++ * 1.  true or false if the 'get' was successful
++ */
++int32_t field_dynamic_getter(lua_State *L)
++{
++      size_t nbytes;
++      lua_packet_segment * array;
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++
++      int32_t field_index = lua_tointeger(L, lua_upvalueindex(2));
++    
++      /* the function name is piggybacked as a string */
++      lua_getglobal(L, (char *)prot_buf->protocol_fields[field_index].get);
++      if (!lua_isfunction(L, -1)) {
++              lua_pushboolean(L, 0);
++              return 1;
++      }
++
++      nbytes = sizeof(lua_packet_segment) + seg->length * sizeof(uint8_t);
++      array = (lua_packet_segment *)lua_newuserdata(L, nbytes);
++      array->length = seg->length;
++      array->start = seg->start + seg->offset;
++      array->changes = NULL;
++
++      luaL_getmetatable(L, LUA_BYTE_ARRAY);
++      lua_setmetatable(L, -2);
++      if (lua_pcall(L, 1, 1, 0) != 0) {
++              pr_debug("Error: %s \n", luaL_checkstring(L, -1));
++              lua_pop(L, 1);
++              lua_pushboolean(L, 0);
++      }
++      return 1;
++}
++
++/* LUA_API: the function 'has_protocol_dynamic' acts as a wrapper around 
++ * a given lua has_protocol function of a dynamic protocol buffer. The 
++ * string containing the lua function name was piggybacked in the 'has_protocol'
++ * member of the protocol_buffer. We call this function passing the actual
++ * segment.
++ * 
++ * Paramters:
++ * 1.  lua_packet_segment
++ * 2.  protocol type 
++ *
++ * Returns:
++ * 1.  true or false if the payload field contains the given protocol 
++ */
++int32_t has_protocol_dynamic(lua_State *L, struct protocol_buf * prot_buf, lua_packet_segment * seg, int32_t type)
++{
++      lua_packet_segment *seg_new;
++      int32_t res = 0;                                      
++      
++    /* the function name is piggybacked as a string */
++      lua_getglobal(L, (char *)prot_buf->has_protocol);
++      seg_new = (lua_packet_segment *)lua_newuserdata(L, sizeof(lua_packet_segment));
++      seg_new->start = seg->start;
++      seg_new->offset = seg->offset;
++      seg_new->length = seg->length;
++      seg_new->changes = NULL;
++      luaL_getmetatable(L, prot_buf->name);
++      lua_setmetatable(L, -2);
++      lua_pushinteger(L, type);  /* push the protocol type */
++      if (lua_pcall(L, 2, 1, 0) != 0) {
++              pr_debug("Error: %s \n", luaL_checkstring(L, -1));
++              lua_pop(L, 1);
++              return 0;
++      }
++      res = lua_toboolean(L, -1);
++      lua_pop(L, 1);
++
++      return res;
++}
++
++/* LUA_API: the function 'get_field_changes_dynamic' acts as a wrapper around 
++ * a given lua get_field_changes function of a dynamic protocol buffer. The 
++ * string containing the lua function name was piggybacked in the 'get_field_changes'
++ * member of the protocol_buffer. We call this function passing the actual
++ * segment. The lua function must return two lua table containing the offset 
++ * and length changes (in bits). 
++ * 
++ * Paramters:
++ * 1.  lua_packet_segment 
++ *
++ * Returns:
++ * 1.  new allocated field_changes struct 
++ */
++struct field_changes * get_field_changes_dynamic(lua_State *L, struct protocol_buf *prot_buf, lua_packet_segment * seg)
++{
++      lua_packet_segment *seg_new;
++      struct field_changes * changes;
++      int32_t nr_of_changes, i;
++
++      lua_getglobal(L, (char *)prot_buf->get_field_changes);
++
++      seg_new = (lua_packet_segment *)lua_newuserdata(L, sizeof(lua_packet_segment));
++      seg_new->start = seg->start;
++      seg_new->offset = seg->offset;
++      seg_new->length = seg->length;
++      seg_new->changes = NULL;
++      luaL_getmetatable(L, prot_buf->name);
++      lua_setmetatable(L, -2);
++
++      if (lua_pcall(L, 1, 2, 0) != 0)
++              luaL_error(L, "inside get_field_changes_dynamic. %s\n", lua_tostring(L, -1));
++
++      /* the function call must return a table containing length changes */
++      luaL_checktype(L, -1, LUA_TTABLE);
++      /* the function call must return a table containing offset changes */
++      luaL_checktype(L, -2, LUA_TTABLE);
++      /* both tables have to be of same size */
++      if (lua_objlen(L, -1) != lua_objlen(L, -2))
++              luaL_error(L, "the provided tables are not of equal size");
++
++      nr_of_changes = lua_objlen(L, -1);
++      changes = get_allocated_field_changes(L, nr_of_changes);
++
++      /* loop over the tables */
++      for (i = 1; i < nr_of_changes; i++) {
++              lua_rawgeti(L, -1, i);  /* push length value of field at index i */
++              changes->field_length_changes[i - 1] = luaL_checkinteger(L, -1);
++              lua_pop(L, 1);          /* pop offset value */
++
++              lua_rawgeti(L, -2, i);  /* push offset value of field at index i */
++              changes->field_offset_changes[i - 1] = luaL_checkinteger(L, -1);
++              lua_pop(L, 1);          /* pop length value */
++      }
++
++      /* pop both tables */
++      lua_pop(L, 2);
++
++      return changes;
++}
++
++/* C_INT: 'get_free_protocol_index' is only used internally. This function
++ * gets a free slot inside the array holding all the  protocol buffers.
++ * There are several ways to get to this information. In this case I take
++ * the way over the reflected array SUPPORTED_PROTOCOL_TABLE inside the
++ * Lua state. Since this function is called at laodtime, we do not have
++ * to care about performance.
++ */
++static int32_t get_free_protocol_index(lua_State *L)
++{
++      int32_t protocol_index;
++
++      lua_getglobal(L, SUPPORTED_PROTOCOL_TABLE);
++      protocol_index = lua_objlen(L, -1) + 1;
++      lua_pop(L, 1);
++      return protocol_index;
++}
++
++/* C_API: 'free_dynamic_prot_buf' frees the allocated memory of a given
++ * dynamic protocol buffer. this function is normally called inside a 
++ * cleanup routine. Be aware, before running this function you must be 
++ * sure that no references to the dynamic protocol buffers were available.
++ * It's recomended to close the Lua state before calling the function. */
++void free_dynamic_prot_buf(struct protocol_buf * prot_buf)
++{
++      struct protocol_field * field = prot_buf->protocol_fields;
++
++      for (; field->name != NULL; field++) {
++              if (field->get) kfree(field->get);
++              if (field->set) kfree(field->set);
++              if (field->name) kfree((char *)field->name);
++      }
++
++      if (prot_buf->payload_field) kfree(prot_buf->payload_field);
++      if (prot_buf->has_protocol) kfree(prot_buf->has_protocol);
++
++      if (prot_buf->get_field_changes) kfree(prot_buf->get_field_changes);
++      kfree((char *)prot_buf->name);
++      kfree(prot_buf);
++      return;
++}
++
++void cleanup_dynamic_prot_bufs(void)
++{
++      int32_t i;
++
++      for (i = 0; i < MAX_NR_OF_DYN_PROT_BUFS; i++) {
++              if (dyn_prot_buf_array[i]) {
++                      free_dynamic_prot_buf(dyn_prot_buf_array[i]);
++                      dyn_prot_buf_array[i] = NULL;
++              }
++      }
++      return;
++}
++
++
++/* C_INT: 'free_protocol_fields' is used internally as a helper function for
++ * 'register_dynamic_protbuf'. It is used when durin registration an error
++ * occurs and the afore allocated fields needed to be freed. */
++static inline void free_protocol_fields(struct protocol_field * prot_fields, int32_t i)
++{
++      struct protocol_field * f;
++
++      while (i >= 0) {
++              f = &prot_fields[i];
++              if (f->name) kfree((void *)f->name);
++              if (f->get) kfree((void *)f->get);
++              if (f->set) kfree((void *)f->set);
++              kfree((void *)f);
++              i--;
++      }
++}
++
++/* LUA_API: 'register_dynamic_protbuf' is called from within the Lua script.
++ * it takes a Lua table representing the dynamic protocol buffer as parameter.
++ * e.g.:
++ *    eth_prot_buf = {
++ *            name = "packet_eth_dyn",
++ *            payload_field = "data",
++ *            protocol_fields = {
++ *                    {"dmac",                0,              48,             nil,    nil     },
++ *                    {"smac",                48,     48,             nil,    nil     },
++ *                    {"type",                96,     16,             nil,    nil     },
++ *                    {"data",                112,    0,              nil,    nil },
++ *            },
++ *            has_protocol = "eth_dyn_has_protocol",
++ *            get_field_changes = "eth_dyn_get_field_changes"
++ *    }
++ * register_dynamic_protbuf(eth_prot_buf)
++ * 
++ * the table gets parsed and a new protocol_buf struct is allocated and 
++ * initialized using 'register_protbuf', which is also used for the static
++ * protocol buffers. This enables an identical behavior like the static
++ * protocol buffers. The dynamic protocol buffers are not garbage collected,
++ * use 'free_dynamic_protbuf' to free them after closing the Lua state. 
++ */
++static int32_t register_dynamic_protbuf(lua_State *L)
++{
++      struct protocol_buf *prot_buf;
++      struct protocol_field *field, sentinel = PROT_FIELD_SENTINEL;
++      int32_t nr_of_fields, i;
++
++      prot_buf = (struct protocol_buf *)kmalloc(sizeof(struct protocol_buf), GFP_KERNEL);
++      prot_buf->is_dynamic = 1;
++
++      /* check if parameter is a table */
++      luaL_checktype(L, 1, LUA_TTABLE);
++
++      /* initialize prot_buf.name */
++      lua_getfield(L, 1, "name");
++      prot_buf->name = kmalloc(lua_objlen(L, -1), GFP_KERNEL);
++      strcpy((char *)prot_buf->name, luaL_checkstring(L, -1));
++      lua_pop(L, 1);  /* pop res from lua_getfield */
++
++      /* check if protocol buffer is already registered */
++      lua_getglobal(L, prot_buf->name);
++      if (!lua_isnil(L, -1)) {
++              lua_pop(L, 1); /* pop res from lua_getglobal */
++              pr_debug("protocol_buf '%s' already registered.\n", prot_buf->name);
++              goto free_prot_buf;
++      }
++      lua_pop(L, 1); /* pop res from lua_getglobal */
++
++      /* initialize payload field */
++      lua_getfield(L, 1, "payload_field");
++      if (lua_isstring(L, -1)) {
++              prot_buf->payload_field = kmalloc(lua_objlen(L, -1), GFP_KERNEL);
++              strcpy(prot_buf->payload_field, lua_tostring(L, -1));
++      }else
++              prot_buf->payload_field = NULL;
++      lua_pop(L, 1); /* pop res from lua_getfield */
++
++      /* initialize protocol_fields field*/
++      lua_getfield(L, 1, "protocol_fields");
++      if (!lua_istable(L, -1)) {
++              pr_debug("invalid protocol_fields table.\n");
++              goto err2;
++
++      }
++
++      nr_of_fields = lua_objlen(L, -1);
++      prot_buf->protocol_fields = (struct protocol_field *)kmalloc((nr_of_fields + 1) * sizeof(struct protocol_field), GFP_KERNEL);
++
++      for (i = 1; i <= nr_of_fields; i++) {
++              field = &prot_buf->protocol_fields[i - 1];
++              /* initialize protocol field */
++              lua_rawgeti(L, -1, i);  /* push field-table */
++              if (!lua_istable(L, -1)) {
++                      free_protocol_fields(prot_buf->protocol_fields, i);
++                      pr_debug("invalid protocol_field at %i.\n", i);
++                      goto err;
++              }
++
++              /* initialize protocol field name */
++              lua_rawgeti(L, -1, 1);
++              if (!lua_isstring(L, -1)) {
++                      free_protocol_fields(prot_buf->protocol_fields, i);
++                      pr_debug("invalid protocol_field name at %i.\n", i);
++                      goto err;
++              }
++
++              field->name = kmalloc(lua_objlen(L, -1), GFP_KERNEL);
++              strcpy((char*)field->name, lua_tostring(L, -1));
++              lua_pop(L, 1); /* pop field name */
++
++              /* initialize protocol field offset */
++              lua_rawgeti(L, -1, 2);
++              if (!lua_isnumber(L, -1)) {
++                      free_protocol_fields(prot_buf->protocol_fields, i);
++                      pr_debug("invalid protocol_field offset at %i.\n", i);
++                      goto err;
++              }
++              field->offset = lua_tointeger(L, -1);
++              lua_pop(L, 1); /* pop field offset */
++
++              /* initialize protocol field length */
++              lua_rawgeti(L, -1, 3);
++              if (!lua_isnumber(L, -1)) {
++                      free_protocol_fields(prot_buf->protocol_fields, i);
++                      pr_debug("invalid protocol_field length at %i.\n", i);
++                      goto err;
++              }
++              field->length = lua_tointeger(L, -1);
++              lua_pop(L, 1); /* pop field length */
++
++              /* initialize protocol field getter */
++              lua_rawgeti(L, -1, 4);
++              if (lua_isstring(L, -1)) {
++                      field->get = kmalloc(lua_objlen(L, -1), GFP_KERNEL);
++                      strcpy((char *)field->get, lua_tostring(L, -1)); /* the get-wrapper knows about the piggybacked string */
++              }else
++                      field->get = NULL;
++              lua_pop(L, 1); /* pop field getter */
++
++              /* initialize protocol field setter */
++              lua_rawgeti(L, -1, 5);
++              if (lua_isstring(L, -1)) {
++                      field->set = kmalloc(lua_objlen(L, -1), GFP_KERNEL);
++                      strcpy((char *)field->set, lua_tostring(L, -1)); /* the set-wrapper knows about the piggybacked string */
++              }else
++                      field->set = NULL;
++              lua_pop(L, 1); /* pop field setter */
++
++              /* field initialization completed */
++              lua_pop(L, 1); /* pop field-table */
++      }
++
++      /* put sentinel at the end of protocol_fields */
++      memcpy(&prot_buf->protocol_fields[nr_of_fields], &sentinel, sizeof(sentinel));
++      lua_pop(L, 1); /* pop protocol-fields-table */
++
++      /* initialize has_protocol field */
++      lua_getfield(L, 1, "has_protocol");
++      if (lua_isstring(L, -1)) {
++              prot_buf->has_protocol = kmalloc(lua_objlen(L, -1), GFP_KERNEL);
++              strcpy((char *)prot_buf->has_protocol, lua_tostring(L, -1)); /* the has_protocol-wrapper knows about the piggybacked string */
++      }else
++              prot_buf->has_protocol = NULL;
++      lua_pop(L, 1); /* pop has_protocol */
++
++      /* initialize get_field_changes field */
++      lua_getfield(L, 1, "get_field_changes");
++      if (lua_isstring(L, -1)) {
++              prot_buf->get_field_changes = kmalloc(lua_objlen(L, -1), GFP_KERNEL);
++              strcpy((char *)prot_buf->get_field_changes, lua_tostring(L, -1)); /* the get_field_changes-wrapper knows about the piggybacked string */
++      }else
++              prot_buf->get_field_changes = NULL;
++      lua_pop(L, 1);                                                  /* pop get_field_changes */
++
++      /* Storing the pointer to the DYNAMIC protbuf within dyn_prot_buf_array, in order to free it at cleanup */
++      for (i = 0; i < MAX_NR_OF_DYN_PROT_BUFS; i++) {
++              if (!dyn_prot_buf_array[i]) {
++                      dyn_prot_buf_array[i] = prot_buf;
++                      break;
++              }else
++                      goto err;
++      }
++      
++      /* call the "common" register_protbuf */
++      register_protbuf(L, prot_buf, get_free_protocol_index(L));      /* register prot_buf as it is done with the static ones */
++
++      return 0;
++
++err:
++      kfree(prot_buf->protocol_fields);
++err2:
++      if (prot_buf->payload_field) kfree(prot_buf->payload_field);
++free_prot_buf:
++      kfree((void *)prot_buf->name);
++      kfree(prot_buf);
++
++      luaL_error(L, "one or more error happend while registering a dynamic protocol buffer, please consult the debug log");
++
++      return 0;
++
++}
++
++void luaopen_protbuf_dynamic(lua_State *L)
++{
++      lua_getglobal(L, "_G");
++      lua_pushcclosure(L, register_dynamic_protbuf, 0);
++      lua_setfield(L, -2, "register_dynamic_protbuf");
++      lua_pop(L, 1); /* pop _G */
++      return;
++}
+--- /dev/null
++++ b/extensions/LUA/prot_buf_ethernet.c
+@@ -0,0 +1,60 @@
++/*
++ *    Copyright (C) 2010 University of Basel <http://cn.cs.unibas.ch/>
++ *    by Andre Graf <andre@dergraf.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, see <http://www.gnu.org/licenses/>.
++ */
++
++#include "controller.h"
++
++
++static int32_t eth_has_protocol(lua_State *L, struct protocol_buf * prot_buf, lua_packet_segment * seg, int32_t protocol_type)
++{
++      uint8_t *embedded_protocol = seg->start + seg->offset + 12 /*bytes*/;
++      unsigned short res = (unsigned short)((embedded_protocol[1] << CHAR_BIT) | (embedded_protocol[0] << CHAR_BIT));
++
++      switch (res) {
++      case 0x0800:    /* 1: Internet Protocol (IP) */
++              if (protocol_type == PACKET_IP) return 1;
++              break;
++      default:
++              return 0;
++      }
++
++      return 0;
++}
++
++static const struct protocol_field eth_protocol_fields[] = {
++      /*       field name    offset  length  getter  setter  */
++      { "dmac", 0,                  48,              NULL,              NULL              },
++      { "smac", 48,                 48,              NULL,              NULL              },
++      { "type", 96,                 16,              NULL,              NULL              },
++      { "data", 112,                0,               NULL,              NULL              },
++      PROT_FIELD_SENTINEL,
++};
++
++static const struct protocol_buf eth_protocol_buf = {
++      .is_dynamic                     = 0,
++      .name                           = LUA_PACKET_SEG_ETH,
++      .payload_field                  = "data",
++      .protocol_fields                = (struct protocol_field *)&eth_protocol_fields,
++      .has_protocol                   = &eth_has_protocol,
++      .get_field_changes              = NULL,
++};
++
++
++void luaopen_protbuf_eth(lua_State *L)
++{
++      register_protbuf(L, (struct protocol_buf *)&eth_protocol_buf, PACKET_ETH);
++}
+--- /dev/null
++++ b/extensions/LUA/prot_buf_helpers.c
+@@ -0,0 +1,216 @@
++/*
++ *    Copyright (C) 2010 University of Basel <http://cn.cs.unibas.ch/>
++ *    by Andre Graf <andre@dergraf.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, see <http://www.gnu.org/licenses/>.
++ */
++
++#if defined(__KERNEL__)
++#include <linux/netfilter_ipv4.h>
++#include <linux/slab.h>         /* kmalloc */
++#endif
++
++#include "controller.h"
++
++int32_t get_header_size(struct protocol_buf * prot_buf)
++{
++      int32_t bit_counter = 0;
++      struct protocol_field * field = prot_buf->protocol_fields;
++
++      for (; field->name; field++)
++              bit_counter += field->length;
++
++      return bit_counter >> 3;
++}
++
++
++int32_t set_32_bit_generic(lua_State *L)
++{
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++
++      *(uint32_t  *)(seg->start + seg->offset) = (uint32_t  )htonl(luaL_checkinteger(L, 2));
++      return 0;
++}
++int32_t get_32_bit_generic(lua_State *L)
++{
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++
++      lua_pushinteger(L, ntohl(*((uint32_t  *)(seg->start + seg->offset))));
++      return 1;
++}
++
++int32_t set_16_bit_generic(lua_State *L)
++{
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++
++      *(uint16_t *)(seg->start + seg->offset) = (uint16_t)htons(luaL_checkinteger(L, 2));
++      return 0;
++}
++int32_t get_16_bit_generic(lua_State *L)
++{
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++
++      lua_pushinteger(L, ntohs(*((uint16_t *)(seg->start + seg->offset))));
++      return 1;
++}
++
++int32_t set_lower_4_bit_generic(lua_State *L)
++{
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++      uint8_t b = (uint8_t)luaL_checkinteger(L, 2) << 4;
++      uint8_t * pos = (uint8_t *)(seg->start + seg->offset);
++
++      *pos &= 0x0F; /* reset lower 4 bits*/
++      *pos |= b;
++
++      return 0;
++}
++
++int32_t get_lower_4_bit_generic(lua_State *L)
++{
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++
++      lua_pushinteger(L, (*(uint8_t *)(seg->start + seg->offset)) >> 4);
++      return 1;
++}
++
++int32_t set_upper_4_bit_generic(lua_State *L)
++{
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++      uint8_t b = (uint8_t)luaL_checkinteger(L, 2) << 4;
++      uint8_t * pos = (uint8_t *)(seg->start + seg->offset);
++
++      *pos &= 0xF0; /* reset upper 4 bits*/
++      *pos |= (b >> 4);
++
++      return 0;
++}
++
++int32_t get_upper_4_bit_generic(lua_State *L)
++{
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++
++      lua_pushinteger(L, (*(uint8_t *)(seg->start + seg->offset)) & 0x0F);
++      return 1;
++}
++
++
++int32_t set_8_bit_generic(lua_State *L)
++{
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++
++      *(uint8_t *)(seg->start + seg->offset) = (uint8_t)luaL_checkinteger(L, 2);
++      return 0;
++}
++
++int32_t get_8_bit_generic(lua_State *L)
++{
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++
++      lua_pushinteger(L, *(uint8_t *)(seg->start + seg->offset));
++      return 1;
++}
++
++int32_t set_1_bit_generic(lua_State *L)
++{
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++      unsigned long l = 0;
++
++      memcpy(&l, (seg->start + seg->offset), seg->length);
++      l |= (1 << ((CHAR_BIT * seg->length) - luaL_checkinteger(L, 2)));
++      memcpy((seg->start + seg->offset), &l, seg->length);
++
++      return 0;
++}
++
++int32_t get_1_bit_generic(lua_State *L)
++{
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++      unsigned long l = 0;
++      uint32_t  bit = 0;
++
++      memcpy(&l, (seg->start + seg->offset), seg->length);
++      bit = l & (1 << ((CHAR_BIT * seg->length) - luaL_checkinteger(L, 2)));
++
++      lua_pushboolean(L, bit);
++      return 1;
++}
++
++int32_t get_string_generic(lua_State *L)
++{
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++    
++      /* Warning we cast from uchar to char */
++      lua_pushlstring(L, (char *)seg->start + seg->offset, seg->length);
++      return 1;
++}
++
++int32_t set_data_generic(lua_State *L)
++{
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++      lua_packet_segment * data = checkbytearray(L, 2);
++
++      pr_debug("seg->length %u, data->length %u\n", seg->length, data->length);
++
++      if (seg->length >= data->length)
++              memcpy((seg->start + seg->offset), data->start, data->length);
++      else
++              luaL_error(L, "provided byte array too big for given packet segment");
++      return 0;
++}
++
++struct field_changes * get_allocated_field_changes(lua_State *L, int32_t nr_of_fields)
++{
++      struct field_changes * changes;
++
++      changes = kmalloc(sizeof(struct field_changes), GFP_ATOMIC);
++
++      if (!changes)
++              goto failure;
++
++      changes->field_length_changes = kmalloc(nr_of_fields * sizeof(int), GFP_ATOMIC);
++      if (!changes->field_length_changes)
++              goto free1;
++
++      changes->field_offset_changes = kmalloc(nr_of_fields * sizeof(int), GFP_ATOMIC);
++      if (!changes->field_offset_changes)
++              goto free2;
++
++      memset(changes->field_length_changes, 0, nr_of_fields * sizeof(int));
++      memset(changes->field_offset_changes, 0, nr_of_fields * sizeof(int));
++
++      changes->ref_count = 1;
++
++      return changes;
++
++free2: kfree(changes->field_length_changes);
++free1: kfree(changes);
++failure:
++      if (!changes) luaL_error(L, "couldnt allocate memory inside 'get_allocated_field_changes'");
++      return NULL; /* only to omit warnings */
++}
+\ No newline at end of file
+--- /dev/null
++++ b/extensions/LUA/prot_buf_icmp.c
+@@ -0,0 +1,49 @@
++/*
++ *    Copyright (C) 2010 University of Basel <http://cn.cs.unibas.ch/>
++ *    by Andre Graf <andre@dergraf.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, see <http://www.gnu.org/licenses/>.
++ */
++
++#include "controller.h"
++
++static int32_t icmp_has_protocol(lua_State *L, struct protocol_buf * prot_buf, lua_packet_segment * seg, int32_t protocol_type)
++{
++      return 0;
++}
++
++static const struct protocol_field icmp_protocol_fields[] = {
++      /*       field name    offset  length  getter  setter  */
++      { "type",     0,                   8,              NULL,              NULL      },
++      { "code",     8,                   8,              NULL,              NULL      },
++      { "checksum", 16,                  16,             NULL,              NULL      },
++      { "id",       32,                  16,             NULL,              NULL      },
++      { "sequence", 48,                  16,             NULL,              NULL      },
++      PROT_FIELD_SENTINEL,
++};
++
++static const struct protocol_buf icmp_protocol_buf = {
++      .is_dynamic                     = 0,
++      .name                           = LUA_PACKET_SEG_ICMP,
++      .payload_field                  = NULL,
++      .protocol_fields                = (struct protocol_field *)&icmp_protocol_fields,
++      .has_protocol                   = &icmp_has_protocol,
++      .get_field_changes              = NULL,
++};
++
++void luaopen_protbuf_icmp(lua_State *L)
++{
++      register_protbuf(L, (struct protocol_buf *)&icmp_protocol_buf, PACKET_ICMP);
++}
++
+--- /dev/null
++++ b/extensions/LUA/prot_buf_ip.c
+@@ -0,0 +1,209 @@
++/*
++ *    Copyright (C) 2010 University of Basel <http://cn.cs.unibas.ch/>
++ *    by Andre Graf <andre@dergraf.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, see <http://www.gnu.org/licenses/>.
++ */
++
++#if defined(__KERNEL__)
++      #include <net/checksum.h>
++      #include <net/tcp.h>
++#endif
++
++#include "controller.h"
++
++
++#define IP_FMT "%u.%u.%u.%u"
++#define IP_ACC(buf) buf[0], buf[1], buf[2], buf[3]
++
++
++static int32_t ip_version_set(lua_State *L)
++{
++      uint8_t version_checked;
++      lua_packet_segment * seg = checkpacketseg(L, 1, LUA_PACKET_SEG_IP);
++      uint8_t *version_seg = seg->start + seg->offset;
++      int32_t version = luaL_checkinteger(L, 2);
++
++      luaL_argcheck(L, version >= 0 && version <= 15, 1, "version number invalid");
++
++      version_checked = (uint8_t)version;
++
++      version_seg[0] &= (uint8_t)0x0F;  /* reset version bits */
++      version_seg[0] |= version_checked << 4;
++
++      return 0;
++}
++static int32_t ip_version_get(lua_State *L)
++{
++      lua_packet_segment * seg = checkpacketseg(L, 1, LUA_PACKET_SEG_IP);
++      uint8_t *version_seg = seg->start + seg->offset;
++      uint8_t v = version_seg[0] & 0xF0;
++
++      v >>= 4;
++
++      lua_pushinteger(L, v);
++      return 1;
++}
++
++static int32_t ip_ihl_set(lua_State *L)
++{
++      uint8_t ihl_checked;
++      lua_packet_segment * seg = checkpacketseg(L, 1, LUA_PACKET_SEG_IP);
++      uint8_t *ihl_seg = seg->start + seg->offset;
++      int32_t ihl = luaL_checkinteger(L, 2);
++
++      luaL_argcheck(L, ihl >= 5 && ihl <= 15, 1, "ip header length invalid");         // RFC 791 5x32 = 160 bits
++
++      ihl_checked = (uint8_t)ihl;
++
++      ihl_seg[0] &= (uint8_t)0xF0;      /* reset ihl bits */
++      ihl_seg[0] |= ihl_checked;
++
++      return 0;
++}
++static int32_t ip_ihl_get(lua_State *L)
++{
++      lua_packet_segment * seg = checkpacketseg(L, 1, LUA_PACKET_SEG_IP);
++      uint8_t *ihl_seg = seg->start + seg->offset;
++      uint8_t v = ihl_seg[0] & 0x0F;
++
++      lua_pushinteger(L, v);
++      return 1;
++}
++
++static int32_t ip_addr_set(lua_State *L)
++{
++      int32_t field_id = lua_tointeger(L, lua_upvalueindex(2));
++      lua_packet_segment * seg = checkpacketseg(L, 1, LUA_PACKET_SEG_IP);
++      uint8_t *addr_seg = seg->start + seg->offset;
++      uint32_t  old_addr;
++      char *ip = (char *)luaL_checkstring(L, 2);
++      uint32_t  a, b, c, d;
++      struct sk_buff * skb = (struct sk_buff *)lua_touserdata(L, 3);
++
++      /* for tcp / udp checksumming*/
++      uint32_t  prot_offset;
++      uint8_t *check, *protocol_seg;
++
++      /* end */
++
++      sscanf(ip, IP_FMT, &a, &b, &c, &d);
++
++      luaL_argcheck(L, a < 256 && b < 256 && c < 256 && d < 256, 1, "invalid ip addr");
++
++      old_addr = *((uint32_t  *)addr_seg);
++      addr_seg[0] = (uint8_t)a;
++      addr_seg[1] = (uint8_t)b;
++      addr_seg[2] = (uint8_t)c;
++      addr_seg[3] = (uint8_t)d;
++
++#if defined(__KERNEL__)
++      if (old_addr != *(uint32_t  *)addr_seg) {
++              int32_t offset = (field_id == 10) ? -2 : -6;         /* offset from saddr or daddr */
++
++              csum_replace4((uint16_t *)(addr_seg + offset), old_addr, *(uint32_t  *)addr_seg);
++
++              prot_offset = (field_id == 10) ? -3 : -7;         /* offset from saddr or daddr */
++              protocol_seg = seg->start + seg->offset + prot_offset;
++
++              if (skb && (protocol_seg[0] == 0x06 || protocol_seg[0] == 0x11)) {               /* is payload TCP or UDP ? */
++
++                      check = seg->start + seg->offset;                       /* tmp res */
++                      check += (field_id == 10) ? 8 : 16;                     /* the start of the payload, depending saddr or daddr */
++                      check += (protocol_seg[0] == 0x06) ? 16 : 6;            /* the start of the checksum, depending on TCP or UDP */
++
++                      inet_proto_csum_replace4((__sum16 *)check, skb, old_addr, *(uint32_t  *)addr_seg, 1);
++
++                      lua_pop(L, 1);
++              }
++      }
++#endif
++      return 0;
++}
++
++
++
++
++
++static int32_t ip_addr_get(lua_State *L)
++{
++      lua_packet_segment * seg = checkpacketseg(L, 1, LUA_PACKET_SEG_IP);
++      uint8_t *addr_seg = seg->start + seg->offset;
++
++      char buf[16]; /*max: 255.255.255.255\0 --> 16 chars */
++
++      sprintf(buf, IP_FMT, IP_ACC(addr_seg));
++      lua_pushstring(L, buf);
++      return 1;
++}
++
++static int32_t ip_has_protocol(lua_State *L, struct protocol_buf * prot_buf, lua_packet_segment * seg, int32_t protocol_type)
++{
++      uint8_t * embedded_protocol = seg->start + seg->offset + 9 /*bytes*/;
++
++      switch (embedded_protocol[0]) {
++      case 0x01:      /* 1: Internet Control Message Protocol (ICMP) */
++              if (protocol_type == PACKET_ICMP) return 1;
++              break;
++      case 0x02:      /* 2: Internet Group Management Protocol (IGMP) */
++              break;
++      case 0x06:      /* 6: Transmission Control Protocol (TCP) */
++              if (protocol_type == PACKET_TCP) return 1;
++              break;
++      case 0x11:      /* 17: User Datagram Protocol (UDP) */
++              if (protocol_type == PACKET_UDP) return 1;
++              break;
++      case 0x59:      /* 89: Open Shortest Path First (OSPF) */
++              break;
++      case 0x84:      /* 132: Stream Control Transmission Protocol (SCTP) */
++              break;
++      default:
++              break;
++      }
++
++      return 0;
++}
++
++static const struct protocol_field ip_protocol_fields[] = {
++      /*       field name    offset  length  getter  setter  */
++      { "version",  0,                   4,              ip_version_get,                 ip_version_set               },
++      { "ihl",      4,                   4,              ip_ihl_get,                     ip_ihl_set                   },
++      { "tos",      8,                   8,              get_8_bit_generic,              set_8_bit_generic            },
++      { "tot_len",  16,                  16,             get_16_bit_generic,             set_16_bit_generic           },
++      { "id",       32,                  16,             get_16_bit_generic,             set_16_bit_generic           },
++      { "flags",    48,                  3,              get_1_bit_generic,              set_1_bit_generic            },
++      { "frag_off", 51,                  13,             NULL,                           NULL                         },
++      { "ttl",      64,                  8,              get_8_bit_generic,              set_8_bit_generic            },
++      { "protocol", 72,                  8,              get_8_bit_generic,              set_8_bit_generic            },
++      { "check",    80,                  16,             get_16_bit_generic,             set_16_bit_generic           },
++      { "saddr",    96,                  32,             ip_addr_get,                    ip_addr_set                  },
++      { "daddr",    128,                 32,             ip_addr_get,                    ip_addr_set                  },
++      { "data",     160,                 0,              NULL,                           set_data_generic             },
++      PROT_FIELD_SENTINEL,
++};
++
++static const struct protocol_buf ip_protocol_buf = {
++      .is_dynamic                     = 0,
++      .name                           = LUA_PACKET_SEG_IP,
++      .payload_field                  = "data",
++      .protocol_fields                = (struct protocol_field *)&ip_protocol_fields,
++      .has_protocol                   = &ip_has_protocol,
++      .get_field_changes              = NULL,
++};
++
++void luaopen_protbuf_ip(lua_State *L)
++{
++      register_protbuf(L, (struct protocol_buf *)&ip_protocol_buf, PACKET_IP);
++}
++
+--- /dev/null
++++ b/extensions/LUA/prot_buf_raw.c
+@@ -0,0 +1,43 @@
++/*
++ *    Copyright (C) 2010 University of Basel <http://cn.cs.unibas.ch/>
++ *    by Andre Graf <andre@dergraf.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, see <http://www.gnu.org/licenses/>.
++ */
++
++#include "controller.h"
++static int32_t raw_has_protocol(lua_State *L, struct protocol_buf * prot_buf, lua_packet_segment * seg, int32_t protocol_type)
++{
++      return 1;
++}
++
++static const struct protocol_field raw_protocol_fields[] = {
++      /*       field name    offset  length  getter  setter  */
++      { "data", 0,                0,              NULL,              NULL      },
++      PROT_FIELD_SENTINEL,
++};
++
++static const struct protocol_buf raw_protocol_buf = {
++      .is_dynamic                     = 0,
++      .name                           = LUA_PACKET_SEG_RAW,
++      .payload_field                  = "data",
++      .protocol_fields                = (struct protocol_field *)&raw_protocol_fields,
++      .has_protocol                   = &raw_has_protocol,
++      .get_field_changes              = NULL,
++};
++
++void luaopen_protbuf_raw(lua_State *L)
++{
++      register_protbuf(L, (struct protocol_buf *)&raw_protocol_buf, PACKET_RAW);
++}
+--- /dev/null
++++ b/extensions/LUA/prot_buf_tcp.c
+@@ -0,0 +1,188 @@
++/*
++ *    Copyright (C) 2010 University of Basel <http://cn.cs.unibas.ch/>
++ *    by Andre Graf <andre@dergraf.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, see <http://www.gnu.org/licenses/>.
++ */
++
++#if defined(__KERNEL__)
++      #include <net/checksum.h>
++      #include <net/tcp.h>
++#endif
++#include "controller.h"
++
++
++static int32_t tcp_has_protocol(lua_State *L, struct protocol_buf * prot_buf, lua_packet_segment * seg, int32_t protocol_type)
++{
++      return 1;
++}
++
++static int32_t tcp_set_checksum(lua_State *L)
++{
++      struct protocol_buf * prot_buf = (struct protocol_buf *)lua_topointer(L, lua_upvalueindex(1));
++      lua_packet_segment * seg = checkpacketseg(L, 1, prot_buf->name);
++
++#if defined(__KERNEL__)
++      uint8_t * check_seg = seg->start + seg->offset;
++      uint8_t * tcp_hdr = check_seg - 16;
++      uint8_t * saddr = tcp_hdr - 8;
++      uint8_t * daddr = saddr + 4;
++      uint32_t  len = 20 + (seg->changes->field_length_changes[11] / 8) + (seg->changes->field_length_changes[10] / 8);
++      unsigned short checksum = tcp_v4_check(len, *(uint32_t  *)saddr, *(uint32_t  *)daddr,
++                                             csum_partial(tcp_hdr, len, 0));
++
++      memcpy(check_seg, &checksum, sizeof(unsigned short));
++#endif
++      return 0;
++}
++
++
++static const struct protocol_field tcp_protocol_fields[] = {
++      /*       field name    offset  length  getter  setter  */
++      { "sport",       0,                          16,              get_16_bit_generic,                   set_16_bit_generic             },
++      { "dport",       16,                         16,              get_16_bit_generic,                   set_16_bit_generic             },
++      { "seq",         32,                         32,              get_32_bit_generic,                   set_32_bit_generic             },
++      { "ack",         64,                         32,              get_32_bit_generic,                   set_32_bit_generic             },
++      { "data_off",    96,                         4,               get_lower_4_bit_generic,              set_lower_4_bit_generic        },
++      { "reserved",    100,                        4,               get_upper_4_bit_generic,              set_upper_4_bit_generic        },
++      { "flags",       104,                        8,               get_1_bit_generic,                    set_1_bit_generic              },
++      { "window_size", 112,                        16,              get_16_bit_generic,                   set_16_bit_generic             },
++      { "check",       128,                        16,              get_16_bit_generic,                   tcp_set_checksum               },
++      { "urgent",      144,                        16,              NULL,                                 NULL                           },
++      { "options",     160,                        0,               NULL,                                 set_data_generic               },
++      { "data",        160,                        0,               NULL,                                 set_data_generic               }, /* begin of data depends on options */
++      PROT_FIELD_SENTINEL,
++};
++
++
++static const struct protocol_field tcp_options_and_data[] = {
++      /*       field name    offset  length  getter  setter  */
++      { "MSS",   0,                          16,              get_16_bit_generic,             set_16_bit_generic           },
++      { "WS",    0,                          8,               get_8_bit_generic,              set_8_bit_generic            },
++      { "SACK",  0,                          16,              get_16_bit_generic,             set_16_bit_generic           },
++      { "TSVAL", 0,                          32,              get_32_bit_generic,             set_32_bit_generic           },
++      { "TSER",  0,                          32,              get_32_bit_generic,             set_32_bit_generic           },
++      PROT_FIELD_SENTINEL,
++};
++
++
++static struct field_changes * tcp_get_field_changes(lua_State *L, lua_packet_segment * seg);
++
++static const struct protocol_buf tcp_protocol_buf = {
++      .is_dynamic                     = 0,
++      .name                           = LUA_PACKET_SEG_TCP,
++      .payload_field                  = "data",
++      .protocol_fields                = (struct protocol_field *)&tcp_protocol_fields,
++      .has_protocol                   = &tcp_has_protocol,
++      .get_field_changes              = &tcp_get_field_changes,
++};
++
++
++static struct field_changes * tcp_options_get_field_changes(lua_State *L, lua_packet_segment * seg);
++
++static const struct protocol_buf tcp_options_and_data_buf = {
++      .is_dynamic                     = 0,
++      .name                           = LUA_PACKET_SEG_TCP_OPT,
++      .payload_field                  = NULL,
++      .protocol_fields                = (struct protocol_field *)&tcp_options_and_data,
++      .has_protocol                   = NULL,
++      .get_field_changes              = &tcp_options_get_field_changes,
++};
++
++struct field_changes * tcp_get_field_changes(lua_State *L, lua_packet_segment * seg)
++{
++      /* depending on the value stored inside the 'data_off'-field, the length of
++       * the 'options' field has to be changed, as well as the length and offset
++       * of the 'data' field */
++      uint8_t *tcp_hdr = seg->start + seg->offset;
++
++      /* get the pointer to the 'data_off' field */
++      uint8_t * data_off_field = tcp_hdr + 12; /* 12 bytes offset */
++      /* extract the stored header length in bits */
++      uint32_t  tcp_hdr_len = ((*(uint8_t *)data_off_field) >> 4) * 32;
++
++      /* get an allocated 'field_changes' structure */
++      struct field_changes * changes = get_allocated_field_changes(L, 12);
++
++      /* depending on the tcp header length, change the length of the options*/
++      changes->field_length_changes[10] = tcp_hdr_len - 160;
++      /* depending on the options length, change the offset of the data */
++      changes->field_offset_changes[11] = changes->field_length_changes[10];
++      changes->field_length_changes[11] = (seg->length * 8) - tcp_hdr_len;
++
++      return changes;
++
++}
++
++struct field_changes * tcp_options_get_field_changes(lua_State *L, lua_packet_segment * seg)
++{
++      /* depending on the value stored inside the 'data_off'-field, the length of
++       * the 'options' field has to be changed, as well as the length and offset
++       * of the 'data' field */
++      uint8_t *tcp_opt_hdr = seg->start + seg->offset;
++
++      /* get an allocated 'field_changes' structure */
++      struct field_changes * changes = get_allocated_field_changes(L, 5);
++
++      int32_t MSS = 0, WS = 0, SACK = 0, TS = 0, i;
++
++      uint8_t b1, b2;
++
++      for (i = 0; i < seg->length; i++) {
++              b1 = tcp_opt_hdr[i];
++              b2 = tcp_opt_hdr[i + 1];
++
++              if (b1 == 0x00)
++                      break;
++
++              /* test for MSS */
++              if (!MSS && (b1 == 0x02 && b2 == 0x04)) {
++                      changes->field_offset_changes[0] = (i + 2) * CHAR_BIT;
++                      MSS = 1;
++              }
++
++              /* test for WS --- yet buggy somehow */
++              if (!WS && (b1 == 0x03 && b2 == 0x03)) {
++                      changes->field_offset_changes[1] = (i + 2) * CHAR_BIT;
++                      WS = 1;
++              }
++
++              /* test for SACK*/
++              if (!SACK && (b1 == 0x04 && b2 == 0x02)) {
++                      changes->field_offset_changes[2] = i * CHAR_BIT;        /* has no value */
++                      SACK = 1;
++              }
++
++              /* test for TS */
++              if (!TS && (b1 == 0x08 && b2 == 0x0A)) {
++                      changes->field_offset_changes[3] = (i + 2) * CHAR_BIT;
++                      changes->field_offset_changes[4] = (i + 2 + 4) * CHAR_BIT;
++                      TS = 1;
++              }
++      }
++
++      return changes;
++
++}
++
++void luaopen_protbuf_tcp(lua_State *L)
++{
++      register_protbuf(L, (struct protocol_buf *)&tcp_protocol_buf, PACKET_TCP);
++}
++void luaopen_protbuf_tcp_options(lua_State *L)
++{
++      register_protbuf(L, (struct protocol_buf *)&tcp_options_and_data_buf, PACKET_TCP_OPTIONS);
++}
++
++
+--- /dev/null
++++ b/extensions/LUA/prot_buf_tftp.c
+@@ -0,0 +1,87 @@
++/*
++ *    Copyright (C) 2010 University of Basel <http://cn.cs.unibas.ch/>
++ *    by Andre Graf <andre@dergraf.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, see <http://www.gnu.org/licenses/>.
++ */
++#include "controller.h"
++
++static const struct protocol_field tftp_protocol_fields[] = {
++      /*       field name    offset  length  getter  setter  */
++      { "opcode",             0,              16,             get_16_bit_generic,     NULL},
++      { "filename",           0,              0,              get_string_generic,     NULL},
++      { "mode",                       0,              0,              get_string_generic, NULL},
++      { "block_nr",           0,              16,             get_16_bit_generic, NULL},
++      { "data",                       0,              0,              NULL, NULL},
++      PROT_FIELD_SENTINEL,
++};
++
++struct field_changes * tftp_get_field_changes(lua_State *L, lua_packet_segment * seg)
++{
++      /* depending on the value stored inside the 'opcode'-field we have to change
++       * offsets and lengths */
++      uint8_t *tftp_hdr = seg->start + seg->offset;
++      short opcode = ntohs(*((uint16_t *)tftp_hdr));
++      /* get an allocated 'field_changes' structure */
++      struct field_changes * changes = get_allocated_field_changes(L, 5);
++      switch (opcode) {
++              case 1: /* Read Request (RRQ) */
++                      /* setting offset and length of field 'filename' */
++                      changes->field_offset_changes[1] = sizeof(unsigned short) << 3;
++                      changes->field_length_changes[1] = strlen((char *)tftp_hdr + sizeof(unsigned short)) << 3;
++                      /* setting offset and length of field 'mode' */
++                      changes->field_offset_changes[2] = changes->field_offset_changes[1] + changes->field_length_changes[1];
++                      changes->field_length_changes[2] = strlen((char *)tftp_hdr + (changes->field_offset_changes[2] >> 3));
++                      break;
++              case 2: /* Write Request (WRQ) */
++                      /* setting offset and length of field 'filename' */
++                      changes->field_offset_changes[1] = sizeof(unsigned short) << 3;
++                      changes->field_length_changes[1] = strlen((char *)tftp_hdr + sizeof(unsigned short)) << 3;
++                      /* setting offset and length of field 'mode' */
++                      changes->field_offset_changes[2] = changes->field_offset_changes[1] + changes->field_length_changes[1];
++                      changes->field_length_changes[2] = strlen((char *)tftp_hdr + (changes->field_offset_changes[2] >> 3));
++                      break;
++              case 3: /* Data (DATA) */
++                      /* setting offset of field 'block_nr' */
++                      changes->field_offset_changes[3] = sizeof(unsigned short) << 3;
++                      /* setting offset of field 'data' */
++                      changes->field_offset_changes[4] = changes->field_offset_changes[3] + (sizeof(unsigned short) << 3);
++                      break;
++              case 4: /* Acknowledgment (ACK) */
++                      /* setting offset of field 'block_nr' */
++                      changes->field_offset_changes[3] = sizeof(unsigned short) << 3;
++                      break;
++              case 5: /* Error (ERROR) */
++                      /* we don't care ... yet */
++                      break;
++              default:
++                      break;
++      }
++
++      return changes;
++}
++
++static const struct protocol_buf tftp_protocol_buf = {
++      .is_dynamic                     = 0,
++      .name                           = LUA_PACKET_SEG_TFTP,
++      .payload_field          = NULL,
++      .protocol_fields        = (struct protocol_field *)&tftp_protocol_fields,
++      .has_protocol           = NULL, /* we don't need it, since we don't provide a payload field */
++      .get_field_changes      = tftp_get_field_changes,
++};
++
++void luaopen_protbuf_tftp(lua_State *L)
++{
++      register_protbuf(L, (struct protocol_buf *)&tftp_protocol_buf, PACKET_TFTP);
++}
+--- /dev/null
++++ b/extensions/LUA/prot_buf_udp.c
+@@ -0,0 +1,53 @@
++/*
++ *    Copyright (C) 2010 University of Basel <http://cn.cs.unibas.ch/>
++ *    by Andre Graf <andre@dergraf.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, see <http://www.gnu.org/licenses/>.
++ */
++
++#if defined(__KERNEL__)
++      #include <net/checksum.h>
++#endif
++
++#include "controller.h"
++
++
++static int32_t udp_has_protocol(lua_State *L, struct protocol_buf * prot_buf, lua_packet_segment * seg, int32_t protocol_type)
++{
++      return 1;
++}
++
++static const struct protocol_field udp_protocol_fields[] = {
++      /*       field name    offset  length  getter  setter  */
++      { "sport",  0,                         16,              get_16_bit_generic,             set_16_bit_generic      },
++      { "dport",  16,                        16,              get_16_bit_generic,             set_16_bit_generic      },
++      { "length", 32,                        16,              get_16_bit_generic,             set_16_bit_generic      },
++      { "check",  48,                        16,              get_16_bit_generic,             set_16_bit_generic      },
++      { "data",   64,                        0,               NULL,                     NULL              },
++      PROT_FIELD_SENTINEL,
++};
++
++static const struct protocol_buf udp_protocol_buf = {
++      .is_dynamic                     = 0,
++      .name                           = LUA_PACKET_SEG_UDP,
++      .payload_field                  = "data",
++      .protocol_fields                = (struct protocol_field *)&udp_protocol_fields,
++      .has_protocol                   = &udp_has_protocol,
++      .get_field_changes              = NULL,
++};
++
++void luaopen_protbuf_udp(lua_State *L)
++{
++      register_protbuf(L, (struct protocol_buf *)&udp_protocol_buf, PACKET_UDP);
++}
+--- /dev/null
++++ b/extensions/LUA/xt_LUA.h
+@@ -0,0 +1,36 @@
++/*
++ *    Copyright (C) 2010 University of Basel <http://cn.cs.unibas.ch/>
++ *    by Andre Graf <andre.graf@stud.unibas.ch>
++ *
++ *    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, see <http://www.gnu.org/licenses/>.
++ */
++
++#ifndef XT_LUA_H_
++#define XT_LUA_H_
++
++#define MAX_FILENAME_SIZE  256
++#define MAX_FUNCTION_SIZE  256
++#define MAX_SCRIPT_SIZE 32768
++#define LUA_STATE_ARRAY_SIZE 128
++
++/* the targetsize is stored in a u16, so max size of the xt_lua_tginfo cannot exceed 64K*/
++struct xt_lua_tginfo {
++      char buf[MAX_SCRIPT_SIZE];
++      char filename[MAX_FILENAME_SIZE];
++      char function[MAX_FUNCTION_SIZE];
++      __u64 script_size;
++      __u32 state_id;
++};
++
++#endif /* XT_LUA_H_ */
+--- /dev/null
++++ b/extensions/LUA/xt_LUA_target.c
+@@ -0,0 +1,286 @@
++/*
++ *    Copyright (C) 2010 University of Basel <http://cn.cs.unibas.ch/>
++ *    by Andre Graf <andre@dergraf.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, see <http://www.gnu.org/licenses/>.
++ */
++
++#include <linux/kernel.h>
++#include <linux/slab.h>
++#include <linux/module.h>
++#include <asm/uaccess.h>
++#include <net/ip.h>
++#include <linux/netfilter/x_tables.h>
++#include "xt_LUA.h"
++
++#include "controller.h"
++
++/*::*
++ * lua_envs
++ * ----------
++ * This array holds a defined number of `lua_envs`_ structures.
++ * The used array index is also used as the Lua state identifier.
++ * The size of the array is defined in `LUA_STATE_ARRAY_SIZE`_.
++ */
++struct lua_env * lua_envs[LUA_STATE_ARRAY_SIZE];
++
++/*::*
++ * lua_state_refs
++ * --------------
++ * This array holds the reference counts of the several `lua_nf_state`_s
++ * which are stored inside the array `lua_states`_.
++ */
++uint32_t  lua_state_refs[LUA_STATE_ARRAY_SIZE] = { 0 };
++
++/*::*
++ * lua_tg
++ * ------
++ * This function is called whenever a packet matches all matching conditions
++ * inside a rule. It is the target. It extracts the state identifier comming
++ * inside the *xt_target_param* structure and uses it to access the proper
++ * Lua state inside the `lua_states`_ array.
++ *
++ * It then constructs a new Lua userdata of type *lua_packet_segment* and
++ * initializes it with the lowest network header available. This userdata
++ * is annotated with the Lua metatable `LUA_PACKET_SEG_RAW`_ which converts
++ * the userdata to a raw lua packet having all raw functions available.
++ * This raw packet is the single parameter to the Lua function *process_packet*
++ * which must be defined inside the Lua script provided by the user. So far
++ * hardcoded, may be later configured by Lua - subject to change.
++ *
++ * The process_packet function must return an integer value, the verdict. For
++ * convenience reasons xt_LUA exports the verdicts NF_ACCEPT, NF_DROP and
++ * XT_CONTINUE inside the *register_lua_packet_lib* function.
++ */
++
++spinlock_t lock = SPIN_LOCK_UNLOCKED;
++
++static uint32_t 
++lua_tg(struct sk_buff *pskb, const struct xt_target_param *par)
++{
++      uint32_t  verdict;
++      lua_packet_segment *p;
++      const struct xt_lua_tginfo *info = par->targinfo;
++      lua_State * L;
++
++      /* START critical section on SMP, PacketScript is on the sequential trail at the moment TODO*/
++      spin_lock_irq(&lock);
++
++      L = lua_envs[info->state_id]->L;
++
++      if (!skb_make_writable(pskb, pskb->len))
++              return NF_DROP;
++
++      /* call the function provided by --function parameter or the default 'process_packet' defined in Lua */
++      lua_getglobal(L, info->function);
++
++      /* push the lua_packet_segment as a parameter */
++      p = (lua_packet_segment *)lua_newuserdata(L, sizeof(lua_packet_segment));
++      if (pskb->mac_header)
++              p->start = pskb->mac_header;
++      else if (pskb->network_header)
++              p->start = pskb->network_header;
++      else if (pskb->transport_header)
++              p->start = pskb->transport_header;
++      p->offset = 0;
++      p->length = (unsigned long)pskb->tail - (unsigned long)p->start;
++      p->changes = NULL;
++
++      /* marking userdata 'lua_packet_seg' with the corresponding metatable */
++      luaL_getmetatable(L, LUA_PACKET_SEG_RAW);
++      lua_setmetatable(L, -2);
++
++      /* push a reference to the skb as a parameter, needed at the moment for calculating TCP checksum, but I am not happy with it*/
++      lua_pushlightuserdata(L, (void *)skb_get(pskb));
++
++      /* do the function call (2 argument, 1 result) */
++      if (lua_pcall(L, 2, 1, 0) != 0) {
++              printk(KERN_ERR "LUA [%d]: pcall '%s' failed: %s\n", info->state_id, info->function, lua_tostring(L, -1));
++              lua_pop(L, 1);
++              return NF_DROP;
++      }
++
++      if (!lua_isnumber(L, -1)) {
++              printk(KERN_ERR "LUA [%d]: function '%s' must return a verdict\n", info->state_id, info->function);
++              lua_pop(L, 1);
++              return NF_DROP;
++      }
++
++      verdict = lua_tonumber(L, -1);
++      lua_pop(L, 1);
++
++      kfree_skb(pskb);
++
++      /* END critical section on SMP */
++      spin_unlock_irq(&lock);
++
++
++      return verdict;
++
++} 
++/* Helper for checkentry */
++static bool load_script_into_state(uint32_t  state_id, unsigned long script_size, char *script_buf)
++{
++      char *buf = kmalloc(script_size, GFP_KERNEL);
++      int32_t ret;
++      struct lua_env * env = kmalloc(sizeof(struct lua_env), GFP_KERNEL);
++
++      if (!script_size > 0) {
++              pr_debug("LUA [%d]: script_size %lu < 0\n", state_id, script_size);
++              return false;
++      }
++
++      env->L = lua_open();
++      luaopen_base(env->L);
++      luaopen_controller(env->L);
++
++      lua_getglobal(env->L, "_G");
++      lua_pushinteger(env->L, state_id);
++      lua_setfield(env->L, -2, "STATE_ID");
++      lua_pop(env->L, 1); /* pop _G */
++
++      strncpy(buf, script_buf, script_size);
++      ret = luaL_loadbuffer(env->L, buf, script_size, "PacketScript, loadbuffer") ||
++            lua_pcall(env->L, 0, 1, 0);
++
++      if (ret != 0) {
++              printk(KERN_ERR "LUA [%d]: failure loading script, error %s \n", state_id, lua_tostring(env->L, -1));
++              lua_pop(env->L, 1);
++              kfree(buf);
++              kfree(env);
++              return false;
++      }
++
++      lua_envs[state_id] = env;
++
++      kfree(buf);
++
++      return true;
++}
++/*::*
++ * lua_tg_checkentry
++ * -----------------
++ * This function is used as a kernel-side sanity check of the data comming
++ * from the iptables userspace program. Since this is the function which is
++ * called everytime a new rule (with -j xt_LUA) is injected, this function
++ * is used to do the bookkeeping work, such as counting the reference of
++ * several Lua states and the initialization of new states if needed. As an
++ * extra initialization step it loads the provided Lua script into the Lua
++ * state.
++ *
++ * Lua state initialization
++ * ~~~~~~~~~~~~~~~~~~~~~~~~
++ * 1. If a new rule is inserted and there is no existing state for the given
++ *    state identifier (default state identifier is 0) a new Lua state is
++ *    initialized using *lua_open*.
++ * 2. The Lua base library is registered inside the newly initialized state.
++ *    Have a look at *lua/lbaselib.c* to see what functions of the Lua base
++ *    library are available inside Lua.
++ * 3. The Lua packet library is registered inside the Lua state using the
++ *    function *register_lua_packet_lib*. So far this function only registers
++ *    the Netfilter verdicts NF_ACCEPT, NF_DROP and XT_CONTINUE inside the
++ *    global environment of the given Lua state.
++ * 4. All the protocol Buffers, and the functions for accessing the bytes are
++ *    registered using *register_protocols*.
++ *
++ * Lua state reference counting
++ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
++ * Bookkeeping of the Lua states inside the *lua_state_refs* array. The
++ * state identifier is mapped to the array index, which holds an integer
++ * counting the several initialized states.
++ *
++ * Loading the Lua script
++ * ~~~~~~~~~~~~~~~~~~~~~~
++ * Copying the buffer which was initialized by the userspace program to a
++ * buffer with the proper size. The script is then loaded by the function
++ * xt_LUA_loadcode, which wrapps the *luaL_loadbuffer* function and does
++ * some workqueue initialization. So far this is done each time this function
++ * is called, subject to change.
++ */
++static bool
++lua_tg_checkentry(const struct xt_tgchk_param *par)
++{
++      const struct xt_lua_tginfo *info = par->targinfo;
++
++      if (load_script_into_state(info->state_id, info->script_size, (char *)info->buf)) {
++              lua_state_refs[info->state_id]++;
++              return true;
++      }
++      return false;
++}
++
++/*::*
++ * lua_tg_destroy
++ * --------------
++ * This function is the counterpart of the `lua_tg_checkentry`_ function. It is
++ * responsible to free all the resources alocated inside the checkentry process.
++ * To be more specific it frees the Lua state using *lua_close* and kfree on all
++ * the dynamically allocated pointers to the registered dynamic protocol buffers.
++ *
++ * Additionally the function cares about decrementing the reference counters
++ * inside the array `lua_states`_.
++ */
++static void
++lua_tg_destroy(const struct xt_tgdtor_param *par)
++{
++      const struct xt_lua_tginfo *info = par->targinfo;
++      struct lua_env * env = lua_envs[info->state_id];
++
++      if (lua_state_refs[info->state_id] == 1) {
++              lua_close(env->L);
++              cleanup_dynamic_prot_bufs();  /* clean memory allocated by protocols defined in Lua */
++              kfree(env);
++              pr_debug("LUA [%d]: Rule removed, close Lua state\n", info->state_id);
++      } else
++              pr_debug("LUA [%d]: Rule removed, Lua state stays open, referenced %d time(s)\n",
++                       info->state_id, lua_state_refs[info->state_id] - 1);
++      
++      lua_state_refs[info->state_id]--;
++}
++
++static struct xt_target lua_tg_reg __read_mostly = {
++      .name                   = "LUA",
++      .revision               = 0,
++      .family                 = NFPROTO_UNSPEC,
++      .targetsize             = XT_ALIGN(sizeof(struct xt_lua_tginfo)),
++      .target                 = lua_tg,
++      .checkentry             = lua_tg_checkentry,
++      .destroy                = lua_tg_destroy,
++      .me                     = THIS_MODULE,
++};
++
++
++static int32_t lua_tg_init(void)
++{
++      return xt_register_target(&lua_tg_reg);
++}
++
++static void lua_tg_exit(void)
++{
++      xt_unregister_target(&lua_tg_reg);
++}
++
++module_init(lua_tg_init);
++module_exit(lua_tg_exit);
++
++MODULE_AUTHOR("Andre Graf <andre@dergraf.org>");
++MODULE_DESCRIPTION("Xtables: Processing of matched packets using the Lua scripting environment");
++MODULE_ALIAS("ipt_LUA");
++MODULE_ALIAS("ipt6t_LUA");
++MODULE_ALIAS("arpt_LUA");
++MODULE_ALIAS("ebt_LUA");
++MODULE_LICENSE("GPL");
++
++
++
+--- a/extensions/Kbuild
++++ b/extensions/Kbuild
+@@ -27,6 +27,7 @@ obj-${build_pknock}      += pknock/
+ obj-${build_psd}         += xt_psd.o
+ obj-${build_quota2}      += xt_quota2.o
+ obj-${build_rtsp}        += rtsp/
++obj-${build_LUA}         += LUA/
+ -include ${M}/*.Kbuild
+ -include ${M}/Kbuild.*
+--- a/extensions/Mbuild
++++ b/extensions/Mbuild
+@@ -22,3 +22,4 @@ obj-${build_pknock}      += pknock/
+ obj-${build_psd}         += libxt_psd.so
+ obj-${build_quota2}      += libxt_quota2.so
+ obj-${build_gradm}       += libxt_gradm.so
++obj-${build_LUA}         += LUA/
+--- a/mconfig
++++ b/mconfig
+@@ -23,3 +23,4 @@ build_pknock=m
+ build_psd=m
+ build_quota2=m
+ build_rtsp=m
++build_LUA=m
diff --git a/net/xtables-addons/patches/201-fix-lua-packetscript.patch b/net/xtables-addons/patches/201-fix-lua-packetscript.patch
new file mode 100644 (file)
index 0000000..a9fb796
--- /dev/null
@@ -0,0 +1,127 @@
+--- a/extensions/LUA/xt_LUA_target.c
++++ b/extensions/LUA/xt_LUA_target.c
+@@ -19,7 +19,7 @@
+ #include <linux/kernel.h>
+ #include <linux/slab.h>
+ #include <linux/module.h>
+-#include <asm/uaccess.h>
++#include <linux/uaccess.h>
+ #include <net/ip.h>
+ #include <linux/netfilter/x_tables.h>
+ #include "xt_LUA.h"
+@@ -64,10 +64,10 @@ uint32_t  lua_state_refs[LUA_STATE_ARRAY
+  * XT_CONTINUE inside the *register_lua_packet_lib* function.
+  */
+-spinlock_t lock = SPIN_LOCK_UNLOCKED;
++DEFINE_SPINLOCK(lock);
+ static uint32_t 
+-lua_tg(struct sk_buff *pskb, const struct xt_target_param *par)
++lua_tg(struct sk_buff *pskb, const struct xt_action_param *par)
+ {
+       uint32_t  verdict;
+       lua_packet_segment *p;
+@@ -88,11 +88,11 @@ lua_tg(struct sk_buff *pskb, const struc
+       /* push the lua_packet_segment as a parameter */
+       p = (lua_packet_segment *)lua_newuserdata(L, sizeof(lua_packet_segment));
+       if (pskb->mac_header)
+-              p->start = pskb->mac_header;
++              p->start = skb_mac_header(pskb);
+       else if (pskb->network_header)
+-              p->start = pskb->network_header;
++              p->start = skb_network_header(pskb);
+       else if (pskb->transport_header)
+-              p->start = pskb->transport_header;
++              p->start = skb_transport_header(pskb);
+       p->offset = 0;
+       p->length = (unsigned long)pskb->tail - (unsigned long)p->start;
+       p->changes = NULL;
+@@ -208,16 +208,16 @@ static bool load_script_into_state(uint3
+  * some workqueue initialization. So far this is done each time this function
+  * is called, subject to change.
+  */
+-static bool
++static int
+ lua_tg_checkentry(const struct xt_tgchk_param *par)
+ {
+       const struct xt_lua_tginfo *info = par->targinfo;
+       if (load_script_into_state(info->state_id, info->script_size, (char *)info->buf)) {
+               lua_state_refs[info->state_id]++;
+-              return true;
++              return 0;
+       }
+-      return false;
++      return -EINVAL;
+ }
+ /*::*
+--- a/extensions/LUA/lua/llimits.h
++++ b/extensions/LUA/lua/llimits.h
+@@ -8,7 +8,6 @@
+ #define llimits_h
+ #include <stddef.h>
+-#include <limits.h>
+ #include "lua.h"
+--- a/extensions/LUA/lua/lapi.c
++++ b/extensions/LUA/lua/lapi.c
+@@ -4,9 +4,6 @@
+ ** See Copyright Notice in lua.h
+ */
+-#include <stdarg.h>
+-#include <math.h>
+-#include <assert.h>
+ #include <string.h>
+ #define lapi_c
+--- a/extensions/LUA/lua/ltable.c
++++ b/extensions/LUA/lua/ltable.c
+@@ -18,7 +18,6 @@
+ ** Hence even when the load factor reaches 100%, performance remains good.
+ */
+-#include <math.h>
+ #include <string.h>
+ #define ltable_c
+--- a/extensions/LUA/lua/luaconf.h
++++ b/extensions/LUA/lua/luaconf.h
+@@ -13,8 +13,12 @@
+ #if !defined(__KERNEL__)
+ #include <limits.h>
+ #else
++#include <linux/kernel.h>
++
++#undef UCHAR_MAX
++#undef BUFSIZ
++#undef NO_FPU
+ #define UCHAR_MAX     255
+-#define SHRT_MAX        32767
+ #define BUFSIZ                8192
+ #define NO_FPU
+ #endif
+@@ -637,6 +641,8 @@ union luai_Cast { double l_d; long l_l;
+ */
+ #if defined(__KERNEL__)
+ #undef LUA_USE_ULONGJMP
++#define setjmp __builtin_setjmp
++#define longjmp __builtin_longjmp
+ #endif
+ #if defined(__cplusplus)
+--- a/extensions/LUA/lua/llex.h
++++ b/extensions/LUA/lua/llex.h
+@@ -10,6 +10,8 @@
+ #include "lobject.h"
+ #include "lzio.h"
++/* prevent conflict with definition from asm/current.h */
++#undef current
+ #define FIRST_RESERVED        257
diff --git a/net/xtables-addons/patches/300-geoip-endian-detection.patch b/net/xtables-addons/patches/300-geoip-endian-detection.patch
new file mode 100644 (file)
index 0000000..842e7af
--- /dev/null
@@ -0,0 +1,18 @@
+--- a/extensions/libxt_geoip.c
++++ b/extensions/libxt_geoip.c
+@@ -59,13 +59,13 @@ geoip_get_subnets(const char *code, uint
+       /* Use simple integer vector files */
+       if (nfproto == NFPROTO_IPV6) {
+-#if __BYTE_ORDER == _BIG_ENDIAN
++#if BYTE_ORDER == BIG_ENDIAN
+               snprintf(buf, sizeof(buf), GEOIP_DB_DIR "/BE/%s.iv6", code);
+ #else
+               snprintf(buf, sizeof(buf), GEOIP_DB_DIR "/LE/%s.iv6", code);
+ #endif
+       } else {
+-#if __BYTE_ORDER == _BIG_ENDIAN
++#if BYTE_ORDER == BIG_ENDIAN
+               snprintf(buf, sizeof(buf), GEOIP_DB_DIR "/BE/%s.iv4", code);
+ #else
+               snprintf(buf, sizeof(buf), GEOIP_DB_DIR "/LE/%s.iv4", code);
index fbe1e52c1ad24a27ea44362f53f3867f9362ae38..f30cd17fe8cfcc7f583220baf46f68db2d4d5ff3 100644 (file)
@@ -7,15 +7,15 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=shairport-sync
-PKG_VERSION:=2.8.6
-PKG_RELEASE:=2
+PKG_VERSION:=3.1.6
+PKG_RELEASE:=1
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL:=git://github.com/mikebrady/shairport-sync.git
 PKG_SOURCE_VERSION:=$(PKG_VERSION)
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
-PKG_SOURCE:=$(PKG_VERSION).tar.gz
-PKG_MIRROR_HASH:=892a8c8c5302026501c07f2e75c0d51963167143c96875f12578f7e7c9dadc96
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
+PKG_MIRROR_HASH:=8f440a6bca6a58d04f7c0f6c7ea711b31a0aa4abc7e4d8f4da7346a085dcd966
 PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>, \
                Mike Brady <mikebrady@eircom.net>
 
@@ -33,7 +33,7 @@ define Package/shairport-sync/default
   SECTION:=sound
   CATEGORY:=Sound
   TITLE:=AirPlay compatible audio player
-  DEPENDS:=@AUDIO_SUPPORT +libpthread +alsa-lib +libconfig +libdaemon +libpopt
+  DEPENDS:=@AUDIO_SUPPORT +libpthread +libstdcpp +alsa-lib +libconfig +libdaemon +libpopt
   PROVIDES:=shairport-sync
   URL:=http://github.com/mikebrady/shairport-sync
 endef
index 96917af6cc8c1e407d81caa8c59f508ffc035598..fa1a8dddc4e1e5916a1ffa11f2cf02f2125eada3 100644 (file)
@@ -1,13 +1,13 @@
 # Use your own config file
 config shairport-sync 'shairport_sync_file'
-       option disabled '1'
+       option enabled '0'
        option respawn '1'
        option conf_custom '1'
        option conf_file '/etc/shairport-sync.conf'
 
 # Use OpenWrt UCI config
 config shairport-sync 'shairport_sync'
-       option disabled '1'
+       option enabled '0'
        option respawn '1'
        # General
        option name 'Shairport-Sync-%v-%h'
index afda520e8e192bfa88d0c706bd2b4ee7ee4f56ec..a4a1da9319d4ca473d51066c64da2b63e8e7124f 100644 (file)
@@ -31,8 +31,8 @@ start_instance() {
        local cfg=$1
        local conf_custom conf_file aux
 
-       config_get_bool aux "$cfg" 'disabled' '0'
-       [ "$aux" = 1 ] && return 1
+       config_get_bool aux "$cfg" 'enabled' '0'
+       [ "$aux" = 0 ] && return 1
 
        config_get_bool conf_custom "$cfg" 'conf_custom' '0'
        config_get conf_file "$cfg" "conf_file"
diff --git a/sound/shairport-sync/patches/100-replace_polarssl_with_mbedtls.patch b/sound/shairport-sync/patches/100-replace_polarssl_with_mbedtls.patch
deleted file mode 100644 (file)
index 984eb4c..0000000
+++ /dev/null
@@ -1,395 +0,0 @@
-diff --git a/common.c b/common.c
-index bf72127..2d4739e 100644
---- a/common.c
-+++ b/common.c
-@@ -54,17 +54,14 @@
- #include <openssl/buffer.h>
- #endif
--#ifdef HAVE_LIBPOLARSSL
--#include <polarssl/version.h>
--#include <polarssl/base64.h>
--#include <polarssl/x509.h>
--#include <polarssl/md.h>
--#include "polarssl/entropy.h"
--#include "polarssl/ctr_drbg.h"
--
--#if POLARSSL_VERSION_NUMBER >= 0x01030000
--#include "polarssl/compat-1.2.h"
--#endif
-+#ifdef HAVE_LIBMBEDTLS
-+#include <mbedtls/version.h>
-+#include <mbedtls/base64.h>
-+#include <mbedtls/x509.h>
-+#include <mbedtls/md.h>
-+#include "mbedtls/entropy.h"
-+#include "mbedtls/ctr_drbg.h"
-+
- #endif
- #include "common.h"
-@@ -126,16 +123,16 @@ void inform(char *format, ...) {
-   daemon_log(LOG_INFO, "%s", s);
- }
--#ifdef HAVE_LIBPOLARSSL
-+#ifdef HAVE_LIBMBEDTLS
- char *base64_enc(uint8_t *input, int length) {
-   char *buf = NULL;
-   size_t dlen = 0;
--  int rc = base64_encode(NULL, &dlen, input, length);
--  if (rc && (rc != POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL))
-+  int rc = mbedtls_base64_encode(NULL, 0, &dlen, input, length);
-+  if (rc && (rc != MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL))
-     debug(1, "Error %d getting length of base64 encode.", rc);
-   else {
-     buf = (char *)malloc(dlen);
--    rc = base64_encode((unsigned char *)buf, &dlen, input, length);
-+    rc = mbedtls_base64_encode((unsigned char *)buf, dlen, &dlen, input, length);
-     if (rc != 0)
-       debug(1, "Error %d encoding base64.", rc);
-   }
-@@ -156,10 +153,10 @@ uint8_t *base64_dec(char *input, int *outlen) {
-   else {
-     strcpy(inbuf, input);
-     strcat(inbuf, "===");
--    // debug(1,"base64_dec called with string \"%s\", length %d, filled string: \"%s\", length
--    // %d.",input,strlen(input),inbuf,inbufsize);
--    int rc = base64_decode(buf, &dlen, (unsigned char *)inbuf, inbufsize);
--    if (rc && (rc != POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL))
-+    // debug(1,"base64_dec called with string \"%s\", length %d, filled string: \"%s\", length %d.",
-+    //                input,strlen(input),inbuf,inbufsize);
-+    int rc = mbedtls_base64_decode(NULL, 0, &dlen, (unsigned char *)inbuf, inbufsize);
-+    if (rc && (rc != MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL))
-       debug(1, "Error %d getting decode length, result is %d.", rc, dlen);
-     else {
-       // debug(1,"Decode size is %d.",dlen);
-@@ -167,7 +164,7 @@ uint8_t *base64_dec(char *input, int *outlen) {
-       if (buf == 0)
-         debug(1, "Can't allocate memory in base64_dec.");
-       else {
--        rc = base64_decode(buf, &dlen, (unsigned char *)inbuf, inbufsize);
-+        rc = mbedtls_base64_decode(buf, dlen, &dlen, (unsigned char *)inbuf, inbufsize);
-         if (rc != 0)
-           debug(1, "Error %d in base64_dec.", rc);
-       }
-@@ -280,58 +277,59 @@ uint8_t *rsa_apply(uint8_t *input, int inlen, int *outlen, int mode) {
- }
- #endif
--#ifdef HAVE_LIBPOLARSSL
-+#ifdef HAVE_LIBMBEDTLS
- uint8_t *rsa_apply(uint8_t *input, int inlen, int *outlen, int mode) {
--  rsa_context trsa;
-+  mbedtls_pk_context pkctx;
-+  mbedtls_rsa_context *trsa;
-   const char *pers = "rsa_encrypt";
-+  size_t olen = *outlen;
-   int rc;
--  entropy_context entropy;
--  ctr_drbg_context ctr_drbg;
--  entropy_init(&entropy);
--  if ((rc = ctr_drbg_init(&ctr_drbg, entropy_func, &entropy, (const unsigned char *)pers,
--                          strlen(pers))) != 0)
--    debug(1, "ctr_drbg_init returned %d\n", rc);
-+  mbedtls_entropy_context entropy;
-+  mbedtls_ctr_drbg_context ctr_drbg;
-+
-+  mbedtls_entropy_init(&entropy);
-+
-+  mbedtls_ctr_drbg_init(&ctr_drbg);
-+  mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,
-+                      (const unsigned char *)pers, strlen(pers));
--  rsa_init(&trsa, RSA_PKCS_V21, POLARSSL_MD_SHA1); // padding and hash id get overwritten
--  // BTW, this seems to reset a lot of parameters in the rsa_context
--  rc = x509parse_key(&trsa, (unsigned char *)super_secret_key, strlen(super_secret_key), NULL, 0);
-+  mbedtls_pk_init(&pkctx);
-+
-+  rc = mbedtls_pk_parse_key(&pkctx, (unsigned char *)super_secret_key, sizeof(super_secret_key), NULL, 0);
-   if (rc != 0)
--    debug(1, "Error %d reading the private key.");
-+    debug(1, "Error %d reading the private key.", rc);
--  uint8_t *out = NULL;
-+  uint8_t *outbuf = NULL;
-+  trsa = mbedtls_pk_rsa(pkctx);  
-   switch (mode) {
-   case RSA_MODE_AUTH:
--    trsa.padding = RSA_PKCS_V15;
--    trsa.hash_id = POLARSSL_MD_NONE;
--    debug(2, "rsa_apply encrypt");
--    out = malloc(trsa.len);
--    rc = rsa_pkcs1_encrypt(&trsa, ctr_drbg_random, &ctr_drbg, RSA_PRIVATE, inlen, input, out);
-+    mbedtls_rsa_set_padding(trsa, MBEDTLS_RSA_PKCS_V15, MBEDTLS_MD_NONE);
-+    outbuf = malloc(trsa->len);
-+    rc = mbedtls_rsa_pkcs1_encrypt(trsa, mbedtls_ctr_drbg_random, &ctr_drbg, MBEDTLS_RSA_PRIVATE,
-+                         inlen, input, outbuf);
-     if (rc != 0)
--      debug(1, "rsa_pkcs1_encrypt error %d.", rc);
--    *outlen = trsa.len;
-+      debug(1, "mbedtls_pk_encrypt error %d.", rc);
-+    *outlen = trsa->len;
-     break;
-   case RSA_MODE_KEY:
--    debug(2, "rsa_apply decrypt");
--    trsa.padding = RSA_PKCS_V21;
--    trsa.hash_id = POLARSSL_MD_SHA1;
--    out = malloc(trsa.len);
--#if POLARSSL_VERSION_NUMBER >= 0x01020900
--    rc = rsa_pkcs1_decrypt(&trsa, ctr_drbg_random, &ctr_drbg, RSA_PRIVATE, (size_t *)outlen, input,
--                           out, trsa.len);
--#else
--    rc = rsa_pkcs1_decrypt(&trsa, RSA_PRIVATE, outlen, input, out, trsa.len);
--#endif
-+    mbedtls_rsa_set_padding(trsa, MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA1);
-+    outbuf = malloc(trsa->len);
-+    rc = mbedtls_rsa_pkcs1_decrypt(trsa, mbedtls_ctr_drbg_random, &ctr_drbg, MBEDTLS_RSA_PRIVATE, 
-+                         &olen, input, outbuf, trsa->len);
-     if (rc != 0)
--      debug(1, "decrypt error %d.", rc);
-+      debug(1, "mbedtls_pk_decrypt error %d.", rc);
-+    *outlen = olen;
-     break;
-   default:
-     die("bad rsa mode");
-   }
--  rsa_free(&trsa);
--  debug(2, "rsa_apply exit");
--  return out;
-+
-+  mbedtls_ctr_drbg_free(&ctr_drbg);
-+  mbedtls_entropy_free(&entropy);
-+  mbedtls_pk_free(&pkctx);
-+  return outbuf;
- }
- #endif
-@@ -517,7 +515,7 @@ ssize_t non_blocking_write(int fd, const void *buf, size_t count) {
-       void *ibuf = (void *)buf;
-       size_t bytes_remaining = count;
-       int rc = 0;
--  struct pollfd ufds[1];
-+      struct pollfd ufds[1];
-       while ((bytes_remaining>0) && (rc==0)) {
-               // check that we can do some writing
-               ufds[0].fd = fd;
-diff --git a/configure.ac b/configure.ac
-index 8d82da4..a2d1e4f 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -108,11 +108,11 @@ AC_ARG_WITH(piddir, [ --with-piddir=<pathname> Specify a pathname to a directory
- AM_CONDITIONAL([USE_CUSTOMPIDDIR], [test "x$HAS_CUSTOMPIDDIR" = "x1"])
- # Check --with-ssl=argument
--AC_ARG_WITH(ssl, [ choose --with-ssl=openssl or --with-ssl=polarssl for encryption services], [
-+AC_ARG_WITH(ssl, [ choose --with-ssl=openssl or --with-ssl=mbedtls for encryption services], [
-   AC_MSG_CHECKING(encryption libraries chosen)
-   if test "x${with_ssl}" = x -o "x${with_ssl}" = xyes ; then
-     AC_MSG_RESULT(not found)
--    AC_MSG_ERROR(choose either "openssl" or "polarssl" encryption)
-+    AC_MSG_ERROR(choose either "openssl" or "mbedtls" encryption)
-   fi
-   if test "x${with_ssl}" = xopenssl ; then
-     if  test "x${with_pkg_config}" = xyes ; then
-@@ -127,10 +127,15 @@ AC_ARG_WITH(ssl, [ choose --with-ssl=openssl or --with-ssl=polarssl for encrypti
-       AC_DEFINE([HAVE_LIBCRYPTO],[1],[Define to 1 if you have libcrypto])
-       AC_DEFINE([HAVE_LIBSSL],[1],[Define to 1 if you have libssl])
-     fi
--  elif test "x${with_ssl}" = xpolarssl ; then
--    AC_CHECK_LIB([polarssl],[ssl_init], , AC_MSG_ERROR(PolarSSL selected but the library cannot be found!))
-+  elif test "x${with_ssl}" = xmbedtls ; then
-+    AC_CHECK_LIB([mbedtls],[mbedtls_ssl_init],,
-+              [AC_MSG_ERROR([Cannot find required libray: libmbedtls],1)])
-+    AC_CHECK_LIB([mbedcrypto], [mbedtls_entropy_func],,
-+                [AC_MSG_ERROR([Cannot find required library: libmbedcrypto],1)])
-+    AC_CHECK_LIB([mbedx509], [mbedtls_pk_init],,
-+                [AC_MSG_ERROR([Cannot find required library: libmbedx509],1)])
-   else
--    AC_MSG_ERROR(unknown option "${with_ssl}"." Please choose with "openssl" or "polarssl")
-+    AC_MSG_ERROR(unknown option "${with_ssl}"." Please choose with "openssl" or "mbedtls")
-   fi
- ], )
-diff --git a/player.c b/player.c
-index 97eccfb..da2d735 100644
---- a/player.c
-+++ b/player.c
-@@ -47,9 +47,9 @@
- #include "config.h"
--#ifdef HAVE_LIBPOLARSSL
--#include <polarssl/aes.h>
--#include <polarssl/havege.h>
-+#ifdef HAVE_LIBMBEDTLS
-+#include <mbedtls/aes.h>
-+#include <mbedtls/havege.h>
- #endif
- #ifdef HAVE_LIBSSL
-@@ -82,8 +82,8 @@ static int max_frame_size_change = 1;
- // maximal resampling shift - conservative
- //#define OUTFRAME_BYTES(frame_size) (4 * (frame_size + 3))
--#ifdef HAVE_LIBPOLARSSL
--static aes_context dctx;
-+#ifdef HAVE_LIBMBEDTLS
-+static mbedtls_aes_context dctx;
- #endif
- //static pthread_t player_thread = NULL;
-@@ -247,8 +247,8 @@ static int alac_decode(short *dest, int *destlen, uint8_t *buf, int len) {
-     unsigned char iv[16];
-     int aeslen = len & ~0xf;
-     memcpy(iv, aesiv, sizeof(iv));
--#ifdef HAVE_LIBPOLARSSL
--    aes_crypt_cbc(&dctx, AES_DECRYPT, aeslen, iv, buf, packet);
-+#ifdef HAVE_LIBMBEDTLS
-+    mbedtls_aes_crypt_cbc(&dctx, MBEDTLS_AES_DECRYPT, aeslen, iv, buf, packet);
- #endif
- #ifdef HAVE_LIBSSL
-     AES_cbc_encrypt(buf, packet, aeslen, &aes, iv, AES_DECRYPT);
-@@ -1685,9 +1685,9 @@ int player_play(stream_cfg *stream, pthread_t *player_thread) {
-     die("specified buffer starting fill %d > buffer size %d", config.buffer_start_fill,
-         BUFFER_FRAMES);
-   if (encrypted) {
--#ifdef HAVE_LIBPOLARSSL
--    memset(&dctx, 0, sizeof(aes_context));
--    aes_setkey_dec(&dctx, stream->aeskey, 128);
-+#ifdef HAVE_LIBMBEDTLS
-+    memset(&dctx, 0, sizeof(mbedtls_aes_context));
-+    mbedtls_aes_setkey_dec(&dctx, stream->aeskey, 128);
- #endif
- #ifdef HAVE_LIBSSL
-diff --git a/rtsp.c b/rtsp.c
-index 38b0745..8003803 100644
---- a/rtsp.c
-+++ b/rtsp.c
-@@ -50,8 +50,8 @@
- #include <openssl/md5.h>
- #endif
--#ifdef HAVE_LIBPOLARSSL
--#include <polarssl/md5.h>
-+#ifdef HAVE_LIBMBEDTLS
-+#include <mbedtls/md5.h>
- #endif
- #include "common.h"
-@@ -979,7 +979,7 @@ static void handle_set_parameter_parameter(rtsp_conn_info *conn,
- // more significant changes make it not malloc memory
- // needs to initialise the docoding table first
--// add _so to end of name to avoid confusion with polarssl's implementation
-+// add _so to end of name to avoid confusion with SSL library implementation
- static char encoding_table[] = {
-     'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
-@@ -1651,21 +1651,21 @@ static int rtsp_auth(char **nonce, rtsp_message *req, rtsp_message *resp) {
-   MD5_Final(digest_mu, &ctx);
- #endif
--#ifdef HAVE_LIBPOLARSSL
--  md5_context tctx;
--  md5_starts(&tctx);
--  md5_update(&tctx, (const unsigned char *)username, strlen(username));
--  md5_update(&tctx, (unsigned char *)":", 1);
--  md5_update(&tctx, (const unsigned char *)realm, strlen(realm));
--  md5_update(&tctx, (unsigned char *)":", 1);
--  md5_update(&tctx, (const unsigned char *)config.password,
-+#ifdef HAVE_LIBMBEDTLS
-+  mbedtls_md5_context tctx;
-+  mbedtls_md5_starts(&tctx);
-+  mbedtls_md5_update(&tctx, (const unsigned char *)username, strlen(username));
-+  mbedtls_md5_update(&tctx, (unsigned char *)":", 1);
-+  mbedtls_md5_update(&tctx, (const unsigned char *)realm, strlen(realm));
-+  mbedtls_md5_update(&tctx, (unsigned char *)":", 1);
-+  mbedtls_md5_update(&tctx, (const unsigned char *)config.password,
-              strlen(config.password));
--  md5_finish(&tctx, digest_urp);
--  md5_starts(&tctx);
--  md5_update(&tctx, (const unsigned char *)req->method, strlen(req->method));
--  md5_update(&tctx, (unsigned char *)":", 1);
--  md5_update(&tctx, (const unsigned char *)uri, strlen(uri));
--  md5_finish(&tctx, digest_mu);
-+  mbedtls_md5_finish(&tctx, digest_urp);
-+  mbedtls_md5_starts(&tctx);
-+  mbedtls_md5_update(&tctx, (const unsigned char *)req->method, strlen(req->method));
-+  mbedtls_md5_update(&tctx, (unsigned char *)":", 1);
-+  mbedtls_md5_update(&tctx, (const unsigned char *)uri, strlen(uri));
-+  mbedtls_md5_finish(&tctx, digest_mu);
- #endif
-   int i;
-@@ -1685,16 +1685,16 @@ static int rtsp_auth(char **nonce, rtsp_message *req, rtsp_message *resp) {
-   MD5_Final(digest_total, &ctx);
- #endif
--#ifdef HAVE_LIBPOLARSSL
--  md5_starts(&tctx);
--  md5_update(&tctx, buf, 32);
--  md5_update(&tctx, (unsigned char *)":", 1);
--  md5_update(&tctx, (const unsigned char *)*nonce, strlen(*nonce));
--  md5_update(&tctx, (unsigned char *)":", 1);
-+#ifdef HAVE_LIBMBEDTLS
-+  mbedtls_md5_starts(&tctx);
-+  mbedtls_md5_update(&tctx, buf, 32);
-+  mbedtls_md5_update(&tctx, (unsigned char *)":", 1);
-+  mbedtls_md5_update(&tctx, (const unsigned char *)*nonce, strlen(*nonce));
-+  mbedtls_md5_update(&tctx, (unsigned char *)":", 1);
-   for (i = 0; i < 16; i++)
-     sprintf((char *)buf + 2 * i, "%02x", digest_mu[i]);
--  md5_update(&tctx, buf, 32);
--  md5_finish(&tctx, digest_total);
-+  mbedtls_md5_update(&tctx, buf, 32);
-+  mbedtls_md5_finish(&tctx, digest_total);
- #endif
-   for (i = 0; i < 16; i++)
-diff --git a/shairport.c b/shairport.c
-index f725d60..2349447 100644
---- a/shairport.c
-+++ b/shairport.c
-@@ -42,8 +42,8 @@
- #include "config.h"
--#ifdef HAVE_LIBPOLARSSL
--#include <polarssl/md5.h>
-+#ifdef HAVE_LIBMBEDTLS
-+#include <mbedtls/md5.h>
- #endif
- #ifdef HAVE_LIBSSL
-@@ -109,8 +109,8 @@ char* get_version_string() {
-   char* version_string = malloc(200);
-   if (version_string) {
-     strcpy(version_string, PACKAGE_VERSION);
--  #ifdef HAVE_LIBPOLARSSL
--    strcat(version_string, "-PolarSSL");
-+  #ifdef HAVE_LIBMBEDTLS
-+    strcat(version_string, "-mbedTLS");
-   #endif
-   #ifdef HAVE_LIBSSL
-     strcat(version_string, "-OpenSSL");
-@@ -1046,11 +1046,11 @@ int main(int argc, char **argv) {
-   MD5_Final(ap_md5, &ctx);
- #endif
--#ifdef HAVE_LIBPOLARSSL
--  md5_context tctx;
--  md5_starts(&tctx);
--  md5_update(&tctx, (unsigned char *)config.service_name, strlen(config.service_name));
--  md5_finish(&tctx, ap_md5);
-+#ifdef HAVE_LIBMBEDTLS
-+  mbedtls_md5_context tctx;
-+  mbedtls_md5_starts(&tctx);
-+  mbedtls_md5_update(&tctx, (unsigned char *)config.service_name, strlen(config.service_name));
-+  mbedtls_md5_finish(&tctx, ap_md5);
- #endif
-   memcpy(config.hw_addr, ap_md5, sizeof(config.hw_addr));
- #ifdef CONFIG_METADATA
index b7dfa69da15e8f40d0e75bd388c1f4dc0794793e..122a0957981810b03bc0f55b759997972d9aea8b 100644 (file)
@@ -22,8 +22,6 @@ PKG_MIRROR_HASH:=b6ea4a11366330790f5e36bd875b45bb19a9772dfc984c462f436dfca30256c
 
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
 
-PKG_BUILD_DEPENDS:=libflac libvorbis libmpg123 libfaad2 SQUEEZELITE_WMA:libffmpeg-audio-dec
-
 include $(INCLUDE_DIR)/package.mk
 
 define Package/squeezelite/default
index 7f9421aaa1887e2b9510747799b95da2122ff27e..b5404479bff9576182ac6d9410feadf21e9bfcee 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=btrfs-progs
-PKG_VERSION:=4.14
+PKG_VERSION:=4.14.1
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-v$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=@KERNEL/linux/kernel/people/kdave/btrfs-progs/
-PKG_HASH:=09095cbc3bc2b6aa9d09c93146fb4d7437c51d2572f6918b74fe990fcdcb91af
+PKG_HASH:=90c5b3a73d0a5194754bb148d362b4d2b0755527324c4e9d9fa0b4c15bb354dd
 PKG_MAINTAINER:=Rosen Penev <rosenp@gmail.com>
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-v$(PKG_VERSION)
 
@@ -22,7 +22,7 @@ PKG_LICENSE_FILES:=COPYING
 
 PKG_INSTALL:=1
 PKG_BUILD_PARALLEL:=1
-PKG_BUILD_DEPENDS:=libacl
+PKG_BUILD_DEPENDS:=acl
 
 PKG_FIXUP:=autoreconf
 
@@ -55,6 +55,16 @@ CONFIGURE_ARGS += \
 
 EXTRA_CFLAGS=$(TARGET_CPPFLAGS)
 
+define Build/InstallDev
+       $(INSTALL_DIR) $(1)/usr/include $(1)/usr/lib
+       $(CP) \
+               $(PKG_INSTALL_DIR)/usr/include/* \
+               $(1)/usr/include/
+       $(CP) \
+               $(PKG_INSTALL_DIR)/usr/lib/libbtrfs.{a,so*} \
+               $(1)/usr/lib/
+endef
+
 define Package/btrfs-progs/install
        $(INSTALL_DIR) $(1)/usr/lib
        $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/libbtrfs.so* $(1)/usr/lib
index 20d5d5ea9c75917cef1b2cafd652ee041ef83c97..f31acf55503710e2370d16d73d07caa8c8cd6758 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=collectd
 PKG_VERSION:=5.8.0
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_URL:=https://collectd.org/files/ \
@@ -203,6 +203,14 @@ define Package/collectd/description
  and provides mechanismns to store the values in a variety of ways.
 endef
 
+define Package/collectd/config
+       config PACKAGE_COLLECTD_ENCRYPTED_NETWORK
+       bool "Enable ability to use encrypted networking"
+       default n
+       depends on PACKAGE_collectd
+       select PACKAGE_collectd-mod-network
+endef
+
 ifneq ($(CONFIG_avr32),)
   TARGET_CFLAGS += -fsigned-char
 endif
@@ -214,7 +222,6 @@ CONFIGURE_ARGS+= \
        --enable-daemon \
        --with-nan-emulation \
        --with-libyajl=no \
-       --without-libgcrypt \
        --without-perl-bindings \
        --without-libudev
 
@@ -223,6 +230,16 @@ CONFIGURE_VARS+= \
        LDFLAGS="$$$$LDFLAGS -lm -lz" \
        KERNEL_DIR="$(LINUX_DIR)" \
 
+ifneq ($(CONFIG_PACKAGE_COLLECTD_ENCRYPTED_NETWORK),)
+CONFIGURE_ARGS+= \
+       --with-libgcrypt=$(STAGING_DIR)/usr
+CONFIGURE_VARS+= \
+       GCRYPT_LIBS="-lgcrypt"
+else
+CONFIGURE_ARGS+= \
+       --without-libgcrypt
+endif
+
 CONFIGURE_PLUGIN= \
        $(foreach m, $(1), \
                $(if $(CONFIG_PACKAGE_collectd-mod-$(subst _,-,$(m))),--enable-$(m),--disable-$(m)) \
@@ -353,7 +370,7 @@ $(eval $(call BuildPlugin,match-value,value match,match_value,))
 $(eval $(call BuildPlugin,memory,physical memory usage input,memory,))
 $(eval $(call BuildPlugin,modbus,read variables through libmodbus,modbus,+PACKAGE_collectd-mod-modbus:libmodbus))
 $(eval $(call BuildPlugin,netlink,netlink input,netlink,+PACKAGE_collectd-mod-netlink:libmnl))
-$(eval $(call BuildPlugin,network,network input/output,network,))
+$(eval $(call BuildPlugin,network,network input/output,network,+PACKAGE_COLLECTD_ENCRYPTED_NETWORK:libgcrypt))
 $(eval $(call BuildPlugin,nginx,nginx status input,nginx,+PACKAGE_collectd-mod-nginx:libcurl))
 $(eval $(call BuildPlugin,ntpd,NTP daemon status input,ntpd,))
 $(eval $(call BuildPlugin,nut,UPS monitoring input,nut,+PACKAGE_collectd-mod-nut:nut-common))
index cdaf5a87af8bac71374ae66e1dbf1ee5bf6fea7f..32db0821ee659ed4817d31c8d969bcdedc15a517 100644 (file)
@@ -14,7 +14,6 @@ PKG_RELEASE:=3
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=@GNU/coreutils
 PKG_HASH:=ec43ca5bcfc62242accb46b7f121f6b684ee21ecd7d075059bf650ff9e37b82d
-PKG_BUILD_DEPENDS:=libpthread
 PKG_MAINTAINER:=Jo-Philipp Wich <jo@mein.io>
 
 PKG_BUILD_PARALLEL:=1
index a6a741f18c9928bef0d5c9964cec8aea5190e7b2..6e8fbabeccc57fa21da2b22294ce03febbdb28e2 100644 (file)
@@ -10,13 +10,13 @@ include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=cryptodev-linux
-PKG_VERSION:=1.9.git-2017-05-29
+PKG_VERSION:=1.9.git-2017-10-04
 PKG_RELEASE:=1
 
 PKG_SOURCE_URL:=https://github.com/cryptodev-linux/cryptodev-linux
 PKG_SOURCE_PROTO:=git
-PKG_SOURCE_VERSION:=a705360197260d28535746ae98c461ba2cfb7a9e
-PKG_MIRROR_HASH:=334a8f4df18e36e97459b4c6669c9873c13c4f5dae25243cf41ff70c2ce661d8
+PKG_SOURCE_VERSION:=0a54e38b264d9a3bed74c642a61b88191660d0f8
+PKG_MIRROR_HASH:=af3c303afe7ff995b120add6101261a652a6478a2a69018dd740f49a8b14ed09
 PKG_LICENSE:=GPL-2.0
 PKG_LICENSE_FILES:=COPYING
 
diff --git a/utils/digitemp/Makefile b/utils/digitemp/Makefile
new file mode 100644 (file)
index 0000000..e0b3350
--- /dev/null
@@ -0,0 +1,89 @@
+#
+# Copyright (C) 2009-2017 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+# Comment: This makefile is based on the oldpackage makefile by acinonyx / nbd
+# https://dev.openwrt.org/browser/packages/utils/digitemp/Makefile
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=digitemp
+PKG_VERSION:=3.7.1
+PKG_RELEASE:=1
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_SOURCE_URL:=https://github.com/bcl/digitemp.git
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_VERSION:=be824bbbc81189931bf4b130a8acc39288d75662
+PKG_MAINTAINER:=Jasper Scholte <NightNL@outlook.com>
+PKG_LICENSE:=GPL-2.0+
+PKG_MIRROR_HASH:=490f9c94c671aa74ce0ef4fbc95231644f3aa7023d2b947714ed55fd712672f2
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/digitemp/Default
+  SECTION:=utils
+  CATEGORY:=Utilities
+  TITLE:=DigiTemp is a simple to use program for reading values from 1-wire devices.
+  URL:=http://www.digitemp.com
+endef
+
+define Package/digitemp/Default/description
+       DigiTemp is a simple to use program for reading values from 1-wire devices.
+       Its main use is for reading temperature sensors, but it also reads counters,
+       and understands the 1-wire hubs with devices on different branches of the network.
+endef
+
+define Package/digitemp
+$(call Package/digitemp/Default)
+  TITLE += (serial version)
+endef
+
+define Package/digitemp/description
+$(call Package/digitemp/Default/description)
+       This package is built without USB support.
+endef
+
+define Package/digitemp-usb
+$(call Package/digitemp/Default)
+  TITLE += (USB version)
+  DEPENDS += +libusb-compat
+endef
+
+define Package/digitemp-usb/description
+$(call Package/digitemp/Default/description)
+       This package is built with USB support.
+endef
+
+define Build/Compile
+       $(MAKE) -C $(PKG_BUILD_DIR) \
+               $(TARGET_CONFIGURE_OPTS) \
+               CFLAGS="$(TARGET_CFLAGS) -DLINUX $(TARGET_CPPFLAGS) \
+                       -I./src -I./userial" \
+               LIBS="$(TARGET_LDFLAGS)" \
+               DESTDIR="$(PKG_INSTALL_DIR)" \
+               ds9097 ds9097u
+       $(MAKE) -C $(PKG_BUILD_DIR) \
+               $(TARGET_CONFIGURE_OPTS) \
+               CFLAGS="$(TARGET_CFLAGS) -DLINUX $(TARGET_CPPFLAGS) \
+                       -I./src -I./userial -DOWUSB" \
+               LIBS="$(TARGET_LDFLAGS) -lusb -lm -DOWUSB" \
+               DESTDIR="$(PKG_INSTALL_DIR)" \
+               clean ds2490
+endef
+
+define Package/digitemp/install
+       $(INSTALL_DIR) $(1)/usr/bin/
+       $(CP) $(PKG_BUILD_DIR)/digitemp_{DS9097,DS9097U} $(1)/usr/bin/
+endef
+
+define Package/digitemp-usb/install
+       $(INSTALL_DIR) $(1)/usr/bin/
+       $(CP) $(PKG_BUILD_DIR)/digitemp_DS2490 $(1)/usr/bin/
+endef
+
+$(eval $(call BuildPackage,digitemp))
+$(eval $(call BuildPackage,digitemp-usb))
diff --git a/utils/digitemp/patches/0001_add_missing_includes.patch b/utils/digitemp/patches/0001_add_missing_includes.patch
new file mode 100644 (file)
index 0000000..3774951
--- /dev/null
@@ -0,0 +1,72 @@
+--- a/src/ds2438.c     2015-12-22 04:47:28.000000000 +0100
++++ b/src/ds2438.c     2017-07-02 22:52:36.671830316 +0200
+@@ -5,6 +5,7 @@
+    Licensed under GPL v2
+    ----------------------------------------------------------------------- */
+ #include <stdio.h>
++#include <sys/types.h>
+ #include "ownet.h"
+ #include "ad26.h"
+
+--- a/userial/ad26.c   2015-12-22 04:47:28.000000000 +0100
++++ b/userial/ad26.c   2017-07-02 22:58:03.902024016 +0200
+@@ -33,7 +33,7 @@
+ #include "ownet.h"
+ #include "ad26.h"
+ #include "owproto.h"
+-
++#include "sys/types.h"
+
+ extern int   owBlock(int,int,uchar *,int);
+ extern void  setcrc8(int,uchar);
+
+--- a/userial/cnt1d.c  2015-12-22 04:47:28.000000000 +0100
++++ b/userial/cnt1d.c  2017-07-02 22:56:26.850619935 +0200
+@@ -29,6 +29,7 @@
+ //  Version: 2.00
+ //
+ //
++#include "sys/types.h"
+ #include "ownet.h"
+
+ // external One Wire functions from nework layer
+
+--- a/userial/crcutil.c        2015-12-22 04:47:28.000000000 +0100
++++ b/userial/crcutil.c        2017-07-02 22:55:13.631039389 +0200
+@@ -29,6 +29,7 @@
+
+ // Include files
+ #include "ownet.h"
++#include "sys/types.h"
+
+ // Local subroutines
+ void setcrc16(int,ushort);
+
+--- a/userial/ds9097u/owtrnu.c 2015-12-22 04:47:28.000000000 +0100
++++ b/userial/ds9097u/owtrnu.c 2017-07-02 23:00:52.320902969 +0200
+@@ -39,6 +39,7 @@
+ //                        Added file I/O operations
+ //
+
++#include "sys/types.h"
+ #include "ownet.h"
+ #include "ds2480.h"
+
+--- a/userial/ioutil.c 2015-12-22 04:47:28.000000000 +0100
++++ b/userial/ioutil.c 2017-07-02 22:55:48.378843851 +0200
+@@ -36,6 +36,7 @@
+ #include <string.h>
+ #include <ctype.h>
+ #include "ownet.h"
++#include "sys/types.h"
+
+ #ifdef __MC68K__
+ #include <PalmOS.h>
+
+--- a/userial/owproto.h        2015-12-22 04:47:28.000000000 +0100
++++ b/userial/owproto.h        2017-07-02 22:58:59.561664538 +0200
+@@ -1,3 +1,4 @@
++#include "sys/types.h"
+ /* Prototypes for userial driver functions */
+
+ /* From other low level userial files */
index e7992f1f1a8e3bf3755c26eb888ff4c5ca7ccd1c..dea0e2c32ca46d4dd9fb975c983d48c186e9ec9e 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2007-2016 OpenWrt.org
+# Copyright (C) 2007-2017 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=dmidecode
-PKG_VERSION:=3.0
-PKG_RELEASE:=3
+PKG_VERSION:=3.1
+PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=@SAVANNAH/$(PKG_NAME)
-PKG_HASH:=7ec35bb193729c1d593a1460b59d82d24b89102ab23fd0416e6cf4325d077e45
+PKG_HASH:=d766ce9b25548c59b1e7e930505b4cad9a7bb0b904a1a391fbb604d529781ac0
 PKG_MAINTAINER:=Álvaro Fernández Rojas <noltari@gmail.com>
 
 PKG_LICENSE:=GPL-2.0
index 1397e6ccb0a6287fb9e7ff2edaba3e4f431dbb64..d0efb353f02c589210a212221805070c63856ef8 100644 (file)
@@ -8,21 +8,21 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=dump1090
-PKG_VERSION:=2016-11-26
+PKG_VERSION:=2017-06-01
 PKG_RELEASE:=1
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL:=https://github.com/mutability/dump1090.git
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
-PKG_SOURCE_VERSION:=fb63bdc2a61f0169b3c21b33bcdc99f202685b78
+PKG_SOURCE_VERSION:=b155fdb458c3241ab375d1f2b12fbb6a9f8a8a3a
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.xz
-PKG_MIRROR_HASH:=efb2580509cf13a769cffd1982433d29acd64a5c115793417fd36d9d5f73c9e8
+PKG_MIRROR_HASH:=ff1bc142107d367c6c58ccc5dbcec822c251a683e43e3b771ab4a33a9012f602 
 PKG_MAINTAINER:=Álvaro Fernández Rojas <noltari@gmail.com>
 
 PKG_LICENSE:=GPL-2.0
 PKG_LICENSE_FILES:=COPYING LICENSE
 
-PKG_BUILD_DEPENDS:=librtlsdr
+PKG_BUILD_DEPENDS:=libusb
 
 include $(INCLUDE_DIR)/package.mk
 
index 8df01a6c3ffd71496a5b22733229d3295c7890c1..51106fa251bb4e742b0d2f60ec1d3f4824a8e866 100644 (file)
@@ -1,16 +1,16 @@
 #!/bin/sh
 uci batch <<-EOF
-       set uhttpd.xupnpd=uhttpd
-       set uhttpd.xupnpd.listen_http='0.0.0.0:8080 [::]:8080'
-       set uhttpd.xupnpd.home=/usr/share/dump1090
-       set uhttpd.xupnpd.rfc1918_filter=1
-       set uhttpd.xupnpd.max_requests=3
-       set uhttpd.xupnpd.max_connections=100
-       set uhttpd.xupnpd.script_timeout=60
-       set uhttpd.xupnpd.network_timeout=30
-       set uhttpd.xupnpd.http_keepalive=20
-       set uhttpd.xupnpd.tcp_keepalive=1
-       set uhttpd.xupnpd.index_page='index.html index.htm gmap.html'
+       set uhttpd.dump1090=uhttpd
+       set uhttpd.dump1090.listen_http='0.0.0.0:8080 [::]:8080'
+       set uhttpd.dump1090.home=/usr/share/dump1090
+       set uhttpd.dump1090.rfc1918_filter=1
+       set uhttpd.dump1090.max_requests=3
+       set uhttpd.dump1090.max_connections=100
+       set uhttpd.dump1090.script_timeout=60
+       set uhttpd.dump1090.network_timeout=30
+       set uhttpd.dump1090.http_keepalive=20
+       set uhttpd.dump1090.tcp_keepalive=1
+       set uhttpd.dump1090.index_page='index.html index.htm gmap.html'
        commit uhttpd
 EOF
 exit 0
index cbb0ff3c1ed219d74ddd79502b7294d2b92c3b0e..df0561a2ab71ed0ea8a9998bb62485cfb4e7dcf8 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2010-2016 OpenWrt.org
+# Copyright (C) 2010-2017 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,13 +8,13 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=flashrom
-PKG_VERSION:=0.9.9
-PKG_RELEASE:=2
+PKG_VERSION:=0.9.9.1
+PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_URL:=http://download.flashrom.org/releases
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
-PKG_HASH:=cb3156b0f63eb192024b76c0814135930297aac41f80761a5d293de769783c45
+PKG_HASH:=0e145a5b9b18c98752acf0f8329a9a260ddf030abf687416daab9f05a0f508d0
 PKG_MAINTAINER:=Álvaro Fernández Rojas <noltari@gmail.com>
 
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_SOURCE_SUBDIR)
index 376d6b285d7fcd0d0b5ea4b44affe5b2faf342b1..581e0704a23a73f0b50361e2aef64ea60d184764 100644 (file)
@@ -1,6 +1,6 @@
 --- a/programmer.h
 +++ b/programmer.h
-@@ -557,7 +557,7 @@ enum spi_controller {
+@@ -584,7 +584,7 @@ enum spi_controller {
  #if CONFIG_DEDIPROG == 1
        SPI_CONTROLLER_DEDIPROG,
  #endif
index 50aa2a8fae3c69a4544f00afbb8ec1390a8d4e6d..63109e1f11fd17f9feaa38e07d59c62042ab91ec 100644 (file)
@@ -1,12 +1,10 @@
-diff -uprN a/linux_spi.c b/linux_spi.c
---- a/flash.h     2015-02-08 16:57:52.000000000 -0500
-+++ b/flash.h     2016-01-08 20:09:51.599387507 -0500
+--- a/flash.h
++++ b/flash.h
 @@ -30,6 +30,7 @@
  #include <stdio.h>
  #include <stdint.h>
  #include <stddef.h>
 +#include <sys/io.h>
+ #include <stdarg.h>
  #include <stdbool.h>
  #if IS_WINDOWS
- #include <windows.h>
-
index b5aac0438356a00a2ae6eeeb8bacea57ed5c6ffc..5593bffab2d49932a9f88ef0e5b24e9863c17587 100644 (file)
@@ -19,8 +19,6 @@ PKG_MAINTAINER:=Pushpal Sidhu <psidhu.devel@gmail.com>
 PKG_LICENSE:=BSD-3-Clause
 PKG_LICENSE_FILES:=COPYING
 
-PKG_BUILD_DEPENDS:=libncurses libusb-1.0
-
 include $(INCLUDE_DIR)/package.mk
 include $(INCLUDE_DIR)/scons.mk
 
index c98ab8bbe7aefec1e1854c4a79ec56e86f96eb16..88dd6b3f6aeecdcd85075f83c1d68300ace37937 100644 (file)
@@ -25,8 +25,8 @@ PKG_LICENSE:=GPLv2
 PKG_LICENSE_FILES:=COPYING
 
 include $(INCLUDE_DIR)/package.mk
-$(call include_mk, python-package.mk)
-$(call include_mk, python3-package.mk)
+include ../../lang/python/python-package.mk
+include ../../lang/python/python3-package.mk
 
 define Package/i2c/Default
   URL:=http://lm-sensors.org/wiki/I2CTools
index cbb8c91351e31b8fb5fe90ec522edfdcef42014f..00dea85047254c0eb84e6f03256e117a58120a86 100644 (file)
@@ -120,13 +120,6 @@ PKG_INSTALL:=1
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
 
 PKG_BUILD_DEPENDS:= \
-       libdbus \
-       libgd \
-       libmpdclient \
-       libmysqlclient \
-       libncurses \
-       libnmeap \
-       libsqlite3 \
        ppp \
 #      libftdi \
 #      libX11 \
index 13aa5b9235de20c4917e0e1c0bb697fd103cdefa..3ea3b4f23713f9eb576cd441cb5d56c60f4fbb57 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=lm-sensors
 PKG_VERSION:=3.3.5
-PKG_RELEASE:=3
+PKG_RELEASE:=4
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL:=https://github.com/groeck/lm-sensors.git
@@ -101,6 +101,8 @@ ifeq ($(ARCH),i386)
        $(INSTALL_DIR) $(1)/etc
        $(INSTALL_CONF) ./files/sensors.conf $(1)/etc/sensors.conf
 endif
+       $(INSTALL_DIR) $(1)/etc/init.d
+       $(INSTALL_BIN) ./files/lm-sensors.init $(1)/etc/init.d/lm-sensors
 endef
 
 define Package/lm-sensors-detect/install
diff --git a/utils/lm-sensors/files/lm-sensors.init b/utils/lm-sensors/files/lm-sensors.init
new file mode 100644 (file)
index 0000000..5ac7a72
--- /dev/null
@@ -0,0 +1,14 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2017 Philip Prindeville, Redfish Solutions LLC
+
+START=28
+STOP=
+
+PROG=/usr/sbin/sensors
+
+start() {
+       [ -f /etc/sensors.conf -o -f /etc/sensors3.conf ] || return
+
+       $PROG -s
+}
+
index 6e451ca84e3d9094b9e906d6425e45db3f849443..f90f6ea73283038ffe3d68c8a9f7baa35f7c59eb 100644 (file)
@@ -9,14 +9,14 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=LVM2
-PKG_VERSION:=2.02.176
+PKG_VERSION:=2.02.177
 PKG_RELEASE:=1
 PKG_LICENSE:=GPL-2.0 LGPL-2.1
 
 PKG_SOURCE:=$(PKG_NAME).$(PKG_VERSION).tgz
 PKG_SOURCE_URL:=ftp://sources.redhat.com/pub/lvm2/releases \
                http://ftp.gwdg.de/pub/linux/sources.redhat.com/lvm2/
-PKG_HASH:=dece83628c2c78a267a126ce6046d506582185ae5d40fb8d59b56547fccea473
+PKG_HASH:=4025a23ec9b15c2cb7486d151c29dc953b75efc4d452cfe9dbbc7c0fac8e80f2
 PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME).$(PKG_VERSION)
 
index 5d26fcdffb9b3d608ee843b3a6782db683f3d7bf..5bffc22c6b3997be7cabdcc71dda0258273773df 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2006-2015 OpenWrt.org
+# Copyright (C) 2006-2017 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=minicom
-PKG_VERSION:=2.7
-PKG_RELEASE:=4
+PKG_VERSION:=2.7.1
+PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
-PKG_SOURCE_URL:=https://alioth.debian.org/frs/download.php/file/3977/
-PKG_HASH:=9ac3a663b82f4f5df64114b4792b9926b536c85f59de0f2d2b321c7626a904f4
+PKG_SOURCE_URL:=https://alioth.debian.org/frs/download.php/file/4215
+PKG_HASH:=532f836b7a677eb0cb1dca8d70302b73729c3d30df26d58368d712e5cca041f1
 PKG_MAINTAINER:=Álvaro Fernández Rojas <noltari@gmail.com>
 
 PKG_LICENSE:=GPL-2.0
index 40870c34324a9f83f8398498d85a57cc868a10ee..1302f5b81569b30805f9f02347f981e06357f4bb 100644 (file)
@@ -1,6 +1,6 @@
 --- a/src/minicom.c
 +++ b/src/minicom.c
-@@ -1159,7 +1159,7 @@ int main(int argc, char **argv)
+@@ -1161,7 +1161,7 @@ int main(int argc, char **argv)
        switch(c) {
        case 'v':
          printf(_("%s version %s"), PACKAGE, VERSION);
@@ -9,7 +9,7 @@
          printf(_(" (compiled %s)"), __DATE__);
  #endif
          printf("\n");
-@@ -1462,7 +1462,7 @@ int main(int argc, char **argv)
+@@ -1464,7 +1464,7 @@ int main(int argc, char **argv)
  
    mc_wprintf(us, "\n%s %s\r\n", _("Welcome to minicom"), VERSION);
    mc_wprintf(us, "\n%s: %s\r\n", _("OPTIONS"), option_string);
index b9f31af730275d05ad73403b86772e8a34a1bed1..d20fbdfecf3c3c7c0663527c1b77114cd758c617 100644 (file)
@@ -9,7 +9,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=mksh
-PKG_VERSION:=55
+PKG_VERSION:=56b
 PKG_RELEASE:=1
 
 PKG_MAINTAINER:=Thorsten Glaser <tg@mirbsd.org>
@@ -18,7 +18,7 @@ PKG_LICENSE:=MirOS
 PKG_SOURCE:=$(PKG_NAME)-R$(PKG_VERSION).tgz
 PKG_SOURCE_URL:=http://www.mirbsd.org/MirOS/dist/mir/mksh \
                http://pub.allbsd.org/MirOS/dist/mir/mksh
-PKG_HASH:=ced42cb4a181d97d52d98009eed753bd553f7c34e6991d404f9a8dcb45c35a57
+PKG_HASH:=40ec744eec256583e4e18907cde22af57c980286f535df47326fed07e48c9a7f
 
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
 
index 30c1a79bcfb22caaf40ae865f5cdf6318124c480..21069fc533d8bd0b135658f13adda361b1f09d77 100644 (file)
@@ -20,15 +20,21 @@ Additional changes of the patch as of mksh-R55
 * Use `/etc/mkshrc` as default startup file, so there is no need to
   manually source it during interactive session.
 
+From: Alif M. A. <alive4ever@live.com>
+Date: Thu, 11 Jan 2018 02:13:46 +0000
+Subject: [PATCH] Refresh 100-dot_mkshrc for mksh-R55
+
+Refreshed 100-dot_mkshrc for mksh-r56b
+
 ---
 Reviewed-by: Thorsten Glaser <tg at mirbsd.org>
 Signed-off-by: Alif M. A. <alive4ever at live.com>
 
 --- a/dot.mkshrc
 +++ b/dot.mkshrc
-@@ -56,10 +56,9 @@
-       done
- )
+@@ -63,10 +63,9 @@
+       EDITOR=
+ done
  
 -\\builtin alias ls=ls l='ls -F' la='l -a' ll='l -l' lo='l -alo'
 -\: "${HOSTNAME:=$(\\builtin ulimit -c 0; \\builtin print -r -- $(hostname \
index c511df1797ffa42bedd5247efd51262eaded6896..32d07f416f028b3ed889d26054b7d5941009b1ab 100644 (file)
@@ -23,7 +23,6 @@ PKG_HASH:=05ebe21305408b24407d14b77607a3e5ffa3c300e03f1359d3066f301989dcb5
 PKG_MAINTAINER:=Jo-Philipp Wich <jo@mein.io>
 PKG_LICENSE:=GPL-2.0
 
-PKG_BUILD_DEPENDS:=libncurses libreadline
 PKG_BUILD_PARALLEL:=1
 PKG_USE_MIPS16:=0
 
@@ -42,7 +41,7 @@ endef
 define Package/mysql-server
   SECTION:=utils
   CATEGORY:=Utilities
-  DEPENDS:=+libmysqlclient +libpthread +libncursesw +libreadline
+  DEPENDS:=+libmysqlclient +libpthread +libncurses +libreadline
   TITLE:=MySQL Server
   URL:=http://dev.mysql.com/
   SUBMENU:=database
index a08a540361531b438dd08c080f14b01b0c868a3c..5de4ae9e0b02462e6440a4d4547aad0f90edeb05 100644 (file)
@@ -8,14 +8,14 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=nano
-PKG_VERSION:=2.8.7
+PKG_VERSION:=2.9.2
 PKG_RELEASE:=1
 PKG_LICENSE:=GPL-3.0+
 PKG_LICENSE_FILES:=COPYING
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=@GNU/nano
-PKG_HASH:=fbe31746958698d73c6726ee48ad8b0612697157961a2e9aaa83b4aa53d1165a
+PKG_HASH:=4eccb7451b5729ce8abae8f9a5679f32e41ae58df73ea86b850ec45b10a83d55
 
 PKG_INSTALL:=1
 PKG_BUILD_PARALLEL:=1
@@ -28,7 +28,8 @@ define Package/nano
   CATEGORY:=Utilities
   TITLE:=An enhanced clone of the Pico text editor
   URL:=http://www.nano-editor.org/
-  MAINTAINER:=Jonathan Bennett <JBennett@incomsystems.biz>
+  MAINTAINER:=Jonathan Bennett <JBennett@incomsystems.biz>, \
+               Hannu Nyman <hannu.nyman@iki.fi>
   DEPENDS:=+libncurses
 endef
 
diff --git a/utils/nano/patches/001-backport-post287-fix-for-tiny-compilation.patch b/utils/nano/patches/001-backport-post287-fix-for-tiny-compilation.patch
deleted file mode 100644 (file)
index ef8d749..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-From 28cfab7580c42a6d6c9c5d787ce736094fd51a0c Mon Sep 17 00:00:00 2001
-From: Benno Schulenberg <bensberg@telfort.nl>
-Date: Tue, 29 Aug 2017 19:28:44 +0200
-Subject: tweaks: fix compilation when configured with --enable-tiny
-
-When moving the cursor to the top-left corner, it is not necessary
-to compute leftedge because firstcolumn IS the relevant leftedge.
-
-Reported-by: Jordi Mallach <jordi@debian.org>
----
- src/move.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/src/move.c b/src/move.c
-index d138356..ce276e4 100644
---- a/src/move.c
-+++ b/src/move.c
-@@ -121,7 +121,7 @@ void do_page_up(void)
-       openfile->current = openfile->edittop;
-       openfile->current_y = 0;
--      leftedge = leftedge_for(openfile->firstcolumn, openfile->edittop);
-+      leftedge = openfile->firstcolumn;
-       target_column = 0;
-     } else
-       get_edge_and_target(&leftedge, &target_column);
-@@ -152,7 +152,7 @@ void do_page_down(void)
-       openfile->current = openfile->edittop;
-       openfile->current_y = 0;
--      leftedge = leftedge_for(openfile->firstcolumn, openfile->edittop);
-+      leftedge = openfile->firstcolumn;
-       target_column = 0;
-     } else
-       get_edge_and_target(&leftedge, &target_column);
--- 
-cgit v1.0-41-gc330
-
index 6a7d5d98bfd89432ac535b931b1f09e79ca0f15d..8f3220a567bcdefd8751dd9c3ea88ceaea6e5e1d 100644 (file)
@@ -1,13 +1,13 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=netwhere
-PKG_VERSION:=0.6
+PKG_VERSION:=0.9
 PKG_RELEASE:=1
 PKG_LICENSE:=MIT
 
 PKG_SOURCE:=netwhere-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://github.com/benhsmith/netwhere/archive/$(PKG_VERSION)/
-PKG_HASH:=0820cf5e59bf6b635c09a6282c664d6966b4d2887736b0f20937c86a8a03f563
+PKG_HASH:=94a672bdcd9d4455b85429dddd81ffc778e0b26fe87af19ad75c27858ec9dbe2
 
 PKG_BUILD_DEPENDS:=boost
 
index e11119dbc6f32217b772ce28a2ca6f3976eadffa..f1350cfb2b11b5a1182c1634f53d383694a52dcf 100644 (file)
@@ -18,7 +18,7 @@ PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
 PKG_SOURCE_URL:=https://github.com/OpenSC/OpenSC/releases/download/$(PKG_VERSION)/
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 
-PKG_BUILD_DEPENDS:=+libpcsclite
+PKG_BUILD_DEPENDS:=pcsc-lite
 PKG_FIXUP:=libtool
 
 PKG_INSTALL:=1
index c0b0c4e7ce4d474aa6f1512b91e7d8786f6b0fb3..9d04894f2fbf7703ff2c0fd8a97b2c7d29fd9feb 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2007-2016 OpenWrt.org
+# Copyright (C) 2007-2017 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=pciutils
-PKG_VERSION:=3.5.2
-PKG_RELEASE:=3
+PKG_VERSION:=3.5.6
+PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=@KERNEL/software/utils/pciutils
-PKG_HASH:=3a99141a9f40528d0a0035665a06dc37ddb1ae341658e51b50a76ecf86235efc
+PKG_HASH:=f346eeb90cce0910c05b877fe49eadc760fa084c0455fd313e39d4b2c2d4bb21
 PKG_MAINTAINER:=Álvaro Fernández Rojas <noltari@gmail.com>
 
 PKG_LICENSE:=GPL-2.0
index c38d1cfc57104351810778f1dafd989bf3bbfac8..0acfb81cb5bb607c22779f128fde921ca6d43667 100644 (file)
@@ -1,6 +1,6 @@
 --- a/lib/configure
 +++ b/lib/configure
-@@ -57,7 +57,7 @@ echo >>$c "#define PCI_OS_`echo $sys | t
+@@ -52,7 +52,7 @@ echo >>$c "#define PCI_OS_`echo $sys | t
  echo >$m 'WITH_LIBS='
  
  echo_n "Looking for access methods..."
index 8df4b8ce7b412a7de8ea473746516a38c199eb82..14f7ded61e3bd9a2217ad9f5b8c738e361b402f0 100644 (file)
@@ -1,6 +1,6 @@
 --- a/lib/configure
 +++ b/lib/configure
-@@ -44,7 +44,7 @@ if [ -z "$HOST" ] ; then
+@@ -39,7 +39,7 @@ if [ -z "$HOST" ] ; then
  fi
  [ -n "$RELEASE" ] && rel="${RELEASE}"
  # CAVEAT: tr on Solaris is a bit weird and the extra [] is otherwise harmless.
index 5db051645a33201e0205aea72695b30e10630a06..c8218f2aa8545f6e1eaba1bba3aae12052403709 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=pcsc-lite
-PKG_VERSION:=1.8.22
+PKG_VERSION:=1.8.23
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
-PKG_SOURCE_URL:=https://alioth.debian.org/frs/download.php/file/4225
-PKG_HASH:=6a358f61ed3b66a7f6e1f4e794a94c7be4c81b7a58ec360c33791e8d7d9bd405
+PKG_SOURCE_URL:=https://alioth.debian.org/frs/download.php/file/4235
+PKG_HASH:=5a27262586eff39cfd5c19aadc8891dd71c0818d3d629539bd631b958be689c9
 PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
 PKG_LICENSE:=BSD-3-Clause
 PKG_LICENSE_FILES:=COPYING
@@ -67,6 +67,7 @@ TARGET_LDFLAGS += -lpthread
 
 CONFIGURE_ARGS += \
        --disable-libudev \
+       --disable-libsystemd \
        --enable-libusb \
        --enable-static \
        --enable-usbdropdir=/usr/lib/pcsc/drivers
index 742ca0e98cf57342e99978e6d2e798e35b67ee15..249d7226d044945f946b037b16ed722c8b47421b 100644 (file)
@@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
 PKG_NAME:=pcsc-tools
 PKG_VERSION=1.5.2
 PKG_RELEASE:=1
-PKG_MAINTAINER:=Daniel Engberg <daniel.engberg.lists@pyret.net>
+PKG_MAINTAINER:=
 PKG_LICENSE:=GPL-2.0
 PKG_LICENSE_FILES:=COPYING
 
index 46fdf0862da4a9bc4524b5bc5d23f8e18986b2a4..f302c2693b181de8769e24ed21166378067ea63b 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=procps-ng
 PKG_VERSION:=3.3.11
-PKG_RELEASE:=3
+PKG_RELEASE:=4
 PKG_LICENSE:=GPL-2.0
 PKG_LICENSE_FILES:=COPYING COPYING.LIB
 
@@ -20,6 +20,8 @@ PKG_SOURCE_VERSION:=8a198e3eafbde0b627e9992b41d26e6762e4f8c7
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
 PKG_MIRROR_HASH:=60da7bd78e834112494e4019998c9de8d61f747eab244ef3c42cadc7fd0958cc
 
+PKG_MAINTAINER:=Gergely Kiss <mail.gery@gmail.com>
+
 PKG_BUILD_PARALLEL:=1
 PKG_INSTALL:=1
 PKG_FIXUP:=autoreconf
@@ -29,17 +31,25 @@ include $(INCLUDE_DIR)/package.mk
 
 CONFIGURE_ARGS += --enable-skill
 
+# most of these have alternatives provided by busybox applets
 PROCPS_APPLETS := \
     free kill pgrep pkill pmap ps pwdx skill slabtop \
     snice tload top uptime vmstat w watch
 
+# procps-ng will be configured with "--bindir=/usr/bin --sbindir=/usr/sbin" and
+# as such executables will be installed there by default, but some of them need
+# to reside in locations such as /bin and /sbin to be in accordance with
+# busybox alternatives which is also other distributions like debian and centos
+# are doing
+PROCPS_APPLETS_DIR_bin:=kill ps watch
+procps-applets-dir=$(if $(findstring $(1),$(PROCPS_APPLETS_DIR_bin)),/bin,/usr/bin)
+
 define Package/procps-ng/Default
   SECTION:=utils
   CATEGORY:=Utilities
   DEPENDS:=+libncurses
   TITLE:=procps-ng utilities
   URL:=https://gitlab.com/procps-ng/procps
-  MAINTAINER:=Gergely Kiss <mail.gery@gmail.com>
 endef
 
 define Build/Prepare
@@ -67,6 +77,7 @@ define GenPlugin
    DEPENDS:=procps-ng
    TITLE:=Applet $(2) from the procps-ng package
    DEFAULT:=y
+   ALTERNATIVES:=200:$(3)/$(2):$(3)/$(1)
  endef
 
  define Package/$(1)/description
@@ -74,7 +85,7 @@ define GenPlugin
  endef
 endef
 
-$(foreach a,$(PROCPS_APPLETS),$(eval $(call GenPlugin,procps-ng-$(a),$(a))))
+$(foreach a,$(PROCPS_APPLETS),$(eval $(call GenPlugin,procps-ng-$(a),$(a),$(call procps-applets-dir,$(a)))))
 
 MAKE_FLAGS += \
        CFLAGS="$(TARGET_CFLAGS)" \
@@ -82,19 +93,18 @@ MAKE_FLAGS += \
        LDFLAGS="$(TARGET_LDFLAGS)" \
 
 define Package/procps-ng/install
-       $(INSTALL_DIR) $(1)/usr/bin
        $(INSTALL_DIR) $(1)/usr/lib
        $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/libprocps.so* $(1)/usr/lib/
 endef
 
 define BuildPlugin
   define Package/$(1)/install
-       $(INSTALL_DIR) $$(1)/usr/bin
-       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/$(2) $$(1)/usr/bin/
+       $(INSTALL_DIR) $$(1)$(3)
+       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/$(2) $$(1)$(3)/$(1)
   endef
 
   $$(eval $$(call BuildPackage,$(1)))
 endef
 
-$(foreach a,$(PROCPS_APPLETS),$(eval $(call BuildPlugin,procps-ng-$(a),$(a))))
+$(foreach a,$(PROCPS_APPLETS),$(eval $(call BuildPlugin,procps-ng-$(a),$(a),$(call procps-applets-dir,$(a)))))
 $(eval $(call BuildPackage,procps-ng))
diff --git a/utils/rtl_433/Makefile b/utils/rtl_433/Makefile
new file mode 100644 (file)
index 0000000..d0eae62
--- /dev/null
@@ -0,0 +1,46 @@
+# 
+# Copyright (C) 2017 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=rtl_433
+PKG_VERSION:=6531ea4
+PKG_RELEASE:=$(PKG_SOURCE_VERSION)
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL:=git://github.com/merbanan/rtl_433.git
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_SOURCE_VERSION:=6531ea48a7933ac8289724672059e54fd8aad8eb
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_MIRROR_HASH:=f96301c8d7e87605b113aad4493f15b63a675fea6f00642b0606de5a3a858746
+
+CMAKE_INSTALL:=1
+
+PKG_LICENSE:=GPLv2
+PKG_LICENSE_FILES:=COPYING
+
+include $(INCLUDE_DIR)/package.mk
+include $(INCLUDE_DIR)/cmake.mk
+
+define Package/rtl_433
+  TITLE:=Realtek RTL2832 based 433.92MHz generic data receiver
+  SECTION:=utils
+  CATEGORY:=Utilities
+  DEPENDS:=+librtlsdr +rtl-sdr +libtool-bin
+  URL:=https://github.com/merbanan/rtl_433
+  MAINTAINER:=Jasper Scholte <NightNL@outlook.com>
+endef
+
+define Package/rtl-sdr/description
+  rtl_433 turns your Realtek RTL2832 based DVB dongle into a 433.92MHz generic data receiver.
+endef
+
+define Package/rtl_433/install
+       $(INSTALL_DIR) $(1)/usr/bin
+       $(CP) $(PKG_INSTALL_DIR)/usr/bin/rtl_433 $(1)/usr/bin
+endef
+
+$(eval $(call BuildPackage,rtl_433))
index e5d6eeeb0e103c2bd2509c624cf7864372d5b74f..352579a45d11e1d0cc47251be56e57ff9ca59118 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2016 OpenWrt.org
+# Copyright (C) 2016, 2018 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,15 +8,15 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=slide-switch
-PKG_VERSION:=0.9.0
+PKG_VERSION:=0.9.1
 PKG_RELEASE:=1
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL:=https://github.com/jefferyto/openwrt-slide-switch.git
-PKG_SOURCE_VERSION:=9171c2ea9cc9cbfb6f27b7bc25a535c8c35ee534
+PKG_SOURCE_VERSION:=d70b5a09f457050e7e3b45fe03787945aa8880a0
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
-PKG_MIRROR_HASH:=9eb2c599b6b8cd8529f7b25455ac2ac3fe97a9ae2e7eec28aea1e971f4d9112b
+PKG_MIRROR_HASH:=78227e0cdc36f105b4fc5657620e41d6bb429eeef76419ce2cd53d2b6700ce31
 
 PKG_BUILD_PARALLEL:=1
 PKG_FIXUP:=autoreconf
index bae2adcd4c2a1abc515ed8fa59e913df640a1b7c..fb5277091b741245923dc9f5b6598dbf07f0783c 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2008-2016 OpenWrt.org
+# Copyright (C) 2008-2017 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=tar
-PKG_VERSION:=1.29
-PKG_RELEASE:=3
+PKG_VERSION:=1.30
+PKG_RELEASE:=1
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=@GNU/$(PKG_NAME)
-PKG_HASH:=236b11190c0a3a6885bdb8d61424f2b36a5872869aa3f7f695dea4b4843ae2f2
+PKG_HASH:=f1bf92dbb1e1ab27911a861ea8dde8208ee774866c46c0bb6ead41f4d1f4d2d3
 PKG_MAINTAINER:=Álvaro Fernández Rojas <noltari@gmail.com>
 
 PKG_LICENSE:=GPL-3.0
diff --git a/utils/tar/patches/001-CVE-2016-6321.patch b/utils/tar/patches/001-CVE-2016-6321.patch
deleted file mode 100644 (file)
index 0783473..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-From 7340f67b9860ea0531c1450e5aa261c50f67165d Mon Sep 17 00:00:00 2001
-From: Paul Eggert <eggert@Penguin.CS.UCLA.EDU>
-Date: Sat, 29 Oct 2016 21:04:40 -0700
-Subject: When extracting, skip ".." members
-
-* src/extract.c (extract_archive): Skip members whose names
-contain "..".
---- a/src/extract.c
-+++ b/src/extract.c
-@@ -1629,12 +1629,20 @@ extract_archive (void)
- {
-   char typeflag;
-   tar_extractor_t fun;
-+  bool skip_dotdot_name;
-   fatal_exit_hook = extract_finish;
-   set_next_block_after (current_header);
-+  skip_dotdot_name = (!absolute_names_option
-+                    && contains_dot_dot (current_stat_info.orig_file_name));
-+  if (skip_dotdot_name)
-+    ERROR ((0, 0, _("%s: Member name contains '..'"),
-+          quotearg_colon (current_stat_info.orig_file_name)));
-+
-   if (!current_stat_info.file_name[0]
-+      || skip_dotdot_name
-       || (interactive_option
-         && !confirm ("extract", current_stat_info.file_name)))
-     {
index 9d67dcd18e799ce9766b225753a0314e2cfb5c40..90d93b48219c044a1a8a1c45813d698e92ba0bac 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2017 Daniel Engberg <daniel.engberg.lists@pyret.net>
+# Copyright (C) 2017-2018 Daniel Engberg <daniel.engberg.lists@pyret.net>
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,15 +8,15 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=tio
-PKG_VERSION:=1.26
+PKG_VERSION:=1.28
 PKG_RELEASE:=1
-PKG_MAINTAINER:=Daniel Engberg <daniel.engberg.lists@pyret.net>
+PKG_MAINTAINER:=
 PKG_LICENSE:=GPL-2.0+
 PKG_LICENSE_FILES:=COPYING
 
 PKG_SOURCE_URL:=https://github.com/$(PKG_NAME)/$(PKG_NAME)/releases/download/v$(PKG_VERSION)/
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
-PKG_HASH:=f9532d519fcc7d19b25fbe9fc1ee857dc10e5862a450b4b3b423f8e8538f2500
+PKG_HASH:=bb5fa22b2ca5c2eeb811f57e1af45ae5a2b852eed1aabbeb3a419cc3b4d4d22a
 
 PKG_FIXUP:=autoreconf
 
index d25c0c2a4d14b38ae54f9f3bcb72474e97164d32..fff7c4a1a1f7edf342f6e3076edf9debf8f2866c 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=watchcat
 PKG_VERSION:=1
-PKG_RELEASE:=6
+PKG_RELEASE:=7
 
 PKG_MAINTAINER:=Roger D <rogerdammit@gmail.com>
 PKG_LICENSE:=GPL-2.0