--- /dev/null
+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;
++}