package/softether: New package
authorBernd Kuhls <bernd.kuhls@t-online.de>
Sat, 4 Oct 2014 21:44:58 +0000 (23:44 +0200)
committerThomas Petazzoni <thomas.petazzoni@free-electrons.com>
Sun, 8 Mar 2015 14:53:12 +0000 (15:53 +0100)
Package description was copied from
https://launchpad.net/~dajhorn/+archive/ubuntu/softether/

[Thomas:
 - reorganize patches by pulling the two biggest patches from Github,
   and only having the remaining patches in Buildroot.
 - use a full destination path when installing hamcorebuilder in
   $(HOST_DIR)/usr/bin.
 - minor reformatting.]

Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
package/Config.in
package/softether/0001-use-fhs-install-directories.patch [new file with mode: 0644]
package/softether/0002-create-non-forking-softetherd-for-upstart-and-systemd.patch [new file with mode: 0644]
package/softether/0003-change-GetExeDir-to-GetStateDir-in-Cedar-and-Mayaqua.patch [new file with mode: 0644]
package/softether/0004-cross-compile.patch [new file with mode: 0644]
package/softether/0005-iconv.patch [new file with mode: 0644]
package/softether/Config.in [new file with mode: 0644]
package/softether/softether.mk [new file with mode: 0644]

index 1bce00afef70f5832d454cc3ca4c97839305e42d..cab93826fcc1b5754003229907aad1514e3c0802 100644 (file)
@@ -1203,6 +1203,7 @@ endif
        source "package/smcroute/Config.in"
        source "package/socat/Config.in"
        source "package/socketcand/Config.in"
+       source "package/softether/Config.in"
        source "package/spawn-fcgi/Config.in"
        source "package/spice/Config.in"
        source "package/spice-protocol/Config.in"
diff --git a/package/softether/0001-use-fhs-install-directories.patch b/package/softether/0001-use-fhs-install-directories.patch
new file mode 100644 (file)
index 0000000..c489cc1
--- /dev/null
@@ -0,0 +1,318 @@
+From b9420c3bfc2a8b9d35d0c8e5f6849007c2bc21fa Mon Sep 17 00:00:00 2001
+From: Darik Horn <dajhorn@vanadac.com>
+Date: Mon, 14 Apr 2014 13:22:24 -0400
+Subject: [PATCH] Use FHS installation directories.
+
+Install to `/usr/sbin`, `/usr/lib`, and `/var/lib` according to the Linux
+filesystem hierarchy standard if SoftEther is built through autotools.
+
+In a managed installation, the FHS stipulates that the application must
+accomodate a read-only installation path.  This requires a new `GetStateDir`
+function that substitues `GetExeDir` in some parts of the code.
+
+Taken from Github at
+https://github.com/dajhorn/SoftEtherVPN/commit/b9420c3bfc2a8b9d35d0c8e5f6849007c2bc21fa.
+
+Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
+Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+---
+ autotools/softether.am      |  1 +
+ src/Cedar/Admin.c           |  2 +-
+ src/Cedar/Command.c         |  6 +++++-
+ src/Cedar/Logging.c         |  2 +-
+ src/Cedar/Server.c          |  4 ++--
+ src/Mayaqua/Encrypt.c       |  2 +-
+ src/Mayaqua/FileIO.c        | 39 ++++++++++++++++++++++++++++++++++++---
+ src/Mayaqua/FileIO.h        |  2 ++
+ src/Mayaqua/Mayaqua.c       |  4 ++++
+ src/Mayaqua/Table.c         |  6 +++++-
+ src/Mayaqua/Unix.c          |  6 +++---
+ src/bin/hamcore/Makefile.am |  8 ++++++--
+ 12 files changed, 67 insertions(+), 15 deletions(-)
+
+Index: b/autotools/softether.am
+===================================================================
+--- a/autotools/softether.am
++++ b/autotools/softether.am
+@@ -27,6 +27,7 @@
+       -I$(top_srcdir)/src \
+       -I$(top_srcdir)/src/Mayaqua \
+       -I$(top_srcdir)/src/Cedar \
++      -DSTATE_DIR='"@localstatedir@/lib/softether"' \
+       -DUNIX \
+       -DUNIX_LINUX \
+       -D_REENTRANT \
+Index: b/src/Cedar/Admin.c
+===================================================================
+--- a/src/Cedar/Admin.c
++++ b/src/Cedar/Admin.c
+@@ -10334,7 +10334,7 @@
\r
+       Zero(t, sizeof(RPC_READ_LOG_FILE));\r
\r
+-      GetExeDir(exe_dir, sizeof(exe_dir));\r
++      GetStateDir(exe_dir, sizeof(exe_dir));\r
+       Format(full_path, sizeof(full_path), "%s/%s", exe_dir, filepath);\r
\r
+       // Read file\r
+Index: b/src/Cedar/Command.c
+===================================================================
+--- a/src/Cedar/Command.c
++++ b/src/Cedar/Command.c
+@@ -527,7 +527,7 @@
+       UINT i;\r
\r
+       GetExeName(exe, sizeof(exe));\r
+-      GetExeDir(exe_dir, sizeof(exe_dir));\r
++      GetStateDir(exe_dir, sizeof(exe_dir));\r
\r
+       ok = false;\r
+       dirs = EnumDir(exe_dir);\r
+@@ -552,7 +552,11 @@
+               UCHAR *buf;\r
+               IO *io;\r
+ #ifndef       OS_WIN32\r
++#ifdef STATE_DIR\r
++              wchar_t *filename = L"" STATE_DIR L"/vpn_checker_tmp";\r
++#else\r
+               wchar_t *filename = L"/tmp/vpn_checker_tmp";\r
++#endif\r
+ #else // OS_WIN32\r
+               wchar_t filename[MAX_PATH];\r
+               CombinePathW(filename, sizeof(filename), MsGetMyTempDirW(), L"vpn_checker_tmp");\r
+Index: b/src/Cedar/Logging.c
+===================================================================
+--- a/src/Cedar/Logging.c
++++ b/src/Cedar/Logging.c
+@@ -508,7 +508,7 @@
\r
+       e = ZeroMalloc(sizeof(ERASER));\r
\r
+-      GetExeDir(dir, sizeof(dir));\r
++      GetStateDir(dir, sizeof(dir));\r
\r
+       e->Log = log;\r
+       e->MinFreeSpace = min_size;\r
+Index: b/src/Cedar/Server.c
+===================================================================
+--- a/src/Cedar/Server.c
++++ b/src/Cedar/Server.c
+@@ -1060,7 +1060,7 @@
+               hubname = NULL;\r
+       }\r
\r
+-      GetExeDir(exe_dir, sizeof(exe_dir));\r
++      GetStateDir(exe_dir, sizeof(exe_dir));\r
\r
+       // Enumerate in the server_log\r
+       if (hubname == NULL)\r
+@@ -1134,7 +1134,7 @@
+               return;\r
+       }\r
\r
+-      GetExeDir(exe_dir, sizeof(exe_dir));\r
++      GetStateDir(exe_dir, sizeof(exe_dir));\r
+       Format(dir_full_path, sizeof(dir_full_path), "%s/%s", exe_dir, dirname);\r
\r
+       dir = EnumDir(dir_full_path);\r
+Index: b/src/Mayaqua/Encrypt.c
+===================================================================
+--- a/src/Mayaqua/Encrypt.c
++++ b/src/Mayaqua/Encrypt.c
+@@ -579,7 +579,7 @@
+               return false;\r
+       }\r
\r
+-      GetExeDir(dirname, sizeof(dirname));\r
++      GetStateDir(dirname, sizeof(dirname));\r
\r
+       // Search the CRL file\r
+       t = EnumDir(dirname);\r
+Index: b/src/Mayaqua/FileIO.c
+===================================================================
+--- a/src/Mayaqua/FileIO.c
++++ b/src/Mayaqua/FileIO.c
+@@ -122,8 +122,14 @@
+ #include <errno.h>\r
+ #include <Mayaqua/Mayaqua.h>\r
\r
++#ifdef STATE_DIR\r
++static char exe_file_name[MAX_SIZE] = STATE_DIR "/a.out";\r
++static wchar_t exe_file_name_w[MAX_SIZE] = L"" STATE_DIR L"/a.out";\r
++#else\r
+ static char exe_file_name[MAX_SIZE] = "/tmp/a.out";\r
+ static wchar_t exe_file_name_w[MAX_SIZE] = L"/tmp/a.out";\r
++#endif\r
++\r
+ static LIST *hamcore = NULL;\r
+ static IO *hamcore_io = NULL;\r
\r
+@@ -1038,7 +1044,7 @@
+       }\r
\r
+       // If the file exist in hamcore/ directory on the local disk, read it\r
+-      GetExeDirW(exe_dir, sizeof(exe_dir));\r
++      GetStateDirW(exe_dir, sizeof(exe_dir));\r
\r
+       UniFormat(tmp, sizeof(tmp), L"%s/%S/%S", exe_dir, HAMCORE_DIR_NAME, filename);\r
\r
+@@ -1154,7 +1160,7 @@
+               return;\r
+       }\r
\r
+-      GetExeDirW(exe_dir, sizeof(exe_dir));\r
++      GetStateDirW(exe_dir, sizeof(exe_dir));\r
+       UniFormat(tmp, sizeof(tmp), L"%s/%S", exe_dir, HAMCORE_FILE_NAME);\r
\r
+       UniFormat(tmp2, sizeof(tmp2), L"%s/%S", exe_dir, HAMCORE_FILE_NAME_2);\r
+@@ -1438,6 +1444,33 @@
+       GetDirNameFromFilePathW(name, size, exe_file_name_w);\r
+ }\r
\r
++void GetStateDir(char *name, UINT size)\r
++{\r
++      // Validate arguments\r
++      if (name == NULL)\r
++      {\r
++              return;\r
++      }\r
++#ifdef STATE_DIR\r
++      StrCpy(name, size, STATE_DIR);\r
++#else\r
++      GetExeDir(name, size)\r
++#endif\r
++}\r
++void GetStateDirW(wchar_t *name, UINT size)\r
++{\r
++      // Validate arguments\r
++      if (name == NULL)\r
++      {\r
++              return;\r
++      }\r
++#ifdef STATE_DIR\r
++      UniStrCpy(name, size, L"" STATE_DIR L"");\r
++#else\r
++      GetExeDirW(name, size)\r
++#endif\r
++}\r
++\r
+ // Get the EXE file name\r
+ void GetExeName(char *name, UINT size)\r
+ {\r
+@@ -2389,7 +2422,7 @@
+       else\r
+       {\r
+               wchar_t dir[MAX_SIZE];\r
+-              GetExeDirW(dir, sizeof(dir));\r
++              GetStateDirW(dir, sizeof(dir));\r
+               ConbinePathW(dst, size, dir, &src[1]);\r
+       }\r
+ }\r
+Index: b/src/Mayaqua/FileIO.h
+===================================================================
+--- a/src/Mayaqua/FileIO.h
++++ b/src/Mayaqua/FileIO.h
+@@ -349,6 +349,8 @@
+ void GetExeNameW(wchar_t *name, UINT size);\r
+ void GetExeDir(char *name, UINT size);\r
+ void GetExeDirW(wchar_t *name, UINT size);\r
++void GetStateDir(char *name, UINT size);\r
++void GetStateDirW(wchar_t *name, UINT size);\r
+ void BuildHamcore(char *dst_filename, char *src_dir, bool unix_only);\r
+ int CompareHamcore(void *p1, void *p2);\r
+ void InitHamcore();\r
+Index: b/src/Mayaqua/Mayaqua.c
+===================================================================
+--- a/src/Mayaqua/Mayaqua.c
++++ b/src/Mayaqua/Mayaqua.c
+@@ -611,7 +611,11 @@
+               _exit(0);\r
+       }\r
\r
++#ifndef STATE_DIR\r
++      // This check causes hamcorebuilder to fail in an unprivileged\r
++      // environment, and is unnecessary for a managed installation.\r
+       CheckUnixTempDir();\r
++#endif\r
\r
+       // Initialization of Probe\r
+       InitProbe();\r
+Index: b/src/Mayaqua/Table.c
+===================================================================
+--- a/src/Mayaqua/Table.c
++++ b/src/Mayaqua/Table.c
+@@ -1191,7 +1191,7 @@
+               return;\r
+       }\r
\r
+-      GetExeDirW(exe, sizeof(exe));\r
++      GetStateDirW(exe, sizeof(exe));\r
+       UniStrCpy(hashtemp, sizeof(hashtemp), strfilename);\r
+       BinToStrW(tmp, sizeof(tmp), filehash, MD5_SIZE);\r
+       UniStrCat(hashtemp, sizeof(hashtemp), tmp);\r
+@@ -1204,7 +1204,11 @@
+       UniStrLower(tmp);\r
\r
+ #ifndef       OS_WIN32\r
++#ifdef STATE_DIR\r
++      UniStrCpy(exe, sizeof(exe), L"" STATE_DIR L"");\r
++#else\r
+       UniStrCpy(exe, sizeof(exe), L"/tmp");\r
++#endif\r
+ #else // OS_WIN32\r
+       StrToUni(exe, sizeof(exe), MsGetTempDir());\r
+ #endif        // OS_WIN32\r
+Index: b/src/Mayaqua/Unix.c
+===================================================================
+--- a/src/Mayaqua/Unix.c
++++ b/src/Mayaqua/Unix.c
+@@ -928,7 +928,7 @@
+               StrCpy(tmp, sizeof(tmp), instance_name);\r
+       }\r
\r
+-      GetExeDir(dir, sizeof(dir));\r
++      GetStateDir(dir, sizeof(dir));\r
\r
+       // File name generation\r
+       Format(name, sizeof(name), "%s/.%s", dir, tmp);\r
+@@ -2260,7 +2260,7 @@
+               return;\r
+       }\r
\r
+-      GetExeDir(dir, sizeof(dir));\r
++      GetStateDir(dir, sizeof(dir));\r
\r
+       GetExeName(exe_name, sizeof(exe_name));\r
+       StrCat(exe_name, sizeof(exe_name), ":pid_hash");\r
+@@ -2305,7 +2305,7 @@
+               return;\r
+       }\r
\r
+-      GetExeDir(dir, sizeof(dir));\r
++      GetStateDir(dir, sizeof(dir));\r
\r
+       GetExeName(exe_name, sizeof(exe_name));\r
+       StrCat(exe_name, sizeof(exe_name), ":pid_hash");\r
+Index: b/src/bin/hamcore/Makefile.am
+===================================================================
+--- a/src/bin/hamcore/Makefile.am
++++ b/src/bin/hamcore/Makefile.am
+@@ -18,12 +18,16 @@
+ include $(top_srcdir)/autotools/softether.am
+-# This is required to use a custom build rule with -Wall and -Werror enabled.
++# An empty EXEEXT required for overrides with -Wall and -Werror enabled.
+ AUTOMAKE_OPTIONS = -Wno-override
+ EXEEXT =
++
+ HAMCOREBUILDER = $(top_builddir)/src/hamcorebuilder/hamcorebuilder
+-sbin_PROGRAMS = hamcore.se2
++noinst_PROGRAMS = hamcore.se2
+ hamcore.se2$(EXEEXT): $(HAMCOREBUILDER)
+       $(HAMCOREBUILDER) $(top_srcdir)/src/bin/hamcore $@
++
++install-exec-local: hamcore.se2$(EXEEXT)
++      $(INSTALL_DATA) -D hamcore.se2$(EXEEXT) $(DESTDIR)$(localstatedir)/lib/softether/hamcore.se2
diff --git a/package/softether/0002-create-non-forking-softetherd-for-upstart-and-systemd.patch b/package/softether/0002-create-non-forking-softetherd-for-upstart-and-systemd.patch
new file mode 100644 (file)
index 0000000..72913b0
--- /dev/null
@@ -0,0 +1,218 @@
+From 64dd780905ae339a0a57e4aba541799016816a1a Mon Sep 17 00:00:00 2001
+From: Darik Horn <dajhorn@vanadac.com>
+Date: Fri, 3 Oct 2014 13:30:24 -0400
+Subject: [PATCH] Create a non-forking softetherd for upstart and systemd.
+
+Implement a daemon that expects to be invoked by a new-style init like upstart
+or systemd as:
+
+       /usr/sbin/softetherd [vpnbridge|vpnclient|vpnserver]
+
+Alternatively, if the command line argument is empty, then use the
+`SOFTETHER_MODE` environment variable instead.
+
+Conflicts:
+       src/bin/hamcore/strtable_en.stb
+
+Taken from Github at
+https://github.com/dajhorn/SoftEtherVPN/commit/64dd780905ae339a0a57e4aba541799016816a1a.
+
+Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
+Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+---
+ configure.ac                    |   1 +
+ src/Makefile.am                 |   3 ++
+ src/bin/hamcore/strtable_en.stb |   1 +
+ src/softetherd/Makefile.am      |  28 ++++++++++
+ src/softetherd/softetherd.c     | 114 ++++++++++++++++++++++++++++++++++++++++
+ 5 files changed, 147 insertions(+)
+ create mode 100644 src/softetherd/Makefile.am
+ create mode 100644 src/softetherd/softetherd.c
+
+Index: b/configure.ac
+===================================================================
+--- a/configure.ac
++++ b/configure.ac
+@@ -36,6 +36,7 @@
+       src/vpnclient/Makefile
+       src/vpnbridge/Makefile
+       src/vpncmd/Makefile
++      src/softetherd/Makefile
+ ])
+Index: b/src/Makefile.am
+===================================================================
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -27,3 +27,6 @@
+ # These are the final build products.
+ SUBDIRS += vpnserver vpnclient vpnbridge vpncmd
++
++# This is a daemon for upstart and systemd.
++SUBDIRS += softetherd
+Index: b/src/bin/hamcore/strtable_en.stb
+===================================================================
+--- a/src/bin/hamcore/strtable_en.stb
++++ b/src/bin/hamcore/strtable_en.stb
+@@ -1062,6 +1062,7 @@
\r
\r
+ # Concerning services (UNIX)\r
++UNIX_DAEMON_HELP              SoftEther VPN non-forking daemon for upstart and systemd.\nCommand Usage:\n %S vpnbridge  - Enable bridging features.\n %S vpnclient  - Enable client features.\n %S vpnserver  - Enable all features.\nThe parameter can be set in the SOFTETHER_MODE environment variable.\n\n\r
+ UNIX_SVC_HELP                 %S service program\nCopyright (c) SoftEther VPN Project. All Rights Reserved.\n\n%S command usage:\n %S start  - Start the %S service.\n %S stop   - Stop the %S service if the service has been already started.\n\n\r
+ UNIX_SVC_STARTED              The %S service has been started.\n\r
+ UNIX_SVC_STOPPING             Stopping the %S service ...\n\r
+Index: b/src/softetherd/Makefile.am
+===================================================================
+--- /dev/null
++++ b/src/softetherd/Makefile.am
+@@ -0,0 +1,28 @@
++#  Copyright 2014 Darik Horn <dajhorn@vanadac.com>
++#
++#  This file is part of SoftEther.
++#
++#  SoftEther is free software: you can redistribute it and/or modify it under
++#  the terms of the GNU General Public License as published by the Free 
++#  Software Foundation, either version 2 of the License, or (at your option)
++#  any later version.
++#
++#  SoftEther 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
++#  SoftEther.  If not, see <http://www.gnu.org/licenses/>.
++
++
++include $(top_srcdir)/autotools/softether.am
++
++sbin_PROGRAMS = \
++      softetherd
++
++softetherd_SOURCES = \
++      softetherd.c
++
++softetherd_LDADD = \
++      $(top_builddir)/src/libsoftether/libsoftether.la
+Index: b/src/softetherd/softetherd.c
+===================================================================
+--- /dev/null
++++ b/src/softetherd/softetherd.c
+@@ -0,0 +1,114 @@
++//  SoftEther VPN daemon for upstart and systemd.
++//
++//  Copyright 2014 Darik Horn <dajhorn@vanadac.com>
++//
++//  This file is part of SoftEther.
++//
++//  SoftEther is free software: you can redistribute it and/or modify it under
++//  the terms of the GNU General Public License as published by the Free 
++//  Software Foundation, either version 2 of the License, or (at your option)
++//  any later version.
++//
++//  SoftEther 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
++//  SoftEther.  If not, see <http://www.gnu.org/licenses/>.
++
++
++#include <GlobalConst.h>
++
++#define       VPN_EXE
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <wchar.h>
++#include <stdarg.h>
++#include <time.h>
++#include <Mayaqua/Mayaqua.h>
++#include <Cedar/Cedar.h>
++
++void DaemonUsage(char *name)
++{
++      UniPrint(_UU("UNIX_DAEMON_HELP"), name, name, name);
++}
++
++
++void DaemonStartProcess()
++{
++      // This environment variable is exported by upstart.
++      char *upstart_job = getenv("UPSTART_JOB");
++
++      InitCedar();
++      StInit();
++      StStartServer(false);
++
++      // Notify upstart that softetherd is ready.
++      if (upstart_job != NULL)
++      {
++              unsetenv("UPSTART_JOB");
++              raise(SIGSTOP);
++      }
++}
++
++
++void DaemonStopProcess()
++{
++      StStopServer();
++      StFree();
++      FreeCedar();
++}
++
++
++int main(int argc, char *argv[])
++{
++      // This environment variable is sourced and exported by the init process from /etc/default/softether.
++      char *softether_mode = getenv("SOFTETHER_MODE");
++
++      InitMayaqua(false, false, argc, argv);
++
++      // Check for an explicit invocation. (eg: "/usr/sbin/softetherd vpnserver")
++      if (argc >= 2)
++      {
++              if (StrCmpi(argv[1], "vpnbridge") == 0
++               || StrCmpi(argv[1], "vpnclient") == 0
++               || StrCmpi(argv[1], "vpnserver") == 0)
++              {
++                      UnixExecService(argv[1], DaemonStartProcess, DaemonStopProcess);
++                      FreeMayaqua();
++                      return 0;
++              }
++
++              // Exit status codes 150..199 are reserved for the application by the LSB.
++              fprintf(stderr, "Error: Unrecognized parameter: %s\n", argv[1]);
++              fflush(stderr);
++              FreeMayaqua();
++              return 150;
++      }
++
++      // Alternatively, use the environment variable.
++      if (softether_mode != NULL)
++      {
++              if (StrCmpi(softether_mode, "vpnbridge") == 0 
++               || StrCmpi(softether_mode, "vpnclient") == 0
++               || StrCmpi(softether_mode, "vpnserver") == 0)
++              {
++                      UnixExecService(softether_mode, DaemonStartProcess, DaemonStopProcess);
++                      FreeMayaqua();
++                      return 0;
++              }
++
++              // Exit status codes 150..199 are reserved for the application by the LSB.
++              fprintf(stderr, "Error: Unrecognized environment variable: SOFTETHER_MODE=%s\n", softether_mode);
++              fflush(stderr);
++              FreeMayaqua();
++              return 151;
++      }
++
++      DaemonUsage(argv[0]);
++      FreeMayaqua();
++      return 3;
++}
diff --git a/package/softether/0003-change-GetExeDir-to-GetStateDir-in-Cedar-and-Mayaqua.patch b/package/softether/0003-change-GetExeDir-to-GetStateDir-in-Cedar-and-Mayaqua.patch
new file mode 100644 (file)
index 0000000..6cb4e72
--- /dev/null
@@ -0,0 +1,90 @@
+From d68db9f2cee975aad5e07b44485615f3d842ab45 Mon Sep 17 00:00:00 2001
+From: Darik Horn <dajhorn@vanadac.com>
+Date: Fri, 11 Jul 2014 16:17:18 -0400
+Subject: [PATCH] Change GetExeDir to GetStateDir in Cedar and Mayaqua.
+
+Resolve this AppArmor error by ensuring that certificate files files are
+written into /var/lib/softether instead of the current working directory:
+
+       Profile: /usr/sbin/softetherd
+       Operation: mkdir
+       Name: /usr/sbin/chain_certs
+       Denied: c
+       Logfile: /var/log/kern.log
+
+       type=1400 audit: apparmor="DENIED" operation="mkdir" profile="/usr/sbin/softetherd" name="/usr/sbin/chain_certs/" pid=36448 comm="softetherd" requested_mask="c" denied_mask="c" fsuid=0 ouid=0
+
+Taken from Github
+https://github.com/dajhorn/SoftEtherVPN/commit/d68db9f2cee975aad5e07b44485615f3d842ab45.
+
+Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
+Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+---
+ src/Cedar/Protocol.c  | 12 ++++++------
+ src/Mayaqua/Network.c |  6 +++---
+ 2 files changed, 9 insertions(+), 9 deletions(-)
+
+Index: b/src/Cedar/Protocol.c
+===================================================================
+--- a/src/Cedar/Protocol.c
++++ b/src/Cedar/Protocol.c
+@@ -161,10 +161,10 @@
+               UINT i;\r
+               DIRLIST *dir;\r
+               wchar_t dirname[MAX_SIZE];\r
+-              wchar_t exedir[MAX_SIZE];\r
++              wchar_t statedir[MAX_SIZE];\r
\r
+-              GetExeDirW(exedir, sizeof(exedir));\r
+-              CombinePathW(dirname, sizeof(dirname), exedir, L"chain_certs");\r
++              GetStateDirW(statedir, sizeof(statedir));\r
++              CombinePathW(dirname, sizeof(dirname), statedir, L"chain_certs");\r
+               MakeDirExW(dirname);\r
\r
+               if (auto_save)\r
+@@ -461,7 +461,7 @@
+ void AddAllChainCertsToCertList(LIST *o)\r
+ {\r
+       wchar_t dirname[MAX_SIZE];\r
+-      wchar_t exedir[MAX_SIZE];\r
++      wchar_t statedir[MAX_SIZE];\r
+       DIRLIST *dir;\r
+       // Validate arguments\r
+       if (o == NULL)\r
+@@ -469,9 +469,9 @@
+               return;\r
+       }\r
\r
+-      GetExeDirW(exedir, sizeof(exedir));\r
++      GetStateDirW(statedir, sizeof(statedir));\r
\r
+-      CombinePathW(dirname, sizeof(dirname), exedir, L"chain_certs");\r
++      CombinePathW(dirname, sizeof(dirname), statedir, L"chain_certs");\r
\r
+       MakeDirExW(dirname);\r
\r
+Index: b/src/Mayaqua/Network.c
+===================================================================
+--- a/src/Mayaqua/Network.c
++++ b/src/Mayaqua/Network.c
+@@ -12588,7 +12588,7 @@
+ void AddChainSslCertOnDirectory(struct ssl_ctx_st *ctx)\r
+ {\r
+       wchar_t dirname[MAX_SIZE];\r
+-      wchar_t exedir[MAX_SIZE];\r
++      wchar_t statedir[MAX_SIZE];\r
+       wchar_t txtname[MAX_SIZE];\r
+       DIRLIST *dir;\r
+       LIST *o;\r
+@@ -12602,9 +12602,9 @@
\r
+       o = NewListFast(NULL);\r
\r
+-      GetExeDirW(exedir, sizeof(exedir));\r
++      GetStateDirW(statedir, sizeof(statedir));\r
\r
+-      CombinePathW(dirname, sizeof(dirname), exedir, L"chain_certs");\r
++      CombinePathW(dirname, sizeof(dirname), statedir, L"chain_certs");\r
\r
+       MakeDirExW(dirname);\r
\r
diff --git a/package/softether/0004-cross-compile.patch b/package/softether/0004-cross-compile.patch
new file mode 100644 (file)
index 0000000..0b31eca
--- /dev/null
@@ -0,0 +1,30 @@
+Host version of hamcorebuilder is needed during cross-compile
+
+Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
+
+diff -uNr SoftEtherVPN-16b713b98da8dba29f0f845d5a8c36d6f7c34824.org/src/bin/hamcore/Makefile.am SoftEtherVPN-16b713b98da8dba29f0f845d5a8c36d6f7c34824/src/bin/hamcore/Makefile.am
+--- SoftEtherVPN-16b713b98da8dba29f0f845d5a8c36d6f7c34824.org/src/bin/hamcore/Makefile.am      2014-09-27 12:56:53.108725793 +0200
++++ SoftEtherVPN-16b713b98da8dba29f0f845d5a8c36d6f7c34824/src/bin/hamcore/Makefile.am  2014-09-27 12:57:50.280009025 +0200
+@@ -26,8 +26,8 @@
+ noinst_PROGRAMS = hamcore.se2
+-hamcore.se2$(EXEEXT): $(HAMCOREBUILDER)
+-      $(HAMCOREBUILDER) $(top_srcdir)/src/bin/hamcore $@
++hamcore.se2$(EXEEXT):
++      hamcorebuilder $(top_srcdir)/src/bin/hamcore $@
+ install-exec-local: hamcore.se2$(EXEEXT)
+       $(INSTALL_DATA) -D hamcore.se2$(EXEEXT) $(DESTDIR)$(localstatedir)/lib/softether/hamcore.se2
+diff -uNr SoftEtherVPN-16b713b98da8dba29f0f845d5a8c36d6f7c34824.org/src/Makefile.am SoftEtherVPN-16b713b98da8dba29f0f845d5a8c36d6f7c34824/src/Makefile.am
+--- SoftEtherVPN-16b713b98da8dba29f0f845d5a8c36d6f7c34824.org/src/Makefile.am  2014-09-27 12:56:53.136726809 +0200
++++ SoftEtherVPN-16b713b98da8dba29f0f845d5a8c36d6f7c34824/src/Makefile.am      2014-09-27 12:58:12.959723109 +0200
+@@ -20,7 +20,7 @@
+ SUBDIRS = Mayaqua Cedar
+ # This is a nodist helper.
+-SUBDIRS += hamcorebuilder
++# SUBDIRS += hamcorebuilder
+ # These are shared components.
+ SUBDIRS += libsoftether bin/hamcore
diff --git a/package/softether/0005-iconv.patch b/package/softether/0005-iconv.patch
new file mode 100644 (file)
index 0000000..09d7777
--- /dev/null
@@ -0,0 +1,28 @@
+Fix linking with libiconv
+
+Inspired by https://github.com/el1n/OpenWRT-package-softether/blob/4cb1cd9073a76edf34c512e587069626e02e2404/patches/120-fix-iconv-headers-common.patch
+
+Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
+
+Index: b/src/Mayaqua/Mayaqua.h
+===================================================================
+--- a/src/Mayaqua/Mayaqua.h
++++ b/src/Mayaqua/Mayaqua.h
+@@ -282,17 +282,7 @@
+ #include <ifaddrs.h>\r
+ #endif        // MAYAQUA_SUPPORTS_GETIFADDRS\r
\r
+-#ifdef        UNIX_LINUX\r
+-typedef void *iconv_t;\r
+-iconv_t iconv_open (__const char *__tocode, __const char *__fromcode);\r
+-size_t iconv (iconv_t __cd, char **__restrict __inbuf,\r
+-                     size_t *__restrict __inbytesleft,\r
+-                     char **__restrict __outbuf,\r
+-                     size_t *__restrict __outbytesleft);\r
+-int iconv_close (iconv_t __cd);\r
+-#else // UNIX_LINUX\r
+ #include <iconv.h>\r
+-#endif        // UNIX_LINUX\r
\r
\r
\r
diff --git a/package/softether/Config.in b/package/softether/Config.in
new file mode 100644 (file)
index 0000000..15d5834
--- /dev/null
@@ -0,0 +1,28 @@
+config BR2_PACKAGE_SOFTETHER
+       bool "softether"
+       select BR2_PACKAGE_LIBICONV if !BR2_ENABLE_LOCALE
+       select BR2_PACKAGE_OPENSSL
+       select BR2_PACKAGE_READLINE
+       depends on BR2_LARGEFILE
+       depends on BR2_TOOLCHAIN_HAS_THREADS
+       depends on BR2_USE_MMU # fork()
+       depends on BR2_USE_WCHAR
+       help
+         The SoftEther Server is a fully integrated implementation of the SSTP,
+         L2TP, L2TPv3, OpenVPN, and IPSec virtual private networking protocols
+         on Linux and several other platforms. It is generally compatible with
+         other implementations by Apple, Cisco, Juniper, Microsoft, et al.
+
+         Convenient Layer-2 and Layer-3 bridging capabilities can connect
+         several branch offices into a single broadcast or routing domain, even
+         behind a NAT or without a static IPv4 address.
+
+         In addition to supporting most VPN protocols, the SoftEther Client can
+         penetrate hardened firewalls and captured gateways through HTTPS, DNS,
+         and ICMP exfiltration.
+
+         http://www.softether.org
+
+comment "softether needs a toolchain w/ largefile, wchar, threads"
+       depends on BR2_USE_MMU
+       depends on !(BR2_LARGEFILE && BR2_USE_WCHAR && BR2_TOOLCHAIN_HAS_THREADS)
diff --git a/package/softether/softether.mk b/package/softether/softether.mk
new file mode 100644 (file)
index 0000000..7f2dfb8
--- /dev/null
@@ -0,0 +1,42 @@
+################################################################################
+#
+# softether
+#
+################################################################################
+
+SOFTETHER_VERSION = 16b713b98da8dba29f0f845d5a8c36d6f7c34824
+SOFTETHER_SITE = $(call github,SoftEtherVPN,SoftEtherVPN,$(SOFTETHER_VERSION))
+SOFTETHER_PATCH = \
+       https://github.com/dajhorn/SoftEtherVPN/commit/c5e5d7e93c6f3302adf5821c29c4efdb7630e418.patch \
+       https://github.com/dajhorn/SoftEtherVPN/commit/75625af541fd128f51079d0ffe5ef24645b8f421.patch
+SOFTETHER_LICENSE = GPLv2
+SOFTETHER_LICENSE_FILES = LICENSE
+SOFTETHER_DEPENDENCIES = host-softether openssl readline
+SOFTETHER_AUTORECONF = YES
+
+ifeq ($(BR2_ENABLE_LOCALE),)
+SOFTETHER_DEPENDENCIES += libiconv
+SOFTETHER_CONF_ENV = LIBS="-liconv"
+endif
+
+SOFTETHER_CONF_OPTS = \
+       --with-openssl="$(STAGING_DIR)/usr" \
+       --with-zlib="$(STAGING_DIR)/usr"
+
+# host-libiconv does not exist, therefore we need this extra line
+HOST_SOFTETHER_DEPENDENCIES = host-pkgconf host-openssl host-readline
+
+# target build creates the file hamcore.se2 which needs the host variant of
+# hamcorebuilder, for details see http://www.vpnusers.com/viewtopic.php?p=5426
+define HOST_SOFTETHER_BUILD_CMDS
+       $(MAKE) -C $(@D)/src/Mayaqua
+       $(MAKE) -C $(@D)/src/Cedar
+       $(MAKE) -C $(@D)/src/hamcorebuilder
+endef
+
+define HOST_SOFTETHER_INSTALL_CMDS
+       $(INSTALL) -m 0755 $(@D)/src/hamcorebuilder/hamcorebuilder $(HOST_DIR)/usr/bin/hamcorebuilder
+endef
+
+$(eval $(autotools-package))
+$(eval $(host-autotools-package))