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
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
PKG_NAME:=sudo
PKG_VERSION:=1.8.13
-PKG_RELEASE:=1
+PKG_RELEASE:=2
PKG_LICENSE:=ISC
PKG_LICENSE_FILES:=doc/LICENSE
define Package/sudo/conffiles
/etc/sudoers
+/etc/sudoers.d/
endef
CONFIGURE_ARGS+= \
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
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}
-}
-# 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.
--- /dev/null
+--- 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()
#
-# 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.
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
CONFIGURE_VARS += \
ac_cv_func_mempcpy=n
-TARGET_CFLAGS += --std=c99
+TARGET_CFLAGS += --std=gnu99
define Package/diffutils/install
$(INSTALL_DIR) $(1)/usr/bin
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
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];
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;
#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. */
+ /*
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/ \
--disable-smp-support \
--without-javac
+HOST_CFLAGS += -D_GNU_SOURCE
+
define Host/Compile
$(MAKE) -C $(HOST_BUILD_DIR) all
endef
erl_xcomp_getaddrinfo=no \
erl_xcomp_sysroot="$(STAGING_DIR)"
+EXTRA_CFLAGS+=-D_GNU_SOURCE
EXTRA_LDFLAGS+=-lz
define Build/Compile
--- /dev/null
+--- 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);
#
-# 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.
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>
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
#
-# 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.
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>
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
--- /dev/null
+#
+# 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))
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
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
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
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
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
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
--- /dev/null
+#
+# 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))
--- /dev/null
+#
+# 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))
--- /dev/null
+#
+# 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))
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
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
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
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
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/
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
--- /dev/null
+#
+# 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))
--- /dev/null
+#
+# 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))
--- /dev/null
+#
+# 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))
--- /dev/null
+#
+# 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))
--- /dev/null
+#
+# 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))
--- /dev/null
+#
+# 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))
--- /dev/null
+#
+# 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))
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
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
--- /dev/null
+#
+# 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))
--- /dev/null
+#
+# 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))
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
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
--- /dev/null
+#
+# 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))
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
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
--- /dev/null
+#
+# 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))
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>
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
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
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
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>
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
--- /dev/null
+#
+# 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))
#
-# 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.
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>
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
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
+++ /dev/null
-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);
- }
-
- #-----------------------------------------------------------
+++ /dev/null
-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
--- /dev/null
+#
+# 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))
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)
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.
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
--- /dev/null
+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"
--- /dev/null
+--- 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"
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
true
endef
+define Package/boost/install
+ true
+endef
+
define Package/boost
$(call Package/boost/Default)
TITLE+= packages
$(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
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
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+
--- /dev/null
+#
+# 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))
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
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
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
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>
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
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/
--- /dev/null
+--- 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, ©Buffer);
+ 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)
+ {
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/
--- 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
#
-# 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.
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
--- 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,
#
-# 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.
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
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+
PKG_FIXUP:=autoreconf
PKG_BUILD_PARALLEL:=1
+PKG_FORTIFY_SOURCE:=0
PKG_INSTALL:=1
include $(INCLUDE_DIR)/package.mk
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/
#
-# 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.
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
---- 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.
case "$VERSION" in
dcosx*) SYSTEM=$VERSION;;
esac;;
-@@ -522,9 +522,9 @@
+@@ -522,9 +522,9 @@ EOF
esac
for name in nsl resolv
do
+ 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
}
--- /dev/null
+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
--- /dev/null
+#
+# 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))
--- /dev/null
+#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'
--- /dev/null
+#!/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
+}
#
-# 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.
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
--- /dev/null
+--- 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)
+ {
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/
--- /dev/null
+--- 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 */
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
__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
}
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"
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
option port '5353'
# option resolver 'opendns'
# option resolvers_list '/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv'
+ # option ephemeral_keys '1'
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() {
--- /dev/null
+#
+# 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))
#
-# 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.
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
--- /dev/null
+--- 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>
+
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
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
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 )
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
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
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
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
$(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,))
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"
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() {
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
}
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
--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 \
--- /dev/null
+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
+
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
+++ /dev/null
-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
-
+++ /dev/null
-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
-
+++ /dev/null
-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
-
+++ /dev/null
-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
-
+++ /dev/null
-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
-
+++ /dev/null
-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
-
+++ /dev/null
-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
-
+++ /dev/null
-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
-
+++ /dev/null
-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
-
+++ /dev/null
-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
-
+++ /dev/null
-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
-
+++ /dev/null
-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
-
+++ /dev/null
-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
-
+++ /dev/null
-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
-
+++ /dev/null
-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
-
+++ /dev/null
-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
-
+++ /dev/null
-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
-
+++ /dev/null
-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
-
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/
--- /dev/null
+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;
--- /dev/null
+#
+# 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))
--- /dev/null
+--- 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.
--- /dev/null
+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()
+
+ ######################################################################
--- /dev/null
+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"
--- /dev/null
+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
+
--- /dev/null
+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:
--- /dev/null
+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'])
--- /dev/null
+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'],
--- /dev/null
+--- 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'])
--- /dev/null
+--- 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')
--- /dev/null
+--- 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
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
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/
endef
define Package/ipsec-tools/conffiles
-/etc/racoon.conf
-/etc/racoon/psk.txt
+/etc/config/racoon
endef
$(eval $(call BuildPackage,ipsec-tools))
--- /dev/null
+#!/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
--- /dev/null
+#!/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
--- /dev/null
+#!/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
--- /dev/null
+#/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-----'
+++ /dev/null
-# 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;
-#}
#!/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
--- /dev/null
+#!/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
--- /dev/null
+--- 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");
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
--- /dev/null
+--- 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>
+
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+
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
SECTION:=net
CATEGORY:=Network
TITLE:=EIB KNX daemon
- DEPENDS:=+pthsem +libusb-1.0
+ DEPENDS:=+pthsem +libusb-1.0 +libstdcpp
endef
define Package/knxd/description
--without-libstdc
EXTRA_LDFLAGS+= \
- -fno-builtin -nodefaultlibs -lc -lgcc
+ -fno-builtin -largp
define Build/InstallDev
$(INSTALL_DIR) $(1)/usr/include
--- /dev/null
+--- 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*/
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
--without-fam \
--without-gdbm \
--without-ldap \
- --without-lua \
+ --with-lua \
--without-memcache \
--with-pcre \
--without-valgrind \
$(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))
$(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))
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>
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
--- /dev/null
+--- 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"
+
--- /dev/null
+--- 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);
+ }
+
PKG_NAME:=luci-app-sqm
PKG_VERSION:=3
-PKG_RELEASE:=2
+PKG_RELEASE:=5
PKG_LICENSE:=GPLv2
LUCI_DIR:=/usr/lib/lua/luci
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
c:value("ns2_codel")
c:value("pie")
c:value("sfq")
+c:value("cake")
c.default = "fq_codel"
c.rmempty = false
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
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")
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")
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"
#
-# 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.
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
--- /dev/null
+--- 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>
+++ /dev/null
---- 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)
- {
+++ /dev/null
---- 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;
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
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)"
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"
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
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}'"))
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
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
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
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 .. " "
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 .. " "
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
-- ------ 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
)
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
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
-- ------ 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
#
-# 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.
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
ucd-snmp/loadave \
ucd-snmp/memory \
ucd-snmp/pass \
+ ucd-snmp/pass_persist \
ucd-snmp/proc \
ucd-snmp/vmstat \
util_funcs \
--- /dev/null
+--- 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"
--- /dev/null
+#
+# 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))
--- /dev/null
+#!/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
+}
--- /dev/null
+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>
--- /dev/null
+#
+# 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))
--- /dev/null
+#!/bin/sh /etc/rc.common
+
+START=65
+
+start() {
+ service_start /usr/sbin/ngircd
+}
+
+stop() {
+ service_stop /usr/sbin/ngircd
+}
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/
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 \
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>
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))
#
# 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.
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>
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)"
--- /dev/null
+--- 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>
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>
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/
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
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:
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'
-----------------------------------------------------------------
#
-# 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.
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+
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 \
--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
#!/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))
#!/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
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
}
-
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
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" ] || {
[ -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"
--- /dev/null
+--- 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) {
--- /dev/null
+#
+# 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))
--- /dev/null
+#!/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
--- /dev/null
+
+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'
--- /dev/null
+#!/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
+}
--- /dev/null
+#!/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 $?
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/ \
--- /dev/null
+--- 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
PKG_NAME:=sqm-scripts
PKG_VERSION:=8
-PKG_RELEASE:=4
+PKG_RELEASE:=7
PKG_LICENSE:=GPLv2
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
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'
#improve the logread output
sqm_logger() {
- logger -t SQM -s ${1}
+ logger -t SQM -s "${1}"
}
insmod() {
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
# 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
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
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
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
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
# 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"
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
}
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
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
--- 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
CFLAGS="$(TARGET_CFLAGS)" \
USELIBCONFIG= \
USELIBWRAP= \
+ USELIBPCRE= \
all
endef
--- /dev/null
+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
+
#
-# 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.
include $(INCLUDE_DIR)/package.mk
+TARGET_CPPFLAGS += -I$(PKG_BUILD_DIR)/include
+
define Package/sstp-client
SECTION:=net
CATEGORY:=Network
--- /dev/null
+--- /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>
+
--- /dev/null
+++ b/src/libstrongswan/musl.h
-@@ -0,0 +1,33 @@
+@@ -0,0 +1,39 @@
+#include <sys/types.h>
+
+#define crypt x_crypt
+#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
+#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
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
+++ /dev/null
---- 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__ */
#
-# 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.
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/ \
CONFIG_PACKAGE_ulogd-mod-pgsql \
CONFIG_PACKAGE_ulogd-mod-sqlite \
+TARGET_CFLAGS += \
+ -D_GNU_SOURCE \
+
CONFIGURE_ARGS += \
--enable-nfacct \
--enable-nfct \
--- /dev/null
+--- 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 {
PKG_NAME:=unbound
PKG_VERSION:=1.5.3
-PKG_RELEASE:=1
+PKG_RELEASE:=2
PKG_LICENSE:=BSD-3-Clause
PKG_LICENSE_FILES:=LICENSE
endef
CONFIGURE_ARGS += \
- --disable-ecdsa \
--disable-gost \
--enable-allsymbols \
--with-libexpat="$(STAGING_DIR)/usr" \
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
--- /dev/null
+--- 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;
PKG_NAME:=vpnc-scripts
PKG_VERSION:=20150116
-PKG_RELEASE:=1
+PKG_RELEASE:=2
include $(INCLUDE_DIR)/package.mk
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
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/
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" ] || {
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/
--- /dev/null
+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
PKG_NAME:=wifidog
PKG_VERSION:=1.2.1
-PKG_RELEASE=1
+PKG_RELEASE=2
PKG_LICENSE:=GPL-2.0
--- /dev/null
+--- 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>
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 \
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() {
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
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>
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
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
TITLE+= (full)
DEPENDS+= \
+libaudiofile +BUILD_PATENTED:libfaad2 +libffmpeg +libid3tag \
- +libmms +libogg +libsndfile +libvorbis
+ +libmms +libogg +libsndfile +libvorbis +libupnp
PROVIDES:=mpd
VARIANT:=full
endef
$(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 \
--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 \
$(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 \
# 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 \
---- 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",
---- 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);
--- /dev/null
+#
+# 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))
--- /dev/null
+#!/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
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/
SECTION:=libs
CATEGORY:=Libraries
TITLE+= library
- DEPENDS:=+libpthread
+ DEPENDS:=+libpthread +kmod-bluetooth
endef
define Package/bluez-utils
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
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/
$(eval $(call BuildPackage,bluez-examples))
$(eval $(call BuildPackage,bluez-libs))
$(eval $(call BuildPackage,bluez-utils))
+$(eval $(call BuildPackage,bluez-daemon))
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
--- /dev/null
+--- 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);
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
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
: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
+++ /dev/null
---- 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");
--- /dev/null
+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
--- /dev/null
+#
+# 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))
--- /dev/null
+#!/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
+}
+
--- /dev/null
+--- 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"
--- /dev/null
+--- 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), "/?");
--- /dev/null
+--- 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@
+
--- /dev/null
+--- 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;
--- /dev/null
+--- /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
--- /dev/null
+--- 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);
+
--- /dev/null
+--- 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)
+
--- /dev/null
+--- 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);
--- /dev/null
+--- 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'
#
-# 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.
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
--- /dev/null
+--- 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>
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)
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/ \;
--- 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;
#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);
/* 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);
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)
{
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;
}
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)/
--- /dev/null
+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");
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/
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
#
-# 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.
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:=\
}
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
#
-# 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.
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>
--- /dev/null
+--- 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
+
+ /*====================================================================*
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:=
} # 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
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
+--- 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 @@
#
-# 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.
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
--- /dev/null
+--- 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;
+ }
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