Merge pull request #1571 from ejurgensen/master
authorSteven Barth <steven@midlink.org>
Mon, 13 Jul 2015 19:41:35 +0000 (21:41 +0200)
committerSteven Barth <steven@midlink.org>
Mon, 13 Jul 2015 19:41:35 +0000 (21:41 +0200)
mxml: update to 2.9

248 files changed:
README.md
admin/monit/Makefile
admin/sudo/Makefile
admin/zabbix/Makefile
admin/zabbix/files/zabbix_agentd.init [changed mode: 0644->0755]
admin/zabbix/patches/010-change-agentd-config.patch
admin/zabbix/patches/015-daemon-foreground.patch [new file with mode: 0644]
devel/diffutils/Makefile
ipv6/aiccu/Makefile
ipv6/aiccu/patches/300-resolver-uclibc.patch
ipv6/aiccu/patches/400-musl-compat.patch
lang/erlang/Makefile
lang/erlang/patches/102-musl_compat.patch [new file with mode: 0644]
lang/micropython-lib/Makefile
lang/micropython/Makefile
lang/perl-cgi/Makefile [new file with mode: 0644]
lang/perl-compress-bzip2/Makefile
lang/perl-dbi/Makefile
lang/perl-device-serialport/Makefile
lang/perl-encode-locale/Makefile [new file with mode: 0644]
lang/perl-file-listing/Makefile [new file with mode: 0644]
lang/perl-html-form/Makefile [new file with mode: 0644]
lang/perl-html-parser/Makefile
lang/perl-html-tagset/Makefile
lang/perl-html-tree/Makefile
lang/perl-http-cookies/Makefile [new file with mode: 0644]
lang/perl-http-daemon/Makefile [new file with mode: 0644]
lang/perl-http-date/Makefile [new file with mode: 0644]
lang/perl-http-message/Makefile [new file with mode: 0644]
lang/perl-http-negotiate/Makefile [new file with mode: 0644]
lang/perl-http-server-simple/Makefile [new file with mode: 0644]
lang/perl-io-html/Makefile [new file with mode: 0644]
lang/perl-lockfile-simple/Makefile
lang/perl-lwp-mediatypes/Makefile [new file with mode: 0644]
lang/perl-net-http/Makefile [new file with mode: 0644]
lang/perl-net-telnet/Makefile
lang/perl-sub-uplevel/Makefile [new file with mode: 0644]
lang/perl-test-harness/Makefile
lang/perl-test-warn/Makefile [new file with mode: 0644]
lang/perl-uri/Makefile
lang/perl-www-curl/Makefile
lang/perl-www-mechanize/Makefile
lang/perl-www-robotrules/Makefile [new file with mode: 0644]
lang/perl-www/Makefile
lang/perl-www/patches/010-lwp-https-call-verify-hostname-when-avail.patch [deleted file]
lang/perl-www/patches/020-lwp-https-verify-hostnames-by-default.patch [deleted file]
lang/python-pyserial/Makefile [new file with mode: 0644]
lang/python/Makefile
lang/python/patches/006-remove-debian-multiarch-support.patch
lang/python3/Makefile
lang/python3/patches/012-disable-wcsftime-detection.patch [new file with mode: 0644]
libs/alsa-lib/patches/005-fix_include_file_redirect_warnings.patch [new file with mode: 0644]
libs/boost/Makefile
libs/c-ares/Makefile
libs/gnutls/Makefile
libs/hiredis/Makefile [new file with mode: 0644]
libs/libevdev/Makefile
libs/libidn/Makefile
libs/libinput/Makefile
libs/libmicrohttpd/Makefile
libs/libmicrohttpd/patches/001-bump-to-r35864.patch [new file with mode: 0644]
libs/libnet-1.2.x/Makefile
libs/libnet-1.2.x/patches/100-musl-compat.patch
libs/libssh2/Makefile
libs/libv4l/patches/030-musl_compatibility.patch
libs/openldap/Makefile
libs/pthsem/Makefile
mail/postfix/Makefile
mail/postfix/patches/500-crosscompile.patch
multimedia/tvheadend/Config.in [new file with mode: 0644]
multimedia/tvheadend/Makefile [new file with mode: 0644]
multimedia/tvheadend/files/tvheadend.config [new file with mode: 0644]
multimedia/tvheadend/files/tvheadend.init [new file with mode: 0644]
net/ctorrent-svn/Makefile
net/ctorrent-svn/patches/400-musl-compat.patch [new file with mode: 0644]
net/davfs2/Makefile
net/davfs2/patches/100-musl-compat.patch [new file with mode: 0644]
net/ddns-scripts/Makefile [changed mode: 0644->0755]
net/ddns-scripts/files/dynamic_dns_functions.sh
net/dnscrypt-proxy/Makefile
net/dnscrypt-proxy/files/dnscrypt-proxy.config
net/dnscrypt-proxy/files/dnscrypt-proxy.init
net/esniper/Makefile [new file with mode: 0644]
net/etherwake/Makefile
net/etherwake/patches/120-musl-compat.patch [new file with mode: 0644]
net/gnunet/Makefile
net/gnunet/files/gnunet.init
net/gnurl/Makefile
net/gnurl/patches/010-backport-gtls-add-support-for-CURLOPT_CAPATH.patch [new file with mode: 0644]
net/haproxy/Makefile
net/haproxy/patches/0001-BUG-MEDIUM-stats-properly-initialize-the-scope-befor.patch [deleted file]
net/haproxy/patches/0002-BUG-MEDIUM-http-don-t-forward-client-shutdown-withou.patch [deleted file]
net/haproxy/patches/0003-BUG-MINOR-check-fix-tcpcheck-error-message.patch [deleted file]
net/haproxy/patches/0004-CLEANUP-checks-fix-double-usage-of-cur-current_step-.patch [deleted file]
net/haproxy/patches/0005-BUG-MEDIUM-checks-do-not-dereference-head-of-a-tcp-c.patch [deleted file]
net/haproxy/patches/0006-CLEANUP-checks-simplify-the-loop-processing-of-tcp-c.patch [deleted file]
net/haproxy/patches/0007-BUG-MAJOR-checks-always-check-for-end-of-list-before.patch [deleted file]
net/haproxy/patches/0008-BUG-MEDIUM-checks-do-not-dereference-a-list-as-a-tcp.patch [deleted file]
net/haproxy/patches/0009-BUG-MEDIUM-peers-apply-a-random-reconnection-timeout.patch [deleted file]
net/haproxy/patches/0010-DOC-Update-doc-about-weight-act-and-bck-fields-in-th.patch [deleted file]
net/haproxy/patches/0011-MINOR-ssl-add-a-destructor-to-free-allocated-SSL-res.patch [deleted file]
net/haproxy/patches/0012-BUG-MEDIUM-ssl-fix-tune.ssl.default-dh-param-value-b.patch [deleted file]
net/haproxy/patches/0013-BUG-MINOR-cfgparse-fix-typo-in-option-httplog-error-.patch [deleted file]
net/haproxy/patches/0014-BUG-MEDIUM-cfgparse-segfault-when-userlist-is-misuse.patch [deleted file]
net/haproxy/patches/0015-MEDIUM-ssl-replace-standards-DH-groups-with-custom-o.patch [deleted file]
net/haproxy/patches/0016-BUG-MINOR-debug-display-null-in-place-of-meth.patch [deleted file]
net/haproxy/patches/0017-CLEANUP-deinit-remove-codes-for-cleaning-p-block_rul.patch [deleted file]
net/haproxy/patches/0018-BUG-MINOR-ssl-fix-smp_fetch_ssl_fc_session_id.patch [deleted file]
net/iodine/Makefile
net/iodine/patches/100-musl-compatibility.patch [new file with mode: 0644]
net/iotivity/Makefile [new file with mode: 0644]
net/iotivity/patches/001-no_unit_test.patch [new file with mode: 0644]
net/iotivity/patches/002-do-not-chck-for-boost.patch [new file with mode: 0644]
net/iotivity/patches/004-use-env.patch [new file with mode: 0644]
net/iotivity/patches/010-libcoap-fix-big-endian-problems.patch [new file with mode: 0644]
net/iotivity/patches/011-cdsk-fix-big-endian-problem.patch [new file with mode: 0644]
net/iotivity/patches/020-Do-not-set-architecture-specific-flags.patch [new file with mode: 0644]
net/iotivity/patches/021-add-some-more-architectures.patch [new file with mode: 0644]
net/iotivity/patches/030-fix-missing-lib.patch [new file with mode: 0644]
net/iotivity/patches/040-fix-things-manager.patch [new file with mode: 0644]
net/iotivity/patches/050-fix-OICMidle.patch [new file with mode: 0644]
net/ipsec-tools/Makefile
net/ipsec-tools/files/functions.sh [new file with mode: 0644]
net/ipsec-tools/files/p1client-down [new file with mode: 0644]
net/ipsec-tools/files/p1client-up [new file with mode: 0644]
net/ipsec-tools/files/racoon [new file with mode: 0644]
net/ipsec-tools/files/racoon.conf [deleted file]
net/ipsec-tools/files/racoon.init
net/ipsec-tools/files/vpnctl [new file with mode: 0644]
net/ipsec-tools/patches/009-musl-compat.patch [new file with mode: 0644]
net/keepalived/Makefile
net/keepalived/patches/100-musl-compat.patch [new file with mode: 0644]
net/knot/Makefile
net/knxd/Makefile
net/knxd/patches/0100-musl-compat [new file with mode: 0644]
net/lighttpd/Makefile
net/linknx/Makefile
net/linknx/patches/010-musl-compat [new file with mode: 0644]
net/linknx/patches/012-fix-linknx.cpp [new file with mode: 0644]
net/luci-app-sqm/Makefile
net/luci-app-sqm/files/sqm-cbi.lua
net/mtr/Makefile
net/mtr/patches/100-disabled-ipv6-fix.patch [new file with mode: 0644]
net/mtr/patches/501-dns.patch [deleted file]
net/mtr/patches/502-fix-res_ninit.patch [deleted file]
net/mwan3-luci/Makefile
net/mwan3-luci/files/etc/hotplug.d/iface/16-mwancustombak
net/mwan3-luci/files/usr/lib/lua/luci/controller/mwan3.lua
net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/interface.lua
net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/interfaceconfig.lua
net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/rule.lua
net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/ruleconfig.lua
net/net-snmp/Makefile
net/net-snmp/patches/900-musl-compat.patch [new file with mode: 0644]
net/netperf/Makefile [new file with mode: 0644]
net/netperf/files/netserver.init [new file with mode: 0644]
net/netperf/patches/001-musl-fix.patch [new file with mode: 0644]
net/ngircd/Makefile [new file with mode: 0644]
net/ngircd/files/ngircd.init [new file with mode: 0644]
net/ntpd/Makefile
net/ntripcaster/Makefile
net/ntripclient/Makefile
net/ntripclient/patches/100-musl-compat.patch [new file with mode: 0644]
net/ntripserver/Makefile
net/ocserv/Makefile
net/ocserv/README
net/ola/Makefile
net/ola/files/olad.init
net/openconnect/Makefile
net/openconnect/files/openconnect.sh
net/shadowsocks-client/patches/100-fortify-source-compat.patch [new file with mode: 0644]
net/shadowsocks-libev/Makefile [new file with mode: 0644]
net/shadowsocks-libev/files/firewall.include [new file with mode: 0644]
net/shadowsocks-libev/files/shadowsocks-libev.config [new file with mode: 0644]
net/shadowsocks-libev/files/shadowsocks-libev.init [new file with mode: 0644]
net/shadowsocks-libev/files/ss-rules [new file with mode: 0644]
net/snort/Makefile
net/snort/patches/100-autoconf-fixes.patch [new file with mode: 0644]
net/sqm-scripts/Makefile
net/sqm-scripts/files/etc/config/sqm
net/sqm-scripts/files/usr/lib/sqm/functions.sh
net/sqm-scripts/files/usr/lib/sqm/simple.qos
net/sqm-scripts/files/usr/lib/sqm/simplest.qos
net/squid/Makefile
net/squid/patches/001-cross_compile.patch
net/sslh/Makefile
net/sslh/patches/002-no_regex_probes.patch [new file with mode: 0644]
net/sstp-client/Makefile
net/sstp-client/patches/100-musl-compat.patch [new file with mode: 0644]
net/strongswan/patches/101-musl-fixes.patch
net/tinc/Makefile
net/tinc/patches/100-musl-compat.patch [deleted file]
net/ulogd/Makefile
net/ulogd/patches/100-musl-compat.patch [new file with mode: 0644]
net/unbound/Makefile
net/usbip/Makefile
net/usbip/patches-2.0/100-musl-compat.patch [new file with mode: 0644]
net/vpnc-scripts/Makefile
net/vpnc-scripts/files/vpnc-script
net/vpnc/Makefile
net/vpnc/files/vpnc.sh
net/vsftpd/Makefile
net/vsftpd/patches/007-CVE-2015-1419.patch [new file with mode: 0644]
net/wifidog/Makefile
net/wifidog/patches/100-musl-compat.patch [new file with mode: 0644]
net/znc/Makefile
net/znc/files/znc.init
sound/mpc/Makefile
sound/mpd/Makefile
sound/mpd/patches/210-support_raw_pcm_streams.patch
sound/mpd/patches/220-handle_slow_server_stream_startup.patch
utils/banhosts/Makefile [new file with mode: 0644]
utils/banhosts/files/updatebanhost [new file with mode: 0644]
utils/bluez/Makefile
utils/gammu/Makefile
utils/hfsprogs/patches/0015-sysctl-only-on-glibc.patch [new file with mode: 0644]
utils/joe/Makefile
utils/joe/files/joerc
utils/joe/patches/001-mathaway.patch [deleted file]
utils/lcd4linux/Config.in [new file with mode: 0644]
utils/lcd4linux/Makefile [new file with mode: 0644]
utils/lcd4linux/files/lcd4linux.init [new file with mode: 0644]
utils/lcd4linux/patches/100-drv_RouterBoard.patch [new file with mode: 0644]
utils/lcd4linux/patches/110-uclibc-logarithm-fix.patch [new file with mode: 0644]
utils/lcd4linux/patches/120-remove-as-needed-linker-option.patch [new file with mode: 0644]
utils/lcd4linux/patches/140-no_repnop_T6963.patch [new file with mode: 0644]
utils/lcd4linux/patches/150-addlibmpdclient.patch [new file with mode: 0644]
utils/lcd4linux/patches/160-uinput_defs.patch [new file with mode: 0644]
utils/lcd4linux/patches/170-add-generic-spidev-driver.patch [new file with mode: 0644]
utils/lcd4linux/patches/171-allow-to-specify-drv_generic_graphic_real_clear.patch [new file with mode: 0644]
utils/lcd4linux/patches/172-add-TEW673GRU-driver.patch [new file with mode: 0644]
utils/lm-sensors/Makefile
utils/lm-sensors/patches/100-musl-compat.patch [new file with mode: 0644]
utils/lvm2/Makefile
utils/lvm2/patches/002-const-stdio.patch
utils/macchanger/Makefile
utils/macchanger/patches/0001-fix-build-with-musl.patch [new file with mode: 0644]
utils/minicom/Makefile
utils/mysql/Makefile
utils/mysql/files/mysqld.init
utils/open-plc-utils/Makefile
utils/open-plc-utils/patches/100-musl-compat.patch [new file with mode: 0644]
utils/screen/Makefile
utils/screen/patches/100-cross_compile_fix.patch
utils/screen/patches/200-musl-compat.patch
utils/shadow/Makefile
utils/shadow/patches/004-fix-su-controoling-term.patch [new file with mode: 0644]
utils/tcsh/Makefile

index 930b6f0dd0e70ff82042b66747e6998b4aeb9780..d908a86abb121e7ad338c357b9f0283a028d48ae 100644 (file)
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
 
 This is the OpenWrt "packages"-feed containing community-maintained build scripts, options and patches for applications, modules and libraries used within OpenWrt.
 
-Installation of pre-built packages is handled directly by the **opkg** utility within your running OpenWrt system or by using the [OpenWrt SDK](http://doc/howto/obtain.firmware.sdk) on a build system.
+Installation of pre-built packages is handled directly by the **opkg** utility within your running OpenWrt system or by using the [OpenWrt SDK](http://wiki.openwrt.org/doc/howto/obtain.firmware.sdk) on a build system.
 
 ## Usage
 
index ba1b64c564e44855944b0c71c8924c5a1178f3eb..b172de4aa78672bc2131a068783c62f89b608f44 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=monit
-PKG_VERSION:=5.13
+PKG_VERSION:=5.14
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://mmonit.com/monit/dist
-PKG_MD5SUM:=7902ff45eaa1303ac25f6366eff251ef
+PKG_MD5SUM:=1b3ae1eb08a0914402a8764e5689c1c5
 
 PKG_LICENSE:=AGPL-3.0
 PKG_LICENSE_FILES:=COPYING
index 69ace6060f200287767875138eca627fb2753daa..282db1a10982de9b285cb3ea40f235a26eb3155b 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=sudo
 PKG_VERSION:=1.8.13
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 PKG_LICENSE:=ISC
 PKG_LICENSE_FILES:=doc/LICENSE
 
@@ -40,6 +40,7 @@ endef
 
 define Package/sudo/conffiles
 /etc/sudoers
+/etc/sudoers.d/
 endef
 
 CONFIGURE_ARGS+= \
index e764b7701addc21fb3fd974a130248e7e6ae427d..02e142164f8d0f32b9a78aad534f6fa6975b7a5c 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=zabbix
 PKG_VERSION:=2.4.5
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=@SF/zabbix
old mode 100644 (file)
new mode 100755 (executable)
index c806a9f..86f1ced
@@ -3,29 +3,19 @@
 
 START=60
 
+USE_PROCD=1
 PROG=/usr/sbin/zabbix_agentd
 CONFIG=/etc/zabbix_agentd.conf
-SERVICE_PID_FILE=/var/run/zabbix_agentd.pid
 
-start() {
+start_service() {
        # Sometimes the agentd config was installed in /etc/zabbix/zabbix_agentd.conf
        [ -f /etc/zabbix/zabbix_agentd.conf ] && mv /etc/zabbix/zabbix_agentd.conf ${CONFIG}
 
        [ -f ${CONFIG} ] || return 1
 
-       grep -q "^PidFile=${SERVICE_PID_FILE}" ${CONFIG} || {
-               logger -s -t ${CONFIG} -p daemon.error "Only \"PidFile=${SERVICE_PID_FILE}\" supported"
-               return 1
-       }
-
-       grep -q "^AllowRoot=1" ${CONFIG} || {
-               touch ${SERVICE_PID_FILE}
-               chown zabbix:zabbix ${SERVICE_PID_FILE}
-       }
-
-       service_start ${PROG} -c ${CONFIG}
+       procd_open_instance
+       procd_set_param command ${PROG} -c ${CONFIG} -f
+       procd_set_param respawn
+       procd_close_instance
 }
 
-stop() {
-       service_stop ${PROG}
-}
index ccc36d1b40cc5ba8583f796e811d7dd575e02919..e4812f6ef97de80bdc6292509f44e5ca3fa28c84 100644 (file)
@@ -10,8 +10,8 @@
 -# Mandatory: no
 -# Default:
 -# PidFile=/tmp/zabbix_agentd.pid
-+# Only /var/run/zabbix_agentd.pid supported
-+PidFile=/var/run/zabbix_agentd.pid
++# We do not need PidFile with procd
++PidFile=/var/run/zabbix_agentd.pid
  
  ### Option: LogFile
  #     Name of log file.
diff --git a/admin/zabbix/patches/015-daemon-foreground.patch b/admin/zabbix/patches/015-daemon-foreground.patch
new file mode 100644 (file)
index 0000000..20e1306
--- /dev/null
@@ -0,0 +1,243 @@
+--- a/include/common.h
++++ b/include/common.h
+@@ -1081,4 +1081,7 @@ int      parse_serveractive_element(char *str
+ #define ZBX_SESSION_ACTIVE    0
+ #define ZBX_SESSION_PASSIVE   1
++#define ZBX_RUN_BACKGROUND      0
++#define ZBX_RUN_FOREGROUND      1
++
+ #endif
+--- a/include/daemon.h
++++ b/include/daemon.h
+@@ -28,7 +28,7 @@ extern char  *CONFIG_PID_FILE;
+ #include "threads.h"
+-int   daemon_start(int allow_root, const char *user);
++int   daemon_start(int allow_root, const char *user, int run_foreground);
+ void  daemon_stop();
+ int   zbx_sigusr_send(int flags);
+@@ -36,6 +36,6 @@ int  zbx_sigusr_send(int flags);
+ #define ZBX_IS_RUNNING()      1
+ #define ZBX_DO_EXIT()
+-#define START_MAIN_ZABBIX_ENTRY(a, u) daemon_start(a, u)
++#define START_MAIN_ZABBIX_ENTRY(a, u, f)      daemon_start(a, u, f)
+ #endif        /* ZABBIX_DAEMON_H */
+--- a/src/libs/zbxnix/daemon.c
++++ b/src/libs/zbxnix/daemon.c
+@@ -272,16 +272,17 @@ static void      set_daemon_signal_handlers()
+  *                                                                            *
+  * Purpose: init process as daemon                                            *
+  *                                                                            *
+- * Parameters: allow_root - allow root permission for application             *
+- *             user       - user on the system to which to drop the           *
+- *                          privileges                                        *
++ * Parameters: allow_root     - allow root permission for application         *
++ *             user           - user on the system to which to drop the       *
++ *                              privileges                                    *
++ *             run_foreground - should it close its controling tty            *
+  *                                                                            *
+  * Author: Alexei Vladishev                                                   *
+  *                                                                            *
+  * Comments: it doesn't allow running under 'root' if allow_root is zero      *
+  *                                                                            *
+  ******************************************************************************/
+-int   daemon_start(int allow_root, const char *user)
++int   daemon_start(int allow_root, const char *user, int run_foreground)
+ {
+       pid_t           pid;
+       struct passwd   *pwd;
+@@ -336,15 +337,22 @@ int      daemon_start(int allow_root, const c
+ #endif
+       }
+-      if (0 != (pid = zbx_fork()))
+-              exit(EXIT_SUCCESS);
++      if ( ZBX_RUN_FOREGROUND != run_foreground)
++              if (0 != (pid = zbx_fork()))
++                      exit(EXIT_SUCCESS);
+       setsid();
+       signal(SIGHUP, SIG_IGN);
+-      if (0 != (pid = zbx_fork()))
+-              exit(EXIT_SUCCESS);
++      if ( ZBX_RUN_FOREGROUND == run_foreground) {
++              zabbix_log(LOG_LEVEL_INFORMATION, "Running in foreground...");
++      } else {
++              if (0 != (pid = zbx_fork()))
++                      exit(EXIT_SUCCESS);
++      }
++
++
+       if (-1 == chdir("/"))   /* this is to eliminate warning: ignoring return value of chdir */
+               assert(0);
+--- a/src/zabbix_agent/zabbix_agentd.c
++++ b/src/zabbix_agent/zabbix_agentd.c
+@@ -62,6 +62,8 @@ const char   *progname = NULL;
+       static char     DEFAULT_CONFIG_FILE[]   = SYSCONFDIR "/zabbix_agentd.conf";
+ #endif
++int CONFIG_FOREGROUND = ZBX_RUN_BACKGROUND;
++
+ /* application TITLE */
+ const char    title_message[] = APPLICATION_NAME
+ #if defined(_WIN64)
+@@ -93,6 +95,7 @@ const char   usage_message[] =
+ const char    *help_message[] = {
+       "Options:",
+       "  -c --config <config-file>       Absolute path to the configuration file",
++      "  -f --foreground                 Run in foreground don't fork",
+       "  -p --print                      Print known items and exit",
+       "  -t --test <item key>            Test specified item and exit",
+       "  -h --help                       Display help information",
+@@ -127,6 +130,7 @@ const char *help_message[] = {
+ /* COMMAND LINE OPTIONS */
+ static struct zbx_option      longopts[] =
+ {
++      {"foreground",          0,      NULL,   'f'},
+       {"config",              1,      NULL,   'c'},
+       {"help",                0,      NULL,   'h'},
+       {"version",             0,      NULL,   'V'},
+@@ -147,7 +151,7 @@ static struct zbx_option   longopts[] =
+ };
+ static char   shortopts[] =
+-      "c:hVpt:"
++      "c:hfVpt:"
+ #ifndef _WINDOWS
+       "R:"
+ #else
+@@ -241,6 +245,9 @@ static void        parse_commandline(int argc,
+       {
+               switch (ch)
+               {
++                      case 'f':
++                              CONFIG_FOREGROUND = ZBX_RUN_FOREGROUND;
++                              break;
+                       case 'c':
+                               CONFIG_FILE = strdup(zbx_optarg);
+                               break;
+@@ -944,7 +951,7 @@ int        main(int argc, char **argv)
+                       break;
+       }
+-      START_MAIN_ZABBIX_ENTRY(CONFIG_ALLOW_ROOT, CONFIG_USER);
++      START_MAIN_ZABBIX_ENTRY(CONFIG_ALLOW_ROOT, CONFIG_USER, CONFIG_FOREGROUND);
+       exit(EXIT_SUCCESS);
+ }
+--- a/src/zabbix_proxy/proxy.c
++++ b/src/zabbix_proxy/proxy.c
+@@ -60,6 +60,7 @@ const char   usage_message[] = "[-hV] [-c
+ const char    *help_message[] = {
+       "Options:",
++      "  -f --foreground                 Run in foreground don't fork",
+       "  -c --config <file>              Absolute path to the configuration file",
+       "  -R --runtime-control <option>   Perform administrative functions",
+       "",
+@@ -84,6 +85,7 @@ const char   *help_message[] = {
+ /* long options */
+ static struct zbx_option      longopts[] =
+ {
++      {"foreground",          0,      NULL,   'f'},
+       {"config",              1,      NULL,   'c'},
+       {"runtime-control",     1,      NULL,   'R'},
+       {"help",                0,      NULL,   'h'},
+@@ -92,7 +94,7 @@ static struct zbx_option     longopts[] =
+ };
+ /* short options */
+-static char   shortopts[] = "c:n:hVR:";
++static char   shortopts[] = "c:n:fhVR:";
+ /* end of COMMAND LINE OPTIONS */
+@@ -202,6 +204,7 @@ char       *CONFIG_LOAD_MODULE_PATH        = NULL;
+ char  **CONFIG_LOAD_MODULE            = NULL;
+ char  *CONFIG_USER                    = NULL;
++int   CONFIG_FOREGROUND               = ZBX_RUN_BACKGROUND;
+ /* web monitoring */
+ #ifdef HAVE_LIBCURL
+@@ -666,6 +669,9 @@ int        main(int argc, char **argv)
+       {
+               switch (ch)
+               {
++                      case 'f':
++                              CONFIG_FOREGROUND = ZBX_RUN_FOREGROUND;
++                              break;
+                       case 'c':
+                               CONFIG_FILE = zbx_strdup(CONFIG_FILE, zbx_optarg);
+                               break;
+@@ -705,7 +711,7 @@ int        main(int argc, char **argv)
+       init_ipmi_handler();
+ #endif
+-      return daemon_start(CONFIG_ALLOW_ROOT, CONFIG_USER);
++      return daemon_start(CONFIG_ALLOW_ROOT, CONFIG_USER, CONFIG_FOREGROUND);
+ }
+ int   MAIN_ZABBIX_ENTRY()
+--- a/src/zabbix_server/server.c
++++ b/src/zabbix_server/server.c
+@@ -64,6 +64,7 @@ const char   usage_message[] = "[-hV] [-c
+ const char    *help_message[] = {
+       "Options:",
++      "  -f --foreground                 Run in foreground don't fork",
+       "  -c --config <file>              Absolute path to the configuration file",
+       "  -R --runtime-control <option>   Perform administrative functions",
+       "",
+@@ -88,6 +89,7 @@ const char   *help_message[] = {
+ /* long options */
+ static struct zbx_option      longopts[] =
+ {
++      {"foreground",          0,      NULL,   'f'},
+       {"config",              1,      NULL,   'c'},
+       {"runtime-control",     1,      NULL,   'R'},
+       {"help",                0,      NULL,   'h'},
+@@ -96,7 +98,7 @@ static struct zbx_option     longopts[] =
+ };
+ /* short options */
+-static char   shortopts[] = "c:n:hVR:";
++static char   shortopts[] = "c:n:fhVR:";
+ /* end of COMMAND LINE OPTIONS */
+@@ -197,6 +199,7 @@ char       *CONFIG_LOAD_MODULE_PATH        = NULL;
+ char  **CONFIG_LOAD_MODULE            = NULL;
+ char  *CONFIG_USER                    = NULL;
++int   CONFIG_FOREGROUND               = ZBX_RUN_BACKGROUND;
+ /* web monitoring */
+ #ifdef HAVE_LIBCURL
+@@ -631,6 +634,9 @@ int        main(int argc, char **argv)
+       {
+               switch (ch)
+               {
++                      case 'f':
++                              CONFIG_FOREGROUND = ZBX_RUN_FOREGROUND;
++                              break;
+                       case 'c':
+                               CONFIG_FILE = zbx_strdup(CONFIG_FILE, zbx_optarg);
+                               break;
+@@ -670,7 +676,7 @@ int        main(int argc, char **argv)
+       init_ipmi_handler();
+ #endif
+-      return daemon_start(CONFIG_ALLOW_ROOT, CONFIG_USER);
++      return daemon_start(CONFIG_ALLOW_ROOT, CONFIG_USER, CONFIG_FOREGROUND);
+ }
+ int   MAIN_ZABBIX_ENTRY()
index b313dafa420e2260c9411a43d47437a3c70e9e22..fb00a42d8df1ed9d659a4e205838643c5fb13c93 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2008-2012 OpenWrt.org
+# Copyright (C) 2008-2015 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:=diffutils
 PKG_VERSION:=3.3
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=@GNU/diffutils
@@ -36,7 +36,7 @@ endef
 
 CONFIGURE_VARS += \
        ac_cv_func_mempcpy=n
-TARGET_CFLAGS += --std=c99
+TARGET_CFLAGS += --std=gnu99
 
 define Package/diffutils/install
        $(INSTALL_DIR) $(1)/usr/bin
index 0034c0b7091eeb1263ac628dee6f78b13a296d73..dae693839d27ac30acb6fae95b366f52e6eb5500 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=aiccu
 PKG_VERSION:=20070115
-PKG_RELEASE:=13
+PKG_RELEASE:=14
 
 PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://www.sixxs.net/archive/sixxs/aiccu/unix
index 1a5f11626e057779aaef6afe115c65b42e721879..b88ef5c1a357f1fa09823e201effb15b125c2da1 100644 (file)
@@ -5,7 +5,7 @@
  int getrrs(const char *label, int rrtype, void gotrec(unsigned int num, int type, const char *record))
  {
 -#ifdef _LINUX
-+#if defined(_LINUX) && defined(__GLIBC__)
++#if defined(_LINUX) && defined(__GLIBC__) && !defined(__UCLIBC__)
        struct __res_state      res;
  #endif
        unsigned char           answer[8192];
@@ -14,7 +14,7 @@
        uint32_t                ttl = 0;
  
 -#ifdef _LINUX
-+#if defined(_LINUX) && defined(__GLIBC__)
++#if defined(_LINUX) && defined(__GLIBC__) && !defined(__UCLIBC__)
        memset(&res, 0, sizeof(res));
        res.options = RES_DEBUG;
        res_ninit(&res);
  
        memset(answer, 0, sizeof(answer));
 -#ifdef _LINUX
-+#if defined(_LINUX) && defined(__GLIBC__)
++#if defined(_LINUX) && defined(__GLIBC__) && !defined(__UCLIBC__)
        ret = res_nquery(&res, label, C_IN, rrtype, answer, sizeof(answer));
  #else
        ret = res_query(label, C_IN, rrtype, answer, sizeof(answer));
---- a/common/dn_skipname.c
-+++ b/common/dn_skipname.c
-@@ -9,7 +9,7 @@
-  * return:
-  *      0 on success, -1 (with errno set) on failure.
-  */
--int ns_name_skip(const u_char **ptrptr, const u_char *eom)
-+static int ns_name_skip(const u_char **ptrptr, const u_char *eom)
- {
-       const u_char *cp;
-       u_int n;
index 2e732d8a2ed8f14bc4a40c94ad69f14e14583e15..b6e0c3236e8442ddfd8b29fa4a25559eaef3de13 100644 (file)
        #include <linux/if_tun.h>
 --- a/common/dn_skipname.c
 +++ b/common/dn_skipname.c
-@@ -1,5 +1,6 @@
+@@ -1,6 +1,8 @@
  #include <errno.h>
  #include <resolv.h>
-+#include <sys/types.h>
  
++#include <sys/types.h>
++
  /* Ripped from glibc 2.4 sources. */
  
+ /*
index 2423f374dd4bc1439c0b0e05e9f630ec5bf5077a..47c8b1198bab75fff74bd791bda7802a9b8c6873 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=erlang
 PKG_VERSION:=17.5
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=otp_src_$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:= http://www.erlang.org/download/ \
@@ -232,6 +232,8 @@ HOST_CONFIGURE_ARGS += \
        --disable-smp-support \
        --without-javac
 
+HOST_CFLAGS += -D_GNU_SOURCE
+
 define Host/Compile
        $(MAKE) -C $(HOST_BUILD_DIR) all
 endef
@@ -257,6 +259,7 @@ CONFIGURE_VARS += \
        erl_xcomp_getaddrinfo=no \
        erl_xcomp_sysroot="$(STAGING_DIR)"
 
+EXTRA_CFLAGS+=-D_GNU_SOURCE
 EXTRA_LDFLAGS+=-lz
 
 define Build/Compile
diff --git a/lang/erlang/patches/102-musl_compat.patch b/lang/erlang/patches/102-musl_compat.patch
new file mode 100644 (file)
index 0000000..d23900e
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/lib/erl_interface/src/connect/ei_resolve.c
++++ b/lib/erl_interface/src/connect/ei_resolve.c
+@@ -642,7 +642,7 @@ struct hostent *ei_gethostbyname_r(const
+ #ifndef HAVE_GETHOSTBYNAME_R
+   return my_gethostbyname_r(name,hostp,buffer,buflen,h_errnop);
+ #else
+-#if (defined(__GLIBC__) || (__FreeBSD_version >= 602000) || defined(__DragonFly__) || defined(__ANDROID__))
++#if (defined(_GNU_SOURCE) || (__FreeBSD_version >= 602000) || defined(__DragonFly__) || defined(__ANDROID__))
+   struct hostent *result;
+   gethostbyname_r(name, hostp, buffer, buflen, &result, h_errnop);
index c8162dc54b9357349e09f9d83e264f5620de6f40..ee190bfec820a5be341a0940ab03c90ce83e12b2 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2008-2010 OpenWrt.org
+# Copyright (C) 2008-2015 OpenWrt.org
 #
 # 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:=micropython-lib
-PKG_VERSION=0.1-20150601-$(PKG_SOURCE_VERSION)
+PKG_VERSION=0.5-20150702-$(PKG_SOURCE_VERSION)
 PKG_RELEASE:=1
 
 PKG_MAINTAINER:=Roger D <rogerdammit@gmail.com>
@@ -17,7 +17,7 @@ PKG_LICENSE_FILES:=LICENSE
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL:=https://github.com/micropython/micropython-lib.git
-PKG_SOURCE_VERSION:=b8092c1838f4942a0fab62c1eb6d08b542cc9e9b
+PKG_SOURCE_VERSION:=863538b44f268ae39aa583f9cd124ed79ad7ba25
 
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION)
 PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
index d5c66ada6ab2c800ab764f2eca6feaa28e0d7612..e5317d160541fce1121cfc71dbbf866478472de2 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2008-2010 OpenWrt.org
+# Copyright (C) 2008-2015 OpenWrt.org
 #
 # 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:=micropython
-PKG_VERSION=1.4.3-20150601-$(PKG_SOURCE_VERSION)
+PKG_VERSION=1.4.4-20150702-$(PKG_SOURCE_VERSION)
 PKG_RELEASE:=1
 
 PKG_MAINTAINER:=Roger D <rogerdammit@gmail.com>
@@ -17,7 +17,7 @@ PKG_LICENSE_FILES:=LICENSE
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL:=https://github.com/micropython/micropython.git
-PKG_SOURCE_VERSION:=3ac2d06bd13f1cedb8242eaacc6c608ac08c3520
+PKG_SOURCE_VERSION:=9220dc466a8d098ed669a33a617edd1118a3e35d
 
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
 PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
diff --git a/lang/perl-cgi/Makefile b/lang/perl-cgi/Makefile
new file mode 100644 (file)
index 0000000..b23c783
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Copyright (C) 2015 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:=perl-cgi
+PKG_VERSION:=4.21
+PKG_RELEASE:=1
+
+PKG_SOURCE_URL:=http://www.cpan.org/authors/id/L/LE/LEEJO
+PKG_SOURCE:=CGI-$(PKG_VERSION).tar.gz
+PKG_MD5SUM:=78b427bfee2dd21b2e612b5bfe5f038c
+
+PKG_LICENSE:=GPL Artistic-2.0
+PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/perl/CGI-$(PKG_VERSION)
+
+include $(INCLUDE_DIR)/package.mk
+include ../perl/perlmod.mk
+
+define Package/perl-cgi
+  SUBMENU:=Perl
+  SECTION:=lang
+  CATEGORY:=Languages
+  TITLE:=Handle Common Gateway Interface requests and responses
+  URL:=http://search.cpan.org/dist/CGI/
+  DEPENDS:=perl +perl-html-parser +perlbase-base +perlbase-config +perlbase-encode +perlbase-essential +perlbase-file +perlbase-if +perlbase-utf8
+endef
+
+define Build/Configure
+        $(call perlmod/Configure,,)
+endef
+
+define Build/Compile
+        $(call perlmod/Compile,,)
+endef
+
+define Package/perl-cgi/install
+        $(call perlmod/Install,$(1),CGI auto/CGI)
+endef
+
+
+$(eval $(call BuildPackage,perl-cgi))
index fbb388f181f9d59576395ad9949f4ed834a0c75f..e6c7c8fd6aef04d30df93c55553e81bec6e37b6d 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=perl-compress-bzip2
 PKG_VERSION:=2.22
-PKG_RELEASE:=3
+PKG_RELEASE:=4
 
 PKG_SOURCE_URL:=http://www.cpan.org/authors/id/R/RU/RURBAN/
 PKG_SOURCE:=Compress-Bzip2-$(PKG_VERSION).tar.gz
@@ -29,7 +29,7 @@ define Package/perl-compress-bzip2
   CATEGORY:=Languages
   TITLE:=Perl interface to bzip2 compression library
   URL:=http://search.cpan.org/dist/Compress-Bzip2/
-  DEPENDS:=perl +libbz2
+  DEPENDS:=perl +libbz2 +perlbase-autoloader +perlbase-config +perlbase-essential +perlbase-fcntl +perlbase-file +perlbase-getopt +perlbase-test +perlbase-xsloader
 endef
 
 define Build/Configure
index c752e96029fa48d33d915251e318a3706a0eb58d..b13c3a673eb6e0818067e9cb5277da1307ac498e 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=perl-dbi
 PKG_VERSION:=1.633
-PKG_RELEASE:=3
+PKG_RELEASE:=4
 
 PKG_SOURCE_URL:=http://www.cpan.org/authors/id/T/TI/TIMB/
 PKG_SOURCE:=DBI-$(PKG_VERSION).tar.gz
@@ -31,7 +31,7 @@ define Package/perl-dbi
   CATEGORY:=Languages
   TITLE:=Database independent interface for Perl
   URL:=http://search.cpan.org/dist/DBI/
-  DEPENDS:=perl +perlbase-essential
+  DEPENDS:=perl +perlbase-base +perlbase-config +perlbase-cwd +perlbase-data +perlbase-dynaloader +perlbase-errno +perlbase-essential +perlbase-fcntl +perlbase-file +perlbase-io +perlbase-ipc +perlbase-scalar +perlbase-storable +perlbase-symbol +perlbase-tie +perlbase-universal +perlbase-utf8
 endef
 
 define Build/Configure
index 22297ae9b578f2b8b5740d7521249794d8e89769..2069bed96f9cda2cc13ce4cc3a07b3efa4c59376 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=perl-device-serialport
 PKG_VERSION:=1.04
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 
 PKG_SOURCE_URL:=http://www.cpan.org/authors/id/C/CO/COOK/
 PKG_SOURCE:=Device-SerialPort-$(PKG_VERSION).tar.gz
@@ -29,7 +29,7 @@ define Package/perl-device-serialport
   CATEGORY:=Languages
   TITLE:=A POSIX-based version of the Win32::SerialPort module
   URL:=http://search.cpan.org/dist/Device-SerialPort/
-  DEPENDS:=perl +perlbase-essential
+  DEPENDS:=perl +perlbase-essential +perlbase-io +perlbase-posix +perlbase-test +perlbase-xsloader
 endef
 
 define Package/perl-device-serialport/description
diff --git a/lang/perl-encode-locale/Makefile b/lang/perl-encode-locale/Makefile
new file mode 100644 (file)
index 0000000..54071dc
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Copyright (C) 2015 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:=perl-encode-locale
+PKG_VERSION:=1.05
+PKG_RELEASE:=1
+
+PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS
+PKG_SOURCE:=Encode-Locale-$(PKG_VERSION).tar.gz
+PKG_MD5SUM:=fcfdb8e4ee34bcf62aed429b4a23db27
+
+PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
+PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/perl/Encode-Locale-$(PKG_VERSION)
+
+include $(INCLUDE_DIR)/package.mk
+include ../perl/perlmod.mk
+
+define Package/perl-encode-locale
+  SUBMENU:=Perl
+  SECTION:=lang
+  CATEGORY:=Languages
+  TITLE:=Determine the locale encoding
+  URL:=http://search.cpan.org/dist/Encode-Locale/
+  DEPENDS:=perl +perlbase-base +perlbase-encode +perlbase-essential
+endef
+
+define Build/Configure
+        $(call perlmod/Configure,,)
+endef
+
+define Build/Compile
+        $(call perlmod/Compile,,)
+endef
+
+define Package/perl-encode-locale/install
+        $(call perlmod/Install,$(1),Encode auto/Encode)
+endef
+
+
+$(eval $(call BuildPackage,perl-encode-locale))
diff --git a/lang/perl-file-listing/Makefile b/lang/perl-file-listing/Makefile
new file mode 100644 (file)
index 0000000..19a6938
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Copyright (C) 2015 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:=perl-file-listing
+PKG_VERSION:=6.04
+PKG_RELEASE:=1
+
+PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS
+PKG_SOURCE:=File-Listing-$(PKG_VERSION).tar.gz
+PKG_MD5SUM:=83f636b477741f3a014585bb9cc079a6
+
+PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
+PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/perl/File-Listing-$(PKG_VERSION)
+
+include $(INCLUDE_DIR)/package.mk
+include ../perl/perlmod.mk
+
+define Package/perl-file-listing
+  SUBMENU:=Perl
+  SECTION:=lang
+  CATEGORY:=Languages
+  TITLE:=Parse directory listing
+  URL:=http://search.cpan.org/dist/File-Listing/
+  DEPENDS:=perl +perl-http-date +perlbase-essential
+endef
+
+define Build/Configure
+        $(call perlmod/Configure,,)
+endef
+
+define Build/Compile
+        $(call perlmod/Compile,,)
+endef
+
+define Package/perl-file-listing/install
+        $(call perlmod/Install,$(1),File auto/File)
+endef
+
+
+$(eval $(call BuildPackage,perl-file-listing))
diff --git a/lang/perl-html-form/Makefile b/lang/perl-html-form/Makefile
new file mode 100644 (file)
index 0000000..d412a1f
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Copyright (C) 2015 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:=perl-html-form
+PKG_VERSION:=6.03
+PKG_RELEASE:=1
+
+PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS
+PKG_SOURCE:=HTML-Form-$(PKG_VERSION).tar.gz
+PKG_MD5SUM:=fa6c2680207ed4fef5ea2ef09c210614
+
+PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
+PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/perl/HTML-Form-$(PKG_VERSION)
+
+include $(INCLUDE_DIR)/package.mk
+include ../perl/perlmod.mk
+
+define Package/perl-html-form
+  SUBMENU:=Perl
+  SECTION:=lang
+  CATEGORY:=Languages
+  TITLE:=Class that represents an HTML form element
+  URL:=http://search.cpan.org/dist/HTML-Form/
+  DEPENDS:=perl +perl-html-parser +perl-http-message +perl-uri +perlbase-encode +perlbase-essential
+endef
+
+define Build/Configure
+        $(call perlmod/Configure,,)
+endef
+
+define Build/Compile
+        $(call perlmod/Compile,,)
+endef
+
+define Package/perl-html-form/install
+        $(call perlmod/Install,$(1),HTML auto/HTML)
+endef
+
+
+$(eval $(call BuildPackage,perl-html-form))
index d1c86af6183da03249bac92885db05d7b44be638..c248a615c1ce23aef50660abb93920710f082a3d 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=perl-html-parser
 PKG_VERSION:=3.71
-PKG_RELEASE:=3
+PKG_RELEASE:=4
 
 PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS/
 PKG_SOURCE:=HTML-Parser-$(PKG_VERSION).tar.gz
@@ -29,7 +29,7 @@ define Package/perl-html-parser
   CATEGORY:=Languages
   TITLE:=A collection of modules that parse HTML text documents
   URL:=http://search.cpan.org/dist/HTML-Parser/
-  DEPENDS:=perl +perl-html-tagset +perl-uri
+  DEPENDS:=perl +perl-html-tagset +perlbase-essential +perlbase-xsloader
 endef
 
 define Build/Configure
index d7b0b0c83b861c304b0b4cb54e6353873d03c63e..4bcd10c714d9ac0c467927bcea4cf3afed4640b5 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=perl-html-tagset
 PKG_VERSION:=3.20
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 
 PKG_SOURCE_URL:=http://www.cpan.org/authors/id/P/PE/PETDANCE/
 PKG_SOURCE:=HTML-Tagset-$(PKG_VERSION).tar.gz
@@ -29,7 +29,7 @@ define Package/perl-html-tagset
   CATEGORY:=Languages
   TITLE:=Data tables pertaining to HTML
   URL:=http://search.cpan.org/dist/HTML-Tagset/
-  DEPENDS:=perl
+  DEPENDS:=perl +perlbase-essential
 endef
 
 define Build/Configure
index 942e3bf224012ace93b3b5a705f0a9eea773b494..d1b4ac9ac4eeab2f07c2395525e5fed36cd3c168 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=perl-html-tree
 PKG_VERSION:=3.23
-PKG_RELEASE:=3
+PKG_RELEASE:=4
 PKG_MD5SUM:=6352f50be402301f79b580dd235d7762
 
 PKG_SOURCE_URL:=http://www.cpan.org/authors/id/P/PE/PETEK/
@@ -28,9 +28,9 @@ define Package/perl-html-tree
   SUBMENU:=Perl
   SECTION:=lang
   CATEGORY:=Languages
-  TITLE:=represent and create HTML syntax trees
+  TITLE:=Represent and create HTML syntax trees
   URL:=http://search.cpan.org/dist/HTML-Tree/
-  DEPENDS:=perl +perl-html-parser +perl-html-tagset
+  DEPENDS:=perl +perl-html-parser +perl-html-tagset +perlbase-essential +perlbase-integer
 endef
 
 define Build/Configure
diff --git a/lang/perl-http-cookies/Makefile b/lang/perl-http-cookies/Makefile
new file mode 100644 (file)
index 0000000..329767a
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Copyright (C) 2015 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:=perl-http-cookies
+PKG_VERSION:=6.01
+PKG_RELEASE:=1
+
+PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS
+PKG_SOURCE:=HTTP-Cookies-$(PKG_VERSION).tar.gz
+PKG_MD5SUM:=ecfd0eeb88512033352c2f13c9580f03
+
+PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
+PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/perl/HTTP-Cookies-$(PKG_VERSION)
+
+include $(INCLUDE_DIR)/package.mk
+include ../perl/perlmod.mk
+
+define Package/perl-http-cookies
+  SUBMENU:=Perl
+  SECTION:=lang
+  CATEGORY:=Languages
+  TITLE:=HTTP cookie jars
+  URL:=http://search.cpan.org/dist/HTTP-Cookies/
+  DEPENDS:=perl +perl-http-date +perl-http-message +perlbase-essential +perlbase-time
+endef
+
+define Build/Configure
+        $(call perlmod/Configure,,)
+endef
+
+define Build/Compile
+        $(call perlmod/Compile,,)
+endef
+
+define Package/perl-http-cookies/install
+        $(call perlmod/Install,$(1),HTTP auto/HTTP)
+endef
+
+
+$(eval $(call BuildPackage,perl-http-cookies))
diff --git a/lang/perl-http-daemon/Makefile b/lang/perl-http-daemon/Makefile
new file mode 100644 (file)
index 0000000..178573d
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Copyright (C) 2015 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:=perl-http-daemon
+PKG_VERSION:=6.01
+PKG_RELEASE:=1
+
+PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS
+PKG_SOURCE:=HTTP-Daemon-$(PKG_VERSION).tar.gz
+PKG_MD5SUM:=ed0ae02d25d7f1e89456d4d69732adc2
+
+PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
+PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/perl/HTTP-Daemon-$(PKG_VERSION)
+
+include $(INCLUDE_DIR)/package.mk
+include ../perl/perlmod.mk
+
+define Package/perl-http-daemon
+  SUBMENU:=Perl
+  SECTION:=lang
+  CATEGORY:=Languages
+  TITLE:=A simple http server class
+  URL:=http://search.cpan.org/dist/HTTP-Daemon/
+  DEPENDS:=perl +perl-http-date +perl-http-message +perl-lwp-mediatypes +perlbase-essential +perlbase-io +perlbase-sys
+endef
+
+define Build/Configure
+        $(call perlmod/Configure,,)
+endef
+
+define Build/Compile
+        $(call perlmod/Compile,,)
+endef
+
+define Package/perl-http-daemon/install
+        $(call perlmod/Install,$(1),HTTP auto/HTTP)
+endef
+
+
+$(eval $(call BuildPackage,perl-http-daemon))
diff --git a/lang/perl-http-date/Makefile b/lang/perl-http-date/Makefile
new file mode 100644 (file)
index 0000000..bf0bd40
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Copyright (C) 2015 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:=perl-http-date
+PKG_VERSION:=6.02
+PKG_RELEASE:=1
+
+PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS
+PKG_SOURCE:=HTTP-Date-$(PKG_VERSION).tar.gz
+PKG_MD5SUM:=52b7a0d5982d61be1edb217751d7daba
+
+PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
+PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/perl/HTTP-Date-$(PKG_VERSION)
+
+include $(INCLUDE_DIR)/package.mk
+include ../perl/perlmod.mk
+
+define Package/perl-http-date
+  SUBMENU:=Perl
+  SECTION:=lang
+  CATEGORY:=Languages
+  TITLE:=Date conversion routines
+  URL:=http://search.cpan.org/dist/HTTP-Date/
+  DEPENDS:=perl +perlbase-essential +perlbase-time
+endef
+
+define Build/Configure
+        $(call perlmod/Configure,,)
+endef
+
+define Build/Compile
+        $(call perlmod/Compile,,)
+endef
+
+define Package/perl-http-date/install
+        $(call perlmod/Install,$(1),HTTP auto/HTTP)
+endef
+
+
+$(eval $(call BuildPackage,perl-http-date))
diff --git a/lang/perl-http-message/Makefile b/lang/perl-http-message/Makefile
new file mode 100644 (file)
index 0000000..ecbb31f
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Copyright (C) 2015 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:=perl-http-message
+PKG_VERSION:=6.06
+PKG_RELEASE:=1
+
+PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS
+PKG_SOURCE:=HTTP-Message-$(PKG_VERSION).tar.gz
+PKG_MD5SUM:=e563ac516e28d33f65bc0f295f625f85
+
+PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
+PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/perl/HTTP-Message-$(PKG_VERSION)
+
+include $(INCLUDE_DIR)/package.mk
+include ../perl/perlmod.mk
+
+define Package/perl-http-message
+  SUBMENU:=Perl
+  SECTION:=lang
+  CATEGORY:=Languages
+  TITLE:=HTTP style messages
+  URL:=http://search.cpan.org/dist/HTTP-Message/
+  DEPENDS:=perl +perl-encode-locale +perl-http-date +perl-io-html +perl-lwp-mediatypes +perl-uri +perlbase-compress +perlbase-encode +perlbase-essential +perlbase-io +perlbase-mime
+endef
+
+define Build/Configure
+        $(call perlmod/Configure,,)
+endef
+
+define Build/Compile
+        $(call perlmod/Compile,,)
+endef
+
+define Package/perl-http-message/install
+        $(call perlmod/Install,$(1),HTTP auto/HTTP)
+endef
+
+
+$(eval $(call BuildPackage,perl-http-message))
diff --git a/lang/perl-http-negotiate/Makefile b/lang/perl-http-negotiate/Makefile
new file mode 100644 (file)
index 0000000..a72893a
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Copyright (C) 2015 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:=perl-http-negotiate
+PKG_VERSION:=6.01
+PKG_RELEASE:=1
+
+PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS
+PKG_SOURCE:=HTTP-Negotiate-$(PKG_VERSION).tar.gz
+PKG_MD5SUM:=1236195250e264d7436e7bb02031671b
+
+PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
+PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/perl/HTTP-Negotiate-$(PKG_VERSION)
+
+include $(INCLUDE_DIR)/package.mk
+include ../perl/perlmod.mk
+
+define Package/perl-http-negotiate
+  SUBMENU:=Perl
+  SECTION:=lang
+  CATEGORY:=Languages
+  TITLE:=Choose a variant to serve
+  URL:=http://search.cpan.org/dist/HTTP-Negotiate/
+  DEPENDS:=perl +perl-http-message +perlbase-essential
+endef
+
+define Build/Configure
+        $(call perlmod/Configure,,)
+endef
+
+define Build/Compile
+        $(call perlmod/Compile,,)
+endef
+
+define Package/perl-http-negotiate/install
+        $(call perlmod/Install,$(1),HTTP auto/HTTP)
+endef
+
+
+$(eval $(call BuildPackage,perl-http-negotiate))
diff --git a/lang/perl-http-server-simple/Makefile b/lang/perl-http-server-simple/Makefile
new file mode 100644 (file)
index 0000000..a967138
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Copyright (C) 2015 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:=perl-http-server-simple
+PKG_VERSION:=0.50
+PKG_RELEASE:=1
+
+PKG_SOURCE_URL:=http://www.cpan.org/authors/id/F/FA/FALCONE
+PKG_SOURCE:=HTTP-Server-Simple-$(PKG_VERSION).tar.gz
+PKG_MD5SUM:=09704b016bc276ca78df6ad4a7d36af6
+
+PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
+PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/perl/HTTP-Server-Simple-$(PKG_VERSION)
+
+include $(INCLUDE_DIR)/package.mk
+include ../perl/perlmod.mk
+
+define Package/perl-http-server-simple
+  SUBMENU:=Perl
+  SECTION:=lang
+  CATEGORY:=Languages
+  TITLE:=Lightweight HTTP server
+  URL:=http://search.cpan.org/dist/HTTP-Server-Simple/
+  DEPENDS:=perl +perl-cgi +perlbase-base +perlbase-essential +perlbase-filehandle +perlbase-socket +perlbase-test
+endef
+
+define Build/Configure
+        $(call perlmod/Configure,,)
+endef
+
+define Build/Compile
+        $(call perlmod/Compile,,)
+endef
+
+define Package/perl-http-server-simple/install
+        $(call perlmod/Install,$(1),HTTP auto/HTTP)
+endef
+
+
+$(eval $(call BuildPackage,perl-http-server-simple))
diff --git a/lang/perl-io-html/Makefile b/lang/perl-io-html/Makefile
new file mode 100644 (file)
index 0000000..9390c36
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Copyright (C) 2015 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:=perl-io-html
+PKG_VERSION:=1.001
+PKG_RELEASE:=1
+
+PKG_SOURCE_URL:=http://www.cpan.org/authors/id/C/CJ/CJM
+PKG_SOURCE:=IO-HTML-$(PKG_VERSION).tar.gz
+PKG_MD5SUM:=3f8958718844dc96b9f6946f21d70d22
+
+PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
+PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/perl/IO-HTML-$(PKG_VERSION)
+
+include $(INCLUDE_DIR)/package.mk
+include ../perl/perlmod.mk
+
+define Package/perl-io-html
+  SUBMENU:=Perl
+  SECTION:=lang
+  CATEGORY:=Languages
+  TITLE:=Open an HTML file with automatic charset detection
+  URL:=http://search.cpan.org/dist/IO-HTML/
+  DEPENDS:=perl +perlbase-encode +perlbase-essential
+endef
+
+define Build/Configure
+        $(call perlmod/Configure,,)
+endef
+
+define Build/Compile
+        $(call perlmod/Compile,,)
+endef
+
+define Package/perl-io-html/install
+        $(call perlmod/Install,$(1),IO auto/IO)
+endef
+
+
+$(eval $(call BuildPackage,perl-io-html))
index 97e3c568ab22e386c1157ec87023f8f664b458d2..b81e678d1dadd272d28315e1f1632a6fe19abc69 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=perl-lockfile-simple
 PKG_VERSION:=0.208
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 
 PKG_SOURCE_URL:=http://www.cpan.org/authors/id/S/SC/SCHWIGON/lockfile-simple/
 PKG_SOURCE:=LockFile-Simple-$(PKG_VERSION).tar.gz
@@ -29,7 +29,7 @@ define Package/perl-lockfile-simple
   CATEGORY:=Languages
   TITLE:=Simple advisory file locking
   URL:=http://search.cpan.org/dist/LockFile-Simple/
-  DEPENDS:=perl
+  DEPENDS:=perl +perlbase-essential +perlbase-sys
 endef
 
 define Build/Configure
diff --git a/lang/perl-lwp-mediatypes/Makefile b/lang/perl-lwp-mediatypes/Makefile
new file mode 100644 (file)
index 0000000..6985431
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Copyright (C) 2015 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:=perl-lwp-mediatypes
+PKG_VERSION:=6.02
+PKG_RELEASE:=1
+
+PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS
+PKG_SOURCE:=LWP-MediaTypes-$(PKG_VERSION).tar.gz
+PKG_MD5SUM:=8c5f25fb64b974d22aff424476ba13c9
+
+PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
+PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/perl/LWP-MediaTypes-$(PKG_VERSION)
+
+include $(INCLUDE_DIR)/package.mk
+include ../perl/perlmod.mk
+
+define Package/perl-lwp-mediatypes
+  SUBMENU:=Perl
+  SECTION:=lang
+  CATEGORY:=Languages
+  TITLE:=Guess media type for a file or a URL
+  URL:=http://search.cpan.org/dist/LWP-MediaTypes/
+  DEPENDS:=perl +perlbase-essential
+endef
+
+define Build/Configure
+        $(call perlmod/Configure,,)
+endef
+
+define Build/Compile
+        $(call perlmod/Compile,,)
+endef
+
+define Package/perl-lwp-mediatypes/install
+        $(call perlmod/Install,$(1),LWP auto/LWP)
+endef
+
+
+$(eval $(call BuildPackage,perl-lwp-mediatypes))
diff --git a/lang/perl-net-http/Makefile b/lang/perl-net-http/Makefile
new file mode 100644 (file)
index 0000000..058ac16
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Copyright (C) 2015 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:=perl-net-http
+PKG_VERSION:=6.09
+PKG_RELEASE:=1
+
+PKG_SOURCE_URL:=http://www.cpan.org/authors/id/E/ET/ETHER
+PKG_SOURCE:=Net-HTTP-$(PKG_VERSION).tar.gz
+PKG_MD5SUM:=3d84d17f64c7316d69e7eb7b4e292b9a
+
+PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
+PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/perl/Net-HTTP-$(PKG_VERSION)
+
+include $(INCLUDE_DIR)/package.mk
+include ../perl/perlmod.mk
+
+define Package/perl-net-http
+  SUBMENU:=Perl
+  SECTION:=lang
+  CATEGORY:=Languages
+  TITLE:=Low-level HTTP connection (client)
+  URL:=http://search.cpan.org/dist/Net-HTTP/
+  DEPENDS:=perl +perl-uri +perlbase-compress +perlbase-essential +perlbase-io
+endef
+
+define Build/Configure
+        $(call perlmod/Configure,,)
+endef
+
+define Build/Compile
+        $(call perlmod/Compile,,)
+endef
+
+define Package/perl-net-http/install
+        $(call perlmod/Install,$(1),Net auto/Net)
+endef
+
+
+$(eval $(call BuildPackage,perl-net-http))
index f1823fc92165f566c9596416dfa05e6d26dd125b..c915064997790befba05c8197908a5325d79c418 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=perl-net-telnet
 PKG_VERSION:=3.04
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 
 PKG_SOURCE_URL:=http://www.cpan.org/authors/id/J/JR/JROGERS/
 PKG_SOURCE:=Net-Telnet-$(PKG_VERSION).tar.gz
@@ -29,7 +29,7 @@ define Package/perl-net-telnet
   CATEGORY:=Languages
   TITLE:=Telnet client
   URL:=http://search.cpan.org/dist/Net-Telnet/
-  DEPENDS:=perl
+  DEPENDS:=perl +perlbase-essential +perlbase-socket +perlbase-symbol
 endef
 
 define Build/Configure
diff --git a/lang/perl-sub-uplevel/Makefile b/lang/perl-sub-uplevel/Makefile
new file mode 100644 (file)
index 0000000..266bce4
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Copyright (C) 2015 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:=perl-sub-uplevel
+PKG_VERSION:=0.25
+PKG_RELEASE:=1
+
+PKG_SOURCE_URL:=http://www.cpan.org/authors/id/D/DA/DAGOLDEN
+PKG_SOURCE:=Sub-Uplevel-$(PKG_VERSION).tar.gz
+PKG_MD5SUM:=5d0752dbfa94d0c91b25a264f47f5675
+
+PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
+PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/perl/Sub-Uplevel-$(PKG_VERSION)
+
+include $(INCLUDE_DIR)/package.mk
+include ../perl/perlmod.mk
+
+define Package/perl-sub-uplevel
+  SUBMENU:=Perl
+  SECTION:=lang
+  CATEGORY:=Languages
+  TITLE:=Apparently run a function in a higher stack frame
+  URL:=http://search.cpan.org/dist/Sub-Uplevel/
+  DEPENDS:=perl +perlbase-essential
+endef
+
+define Build/Configure
+        $(call perlmod/Configure,,)
+endef
+
+define Build/Compile
+        $(call perlmod/Compile,,)
+endef
+
+define Package/perl-sub-uplevel/install
+        $(call perlmod/Install,$(1),Sub auto/Sub)
+endef
+
+
+$(eval $(call BuildPackage,perl-sub-uplevel))
index aa08dec9465a51f22536df8df3e1050e4d7e98c4..fd2b4f63482d94480669db2067bc97212581a0ce 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=perl-test-harness
 PKG_VERSION:=3.35
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 
 PKG_SOURCE_URL:=http://www.cpan.org/authors/id/L/LE/LEONT/
 PKG_SOURCE:=Test-Harness-$(PKG_VERSION).tar.gz
@@ -29,7 +29,7 @@ define Package/perl-test-harness
   CATEGORY:=Languages
   TITLE:=Perl Test Harness
   URL:=http://search.cpan.org/dist/Test-Harness/
-  DEPENDS:=perl
+  DEPENDS:=perl +perlbase-base +perlbase-benchmark +perlbase-config +perlbase-essential +perlbase-file +perlbase-getopt +perlbase-io +perlbase-posix +perlbase-text
 endef
 
 define Build/Configure
diff --git a/lang/perl-test-warn/Makefile b/lang/perl-test-warn/Makefile
new file mode 100644 (file)
index 0000000..995e1ba
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Copyright (C) 2015 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:=perl-test-warn
+PKG_VERSION:=0.30
+PKG_RELEASE:=1
+
+PKG_SOURCE_URL:=http://www.cpan.org/authors/id/C/CH/CHORNY
+PKG_SOURCE:=Test-Warn-$(PKG_VERSION).tar.gz
+PKG_MD5SUM:=8306b998a96d2cc69266b5248d550472
+
+PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
+PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/perl/Test-Warn-$(PKG_VERSION)
+
+include $(INCLUDE_DIR)/package.mk
+include ../perl/perlmod.mk
+
+define Package/perl-test-warn
+  SUBMENU:=Perl
+  SECTION:=lang
+  CATEGORY:=Languages
+  TITLE:=Perl extension to test methods for warnings
+  URL:=http://search.cpan.org/dist/Test-Warn/
+  DEPENDS:=perl +perl-sub-uplevel +perlbase-essential +perlbase-test
+endef
+
+define Build/Configure
+        $(call perlmod/Configure,,)
+endef
+
+define Build/Compile
+        $(call perlmod/Compile,,)
+endef
+
+define Package/perl-test-warn/install
+        $(call perlmod/Install,$(1),Test auto/Test)
+endef
+
+
+$(eval $(call BuildPackage,perl-test-warn))
index df46d5292a7fa63781faa25b7f22236e75eb2604..3508d903c0b93c5c11d7ebc7d6ca10049645c5fd 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=perl-uri
-PKG_VERSION:=1.67
-PKG_RELEASE:=2
+PKG_VERSION:=1.68
+PKG_RELEASE:=1
 
 PKG_SOURCE_URL:=http://www.cpan.org/authors/id/E/ET/ETHER/
 PKG_SOURCE:=URI-$(PKG_VERSION).tar.gz
-PKG_MD5SUM:=d0ef53b6c63bcc02ba55f405c30741e3
+PKG_MD5SUM:=4a954ab8d79f831616ca817ba4b26cb9
 
 PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
 PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
@@ -29,7 +29,7 @@ define Package/perl-uri
   CATEGORY:=Languages
   TITLE:=Manipulates and accesses URI strings
   URL:=http://search.cpan.org/dist/URI/
-  DEPENDS:=perl
+  DEPENDS:=perl +perlbase-essential +perlbase-integer +perlbase-mime +perlbase-scalar +perlbase-utf8
 endef
 
 define Build/Configure
index 3eaa3d01ccd699858d438382f74bd268dfb674f5..1e424cbb07b05d11fec589eb39f7c3c7a3bc047d 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=perl-www-curl
 PKG_VERSION:=4.17
-PKG_RELEASE:=3
+PKG_RELEASE:=4
 
 PKG_SOURCE_URL:=http://www.cpan.org/authors/id/S/SZ/SZBALINT/
 PKG_SOURCE:=WWW-Curl-$(PKG_VERSION).tar.gz
@@ -30,7 +30,7 @@ define Package/perl-www-curl
   CATEGORY:=Languages
   TITLE:=Perl bindings to libcurl
   URL:=http://search.cpan.org/dist/WWW-Curl/
-  DEPENDS:=perl +libcurl
+  DEPENDS:=perl +libcurl +perlbase-essential +perlbase-xsloader
 endef
 
 define Build/Configure
index 9fb1fcb22f52792351577d4a68796ac3aee5af75..93d6be21b5bcd3388efa28b2a13082f43b429fbd 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=perl-www-mechanize
-PKG_VERSION:=1.74
-PKG_RELEASE:=2
+PKG_VERSION:=1.75
+PKG_RELEASE:=1
 
 PKG_SOURCE:=WWW-Mechanize-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://www.cpan.org/authors/id/E/ET/ETHER/
-PKG_MD5SUM:=8ec615225037ac66a2d37f4e9693ef86
+PKG_MD5SUM:=9a4b9c8827f519908ef0a0d2b8ae96fa
 
 PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
 PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
@@ -29,7 +29,7 @@ define Package/perl-www-mechanize
   CATEGORY:=Languages
   TITLE:=Perl WWW Mechanize
   URL:=http://search.cpan.org/dist/WWW-Mechanize/
-  DEPENDS:=perl +perl-www
+  DEPENDS:=perl +perl-cgi +perl-html-form +perl-html-parser +perl-html-tree +perl-http-daemon +perl-http-message +perl-http-server-simple +perl-test-warn +perl-uri +perl-www +perlbase-base +perlbase-essential +perlbase-file +perlbase-findbin +perlbase-getopt +perlbase-pod +perlbase-test
 endef
 
 define Build/Configure
diff --git a/lang/perl-www-robotrules/Makefile b/lang/perl-www-robotrules/Makefile
new file mode 100644 (file)
index 0000000..c28b8c2
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Copyright (C) 2015 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:=perl-www-robotrules
+PKG_VERSION:=6.02
+PKG_RELEASE:=1
+
+PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS
+PKG_SOURCE:=WWW-RobotRules-$(PKG_VERSION).tar.gz
+PKG_MD5SUM:=b7186e8b8b3701e70c22abf430742403
+
+PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
+PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/perl/WWW-RobotRules-$(PKG_VERSION)
+
+include $(INCLUDE_DIR)/package.mk
+include ../perl/perlmod.mk
+
+define Package/perl-www-robotrules
+  SUBMENU:=Perl
+  SECTION:=lang
+  CATEGORY:=Languages
+  TITLE:=database of robots.txt-derived permissions
+  URL:=http://search.cpan.org/dist/WWW-RobotRules/
+  DEPENDS:=perl +perl-uri +perlbase-anydbm-file +perlbase-essential +perlbase-fcntl
+endef
+
+define Build/Configure
+        $(call perlmod/Configure,,)
+endef
+
+define Build/Compile
+        $(call perlmod/Compile,,)
+endef
+
+define Package/perl-www-robotrules/install
+        $(call perlmod/Install,$(1),WWW auto/WWW)
+endef
+
+
+$(eval $(call BuildPackage,perl-www-robotrules))
index acd9e9b9fdf7ea9928707691b7a1c583944de49f..6bb7c653934abcff231f8e33a28eb561e12693a9 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2013-2014 OpenWrt.org
+# Copyright (C) 2013-2015 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:=perl-www
-PKG_VERSION:=5.837
-PKG_RELEASE:=3
+PKG_VERSION:=6.13
+PKG_RELEASE:=1
 
-PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS/
+PKG_SOURCE_URL:=http://www.cpan.org/authors/id/E/ET/ETHER/
 PKG_SOURCE:=libwww-perl-$(PKG_VERSION).tar.gz
-PKG_MD5SUM:=9bbf1bce482b0bac98bb4f04253c03d0
+PKG_MD5SUM:=85b36bcd2fd2450718ee14f894f0d3d1
 
 PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
 PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
@@ -29,7 +29,7 @@ define Package/perl-www
   CATEGORY:=Languages
   TITLE:=WWW client/server library for Perl (aka LWP)
   URL:=http://search.cpan.org/dist/libwww-perl/
-  DEPENDS:=perl +perl-html-parser +perl-html-tagset +perl-uri
+  DEPENDS:=perl +perl-encode-locale +perl-file-listing +perl-html-parser +perl-http-cookies +perl-http-daemon +perl-http-date +perl-http-message +perl-http-negotiate +perl-lwp-mediatypes +perl-net-http +perl-uri +perl-www-robotrules +perlbase-base +perlbase-digest +perlbase-encode +perlbase-essential +perlbase-io +perlbase-mime +perlbase-net
 endef
 
 define Build/Configure
@@ -41,7 +41,7 @@ define Build/Compile
 endef
 
 define Package/perl-www/install
-       $(call perlmod/Install,$(1),File HTML HTTP LWP LWP.pm Net WWW)
+       $(call perlmod/Install,$(1),LWP.pm auto/LWP LWP)
 endef
 
 
diff --git a/lang/perl-www/patches/010-lwp-https-call-verify-hostname-when-avail.patch b/lang/perl-www/patches/010-lwp-https-call-verify-hostname-when-avail.patch
deleted file mode 100644 (file)
index 9166e89..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-commit 3b266f17ccd5613a9c42d1e04118e94ca6467489
-Author: Gisle Aas <gisle@aas.no>
-Date:   Sun Jan 16 12:56:30 2011 +0100
-
-    Call IO::Socket::SSL's verify_hostname when available
-
---- a/lib/LWP/Protocol/https.pm
-+++ b/lib/LWP/Protocol/https.pm
-@@ -14,6 +14,15 @@ sub socket_type
- sub _check_sock
- {
-     my($self, $req, $sock) = @_;
-+    if ($sock->can("verify_hostname")) {
-+      if (!$sock->verify_hostname($req->uri->host, "www")) {
-+          my $subject = $sock->peer_certificate("subject");
-+          die "SSL-peer fails verification [subject=$subject]\n";
-+      }
-+      else {
-+          $req->{ssl_sock_verified}++;
-+      }
-+    }
-     my $check = $req->header("If-SSL-Cert-Subject");
-     if (defined $check) {
-       my $cert = $sock->get_peer_certificate ||
-@@ -36,9 +45,14 @@ sub _get_sock_info
-       $res->header("Client-SSL-Cert-Subject" => $cert->subject_name);
-       $res->header("Client-SSL-Cert-Issuer" => $cert->issuer_name);
-     }
--    if(! eval { $sock->get_peer_verify }) {
--       $res->header("Client-SSL-Warning" => "Peer certificate not verified");
-+    if (!$res->request->{ssl_sock_verified}) {
-+      if(! eval { $sock->get_peer_verify }) {
-+          my $msg = "Peer certificate not verified";
-+          $msg .= " [$@]" if $@;
-+          $res->header("Client-SSL-Warning" => $msg);
-+      }
-     }
-+    $res->header("Client-SSL-Socket-Class" => $Net::HTTPS::SSL_SOCKET_CLASS);
- }
- #-----------------------------------------------------------
diff --git a/lang/perl-www/patches/020-lwp-https-verify-hostnames-by-default.patch b/lang/perl-www/patches/020-lwp-https-verify-hostnames-by-default.patch
deleted file mode 100644 (file)
index 465010e..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-commit 62dd58188d8f8987d24bd84951813a54a8bf5987
-Author: Gisle Aas <gisle@aas.no>
-Date:   Mon Jan 24 23:19:59 2011 +0100
-
-    Default to verifying hostnames when using SSL
-
---- a/lib/LWP/Protocol/https.pm
-+++ b/lib/LWP/Protocol/https.pm
-@@ -11,18 +11,30 @@ sub socket_type
-     return "https";
- }
--sub _check_sock
-+sub _extra_sock_opts
- {
--    my($self, $req, $sock) = @_;
--    if ($sock->can("verify_hostname")) {
--      if (!$sock->verify_hostname($req->uri->host, "www")) {
--          my $subject = $sock->peer_certificate("subject");
--          die "SSL-peer fails verification [subject=$subject]\n";
--      }
--      else {
--          $req->{ssl_sock_verified}++;
-+    my $self = shift;
-+    my %ssl_opts = %{$self->{ua}{ssl_opts} || {}};
-+    unless (exists $ssl_opts{SSL_verify_mode}) {
-+      $ssl_opts{SSL_verify_mode} = 1;
-+    }
-+    if (delete $ssl_opts{verify_hostname}) {
-+      $ssl_opts{SSL_verify_mode} ||= 1;
-+      $ssl_opts{SSL_verifycn_scheme} = 'www';
-+    }
-+    if ($ssl_opts{SSL_verify_mode}) {
-+      unless (exists $ssl_opts{SSL_ca_file} || exists $ssl_opts{SSL_ca_path}) {
-+          require Mozilla::CA;
-+          $ssl_opts{SSL_ca_file} = Mozilla::CA::SSL_ca_file();
-       }
-     }
-+    $self->{ssl_opts} = \%ssl_opts;
-+    return (%ssl_opts, $self->SUPER::_extra_sock_opts);
-+}
-+
-+sub _check_sock
-+{
-+    my($self, $req, $sock) = @_;
-     my $check = $req->header("If-SSL-Cert-Subject");
-     if (defined $check) {
-       my $cert = $sock->get_peer_certificate ||
-@@ -45,12 +57,11 @@ sub _get_sock_info
-       $res->header("Client-SSL-Cert-Subject" => $cert->subject_name);
-       $res->header("Client-SSL-Cert-Issuer" => $cert->issuer_name);
-     }
--    if (!$res->request->{ssl_sock_verified}) {
--      if(! eval { $sock->get_peer_verify }) {
--          my $msg = "Peer certificate not verified";
--          $msg .= " [$@]" if $@;
--          $res->header("Client-SSL-Warning" => $msg);
--      }
-+    if (!$self->{ssl_opts}{SSL_verify_mode}) {
-+      $res->push_header("Client-SSL-Warning" => "Peer certificate not verified");
-+    }
-+    elsif (!$self->{ssl_opts}{SSL_verifycn_scheme}) {
-+      $res->push_header("Client-SSL-Warning" => "Peer hostname match with certificate not verified");
-     }
-     $res->header("Client-SSL-Socket-Class" => $Net::HTTPS::SSL_SOCKET_CLASS);
- }
---- a/lib/LWP/UserAgent.pm
-+++ b/lib/LWP/UserAgent.pm
-@@ -41,6 +41,7 @@ sub new
-     my $timeout = delete $cnf{timeout};
-     $timeout = 3*60 unless defined $timeout;
-     my $local_address = delete $cnf{local_address};
-+    my $ssl_opts = delete $cnf{ssl_opts};
-     my $use_eval = delete $cnf{use_eval};
-     $use_eval = 1 unless defined $use_eval;
-     my $parse_head = delete $cnf{parse_head};
-@@ -83,6 +84,7 @@ sub new
-                     def_headers  => $def_headers,
-                     timeout      => $timeout,
-                     local_address => $local_address,
-+                    ssl_opts     => { $ssl_opts ? %$ssl_opts  : (verify_hostname => 1) },
-                     use_eval     => $use_eval,
-                       show_progress=> $show_progress,
-                     max_size     => $max_size,
-@@ -582,6 +584,20 @@ sub max_size     { shift->_elem('max_siz
- sub max_redirect { shift->_elem('max_redirect', @_); }
- sub show_progress{ shift->_elem('show_progress', @_); }
-+sub ssl_opts {
-+    my $self = shift;
-+    if (@_ == 1) {
-+      my $k = shift;
-+      return $self->{ssl_opts}{$k};
-+    }
-+    if (@_) {
-+      %{$self->{ssl_opts}} = (%{$self->{ssl_opts}}, @_);
-+    }
-+    else {
-+      return keys %{$self->{ssl_opts}};
-+    }
-+}
-+
- sub parse_head {
-     my $self = shift;
-     if (@_) {
-@@ -1040,6 +1056,7 @@ The following options correspond to attr
-    cookie_jar              undef
-    default_headers         HTTP::Headers->new
-    local_address           undef
-+   ssl_opts              { verify_hostname => 1 }
-    max_size                undef
-    max_redirect            7
-    parse_head              1
diff --git a/lang/python-pyserial/Makefile b/lang/python-pyserial/Makefile
new file mode 100644 (file)
index 0000000..ba28e10
--- /dev/null
@@ -0,0 +1,50 @@
+#
+# Copyright (C) 2015 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-pyserial
+PKG_VERSION:=2.7
+PKG_RELEASE:=1
+PKG_MAINTAINER:=Micke Prag <micke.prag@telldus.se>
+PKG_LICENSE:=Python-2.0
+
+PKG_SOURCE:=pyserial-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=http://pypi.python.org/packages/source/p/pyserial/
+PKG_MD5SUM:=794506184df83ef2290de0d18803dd11
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/pyserial-$(PKG_VERSION)
+PKG_BUILD_DEPENDS:=python
+
+include $(INCLUDE_DIR)/package.mk
+$(call include_mk, python-package.mk)
+
+define Package/python-pyserial
+  SUBMENU:=Python
+  SECTION:=lang
+  CATEGORY:=Languages
+  TITLE:=python-pyserial
+  URL:=http://pyserial.sourceforge.net
+  DEPENDS:=+python-light
+endef
+
+define Package/python-pyserial/description
+       serial port python bindings
+endef
+
+define Build/Compile
+       $(call Build/Compile/PyMod,,install --prefix="$(PKG_INSTALL_DIR)/usr")
+endef
+
+define Package/python-pyserial/install
+       $(INSTALL_DIR) $(1)$(PYTHON_PKG_DIR)
+       $(CP) \
+           $(PKG_INSTALL_DIR)$(PYTHON_PKG_DIR)/* \
+           $(1)$(PYTHON_PKG_DIR)
+endef
+
+$(eval $(call BuildPackage,python-pyserial))
index 133bab0d9e5311c9a116a84c5f018d132103e5a7..0caa92ba255864d7ebe9c52b91dab71bde7e16dc 100644 (file)
@@ -12,7 +12,7 @@ include ./files/python-package.mk
 
 PKG_NAME:=python
 PKG_VERSION:=$(PYTHON_VERSION).$(PYTHON_VERSION_MICRO)
-PKG_RELEASE:=5
+PKG_RELEASE:=6
 
 PKG_SOURCE:=Python-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=http://www.python.org/ftp/python/$(PKG_VERSION)
index 52d52b94e88b1175d40f30211c1244d7ec4e70d7..01aa924ab76f3c0e451e27b4f91b0d4e86ae4421 100644 (file)
@@ -1,12 +1,14 @@
 diff --git a/setup.py b/setup.py
-index 7868b7b..9ae0ef2 100644
+index 1d1ae72..511aed5 100644
 --- a/setup.py
 +++ b/setup.py
-@@ -444,7 +444,6 @@ class PyBuildExt(build_ext):
+@@ -444,7 +444,8 @@ class PyBuildExt(build_ext):
              add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
          if cross_compiling:
              self.add_gcc_paths()
 -        self.add_multiarch_paths()
++        else:
++            self.add_multiarch_paths()
  
          # Add paths specified in the environment variables LDFLAGS and
          # CPPFLAGS for header and library files.
index b9d29aab229be70cd87345139268abc57f878533..e68f415fbf1480c1c932caf843af7753a28ddbcb 100644 (file)
@@ -14,7 +14,7 @@ PYTHON_VERSION:=$(PYTHON3_VERSION)
 PYTHON_VERSION_MICRO:=$(PYTHON3_VERSION_MICRO)
 
 PKG_NAME:=python3
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 PKG_VERSION:=$(PYTHON_VERSION).$(PYTHON_VERSION_MICRO)
 
 PKG_SOURCE:=Python-$(PKG_VERSION).tar.xz
diff --git a/lang/python3/patches/012-disable-wcsftime-detection.patch b/lang/python3/patches/012-disable-wcsftime-detection.patch
new file mode 100644 (file)
index 0000000..55a383c
--- /dev/null
@@ -0,0 +1,13 @@
+diff --git a/configure b/configure
+index 274af7e..85bbf0e 100755
+--- a/configure
++++ b/configure
+@@ -10555,7 +10555,7 @@ for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \
+  sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy symlinkat sync \
+  sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \
+  truncate uname unlinkat unsetenv utimensat utimes waitid waitpid wait3 wait4 \
+- wcscoll wcsftime wcsxfrm wmemcmp writev _getpty
++ wcscoll wcsxfrm wmemcmp writev _getpty
+ do :
+   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
diff --git a/libs/alsa-lib/patches/005-fix_include_file_redirect_warnings.patch b/libs/alsa-lib/patches/005-fix_include_file_redirect_warnings.patch
new file mode 100644 (file)
index 0000000..8230c02
--- /dev/null
@@ -0,0 +1,142 @@
+--- a/src/seq/seq.c
++++ b/src/seq/seq.c
+@@ -777,7 +777,7 @@ void event_filter(snd_seq_t *seq, snd_se
+ */
+-#include <sys/poll.h>
++#include <poll.h>
+ #include "seq_local.h"
+ /****************************************************************************
+--- a/aserver/aserver.c
++++ b/aserver/aserver.c
+@@ -20,7 +20,7 @@
+ #include <sys/shm.h>
+ #include <sys/socket.h>
+-#include <sys/poll.h>
++#include <poll.h>
+ #include <sys/un.h>
+ #include <sys/uio.h>
+ #include <stdio.h>
+--- a/include/asoundlib-head.h
++++ b/include/asoundlib-head.h
+@@ -35,6 +35,6 @@
+ #include <string.h>
+ #include <fcntl.h>
+ #include <assert.h>
+-#include <sys/poll.h>
++#include <poll.h>
+ #include <errno.h>
+ #include <stdarg.h>
+--- a/include/asoundlib.h
++++ b/include/asoundlib.h
+@@ -35,7 +35,7 @@
+ #include <string.h>
+ #include <fcntl.h>
+ #include <assert.h>
+-#include <sys/poll.h>
++#include <poll.h>
+ #include <errno.h>
+ #include <stdarg.h>
+ #include <endian.h>
+--- a/include/local.h
++++ b/include/local.h
+@@ -47,7 +47,7 @@
+ #error Header defining endianness not defined
+ #endif
+ #include <stdarg.h>
+-#include <sys/poll.h>
++#include <poll.h>
+ #include <sys/types.h>
+ #include <errno.h>
+ #include <linux/types.h>
+--- a/src/control/control.c
++++ b/src/control/control.c
+@@ -48,7 +48,7 @@ and IEC958 structure.
+ #include <string.h>
+ #include <fcntl.h>
+ #include <signal.h>
+-#include <sys/poll.h>
++#include <poll.h>
+ #include "control_local.h"
+ /**
+--- a/src/control/control_shm.c
++++ b/src/control/control_shm.c
+@@ -27,7 +27,7 @@
+ #include <fcntl.h>
+ #include <sys/shm.h>
+ #include <sys/socket.h>
+-#include <sys/poll.h>
++#include <poll.h>
+ #include <sys/un.h>
+ #include <sys/uio.h>
+ #include <sys/mman.h>
+--- a/src/pcm/pcm.c
++++ b/src/pcm/pcm.c
+@@ -634,7 +634,7 @@ playback devices.
+ #include <stdarg.h>
+ #include <signal.h>
+ #include <ctype.h>
+-#include <sys/poll.h>
++#include <poll.h>
+ #include <sys/shm.h>
+ #include <sys/mman.h>
+ #include <limits.h>
+--- a/src/pcm/pcm_direct.c
++++ b/src/pcm/pcm_direct.c
+@@ -30,7 +30,7 @@
+ #include <grp.h>
+ #include <sys/ioctl.h>
+ #include <sys/mman.h>
+-#include <sys/poll.h>
++#include <poll.h>
+ #include <sys/shm.h>
+ #include <sys/sem.h>
+ #include <sys/wait.h>
+--- a/src/pcm/pcm_mmap.c
++++ b/src/pcm/pcm_mmap.c
+@@ -21,7 +21,7 @@
+ #include <stdio.h>
+ #include <malloc.h>
+ #include <string.h>
+-#include <sys/poll.h>
++#include <poll.h>
+ #include <sys/mman.h>
+ #include <sys/shm.h>
+ #include "pcm_local.h"
+--- a/src/pcm/pcm_share.c
++++ b/src/pcm/pcm_share.c
+@@ -34,7 +34,7 @@
+ #include <signal.h>
+ #include <math.h>
+ #include <sys/socket.h>
+-#include <sys/poll.h>
++#include <poll.h>
+ #include <sys/shm.h>
+ #include <pthread.h>
+ #include "pcm_local.h"
+--- a/src/pcm/pcm_shm.c
++++ b/src/pcm/pcm_shm.c
+@@ -36,7 +36,7 @@
+ #include <sys/ioctl.h>
+ #include <sys/shm.h>
+ #include <sys/socket.h>
+-#include <sys/poll.h>
++#include <poll.h>
+ #include <sys/un.h>
+ #include <sys/mman.h>
+ #include <netinet/in.h>
+--- a/src/shmarea.c
++++ b/src/shmarea.c
+@@ -22,7 +22,7 @@
+ #include <malloc.h>
+ #include <string.h>
+ #include <errno.h>
+-#include <sys/poll.h>
++#include <poll.h>
+ #include <sys/mman.h>
+ #include <sys/shm.h>
+ #include "list.h"
index e9c2364e5d7c9ae0e243ea4d7a7d85956329ef0b..ef0f31f0238e83c9b4ee3ca10f46e0c543141094 100644 (file)
@@ -17,7 +17,7 @@ include $(INCLUDE_DIR)/target.mk
 
 PKG_NAME:=boost
 PKG_VERSION:=1_58_0
-PKG_RELEASE:=4
+PKG_RELEASE:=5
 
 PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=@SF/boost
@@ -68,6 +68,10 @@ define Package/boost-libs/install
   true
 endef
 
+define Package/boost/install
+  true
+endef
+
 define Package/boost
   $(call Package/boost/Default)
   TITLE+= packages
@@ -222,16 +226,9 @@ define Build/InstallDev
                $(1)/usr/include/boost/ \
                # copies _all_ header files - independent of <--with-library>-argument above
 
-       if [ -d $(PKG_INSTALL_DIR)/lib ]; then \
-               $(INSTALL_DIR) \
-                       $(1)/usr/lib; \
-               $(CP) \
-                       $(PKG_INSTALL_DIR)/lib/*.a \
-                       $(1)/usr/lib/; \
-               $(CP) \
-                       $(PKG_INSTALL_DIR)/lib/*.so* \
-                       $(1)/usr/lib/; \
-       fi
+       $(INSTALL_DIR) $(1)/usr/lib
+       -$(CP) $(PKG_INSTALL_DIR)/lib/*.a $(1)/usr/lib/
+       -$(CP) $(PKG_INSTALL_DIR)/lib/*.so* $(1)/usr/lib/
 endef
 
 define Host/Install
index 815a379a39288bb8c03c0d9b3df13af15707d65b..c5b2269975a8a5a50fcea42c5a3acd480b0935fb 100644 (file)
@@ -22,6 +22,9 @@ PKG_INSTALL:=1
 
 include $(INCLUDE_DIR)/package.mk
 
+TARGET_CPPFLAGS += $(filter -D%,$(TARGET_CFLAGS))
+TARGET_CFLAGS := $(filter-out -D%,$(TARGET_CFLAGS))
+
 define Package/libcares
   SECTION:=libs
   CATEGORY:=Libraries
index 8d716af9fa3713726d58d199374700643d00977b..472caa87413773e9b2200806dd704d4ff0102e7f 100644 (file)
@@ -8,13 +8,13 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=gnutls
-PKG_VERSION:=3.4.2
+PKG_VERSION:=3.4.3
 PKG_RELEASE:=1
 PKG_USE_MIPS16:=0
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=ftp://ftp.gnutls.org/gcrypt/gnutls/v3.4
-PKG_MD5SUM:=4fb4a6253e09aa070e6c467cbb51ba33
+PKG_MD5SUM:=8a119d7830b81a44faa721a6fde2a295
 #PKG_FIXUP:=autoreconf gettext-version
 PKG_MAINTAINER:=Nikos Mavrogiannopoulos <nmav@gnutls.org>
 PKG_LICENSE:=LGPLv2.1+
diff --git a/libs/hiredis/Makefile b/libs/hiredis/Makefile
new file mode 100644 (file)
index 0000000..31971b9
--- /dev/null
@@ -0,0 +1,55 @@
+#
+# Copyright (C) 2010-2015 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:=hiredis
+PKG_VERSION:=0.13.1
+PKG_RELEASE:=1
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL:=https://github.com/redis/hiredis.git
+PKG_SOURCE_VERSION:=f58dd249d6ed47a7e835463c3b04722972281dbb
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+
+PKG_LICENSE:=BSD-3-Clause
+PKG_LICENSE_FILES:=COPYING
+PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
+
+PKG_INSTALL:=1
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/libhiredis
+       SECTION:=libs
+       CATEGORY:=Libraries
+       TITLE:=Minimalistic C client for Redis
+       URL:=https://github.com/redis/hiredis
+endef
+
+define Package/libhiredis/description
+       Hiredis is a minimalistic C client library for the Redis database.
+endef
+
+MAKE_FLAGS += ARCH="" DEBUG="" PREFIX="/usr"
+
+define Build/InstallDev
+       $(INSTALL_DIR) $(1)/usr/include/hiredis/adapters
+       $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/include/hiredis/adapters/* $(1)/usr/include/hiredis/adapters
+       $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/include/hiredis/*.h $(1)/usr/include/hiredis/
+       $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
+       $(CP) $(PKG_INSTALL_DIR)/usr/lib/libhiredis.{so*,a} $(1)/usr/lib/
+       $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/hiredis.pc $(1)/usr/lib/pkgconfig
+endef
+
+define Package/libhiredis/install
+       $(INSTALL_DIR) $(1)/usr/lib/
+       $(CP) $(PKG_INSTALL_DIR)/usr/lib/libhiredis.so* $(1)/usr/lib/
+endef
+
+$(eval $(call BuildPackage,libhiredis))
index 2fe243331f6b068dbc7594595a5656dac5a845b5..c3d2ddc2f9d113b1f3ca57e4f781d9264bdceb8e 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libevdev
-PKG_VERSION:=1.4.2
+PKG_VERSION:=1.4.3
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=http://www.freedesktop.org/software/libevdev/
-PKG_MD5SUM:=debfcd5153558eba25a8e71eb2534ae8
+PKG_MD5SUM:=2fc170e2d6f543ba26e7c79f95dc1935
 
 PKG_LICENSE:=MIT
 PKG_LICENSE_FILES:=COPYING
index b92e392409626a7762c0b528a4722fab2a6fe811..99f4803cb63c9a44f6a9ed947edab4d5128450f7 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libidn
-PKG_VERSION:=1.30
+PKG_VERSION:=1.31
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=@GNU/libidn
-PKG_MD5SUM:=b17edc8551cd31cc5f14c82a9dabf58e
+PKG_MD5SUM:=83806230fc0989a24cf9dfe6685563d9
 
 PKG_LICENSE:=GPL-2.0+ GPL-3.0+ LGPL-2.1+ LGPL-3.0+ Apache-2.0
 PKG_LICENSE_FILES:=COPYING COPYINGv2 COPYINGv3 COPYING.LESSERv2 COPYING.LESSERv3 java/LICENSE-2.0.txt
index f03e1dbecc6eb646e823b8ca1d127cb15c61e78b..26da26366440a7b62b3d2bb4c43039a144b5977e 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libinput
-PKG_VERSION:=0.17.0
+PKG_VERSION:=0.18.0
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=http://www.freedesktop.org/software/libinput/
-# PKG_MD5SUM:=debfcd5153558eba25a8e71eb2534ae8
+PKG_MD5SUM:=0ddbb0d53d58dec0a86de6791560011a
 
 PKG_LICENSE:=MIT
 PKG_LICENSE_FILES:=COPYING
index 91e98341c0012caea44f63d011c8274071bdf479..9c9dcbae59926afe03a28b3e4dd43dc29a2e57ea 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libmicrohttpd
-PKG_VERSION:=0.9.38
-PKG_RELEASE:=1.2
+PKG_VERSION:=0.9.42
+PKG_RELEASE:=3
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=@GNU/libmicrohttpd
-PKG_MD5SUM:=b72efbfe7f290846015d460aea7091fe
+PKG_MD5SUM:=3b9cf0b67fc8ebc9e69f53c6bc84a88d
 
 PKG_MAINTAINER:=Martijn Zilverschoon <martijn@friedzombie.com>
 
@@ -29,7 +29,7 @@ define Package/libmicrohttpd
        CATEGORY:=Libraries
        TITLE:=GNU libmicrohttpd is a library that runs an HTTP server.
        URL:=http://www.gnu.org/software/libmicrohttpd/
-       DEPENDS:=+libpthread +libgcrypt +libgnutls +libgpg-error +libopenssl
+       DEPENDS:=+libpthread +libgcrypt +libgnutls +libgpg-error
 endef
 
 define Package/libmicrohttpd/description
@@ -37,6 +37,13 @@ define Package/libmicrohttpd/description
        to run an HTTP server as part of another application.
 endef
 
+CONFIGURE_ARGS += \
+       --enable-https \
+       --with-gnutls \
+       --disable-curl \
+       --disable-spdy \
+       --without-openssl
+
 define Build/InstallDev
        $(INSTALL_DIR) $(1)/usr/include/
        $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
diff --git a/libs/libmicrohttpd/patches/001-bump-to-r35864.patch b/libs/libmicrohttpd/patches/001-bump-to-r35864.patch
new file mode 100644 (file)
index 0000000..6558a96
--- /dev/null
@@ -0,0 +1,754 @@
+--- a/ChangeLog
++++ b/ChangeLog
+@@ -1,3 +1,14 @@
++Thu Jun  4 13:37:05 CEST 2015
++      Fixing memory leak in digest authentication. -AW
++
++Wed Jun 03 21:23:47 CEST 2015
++      Add deprecation compiler messages for deprecated functions 
++      and macros. -EG
++
++Fri May 29 12:23:01 CEST 2015
++      Fixing digest authentication when used in combination
++      with escaped characters in URLs. -CG/AW
++
+ Wed May 13 11:49:09 CEST 2015
+       Releasing libmicrohttpd 0.9.42. -CG
+--- a/src/microhttpd/response.c
++++ b/src/microhttpd/response.c
+@@ -24,6 +24,8 @@
+  * @author Christian Grothoff
+  */
++#define MHD_NO_DEPRECATION 1
++
+ #include "internal.h"
+ #include "response.h"
+--- a/src/microhttpd/digestauth.c
++++ b/src/microhttpd/digestauth.c
+@@ -1,6 +1,6 @@
+ /*
+      This file is part of libmicrohttpd
+-     Copyright (C) 2010, 2011, 2012 Daniel Pittman and Christian Grothoff
++     Copyright (C) 2010, 2011, 2012, 2015 Daniel Pittman and Christian Grothoff
+      This library is free software; you can redistribute it and/or
+      modify it under the terms of the GNU Lesser General Public
+@@ -472,8 +472,8 @@ test_header (struct MHD_Connection *conn
+  *
+  * @param connection connections with headers to compare against
+  * @param args argument URI string (after "?" in URI)
+- * @return MHD_YES if the arguments match,
+- *         MHD_NO if not
++ * @return #MHD_YES if the arguments match,
++ *         #MHD_NO if not
+  */
+ static int
+ check_argument_match (struct MHD_Connection *connection,
+@@ -508,7 +508,10 @@ check_argument_match (struct MHD_Connect
+                                                connection,
+                                                argp);
+         if (MHD_YES != test_header (connection, argp, NULL))
+-          return MHD_NO;
++      {
++        free(argb);
++        return MHD_NO;
++      }
+         num_headers++;
+         break;
+       }
+@@ -527,10 +530,16 @@ check_argument_match (struct MHD_Connect
+                                            connection,
+                                            equals);
+       if (! test_header (connection, argp, equals))
+-      return MHD_NO;
++      {
++          free(argb);
++          return MHD_NO;
++      }
++      
+       num_headers++;
+       argp = amper;
+     }
++    
++  free(argb);
+   /* also check that the number of headers matches */
+   for (pos = connection->headers_received; NULL != pos; pos = pos->next)
+@@ -632,10 +641,83 @@ MHD_digest_auth_check (struct MHD_Connec
+        header value. */
+     return MHD_NO;
+   }
++  /* 8 = 4 hexadecimal numbers for the timestamp */
++  nonce_time = strtoul (nonce + len - 8, (char **)NULL, 16);
++  t = (uint32_t) MHD_monotonic_time();
++  /*
++   * First level vetting for the nonce validity: if the timestamp
++   * attached to the nonce exceeds `nonce_timeout', then the nonce is
++   * invalid.
++   */
++  if ( (t > nonce_time + nonce_timeout) ||
++       (nonce_time + nonce_timeout < nonce_time) )
++    {
++      /* too old */
++      return MHD_INVALID_NONCE;
++    }
++
++  calculate_nonce (nonce_time,
++                   connection->method,
++                   connection->daemon->digest_auth_random,
++                   connection->daemon->digest_auth_rand_size,
++                   connection->url,
++                   realm,
++                   noncehashexp);
++  /*
++   * Second level vetting for the nonce validity
++   * if the timestamp attached to the nonce is valid
++   * and possibly fabricated (in case of an attack)
++   * the attacker must also know the random seed to be
++   * able to generate a "sane" nonce, which if he does
++   * not, the nonce fabrication process going to be
++   * very hard to achieve.
++   */
++
++  if (0 != strcmp (nonce, noncehashexp))
++    {
++      return MHD_INVALID_NONCE;
++    }
++  if ( (0 == lookup_sub_value (cnonce,
++                               sizeof (cnonce),
++                               header, "cnonce")) ||
++       (0 == lookup_sub_value (qop, sizeof (qop), header, "qop")) ||
++       ( (0 != strcmp (qop, "auth")) &&
++         (0 != strcmp (qop, "")) ) ||
++       (0 == lookup_sub_value (nc, sizeof (nc), header, "nc"))  ||
++       (0 == lookup_sub_value (response, sizeof (response), header, "response")) )
++    {
++#if HAVE_MESSAGES
++      MHD_DLOG (connection->daemon,
++              "Authentication failed, invalid format.\n");
++#endif
++      return MHD_NO;
++    }
++  nci = strtoul (nc, &end, 16);
++  if ( ('\0' != *end) ||
++       ( (LONG_MAX == nci) &&
++         (ERANGE == errno) ) )
++    {
++#if HAVE_MESSAGES
++      MHD_DLOG (connection->daemon,
++              "Authentication failed, invalid format.\n");
++#endif
++      return MHD_NO; /* invalid nonce format */
++    }
++  /*
++   * Checking if that combination of nonce and nc is sound
++   * and not a replay attack attempt. Also adds the nonce
++   * to the nonce-nc map if it does not exist there.
++   */
++
++  if (MHD_YES != check_nonce_nc (connection, nonce, nci))
++    {
++      return MHD_NO;
++    }
++
+   {
+     char *uri;
+-    
+-    uri = malloc(left + 1);
++
++    uri = malloc (left + 1);
+     if (NULL == uri)
+     {
+ #if HAVE_MESSAGES
+@@ -648,24 +730,31 @@ MHD_digest_auth_check (struct MHD_Connec
+                                left + 1,
+                                header, "uri"))
+     {
+-      free(uri);
++      free (uri);
+       return MHD_NO;
+     }
+-    /* 8 = 4 hexadecimal numbers for the timestamp */
+-    nonce_time = strtoul (nonce + len - 8, (char **)NULL, 16);
+-    t = (uint32_t) MHD_monotonic_time();
+-    /*
+-     * First level vetting for the nonce validity: if the timestamp
+-     * attached to the nonce exceeds `nonce_timeout', then the nonce is
+-     * invalid.
+-     */
+-    if ( (t > nonce_time + nonce_timeout) ||
+-       (nonce_time + nonce_timeout < nonce_time) )
+-    { 
+-      free(uri);
+-      return MHD_INVALID_NONCE;
+-    }
++    digest_calc_ha1("md5",
++                  username,
++                  realm,
++                  password,
++                  nonce,
++                  cnonce,
++                  ha1);
++    digest_calc_response (ha1,
++                        nonce,
++                        nc,
++                        cnonce,
++                        qop,
++                        connection->method,
++                        uri,
++                        hentity,
++                        respexp);
++
++    /* Need to unescape URI before comparing with connection->url */
++    connection->daemon->unescape_callback (connection->daemon->unescape_callback_cls,
++                                           connection,
++                                           uri);
+     if (0 != strncmp (uri,
+                     connection->url,
+                     strlen (connection->url)))
+@@ -674,9 +763,10 @@ MHD_digest_auth_check (struct MHD_Connec
+       MHD_DLOG (connection->daemon,
+               "Authentication failed, URI does not match.\n");
+ #endif
+-      free(uri);
++      free (uri);
+       return MHD_NO;
+     }
++
+     {
+       const char *args = strchr (uri, '?');
+@@ -692,89 +782,11 @@ MHD_digest_auth_check (struct MHD_Connec
+       MHD_DLOG (connection->daemon,
+                 "Authentication failed, arguments do not match.\n");
+ #endif
+-       free(uri);
++       free (uri);
+        return MHD_NO;
+       }
+     }
+-    calculate_nonce (nonce_time,
+-                   connection->method,
+-                   connection->daemon->digest_auth_random,
+-                   connection->daemon->digest_auth_rand_size,
+-                   connection->url,
+-                   realm,
+-                   noncehashexp);
+-    /*
+-     * Second level vetting for the nonce validity
+-     * if the timestamp attached to the nonce is valid
+-     * and possibly fabricated (in case of an attack)
+-     * the attacker must also know the random seed to be
+-     * able to generate a "sane" nonce, which if he does
+-     * not, the nonce fabrication process going to be
+-     * very hard to achieve.
+-     */
+-
+-    if (0 != strcmp (nonce, noncehashexp))
+-    {
+-      free(uri);
+-      return MHD_INVALID_NONCE;
+-    }
+-    if ( (0 == lookup_sub_value (cnonce,
+-                               sizeof (cnonce),
+-                               header, "cnonce")) ||
+-       (0 == lookup_sub_value (qop, sizeof (qop), header, "qop")) ||
+-       ( (0 != strcmp (qop, "auth")) &&
+-         (0 != strcmp (qop, "")) ) ||
+-       (0 == lookup_sub_value (nc, sizeof (nc), header, "nc"))  ||
+-       (0 == lookup_sub_value (response, sizeof (response), header, "response")) )
+-    {
+-#if HAVE_MESSAGES
+-      MHD_DLOG (connection->daemon,
+-              "Authentication failed, invalid format.\n");
+-#endif
+-      free(uri);
+-      return MHD_NO;
+-    }
+-    nci = strtoul (nc, &end, 16);
+-    if ( ('\0' != *end) ||
+-       ( (LONG_MAX == nci) &&
+-         (ERANGE == errno) ) )
+-    {
+-#if HAVE_MESSAGES
+-      MHD_DLOG (connection->daemon,
+-              "Authentication failed, invalid format.\n");
+-#endif
+-      free(uri);
+-      return MHD_NO; /* invalid nonce format */
+-    }
+-    /*
+-     * Checking if that combination of nonce and nc is sound
+-     * and not a replay attack attempt. Also adds the nonce
+-     * to the nonce-nc map if it does not exist there.
+-     */
+-
+-    if (MHD_YES != check_nonce_nc (connection, nonce, nci))
+-    {
+-      free(uri);
+-      return MHD_NO;
+-    }
+-
+-    digest_calc_ha1("md5",
+-                  username,
+-                  realm,
+-                  password,
+-                  nonce,
+-                  cnonce,
+-                  ha1);
+-    digest_calc_response (ha1,
+-                        nonce,
+-                        nc,
+-                        cnonce,
+-                        qop,
+-                        connection->method,
+-                        uri,
+-                        hentity,
+-                        respexp);
+-    free(uri);
++    free (uri);
+     return (0 == strcmp(response, respexp))
+       ? MHD_YES
+       : MHD_NO;
+@@ -835,7 +847,7 @@ MHD_queue_auth_fail_response (struct MHD
+                  : "");
+   {
+     char *header;
+-    
++
+     header = malloc(hlen + 1);
+     if (NULL == header)
+     {
+--- a/src/microhttpd/daemon.c
++++ b/src/microhttpd/daemon.c
+@@ -73,7 +73,7 @@
+ /**
+  * Default connection limit.
+  */
+-#ifndef WINDOWS
++#ifndef MHD_WINSOCK_SOCKETS
+ #define MHD_MAX_CONNECTIONS_DEFAULT FD_SETSIZE - 4
+ #else
+ #define MHD_MAX_CONNECTIONS_DEFAULT FD_SETSIZE
+@@ -1271,7 +1271,7 @@ internal_add_connection (struct MHD_Daem
+       return MHD_NO;
+     }
+-#ifndef WINDOWS
++#ifndef MHD_WINSOCK_SOCKETS
+   if ( (client_socket >= FD_SETSIZE) &&
+        (0 == (daemon->options & (MHD_USE_POLL | MHD_USE_EPOLL_LINUX_ONLY))) )
+     {
+@@ -1418,7 +1418,7 @@ internal_add_connection (struct MHD_Daem
+ #endif
+       {
+         /* make socket non-blocking */
+-#if !defined(WINDOWS) || defined(CYGWIN)
++#if !defined(MHD_WINSOCK_SOCKETS)
+         int flags = fcntl (connection->socket_fd, F_GETFL);
+         if ( (-1 == flags) ||
+              (0 != fcntl (connection->socket_fd, F_SETFL, flags | O_NONBLOCK)) )
+@@ -1797,7 +1797,7 @@ static void
+ make_nonblocking_noninheritable (struct MHD_Daemon *daemon,
+                                MHD_socket sock)
+ {
+-#ifdef WINDOWS
++#ifdef MHD_WINSOCK_SOCKETS
+   DWORD dwFlags;
+   unsigned long flags = 1;
+@@ -3611,7 +3611,7 @@ MHD_start_daemon_va (unsigned int flags,
+   daemon->socket_fd = MHD_INVALID_SOCKET;
+   daemon->listening_address_reuse = 0;
+   daemon->options = flags;
+-#if WINDOWS
++#if defined(MHD_WINSOCK_SOCKETS) || defined(CYGWIN)
+   /* Winsock is broken with respect to 'shutdown';
+      this disables us calling 'shutdown' on W32. */
+   daemon->options |= MHD_USE_EPOLL_TURBO;
+@@ -3650,7 +3650,7 @@ MHD_start_daemon_va (unsigned int flags,
+       free (daemon);
+       return NULL;
+     }
+-#ifndef WINDOWS
++#ifndef MHD_WINSOCK_SOCKETS
+   if ( (0 == (flags & (MHD_USE_POLL | MHD_USE_EPOLL_LINUX_ONLY))) &&
+        (1 == use_pipe) &&
+        (daemon->wpipe[0] >= FD_SETSIZE) )
+@@ -3934,7 +3934,7 @@ MHD_start_daemon_va (unsigned int flags,
+            (http://msdn.microsoft.com/en-us/library/ms738574%28v=VS.85%29.aspx);
+            and may also be missing on older POSIX systems; good luck if you have any of those,
+            your IPv6 socket may then also bind against IPv4 anyway... */
+-#ifndef WINDOWS
++#ifndef MHD_WINSOCK_SOCKETS
+         const int
+ #else
+         const char
+@@ -4016,7 +4016,7 @@ MHD_start_daemon_va (unsigned int flags,
+     {
+       socket_fd = daemon->socket_fd;
+     }
+-#ifndef WINDOWS
++#ifndef MHD_WINSOCK_SOCKETS
+   if ( (socket_fd >= FD_SETSIZE) &&
+        (0 == (flags & (MHD_USE_POLL | MHD_USE_EPOLL_LINUX_ONLY)) ) )
+     {
+@@ -4121,7 +4121,7 @@ MHD_start_daemon_va (unsigned int flags,
+   if ( (daemon->worker_pool_size > 0) &&
+        (0 == (daemon->options & MHD_USE_NO_LISTEN_SOCKET)) )
+     {
+-#if !defined(WINDOWS) || defined(CYGWIN)
++#if !defined(MHD_WINSOCK_SOCKETS)
+       int sk_flags;
+ #else
+       unsigned long sk_flags;
+@@ -4140,7 +4140,7 @@ MHD_start_daemon_va (unsigned int flags,
+       /* Accept must be non-blocking. Multiple children may wake up
+        * to handle a new connection, but only one will win the race.
+        * The others must immediately return. */
+-#if !defined(WINDOWS) || defined(CYGWIN)
++#if !defined(MHD_WINSOCK_SOCKETS)
+       sk_flags = fcntl (socket_fd, F_GETFL);
+       if (sk_flags < 0)
+         goto thread_failed;
+@@ -4150,7 +4150,7 @@ MHD_start_daemon_va (unsigned int flags,
+       sk_flags = 1;
+       if (SOCKET_ERROR == ioctlsocket (socket_fd, FIONBIO, &sk_flags))
+         goto thread_failed;
+-#endif /* WINDOWS && !CYGWIN */
++#endif /* MHD_WINSOCK_SOCKETS */
+       /* Allocate memory for pooled objects */
+       daemon->worker_pool = malloc (sizeof (struct MHD_Daemon)
+@@ -4182,7 +4182,7 @@ MHD_start_daemon_va (unsigned int flags,
+ #endif
+               goto thread_failed;
+             }
+-#ifndef WINDOWS
++#ifndef MHD_WINSOCK_SOCKETS
+           if ( (0 == (flags & (MHD_USE_POLL | MHD_USE_EPOLL_LINUX_ONLY))) &&
+                (MHD_USE_SUSPEND_RESUME == (flags & MHD_USE_SUSPEND_RESUME)) &&
+                (d->wpipe[0] >= FD_SETSIZE) )
+@@ -4343,7 +4343,7 @@ close_all_connections (struct MHD_Daemon
+     {
+       shutdown (pos->socket_fd,
+                 (pos->read_closed == MHD_YES) ? SHUT_WR : SHUT_RDWR);
+-#if WINDOWS
++#if MHD_WINSOCK_SOCKETS
+       if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) &&
+            (MHD_INVALID_PIPE_ != daemon->wpipe[1]) &&
+            (1 != MHD_pipe_write_ (daemon->wpipe[1], "e", 1)) )
+--- a/src/include/microhttpd.h
++++ b/src/include/microhttpd.h
+@@ -130,7 +130,7 @@ typedef intptr_t ssize_t;
+  * Current version of the library.
+  * 0x01093001 = 1.9.30-1.
+  */
+-#define MHD_VERSION 0x00094200
++#define MHD_VERSION 0x00094202
+ /**
+  * MHD-internal return code for "YES".
+@@ -194,6 +194,53 @@ typedef SOCKET MHD_socket;
+ #endif /* MHD_SOCKET_DEFINED */
+ /**
++ * Define MHD_NO_DEPRECATION before including "microhttpd.h" to disable deprecation messages
++ */
++#ifdef MHD_NO_DEPRECATION
++#define _MHD_DEPR_MACRO(msg)
++#define _MHD_DEPR_FUNC(msg)
++#endif /* MHD_NO_DEPRECATION */
++
++#ifndef _MHD_DEPR_MACRO
++#if defined(_MSC_FULL_VER) && _MSC_VER+0 >= 1500
++/* Stringify macros */
++#define _MHD_INSTRMACRO(a) #a
++#define _MHD_STRMACRO(a) _MHD_INSTRMACRO(a)
++#define _MHD_DEPR_MACRO(msg) __pragma(message(__FILE__ "(" _MHD_STRMACRO(__LINE__)"): warning: " msg))
++#elif defined(__clang__) || defined (__GNUC_PATCHLEVEL__)
++#define _MHD_GCC_PRAG(x) _Pragma (#x)
++#if __clang_major__+0 >= 5 || \
++  (!defined(__apple_build_version__) && (__clang_major__+0  > 3 || (__clang_major__+0 == 3 && __clang_minor__ >= 3))) || \
++  __GNUC__+0 > 4 || (__GNUC__+0 == 4 && __GNUC_MINOR__+0 >= 8)
++#define _MHD_DEPR_MACRO(msg) _MHD_GCC_PRAG(GCC warning msg)
++#else /* older clang or GCC */
++#define _MHD_DEPR_MACRO(msg) _MHD_GCC_PRAG(message msg)
++#endif 
++/* #elif defined(SOMEMACRO) */ /* add compiler-specific macros here if required */
++#else /* other compilers */
++#define _MHD_DEPR_MACRO(msg)
++#endif
++#endif /* _MHD_DEPR_MACRO */
++
++#ifndef _MHD_DEPR_FUNC
++#if defined(_MSC_FULL_VER) && _MSC_VER+0 >= 1400
++#define _MHD_DEPR_FUNC(msg) __declspec(deprecated(msg))
++#elif defined(_MSC_FULL_VER) && _MSC_VER+0 >= 1310
++/* VS .NET 2003 deprecation do not support custom messages */
++#define _MHD_DEPR_FUNC(msg) __declspec(deprecated)
++#elif defined (__clang__) && \
++  (__clang_major__+0 >= 4 || (!defined(__apple_build_version__) && __clang_major__+0 >= 3))
++#define _MHD_DEPR_FUNC(msg) __attribute__((deprecated(msg)))
++#elif defined (__clang__) || __GNUC__+0 > 3 || (__GNUC__+0 == 3 && __GNUC_MINOR__+0 >= 1)
++/* GCC-style deprecation do not support custom messages */
++#define _MHD_DEPR_FUNC(msg) __attribute__((__deprecated__))
++/* #elif defined(SOMEMACRO) */ /* add compiler-specific macros here if required */
++#else /* other compilers */
++#define _MHD_DEPR_FUNC(msg)
++#endif
++#endif /* _MHD_DEPR_FUNC */
++
++/**
+  * Not all architectures and `printf()`'s support the `long long` type.
+  * This gives the ability to replace `long long` with just a `long`,
+  * standard `int` or a `short`.
+@@ -204,6 +251,8 @@ typedef SOCKET MHD_socket;
+  */
+ #define MHD_LONG_LONG long long
+ #define MHD_UNSIGNED_LONG_LONG unsigned long long
++#else /* MHD_LONG_LONG */
++_MHD_DEPR_MACRO("Macro MHD_LONG_LONG is deprecated, use MHD_UNSIGNED_LONG_LONG")
+ #endif
+ /**
+  * Format string for printing a variable of type #MHD_LONG_LONG.
+@@ -215,6 +264,8 @@ typedef SOCKET MHD_socket;
+  */
+ #define MHD_LONG_LONG_PRINTF "ll"
+ #define MHD_UNSIGNED_LONG_LONG_PRINTF "%llu"
++#else /* MHD_LONG_LONG_PRINTF */
++_MHD_DEPR_MACRO("Macro MHD_LONG_LONG_PRINTF is deprecated, use MHD_UNSIGNED_LONG_LONG_PRINTF")
+ #endif
+@@ -253,7 +304,8 @@ typedef SOCKET MHD_socket;
+ #define MHD_HTTP_METHOD_NOT_ALLOWED 405
+ #define MHD_HTTP_NOT_ACCEPTABLE 406
+ /** @deprecated */
+-#define MHD_HTTP_METHOD_NOT_ACCEPTABLE 406
++#define MHD_HTTP_METHOD_NOT_ACCEPTABLE \
++  _MHD_DEPR_MACRO("Value MHD_HTTP_METHOD_NOT_ACCEPTABLE is deprecated, use MHD_HTTP_NOT_ACCEPTABLE") 406
+ #define MHD_HTTP_PROXY_AUTHENTICATION_REQUIRED 407
+ #define MHD_HTTP_REQUEST_TIMEOUT 408
+ #define MHD_HTTP_CONFLICT 409
+@@ -1953,6 +2005,7 @@ MHD_create_response_from_callback (uint6
+  * @deprecated use #MHD_create_response_from_buffer instead
+  * @ingroup response
+  */
++_MHD_DEPR_FUNC("MHD_create_response_from_data() is deprecated, use MHD_create_response_from_buffer()") \
+ _MHD_EXTERN struct MHD_Response *
+ MHD_create_response_from_data (size_t size,
+                              void *data,
+@@ -2023,6 +2076,8 @@ MHD_create_response_from_buffer (size_t
+  * @return NULL on error (i.e. invalid arguments, out of memory)
+  * @ingroup response
+  */
++/* NOTE: this should be 'uint64_t' instead of 'size_t', but changing
++   this would break API compatibility. */
+ _MHD_EXTERN struct MHD_Response *
+ MHD_create_response_from_fd (size_t size,
+                            int fd);
+@@ -2044,6 +2099,8 @@ MHD_create_response_from_fd (size_t size
+  * @return NULL on error (i.e. invalid arguments, out of memory)
+  * @ingroup response
+  */
++/* NOTE: this should be 'uint64_t' instead of 'size_t', but changing
++   this would break API compatibility. */
+ _MHD_EXTERN struct MHD_Response *
+ MHD_create_response_from_fd_at_offset (size_t size,
+                                      int fd,
+--- a/src/include/platform_interface.h
++++ b/src/include/platform_interface.h
+@@ -82,14 +82,14 @@
+ /* MHD_socket_close_(fd) close any FDs (non-W32) / close only socket FDs (W32) */
+-#if !defined(_WIN32) || defined(__CYGWIN__)
++#if !defined(MHD_WINSOCK_SOCKETS)
+ #define MHD_socket_close_(fd) close((fd))
+ #else
+ #define MHD_socket_close_(fd) closesocket((fd))
+ #endif
+ /* MHD_socket_errno_ is errno of last function (non-W32) / errno of last socket function (W32) */
+-#if !defined(_WIN32) || defined(__CYGWIN__)
++#if !defined(MHD_WINSOCK_SOCKETS)
+ #define MHD_socket_errno_ errno
+ #else
+ #define MHD_socket_errno_ MHD_W32_errno_from_winsock_()
+@@ -97,21 +97,21 @@
+ /* MHD_socket_last_strerr_ is description string of last errno (non-W32) /
+  *                            description string of last socket error (W32) */
+-#if !defined(_WIN32) || defined(__CYGWIN__)
++#if !defined(MHD_WINSOCK_SOCKETS)
+ #define MHD_socket_last_strerr_() strerror(errno)
+ #else
+ #define MHD_socket_last_strerr_() MHD_W32_strerror_last_winsock_()
+ #endif
+ /* MHD_strerror_ is strerror (both non-W32/W32) */
+-#if !defined(_WIN32) || defined(__CYGWIN__)
++#if !defined(MHD_WINSOCK_SOCKETS)
+ #define MHD_strerror_(errnum) strerror((errnum))
+ #else
+ #define MHD_strerror_(errnum) MHD_W32_strerror_((errnum))
+ #endif
+ /* MHD_set_socket_errno_ set errno to errnum (non-W32) / set socket last error to errnum (W32) */
+-#if !defined(_WIN32) || defined(__CYGWIN__)
++#if !defined(MHD_WINSOCK_SOCKETS)
+ #define MHD_set_socket_errno_(errnum) errno=(errnum)
+ #else
+ #define MHD_set_socket_errno_(errnum) MHD_W32_set_last_winsock_error_((errnum))
+--- a/src/testcurl/test_digestauth.c
++++ b/src/testcurl/test_digestauth.c
+@@ -73,7 +73,8 @@ ahc_echo (void *cls,
+           const char *url,
+           const char *method,
+           const char *version,
+-          const char *upload_data, size_t *upload_data_size,
++          const char *upload_data,
++          size_t *upload_data_size,
+           void **unused)
+ {
+   struct MHD_Response *response;
+@@ -82,44 +83,47 @@ ahc_echo (void *cls,
+   const char *realm = "test@example.com";
+   int ret;
+-  username = MHD_digest_auth_get_username(connection);
++  username = MHD_digest_auth_get_username (connection);
+   if ( (username == NULL) ||
+        (0 != strcmp (username, "testuser")) )
+     {
+-      response = MHD_create_response_from_buffer(strlen (DENIED), 
+-                                               DENIED,
+-                                               MHD_RESPMEM_PERSISTENT);  
++      response = MHD_create_response_from_buffer (strlen (DENIED),
++                                                  DENIED,
++                                                  MHD_RESPMEM_PERSISTENT);
+       ret = MHD_queue_auth_fail_response(connection, realm,
+                                        MY_OPAQUE,
+                                        response,
+-                                       MHD_NO);    
+-      MHD_destroy_response(response);  
++                                       MHD_NO);
++      MHD_destroy_response(response);
+       return ret;
+     }
+   ret = MHD_digest_auth_check(connection, realm,
+-                            username, 
+-                            password, 
++                            username,
++                            password,
+                             300);
+   free(username);
+   if ( (ret == MHD_INVALID_NONCE) ||
+        (ret == MHD_NO) )
+     {
+-      response = MHD_create_response_from_buffer(strlen (DENIED), 
++      response = MHD_create_response_from_buffer(strlen (DENIED),
+                                                DENIED,
+-                                               MHD_RESPMEM_PERSISTENT);  
+-      if (NULL == response) 
++                                               MHD_RESPMEM_PERSISTENT);
++      if (NULL == response)
+       return MHD_NO;
+       ret = MHD_queue_auth_fail_response(connection, realm,
+                                        MY_OPAQUE,
+                                        response,
+-                                       (ret == MHD_INVALID_NONCE) ? MHD_YES : MHD_NO);  
+-      MHD_destroy_response(response);  
++                                       (ret == MHD_INVALID_NONCE) ? MHD_YES : MHD_NO);
++      MHD_destroy_response(response);
+       return ret;
+     }
+-  response = MHD_create_response_from_buffer(strlen(PAGE), PAGE,
+-                                           MHD_RESPMEM_PERSISTENT);
+-  ret = MHD_queue_response(connection, MHD_HTTP_OK, response);  
+-  MHD_destroy_response(response);
++  response = MHD_create_response_from_buffer (strlen(PAGE),
++                                              PAGE,
++                                              MHD_RESPMEM_PERSISTENT);
++  ret = MHD_queue_response (connection,
++                            MHD_HTTP_OK,
++                            response);
++  MHD_destroy_response (response);
+   return ret;
+ }
+@@ -144,24 +148,24 @@ testDigestAuth ()
+   fd = open("/dev/urandom", O_RDONLY);
+   if (-1 == fd)
+     {
+-        fprintf(stderr, "Failed to open `%s': %s\n",
+-             "/dev/urandom",
+-                 strerror(errno));
+-        return 1;
+-      }
++      fprintf(stderr, "Failed to open `%s': %s\n",
++              "/dev/urandom",
++              strerror(errno));
++      return 1;
++    }
+   while (off < 8)
+-      {
+-        len = read(fd, rnd, 8);
+-        if (len == -1)
+-          {
+-                fprintf(stderr, "Failed to read `%s': %s\n",
+-                     "/dev/urandom",
+-                         strerror(errno));
+-                (void) close(fd);
+-                return 1;
+-              }
+-        off += len;
+-      }
++    {
++      len = read(fd, rnd, 8);
++      if (len == -1)
++        {
++          fprintf(stderr, "Failed to read `%s': %s\n",
++                  "/dev/urandom",
++                  strerror(errno));
++          (void) close(fd);
++          return 1;
++        }
++      off += len;
++    }
+   (void) close(fd);
+ #else
+   {
+@@ -193,7 +197,7 @@ testDigestAuth ()
+   if (d == NULL)
+     return 1;
+   c = curl_easy_init ();
+-  curl_easy_setopt (c, CURLOPT_URL, "http://127.0.0.1:1337/");
++  curl_easy_setopt (c, CURLOPT_URL, "http://127.0.0.1:1337/bar%20 foo?a=bü%20");
+   curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer);
+   curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc);
+   curl_easy_setopt (c, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
+@@ -225,7 +229,6 @@ testDigestAuth ()
+ }
+-
+ int
+ main (int argc, char *const *argv)
+ {
+--- a/src/testcurl/https/test_https_time_out.c
++++ b/src/testcurl/https/test_https_time_out.c
+@@ -64,7 +64,7 @@ test_tls_session_time_out (gnutls_sessio
+   gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) (intptr_t) sd);
+-  ret = connect (sd, &sa, sizeof (struct sockaddr_in));
++  ret = connect (sd, (struct sockaddr *) &sa, sizeof (struct sockaddr_in));
+   if (ret < 0)
+     {
index a9d7e750824028d844ba636e0439c3f4c00c7fcb..a7911633733d00d6338390cf6a3c9bc9568cb8b2 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libnet
 PKG_VERSION:=1.2-rc3
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://sourceforge.net/projects/libnet-dev/files/
index fcb4188a01ba8a9d947f4df99909552e64459512..b95366a07cfc66e6ccb2e7dc171ddcbd6b935621 100644 (file)
@@ -1,11 +1,16 @@
 --- a/src/libnet_link_linux.c
 +++ b/src/libnet_link_linux.c
-@@ -30,7 +30,7 @@
+@@ -30,13 +30,8 @@
  #include <sys/time.h>
  
  #include <net/if.h>
 -#if (__GLIBC__)
-+#if (!__UCLIBC__)
  #include <netinet/if_ether.h>
  #include <net/if_arp.h>
- #else
+-#else
+-#include <linux/if_arp.h>
+-#include <linux/if_ether.h>
+-#endif
+ #if (HAVE_PACKET_SOCKET)
+ #ifndef SOL_PACKET
index 4497f389cf2991b8166c29abe3a7b6208cd75458..7951f63efa1f57b7859acb1e1cca47825349b00a 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2014 OpenWrt.org
+# Copyright (C) 2015 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:=libssh2
-PKG_VERSION:=1.4.3
-PKG_RELEASE:=2
+PKG_VERSION:=1.6.0
+PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://www.libssh2.org/download
-PKG_MD5SUM:=071004c60c5d6f90354ad1b701013a0b
+PKG_MD5SUM:=00aabd6e714a5f42a4fb82ace20db1dd
 
 PKG_INSTALL:=1
 
index bd3f0d7f4a4a544aafaf40703dececfa6e972901..758be2b525a2aba3c5ecd3b4a56ab4955f85f483 100644 (file)
@@ -1,6 +1,6 @@
 --- a/lib/libv4lconvert/libv4lsyscall-priv.h
 +++ b/lib/libv4lconvert/libv4lsyscall-priv.h
-@@ -35,14 +35,19 @@
+@@ -35,18 +35,23 @@
     which is broken on some systems and doesn't include them itself :( */
  
  #ifdef linux
 +#undef SYS_mmap2
  #define       SYS_mmap2 __NR_mmap2
  #define       MMAP2_PAGE_SHIFT 12
-+#if !(defined(__UCLIBC__) || defined(__GLIBC__))
-+typedef off_t __off_t;
-+#endif
  #else
  #define       SYS_mmap2 SYS_mmap
  #define       MMAP2_PAGE_SHIFT 0
+ #endif
++#if !(defined(__UCLIBC__) || defined(__GLIBC__))
++typedef off_t __off_t;
++#endif
+ #endif
+ #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
 --- a/lib/libv4l1/v4l1compat.c
 +++ b/lib/libv4l1/v4l1compat.c
 @@ -62,7 +62,7 @@ LIBV4L_PUBLIC int open(const char *file,
index dcc9d988a7a7ac3cea73e07eaf12b851625fc14b..e25fc0152f24107efa628a64ce388b23ffeafc66 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2006-2012 OpenWrt.org
+# Copyright (C) 2006-2015 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:=openldap
-PKG_VERSION:=2.4.39
-PKG_RELEASE:=2
+PKG_VERSION:=2.4.41
+PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tgz
 PKG_SOURCE_URL:=ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/ \
        ftp://sunsite.cnlab-switch.ch/mirror/OpenLDAP/openldap-release/ \
        ftp://ftp.nl.uu.net/pub/unix/db/openldap/openldap-release/ \
        ftp://ftp.plig.org/pub/OpenLDAP/openldap-release/
-PKG_MD5SUM:=b0d5ee4b252c841dec6b332d679cf943
+PKG_MD5SUM:=3f1a4cea52827e18feaedfdc1634b5d0
 
 PKG_FIXUP:=autoreconf
 
index 6e07e6854cc8c4b49454eb7da10a66b0db3de134..54d7737e1cce9b8d7884daf47e4bd69d8593f471 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=pthsem
 PKG_VERSION:=2.0.8
-PKG_RELEASE:=3
+PKG_RELEASE:=4
 
 PKG_MAINTAINER:=Othmar Truniger <github@truniger.ch>
 PKG_LICENSE:=LGPL-2.1+
@@ -21,6 +21,7 @@ PKG_MD5SUM:=9144b26dcc27e67498d63dd5456f934c
 
 PKG_FIXUP:=autoreconf
 PKG_BUILD_PARALLEL:=1
+PKG_FORTIFY_SOURCE:=0
 PKG_INSTALL:=1
 
 include $(INCLUDE_DIR)/package.mk
@@ -37,6 +38,13 @@ define Package/pthsem/description
   pthsem is an extend version, with support for semaphores added. It can be installed parallel to a normal pth.
 endef
 
+# The musl libc provides a proper implementation of sigaltstack() so
+# prevent configure from wrongly assuming a broken Linux platform
+ifeq ($(CONFIG_USE_MUSL),y)
+  CONFIGURE_VARS += \
+       ac_cv_check_sjlj=ssjlj
+endif
+
 define Build/InstallDev
        $(INSTALL_DIR) $(1)/usr/bin
        $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/pthsem-config $(1)/usr/bin/
index 3f3ba0ff6c26909497b3f4a9a72b550a10313ea3..bcbb07a18510dec7e3b50c7a06bdb0ee837b6b60 100644 (file)
@@ -1,5 +1,5 @@
 # 
-# Copyright (C) 2014 OpenWrt.org
+# Copyright (C) 2014-2015 OpenWrt.org
 #
 # 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:=postfix
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 PKG_SOURCE_URL:=ftp://ftp.porcupine.org/mirrors/postfix-release/official/
 PKG_VERSION:=3.0.1
 PKG_MD5SUM:=3ec1416e7d4fba9566297c8fcf7a348c
index e4123ef001d0a9d684606767f61745bab733a0e0..0366612bb29095a0245092e7ed8514e24a3f3eae 100644 (file)
@@ -1,6 +1,6 @@
---- postfix-2.10.2/makedefs    2013-02-04 05:33:13.000000000 +0400
-+++ postfix-2.10.2_patched/makedefs    2013-11-19 22:48:50.528560454 +0400
-@@ -190,9 +190,9 @@
+--- a/makedefs
++++ b/makedefs
+@@ -190,9 +190,9 @@ error() {
  
  case $# in
   # Officially supported usage.
@@ -13,7 +13,7 @@
      case "$VERSION" in
       dcosx*) SYSTEM=$VERSION;;
      esac;;
-@@ -522,9 +522,9 @@
+@@ -522,9 +522,9 @@ EOF
                esac
                for name in nsl resolv
                do
@@ -21,7 +21,7 @@
 +                  for lib in /usr/lib64 /usr/lib64/* /usr/lib /usr/lib/* /lib /lib/*
                    do
 -                      test -e $lib/lib$name.a -o -e $lib/lib$name.so && {
-+                      test -e $PKG_BUILD_DIR/$lib/lib$name.a -o -e $PKG_BUILD_DIR/$lib/lib$name.so && {
++                      test -e $STAGING_DIR/$lib/lib$name.a -o -e $STAGING_DIR/$lib/lib$name.so && {
                            SYSLIBS="$SYSLIBS -l$name"
                            break
                        }
diff --git a/multimedia/tvheadend/Config.in b/multimedia/tvheadend/Config.in
new file mode 100644 (file)
index 0000000..61a3774
--- /dev/null
@@ -0,0 +1,17 @@
+config TVHEADEND_CWC_SUPPORT
+       bool "NewCamd support"
+       default y
+
+config TVHEADEND_LINUXDVB_SUPPORT
+       bool "Linux DVB support"
+       default y
+
+config TVHEADEND_DVBSCAN_SUPPORT
+       bool "Fetch DVB-scan data"
+       depends on TVHEADEND_LINUXDVB_SUPPORT
+       default TVHEADEND_LINUXDVB_SUPPORT
+
+config TVHEADEND_AVAHI_SUPPORT
+       bool "Avahi client support"
+       select PACKAGE_libavahi-client
+       default n
diff --git a/multimedia/tvheadend/Makefile b/multimedia/tvheadend/Makefile
new file mode 100644 (file)
index 0000000..3495783
--- /dev/null
@@ -0,0 +1,97 @@
+#
+# Copyright (C) 2015 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:=tvheadend
+PKG_VERSION:=4.0.5
+PKG_RELEASE:=1
+
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)
+PKG_SOURCE_VERSION:=v$(PKG_VERSION)
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL:=https://github.com/tvheadend/tvheadend.git
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
+
+PKG_LICENSE:=GPL-3.0
+PKG_LICENSE_FILES:=LICENSE.md
+
+PKG_FIXUP:=autoreconf
+
+PKG_USE_MIPS16:=0
+
+include $(INCLUDE_DIR)/package.mk
+include $(INCLUDE_DIR)/nls.mk
+
+define Package/tvheadend
+  SECTION:=multimedia
+  CATEGORY:=Multimedia
+  TITLE:=Tvheadend is a TV streaming server for Linux
+  DEPENDS:=+libopenssl +librt +zlib +TVHEADEND_AVAHI_SUPPORT:libavahi-client
+  URL:=https://tvheadend.org
+  MAINTAINER:=Jan ÄŒermák <jan.cermak@nic.cz>
+endef
+
+define Package/tvheadend/description
+  Tvheadend is a TV streaming server and recorder for Linux, FreeBSD and Android
+  supporting DVB-S, DVB-S2, DVB-C, DVB-T, ATSC, IPTV, SAT>IP and HDHomeRun as input sources.
+
+  Tvheadend offers the HTTP (VLC, MPlayer), HTSP (Kodi, Movian) and SAT>IP streaming.
+endef
+
+define Package/tvheadend/config
+  menu "Configuration"
+  depends on PACKAGE_tvheadend
+  source "$(SOURCE)/Config.in"
+  endmenu
+endef
+
+ifeq ($(CONFIG_TVHEADEND_CWC_SUPPORT),)
+  CONFIGURE_ARGS += --disable-cwc
+endif
+
+ifeq ($(CONFIG_TVHEADEND_LINUXDVB_SUPPORT),)
+  CONFIGURE_ARGS += --disable-linuxdvb
+endif
+
+ifeq ($(CONFIG_TVHEADEND_DVBSCAN_SUPPORT),)
+  CONFIGURE_ARGS += --disable-dvbscan
+endif
+
+ifeq ($(CONFIG_TVHEADEND_AVAHI_SUPPORT),)
+  CONFIGURE_ARGS += --disable-avahi
+else
+  CONFIGURE_ARGS += --enable-avahi
+endif
+
+CONFIGURE_ARGS += \
+       --arch=$(ARCH) \
+       --disable-dbus_1 \
+       --disable-libav \
+       --enable-bundle
+
+define Build/Prepare
+       $(call Build/Prepare/Default)
+       echo 'Tvheadend $(shell echo $(PKG_SOURCE_VERSION) | sed "s/^v//")~openwrt$(PKG_RELEASE)' \
+               > $(PKG_BUILD_DIR)/debian/changelog
+endef
+
+define Package/conffiles
+/etc/config/tvheadend
+endef
+
+define Package/tvheadend/install
+       $(INSTALL_DIR) $(1)/etc/init.d
+       $(INSTALL_BIN) ./files/tvheadend.init $(1)/etc/init.d/tvheadend
+       $(INSTALL_DIR) $(1)/etc/config
+
+       $(INSTALL_DIR) $(1)/usr/bin
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/build.linux/tvheadend $(1)/usr/bin/
+endef
+
+$(eval $(call BuildPackage,tvheadend))
diff --git a/multimedia/tvheadend/files/tvheadend.config b/multimedia/tvheadend/files/tvheadend.config
new file mode 100644 (file)
index 0000000..62c139d
--- /dev/null
@@ -0,0 +1,13 @@
+#config tvheadend service
+#       option nosyslog '0'
+#       option use_temp_epgdb '0'
+#       option config_path '/etc/tvheadend'
+
+config tvheadend server
+       option ipv6 '1'
+#       option bindaddr '0.0.0.0'
+#       option http_port '9981'
+#       option http_root '/tvheadend'
+#       option htsp_port '9982'
+#       option htsp_port2 '9983'
+#       option xspf '0'
diff --git a/multimedia/tvheadend/files/tvheadend.init b/multimedia/tvheadend/files/tvheadend.init
new file mode 100644 (file)
index 0000000..31702e1
--- /dev/null
@@ -0,0 +1,71 @@
+#!/bin/sh /etc/rc.common
+
+START=99
+STOP=00
+
+USE_PROCD=1
+PROG=/usr/bin/tvheadend
+
+TEMP_CONFIG=/tmp/tvheadend
+PERSISTENT_CONFIG=/etc/tvheadend
+
+execute_first_run() {
+       "$PROG" -c "$1" -B -C -A >/dev/null 2>&1
+}
+
+ensure_config_exists() {
+       local config_path
+
+       config_load tvheadend
+       config_get config_path service config_path
+
+       if [ -z "$config_path" ]; then
+               [ -d "$PERSISTENT_CONFIG" ] || execute_first_run "$PERSISTENT_CONFIG"
+       else
+               # if the configuration directory is empty, empty config with grant-all ACL is created
+               [ -d "$config_path" ] && [ "$(ls -A $config_path)" ] || execute_first_run "$config_path"
+       fi
+
+       # if use_temp_epgdb is enabled (default), most of the config is put to config_path
+       # (or /etc/config), except for epgdb.v2, which grows quite large and is write-heavy,
+       # so it's put into volatile tmpfs
+       # epgdb.v2 is created and symlinked to main config dir upon each start (if it doesn't exist)
+       config_get_bool use_temp_epgdb service use_temp_epgdb 1
+       if [ "$use_temp_epgdb" == "1" ]; then
+               TEMP_EPG="${TEMP_CONFIG}/epgdb.v2"
+               [ ! -f "$TEMP_EPG" ] && mkdir -p "$TEMP_CONFIG" && touch "$TEMP_EPG" && chmod 700 "$TEMP_EPG"
+               [ -z "$config_path" ] && config_path="$PERSISTENT_CONFIG"
+               ln -sf "$TEMP_EPG" "${config_path}/epgdb.v2"
+       fi
+}
+
+load_uci_config() {
+       config_load tvheadend
+       config_get config_path service config_path "$PERSISTENT_CONFIG"
+       [ -n "$config_path" ] && procd_append_param command -c "$config_path"
+       config_get_bool nosyslog service nosyslog 0
+       [ "$nosyslog" -eq 1 ] && procd_append_param command --nosyslog
+       config_get_bool ipv6 server ipv6 0
+       [ "$ipv6" -eq 1 ] && procd_append_param command --ipv6
+       config_get bindaddr server bindaddr
+       [ -n "$bindaddr" ] && procd_append_param command --bindaddr "$bindaddr"
+       config_get http_port server http_port
+       [ -n "$http_port" ] && procd_append_param command --http_port "$http_port"
+       config_get http_root server http_root
+       [ -n "$http_root" ] && procd_append_param command --http_root "$http_root"
+       config_get htsp_port server htsp_port
+       [ -n "$htsp_port" ] && procd_append_param command --htsp_port "$htsp_port"
+       config_get htsp_port2 server htsp_port2
+       [ -n "$htsp_port2" ] && procd_append_param command --htsp_port "$htsp_port2"
+       config_get xspf server xspf 0
+       [ "$xspf" -eq 1 ] && procd_append_param command --xspf
+}
+
+start_service() {
+       ensure_config_exists
+       procd_open_instance
+       procd_set_param file /etc/config/tvheadend
+       procd_set_param command "$PROG" -B
+       load_uci_config
+       procd_close_instance
+}
index 609206324ddb1cb470306565e6f38fe7216ccf56..0725f5934cf9705af24aceda10ed21b44f0974b2 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2006-2008 OpenWrt.org
+# Copyright (C) 2006-2015 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
 PKG_NAME:=ctorrent-svn
 PKG_REV:=322
 PKG_VERSION:=r$(PKG_REV)
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://svn.code.sf.net/p/dtorrent/code/dtorrent/trunk
diff --git a/net/ctorrent-svn/patches/400-musl-compat.patch b/net/ctorrent-svn/patches/400-musl-compat.patch
new file mode 100644 (file)
index 0000000..e17c147
--- /dev/null
@@ -0,0 +1,10 @@
+--- a/compat.c
++++ b/compat.c
+@@ -51,6 +51,7 @@ int snprintf(char *str, size_t size, con
+ #ifndef HAVE_STRNSTR
+ #include <string.h>
++#include <sys/types.h>
+ /* FUNCTION PROGRAMER: Siberiaic Sang */
+ char *strnstr(const char *haystack, const char *needle, size_t haystacklen)
+ {
index 96de63c22eda34f9271dfd4bb821abae624083ea..f11d26a234772e9fb50976a51b894b8d3daf58ec 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=davfs2
 PKG_VERSION:=1.5.2
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://download.savannah.gnu.org/releases/davfs2/
diff --git a/net/davfs2/patches/100-musl-compat.patch b/net/davfs2/patches/100-musl-compat.patch
new file mode 100644 (file)
index 0000000..e819cbc
--- /dev/null
@@ -0,0 +1,194 @@
+--- a/configure.ac
++++ b/configure.ac
+@@ -42,7 +42,7 @@ DAV_CHECK_NEON
+ # Checks for header files.
+ AC_HEADER_DIRENT
+ AC_HEADER_STDC
+-AC_CHECK_HEADERS([fcntl.h libintl.h langinfo.h limits.h locale.h mntent.h stddef.h stdint.h stdlib.h string.h sys/file.h sys/mount.h sys/time.h syslog.h termios.h unistd.h utime.h])
++AC_CHECK_HEADERS([error.h fcntl.h libintl.h langinfo.h limits.h locale.h mntent.h stddef.h stdint.h stdlib.h string.h sys/file.h sys/mount.h sys/time.h sys/select.h sys/types.h syslog.h termios.h unistd.h utime.h])
+ # Checks for typedefs, structures, and compiler characteristics.
+ AC_C_CONST
+@@ -78,7 +78,7 @@ AC_FUNC_SELECT_ARGTYPES
+ AC_FUNC_STRFTIME
+ AC_FUNC_STAT
+ AC_FUNC_UTIME_NULL
+-AC_CHECK_FUNCS([endpwent ftruncate getmntent memset mkdir nl_langinfo rpmatch select setlocale strcasecmp strchr strdup strerror strpbrk strrchr strstr strtol strtoull utime])
++AC_CHECK_FUNCS([endpwent ftruncate getmntent memset mkdir nl_langinfo rpmatch select setlocale strcasecmp strchr strdup strerror strpbrk strrchr strstr strtol strtoull utime canonicalize_file_name fopencookie])
+ # Misc.
+ DAV_DEFAULTS
+--- a/src/cache.c
++++ b/src/cache.c
+@@ -19,12 +19,12 @@
+ #include "config.h"
++#include "compat.h"
+ #ifdef HAVE_DIRENT_H
+ #include <dirent.h>
+ #endif
+ #include <errno.h>
+-#include <error.h>
+ #ifdef HAVE_FCNTL_H
+ #include <fcntl.h>
+ #endif
+--- a/src/dav_fuse.c
++++ b/src/dav_fuse.c
+@@ -47,6 +47,9 @@
+ #ifdef HAVE_SYS_STAT_H
+ #include <sys/stat.h>
+ #endif
++#ifdef HAVE_SYS_SELECT_H
++#include <sys/select.h>
++#endif
+ #include "defaults.h"
+ #include "mount_davfs.h"
+--- a/src/kernel_interface.c
++++ b/src/kernel_interface.c
+@@ -19,8 +19,8 @@
+ #include "config.h"
++#include "compat.h"
+-#include <error.h>
+ #ifdef HAVE_FCNTL_H
+ #include <fcntl.h>
+ #endif
+@@ -51,6 +51,9 @@
+ #ifdef HAVE_SYS_STAT_H
+ #include <sys/stat.h>
+ #endif
++#ifdef HAVE_SYS_TYPES_H
++#include <sys/types.h>
++#endif
+ #include <sys/wait.h>
+ #include "defaults.h"
+--- a/src/mount_davfs.c
++++ b/src/mount_davfs.c
+@@ -19,10 +19,10 @@
+ #include "config.h"
++#include "compat.h"
+ #include <ctype.h>
+ #include <errno.h>
+-#include <error.h>
+ #ifdef HAVE_FCNTL_H
+ #include <fcntl.h>
+ #endif
+--- a/src/umount_davfs.c
++++ b/src/umount_davfs.c
+@@ -19,8 +19,8 @@
+ #include "config.h"
++#include "compat.h"
+-#include <error.h>
+ #include <errno.h>
+ #include <getopt.h>
+ #ifdef HAVE_LIBINTL_H
+--- a/src/webdav.c
++++ b/src/webdav.c
+@@ -19,9 +19,9 @@
+ #include "config.h"
++#include "compat.h"
+ #include <errno.h>
+-#include <error.h>
+ #ifdef HAVE_FCNTL_H
+ #include <fcntl.h>
+ #endif
+@@ -368,6 +368,7 @@ dav_init_webdav(const dav_args *args)
+         error(EXIT_FAILURE, errno, _("socket library initialization failed"));
+     if (args->neon_debug & ~NE_DBG_HTTPPLAIN) {
++#ifdef HAVE_FOPENCOOKIE
+         char *buf = malloc(log_bufsize);
+         cookie_io_functions_t *log_func = malloc(sizeof(cookie_io_functions_t));
+         if (!log_func) abort();
+@@ -380,6 +381,9 @@ dav_init_webdav(const dav_args *args)
+             error(EXIT_FAILURE, errno,
+                   _("can't open stream to log neon-messages"));
+         ne_debug_init(log_stream, args->neon_debug);
++#else
++      error(EXIT_FAILURE, 0, "neon debugging unsupported");
++#endif
+     }
+     session = ne_session_create(args->scheme, args->host, args->port);
+--- /dev/null
++++ b/src/compat.h
+@@ -0,0 +1,64 @@
++#ifndef _COMPAT_H
++#define _COMPAT_H
++
++#ifndef _PATH_MOUNTED
++# define _PATH_MOUNTED "/proc/mounts"
++#endif
++
++#ifndef _PATH_MNTTAB
++# define _PATH_MNTTAB "/etc/fstab"
++#endif
++
++#ifdef HAVE_ERROR_H
++# include <error.h>
++#else
++# include <stdio.h>
++# include <stdarg.h>
++# include <stdlib.h>
++# include <string.h>
++static void error_at_line(int status, int errnum, const char *filename,
++                          unsigned int linenum, const char *format, ...)
++{
++      va_list ap;
++
++      fflush(stdout);
++
++      if (filename != NULL)
++              fprintf(stderr, "%s:%u: ", filename, linenum);
++
++      va_start(ap, format);
++      vfprintf(stderr, format, ap);
++      va_end(ap);
++
++      if (errnum != 0)
++              fprintf(stderr, ": %s", strerror(errnum));
++
++      fprintf(stderr, "\n");
++
++      if (status != 0)
++              exit(status);
++}
++
++#define error(status, errnum, format...) \
++      error_at_line(status, errnum, NULL, 0, format)
++
++#endif /* HAVE_ERROR_H */
++
++#ifndef HAVE_CANONICALIZE_FILE_NAME
++#include <limits.h>
++#include <string.h>
++#include <stdlib.h>
++static char * canonicalize_file_name(const char *path)
++{
++      char buf[PATH_MAX] = { };
++
++      snprintf(buf, sizeof(buf) - 1, "%s", path);
++
++      if (!realpath(path, buf))
++              return NULL;
++
++      return strdup(buf);
++}
++#endif
++
++#endif /* _COMPAT_H */
old mode 100644 (file)
new mode 100755 (executable)
index ba04fb5..1ca4756
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 PKG_NAME:=ddns-scripts
 # Version == major.minor.patch
 # increase on new functionality (minor) or patches (patch)
-PKG_VERSION:=2.4.2
+PKG_VERSION:=2.4.3
 # Release == build
 # increase on changes of services files or tld_names.dat
 PKG_RELEASE:=1
index 0023f88f05198c6a083e5b21641f7b1efd4eea1c..cb0db9ac3886b7d866f8c390b177fb3d19d565a7 100755 (executable)
@@ -486,8 +486,8 @@ verify_host_port() {
                        __IPV4=$(cat $DATFILE | awk -F "address " '/has address/ {print $2; exit}' )
                        __IPV6=$(cat $DATFILE | awk -F "address " '/has IPv6/ {print $2; exit}' )
                else    # use BusyBox nslookup
-                       __IPV4=$(cat $DATFILE | sed -ne "3,\$ { s/^Address[0-9 ]\{0,\}: \($IPV4_REGEX\).*$/\\1/p }")
-                       __IPV6=$(cat $DATFILE | sed -ne "3,\$ { s/^Address[0-9 ]\{0,\}: \($IPV6_REGEX\).*$/\\1/p }")
+                       __IPV4=$(cat $DATFILE | sed -ne "/^Name:/,\$ { s/^Address[0-9 ]\{0,\}: \($IPV4_REGEX\).*$/\\1/p }")
+                       __IPV6=$(cat $DATFILE | sed -ne "/^Name:/,\$ { s/^Address[0-9 ]\{0,\}: \($IPV6_REGEX\).*$/\\1/p }")
                fi
        }
 
@@ -966,7 +966,7 @@ get_registered_ip() {
                        if [ "$__PROG" = "BIND host" ]; then
                                __DATA=$(cat $DATFILE | awk -F "address " '/has/ {print $2; exit}' )
                        else
-                               __DATA=$(cat $DATFILE | sed -ne "3,\$ { s/^Address[0-9 ]\{0,\}: \($__REGEX\).*$/\\1/p }" )
+                               __DATA=$(cat $DATFILE | sed -ne "/^Name:/,\$ { s/^Address[0-9 ]\{0,\}: \($__REGEX\).*$/\\1/p }" )
                        fi
                        [ -n "$__DATA" ] && {
                                write_log 7 "Registered IP '$__DATA' detected"
index 32a872185b82a40467f134baac40d78125650ec4..6439e92dc9251f03435e265919c80325e589c0c6 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=dnscrypt-proxy
 PKG_VERSION:=1.5.0
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://download.dnscrypt.org/dnscrypt-proxy
index d0dbc2d003a71dd7c5d47cfaab976a142b1132a7..63e0e86b72341fc3dcd7d4b75b7ceedd37a6858d 100644 (file)
@@ -3,3 +3,4 @@ config dnscrypt-proxy
        option port '5353'
        # option resolver 'opendns'
        # option resolvers_list '/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv'
+       # option ephemeral_keys '1'
index 24f29ae2cd3ed4828435b6c83d06aa0128761e92..7c9f58db4b024a8db3231959dbec84ccb31882fd 100644 (file)
@@ -8,12 +8,14 @@ start_instance () {
        config_get port            "$section" 'port'
        config_get resolver        "$section" 'resolver'
        config_get resolvers_list  "$section" 'resolvers_list'
+       config_get_bool ephemeral_keys "$section" 'ephemeral_keys'
 
        service_start /usr/sbin/dnscrypt-proxy -d \
                -a ${address}:${port} \
                -u nobody \
                -L ${resolvers_list:-'/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv'} \
-               -R ${resolver:-'opendns'}
+               -R ${resolver:-'opendns'} \
+               ${ephemeral_keys:+'-E'}
 }
 
 start() {
diff --git a/net/esniper/Makefile b/net/esniper/Makefile
new file mode 100644 (file)
index 0000000..9607d76
--- /dev/null
@@ -0,0 +1,42 @@
+#
+# Copyright (C) 2015 Thomas Weißschuh
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=esniper
+PKG_VERSION:=2.31.0
+PKG_RELEASE:=1
+PKG_LICENSE:=BSD-2-Clause
+PKG_LICENSE_FILES:=COPYING
+PKG_MAINTAINER:=Thomas Weißschuh <openwrt@t-8ch.de>
+
+VERSION_TRANSFORMED:=$(subst .,-,$(PKG_VERSION))
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(VERSION_TRANSFORMED)
+PKG_SOURCE:=$(PKG_NAME)-$(VERSION_TRANSFORMED).tgz
+PKG_SOURCE_URL:=@SF/$(PKG_NAME)
+PKG_MD5SUM:=4b411588c4a223acef7333ab684c7618
+
+PKG_BUILD_PARALLEL:=1
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/esniper
+  SECTION:=net
+  CATEGORY:=Network
+  TITLE:=Simple, lightweight tool for sniping eBay auctions
+  URL:=http://esniper.sourceforge.net/
+  DEPENDS:=+libcurl +ca-certificates
+endef
+
+define Package/esniper/install
+       $(INSTALL_DIR) $(1)/usr/bin
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/esniper $(1)/usr/bin/
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/frontends/snipe $(1)/usr/bin/
+endef
+
+$(eval $(call BuildPackage,esniper))
index 7343adc0dc00dc4a50c7973bf3be69254426ac48..4d05e3dab0ec49d6ad297e546fc2be7bd5f5e232 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2007-2011 OpenWrt.org
+# Copyright (C) 2007-2015 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:=etherwake
 PKG_VERSION:=1.09
-PKG_RELEASE:=3
+PKG_RELEASE:=4
 
 PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).orig.tar.gz
 PKG_SOURCE_URL:=http://ftp.debian.org/debian/pool/main/e/etherwake
diff --git a/net/etherwake/patches/120-musl-compat.patch b/net/etherwake/patches/120-musl-compat.patch
new file mode 100644 (file)
index 0000000..a2cdfba
--- /dev/null
@@ -0,0 +1,17 @@
+--- a/ether-wake.c
++++ b/ether-wake.c
+@@ -82,14 +82,8 @@ static char usage_msg[] =
+ #include <linux/if.h>
+ #include <features.h>
+-#if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1
+ #include <netpacket/packet.h>
+ #include <net/ethernet.h>
+-#else
+-#include <asm/types.h>
+-#include <linux/if_packet.h>
+-#include <linux/if_ether.h>
+-#endif
+ #include <netdb.h>
+ #include <netinet/ether.h>
index 99baa0d7c9a6f32aa2c94d325afd531784845782..2e76e6244aec005aa982b66e953fbbb07be0830d 100644 (file)
@@ -8,14 +8,11 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=gnunet
-PKG_SOURCE_VERSION:=35963
+PKG_SOURCE_VERSION:=36060
 PKG_VERSION:=0.10.1-svn$(PKG_SOURCE_VERSION)
 PKG_RELEASE:=2
 
 # ToDo:
-#  - break-out transports
-#    -> get rid of microhttpd and gnurl dependency for gns and vpn
-#       requires upstream to split config files
 #  - break-out {peer,name,data}store for each backend
 #  - package testing stuff
 
@@ -74,8 +71,8 @@ define Package/gnunet/description
  well as many missing features in this release.
 
  This package provides the core components of GNUnet including the
- CADET routing engine, a DHT implementation and most transports as well
- as their helpers.
+ CADET routing engine, a DHT implementation and basic transports as
well as their helpers.
 endef
 
 define BuildComponent
@@ -144,9 +141,7 @@ define Package/gnunet/install
        done )
 
        ( for plug in ats_proportional block_dht block_regex datacache_heap  \
-           transport_http_client transport_http_server \
-           transport_https_client transport_https_server \
-           transport_tcp transport_udp transport_unix transport_wlan; do \
+           transport_tcp transport_udp transport_unix; do \
                $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/gnunet/libgnunet_plugin_$$$$plug*.so $(1)/usr/lib/gnunet ; \
        done )
 
@@ -185,6 +180,15 @@ PLUGIN_conversation:=gnsrecord_conversation
 LIBEXEC_conversation:=helper-audio-playback helper-audio-record
 CONF_conversation:=conversation
 
+DEPENDS_transport-http_client:=+libgnurl
+PLUGIN_transport-http_client:=transport_http_client transport_https_client
+
+DEPENDS_transport-http_server:=+libmicrohttpd
+PLUGIN_transport-http_server:=transport_http_server transport_https_server
+
+PLUGIN_transport-wifi:=transport_wlan
+LIBEXEC_transport-wifi:=helper-transport-wlan
+
 DEPENDS_experiments:=+libglpk
 PLUGIN_experiments:=ats_mlp ats_ril
 
@@ -192,7 +196,7 @@ DEPENDS_fs:=+gnunet-datastore +libextractor
 BIN_fs:=auto-share directory download download-manager.scm fs publish unindex search
 LIB_fs:=fs
 PLUGIN_fs:=block_fs
-LIB_EXEC_fs:=helper-fs-publish service-fs
+LIBEXEC_fs:=helper-fs-publish service-fs
 CONF_fs:=fs
 
 DEPENDS_gns:=+gnunet-vpn
@@ -206,7 +210,7 @@ CONF_gns:=dns gns namecache namestore resolver
 DEPENDS_datastore:=+gnunet-gns +libsqlite3
 BIN_datastore:=datastore
 LIB_datastore:=datastore
-PLUGIN_datastore:=datacache_sqlite datastore_heap datastore_sqlite namecache_sqlite namestore_sqlite peerstore_sqlite
+PLUGIN_datastore:=datastore_heap
 LIBEXEC_datastore:=daemon-latency-logger service-datastore
 CONF_datastore:=datastore
 
@@ -226,9 +230,10 @@ PLUGIN_transport-bluetooth:=transport_bluetooth
 LIBEXEC_transport-bluetooth:=helper-transport-bluetooth
 
 DEPENDS_utils:=+certtool +openssl-util
-BIN_utils:=config gns-import.sh gns-proxy-setup-ca transport-certificate-creation
+BIN_utils:=gns-proxy-setup-ca transport-certificate-creation
 
 DEPENDS_vpn:=+kmod-tun
+BIN_vpn:=vpn
 LIB_vpn:=tun vpn
 LIBEXEC_vpn:=daemon-exit daemon-pt helper-exit helper-vpn service-vpn
 CONF_vpn:=exit pt vpn
@@ -240,6 +245,9 @@ $(eval $(call BuildComponent,fs,file-sharing components,))
 $(eval $(call BuildComponent,gns,name resolution components,y))
 $(eval $(call BuildComponent,datastore,storage components,))
 $(eval $(call BuildComponent,transport-bluetooth,bluetooth transport,))
+$(eval $(call BuildComponent,transport-http_client,HTTP/HTTPS client transport,y))
+$(eval $(call BuildComponent,transport-http_server,HTTP/HTTPS server transport,))
+$(eval $(call BuildComponent,transport-wlan,WLAN transport,))
 $(eval $(call BuildComponent,utils,administration utililties,))
 $(eval $(call BuildComponent,vpn,vpn components,y))
 $(eval $(call BuildComponent,mysql,mySQL datastore backend,))
index 66e2600d419e677c737e21bdfbcb59b66ae81cc5..6e12030a3e3a8841376ecab8b4e1e25225c4d204 100644 (file)
@@ -8,6 +8,7 @@ USE_PROCD=1
 PROG=/usr/lib/gnunet/libexec/gnunet-service-arm
 
 GNUNET_HOME=/var/run/gnunet
+LOGFILE=$GNUNET_HOME/gnunet.log
 CONFIGFILE=$GNUNET_HOME/gnunet.conf
 SUID_ROOT_HELPERS="exit nat-server nat-client transport-bluetooth transport-wlan vpn"
 
@@ -37,10 +38,38 @@ prepare_config() {
        touch $CONFIGFILE
        chown root:gnunet $CONFIGFILE
        chmod 0640 $CONFIGFILE
-       gnunet-config -c /tmp/run/gnunet/gnunet.conf -s PATHS -o GNUNET_HOME -V $GNUNET_HOME
-       defaultservices=$( gnunet-config -c /tmp/run/gnunet/gnunet.conf -s arm -o DEFAULTSERVICES )
-       defaultservices="$defaultservices gns2dns"
-       gnunet-config -c /tmp/run/gnunet/gnunet.conf -s arm -o DEFAULTSERVICES -V "$defaultservices"
+       gnunet-config -c $CONFIGFILE -s PATHS -o GNUNET_HOME -V $GNUNET_HOME
+
+       # minimal persistency in /etc/gnunet
+       [ ! -d /etc/gnunet ] && {
+               mkdir -p /etc/gnunet
+               chown gnunet:gnunet /etc/gnunet
+       }
+       gnunet-config -c $CONFIGFILE -s PATHS -o GNUNET_CONFIG_HOME -V /etc/gnunet
+       gnunet-config -c $CONFIGFILE -s PEER -o PRIVATE_KEY -V /etc/gnunet/private_key.ecc
+       gnunet-config -c $CONFIGFILE -s identity -o EGODIR -V /etc/gnunet/identity/egos
+       gnunet-config -c $CONFIGFILE -s revocation -o DATABASE -V /etc/gnunet/revocation.dat
+       gnunet-config -c $CONFIGFILE -s nse -o PROOFFILE -V /etc/gnunet/proof.dat
+       gnunet-config -c $CONFIGFILE -s namestore-sqlite -o FILENAME -V /etc/gnunet/namestore.sqlite
+
+       # minimal datastore (todo: make this configurable)
+       gnunet-config -c $CONFIGFILE -s datastore -o QUOTA -V "4 MB"
+
+       # limit dhtcache memory usage to 4 MB
+       gnunet-config -c $CONFIGFILE -s dhtcache -o QUOTA -V "4 MB"
+
+       # enable dns2gns
+       gnunet-config -c $CONFIGFILE -s dns2gns -o AUTOSTART -V YES
+
+       # enable all installed transport plugins
+       transport_plugins=$(gnunet-config -c $CONFIGFILE -s transport -o PLUGINS)
+       for transplug in /usr/lib/gnunet/libgnunet_plugin_transport_*.so; do
+               transplug=$( echo $transplug |
+                       sed -ne 's!^.*_transport_\(.*\)\.so$!\1!p' )
+               [ -n "$( echo $transport_plugins | grep $transplug )" ] ||
+                       transport_plugins="$transport_plugins $transplug"
+       done
+       gnunet-config -c $CONFIGFILE -s transport -o PLUGINS -V "$transport_plugins"
 }
 
 start_service() {
@@ -49,7 +78,7 @@ start_service() {
 
        procd_open_instance
        procd_set_param user gnunet
-       procd_set_param command $PROG -c $CONFIGFILE
+       procd_set_param command $PROG -c $CONFIGFILE -l $LOGFILE
        procd_set_param respawn
        procd_close_instance
 }
index e1415de219a07343b8d264654188b2321d3ea2d6..c63b1ffbb400b0e61287ee33cb50b8b79b5e2d40 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=gnurl
 PKG_VERSION:=7.40.0
-PKG_RELEASE:=3
+PKG_RELEASE:=5
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_URL:=https://gnunet.org/sites/default/files
@@ -53,6 +53,7 @@ CONFIGURE_ARGS += \
        --with-gnutls="$(STAGING_DIR)/usr" \
        --with-libidn="$(STAGING_DIR)/usr" \
        --with-zlib="$(STAGING_DIR)/usr" \
+       --with-ca-path="/etc/ssl/certs/" \
        --enable-shared \
        --enable-static \
        --without-axtls \
diff --git a/net/gnurl/patches/010-backport-gtls-add-support-for-CURLOPT_CAPATH.patch b/net/gnurl/patches/010-backport-gtls-add-support-for-CURLOPT_CAPATH.patch
new file mode 100644 (file)
index 0000000..37d862f
--- /dev/null
@@ -0,0 +1,100 @@
+From 5a1614cecdd57cab8b4ae3e9bc19dfff5ba77e80 Mon Sep 17 00:00:00 2001
+From: Alessandro Ghedini <alessandro@ghedini.me>
+Date: Sun, 8 Mar 2015 20:11:06 +0100
+Subject: [PATCH] gtls: add support for CURLOPT_CAPATH
+
+---
+ acinclude.m4                       |  4 ++--
+ docs/libcurl/opts/CURLOPT_CAPATH.3 |  5 ++---
+ lib/vtls/gtls.c                    | 22 ++++++++++++++++++++++
+ lib/vtls/gtls.h                    |  3 +++
+ 4 files changed, 29 insertions(+), 5 deletions(-)
+
+diff --git a/acinclude.m4 b/acinclude.m4
+index 6ed7ffb..ca01869 100644
+--- a/acinclude.m4
++++ b/acinclude.m4
+@@ -2615,8 +2615,8 @@ AC_HELP_STRING([--without-ca-path], [Don't use a default CA path]),
+     capath="no"
+   elif test "x$want_capath" != "xno" -a "x$want_capath" != "xunset"; then
+     dnl --with-ca-path given
+-    if test "x$OPENSSL_ENABLED" != "x1" -a "x$POLARSSL_ENABLED" != "x1"; then
+-      AC_MSG_ERROR([--with-ca-path only works with openSSL or PolarSSL])
++    if test "x$OPENSSL_ENABLED" != "x1" -a "x$GNUTLS_ENABLED" != "x1" -a "x$POLARSSL_ENABLED" != "x1"; then
++      AC_MSG_ERROR([--with-ca-path only works with OpenSSL, GnuTLS or PolarSSL])
+     fi
+     capath="$want_capath"
+     ca="no"
+diff --git a/docs/libcurl/opts/CURLOPT_CAPATH.3 b/docs/libcurl/opts/CURLOPT_CAPATH.3
+index 642953d..6695f9f 100644
+--- a/docs/libcurl/opts/CURLOPT_CAPATH.3
++++ b/docs/libcurl/opts/CURLOPT_CAPATH.3
+@@ -43,9 +43,8 @@ All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc.
+ .SH EXAMPLE
+ TODO
+ .SH AVAILABILITY
+-This option is OpenSSL-specific and does nothing if libcurl is built to use
+-GnuTLS. NSS-powered libcurl provides the option only for backward
+-compatibility.
++This option is supported by the OpenSSL, GnuTLS and PolarSSL backends. The NSS
++backend provides the option only for backward compatibility.
+ .SH RETURN VALUE
+ Returns CURLE_OK if TLS enabled, and CURLE_UNKNOWN_OPTION if not, or
+ CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+diff --git a/lib/vtls/gtls.c b/lib/vtls/gtls.c
+index 05aef19..c792540 100644
+--- a/lib/vtls/gtls.c
++++ b/lib/vtls/gtls.c
+@@ -97,6 +97,10 @@ static bool gtls_inited = FALSE;
+ #  if (GNUTLS_VERSION_NUMBER >= 0x03020d)
+ #    define HAS_OCSP
+ #  endif
++
++#  if (GNUTLS_VERSION_NUMBER >= 0x030306)
++#    define HAS_CAPATH
++#  endif
+ #endif
+ #ifdef HAS_OCSP
+@@ -462,6 +466,24 @@ gtls_connect_step1(struct connectdata *conn,
+             rc, data->set.ssl.CAfile);
+   }
++#ifdef HAS_CAPATH
++  if(data->set.ssl.CApath) {
++    /* set the trusted CA cert directory */
++    rc = gnutls_certificate_set_x509_trust_dir(conn->ssl[sockindex].cred,
++                                                data->set.ssl.CApath,
++                                                GNUTLS_X509_FMT_PEM);
++    if(rc < 0) {
++      infof(data, "error reading ca cert file %s (%s)\n",
++            data->set.ssl.CAfile, gnutls_strerror(rc));
++      if(data->set.ssl.verifypeer)
++        return CURLE_SSL_CACERT_BADFILE;
++    }
++    else
++      infof(data, "found %d certificates in %s\n",
++            rc, data->set.ssl.CApath);
++  }
++#endif
++
+   if(data->set.ssl.CRLfile) {
+     /* set the CRL list file */
+     rc = gnutls_certificate_set_x509_crl_file(conn->ssl[sockindex].cred,
+diff --git a/lib/vtls/gtls.h b/lib/vtls/gtls.h
+index c3867e5..af1cb5b 100644
+--- a/lib/vtls/gtls.h
++++ b/lib/vtls/gtls.h
+@@ -54,6 +54,9 @@ bool Curl_gtls_cert_status_request(void);
+ /* Set the API backend definition to GnuTLS */
+ #define CURL_SSL_BACKEND CURLSSLBACKEND_GNUTLS
++/* this backend supports the CAPATH option */
++#define have_curlssl_ca_path 1
++
+ /* API setup for GnuTLS */
+ #define curlssl_init Curl_gtls_init
+ #define curlssl_cleanup Curl_gtls_cleanup
+-- 
+2.4.4
+
index 71fa81d1dd514f9d21730ef12a80cc712e79223d..6ac8a3a634897dfe0cf531ae4e2ee96e47ec7891 100644 (file)
@@ -9,12 +9,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=haproxy
-PKG_VERSION:=1.5.12
-PKG_RELEASE:=18
+PKG_VERSION:=1.5.14
+PKG_RELEASE:=00
 PKG_SOURCE:=haproxy-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://haproxy.1wt.eu/download/1.5/src/
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
-PKG_MD5SUM:=4b94b257f16d88c315716b062b22e48a
+PKG_MD5SUM:=ad9d7262b96ba85a0f8c6acc6cb9edde
 PKG_MAINTAINER:=Thomas Heil <heil@terminal-consulting.de>
 PKG_LICENSE:=GPL-2.0
 
diff --git a/net/haproxy/patches/0001-BUG-MEDIUM-stats-properly-initialize-the-scope-befor.patch b/net/haproxy/patches/0001-BUG-MEDIUM-stats-properly-initialize-the-scope-befor.patch
deleted file mode 100644 (file)
index 4ae6c9a..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-From 0aa5899911bbc765ba16ce52a80fa76230781779 Mon Sep 17 00:00:00 2001
-From: Willy Tarreau <w@1wt.eu>
-Date: Mon, 4 May 2015 18:07:56 +0200
-Subject: [PATCH 1/2] BUG/MEDIUM: stats: properly initialize the scope before
- dumping stats
-
-Issuing a "show sess all" prior to a "show stat" on the CLI results in no
-proxy being dumped because the scope_len union member was not properly
-reinitialized.
-
-This fix must be backported into 1.5.
-(cherry picked from commit 6bcb95da5b9cb143088102b460c7bcb37c1b3d81)
----
- src/dumpstats.c | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/src/dumpstats.c b/src/dumpstats.c
-index b616478..ca084ac 100644
---- a/src/dumpstats.c
-+++ b/src/dumpstats.c
-@@ -1109,6 +1109,8 @@ static int stats_sock_parse_request(struct stream_interface *si, char *line)
-               arg++;
-       }
-+      appctx->ctx.stats.scope_str = 0;
-+      appctx->ctx.stats.scope_len = 0;
-       appctx->ctx.stats.flags = 0;
-       if (strcmp(args[0], "show") == 0) {
-               if (strcmp(args[1], "stat") == 0) {
--- 
-2.0.5
-
diff --git a/net/haproxy/patches/0002-BUG-MEDIUM-http-don-t-forward-client-shutdown-withou.patch b/net/haproxy/patches/0002-BUG-MEDIUM-http-don-t-forward-client-shutdown-withou.patch
deleted file mode 100644 (file)
index 3875b88..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-From 294e4676a3b775a7accb50eb8428f293c218b5e2 Mon Sep 17 00:00:00 2001
-From: Willy Tarreau <w@1wt.eu>
-Date: Mon, 11 May 2015 18:30:33 +0200
-Subject: [PATCH 2/2] BUG/MEDIUM: http: don't forward client shutdown without
- NOLINGER except for tunnels
-
-There's an issue related with shutting down POST transfers or closing the
-connection after the end of the upload : the shutdown is forwarded to the
-server regardless of the abortonclose option. The problem it causes is that
-during a scan, brute force or whatever, it becomes possible that all source
-ports are exhausted with all sockets in TIME_WAIT state.
-
-There are multiple issues at once in fact :
-  - no action is done for the close, it automatically happens at the lower
-    layers thanks for channel_auto_close(), so we cannot act on NOLINGER ;
-
-  - we *do* want to continue to send a clean shutdown in tunnel mode because
-    some protocols transported over HTTP may need this, regardless of option
-    abortonclose, thus we can't set the option inconditionally
-
-  - for all other modes, we do want to close the dirty way because we're
-    certain whether we've sent everything or not, and we don't want to eat
-    all source ports.
-
-The solution is a bit complex and applies to DONE/TUNNEL states :
-
-  1) disable automatic close for everything not a tunnel and not just
-     keep-alive / server-close. Force-close is now covered, as is HTTP/1.0
-     which implicitly works in force-close mode ;
-
-  2) when processing option abortonclose, we know we can disable lingering
-     if the client has closed and the connection is not in tunnel mode.
-
-Since the last case above leads to a situation where the client side reports
-an error, we know the connection will not be reused, so leaving the flag on
-the stream-interface is safe. A client closing in the middle of the data
-transmission already aborts the transaction so this case is not a problem.
-
-This fix must be backported to 1.5 where the problem was detected.
-(cherry picked from commit bbfb6c40854925367ae5f9e8b22c5c9a18dc69d5)
----
- src/proto_http.c | 14 ++++++++++----
- 1 file changed, 10 insertions(+), 4 deletions(-)
-
-diff --git a/src/proto_http.c b/src/proto_http.c
-index 0ac3a47..5db64b5 100644
---- a/src/proto_http.c
-+++ b/src/proto_http.c
-@@ -5452,9 +5452,10 @@ int http_request_forward_body(struct session *s, struct channel *req, int an_bit
-                               msg->sov -= msg->next;
-                       msg->next = 0;
--                      /* for keep-alive we don't want to forward closes on DONE */
--                      if ((txn->flags & TX_CON_WANT_MSK) == TX_CON_WANT_KAL ||
--                          (txn->flags & TX_CON_WANT_MSK) == TX_CON_WANT_SCL)
-+                      /* we don't want to forward closes on DONE except in
-+                       * tunnel mode.
-+                       */
-+                      if ((txn->flags & TX_CON_WANT_MSK) != TX_CON_WANT_TUN)
-                               channel_dont_close(req);
-                       if (http_resync_states(s)) {
-                               /* some state changes occurred, maybe the analyser
-@@ -5478,10 +5479,15 @@ int http_request_forward_body(struct session *s, struct channel *req, int an_bit
-                        * want to monitor the client's connection and forward
-                        * any shutdown notification to the server, which will
-                        * decide whether to close or to go on processing the
--                       * request.
-+                       * request. We only do that in tunnel mode, and not in
-+                       * other modes since it can be abused to exhaust source
-+                       * ports.
-                        */
-                       if (s->be->options & PR_O_ABRT_CLOSE) {
-                               channel_auto_read(req);
-+                              if ((req->flags & (CF_SHUTR|CF_READ_NULL)) &&
-+                                  ((txn->flags & TX_CON_WANT_MSK) != TX_CON_WANT_TUN))
-+                                      s->si[1].flags |= SI_FL_NOLINGER;
-                               channel_auto_close(req);
-                       }
-                       else if (s->txn.meth == HTTP_METH_POST) {
--- 
-2.0.5
-
diff --git a/net/haproxy/patches/0003-BUG-MINOR-check-fix-tcpcheck-error-message.patch b/net/haproxy/patches/0003-BUG-MINOR-check-fix-tcpcheck-error-message.patch
deleted file mode 100644 (file)
index 9bb3311..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-From 68e4fc2b9910dd090c5e729203b72444f75aaa75 Mon Sep 17 00:00:00 2001
-From: Baptiste Assmann <bedis9@gmail.com>
-Date: Fri, 1 May 2015 08:09:29 +0200
-Subject: [PATCH 3/8] BUG/MINOR: check: fix tcpcheck error message
-
-add the keyword 'string' when required (error in a tcpcheck expect
-string)
-(cherry picked from commit 96a5c9b57738c05ecce7822093b9c4118123dc1e)
----
- src/checks.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/checks.c b/src/checks.c
-index 71debb6..8b53f97 100644
---- a/src/checks.c
-+++ b/src/checks.c
-@@ -614,7 +614,7 @@ static void chk_report_conn_err(struct connection *conn, int errno_bck, int expi
-                       }
-                       else if (check->last_started_step && check->last_started_step->action == TCPCHK_ACT_EXPECT) {
-                               if (check->last_started_step->string)
--                                      chunk_appendf(chk, " (string '%s')", check->last_started_step->string);
-+                                      chunk_appendf(chk, " (expect string '%s')", check->last_started_step->string);
-                               else if (check->last_started_step->expect_regex)
-                                       chunk_appendf(chk, " (expect regex)");
-                       }
--- 
-2.0.5
-
diff --git a/net/haproxy/patches/0004-CLEANUP-checks-fix-double-usage-of-cur-current_step-.patch b/net/haproxy/patches/0004-CLEANUP-checks-fix-double-usage-of-cur-current_step-.patch
deleted file mode 100644 (file)
index 6acba4e..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
-From 4f889006269e4d3f802de46f280ed198a15e3a69 Mon Sep 17 00:00:00 2001
-From: Willy Tarreau <w@1wt.eu>
-Date: Wed, 13 May 2015 11:23:01 +0200
-Subject: [PATCH 4/8] CLEANUP: checks: fix double usage of cur / current_step
- in tcp-checks
-
-This cleanup is a preliminary requirement to the upcoming fixes for
-the bug that affect tcp-check's improper use of lists. It will have
-to be backported to 1.5 though it will not easily apply.
-
-There are two variables pointing to the current rule within the loop,
-and either one or the other is used depending on the code blocks,
-making it much harder to apply checks to fix the list walking bug.
-So first get rid of "cur" and only focus on current_step.
-(cherry picked from commit ce8c42a37a44a1e0cb94e81abb7cc2baf3d0ef80)
-
-[wt: 1.5 doesn't have comments so this patch differs significantly
- from 1.6, but it's needed for the next batch of fixes]
----
- src/checks.c | 57 ++++++++++++++++++++++++++++-----------------------------
- 1 file changed, 28 insertions(+), 29 deletions(-)
-
-diff --git a/src/checks.c b/src/checks.c
-index 8b53f97..cfdfe8c 100644
---- a/src/checks.c
-+++ b/src/checks.c
-@@ -1859,7 +1859,7 @@ static int tcpcheck_get_step_id(struct server *s)
- static void tcpcheck_main(struct connection *conn)
- {
-       char *contentptr;
--      struct tcpcheck_rule *cur, *next;
-+      struct tcpcheck_rule *next;
-       int done = 0, ret = 0;
-       struct check *check = conn->owner;
-       struct server *s = check->server;
-@@ -1916,15 +1916,11 @@ static void tcpcheck_main(struct connection *conn)
-               check->bo->o = 0;
-               check->bi->p = check->bi->data;
-               check->bi->i = 0;
--              cur = check->current_step = LIST_ELEM(head->n, struct tcpcheck_rule *, list);
-+              check->current_step = LIST_ELEM(head->n, struct tcpcheck_rule *, list);
-               t->expire = tick_add(now_ms, MS_TO_TICKS(check->inter));
-               if (s->proxy->timeout.check)
-                       t->expire = tick_add_ifset(now_ms, s->proxy->timeout.check);
-       }
--      /* keep on processing step */
--      else {
--              cur = check->current_step;
--      }
-       /* It's only the rules which will enable send/recv */
-       __conn_data_stop_both(conn);
-@@ -1934,7 +1930,7 @@ static void tcpcheck_main(struct connection *conn)
-                * or if we're about to send a string that does not fit in the remaining space.
-                */
-               if (check->bo->o &&
--                  (&cur->list == head ||
-+                  (&check->current_step->list == head ||
-                    check->current_step->action != TCPCHK_ACT_SEND ||
-                    check->current_step->string_len >= buffer_total_space(check->bo))) {
-@@ -1949,14 +1945,17 @@ static void tcpcheck_main(struct connection *conn)
-               }
-               /* did we reach the end ? If so, let's check that everything was sent */
--              if (&cur->list == head) {
-+              if (&check->current_step->list == head) {
-                       if (check->bo->o)
-                               goto out_need_io;
-                       break;
-               }
--              /* have 'next' point to the next rule or NULL if we're on the last one */
--              next = (struct tcpcheck_rule *)cur->list.n;
-+              /* have 'next' point to the next rule or NULL if we're on the
-+               * last one, connect() needs this.
-+               */
-+              next = (struct tcpcheck_rule *)check->current_step->list.n;
-+
-               if (&next->list == head)
-                       next = NULL;
-@@ -2058,8 +2057,7 @@ static void tcpcheck_main(struct connection *conn)
-                       }
-                       /* allow next rule */
--                      cur = (struct tcpcheck_rule *)cur->list.n;
--                      check->current_step = cur;
-+                      check->current_step = (struct tcpcheck_rule *)check->current_step->list.n;
-                       /* don't do anything until the connection is established */
-                       if (!(conn->flags & CO_FL_CONNECTED)) {
-@@ -2113,8 +2111,7 @@ static void tcpcheck_main(struct connection *conn)
-                       *check->bo->p = '\0'; /* to make gdb output easier to read */
-                       /* go to next rule and try to send */
--                      cur = (struct tcpcheck_rule *)cur->list.n;
--                      check->current_step = cur;
-+                      check->current_step = (struct tcpcheck_rule *)check->current_step->list.n;
-               } /* end 'send' */
-               else if (check->current_step->action == TCPCHK_ACT_EXPECT) {
-                       if (unlikely(check->result == CHK_RES_FAILED))
-@@ -2167,14 +2164,14 @@ static void tcpcheck_main(struct connection *conn)
-                               goto out_end_tcpcheck;
-                       }
--                      if (!done && (cur->string != NULL) && (check->bi->i < cur->string_len) )
-+                      if (!done && (check->current_step->string != NULL) && (check->bi->i < check->current_step->string_len) )
-                               continue; /* try to read more */
-               tcpcheck_expect:
--                      if (cur->string != NULL)
--                              ret = my_memmem(contentptr, check->bi->i, cur->string, cur->string_len) != NULL;
--                      else if (cur->expect_regex != NULL)
--                              ret = regex_exec(cur->expect_regex, contentptr);
-+                      if (check->current_step->string != NULL)
-+                              ret = my_memmem(contentptr, check->bi->i, check->current_step->string, check->current_step->string_len) != NULL;
-+                      else if (check->current_step->expect_regex != NULL)
-+                              ret = regex_exec(check->current_step->expect_regex, contentptr);
-                       if (!ret && !done)
-                               continue; /* try to read more */
-@@ -2182,11 +2179,11 @@ static void tcpcheck_main(struct connection *conn)
-                       /* matched */
-                       if (ret) {
-                               /* matched but we did not want to => ERROR */
--                              if (cur->inverse) {
-+                              if (check->current_step->inverse) {
-                                       /* we were looking for a string */
--                                      if (cur->string != NULL) {
-+                                      if (check->current_step->string != NULL) {
-                                               chunk_printf(&trash, "TCPCHK matched unwanted content '%s' at step %d",
--                                                              cur->string, tcpcheck_get_step_id(s));
-+                                                           check->current_step->string, tcpcheck_get_step_id(s));
-                                       }
-                                       else {
-                                       /* we were looking for a regex */
-@@ -2198,8 +2195,9 @@ static void tcpcheck_main(struct connection *conn)
-                               }
-                               /* matched and was supposed to => OK, next step */
-                               else {
--                                      cur = (struct tcpcheck_rule*)cur->list.n;
--                                      check->current_step = cur;
-+                                      /* allow next rule */
-+                                      check->current_step = (struct tcpcheck_rule *)check->current_step->list.n;
-+
-                                       if (check->current_step->action == TCPCHK_ACT_EXPECT)
-                                               goto tcpcheck_expect;
-                                       __conn_data_stop_recv(conn);
-@@ -2208,9 +2206,10 @@ static void tcpcheck_main(struct connection *conn)
-                       else {
-                       /* not matched */
-                               /* not matched and was not supposed to => OK, next step */
--                              if (cur->inverse) {
--                                      cur = (struct tcpcheck_rule*)cur->list.n;
--                                      check->current_step = cur;
-+                              if (check->current_step->inverse) {
-+                                      /* allow next rule */
-+                                      check->current_step = (struct tcpcheck_rule *)check->current_step->list.n;
-+
-                                       if (check->current_step->action == TCPCHK_ACT_EXPECT)
-                                               goto tcpcheck_expect;
-                                       __conn_data_stop_recv(conn);
-@@ -2218,9 +2217,9 @@ static void tcpcheck_main(struct connection *conn)
-                               /* not matched but was supposed to => ERROR */
-                               else {
-                                       /* we were looking for a string */
--                                      if (cur->string != NULL) {
-+                                      if (check->current_step->string != NULL) {
-                                               chunk_printf(&trash, "TCPCHK did not match content '%s' at step %d",
--                                                              cur->string, tcpcheck_get_step_id(s));
-+                                                           check->current_step->string, tcpcheck_get_step_id(s));
-                                       }
-                                       else {
-                                       /* we were looking for a regex */
--- 
-2.0.5
-
diff --git a/net/haproxy/patches/0005-BUG-MEDIUM-checks-do-not-dereference-head-of-a-tcp-c.patch b/net/haproxy/patches/0005-BUG-MEDIUM-checks-do-not-dereference-head-of-a-tcp-c.patch
deleted file mode 100644 (file)
index f4bc683..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-From b94a6d5a37499ce6649ad58f4a8c4664779abd8b Mon Sep 17 00:00:00 2001
-From: Willy Tarreau <w@1wt.eu>
-Date: Wed, 13 May 2015 11:38:17 +0200
-Subject: [PATCH 5/8] BUG/MEDIUM: checks: do not dereference head of a
- tcp-check at the end
-
-When the end of the list is reached, the current step's action is checked
-to know if we must poll or not. Unfortunately, the main reason for going
-there is that we walked past the end of list and current_step points to
-the head. We cannot dereference ->action since it does not belong to this
-structure and can definitely crash if the address is not mapped.
-
-This bug is unlikely to cause a crash since the action appears just after
-the list, and corresponds to the "char *check_req" pointer in the proxy
-struct, and it seems that we can't go there with current_step being null.
-At worst it can cause the check to register for recv events.
-
-This fix needs to be backported to 1.5 since the code is incorrect there
-as well.
-(cherry picked from commit 53c5a049e1f4dbf67412472e23690dc6b3c8d0f8)
----
- src/checks.c | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
-
-diff --git a/src/checks.c b/src/checks.c
-index cfdfe8c..a887be1 100644
---- a/src/checks.c
-+++ b/src/checks.c
-@@ -2237,10 +2237,12 @@ static void tcpcheck_main(struct connection *conn)
-       goto out_end_tcpcheck;
-  out_need_io:
-+      /* warning, current_step may now point to the head */
-       if (check->bo->o)
-               __conn_data_want_send(conn);
--      if (check->current_step->action == TCPCHK_ACT_EXPECT)
-+      if (&check->current_step->list != head &&
-+          check->current_step->action == TCPCHK_ACT_EXPECT)
-               __conn_data_want_recv(conn);
-       return;
-@@ -2256,7 +2258,6 @@ static void tcpcheck_main(struct connection *conn)
-               conn->flags |= CO_FL_ERROR;
-       __conn_data_stop_both(conn);
--
-       return;
- }
--- 
-2.0.5
-
diff --git a/net/haproxy/patches/0006-CLEANUP-checks-simplify-the-loop-processing-of-tcp-c.patch b/net/haproxy/patches/0006-CLEANUP-checks-simplify-the-loop-processing-of-tcp-c.patch
deleted file mode 100644 (file)
index 45ba960..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-From ebb2bceb34d7787453548627ed0e99c60354672b Mon Sep 17 00:00:00 2001
-From: Willy Tarreau <w@1wt.eu>
-Date: Wed, 13 May 2015 11:59:14 +0200
-Subject: [PATCH 6/8] CLEANUP: checks: simplify the loop processing of
- tcp-checks
-
-There is some unobvious redundancy between the various ways we can leave
-the loop. Some of them can be factored out. So now we leave the loop when
-we can't go further, whether it's caused by reaching the end of the rules
-or by a blocking I/O.
-(cherry picked from commit 263013d031d754c9f96de0d0cb5afcc011af6441)
-[wt: this patch is required for the next fix]
----
- src/checks.c | 26 ++++++++++++++------------
- 1 file changed, 14 insertions(+), 12 deletions(-)
-
-diff --git a/src/checks.c b/src/checks.c
-index a887be1..a0c42f2 100644
---- a/src/checks.c
-+++ b/src/checks.c
-@@ -1926,8 +1926,10 @@ static void tcpcheck_main(struct connection *conn)
-       __conn_data_stop_both(conn);
-       while (1) {
--              /* we have to try to flush the output buffer before reading, at the end,
--               * or if we're about to send a string that does not fit in the remaining space.
-+              /* We have to try to flush the output buffer before reading, at
-+               * the end, or if we're about to send a string that does not fit
-+               * in the remaining space. That explains why we break out of the
-+               * loop after this control.
-                */
-               if (check->bo->o &&
-                   (&check->current_step->list == head ||
-@@ -1940,16 +1942,12 @@ static void tcpcheck_main(struct connection *conn)
-                                       __conn_data_stop_both(conn);
-                                       goto out_end_tcpcheck;
-                               }
--                              goto out_need_io;
-+                              break;
-                       }
-               }
--              /* did we reach the end ? If so, let's check that everything was sent */
--              if (&check->current_step->list == head) {
--                      if (check->bo->o)
--                              goto out_need_io;
-+              if (&check->current_step->list == head)
-                       break;
--              }
-               /* have 'next' point to the next rule or NULL if we're on the
-                * last one, connect() needs this.
-@@ -2131,7 +2129,7 @@ static void tcpcheck_main(struct connection *conn)
-                                       }
-                               }
-                               else
--                                      goto out_need_io;
-+                                      break;
-                       }
-                       /* mark the step as started */
-@@ -2233,10 +2231,14 @@ static void tcpcheck_main(struct connection *conn)
-               } /* end expect */
-       } /* end loop over double chained step list */
--      set_server_check_status(check, HCHK_STATUS_L7OKD, "(tcp-check)");
--      goto out_end_tcpcheck;
-+      /* We're waiting for some I/O to complete, we've reached the end of the
-+       * rules, or both. Do what we have to do, otherwise we're done.
-+       */
-+      if (&check->current_step->list == head && !check->bo->o) {
-+              set_server_check_status(check, HCHK_STATUS_L7OKD, "(tcp-check)");
-+              goto out_end_tcpcheck;
-+      }
-- out_need_io:
-       /* warning, current_step may now point to the head */
-       if (check->bo->o)
-               __conn_data_want_send(conn);
--- 
-2.0.5
-
diff --git a/net/haproxy/patches/0007-BUG-MAJOR-checks-always-check-for-end-of-list-before.patch b/net/haproxy/patches/0007-BUG-MAJOR-checks-always-check-for-end-of-list-before.patch
deleted file mode 100644 (file)
index 7c2d562..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-From 97fccc87f1297d189ee80735e5b8746c34956eda Mon Sep 17 00:00:00 2001
-From: Willy Tarreau <w@1wt.eu>
-Date: Wed, 13 May 2015 12:08:21 +0200
-Subject: [PATCH 7/8] BUG/MAJOR: checks: always check for end of list before
- proceeding
-
-This is the most important fix of this series. There's a risk of endless
-loop and crashes caused by the fact that we go past the head of the list
-when skipping to next rule, without checking if it's still a valid element.
-Most of the time, the ->action field is checked, which points to the proxy's
-check_req pointer (generally NULL), meaning the element is confused with a
-TCPCHK_ACT_SEND action.
-
-The situation was accidently made worse with the addition of tcp-check
-comment since it also skips list elements. However, since the action that
-makes it go forward is TCPCHK_ACT_COMMENT (3), there's little chance to
-see this as a valid pointer, except on 64-bit machines where it can match
-the end of a check_req string pointer.
-
-This fix heavily depends on previous cleanup and both must be backported
-to 1.5 where the bug is present.
-(cherry picked from commit f2c87353a7f8160930b5f342bb6d6ad0991ee3d1)
-[wt: this patch differs significantly from 1.6 since we don't have comments]
----
- src/cfgparse.c |  4 +++-
- src/checks.c   | 12 ++++++++++++
- 2 files changed, 15 insertions(+), 1 deletion(-)
-
-diff --git a/src/cfgparse.c b/src/cfgparse.c
-index 746c7eb..dba59d1 100644
---- a/src/cfgparse.c
-+++ b/src/cfgparse.c
-@@ -4368,7 +4368,9 @@ stats_error_parsing:
-                       l = (struct list *)&curproxy->tcpcheck_rules;
-                       if (l->p != l->n) {
-                               tcpcheck = (struct tcpcheck_rule *)l->n;
--                              if (tcpcheck && tcpcheck->action != TCPCHK_ACT_CONNECT) {
-+
-+                              if (&tcpcheck->list != &curproxy->tcpcheck_rules
-+                                  && tcpcheck->action != TCPCHK_ACT_CONNECT) {
-                                       Alert("parsing [%s:%d] : first step MUST also be a 'connect' when there is a 'connect' step in the tcp-check ruleset.\n",
-                                             file, linenum);
-                                       err_code |= ERR_ALERT | ERR_FATAL;
-diff --git a/src/checks.c b/src/checks.c
-index a0c42f2..e13d561 100644
---- a/src/checks.c
-+++ b/src/checks.c
-@@ -2057,6 +2057,9 @@ static void tcpcheck_main(struct connection *conn)
-                       /* allow next rule */
-                       check->current_step = (struct tcpcheck_rule *)check->current_step->list.n;
-+                      if (&check->current_step->list == head)
-+                              break;
-+
-                       /* don't do anything until the connection is established */
-                       if (!(conn->flags & CO_FL_CONNECTED)) {
-                               /* update expire time, should be done by process_chk */
-@@ -2110,6 +2113,9 @@ static void tcpcheck_main(struct connection *conn)
-                       /* go to next rule and try to send */
-                       check->current_step = (struct tcpcheck_rule *)check->current_step->list.n;
-+
-+                      if (&check->current_step->list == head)
-+                              break;
-               } /* end 'send' */
-               else if (check->current_step->action == TCPCHK_ACT_EXPECT) {
-                       if (unlikely(check->result == CHK_RES_FAILED))
-@@ -2196,6 +2202,9 @@ static void tcpcheck_main(struct connection *conn)
-                                       /* allow next rule */
-                                       check->current_step = (struct tcpcheck_rule *)check->current_step->list.n;
-+                                      if (&check->current_step->list == head)
-+                                              break;
-+
-                                       if (check->current_step->action == TCPCHK_ACT_EXPECT)
-                                               goto tcpcheck_expect;
-                                       __conn_data_stop_recv(conn);
-@@ -2208,6 +2217,9 @@ static void tcpcheck_main(struct connection *conn)
-                                       /* allow next rule */
-                                       check->current_step = (struct tcpcheck_rule *)check->current_step->list.n;
-+                                      if (&check->current_step->list == head)
-+                                              break;
-+
-                                       if (check->current_step->action == TCPCHK_ACT_EXPECT)
-                                               goto tcpcheck_expect;
-                                       __conn_data_stop_recv(conn);
--- 
-2.0.5
-
diff --git a/net/haproxy/patches/0008-BUG-MEDIUM-checks-do-not-dereference-a-list-as-a-tcp.patch b/net/haproxy/patches/0008-BUG-MEDIUM-checks-do-not-dereference-a-list-as-a-tcp.patch
deleted file mode 100644 (file)
index 4540260..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-From 5bff05986c501d9ffb67873b60472f9c2a2e41be Mon Sep 17 00:00:00 2001
-From: Willy Tarreau <w@1wt.eu>
-Date: Wed, 13 May 2015 12:24:53 +0200
-Subject: [PATCH 8/8] BUG/MEDIUM: checks: do not dereference a list as a
- tcpcheck struct
-
-The method used to skip to next rule in the list is wrong, it assumes
-that the list element starts at the same offset as the rule. It happens
-to be true on most architectures since the list is the first element for
-now but it's definitely wrong. Now the code doesn't crash anymore when
-the struct list is moved anywhere else in the struct tcpcheck_rule.
-
-This fix must be backported to 1.5.
-(cherry picked from commit 5581c27b579cbfc53afb0ca04cdeebe7e2200131)
-[wt: changes from 1.6 : no tcp-check comments, check becomes s->proxy]
----
- src/cfgparse.c | 18 +++++++-----------
- src/checks.c   | 15 +++++++++------
- 2 files changed, 16 insertions(+), 17 deletions(-)
-
-diff --git a/src/cfgparse.c b/src/cfgparse.c
-index dba59d1..e04eff8 100644
---- a/src/cfgparse.c
-+++ b/src/cfgparse.c
-@@ -4362,20 +4362,16 @@ stats_error_parsing:
-                       const char *ptr_arg;
-                       int cur_arg;
-                       struct tcpcheck_rule *tcpcheck;
--                      struct list *l;
-                       /* check if first rule is also a 'connect' action */
--                      l = (struct list *)&curproxy->tcpcheck_rules;
--                      if (l->p != l->n) {
--                              tcpcheck = (struct tcpcheck_rule *)l->n;
-+                      tcpcheck = LIST_NEXT(&curproxy->tcpcheck_rules, struct tcpcheck_rule *, list);
--                              if (&tcpcheck->list != &curproxy->tcpcheck_rules
--                                  && tcpcheck->action != TCPCHK_ACT_CONNECT) {
--                                      Alert("parsing [%s:%d] : first step MUST also be a 'connect' when there is a 'connect' step in the tcp-check ruleset.\n",
--                                            file, linenum);
--                                      err_code |= ERR_ALERT | ERR_FATAL;
--                                      goto out;
--                              }
-+                      if (&tcpcheck->list != &curproxy->tcpcheck_rules
-+                          && tcpcheck->action != TCPCHK_ACT_CONNECT) {
-+                              Alert("parsing [%s:%d] : first step MUST also be a 'connect' when there is a 'connect' step in the tcp-check ruleset.\n",
-+                                    file, linenum);
-+                              err_code |= ERR_ALERT | ERR_FATAL;
-+                              goto out;
-                       }
-                       cur_arg = 2;
-diff --git a/src/checks.c b/src/checks.c
-index e13d561..27a23b2 100644
---- a/src/checks.c
-+++ b/src/checks.c
-@@ -1444,7 +1444,10 @@ static int connect_chk(struct task *t)
-       quickack = check->type == 0 || check->type == PR_O2_TCPCHK_CHK;
-       if (check->type == PR_O2_TCPCHK_CHK && !LIST_ISEMPTY(&s->proxy->tcpcheck_rules)) {
--              struct tcpcheck_rule *r = (struct tcpcheck_rule *) s->proxy->tcpcheck_rules.n;
-+              struct tcpcheck_rule *r;
-+
-+              r = LIST_NEXT(&s->proxy->tcpcheck_rules, struct tcpcheck_rule *, list);
-+
-               /* if first step is a 'connect', then tcpcheck_main must run it */
-               if (r->action == TCPCHK_ACT_CONNECT) {
-                       tcpcheck_main(conn);
-@@ -1952,7 +1955,7 @@ static void tcpcheck_main(struct connection *conn)
-               /* have 'next' point to the next rule or NULL if we're on the
-                * last one, connect() needs this.
-                */
--              next = (struct tcpcheck_rule *)check->current_step->list.n;
-+              next = LIST_NEXT(&check->current_step->list, struct tcpcheck_rule *, list);
-               if (&next->list == head)
-                       next = NULL;
-@@ -2055,7 +2058,7 @@ static void tcpcheck_main(struct connection *conn)
-                       }
-                       /* allow next rule */
--                      check->current_step = (struct tcpcheck_rule *)check->current_step->list.n;
-+                      check->current_step = LIST_NEXT(&check->current_step->list, struct tcpcheck_rule *, list);
-                       if (&check->current_step->list == head)
-                               break;
-@@ -2112,7 +2115,7 @@ static void tcpcheck_main(struct connection *conn)
-                       *check->bo->p = '\0'; /* to make gdb output easier to read */
-                       /* go to next rule and try to send */
--                      check->current_step = (struct tcpcheck_rule *)check->current_step->list.n;
-+                      check->current_step = LIST_NEXT(&check->current_step->list, struct tcpcheck_rule *, list);
-                       if (&check->current_step->list == head)
-                               break;
-@@ -2200,7 +2203,7 @@ static void tcpcheck_main(struct connection *conn)
-                               /* matched and was supposed to => OK, next step */
-                               else {
-                                       /* allow next rule */
--                                      check->current_step = (struct tcpcheck_rule *)check->current_step->list.n;
-+                                      check->current_step = LIST_NEXT(&check->current_step->list, struct tcpcheck_rule *, list);
-                                       if (&check->current_step->list == head)
-                                               break;
-@@ -2215,7 +2218,7 @@ static void tcpcheck_main(struct connection *conn)
-                               /* not matched and was not supposed to => OK, next step */
-                               if (check->current_step->inverse) {
-                                       /* allow next rule */
--                                      check->current_step = (struct tcpcheck_rule *)check->current_step->list.n;
-+                                      check->current_step = LIST_NEXT(&check->current_step->list, struct tcpcheck_rule *, list);
-                                       if (&check->current_step->list == head)
-                                               break;
--- 
-2.0.5
-
diff --git a/net/haproxy/patches/0009-BUG-MEDIUM-peers-apply-a-random-reconnection-timeout.patch b/net/haproxy/patches/0009-BUG-MEDIUM-peers-apply-a-random-reconnection-timeout.patch
deleted file mode 100644 (file)
index 96aa743..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-From 76a06b2804bcdba0fb2c19f834bdb511ce3cf344 Mon Sep 17 00:00:00 2001
-From: Willy Tarreau <w@1wt.eu>
-Date: Wed, 20 May 2015 10:39:04 +0200
-Subject: [PATCH 09/10] BUG/MEDIUM: peers: apply a random reconnection timeout
-
-Commit 9ff95bb ("BUG/MEDIUM: peers: correctly configure the client timeout")
-uncovered an old bug in the peers : upon disconnect, we reconnect immediately.
-This sometimes results in both ends to do the same thing in parallel causing
-a loop of connect/accept/close/close that can last several seconds. The risk
-of occurrence of the trouble increases with latency, and is emphasized by the
-fact that idle connections are now frequently recycled (after 5s of idle).
-
-In order to avoid this we must apply a random delay before reconnecting.
-Fortunately the mechanism already supports a reconnect delay, so here we
-compute the random timeout when killing a session. The delay is 50ms plus
-a random between 0 and 2 seconds. Ideally an exponential back-off would
-be preferred but it's preferable to keep the fix simple.
-
-This bug was reported by Marco Corte.
-
-This fix must be backported to 1.5 since the fix above was backported into
-1.5.12.
-(cherry picked from commit b4e34da692d8a7f6837ad16b3389f5830dbc11d2)
----
- src/peers.c | 14 +++++++++++---
- 1 file changed, 11 insertions(+), 3 deletions(-)
-
-diff --git a/src/peers.c b/src/peers.c
-index b196d88..159f0a4 100644
---- a/src/peers.c
-+++ b/src/peers.c
-@@ -1063,6 +1063,7 @@ static void peer_session_forceshutdown(struct session * session)
- {
-       struct stream_interface *oldsi = NULL;
-       struct appctx *appctx = NULL;
-+      struct peer_session *ps;
-       int i;
-       for (i = 0; i <= 1; i++) {
-@@ -1079,6 +1080,14 @@ static void peer_session_forceshutdown(struct session * session)
-       if (!appctx)
-               return;
-+      ps = (struct peer_session *)appctx->ctx.peers.ptr;
-+      /* we're killing a connection, we must apply a random delay before
-+       * retrying otherwise the other end will do the same and we can loop
-+       * for a while.
-+       */
-+      if (ps)
-+              ps->reconnect = tick_add(now_ms, MS_TO_TICKS(50 + random() % 2000));
-+
-       /* call release to reinit resync states if needed */
-       peer_session_release(oldsi);
-       appctx->st0 = PEER_SESS_ST_END;
-@@ -1352,8 +1361,8 @@ static struct task *process_peer_sync(struct task * task)
-                               if (!ps->session) {
-                                       /* no active session */
-                                       if (ps->statuscode == 0 ||
--                                          ps->statuscode == PEER_SESS_SC_SUCCESSCODE ||
-                                           ((ps->statuscode == PEER_SESS_SC_CONNECTCODE ||
-+                                            ps->statuscode == PEER_SESS_SC_SUCCESSCODE ||
-                                             ps->statuscode == PEER_SESS_SC_CONNECTEDCODE) &&
-                                            tick_is_expired(ps->reconnect, now_ms))) {
-                                               /* connection never tried
-@@ -1364,8 +1373,7 @@ static struct task *process_peer_sync(struct task * task)
-                                               /* retry a connect */
-                                               ps->session = peer_session_create(ps->peer, ps);
-                                       }
--                                      else if (ps->statuscode == PEER_SESS_SC_CONNECTCODE ||
--                                               ps->statuscode == PEER_SESS_SC_CONNECTEDCODE) {
-+                                      else if (!tick_is_expired(ps->reconnect, now_ms)) {
-                                               /* If previous session failed during connection
-                                                * but reconnection timer is not expired */
--- 
-2.0.5
-
diff --git a/net/haproxy/patches/0010-DOC-Update-doc-about-weight-act-and-bck-fields-in-th.patch b/net/haproxy/patches/0010-DOC-Update-doc-about-weight-act-and-bck-fields-in-th.patch
deleted file mode 100644 (file)
index 563ed64..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-From ac372e18c422841a9f1197b4238637c470e8edca Mon Sep 17 00:00:00 2001
-From: Pavlos Parissis <pavlos.parissis@gmail.com>
-Date: Sat, 2 May 2015 20:30:44 +0200
-Subject: [PATCH 10/10] DOC: Update doc about weight, act and bck fields in the
- statistics
-
-Reorder description of the mentioned fields in order to match the
-order of types
-(cherry picked from commit 1f673c72c11d011bbd24e309d3155384eddf7a46)
----
- doc/configuration.txt | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/doc/configuration.txt b/doc/configuration.txt
-index a9d497e..6f5eeb1 100644
---- a/doc/configuration.txt
-+++ b/doc/configuration.txt
-@@ -13240,9 +13240,9 @@ S (Servers).
-      server. The server value counts the number of times that server was
-      switched away from.
-  17. status [LFBS]: status (UP/DOWN/NOLB/MAINT/MAINT(via)...)
-- 18. weight [..BS]: server weight (server), total weight (backend)
-- 19. act [..BS]: server is active (server), number of active servers (backend)
-- 20. bck [..BS]: server is backup (server), number of backup servers (backend)
-+ 18. weight [..BS]: total weight (backend), server weight (server)
-+ 19. act [..BS]: number of active servers (backend), server is active (server)
-+ 20. bck [..BS]: number of backup servers (backend), server is backup (server)
-  21. chkfail [...S]: number of failed checks. (Only counts checks failed when
-      the server is up.)
-  22. chkdown [..BS]: number of UP->DOWN transitions. The backend counter counts
--- 
-2.0.5
-
diff --git a/net/haproxy/patches/0011-MINOR-ssl-add-a-destructor-to-free-allocated-SSL-res.patch b/net/haproxy/patches/0011-MINOR-ssl-add-a-destructor-to-free-allocated-SSL-res.patch
deleted file mode 100644 (file)
index 86be3b9..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-From 269a02fbb332da8faf6c2a614d45d5b5018816d1 Mon Sep 17 00:00:00 2001
-From: Remi Gacogne <rgacogne@aquaray.fr>
-Date: Thu, 28 May 2015 16:39:47 +0200
-Subject: [PATCH 11/14] MINOR: ssl: add a destructor to free allocated SSL
- ressources
-
-Using valgrind or another memory leak tracking tool is easier
-when the memory internally allocated by OpenSSL is cleanly released
-at shutdown.
-(cherry picked from commit d3a23c3eb8c0950d26204568a133207099923494)
----
- src/ssl_sock.c | 36 ++++++++++++++++++++++++++++++++++++
- 1 file changed, 36 insertions(+)
-
-diff --git a/src/ssl_sock.c b/src/ssl_sock.c
-index d0f4d01..a78fc6a 100644
---- a/src/ssl_sock.c
-+++ b/src/ssl_sock.c
-@@ -4717,6 +4717,42 @@ static void __ssl_sock_init(void)
-       cfg_register_keywords(&cfg_kws);
- }
-+__attribute__((destructor))
-+static void __ssl_sock_deinit(void)
-+{
-+#ifndef OPENSSL_NO_DH
-+        if (local_dh_1024) {
-+                DH_free(local_dh_1024);
-+                local_dh_1024 = NULL;
-+        }
-+
-+        if (local_dh_2048) {
-+                DH_free(local_dh_2048);
-+                local_dh_2048 = NULL;
-+        }
-+
-+        if (local_dh_4096) {
-+                DH_free(local_dh_4096);
-+                local_dh_4096 = NULL;
-+        }
-+
-+        if (local_dh_8192) {
-+                DH_free(local_dh_8192);
-+                local_dh_8192 = NULL;
-+        }
-+#endif
-+
-+        ERR_remove_state(0);
-+        ERR_free_strings();
-+
-+        EVP_cleanup();
-+
-+#if OPENSSL_VERSION_NUMBER >= 0x00907000L
-+        CRYPTO_cleanup_all_ex_data();
-+#endif
-+}
-+
-+
- /*
-  * Local variables:
-  *  c-indent-level: 8
--- 
-2.0.5
-
diff --git a/net/haproxy/patches/0012-BUG-MEDIUM-ssl-fix-tune.ssl.default-dh-param-value-b.patch b/net/haproxy/patches/0012-BUG-MEDIUM-ssl-fix-tune.ssl.default-dh-param-value-b.patch
deleted file mode 100644 (file)
index 37600c8..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-From 5d769ca828fdb055052b3dbc232864bdf2853c9f Mon Sep 17 00:00:00 2001
-From: Remi Gacogne <rgacogne@aquaray.fr>
-Date: Thu, 28 May 2015 16:23:00 +0200
-Subject: [PATCH 12/14] BUG/MEDIUM: ssl: fix tune.ssl.default-dh-param value
- being overwritten
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Hervé Commowick reported that the logic used to avoid complaining about
-ssl-default-dh-param not being set when static DH params are present
-in the certificate file was clearly wrong when more than one sni_ctx
-is used.
-This patch stores whether static DH params are being used for each
-SSL_CTX individually, and does not overwrite the value of
-tune.ssl.default-dh-param.
-(cherry picked from commit 4f902b88323927c9d25d391a809e3678ac31df41)
----
- src/ssl_sock.c | 28 +++++++++++++++++++++++-----
- 1 file changed, 23 insertions(+), 5 deletions(-)
-
-diff --git a/src/ssl_sock.c b/src/ssl_sock.c
-index a78fc6a..0f7819b 100644
---- a/src/ssl_sock.c
-+++ b/src/ssl_sock.c
-@@ -47,6 +47,9 @@
- #ifdef SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB
- #include <openssl/ocsp.h>
- #endif
-+#ifndef OPENSSL_NO_DH
-+#include <openssl/dh.h>
-+#endif
- #include <common/buffer.h>
- #include <common/compat.h>
-@@ -107,6 +110,7 @@ int sslconns = 0;
- int totalsslconns = 0;
- #ifndef OPENSSL_NO_DH
-+static int ssl_dh_ptr_index = -1;
- static DH *local_dh_1024 = NULL;
- static DH *local_dh_2048 = NULL;
- static DH *local_dh_4096 = NULL;
-@@ -1076,10 +1080,12 @@ int ssl_sock_load_dh_params(SSL_CTX *ctx, const char *file)
-       if (dh) {
-               ret = 1;
-               SSL_CTX_set_tmp_dh(ctx, dh);
--              /* Setting ssl default dh param to the size of the static DH params
--                 found in the file. This way we know that there is no use
--                 complaining later about ssl-default-dh-param not being set. */
--              global.tune.ssl_default_dh_param = DH_size(dh) * 8;
-+
-+              if (ssl_dh_ptr_index >= 0) {
-+                      /* store a pointer to the DH params to avoid complaining about
-+                         ssl-default-dh-param not being set for this SSL_CTX */
-+                      SSL_CTX_set_ex_data(ctx, ssl_dh_ptr_index, dh);
-+              }
-       }
-       else {
-               /* Clear openssl global errors stack */
-@@ -1274,6 +1280,12 @@ static int ssl_sock_load_cert_file(const char *path, struct bind_conf *bind_conf
-        * the tree, so it will be discovered and cleaned in time.
-        */
- #ifndef OPENSSL_NO_DH
-+      /* store a NULL pointer to indicate we have not yet loaded
-+         a custom DH param file */
-+      if (ssl_dh_ptr_index >= 0) {
-+              SSL_CTX_set_ex_data(ctx, ssl_dh_ptr_index, NULL);
-+      }
-+
-       ret = ssl_sock_load_dh_params(ctx, path);
-       if (ret < 0) {
-               if (err)
-@@ -1593,7 +1605,9 @@ int ssl_sock_prepare_ctx(struct bind_conf *bind_conf, SSL_CTX *ctx, struct proxy
-       /* If tune.ssl.default-dh-param has not been set and
-          no static DH params were in the certificate file. */
--      if (global.tune.ssl_default_dh_param == 0) {
-+      if (global.tune.ssl_default_dh_param == 0 &&
-+          (ssl_dh_ptr_index == -1 ||
-+           SSL_CTX_get_ex_data(ctx, ssl_dh_ptr_index) == NULL)) {
-               ciphers = ctx->cipher_list;
-               if (ciphers) {
-@@ -4715,6 +4729,10 @@ static void __ssl_sock_init(void)
-       bind_register_keywords(&bind_kws);
-       srv_register_keywords(&srv_kws);
-       cfg_register_keywords(&cfg_kws);
-+
-+#ifndef OPENSSL_NO_DH
-+      ssl_dh_ptr_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL, NULL);
-+#endif
- }
- __attribute__((destructor))
--- 
-2.0.5
-
diff --git a/net/haproxy/patches/0013-BUG-MINOR-cfgparse-fix-typo-in-option-httplog-error-.patch b/net/haproxy/patches/0013-BUG-MINOR-cfgparse-fix-typo-in-option-httplog-error-.patch
deleted file mode 100644 (file)
index d09f18d..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-From 629b1c000b26f0031246b9b529680b275a14118f Mon Sep 17 00:00:00 2001
-From: William Lallemand <wlallemand@haproxy.com>
-Date: Thu, 28 May 2015 18:02:48 +0200
-Subject: [PATCH 13/14] BUG/MINOR: cfgparse: fix typo in 'option httplog' error
- message
-
-The error message was displaying the wrong argument when 'option
-httplog' took a wrong argument.
-(cherry picked from commit 77063bc0c6ceb4257c4e2c08411811ecc48be1aa)
----
- src/cfgparse.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/cfgparse.c b/src/cfgparse.c
-index e04eff8..3c3383d 100644
---- a/src/cfgparse.c
-+++ b/src/cfgparse.c
-@@ -3792,7 +3792,7 @@ stats_error_parsing:
-                                       curproxy->options2 |= PR_O2_CLFLOG;
-                                       logformat = clf_http_log_format;
-                               } else {
--                                      Alert("parsing [%s:%d] : keyword '%s' only supports option 'clf'.\n", file, linenum, args[2]);
-+                                      Alert("parsing [%s:%d] : keyword '%s' only supports option 'clf'.\n", file, linenum, args[1]);
-                                       err_code |= ERR_ALERT | ERR_FATAL;
-                                       goto out;
-                               }
--- 
-2.0.5
-
diff --git a/net/haproxy/patches/0014-BUG-MEDIUM-cfgparse-segfault-when-userlist-is-misuse.patch b/net/haproxy/patches/0014-BUG-MEDIUM-cfgparse-segfault-when-userlist-is-misuse.patch
deleted file mode 100644 (file)
index 329505b..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-From faf3315f77c527e6e1d027deb7e853cdf6af5858 Mon Sep 17 00:00:00 2001
-From: William Lallemand <wlallemand@haproxy.com>
-Date: Thu, 28 May 2015 18:03:51 +0200
-Subject: [PATCH 14/14] BUG/MEDIUM: cfgparse: segfault when userlist is misused
-
-If the 'userlist' keyword parsing returns an error and no userlist were
-previously created. The parsing of 'user' and 'group' leads to NULL
-derefence.
-
-The userlist pointer is now tested to prevent this issue.
-(cherry picked from commit 4ac9f546120d42be8147e3d90588e7b9738af0cc)
----
- src/cfgparse.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/src/cfgparse.c b/src/cfgparse.c
-index 3c3383d..392a78d 100644
---- a/src/cfgparse.c
-+++ b/src/cfgparse.c
-@@ -5668,6 +5668,9 @@ cfg_parse_users(const char *file, int linenum, char **args, int kwm)
-                       goto out;
-               }
-+              if (!userlist)
-+                      goto out;
-+
-               for (ag = userlist->groups; ag; ag = ag->next)
-                       if (!strcmp(ag->name, args[1])) {
-                               Warning("parsing [%s:%d]: ignoring duplicated group '%s' in userlist '%s'.\n",
-@@ -5718,6 +5721,8 @@ cfg_parse_users(const char *file, int linenum, char **args, int kwm)
-                       err_code |= ERR_ALERT | ERR_FATAL;
-                       goto out;
-               }
-+              if (!userlist)
-+                      goto out;
-               for (newuser = userlist->users; newuser; newuser = newuser->next)
-                       if (!strcmp(newuser->user, args[1])) {
--- 
-2.0.5
-
diff --git a/net/haproxy/patches/0015-MEDIUM-ssl-replace-standards-DH-groups-with-custom-o.patch b/net/haproxy/patches/0015-MEDIUM-ssl-replace-standards-DH-groups-with-custom-o.patch
deleted file mode 100644 (file)
index 2d1415b..0000000
+++ /dev/null
@@ -1,427 +0,0 @@
-From 2ad3ec1ab5379a16b16aba48a42ced27b170534e Mon Sep 17 00:00:00 2001
-From: Remi Gacogne <rgacogne@aquaray.fr>
-Date: Fri, 29 May 2015 16:26:17 +0200
-Subject: [PATCH 15/18] MEDIUM: ssl: replace standards DH groups with custom
- ones
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-It is likely that powerful adversaries have been pre-computing the
-standardized DH groups, because being widely used have made them
-valuable targets. While users are advised to generate their own
-DH parameters, replace the ones we ship by values been randomly
-generated for this product only.
-
-[wt: replaced dh1024_p, dh2048_p, and dh4096_p with locally-generated
- ones as recommended by Rémi]
-
-(cherry picked from commit d3a341a96fb6107d2b8e3d7a9c0afa2ff43bb0b6)
----
- src/ssl_sock.c | 340 +++++++++++++++++----------------------------------------
- 1 file changed, 102 insertions(+), 238 deletions(-)
-
-diff --git a/src/ssl_sock.c b/src/ssl_sock.c
-index 0f7819b..93aab8b 100644
---- a/src/ssl_sock.c
-+++ b/src/ssl_sock.c
-@@ -114,7 +114,6 @@ static int ssl_dh_ptr_index = -1;
- static DH *local_dh_1024 = NULL;
- static DH *local_dh_2048 = NULL;
- static DH *local_dh_4096 = NULL;
--static DH *local_dh_8192 = NULL;
- #endif /* OPENSSL_NO_DH */
- #ifdef SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB
-@@ -766,32 +765,28 @@ static int ssl_sock_switchctx_cbk(SSL *ssl, int *al, struct bind_conf *s)
- static DH * ssl_get_dh_1024(void)
- {
--#if OPENSSL_VERSION_NUMBER < 0x0090801fL
--      static const unsigned char rfc_2409_prime_1024[] = {
--              0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,
--              0x21,0x68,0xC2,0x34,0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,
--              0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74,0x02,0x0B,0xBE,0xA6,
--              0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD,
--              0xEF,0x95,0x19,0xB3,0xCD,0x3A,0x43,0x1B,0x30,0x2B,0x0A,0x6D,
--              0xF2,0x5F,0x14,0x37,0x4F,0xE1,0x35,0x6D,0x6D,0x51,0xC2,0x45,
--              0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6,0xF4,0x4C,0x42,0xE9,
--              0xA6,0x37,0xED,0x6B,0x0B,0xFF,0x5C,0xB6,0xF4,0x06,0xB7,0xED,
--              0xEE,0x38,0x6B,0xFB,0x5A,0x89,0x9F,0xA5,0xAE,0x9F,0x24,0x11,
--              0x7C,0x4B,0x1F,0xE6,0x49,0x28,0x66,0x51,0xEC,0xE6,0x53,0x81,
--              0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
--      };
--#endif
-+      static unsigned char dh1024_p[]={
-+              0xFA,0xF9,0x2A,0x22,0x2A,0xA7,0x7F,0xE1,0x67,0x4E,0x53,0xF7,
-+              0x56,0x13,0xC3,0xB1,0xE3,0x29,0x6B,0x66,0x31,0x6A,0x7F,0xB3,
-+              0xC2,0x68,0x6B,0xCB,0x1D,0x57,0x39,0x1D,0x1F,0xFF,0x1C,0xC9,
-+              0xA6,0xA4,0x98,0x82,0x31,0x5D,0x25,0xFF,0x8A,0xE0,0x73,0x96,
-+              0x81,0xC8,0x83,0x79,0xC1,0x5A,0x04,0xF8,0x37,0x0D,0xA8,0x3D,
-+              0xAE,0x74,0xBC,0xDB,0xB6,0xA4,0x75,0xD9,0x71,0x8A,0xA0,0x17,
-+              0x9E,0x2D,0xC8,0xA8,0xDF,0x2C,0x5F,0x82,0x95,0xF8,0x92,0x9B,
-+              0xA7,0x33,0x5F,0x89,0x71,0xC8,0x2D,0x6B,0x18,0x86,0xC4,0x94,
-+              0x22,0xA5,0x52,0x8D,0xF6,0xF6,0xD2,0x37,0x92,0x0F,0xA5,0xCC,
-+              0xDB,0x7B,0x1D,0x3D,0xA1,0x31,0xB7,0x80,0x8F,0x0B,0x67,0x5E,
-+              0x36,0xA5,0x60,0x0C,0xF1,0x95,0x33,0x8B,
-+              };
-+      static unsigned char dh1024_g[]={
-+              0x02,
-+              };
-+
-       DH *dh = DH_new();
-       if (dh) {
--#if OPENSSL_VERSION_NUMBER >= 0x0090801fL
--              dh->p = get_rfc2409_prime_1024(NULL);
--#else
--              dh->p = BN_bin2bn(rfc_2409_prime_1024, sizeof rfc_2409_prime_1024, NULL);
--#endif
--              /* See RFC 2409, Section 6 "Oakley Groups"
--                 for the reason why 2 is used as generator.
--              */
--              BN_dec2bn(&dh->g, "2");
-+              dh->p = BN_bin2bn(dh1024_p, sizeof dh1024_p, NULL);
-+              dh->g = BN_bin2bn(dh1024_g, sizeof dh1024_g, NULL);
-+
-               if (!dh->p || !dh->g) {
-                       DH_free(dh);
-                       dh = NULL;
-@@ -802,43 +797,39 @@ static DH * ssl_get_dh_1024(void)
- static DH *ssl_get_dh_2048(void)
- {
--#if OPENSSL_VERSION_NUMBER < 0x0090801fL
--      static const unsigned char rfc_3526_prime_2048[] = {
--              0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,
--              0x21,0x68,0xC2,0x34,0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,
--              0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74,0x02,0x0B,0xBE,0xA6,
--              0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD,
--              0xEF,0x95,0x19,0xB3,0xCD,0x3A,0x43,0x1B,0x30,0x2B,0x0A,0x6D,
--              0xF2,0x5F,0x14,0x37,0x4F,0xE1,0x35,0x6D,0x6D,0x51,0xC2,0x45,
--              0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6,0xF4,0x4C,0x42,0xE9,
--              0xA6,0x37,0xED,0x6B,0x0B,0xFF,0x5C,0xB6,0xF4,0x06,0xB7,0xED,
--              0xEE,0x38,0x6B,0xFB,0x5A,0x89,0x9F,0xA5,0xAE,0x9F,0x24,0x11,
--              0x7C,0x4B,0x1F,0xE6,0x49,0x28,0x66,0x51,0xEC,0xE4,0x5B,0x3D,
--              0xC2,0x00,0x7C,0xB8,0xA1,0x63,0xBF,0x05,0x98,0xDA,0x48,0x36,
--              0x1C,0x55,0xD3,0x9A,0x69,0x16,0x3F,0xA8,0xFD,0x24,0xCF,0x5F,
--              0x83,0x65,0x5D,0x23,0xDC,0xA3,0xAD,0x96,0x1C,0x62,0xF3,0x56,
--              0x20,0x85,0x52,0xBB,0x9E,0xD5,0x29,0x07,0x70,0x96,0x96,0x6D,
--              0x67,0x0C,0x35,0x4E,0x4A,0xBC,0x98,0x04,0xF1,0x74,0x6C,0x08,
--              0xCA,0x18,0x21,0x7C,0x32,0x90,0x5E,0x46,0x2E,0x36,0xCE,0x3B,
--              0xE3,0x9E,0x77,0x2C,0x18,0x0E,0x86,0x03,0x9B,0x27,0x83,0xA2,
--              0xEC,0x07,0xA2,0x8F,0xB5,0xC5,0x5D,0xF0,0x6F,0x4C,0x52,0xC9,
--              0xDE,0x2B,0xCB,0xF6,0x95,0x58,0x17,0x18,0x39,0x95,0x49,0x7C,
--              0xEA,0x95,0x6A,0xE5,0x15,0xD2,0x26,0x18,0x98,0xFA,0x05,0x10,
--              0x15,0x72,0x8E,0x5A,0x8A,0xAC,0xAA,0x68,0xFF,0xFF,0xFF,0xFF,
--              0xFF,0xFF,0xFF,0xFF,
--      };
--#endif
-+      static unsigned char dh2048_p[]={
-+              0xEC,0x86,0xF8,0x70,0xA0,0x33,0x16,0xEC,0x05,0x1A,0x73,0x59,
-+              0xCD,0x1F,0x8B,0xF8,0x29,0xE4,0xD2,0xCF,0x52,0xDD,0xC2,0x24,
-+              0x8D,0xB5,0x38,0x9A,0xFB,0x5C,0xA4,0xE4,0xB2,0xDA,0xCE,0x66,
-+              0x50,0x74,0xA6,0x85,0x4D,0x4B,0x1D,0x30,0xB8,0x2B,0xF3,0x10,
-+              0xE9,0xA7,0x2D,0x05,0x71,0xE7,0x81,0xDF,0x8B,0x59,0x52,0x3B,
-+              0x5F,0x43,0x0B,0x68,0xF1,0xDB,0x07,0xBE,0x08,0x6B,0x1B,0x23,
-+              0xEE,0x4D,0xCC,0x9E,0x0E,0x43,0xA0,0x1E,0xDF,0x43,0x8C,0xEC,
-+              0xBE,0xBE,0x90,0xB4,0x51,0x54,0xB9,0x2F,0x7B,0x64,0x76,0x4E,
-+              0x5D,0xD4,0x2E,0xAE,0xC2,0x9E,0xAE,0x51,0x43,0x59,0xC7,0x77,
-+              0x9C,0x50,0x3C,0x0E,0xED,0x73,0x04,0x5F,0xF1,0x4C,0x76,0x2A,
-+              0xD8,0xF8,0xCF,0xFC,0x34,0x40,0xD1,0xB4,0x42,0x61,0x84,0x66,
-+              0x42,0x39,0x04,0xF8,0x68,0xB2,0x62,0xD7,0x55,0xED,0x1B,0x74,
-+              0x75,0x91,0xE0,0xC5,0x69,0xC1,0x31,0x5C,0xDB,0x7B,0x44,0x2E,
-+              0xCE,0x84,0x58,0x0D,0x1E,0x66,0x0C,0xC8,0x44,0x9E,0xFD,0x40,
-+              0x08,0x67,0x5D,0xFB,0xA7,0x76,0x8F,0x00,0x11,0x87,0xE9,0x93,
-+              0xF9,0x7D,0xC4,0xBC,0x74,0x55,0x20,0xD4,0x4A,0x41,0x2F,0x43,
-+              0x42,0x1A,0xC1,0xF2,0x97,0x17,0x49,0x27,0x37,0x6B,0x2F,0x88,
-+              0x7E,0x1C,0xA0,0xA1,0x89,0x92,0x27,0xD9,0x56,0x5A,0x71,0xC1,
-+              0x56,0x37,0x7E,0x3A,0x9D,0x05,0xE7,0xEE,0x5D,0x8F,0x82,0x17,
-+              0xBC,0xE9,0xC2,0x93,0x30,0x82,0xF9,0xF4,0xC9,0xAE,0x49,0xDB,
-+              0xD0,0x54,0xB4,0xD9,0x75,0x4D,0xFA,0x06,0xB8,0xD6,0x38,0x41,
-+              0xB7,0x1F,0x77,0xF3,
-+              };
-+      static unsigned char dh2048_g[]={
-+              0x02,
-+              };
-+
-       DH *dh = DH_new();
-       if (dh) {
--#if OPENSSL_VERSION_NUMBER >= 0x0090801fL
--              dh->p = get_rfc3526_prime_2048(NULL);
--#else
--              dh->p = BN_bin2bn(rfc_3526_prime_2048, sizeof rfc_3526_prime_2048, NULL);
--#endif
--              /* See RFC 3526, Section 3 "2048-bit MODP Group"
--                 for the reason why 2 is used as generator.
--              */
--              BN_dec2bn(&dh->g, "2");
-+              dh->p = BN_bin2bn(dh2048_p, sizeof dh2048_p, NULL);
-+              dh->g = BN_bin2bn(dh2048_g, sizeof dh2048_g, NULL);
-+
-               if (!dh->p || !dh->g) {
-                       DH_free(dh);
-                       dh = NULL;
-@@ -849,175 +840,60 @@ static DH *ssl_get_dh_2048(void)
- static DH *ssl_get_dh_4096(void)
- {
--#if OPENSSL_VERSION_NUMBER < 0x0090801fL
--      static const unsigned char rfc_3526_prime_4096[] = {
--                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,
--                0x21,0x68,0xC2,0x34,0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,
--                0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74,0x02,0x0B,0xBE,0xA6,
--                0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD,
--                0xEF,0x95,0x19,0xB3,0xCD,0x3A,0x43,0x1B,0x30,0x2B,0x0A,0x6D,
--                0xF2,0x5F,0x14,0x37,0x4F,0xE1,0x35,0x6D,0x6D,0x51,0xC2,0x45,
--                0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6,0xF4,0x4C,0x42,0xE9,
--                0xA6,0x37,0xED,0x6B,0x0B,0xFF,0x5C,0xB6,0xF4,0x06,0xB7,0xED,
--                0xEE,0x38,0x6B,0xFB,0x5A,0x89,0x9F,0xA5,0xAE,0x9F,0x24,0x11,
--                0x7C,0x4B,0x1F,0xE6,0x49,0x28,0x66,0x51,0xEC,0xE4,0x5B,0x3D,
--                0xC2,0x00,0x7C,0xB8,0xA1,0x63,0xBF,0x05,0x98,0xDA,0x48,0x36,
--                0x1C,0x55,0xD3,0x9A,0x69,0x16,0x3F,0xA8,0xFD,0x24,0xCF,0x5F,
--                0x83,0x65,0x5D,0x23,0xDC,0xA3,0xAD,0x96,0x1C,0x62,0xF3,0x56,
--                0x20,0x85,0x52,0xBB,0x9E,0xD5,0x29,0x07,0x70,0x96,0x96,0x6D,
--                0x67,0x0C,0x35,0x4E,0x4A,0xBC,0x98,0x04,0xF1,0x74,0x6C,0x08,
--                0xCA,0x18,0x21,0x7C,0x32,0x90,0x5E,0x46,0x2E,0x36,0xCE,0x3B,
--                0xE3,0x9E,0x77,0x2C,0x18,0x0E,0x86,0x03,0x9B,0x27,0x83,0xA2,
--                0xEC,0x07,0xA2,0x8F,0xB5,0xC5,0x5D,0xF0,0x6F,0x4C,0x52,0xC9,
--                0xDE,0x2B,0xCB,0xF6,0x95,0x58,0x17,0x18,0x39,0x95,0x49,0x7C,
--                0xEA,0x95,0x6A,0xE5,0x15,0xD2,0x26,0x18,0x98,0xFA,0x05,0x10,
--                0x15,0x72,0x8E,0x5A,0x8A,0xAA,0xC4,0x2D,0xAD,0x33,0x17,0x0D,
--                0x04,0x50,0x7A,0x33,0xA8,0x55,0x21,0xAB,0xDF,0x1C,0xBA,0x64,
--                0xEC,0xFB,0x85,0x04,0x58,0xDB,0xEF,0x0A,0x8A,0xEA,0x71,0x57,
--                0x5D,0x06,0x0C,0x7D,0xB3,0x97,0x0F,0x85,0xA6,0xE1,0xE4,0xC7,
--                0xAB,0xF5,0xAE,0x8C,0xDB,0x09,0x33,0xD7,0x1E,0x8C,0x94,0xE0,
--                0x4A,0x25,0x61,0x9D,0xCE,0xE3,0xD2,0x26,0x1A,0xD2,0xEE,0x6B,
--                0xF1,0x2F,0xFA,0x06,0xD9,0x8A,0x08,0x64,0xD8,0x76,0x02,0x73,
--                0x3E,0xC8,0x6A,0x64,0x52,0x1F,0x2B,0x18,0x17,0x7B,0x20,0x0C,
--                0xBB,0xE1,0x17,0x57,0x7A,0x61,0x5D,0x6C,0x77,0x09,0x88,0xC0,
--                0xBA,0xD9,0x46,0xE2,0x08,0xE2,0x4F,0xA0,0x74,0xE5,0xAB,0x31,
--                0x43,0xDB,0x5B,0xFC,0xE0,0xFD,0x10,0x8E,0x4B,0x82,0xD1,0x20,
--                0xA9,0x21,0x08,0x01,0x1A,0x72,0x3C,0x12,0xA7,0x87,0xE6,0xD7,
--                0x88,0x71,0x9A,0x10,0xBD,0xBA,0x5B,0x26,0x99,0xC3,0x27,0x18,
--                0x6A,0xF4,0xE2,0x3C,0x1A,0x94,0x68,0x34,0xB6,0x15,0x0B,0xDA,
--                0x25,0x83,0xE9,0xCA,0x2A,0xD4,0x4C,0xE8,0xDB,0xBB,0xC2,0xDB,
--                0x04,0xDE,0x8E,0xF9,0x2E,0x8E,0xFC,0x14,0x1F,0xBE,0xCA,0xA6,
--                0x28,0x7C,0x59,0x47,0x4E,0x6B,0xC0,0x5D,0x99,0xB2,0x96,0x4F,
--                0xA0,0x90,0xC3,0xA2,0x23,0x3B,0xA1,0x86,0x51,0x5B,0xE7,0xED,
--                0x1F,0x61,0x29,0x70,0xCE,0xE2,0xD7,0xAF,0xB8,0x1B,0xDD,0x76,
--                0x21,0x70,0x48,0x1C,0xD0,0x06,0x91,0x27,0xD5,0xB0,0x5A,0xA9,
--                0x93,0xB4,0xEA,0x98,0x8D,0x8F,0xDD,0xC1,0x86,0xFF,0xB7,0xDC,
--                0x90,0xA6,0xC0,0x8F,0x4D,0xF4,0x35,0xC9,0x34,0x06,0x31,0x99,
--                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-+      static unsigned char dh4096_p[]={
-+              0xDE,0x16,0x94,0xCD,0x99,0x58,0x07,0xF1,0xF7,0x32,0x96,0x11,
-+              0x04,0x82,0xD4,0x84,0x72,0x80,0x99,0x06,0xCA,0xF0,0xA3,0x68,
-+              0x07,0xCE,0x64,0x50,0xE7,0x74,0x45,0x20,0x80,0x5E,0x4D,0xAD,
-+              0xA5,0xB6,0xED,0xFA,0x80,0x6C,0x3B,0x35,0xC4,0x9A,0x14,0x6B,
-+              0x32,0xBB,0xFD,0x1F,0x17,0x8E,0xB7,0x1F,0xD6,0xFA,0x3F,0x7B,
-+              0xEE,0x16,0xA5,0x62,0x33,0x0D,0xED,0xBC,0x4E,0x58,0xE5,0x47,
-+              0x4D,0xE9,0xAB,0x8E,0x38,0xD3,0x6E,0x90,0x57,0xE3,0x22,0x15,
-+              0x33,0xBD,0xF6,0x43,0x45,0xB5,0x10,0x0A,0xBE,0x2C,0xB4,0x35,
-+              0xB8,0x53,0x8D,0xAD,0xFB,0xA7,0x1F,0x85,0x58,0x41,0x7A,0x79,
-+              0x20,0x68,0xB3,0xE1,0x3D,0x08,0x76,0xBF,0x86,0x0D,0x49,0xE3,
-+              0x82,0x71,0x8C,0xB4,0x8D,0x81,0x84,0xD4,0xE7,0xBE,0x91,0xDC,
-+              0x26,0x39,0x48,0x0F,0x35,0xC4,0xCA,0x65,0xE3,0x40,0x93,0x52,
-+              0x76,0x58,0x7D,0xDD,0x51,0x75,0xDC,0x69,0x61,0xBF,0x47,0x2C,
-+              0x16,0x68,0x2D,0xC9,0x29,0xD3,0xE6,0xC0,0x99,0x48,0xA0,0x9A,
-+              0xC8,0x78,0xC0,0x6D,0x81,0x67,0x12,0x61,0x3F,0x71,0xBA,0x41,
-+              0x1F,0x6C,0x89,0x44,0x03,0xBA,0x3B,0x39,0x60,0xAA,0x28,0x55,
-+              0x59,0xAE,0xB8,0xFA,0xCB,0x6F,0xA5,0x1A,0xF7,0x2B,0xDD,0x52,
-+              0x8A,0x8B,0xE2,0x71,0xA6,0x5E,0x7E,0xD8,0x2E,0x18,0xE0,0x66,
-+              0xDF,0xDD,0x22,0x21,0x99,0x52,0x73,0xA6,0x33,0x20,0x65,0x0E,
-+              0x53,0xE7,0x6B,0x9B,0xC5,0xA3,0x2F,0x97,0x65,0x76,0xD3,0x47,
-+              0x23,0x77,0x12,0xB6,0x11,0x7B,0x24,0xED,0xF1,0xEF,0xC0,0xE2,
-+              0xA3,0x7E,0x67,0x05,0x3E,0x96,0x4D,0x45,0xC2,0x18,0xD1,0x73,
-+              0x9E,0x07,0xF3,0x81,0x6E,0x52,0x63,0xF6,0x20,0x76,0xB9,0x13,
-+              0xD2,0x65,0x30,0x18,0x16,0x09,0x16,0x9E,0x8F,0xF1,0xD2,0x10,
-+              0x5A,0xD3,0xD4,0xAF,0x16,0x61,0xDA,0x55,0x2E,0x18,0x5E,0x14,
-+              0x08,0x54,0x2E,0x2A,0x25,0xA2,0x1A,0x9B,0x8B,0x32,0xA9,0xFD,
-+              0xC2,0x48,0x96,0xE1,0x80,0xCA,0xE9,0x22,0x17,0xBB,0xCE,0x3E,
-+              0x9E,0xED,0xC7,0xF1,0x1F,0xEC,0x17,0x21,0xDC,0x7B,0x82,0x48,
-+              0x8E,0xBB,0x4B,0x9D,0x5B,0x04,0x04,0xDA,0xDB,0x39,0xDF,0x01,
-+              0x40,0xC3,0xAA,0x26,0x23,0x89,0x75,0xC6,0x0B,0xD0,0xA2,0x60,
-+              0x6A,0xF1,0xCC,0x65,0x18,0x98,0x1B,0x52,0xD2,0x74,0x61,0xCC,
-+              0xBD,0x60,0xAE,0xA3,0xA0,0x66,0x6A,0x16,0x34,0x92,0x3F,0x41,
-+              0x40,0x31,0x29,0xC0,0x2C,0x63,0xB2,0x07,0x8D,0xEB,0x94,0xB8,
-+              0xE8,0x47,0x92,0x52,0x93,0x6A,0x1B,0x7E,0x1A,0x61,0xB3,0x1B,
-+              0xF0,0xD6,0x72,0x9B,0xF1,0xB0,0xAF,0xBF,0x3E,0x65,0xEF,0x23,
-+              0x1D,0x6F,0xFF,0x70,0xCD,0x8A,0x4C,0x8A,0xA0,0x72,0x9D,0xBE,
-+              0xD4,0xBB,0x24,0x47,0x4A,0x68,0xB5,0xF5,0xC6,0xD5,0x7A,0xCD,
-+              0xCA,0x06,0x41,0x07,0xAD,0xC2,0x1E,0xE6,0x54,0xA7,0xAD,0x03,
-+              0xD9,0x12,0xC1,0x9C,0x13,0xB1,0xC9,0x0A,0x43,0x8E,0x1E,0x08,
-+              0xCE,0x50,0x82,0x73,0x5F,0xA7,0x55,0x1D,0xD9,0x59,0xAC,0xB5,
-+              0xEA,0x02,0x7F,0x6C,0x5B,0x74,0x96,0x98,0x67,0x24,0xA3,0x0F,
-+              0x15,0xFC,0xA9,0x7D,0x3E,0x67,0xD1,0x70,0xF8,0x97,0xF3,0x67,
-+              0xC5,0x8C,0x88,0x44,0x08,0x02,0xC7,0x2B,
-       };
--#endif
--      DH *dh = DH_new();
--      if (dh) {
--#if OPENSSL_VERSION_NUMBER >= 0x0090801fL
--              dh->p = get_rfc3526_prime_4096(NULL);
--#else
--              dh->p = BN_bin2bn(rfc_3526_prime_4096, sizeof rfc_3526_prime_4096, NULL);
--#endif
--              /* See RFC 3526, Section 5 "4096-bit MODP Group"
--                 for the reason why 2 is used as generator.
--              */
--              BN_dec2bn(&dh->g, "2");
--              if (!dh->p || !dh->g) {
--                      DH_free(dh);
--                      dh = NULL;
--              }
--      }
--      return dh;
--}
-+      static unsigned char dh4096_g[]={
-+              0x02,
-+              };
--static DH *ssl_get_dh_8192(void)
--{
--#if OPENSSL_VERSION_NUMBER < 0x0090801fL
--      static const unsigned char rfc_3526_prime_8192[] = {
--                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,
--                0x21,0x68,0xC2,0x34,0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,
--                0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74,0x02,0x0B,0xBE,0xA6,
--                0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD,
--                0xEF,0x95,0x19,0xB3,0xCD,0x3A,0x43,0x1B,0x30,0x2B,0x0A,0x6D,
--                0xF2,0x5F,0x14,0x37,0x4F,0xE1,0x35,0x6D,0x6D,0x51,0xC2,0x45,
--                0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6,0xF4,0x4C,0x42,0xE9,
--                0xA6,0x37,0xED,0x6B,0x0B,0xFF,0x5C,0xB6,0xF4,0x06,0xB7,0xED,
--                0xEE,0x38,0x6B,0xFB,0x5A,0x89,0x9F,0xA5,0xAE,0x9F,0x24,0x11,
--                0x7C,0x4B,0x1F,0xE6,0x49,0x28,0x66,0x51,0xEC,0xE4,0x5B,0x3D,
--                0xC2,0x00,0x7C,0xB8,0xA1,0x63,0xBF,0x05,0x98,0xDA,0x48,0x36,
--                0x1C,0x55,0xD3,0x9A,0x69,0x16,0x3F,0xA8,0xFD,0x24,0xCF,0x5F,
--                0x83,0x65,0x5D,0x23,0xDC,0xA3,0xAD,0x96,0x1C,0x62,0xF3,0x56,
--                0x20,0x85,0x52,0xBB,0x9E,0xD5,0x29,0x07,0x70,0x96,0x96,0x6D,
--                0x67,0x0C,0x35,0x4E,0x4A,0xBC,0x98,0x04,0xF1,0x74,0x6C,0x08,
--                0xCA,0x18,0x21,0x7C,0x32,0x90,0x5E,0x46,0x2E,0x36,0xCE,0x3B,
--                0xE3,0x9E,0x77,0x2C,0x18,0x0E,0x86,0x03,0x9B,0x27,0x83,0xA2,
--                0xEC,0x07,0xA2,0x8F,0xB5,0xC5,0x5D,0xF0,0x6F,0x4C,0x52,0xC9,
--                0xDE,0x2B,0xCB,0xF6,0x95,0x58,0x17,0x18,0x39,0x95,0x49,0x7C,
--                0xEA,0x95,0x6A,0xE5,0x15,0xD2,0x26,0x18,0x98,0xFA,0x05,0x10,
--                0x15,0x72,0x8E,0x5A,0x8A,0xAA,0xC4,0x2D,0xAD,0x33,0x17,0x0D,
--                0x04,0x50,0x7A,0x33,0xA8,0x55,0x21,0xAB,0xDF,0x1C,0xBA,0x64,
--                0xEC,0xFB,0x85,0x04,0x58,0xDB,0xEF,0x0A,0x8A,0xEA,0x71,0x57,
--                0x5D,0x06,0x0C,0x7D,0xB3,0x97,0x0F,0x85,0xA6,0xE1,0xE4,0xC7,
--                0xAB,0xF5,0xAE,0x8C,0xDB,0x09,0x33,0xD7,0x1E,0x8C,0x94,0xE0,
--                0x4A,0x25,0x61,0x9D,0xCE,0xE3,0xD2,0x26,0x1A,0xD2,0xEE,0x6B,
--                0xF1,0x2F,0xFA,0x06,0xD9,0x8A,0x08,0x64,0xD8,0x76,0x02,0x73,
--                0x3E,0xC8,0x6A,0x64,0x52,0x1F,0x2B,0x18,0x17,0x7B,0x20,0x0C,
--                0xBB,0xE1,0x17,0x57,0x7A,0x61,0x5D,0x6C,0x77,0x09,0x88,0xC0,
--                0xBA,0xD9,0x46,0xE2,0x08,0xE2,0x4F,0xA0,0x74,0xE5,0xAB,0x31,
--                0x43,0xDB,0x5B,0xFC,0xE0,0xFD,0x10,0x8E,0x4B,0x82,0xD1,0x20,
--                0xA9,0x21,0x08,0x01,0x1A,0x72,0x3C,0x12,0xA7,0x87,0xE6,0xD7,
--                0x88,0x71,0x9A,0x10,0xBD,0xBA,0x5B,0x26,0x99,0xC3,0x27,0x18,
--                0x6A,0xF4,0xE2,0x3C,0x1A,0x94,0x68,0x34,0xB6,0x15,0x0B,0xDA,
--                0x25,0x83,0xE9,0xCA,0x2A,0xD4,0x4C,0xE8,0xDB,0xBB,0xC2,0xDB,
--                0x04,0xDE,0x8E,0xF9,0x2E,0x8E,0xFC,0x14,0x1F,0xBE,0xCA,0xA6,
--                0x28,0x7C,0x59,0x47,0x4E,0x6B,0xC0,0x5D,0x99,0xB2,0x96,0x4F,
--                0xA0,0x90,0xC3,0xA2,0x23,0x3B,0xA1,0x86,0x51,0x5B,0xE7,0xED,
--                0x1F,0x61,0x29,0x70,0xCE,0xE2,0xD7,0xAF,0xB8,0x1B,0xDD,0x76,
--                0x21,0x70,0x48,0x1C,0xD0,0x06,0x91,0x27,0xD5,0xB0,0x5A,0xA9,
--                0x93,0xB4,0xEA,0x98,0x8D,0x8F,0xDD,0xC1,0x86,0xFF,0xB7,0xDC,
--                0x90,0xA6,0xC0,0x8F,0x4D,0xF4,0x35,0xC9,0x34,0x02,0x84,0x92,
--                0x36,0xC3,0xFA,0xB4,0xD2,0x7C,0x70,0x26,0xC1,0xD4,0xDC,0xB2,
--                0x60,0x26,0x46,0xDE,0xC9,0x75,0x1E,0x76,0x3D,0xBA,0x37,0xBD,
--                0xF8,0xFF,0x94,0x06,0xAD,0x9E,0x53,0x0E,0xE5,0xDB,0x38,0x2F,
--                0x41,0x30,0x01,0xAE,0xB0,0x6A,0x53,0xED,0x90,0x27,0xD8,0x31,
--                0x17,0x97,0x27,0xB0,0x86,0x5A,0x89,0x18,0xDA,0x3E,0xDB,0xEB,
--                0xCF,0x9B,0x14,0xED,0x44,0xCE,0x6C,0xBA,0xCE,0xD4,0xBB,0x1B,
--                0xDB,0x7F,0x14,0x47,0xE6,0xCC,0x25,0x4B,0x33,0x20,0x51,0x51,
--                0x2B,0xD7,0xAF,0x42,0x6F,0xB8,0xF4,0x01,0x37,0x8C,0xD2,0xBF,
--                0x59,0x83,0xCA,0x01,0xC6,0x4B,0x92,0xEC,0xF0,0x32,0xEA,0x15,
--                0xD1,0x72,0x1D,0x03,0xF4,0x82,0xD7,0xCE,0x6E,0x74,0xFE,0xF6,
--                0xD5,0x5E,0x70,0x2F,0x46,0x98,0x0C,0x82,0xB5,0xA8,0x40,0x31,
--                0x90,0x0B,0x1C,0x9E,0x59,0xE7,0xC9,0x7F,0xBE,0xC7,0xE8,0xF3,
--                0x23,0xA9,0x7A,0x7E,0x36,0xCC,0x88,0xBE,0x0F,0x1D,0x45,0xB7,
--                0xFF,0x58,0x5A,0xC5,0x4B,0xD4,0x07,0xB2,0x2B,0x41,0x54,0xAA,
--                0xCC,0x8F,0x6D,0x7E,0xBF,0x48,0xE1,0xD8,0x14,0xCC,0x5E,0xD2,
--                0x0F,0x80,0x37,0xE0,0xA7,0x97,0x15,0xEE,0xF2,0x9B,0xE3,0x28,
--                0x06,0xA1,0xD5,0x8B,0xB7,0xC5,0xDA,0x76,0xF5,0x50,0xAA,0x3D,
--                0x8A,0x1F,0xBF,0xF0,0xEB,0x19,0xCC,0xB1,0xA3,0x13,0xD5,0x5C,
--                0xDA,0x56,0xC9,0xEC,0x2E,0xF2,0x96,0x32,0x38,0x7F,0xE8,0xD7,
--                0x6E,0x3C,0x04,0x68,0x04,0x3E,0x8F,0x66,0x3F,0x48,0x60,0xEE,
--                0x12,0xBF,0x2D,0x5B,0x0B,0x74,0x74,0xD6,0xE6,0x94,0xF9,0x1E,
--                0x6D,0xBE,0x11,0x59,0x74,0xA3,0x92,0x6F,0x12,0xFE,0xE5,0xE4,
--                0x38,0x77,0x7C,0xB6,0xA9,0x32,0xDF,0x8C,0xD8,0xBE,0xC4,0xD0,
--                0x73,0xB9,0x31,0xBA,0x3B,0xC8,0x32,0xB6,0x8D,0x9D,0xD3,0x00,
--                0x74,0x1F,0xA7,0xBF,0x8A,0xFC,0x47,0xED,0x25,0x76,0xF6,0x93,
--                0x6B,0xA4,0x24,0x66,0x3A,0xAB,0x63,0x9C,0x5A,0xE4,0xF5,0x68,
--                0x34,0x23,0xB4,0x74,0x2B,0xF1,0xC9,0x78,0x23,0x8F,0x16,0xCB,
--                0xE3,0x9D,0x65,0x2D,0xE3,0xFD,0xB8,0xBE,0xFC,0x84,0x8A,0xD9,
--                0x22,0x22,0x2E,0x04,0xA4,0x03,0x7C,0x07,0x13,0xEB,0x57,0xA8,
--                0x1A,0x23,0xF0,0xC7,0x34,0x73,0xFC,0x64,0x6C,0xEA,0x30,0x6B,
--                0x4B,0xCB,0xC8,0x86,0x2F,0x83,0x85,0xDD,0xFA,0x9D,0x4B,0x7F,
--                0xA2,0xC0,0x87,0xE8,0x79,0x68,0x33,0x03,0xED,0x5B,0xDD,0x3A,
--                0x06,0x2B,0x3C,0xF5,0xB3,0xA2,0x78,0xA6,0x6D,0x2A,0x13,0xF8,
--                0x3F,0x44,0xF8,0x2D,0xDF,0x31,0x0E,0xE0,0x74,0xAB,0x6A,0x36,
--                0x45,0x97,0xE8,0x99,0xA0,0x25,0x5D,0xC1,0x64,0xF3,0x1C,0xC5,
--                0x08,0x46,0x85,0x1D,0xF9,0xAB,0x48,0x19,0x5D,0xED,0x7E,0xA1,
--                0xB1,0xD5,0x10,0xBD,0x7E,0xE7,0x4D,0x73,0xFA,0xF3,0x6B,0xC3,
--                0x1E,0xCF,0xA2,0x68,0x35,0x90,0x46,0xF4,0xEB,0x87,0x9F,0x92,
--                0x40,0x09,0x43,0x8B,0x48,0x1C,0x6C,0xD7,0x88,0x9A,0x00,0x2E,
--                0xD5,0xEE,0x38,0x2B,0xC9,0x19,0x0D,0xA6,0xFC,0x02,0x6E,0x47,
--                0x95,0x58,0xE4,0x47,0x56,0x77,0xE9,0xAA,0x9E,0x30,0x50,0xE2,
--                0x76,0x56,0x94,0xDF,0xC8,0x1F,0x56,0xE8,0x80,0xB9,0x6E,0x71,
--                0x60,0xC9,0x80,0xDD,0x98,0xED,0xD3,0xDF,0xFF,0xFF,0xFF,0xFF,
--                0xFF,0xFF,0xFF,0xFF,
--      };
--#endif
-       DH *dh = DH_new();
-       if (dh) {
--#if OPENSSL_VERSION_NUMBER >= 0x0090801fL
--              dh->p = get_rfc3526_prime_8192(NULL);
--#else
--              dh->p = BN_bin2bn(rfc_3526_prime_8192, sizeof rfc_3526_prime_8192, NULL);
--#endif
--              /* See RFC 3526, Section 7 "8192-bit MODP Group"
--                 for the reason why 2 is used as generator.
--              */
--              BN_dec2bn(&dh->g, "2");
-+              dh->p = BN_bin2bn(dh4096_p, sizeof dh4096_p, NULL);
-+              dh->g = BN_bin2bn(dh4096_g, sizeof dh4096_g, NULL);
-+
-               if (!dh->p || !dh->g) {
-                       DH_free(dh);
-                       dh = NULL;
-@@ -1045,10 +921,7 @@ static DH *ssl_get_tmp_dh(SSL *ssl, int export, int keylen)
-               keylen = global.tune.ssl_default_dh_param;
-       }
--      if (keylen >= 8192) {
--              dh = local_dh_8192;
--      }
--      else if (keylen >= 4096) {
-+      if (keylen >= 4096) {
-               dh = local_dh_4096;
-       }
-       else if (keylen >= 2048) {
-@@ -1643,10 +1516,6 @@ int ssl_sock_prepare_ctx(struct bind_conf *bind_conf, SSL_CTX *ctx, struct proxy
-                               if (local_dh_4096 == NULL) {
-                                       local_dh_4096 = ssl_get_dh_4096();
-                               }
--                              if (global.tune.ssl_default_dh_param >= 8192 &&
--                                  local_dh_8192 == NULL) {
--                                      local_dh_8192 = ssl_get_dh_8192();
--                              }
-                       }
-               }
-       }
-@@ -4753,11 +4622,6 @@ static void __ssl_sock_deinit(void)
-                 DH_free(local_dh_4096);
-                 local_dh_4096 = NULL;
-         }
--
--        if (local_dh_8192) {
--                DH_free(local_dh_8192);
--                local_dh_8192 = NULL;
--        }
- #endif
-         ERR_remove_state(0);
--- 
-2.3.6
-
diff --git a/net/haproxy/patches/0016-BUG-MINOR-debug-display-null-in-place-of-meth.patch b/net/haproxy/patches/0016-BUG-MINOR-debug-display-null-in-place-of-meth.patch
deleted file mode 100644 (file)
index f40d723..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-From c51fe0fb249db735c5b103ec99559a0254d58441 Mon Sep 17 00:00:00 2001
-From: Thierry FOURNIER <tfournier@haproxy.com>
-Date: Wed, 3 Jun 2015 20:12:04 +0200
-Subject: [PATCH 16/18] BUG/MINOR: debug: display (null) in place of "meth"
-
-The array which contains names of types, miss the METH entry.
-
-[wt: should be backported to 1.5 as well]
-(cherry picked from commit 4c2479e1c455e2cc46c02cfc28ea2a185f9a7747)
----
- src/sample.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/sample.c b/src/sample.c
-index 87c9f60..59c80b2 100644
---- a/src/sample.c
-+++ b/src/sample.c
-@@ -40,6 +40,7 @@ const char *smp_to_type[SMP_TYPES] = {
-       [SMP_T_IPV6] = "ipv6",
-       [SMP_T_STR]  = "str",
-       [SMP_T_BIN]  = "bin",
-+      [SMP_T_METH] = "meth",
- };
- /* static sample used in sample_process() when <p> is NULL */
--- 
-2.3.6
-
diff --git a/net/haproxy/patches/0017-CLEANUP-deinit-remove-codes-for-cleaning-p-block_rul.patch b/net/haproxy/patches/0017-CLEANUP-deinit-remove-codes-for-cleaning-p-block_rul.patch
deleted file mode 100644 (file)
index bbacca4..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-From 793a74065926b0da87120d4b1e6330234475505c Mon Sep 17 00:00:00 2001
-From: Godbach <nylzhaowei@gmail.com>
-Date: Tue, 9 Jun 2015 19:41:52 +0800
-Subject: [PATCH 17/18] CLEANUP: deinit: remove codes for cleaning
- p->block_rules
-
-Since all rules listed in p->block_rules have been moved to the beginning of
-the http-request rules in check_config_validity(), there is no need to clean
-p->block_rules in deinit().
-
-Signed-off-by: Godbach <nylzhaowei@gmail.com>
-(cherry picked from commit 28b48ccbc879a552f988e6e1db22941e3362b4db)
----
- src/haproxy.c | 6 ------
- 1 file changed, 6 deletions(-)
-
-diff --git a/src/haproxy.c b/src/haproxy.c
-index 0dddd53..eac6f44 100644
---- a/src/haproxy.c
-+++ b/src/haproxy.c
-@@ -1020,12 +1020,6 @@ void deinit(void)
-                       free(cwl);
-               }
--              list_for_each_entry_safe(cond, condb, &p->block_rules, list) {
--                      LIST_DEL(&cond->list);
--                      prune_acl_cond(cond);
--                      free(cond);
--              }
--
-               list_for_each_entry_safe(cond, condb, &p->mon_fail_cond, list) {
-                       LIST_DEL(&cond->list);
-                       prune_acl_cond(cond);
--- 
-2.3.6
-
diff --git a/net/haproxy/patches/0018-BUG-MINOR-ssl-fix-smp_fetch_ssl_fc_session_id.patch b/net/haproxy/patches/0018-BUG-MINOR-ssl-fix-smp_fetch_ssl_fc_session_id.patch
deleted file mode 100644 (file)
index b6113a3..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-From 69760db11dfca4a8d8fbd34cec25c334f77add67 Mon Sep 17 00:00:00 2001
-From: Willy Tarreau <w@1wt.eu>
-Date: Wed, 17 Jun 2015 18:34:14 +0200
-Subject: [PATCH 18/18] BUG/MINOR: ssl: fix smp_fetch_ssl_fc_session_id
-
-Dmitry Sivachenko reported the following build warning using Clang
-which is a real bug :
-
-src/ssl_sock.c:4104:44: warning: address of 'smp->data.str.len' will always
-      evaluate to 'true' [-Wpointer-bool-conversion]
-        if (!smp->data.str.str || !&smp->data.str.len)
-
-The impact is very low however, it will return an empty session_id
-instead of no session id when none is found.
-
-The fix should be backported to 1.5.
-(cherry picked from commit 745d4127582a8c66e2e8ce35f746a78e867960af)
----
- src/ssl_sock.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/ssl_sock.c b/src/ssl_sock.c
-index 93aab8b..7d77d36 100644
---- a/src/ssl_sock.c
-+++ b/src/ssl_sock.c
-@@ -3540,7 +3540,7 @@ smp_fetch_ssl_fc_session_id(struct proxy *px, struct session *l4, void *l7, unsi
-               return 0;
-       smp->data.str.str = (char *)SSL_SESSION_get_id(sess, (unsigned int *)&smp->data.str.len);
--      if (!smp->data.str.str || !&smp->data.str.len)
-+      if (!smp->data.str.str || !smp->data.str.len)
-               return 0;
-       return 1;
--- 
-2.3.6
-
index af97aab588041bc1a1a3b944273bdc6ddeca5fa2..06639975781a41af39974c1ec1bd03504d5b3151 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=iodine
 PKG_VERSION:=0.7.0
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://code.kryo.se/iodine/
diff --git a/net/iodine/patches/100-musl-compatibility.patch b/net/iodine/patches/100-musl-compatibility.patch
new file mode 100644 (file)
index 0000000..17ddc04
--- /dev/null
@@ -0,0 +1,26 @@
+commit 9603c1848ddd4d9bb2d6ab031fcef91f543b71a0
+Author: Maxim Storchak <m.storchak@gmail.com>
+Date:   Thu Jun 25 19:38:24 2015 +0300
+
+    Fix compatibility with musl for OpenWRT
+
+    This patch breaks builds for Windows and Android, but since the only
+    libc flavors OpenWRT currently cares about are musl, uClibc and glibc,
+    this should be fine.
+
+    The reason for such brutal intrusiuon is explained in musl FAQ:
+    http://wiki.musl-libc.org/wiki/FAQ#Q:_why_is_there_no_MUSL_macro_.3F
+
+diff --git a/src/common.c b/src/common.c
+index 2715979..5f0e370 100644
+--- a/src/common.c
++++ b/src/common.c
+@@ -57,7 +57,7 @@
+ const unsigned char raw_header[RAW_HDR_LEN] = { 0x10, 0xd1, 0x9e, 0x00 };
+ /* daemon(3) exists only in 4.4BSD or later, and in GNU libc */
+-#if !defined(ANDROID) && !defined(WINDOWS32) && !(defined(BSD) && (BSD >= 199306)) && !defined(__GLIBC__)
++#ifdef __UCLIBC__
+ static int daemon(int nochdir, int noclose)
+ {
+       int fd, i;
diff --git a/net/iotivity/Makefile b/net/iotivity/Makefile
new file mode 100644 (file)
index 0000000..7653d62
--- /dev/null
@@ -0,0 +1,216 @@
+#
+# Copyright (C) 2015 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:=iotivity
+PKG_VERSION:=0.9.1
+PKG_RELEASE:=1
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL:=https://gerrit.iotivity.org/gerrit/iotivity
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_SOURCE_VERSION:=0.9.1
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
+PKG_MIRROR_MD5SUM:=
+PKG_USE_MIPS16:=0
+
+PKG_MAINTAINER:=Hauke Mehrtens <hauke.mehrtens@lantiq.com>
+
+PKG_LICENSE:=Apache-2.0
+PKG_LICENSE_FILES:=LICENSE.md
+
+PKG_BUILD_DEPENDS:= +boost +libexpat
+
+include $(INCLUDE_DIR)/package.mk
+include $(INCLUDE_DIR)/scons.mk
+
+
+define Package/iotivity
+  SECTION:=net
+  CATEGORY:=Network
+  DEPENDS:=@!USE_UCLIBC +libpthread +librt +libstdcpp +libuuid
+  TITLE:=IoTivity Library
+  URL:=https://www.iotivity.org
+endef
+
+define Package/iotivity/description
+    IoTivity is a framework for the Internet of Things based on the
+    Open Interconnect Consortium Specification.
+endef
+
+
+define Package/iotivity-things-manager-lib
+  SECTION:=net
+  CATEGORY:=Network
+  DEPENDS:=iotivity
+  TITLE:=IoTivity things manager lib
+  URL:=https://www.iotivity.org
+endef
+
+define Package/iotivity-things-manager-lib/description
+    IoTivity things-manager lib
+endef
+
+
+define Package/iotivity-plugin-manager-lib
+  SECTION:=net
+  CATEGORY:=Network
+  DEPENDS:=iotivity +libexpat
+  TITLE:=IoTivity plugin manager lib
+  URL:=https://www.iotivity.org
+endef
+
+define Package/iotivity-plugin-manager-lib/description
+    IoTivity plugin manager lib
+endef
+
+
+define Package/iotivity-mqttclient
+  SECTION:=net
+  CATEGORY:=Network
+  DEPENDS:=iotivity +iotivity-plugin-manager-lib +boost +boost-system
+  TITLE:=IoTivity mqtt Client
+  URL:=https://www.iotivity.org
+endef
+
+define Package/iotivity-mqttclient/description
+    IoTivity mqtt Client
+endef
+
+
+define Package/iotivity-oic-middle
+  SECTION:=net
+  CATEGORY:=Network
+  DEPENDS:=iotivity
+  TITLE:=IoTivity OIC Middle
+  URL:=https://www.iotivity.org
+endef
+
+define Package/iotivity-oic-middle/description
+    IoTivity OIC Middle
+endef
+
+
+define Package/iotivity-things-manager
+  SECTION:=net
+  CATEGORY:=Network
+  DEPENDS:=iotivity +iotivity-things-manager-lib
+  TITLE:=IoTivity things manager
+  URL:=https://www.iotivity.org
+endef
+
+define Package/iotivity-things-manager/description
+    IoTivity things manager
+endef
+
+
+define Package/iotivity-example-garage
+  SECTION:=net
+  CATEGORY:=Network
+  DEPENDS:=iotivity
+  TITLE:=IoTivity Garage example
+  URL:=https://www.iotivity.org
+endef
+
+define Package/iotivity-example-garage/description
+    An IoTivity example application
+endef
+
+
+PKG_CEREAL_NAME:=cereal
+PKG_CEREAL_VERSION:=7121e91e6ab8c3e6a6516d9d9c3e6804e6f65245
+PKG_CEREAL_SOURCE:=$(PKG_CEREAL_NAME)-$(PKG_CEREAL_VERSION).tar.bz2
+PKG_CEREAL_PROTO:=git
+PKG_CEREAL_SOURCE_URL:=https://github.com/USCiLab/cereal.git
+PKG_CEREAL_SUBDIR:=$(PKG_CEREAL_NAME)
+#PKG_CEREAL_MIRROR_MD5SUM:=?
+
+define Download/iotivity-cereal
+  FILE:=$(PKG_CEREAL_SOURCE)
+  URL:=$(PKG_CEREAL_SOURCE_URL)
+  PROTO:=$(PKG_CEREAL_PROTO)
+  VERSION:=$(PKG_CEREAL_VERSION)
+  SUBDIR:=$(PKG_CEREAL_SUBDIR)
+  #MIRROR_MD5SUM:=$(PKG_CEREAL_MIRROR_MD5SUM)
+endef
+$(eval $(call Download,iotivity-cereal))
+
+
+SCONS_OPTIONS += \
+       TARGET_OS=linux \
+       TARGET_TRANSPORT=ALL \
+       TARGET_ARCH=$(ARCH) \
+       STAGING_DIR=$(STAGING_DIR) \
+       mqttclient examples samples libTGMSDK ConServerApp ConClientApp BootstrapServerApp
+
+ifneq ($(findstring c,$(OPENWRT_VERBOSE)),)
+  SCONS_OPTIONS += VERBOSE=true
+endif
+
+define Build/Prepare
+       $(call Build/Prepare/Default)
+       $(TAR) -C $(PKG_BUILD_DIR)/extlibs/cereal -xjf $(DL_DIR)/$(PKG_CEREAL_SOURCE)
+endef
+
+define Build/Configure
+       (cd $(PKG_BUILD_DIR); \
+               $(SCONS_VARS) \
+               scons \
+                       $(SCONS_OPTIONS) \
+       )
+endef
+
+
+define Package/iotivity/install
+       $(INSTALL_DIR) $(1)/usr/lib
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/liboc.so $(1)/usr/lib/liboc.so
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/liboc_logger.so $(1)/usr/lib/liboc_logger.so
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/liboctbstack.so $(1)/usr/lib/liboctbstack.so
+endef
+
+define Package/iotivity-things-manager-lib/install
+       $(INSTALL_DIR) $(1)/usr/lib
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/libTGMSDKLibrary.so $(1)/usr/lib/libTGMSDKLibrary.so
+endef
+
+define Package/iotivity-plugin-manager-lib/install
+       $(INSTALL_DIR) $(1)/usr/lib
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/libpmimpl.so $(1)/usr/lib/libpmimpl.so
+endef
+
+define Package/iotivity-mqttclient/install
+       $(INSTALL_DIR) $(1)/usr/bin
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/service/protocol-plugin/sample-app/linux/mqtt/mqttclient $(1)/usr/bin/mqttclient
+endef
+
+define Package/iotivity-oic-middle/install
+       $(INSTALL_DIR) $(1)/usr/bin
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/examples/OICMiddle/OICMiddle $(1)/usr/bin/OICMiddle
+endef
+
+define Package/iotivity-things-manager/install
+       $(INSTALL_DIR) $(1)/usr/bin
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/service/things-manager/sampleapp/linux/configuration/bootstrapserver $(1)/usr/bin/bootstrapserver
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/service/things-manager/sampleapp/linux/configuration/con-server $(1)/usr/bin/con-server
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/service/things-manager/sampleapp/linux/configuration/con-client $(1)/usr/bin/con-client
+endef
+
+define Package/iotivity-example-garage/install
+       $(INSTALL_DIR) $(1)/usr/bin
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/resource/examples/garageclient $(1)/usr/bin/garageclient
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/resource/examples/garageserver $(1)/usr/bin/garageserver
+endef
+
+
+$(eval $(call BuildPackage,iotivity))
+$(eval $(call BuildPackage,iotivity-things-manager-lib))
+$(eval $(call BuildPackage,iotivity-plugin-manager-lib))
+$(eval $(call BuildPackage,iotivity-mqttclient))
+$(eval $(call BuildPackage,iotivity-oic-middle))
+$(eval $(call BuildPackage,iotivity-things-manager))
+$(eval $(call BuildPackage,iotivity-example-garage))
diff --git a/net/iotivity/patches/001-no_unit_test.patch b/net/iotivity/patches/001-no_unit_test.patch
new file mode 100644 (file)
index 0000000..6ba2265
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/resource/SConscript
++++ b/resource/SConscript
+@@ -61,7 +61,7 @@ if target_os == 'linux':
+       SConscript('csdk/stack/samples/linux/secure/SConscript')
+       # Build C/C++ unit tests
+-      SConscript('unit_tests.scons')
++      # SConscript('unit_tests.scons')
+ elif target_os == 'darwin':
+       # Build linux samples for now.
diff --git a/net/iotivity/patches/002-do-not-chck-for-boost.patch b/net/iotivity/patches/002-do-not-chck-for-boost.patch
new file mode 100644 (file)
index 0000000..21109fd
--- /dev/null
@@ -0,0 +1,29 @@
+From 51e26e002aa043435f94ac0f071066090d5c2de8 Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
+Date: Mon, 22 Jun 2015 20:23:36 +0200
+Subject: [PATCH 5/5] do not chck for boost
+
+Boost is not needed for every package just for some.
+
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+---
+ service/third_party_libs.scons | 8 --------
+ 1 file changed, 8 deletions(-)
+
+--- a/service/third_party_libs.scons
++++ b/service/third_party_libs.scons
+@@ -49,14 +49,6 @@ if target_os in ['linux', 'tizen']:
+               conf = Configure(lib_env)
+-              if target_os not in ['tizen'] and not conf.CheckLib('boost_thread', language='C++'):
+-                      print 'Did not find boost_thread, exiting!'
+-                      Exit(1)
+-
+-              if target_os not in ['tizen'] and not conf.CheckLib('boost_system', language='C++'):
+-                      print 'Did not find boost_system, exiting!'
+-                      Exit(1)
+-
+               lib_env = conf.Finish()
+ ######################################################################
diff --git a/net/iotivity/patches/004-use-env.patch b/net/iotivity/patches/004-use-env.patch
new file mode 100644 (file)
index 0000000..62a2b76
--- /dev/null
@@ -0,0 +1,38 @@
+From 884e831ed07607097614276f6bbf192993228100 Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke.mehrtens@lantiq.com>
+Date: Tue, 2 Jun 2015 11:08:17 +0200
+Subject: [PATCH 3/4] 004-use-env.patch
+
+---
+ build_common/SConscript | 22 ++++++++++++++++++++++
+ 1 file changed, 22 insertions(+)
+
+--- a/build_common/SConscript
++++ b/build_common/SConscript
+@@ -106,6 +106,26 @@ tc_set_msg = '''
+ * cause inexplicable errors.                                                  *
+ *******************************************************************************
+ '''
++env['ENV'] = os.environ
++if 'CC' in os.environ:
++      env['CC'] = Split(os.environ['CC'])
++      print "using CC from enviroment: %s" % env['CC']
++if 'CXX' in os.environ:
++      env['CXX'] = Split(os.environ['CXX'])
++      print "using CXX from enviroment: %s" % env['CXX']
++if 'CFLAGS' in os.environ:
++      env['CFLAGS'] = Split(os.environ['CFLAGS'])
++      print "using CFLAGS from enviroment: %s" % env['CFLAGS']
++if 'CXXFLAGS' in os.environ:
++      env['CXXFLAGS'] = Split(os.environ['CXXFLAGS'])
++      print "using CXXFLAGS from enviroment: %s" % env['CXXFLAGS']
++if 'CPPFLAGS' in os.environ:
++      env['CPPFLAGS'] = Split(os.environ['CPPFLAGS'])
++      print "using CPPFLAGS from enviroment: %s" % env['CPPFLAGS']
++if 'LDFLAGS' in os.environ:
++      env['LINKFLAGS'] = Split(os.environ['LDFLAGS'])
++      print "using LDFLAGS/LINKFLAGS from enviroment: %s" % env['LINKFLAGS']
++
+ if env.get('VERBOSE') == False:
+       env['CCCOMSTR'] = "Compiling $TARGET"
+       env['CXXCOMSTR'] = "Compiling $TARGET"
diff --git a/net/iotivity/patches/010-libcoap-fix-big-endian-problems.patch b/net/iotivity/patches/010-libcoap-fix-big-endian-problems.patch
new file mode 100644 (file)
index 0000000..63a9ad5
--- /dev/null
@@ -0,0 +1,32 @@
+From 62c0a14ccd333d0e55fc431f151253a72a2836d0 Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke.mehrtens@lantiq.com>
+Date: Mon, 8 Jun 2015 21:57:52 +0200
+Subject: [PATCH] libcoap: fix big endian problems
+
+When this is build for a big endian Linux system WORDS_BIGENDIAN was
+not be set. This patch sets it correctly so it will not generate broken
+code on big endian systems.
+This was tested on MIPS BE 32 Bit.
+
+Change-Id: I59dd07d8020c553318e2aa43894a2185fe9b9286
+Signed-off-by: Hauke Mehrtens <hauke.mehrtens@lantiq.com>
+Reviewed-on: https://gerrit.iotivity.org/gerrit/1219
+Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
+Reviewed-by: Erich Keane <erich.keane@intel.com>
+---
+ resource/csdk/connectivity/lib/libcoap-4.1.1/config.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/resource/csdk/connectivity/lib/libcoap-4.1.1/config.h
++++ b/resource/csdk/connectivity/lib/libcoap-4.1.1/config.h
+@@ -135,8 +135,8 @@
+ #  define WORDS_BIGENDIAN 1
+ # endif
+ #else
+-# ifndef WORDS_BIGENDIAN
+-/* #  undef WORDS_BIGENDIAN */
++# if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
++#  define WORDS_BIGENDIAN 1
+ # endif
+ #endif
diff --git a/net/iotivity/patches/011-cdsk-fix-big-endian-problem.patch b/net/iotivity/patches/011-cdsk-fix-big-endian-problem.patch
new file mode 100644 (file)
index 0000000..833f600
--- /dev/null
@@ -0,0 +1,35 @@
+From 7189bc088f558945972d82a9a3427001cb20000a Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke.mehrtens@lantiq.com>
+Date: Mon, 8 Jun 2015 22:03:19 +0200
+Subject: [PATCH] cdsk: fix big endian problem
+
+Without this patch the client will endianes swap the port number when
+sending the detailed request after it got the answer for his multicast
+get. Use the same method for storing the port number in the address
+array in ever part of the code and do not use memcpy and manual
+bytewise coping mixed over the code. memcpy was used once and byte wise
+copy was used twice so I choose the majority.
+This was tested on MIPS BE 32 Bit.
+
+Change-Id: Ib486171987004d10209d2bbf6b1d9ada75235651
+Signed-off-by: Hauke Mehrtens <hauke.mehrtens@lantiq.com>
+Reviewed-on: https://gerrit.iotivity.org/gerrit/1220
+Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
+Reviewed-by: Doug Hudson <douglas.hudson@intel.com>
+Reviewed-by: Erich Keane <erich.keane@intel.com>
+---
+ resource/csdk/stack/src/ocstack.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/resource/csdk/stack/src/ocstack.c
++++ b/resource/csdk/stack/src/ocstack.c
+@@ -723,7 +723,8 @@ OCStackResult UpdateResponseAddr(OCDevAd
+         address->addr[i] = atoi(tok);
+     }
+-    memcpy(&address->addr[4], &endPoint->addressInfo.IP.port, sizeof(uint16_t));
++    address->addr[4] = (uint8_t)endPoint->addressInfo.IP.port;
++    address->addr[5] = (uint8_t)(endPoint->addressInfo.IP.port >> 8);
+     ret = OC_STACK_OK;
+ exit:
diff --git a/net/iotivity/patches/020-Do-not-set-architecture-specific-flags.patch b/net/iotivity/patches/020-Do-not-set-architecture-specific-flags.patch
new file mode 100644 (file)
index 0000000..4c12064
--- /dev/null
@@ -0,0 +1,60 @@
+From 980ef34a085f654e74c9896e8143e6f970049b6c Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
+Date: Mon, 22 Jun 2015 19:39:58 +0200
+Subject: [PATCH 3/5] Do not set architecture specific flags
+
+Setting architecture specific flags causes problems when you want to
+build something which is not covered by these.
+
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+---
+ build_common/linux/SConscript                     | 20 --------------------
+ resource/csdk/connectivity/build/linux/SConscript | 20 --------------------
+ 2 files changed, 40 deletions(-)
+
+--- a/build_common/linux/SConscript
++++ b/build_common/linux/SConscript
+@@ -24,20 +24,3 @@ env.AppendUnique(LINKFLAGS = ['-ldl', '-
+ # Set arch flags
+ target_arch = env.get('TARGET_ARCH')
+-if target_arch in ['x86']:
+-      env.AppendUnique(CCFLAGS = ['-m32'])
+-      env.AppendUnique(LINKFLAGS = ['-m32'])
+-elif target_arch in ['x86_64']:
+-      env.AppendUnique(CCFLAGS = ['-m64'])
+-      env.AppendUnique(LINKFLAGS = ['-m64'])
+-elif target_arch.find('v7a-hard') > 0:
+-      env.AppendUnique(CPPFLAGS = ['-march=armv7-a'])
+-      env.AppendUnique(CPPFLAGS = ['-mfloat-abi=hard'])
+-      env.AppendUnique(CCFLAGS = ['-mfloat-abi=hard'])
+-      env.AppendUnique(LINKFLAGS = ['-mfloat-abi=hard'])
+-elif target_arch.find('v7a') > 0:
+-      env.AppendUnique(CPPFLAGS = ['-march=armv7-a'])
+-elif target_arch.find('arm64') >= 0:
+-      env.AppendUnique(CPPFLAGS = ['-march=armv8-a'])
+-else:
+-      env.AppendUnique(CPPFLAGS = ['-march=armv5te'])
+--- a/resource/csdk/connectivity/build/linux/SConscript
++++ b/resource/csdk/connectivity/build/linux/SConscript
+@@ -22,20 +22,3 @@ env.AppendUnique(LINKFLAGS = ['-ldl', '-
+ # Set arch flags
+ target_arch = env.get('TARGET_ARCH')
+-if target_arch in ['x86']:
+-      env.AppendUnique(CCFLAGS = ['-m32'])
+-      env.AppendUnique(LINKFLAGS = ['-m32'])
+-elif target_arch in ['x86_64']:
+-      env.AppendUnique(CCFLAGS = ['-m64'])
+-      env.AppendUnique(LINKFLAGS = ['-m64'])
+-elif target_arch.find('v7a-hard') > 0:
+-      env.AppendUnique(CPPFLAGS = ['-march=armv7-a'])
+-      env.AppendUnique(CPPFLAGS = ['-mfloat-abi=hard'])
+-      env.AppendUnique(CCFLAGS = ['-mfloat-abi=hard'])
+-      env.AppendUnique(LINKFLAGS = ['-mfloat-abi=hard'])
+-elif target_arch.find('v7a') > 0:
+-      env.AppendUnique(CPPFLAGS = ['-march=armv7-a'])
+-elif target_arch.find('arm64') > 0:
+-      env.AppendUnique(CPPFLAGS = ['-march=armv8-a'])
+-else:
+-      env.AppendUnique(CPPFLAGS = ['-march=armv5te'])
diff --git a/net/iotivity/patches/021-add-some-more-architectures.patch b/net/iotivity/patches/021-add-some-more-architectures.patch
new file mode 100644 (file)
index 0000000..6d570aa
--- /dev/null
@@ -0,0 +1,35 @@
+From f78ba209b14908bf2b6197293e1f9e3458ddba8e Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
+Date: Mon, 22 Jun 2015 19:59:47 +0200
+Subject: [PATCH 4/5] add some more architectures
+
+This does not scale and this check should be removed.
+
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+---
+ build_common/SConscript                     | 2 +-
+ resource/csdk/connectivity/build/SConscript | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+--- a/build_common/SConscript
++++ b/build_common/SConscript
+@@ -14,7 +14,7 @@ host_target_map = {
+ # Map of os and allowed archs (os: allowed archs)
+ os_arch_map = {
+-              'linux': ['x86', 'x86_64', 'arm', 'arm64'],
++              'linux': ['x86', 'x86_64', 'arm', 'arm64', 'mips', 'mipsel', 'mips64', 'mips64el', 'i386', 'powerpc', 'sparc', 'aarch64'],
+               'tizen': ['x86', 'x86_64', 'arm', 'arm64', 'armeabi-v7a'],
+               'android': ['x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'armeabi-v7a-hard', 'arm64-v8a'],
+               'windows': ['x86', 'amd64', 'arm'],
+--- a/resource/csdk/connectivity/build/SConscript
++++ b/resource/csdk/connectivity/build/SConscript
+@@ -14,7 +14,7 @@ host_target_map = {
+ # Map of os and allowed archs (os: allowed archs)
+ os_arch_map = {
+-              'linux': ['x86', 'x86_64', 'arm', 'arm64'],
++              'linux': ['x86', 'x86_64', 'arm', 'arm64', 'mips', 'mipsel', 'mips64', 'mips64el', 'i386', 'powerpc', 'sparc', 'aarch64'],
+               'tizen': ['x86', 'x86_64', 'arm', 'arm64'],
+               'android': ['x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'armeabi-v7a-hard', 'arm64-v8a'],
+               'windows': ['x86', 'amd64', 'arm'],
diff --git a/net/iotivity/patches/030-fix-missing-lib.patch b/net/iotivity/patches/030-fix-missing-lib.patch
new file mode 100644 (file)
index 0000000..c5ba270
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/service/protocol-plugin/sample-app/linux/SConscript
++++ b/service/protocol-plugin/sample-app/linux/SConscript
+@@ -41,7 +41,7 @@ if target_os not in ['windows', 'winrt']
+ sample_env.AppendUnique(LIBS = ['oc', 'oc_logger', 'octbstack',
+                                 'connectivity_abstraction', 'coap',
+-                                'ppm', 'pmimpl', 'dl'])
++                                'ppm', 'boost_system', 'pmimpl', 'dl'])
+ if env.get('SECURED') == '1':
+     sample_env.AppendUnique(LIBS = ['tinydtls'])
diff --git a/net/iotivity/patches/040-fix-things-manager.patch b/net/iotivity/patches/040-fix-things-manager.patch
new file mode 100644 (file)
index 0000000..972841b
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/service/things-manager/sampleapp/linux/configuration/SConscript
++++ b/service/things-manager/sampleapp/linux/configuration/SConscript
+@@ -57,7 +57,7 @@ conserver = linux_sample_env.Program('co
+ conclient = linux_sample_env.Program('con-client', 'con-client.cpp')
+ bootstrapserver = linux_sample_env.Program('bootstrapserver', 'bootstrapserver.cpp')
+ Alias("ConServerApp", conserver)
+-Alias("ConCleintApp", conclient)
++Alias("ConClientApp", conclient)
+ Alias("BootstrapServerApp", bootstrapserver)
+ env.AppendTarget('ConServerApp')
+ env.AppendTarget('ConClientApp')
diff --git a/net/iotivity/patches/050-fix-OICMidle.patch b/net/iotivity/patches/050-fix-OICMidle.patch
new file mode 100644 (file)
index 0000000..a03ed26
--- /dev/null
@@ -0,0 +1,14 @@
+--- a/resource/csdk/stack/include/octypes.h
++++ b/resource/csdk/stack/include/octypes.h
+@@ -35,9 +35,9 @@ extern "C" {
+ //Don't want to expose to application layer that lower level stack is using CoAP.
+ /// Authority + URI string to prefix well known queries
+-#define OC_WELL_KNOWN_QUERY                  "224.0.1.187:5683/oc/core"
++#define OC_WELL_KNOWN_QUERY                  "/oc/core"
+ #define OC_MULTICAST_DISCOVERY_URI           "/oc/core"
+-#define OC_EXPLICIT_DEVICE_DISCOVERY_URI     "224.0.1.187:5683/oc/core/d?rt=core.led"
++#define OC_EXPLICIT_DEVICE_DISCOVERY_URI     "/oc/core/d?rt=core.led"
+ /// Multicast address and port string to prefix multicast queries
+ #define OC_MULTICAST_PREFIX                  "224.0.1.187:5683"
+ /// IP Multicast address to use for multicast requests
index d758b36237d5fe46406d2f4b4d0878dbc78af944..a1c439e133ee5ab4d07934b0e2db91af62b30b1d 100644 (file)
@@ -11,7 +11,7 @@ include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=ipsec-tools
 PKG_VERSION:=0.8.2
-PKG_RELEASE:=3
+PKG_RELEASE:=4
 PKG_MAINTAINER := "Noah Meyerhans <frodo@morgul.net>"
 PKG_LICENSE := BSD-3-Clause
 
@@ -76,12 +76,15 @@ endif
 endef
 
 define Package/ipsec-tools/install
-       $(INSTALL_DIR) $(1)/etc
-       $(INSTALL_CONF) ./files/racoon.conf $(1)/etc/racoon.conf
        $(INSTALL_DIR) $(1)/etc/racoon
-       $(INSTALL_CONF) $(PKG_BUILD_DIR)/src/racoon/samples/psk.txt $(1)/etc/racoon/
+       $(INSTALL_CONF) ./files/functions.sh $(1)/etc/racoon/
+       $(INSTALL_BIN) ./files/p1client-up $(1)/etc/racoon/
+       $(INSTALL_BIN) ./files/p1client-down $(1)/etc/racoon/
+       $(INSTALL_BIN) ./files/vpnctl $(1)/etc/racoon/
        $(INSTALL_DIR) $(1)/etc/init.d
        $(INSTALL_BIN) ./files/racoon.init $(1)/etc/init.d/racoon
+       $(INSTALL_DIR) $(1)/etc/config
+       $(INSTALL_CONF) ./files/racoon $(1)/etc/config/
        $(INSTALL_DIR) $(1)/usr/lib
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/libipsec.so.* $(1)/usr/lib/
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/libracoon.so.* $(1)/usr/lib/
@@ -93,8 +96,7 @@ define Package/ipsec-tools/install
 endef
 
 define Package/ipsec-tools/conffiles
-/etc/racoon.conf
-/etc/racoon/psk.txt
+/etc/config/racoon
 endef
 
 $(eval $(call BuildPackage,ipsec-tools))
diff --git a/net/ipsec-tools/files/functions.sh b/net/ipsec-tools/files/functions.sh
new file mode 100644 (file)
index 0000000..e3e739b
--- /dev/null
@@ -0,0 +1,137 @@
+#!/bin/sh
+#
+# Copyright (C) 2015 Vitaly Protsko <villy@sft.ru>
+
+errno=0
+
+get_fieldval() {
+  local __data="$3"
+  local __rest
+
+  test -z "$1" && return
+
+  while true ; do
+    __rest=${__data#* }
+    test "$__rest" = "$__data" && break
+
+    if [ "${__data/ *}" = "$2" ]; then
+      eval "$1=${__rest/ *}"
+      break
+    fi
+
+    __data="$__rest"
+  done
+}
+
+manage_fw() {
+  local cmd=/usr/sbin/iptables
+  local mode
+  local item
+
+  if [ -z "$4" ]; then
+    $log "Bad usage of manage_fw"
+    errno=3; return 3
+  fi
+
+  case "$1" in
+    add|up|1) mode=A ;;
+    del|down|0) mode=D ;;
+    *) return 3 ;;
+  esac
+
+  for item in $4 ; do
+    $cmd -$mode forwarding_$2_rule -s $item -j ACCEPT
+    $cmd -$mode output_$3_rule -d $item -j ACCEPT
+    $cmd -$mode forwarding_$3_rule -d $item -j ACCEPT
+    $cmd -t nat -$mode postrouting_$3_rule -d $item -j ACCEPT
+  done
+}
+
+manage_sa() {
+  local spdcmd
+  local rtcmd
+  local gate
+  local litem
+  local ritem
+
+  if [ -z "$4" ]; then
+    $log "Bad usage of manage_sa"
+    errno=3; return 3
+  fi
+
+  case "$1" in
+    add|up|1) spdcmd=add; rtcmd=add ;;
+    del|down|0) spdcmd=delete; rtcmd=del ;;
+    *) errno=3; return 3 ;;
+  esac
+
+  get_fieldval gate src "$(/usr/sbin/ip route get $4)"
+  if [ -z "$gate" ]; then
+    $log "Can not find outbound IP for $4"
+    errno=3; return 3
+  fi
+
+
+  for litem in $2 ; do
+    for ritem in $3 ; do
+      echo "
+spd$spdcmd $litem $ritem any -P out ipsec esp/tunnel/$gate-$4/require;
+spd$spdcmd $ritem $litem any -P in ipsec esp/tunnel/$4-$gate/require;
+" | /usr/sbin/setkey -c 1>&2
+    done
+  done
+
+  test -n "$5" && gate=$5
+
+  for ritem in $3 ; do
+    (sleep 3; /usr/sbin/ip route $rtcmd $ritem via $gate) &
+  done
+}
+
+
+. /lib/functions/network.sh
+
+get_zoneiflist() {
+  local item
+  local data
+  local addr
+
+  item=0
+  data=$(uci get firewall.@zone[0].name)
+  while [ -n "$data" ]; do
+    test "$data" = "$1" && break
+    let "item=$item+1"
+    data=$(uci get firewall.@zone[$item].name)
+  done
+
+  if [ -z "$data" ]; then
+    errno=1
+    return $errno
+  fi
+  data=$(uci get firewall.@zone[$item].network)
+
+  echo "$data"
+}
+
+get_zoneiplist() {
+  local item
+  local addr
+  local data
+  local result
+
+  data=$(get_zoneiflist $1)
+  test $? -gt 0 -o $errno -gt 0 -o -z "$data" && return $errno
+
+  for item in $data ; do
+    if network_is_up $item ; then
+      network_get_ipaddrs addr $item
+      test $? -eq 0 && result="$result $addr"
+    fi
+  done
+
+  result=$(echo $result)
+  echo "$result"
+}
+
+
+# EOF /etc/racoon/functions.sh
diff --git a/net/ipsec-tools/files/p1client-down b/net/ipsec-tools/files/p1client-down
new file mode 100644 (file)
index 0000000..8c5a195
--- /dev/null
@@ -0,0 +1,41 @@
+#!/bin/sh
+#
+
+log="logger -t p1client-down[$$]"
+
+. /lib/functions.sh
+. /etc/racoon/functions.sh
+
+if [ -z "$SPLIT_INCLUDE_CIDR" ]; then
+  $log "Connection without server-pushed routing is not supported"
+  exit 1
+fi
+
+$log "Shutting down tunnel to server $REMOTE_ADDR"
+$log "Closing tunnel(-s) to $SPLIT_INCLUDE_CIDR through $INTERNAL_ADDR4"
+
+config_load racoon
+config_get confIntZone racoon int_zone lan
+config_get confExtZone racoon ext_zone wan
+
+manage_fw del $confIntZone $confExtZone "$INTERNAL_ADDR4 $SPLIT_INCLUDE_CIDR"
+
+data=$(get_zoneiflist $confIntZone)
+if [ -n "$data" ]; then
+  for item in $data ; do
+    network_get_subnet locnet $item
+    if [ -n "$locnet" ]; then
+      manage_sa del "$locnet" "$SPLIT_INCLUDE_CIDR" $REMOTE_ADDR $INTERNAL_ADDR4
+    else
+      $log "Can not find subnet on interface $item"
+    fi
+  done
+else
+  $log "Can not find subnets in zone $confIntZone"
+fi
+
+get_fieldval data dev "$(/usr/sbin/ip route get $REMOTE_ADDR)"
+ip address del $INTERNAL_ADDR4/32 dev $data
+
+
+# EOF /etc/racoon/p1client-down
diff --git a/net/ipsec-tools/files/p1client-up b/net/ipsec-tools/files/p1client-up
new file mode 100644 (file)
index 0000000..8a9678a
--- /dev/null
@@ -0,0 +1,41 @@
+#!/bin/sh
+#
+
+log="logger -t p1client-up[$$]"
+
+. /lib/functions.sh
+. /etc/racoon/functions.sh
+
+if [ -z "$SPLIT_INCLUDE_CIDR" ]; then
+  $log "Connection without server-pushed routing is not supported"
+  exit 1
+fi
+
+$log "Setting up tunnel to server $REMOTE_ADDR"
+$log "Making tunnel(-s) to $SPLIT_INCLUDE_CIDR through $INTERNAL_ADDR4"
+
+get_fieldval data dev "$(/usr/sbin/ip route get $REMOTE_ADDR)"
+ip address add $INTERNAL_ADDR4/32 dev $data
+
+config_load racoon
+config_get confIntZone racoon int_zone lan
+config_get confExtZone racoon ext_zone wan
+
+data=$(get_zoneiflist $confIntZone)
+if [ -n "$data" ]; then
+  for item in $data ; do
+    network_get_subnet locnet $item
+    if [ -n "$locnet" ]; then
+      manage_sa add "$locnet" "$SPLIT_INCLUDE_CIDR" $REMOTE_ADDR $INTERNAL_ADDR4
+    else
+      $log "Can not find subnet on interface $item"
+    fi
+  done
+else
+  $log "Can not find interfaces in zone $confIntZone"
+fi
+
+manage_fw add $confIntZone $confExtZone "$INTERNAL_ADDR4 $SPLIT_INCLUDE_CIDR"
+
+
+# EOF /etc/racoon/p1client-up
diff --git a/net/ipsec-tools/files/racoon b/net/ipsec-tools/files/racoon
new file mode 100644 (file)
index 0000000..11cd2f2
--- /dev/null
@@ -0,0 +1,109 @@
+#/etc/config/racoon
+#
+# Copyright 2015 Vitaly Protsko <villy@sft.ru>
+
+# * WARNING: this is "not working" example
+# * Defaults are commented out
+# * Resuting config will appear in /var/racoon/
+
+config racoon
+#      option  debug           0
+#      option  ext_zone        'wan'
+#      option  int_zone        'lan'
+#      option  port            500
+#      option  natt_port       4500
+# following 4 or 6, no default
+#      option  ipversion       4
+
+config p1_proposal 'example_prop1'
+#      option  lifetime        28800
+       option  enc_alg         'aes'
+       option  hash_alg        'sha1'
+       option  auth_method     'rsasig'
+       option  dh_group        2
+
+config p1_proposal 'example_anon'
+#      option  lifetime        28800
+       option  enc_alg         'aes'
+       option  hash_alg        'sha1'
+       option  auth_method     'xauth_rsa_server'
+       option  dh_group        2
+
+config p1_proposal 'example_xauth'
+#      option  lifetime        28800
+       option  enc_alg         'aes'
+       option  hash_alg        'sha1'
+       option  auth_method     'xauth_rsa_client'
+       option  dh_group        2
+
+config p2_proposal 'example_prop2'
+       option  pfs_group       2
+       option  enc_alg         'aes'
+       option  auth_alg        'hmac_sha1'
+
+config p2_proposal 'example_in2'
+       option  pfs_group       2
+#      option  lifetime        14400
+       option  enc_alg         'aes'
+       option  auth_alg        'hmac_sha1'
+
+config sainfo 'office'
+       option  p2_proposal     'example_prop2'
+       option  local_net       '192.168.8.0/24'
+       option  remote_net      '192.168.1.0/24'
+
+config sainfo 'welcome'
+       option  p2_proposal     'example_in2'
+       option  local_net       '192.168.8.0/24'
+       option  remote_net      '192.168.10.0/24'
+       option  dns4            '192.168.8.1'
+       option  defdomain       'myhome.local'
+
+config sainfo 'client'
+       p2_proposal             'std_p2'
+
+config tunnel 'Office'
+       option  enabled         1
+# initial_contact
+#      option  init            1
+       option  remote          'vpn.example.tld'
+       option  exchange_mode   'main'
+       option  certificate     'example_cert'
+#      option  peer_id_type    'asn1dn'
+#      option  prop_check      'obey'
+#      option  verify_id       1
+#      option  weak_p1check    1
+#      option  dpd_delay       ''
+       list    p1_proposal     'example_prop1'
+       list    sainfo          'office'
+
+# WARNING:     Only ONE tunnel with remote anonymous
+#              can be configured and it can have only
+#              ONE sainfo. Otherwise resulting racoon
+#              configuration will be unusable
+config tunnel 'Incoming'
+       option  enabled         1
+       option  remote          'anonymous'
+       option  pre_shared_key  'testitnow'
+       option  exchange_mode   'aggressive,main'
+       option  my_id_type      'fqdn'
+       option  my_id           'myserver.homeip.net'
+       list    p1_proposal     'example_anon'
+       list    sainfo          'welcome'
+
+config tunnel 'Client'
+       option  enabled         1
+       option  remote          'vpn.example.tld'
+       option  username        'testuser'
+       option  password        'testW0rD'
+#      option  mode_cfg        1
+       list    p1_proposal     'example_xauth'
+       list    sainfo          'client'
+
+# Insert corresponding data in PEM format as one line
+config 'certificate' 'example_cert'
+       option  'key'   '-----BEGIN PRIVATE KEY----- ~ -----END PRIVATE KEY-----'
+       option  'crt'   '-----BEGIN CERTIFICATE----- ~ -----END CERTIFICATE-----'
+
+config 'certificate' 'example_ca_cert'
+       option  'crt'   '-----BEGIN CERTIFICATE----- ~ -----END CERTIFICATE-----'
diff --git a/net/ipsec-tools/files/racoon.conf b/net/ipsec-tools/files/racoon.conf
deleted file mode 100644 (file)
index 5c05bcd..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-# Simple racoon.conf
-# 
-# Refer to http://wiki.openwrt.org/doc/howto/vpn.ipsec.basics.racoon for
-# details about configuring racoon in OpenWRT.
-#
-# Also read the Linux IPSEC Howto up at 
-# http://www.ipsec-howto.org/t1.html 
-#
-# Manual pages for ipsec-tools are not included with OpenWRT. Refer to
-# the following locations to view them online:
-# http://linux.die.net/man/8/racoon
-# http://linux.die.net/man/5/racoon.conf
-# http://linux.die.net/man/8/setkey
-#
-
-log notify;
-path pre_shared_key "/etc/racoon/psk.txt";
-path certificate "/etc/racoon/certs";
-
-#remote 172.31.1.1 {
-#        exchange_mode main,aggressive;
-#        proposal {
-#                encryption_algorithm 3des;
-#                hash_algorithm sha1;
-#                authentication_method pre_shared_key;
-#                dh_group modp1024;
-#        }
-#        generate_policy off;
-#}
-# 
-#sainfo address 192.168.203.10[any] any address 192.168.22.0/24[any] any {
-#        pfs_group modp768;
-#        encryption_algorithm 3des;
-#        authentication_algorithm hmac_md5;
-#        compression_algorithm deflate;
-#}
index 68053c91ee39187533a2806b26d09ebcf37bb2c2..6520d5bdeb9e3772d36a567d00849218a2b18044 100644 (file)
 #!/bin/sh /etc/rc.common
-# Copyright (C) 2009-2011 OpenWrt.org
-# Copyright (C) 2011 Artem Makhutov
-# Copyright (C) 2014 Noah Meyerhans <frodo@morgul.net>
+#
+# Copyright (C) 2015 Vitaly Protsko <villy@sft.ru>
+
+#set -vx
 
 USE_PROCD=1
 
-START=49
+START=60
+STOP=40
+
+let connWait=2/2
+confDir=/var/racoon
+confExtZone=
+confIntZone=
+confPort=
+confNATPort=
+confIPMode=
+
+confPh1ID=0
+
+log="logger -t init.d/racoon[$$] "
+
+. /etc/racoon/functions.sh
+
+setup_load() {
+  config_get confExtZone "$1" ext_zone wan
+  config_get confIntZone "$1" int_zone lan
+  config_get confPort    "$1" port 500
+  config_get confNATPort "$1" natt_port 4500
+  config_get confIPMode  "$1" ipversion ""
+
+  case X$confIPMode in
+    X4|X6) ;;
+    *) unset confIPMode ;;
+  esac
+}
+
+write_header() {
+  echo "
+# autogenerated, don't edit, look at /etc/config/racoon
+#
+path certificate \"$confDir/cert\";
+path script \"/etc/racoon\";
+path pre_shared_key \"$confDir/psk.txt\";
+path pidfile \"$confDir/racoon.pid\";
+padding { maximum_length 20; randomize off; strict_check off; exclusive_tail off; }
+timer { counter 5; interval 20 sec; persend 1; phase1 30 sec; phase2 15 sec; }
+"
+}
+
+setup_conf() {
+  local conf=$confDir/racoon.conf
+  local peerconf=$confDir/peers.txt
+  local pskconf=$confDir/psk.txt
+  local item
+  local data
+
+  data="$(get_zoneiplist $confExtZone)"
+  if [ "X$data" = X ]; then
+    $log "No IP addresses found for zone $confExtZone, exitng"
+    errno=2; return 2
+  fi
+
+  write_header > $conf
+  echo -n > $peerconf
+  echo -n > $pskconf
+  chmod 0600 $conf $peerconf $pskconf
+
+  echo "listen {" >> $conf
+  for item in $data ; do
+    echo "  isakmp $item [$confPort]; isakmp_natt $item [$confNATPort];" >> $conf
+  done
+  echo "}" >> $conf
+
+  config_get_bool item "$1" debug 0
+  data=warning
+  test $item -ne 0 && data=debug
+  echo "log $data;" >> $conf
+
+  setup_fw add
+}
+
+setup_p1() {
+  local conf=$confDir/racoon.conf
+  local data
+
+  echo "  proposal {" >> $conf
+  config_get data "$1" lifetime 28800
+  echo "    lifetime time $data sec;" >> $conf
+
+  config_get data "$1" enc_alg
+  test -n "$data" && echo "    encryption_algorithm $data;" >> $conf
+
+  config_get data "$1" hash_alg
+  test -n "$data" && echo "    hash_algorithm $data;" >> $conf
+
+  config_get data "$1" auth_method
+  test -n "$data" && echo "    authentication_method $data;" >> $conf
+
+  config_get data "$1" dh_group 2
+  echo -e "    dh_group $data;\n  }" >> $conf
+}
+
+setup_fw() {
+  local cmd=/usr/sbin/iptables
+  local mode
+
+  case "$1" in
+    add|up|1) mode=A ;;
+    del|down|0) mode=D ;;
+    *) return 3 ;;
+  esac
+
+  $cmd -$mode input_${confExtZone}_rule -p AH -j ACCEPT
+  $cmd -$mode input_${confExtZone}_rule -p ESP -j ACCEPT
+  $cmd -$mode input_${confExtZone}_rule -p UDP --dport $confPort -j ACCEPT
+  $cmd -$mode input_${confExtZone}_rule -p UDP --dport $confNATPort -j ACCEPT
+}
+
+setup_sa() {
+  local conf=$confDir/racoon.conf
+  local remote="${2/ *}"
+  local client="${2#* }"
+  local locnet
+  local remnet
+  local p2
+  local data
+
+  test "$2" = "$client" && unset client
+
+  if [ -z "$client" ]; then
+    config_get locnet "$1" local_net
+    config_get remnet "$1" remote_net
+    if [ -z "$locnet" ] || [ -z "$remnet" ]; then
+      $log "Remote and local networks for $1 must be configured ($2)"
+      errno=4; return 4
+    fi
+
+    if [ "$remote" = "anonymous" ]; then
+      echo "sainfo anonymous {" >> $conf
+     else
+      echo "sainfo address $locnet any address $remnet any {" >> $conf
+    fi
+  else
+    echo "sainfo anonymous {" >> $conf
+  fi
+
+  config_get p2 "$1" p2_proposal
+  if [ -z "$p2" ]; then
+    $log "Phase2 proposal must be configured in $1 sainfo"
+    errno=5; return 5
+  fi
+
+  echo "  remoteid $confPh1ID;" >> $conf
+
+  config_get data "$p2" pfs_group
+  test -n "$data" && echo "  pfs_group $data;" >> $conf
+  config_get data "$p2" lifetime 14400
+  test -n "$data" && echo "  lifetime time $data sec;" >> $conf
+  config_get data "$p2" enc_alg
+  test -n "$data" && echo "  encryption_algorithm $data;" >> $conf
+  config_get data "$p2" auth_alg
+  test -n "$data" && echo "  authentication_algorithm $data;" >> $conf
+
+  echo -e "  compression_algorithm deflate;\n}" >> $conf
+
+  if [ "$remote" = "anonymous" ]; then
+    echo -e "mode_cfg {\n  auth_source system;\n  conf_source local;" >> $conf
+
+    config_get data "$1" dns4
+    test -n "$data" && echo "  dns4 $data;" >> $conf
+    config_get data "$1" defdomain
+    test -n "$data" && echo "  default_domain \"$data\";" >> $conf
+
+    data=${remnet%/*}
+    let "data=${data##*.}+1"
+    echo "  network4 ${remnet%.*}.$data;" >> $conf
+
+    let "data=255<<(24-${remnet#*/}+8)&255"
+    echo "  netmask4 255.255.255.$data;" >> $conf
+
+    echo -e "  split_network include $locnet;\n}" >> $conf
+
+  elif [ -z "$client" ]; then
+    manage_sa add $locnet $remnet $remote
+    test $? -gt 0 -o $errno -gt 0 && return $errno
+
+    manage_fw add $confIntZone $confExtZone $remnet
+  fi
+}
+
+setup_tunnel() {
+  local conf=$confDir/racoon.conf
+  local peerconf=$confDir/peers.txt
+  local data
+  local remote
+  local xauth
+
+  config_get_bool data "$1" enabled 0
+  test "$data" = "0" && return 0
+
+  config_get remote "$1" remote
+  if [ "$remote" = "anonymous" ]; then
+    echo -e "remote anonymous {\n  generate_policy on;" >> $conf
+  else
+    data=$(nslookup "$remote" | awk 'NR == 5 {print $3}')
+    test -n "$data" && remote="$data"
+    echo -e "remote \"$1\" {\n  remote_address $remote;" >> $conf
+    echo "$data" >> $peerconf
+  fi
+
+  config_get data "$1" pre_shared_key ""
+  if [ -n "$data" ]; then
+    if [ "$remote" != "anonymous" ]; then
+      echo "$remote $data" >> $confDir/psk.txt
+    else
+      echo "* $data" >> $confDir/psk.txt
+    fi
+  fi
+
+  let confPh1ID=$confPh1ID+1
+  echo "  ph1id $confPh1ID;" >> $conf
+
+  config_get xauth "$1" username ""
+
+  config_get data "$1" certificate ""
+  if [ -n "$data" ]; then
+    echo -en "  verify_cert on;\n  my_identifier asn1dn;\n  certificate_type x509 " >> $conf
+    echo -en "\"$data.crt\" \"$data.key\";\n  send_cr off;\n  peers_identifier " >> $conf
+  else
+    config_get data "$1" my_id_type ""
+    if [ -n "$data" ]; then
+      echo -n "  my_identifier $data" >> $conf
+      config_get data "$1" my_id ""
+      if [ -n "$data" ]; then
+       echo " \"$data\";" >> $conf
+      elif [ -n "$xauth" ]; then
+       echo " \"$xauth\";" >> $conf
+      else
+       echo ";" >> $conf
+      fi
+    elif [ -n "$xauth" ]; then
+      echo "  my_identifier user_fqdn \"$xauth\";" >> $conf
+    fi
+    echo -n "  peers_identifier " >> $conf
+  fi
+
+  if [ "$remote" = "anonymous" ]; then
+    echo "user_fqdn;" >> $conf
+  else
+    config_get data "$1" peer_id_type "asn1dn"
+    echo -n "$data" >> $conf
+
+    config_get data "$1" peer_id ""
+    test -n "$data" && echo -n " \"$data\"" >> $conf
+
+    echo ";" >> $conf
+  fi
+
+  if [ -n "$xauth" ]; then
+    config_get data "$1" password
+    if [ -z "$data" ]; then
+      $log "Password must be given in $1 tunnel"
+      errno=7; return 7
+    fi
+    echo "$xauth $data" >> $confDir/psk.txt
+
+    echo "  xauth_login \"$xauth\";" >> $conf
+    echo -e "  script \"p1client-up\" phase1_up;\n  script \"p1client-down\" phase1_down;" >> $conf
+  fi
+
+  config_get data "$1" exchange_mode
+  if [ -z "$data" ]; then
+    data=main
+    test -n "$xauth" && data="${data},aggressive"
+  fi
+  echo -e "  exchange_mode $data;\n  nat_traversal on;\n  support_proxy on;" >> $conf
+
+  config_get data "$1" prop_check "obey"
+  test -n "$data" && echo "  proposal_check $data;" >> $conf
+
+  config_get_bool data "$1" weak_p1check 1
+  if [ $data -eq 0 ]; then data=off; else data=on; fi
+  echo "  weak_phase1_check $data;" >> $conf
+
+  config_get_bool data "$1" verify_id 1
+  if [ $data -eq 0 ]; then data=off; else data=on; fi
+  echo "  verify_identifier $data;" >> $conf
+
+  config_get data "$1" dpd_delay ""
+  test -n "$data" && echo "  dpd_delay $data;" >> $conf
+
+  unset data
+  test -n "$xauth" && data="on"
+  config_get data "$1" mode_cfg "$data"
+  test -n "$data" && echo "  mode_cfg $data;" >> $conf
+
+  config_get_bool data "$1" init 0
+  if [ $data -eq 0 ]; then data=off; else data=on; fi
+  echo "  initial_contact $data;" >> $conf
+
+
+  config_list_foreach "$1" p1_proposal setup_p1
+  echo "}" >> $conf
+
+  config_list_foreach "$1" sainfo setup_sa "$remote $xauth"
+}
+
+setup_cert() {
+  local item
+  local data
+
+  for item in key crt ; do
+    config_get data "$1" $item ""
+    test -z "$data" && continue
+
+    echo "$data" |\
+    sed 's/-\+[A-Z ]\+-\+/\n&\n/g' | sed 's/.\{50,50\}/&\n/g' | sed '/^$/d'\
+    > $confDir/cert/$1.$item
+
+    chmod 600 $confDir/cert/$1.$item
+  done
+
+  if [ -s $confDir/cert/$1.crt ]; then
+    data=$(openssl x509 -noout -hash -in $confDir/cert/$1.crt)
+    ln -sf $confDir/cert/$1.crt $confDir/cert/$data.0
+  fi
+}
+
+destroy_sa() {
+  local locnet
+  local remnet
+
+  config_get locnet "$1" local_net
+  config_get remnet "$1" remote_net
+  if [ -z "$locnet" ] || [ -z "$remnet" ]; then
+    $log "Remote and local networks for $1 must be configured"
+    errno=4; return 4
+  fi
+
+  manage_sa del $locnet $remnet $2
+  manage_fw del $confIntZone $confExtZone $remnet
+}
+
+destroy_tunnel() {
+  local data
+
+  config_get_bool data "$1" enabled 0
+  test "$data" = "0" && return 0
+
+  config_get remote "$1" remote
+  data=$(nslookup "$remote" | awk 'NR == 5 {print $3}')
+  test -n "$data" && remote="$data"
+
+  config_get data "$1" username ""
+  if [ -z "$data" ]; then
+    config_list_foreach "$1" sainfo destroy_sa $remote
+  fi
+}
+
+destroy_conf() {
+  setup_fw del
+}
+
+check_software() {
+  local item
+
+  for item in /usr/sbin/setkey /usr/bin/openssl /usr/sbin/ip ; do
+    if [ ! -x $item ]; then
+      $log "Needed program $item not found, exiting"
+      errno=9; return 9
+    fi
+  done
+}
+
+cleanup_conf() {
+  config_load racoon
+  config_foreach setup_load racoon
+  config_foreach destroy_conf racoon
+  config_foreach destroy_tunnel tunnel
+
+  /usr/sbin/setkey -P -F
+  /usr/sbin/setkey -F
+}
+
+check_dir() {
+  local item
+
+  for item in $confDir $confDir/cert ; do
+    if [ ! -d $item ]; then
+      mkdir -m 0700 -p $item
+    fi
+  done
+}
+
+wait4wanzone() {
+  local item=$connWait
+  local data
+
+  data="$(get_zoneiplist $confExtZone)"
+  while [ $item -gt 0 ]; do
+    test -n "$data" && break
+    sleep 2
+    let "item=$item-1"
+    data="$(get_zoneiplist $confExtZone)"
+  done
+
+  test -z "$data" && return 10
+}
 
 start_service() {
-    mkdir -m 0700 -p /var/racoon
-    [ -f /etc/ipsec.conf ] && /usr/sbin/setkey -f /etc/ipsec.conf
-    procd_open_instance
-    procd_set_param command /usr/sbin/racoon -F -f /etc/racoon.conf
-    procd_set_param respawn
-    procd_close_instance
+  check_software
+  test $? -gt 0 -o $errno -gt 0 && exit $errno
+
+  check_dir
+
+  config_load racoon
+  config_foreach setup_load racoon
+
+  config_foreach wait4wanzone racoon
+  if [ $? -gt 0 ] || [ $errno -gt 0 ]; then
+    $log "No active interfaces in $confExtZone zone found, exiting"
+    exit $errno
+  fi
+
+  config_foreach setup_conf racoon
+  test $? -gt 0 -o $errno -gt 0 && exit $errno
+
+  config_foreach setup_tunnel tunnel
+  test $? -gt 0 -o $errno -gt 0 && exit $errno
+
+  config_foreach setup_cert certificate
+
+  procd_open_instance
+  procd_set_param command /usr/sbin/racoon
+  test -n "$confIPMode" && procd_append_param command -$confIPMode
+  procd_append_param command -F -f $confDir/racoon.conf
+  procd_set_param file $confDir/racoon.conf
+  procd_close_instance
+
+  if [ -x /etc/racoon/vpnctl ]; then
+    let connWait=$connWait*2+2
+    ( sleep $connWait; /etc/racoon/vpnctl up ) &
+  fi
+}
+
+service_triggers() {
+  local item
+  local data
+
+  procd_add_reload_trigger "racoon" "network"
+
+  config_load racoon
+  config_foreach setup_load racoon
+
+  data=$(get_zoneiflist $confExtZone)
+  if [ $? -gt 0 ] || [ $errno -gt 0 ] || [ -z "$data" ]; then
+    $log "Can not find interfaces for $confExtZone zone"
+  else
+    for item in $data ; do
+      procd_add_reload_interface_trigger $item
+    done
+  fi
+}
+
+stop_service() {
+  cleanup_conf
+  procd_kill racoon 
 }
+
+trap "cleanup_conf" 1 2 3 4 5 6 7 8 9 10
+
+
+# EOF /etc/init.d/racoon
diff --git a/net/ipsec-tools/files/vpnctl b/net/ipsec-tools/files/vpnctl
new file mode 100644 (file)
index 0000000..5fb6667
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/sh
+#
+
+case X$1 in
+  Xup|X1|Xstart) connMode=vpn-connect ;;
+  Xdown|X0|Xstop) connMode=vpn-disconnect ;;
+  *)
+    echo "Usage: $0: up|1|start || down|0|stop"
+    exit 1 ;;
+esac
+
+if [ -s /var/racoon/peers.txt ]; then
+  (while read ipa ; do
+    racoonctl $connMode $ipa
+  done) < /var/racoon/peers.txt
+fi
+
+
+# EOF /usr/bin/vpnctl
diff --git a/net/ipsec-tools/patches/009-musl-compat.patch b/net/ipsec-tools/patches/009-musl-compat.patch
new file mode 100644 (file)
index 0000000..85d03f9
--- /dev/null
@@ -0,0 +1,187 @@
+--- a/src/racoon/grabmyaddr.c
++++ b/src/racoon/grabmyaddr.c
+@@ -47,7 +47,6 @@
+ #include <net/route.h>
+ #include <net/if.h>
+ #include <net/if_dl.h>
+-#include <sys/sysctl.h>
+ #define USE_ROUTE
+ #endif
+--- a/src/racoon/pfkey.c
++++ b/src/racoon/pfkey.c
+@@ -59,7 +59,6 @@
+ #include <sys/param.h>
+ #include <sys/socket.h>
+ #include <sys/queue.h>
+-#include <sys/sysctl.h>
+ #include <net/route.h>
+ #include <net/pfkeyv2.h>
+--- a/src/setkey/setkey.c
++++ b/src/setkey/setkey.c
+@@ -40,7 +40,6 @@
+ #include <sys/socket.h>
+ #include <sys/time.h>
+ #include <sys/stat.h>
+-#include <sys/sysctl.h>
+ #include <err.h>
+ #include <netinet/in.h>
+ #include <net/pfkeyv2.h>
+--- a/src/libipsec/ipsec_strerror.h
++++ b/src/libipsec/ipsec_strerror.h
+@@ -34,6 +34,8 @@
+ #ifndef _IPSEC_STRERROR_H
+ #define _IPSEC_STRERROR_H
++#include <sys/cdefs.h>
++
+ extern int __ipsec_errcode;
+ extern void __ipsec_set_strerror __P((const char *));
+--- a/src/libipsec/libpfkey.h
++++ b/src/libipsec/libpfkey.h
+@@ -34,6 +34,8 @@
+ #ifndef _LIBPFKEY_H
+ #define _LIBPFKEY_H
++#include <sys/cdefs.h>
++
+ #ifndef KAME_LIBPFKEY_H
+ #define KAME_LIBPFKEY_H
+--- a/src/racoon/backupsa.c
++++ b/src/racoon/backupsa.c
+@@ -276,9 +276,9 @@ do {                                                               \
+               GETNEXTNUM(sa_args.a_keylen, strtoul);
+               GETNEXTNUM(sa_args.flags, strtoul);
+               GETNEXTNUM(sa_args.l_alloc, strtoul);
+-              GETNEXTNUM(sa_args.l_bytes, strtouq);
+-              GETNEXTNUM(sa_args.l_addtime, strtouq);
+-              GETNEXTNUM(sa_args.l_usetime, strtouq);
++              GETNEXTNUM(sa_args.l_bytes, strtoull);
++              GETNEXTNUM(sa_args.l_addtime, strtoull);
++              GETNEXTNUM(sa_args.l_usetime, strtoull);
+               GETNEXTNUM(sa_args.seq, strtoul);
+ #undef GETNEXTNUM
+--- a/src/racoon/cftoken.l
++++ b/src/racoon/cftoken.l
+@@ -77,6 +77,10 @@
+ #include "cfparse.h"
++#ifndef GLOB_TILDE
++#define GLOB_TILDE 0
++#endif
++
+ int yyerrorcount = 0;
+ #if defined(YIPS_DEBUG)
+--- a/src/racoon/logger.h
++++ b/src/racoon/logger.h
+@@ -34,6 +34,8 @@
+ #ifndef _LOGGER_H
+ #define _LOGGER_H
++#include <sys/cdefs.h>
++
+ struct log {
+       int head;
+       int siz;
+--- a/src/racoon/misc.h
++++ b/src/racoon/misc.h
+@@ -34,6 +34,8 @@
+ #ifndef _MISC_H
+ #define _MISC_H
++#include <sys/cdefs.h>
++
+ #define BIT2STR(b) bit2str(b, sizeof(b)<<3)
+ #ifdef HAVE_FUNC_MACRO
+--- a/src/racoon/missing/crypto/sha2/sha2.h
++++ b/src/racoon/missing/crypto/sha2/sha2.h
+@@ -40,6 +40,8 @@
+ #ifndef __SHA2_H__
+ #define __SHA2_H__
++#include <sys/cdefs.h>
++
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
+--- a/src/racoon/netdb_dnssec.h
++++ b/src/racoon/netdb_dnssec.h
+@@ -34,6 +34,8 @@
+ #ifndef _NETDB_DNSSEC_H
+ #define _NETDB_DNSSEC_H
++#include <sys/cdefs.h>
++
+ #ifndef T_CERT
+ #define T_CERT        37              /* defined by RFC2538 section 2 */
+ #endif
+--- a/src/racoon/plog.h
++++ b/src/racoon/plog.h
+@@ -34,6 +34,8 @@
+ #ifndef _PLOG_H
+ #define _PLOG_H
++#include <sys/cdefs.h>
++
+ #ifdef HAVE_STDARG_H
+ #include <stdarg.h>
+ #else
+--- a/src/racoon/str2val.h
++++ b/src/racoon/str2val.h
+@@ -34,6 +34,8 @@
+ #ifndef _STR2VAL_H
+ #define _STR2VAL_H
++#include <sys/cdefs.h>
++
+ extern caddr_t val2str __P((const char *, size_t));
+ extern char *str2val __P((const char *, int, size_t *));
+--- a/src/racoon/vmbuf.h
++++ b/src/racoon/vmbuf.h
+@@ -34,6 +34,8 @@
+ #ifndef _VMBUF_H
+ #define _VMBUF_H
++#include <sys/cdefs.h>
++
+ /*
+  *    bp      v
+  *    v       v
+--- a/src/setkey/extern.h
++++ b/src/setkey/extern.h
+@@ -1,6 +1,6 @@
+ /*    $NetBSD: extern.h,v 1.5 2009/03/06 11:45:03 tteras Exp $        */
+-
++#include <sys/cdefs.h>
+ void parse_init __P((void));
+ int parse __P((FILE **));
+--- a/src/racoon/isakmp_cfg.c
++++ b/src/racoon/isakmp_cfg.c
+@@ -1694,8 +1694,6 @@ isakmp_cfg_accounting_system(port, raddr
+                       "Accounting : '%s' logging on '%s' from %s.\n",
+                       ut.ut_name, ut.ut_line, ut.ut_host);
+-              login(&ut);
+-              
+               break;
+       case ISAKMP_CFG_LOGOUT: 
+@@ -1703,8 +1701,6 @@ isakmp_cfg_accounting_system(port, raddr
+                       "Accounting : '%s' unlogging from '%s'.\n",
+                       usr, term);
+-              logout(term);
+-              
+               break;
+       default:
+               plog(LLV_ERROR, LOCATION, NULL, "Unepected inout\n");
index 04a041fa08d0446537469f276235cc27c7488d95..b68c726bc3990a5379953b27d12fd43040d5731d 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=keepalived
 PKG_VERSION:=1.2.16
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:= http://www.keepalived.org/software
diff --git a/net/keepalived/patches/100-musl-compat.patch b/net/keepalived/patches/100-musl-compat.patch
new file mode 100644 (file)
index 0000000..9668c2b
--- /dev/null
@@ -0,0 +1,10 @@
+--- a/lib/utils.h
++++ b/lib/utils.h
+@@ -31,6 +31,7 @@
+ #include <arpa/inet.h>
+ #include <arpa/nameser.h>
+ #include <sys/param.h>
++#include <sys/types.h>
+ #include <sys/utsname.h>
+ #include <netdb.h>
index fa32c655497f5eaabb8d02462638281ad30737f8..0ed810f045056676cf30f30aba24c1baaa70f9b8 100644 (file)
@@ -8,13 +8,13 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=knot
-PKG_VERSION:=1.6.3
+PKG_VERSION:=1.6.4
 PKG_RELEASE:=1
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
 PKG_SOURCE_URL:=https://secure.nic.cz/files/knot-dns/
-PKG_MD5SUM:=fb744b50493ac7e724d5228ade2e35b1
+PKG_MD5SUM:=a8ac2be2dc7d22c6df1aa5387ae4096b
 
 PKG_MAINTAINER:=Daniel Salzman <daniel.salzman@nic.cz>
 PKG_LICENSE:=GPL-2.0+
index cc7f81d41faf33c9c27648f776d5826361ccdb38..efe1d076184fca8c1f154efb4849e081d6a67ed0 100644 (file)
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=knxd
-PKG_VERSION=2015-06-02-$(PKG_SOURCE_VERSION)
-PKG_RELEASE:=1
+PKG_VERSION=2015-06-27-$(PKG_SOURCE_VERSION)
+PKG_RELEASE:=2
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL:=https://github.com/knxd/knxd.git
-PKG_SOURCE_VERSION:=3d3b1a5e8112397d297625d673a2a94507f9ebce
+PKG_SOURCE_VERSION:=50e7f6e6bfa13c2b6140b0f76aaa70234bf44b1d
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
 
@@ -38,7 +38,7 @@ define Package/knxd
   SECTION:=net
   CATEGORY:=Network
   TITLE:=EIB KNX daemon
-  DEPENDS:=+pthsem +libusb-1.0
+  DEPENDS:=+pthsem +libusb-1.0 +libstdcpp
 endef
 
 define Package/knxd/description
@@ -86,7 +86,7 @@ CONFIGURE_ARGS+= \
        --without-libstdc
 
 EXTRA_LDFLAGS+= \
-       -fno-builtin -nodefaultlibs -lc -lgcc
+       -fno-builtin -largp
 
 define Build/InstallDev
        $(INSTALL_DIR) $(1)/usr/include
diff --git a/net/knxd/patches/0100-musl-compat b/net/knxd/patches/0100-musl-compat
new file mode 100644 (file)
index 0000000..0c2a09b
--- /dev/null
@@ -0,0 +1,10 @@
+--- a/src/examples/common.h    2015-06-27 15:20:15.266563893 +0200
++++ b/src/examples/common.h    2015-06-27 15:23:09.406457392 +0200
+@@ -20,6 +20,7 @@
+ #include <stdlib.h>
+ #include <errno.h>
+ #include <unistd.h>
++#include <sys/select.h>
+ #include "eibclient.h"
+ /** unsigned char*/
index 932fc2a7358246e9203d8687f256521d8eb9b1c6..b42e2a84d94e7dbb9d7111a0284a66b8db183476 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=lighttpd
 PKG_VERSION:=1.4.35
-PKG_RELEASE:=4
+PKG_RELEASE:=5
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=http://download.lighttpd.net/lighttpd/releases-1.4.x
@@ -60,7 +60,7 @@ CONFIGURE_ARGS+= \
        --without-fam \
        --without-gdbm \
        --without-ldap \
-       --without-lua \
+       --with-lua \
        --without-memcache \
        --with-pcre \
        --without-valgrind \
@@ -161,7 +161,7 @@ $(eval $(call BuildPlugin,access,Access restrictions,,30))
 $(eval $(call BuildPlugin,accesslog,Access logging,,30))
 $(eval $(call BuildPlugin,alias,Directory alias,,30))
 $(eval $(call BuildPlugin,cgi,CGI,,30))
-$(eval $(call BuildPlugin,cml,Cache Meta Language,,30))
+$(eval $(call BuildPlugin,cml,Cache Meta Language,+liblua,30))
 $(eval $(call BuildPlugin,compress,Compress output,+PACKAGE_lighttpd-mod-compress:zlib,30))
 $(eval $(call BuildPlugin,evasive,Evasive,,30))
 $(eval $(call BuildPlugin,evhost,Exnhanced Virtual-Hosting,,30))
@@ -169,7 +169,7 @@ $(eval $(call BuildPlugin,expire,Expire,,30))
 $(eval $(call BuildPlugin,extforward,Extract client,,30))
 $(eval $(call BuildPlugin,fastcgi,FastCGI,,30))
 $(eval $(call BuildPlugin,flv_streaming,FLV streaming,,30))
-$(eval $(call BuildPlugin,magnet,Magnet,,30))
+$(eval $(call BuildPlugin,magnet,Magnet,+liblua,30))
 $(eval $(call BuildPlugin,mysql_vhost,Mysql virtual hosting,+PACKAGE_lighttpd-mod-mysql_vhost:libmysqlclient,30))
 $(eval $(call BuildPlugin,proxy,Proxy,,30))
 $(eval $(call BuildPlugin,rewrite,URL rewriting,+PACKAGE_lighttpd-mod-rewrite:libpcre,30))
index 06083fc961bcd3704a70b61162c5d5ab52c77fc2..3af3842bef3ce99d3eb71333cdaf64d899240904 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=linknx
 PKG_VERSION:=0.0.1.32
-PKG_RELEASE:=6
+PKG_RELEASE:=7
 PKG_MD5SUM:=7ecc1208f59bceb05068c752b2250b63
 
 PKG_MAINTAINER:=Othmar Truniger <github@truniger.ch>
@@ -18,6 +18,7 @@ PKG_LICENSE:=GPL-2.0+
 PKG_SOURCE_URL:=@SF/linknx
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_BUILD_DEPENDS:=argp-standalone
+PKG_FORTIFY_SOURCE:=1
 
 include $(INCLUDE_DIR)/package.mk
 
diff --git a/net/linknx/patches/010-musl-compat b/net/linknx/patches/010-musl-compat
new file mode 100644 (file)
index 0000000..15c757e
--- /dev/null
@@ -0,0 +1,10 @@
+--- a/src/eibclient.c  2007-10-11 01:55:31.000000000 +0200
++++ b/src/eibclient.c  2015-06-27 22:18:01.433296921 +0200
+@@ -32,6 +32,7 @@
+ #include <netinet/in.h>
+ #include <netdb.h>
+ #include <errno.h>
++#include <string.h>
+ #include "config.h"
diff --git a/net/linknx/patches/012-fix-linknx.cpp b/net/linknx/patches/012-fix-linknx.cpp
new file mode 100644 (file)
index 0000000..8394cf1
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/src/linknx.cpp   2012-06-04 22:12:13.000000000 +0200
++++ b/src/linknx.cpp   2015-06-27 22:35:23.705721355 +0200
+@@ -136,7 +136,7 @@
+     if (errno)
+         printf (": %s\n", strerror (errno));
+     else
+-        printf ("\n", strerror (errno));
++        printf ("\n");
+     exit (1);
+ }
index c4fbc128338e0e775d817f568e668259008de612..fd8cd87ceeb119be7fa98633293f7b507b2a4ee4 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=luci-app-sqm
 PKG_VERSION:=3
-PKG_RELEASE:=2
+PKG_RELEASE:=5
 PKG_LICENSE:=GPLv2
 LUCI_DIR:=/usr/lib/lua/luci
 
index 49ab13057d2e19e61c654eef268a36b9fb997f3a..6609fc382da31de99d841a88debb1e473ea8fa78 100644 (file)
@@ -36,9 +36,30 @@ s.addremove = true -- set to true to allow adding SQM instances in the GUI
 s.anonymous = true
 
 -- BASIC
-e = s:taboption("tab_basic", Flag, "enabled", translate("Enable"))
+e = s:taboption("tab_basic", Flag, "enabled", translate("Enable this SQM instance."))
 e.rmempty = false
 
+-- sm: following jow's advise, be helpful to the user and enable
+--     sqm's init script if even a single sm instance/interface
+--     is enabled; this is unexpected in that the init script gets
+--     enabled as soon as at least one sqm instance is enabled
+--     and that state is saved, so it does not require "Save & Apply"
+--     to effect the init scripts.
+--     the implementation was inpired/lifted from 
+--     https://github.com/openwrt/luci/blob/master/applications/luci-app-minidlna/luasrc/model/cbi/minidlna.lua
+function e.write(self, section, value)
+    if value == "1" then
+       luci.sys.init.enable("sqm")
+       m.message = translate("The SQM GUI has just enabled the sqm initscript on your behalf. Remember to disable the sqm initscript manually under System Startup menu in case this change was not wished for.")
+--     luci.sys.call("/etc/init.d/sqm start >/dev/null")
+--    else
+--     luci.sys.call("/etc/init.d/sqm stop >/dev/null")
+--     luci.sys.init.disable("sqm")
+    end
+    return Flag.write(self, section, value)
+end
+-- TODO: inform the user what we just did...
+
 n = s:taboption("tab_basic", ListValue, "interface", translate("Interface name"))
 -- sm lifted from luci-app-wol, the original implementation failed to show pppoe-ge00 type interface names
 for _, iface in ipairs(ifaces) do
@@ -71,6 +92,7 @@ c:value("codel")
 c:value("ns2_codel")
 c:value("pie")
 c:value("sfq")
+c:value("cake")
 c.default = "fq_codel"
 c.rmempty = false
 
@@ -89,7 +111,7 @@ sc.default = "simple.qos"
 sc.rmempty = false
 sc.description = qos_desc
 
-ad = s:taboption("tab_qdisc", Flag, "qdisc_advanced", translate("Show and Use Advanced Configuration"))
+ad = s:taboption("tab_qdisc", Flag, "qdisc_advanced", translate("Show and Use Advanced Configuration. Advanced options will only be used as long as this box is checked."))
 ad.default = false
 ad.rmempty = true
 
@@ -121,7 +143,7 @@ eecn.default = "NOECN"
 eecn.rmempty = true
 eecn:depends("qdisc_advanced", "1")
 
-ad2 = s:taboption("tab_qdisc", Flag, "qdisc_really_really_advanced", translate("Show and Use Dangerous Configuration"))
+ad2 = s:taboption("tab_qdisc", Flag, "qdisc_really_really_advanced", translate("Show and Use Dangerous Configuration. Dangerous options will only be used as long as this box is checked."))
 ad2.default = false
 ad2.rmempty = true
 ad2:depends("qdisc_advanced", "1")
@@ -178,7 +200,7 @@ po:depends("linklayer", "ethernet")
 po:depends("linklayer", "atm")
 
 
-adll = s:taboption("tab_linklayer", Flag, "linklayer_advanced", translate("Show Advanced Linklayer Options, (only needed if MTU > 1500)"))
+adll = s:taboption("tab_linklayer", Flag, "linklayer_advanced", translate("Show Advanced Linklayer Options, (only needed if MTU > 1500). Advanced options will only be used as long as this box is checked."))
 adll.rmempty = true
 adll:depends("linklayer", "ethernet")
 -- adll:depends("linklayer", "adsl")
@@ -206,6 +228,7 @@ smpu.rmempty = true
 smpu:depends("linklayer_advanced", "1")
 
 lla = s:taboption("tab_linklayer", ListValue, "linklayer_adaptation_mechanism", translate("Which linklayer adaptation mechanism to use; for testing only"))
+lla:value("cake")
 lla:value("htb_private")
 lla:value("tc_stab", "tc_stab ("..translate("default")..")")
 lla.default = "tc_stab"
index 9498baf0ef39788894646cd7cb9e8bc5cb96f273..f3ca9bacffc8711db7145102483afefdfb559c92 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2006-2014 OpenWrt.org
+# Copyright (C) 2006-2015 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,12 +8,16 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=mtr
-PKG_VERSION:=0.86
+PKG_REV:=dd2b750
+PKG_VERSION:=0.85+newdns-$(PKG_REV)
 PKG_RELEASE:=2
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
-PKG_SOURCE_URL:=ftp://ftp.bitwizard.nl/mtr
-PKG_MD5SUM:=8d63592c9d4579ef20cf491b41843eb2
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL:=https://github.com/traviscross/mtr.git
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_SOURCE_VERSION:=$(PKG_REV)
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
+
 PKG_LICENSE:=GPL-2.0+
 PKG_LICENSE_FILES:=COPYING
 
diff --git a/net/mtr/patches/100-disabled-ipv6-fix.patch b/net/mtr/patches/100-disabled-ipv6-fix.patch
new file mode 100644 (file)
index 0000000..5ef9984
--- /dev/null
@@ -0,0 +1,49 @@
+--- a/net.c
++++ b/net.c
+@@ -307,9 +307,11 @@ void net_send_tcp(int index)
+   struct sockaddr_storage local;
+   struct sockaddr_storage remote;
+   struct sockaddr_in *local4 = (struct sockaddr_in *) &local;
+-  struct sockaddr_in6 *local6 = (struct sockaddr_in6 *) &local;
+   struct sockaddr_in *remote4 = (struct sockaddr_in *) &remote;
++#ifdef ENABLE_IPV6
++  struct sockaddr_in6 *local6 = (struct sockaddr_in6 *) &local;
+   struct sockaddr_in6 *remote6 = (struct sockaddr_in6 *) &remote;
++#endif
+   socklen_t len;
+   ttl = index + 1;
+@@ -566,8 +568,10 @@ void net_send_query(int index)
+   /* sendto() assumes packet length includes the IPv4 header but not the 
+      IPv6 header. */
+-  spacketsize = abs(packetsize)       -
+-              ( ( af == AF_INET ) ? 0 : sizeof (struct ip6_hdr) );
++  spacketsize = abs(packetsize);
++#ifdef ENABLE_IPV6
++  spacketsize -= ( ( af == AF_INET ) ? 0 : sizeof (struct ip6_hdr) );
++#endif
+   rv = sendto(sendsock, packet, spacketsize, 0, remotesockaddr, salen);
+   if (first && (rv < 0) && ((errno == EINVAL) || (errno == EMSGSIZE))) {
+     /* Try the first packet again using host byte order. */
+--- a/dns.c
++++ b/dns.c
+@@ -49,7 +49,7 @@
+ #include <unistd.h>
+ #include <fcntl.h>
+ //#include <ctype.h>
+-//#include <string.h>
++#include <string.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <signal.h>
+--- a/net.h
++++ b/net.h
+@@ -20,6 +20,7 @@
+ #include <netdb.h>
+ #include <arpa/inet.h>
+ #include <netinet/in.h>
++#include <sys/select.h>
+ #include <sys/socket.h>
+ #ifdef ENABLE_IPV6
+ #include <netinet/ip6.h>
diff --git a/net/mtr/patches/501-dns.patch b/net/mtr/patches/501-dns.patch
deleted file mode 100644 (file)
index e50b7fb..0000000
+++ /dev/null
@@ -1,510 +0,0 @@
---- a/dns.c
-+++ b/dns.c
-@@ -921,6 +921,507 @@ void restell(char *s)
-   fputs("\r",stderr);
- }
-+#ifdef __UCLIBC__
-+
-+static const char       digits[] = "0123456789";
-+#define __set_errno(e) (errno = (e))
-+
-+#define NS_PUT16(s, cp) do { \
-+        register u_int16_t t_s = (u_int16_t)(s); \
-+        register u_char *t_cp = (u_char *)(cp); \
-+        *t_cp++ = t_s >> 8; \
-+        *t_cp   = t_s; \
-+        (cp) += NS_INT16SZ; \
-+} while (0)
-+
-+
-+
-+#define NS_PUT32(l, cp) do { \
-+        register u_int32_t t_l = (u_int32_t)(l); \
-+        register u_char *t_cp = (u_char *)(cp); \
-+        *t_cp++ = t_l >> 24; \
-+        *t_cp++ = t_l >> 16; \
-+        *t_cp++ = t_l >> 8; \
-+        *t_cp   = t_l; \
-+        (cp) += NS_INT32SZ; \
-+} while (0)
-+
-+
-+void
-+ns_put16(u_int src, u_char *dst) {
-+        NS_PUT16(src, dst);
-+}
-+
-+void
-+ns_put32(u_long src, u_char *dst) {
-+        NS_PUT32(src, dst);
-+}
-+
-+void __putshort(u_int16_t src, u_char *dst) { ns_put16(src, dst); }
-+void __putlong(u_int32_t src, u_char *dst) { ns_put32(src, dst); }
-+
-+int
-+mklower(int ch) {
-+        if (ch >= 0x41 && ch <= 0x5A)
-+                return (ch + 0x20);
-+        return (ch);
-+}
-+
-+
-+static int
-+dn_find(const u_char *domain, const u_char *msg,
-+        const u_char * const *dnptrs,
-+        const u_char * const *lastdnptr)
-+{
-+        const u_char *dn, *cp, *sp;
-+        const u_char * const *cpp;
-+        u_int n;
-+
-+        for (cpp = dnptrs; cpp < lastdnptr; cpp++) {
-+                sp = *cpp;
-+                /*
-+                 * terminate search on:
-+                 * root label
-+                 * compression pointer
-+                 * unusable offset
-+                 */
-+                while (*sp != 0 && (*sp & NS_CMPRSFLGS) == 0 &&
-+                       (sp - msg) < 0x4000) {
-+                        dn = domain;
-+                        cp = sp;
-+                        while ((n = *cp++) != 0) {
-+                                /*
-+                                 * check for indirection
-+                                 */
-+                                switch (n & NS_CMPRSFLGS) {
-+                                case 0:         /* normal case, n == len */
-+                                        if (n != *dn++)
-+                                                goto next;
-+                                        for ((void)NULL; n > 0; n--)
-+                                                if (mklower(*dn++) !=
-+                                                    mklower(*cp++))
-+                                                        goto next;
-+                                        /* Is next root for both ? */
-+                                        if (*dn == '\0' && *cp == '\0')
-+                                                return (sp - msg);
-+                                        if (*dn)
-+                                                continue;
-+                                        goto next;
-+
-+                                case NS_CMPRSFLGS:      /* indirection */
-+                                        cp = msg + (((n & 0x3f) << 8) | *cp);
-+                                        break;
-+
-+                                default:        /* illegal type */
-+                                        __set_errno (EMSGSIZE);
-+                                        return (-1);
-+                                }
-+                        }
-+ next:
-+                        sp += *sp + 1;
-+                }
-+        }
-+        __set_errno (ENOENT);
-+        return (-1);
-+}
-+
-+
-+int
-+ns_name_pack(const u_char *src, u_char *dst, int dstsiz,
-+             const u_char **dnptrs, const u_char **lastdnptr)
-+{
-+        u_char *dstp;
-+        const u_char **cpp, **lpp, *eob, *msg;
-+        const u_char *srcp;
-+        int n, l, first = 1;
-+
-+        srcp = src;
-+        dstp = dst;
-+        eob = dstp + dstsiz;
-+        lpp = cpp = NULL;
-+        if (dnptrs != NULL) {
-+                if ((msg = *dnptrs++) != NULL) {
-+                        for (cpp = dnptrs; *cpp != NULL; cpp++)
-+                                (void)NULL;
-+                        lpp = cpp;      /* end of list to search */
-+                }
-+        } else
-+                msg = NULL;
-+
-+        /* make sure the domain we are about to add is legal */
-+        l = 0;
-+        do {
-+                n = *srcp;
-+                if ((n & NS_CMPRSFLGS) != 0 && n != 0x41) {
-+                        __set_errno (EMSGSIZE);
-+                        return (-1);
-+                }
-+                if (n == 0x41)
-+                        n = *++srcp / 8;
-+                l += n + 1;
-+                if (l > MAXCDNAME) {
-+                        __set_errno (EMSGSIZE);
-+                        return (-1);
-+                }
-+                srcp += n + 1;
-+        } while (n != 0);
-+
-+        /* from here on we need to reset compression pointer array on error */
-+        srcp = src;
-+        do {
-+                /* Look to see if we can use pointers. */
-+                n = *srcp;
-+                if (n != 0 && n != 0x41 && msg != NULL) {
-+                        l = dn_find(srcp, msg, (const u_char * const *)dnptrs,
-+                                    (const u_char * const *)lpp);
-+                        if (l >= 0) {
-+                                if (dstp + 1 >= eob) {
-+                                        goto cleanup;
-+                                }
-+                                *dstp++ = (l >> 8) | NS_CMPRSFLGS;
-+                                *dstp++ = l % 256;
-+                                return (dstp - dst);
-+                        }
-+                        /* Not found, save it. */
-+                        if (lastdnptr != NULL && cpp < lastdnptr - 1 &&
-+                            (dstp - msg) < 0x4000 && first) {
-+                                *cpp++ = dstp;
-+                                *cpp = NULL;
-+                                first = 0;
-+                        }
-+                }
-+                /* copy label to buffer */
-+                if ((n & NS_CMPRSFLGS) != 0 && n != 0x41) {             /* Should not happen. */
-+                        goto cleanup;
-+                }
-+                if (n == 0x41) {
-+                        n = *++srcp / 8;
-+                        if (dstp + 1 >= eob)
-+                                goto cleanup;
-+                        *dstp++ = 0x41;
-+                }
-+                if (dstp + 1 + n >= eob) {
-+                        goto cleanup;
-+                }
-+                memcpy(dstp, srcp, n + 1);
-+                srcp += n + 1;
-+                dstp += n + 1;
-+        } while (n != 0);
-+
-+        if (dstp > eob) {
-+cleanup:
-+                if (msg != NULL)
-+                        *lpp = NULL;
-+                __set_errno (EMSGSIZE);
-+                return (-1);
-+        }
-+        return (dstp - dst);
-+}
-+
-+
-+int
-+ns_name_pton(const char *src, u_char *dst, size_t dstsiz) {
-+        u_char *label, *bp, *eom;
-+        int c, n, escaped;
-+        char *cp;
-+
-+        escaped = 0;
-+        bp = dst;
-+        eom = dst + dstsiz;
-+        label = bp++;
-+
-+        while ((c = *src++) != 0) {
-+                if (escaped) {
-+                        if ((cp = strchr(digits, c)) != NULL) {
-+                                n = (cp - digits) * 100;
-+                                if ((c = *src++) == 0 ||
-+                                    (cp = strchr(digits, c)) == NULL) {
-+                                        __set_errno (EMSGSIZE);
-+                                        return (-1);
-+                                }
-+                                n += (cp - digits) * 10;
-+                                if ((c = *src++) == 0 ||
-+                                    (cp = strchr(digits, c)) == NULL) {
-+                                        __set_errno (EMSGSIZE);
-+                                        return (-1);
-+                                }
-+                                n += (cp - digits);
-+                                if (n > 255) {
-+                                        __set_errno (EMSGSIZE);
-+                                        return (-1);
-+                                }
-+                                c = n;
-+                        } else if (c == '[' && label == bp - 1 && *src == 'x') {
-+                                /* Theoretically we would have to handle \[o
-+                                   as well but we do not since we do not need
-+                                   it internally.  */
-+                                *label = 0x41;
-+                                label = bp++;
-+                                ++src;
-+                                while (isxdigit (*src)) {
-+                                        n = *src > '9' ? *src - 'a' + 10 : *src - '0';
-+                                        ++src;
-+                                        if (! isxdigit(*src)) {
-+                                                __set_errno (EMSGSIZE);
-+                                                return (-1);
-+                                        }
-+                                        n <<= 4;
-+                                        n += *src > '9' ? *src - 'a' + 10 : *src - '0';
-+                                        if (bp + 1 >= eom) {
-+                                                __set_errno (EMSGSIZE);
-+                                                return (-1);
-+                                        }
-+                                        *bp++ = n;
-+                                        ++src;
-+                                }
-+                                *label = (bp - label - 1) * 8;
-+                                if (*src++ != ']' || *src++ != '.') {
-+                                        __set_errno (EMSGSIZE);
-+                                        return (-1);
-+                                }
-+                                escaped = 0;
-+                                label = bp++;
-+                                if (bp >= eom) {
-+                                        __set_errno (EMSGSIZE);
-+                                        return (-1);
-+                                }
-+                                continue;
-+                        }
-+                        escaped = 0;
-+                } else if (c == '\\') {
-+                        escaped = 1;
-+                        continue;
-+                } else if (c == '.') {
-+                        c = (bp - label - 1);
-+                        if ((c & NS_CMPRSFLGS) != 0) {  /* Label too big. */
-+                                __set_errno (EMSGSIZE);
-+                                return (-1);
-+                        }
-+                        if (label >= eom) {
-+                                __set_errno (EMSGSIZE);
-+                                return (-1);
-+                        }
-+                        *label = c;
-+                        /* Fully qualified ? */
-+                        if (*src == '\0') {
-+                                if (c != 0) {
-+                                        if (bp >= eom) {
-+                                                __set_errno (EMSGSIZE);
-+                                                return (-1);
-+                                        }
-+                                        *bp++ = '\0';
-+                                }
-+                                if ((bp - dst) > MAXCDNAME) {
-+                                        __set_errno (EMSGSIZE);
-+                                        return (-1);
-+                                }
-+                                return (1);
-+                        }
-+                        if (c == 0 || *src == '.') {
-+                                __set_errno (EMSGSIZE);
-+                                return (-1);
-+                        }
-+                        label = bp++;
-+                        continue;
-+                }
-+                if (bp >= eom) {
-+                        __set_errno (EMSGSIZE);
-+                        return (-1);
-+                }
-+                *bp++ = (u_char)c;
-+        }
-+        c = (bp - label - 1);
-+        if ((c & NS_CMPRSFLGS) != 0) {          /* Label too big. */
-+                __set_errno (EMSGSIZE);
-+                return (-1);
-+        }
-+        if (label >= eom) {
-+                __set_errno (EMSGSIZE);
-+                return (-1);
-+        }
-+        *label = c;
-+        if (c != 0) {
-+                if (bp >= eom) {
-+                        __set_errno (EMSGSIZE);
-+                        return (-1);
-+                }
-+                *bp++ = 0;
-+        }
-+        if ((bp - dst) > MAXCDNAME) {   /* src too big */
-+                __set_errno (EMSGSIZE);
-+                return (-1);
-+        }
-+        return (0);
-+}
-+
-+
-+
-+int
-+ns_name_compress(const char *src, u_char *dst, size_t dstsiz,
-+                 const u_char **dnptrs, const u_char **lastdnptr)
-+{
-+        u_char tmp[NS_MAXCDNAME];
-+
-+        if (ns_name_pton(src, tmp, sizeof tmp) == -1)
-+                return (-1);
-+        return (ns_name_pack(tmp, dst, dstsiz, dnptrs, lastdnptr));
-+}
-+
-+
-+int
-+dn_comp(const char *src, u_char *dst, int dstsiz,
-+        u_char **dnptrs, u_char **lastdnptr)
-+{
-+        return (ns_name_compress(src, dst, (size_t)dstsiz,
-+                                 (const u_char **)dnptrs,
-+                                 (const u_char **)lastdnptr));
-+}
-+
-+
-+
-+
-+int
-+res_nmkquery(res_state statp,
-+             int op,                    /* opcode of query */
-+             const char *dname,         /* domain name */
-+             int class, int type,       /* class and type of query */
-+             const u_char *data,        /* resource record data */
-+             int datalen,               /* length of data */
-+             const u_char *newrr_in,    /* new rr for modify or append */
-+             u_char *buf,               /* buffer to put query */
-+             int buflen)                /* size of buffer */
-+{
-+        register HEADER *hp;
-+        register u_char *cp;
-+        register int n;
-+        u_char *dnptrs[20], **dpp, **lastdnptr;
-+
-+#ifdef DEBUG
-+        if (statp->options & RES_DEBUG)
-+                printf(";; res_nmkquery(%s, %s, %s, %s)\n",
-+                       _res_opcodes[op], dname, p_class(class), p_type(type));
-+#endif
-+        /*
-+         * Initialize header fields.
-+         */
-+        if ((buf == NULL) || (buflen < HFIXEDSZ))
-+                return (-1);
-+        memset(buf, 0, HFIXEDSZ);
-+        hp = (HEADER *) buf;
-+        /* We randomize the IDs every time.  The old code just
-+           incremented by one after the initial randomization which
-+           still predictable if the application does multiple
-+           requests.  */
-+#if 0
-+        hp->id = htons(++statp->id);
-+#else
-+        hp->id = htons(statp->id);
-+        int randombits;
-+        do
-+          {
-+#ifdef RANDOM_BITS
-+            RANDOM_BITS (randombits);
-+#else
-+            struct timeval tv;
-+            gettimeofday (&tv, NULL);
-+            randombits = (tv.tv_sec << 8) ^ tv.tv_usec;
-+#endif
-+          }
-+        while ((randombits & 0xffff) == 0);
-+        statp->id = (statp->id + randombits) & 0xffff;
-+#endif
-+        hp->opcode = op;
-+        hp->rd = (statp->options & RES_RECURSE) != 0;
-+        hp->rcode = NOERROR;
-+        cp = buf + HFIXEDSZ;
-+        buflen -= HFIXEDSZ;
-+        dpp = dnptrs;
-+        *dpp++ = buf;
-+        *dpp++ = NULL;
-+        lastdnptr = dnptrs + sizeof dnptrs / sizeof dnptrs[0];
-+        /*
-+         * perform opcode specific processing
-+         */
-+        switch (op) {
-+        case QUERY:     /*FALLTHROUGH*/
-+        case NS_NOTIFY_OP:
-+                if ((buflen -= QFIXEDSZ) < 0)
-+                        return (-1);
-+                if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0)
-+                        return (-1);
-+                cp += n;
-+                buflen -= n;
-+                __putshort(type, cp);
-+                cp += INT16SZ;
-+                __putshort(class, cp);
-+                cp += INT16SZ;
-+                hp->qdcount = htons(1);
-+                if (op == QUERY || data == NULL)
-+                        break;
-+                /*
-+                 * Make an additional record for completion domain.
-+                 */
-+                buflen -= RRFIXEDSZ;
-+                n = dn_comp((char *)data, cp, buflen, dnptrs, lastdnptr);
-+                if (n < 0)
-+                        return (-1);
-+                cp += n;
-+                buflen -= n;
-+                __putshort(T_NULL, cp);
-+                cp += INT16SZ;
-+                __putshort(class, cp);
-+                cp += INT16SZ;
-+                __putlong(0, cp);
-+                cp += INT32SZ;
-+                __putshort(0, cp);
-+                cp += INT16SZ;
-+                hp->arcount = htons(1);
-+                break;
-+
-+        case IQUERY:
-+                /*
-+                 * Initialize answer section
-+                 */
-+                if (buflen < 1 + RRFIXEDSZ + datalen)
-+                        return (-1);
-+                *cp++ = '\0';   /* no domain name */
-+                __putshort(type, cp);
-+                cp += INT16SZ;
-+                __putshort(class, cp);
-+                cp += INT16SZ;
-+                __putlong(0, cp);
-+                cp += INT32SZ;
-+                __putshort(datalen, cp);
-+                cp += INT16SZ;
-+                if (datalen) {
-+                        memcpy(cp, data, datalen);
-+                        cp += datalen;
-+                }
-+                hp->ancount = htons(1);
-+                break;
-+
-+        default:
-+                return (-1);
-+        }
-+        return (cp - buf);
-+}
-+
-+int
-+res_mkquery(int op,                     /* opcode of query */
-+            const char *dname,          /* domain name */
-+            int class, int type,        /* class and type of query */
-+            const u_char *data,         /* resource record data */
-+            int datalen,                /* length of data */
-+            const u_char *newrr_in,     /* new rr for modify or append */
-+            u_char *buf,                /* buffer to put query */
-+            int buflen)                 /* size of buffer */
-+{
-+        return (res_nmkquery(&_res, op, dname, class, type,
-+                             data, datalen,
-+                             newrr_in, buf, buflen));
-+}
-+
-+#endif
- void dorequest(char *s,int type,word id)
- {
diff --git a/net/mtr/patches/502-fix-res_ninit.patch b/net/mtr/patches/502-fix-res_ninit.patch
deleted file mode 100644 (file)
index 2d9883b..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
---- a/dns.c
-+++ b/dns.c
-@@ -1308,28 +1308,6 @@ res_nmkquery(res_state statp,
-                 return (-1);
-         memset(buf, 0, HFIXEDSZ);
-         hp = (HEADER *) buf;
--        /* We randomize the IDs every time.  The old code just
--           incremented by one after the initial randomization which
--           still predictable if the application does multiple
--           requests.  */
--#if 0
--        hp->id = htons(++statp->id);
--#else
--        hp->id = htons(statp->id);
--        int randombits;
--        do
--          {
--#ifdef RANDOM_BITS
--            RANDOM_BITS (randombits);
--#else
--            struct timeval tv;
--            gettimeofday (&tv, NULL);
--            randombits = (tv.tv_sec << 8) ^ tv.tv_usec;
--#endif
--          }
--        while ((randombits & 0xffff) == 0);
--        statp->id = (statp->id + randombits) & 0xffff;
--#endif
-         hp->opcode = op;
-         hp->rd = (statp->options & RES_RECURSE) != 0;
-         hp->rcode = NOERROR;
index 6656806b5a32e1b70d43d8aeddaa6a41d59539ad..d74b15263ddeb43581c1d4eb0b40304e0072c904 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=luci-app-mwan3
 PKG_VERSION:=1.4
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 PKG_MAINTAINER:=Aedan Renner <chipdankly@gmail.com>
 PKG_LICENSE:=GPLv2
 
index b8f6605832b9e2f443a8c360152f273706365c32..6e2875e3de7b3e246a6aab8a2e833d3db131db1d 100755 (executable)
@@ -13,7 +13,7 @@ send_alert()
 gather_event_info()
 {
        # create event information message
-       local EVENT_INFO="Interface [ "$INTERFACE" ($DEVICE) ] on router [ "$(uci get -p /var/state system.@system[0].hostname)" ] has triggered a hotplug [ "$ACTION" ] event on "$(date +"%a %b %d %Y %T %Z")""
+       local EVENT_INFO="Interface [ "$INTERFACE" ($DEVICE) ] on router [ "$(uci -p /var/state get system.@system[0].hostname)" ] has triggered a hotplug [ "$ACTION" ] event on "$(date +"%a %b %d %Y %T %Z")""
 
        # get current interface, policy and rule status
        local CURRENT_STATUS="$(/usr/sbin/mwan3 status)"
index d40ad0116d1d3cefcaa8fe14e2b47584eda1a53b..7fe4442c9a9b4bdfddc0a21b94557749e4c65819 100644 (file)
@@ -60,9 +60,9 @@ function index()
 end
 
 function getInterfaceStatus(ruleNumber, interfaceName)
-       if ut.trim(sys.exec("uci get -p /var/state mwan3." .. interfaceName .. ".enabled")) == "1" then
+       if ut.trim(sys.exec("uci -p /var/state get mwan3." .. interfaceName .. ".enabled")) == "1" then
                if ut.trim(sys.exec("ip route list table " .. ruleNumber)) ~= "" then
-                       if ut.trim(sys.exec("uci get -p /var/state mwan3." .. interfaceName .. ".track_ip")) ~= "" then
+                       if ut.trim(sys.exec("uci -p /var/state get mwan3." .. interfaceName .. ".track_ip")) ~= "" then
                                return "online"
                        else
                                return "notMonitored"
@@ -98,7 +98,7 @@ function interfaceStatus()
                wansid = {}
 
                for wanName, interfaceState in string.gfind(statusString, "([^%[]+)%[([^%]]+)%]") do
-                       local wanInterfaceName = ut.trim(sys.exec("uci get -p /var/state network." .. wanName .. ".ifname"))
+                       local wanInterfaceName = ut.trim(sys.exec("uci -p /var/state get network." .. wanName .. ".ifname"))
                                if wanInterfaceName == "" then
                                        wanInterfaceName = "X"
                                end
@@ -159,7 +159,7 @@ function diagnosticsData(interface, tool, task)
                        results = "MWAN3 started"
                end
        else
-               local interfaceDevice = ut.trim(sys.exec("uci get -p /var/state network." .. interface .. ".ifname"))
+               local interfaceDevice = ut.trim(sys.exec("uci -p /var/state get network." .. interface .. ".ifname"))
                if interfaceDevice ~= "" then
                        if tool == "ping" then
                                local gateway = ut.trim(sys.exec("route -n | awk '{if ($8 == \"" .. interfaceDevice .. "\" && $1 == \"0.0.0.0\" && $3 == \"0.0.0.0\") print $2}'"))
@@ -168,7 +168,7 @@ function diagnosticsData(interface, tool, task)
                                                local pingCommand = "ping -c 3 -W 2 -I " .. interfaceDevice .. " " .. gateway
                                                results = pingCommand .. "\n\n" .. sys.exec(pingCommand)
                                        else
-                                               local tracked = ut.trim(sys.exec("uci get -p /var/state mwan3." .. interface .. ".track_ip"))
+                                               local tracked = ut.trim(sys.exec("uci -p /var/state get mwan3." .. interface .. ".track_ip"))
                                                if tracked ~= "" then
                                                        for z in tracked:gmatch("[^ ]+") do
                                                                local pingCommand = "ping -c 3 -W 2 -I " .. interfaceDevice .. " " .. z
@@ -223,16 +223,18 @@ function diagnosticsData(interface, tool, task)
 end
 
 function troubleshootingData()
+       local ver = require "luci.version"
+
        local mArray = {}
 
        -- software versions
-       local wrtRelease = ut.trim(luci.version.distversion)
+       local wrtRelease = ut.trim(ver.distversion)
                if wrtRelease ~= "" then
                        wrtRelease = "OpenWrt - " .. wrtRelease
                else
                        wrtRelease = "OpenWrt - unknown"
                end
-       local luciRelease = ut.trim(luci.version.luciversion)
+       local luciRelease = ut.trim(ver.luciversion)
                if luciRelease ~= "" then
                        luciRelease = "\nLuCI - " .. luciRelease
                else
@@ -300,7 +302,7 @@ function troubleshootingData()
        mArray.routelist = { routeString }
 
        -- default firewall output policy
-       local firewallOut = ut.trim(sys.exec("uci get -p /var/state firewall.@defaults[0].output"))
+       local firewallOut = ut.trim(sys.exec("uci -p /var/state get firewall.@defaults[0].output"))
                if firewallOut == "" then
                        firewallOut = "No data found"
                end
index 5b31390b660cfea5bae7d042db459de76178381a..a8e68a01be84b059112792db9345e0f77906ede2 100644 (file)
@@ -6,7 +6,7 @@ function interfaceCheck() -- find issues with too many interfaces, reliability a
                        local interfaceName = section[".name"]
                        interfaceNumber = interfaceNumber+1 -- count number of mwan interfaces configured
                        -- create list of metrics for none and duplicate checking
-                       local metricValue = ut.trim(sys.exec("uci get -p /var/state network." .. interfaceName .. ".metric"))
+                       local metricValue = ut.trim(sys.exec("uci -p /var/state get network." .. interfaceName .. ".metric"))
                        if metricValue == "" then
                                errorFound = 1
                                errorNoMetricList = errorNoMetricList .. interfaceName .. " "
@@ -14,17 +14,17 @@ function interfaceCheck() -- find issues with too many interfaces, reliability a
                                metricList = metricList .. interfaceName .. " " .. metricValue .. "\n"
                        end
                        -- check if any interfaces have a higher reliability requirement than tracking IPs configured
-                       local trackingNumber = tonumber(ut.trim(sys.exec("echo $(uci get -p /var/state mwan3." .. interfaceName .. ".track_ip) | wc -w")))
+                       local trackingNumber = tonumber(ut.trim(sys.exec("echo $(uci -p /var/state get mwan3." .. interfaceName .. ".track_ip) | wc -w")))
                        if trackingNumber > 0 then
-                               local reliabilityNumber = tonumber(ut.trim(sys.exec("uci get -p /var/state mwan3." .. interfaceName .. ".reliability")))
+                               local reliabilityNumber = tonumber(ut.trim(sys.exec("uci -p /var/state get mwan3." .. interfaceName .. ".reliability")))
                                if reliabilityNumber and reliabilityNumber > trackingNumber then
                                        errorFound = 1
                                        errorReliabilityList = errorReliabilityList .. interfaceName .. " "
                                end
                        end
                        -- check if any interfaces are not properly configured in /etc/config/network or have no default route in main routing table
-                       if ut.trim(sys.exec("uci get -p /var/state network." .. interfaceName)) == "interface" then
-                               local interfaceDevice = ut.trim(sys.exec("uci get -p /var/state network." .. interfaceName .. ".ifname"))
+                       if ut.trim(sys.exec("uci -p /var/state get network." .. interfaceName)) == "interface" then
+                               local interfaceDevice = ut.trim(sys.exec("uci -p /var/state get network." .. interfaceName .. ".ifname"))
                                if interfaceDevice == "uci: Entry not found" or interfaceDevice == "" then
                                        errorFound = 1
                                        errorNetConfigList = errorNetConfigList .. interfaceName .. " "
@@ -220,7 +220,7 @@ up = mwan_interface:option(DummyValue, "up", translate("Interface up"))
 metric = mwan_interface:option(DummyValue, "metric", translate("Metric"))
        metric.rawhtml = true
        function metric.cfgvalue(self, s)
-               local metricValue = sys.exec("uci get -p /var/state network." .. s .. ".metric")
+               local metricValue = sys.exec("uci -p /var/state get network." .. s .. ".metric")
                if metricValue ~= "" then
                        return metricValue
                else
index 16a7ec394e9886c46331057ea398064ea9f9a0dd..387ff01a8d8a17099a6eeac2a9d626c631799c6d 100644 (file)
@@ -1,13 +1,13 @@
 -- ------ extra functions ------ --
 
 function interfaceCheck()
-       metricValue = ut.trim(sys.exec("uci get -p /var/state network." .. arg[1] .. ".metric"))
+       metricValue = ut.trim(sys.exec("uci -p /var/state get network." .. arg[1] .. ".metric"))
        if metricValue == "" then -- no metric
                errorNoMetric = 1
        else -- if metric exists create list of interface metrics to compare against for duplicates
                uci.cursor():foreach("mwan3", "interface",
                        function (section)
-                               local metricValue = ut.trim(sys.exec("uci get -p /var/state network." .. section[".name"] .. ".metric"))
+                               local metricValue = ut.trim(sys.exec("uci -p /var/state get network." .. section[".name"] .. ".metric"))
                                metricList = metricList .. section[".name"] .. " " .. metricValue .. "\n"
                        end
                )
@@ -22,16 +22,16 @@ function interfaceCheck()
                end
        end
        -- check if this interface has a higher reliability requirement than track IPs configured
-       local trackingNumber = tonumber(ut.trim(sys.exec("echo $(uci get -p /var/state mwan3." .. arg[1] .. ".track_ip) | wc -w")))
+       local trackingNumber = tonumber(ut.trim(sys.exec("echo $(uci -p /var/state get mwan3." .. arg[1] .. ".track_ip) | wc -w")))
        if trackingNumber > 0 then
-               local reliabilityNumber = tonumber(ut.trim(sys.exec("uci get -p /var/state mwan3." .. arg[1] .. ".reliability")))
+               local reliabilityNumber = tonumber(ut.trim(sys.exec("uci -p /var/state get mwan3." .. arg[1] .. ".reliability")))
                if reliabilityNumber and reliabilityNumber > trackingNumber then
                        errorReliability = 1
                end
        end
        -- check if any interfaces are not properly configured in /etc/config/network or have no default route in main routing table
-       if ut.trim(sys.exec("uci get -p /var/state network." .. arg[1])) == "interface" then
-               local interfaceDevice = ut.trim(sys.exec("uci get -p /var/state network." .. arg[1] .. ".ifname"))
+       if ut.trim(sys.exec("uci -p /var/state get network." .. arg[1])) == "interface" then
+               local interfaceDevice = ut.trim(sys.exec("uci -p /var/state get network." .. arg[1] .. ".ifname"))
                if interfaceDevice == "uci: Entry not found" or interfaceDevice == "" then
                        errorNetConfig = 1
                        errorRoute = 1
index cbd8bdd03ed2b2d97e46e678914e040cef3b7677..a22e01054c05cc255d14466de2ec84fd13d98653 100644 (file)
@@ -3,10 +3,10 @@
 function ruleCheck() -- determine if rules needs a proper protocol configured
        uci.cursor():foreach("mwan3", "rule",
                function (section)
-                       local sourcePort = ut.trim(sys.exec("uci get -p /var/state mwan3." .. section[".name"] .. ".src_port"))
-                       local destPort = ut.trim(sys.exec("uci get -p /var/state mwan3." .. section[".name"] .. ".dest_port"))
+                       local sourcePort = ut.trim(sys.exec("uci -p /var/state get mwan3." .. section[".name"] .. ".src_port"))
+                       local destPort = ut.trim(sys.exec("uci -p /var/state get mwan3." .. section[".name"] .. ".dest_port"))
                        if sourcePort ~= "" or destPort ~= "" then -- ports configured
-                               local protocol = ut.trim(sys.exec("uci get -p /var/state mwan3." .. section[".name"] .. ".proto"))
+                               local protocol = ut.trim(sys.exec("uci -p /var/state get mwan3." .. section[".name"] .. ".proto"))
                                if protocol == "" or protocol == "all" then -- no or improper protocol
                                        error_protocol_list = error_protocol_list .. section[".name"] .. " "
                                end
index d880a72e2979eb18e715481ffcb027a722ffef7a..f7fb341e1f991dcd0772d3169f150402123cc2a5 100644 (file)
@@ -1,10 +1,10 @@
 -- ------ extra functions ------ --
 
 function ruleCheck() -- determine if rule needs a protocol specified
-       local sourcePort = ut.trim(sys.exec("uci get -p /var/state mwan3." .. arg[1] .. ".src_port"))
-       local destPort = ut.trim(sys.exec("uci get -p /var/state mwan3." .. arg[1] .. ".dest_port"))
+       local sourcePort = ut.trim(sys.exec("uci -p /var/state get mwan3." .. arg[1] .. ".src_port"))
+       local destPort = ut.trim(sys.exec("uci -p /var/state get mwan3." .. arg[1] .. ".dest_port"))
        if sourcePort ~= "" or destPort ~= "" then -- ports configured
-               local protocol = ut.trim(sys.exec("uci get -p /var/state mwan3." .. arg[1] .. ".proto"))
+               local protocol = ut.trim(sys.exec("uci -p /var/state get mwan3." .. arg[1] .. ".proto"))
                if protocol == "" or protocol == "all" then -- no or improper protocol
                        error_protocol = 1
                end
index 5736e0d7d4cc7b87954234b56c47378902ec2c7f..2bf4ca1f06ba84f224e3dd3d84facd0bbf26aef7 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2006-2014 OpenWrt.org
+# Copyright (C) 2006-2015 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:=net-snmp
 PKG_VERSION:=5.4.4
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=@SF/net-snmp
@@ -122,6 +122,7 @@ SNMP_MIB_MODULES_INCLUDED = \
        ucd-snmp/loadave \
        ucd-snmp/memory \
        ucd-snmp/pass \
+       ucd-snmp/pass_persist \
        ucd-snmp/proc \
        ucd-snmp/vmstat \
        util_funcs \
diff --git a/net/net-snmp/patches/900-musl-compat.patch b/net/net-snmp/patches/900-musl-compat.patch
new file mode 100644 (file)
index 0000000..fa9a01e
--- /dev/null
@@ -0,0 +1,14 @@
+--- a/agent/mibgroup/iwlib.h
++++ b/agent/mibgroup/iwlib.h
+@@ -85,6 +85,11 @@
+       && LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)
+ #define LIBC5_HEADERS
++/* Musl */
++#elif !defined(__GLIBC__) && !defined(__UCLIBC__) \
++      && LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)
++#define GENERIC_HEADERS
++
+ /* Unsupported combination */
+ #else
+ #error "Your kernel/libc combination is not supported"
diff --git a/net/netperf/Makefile b/net/netperf/Makefile
new file mode 100644 (file)
index 0000000..4d7ea00
--- /dev/null
@@ -0,0 +1,49 @@
+#
+# Copyright (C) 2006-2011 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:=netperf
+PKG_VERSION:=2.6.0
+PKG_RELEASE:=1
+PKG_LICENSE:=Custom
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
+PKG_SOURCE_URL:=ftp://ftp.netperf.org/netperf/
+PKG_MD5SUM:=9654ffdfd4c4f2c93ce3733cd9ed9236
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/netperf
+  SECTION:=net
+  CATEGORY:=Network
+  TITLE:=Network performance measurement tool
+  URL:=http://www.netperf.org/
+  MAINTAINER:=Toke Høiland-Jørgensen <toke@toke.dk>
+endef
+
+CONFIGURE_ARGS += --enable-demo
+
+define Package/netperf/install
+       $(INSTALL_DIR) $(1)/etc/init.d
+       $(INSTALL_BIN) ./files/netserver.init $(1)/etc/init.d/netserver
+       $(INSTALL_DIR) $(1)/usr/bin
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/netperf $(1)/usr/bin/
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/netserver $(1)/usr/bin/
+       $(INSTALL_DIR) $(1)/lib/netperf
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/doc/examples/arr_script $(1)/lib/netperf
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/doc/examples/packet_byte_script $(1)/lib/netperf
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/doc/examples/sctp_stream_script $(1)/lib/netperf
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/doc/examples/snapshot_script $(1)/lib/netperf
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/doc/examples/tcp_range_script $(1)/lib/netperf
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/doc/examples/tcp_rr_script $(1)/lib/netperf
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/doc/examples/tcp_stream_script $(1)/lib/netperf
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/doc/examples/udp_rr_script $(1)/lib/netperf
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/doc/examples/udp_stream_script $(1)/lib/netperf
+endef
+
+$(eval $(call BuildPackage,netperf))
diff --git a/net/netperf/files/netserver.init b/net/netperf/files/netserver.init
new file mode 100644 (file)
index 0000000..42fcf33
--- /dev/null
@@ -0,0 +1,12 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2006-2011 OpenWrt.org
+
+START=50
+
+start() {
+       service_start /usr/bin/netserver
+}
+
+stop() {
+       service_stop /usr/bin/netserver
+}
diff --git a/net/netperf/patches/001-musl-fix.patch b/net/netperf/patches/001-musl-fix.patch
new file mode 100644 (file)
index 0000000..6774c48
--- /dev/null
@@ -0,0 +1,12 @@
+diff --git a/src/netrt_rtnetlink.c b/src/netrt_rtnetlink.c
+index 10e4750..318c0c2 100644
+--- a/src/netrt_rtnetlink.c
++++ b/src/netrt_rtnetlink.c
+@@ -5,7 +5,6 @@
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+-#include <bits/sockaddr.h>
+ #include <asm/types.h>
+ #include <linux/rtnetlink.h>
+ #include <netinet/in.h>
diff --git a/net/ngircd/Makefile b/net/ngircd/Makefile
new file mode 100644 (file)
index 0000000..a431cd9
--- /dev/null
@@ -0,0 +1,109 @@
+#
+# Copyright (C) 2008-2015 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:=ngircd
+PKG_VERSION:=22.1
+PKG_RELEASE:=1
+PKG_MAINTAINER:=Claudio Leite <leitec@staticky.com>
+PKG_LICENSE:=GPL-2.0
+PKG_LICENSE_FILES:=COPYING
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:= \
+        http://ngircd.barton.de/pub/ngircd/ \
+        ftp://ftp.berlios.de/pub/ngircd/
+PKG_MD5SUM:=586c4fef1fbb77dcbe723e9136ec08eb
+
+PKG_INSTALL:=1
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/ngircd/Default
+  SECTION:=net
+  CATEGORY:=Network
+  SUBMENU:=Instant Messaging
+  DEPENDS:=+zlib
+  TITLE:=Next Generation IRC Server
+  URL:=http://ngircd.barton.de
+endef
+
+define Package/ngircd/Default/description
+  ngIRCd is an Open Source server for the Internet Relay Chat (IRC), which
+  is developed and published under the terms of the GNU General Public Licence.
+  ngIRCd means "next generation IRC daemon", it's written from scratch and
+  not deduced from the "grandfather of IRC daemons", the daemon of the IRCNet.
+endef
+
+define Package/ngircd
+  $(call Package/ngircd/Default)
+  TITLE+= (with OpenSSL support)
+  DEPENDS+= +libopenssl
+  VARIANT:=ssl
+endef
+
+define Package/ngircd/conffiles
+/etc/ngircd.conf
+endef
+
+define Package/ngircd/description
+  $(call Package/ngircd/Default/description)
+  This package is built with OpenSSL support.
+endef
+
+define Package/ngircd-nossl
+$(call Package/ngircd/Default)
+  TITLE+= (without OpenSSL support)
+  VARIANT:=nossl
+endef
+
+Package/ngircd-nossl/conffiles = $(Package/ngircd/conffiles)
+
+define Package/ngircd-nossl/description
+  $(call Package/ngircd/Default/description)
+  This package is built without OpenSSL support.
+endef
+
+ifeq ($(CONFIG_IPV6),y)
+       CONFIGURE_ARGS += \
+               --enable-ipv6
+endif
+
+ifeq ($(BUILD_VARIANT),ssl)
+       CONFIGURE_ARGS += \
+               --with-openssl="$(STAGING_DIR)/usr"
+endif
+
+ifeq ($(BUILD_VARIANT),nossl)
+       CONFIGURE_ARGS += \
+               --without-openssl
+endif
+
+# The test for HAVE_WORKING_GETADDRINFO fails
+# when cross-compiling.
+#
+define Build/Configure
+       $(call Build/Configure/Default)
+       $(SED) 's/\/\* #undef HAVE_WORKING_GETADDRINFO \*\//#define HAVE_WORKING_GETADDRINFO 1/' $(PKG_BUILD_DIR)/src/config.h
+endef
+
+define Package/ngircd/install
+       $(INSTALL_DIR) $(1)/usr/sbin
+       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ngircd $(1)/usr/sbin/
+       $(INSTALL_DIR) $(1)/etc
+       $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/ngircd.conf $(1)/etc/
+       $(INSTALL_DIR) $(1)/etc/init.d
+       $(INSTALL_BIN) ./files/ngircd.init $(1)/etc/init.d/ngircd
+endef
+
+Package/ngircd-nossl/install = $(Package/ngircd/install)
+
+$(eval $(call BuildPackage,ngircd))
+$(eval $(call BuildPackage,ngircd-nossl))
diff --git a/net/ngircd/files/ngircd.init b/net/ngircd/files/ngircd.init
new file mode 100644 (file)
index 0000000..6a21358
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh /etc/rc.common
+
+START=65
+
+start() {
+       service_start /usr/sbin/ngircd
+}
+
+stop() {
+       service_stop /usr/sbin/ngircd
+}
index b9c9706cb0cd256e0a411dc36e0f3402a697983b..787e77955b5330572654dd89e0aed697e6f24cc3 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=ntp
 PKG_VERSION:=4.2.8p2
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/
@@ -93,7 +93,9 @@ endef
 CONFIGURE_VARS += \
        ac_cv_header_md5_h=no \
        ac_cv_lib_rt_sched_setscheduler=no \
-       ac_cv_header_dns_sd_h=no
+       ac_cv_header_dns_sd_h=no \
+       hw_cv_func_snprintf_c99=yes \
+       hw_cv_func_vsnprintf_c99=yes \
 
 CONFIGURE_ARGS += \
        --disable-all-clocks \
index 3941e2fc0e7ca081e3986f13987a33eb2079dbdb..7828a25ca49f5c1ebb362233e7df131a7487a126 100644 (file)
@@ -10,12 +10,16 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=ntripcaster
 PKG_VERSION:=0.1.5
-PKG_RELEASE:=1
-PKG_LICENSE:=GPL-2.0+
 
-PKG_SOURCE:=$(PKG_NAME)$(PKG_VERSION).zip
-PKG_SOURCE_URL:=http://igs.bkg.bund.de/root_ftp/NTRIP/software/
-PKG_MD5SUM:=8c85a6c31d8c5cdf2638fe103207a1fd
+PKG_RELEASE=$(PKG_SOURCE_VERSION)
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL:=https://github.com/nunojpg/ntripcaster.git
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_SOURCE_VERSION:=03878920195cf854b38a1ea424f1cae57353fa87
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
+
+PKG_LICENSE:=GPL-2.0+
 
 PKG_MAINTAINER:=Nuno Goncalves <nunojpg@gmail.com>
 
@@ -34,19 +38,12 @@ define Package/ntripcaster/description
   BKG Standard Ntrip Broadcaster
 endef
 
-define Build/Prepare
-       mkdir -p $(PKG_BUILD_DIR)
-       unzip $(DL_DIR)/$(PKG_SOURCE) -d $(PKG_BUILD_DIR)
-       mv $(PKG_BUILD_DIR)/$(PKG_NAME)$(PKG_VERSION)/* $(PKG_BUILD_DIR)
-       chmod +x $(PKG_BUILD_DIR)/configure
-endef
-
 define Package/ntripcaster/install
-       $(INSTALL_DIR) $(1)/usr/local/ntripcaster/bin
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/ntripcaster $(1)/usr/local/ntripcaster/bin/
-       $(INSTALL_DIR) $(1)/usr/local/ntripcaster/conf
-       $(INSTALL_DATA) $(PKG_BUILD_DIR)/conf/ntripcaster.conf.dist $(1)/usr/local/ntripcaster/conf/
-       $(INSTALL_DATA) $(PKG_BUILD_DIR)/conf/sourcetable.dat.dist $(1)/usr/local/ntripcaster/conf/
+       $(INSTALL_DIR) $(1)/usr/bin
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/ntripcaster $(1)/usr/bin/
+       $(INSTALL_DIR) $(1)/usr/share/ntripcaster/conf
+       $(INSTALL_DATA) $(PKG_BUILD_DIR)/conf/ntripcaster.conf.dist $(1)/usr/share/ntripcaster/conf/
+       $(INSTALL_DATA) $(PKG_BUILD_DIR)/conf/sourcetable.dat.dist $(1)/usr/share/ntripcaster/conf/
 endef
 
 $(eval $(call BuildPackage,ntripcaster))
index 249f75ba21a1a182f5ddd5d5e387db1d38d905e1..f0d92d58e8aa99ad18035bf4afa58f1eef13bedf 100644 (file)
@@ -1,6 +1,6 @@
 #
 # Copyright (C) 2011 segal.ubi.pt
-# Copyright (C) 2010-2014 OpenWrt.org
+# Copyright (C) 2010-2015 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -10,12 +10,16 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=ntripclient
 PKG_VERSION:=1.5.0
-PKG_RELEASE:=2
-PKG_LICENSE:=GPL-2.0+
 
-PKG_SOURCE:=$(PKG_NAME).zip
-PKG_SOURCE_URL:=http://igs.bkg.bund.de/root_ftp/NTRIP/software/
-PKG_MD5SUM:=4b357fa648d74e4e13c4b5a2a39f5624
+PKG_RELEASE=$(PKG_SOURCE_VERSION)
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL:=https://github.com/nunojpg/ntripclient.git
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_SOURCE_VERSION:=dcfb2cb3e6f31b7291a94e7f86379c78ffc0d44e
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
+
+PKG_LICENSE:=GPL-2.0+
 
 PKG_MAINTAINER:=Nuno Goncalves <nunojpg@gmail.com>
 
@@ -33,11 +37,6 @@ define Package/ntripclient/description
   Ntrip Version 2.0 Command Line Client, reading from Ntrip Version 1.0 or 2.0 Caster
 endef
 
-define Build/Prepare
-       mkdir -p $(PKG_BUILD_DIR)
-       unzip $(DL_DIR)/$(PKG_SOURCE) -d $(PKG_BUILD_DIR)
-endef
-
 MAKE_FLAGS += \
        OPTS="$(TARGET_CFLAGS)"
 
diff --git a/net/ntripclient/patches/100-musl-compat.patch b/net/ntripclient/patches/100-musl-compat.patch
new file mode 100644 (file)
index 0000000..10f690f
--- /dev/null
@@ -0,0 +1,10 @@
+--- a/ntripclient.c
++++ b/ntripclient.c
+@@ -44,6 +44,7 @@
+   #include <fcntl.h>
+   #include <unistd.h>
+   #include <arpa/inet.h>
++  #include <sys/select.h>
+   #include <sys/socket.h>
+   #include <netinet/in.h>
+   #include <netdb.h>
index 1bb0e873df974211d1ba7f3b96144db782ff5a5c..a3e3cf978c3f66fc51848d8fd13d7b428f6c91fb 100644 (file)
@@ -10,12 +10,16 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=ntripserver
 PKG_VERSION:=1.5.1
-PKG_RELEASE:=2
-PKG_LICENSE:=GPL-2.0+
 
-PKG_SOURCE:=$(PKG_NAME).zip
-PKG_SOURCE_URL:=http://igs.bkg.bund.de/root_ftp/NTRIP/software/
-PKG_MD5SUM:=cecff5da0173896df041bd889935fc12
+PKG_RELEASE=$(PKG_SOURCE_VERSION)
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL:=https://github.com/nunojpg/ntripserver.git
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_SOURCE_VERSION:=c3034ab575e8442222eb8c2ee9e224cac99cfa6d
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
+
+PKG_LICENSE:=GPL-2.0+
 
 PKG_MAINTAINER:=Nuno Goncalves <nunojpg@gmail.com>
 
@@ -30,17 +34,13 @@ define Package/ntripserver
 endef
 
 define Package/ntripserver/description
-  Ntrip Version 2.0 Command Line Server, reading from SISNeT Server, TCP/UDP IP Port, Serial port, or NtripCaster to support an Ntrip Version 1.0 or 2.0 Caster
+  Ntrip Version 2.0 Command Line Server, reading from SISNeT Server, TCP/UDP IP
+  Port, Serial port, or NtripCaster to support an Ntrip Version 1.0 or 2.0 Caster
 endef
 
 MAKE_FLAGS += \
        OPTS="$(TARGET_CFLAGS)"
 
-define Build/Prepare
-       mkdir -p $(PKG_BUILD_DIR)
-       unzip $(DL_DIR)/$(PKG_SOURCE) -d $(PKG_BUILD_DIR)
-endef
-
 define Package/ntripserver/install
        $(INSTALL_DIR) $(1)/usr/bin
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/ntripserver $(1)/usr/bin/
index a59e9dc0d6497693e230fb62f51849c9c54628fc..6845aed8d30246a550fcbf9553c2ee55254daffe 100644 (file)
@@ -8,14 +8,14 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=ocserv
-PKG_VERSION:=0.10.5
-PKG_RELEASE:=2
+PKG_VERSION:=0.10.6
+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_MD5SUM:=17ee861f352d6ef7cd33114819b215ba
+PKG_MD5SUM:=b99c74b781a180348f3a3240940fc838
 
 PKG_LICENSE:=GPLv2
 PKG_LICENSE_FILES:=COPYING
index 961f33e4efb272698d4079bb95e91ecd51884ba0..9d000ccc82d45eab01b309e799d123e4fba62c37 100644 (file)
@@ -1,5 +1,10 @@
 The openconnect server expects to be configured using the uci interface.
 
+It is recommended to setup a dynamic DNS address with openwrt prior
+to starting the server. That is because during the first startup
+a certificate file which contain the setup dynamic DNS name will be
+created.
+
 To setup a server the provides access to LAN with network address
 10.100.2.0/255.255.255.0 using the VPN address range
 10.100.3.0/255.255.255.0 add the following to /etc/config/ocserv:
@@ -65,6 +70,20 @@ config forwarding
 config forwarding
         option dest 'vpn'
         option src 'lan'
+
+config rule
+        option target 'ACCEPT'
+        option src 'wan'
+        option proto 'tcp'
+        option dest_port '4443'
+        option name 'vpn'
+
+config rule
+        option target 'ACCEPT'
+        option src 'wan'
+        option proto 'udp'
+        option dest_port '4443'
+        option name 'vpn'
 -----------------------------------------------------------------
 
 
index 0af8176b40b7cdafdebfed61c0da851c3b6ce81b..7b1b7be16a58a5ecd7e43edee4848aacad72e997 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2006-2011 OpenWrt.org
+# Copyright (C) 2006-2015 OpenWrt.org
 # Copyright (C) 2015 Christian Beier <dontmind@freeshell.org>
 #
 # This is free software, licensed under the GNU General Public License v2.
@@ -9,13 +9,13 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=ola
-PKG_VERSION:=0.9.3
+PKG_VERSION:=0.9.6
 PKG_RELEASE:=1
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL:=https://github.com/OpenLightingProject/ola.git
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
-PKG_SOURCE_VERSION:=d949ab88ab2c12d4d94b50a0a0df633d634f08fd
+PKG_SOURCE_VERSION:=e9ece0540fb40beb1be33417cb7e0abf45af74e0
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
 PKG_LICENSE:=LGPL-2.1+
 
@@ -25,34 +25,36 @@ PKG_INSTALL:=1
 PKG_BUILD_PARALLEL:=1
 PKG_USE_MIPS16:=0
 
-PKG_BUILD_DEPENDS:=protobuf/host ola/host
+HOST_BUILD_DEPENDS:=protobuf/host
+PKG_BUILD_DEPENDS:=ola/host
 
+include $(INCLUDE_DIR)/host-build.mk
 include $(INCLUDE_DIR)/package.mk
 
-
 define Package/ola
   SECTION:=net
   CATEGORY:=Network
   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 +sudo @BROKEN
+  DEPENDS:=+protobuf +libusb-1.0 +libuuid +libstdcpp +libpthread +librt +zlib +libncurses +sudo
 endef
 
 define Package/ola/description
-  OLA (Open Lighting Architecture) is a framework that allows applications to 
+  OLA (Open Lighting Architecture) is a framework that allows applications to
   send and receive DMX512, using various hardware devices and 'DMX over IP'
   protocols. It enables software controllers talk to DMX hardware.
 endef
 
+CONFIGURE_ARGS += \
+       --disable-dependency-tracking \
+       --disable-static \
+       --disable-fatal-warnings \
+       --disable-unittests \
+       --disable-http \
+        --with-ola-protoc-plugin=$(HOST_BUILD_DIR)/protoc/ola_protoc_plugin
 
-include $(INCLUDE_DIR)/host-build.mk
-
-# When building the host part, disable as much as possible to speed up
-# the configure step and avoid missing host dependencies.
-# Stolen from http://git.buildroot.net/buildroot/commit/?id=66056a5179ef49f2ec10ba5d7fbd1a58863d1350
-define Host/Configure
-   $(call Host/Configure/Default,\
+HOST_CONFIGURE_ARGS += \
        --disable-all-plugins \
        --disable-slp \
        --disable-osc \
@@ -63,52 +65,38 @@ define Host/Configure
        --disable-examples \
        --disable-unittests \
        --disable-doxygen-html \
-       --disable-doxygen-doc)
-endef
+       --disable-doxygen-doc
 
 # only build the ola_protoc thingy
 define Host/Compile
        cd $(HOST_BUILD_DIR); \
-           $(MAKE) protoc/ola_protoc
+               $(MAKE) protoc/ola_protoc_plugin
 endef
 
-# only need ola_protoc
+# nothing to install for host part
 define Host/Install
-       $(INSTALL_DIR) $(STAGING_DIR_HOST)/bin
-       $(CP) $(HOST_BUILD_DIR)/protoc/ola_protoc $(STAGING_DIR_HOST)/bin/
-endef
-
-$(eval $(call HostBuild))
-
-
-
-define Build/Configure
-  $(call Build/Configure/Default,\
-       --disable-dependency-tracking \
-       --disable-static \
-       --disable-fatal-warnings \
-       --disable-unittests \
-       --disable-http  \
-       --with-ola-protoc=$(STAGING_DIR_HOST)/bin/ola_protoc)
 endef
 
 
 define Build/InstallDev
-       mkdir -p $(1)/usr/include
+       $(INSTALL_DIR) $(1)/usr/include
        $(CP) $(PKG_INSTALL_DIR)/usr/include/ola $(1)/usr/include/
-       mkdir -p $(1)/usr/include
        $(CP) $(PKG_INSTALL_DIR)/usr/include/olad $(1)/usr/include/
-       mkdir -p $(1)/usr/lib
+
+       $(INSTALL_DIR) $(1)/usr/lib
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so* $(1)/usr/lib/
 endef
 
 define Package/ola/install
        $(INSTALL_DIR) $(1)/usr/bin
        $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin
+
        $(INSTALL_DIR) $(1)/usr/lib
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so* $(1)/usr/lib
+
        $(INSTALL_DIR) $(1)/etc/init.d
        $(INSTALL_BIN) ./files/olad.init $(1)/etc/init.d/olad
+
        $(INSTALL_DIR) $(1)/usr/share/ola/pids
        $(CP) $(PKG_INSTALL_DIR)/usr/share/ola/pids/* $(1)/usr/share/ola/pids
 endef
@@ -117,12 +105,10 @@ define Package/ola/postinst
 #!/bin/sh
 
 # make sure the conf dir exists and is writeable by the group olad uses
-mkdir -p /etc/ola
-chgrp nogroup /etc/ola
-chmod 775 $(1)/etc/ola
-
-exit 0
+mkdir -p $${IPKG_INSTROOT}/etc/ola
+chgrp nogroup $${IPKG_INSTROOT}/etc/ola
+chmod 775 $${IPKG_INSTROOT}/etc/ola
 endef
 
-
+$(eval $(call HostBuild))
 $(eval $(call BuildPackage,ola))
index 9a0e1133344cb2f4f6453f758b3b9c5594852bf5..f1dff362de81d33baf7b82105bd838a2e0547374 100644 (file)
@@ -1,5 +1,5 @@
 #!/bin/sh /etc/rc.common
-# Copyright (C) 2009-2011 OpenWrt.org
+# Copyright (C) 2009-2015 OpenWrt.org
 # Copyright (C) 2015 Christian Beier <dontmind@freeshell.org>
 
 USE_PROCD=1
@@ -7,9 +7,8 @@ USE_PROCD=1
 START=90
 
 start_service() {
-    procd_open_instance
-    procd_set_param command sudo -u nobody /usr/bin/olad --syslog --log-level 3 --config-dir /etc/ola
-    procd_set_param respawn
-    procd_close_instance
+       procd_open_instance
+       procd_set_param command sudo -u nobody /usr/bin/olad --syslog --log-level 2 --config-dir /etc/ola
+       procd_set_param respawn
+       procd_close_instance
 }
-
index 38ac391c1877e571af13847cb058533944f67626..d0547f92b48b7cdcd093175df52e151ff68e4f35 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=openconnect
 PKG_VERSION:=7.06
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 PKG_USE_MIPS16:=0
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
index 9b1e652bd7e12a3c81188718d055d9fa692c41e3..0152dfefd468bb5d9a1dcfd65732b74ab94bd69b 100755 (executable)
@@ -26,11 +26,12 @@ proto_openconnect_setup() {
        json_get_vars server port username serverhash authgroup password password2 interface token_mode token_secret os csd_wrapper
 
        grep -q tun /proc/modules || insmod tun
+       ifname="vpn-$config"
 
        logger -t openconnect "initializing..."
        serv_addr=
        for ip in $(resolveip -t 10 "$server"); do
-               ( proto_add_host_dependency "$config" "$ip" $interface )
+               ( proto_add_host_dependency "$interface" "$ip" "$ifname" )
                serv_addr=1
        done
        [ -n "$serv_addr" ] || {
@@ -42,7 +43,7 @@ proto_openconnect_setup() {
 
        [ -n "$port" ] && port=":$port"
 
-       cmdline="$server$port -i vpn-$config --non-inter --syslog --script /lib/netifd/vpnc-script"
+       cmdline="$server$port -i "$ifname" --non-inter --syslog --script /lib/netifd/vpnc-script"
 
        # migrate to standard config files
        [ -f "/etc/config/openconnect-user-cert-vpn-$config.pem" ] && mv "/etc/config/openconnect-user-cert-vpn-$config.pem" "/etc/openconnect/user-cert-vpn-$config.pem"
diff --git a/net/shadowsocks-client/patches/100-fortify-source-compat.patch b/net/shadowsocks-client/patches/100-fortify-source-compat.patch
new file mode 100644 (file)
index 0000000..e4e1538
--- /dev/null
@@ -0,0 +1,72 @@
+--- a/client.c
++++ b/client.c
+@@ -111,7 +111,7 @@ int client_do_local_read(int sockfd, str
+                       goto out;
+       }
+-      if (encrypt(sockfd, ln) == -1)
++      if (crypto_encrypt(sockfd, ln) == -1)
+               goto out;
+       ret = do_send(ln->server_sockfd, ln, "cipher", 0);
+@@ -172,7 +172,7 @@ int client_do_server_read(int sockfd, st
+               }
+       }
+-      if (decrypt(sockfd, ln) == -1)
++      if (crypto_decrypt(sockfd, ln) == -1)
+               goto out;
+       if (ln->state & SS_UDP) {
+--- a/crypto.c
++++ b/crypto.c
+@@ -185,7 +185,7 @@ err:
+       return -1;
+ }
+-int encrypt(int sockfd, struct link *ln)
++int crypto_encrypt(int sockfd, struct link *ln)
+ {
+       int len, cipher_len;
+       EVP_CIPHER_CTX *ctx_p;
+@@ -223,7 +223,7 @@ err:
+       return -1;
+ }
+-int decrypt(int sockfd, struct link *ln)
++int crypto_decrypt(int sockfd, struct link *ln)
+ {
+       int len, text_len;
+       EVP_CIPHER_CTX *ctx_p;
+--- a/crypto.h
++++ b/crypto.h
+@@ -15,7 +15,7 @@ extern int iv_len;
+ int crypto_init(char *key, char *method);
+ void crypto_exit(void);
+-int encrypt(int sockfd, struct link *ln);
+-int decrypt(int sockfd, struct link *ln);
++int crypto_encrypt(int sockfd, struct link *ln);
++int crypto_decrypt(int sockfd, struct link *ln);
+ #endif
+--- a/server.c
++++ b/server.c
+@@ -36,7 +36,7 @@ int server_do_remote_read(int sockfd, st
+                       goto out;
+       }
+-      if (encrypt(sockfd, ln) == -1)
++      if (crypto_encrypt(sockfd, ln) == -1)
+               goto out;
+       ret = do_send(ln->local_sockfd, ln, "cipher", 0);
+@@ -91,7 +91,7 @@ int server_do_local_read(int sockfd, str
+               }
+       }
+-      if (decrypt(sockfd, ln) == -1)
++      if (crypto_decrypt(sockfd, ln) == -1)
+               goto out;
+       if (ln->state & SS_UDP) {
diff --git a/net/shadowsocks-libev/Makefile b/net/shadowsocks-libev/Makefile
new file mode 100644 (file)
index 0000000..2d05729
--- /dev/null
@@ -0,0 +1,91 @@
+#
+# Copyright (C) 2015 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:=shadowsocks-libev
+PKG_VERSION:=2.2.2
+PKG_RELEASE:=1
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL:=https://github.com/shadowsocks/shadowsocks-libev.git
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)
+PKG_SOURCE_VERSION:=4883903e657095b93f88a3a3b9a0dccdffdaa397
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
+PKG_MAINTAINER:=Jian Chang <aa65535@live.com>
+
+PKG_LICENSE:=GPLv2
+PKG_LICENSE_FILES:=LICENSE
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)
+
+PKG_INSTALL:=1
+PKG_FIXUP:=autoreconf
+PKG_USE_MIPS16:=0
+PKG_BUILD_PARALLEL:=1
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/shadowsocks-libev/Default
+       SECTION:=net
+       CATEGORY:=Network
+       TITLE:=Lightweight Secured Socks5 Proxy $(2)
+       URL:=https://github.com/shadowsocks/shadowsocks-libev
+       VARIANT:=$(1)
+       DEPENDS:=$(3) +resolveip +ipset +ip +iptables-mod-tproxy
+endef
+
+Package/shadowsocks-libev = $(call Package/shadowsocks-libev/Default,openssl,(OpenSSL),+libopenssl)
+Package/shadowsocks-libev-polarssl = $(call Package/shadowsocks-libev/Default,polarssl,(PolarSSL),+libpolarssl)
+
+define Package/shadowsocks-libev/description
+Shadowsocks-libev is a lightweight secured scoks5 proxy for embedded devices and low end boxes.
+endef
+
+Package/shadowsocks-libev-polarssl/description = $(Package/shadowsocks-libev/description)
+
+define Package/shadowsocks-libev/conffiles
+/etc/config/shadowsocks-libev
+endef
+
+Package/shadowsocks-libev-polarssl/conffiles = $(Package/shadowsocks-libev/conffiles)
+
+define Package/shadowsocks-libev/postinst
+#!/bin/sh
+uci -q batch <<-EOF >/dev/null
+       delete firewall.shadowsocks_libev
+       set firewall.shadowsocks_libev=include
+       set firewall.shadowsocks_libev.type=script
+       set firewall.shadowsocks_libev.path=/usr/share/shadowsocks-libev/firewall.include
+       set firewall.shadowsocks_libev.reload=1
+       commit firewall
+EOF
+exit 0
+endef
+
+Package/shadowsocks-libev-polarssl/postinst = $(Package/shadowsocks-libev/postinst)
+
+ifeq ($(BUILD_VARIANT),polarssl)
+       CONFIGURE_ARGS += --with-crypto-library=polarssl
+endif
+
+define Package/shadowsocks-libev/install
+       $(INSTALL_DIR) $(1)/usr/bin
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/ss-{redir,tunnel} $(1)/usr/bin
+       $(INSTALL_BIN) ./files/ss-rules $(1)/usr/bin
+       $(INSTALL_DIR) $(1)/etc/config
+       $(INSTALL_DATA) ./files/shadowsocks-libev.config $(1)/etc/config/shadowsocks-libev
+       $(INSTALL_DIR) $(1)/etc/init.d
+       $(INSTALL_BIN) ./files/shadowsocks-libev.init $(1)/etc/init.d/shadowsocks-libev
+       $(INSTALL_DIR) $(1)/usr/share/shadowsocks-libev
+       $(INSTALL_DATA) ./files/firewall.include $(1)/usr/share/shadowsocks-libev/firewall.include
+endef
+
+Package/shadowsocks-libev-polarssl/install = $(Package/shadowsocks-libev/install)
+
+$(eval $(call BuildPackage,shadowsocks-libev))
+$(eval $(call BuildPackage,shadowsocks-libev-polarssl))
diff --git a/net/shadowsocks-libev/files/firewall.include b/net/shadowsocks-libev/files/firewall.include
new file mode 100644 (file)
index 0000000..3a00e80
--- /dev/null
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+if pidof ss-redir>/dev/null; then
+       /etc/init.d/shadowsocks-libev rules
+       logger -t ShadowSocks-libev "Reloading ShadowSocks-libev due to restart of firewall"
+fi
diff --git a/net/shadowsocks-libev/files/shadowsocks-libev.config b/net/shadowsocks-libev/files/shadowsocks-libev.config
new file mode 100644 (file)
index 0000000..2f7be3d
--- /dev/null
@@ -0,0 +1,15 @@
+
+config shadowsocks-libev
+       option enable '1'
+       option server '127.0.0.1'
+       option server_port '8388'
+       option local_port '1080'
+       option password 'barfoo!'
+       option timeout '60'
+       option encrypt_method 'rc4-md5'
+       option ignore_list '/dev/null'
+       option udp_relay '0'
+       option tunnel_enable '1'
+       option tunnel_port '5300'
+       option tunnel_forward '8.8.4.4:53'
+       option lan_ac_mode '0'
diff --git a/net/shadowsocks-libev/files/shadowsocks-libev.init b/net/shadowsocks-libev/files/shadowsocks-libev.init
new file mode 100644 (file)
index 0000000..3d149e7
--- /dev/null
@@ -0,0 +1,115 @@
+#!/bin/sh /etc/rc.common
+
+START=90
+STOP=15
+
+SERVICE_USE_PID=1
+SERVICE_WRITE_PID=1
+SERVICE_DAEMONIZE=1
+EXTRA_COMMANDS="rules"
+CONFIG_FILE=/var/etc/shadowsocks-libev.json
+
+get_config() {
+       config_get_bool enable $1 enable
+       config_get server $1 server
+       config_get server_port $1 server_port
+       config_get local_port $1 local_port
+       config_get password $1 password
+       config_get timeout $1 timeout
+       config_get encrypt_method $1 encrypt_method
+       config_get ignore_list $1 ignore_list
+       config_get udp_relay $1 udp_relay
+       config_get_bool tunnel_enable $1 tunnel_enable
+       config_get tunnel_port $1 tunnel_port
+       config_get tunnel_forward $1 tunnel_forward
+       config_get lan_ac_mode $1 lan_ac_mode
+       config_get lan_ac_ip $1 lan_ac_ip
+       config_get wan_bp_ip $1 wan_bp_ip
+       config_get wan_fw_ip $1 wan_fw_ip
+       config_get ipt_ext $1 ipt_ext
+       : ${tunnel_port:=5300}
+       : ${tunnel_forward:=8.8.4.4:53}
+}
+
+start_rules() {
+       local ac_args
+
+       if [ -n "$lan_ac_ip" ]; then
+               case $lan_ac_mode in
+                       1) ac_args="w$lan_ac_ip"
+                       ;;
+                       2) ac_args="b$lan_ac_ip"
+                       ;;
+               esac
+       fi
+       /usr/bin/ss-rules \
+               -s "$server" \
+               -l "$local_port" \
+               -i "$ignore_list" \
+               -a "$ac_args" \
+               -b "$wan_bp_ip" \
+               -w "$wan_fw_ip" \
+               -e "$ipt_ext" \
+               -o $udp
+       return $?
+}
+
+start_redir() {
+       service_start /usr/bin/ss-redir \
+               -c "$CONFIG_FILE" $udp
+       return $?
+}
+
+start_tunnel() {
+       service_start /usr/bin/ss-tunnel \
+               -c "$CONFIG_FILE" \
+               -l "$tunnel_port" \
+               -L "$tunnel_forward" \
+               -u
+       return $?
+}
+
+rules() {
+       config_load shadowsocks-libev
+       config_foreach get_config shadowsocks-libev
+       [ "$enable" = 1 ] || exit 0
+       [ "$udp_relay" = 1 ] && udp="-u"
+       mkdir -p $(dirname $CONFIG_FILE)
+
+       : ${server:?}
+       : ${server_port:?}
+       : ${local_port:?}
+       : ${password:?}
+       : ${encrypt_method:?}
+       cat <<-EOF >$CONFIG_FILE
+               {
+                   "server": "$server",
+                   "server_port": $server_port,
+                   "local_address": "0.0.0.0",
+                   "local_port": $local_port,
+                   "password": "$password",
+                   "timeout": $timeout,
+                   "method": "$encrypt_method"
+               }
+EOF
+       start_rules
+}
+
+boot() {
+       until iptables-save -t nat | grep -q "^:zone_lan_prerouting"; do
+               sleep 1
+       done
+       start
+}
+
+start() {
+       rules && start_redir
+       [ "$tunnel_enable" = 1 ] && start_tunnel
+}
+
+stop() {
+       /usr/bin/ss-rules -f
+       service_stop /usr/bin/ss-redir
+       service_stop /usr/bin/ss-tunnel
+       rm -f $CONFIG_FILE
+}
diff --git a/net/shadowsocks-libev/files/ss-rules b/net/shadowsocks-libev/files/ss-rules
new file mode 100644 (file)
index 0000000..e9e2295
--- /dev/null
@@ -0,0 +1,203 @@
+#!/bin/sh
+
+usage() {
+       cat <<-EOF
+               Usage: ss-rules [options]
+
+               Valid options are:
+
+                   -s <server_host>        hostname or ip of shadowsocks remote server
+                   -l <local_port>         port number of shadowsocks local server
+                   -i <ip_list_file>       a file content is bypassed ip list
+                   -a <lan_ips>            lan ip of access control, need a prefix to
+                                           define access control mode
+                   -b <wan_ips>            wan ip of will be bypassed
+                   -w <wan_ips>            wan ip of will be forwarded
+                   -e <extra_options>      extra options for iptables
+                   -o                      apply the rules to the OUTPUT chain
+                   -u                      enable udprelay mode, TPROXY is required
+                   -f                      flush the rules
+EOF
+}
+
+loger() {
+       # 1.alert 2.crit 3.err 4.warn 5.notice 6.info 7.debug
+       logger -st ss-rules[$$] -p$1 $2
+}
+
+ipt_n="iptables -t nat"
+ipt_m="iptables -t mangle"
+
+flush_r() {
+       local IPT
+
+       IPT=$(iptables-save -t nat)
+       eval $(echo "$IPT" | grep "_SS_SPEC_RULE_" | \
+               sed -e 's/^-A/$ipt_n -D/' -e 's/$/;/')
+
+       for chain in $(echo "$IPT" | awk '/^:SS_SPEC/{print $1}'); do
+               $ipt_n -F ${chain:1} 2>/dev/null && $ipt_n -X ${chain:1}
+       done
+
+       IPT=$(iptables-save -t mangle)
+       eval $(echo "$IPT" | grep "_SS_SPEC_RULE_" | \
+               sed -e 's/^-A/$ipt_m -D/' -e 's/$/;/')
+
+       for chain in $(echo "$IPT" | awk '/^:SS_SPEC/{print $1}'); do
+               $ipt_m -F ${chain:1} 2>/dev/null && $ipt_m -X ${chain:1}
+       done
+
+       ip rule del fwmark 0x01/0x01 table 100 2>/dev/null
+       ip route del local 0.0.0.0/0 dev lo table 100 2>/dev/null
+       ipset -X ss_spec_lan_ac 2>/dev/null
+       ipset -X ss_spec_wan_ac 2>/dev/null
+       return 0
+}
+
+ipset_r() {
+       ipset -! -R <<-EOF || return 1
+               create ss_spec_wan_ac hash:net
+               $(echo -e "$IPLIST" | sed -e "s/^/add ss_spec_wan_ac /")
+               $(for ip in $WAN_FW_IP; do echo "add ss_spec_wan_ac $ip nomatch"; done)
+EOF
+       $ipt_n -N SS_SPEC_WAN_AC && \
+       $ipt_n -A SS_SPEC_WAN_AC -m set --match-set ss_spec_wan_ac dst -j RETURN && \
+       $ipt_n -A SS_SPEC_WAN_AC -j SS_SPEC_WAN_FW
+       return $?
+}
+
+fw_rule() {
+       $ipt_n -N SS_SPEC_WAN_FW && \
+       $ipt_n -A SS_SPEC_WAN_FW -p tcp \
+               -j REDIRECT --to-ports $LOCAL_PORT 2>/dev/null || {
+               loger 3 "Can't redirect, please check the iptables."
+               exit 1
+       }
+       return $?
+}
+
+ac_rule() {
+       local TAG ROUTECHAIN
+
+       if [ -n "$LAN_AC_IP" ]; then
+               if [ "${LAN_AC_IP:0:1}" = "w" ]; then
+                       TAG="nomatch"
+               else
+                       if [ "${LAN_AC_IP:0:1}" != "b" ]; then
+                               loger 3 "Bad argument \`-a $LAN_AC_IP\`."
+                               return 2
+                       fi
+               fi
+       fi
+
+       ROUTECHAIN=PREROUTING
+       if iptables-save -t nat | grep -q "^:zone_lan_prerouting"; then
+               ROUTECHAIN=zone_lan_prerouting
+       fi
+
+       ipset -! -R <<-EOF || return 1
+               create ss_spec_lan_ac hash:net
+               $(for ip in ${LAN_AC_IP:1}; do echo "add ss_spec_lan_ac $ip $TAG"; done)
+EOF
+       $ipt_n -A $ROUTECHAIN -p tcp $EXT_ARGS \
+               -m set ! --match-set ss_spec_lan_ac src \
+               -m comment --comment "_SS_SPEC_RULE_" -j SS_SPEC_WAN_AC
+
+       if [ "$OUTPUT" = 1 ]; then
+               $ipt_n -A OUTPUT -p tcp $EXT_ARGS \
+                       -m comment --comment "_SS_SPEC_RULE_" -j SS_SPEC_WAN_AC
+       fi
+       return $?
+}
+
+tp_rule() {
+       [ "$TPROXY" = 1 ] || return 0
+       ip rule add fwmark 0x01/0x01 table 100
+       ip route add local 0.0.0.0/0 dev lo table 100
+       $ipt_m -N SS_SPEC_TPROXY
+       $ipt_m -A SS_SPEC_TPROXY -p udp -m set ! --match-set ss_spec_wan_ac dst \
+               -j TPROXY --on-port $LOCAL_PORT --tproxy-mark 0x01/0x01
+       $ipt_m -A PREROUTING -p udp $EXT_ARGS \
+               -m set ! --match-set ss_spec_lan_ac src \
+               -m comment --comment "_SS_SPEC_RULE_" -j SS_SPEC_TPROXY
+       return $?
+}
+
+while getopts ":s:l:c:i:e:a:b:w:ouf" arg; do
+       case $arg in
+               s)
+                       SERVER=$OPTARG
+                       ;;
+               l)
+                       LOCAL_PORT=$OPTARG
+                       ;;
+               i)
+                       IGNORE=$OPTARG
+                       ;;
+               e)
+                       EXT_ARGS=$OPTARG
+                       ;;
+               a)
+                       LAN_AC_IP=$OPTARG
+                       ;;
+               b)
+                       WAN_BP_IP=$(for ip in $OPTARG; do echo $ip; done)
+                       ;;
+               w)
+                       WAN_FW_IP=$OPTARG
+                       ;;
+               o)
+                       OUTPUT=1
+                       ;;
+               u)
+                       TPROXY=1
+                       ;;
+               f)
+                       flush_r
+                       exit 0
+                       ;;
+       esac
+done
+
+if [ -z "$SERVER" -o -z "$LOCAL_PORT" ]; then
+       usage
+       exit 2
+fi
+
+SERVER=$(resolveip -t60 $SERVER)
+
+if [ -z "$SERVER" ]; then
+       loger 3 "Can't resolve the server hostname."
+       exit 1
+fi
+
+if [ -f "$IGNORE" ]; then
+       IGNORE_IP=$(cat $IGNORE 2>/dev/null)
+fi
+
+IPLIST=$(cat <<-EOF | grep -E "^([0-9]{1,3}\.){3}[0-9]{1,3}"
+       $SERVER
+       0.0.0.0/8
+       10.0.0.0/8
+       100.64.0.0/10
+       127.0.0.0/8
+       169.254.0.0/16
+       172.16.0.0/12
+       192.0.0.0/24
+       192.0.2.0/24
+       192.88.99.0/24
+       192.168.0.0/16
+       198.18.0.0/15
+       198.51.100.0/24
+       203.0.113.0/24
+       224.0.0.0/4
+       240.0.0.0/4
+       255.255.255.255
+       $WAN_BP_IP
+       $IGNORE_IP
+EOF
+)
+
+flush_r && fw_rule && ipset_r && ac_rule && tp_rule
+
+exit $?
index 33f8b6d5e9f17d2f51c255697b3e623c0c94c948..9886a5d92abc8a57230fa6d70bdb09edcc574a38 100644 (file)
@@ -9,7 +9,10 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=snort
 PKG_VERSION:=2.9.7.2
-PKG_RELEASE:=2
+PKG_RELEASE:=3
+
+PKG_LICENSE:=GPL-2.0
+PKG_MAINTAINER:=Luka Perkov <luka@openwrt.org>
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://www.snort.org/downloads/snort/ \
diff --git a/net/snort/patches/100-autoconf-fixes.patch b/net/snort/patches/100-autoconf-fixes.patch
new file mode 100644 (file)
index 0000000..414c0c1
--- /dev/null
@@ -0,0 +1,17 @@
+--- a/configure.in
++++ b/configure.in
+@@ -11,14 +11,6 @@ AM_INIT_AUTOMAKE(snort,2.9.7.2)
+ NO_OPTIMIZE="no"
+ ADD_WERROR="no"
+-# Test for -Werror and sed it out for now since some of the auto tests,
+-# for example AC_CHECK_LIB, will fail because of
+-# warning: conflicting types for built-in function <func>
+-if eval "echo $CFLAGS | grep -e -Werror"; then
+-    CFLAGS=`echo $CFLAGS | sed -e "s/-Werror//g"`
+-    ADD_WERROR="yes"
+-fi
+-
+ # Disable annoying practice of recursively re-running the autotools
+ AM_MAINTAINER_MODE
+ AC_PROG_CC_STDC
index 68a599063e7b73d0114f5e2c0982c836c429eb0c..6a58481378e18ea93a0a083cc740f8018c9eac6a 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=sqm-scripts
 PKG_VERSION:=8
-PKG_RELEASE:=4
+PKG_RELEASE:=7
 PKG_LICENSE:=GPLv2
 
 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
index d03980853ba6f899c4be45a2b3c6909a3cf007fc..13a7a0b84162440fde2b44fe14cdc1de40099189 100644 (file)
@@ -8,7 +8,7 @@ config queue 'eth1'
         option script 'simple.qos'
         option qdisc_advanced '0'
         option ingress_ecn 'ECN'
-        option egress_ecn 'NOECN'
+        option egress_ecn 'ECN'
         option qdisc_really_really_advanced '0'
         option itarget 'auto'
         option etarget 'auto'
index a0b2c6ffde1230954c8a9fd627708cb020a5c11e..ec4583da0da1beada3378794f1f8bf992da4d7ab 100644 (file)
@@ -6,7 +6,7 @@
 
 #improve the logread output
 sqm_logger() {
-    logger -t SQM -s ${1}
+    logger -t SQM -s "${1}"
 }
 
 insmod() {
@@ -139,6 +139,23 @@ get_stab_string() {
        echo ${STABSTRING}
 }
 
+#sm: cake knows how to handle ATM and per packet overhead, so expose and use this...
+get_cake_lla_string() {
+       STABSTRING=""
+       if [ "${LLAM}" = "cake" -a "${LINKLAYER}" != "none" ]; 
+       then
+               if [ "${LINKLAYER}" = "atm" ];
+               then
+                   STABSTRING="atm"
+               fi
+               
+               STABSTRING="${STABSTRING} overhead ${OVERHEAD}"
+               sqm_logger "cake link layer adjustments: ${STABSTRING}"
+       fi
+       echo ${STABSTRING}
+}
+
+
 sqm_stop() {
        $TC qdisc del dev $IFACE ingress
        $TC qdisc del dev $IFACE root
index 6e5af4a941ee35e25ba756fc071c7b089069fe81..5a36df1cf21da91935d1c7d6d33cbafeacbaea39 100755 (executable)
@@ -7,7 +7,7 @@
 # it under the terms of the GNU General Public License version 2 as
 # published by the Free Software Foundation.
 #
-#       Copyright (C) 2012-4 Michael D. Taht, Toke Høiland-Jørgensen, Sebastian Moeller
+#       Copyright (C) 2012-5 Michael D. Taht, Toke Høiland-Jørgensen, Sebastian Moeller
 
 # Compared to the complexity that debloat had become
 # this cleanly shows a means of going from diffserv marking
@@ -25,13 +25,20 @@ ipt_setup() {
 
 ipt -t mangle -N QOS_MARK_${IFACE}
 
-ipt -t mangle -A QOS_MARK_${IFACE} -j MARK --set-mark 0x2${IPT_MASK_STRING}
-# You can go further with classification but...
-ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class CS1 -j MARK --set-mark 0x3${IPT_MASK_STRING}
-ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class CS6 -j MARK --set-mark 0x1${IPT_MASK_STRING}
-ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class EF -j MARK --set-mark 0x1${IPT_MASK_STRING}
-ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class AF42 -j MARK --set-mark 0x1${IPT_MASK_STRING}
-ipt -t mangle -A QOS_MARK_${IFACE} -m tos  --tos Minimize-Delay -j MARK --set-mark 0x1${IPT_MASK_STRING}
+case $QDISC in
+       cake*) 
+           sqm_logger cake does all the diffserv work - no need for iptables rules 
+           ;;
+       *) 
+           ipt -t mangle -A QOS_MARK_${IFACE} -j MARK --set-mark 0x2${IPT_MASK_STRING} 
+           # You can go further with classification but...
+           ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class CS1 -j MARK --set-mark 0x3${IPT_MASK_STRING}
+           ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class CS6 -j MARK --set-mark 0x1${IPT_MASK_STRING}
+           ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class EF -j MARK --set-mark 0x1${IPT_MASK_STRING}
+           ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class AF42 -j MARK --set-mark 0x1${IPT_MASK_STRING}
+           ipt -t mangle -A QOS_MARK_${IFACE} -m tos  --tos Minimize-Delay -j MARK --set-mark 0x1${IPT_MASK_STRING}
+           ;;
+esac
 
 # and it might be a good idea to do it for udp tunnels too
 
@@ -43,9 +50,11 @@ ipt -t mangle -A QOS_MARK_${IFACE} -m tos  --tos Minimize-Delay -j MARK --set-ma
 if [ "$SQUASH_DSCP" = "1" ]
 then
 sqm_logger "Squashing differentiated services code points (DSCP) from ingress."
+CAKE_OPTS=besteffort # someday squash
 ipt -t mangle -I PREROUTING -i $IFACE -m dscp ! --dscp 0 -j DSCP --set-dscp-class be
 else
 sqm_logger "Keeping differentiated services code points (DSCP) from ingress."
+CAKE_OPTS=""
 ipt -t mangle -A PREROUTING -i $IFACE -m mark --mark 0x00${IPT_MASK_STRING} -g QOS_MARK_${IFACE} 
 fi
 
@@ -81,47 +90,53 @@ BE_CEIL=`expr $CEIL - 16`  # A little slop at the top
 LQ="quantum `get_mtu $IFACE $CEIL`"
 
 $TC qdisc del dev $IFACE root 2> /dev/null
-$TC qdisc add dev $IFACE root handle 1: `get_stab_string` htb default 12
-$TC class add dev $IFACE parent 1: classid 1:1 htb $LQ rate ${CEIL}kbit ceil ${CEIL}kbit `get_htb_adsll_string`
-$TC class add dev $IFACE parent 1:1 classid 1:10 htb $LQ rate ${CEIL}kbit ceil ${CEIL}kbit prio 0 `get_htb_adsll_string`
-$TC class add dev $IFACE parent 1:1 classid 1:11 htb $LQ rate 128kbit ceil ${PRIO_RATE}kbit prio 1 `get_htb_adsll_string`
-$TC class add dev $IFACE parent 1:1 classid 1:12 htb $LQ rate ${BE_RATE}kbit ceil ${BE_CEIL}kbit prio 2 `get_htb_adsll_string`
-$TC class add dev $IFACE parent 1:1 classid 1:13 htb $LQ rate ${BK_RATE}kbit ceil ${BE_CEIL}kbit prio 3 `get_htb_adsll_string`
-
-$TC qdisc add dev $IFACE parent 1:11 handle 110: $QDISC `get_limit ${ELIMIT}` `get_target "${ETARGET}" ${UPLINK}` `get_ecn ${EECN}` `get_quantum 300` `get_flows ${PRIO_RATE}` ${EQDISC_OPTS}
-$TC qdisc add dev $IFACE parent 1:12 handle 120: $QDISC `get_limit ${ELIMIT}` `get_target "${ETARGET}" ${UPLINK}` `get_ecn ${EECN}` `get_quantum 300` `get_flows ${BE_RATE}` ${EQDISC_OPTS}
-$TC qdisc add dev $IFACE parent 1:13 handle 130: $QDISC `get_limit ${ELIMIT}` `get_target "${ETARGET}" ${UPLINK}` `get_ecn ${EECN}` `get_quantum 300` `get_flows ${BK_RATE}` ${EQDISC_OPTS}
-
-
-# Need a catchall rule
-
-$TC filter add dev $IFACE parent 1:0 protocol all prio 999 u32 \
-        match ip protocol 0 0x00 flowid 1:12  
-
-# FIXME should probably change the filter here to do pre-nat
+case $QDISC in
+       cake*) 
+           $TC qdisc add dev $IFACE root `get_stab_string` $QDISC bandwidth ${CEIL}kbit `get_cake_lla_string` ${EQDISC_OPTS}
+           ;;
+       *)      
+           $TC qdisc add dev $IFACE root handle 1: `get_stab_string` htb default 12
+           $TC class add dev $IFACE parent 1: classid 1:1 htb $LQ rate ${CEIL}kbit ceil ${CEIL}kbit `get_htb_adsll_string`
+           $TC class add dev $IFACE parent 1:1 classid 1:10 htb $LQ rate ${CEIL}kbit ceil ${CEIL}kbit prio 0 `get_htb_adsll_string`
+           $TC class add dev $IFACE parent 1:1 classid 1:11 htb $LQ rate 128kbit ceil ${PRIO_RATE}kbit prio 1 `get_htb_adsll_string`
+           $TC class add dev $IFACE parent 1:1 classid 1:12 htb $LQ rate ${BE_RATE}kbit ceil ${BE_CEIL}kbit prio 2 `get_htb_adsll_string`
+           $TC class add dev $IFACE parent 1:1 classid 1:13 htb $LQ rate ${BK_RATE}kbit ceil ${BE_CEIL}kbit prio 3 `get_htb_adsll_string`
+
+           $TC qdisc add dev $IFACE parent 1:11 handle 110: $QDISC `get_limit ${ELIMIT}` `get_target "${ETARGET}" ${UPLINK}` `get_ecn ${EECN}` `get_quantum 300` `get_flows ${PRIO_RATE}` ${EQDISC_OPTS}
+           $TC qdisc add dev $IFACE parent 1:12 handle 120: $QDISC `get_limit ${ELIMIT}` `get_target "${ETARGET}" ${UPLINK}` `get_ecn ${EECN}` `get_quantum 300` `get_flows ${BE_RATE}` ${EQDISC_OPTS}
+           $TC qdisc add dev $IFACE parent 1:13 handle 130: $QDISC `get_limit ${ELIMIT}` `get_target "${ETARGET}" ${UPLINK}` `get_ecn ${EECN}` `get_quantum 300` `get_flows ${BK_RATE}` ${EQDISC_OPTS}
+
+           # Need a catchall rule
+
+           $TC filter add dev $IFACE parent 1:0 protocol all prio 999 u32 \
+               match ip protocol 0 0x00 flowid 1:12  
+
+           # FIXME should probably change the filter here to do pre-nat
         
-$TC filter add dev $IFACE parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
-$TC filter add dev $IFACE parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
-$TC filter add dev $IFACE parent 1:0 protocol ip prio 3 handle 3 fw classid 1:13
+           $TC filter add dev $IFACE parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
+           $TC filter add dev $IFACE parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
+           $TC filter add dev $IFACE parent 1:0 protocol ip prio 3 handle 3 fw classid 1:13
 
-# ipv6 support. Note that the handle indicates the fw mark bucket that is looked for
+           # ipv6 support. Note that the handle indicates the fw mark bucket that is looked for
 
-$TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 4 handle 1 fw classid 1:11
-$TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 5 handle 2 fw classid 1:12
-$TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 6 handle 3 fw classid 1:13
+           $TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 4 handle 1 fw classid 1:11
+           $TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 5 handle 2 fw classid 1:12
+           $TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 6 handle 3 fw classid 1:13
 
-# Arp traffic
+           # Arp traffic
 
-$TC filter add dev $IFACE parent 1:0 protocol arp prio 7 handle 1 fw classid 1:11
+           $TC filter add dev $IFACE parent 1:0 protocol arp prio 7 handle 1 fw classid 1:11
 
-# ICMP traffic - Don't impress your friends. Deoptimize to manage ping floods
-# better instead
+           # ICMP traffic - Don't impress your friends. Deoptimize to manage ping floods
+           # better instead
 
-$TC filter add dev $IFACE parent 1:0 protocol ip prio 8 \
-        u32 match ip protocol 1 0xff flowid 1:13
+           $TC filter add dev $IFACE parent 1:0 protocol ip prio 8 \
+                u32 match ip protocol 1 0xff flowid 1:13
 
-$TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 9 \
-        u32 match ip protocol 1 0xff flowid 1:13
+           $TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 9 \
+                u32 match ip protocol 1 0xff flowid 1:13
+           ;;
+esac
 
 #diffserv $IFACE
 
@@ -144,31 +159,43 @@ $TC qdisc del dev $DEV root  2> /dev/null
 
 if [ "$SQUASH_INGRESS" = "1" ]
 then
-sqm_logger "Do not perform DSCP based filtering on ingress. (1-tier classification)"
-# Revert to no dscp based filtering
-$TC qdisc del dev $DEV root 2>/dev/null
-$TC qdisc add dev $DEV root handle 1: `get_stab_string` htb default 10
-$TC class add dev $DEV parent 1: classid 1:1 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit `get_htb_adsll_string`
-$TC class add dev $DEV parent 1:1 classid 1:10 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit prio 0 `get_htb_adsll_string`
-$TC qdisc add dev $DEV parent 1:10 handle 110: $QDISC `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_flows ${DOWNLINK}` ${IQDISC_OPTS}
+       sqm_logger "Do not perform DSCP based filtering on ingress. (1-tier classification)"
+       # Revert to no dscp based filtering
+       case $QDISC in
+               cake*) 
+                   $TC qdisc add dev $DEV root `get_stab_string` $QDISC bandwidth ${DOWNLINK}kbit besteffort `get_cake_lla_string` ${IQDISC_OPTS}
+                   ;;
+               *)      
+                   $TC qdisc add dev $DEV root handle 1: `get_stab_string` htb default 10
+                   $TC class add dev $DEV parent 1: classid 1:1 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit `get_htb_adsll_string`
+                   $TC class add dev $DEV parent 1:1 classid 1:10 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit prio 0 `get_htb_adsll_string`
+                   $TC qdisc add dev $DEV parent 1:10 handle 110: $QDISC `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_flows ${DOWNLINK}` ${IQDISC_OPTS}
+                   ;;
+       esac
 
 else
-sqm_logger "Perform DSCP based filtering on ingress. (3-tier classification)"
-$TC qdisc add dev $DEV root handle 1: `get_stab_string` htb default 12
-$TC class add dev $DEV parent 1: classid 1:1 htb $LQ rate ${CEIL}kbit ceil ${CEIL}kbit `get_htb_adsll_string`
-$TC class add dev $DEV parent 1:1 classid 1:10 htb $LQ rate ${CEIL}kbit ceil ${CEIL}kbit prio 0 `get_htb_adsll_string`
-$TC class add dev $DEV parent 1:1 classid 1:11 htb $LQ rate 32kbit ceil ${PRIO_RATE}kbit prio 1 `get_htb_adsll_string`
-$TC class add dev $DEV parent 1:1 classid 1:12 htb $LQ rate ${BE_RATE}kbit ceil ${BE_CEIL}kbit prio 2 `get_htb_adsll_string`
-$TC class add dev $DEV parent 1:1 classid 1:13 htb $LQ rate ${BK_RATE}kbit ceil ${BE_CEIL}kbit prio 3 `get_htb_adsll_string`
-
-# I'd prefer to use a pre-nat filter but that causes permutation...
-
-$TC qdisc add dev $DEV parent 1:11 handle 110: $QDISC `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_quantum 500` `get_flows ${PRIO_RATE}` ${IQDISC_OPTS}
-$TC qdisc add dev $DEV parent 1:12 handle 120: $QDISC `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_quantum 1500` `get_flows ${BE_RATE}` ${IQDISC_OPTS}
-$TC qdisc add dev $DEV parent 1:13 handle 130: $QDISC `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_quantum 300` `get_flows ${BK_RATE}` ${IQDISC_OPTS}
-
-diffserv $DEV
-
+    sqm_logger "Perform DSCP based filtering on ingress. (3-tier classification)"
+    case $QDISC in
+           cake*) 
+                   $TC qdisc add dev $DEV root `get_stab_string` $QDISC bandwidth ${DOWNLINK}kbit `get_cake_lla_string` $CAKE_OPTS ${IQDISC_OPTS}
+                   ;;
+           *)  
+                   $TC qdisc add dev $DEV root handle 1: `get_stab_string` htb default 12
+                   $TC class add dev $DEV parent 1: classid 1:1 htb $LQ rate ${CEIL}kbit ceil ${CEIL}kbit `get_htb_adsll_string`
+                   $TC class add dev $DEV parent 1:1 classid 1:10 htb $LQ rate ${CEIL}kbit ceil ${CEIL}kbit prio 0 `get_htb_adsll_string`
+                   $TC class add dev $DEV parent 1:1 classid 1:11 htb $LQ rate 32kbit ceil ${PRIO_RATE}kbit prio 1 `get_htb_adsll_string`
+                   $TC class add dev $DEV parent 1:1 classid 1:12 htb $LQ rate ${BE_RATE}kbit ceil ${BE_CEIL}kbit prio 2 `get_htb_adsll_string`
+                   $TC class add dev $DEV parent 1:1 classid 1:13 htb $LQ rate ${BK_RATE}kbit ceil ${BE_CEIL}kbit prio 3 `get_htb_adsll_string`
+
+                   # I'd prefer to use a pre-nat filter but that causes permutation...
+
+                   $TC qdisc add dev $DEV parent 1:11 handle 110: $QDISC `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_quantum 500` `get_flows ${PRIO_RATE}` ${IQDISC_OPTS}
+                   $TC qdisc add dev $DEV parent 1:12 handle 120: $QDISC `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_quantum 1500` `get_flows ${BE_RATE}` ${IQDISC_OPTS}
+                   $TC qdisc add dev $DEV parent 1:13 handle 130: $QDISC `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_quantum 300` `get_flows ${BK_RATE}` ${IQDISC_OPTS}
+
+                   diffserv $DEV
+                   ;;
+    esac
 fi
 
 ifconfig $DEV up
index f06c25211ea544550727f1e270785bba90b6fad7..95362afffb243489c0d539983f891320cf7e3d68 100755 (executable)
@@ -7,7 +7,7 @@
 # it under the terms of the GNU General Public License version 2 as
 # published by the Free Software Foundation.
 #
-#       Copyright (C) 2012-4 Michael D. Taht, Toke Høiland-Jørgensen, Sebastian Moeller
+#       Copyright (C) 2012-5 Michael D. Taht, Toke Høiland-Jørgensen, Sebastian Moeller
 
 . /usr/lib/sqm/functions.sh
 sqm_logger "Starting simplest.qos"
@@ -17,10 +17,17 @@ egress() {
 LQ="quantum `get_mtu $IFACE ${UPLINK}`"
 
 $TC qdisc del dev $IFACE root 2>/dev/null
-$TC qdisc add dev $IFACE root handle 1: `get_stab_string` htb default 10
-$TC class add dev $IFACE parent 1: classid 1:1 htb $LQ rate ${UPLINK}kbit ceil ${UPLINK}kbit `get_htb_adsll_string`
-$TC class add dev $IFACE parent 1:1 classid 1:10 htb $LQ rate ${UPLINK}kbit ceil ${UPLINK}kbit prio 0 `get_htb_adsll_string`
-$TC qdisc add dev $IFACE parent 1:10 handle 110: $QDISC `get_limit ${ELIMIT}` `get_target "${ETARGET}" ${UPLINK}` `get_ecn ${EECN}` `get_flows ${UPLINK}` ${EQDISC_OPTS}
+case $QDISC in
+       cake*) 
+           $TC qdisc add dev $IFACE root `get_stab_string` cake bandwidth ${UPLINK}kbit besteffort `get_cake_lla_string` ${EQDISC_OPTS}
+           ;;
+       *)
+           $TC qdisc add dev $IFACE root handle 1: `get_stab_string` htb default 10
+           $TC class add dev $IFACE parent 1: classid 1:1 htb $LQ rate ${UPLINK}kbit ceil ${UPLINK}kbit `get_htb_adsll_string`
+           $TC class add dev $IFACE parent 1:1 classid 1:10 htb $LQ rate ${UPLINK}kbit ceil ${UPLINK}kbit prio 0 `get_htb_adsll_string`
+           $TC qdisc add dev $IFACE parent 1:10 handle 110: $QDISC `get_limit ${ELIMIT}` `get_target "${ETARGET}" ${UPLINK}` `get_ecn ${EECN}` `get_flows ${UPLINK}` ${EQDISC_OPTS}
+           ;;
+esac
 
 }
 
@@ -33,16 +40,23 @@ $TC qdisc add dev $IFACE handle ffff: ingress
 LQ="quantum `get_mtu $IFACE ${DOWNLINK}`"
  
 $TC qdisc del dev $DEV root 2>/dev/null
-$TC qdisc add dev $DEV root handle 1: `get_stab_string` htb default 10
-$TC class add dev $DEV parent 1: classid 1:1 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit `get_htb_adsll_string`
-$TC class add dev $DEV parent 1:1 classid 1:10 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit prio 0 `get_htb_adsll_string`
-
-# FIXME: I'd prefer to use a pre-nat filter but we need to detect if nat is on this interface
-# AND we need to permute by a random number which we can't do from userspace filters
-
-# Most high rate flows are REALLY close. This stomps on those harder, but hurts on high rate long distance
-#$TC qdisc add dev $DEV parent 1:10 handle 110: $QDISC limit $LIMIT $ECN interval 20ms target 3ms `get_flows ${DOWNLINK}`
-$TC qdisc add dev $DEV parent 1:10 handle 110: $QDISC `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_flows ${DOWNLINK}` ${IQDISC_OPTS}
+case $QDISC in
+       cake*) 
+           $TC qdisc add dev $DEV root `get_stab_string` cake bandwidth ${DOWNLINK}kbit besteffort `get_cake_lla_string` ${IQDISC_OPTS}
+           ;;
+       *)
+           $TC qdisc add dev $DEV root handle 1: `get_stab_string` htb default 10
+           $TC class add dev $DEV parent 1: classid 1:1 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit `get_htb_adsll_string`
+           $TC class add dev $DEV parent 1:1 classid 1:10 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit prio 0 `get_htb_adsll_string`
+
+           # FIXME: I'd prefer to use a pre-nat filter but we need to detect if nat is on this interface
+           # AND we need to permute by a random number which we can't do from userspace filters
+
+           # Most high rate flows are REALLY close. This stomps on those harder, but hurts on high rate long distance
+           #$TC qdisc add dev $DEV parent 1:10 handle 110: $QDISC limit $LIMIT $ECN interval 20ms target 3ms `get_flows ${DOWNLINK}`
+           $TC qdisc add dev $DEV parent 1:10 handle 110: $QDISC `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_flows ${DOWNLINK}` ${IQDISC_OPTS}
+           ;;
+esac
 
 ifconfig $DEV up
 
index 1d34d26ca0defa4dd4e25468944a481f9106a5e5..4c1a6e445d4c0bcdc7dc5e482cb7032603fd865a 100644 (file)
@@ -8,15 +8,15 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=squid
-PKG_VERSION:=3.5.2
-PKG_RELEASE:=3
+PKG_VERSION:=3.5.5
+PKG_RELEASE:=1
 
 PKG_LICENSE:=GPL-2.0
 PKG_MAINTAINER:=Luka Perkov <luka@openwrt.org>
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=http://www.squid-cache.org/Versions/v3/3.5/
-PKG_MD5SUM:=0330ec9f69e333c2a81fa4502ba96a22
+PKG_MD5SUM:=9a323a97753143ddd935aed58a0193ae
 
 PKG_BUILD_PARALLEL:=1
 PKG_INSTALL:=1
index a6cc6e23cb8464009a801833897f67d906c8943a..c7493bbceee54959fbe069d5323ad3f86513aaf5 100644 (file)
@@ -1,49 +1,24 @@
 --- a/src/Makefile.in
 +++ b/src/Makefile.in
-@@ -7759,7 +7759,7 @@ cache_cf.o: cf_parser.cci
- # cf_gen builds the configuration files.
+@@ -7761,3 +7761,3 @@ cache_cf.o: cf_parser.cci
  cf_gen$(EXEEXT): $(cf_gen_SOURCES) $(cf_gen_DEPENDENCIES) cf_gen_defines.cci
 -      $(BUILDCXX) $(BUILDCXXFLAGS) -o $@ $(srcdir)/cf_gen.cc -I$(srcdir) -I$(top_builddir)/include/ -I$(top_builddir)/src
 +      g++ -o $@ $(srcdir)/cf_gen.cc -I$(srcdir) -I$(top_builddir)/include/ -I$(top_builddir)/src
  
- # squid.conf.default is built by cf_gen when making cf_parser.cci
- squid.conf.default squid.conf.documented: cf_parser.cci
 --- a/configure
 +++ b/configure
-@@ -22935,7 +22935,7 @@ $as_echo_n "checking whether the SSL_get
-   if test "$cross_compiling" = yes; then :
-   { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error $? "cannot run test program while cross compiling
-+_as_fn_error $? "cannot run test program while cross compiling
- See \`config.log' for more details" "$LINENO" 5; }
- else
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -22983,7 +22983,7 @@ $as_echo_n "checking whether the workaro
-   if test "$cross_compiling" = yes; then :
-   { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+@@ -20133,3 +20133,3 @@ if test "$cross_compiling" = yes; then :
  $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 -as_fn_error $? "cannot run test program while cross compiling
 +_as_fn_error $? "cannot run test program while cross compiling
  See \`config.log' for more details" "$LINENO" 5; }
- else
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -28201,7 +28201,7 @@ else
-     if test "$cross_compiling" = yes; then :
-   { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+@@ -28289,3 +28289,3 @@ else
  $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 -as_fn_error $? "cannot run test program while cross compiling
 +_as_fn_error $? "cannot run test program while cross compiling
  See \`config.log' for more details" "$LINENO" 5; }
- else
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -28226,7 +28226,7 @@ else
-     if test "$cross_compiling" = yes; then :
-   { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+@@ -28314,3 +28314,3 @@ else
  $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 -as_fn_error $? "cannot run test program while cross compiling
 +_as_fn_error $? "cannot run test program while cross compiling
  See \`config.log' for more details" "$LINENO" 5; }
- else
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
index e7f1c0e6bbbf53386876b2629edaac8f66731708..1c0fe7663999a4bfac5dae84cffcebb43751950a 100644 (file)
@@ -38,6 +38,7 @@ define Build/Compile
                CFLAGS="$(TARGET_CFLAGS)" \
                USELIBCONFIG= \
                USELIBWRAP= \
+               USELIBPCRE= \
                all
 endef
 
diff --git a/net/sslh/patches/002-no_regex_probes.patch b/net/sslh/patches/002-no_regex_probes.patch
new file mode 100644 (file)
index 0000000..130c311
--- /dev/null
@@ -0,0 +1,90 @@
+From 3aefaf300478cd6fbc4892d5baaf70521ed323af Mon Sep 17 00:00:00 2001
+From: Yves Rutschle <git1@rutschle.net>
+Date: Thu, 9 Jul 2015 15:31:42 +0200
+Subject: [PATCH] Added Makefile option to build without libpcre
+
+---
+--- a/Makefile
++++ b/Makefile
+@@ -2,6 +2,7 @@
+ VERSION=$(shell ./genver.sh -r)
+ USELIBCONFIG=1        # Use libconfig? (necessary to use configuration files)
++USELIBPCRE=1  # Use libpcre? (necessary to use regex probe)
+ USELIBWRAP?=  # Use libwrap?
+ USELIBCAP=    # Use libcap?
+ COV_TEST=     # Perform test coverage?
+@@ -27,6 +28,10 @@ ifneq ($(strip $(USELIBWRAP)),)
+       CPPFLAGS+=-DLIBWRAP
+ endif
++ifneq ($(strip $(USELIBPCRE)),)
++      CPPFLAGS+=-DLIBPCRE
++endif
++
+ ifneq ($(strip $(USELIBCONFIG)),)
+       LIBS:=$(LIBS) -lconfig
+       CPPFLAGS+=-DLIBCONFIG
+--- a/probe.c
++++ b/probe.c
+@@ -21,7 +21,9 @@
+ #define _GNU_SOURCE
+ #include <stdio.h>
++#ifdef LIBPCRE
+ #include <regex.h>
++#endif
+ #include <ctype.h>
+ #include "probe.h"
+@@ -226,6 +228,7 @@ static int is_tls_protocol(const char *p
+ static int regex_probe(const char *p, int len, struct proto *proto)
+ {
++#ifdef LIBPCRE
+     regex_t **probe = proto->data;
+     regmatch_t pos = { 0, len };
+@@ -233,6 +236,11 @@ static int regex_probe(const char *p, in
+         /* try them all */;
+     return (*probe != NULL);
++#else
++    /* Should never happen as we check when loading config file */
++    fprintf(stderr, "FATAL: regex probe called but not built in\n");
++    exit(5);
++#endif
+ }
+ /* 
+--- a/sslh-main.c
++++ b/sslh-main.c
+@@ -25,7 +25,9 @@
+ #ifdef LIBCONFIG
+ #include <libconfig.h>
+ #endif
++#ifdef LIBPCRE
+ #include <regex.h>
++#endif
+ #include "common.h"
+ #include "probe.h"
+@@ -174,6 +176,7 @@ static int config_listen(config_t *confi
+ #ifdef LIBCONFIG
+ static void setup_regex_probe(struct proto *p, config_setting_t* probes)
+ {
++#ifdef LIBPCRE
+     int num_probes, errsize, i, res;
+     char *err;
+     const char * expr;
+@@ -201,6 +204,10 @@ static void setup_regex_probe(struct pro
+             exit(1);
+         }
+     }
++#else
++    fprintf(stderr, "line %d: regex probe specified but not compiled in\n", config_setting_source_line(probes));
++    exit(5);
++#endif
+ }
+ #endif
index 6e6526982105b4a01793ab8c33104f8fd29ea455..baea8d2be27bb3c70c8e9123645516e24ddfe77b 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2006-2014 OpenWrt.org
+# Copyright (C) 2006-2015 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -18,6 +18,8 @@ PKG_LICENSE=GPLv2
 
 include $(INCLUDE_DIR)/package.mk
 
+TARGET_CPPFLAGS += -I$(PKG_BUILD_DIR)/include
+
 define Package/sstp-client
   SECTION:=net
   CATEGORY:=Network
diff --git a/net/sstp-client/patches/100-musl-compat.patch b/net/sstp-client/patches/100-musl-compat.patch
new file mode 100644 (file)
index 0000000..d19b2fa
--- /dev/null
@@ -0,0 +1,33 @@
+--- /dev/null
++++ b/include/net/ppp_defs.h
+@@ -0,0 +1,10 @@
++#ifndef _NET_PPP_DEFS_H
++#define _NET_PPP_DEFS_H 1
++
++#define __need_time_t
++#include <time.h>
++
++#include <asm/types.h>
++#include <linux/ppp_defs.h>
++
++#endif /* net/ppp_defs.h */
+--- a/src/libsstp-log/sstp-log-syslog.c
++++ b/src/libsstp-log/sstp-log-syslog.c
+@@ -32,6 +32,7 @@
+ #include <sys/uio.h>
+ #include <sys/un.h>
+ #include <sys/socket.h>
++#include <sys/types.h>
+ #include <unistd.h>
+ #include <sstp-common.h>
+--- a/src/libsstp-log/sstp-log-std.c
++++ b/src/libsstp-log/sstp-log-std.c
+@@ -25,6 +25,7 @@
+ #include <stdio.h>
+ #include <stdint.h>
+ #include <string.h>
++#include <sys/types.h>
+ #include <sys/uio.h>
+ #include <unistd.h>
index 73b2d5a4871e1c66a6df3bd8a65ad1cd27852e53..3b90e6cf2ee7ae4078d367bd22405e05d8106da7 100644 (file)
@@ -10,7 +10,7 @@
  
 --- /dev/null
 +++ b/src/libstrongswan/musl.h
-@@ -0,0 +1,33 @@
+@@ -0,0 +1,39 @@
 +#include <sys/types.h>
 +
 +#define crypt x_crypt
@@ -25,6 +25,9 @@
 +#define mode_t x_mode_t
 +#define uid_t x_uid_t
 +#define gid_t x_gid_t
++#define uint64_t x_uint64_t
++#define u_int64_t x_u_int64_t
++#define int64_t x_int64_t
 +#define nlink_t x_nlink_t
 +#define timer_t x_timer_t
 +#define blkcnt_t x_blkcnt_t
@@ -39,6 +42,9 @@
 +#undef mode_t
 +#undef uid_t
 +#undef gid_t
++#undef uint64_t
++#undef u_int64_t
++#undef int64_t
 +#undef nlink_t
 +#undef timer_t
 +#undef blkcnt_t
index 1facb1e137ccf56b53d0f9e18488a53f11b3abd3..c7d40283c2d5df77b57aeef5306f28bdf8b42344 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=tinc
-PKG_VERSION:=1.0.25
-PKG_RELEASE:=2
+PKG_VERSION:=1.0.26
+PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://www.tinc-vpn.org/packages
-PKG_MD5SUM:=0b91b693f7cf76f481b547d0c86f9578
+PKG_MD5SUM:=a8c168227fa42cbfcd4983247bf609ca
 
 PKG_INSTALL:=1
 
diff --git a/net/tinc/patches/100-musl-compat.patch b/net/tinc/patches/100-musl-compat.patch
deleted file mode 100644 (file)
index e0910b1..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/src/have.h
-+++ b/src/have.h
-@@ -196,4 +196,8 @@
- #include <netinet/if_ether.h>
- #endif
-+#ifdef HAVE_LINUX_IF_TUN_H
-+#include <linux/if_tun.h>
-+#endif
-+
- #endif /* __TINC_SYSTEM_H__ */
index 4dfdb2868ecfce10f3d1a7917761a4ff973715a5..fdf3ad9ec0db3015e15a3c2bee92b4f3cb712c48 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2006-2014 OpenWrt.org
+# Copyright (C) 2006-2015 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:=ulogd
 PKG_VERSION:=2.0.4
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_URL:=ftp://ftp.netfilter.org/pub/ulogd/ \
@@ -124,6 +124,9 @@ PKG_CONFIG_DEPENDS:= \
        CONFIG_PACKAGE_ulogd-mod-pgsql \
        CONFIG_PACKAGE_ulogd-mod-sqlite \
 
+TARGET_CFLAGS += \
+       -D_GNU_SOURCE \
+
 CONFIGURE_ARGS += \
        --enable-nfacct \
        --enable-nfct \
diff --git a/net/ulogd/patches/100-musl-compat.patch b/net/ulogd/patches/100-musl-compat.patch
new file mode 100644 (file)
index 0000000..2f1c293
--- /dev/null
@@ -0,0 +1,57 @@
+--- a/src/ulogd.c
++++ b/src/ulogd.c
+@@ -83,7 +83,7 @@ static char *ulogd_logfile = NULL;
+ static const char *ulogd_configfile = ULOGD_CONFIGFILE;
+ static const char *ulogd_pidfile = NULL;
+ static int ulogd_pidfile_fd = -1;
+-static FILE syslog_dummy;
++static int ulogd_use_syslog = 0;
+ static int info_mode = 0;
+@@ -427,7 +427,7 @@ void __ulogd_log(int level, char *file,
+       if (level < loglevel_ce.u.value)
+               return;
+-      if (logfile == &syslog_dummy) {
++      if (ulogd_use_syslog) {
+               /* FIXME: this omits the 'file' string */
+               va_start(ap, format);
+               vsyslog(ulogd2syslog_level(level), format, ap);
+@@ -950,7 +950,7 @@ static int logfile_open(const char *name
+               logfile = stdout;
+       } else if (!strcmp(name, "syslog")) {
+               openlog("ulogd", LOG_PID, LOG_DAEMON);
+-              logfile = &syslog_dummy;
++              ulogd_use_syslog = 1;
+       } else {
+               logfile = fopen(ulogd_logfile, "a");
+               if (!logfile) {
+@@ -1240,7 +1240,7 @@ static void sigterm_handler(int signal)
+       unload_plugins();
+ #endif
+-      if (logfile != NULL  && logfile != stdout && logfile != &syslog_dummy) {
++      if (logfile != NULL  && logfile != stdout) {
+               fclose(logfile);
+               logfile = NULL;
+       }
+@@ -1262,7 +1262,7 @@ static void signal_handler(int signal)
+       switch (signal) {
+       case SIGHUP:
+               /* reopen logfile */
+-              if (logfile != stdout && logfile != &syslog_dummy) {
++              if (logfile != NULL && logfile != stdout) {
+                       fclose(logfile);
+                       logfile = fopen(ulogd_logfile, "a");
+                       if (!logfile) {
+--- a/filter/raw2packet/ulogd_raw2packet_BASE.c
++++ b/filter/raw2packet/ulogd_raw2packet_BASE.c
+@@ -42,6 +42,7 @@
+ #include <ulogd/ulogd.h>
+ #include <ulogd/ipfix_protocol.h>
+ #include <netinet/if_ether.h>
++#include <linux/types.h>
+ #include <string.h>
+ enum input_keys {
index bc54bb75f3cdaa955282204dacb58e600106e7ec..e39c3b2e324eaf706f1660138b54898d3f942400 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=unbound
 PKG_VERSION:=1.5.3
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_LICENSE:=BSD-3-Clause
 PKG_LICENSE_FILES:=LICENSE
@@ -109,7 +109,6 @@ define Package/libunbound/description
 endef
 
 CONFIGURE_ARGS += \
-       --disable-ecdsa \
        --disable-gost \
        --enable-allsymbols \
        --with-libexpat="$(STAGING_DIR)/usr" \
index 8aa0df0eb78262bfd3514db8d1058c866a081e53..49130574fa43b0a71ab8b9312f699eafcaf19a25 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=usbip
-PKG_RELEASE:=4
+PKG_RELEASE:=5
 PKG_LICENSE:=GPL-2.0
 
 # Since kernel 2.6.39.1 userspace tools are inside the kernel tree
diff --git a/net/usbip/patches-2.0/100-musl-compat.patch b/net/usbip/patches-2.0/100-musl-compat.patch
new file mode 100644 (file)
index 0000000..a64678c
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/src/usbipd.c
++++ b/src/usbipd.c
+@@ -453,7 +453,7 @@ static void set_signal(void)
+       sigaction(SIGTERM, &act, NULL);
+       sigaction(SIGINT, &act, NULL);
+       act.sa_handler = SIG_IGN;
+-      sigaction(SIGCLD, &act, NULL);
++      sigaction(SIGCHLD, &act, NULL);
+ }
+ static const char *pid_file;
index 95948cfddbc518356b39ab7d869e6cef805b2471..3af3695ae83fb97af8bbf133e8c767a5821489a7 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=vpnc-scripts
 PKG_VERSION:=20150116
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 include $(INCLUDE_DIR)/package.mk
 
index c6007ab8562427645b24d4fe868f7883ffbab13c..48c8ed04bb9a9314c37567d8c46754f9a96b736d 100755 (executable)
@@ -87,16 +87,29 @@ do_connect() {
                rm -f $DNSMASQ_FILE
                echo "$SDNS" | while read i; do
                        if [ -n "$INTERNAL_IP4_DNS" ];then
-                               echo "server=/$i/$INTERNAL_IP4_DNS" >> $DNSMASQ_FILE
+                               for dns in "$INTERNAL_IP4_DNS";do
+                                       echo "server=/$i/$dns" >> $DNSMASQ_FILE
+                               done
                        fi
                        if [ -n "$INTERNAL_IP6_DNS" ];then
-                               echo "server=/$i/$INTERNAL_IP6_DNS" >> $DNSMASQ_FILE
+                               for dns in "$INTERNAL_IP6_DNS";do
+                                       echo "server=/$i/$dns" >> $DNSMASQ_FILE
+                               done
                        fi
                        echo "rebind-domain-ok=$i" >> $DNSMASQ_FILE
                done
                /etc/init.d/dnsmasq restart
        else
-               [ -n "$INTERNAL_IP4_DNS" ] && proto_add_dns_server "$INTERNAL_IP4_DNS"
+               if [ -n "$INTERNAL_IP4_DNS" ];then
+                       for dns in "$INTERNAL_IP4_DNS";do
+                               proto_add_dns_server "$dns"
+                       done
+               fi
+               if [ -n "$INTERNAL_IP6_DNS" ];then
+                       for dns in "$INTERNAL_IP6_DNS";do
+                               proto_add_dns_server "$dns"
+                       done
+               fi
                [ -n "$CISCO_DEF_DOMAIN" ] && proto_add_dns_search "$CISCO_DEF_DOMAIN"
        fi
 
index 95995e10c71accc26fd30695490137acc6baa849..052da0c3b53be9bb1d009a4cca699f1a658e6df9 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:=2
+PKG_RELEASE:=3
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://svn.unix-ag.uni-kl.de/vpnc/trunk/
index 31d0070dcf8a7c3753bd330a218de10a69a6a1a8..c408d78aecaec225022b27bbd9e2fab84634b82d 100755 (executable)
@@ -42,7 +42,7 @@ proto_vpnc_setup() {
        logger -t vpnc "initializing..."
        serv_addr=
        for ip in $(resolveip -t 10 "$server"); do
-               ( proto_add_host_dependency "$config" "$ip" $interface )
+               ( proto_add_host_dependency "vpn-$config" "$ip" $interface )
                serv_addr=1
        done
        [ -n "$serv_addr" ] || {
index f24a79b8b1cdb232e3bdace33b22244c0c89414b..e68b3eb21d5e5a5da486a08f98a45eda046274f7 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=vsftpd
 PKG_VERSION:=3.0.2
-PKG_RELEASE:=5
+PKG_RELEASE:=6
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://security.appspot.com/downloads/
diff --git a/net/vsftpd/patches/007-CVE-2015-1419.patch b/net/vsftpd/patches/007-CVE-2015-1419.patch
new file mode 100644 (file)
index 0000000..173027a
--- /dev/null
@@ -0,0 +1,98 @@
+Description: CVE-2015-1419: config option deny_file is not handled correctly
+Author: Marcus Meissner <meissner@suse.com>
+Origin: https://bugzilla.novell.com/show_bug.cgi?id=CVE-2015-1419
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=776922
+Last-Update: 2015-02-24
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- a/ls.c
++++ b/ls.c
+@@ -7,6 +7,7 @@
+  * Would you believe, code to handle directory listing.
+  */
++#include <stdlib.h>
+ #include "ls.h"
+ #include "access.h"
+ #include "defs.h"
+@@ -243,11 +244,42 @@ vsf_filename_passes_filter(const struct
+   struct mystr temp_str = INIT_MYSTR;
+   struct mystr brace_list_str = INIT_MYSTR;
+   struct mystr new_filter_str = INIT_MYSTR;
++  struct mystr normalize_filename_str = INIT_MYSTR;
++  const char *normname;
++  const char *path;
+   int ret = 0;
+   char last_token = 0;
+   int must_match_at_current_pos = 1;
++
+   str_copy(&filter_remain_str, p_filter_str);
+-  str_copy(&name_remain_str, p_filename_str);
++
++  /* normalize filepath */
++  path = str_strdup(p_filename_str);
++  normname = realpath(path, NULL);
++  if (normname == NULL)
++     goto out;
++  str_alloc_text(&normalize_filename_str, normname);
++
++  if (!str_isempty (&filter_remain_str) && !str_isempty(&normalize_filename_str)) {
++    if (str_get_char_at(p_filter_str, 0) == '/') {
++      if (str_get_char_at(&normalize_filename_str, 0) != '/') {
++        str_getcwd (&name_remain_str);
++
++        if (str_getlen(&name_remain_str) > 1) /* cwd != root dir */
++          str_append_char (&name_remain_str, '/');
++
++        str_append_str (&name_remain_str, &normalize_filename_str);
++      }
++      else
++       str_copy (&name_remain_str, &normalize_filename_str);
++    } else {
++      if (str_get_char_at(p_filter_str, 0) != '{')
++        str_basename (&name_remain_str, &normalize_filename_str);
++      else
++        str_copy (&name_remain_str, &normalize_filename_str);
++    }
++  } else
++    str_copy(&name_remain_str, &normalize_filename_str);
+   while (!str_isempty(&filter_remain_str) && *iters < VSFTP_MATCHITERS_MAX)
+   {
+@@ -360,6 +392,9 @@ vsf_filename_passes_filter(const struct
+     ret = 0;
+   }
+ out:
++  free(normname);
++  free(path);
++  str_free(&normalize_filename_str);
+   str_free(&filter_remain_str);
+   str_free(&name_remain_str);
+   str_free(&temp_str);
+--- a/str.c
++++ b/str.c
+@@ -711,3 +711,14 @@ str_replace_unprintable(struct mystr* p_
+   }
+ }
++void
++str_basename (struct mystr* d_str, const struct mystr* path)
++{
++  static struct mystr tmp;
++
++  str_copy (&tmp, path);
++  str_split_char_reverse(&tmp, d_str, '/');
++
++  if (str_isempty(d_str))
++   str_copy (d_str, path);
++}
+--- a/str.h
++++ b/str.h
+@@ -100,6 +100,7 @@ void str_replace_unprintable(struct myst
+ int str_atoi(const struct mystr* p_str);
+ filesize_t str_a_to_filesize_t(const struct mystr* p_str);
+ unsigned int str_octal_to_uint(const struct mystr* p_str);
++void str_basename (struct mystr* d_str, const struct mystr* path);
+ /* PURPOSE: Extract a line of text (delimited by \n or EOF) from a string
+  * buffer, starting at character position 'p_pos'. The extracted line will
index ade7606c3dc75a8b15a6b87856f68bbab2e08c4d..ddc2bb1faee598c29604a828444ba8d7cccc27c9 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=wifidog
 PKG_VERSION:=1.2.1
-PKG_RELEASE=1
+PKG_RELEASE=2
 
 
 PKG_LICENSE:=GPL-2.0
diff --git a/net/wifidog/patches/100-musl-compat.patch b/net/wifidog/patches/100-musl-compat.patch
new file mode 100644 (file)
index 0000000..599c1fe
--- /dev/null
@@ -0,0 +1,47 @@
+--- a/libhttpd/protocol.c
++++ b/libhttpd/protocol.c
+@@ -28,6 +28,7 @@
+ #if defined(_WIN32)
+ #else
++#include <fcntl.h>
+ #include <unistd.h>
+ #include <sys/file.h>
+ #endif
+--- a/src/firewall.c
++++ b/src/firewall.c
+@@ -35,7 +35,6 @@
+ #include <pthread.h>
+ #include <sys/wait.h>
+ #include <sys/types.h>
+-#include <sys/unistd.h>
+ #include <string.h>
+--- a/src/client_list.c
++++ b/src/client_list.c
+@@ -31,9 +31,9 @@
+ #include <syslog.h>
+ #include <errno.h>
+ #include <pthread.h>
++#include <unistd.h>
+ #include <sys/wait.h>
+ #include <sys/types.h>
+-#include <sys/unistd.h>
+ #include <string.h>
+--- a/src/util.c
++++ b/src/util.c
+@@ -33,10 +33,10 @@
+ #include <syslog.h>
+ #include <errno.h>
+ #include <pthread.h>
++#include <unistd.h>
+ #include <sys/wait.h>
+ #include <sys/types.h>
+ #include <sys/time.h>
+-#include <sys/unistd.h>
+ #include <netinet/in.h>
+ #include <sys/ioctl.h>
+ #include <arpa/inet.h>
index f0cba304feed0eb583f41d4bdc724cec448519d0..7836eee8cde4528f8afc8557035a909208aa64e3 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=znc
 PKG_VERSION:=1.6.0
-PKG_RELEASE:=1
+PKG_RELEASE:=3
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://znc.in/releases \
index 7cc7fa70fdbd836406692f0322bf724692f2a7fe..2ee5a1e588eccf3ee06b4857474103e64ca26ef8 100644 (file)
@@ -38,7 +38,9 @@ add_network() {
        config_get name "$network" name
        echo "  <Network $name>" >> $ZNC_CONFIG
        config_list_foreach "$network" server "add_param \"             Server\""
+       config_list_foreach "$network" fingerprint "add_param \"                trustedserverfingerprint\""
        config_list_foreach "$network" channel "add_chan"
+       echo "  </Network>" >> $ZNC_CONFIG
 }
 
 znc_global() {
@@ -142,6 +144,7 @@ add_user() {
        if [ "$server" ]; then
                echo "  <Network Default>" >> $ZNC_CONFIG
                config_list_foreach "$user" server "add_param \"                Server\""
+               config_list_foreach "$user" fingerprint "add_param \"           trustedserverfingerprint\""
                config_list_foreach "$user" channel "add_chan"
                echo "  </Network>" >> $ZNC_CONFIG
        fi
index e6b62633a5bce03319fc2aefadf9827796f1c6ad..3109b1c0889c5b398a733a052ccbe3a5bb6ddc19 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=mpc
-PKG_VERSION:=0.26
-PKG_RELEASE:=2
+PKG_VERSION:=0.27
+PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=http://www.musicpd.org/download/mpc/0
-PKG_MD5SUM:=d4f37e7e6b32c804a870192d1eb86199
+PKG_MD5SUM:=d9430db9b9d7fb1eadbe4d13e8d97c66
 PKG_LICENSE:=GPL-2.0+
 PKG_LICENSE_FILES:=COPYING
 PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
index 56e63eb4afed85720015ca3f7c757aff1740c85b..845360301fe452c8e788f95c354cd327666344ec 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=mpd
-PKG_VERSION:=0.18.23
+PKG_VERSION:=0.19.10
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
-PKG_SOURCE_URL:=http://www.musicpd.org/download/mpd/0.18/
-PKG_MD5SUM:=fcdfe8b3a7a21a87b6776204e6eb7814
+PKG_SOURCE_URL:=http://www.musicpd.org/download/mpd/0.19/
+PKG_MD5SUM:=da4bc3e47afd0faf9e7a67168e012102
 PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
 
 PKG_LICENSE:=GPL-2.0
@@ -28,15 +28,15 @@ PKG_CONFIG_DEPENDS:= \
 PKG_INSTALL:=1
 
 include $(INCLUDE_DIR)/package.mk
-include $(INCLUDE_DIR)/nls.mk
 
 define Package/mpd/Default
   SECTION:=sound
   CATEGORY:=Sound
   TITLE:=Music Player Daemon
   URL:=http://www.musicpd.org/
-  DEPENDS:= +glib2 +libcurl +libpthread +libmpdclient $(ICONV_DEPENDS) +libstdcpp \
-           +libflac +BUILD_PATENTED:libmad +libvorbisidec +AUDIO_SUPPORT:alsa-lib
+  DEPENDS:= +glib2 +libcurl +libpthread +libmpdclient +libstdcpp \
+           +libflac +BUILD_PATENTED:libmad +libvorbisidec +AUDIO_SUPPORT:alsa-lib \
+            +boost +boost-container +libexpat
 endef
 
 define Package/mpd/Default/description
@@ -51,7 +51,7 @@ $(call Package/mpd/Default)
   TITLE+= (full)
   DEPENDS+= \
        +libaudiofile +BUILD_PATENTED:libfaad2 +libffmpeg +libid3tag \
-       +libmms +libogg +libsndfile +libvorbis
+       +libmms +libogg +libsndfile +libvorbis +libupnp
   PROVIDES:=mpd
   VARIANT:=full
 endef
@@ -105,17 +105,15 @@ CONFIGURE_ARGS += \
        $(call autoconf_bool,CONFIG_IPV6,ipv6) \
        --disable-debug \
        --disable-documentation \
-       --disable-gprof \
        --disable-test \
        --disable-werror \
        \
        --disable-ao \
        --disable-bzip2 \
-       --enable-cue \
-       --disable-ffado \
        --disable-fluidsynth \
        --disable-gme \
        --enable-inotify \
+       --disable-icu \
        --disable-eventfd \
        --disable-iso9660 \
        --disable-jack \
@@ -126,13 +124,11 @@ CONFIGURE_ARGS += \
        --disable-modplug \
        --disable-mpc \
        --disable-mpg123 \
-       --disable-mvp \
        --disable-openal \
        --disable-opus \
        --disable-pulse \
        --disable-sidplay \
        --disable-solaris-output \
-       --disable-soup \
        --disable-sqlite \
        --disable-twolame-encoder \
        --enable-wave-encoder \
@@ -155,11 +151,12 @@ CONFIGURE_VARS += \
        $(if $(CONFIG_BUILD_PATENTED),MAD_CFLAGS="$(TARGET_CFLAGS)") \
        $(if $(CONFIG_BUILD_PATENTED),MAD_LIBS="$(TARGET_LDFLAGS) -lmad") \
 
-TARGET_LDFLAGS += -Wl,-rpath-link=$(STAGING_DIR)/usr/lib $(if $(ICONV_FULL),-liconv)
+TARGET_LDFLAGS += -Wl,-rpath-link=$(STAGING_DIR)/usr/lib
 
 ifeq ($(BUILD_VARIANT),full)
 
   CONFIGURE_ARGS += \
+       --enable-upnp \
        $(call autoconf_bool,CONFIG_BUILD_PATENTED,aac) \
        --enable-audiofile \
        --enable-fifo \
@@ -183,14 +180,13 @@ ifeq ($(BUILD_VARIANT),mini)
 
   # oggflac is not compatible with tremor
   CONFIGURE_ARGS += \
+       --disable-upnp \
        --disable-aac \
        --disable-audiofile \
        --disable-fifo \
        --disable-ffmpeg \
        --disable-id3 \
-       --disable-lastfm \
        --disable-mms \
-       --disable-oggflac \
        --disable-pipe-output \
        --disable-recorder-output \
        --disable-shout \
index f6624af18f9481d866bec5be7ba7270cf4def041..2c94c262c86ac6da486a68549a1082328f230e2f 100644 (file)
@@ -1,6 +1,6 @@
---- a/src/decoder/FfmpegDecoderPlugin.cxx
-+++ b/src/decoder/FfmpegDecoderPlugin.cxx
-@@ -666,6 +666,7 @@ static const char *const ffmpeg_mime_typ
+--- a/src/decoder/plugins/FfmpegDecoderPlugin.cxx
++++ b/src/decoder/plugins/FfmpegDecoderPlugin.cxx
+@@ -765,6 +765,7 @@ static const char *const ffmpeg_mime_typ
        "audio/qcelp",
        "audio/vorbis",
        "audio/vorbis+ogg",
index af2773d06ebe6aa1d2f693a2f119b10747218347..15c51f898d3442c674f6e21dfdf1c39213b06ed0 100644 (file)
@@ -1,6 +1,6 @@
---- a/src/decoder/FfmpegDecoderPlugin.cxx
-+++ b/src/decoder/FfmpegDecoderPlugin.cxx
-@@ -376,6 +376,13 @@ ffmpeg_probe(Decoder *decoder, InputStre
+--- a/src/decoder/plugins/FfmpegDecoderPlugin.cxx
++++ b/src/decoder/plugins/FfmpegDecoderPlugin.cxx
+@@ -458,6 +458,13 @@ ffmpeg_probe(Decoder *decoder, InputStre
  
        unsigned char buffer[BUFFER_SIZE];
        size_t nbytes = decoder_read(decoder, is, buffer, BUFFER_SIZE);
diff --git a/utils/banhosts/Makefile b/utils/banhosts/Makefile
new file mode 100644 (file)
index 0000000..0087a6f
--- /dev/null
@@ -0,0 +1,40 @@
+#
+# Copyright (C) 2015 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:=banhostlist
+PKG_VERSION:=1
+PKG_RELEASE:=1
+
+PKG_BUILD_DIR=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
+PKG_MAINTAINER:=Matteo Croce <matteo@openwrt.org>
+PKG_LICENCE:=GPL-2.0
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/banhostlist
+  SECTION:=utils
+  CATEGORY:=Utilities
+  TITLE:=List of advertising domains
+  URL:=http://winhelp2002.mvps.org/
+endef
+
+define Package/banhostlist/description
+List of domains serving advertising and malicious content to easily block them
+endef
+
+
+define Build/Compile/Default
+endef
+
+define Package/banhostlist/install
+       $(INSTALL_DIR) $(1)/etc/hotplug.d/iface
+       $(INSTALL_BIN) ./files/updatebanhost $(1)/etc/hotplug.d/iface/80-banhosts
+endef
+
+$(eval $(call BuildPackage,banhostlist))
diff --git a/utils/banhosts/files/updatebanhost b/utils/banhosts/files/updatebanhost
new file mode 100644 (file)
index 0000000..a00d9cb
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+file=/tmp/banhost
+
+gethosts() {
+       logger -t "banhost[$$]" "Update $file"
+       wget -qO- http://winhelp2002.mvps.org/hosts.txt |awk 'BEGIN{printf "0.0.0.0"}/^0\.0\.0\.0/{printf " "$2}END{exit(!FNR)}' >$file || exit 1
+       echo -n $time >$file.time
+       exec killall -HUP dnsmasq
+}
+
+if [ "$ACTION" = ifup -a "$INTERFACE" = wan ]; then
+       read time </proc/uptime
+       time=${time%%.*}
+
+       [ -f $file -a -f $file.time ] || gethosts
+       read oldtime <$file.time
+       [ $((time - oldtime)) -lt 604800 ] || gethosts
+fi
index 4865698f2afa33df48ba7e184835a7c4e6c6dd76..ebc1646396346b68b5d40fbbd9441df27d376ec8 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=bluez
 PKG_VERSION:=5.30
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=http://www.kernel.org/pub/linux/bluetooth/
@@ -47,7 +47,7 @@ $(call Package/bluez/Default)
   SECTION:=libs
   CATEGORY:=Libraries
   TITLE+= library
-  DEPENDS:=+libpthread
+  DEPENDS:=+libpthread +kmod-bluetooth
 endef
 
 define Package/bluez-utils
@@ -55,10 +55,18 @@ $(call Package/bluez/Default)
   SECTION:=utils
   CATEGORY:=Utilities
   TITLE+= utilities
-  DEPENDS:=+bluez-libs +libpthread +librt +dbus +glib2 +libical +libncurses +libreadline $(INTL_DEPENDS) $(ICONV_DEPENDS)
+  DEPENDS:=+bluez-libs +libpthread +librt +glib2 +libncurses +libreadline $(INTL_DEPENDS) $(ICONV_DEPENDS)
 endef
 
-define Package/bluez-utils/conffiles
+define Package/bluez-daemon
+$(call Package/bluez/Default)
+  SECTION:=utils
+  CATEGORY:=Utilities
+  TITLE+= daemon
+  DEPENDS:=+bluez-libs +bluez-utils +dbus +libical $(INTL_DEPENDS) $(ICONV_DEPENDS)
+endef
+
+define Package/bluez-daemon/conffiles
 /etc/bluetooth/main.conf
 /etc/bluetooth/network.conf
 /etc/bluetooth/input.conf
@@ -109,10 +117,28 @@ endef
 
 define Package/bluez-utils/install
        $(INSTALL_DIR) $(1)/usr/bin
-       $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
+       $(CP) $(PKG_INSTALL_DIR)/usr/bin/bccmd $(1)/usr/bin/
+       $(CP) $(PKG_INSTALL_DIR)/usr/bin/bluemoon $(1)/usr/bin/
+       $(CP) $(PKG_INSTALL_DIR)/usr/bin/btmon $(1)/usr/bin/
+       $(CP) $(PKG_INSTALL_DIR)/usr/bin/ciptool $(1)/usr/bin/
+       $(CP) $(PKG_INSTALL_DIR)/usr/bin/hciattach $(1)/usr/bin/
+       $(CP) $(PKG_INSTALL_DIR)/usr/bin/hciconfig $(1)/usr/bin/
+       $(CP) $(PKG_INSTALL_DIR)/usr/bin/hcidump $(1)/usr/bin/
+       $(CP) $(PKG_INSTALL_DIR)/usr/bin/hcitool $(1)/usr/bin/
+       $(CP) $(PKG_INSTALL_DIR)/usr/bin/hex2hcd $(1)/usr/bin/
+       $(CP) $(PKG_INSTALL_DIR)/usr/bin/l2ping $(1)/usr/bin/
+       $(CP) $(PKG_INSTALL_DIR)/usr/bin/l2test $(1)/usr/bin/
+       $(CP) $(PKG_INSTALL_DIR)/usr/bin/rctest $(1)/usr/bin/
+       $(CP) $(PKG_INSTALL_DIR)/usr/bin/rfcomm $(1)/usr/bin/
+       $(CP) $(PKG_INSTALL_DIR)/usr/bin/sdptool $(1)/usr/bin/
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/attrib/gatttool $(1)/usr/bin/
+endef
+
+define Package/bluez-daemon/install
+       $(INSTALL_DIR) $(1)/usr/bin
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/bluetooth/bluetoothd $(1)/usr/bin/
+       $(CP) $(PKG_INSTALL_DIR)/usr/bin/bluetoothctl $(1)/usr/bin/
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/bluetooth/obexd $(1)/usr/bin/
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/attrib/gatttool $(1)/usr/bin/
        $(INSTALL_DIR) $(1)/etc/config
        $(INSTALL_DATA) ./files/bluetooth.config $(1)/etc/config/bluetooth
        $(INSTALL_DIR) $(1)/etc/dbus-1/system.d/
@@ -129,3 +155,4 @@ endef
 $(eval $(call BuildPackage,bluez-examples))
 $(eval $(call BuildPackage,bluez-libs))
 $(eval $(call BuildPackage,bluez-utils))
+$(eval $(call BuildPackage,bluez-daemon))
index 6b19c9dccc952cf3202d934c3475e8562cc16b9c..0b29b5389dd10f590409bec894b79010fc251608 100644 (file)
@@ -9,12 +9,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=gammu
-PKG_VERSION:=1.34.0
-PKG_RELEASE:=3
+PKG_VERSION:=1.36.3
+PKG_RELEASE:=1
 
 PKG_SOURCE_URL:=http://dl.cihar.com/gammu/releases/
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
-PKG_MD5SUM:=5bc2508389d9b291ca0b8d4f210d0012
+PKG_MD5SUM:=d5a6914996ebedcd6cac6622f2e4018b
 PKG_MAINTAINER:=Vitaly Protsko <villy@sft.ru>
 PKG_LICENCE:=GPL-2.0
 
diff --git a/utils/hfsprogs/patches/0015-sysctl-only-on-glibc.patch b/utils/hfsprogs/patches/0015-sysctl-only-on-glibc.patch
new file mode 100644 (file)
index 0000000..b71290f
--- /dev/null
@@ -0,0 +1,91 @@
+--- a/newfs_hfs.tproj/makehfs.c
++++ b/newfs_hfs.tproj/makehfs.c
+@@ -37,7 +37,9 @@
+ #endif
+ #include <sys/errno.h>
+ #include <sys/stat.h>
++#ifdef __GLIBC__
+ #include <sys/sysctl.h>
++#endif
+ #if !LINUX
+ #include <sys/vmmeter.h>
+ #endif
+@@ -2039,6 +2041,7 @@ getencodinghint(unsigned char *name)
+         if (getvfsbyname("hfs", &vfc) < 0)
+               goto error;
++#ifdef __GLIBC__
+         mib[0] = CTL_VFS;
+         mib[1] = vfc.vfc_typenum;
+         mib[2] = HFS_ENCODINGHINT;
+@@ -2046,6 +2049,7 @@ getencodinghint(unsigned char *name)
+       if (sysctl(mib, 3, &hint, &buflen, name, strlen((char *)name) + 1) < 0)
+               goto error;
+       return (hint);
++#endif
+ error:
+       hint = GetDefaultEncoding();
+       return (0);
+@@ -2062,7 +2066,7 @@ void GenerateVolumeUUID(VolumeUUID *newV
+       clock_t uptime;
+       size_t datalen;
+       double sysloadavg[3];
+-#if !LINUX
++#if !LINUX && defined(__GLIBC__)
+       int sysdata;
+       int mib[2];
+       char sysctlstring[128];
+@@ -2080,7 +2084,7 @@ void GenerateVolumeUUID(VolumeUUID *newV
+               SHA1_Update(&context, &uptime, sizeof(uptime));
+               
+               /* The kernel's boot time: */
+-#if !LINUX
++#if !LINUX && defined(__GLIBC__)
+               mib[0] = CTL_KERN;
+               mib[1] = KERN_BOOTTIME;
+               datalen = sizeof(sysdata);
+@@ -2088,7 +2092,7 @@ void GenerateVolumeUUID(VolumeUUID *newV
+               SHA1_Update(&context, &sysdata, datalen);
+ #endif
+               /* The system's host id: */
+-#if !LINUX
++#if !LINUX && defined(__GLIBC__)
+               mib[0] = CTL_KERN;
+               mib[1] = KERN_HOSTID;
+               datalen = sizeof(sysdata);
+@@ -2096,7 +2100,7 @@ void GenerateVolumeUUID(VolumeUUID *newV
+               SHA1_Update(&context, &sysdata, datalen);
+ #endif
+               /* The system's host name: */
+-#if !LINUX
++#if !LINUX && defined(__GLIBC__)
+               mib[0] = CTL_KERN;
+               mib[1] = KERN_HOSTNAME;
+               datalen = sizeof(sysctlstring);
+@@ -2104,7 +2108,7 @@ void GenerateVolumeUUID(VolumeUUID *newV
+               SHA1_Update(&context, sysctlstring, datalen);
+ #endif
+               /* The running kernel's OS release string: */
+-#if !LINUX
++#if !LINUX && defined(__GLIBC__)
+               mib[0] = CTL_KERN;
+               mib[1] = KERN_OSRELEASE;
+               datalen = sizeof(sysctlstring);
+@@ -2112,7 +2116,7 @@ void GenerateVolumeUUID(VolumeUUID *newV
+               SHA1_Update(&context, sysctlstring, datalen);
+ #endif
+               /* The running kernel's version string: */
+-#if !LINUX
++#if !LINUX && defined(__GLIBC__)
+               mib[0] = CTL_KERN;
+               mib[1] = KERN_VERSION;
+               datalen = sizeof(sysctlstring);
+@@ -2127,7 +2131,7 @@ void GenerateVolumeUUID(VolumeUUID *newV
+ #endif
+               /* The system's VM statistics: */
+-#if !LINUX
++#if !LINUX && defined(__GLIBC__)
+               mib[0] = CTL_VM;
+               mib[1] = VM_METER;
+               datalen = sizeof(sysvmtotal);
index 3019d34d1e82ce878a3439c165c05a9120632fb5..3ca592cfb60cfdbeece35f6f633b9542b05a7162 100644 (file)
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=joe
-PKG_VERSION:=3.7
-PKG_RELEASE:=3
+PKG_VERSION:=4.0
+PKG_RELEASE:=4
 
 PKG_SOURCE_URL:=@SF/joe-editor
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
-PKG_MD5SUM:=66de1b073e869ba12abbfcde3885c577
+PKG_MD5SUM:=3c3b6d5089a29ddc746ee89bab59286e
 PKG_BUILD_DIR=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
 PKG_MAINTAINER:=Vitaly Protsko <villy@sft.ru>
 PKG_LICENCE:=GPL-1.0
@@ -48,7 +48,7 @@ endef
 
 define Package/joe/install
        $(INSTALL_DIR) $(1)/usr/bin
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/joe $(1)/usr/bin/
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/joe/joe $(1)/usr/bin/
        for i in jmacs jstar rjoe jpico; do \
          ln -sf joe $(1)/usr/bin/$$$$i; \
        done
index 24def75a1c6efc210e8b4841ffcf682c995dbb06..2c42beebd880987baee0b29037ed4588e65aef34 100644 (file)
@@ -619,3 +619,31 @@ type               ^@ TO 
 
 :querysr               Search & replace query window
 type           ^@ TO Ã¿
+
+:shell                 Input to shell windows
+:inherit main
+"\ 3"            ^C              Abort
+"\ 4"            ^D              Eof
+"      "       ^I              Tab
+"\b"            ^H              Backspace
+"\r"            ^M              Return
+"\7f"            ^?              Backspace
+
+:vtshell               Input to ANSI shell windows
+:inherit main
+"\e[A"          \e [ A
+"\e[A"          .ku
+"\e[B"          \e [ B
+"\e[B"          .kd
+"\e[C"          \e [ C
+"\e[C"          .kr
+"\e[D"          \e [ D
+"\e[D"          .kl
+"\ 1"            ^A              BOL for bash
+"\ 3"            ^C              Abort
+"\ 4"            ^D              Eof
+"\ 5"            ^E              EOL for bash
+"      "       ^I              Tab
+"\b"            ^H              Backspace
+"\r"            ^M              Return
+"\7f"            ^?              Backspace
diff --git a/utils/joe/patches/001-mathaway.patch b/utils/joe/patches/001-mathaway.patch
deleted file mode 100644 (file)
index 99fc930..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
---- a/umath.c
-+++ b/umath.c
-@@ -378,7 +378,6 @@ double m_cos(double n) { return cos(n); 
- double m_tan(double n) { return tan(n); }
- double m_exp(double n) { return exp(n); }
- double m_sqrt(double n) { return sqrt(n); }
--double m_cbrt(double n) { return cbrt(n); }
- double m_log(double n) { return log(n); }
- double m_log10(double n) { return log10(n); }
- double m_asin(double n) { return asin(n); }
-@@ -387,19 +386,10 @@ double m_atan(double n) { return atan(n)
- double m_sinh(double n) { return sinh(n); }
- double m_cosh(double n) { return cosh(n); }
- double m_tanh(double n) { return tanh(n); }
--double m_asinh(double n) { return asinh(n); }
--double m_acosh(double n) { return acosh(n); }
--double m_atanh(double n) { return atanh(n); }
- double m_int(double n) { return (int)(n); }
- double m_floor(double n) { return floor(n); }
- double m_ceil(double n) { return ceil(n); }
- double m_fabs(double n) { return fabs(n); }
--double m_erf(double n) { return erf(n); }
--double m_erfc(double n) { return erfc(n); }
--double m_j0(double n) { return j0(n); }
--double m_j1(double n) { return j1(n); }
--double m_y0(double n) { return y0(n); }
--double m_y1(double n) { return y1(n); }
- double calc(BW *bw, unsigned char *s)
- {
-@@ -414,7 +404,6 @@ double calc(BW *bw, unsigned char *s)
-               v = get(USTR "tan"); v->func = m_tan;
-               v = get(USTR "exp"); v->func = m_exp;
-               v = get(USTR "sqrt"); v->func = m_sqrt;
--              v = get(USTR "cbrt"); v->func = m_cbrt;
-               v = get(USTR "ln"); v->func = m_log;
-               v = get(USTR "log"); v->func = m_log10;
-               v = get(USTR "asin"); v->func = m_asin;
-@@ -425,19 +414,10 @@ double calc(BW *bw, unsigned char *s)
-               v = get(USTR "sinh"); v->func = m_sinh;
-               v = get(USTR "cosh"); v->func = m_cosh;
-               v = get(USTR "tanh"); v->func = m_tanh;
--              v = get(USTR "asinh"); v->func = m_asinh;
--              v = get(USTR "acosh"); v->func = m_acosh;
--              v = get(USTR "atanh"); v->func = m_atanh;
-               v = get(USTR "int"); v->func = m_int;
-               v = get(USTR "floor"); v->func = m_floor;
-               v = get(USTR "ceil"); v->func = m_ceil;
-               v = get(USTR "abs"); v->func = m_fabs;
--              v = get(USTR "erf"); v->func = m_erf;
--              v = get(USTR "erfc"); v->func = m_erfc;
--              v = get(USTR "j0"); v->func = m_j0;
--              v = get(USTR "j1"); v->func = m_j1;
--              v = get(USTR "y0"); v->func = m_y0;
--              v = get(USTR "y1"); v->func = m_y1;
-       }
-       v = get(USTR "top");
diff --git a/utils/lcd4linux/Config.in b/utils/lcd4linux/Config.in
new file mode 100644 (file)
index 0000000..a57f795
--- /dev/null
@@ -0,0 +1,489 @@
+if PACKAGE_lcd4linux-custom
+
+config LCD4LINUX_CUSTOM_NEEDS_libdbus
+       bool
+
+#config LCD4LINUX_CUSTOM_NEEDS_libftdi
+#      bool
+
+config LCD4LINUX_CUSTOM_NEEDS_libgd
+       bool
+
+config LCD4LINUX_CUSTOM_NEEDS_libiconv
+       bool
+
+config LCD4LINUX_CUSTOM_NEEDS_libjpeg
+       bool
+
+config LCD4LINUX_CUSTOM_NEEDS_libmpdclient
+       bool
+
+config LCD4LINUX_CUSTOM_NEEDS_libmysqlclient
+       bool
+
+config LCD4LINUX_CUSTOM_NEEDS_libncurses
+       bool
+
+config LCD4LINUX_CUSTOM_NEEDS_libnmeap
+       bool
+
+config LCD4LINUX_CUSTOM_NEEDS_libsqlite3
+       bool
+
+config LCD4LINUX_CUSTOM_NEEDS_libusb
+       bool
+
+#config LCD4LINUX_CUSTOM_NEEDS_libX11
+#      bool
+
+config LCD4LINUX_CUSTOM_NEEDS_ppp
+       bool
+
+config LCD4LINUX_CUSTOM_NEEDS_python
+       bool
+
+
+comment "Drivers ---"
+
+config LCD4LINUX_CUSTOM_DRIVER_ASTUSB
+       bool
+       prompt "ASTUSB"
+
+config LCD4LINUX_CUSTOM_DRIVER_BeckmannEgle
+       bool
+       prompt "BeckmannEgle"
+
+config LCD4LINUX_CUSTOM_DRIVER_BWCT
+       bool
+       prompt "BWCT"
+       select LCD4LINUX_CUSTOM_NEEDS_libusb
+
+config LCD4LINUX_CUSTOM_DRIVER_CrystalFontz
+       bool
+       prompt "CrystalFontz"
+
+config LCD4LINUX_CUSTOM_DRIVER_Curses
+       bool
+       prompt "Curses"
+       select LCD4LINUX_CUSTOM_NEEDS_libncurses
+
+config LCD4LINUX_CUSTOM_DRIVER_Cwlinux
+       bool
+       prompt "Cwlinux"
+
+config LCD4LINUX_CUSTOM_DRIVER_D4D
+       bool
+       prompt "D4D"
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+
+config LCD4LINUX_CUSTOM_DRIVER_dpf
+       bool
+       prompt "dpf"
+       select LCD4LINUX_CUSTOM_NEEDS_libdpf
+
+config LCD4LINUX_CUSTOM_DRIVER_EA232graphic
+       bool
+       prompt "EA232graphic"
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+
+config LCD4LINUX_CUSTOM_DRIVER_EFN
+       bool
+       prompt "EFN"
+
+config LCD4LINUX_CUSTOM_DRIVER_FutabaVFD
+       bool
+       prompt "FutabaVFD"
+
+config LCD4LINUX_CUSTOM_DRIVER_FW8888
+       bool
+       prompt "FW8888"
+
+config LCD4LINUX_CUSTOM_DRIVER_G15
+       bool
+       prompt "G15"
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+       select LCD4LINUX_CUSTOM_NEEDS_libusb
+
+config LCD4LINUX_CUSTOM_DRIVER_GLCD2USB
+       bool
+       prompt "GLCD2USB"
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+       select LCD4LINUX_CUSTOM_NEEDS_libusb
+
+config LCD4LINUX_CUSTOM_DRIVER_HD44780
+       bool
+       prompt "HD44780"
+       depends on BROKEN
+
+config LCD4LINUX_CUSTOM_DRIVER_HD44780-I2C
+       bool
+       prompt "HD44780-I2C"
+       depends on BROKEN
+
+config LCD4LINUX_CUSTOM_DRIVER_IRLCD
+       bool
+       prompt "IRLCD"
+       select LCD4LINUX_CUSTOM_NEEDS_libusb
+
+config LCD4LINUX_CUSTOM_DRIVER_LCD2USB
+       bool
+       prompt "LCD2USB"
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+       select LCD4LINUX_CUSTOM_NEEDS_libusb
+
+config LCD4LINUX_CUSTOM_DRIVER_LCDLinux
+       bool
+       prompt "LCDLinux"
+       depends on BROKEN
+
+config LCD4LINUX_CUSTOM_DRIVER_LCDTerm
+       bool
+       prompt "LCDTerm"
+
+config LCD4LINUX_CUSTOM_DRIVER_LEDMatrix
+       bool
+       prompt "LEDMatrix"
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+
+config LCD4LINUX_CUSTOM_DRIVER_LPH7508
+       bool
+       prompt "LPH7508"
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+
+config LCD4LINUX_CUSTOM_DRIVER_LUIse
+       bool
+       prompt "LUIse"
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+       #select LCD4LINUX_CUSTOM_NEEDS_libluise
+       depends on BROKEN
+
+config LCD4LINUX_CUSTOM_DRIVER_LW_ABP
+       bool
+       prompt "LW_ABP"
+
+config LCD4LINUX_CUSTOM_DRIVER_M50530
+       bool
+       prompt "M50530"
+
+config LCD4LINUX_CUSTOM_DRIVER_MatrixOrbital
+       bool
+       prompt "MatrixOrbital"
+
+config LCD4LINUX_CUSTOM_DRIVER_MatrixOrbitalGX
+       bool
+       prompt "MatrixOrbitalGX"
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+       select LCD4LINUX_CUSTOM_NEEDS_libusb
+
+config LCD4LINUX_CUSTOM_DRIVER_mdm166a
+       bool
+       prompt "mdm166a"
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+
+config LCD4LINUX_CUSTOM_DRIVER_MilfordInstruments
+       bool
+       prompt "MilfordInstruments"
+
+config LCD4LINUX_CUSTOM_DRIVER_Newhaven
+       bool
+       prompt "Newhaven"
+
+config LCD4LINUX_CUSTOM_DRIVER_Noritake
+       bool
+       prompt "Noritake"
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+
+config LCD4LINUX_CUSTOM_DRIVER_NULL
+       bool
+       prompt "NULL"
+       default y
+
+config LCD4LINUX_CUSTOM_DRIVER_Pertelian
+       bool
+       prompt "Pertelian"
+
+config LCD4LINUX_CUSTOM_DRIVER_PHAnderson
+       bool
+       prompt "PHAnderson"
+
+config LCD4LINUX_CUSTOM_DRIVER_PICGraphic
+       bool
+       prompt "PICGraphic"
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+
+config LCD4LINUX_CUSTOM_DRIVER_picoLCD
+       bool
+       prompt "picoLCD"
+       select LCD4LINUX_CUSTOM_NEEDS_libusb
+
+config LCD4LINUX_CUSTOM_DRIVER_picoLCDGraphic
+       bool
+       prompt "picoLCDGraphic"
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+       select LCD4LINUX_CUSTOM_NEEDS_libusb
+
+config LCD4LINUX_CUSTOM_DRIVER_PNG
+       bool
+       prompt "PNG"
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+
+config LCD4LINUX_CUSTOM_DRIVER_PPM
+       bool
+       prompt "PPM"
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+
+config LCD4LINUX_CUSTOM_DRIVER_RouterBoard
+       bool
+       prompt "RouterBoard"
+       depends on TARGET_rb532
+
+config LCD4LINUX_CUSTOM_DRIVER_SamsungSPF
+       bool
+       prompt "SamsungSPF"
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+       select LCD4LINUX_CUSTOM_NEEDS_libjpeg
+
+config LCD4LINUX_CUSTOM_DRIVER_serdisplib
+       bool
+       prompt "serdisplib"
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+       select LCD4LINUX_CUSTOM_NEEDS_serdisplib
+
+config LCD4LINUX_CUSTOM_DRIVER_ShuttleVFD
+       bool
+       prompt "ShuttleVFD"
+       select LCD4LINUX_CUSTOM_NEEDS_libusb
+
+config LCD4LINUX_CUSTOM_DRIVER_SimpleLCD
+       bool
+       prompt "SimpleLCD"
+
+config LCD4LINUX_CUSTOM_DRIVER_st2205
+       bool
+       prompt "st2205"
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+       select LCD4LINUX_CUSTOM_NEEDS_st2205tool
+
+config LCD4LINUX_CUSTOM_DRIVER_T6963
+       bool
+       prompt "T6963"
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+
+config LCD4LINUX_CUSTOM_DRIVER_TeakLCM
+       bool
+       prompt "TeakLCM"
+
+config LCD4LINUX_CUSTOM_DRIVER_TEW673GRU
+       bool
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+       depends on TARGET_ar71xx
+       default TARGET_ar71xx
+
+config LCD4LINUX_CUSTOM_DRIVER_Trefon
+       bool
+       prompt "Trefon"
+       select LCD4LINUX_CUSTOM_NEEDS_libusb
+
+#config LCD4LINUX_CUSTOM_DRIVER_ULA200
+#      bool
+#      prompt "ULA200"
+#      select LCD4LINUX_CUSTOM_NEEDS_libftdi
+#      select LCD4LINUX_CUSTOM_NEEDS_libusb
+
+config LCD4LINUX_CUSTOM_DRIVER_USBHUB
+       bool
+       prompt "USBHUB"
+       select LCD4LINUX_CUSTOM_NEEDS_libusb
+
+config LCD4LINUX_CUSTOM_DRIVER_USBLCD
+       bool
+       prompt "USBLCD"
+       select LCD4LINUX_CUSTOM_NEEDS_libusb
+
+config LCD4LINUX_CUSTOM_DRIVER_VNC
+       bool
+       prompt "VNC"
+       select LCD4LINUX_CUSTOM_NEEDS_libgd
+       select LCD4LINUX_CUSTOM_NEEDS_libvncserver
+
+config LCD4LINUX_CUSTOM_DRIVER_WincorNixdorf
+       bool
+       prompt "WincorNixdorf"
+
+#config LCD4LINUX_CUSTOM_DRIVER_X11
+#      bool
+#      prompt "X11"
+#      select LCD4LINUX_CUSTOM_NEEDS_libgd
+#      select LCD4LINUX_CUSTOM_NEEDS_libX11
+
+
+comment "Plugins ---"
+
+config LCD4LINUX_CUSTOM_PLUGIN_apm
+       bool
+       prompt "apm"
+
+config LCD4LINUX_CUSTOM_PLUGIN_asterisk
+       bool
+       prompt "asterisk"
+
+config LCD4LINUX_CUSTOM_PLUGIN_button_exec
+       bool
+       prompt "button_exec"
+
+config LCD4LINUX_CUSTOM_PLUGIN_cpuinfo
+       bool
+       prompt "cpuinfo"
+       default y
+
+config LCD4LINUX_CUSTOM_PLUGIN_dbus
+       bool
+       prompt "dbus"
+       select LCD4LINUX_CUSTOM_NEEDS_libdbus
+
+config LCD4LINUX_CUSTOM_PLUGIN_diskstats
+       bool
+       prompt "diskstats"
+
+config LCD4LINUX_CUSTOM_PLUGIN_dvb
+       bool
+       prompt "dvb"
+
+config LCD4LINUX_CUSTOM_PLUGIN_event
+       bool
+       prompt "event"
+
+config LCD4LINUX_CUSTOM_PLUGIN_exec
+       bool
+       prompt "exec"
+
+config LCD4LINUX_CUSTOM_PLUGIN_fifo
+       bool
+       prompt "fifo"
+
+config LCD4LINUX_CUSTOM_PLUGIN_file
+       bool
+       prompt "file"
+
+config LCD4LINUX_CUSTOM_PLUGIN_gps
+       bool
+       prompt "gps"
+       select LCD4LINUX_CUSTOM_NEEDS_libnmeap
+
+config LCD4LINUX_CUSTOM_PLUGIN_hddtemp
+       bool
+       prompt "hddtemp"
+
+config LCD4LINUX_CUSTOM_PLUGIN_huawei
+       bool
+       prompt "huawei"
+
+config LCD4LINUX_CUSTOM_PLUGIN_i2c_sensors
+       bool
+       prompt "i2c_sensors"
+
+config LCD4LINUX_CUSTOM_PLUGIN_iconv
+       bool
+       prompt "iconv"
+       select LCD4LINUX_CUSTOM_NEEDS_libiconv
+
+config LCD4LINUX_CUSTOM_PLUGIN_imon
+       bool
+       prompt "imon"
+
+config LCD4LINUX_CUSTOM_PLUGIN_isdn
+       bool
+       prompt "isdn"
+
+config LCD4LINUX_CUSTOM_PLUGIN_kvv
+       bool
+       prompt "kvv"
+
+config LCD4LINUX_CUSTOM_PLUGIN_loadavg
+       bool
+       prompt "loadavg"
+       default y
+
+config LCD4LINUX_CUSTOM_PLUGIN_meminfo
+       bool
+       prompt "meminfo"
+       default y
+
+config LCD4LINUX_CUSTOM_PLUGIN_mpd
+       bool
+       prompt "mpd"
+       select LCD4LINUX_CUSTOM_NEEDS_libmpdclient
+
+config LCD4LINUX_CUSTOM_PLUGIN_mpris_dbus
+       bool
+       prompt "mpris_dbus"
+       select LCD4LINUX_CUSTOM_NEEDS_libdbus
+
+config LCD4LINUX_CUSTOM_PLUGIN_mysql
+       bool
+       prompt "mysql"
+       select LCD4LINUX_CUSTOM_NEEDS_libmysqlclient
+
+config LCD4LINUX_CUSTOM_PLUGIN_netdev
+       bool
+       prompt "netdev"
+
+config LCD4LINUX_CUSTOM_PLUGIN_netinfo
+       bool
+       prompt "netinfo"
+
+config LCD4LINUX_CUSTOM_PLUGIN_pop3
+       bool
+       prompt "pop3"
+
+config LCD4LINUX_CUSTOM_PLUGIN_ppp
+       bool
+       prompt "ppp"
+       select LCD4LINUX_CUSTOM_NEEDS_ppp
+
+config LCD4LINUX_CUSTOM_PLUGIN_proc_stat
+       bool
+       prompt "proc_stat"
+       default y
+
+#config LCD4LINUX_CUSTOM_PLUGIN_python
+#      bool
+#      prompt "python"
+#      select LCD4LINUX_CUSTOM_NEEDS_python
+
+config LCD4LINUX_CUSTOM_PLUGIN_qnaplog
+       bool
+       prompt "qnaplog"
+       select LCD4LINUX_CUSTOM_NEEDS_libsqlite3
+
+config LCD4LINUX_CUSTOM_PLUGIN_seti
+       bool
+       prompt "seti"
+
+config LCD4LINUX_CUSTOM_PLUGIN_statfs
+       bool
+       prompt "statfs"
+
+config LCD4LINUX_CUSTOM_PLUGIN_uname
+       bool
+       prompt "uname"
+
+config LCD4LINUX_CUSTOM_PLUGIN_uptime
+       bool
+       prompt "uptime"
+       default y
+
+config LCD4LINUX_CUSTOM_PLUGIN_w1retap
+       bool
+       prompt "w1retap"
+
+config LCD4LINUX_CUSTOM_PLUGIN_wireless
+       bool
+       prompt "wireless"
+       depends on BROKEN
+
+config LCD4LINUX_CUSTOM_PLUGIN_xmms
+       bool
+       prompt "xmms"
+
+endif
diff --git a/utils/lcd4linux/Makefile b/utils/lcd4linux/Makefile
new file mode 100644 (file)
index 0000000..59fe5c9
--- /dev/null
@@ -0,0 +1,309 @@
+#
+# Copyright (C) 2007-2015 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:=lcd4linux
+PKG_REV:=1203
+PKG_VERSION:=r$(PKG_REV)
+PKG_RELEASE:=1
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
+PKG_SOURCE_URL:=https://ssl.bulix.org/svn/lcd4linux/trunk/
+PKG_SOURCE_SUBDIR:=lcd4linux-$(PKG_VERSION)
+PKG_SOURCE_VERSION:=$(PKG_REV)
+PKG_SOURCE_PROTO:=svn
+
+LCD4LINUX_DRIVERS:= \
+       ASTUSB \
+       BeckmannEgle \
+       BWCT \
+       CrystalFontz \
+       Curses \
+       Cwlinux \
+       D4D \
+       $(if $(CONFIG_BROKEN),DPF) \
+       EA232graphic \
+       EFN \
+       FutabaVFD \
+       FW8888 \
+       G15 \
+       GLCD2USB \
+       IRLCD \
+       $(if $(CONFIG_BROKEN),HD44780) \
+       $(if $(CONFIG_BROKEN),HD44780-I2C) \
+       LCD2USB \
+       $(if $(CONFIG_BROKEN),LCDLinux) \
+       LCDTerm \
+       LEDMatrix \
+       LPH7508 \
+       $(if $(CONFIG_BROKEN),LUIse) \
+       LW_ABP \
+       M50530 \
+       MatrixOrbital \
+       MatrixOrbitalGX \
+       MilfordInstruments \
+       Newhaven \
+       Noritake \
+       NULL \
+       Pertelian \
+       PHAnderson \
+       PICGraphic \
+       picoLCD \
+       picoLCDGraphic \
+       PNG \
+       PPM \
+       $(if $(CONFIG_TARGET_rb532),RouterBoard) \
+       $(if $(CONFIG_BROKEN),SamsungSPF) \
+       ShuttleVFD \
+       SimpleLCD \
+       st2205 \
+       T6963 \
+       TeakLCM \
+       $(if $(CONFIG_TARGET_ar71xx),TEW673GRU) \
+       Trefon \
+       USBHUB \
+       USBLCD \
+       VNC \
+       WincorNixdorf \
+#      ULA200 \
+#      X11 \
+
+LCD4LINUX_PLUGINS:= \
+       apm \
+       asterisk \
+       button_exec \
+       cpuinfo \
+       dbus \
+       diskstats \
+       dvb \
+       event \
+       exec \
+       fifo \
+       file \
+       gps \
+       hddtemp \
+       huawei \
+       i2c_sensors \
+       iconv \
+       imon \
+       isdn \
+       kvv \
+       loadavg \
+       netdev \
+       netinfo \
+       meminfo \
+       mpd \
+       mpris_dbus \
+       mysql \
+       netdev \
+       pop3 \
+       ppp \
+       proc_stat \
+       qnaplog \
+       seti \
+       statfs \
+       uname \
+       uptime \
+       w1retap \
+       $(if $(CONFIG_BROKEN),wireless) \
+       xmms \
+#      python \
+
+PKG_FIXUP:=autoreconf
+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 \
+#      python \
+
+PKG_CONFIG_DEPENDS:= \
+       $(patsubst %,CONFIG_LCD4LINUX_CUSTOM_DRIVER_%,$(LCD4LINUX_DRIVERS)) \
+       $(patsubst %,CONFIG_LCD4LINUX_CUSTOM_PLUGIN_%,$(LCD4LINUX_PLUGINS)) \
+
+include $(INCLUDE_DIR)/package.mk
+include $(INCLUDE_DIR)/nls.mk
+
+define Package/lcd4linux/Default
+  SECTION:=utils
+  CATEGORY:=Utilities
+  PKG_MAINTAINER:=Jonathan McCrohan <jmccrohan@gmail.com>
+  TITLE:=LCD display utility
+  URL:=http://lcd4linux.bulix.org/
+endef
+
+define Package/lcd4linux/Default/description
+ LCD4Linux is a small program that grabs information from the kernel and
+ some subsystems and displays it on an external liquid crystal display.
+endef
+
+
+define Package/lcd4linux-custom
+$(call Package/lcd4linux/Default)
+  DEPENDS:= \
+       +LCD4LINUX_CUSTOM_NEEDS_libdbus:libdbus \
+       +LCD4LINUX_CUSTOM_NEEDS_libgd:libgd \
+       $(if $(ICONV_FULL),+LCD4LINUX_CUSTOM_NEEDS_libiconv:libiconv-full) \
+       +LCD4LINUX_CUSTOM_NEEDS_libjpeg:libjpeg \
+       +LCD4LINUX_CUSTOM_NEEDS_libmpdclient:libmpdclient \
+       +LCD4LINUX_CUSTOM_NEEDS_libmysqlclient:libmysqlclient \
+       +LCD4LINUX_CUSTOM_NEEDS_libncurses:libncurses \
+       +LCD4LINUX_CUSTOM_NEEDS_libsqlite3:libsqlite3 \
+       +LCD4LINUX_CUSTOM_NEEDS_libusb:libusb-compat \
+#      +LCD4LINUX_CUSTOM_NEEDS_libftdi:libftdi \
+#      +LCD4LINUX_CUSTOM_NEEDS_libX11:libX11 \
+#      +LCD4LINUX_CUSTOM_NEEDS_python:python
+  MENU:=1
+  PROVIDES:=lcd4linux
+  VARIANT=custom
+endef
+
+define Package/lcd4linux-custom/config
+       source "$(SOURCE)/Config.in"
+endef
+
+define Package/lcd4linux-custom/description
+$(call Package/lcd4linux/Default/description)
+ .
+ This package contains a customized version of LCD4Linux.
+endef
+
+
+define Package/lcd4linux-full
+$(call Package/lcd4linux/Default)
+  DEPENDS:= @DEVEL \
+       +libdbus \
+       +libgd \
+       $(if $(ICONV_FULL),+libiconv-full) \
+       +libmpdclient \
+       +libmysqlclient \
+       +libncurses \
+       +libsqlite3 \
+       +libusb-compat \
+#      +libftdi \
+#      +libX11 \
+#      +python
+  PROVIDES:=lcd4linux
+  VARIANT=full
+endef
+
+define Package/lcd4linux-full/description
+$(call Package/lcd4linux/Default/description)
+ .
+ This package contains a version of LCD4Linux built with all supported
+ drivers and plugins.
+endef
+
+
+CONFIGURE_ARGS+= \
+       --disable-rpath \
+
+EXTRA_LDFLAGS+= -Wl,-rpath-link,$(STAGING_DIR)/usr/lib
+
+ifeq ($(BUILD_VARIANT),custom)
+
+  LCD4LINUX_CUSTOM_DRIVERS:= $(strip $(foreach c, $(LCD4LINUX_DRIVERS), \
+    $(if $(CONFIG_LCD4LINUX_CUSTOM_DRIVER_$(c)),$(c),) \
+ ))
+  ifeq ($(LCD4LINUX_CUSTOM_DRIVERS),)
+    LCD4LINUX_CUSTOM_DRIVERS:=Sample
+  endif
+
+  LCD4LINUX_CUSTOM_PLUGINS:= $(strip $(foreach c, $(LCD4LINUX_PLUGINS), \
+    $(if $(CONFIG_LCD4LINUX_CUSTOM_PLUGIN_$(c)),$(c)) \
+  ))
+  ifeq ($(LCD4LINUX_CUSTOM_PLUGINS),)
+    LCD4LINUX_CUSTOM_PLUGINS:=sample
+  endif
+
+  CONFIGURE_ARGS+= \
+       --with-drivers="$(LCD4LINUX_CUSTOM_DRIVERS)" \
+       --with-plugins="$(LCD4LINUX_CUSTOM_PLUGINS)" \
+
+  ifneq ($(CONFIG_LCD4LINUX_CUSTOM_NEEDS_libiconv),)
+    CONFIGURE_ARGS+= --with-libiconv-prefix="$(ICONV_PREFIX)"
+  else
+    CONFIGURE_ARGS+= --without-libiconv-prefix
+  endif
+
+  ifneq ($(CONFIG_LCD4LINUX_CUSTOM_NEEDS_libmysqlclient),)
+    EXTRA_LDFLAGS+= -L$(STAGING_DIR)/usr/lib/mysql
+  endif
+
+#  ifneq ($(CONFIG_LCD4LINUX_CUSTOM_NEEDS_python),)
+#    CONFIGURE_ARGS+= --with-python
+#  else
+    CONFIGURE_ARGS+= --without-python
+#  endif
+
+#  ifneq ($(CONFIG_LCD4LINUX_CUSTOM_NEEDS_libX11),)
+#    CONFIGURE_ARGS+= --with-x
+#  else
+    CONFIGURE_ARGS+= --without-x
+#  endif
+
+endif
+
+ifeq ($(BUILD_VARIANT),full)
+
+  LCD4LINUX_FULL_DRIVERS:= $(strip $(foreach c, $(LCD4LINUX_DRIVERS), \
+    $(c) \
+  ))
+
+  LCD4LINUX_FULL_PLUGINS:= $(strip $(foreach c, $(LCD4LINUX_PLUGINS), \
+    $(c) \
+  ))
+
+  CONFIGURE_ARGS+= \
+       --with-drivers="$(LCD4LINUX_FULL_DRIVERS)" \
+       --with-plugins="$(LCD4LINUX_FULL_PLUGINS)" \
+       --with-libiconv-prefix="$(ICONV_PREFIX)" \
+       --without-python \
+       --without-x \
+
+  EXTRA_LDFLAGS+= -L$(STAGING_DIR)/usr/lib/mysql
+
+endif
+
+
+define Package/lcd4linux/conffiles
+/etc/lcd4linux.conf
+endef
+
+define Package/lcd4linux/install
+       $(INSTALL_DIR) $(1)/usr/bin
+       $(CP) $(PKG_INSTALL_DIR)/usr/bin/lcd4linux $(1)/usr/bin/
+       $(INSTALL_DIR) $(1)/etc
+       $(INSTALL_CONF) $(PKG_BUILD_DIR)/lcd4linux.conf.sample $(1)/etc/lcd4linux.conf
+       $(INSTALL_DIR) $(1)/etc/init.d
+       $(INSTALL_BIN) ./files/lcd4linux.init $(1)/etc/init.d/lcd4linux
+       $(SED) "s|^\(Display 'GLCD2USB'\)|#\1|g" \
+           -e "s|^\(Layout 'TestLayer'\)|#\1|g" \
+           -e "s|^#\(Display 'Image'\)|\1|g" \
+           -e "s|^#\(Layout 'Default'\)|\1|g" \
+            $(1)/etc/lcd4linux.conf
+endef
+
+Package/lcd4linux-custom/conffiles = $(Package/lcd4linux/conffiles)
+Package/lcd4linux-custom/install = $(Package/lcd4linux/install)
+
+Package/lcd4linux-full/conffiles = $(Package/lcd4linux/conffiles)
+Package/lcd4linux-full/install = $(Package/lcd4linux/install)
+
+$(eval $(call BuildPackage,lcd4linux-custom))
+$(eval $(call BuildPackage,lcd4linux-full))
diff --git a/utils/lcd4linux/files/lcd4linux.init b/utils/lcd4linux/files/lcd4linux.init
new file mode 100644 (file)
index 0000000..25033f3
--- /dev/null
@@ -0,0 +1,15 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2007-2015 OpenWrt.org
+
+START=98
+
+SERVICE_USE_PID=1
+
+start() {
+       service_start /usr/bin/lcd4linux -o /tmp/lcd4linux.png -q
+}
+
+stop() {
+       service_stop /usr/bin/lcd4linux
+}
+
diff --git a/utils/lcd4linux/patches/100-drv_RouterBoard.patch b/utils/lcd4linux/patches/100-drv_RouterBoard.patch
new file mode 100644 (file)
index 0000000..9780f5a
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/drv_RouterBoard.c
++++ b/drv_RouterBoard.c
+@@ -106,7 +106,7 @@
+ #include <string.h>
+ #include <errno.h>
+ #include <unistd.h>
+-#include <sys/io.h>
++#include <asm/io.h>
+ #include "debug.h"
+ #include "cfg.h"
diff --git a/utils/lcd4linux/patches/110-uclibc-logarithm-fix.patch b/utils/lcd4linux/patches/110-uclibc-logarithm-fix.patch
new file mode 100644 (file)
index 0000000..8f6d861
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/plugin_netinfo.c
++++ b/plugin_netinfo.c
+@@ -264,7 +264,7 @@ static void my_netmask_short(RESULT * re
+     sin = get_netmask(arg1);
+     if (NULL != sin) {
+       logval = (long double) (get_netmask(arg1)->sin_addr.s_addr);
+-      netlen = (int) rint(log2l(logval) / log2l(2.0));
++      netlen = (int) rint(log2f(logval) / log2f(2.0));
+       qprintf(value, sizeof(value), "/%d", netlen);
+     } else {
+       qprintf(value, sizeof(value), "/?");
diff --git a/utils/lcd4linux/patches/120-remove-as-needed-linker-option.patch b/utils/lcd4linux/patches/120-remove-as-needed-linker-option.patch
new file mode 100644 (file)
index 0000000..b5e56fe
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -18,7 +18,7 @@ ACLOCAL_AMFLAGS=-I m4
+ # use this for lots of warnings
+ #AM_CFLAGS = -D_GNU_SOURCE -std=c99 -m64 -Wall -W -pedantic -Wno-variadic-macros -fno-strict-aliasing
+-lcd4linux_LDFLAGS ="-Wl,--as-needed"
++lcd4linux_LDFLAGS = 
+ lcd4linux_LDADD   = @DRIVERS@ @PLUGINS@ @DRVLIBS@ @PLUGINLIBS@
+ lcd4linux_DEPENDENCIES = @DRIVERS@ @PLUGINS@
diff --git a/utils/lcd4linux/patches/140-no_repnop_T6963.patch b/utils/lcd4linux/patches/140-no_repnop_T6963.patch
new file mode 100644 (file)
index 0000000..85be2c3
--- /dev/null
@@ -0,0 +1,22 @@
+--- a/drv_T6963.c
++++ b/drv_T6963.c
+@@ -114,7 +114,9 @@ static void drv_T6_status1(void)
+     /* wait for STA0=1 and STA1=1 */
+     n = 0;
+     do {
++#if 0
+       rep_nop();
++#endif
+       if (++n > 1000) {
+           debug("hang in status1");
+           bug = 1;
+@@ -150,7 +152,9 @@ static void drv_T6_status2(void)
+     /* wait for STA3=1 */
+     n = 0;
+     do {
++#if 0
+       rep_nop();
++#endif
+       if (++n > 1000) {
+           debug("hang in status2");
+           bug = 1;
diff --git a/utils/lcd4linux/patches/150-addlibmpdclient.patch b/utils/lcd4linux/patches/150-addlibmpdclient.patch
new file mode 100644 (file)
index 0000000..0e51f67
--- /dev/null
@@ -0,0 +1,2624 @@
+--- /dev/null
++++ b/libmpdclient.c
+@@ -0,0 +1,1957 @@
++/* libmpdclient
++   (c)2003-2006 by Warren Dukes (warren.dukes@gmail.com)
++   This project's homepage is: http://www.musicpd.org
++
++   Redistribution and use in source and binary forms, with or without
++   modification, are permitted provided that the following conditions
++   are met:
++
++   - Redistributions of source code must retain the above copyright
++   notice, this list of conditions and the following disclaimer.
++
++   - Redistributions in binary form must reproduce the above copyright
++   notice, this list of conditions and the following disclaimer in the
++   documentation and/or other materials provided with the distribution.
++
++   - Neither the name of the Music Player Daemon nor the names of its
++   contributors may be used to endorse or promote products derived from
++   this software without specific prior written permission.
++
++   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
++   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++*/
++
++#include "libmpdclient.h"
++
++#include <errno.h>
++#include <ctype.h>
++#include <sys/types.h>
++#include <stdio.h>
++#include <sys/param.h>
++#include <string.h>
++#include <unistd.h>
++#include <stdlib.h>
++#include <fcntl.h>
++#include <limits.h>
++
++#ifdef WIN32
++#  include <ws2tcpip.h>
++#  include <winsock.h>
++#else
++#  include <netinet/in.h>
++#  include <arpa/inet.h>
++#  include <sys/socket.h>
++#  include <netdb.h>
++#endif
++
++/* (bits+1)/3 (plus the sign character) */
++#define INTLEN      ((sizeof(int)       * CHAR_BIT + 1) / 3 + 1)
++#define LONGLONGLEN ((sizeof(long long) * CHAR_BIT + 1) / 3 + 1)
++
++#define COMMAND_LIST    1
++#define COMMAND_LIST_OK 2
++
++#ifndef MPD_NO_GAI
++#  ifdef AI_ADDRCONFIG
++#    define MPD_HAVE_GAI
++#  endif
++#endif
++
++#ifndef MSG_DONTWAIT
++#  define MSG_DONTWAIT 0
++#endif
++
++#ifdef WIN32
++#  define SELECT_ERRNO_IGNORE   (errno == WSAEINTR || errno == WSAEINPROGRESS)
++#  define SENDRECV_ERRNO_IGNORE SELECT_ERRNO_IGNORE
++#else
++#  define SELECT_ERRNO_IGNORE   (errno == EINTR)
++#  define SENDRECV_ERRNO_IGNORE (errno == EINTR || errno == EAGAIN)
++#  define winsock_dll_error(c)  0
++#  define closesocket(s)        close(s)
++#  define WSACleanup()          do { /* nothing */ } while (0)
++#endif
++
++#ifdef WIN32
++static int winsock_dll_error(mpd_Connection * connection)
++{
++    WSADATA wsaData;
++    if ((WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0 || LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
++      strcpy(connection->errorStr, "Could not find usable WinSock DLL.");
++      connection->error = MPD_ERROR_SYSTEM;
++      return 1;
++    }
++    return 0;
++}
++
++static int do_connect_fail(mpd_Connection * connection, const struct sockaddr *serv_addr, int addrlen)
++{
++    int iMode = 1;            /* 0 = blocking, else non-blocking */
++    ioctlsocket(connection->sock, FIONBIO, (u_long FAR *) & iMode);
++    return (connect(connection->sock, serv_addr, addrlen) == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK);
++}
++#else                         /* !WIN32 (sane operating systems) */
++static int do_connect_fail(mpd_Connection * connection, const struct sockaddr *serv_addr, int addrlen)
++{
++    int flags = fcntl(connection->sock, F_GETFL, 0);
++    fcntl(connection->sock, F_SETFL, flags | O_NONBLOCK);
++    return (connect(connection->sock, serv_addr, addrlen) < 0 && errno != EINPROGRESS);
++}
++#endif                                /* !WIN32 */
++
++#ifdef MPD_HAVE_GAI
++static int mpd_connect(mpd_Connection * connection, const char *host, int port, float timeout)
++{
++    int error;
++    char service[INTLEN + 1];
++    struct addrinfo hints;
++    struct addrinfo *res = NULL;
++    struct addrinfo *addrinfo = NULL;
++
++      /**
++       * Setup hints
++       */
++    hints.ai_flags = AI_ADDRCONFIG;
++    hints.ai_family = PF_UNSPEC;
++    hints.ai_socktype = SOCK_STREAM;
++    hints.ai_protocol = IPPROTO_TCP;
++    hints.ai_addrlen = 0;
++    hints.ai_addr = NULL;
++    hints.ai_canonname = NULL;
++    hints.ai_next = NULL;
++
++    snprintf(service, sizeof(service), "%i", port);
++
++    error = getaddrinfo(host, service, &hints, &addrinfo);
++
++    if (error) {
++      snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "host \"%s\" not found: %s", host, gai_strerror(error));
++      connection->error = MPD_ERROR_UNKHOST;
++      return -1;
++    }
++
++    for (res = addrinfo; res; res = res->ai_next) {
++      /* create socket */
++      connection->sock = socket(res->ai_family, SOCK_STREAM, res->ai_protocol);
++      if (connection->sock < 0) {
++          snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "problems creating socket: %s", strerror(errno));
++          connection->error = MPD_ERROR_SYSTEM;
++          freeaddrinfo(addrinfo);
++          return -1;
++      }
++
++      mpd_setConnectionTimeout(connection, timeout);
++
++      /* connect stuff */
++      if (do_connect_fail(connection, res->ai_addr, res->ai_addrlen)) {
++          /* try the next address family */
++          closesocket(connection->sock);
++          connection->sock = -1;
++          continue;
++      }
++    }
++
++    freeaddrinfo(addrinfo);
++
++    if (connection->sock < 0) {
++      snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH,
++               "problems connecting to \"%s\" on port %i: %s", host, port, strerror(errno));
++      connection->error = MPD_ERROR_CONNPORT;
++
++      return -1;
++    }
++
++    return 0;
++}
++#else                         /* !MPD_HAVE_GAI */
++static int mpd_connect(mpd_Connection * connection, const char *host, int port, float timeout)
++{
++    struct hostent *he;
++    struct sockaddr *dest;
++    int destlen;
++    struct sockaddr_in sin;
++
++    if (!(he = gethostbyname(host))) {
++      snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "host \"%s\" not found", host);
++      connection->error = MPD_ERROR_UNKHOST;
++      return -1;
++    }
++
++    memset(&sin, 0, sizeof(struct sockaddr_in));
++    /*dest.sin_family = he->h_addrtype; */
++    sin.sin_family = AF_INET;
++    sin.sin_port = htons(port);
++
++    switch (he->h_addrtype) {
++    case AF_INET:
++      memcpy((char *) &sin.sin_addr.s_addr, (char *) he->h_addr, he->h_length);
++      dest = (struct sockaddr *) &sin;
++      destlen = sizeof(struct sockaddr_in);
++      break;
++    default:
++      strcpy(connection->errorStr, "address type is not IPv4");
++      connection->error = MPD_ERROR_SYSTEM;
++      return -1;
++      break;
++    }
++
++    if ((connection->sock = socket(dest->sa_family, SOCK_STREAM, 0)) < 0) {
++      strcpy(connection->errorStr, "problems creating socket");
++      connection->error = MPD_ERROR_SYSTEM;
++      return -1;
++    }
++
++    mpd_setConnectionTimeout(connection, timeout);
++
++    /* connect stuff */
++    if (do_connect_fail(connection, dest, destlen)) {
++      snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH,
++               "problems connecting to \"%s\" on port" " %i", host, port);
++      connection->error = MPD_ERROR_CONNPORT;
++      return -1;
++    }
++
++    return 0;
++}
++#endif                                /* !MPD_HAVE_GAI */
++
++char *mpdTagItemKeys[MPD_TAG_NUM_OF_ITEM_TYPES] = {
++    "Artist",
++    "Album",
++    "Title",
++    "Track",
++    "Name",
++    "Genre",
++    "Date",
++    "Composer",
++    "Performer",
++    "Comment",
++    "Disc",
++    "Filename",
++    "Any"
++};
++
++static char *mpd_sanitizeArg(const char *arg)
++{
++    size_t i;
++    char *ret;
++    register const char *c;
++    register char *rc;
++
++    /* instead of counting in that loop above, just
++     * use a bit more memory and half running time
++     */
++    ret = malloc(strlen(arg) * 2 + 1);
++
++    c = arg;
++    rc = ret;
++    for (i = strlen(arg) + 1; i != 0; --i) {
++      if (*c == '"' || *c == '\\')
++          *rc++ = '\\';
++      *(rc++) = *(c++);
++    }
++
++    return ret;
++}
++
++static mpd_ReturnElement *mpd_newReturnElement(const char *name, const char *value)
++{
++    mpd_ReturnElement *ret = malloc(sizeof(mpd_ReturnElement));
++
++    ret->name = strdup(name);
++    ret->value = strdup(value);
++
++    return ret;
++}
++
++static void mpd_freeReturnElement(mpd_ReturnElement * re)
++{
++    free(re->name);
++    free(re->value);
++    free(re);
++}
++
++void mpd_setConnectionTimeout(mpd_Connection * connection, float timeout)
++{
++    connection->timeout.tv_sec = (int) timeout;
++    connection->timeout.tv_usec = (int) (timeout * 1e6 - connection->timeout.tv_sec * 1000000 + 0.5);
++}
++
++static int mpd_parseWelcome(mpd_Connection * connection, const char *host, int port, char *rt, char *output)
++{
++    char *tmp;
++    char *test;
++    int i;
++
++    if (strncmp(output, MPD_WELCOME_MESSAGE, strlen(MPD_WELCOME_MESSAGE))) {
++      snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH,
++               "mpd not running on port %i on host \"%s\"", port, host);
++      connection->error = MPD_ERROR_NOTMPD;
++      return 1;
++    }
++
++    tmp = &output[strlen(MPD_WELCOME_MESSAGE)];
++
++    for (i = 0; i < 3; i++) {
++      if (tmp)
++          connection->version[i] = strtol(tmp, &test, 10);
++
++      if (!tmp || (test[0] != '.' && test[0] != '\0')) {
++          snprintf(connection->errorStr,
++                   MPD_ERRORSTR_MAX_LENGTH,
++                   "error parsing version number at " "\"%s\"", &output[strlen(MPD_WELCOME_MESSAGE)]);
++          connection->error = MPD_ERROR_NOTMPD;
++          return 1;
++      }
++      tmp = ++test;
++    }
++
++    return 0;
++}
++
++mpd_Connection *mpd_newConnection(const char *host, int port, float timeout)
++{
++    int err;
++    char *rt;
++    char *output = NULL;
++    mpd_Connection *connection = malloc(sizeof(mpd_Connection));
++    struct timeval tv;
++    fd_set fds;
++    strcpy(connection->buffer, "");
++    connection->buflen = 0;
++    connection->bufstart = 0;
++    strcpy(connection->errorStr, "");
++    connection->error = 0;
++    connection->doneProcessing = 0;
++    connection->commandList = 0;
++    connection->listOks = 0;
++    connection->doneListOk = 0;
++    connection->returnElement = NULL;
++    connection->request = NULL;
++
++    if (winsock_dll_error(connection))
++      return connection;
++
++    if (mpd_connect(connection, host, port, timeout) < 0)
++      return connection;
++
++    while (!(rt = strstr(connection->buffer, "\n"))) {
++      tv.tv_sec = connection->timeout.tv_sec;
++      tv.tv_usec = connection->timeout.tv_usec;
++      FD_ZERO(&fds);
++      FD_SET(connection->sock, &fds);
++      if ((err = select(connection->sock + 1, &fds, NULL, NULL, &tv)) == 1) {
++          int readed;
++          readed = recv(connection->sock,
++                        &(connection->buffer[connection->buflen]), MPD_BUFFER_MAX_LENGTH - connection->buflen, 0);
++          if (readed <= 0) {
++              snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH,
++                       "problems getting a response from" " \"%s\" on port %i : %s", host, port, strerror(errno));
++              connection->error = MPD_ERROR_NORESPONSE;
++              return connection;
++          }
++          connection->buflen += readed;
++          connection->buffer[connection->buflen] = '\0';
++      } else if (err < 0) {
++          if (SELECT_ERRNO_IGNORE)
++              continue;
++          snprintf(connection->errorStr,
++                   MPD_ERRORSTR_MAX_LENGTH, "problems connecting to \"%s\" on port" " %i", host, port);
++          connection->error = MPD_ERROR_CONNPORT;
++          return connection;
++      } else {
++          snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH,
++                   "timeout in attempting to get a response from" " \"%s\" on port %i", host, port);
++          connection->error = MPD_ERROR_NORESPONSE;
++          return connection;
++      }
++    }
++
++    *rt = '\0';
++    output = strdup(connection->buffer);
++    strcpy(connection->buffer, rt + 1);
++    connection->buflen = strlen(connection->buffer);
++
++    if (mpd_parseWelcome(connection, host, port, rt, output) == 0)
++      connection->doneProcessing = 1;
++
++    free(output);
++
++    return connection;
++}
++
++void mpd_clearError(mpd_Connection * connection)
++{
++    connection->error = 0;
++    connection->errorStr[0] = '\0';
++}
++
++void mpd_closeConnection(mpd_Connection * connection)
++{
++    closesocket(connection->sock);
++    if (connection->returnElement)
++      free(connection->returnElement);
++    if (connection->request)
++      free(connection->request);
++    free(connection);
++    WSACleanup();
++}
++
++static void mpd_executeCommand(mpd_Connection * connection, char *command)
++{
++    int ret;
++    struct timeval tv;
++    fd_set fds;
++    char *commandPtr = command;
++    int commandLen = strlen(command);
++
++    if (!connection->doneProcessing && !connection->commandList) {
++      strcpy(connection->errorStr, "not done processing current command");
++      connection->error = 1;
++      return;
++    }
++
++    mpd_clearError(connection);
++
++    FD_ZERO(&fds);
++    FD_SET(connection->sock, &fds);
++    tv.tv_sec = connection->timeout.tv_sec;
++    tv.tv_usec = connection->timeout.tv_usec;
++
++    while ((ret = select(connection->sock + 1, NULL, &fds, NULL, &tv) == 1) || (ret == -1 && SELECT_ERRNO_IGNORE)) {
++      ret = send(connection->sock, commandPtr, commandLen, MSG_DONTWAIT);
++      if (ret <= 0) {
++          if (SENDRECV_ERRNO_IGNORE)
++              continue;
++          snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "problems giving command \"%s\"", command);
++          connection->error = MPD_ERROR_SENDING;
++          return;
++      } else {
++          commandPtr += ret;
++          commandLen -= ret;
++      }
++
++      if (commandLen <= 0)
++          break;
++    }
++
++    if (commandLen > 0) {
++      perror("");
++      snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "timeout sending command \"%s\"", command);
++      connection->error = MPD_ERROR_TIMEOUT;
++      return;
++    }
++
++    if (!connection->commandList)
++      connection->doneProcessing = 0;
++    else if (connection->commandList == COMMAND_LIST_OK) {
++      connection->listOks++;
++    }
++}
++
++static void mpd_getNextReturnElement(mpd_Connection * connection)
++{
++    char *output = NULL;
++    char *rt = NULL;
++    char *name = NULL;
++    char *value = NULL;
++    fd_set fds;
++    struct timeval tv;
++    char *tok = NULL;
++    int readed;
++    char *bufferCheck = NULL;
++    int err;
++    int pos;
++
++    if (connection->returnElement)
++      mpd_freeReturnElement(connection->returnElement);
++    connection->returnElement = NULL;
++
++    if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) {
++      strcpy(connection->errorStr, "already done processing current command");
++      connection->error = 1;
++      return;
++    }
++
++    bufferCheck = connection->buffer + connection->bufstart;
++    while (connection->bufstart >= connection->buflen || !(rt = strchr(bufferCheck, '\n'))) {
++      if (connection->buflen >= MPD_BUFFER_MAX_LENGTH) {
++          memmove(connection->buffer,
++                  connection->buffer + connection->bufstart, connection->buflen - connection->bufstart + 1);
++          connection->buflen -= connection->bufstart;
++          connection->bufstart = 0;
++      }
++      if (connection->buflen >= MPD_BUFFER_MAX_LENGTH) {
++          strcpy(connection->errorStr, "buffer overrun");
++          connection->error = MPD_ERROR_BUFFEROVERRUN;
++          connection->doneProcessing = 1;
++          connection->doneListOk = 0;
++          return;
++      }
++      bufferCheck = connection->buffer + connection->buflen;
++      tv.tv_sec = connection->timeout.tv_sec;
++      tv.tv_usec = connection->timeout.tv_usec;
++      FD_ZERO(&fds);
++      FD_SET(connection->sock, &fds);
++      if ((err = select(connection->sock + 1, &fds, NULL, NULL, &tv) == 1)) {
++          readed = recv(connection->sock,
++                        connection->buffer + connection->buflen,
++                        MPD_BUFFER_MAX_LENGTH - connection->buflen, MSG_DONTWAIT);
++          if (readed < 0 && SENDRECV_ERRNO_IGNORE) {
++              continue;
++          }
++          if (readed <= 0) {
++              strcpy(connection->errorStr, "connection" " closed");
++              connection->error = MPD_ERROR_CONNCLOSED;
++              connection->doneProcessing = 1;
++              connection->doneListOk = 0;
++              return;
++          }
++          connection->buflen += readed;
++          connection->buffer[connection->buflen] = '\0';
++      } else if (err < 0 && SELECT_ERRNO_IGNORE)
++          continue;
++      else {
++          strcpy(connection->errorStr, "connection timeout");
++          connection->error = MPD_ERROR_TIMEOUT;
++          connection->doneProcessing = 1;
++          connection->doneListOk = 0;
++          return;
++      }
++    }
++
++    *rt = '\0';
++    output = connection->buffer + connection->bufstart;
++    connection->bufstart = rt - connection->buffer + 1;
++
++    if (strcmp(output, "OK") == 0) {
++      if (connection->listOks > 0) {
++          strcpy(connection->errorStr, "expected more list_OK's");
++          connection->error = 1;
++      }
++      connection->listOks = 0;
++      connection->doneProcessing = 1;
++      connection->doneListOk = 0;
++      return;
++    }
++
++    if (strcmp(output, "list_OK") == 0) {
++      if (!connection->listOks) {
++          strcpy(connection->errorStr, "got an unexpected list_OK");
++          connection->error = 1;
++      } else {
++          connection->doneListOk = 1;
++          connection->listOks--;
++      }
++      return;
++    }
++
++    if (strncmp(output, "ACK", strlen("ACK")) == 0) {
++      char *test;
++      char *needle;
++      int val;
++
++      strcpy(connection->errorStr, output);
++      connection->error = MPD_ERROR_ACK;
++      connection->errorCode = MPD_ACK_ERROR_UNK;
++      connection->errorAt = MPD_ERROR_AT_UNK;
++      connection->doneProcessing = 1;
++      connection->doneListOk = 0;
++
++      needle = strchr(output, '[');
++      if (!needle)
++          return;
++      val = strtol(needle + 1, &test, 10);
++      if (*test != '@')
++          return;
++      connection->errorCode = val;
++      val = strtol(test + 1, &test, 10);
++      if (*test != ']')
++          return;
++      connection->errorAt = val;
++      return;
++    }
++
++    tok = strchr(output, ':');
++    if (!tok)
++      return;
++    pos = tok - output;
++    value = ++tok;
++    name = output;
++    name[pos] = '\0';
++
++    if (value[0] == ' ') {
++      connection->returnElement = mpd_newReturnElement(name, &(value[1]));
++    } else {
++      snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "error parsing: %s:%s", name, value);
++      connection->error = 1;
++    }
++}
++
++void mpd_finishCommand(mpd_Connection * connection)
++{
++    while (!connection->doneProcessing) {
++      if (connection->doneListOk)
++          connection->doneListOk = 0;
++      mpd_getNextReturnElement(connection);
++    }
++}
++
++static void mpd_finishListOkCommand(mpd_Connection * connection)
++{
++    while (!connection->doneProcessing && connection->listOks && !connection->doneListOk) {
++      mpd_getNextReturnElement(connection);
++    }
++}
++
++int mpd_nextListOkCommand(mpd_Connection * connection)
++{
++    mpd_finishListOkCommand(connection);
++    if (!connection->doneProcessing)
++      connection->doneListOk = 0;
++    if (connection->listOks == 0 || connection->doneProcessing)
++      return -1;
++    return 0;
++}
++
++void mpd_sendStatusCommand(mpd_Connection * connection)
++{
++    mpd_executeCommand(connection, "status\n");
++}
++
++mpd_Status *mpd_getStatus(mpd_Connection * connection)
++{
++    mpd_Status *status;
++
++    /*mpd_executeCommand(connection,"status\n");
++
++       if(connection->error) return NULL; */
++
++    if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) {
++      return NULL;
++    }
++
++    if (!connection->returnElement)
++      mpd_getNextReturnElement(connection);
++
++    status = malloc(sizeof(mpd_Status));
++    status->volume = -1;
++    status->repeat = 0;
++    status->random = 0;
++    status->playlist = -1;
++    status->playlistLength = -1;
++    status->state = -1;
++    status->song = 0;
++    status->songid = 0;
++    status->elapsedTime = 0;
++    status->totalTime = 0;
++    status->bitRate = 0;
++    status->sampleRate = 0;
++    status->bits = 0;
++    status->channels = 0;
++    status->crossfade = -1;
++    status->error = NULL;
++    status->updatingDb = 0;
++
++    if (connection->error) {
++      free(status);
++      return NULL;
++    }
++    while (connection->returnElement) {
++      mpd_ReturnElement *re = connection->returnElement;
++      if (strcmp(re->name, "volume") == 0) {
++          status->volume = atoi(re->value);
++      } else if (strcmp(re->name, "repeat") == 0) {
++          status->repeat = atoi(re->value);
++      } else if (strcmp(re->name, "random") == 0) {
++          status->random = atoi(re->value);
++      } else if (strcmp(re->name, "playlist") == 0) {
++          status->playlist = strtol(re->value, NULL, 10);
++      } else if (strcmp(re->name, "playlistlength") == 0) {
++          status->playlistLength = atoi(re->value);
++      } else if (strcmp(re->name, "bitrate") == 0) {
++          status->bitRate = atoi(re->value);
++      } else if (strcmp(re->name, "state") == 0) {
++          if (strcmp(re->value, "play") == 0) {
++              status->state = MPD_STATUS_STATE_PLAY;
++          } else if (strcmp(re->value, "stop") == 0) {
++              status->state = MPD_STATUS_STATE_STOP;
++          } else if (strcmp(re->value, "pause") == 0) {
++              status->state = MPD_STATUS_STATE_PAUSE;
++          } else {
++              status->state = MPD_STATUS_STATE_UNKNOWN;
++          }
++      } else if (strcmp(re->name, "song") == 0) {
++          status->song = atoi(re->value);
++      } else if (strcmp(re->name, "songid") == 0) {
++          status->songid = atoi(re->value);
++      } else if (strcmp(re->name, "time") == 0) {
++          char *tok = strchr(re->value, ':');
++          /* the second strchr below is a safety check */
++          if (tok && (strchr(tok, 0) > (tok + 1))) {
++              /* atoi stops at the first non-[0-9] char: */
++              status->elapsedTime = atoi(re->value);
++              status->totalTime = atoi(tok + 1);
++          }
++      } else if (strcmp(re->name, "error") == 0) {
++          status->error = strdup(re->value);
++      } else if (strcmp(re->name, "xfade") == 0) {
++          status->crossfade = atoi(re->value);
++      } else if (strcmp(re->name, "updating_db") == 0) {
++          status->updatingDb = atoi(re->value);
++      } else if (strcmp(re->name, "audio") == 0) {
++          char *tok = strchr(re->value, ':');
++          if (tok && (strchr(tok, 0) > (tok + 1))) {
++              status->sampleRate = atoi(re->value);
++              status->bits = atoi(++tok);
++              tok = strchr(tok, ':');
++              if (tok && (strchr(tok, 0) > (tok + 1)))
++                  status->channels = atoi(tok + 1);
++          }
++      }
++
++      mpd_getNextReturnElement(connection);
++      if (connection->error) {
++          free(status);
++          return NULL;
++      }
++    }
++
++    if (connection->error) {
++      free(status);
++      return NULL;
++    } else if (status->state < 0) {
++      strcpy(connection->errorStr, "state not found");
++      connection->error = 1;
++      free(status);
++      return NULL;
++    }
++
++    return status;
++}
++
++void mpd_freeStatus(mpd_Status * status)
++{
++    if (status->error)
++      free(status->error);
++    free(status);
++}
++
++void mpd_sendStatsCommand(mpd_Connection * connection)
++{
++    mpd_executeCommand(connection, "stats\n");
++}
++
++mpd_Stats *mpd_getStats(mpd_Connection * connection)
++{
++    mpd_Stats *stats;
++
++    /*mpd_executeCommand(connection,"stats\n");
++
++       if(connection->error) return NULL; */
++
++    if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) {
++      return NULL;
++    }
++
++    if (!connection->returnElement)
++      mpd_getNextReturnElement(connection);
++
++    stats = malloc(sizeof(mpd_Stats));
++    stats->numberOfArtists = 0;
++    stats->numberOfAlbums = 0;
++    stats->numberOfSongs = 0;
++    stats->uptime = 0;
++    stats->dbUpdateTime = 0;
++    stats->playTime = 0;
++    stats->dbPlayTime = 0;
++
++    if (connection->error) {
++      free(stats);
++      return NULL;
++    }
++    while (connection->returnElement) {
++      mpd_ReturnElement *re = connection->returnElement;
++      if (strcmp(re->name, "artists") == 0) {
++          stats->numberOfArtists = atoi(re->value);
++      } else if (strcmp(re->name, "albums") == 0) {
++          stats->numberOfAlbums = atoi(re->value);
++      } else if (strcmp(re->name, "songs") == 0) {
++          stats->numberOfSongs = atoi(re->value);
++      } else if (strcmp(re->name, "uptime") == 0) {
++          stats->uptime = strtol(re->value, NULL, 10);
++      } else if (strcmp(re->name, "db_update") == 0) {
++          stats->dbUpdateTime = strtol(re->value, NULL, 10);
++      } else if (strcmp(re->name, "playtime") == 0) {
++          stats->playTime = strtol(re->value, NULL, 10);
++      } else if (strcmp(re->name, "db_playtime") == 0) {
++          stats->dbPlayTime = strtol(re->value, NULL, 10);
++      }
++
++      mpd_getNextReturnElement(connection);
++      if (connection->error) {
++          free(stats);
++          return NULL;
++      }
++    }
++
++    if (connection->error) {
++      free(stats);
++      return NULL;
++    }
++
++    return stats;
++}
++
++void mpd_freeStats(mpd_Stats * stats)
++{
++    free(stats);
++}
++
++mpd_SearchStats *mpd_getSearchStats(mpd_Connection * connection)
++{
++    mpd_SearchStats *stats;
++    mpd_ReturnElement *re;
++
++    if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) {
++      return NULL;
++    }
++
++    if (!connection->returnElement)
++      mpd_getNextReturnElement(connection);
++
++    if (connection->error)
++      return NULL;
++
++    stats = malloc(sizeof(mpd_SearchStats));
++    stats->numberOfSongs = 0;
++    stats->playTime = 0;
++
++    while (connection->returnElement) {
++      re = connection->returnElement;
++
++      if (strcmp(re->name, "songs") == 0) {
++          stats->numberOfSongs = atoi(re->value);
++      } else if (strcmp(re->name, "playtime") == 0) {
++          stats->playTime = strtol(re->value, NULL, 10);
++      }
++
++      mpd_getNextReturnElement(connection);
++      if (connection->error) {
++          free(stats);
++          return NULL;
++      }
++    }
++
++    if (connection->error) {
++      free(stats);
++      return NULL;
++    }
++
++    return stats;
++}
++
++void mpd_freeSearchStats(mpd_SearchStats * stats)
++{
++    free(stats);
++}
++
++static void mpd_initSong(mpd_Song * song)
++{
++    song->file = NULL;
++    song->artist = NULL;
++    song->album = NULL;
++    song->track = NULL;
++    song->title = NULL;
++    song->name = NULL;
++    song->date = NULL;
++    /* added by Qball */
++    song->genre = NULL;
++    song->composer = NULL;
++    song->performer = NULL;
++    song->disc = NULL;
++    song->comment = NULL;
++
++    song->time = MPD_SONG_NO_TIME;
++    song->pos = MPD_SONG_NO_NUM;
++    song->id = MPD_SONG_NO_ID;
++}
++
++static void mpd_finishSong(mpd_Song * song)
++{
++    if (song->file)
++      free(song->file);
++    if (song->artist)
++      free(song->artist);
++    if (song->album)
++      free(song->album);
++    if (song->title)
++      free(song->title);
++    if (song->track)
++      free(song->track);
++    if (song->name)
++      free(song->name);
++    if (song->date)
++      free(song->date);
++    if (song->genre)
++      free(song->genre);
++    if (song->composer)
++      free(song->composer);
++    if (song->disc)
++      free(song->disc);
++    if (song->comment)
++      free(song->comment);
++}
++
++mpd_Song *mpd_newSong(void)
++{
++    mpd_Song *ret = malloc(sizeof(mpd_Song));
++
++    mpd_initSong(ret);
++
++    return ret;
++}
++
++void mpd_freeSong(mpd_Song * song)
++{
++    mpd_finishSong(song);
++    free(song);
++}
++
++mpd_Song *mpd_songDup(mpd_Song * song)
++{
++    mpd_Song *ret = mpd_newSong();
++
++    if (song->file)
++      ret->file = strdup(song->file);
++    if (song->artist)
++      ret->artist = strdup(song->artist);
++    if (song->album)
++      ret->album = strdup(song->album);
++    if (song->title)
++      ret->title = strdup(song->title);
++    if (song->track)
++      ret->track = strdup(song->track);
++    if (song->name)
++      ret->name = strdup(song->name);
++    if (song->date)
++      ret->date = strdup(song->date);
++    if (song->genre)
++      ret->genre = strdup(song->genre);
++    if (song->composer)
++      ret->composer = strdup(song->composer);
++    if (song->disc)
++      ret->disc = strdup(song->disc);
++    if (song->comment)
++      ret->comment = strdup(song->comment);
++    ret->time = song->time;
++    ret->pos = song->pos;
++    ret->id = song->id;
++
++    return ret;
++}
++
++static void mpd_initDirectory(mpd_Directory * directory)
++{
++    directory->path = NULL;
++}
++
++static void mpd_finishDirectory(mpd_Directory * directory)
++{
++    if (directory->path)
++      free(directory->path);
++}
++
++mpd_Directory *mpd_newDirectory(void)
++{
++    mpd_Directory *directory = malloc(sizeof(mpd_Directory));;
++
++    mpd_initDirectory(directory);
++
++    return directory;
++}
++
++void mpd_freeDirectory(mpd_Directory * directory)
++{
++    mpd_finishDirectory(directory);
++
++    free(directory);
++}
++
++mpd_Directory *mpd_directoryDup(mpd_Directory * directory)
++{
++    mpd_Directory *ret = mpd_newDirectory();
++
++    if (directory->path)
++      ret->path = strdup(directory->path);
++
++    return ret;
++}
++
++static void mpd_initPlaylistFile(mpd_PlaylistFile * playlist)
++{
++    playlist->path = NULL;
++}
++
++static void mpd_finishPlaylistFile(mpd_PlaylistFile * playlist)
++{
++    if (playlist->path)
++      free(playlist->path);
++}
++
++mpd_PlaylistFile *mpd_newPlaylistFile(void)
++{
++    mpd_PlaylistFile *playlist = malloc(sizeof(mpd_PlaylistFile));
++
++    mpd_initPlaylistFile(playlist);
++
++    return playlist;
++}
++
++void mpd_freePlaylistFile(mpd_PlaylistFile * playlist)
++{
++    mpd_finishPlaylistFile(playlist);
++    free(playlist);
++}
++
++mpd_PlaylistFile *mpd_playlistFileDup(mpd_PlaylistFile * playlist)
++{
++    mpd_PlaylistFile *ret = mpd_newPlaylistFile();
++
++    if (playlist->path)
++      ret->path = strdup(playlist->path);
++
++    return ret;
++}
++
++static void mpd_initInfoEntity(mpd_InfoEntity * entity)
++{
++    entity->info.directory = NULL;
++}
++
++static void mpd_finishInfoEntity(mpd_InfoEntity * entity)
++{
++    if (entity->info.directory) {
++      if (entity->type == MPD_INFO_ENTITY_TYPE_DIRECTORY) {
++          mpd_freeDirectory(entity->info.directory);
++      } else if (entity->type == MPD_INFO_ENTITY_TYPE_SONG) {
++          mpd_freeSong(entity->info.song);
++      } else if (entity->type == MPD_INFO_ENTITY_TYPE_PLAYLISTFILE) {
++          mpd_freePlaylistFile(entity->info.playlistFile);
++      }
++    }
++}
++
++mpd_InfoEntity *mpd_newInfoEntity(void)
++{
++    mpd_InfoEntity *entity = malloc(sizeof(mpd_InfoEntity));
++
++    mpd_initInfoEntity(entity);
++
++    return entity;
++}
++
++void mpd_freeInfoEntity(mpd_InfoEntity * entity)
++{
++    mpd_finishInfoEntity(entity);
++    free(entity);
++}
++
++static void mpd_sendInfoCommand(mpd_Connection * connection, char *command)
++{
++    mpd_executeCommand(connection, command);
++}
++
++mpd_InfoEntity *mpd_getNextInfoEntity(mpd_Connection * connection)
++{
++    mpd_InfoEntity *entity = NULL;
++
++    if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) {
++      return NULL;
++    }
++
++    if (!connection->returnElement)
++      mpd_getNextReturnElement(connection);
++
++    if (connection->returnElement) {
++      if (strcmp(connection->returnElement->name, "file") == 0) {
++          entity = mpd_newInfoEntity();
++          entity->type = MPD_INFO_ENTITY_TYPE_SONG;
++          entity->info.song = mpd_newSong();
++          entity->info.song->file = strdup(connection->returnElement->value);
++      } else if (strcmp(connection->returnElement->name, "directory") == 0) {
++          entity = mpd_newInfoEntity();
++          entity->type = MPD_INFO_ENTITY_TYPE_DIRECTORY;
++          entity->info.directory = mpd_newDirectory();
++          entity->info.directory->path = strdup(connection->returnElement->value);
++      } else if (strcmp(connection->returnElement->name, "playlist") == 0) {
++          entity = mpd_newInfoEntity();
++          entity->type = MPD_INFO_ENTITY_TYPE_PLAYLISTFILE;
++          entity->info.playlistFile = mpd_newPlaylistFile();
++          entity->info.playlistFile->path = strdup(connection->returnElement->value);
++      } else if (strcmp(connection->returnElement->name, "cpos") == 0) {
++          entity = mpd_newInfoEntity();
++          entity->type = MPD_INFO_ENTITY_TYPE_SONG;
++          entity->info.song = mpd_newSong();
++          entity->info.song->pos = atoi(connection->returnElement->value);
++      } else {
++          connection->error = 1;
++          strcpy(connection->errorStr, "problem parsing song info");
++          return NULL;
++      }
++    } else
++      return NULL;
++
++    mpd_getNextReturnElement(connection);
++    while (connection->returnElement) {
++      mpd_ReturnElement *re = connection->returnElement;
++
++      if (strcmp(re->name, "file") == 0)
++          return entity;
++      else if (strcmp(re->name, "directory") == 0)
++          return entity;
++      else if (strcmp(re->name, "playlist") == 0)
++          return entity;
++      else if (strcmp(re->name, "cpos") == 0)
++          return entity;
++
++      if (entity->type == MPD_INFO_ENTITY_TYPE_SONG && strlen(re->value)) {
++          if (!entity->info.song->artist && strcmp(re->name, "Artist") == 0) {
++              entity->info.song->artist = strdup(re->value);
++          } else if (!entity->info.song->album && strcmp(re->name, "Album") == 0) {
++              entity->info.song->album = strdup(re->value);
++          } else if (!entity->info.song->title && strcmp(re->name, "Title") == 0) {
++              entity->info.song->title = strdup(re->value);
++          } else if (!entity->info.song->track && strcmp(re->name, "Track") == 0) {
++              entity->info.song->track = strdup(re->value);
++          } else if (!entity->info.song->name && strcmp(re->name, "Name") == 0) {
++              entity->info.song->name = strdup(re->value);
++          } else if (entity->info.song->time == MPD_SONG_NO_TIME && strcmp(re->name, "Time") == 0) {
++              entity->info.song->time = atoi(re->value);
++          } else if (entity->info.song->pos == MPD_SONG_NO_NUM && strcmp(re->name, "Pos") == 0) {
++              entity->info.song->pos = atoi(re->value);
++          } else if (entity->info.song->id == MPD_SONG_NO_ID && strcmp(re->name, "Id") == 0) {
++              entity->info.song->id = atoi(re->value);
++          } else if (!entity->info.song->date && strcmp(re->name, "Date") == 0) {
++              entity->info.song->date = strdup(re->value);
++          } else if (!entity->info.song->genre && strcmp(re->name, "Genre") == 0) {
++              entity->info.song->genre = strdup(re->value);
++          } else if (!entity->info.song->composer && strcmp(re->name, "Composer") == 0) {
++              entity->info.song->composer = strdup(re->value);
++          } else if (!entity->info.song->performer && strcmp(re->name, "Performer") == 0) {
++              entity->info.song->performer = strdup(re->value);
++          } else if (!entity->info.song->disc && strcmp(re->name, "Disc") == 0) {
++              entity->info.song->disc = strdup(re->value);
++          } else if (!entity->info.song->comment && strcmp(re->name, "Comment") == 0) {
++              entity->info.song->comment = strdup(re->value);
++          }
++      } else if (entity->type == MPD_INFO_ENTITY_TYPE_DIRECTORY) {
++      } else if (entity->type == MPD_INFO_ENTITY_TYPE_PLAYLISTFILE) {
++      }
++
++      mpd_getNextReturnElement(connection);
++    }
++
++    return entity;
++}
++
++static char *mpd_getNextReturnElementNamed(mpd_Connection * connection, const char *name)
++{
++    if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) {
++      return NULL;
++    }
++
++    mpd_getNextReturnElement(connection);
++    while (connection->returnElement) {
++      mpd_ReturnElement *re = connection->returnElement;
++
++      if (strcmp(re->name, name) == 0)
++          return strdup(re->value);
++      mpd_getNextReturnElement(connection);
++    }
++
++    return NULL;
++}
++
++char *mpd_getNextTag(mpd_Connection * connection, int type)
++{
++    if (type < 0 || type >= MPD_TAG_NUM_OF_ITEM_TYPES || type == MPD_TAG_ITEM_ANY)
++      return NULL;
++    if (type == MPD_TAG_ITEM_FILENAME)
++      return mpd_getNextReturnElementNamed(connection, "file");
++    return mpd_getNextReturnElementNamed(connection, mpdTagItemKeys[type]);
++}
++
++char *mpd_getNextArtist(mpd_Connection * connection)
++{
++    return mpd_getNextReturnElementNamed(connection, "Artist");
++}
++
++char *mpd_getNextAlbum(mpd_Connection * connection)
++{
++    return mpd_getNextReturnElementNamed(connection, "Album");
++}
++
++void mpd_sendPlaylistInfoCommand(mpd_Connection * connection, int songPos)
++{
++    int len = strlen("playlistinfo") + 2 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "playlistinfo \"%i\"\n", songPos);
++    mpd_sendInfoCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendPlaylistIdCommand(mpd_Connection * connection, int id)
++{
++    int len = strlen("playlistid") + 2 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "playlistid \"%i\"\n", id);
++    mpd_sendInfoCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendPlChangesCommand(mpd_Connection * connection, long long playlist)
++{
++    int len = strlen("plchanges") + 2 + LONGLONGLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "plchanges \"%lld\"\n", playlist);
++    mpd_sendInfoCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendPlChangesPosIdCommand(mpd_Connection * connection, long long playlist)
++{
++    int len = strlen("plchangesposid") + 2 + LONGLONGLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "plchangesposid \"%lld\"\n", playlist);
++    mpd_sendInfoCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendListallCommand(mpd_Connection * connection, const char *dir)
++{
++    char *sDir = mpd_sanitizeArg(dir);
++    int len = strlen("listall") + 2 + strlen(sDir) + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "listall \"%s\"\n", sDir);
++    mpd_sendInfoCommand(connection, string);
++    free(string);
++    free(sDir);
++}
++
++void mpd_sendListallInfoCommand(mpd_Connection * connection, const char *dir)
++{
++    char *sDir = mpd_sanitizeArg(dir);
++    int len = strlen("listallinfo") + 2 + strlen(sDir) + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "listallinfo \"%s\"\n", sDir);
++    mpd_sendInfoCommand(connection, string);
++    free(string);
++    free(sDir);
++}
++
++void mpd_sendLsInfoCommand(mpd_Connection * connection, const char *dir)
++{
++    char *sDir = mpd_sanitizeArg(dir);
++    int len = strlen("lsinfo") + 2 + strlen(sDir) + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "lsinfo \"%s\"\n", sDir);
++    mpd_sendInfoCommand(connection, string);
++    free(string);
++    free(sDir);
++}
++
++void mpd_sendCurrentSongCommand(mpd_Connection * connection)
++{
++    mpd_executeCommand(connection, "currentsong\n");
++}
++
++void mpd_sendSearchCommand(mpd_Connection * connection, int table, const char *str)
++{
++    mpd_startSearch(connection, 0);
++    mpd_addConstraintSearch(connection, table, str);
++    mpd_commitSearch(connection);
++}
++
++void mpd_sendFindCommand(mpd_Connection * connection, int table, const char *str)
++{
++    mpd_startSearch(connection, 1);
++    mpd_addConstraintSearch(connection, table, str);
++    mpd_commitSearch(connection);
++}
++
++void mpd_sendListCommand(mpd_Connection * connection, int table, const char *arg1)
++{
++    char st[10];
++    int len;
++    char *string;
++    if (table == MPD_TABLE_ARTIST)
++      strcpy(st, "artist");
++    else if (table == MPD_TABLE_ALBUM)
++      strcpy(st, "album");
++    else {
++      connection->error = 1;
++      strcpy(connection->errorStr, "unknown table for list");
++      return;
++    }
++    if (arg1) {
++      char *sanitArg1 = mpd_sanitizeArg(arg1);
++      len = strlen("list") + 1 + strlen(sanitArg1) + 2 + strlen(st) + 3;
++      string = malloc(len);
++      snprintf(string, len, "list %s \"%s\"\n", st, sanitArg1);
++      free(sanitArg1);
++    } else {
++      len = strlen("list") + 1 + strlen(st) + 2;
++      string = malloc(len);
++      snprintf(string, len, "list %s\n", st);
++    }
++    mpd_sendInfoCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendAddCommand(mpd_Connection * connection, const char *file)
++{
++    char *sFile = mpd_sanitizeArg(file);
++    int len = strlen("add") + 2 + strlen(sFile) + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "add \"%s\"\n", sFile);
++    mpd_executeCommand(connection, string);
++    free(string);
++    free(sFile);
++}
++
++int mpd_sendAddIdCommand(mpd_Connection * connection, const char *file)
++{
++    int retval = -1;
++    char *sFile = mpd_sanitizeArg(file);
++    int len = strlen("addid") + 2 + strlen(sFile) + 3;
++    char *string = malloc(len);
++
++    snprintf(string, len, "addid \"%s\"\n", sFile);
++    mpd_sendInfoCommand(connection, string);
++    free(string);
++    free(sFile);
++
++    string = mpd_getNextReturnElementNamed(connection, "Id");
++    if (string) {
++      retval = atoi(string);
++      free(string);
++    }
++
++    return retval;
++}
++
++void mpd_sendDeleteCommand(mpd_Connection * connection, int songPos)
++{
++    int len = strlen("delete") + 2 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "delete \"%i\"\n", songPos);
++    mpd_sendInfoCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendDeleteIdCommand(mpd_Connection * connection, int id)
++{
++    int len = strlen("deleteid") + 2 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "deleteid \"%i\"\n", id);
++    mpd_sendInfoCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendSaveCommand(mpd_Connection * connection, const char *name)
++{
++    char *sName = mpd_sanitizeArg(name);
++    int len = strlen("save") + 2 + strlen(sName) + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "save \"%s\"\n", sName);
++    mpd_executeCommand(connection, string);
++    free(string);
++    free(sName);
++}
++
++void mpd_sendLoadCommand(mpd_Connection * connection, const char *name)
++{
++    char *sName = mpd_sanitizeArg(name);
++    int len = strlen("load") + 2 + strlen(sName) + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "load \"%s\"\n", sName);
++    mpd_executeCommand(connection, string);
++    free(string);
++    free(sName);
++}
++
++void mpd_sendRmCommand(mpd_Connection * connection, const char *name)
++{
++    char *sName = mpd_sanitizeArg(name);
++    int len = strlen("rm") + 2 + strlen(sName) + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "rm \"%s\"\n", sName);
++    mpd_executeCommand(connection, string);
++    free(string);
++    free(sName);
++}
++
++void mpd_sendRenameCommand(mpd_Connection * connection, const char *from, const char *to)
++{
++    char *sFrom = mpd_sanitizeArg(from);
++    char *sTo = mpd_sanitizeArg(to);
++    int len = strlen("rename") + 2 + strlen(sFrom) + 3 + strlen(sTo) + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "rename \"%s\" \"%s\"\n", sFrom, sTo);
++    mpd_executeCommand(connection, string);
++    free(string);
++    free(sFrom);
++    free(sTo);
++}
++
++void mpd_sendShuffleCommand(mpd_Connection * connection)
++{
++    mpd_executeCommand(connection, "shuffle\n");
++}
++
++void mpd_sendClearCommand(mpd_Connection * connection)
++{
++    mpd_executeCommand(connection, "clear\n");
++}
++
++void mpd_sendPlayCommand(mpd_Connection * connection, int songPos)
++{
++    int len = strlen("play") + 2 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "play \"%i\"\n", songPos);
++    mpd_sendInfoCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendPlayIdCommand(mpd_Connection * connection, int id)
++{
++    int len = strlen("playid") + 2 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "playid \"%i\"\n", id);
++    mpd_sendInfoCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendStopCommand(mpd_Connection * connection)
++{
++    mpd_executeCommand(connection, "stop\n");
++}
++
++void mpd_sendPauseCommand(mpd_Connection * connection, int pauseMode)
++{
++    int len = strlen("pause") + 2 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "pause \"%i\"\n", pauseMode);
++    mpd_executeCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendNextCommand(mpd_Connection * connection)
++{
++    mpd_executeCommand(connection, "next\n");
++}
++
++void mpd_sendMoveCommand(mpd_Connection * connection, int from, int to)
++{
++    int len = strlen("move") + 2 + INTLEN + 3 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "move \"%i\" \"%i\"\n", from, to);
++    mpd_sendInfoCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendMoveIdCommand(mpd_Connection * connection, int id, int to)
++{
++    int len = strlen("moveid") + 2 + INTLEN + 3 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "moveid \"%i\" \"%i\"\n", id, to);
++    mpd_sendInfoCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendSwapCommand(mpd_Connection * connection, int song1, int song2)
++{
++    int len = strlen("swap") + 2 + INTLEN + 3 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "swap \"%i\" \"%i\"\n", song1, song2);
++    mpd_sendInfoCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendSwapIdCommand(mpd_Connection * connection, int id1, int id2)
++{
++    int len = strlen("swapid") + 2 + INTLEN + 3 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "swapid \"%i\" \"%i\"\n", id1, id2);
++    mpd_sendInfoCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendSeekCommand(mpd_Connection * connection, int song, int time)
++{
++    int len = strlen("seek") + 2 + INTLEN + 3 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "seek \"%i\" \"%i\"\n", song, time);
++    mpd_sendInfoCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendSeekIdCommand(mpd_Connection * connection, int id, int time)
++{
++    int len = strlen("seekid") + 2 + INTLEN + 3 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "seekid \"%i\" \"%i\"\n", id, time);
++    mpd_sendInfoCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendUpdateCommand(mpd_Connection * connection, char *path)
++{
++    char *sPath = mpd_sanitizeArg(path);
++    int len = strlen("update") + 2 + strlen(sPath) + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "update \"%s\"\n", sPath);
++    mpd_sendInfoCommand(connection, string);
++    free(string);
++    free(sPath);
++}
++
++int mpd_getUpdateId(mpd_Connection * connection)
++{
++    char *jobid;
++    int ret = 0;
++
++    jobid = mpd_getNextReturnElementNamed(connection, "updating_db");
++    if (jobid) {
++      ret = atoi(jobid);
++      free(jobid);
++    }
++
++    return ret;
++}
++
++void mpd_sendPrevCommand(mpd_Connection * connection)
++{
++    mpd_executeCommand(connection, "previous\n");
++}
++
++void mpd_sendRepeatCommand(mpd_Connection * connection, int repeatMode)
++{
++    int len = strlen("repeat") + 2 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "repeat \"%i\"\n", repeatMode);
++    mpd_executeCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendRandomCommand(mpd_Connection * connection, int randomMode)
++{
++    int len = strlen("random") + 2 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "random \"%i\"\n", randomMode);
++    mpd_executeCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendSetvolCommand(mpd_Connection * connection, int volumeChange)
++{
++    int len = strlen("setvol") + 2 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "setvol \"%i\"\n", volumeChange);
++    mpd_executeCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendVolumeCommand(mpd_Connection * connection, int volumeChange)
++{
++    int len = strlen("volume") + 2 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "volume \"%i\"\n", volumeChange);
++    mpd_executeCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendCrossfadeCommand(mpd_Connection * connection, int seconds)
++{
++    int len = strlen("crossfade") + 2 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "crossfade \"%i\"\n", seconds);
++    mpd_executeCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendPasswordCommand(mpd_Connection * connection, const char *pass)
++{
++    char *sPass = mpd_sanitizeArg(pass);
++    int len = strlen("password") + 2 + strlen(sPass) + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "password \"%s\"\n", sPass);
++    mpd_executeCommand(connection, string);
++    free(string);
++    free(sPass);
++}
++
++void mpd_sendCommandListBegin(mpd_Connection * connection)
++{
++    if (connection->commandList) {
++      strcpy(connection->errorStr, "already in command list mode");
++      connection->error = 1;
++      return;
++    }
++    connection->commandList = COMMAND_LIST;
++    mpd_executeCommand(connection, "command_list_begin\n");
++}
++
++void mpd_sendCommandListOkBegin(mpd_Connection * connection)
++{
++    if (connection->commandList) {
++      strcpy(connection->errorStr, "already in command list mode");
++      connection->error = 1;
++      return;
++    }
++    connection->commandList = COMMAND_LIST_OK;
++    mpd_executeCommand(connection, "command_list_ok_begin\n");
++    connection->listOks = 0;
++}
++
++void mpd_sendCommandListEnd(mpd_Connection * connection)
++{
++    if (!connection->commandList) {
++      strcpy(connection->errorStr, "not in command list mode");
++      connection->error = 1;
++      return;
++    }
++    connection->commandList = 0;
++    mpd_executeCommand(connection, "command_list_end\n");
++}
++
++void mpd_sendOutputsCommand(mpd_Connection * connection)
++{
++    mpd_executeCommand(connection, "outputs\n");
++}
++
++mpd_OutputEntity *mpd_getNextOutput(mpd_Connection * connection)
++{
++    mpd_OutputEntity *output = NULL;
++
++    if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) {
++      return NULL;
++    }
++
++    if (connection->error)
++      return NULL;
++
++    output = malloc(sizeof(mpd_OutputEntity));
++    output->id = -10;
++    output->name = NULL;
++    output->enabled = 0;
++
++    if (!connection->returnElement)
++      mpd_getNextReturnElement(connection);
++
++    while (connection->returnElement) {
++      mpd_ReturnElement *re = connection->returnElement;
++      if (strcmp(re->name, "outputid") == 0) {
++          if (output != NULL && output->id >= 0)
++              return output;
++          output->id = atoi(re->value);
++      } else if (strcmp(re->name, "outputname") == 0) {
++          output->name = strdup(re->value);
++      } else if (strcmp(re->name, "outputenabled") == 0) {
++          output->enabled = atoi(re->value);
++      }
++
++      mpd_getNextReturnElement(connection);
++      if (connection->error) {
++          free(output);
++          return NULL;
++      }
++
++    }
++
++    return output;
++}
++
++void mpd_sendEnableOutputCommand(mpd_Connection * connection, int outputId)
++{
++    int len = strlen("enableoutput") + 2 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "enableoutput \"%i\"\n", outputId);
++    mpd_executeCommand(connection, string);
++    free(string);
++}
++
++void mpd_sendDisableOutputCommand(mpd_Connection * connection, int outputId)
++{
++    int len = strlen("disableoutput") + 2 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "disableoutput \"%i\"\n", outputId);
++    mpd_executeCommand(connection, string);
++    free(string);
++}
++
++void mpd_freeOutputElement(mpd_OutputEntity * output)
++{
++    free(output->name);
++    free(output);
++}
++
++/**
++ * mpd_sendNotCommandsCommand
++ * odd naming, but it gets the not allowed commands
++ */
++
++void mpd_sendNotCommandsCommand(mpd_Connection * connection)
++{
++    mpd_executeCommand(connection, "notcommands\n");
++}
++
++/**
++ * mpd_sendCommandsCommand
++ * odd naming, but it gets the allowed commands
++ */
++void mpd_sendCommandsCommand(mpd_Connection * connection)
++{
++    mpd_executeCommand(connection, "commands\n");
++}
++
++/**
++ * Get the next returned command
++ */
++char *mpd_getNextCommand(mpd_Connection * connection)
++{
++    return mpd_getNextReturnElementNamed(connection, "command");
++}
++
++void mpd_sendUrlHandlersCommand(mpd_Connection * connection)
++{
++    mpd_executeCommand(connection, "urlhandlers\n");
++}
++
++char *mpd_getNextHandler(mpd_Connection * connection)
++{
++    return mpd_getNextReturnElementNamed(connection, "handler");
++}
++
++void mpd_sendTagTypesCommand(mpd_Connection * connection)
++{
++    mpd_executeCommand(connection, "tagtypes\n");
++}
++
++char *mpd_getNextTagType(mpd_Connection * connection)
++{
++    return mpd_getNextReturnElementNamed(connection, "tagtype");
++}
++
++void mpd_startSearch(mpd_Connection * connection, int exact)
++{
++    if (connection->request) {
++      strcpy(connection->errorStr, "search already in progress");
++      connection->error = 1;
++      return;
++    }
++
++    if (exact)
++      connection->request = strdup("find");
++    else
++      connection->request = strdup("search");
++}
++
++void mpd_startStatsSearch(mpd_Connection * connection)
++{
++    if (connection->request) {
++      strcpy(connection->errorStr, "search already in progress");
++      connection->error = 1;
++      return;
++    }
++
++    connection->request = strdup("count");
++}
++
++void mpd_startPlaylistSearch(mpd_Connection * connection, int exact)
++{
++    if (connection->request) {
++      strcpy(connection->errorStr, "search already in progress");
++      connection->error = 1;
++      return;
++    }
++
++    if (exact)
++      connection->request = strdup("playlistfind");
++    else
++      connection->request = strdup("playlistsearch");
++}
++
++void mpd_startFieldSearch(mpd_Connection * connection, int type)
++{
++    char *strtype;
++    int len;
++
++    if (connection->request) {
++      strcpy(connection->errorStr, "search already in progress");
++      connection->error = 1;
++      return;
++    }
++
++    if (type < 0 || type >= MPD_TAG_NUM_OF_ITEM_TYPES) {
++      strcpy(connection->errorStr, "invalid type specified");
++      connection->error = 1;
++      return;
++    }
++
++    strtype = mpdTagItemKeys[type];
++
++    len = 5 + strlen(strtype) + 1;
++    connection->request = malloc(len);
++
++    snprintf(connection->request, len, "list %c%s", tolower(strtype[0]), strtype + 1);
++}
++
++void mpd_addConstraintSearch(mpd_Connection * connection, int type, const char *name)
++{
++    char *strtype;
++    char *arg;
++    int len;
++    char *string;
++
++    if (!connection->request) {
++      strcpy(connection->errorStr, "no search in progress");
++      connection->error = 1;
++      return;
++    }
++
++    if (type < 0 || type >= MPD_TAG_NUM_OF_ITEM_TYPES) {
++      strcpy(connection->errorStr, "invalid type specified");
++      connection->error = 1;
++      return;
++    }
++
++    if (name == NULL) {
++      strcpy(connection->errorStr, "no name specified");
++      connection->error = 1;
++      return;
++    }
++
++    string = strdup(connection->request);
++    strtype = mpdTagItemKeys[type];
++    arg = mpd_sanitizeArg(name);
++
++    len = strlen(string) + 1 + strlen(strtype) + 2 + strlen(arg) + 2;
++    connection->request = realloc(connection->request, len);
++    snprintf(connection->request, len, "%s %c%s \"%s\"", string, tolower(strtype[0]), strtype + 1, arg);
++
++    free(string);
++    free(arg);
++}
++
++void mpd_commitSearch(mpd_Connection * connection)
++{
++    int len;
++
++    if (!connection->request) {
++      strcpy(connection->errorStr, "no search in progress");
++      connection->error = 1;
++      return;
++    }
++
++    len = strlen(connection->request) + 2;
++    connection->request = realloc(connection->request, len);
++    connection->request[len - 2] = '\n';
++    connection->request[len - 1] = '\0';
++    mpd_sendInfoCommand(connection, connection->request);
++
++    free(connection->request);
++    connection->request = NULL;
++}
++
++/**
++ * @param connection a MpdConnection
++ * @param path        the path to the playlist.
++ *
++ * List the content, with full metadata, of a stored playlist.
++ *
++ */
++void mpd_sendListPlaylistInfoCommand(mpd_Connection * connection, char *path)
++{
++    char *arg = mpd_sanitizeArg(path);
++    int len = strlen("listplaylistinfo") + 2 + strlen(arg) + 3;
++    char *query = malloc(len);
++    snprintf(query, len, "listplaylistinfo \"%s\"\n", arg);
++    mpd_sendInfoCommand(connection, query);
++    free(arg);
++    free(query);
++}
++
++/**
++ * @param connection a MpdConnection
++ * @param path        the path to the playlist.
++ *
++ * List the content of a stored playlist.
++ *
++ */
++void mpd_sendListPlaylistCommand(mpd_Connection * connection, char *path)
++{
++    char *arg = mpd_sanitizeArg(path);
++    int len = strlen("listplaylist") + 2 + strlen(arg) + 3;
++    char *query = malloc(len);
++    snprintf(query, len, "listplaylist \"%s\"\n", arg);
++    mpd_sendInfoCommand(connection, query);
++    free(arg);
++    free(query);
++}
++
++void mpd_sendPlaylistClearCommand(mpd_Connection * connection, char *path)
++{
++    char *sPath = mpd_sanitizeArg(path);
++    int len = strlen("playlistclear") + 2 + strlen(sPath) + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "playlistclear \"%s\"\n", sPath);
++    mpd_executeCommand(connection, string);
++    free(sPath);
++    free(string);
++}
++
++void mpd_sendPlaylistAddCommand(mpd_Connection * connection, char *playlist, char *path)
++{
++    char *sPlaylist = mpd_sanitizeArg(playlist);
++    char *sPath = mpd_sanitizeArg(path);
++    int len = strlen("playlistadd") + 2 + strlen(sPlaylist) + 3 + strlen(sPath) + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "playlistadd \"%s\" \"%s\"\n", sPlaylist, sPath);
++    mpd_executeCommand(connection, string);
++    free(sPlaylist);
++    free(sPath);
++    free(string);
++}
++
++void mpd_sendPlaylistMoveCommand(mpd_Connection * connection, char *playlist, int from, int to)
++{
++    char *sPlaylist = mpd_sanitizeArg(playlist);
++    int len = strlen("playlistmove") + 2 + strlen(sPlaylist) + 3 + INTLEN + 3 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "playlistmove \"%s\" \"%i\" \"%i\"\n", sPlaylist, from, to);
++    mpd_executeCommand(connection, string);
++    free(sPlaylist);
++    free(string);
++}
++
++void mpd_sendPlaylistDeleteCommand(mpd_Connection * connection, char *playlist, int pos)
++{
++    char *sPlaylist = mpd_sanitizeArg(playlist);
++    int len = strlen("playlistdelete") + 2 + strlen(sPlaylist) + 3 + INTLEN + 3;
++    char *string = malloc(len);
++    snprintf(string, len, "playlistdelete \"%s\" \"%i\"\n", sPlaylist, pos);
++    mpd_executeCommand(connection, string);
++    free(sPlaylist);
++    free(string);
++}
+--- /dev/null
++++ b/libmpdclient.h
+@@ -0,0 +1,661 @@
++/* libmpdclient
++   (c)2003-2006 by Warren Dukes (warren.dukes@gmail.com)
++   This project's homepage is: http://www.musicpd.org
++
++   Redistribution and use in source and binary forms, with or without
++   modification, are permitted provided that the following conditions
++   are met:
++
++   - Redistributions of source code must retain the above copyright
++   notice, this list of conditions and the following disclaimer.
++
++   - Redistributions in binary form must reproduce the above copyright
++   notice, this list of conditions and the following disclaimer in the
++   documentation and/or other materials provided with the distribution.
++
++   - Neither the name of the Music Player Daemon nor the names of its
++   contributors may be used to endorse or promote products derived from
++   this software without specific prior written permission.
++
++   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
++   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++*/
++
++#ifndef LIBMPDCLIENT_H
++#define LIBMPDCLIENT_H
++
++#ifdef WIN32
++#  define __W32API_USE_DLLIMPORT__ 1
++#endif
++
++#include <sys/time.h>
++#include <stdarg.h>
++#define MPD_BUFFER_MAX_LENGTH 50000
++#define MPD_ERRORSTR_MAX_LENGTH       1000
++#define MPD_WELCOME_MESSAGE   "OK MPD "
++
++#define MPD_ERROR_TIMEOUT     10      /* timeout trying to talk to mpd */
++#define MPD_ERROR_SYSTEM      11      /* system error */
++#define MPD_ERROR_UNKHOST     12      /* unknown host */
++#define MPD_ERROR_CONNPORT    13      /* problems connecting to port on host */
++#define MPD_ERROR_NOTMPD      14      /* mpd not running on port at host */
++#define MPD_ERROR_NORESPONSE  15      /* no response on attempting to connect */
++#define MPD_ERROR_SENDING     16      /* error sending command */
++#define MPD_ERROR_CONNCLOSED  17      /* connection closed by mpd */
++#define MPD_ERROR_ACK         18      /* ACK returned! */
++#define MPD_ERROR_BUFFEROVERRUN       19      /* Buffer was overrun! */
++
++#define MPD_ACK_ERROR_UNK     -1
++#define MPD_ERROR_AT_UNK      -1
++
++#define MPD_ACK_ERROR_NOT_LIST                        1
++#define MPD_ACK_ERROR_ARG                     2
++#define MPD_ACK_ERROR_PASSWORD                        3
++#define MPD_ACK_ERROR_PERMISSION              4
++#define MPD_ACK_ERROR_UNKNOWN_CMD             5
++
++#define MPD_ACK_ERROR_NO_EXIST                        50
++#define MPD_ACK_ERROR_PLAYLIST_MAX            51
++#define MPD_ACK_ERROR_SYSTEM                  52
++#define MPD_ACK_ERROR_PLAYLIST_LOAD           53
++#define MPD_ACK_ERROR_UPDATE_ALREADY          54
++#define MPD_ACK_ERROR_PLAYER_SYNC             55
++#define MPD_ACK_ERROR_EXIST                   56
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++    typedef enum mpd_TagItems {
++      MPD_TAG_ITEM_ARTIST,
++      MPD_TAG_ITEM_ALBUM,
++      MPD_TAG_ITEM_TITLE,
++      MPD_TAG_ITEM_TRACK,
++      MPD_TAG_ITEM_NAME,
++      MPD_TAG_ITEM_GENRE,
++      MPD_TAG_ITEM_DATE,
++      MPD_TAG_ITEM_COMPOSER,
++      MPD_TAG_ITEM_PERFORMER,
++      MPD_TAG_ITEM_COMMENT,
++      MPD_TAG_ITEM_DISC,
++      MPD_TAG_ITEM_FILENAME,
++      MPD_TAG_ITEM_ANY,
++      MPD_TAG_NUM_OF_ITEM_TYPES
++    } mpd_TagItems;
++
++    extern char *mpdTagItemKeys[MPD_TAG_NUM_OF_ITEM_TYPES];
++
++/* internal stuff don't touch this struct */
++    typedef struct _mpd_ReturnElement {
++      char *name;
++      char *value;
++    } mpd_ReturnElement;
++
++/* mpd_Connection
++ * holds info about connection to mpd
++ * use error, and errorStr to detect errors
++ */
++    typedef struct _mpd_Connection {
++      /* use this to check the version of mpd */
++      int version[3];
++      /* IMPORTANT, you want to get the error messages from here */
++      char errorStr[MPD_ERRORSTR_MAX_LENGTH + 1];
++      int errorCode;
++      int errorAt;
++      /* this will be set to MPD_ERROR_* if there is an error, 0 if not */
++      int error;
++      /* DON'T TOUCH any of the rest of this stuff */
++      int sock;
++      char buffer[MPD_BUFFER_MAX_LENGTH + 1];
++      int buflen;
++      int bufstart;
++      int doneProcessing;
++      int listOks;
++      int doneListOk;
++      int commandList;
++      mpd_ReturnElement *returnElement;
++      struct timeval timeout;
++      char *request;
++    } mpd_Connection;
++
++/* mpd_newConnection
++ * use this to open a new connection
++ * you should use mpd_closeConnection, when your done with the connection,
++ * even if an error has occurred
++ * _timeout_ is the connection timeout period in seconds
++ */
++    mpd_Connection *mpd_newConnection(const char *host, int port, float timeout);
++
++    void mpd_setConnectionTimeout(mpd_Connection * connection, float timeout);
++
++/* mpd_closeConnection
++ * use this to close a connection and free'ing subsequent memory
++ */
++    void mpd_closeConnection(mpd_Connection * connection);
++
++/* mpd_clearError
++ * clears error
++ */
++    void mpd_clearError(mpd_Connection * connection);
++
++/* STATUS STUFF */
++
++/* use these with status.state to determine what state the player is in */
++#define MPD_STATUS_STATE_UNKNOWN      0
++#define MPD_STATUS_STATE_STOP         1
++#define MPD_STATUS_STATE_PLAY         2
++#define MPD_STATUS_STATE_PAUSE                3
++
++/* us this with status.volume to determine if mpd has volume support */
++#define MPD_STATUS_NO_VOLUME          -1
++
++/* mpd_Status
++ * holds info return from status command
++ */
++    typedef struct mpd_Status {
++      /* 0-100, or MPD_STATUS_NO_VOLUME when there is no volume support */
++      int volume;
++      /* 1 if repeat is on, 0 otherwise */
++      int repeat;
++      /* 1 if random is on, 0 otherwise */
++      int random;
++      /* playlist length */
++      int playlistLength;
++      /* playlist, use this to determine when the playlist has changed */
++      long long playlist;
++      /* use with MPD_STATUS_STATE_* to determine state of player */
++      int state;
++      /* crossfade setting in seconds */
++      int crossfade;
++      /* if a song is currently selected (always the case when state is
++       * PLAY or PAUSE), this is the position of the currently
++       * playing song in the playlist, beginning with 0
++       */
++      int song;
++      /* Song ID of the currently selected song */
++      int songid;
++      /* time in seconds that have elapsed in the currently playing/paused
++       * song
++       */
++      int elapsedTime;
++      /* length in seconds of the currently playing/paused song */
++      int totalTime;
++      /* current bit rate in kbs */
++      int bitRate;
++      /* audio sample rate */
++      unsigned int sampleRate;
++      /* audio bits */
++      int bits;
++      /* audio channels */
++      int channels;
++      /* 1 if mpd is updating, 0 otherwise */
++      int updatingDb;
++      /* error */
++      char *error;
++    } mpd_Status;
++
++    void mpd_sendStatusCommand(mpd_Connection * connection);
++
++/* mpd_getStatus
++ * returns status info, be sure to free it with mpd_freeStatus()
++ * call this after mpd_sendStatusCommand()
++ */
++    mpd_Status *mpd_getStatus(mpd_Connection * connection);
++
++/* mpd_freeStatus
++ * free's status info malloc'd and returned by mpd_getStatus
++ */
++    void mpd_freeStatus(mpd_Status * status);
++
++    typedef struct _mpd_Stats {
++      int numberOfArtists;
++      int numberOfAlbums;
++      int numberOfSongs;
++      unsigned long uptime;
++      unsigned long dbUpdateTime;
++      unsigned long playTime;
++      unsigned long dbPlayTime;
++    } mpd_Stats;
++
++    typedef struct _mpd_SearchStats {
++      int numberOfSongs;
++      unsigned long playTime;
++    } mpd_SearchStats;
++
++    void mpd_sendStatsCommand(mpd_Connection * connection);
++
++    mpd_Stats *mpd_getStats(mpd_Connection * connection);
++
++    void mpd_freeStats(mpd_Stats * stats);
++
++    mpd_SearchStats *mpd_getSearchStats(mpd_Connection * connection);
++
++    void mpd_freeSearchStats(mpd_SearchStats * stats);
++
++/* SONG STUFF */
++
++#define MPD_SONG_NO_TIME      -1
++#define MPD_SONG_NO_NUM               -1
++#define MPD_SONG_NO_ID                -1
++
++/* mpd_Song
++ * for storing song info returned by mpd
++ */
++    typedef struct _mpd_Song {
++      /* filename of song */
++      char *file;
++      /* artist, maybe NULL if there is no tag */
++      char *artist;
++      /* title, maybe NULL if there is no tag */
++      char *title;
++      /* album, maybe NULL if there is no tag */
++      char *album;
++      /* track, maybe NULL if there is no tag */
++      char *track;
++      /* name, maybe NULL if there is no tag; it's the name of the current
++       * song, f.e. the icyName of the stream */
++      char *name;
++      /* date */
++      char *date;
++
++      /* added by qball */
++      /* Genre */
++      char *genre;
++      /* Composer */
++      char *composer;
++      /* Performer */
++      char *performer;
++      /* Disc */
++      char *disc;
++      /* Comment */
++      char *comment;
++
++      /* length of song in seconds, check that it is not MPD_SONG_NO_TIME  */
++      int time;
++      /* if plchanges/playlistinfo/playlistid used, is the position of the
++       * song in the playlist */
++      int pos;
++      /* song id for a song in the playlist */
++      int id;
++    } mpd_Song;
++
++/* mpd_newSong
++ * use to allocate memory for a new mpd_Song
++ * file, artist, etc all initialized to NULL
++ * if your going to assign values to file, artist, etc
++ * be sure to malloc or strdup the memory
++ * use mpd_freeSong to free the memory for the mpd_Song, it will also
++ * free memory for file, artist, etc, so don't do it yourself
++ */
++    mpd_Song *mpd_newSong(void);
++
++/* mpd_freeSong
++ * use to free memory allocated by mpd_newSong
++ * also it will free memory pointed to by file, artist, etc, so be careful
++ */
++    void mpd_freeSong(mpd_Song * song);
++
++/* mpd_songDup
++ * works like strDup, but for a mpd_Song
++ */
++    mpd_Song *mpd_songDup(mpd_Song * song);
++
++/* DIRECTORY STUFF */
++
++/* mpd_Directory
++ * used to store info fro directory (right now that just the path)
++ */
++    typedef struct _mpd_Directory {
++      char *path;
++    } mpd_Directory;
++
++/* mpd_newDirectory
++ * allocates memory for a new directory
++ * use mpd_freeDirectory to free this memory
++ */
++    mpd_Directory *mpd_newDirectory(void);
++
++/* mpd_freeDirectory
++ * used to free memory allocated with mpd_newDirectory, and it frees
++ * path of mpd_Directory, so be careful
++ */
++    void mpd_freeDirectory(mpd_Directory * directory);
++
++/* mpd_directoryDup
++ * works like strdup, but for mpd_Directory
++ */
++    mpd_Directory *mpd_directoryDup(mpd_Directory * directory);
++
++/* PLAYLISTFILE STUFF */
++
++/* mpd_PlaylistFile
++ * stores info about playlist file returned by lsinfo
++ */
++    typedef struct _mpd_PlaylistFile {
++      char *path;
++    } mpd_PlaylistFile;
++
++/* mpd_newPlaylistFile
++ * allocates memory for new mpd_PlaylistFile, path is set to NULL
++ * free this memory with mpd_freePlaylistFile
++ */
++    mpd_PlaylistFile *mpd_newPlaylistFile(void);
++
++/* mpd_freePlaylist
++ * free memory allocated for freePlaylistFile, will also free
++ * path, so be careful
++ */
++    void mpd_freePlaylistFile(mpd_PlaylistFile * playlist);
++
++/* mpd_playlistFileDup
++ * works like strdup, but for mpd_PlaylistFile
++ */
++    mpd_PlaylistFile *mpd_playlistFileDup(mpd_PlaylistFile * playlist);
++
++/* INFO ENTITY STUFF */
++
++/* the type of entity returned from one of the commands that generates info
++ * use in conjunction with mpd_InfoEntity.type
++ */
++#define MPD_INFO_ENTITY_TYPE_DIRECTORY                0
++#define MPD_INFO_ENTITY_TYPE_SONG             1
++#define MPD_INFO_ENTITY_TYPE_PLAYLISTFILE     2
++
++/* mpd_InfoEntity
++ * stores info on stuff returned info commands
++ */
++    typedef struct mpd_InfoEntity {
++      /* the type of entity, use with MPD_INFO_ENTITY_TYPE_* to determine
++       * what this entity is (song, directory, etc...)
++       */
++      int type;
++      /* the actual data you want, mpd_Song, mpd_Directory, etc */
++      union {
++          mpd_Directory *directory;
++          mpd_Song *song;
++          mpd_PlaylistFile *playlistFile;
++      } info;
++    } mpd_InfoEntity;
++
++    mpd_InfoEntity *mpd_newInfoEntity(void);
++
++    void mpd_freeInfoEntity(mpd_InfoEntity * entity);
++
++/* INFO COMMANDS AND STUFF */
++
++/* use this function to loop over after calling Info/Listall functions */
++    mpd_InfoEntity *mpd_getNextInfoEntity(mpd_Connection * connection);
++
++/* fetches the currently seeletect song (the song referenced by status->song
++ * and status->songid*/
++    void mpd_sendCurrentSongCommand(mpd_Connection * connection);
++
++/* songNum of -1, means to display the whole list */
++    void mpd_sendPlaylistInfoCommand(mpd_Connection * connection, int songNum);
++
++/* songId of -1, means to display the whole list */
++    void mpd_sendPlaylistIdCommand(mpd_Connection * connection, int songId);
++
++/* use this to get the changes in the playlist since version _playlist_ */
++    void mpd_sendPlChangesCommand(mpd_Connection * connection, long long playlist);
++
++/**
++ * @param connection: A valid and connected mpd_Connection.
++ * @param playlist: The playlist version you want the diff with.
++ * A more bandwidth efficient version of the mpd_sendPlChangesCommand.
++ * It only returns the pos+id of the changes song.
++ */
++    void mpd_sendPlChangesPosIdCommand(mpd_Connection * connection, long long playlist);
++
++/* recursivel fetches all songs/dir/playlists in "dir* (no metadata is
++ * returned) */
++    void mpd_sendListallCommand(mpd_Connection * connection, const char *dir);
++
++/* same as sendListallCommand, but also metadata is returned */
++    void mpd_sendListallInfoCommand(mpd_Connection * connection, const char *dir);
++
++/* non-recursive version of ListallInfo */
++    void mpd_sendLsInfoCommand(mpd_Connection * connection, const char *dir);
++
++#define MPD_TABLE_ARTIST      MPD_TAG_ITEM_ARTIST
++#define MPD_TABLE_ALBUM               MPD_TAG_ITEM_ALBUM
++#define MPD_TABLE_TITLE               MPD_TAG_ITEM_TITLE
++#define MPD_TABLE_FILENAME    MPD_TAG_ITEM_FILENAME
++
++    void mpd_sendSearchCommand(mpd_Connection * connection, int table, const char *str);
++
++    void mpd_sendFindCommand(mpd_Connection * connection, int table, const char *str);
++
++/* LIST TAG COMMANDS */
++
++/* use this function fetch next artist entry, be sure to free the returned
++ * string.  NULL means there are no more.  Best used with sendListArtists
++ */
++    char *mpd_getNextArtist(mpd_Connection * connection);
++
++    char *mpd_getNextAlbum(mpd_Connection * connection);
++
++    char *mpd_getNextTag(mpd_Connection * connection, int type);
++
++/* list artist or albums by artist, arg1 should be set to the artist if
++ * listing albums by a artist, otherwise NULL for listing all artists or albums
++ */
++    void mpd_sendListCommand(mpd_Connection * connection, int table, const char *arg1);
++
++/* SIMPLE COMMANDS */
++
++    void mpd_sendAddCommand(mpd_Connection * connection, const char *file);
++
++    int mpd_sendAddIdCommand(mpd_Connection * connection, const char *file);
++
++    void mpd_sendDeleteCommand(mpd_Connection * connection, int songNum);
++
++    void mpd_sendDeleteIdCommand(mpd_Connection * connection, int songNum);
++
++    void mpd_sendSaveCommand(mpd_Connection * connection, const char *name);
++
++    void mpd_sendLoadCommand(mpd_Connection * connection, const char *name);
++
++    void mpd_sendRmCommand(mpd_Connection * connection, const char *name);
++
++    void mpd_sendRenameCommand(mpd_Connection * connection, const char *from, const char *to);
++
++    void mpd_sendShuffleCommand(mpd_Connection * connection);
++
++    void mpd_sendClearCommand(mpd_Connection * connection);
++
++/* use this to start playing at the beginning, useful when in random mode */
++#define MPD_PLAY_AT_BEGINNING -1
++
++    void mpd_sendPlayCommand(mpd_Connection * connection, int songNum);
++
++    void mpd_sendPlayIdCommand(mpd_Connection * connection, int songNum);
++
++    void mpd_sendStopCommand(mpd_Connection * connection);
++
++    void mpd_sendPauseCommand(mpd_Connection * connection, int pauseMode);
++
++    void mpd_sendNextCommand(mpd_Connection * connection);
++
++    void mpd_sendPrevCommand(mpd_Connection * connection);
++
++    void mpd_sendMoveCommand(mpd_Connection * connection, int from, int to);
++
++    void mpd_sendMoveIdCommand(mpd_Connection * connection, int from, int to);
++
++    void mpd_sendSwapCommand(mpd_Connection * connection, int song1, int song2);
++
++    void mpd_sendSwapIdCommand(mpd_Connection * connection, int song1, int song2);
++
++    void mpd_sendSeekCommand(mpd_Connection * connection, int song, int time);
++
++    void mpd_sendSeekIdCommand(mpd_Connection * connection, int song, int time);
++
++    void mpd_sendRepeatCommand(mpd_Connection * connection, int repeatMode);
++
++    void mpd_sendRandomCommand(mpd_Connection * connection, int randomMode);
++
++    void mpd_sendSetvolCommand(mpd_Connection * connection, int volumeChange);
++
++/* WARNING: don't use volume command, its depreacted */
++    void mpd_sendVolumeCommand(mpd_Connection * connection, int volumeChange);
++
++    void mpd_sendCrossfadeCommand(mpd_Connection * connection, int seconds);
++
++    void mpd_sendUpdateCommand(mpd_Connection * connection, char *path);
++
++/* returns the update job id, call this after a update command*/
++    int mpd_getUpdateId(mpd_Connection * connection);
++
++    void mpd_sendPasswordCommand(mpd_Connection * connection, const char *pass);
++
++/* after executing a command, when your done with it to get its status
++ * (you want to check connection->error for an error)
++ */
++    void mpd_finishCommand(mpd_Connection * connection);
++
++/* command list stuff, use this to do things like add files very quickly */
++    void mpd_sendCommandListBegin(mpd_Connection * connection);
++
++    void mpd_sendCommandListOkBegin(mpd_Connection * connection);
++
++    void mpd_sendCommandListEnd(mpd_Connection * connection);
++
++/* advance to the next listOk
++ * returns 0 if advanced to the next list_OK,
++ * returns -1 if it advanced to an OK or ACK */
++    int mpd_nextListOkCommand(mpd_Connection * connection);
++
++    typedef struct _mpd_OutputEntity {
++      int id;
++      char *name;
++      int enabled;
++    } mpd_OutputEntity;
++
++    void mpd_sendOutputsCommand(mpd_Connection * connection);
++
++    mpd_OutputEntity *mpd_getNextOutput(mpd_Connection * connection);
++
++    void mpd_sendEnableOutputCommand(mpd_Connection * connection, int outputId);
++
++    void mpd_sendDisableOutputCommand(mpd_Connection * connection, int outputId);
++
++    void mpd_freeOutputElement(mpd_OutputEntity * output);
++
++/**
++ * @param connection a #mpd_Connection
++ *
++ * Queries mpd for the allowed commands
++ */
++    void mpd_sendCommandsCommand(mpd_Connection * connection);
++
++/**
++ * @param connection a #mpd_Connection
++ *
++ * Queries mpd for the not allowed commands
++ */
++    void mpd_sendNotCommandsCommand(mpd_Connection * connection);
++
++/**
++ * @param connection a #mpd_Connection
++ *
++ * returns the next supported command.
++ *
++ * @returns a string, needs to be free'ed
++ */
++    char *mpd_getNextCommand(mpd_Connection * connection);
++
++    void mpd_sendUrlHandlersCommand(mpd_Connection * connection);
++
++    char *mpd_getNextHandler(mpd_Connection * connection);
++
++    void mpd_sendTagTypesCommand(mpd_Connection * connection);
++
++    char *mpd_getNextTagType(mpd_Connection * connection);
++
++/**
++ * @param connection a MpdConnection
++ * @param path        the path to the playlist.
++ *
++ * List the content, with full metadata, of a stored playlist.
++ *
++ */
++    void mpd_sendListPlaylistInfoCommand(mpd_Connection * connection, char *path);
++
++/**
++ * @param connection a MpdConnection
++ * @param path        the path to the playlist.
++ *
++ * List the content of a stored playlist.
++ *
++ */
++    void mpd_sendListPlaylistCommand(mpd_Connection * connection, char *path);
++
++/**
++ * @param connection a #mpd_Connection
++ * @param exact if to match exact
++ *
++ * starts a search, use mpd_addConstraintSearch to add
++ * a constraint to the search, and mpd_commitSearch to do the actual search
++ */
++    void mpd_startSearch(mpd_Connection * connection, int exact);
++
++/**
++ * @param connection a #mpd_Connection
++ * @param type
++ * @param name
++ */
++    void mpd_addConstraintSearch(mpd_Connection * connection, int type, const char *name);
++
++/**
++ * @param connection a #mpd_Connection
++ */
++    void mpd_commitSearch(mpd_Connection * connection);
++
++/**
++ * @param connection a #mpd_Connection
++ * @param type The type to search for
++ *
++ * starts a search for fields... f.e. get a list of artists would be:
++ * @code
++ * mpd_startFieldSearch(connection, MPD_TAG_ITEM_ARTIST);
++ * mpd_commitSearch(connection);
++ * @endcode
++ *
++ * or get a list of artist in genre "jazz" would be:
++ * @code
++ * mpd_startFieldSearch(connection, MPD_TAG_ITEM_ARTIST);
++ * mpd_addConstraintSearch(connection, MPD_TAG_ITEM_GENRE, "jazz")
++ * mpd_commitSearch(connection);
++ * @endcode
++ *
++ * mpd_startSearch will return  a list of songs (and you need mpd_getNextInfoEntity)
++ * this one will return a list of only one field (the one specified with type) and you need
++ * mpd_getNextTag to get the results
++ */
++    void mpd_startFieldSearch(mpd_Connection * connection, int type);
++
++    void mpd_startPlaylistSearch(mpd_Connection * connection, int exact);
++
++    void mpd_startStatsSearch(mpd_Connection * connection);
++
++    void mpd_sendPlaylistClearCommand(mpd_Connection * connection, char *path);
++
++    void mpd_sendPlaylistAddCommand(mpd_Connection * connection, char *playlist, char *path);
++
++    void mpd_sendPlaylistMoveCommand(mpd_Connection * connection, char *playlist, int from, int to);
++
++    void mpd_sendPlaylistDeleteCommand(mpd_Connection * connection, char *playlist, int pos);
++#ifdef __cplusplus
++}
++#endif
++#endif
diff --git a/utils/lcd4linux/patches/160-uinput_defs.patch b/utils/lcd4linux/patches/160-uinput_defs.patch
new file mode 100644 (file)
index 0000000..44b24b3
--- /dev/null
@@ -0,0 +1,24 @@
+--- a/drv_G15.c
++++ b/drv_G15.c
+@@ -42,6 +42,7 @@
+ #include <usb.h>
+ #include <fcntl.h>
++#include <linux/version.h>
+ #include <linux/input.h>
+ #include <linux/uinput.h>
+@@ -269,8 +270,13 @@ void drv_G15_initKeyHandling(char *devic
+     }
+     memset(&device, 0, sizeof(device));
+     strncpy(device.name, "G15 Keys", UINPUT_MAX_NAME_SIZE);
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+     device.id.bustype = BUS_USB;
+     device.id.version = 4;
++#else
++    device.idbus = BUS_USB;
++    device.idversion = 4;
++#endif
+     ioctl(uinput_fd, UI_SET_EVBIT, EV_KEY);
diff --git a/utils/lcd4linux/patches/170-add-generic-spidev-driver.patch b/utils/lcd4linux/patches/170-add-generic-spidev-driver.patch
new file mode 100644 (file)
index 0000000..4cd53d6
--- /dev/null
@@ -0,0 +1,195 @@
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -71,6 +71,8 @@ drv_generic_i2c.c             \
+ drv_generic_i2c.h             \
+ drv_generic_keypad.c          \
+ drv_generic_keypad.h          \
++drv_generic_spidev.c          \
++drv_generic_spidev.h          \
+ drv_ASTUSB.c                  \
+ drv_BeckmannEgle.c            \
+ drv_BWCT.c                    \
+--- /dev/null
++++ b/drv_generic_spidev.c
+@@ -0,0 +1,89 @@
++/* $Id$
++ * $URL$
++ *
++ * generic driver helper for displays connected via SPI bus
++ *
++ * Copyright (C) 2012 Gabor Juhos <juhosg@openwrt.org>
++ *
++ * This file is part of LCD4Linux.
++ *
++ * LCD4Linux 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, or (at your option)
++ * any later version.
++ *
++ * LCD4Linux is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ */
++
++#include "config.h"
++
++#include <stdlib.h>
++#include <stdio.h>
++#include <string.h>
++#include <errno.h>
++#include <unistd.h>
++#include <fcntl.h>
++#include <sys/types.h>
++#include <sys/ioctl.h>
++
++#include "debug.h"
++#include "qprintf.h"
++#include "cfg.h"
++#include "drv_generic_spidev.h"
++
++static char *generic_spidev_section = "";
++static char *generic_spidev_driver = "";
++static int generic_spidev_fd;
++
++int drv_generic_spidev_open(const char *section, const char *driver)
++{
++    char *spidev;
++
++    udelay_init();
++
++    generic_spidev_section = (char *) section;
++    generic_spidev_driver = (char *) driver;
++
++    spidev = cfg_get(generic_spidev_section, "Port", NULL);
++
++    info("%s: initializing SPI device %s", generic_spidev_driver, spidev);
++    generic_spidev_fd = open(spidev, O_WRONLY);
++    if (generic_spidev_fd < 0) {
++      error("%s: unable to open SPI device %s!\n", generic_spidev_driver, spidev);
++      goto exit_error;
++    }
++
++    return 0;
++
++  exit_error:
++    free(spidev);
++    return -1;
++}
++
++int drv_generic_spidev_close(void)
++{
++    close(generic_spidev_fd);
++    return 0;
++}
++
++int drv_generic_spidev_transfer(const int count, struct spi_ioc_transfer *tr)
++{
++    int ret;
++
++    ret = ioctl(generic_spidev_fd, SPI_IOC_MESSAGE(count), tr);
++    if (ret < count) {
++      error("%s: can't send SPI message! (%s)\n",
++              generic_spidev_driver, strerror(errno));
++      return -1;
++    }
++
++    return 0;
++}
+--- /dev/null
++++ b/drv_generic_spidev.h
+@@ -0,0 +1,54 @@
++/* $Id$
++ * $URL$
++ *
++ * generic driver helper for displays connected via SPI bus
++ *
++ * Copyright (C) 2012 Gabor Juhos <juhosg@openwrt.org>
++ * Copyright (C) 2012 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
++ *
++ * This file is part of LCD4Linux.
++ *
++ * LCD4Linux 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, or (at your option)
++ * any later version.
++ *
++ * LCD4Linux is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ */
++
++/*
++ *
++ * exported fuctions:
++ *
++ * int drv_generic_spidev_open (const char *section, const char *driver)
++ *   reads 'Port' entry from config and opens
++ *   the SPI device
++ *   returns 0 if ok, -1 on failure
++ *
++ * int drv_generic_spidev_close (void)
++ *   closes SPI device
++ *   returns 0 if ok, -1 on failure
++ *
++ * void drv_generic_spidev_transfer (int count, struct spi_ioc_transfer *tr)
++ *   transfer data to/from the SPI device
++ *
++ */
++
++#ifndef _DRV_GENERIC_SPIDEV_H_
++#define _DRV_GENERIC_SPIDEV_H_
++
++#include <linux/spi/spidev.h>
++
++int drv_generic_spidev_open(const char *section, const char *driver);
++int drv_generic_spidev_close(void);
++int drv_generic_spidev_transfer(const int count, struct spi_ioc_transfer *tr);
++
++#endif /* _DRV_GENERIC_SPIDEV_H_ */
+--- a/drivers.m4
++++ b/drivers.m4
+@@ -301,6 +301,7 @@ PARPORT="no"
+ SERIAL="no"
+ I2C="no"
+ KEYPAD="no"
++SPIDEV="no"
+ # generic libraries
+ LIBUSB="no"
+@@ -936,6 +937,12 @@ if test "$LIBJPEG" = "yes"; then
+    DRVLIBS="$DRVLIBS -ljpeg"
+ fi
++# generic spidev driver
++if test "$SPIDEV" = "yes"; then
++   DRIVERS="$DRIVERS drv_generic_spidev.o"
++   AC_DEFINE(WITH_SPIDEV, 1, [SPIDEV driver])
++fi
++
+ # libusb
+ if test "$LIBUSB" = "yes"; then
+    DRVLIBS="$DRVLIBS -lusb"
+--- a/configure.ac
++++ b/configure.ac
+@@ -115,6 +115,9 @@ AC_ARG_WITH(outb,
+ AC_CHECK_HEADERS([asm/io.h] [linux/parport.h linux/ppdev.h], [has_parport="true"], [has_parport="false"])
++# check for spidev
++AC_CHECK_HEADERS([linux/spi/spidev.h], [has_spidev="true"], [has_spidev="false"])
++
+ # drivers
+ sinclude(drivers.m4)
diff --git a/utils/lcd4linux/patches/171-allow-to-specify-drv_generic_graphic_real_clear.patch b/utils/lcd4linux/patches/171-allow-to-specify-drv_generic_graphic_real_clear.patch
new file mode 100644 (file)
index 0000000..5a26643
--- /dev/null
@@ -0,0 +1,45 @@
+--- a/drv_generic_graphic.c
++++ b/drv_generic_graphic.c
+@@ -24,7 +24,7 @@
+  *
+  */
+-/* 
++/*
+  *
+  * exported functions:
+  *
+@@ -98,6 +98,9 @@ static int INVERTED = 0;
+ /* must be implemented by the real driver */
+ void (*drv_generic_graphic_real_blit) () = NULL;
++/* can be implemented by the real driver */
++void (*drv_generic_graphic_real_clear) () = NULL;
++
+ /****************************************/
+ /*** generic Framebuffer stuff        ***/
+@@ -691,7 +694,10 @@ int drv_generic_graphic_clear(void)
+       for (i = 0; i < LCOLS * LROWS; i++)
+           drv_generic_graphic_FB[l][i] = NO_COL;
+-    drv_generic_graphic_blit(0, 0, LROWS, LCOLS);
++    if (drv_generic_graphic_real_clear)
++      drv_generic_graphic_real_clear(NO_COL);
++    else
++      drv_generic_graphic_blit(0, 0, LROWS, LCOLS);
+     return 0;
+ }
+--- a/drv_generic_graphic.h
++++ b/drv_generic_graphic.h
+@@ -40,6 +40,9 @@ extern RGBA NO_COL;          /* no color (comple
+ /* these functions must be implemented by the real driver */
+ extern void (*drv_generic_graphic_real_blit) (const int row, const int col, const int height, const int width);
++/* these functions can be implemented by the real driver */
++void (*drv_generic_graphic_real_clear) (const RGBA rgba);
++
+ /* helper function to get pixel color or gray value */
+ extern RGBA drv_generic_graphic_rgb(const int row, const int col);
+ extern unsigned char drv_generic_graphic_gray(const int row, const int col);
diff --git a/utils/lcd4linux/patches/172-add-TEW673GRU-driver.patch b/utils/lcd4linux/patches/172-add-TEW673GRU-driver.patch
new file mode 100644 (file)
index 0000000..428465c
--- /dev/null
@@ -0,0 +1,552 @@
+--- a/drivers.m4
++++ b/drivers.m4
+@@ -39,7 +39,7 @@ AC_ARG_WITH(
+   [                        Newhaven, Noritake, NULL, Pertelian, PHAnderson,]
+   [                        PICGraphic, picoLCD, picoLCDGraphic, PNG, PPM, RouterBoard,]
+   [                        Sample, SamsungSPF, serdisplib, ShuttleVFD, SimpleLCD, st2205, T6963,]
+-  [                        TeakLCM, Trefon, ULA200, USBHUB, USBLCD, VNC, WincorNixdorf, X11],
++  [                        TeakLCM, TEW673GRU, Trefon, ULA200, USBHUB, USBLCD, VNC, WincorNixdorf, X11],
+   drivers=$withval,
+   drivers=all
+ )
+@@ -107,6 +107,7 @@ for driver in $drivers; do
+        SHUTTLEVFD="yes"
+          SIMPLELCD="yes"
+          T6963="yes"
++         TEW673GRU="yes"
+          TeakLCM="yes"
+          Trefon="yes"
+          ULA200="yes"
+@@ -260,6 +261,9 @@ for driver in $drivers; do
+       TeakLCM)
+          TeakLCM=$val
+          ;;
++      TEW673GRU)
++         TEW673GRU=$val
++         ;;
+       Trefon)
+          Trefon=$val
+          ;;
+@@ -797,6 +801,18 @@ if test "$TeakLCM" = "yes"; then
+    AC_DEFINE(WITH_TEAK_LCM,1,[TeakLCM driver])
+ fi
++if test "$TEW673GRU" = "yes"; then
++   if test "$has_spidev" = "true"; then
++      GRAPHIC="yes"
++      TEXT="yes"
++      SPIDEV="yes"
++      DRIVERS="$DRIVERS drv_TEW673GRU.o"
++      AC_DEFINE(WITH_TEW673GRU,1,[TEW673GRU driver])
++   else
++      AC_MSG_WARN(linux/spi/spidev.h not found: TEW673GRU driver disabled)
++   fi
++fi
++
+ if test "$Trefon" = "yes"; then
+    if test "$has_usb" = "true"; then
+       TEXT="yes"
+--- a/drv.c
++++ b/drv.c
+@@ -92,6 +92,7 @@ extern DRIVER drv_serdisplib;
+ extern DRIVER drv_ShuttleVFD;
+ extern DRIVER drv_SimpleLCD;
+ extern DRIVER drv_T6963;
++extern DRIVER drv_TEW673GRU;
+ extern DRIVER drv_TeakLCM;
+ extern DRIVER drv_Trefon;
+ extern DRIVER drv_ula200;
+@@ -248,6 +249,9 @@ DRIVER *Driver[] = {
+ #ifdef WITH_TEAK_LCM
+     &drv_TeakLCM,
+ #endif
++#ifdef WITH_TEW673GRU
++    &drv_TEW673GRU,
++#endif
+ #ifdef WITH_TREFON
+     &drv_Trefon,
+ #endif
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -119,6 +119,7 @@ drv_ShuttleVFD.c              \
+ drv_SimpleLCD.c               \
+ drv_T6963.c                   \
+ drv_TeakLCM.c                 \
++drv_TEW673GRU.c               \
+ drv_Trefon.c                  \
+ drv_ula200.c                  \
+ drv_USBHUB.c                  \
+--- /dev/null
++++ b/drv_TEW673GRU.c
+@@ -0,0 +1,457 @@
++/* $Id$
++ * $URL$
++ *
++ * TRENDnet TEW673GRU LCD4linux driver
++ *
++ * Copyright (C) 2012 Gabor Juhos <juhosg@openwrt.org>
++ *
++ * based on the Sample driver which is:
++ * Copyright (C) 2005 Michael Reinelt <michael@reinelt.co.at>
++ * Copyright (C) 2005, 2006, 2007 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
++ *
++ * This file is part of LCD4Linux.
++ *
++ * LCD4Linux 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, or (at your option)
++ * any later version.
++ *
++ * LCD4Linux is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ */
++
++/*
++ * exported fuctions:
++ *
++ * struct DRIVER drv_TEW673GRU
++ */
++
++#include "config.h"
++
++#include <stdlib.h>
++#include <stdio.h>
++#include <unistd.h>
++#include <string.h>
++#include <errno.h>
++
++#include "debug.h"
++#include "cfg.h"
++#include "qprintf.h"
++#include "udelay.h"
++#include "plugin.h"
++#include "widget.h"
++#include "widget_text.h"
++#include "widget_icon.h"
++#include "widget_bar.h"
++#include "drv.h"
++
++#include "drv_generic_text.h"
++#include "drv_generic_graphic.h"
++#include "drv_generic_spidev.h"
++
++#ifdef WITH_DMALLOC
++#include <dmalloc.h>
++#endif
++
++#define TEW673GRU_NUM_COLS    220
++#define TEW673GRU_NUM_ROWS    176
++#define TEW673GRU_BPP         2       /* bytes per pixel */
++
++#define TEW673GRU_CMD_SIZE    9
++#define TEW673GRU_NUM_ROW_BYTES (TEW673GRU_NUM_COLS * TEW673GRU_BPP)
++
++enum {
++      CMD_SHOW_STRING         = 49,
++      CMD_SHOW_IMAGE_DIR      = 52,
++      CMD_SCREEN_COLOR        = 54,
++};
++
++static char Name[] = "TEW673GRU";
++
++static char *drv_TEW673GRU_FB;
++static long FB_SIZE;
++static int MODE;
++
++static unsigned int RGBAto16(RGBA rgb)
++{
++    return (((rgb.R >> 3) << 11) | ((rgb.G >> 2) << 5) | (rgb.B >> 3));
++}
++
++static unsigned char color_msb(unsigned int color)
++{
++    return color >> 8;
++}
++
++static unsigned char color_lsb(unsigned int color)
++{
++    return color & 0xff;
++}
++
++static void drv_TEW673GRU_hw_clear(const unsigned int color)
++{
++    unsigned char cmd[TEW673GRU_CMD_SIZE];
++    struct spi_ioc_transfer tr[1];
++
++    memset(tr, '\0', sizeof(tr));
++    memset(cmd, '\0', sizeof(cmd));
++
++    cmd[0] = CMD_SCREEN_COLOR;
++    cmd[7] = color_msb(color);
++    cmd[8] = color_lsb(color);
++
++    tr[0].tx_buf = (unsigned long) cmd;
++    tr[0].len = sizeof(cmd);
++
++    drv_generic_spidev_transfer(1, tr);
++}
++
++static void drv_TEW673GRU_hw_send_row(const int row, const int col, const char *data, const int width)
++{
++    unsigned char cmd[TEW673GRU_CMD_SIZE];
++    struct spi_ioc_transfer tr[2];
++    int datasize;
++
++    memset(tr, '\0', sizeof(tr));
++    memset(cmd, '\0', sizeof(cmd));
++
++    datasize =  width * TEW673GRU_BPP;
++
++    cmd[0] = CMD_SHOW_IMAGE_DIR;
++    cmd[1] = col;
++    cmd[2] = col + width;
++    cmd[3] = row;
++    cmd[4] = row;
++    cmd[5] = datasize >> 8;
++    cmd[6] = datasize & 0xff;
++
++    tr[0].tx_buf = (unsigned long) cmd;
++    tr[0].len = sizeof(cmd);
++    tr[1].tx_buf = (unsigned long) data;
++    tr[1].len = datasize;
++
++    drv_generic_spidev_transfer(2, tr);
++}
++
++static void drv_TEW673GRU_hw_write_string(const int row, const int col, const char *data, const int datasize)
++{
++    unsigned char cmd[TEW673GRU_CMD_SIZE];
++    struct spi_ioc_transfer tr[2];
++    unsigned char len;
++
++    memset(tr, '\0', sizeof(tr));
++    memset(cmd, '\0', sizeof(cmd));
++
++    len = datasize & 0xff;
++    cmd[0] = CMD_SHOW_STRING;
++    cmd[1] = col;
++    cmd[2] = col + (XRES * len);
++    cmd[3] = row;
++    cmd[4] = row + YRES;
++    cmd[7] = 0;
++    cmd[8] = len;
++
++    tr[0].tx_buf = (unsigned long) cmd;
++    tr[0].len = sizeof(cmd);
++    tr[1].tx_buf = (unsigned long) data;
++    tr[1].len = datasize;
++
++    drv_generic_spidev_transfer(2, tr);
++}
++
++static void drv_TEW673GRU_FB_set_pixel(const int col, const unsigned int color)
++{
++    int pos;
++
++    pos = col * TEW673GRU_BPP;
++    drv_TEW673GRU_FB[pos] = color_msb(color);
++    drv_TEW673GRU_FB[pos + 1] = color_lsb(color);
++}
++
++static void drv_TEW673GRU_blit(const int row, const int col, const int height, const int width)
++{
++    int r, c;
++
++    debug("%s: update area r:%d c:%d w:%d h:%d", Name, row, col, height, width);
++
++    for (r = row; r < row + height; r++) {
++      for (c = col; c < col + width; c++) {
++          unsigned int color;
++          RGBA rgb;
++
++          rgb = drv_generic_graphic_rgb(r, c);
++          color = RGBAto16(rgb);
++            drv_TEW673GRU_FB_set_pixel(c, color);
++      }
++
++      if (width) {
++          char *data;
++
++          data = &drv_TEW673GRU_FB[col * TEW673GRU_BPP];
++          drv_TEW673GRU_hw_send_row(r, col, data, width);
++          udelay(100 + width * 50);
++      }
++    }
++}
++
++static void drv_TEW673GRU_clear(RGBA rgba)
++{
++    unsigned int color;
++
++    color = RGBAto16(rgba);
++    drv_TEW673GRU_hw_clear(color);
++}
++
++static void drv_TEW673GRU_write(const int row, const int col, const char *data, const int len)
++{
++    int i;
++
++    for (i = 0; i < len; i++) {
++      drv_TEW673GRU_hw_write_string(row * YRES, (col + i) * XRES, " ", 1);
++      udelay(10000);
++      drv_TEW673GRU_hw_write_string(row * YRES, 2 + (col + i) * XRES, " ", 1);
++      udelay(10000);
++      drv_TEW673GRU_hw_write_string(row * YRES, (col + i) * XRES, &data[i], 1);
++      udelay(10000);
++    }
++}
++
++static int drv_TEW673GRU_open(const char *section)
++{
++    int err;
++
++    err = drv_generic_spidev_open(section, Name);
++    if (err < 0)
++      return err;
++
++    return 0;
++}
++
++static int drv_TEW673GRU_close(void)
++{
++    drv_generic_spidev_close();
++    return 0;
++}
++
++static void drv_TEW673GRU_clear_screen(void)
++{
++    if (MODE) {
++      drv_generic_graphic_clear();
++    } else {
++      memset(drv_TEW673GRU_FB, ' ', FB_SIZE);
++      drv_TEW673GRU_hw_clear(0x0000);
++    }
++}
++
++static int drv_TEW673GRU_init_font(const char *section)
++{
++    char *font;
++    int ret = -1;
++
++    font = cfg_get(section, "Font", "6x8");
++    if (font == NULL) {
++      error("%s: no '%s.Font' entry from %s", Name, section, cfg_source());
++      goto out;
++    }
++
++    if (*font == '\0') {
++      error("%s: invalid '%s.Font' entry in %s", Name, section, cfg_source());
++      goto out_free;
++    }
++
++    XRES = -1;
++    YRES = -1;
++    if (sscanf(font, "%dx%d", &XRES, &YRES) != 2 ||
++      XRES < 1 ||
++      YRES < 1) {
++      error("%s: bad Font '%s' from %s", Name, font, cfg_source());
++      goto out_free;
++    }
++
++    if (XRES != 6 && YRES != 8) {
++      error("%s: bad Font '%s' from %s (only 6x8 at the moment)",
++            Name, font, cfg_source());
++      goto out_free;
++    }
++
++    error("%s: font '%s' selected", Name, font);
++
++    ret = 0;
++
++out_free:
++    free(font);
++out:
++    return ret;
++}
++
++static int drv_TEW673GRU_start(const char *section)
++{
++    int ret;
++
++    DCOLS = TEW673GRU_NUM_COLS;
++    DROWS = TEW673GRU_NUM_ROWS;
++
++    if (MODE) {
++      ret = drv_TEW673GRU_init_font(section);
++      if (ret)
++          goto err;
++
++      FB_SIZE = DCOLS * TEW673GRU_BPP;
++    } else {
++      XRES = 10;
++      YRES = 16;
++      DCOLS = DCOLS / XRES;
++      DROWS = DROWS / YRES;
++
++      FB_SIZE = DCOLS * DROWS;
++    }
++
++    if (FB_SIZE) {
++      drv_TEW673GRU_FB = malloc(FB_SIZE);
++      if (drv_TEW673GRU_FB == NULL) {
++          error("%s: framebuffer could not be allocated", Name);
++          goto err;
++      }
++    }
++
++    ret = drv_TEW673GRU_open(section);
++    if (ret < 0)
++        goto err_free;
++
++    if (MODE == 0)
++      drv_TEW673GRU_clear_screen();
++
++    return 0;
++
++ err_free:
++    if (drv_TEW673GRU_FB)
++      free(drv_TEW673GRU_FB);
++ err:
++    return -1;
++}
++
++static int drv_TEW673GRU_greet(const char *msg1, const char *msg2)
++{
++    if (MODE)
++      return drv_generic_graphic_greet(msg1, msg2);
++
++    return drv_generic_text_greet(msg1, msg2);
++}
++
++
++/****************************************/
++/***        widget callbacks          ***/
++/****************************************/
++
++
++/* using drv_generic_text_draw(W) */
++/* using drv_generic_text_icon_draw(W) */
++/* using drv_generic_text_bar_draw(W) */
++/* using drv_generic_gpio_draw(W) */
++
++
++/****************************************/
++/***        exported functions        ***/
++/****************************************/
++
++int drv_TEW673GRU_list(void)
++{
++    printf("TEW673GRU driver");
++    return 0;
++}
++
++int drv_TEW673GRU_init(const char *section, const int quiet)
++{
++    WIDGET_CLASS wc;
++    int ret;
++
++    cfg_number(section, "Mode", 0, 0, 1, &MODE);
++
++    if (MODE) {
++      drv_generic_graphic_real_blit = drv_TEW673GRU_blit;
++      drv_generic_graphic_real_clear = drv_TEW673GRU_clear;
++    } else {
++      drv_generic_text_real_write = drv_TEW673GRU_write;
++    }
++
++    ret = drv_TEW673GRU_start(section);
++    if (ret)
++      return ret;
++
++    if (MODE) {
++      ret = drv_generic_graphic_init(section, Name);
++      if (ret)
++          return ret;
++    } else {
++      ret = drv_generic_text_init(section, Name);
++      if (ret)
++          return ret;
++
++      ret = drv_generic_text_icon_init();
++      if (ret != 0)
++          return ret;
++
++      ret = drv_generic_text_bar_init(1);
++      if (ret != 0)
++          return ret;
++
++      drv_generic_text_bar_add_segment(0, 0, 255, ' ');
++      drv_generic_text_bar_add_segment(255, 255, 255, '#');
++
++      wc = Widget_Text;
++      wc.draw = drv_generic_text_draw;
++      widget_register(&wc);
++
++      wc = Widget_Icon;
++      wc.draw = drv_generic_text_icon_draw;
++      widget_register(&wc);
++
++      wc = Widget_Bar;
++      wc.draw = drv_generic_text_bar_draw;
++      widget_register(&wc);
++    }
++
++    if (!quiet) {
++      char buffer[40];
++      qprintf(buffer, sizeof(buffer), "%s %dx%d", Name, DCOLS, DROWS);
++      drv_TEW673GRU_greet(buffer, "www.openwrt.org");
++      sleep(3);
++      drv_TEW673GRU_clear_screen();
++    }
++
++    return 0;
++}
++
++int drv_TEW673GRU_quit(const int quiet)
++{
++
++    info("%s: shutting down.", Name);
++
++    drv_TEW673GRU_clear_screen();
++
++    if (!quiet)
++      drv_TEW673GRU_greet("goodbye!", NULL);
++
++    if (MODE)
++      drv_generic_graphic_quit();
++    else
++      drv_generic_text_quit();
++
++    debug("closing connection");
++    drv_TEW673GRU_close();
++
++    return (0);
++}
++
++DRIVER drv_TEW673GRU = {
++    .name = Name,
++    .list = drv_TEW673GRU_list,
++    .init = drv_TEW673GRU_init,
++    .quit = drv_TEW673GRU_quit,
++};
+--- a/lcd4linux.conf.sample
++++ b/lcd4linux.conf.sample
+@@ -581,6 +581,11 @@ Display FutabaVFD {
+     }
+ }
++Display TEW673GRU {
++    Driver       'TEW673GRU'
++    Font         '6x8'
++    Port         '/dev/spidev1.0'
++}
+ #Plugin KVV {
+ #    StationID '12_701'
index 02faccb156d6f612e62a1aedd5b1a7f1f570a500..4dcea0cafbcb122d6dedd20fb2d301360852fdbf 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2006-2014 OpenWrt.org
+# Copyright (C) 2006-2015 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:=lm-sensors
 PKG_VERSION:=3.3.5
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=lm_sensors-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_URL:=http://dl.lm-sensors.org/lm-sensors/releases
diff --git a/utils/lm-sensors/patches/100-musl-compat.patch b/utils/lm-sensors/patches/100-musl-compat.patch
new file mode 100644 (file)
index 0000000..1cd82ab
--- /dev/null
@@ -0,0 +1,44 @@
+--- a/prog/dump/isadump.c
++++ b/prog/dump/isadump.c
+@@ -38,7 +38,7 @@
+ /* To keep glibc2 happy */
+-#if defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ >= 0
++#if !defined(__UCLIBC__)
+ #include <sys/io.h>
+ #else
+ #include <asm/io.h>
+--- a/prog/dump/isaset.c
++++ b/prog/dump/isaset.c
+@@ -34,7 +34,7 @@
+ /* To keep glibc2 happy */
+-#if defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ >= 0
++#if !defined(__UCLIBC__)
+ #include <sys/io.h>
+ #else
+ #include <asm/io.h>
+--- a/prog/dump/superio.c
++++ b/prog/dump/superio.c
+@@ -21,7 +21,7 @@
+ #include <stdlib.h>
+-#if defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ >= 0
++#if !defined(__UCLIBC__)
+ #include <sys/io.h>
+ #else
+ #include <asm/io.h>
+--- a/prog/dump/util.c
++++ b/prog/dump/util.c
+@@ -12,7 +12,7 @@
+ #include "util.h"
+ /* To keep glibc2 happy */
+-#if defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ >= 0
++#if !defined(__UCLIBC__)
+ #include <sys/io.h>
+ #else
+ #include <asm/io.h>
index 2bc8c9231f383c50abb50fda4e60172937f5412e..b035d197092c5a6d59815151b4900af3cd4a6075 100644 (file)
@@ -9,13 +9,13 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=LVM2
-PKG_VERSION:=2.02.122
+PKG_VERSION:=2.02.125
 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
-PKG_MD5SUM:=a88bf7d68955635d009a5aec1ffecc48
+PKG_MD5SUM:=2d24ba982c8a85e8c837210f087a6a51
 PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME).$(PKG_VERSION)
 
@@ -74,10 +74,14 @@ endef
 
 define Package/lvm2/install
        $(INSTALL_DIR) $(1)/sbin
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/tools/lvm $(1)/sbin
+       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/lvm $(1)/sbin
+       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/dmsetup $(1)/sbin
        $(INSTALL_DIR) $(1)/etc/lvm
-       $(SED) '/^[[:space:]]*\(#\|$$$$\)/d; /cache_dir/s@.*@    cache_dir = "/tmp/lvm/cache"@' $(PKG_BUILD_DIR)/conf/example.conf
-       $(INSTALL_CONF) $(PKG_BUILD_DIR)/conf/example.conf $(1)/etc/lvm/lvm.conf
+       $(SED) '/^[[:space:]]*\(#\|$$$$\)/d; /cache_dir/s@.*@   cache_dir = "/tmp/lvm/cache"@' $(PKG_INSTALL_DIR)/etc/lvm/lvm.conf
+       $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/lvm/lvm.conf $(1)/etc/lvm/
+       $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/lvm/lvmlocal.conf $(1)/etc/lvm/
+       $(INSTALL_DIR) $(1)/etc/lvm/profile
+       $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/lvm/profile/* $(1)/etc/lvm/profile/
        $(INSTALL_DIR) $(1)/etc/init.d
        $(INSTALL_BIN) ./files/lvm2.init $(1)/etc/init.d/lvm2
        $(FIND) $(PKG_INSTALL_DIR)/usr/sbin/ -type l -exec $(CP) -a {} $(1)/sbin/ \;
index e7625b6c6a35428ea0abb78a4251b661be895ad6..d06f4eb0fbe7195ece5529ad5c6e53b7d92a4315 100644 (file)
@@ -1,6 +1,6 @@
 --- a/lib/commands/toolcontext.c
 +++ b/lib/commands/toolcontext.c
-@@ -1637,8 +1637,10 @@ struct cmd_context *create_toolcontext(u
+@@ -1690,8 +1690,10 @@ struct cmd_context *create_toolcontext(u
                                       unsigned threaded)
  {
        struct cmd_context *cmd;
@@ -11,7 +11,7 @@
  
  #ifdef M_MMAP_MAX
        mallopt(M_MMAP_MAX, 0);
-@@ -1674,7 +1676,7 @@ struct cmd_context *create_toolcontext(u
+@@ -1727,7 +1729,7 @@ struct cmd_context *create_toolcontext(u
        /* FIXME Make this configurable? */
        reset_lvm_errno(1);
  
@@ -20,7 +20,7 @@
        /* Set in/out stream buffering before glibc */
        if (set_buffering) {
                /* Allocate 2 buffers */
-@@ -2047,7 +2049,7 @@ void destroy_toolcontext(struct cmd_cont
+@@ -2100,7 +2102,7 @@ void destroy_toolcontext(struct cmd_cont
        if (cmd->libmem)
                dm_pool_destroy(cmd->libmem);
  
@@ -31,7 +31,7 @@
                if (is_valid_fd(STDIN_FILENO) &&
 --- a/tools/lvmcmdline.c
 +++ b/tools/lvmcmdline.c
-@@ -1635,6 +1635,7 @@ int lvm_split(char *str, int *argc, char
+@@ -1689,6 +1689,7 @@ int lvm_split(char *str, int *argc, char
  /* Make sure we have always valid filedescriptors 0,1,2 */
  static int _check_standard_fds(void)
  {
@@ -39,7 +39,7 @@
        int err = is_valid_fd(STDERR_FILENO);
  
        if (!is_valid_fd(STDIN_FILENO) &&
-@@ -1661,6 +1662,12 @@ static int _check_standard_fds(void)
+@@ -1715,6 +1716,12 @@ static int _check_standard_fds(void)
                       strerror(errno));
                return 0;
        }
index 667f1d1cbafb4a2aeadb3421de0d7439b7d26469..2bfcbbf2d94212f8882504861c93922b59fcc434 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=macchanger
 PKG_VERSION:=1.7.0
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://github.com/alobbs/macchanger/releases/download/$(PKG_VERSION)/
diff --git a/utils/macchanger/patches/0001-fix-build-with-musl.patch b/utils/macchanger/patches/0001-fix-build-with-musl.patch
new file mode 100644 (file)
index 0000000..4a30d55
--- /dev/null
@@ -0,0 +1,13 @@
+Index: macchanger-1.7.0/src/netinfo.c
+===================================================================
+--- macchanger-1.7.0.orig/src/netinfo.c
++++ macchanger-1.7.0/src/netinfo.c
+@@ -113,7 +113,7 @@ mc_net_info_get_permanent_mac (const net
+       epa->size = IFHWADDRLEN;
+       memcpy(&req, &(net->dev), sizeof(struct ifreq));
+-      req.ifr_data = (caddr_t)epa;
++      req.ifr_data = (char *)epa;
+       if (ioctl(net->sock, SIOCETHTOOL, &req) < 0) {
+               perror ("[ERROR] Could not read permanent MAC");
index ba5677ed3bacf618f53fd5bb5ada15e22edbcd2f..b588993e2a931f5bf2a4b1575c78fef6d3d10cf1 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=minicom
 PKG_VERSION:=2.7
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://alioth.debian.org/frs/download.php/file/3977/
@@ -27,7 +27,7 @@ include $(INCLUDE_DIR)/package.mk
 define Package/minicom
   SECTION:=utils
   CATEGORY:=Utilities
-  DEPENDS:=$(ICONV_DEPENDS) +libncurses
+  DEPENDS:=$(ICONV_DEPENDS) $(INTL_DEPENDS) +libncurses
   TITLE:=Terminal emulation program
   URL:=http://alioth.debian.org/projects/minicom/
   SUBMENU:=Terminal
index f0553a9d73eea94ed1d26dfb752bd35b54ebb22c..11d47d5635348ebb8ce45d5bd1ddae7a369da7e9 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2006-2014 OpenWrt.org
+# Copyright (C) 2006-2015 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -10,7 +10,7 @@ include $(INCLUDE_DIR)/uclibc++.mk
 
 PKG_NAME:=mysql
 PKG_VERSION:=5.1.73
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=\
index 48e61896ef952e98f2eaad22651d77f12499e0ff..eec96c08545e181fa11d31348019b4a78b7bea98 100644 (file)
@@ -13,7 +13,7 @@ error() {
 }
 
 start() {
-       local datadir=$(sed -n -e "s/^[[:space:]]*datadir[[:space:]]*=[[:space:]]*[\"']\?\([^\"']*\)[\"']\?/\1/p" /etc/my.cnf)
+       local datadir=$(sed -n -e "s/^[[:space:]]*datadir[[:space:]]*=[[:space:]\"']*\([^[:space:]\"']*\)[[:space:]\"']*/\1/p" /etc/my.cnf)
        if [ ! -d "$datadir" ]; then
                error "Error: datadir '$datadir' in /etc/my.cnf doesn't exist"
                return 1
index 1c8ef9d51db115420730f8cb86b89d2b1491a78d..74a9f995f3eb69a4a72cb30283b3f80726644fc1 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2013-2014 OpenWrt.org
+# Copyright (C) 2013-2015 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:=open-plc-utils
-PKG_VERSION:=2015-02-23
+PKG_VERSION:=2015-07-06
 PKG_RELEASE:=$(PKG_SOURCE_VERSION)
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL:=git://github.com/qca/open-plc-utils.git
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
-PKG_SOURCE_VERSION:=1f6e7e372b313cf570aa63314037588ed01ec0de
+PKG_SOURCE_VERSION:=885a1b7e2e663b5ab8797db6d40a0318131fdf18
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
 
 PKG_MAINTAINER:=Florian Fainelli <florian@openwrt.org>
diff --git a/utils/open-plc-utils/patches/100-musl-compat.patch b/utils/open-plc-utils/patches/100-musl-compat.patch
new file mode 100644 (file)
index 0000000..c20c0a1
--- /dev/null
@@ -0,0 +1,33 @@
+--- a/ether/readpacket.c
++++ b/ether/readpacket.c
+@@ -70,6 +70,10 @@
+ #include <memory.h>
+ #include <errno.h>
++#if defined (__linux__)
++#include <poll.h>
++#endif
++
+ #include "../ether/channel.h"
+ #include "../tools/memory.h"
+ #include "../tools/error.h"
+@@ -95,8 +99,6 @@ ssize_t readpacket (struct channel const
+ #elif defined (__linux__)
+-#include <sys/poll.h>
+-
+       struct pollfd pollfd =
+       {
+               channel->fd,
+--- a/serial/serial.c
++++ b/serial/serial.c
+@@ -69,6 +69,8 @@
+ #if defined (WIN32)
+ #include <Windows.h>
++#else
++#include <sys/select.h>
+ #endif
+ /*====================================================================*
index 634121424c3032f7d602c829826b3bbd6b9408ea..80524d30f8d5fff69d431e3ca602b8d484030b50 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=screen
-PKG_VERSION:=4.2.1
-PKG_RELEASE:=3
+PKG_VERSION:=4.3.1
+PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=@GNU/screen
-PKG_MD5SUM:=419a0594e2b25039239af8b90eda7d92
+PKG_MD5SUM:=5bb3b0ff2674e29378c31ad3411170ad
 
 PKG_LICENSE:=GPL-3.0+
 PKG_LICENSE_FILES:=
index b4bc30797c9d4a6277b58c4e0861101e4def2181..d9662b4f0a38c815ff7273c2d111f5d1fe337cbd 100644 (file)
@@ -9,7 +9,7 @@
  } # as_fn_error
  
  if expr a : '\(a\)' >/dev/null 2>&1 &&
-@@ -5941,8 +5941,6 @@ else
+@@ -5942,8 +5942,6 @@ else
  fi
  rm -f core conftest.err conftest.$ac_objext \
      conftest$ac_exeext conftest.$ac_ext
@@ -18,7 +18,7 @@
  oldlibs="$LIBS"
  LIBS="$LIBS -lsun"
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking IRIX sun library..." >&5
-@@ -7023,7 +7021,7 @@ as_fn_error ()
+@@ -7024,7 +7022,7 @@ as_fn_error ()
      $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
    fi
    $as_echo "$as_me: error: $2" >&2
index 2586bb9843898a3fe692bd6a3e8c9697aca2d796..cd783bde38e17bcadd02770e56543dfc474e3239 100644 (file)
@@ -1,3 +1,50 @@
+--- a/configure
++++ b/configure
+@@ -4155,44 +4155,6 @@ fi
+ rm -f conftest*
+-oldlibs="$LIBS"
+-LIBS="$LIBS -lelf"
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking SVR4..." >&5
+-$as_echo "$as_me: checking SVR4..." >&6;}
+-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+-/* end confdefs.h.  */
+-#include <utmpx.h>
+-
+-int
+-main ()
+-{
+-
+-  ;
+-  return 0;
+-}
+-_ACEOF
+-if ac_fn_c_try_link "$LINENO"; then :
+-  ac_fn_c_check_header_mongrel "$LINENO" "dwarf.h" "ac_cv_header_dwarf_h" "$ac_includes_default"
+-if test "x$ac_cv_header_dwarf_h" = xyes; then :
+-  $as_echo "#define SVR4 1" >>confdefs.h
+- $as_echo "#define BUGGYGETLOGIN 1" >>confdefs.h
+-
+-else
+-  ac_fn_c_check_header_mongrel "$LINENO" "elf.h" "ac_cv_header_elf_h" "$ac_includes_default"
+-if test "x$ac_cv_header_elf_h" = xyes; then :
+-  $as_echo "#define SVR4 1" >>confdefs.h
+- $as_echo "#define BUGGYGETLOGIN 1" >>confdefs.h
+-
+-fi
+-
+-
+-fi
+-
+-
+-
+-else
+-  LIBS="$oldlibs"
+-fi
+ rm -f core conftest.err conftest.$ac_objext \
+     conftest$ac_exeext conftest.$ac_ext
+ for ac_header in stropts.h string.h strings.h
 --- a/utmp.c
 +++ b/utmp.c
 @@ -33,6 +33,7 @@
index ad9bb11554e8ef50667d73f143b2f3c40de094e1..d56be82713f96467aebb8af9dd53ba98a92d8208 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2008-2014 OpenWrt.org
+# Copyright (C) 2008-2015 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:=shadow
 PKG_VERSION:=4.2.1
-PKG_RELEASE:=4
+PKG_RELEASE:=5
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=http://pkg-shadow.alioth.debian.org/releases
diff --git a/utils/shadow/patches/004-fix-su-controoling-term.patch b/utils/shadow/patches/004-fix-su-controoling-term.patch
new file mode 100644 (file)
index 0000000..4c130c7
--- /dev/null
@@ -0,0 +1,16 @@
+--- a/src/su.c
++++ b/src/su.c
+@@ -1090,8 +1090,12 @@
+               if (fd >= 0) {
+                       err = ioctl (fd, TIOCNOTTY, (char *) 0);
++                      if (-1 == err && ENOTTY == errno) {
++                              /* There are no controlling terminal already */
++                              err = 0;
++                      }
+                       (void) close (fd);
+-              } else if (ENXIO == errno) {
++              } else if (ENXIO == errno || EACCES == errno) {
+                       /* There are no controlling terminal already */
+                       err = 0;
+               }
index 2c68a4a0deed6d13015df91f3f66961f404cc994..8e2f7a2cf307b1fb905e4aa326cffe079d61f3af 100644 (file)
@@ -8,10 +8,14 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=tcsh
 PKG_VERSION:=6.19.00
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
-PKG_SOURCE_URL:=http://ftp.funet.fi/pub/mirrors/ftp.astron.com/pub/tcsh/
+PKG_SOURCE_URL:= \
+       http://ftp.funet.fi/pub/mirrors/ftp.astron.com/pub/tcsh/ \
+       http://ftp.funet.fi/pub/mirrors/ftp.astron.com/pub/tcsh/old/ \
+       ftp://ftp.astron.com/pub/tcsh/ \
+       ftp://ftp.astron.com/pub/tcsh/old
 PKG_MD5SUM:=f5f854833578647795bc906dd4bcb5d5
 PKG_LICENSE:=BSD-4-Clause-UC
 PKG_LICENSE_FILES:=Copyright