https://bugs.gentoo.org/904842
https://gitlab.gnome.org/GNOME/NetworkManager-fortisslvpn/-/commit/084ef529c5fb816927ca54866f66b340265aa9f6
https://gitlab.gnome.org/GNOME/NetworkManager-fortisslvpn/-/commit/8773f772d39f8eee6edc1fd2e5437c754ed41e1e
https://gitlab.gnome.org/GNOME/NetworkManager-fortisslvpn/-/merge_requests/27

From 084ef529c5fb816927ca54866f66b340265aa9f6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Eivind=20N=C3=A6ss?= <eivnaes@yahoo.com>
Date: Sat, 4 Mar 2023 21:20:43 +0000
Subject: [PATCH] Adding support for compiling against pppd-2.5.0 (or master
 branch)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Eivind NÃ¦ss <eivnaes@yahoo.com>
--- a/Makefile.am
+++ b/Makefile.am
@@ -81,7 +81,7 @@ libexec_PROGRAMS += src/nm-fortisslvpn-service
 src_nm_fortisslvpn_service_SOURCES = \
 	shared/nm-utils/nm-shared-utils.c \
 	shared/nm-utils/nm-shared-utils.h \
-	src/nm-ppp-status.h \
+	src/nm-fortisslvpn-pppd-status.h \
 	src/nm-fortisslvpn-service.h \
 	src/nm-fortisslvpn-service.c \
 	shared/nm-fortissl-properties.c \
@@ -106,7 +106,8 @@ src_nm_fortisslvpn_pppd_plugin_la_SOURCES = \
 	shared/nm-utils/nm-shared-utils.c \
 	shared/nm-utils/nm-shared-utils.h \
 	src/nm-fortisslvpn-pppd-plugin.c \
-	src/nm-ppp-status.h
+	src/nm-fortisslvpn-pppd-compat.h \
+	src/nm-fortisslvpn-pppd-status.h
 nodist_src_nm_fortisslvpn_pppd_plugin_la_SOURCES = \
 	src/nm-fortisslvpn-pppd-service-dbus.h
 src_nm_fortisslvpn_pppd_plugin_la_CPPFLAGS = $(src_cppflags)
--- a/configure.ac
+++ b/configure.ac
@@ -19,7 +19,10 @@ AC_PROG_CC
 AM_PROG_CC_C_O
 AC_PROG_INSTALL
 AC_PROG_LIBTOOL
+AC_PROG_CPP
+AC_PROG_EGREP
 AC_PATH_PROG(GLIB_COMPILE_RESOURCES, glib-compile-resources)
+PKG_PROG_PKG_CONFIG()
 
 AC_GNU_SOURCE
 
@@ -37,20 +40,50 @@ dnl
 dnl Required headers
 dnl
 AC_HEADER_STDC
-AC_CHECK_HEADERS(fcntl.h paths.h sys/ioctl.h sys/time.h syslog.h unistd.h)
+AC_CHECK_HEADERS(fcntl.h paths.h stdarg.h stdbool.h sys/ioctl.h sys/time.h syslog.h unistd.h)
 
 AC_CHECK_HEADERS(pppd/pppd.h,,
   AC_MSG_ERROR(couldn't find pppd.h. pppd development headers are required.))
 
+dnl
+dnl Check the presense of other pppd/*.h files
+AC_CHECK_HEADERS([
+    pppd/chap.h
+    pppd/chap-new.h
+    pppd/chap_ms.h
+    ])
+
+dnl
+dnl Versions >= 2.5.0 will have pkg-config support
+PKG_CHECK_EXISTS([pppd],
+    [AS_VAR_SET([pppd_pkgconfig_support],[yes])])
+
+dnl
+dnl Get the version of pppd using pkg-config, assume 2.4.9 if not present
+PPPD_VERSION=2.4.5
+if test x"$pppd_pkgconfig_support" = xyes; then
+    PPPD_VERSION=`$PKG_CONFIG --modversion pppd`
+fi
+
+
 AC_ARG_WITH([pppd-plugin-dir], AS_HELP_STRING([--with-pppd-plugin-dir=DIR], [path to the pppd plugins directory]))
 
 if test -n "$with_pppd_plugin_dir" ; then
 	PPPD_PLUGIN_DIR="$with_pppd_plugin_dir"
 else
-	PPPD_PLUGIN_DIR="${libdir}/pppd/2.4.5"
+	PPPD_PLUGIN_DIR="${libdir}/pppd/$PPPD_VERSION"
 fi
 AC_SUBST(PPPD_PLUGIN_DIR)
 
+dnl The version of pppd dictates what code can be included, i.e. enable use of
+dnl   #if WITH_PPP_VERSION >= PPP_VERSION(2,5,0) in the code
+AC_DEFINE_UNQUOTED([PPP_VERSION(x,y,z)],
+    [((x & 0xFF) << 16 | (y & 0xFF) << 8 | (z & 0xFF) << 0)],
+    [Macro to help determine the particular version of pppd])
+PPP_VERSION=$(echo $PPPD_VERSION | sed -e "s/\./\,/g")
+AC_DEFINE_UNQUOTED(WITH_PPP_VERSION, PPP_VERSION($PPP_VERSION),
+    [The real version of pppd represented as an int])
+
 dnl
 dnl Checks for typedefs, structures, and compiler characteristics.
 dnl
--- /dev/null
+++ b/src/nm-fortisslvpn-pppd-compat.h
@@ -0,0 +1,93 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* nm-sstp-service - sstp (and other pppd) integration with NetworkManager
+ *
+ * Copyright (C) Eivind NÃ¦ss, eivnaes@yahoo.com
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+#ifndef __NM_FORTISSLVPN_PPPD_COMPAT_H__
+#define __NM_FORTISSLVPN_PPPD_COMPAT_H__
+
+#define INET6      1
+
+// PPP < 2.5.0 defines and exports VERSION which overlaps with current package VERSION define.
+//   this silly macro magic is to work around that.
+
+#undef VERSION
+#include <pppd/pppd.h>
+
+#ifndef PPPD_VERSION
+#define PPPD_VERSION VERSION
+#endif
+
+#include <pppd/fsm.h>
+#include <pppd/ccp.h>
+#include <pppd/eui64.h>
+#include <pppd/ipcp.h>
+#include <pppd/ipv6cp.h>
+#include <pppd/eap.h>
+#include <pppd/upap.h>
+
+#ifdef HAVE_PPPD_CHAP_H
+ #include <pppd/chap.h>
+#endif
+
+#ifdef HAVE_PPPD_CHAP_NEW_H
+ #include <pppd/chap-new.h>
+#endif
+
+#ifdef HAVE_PPPD_CHAP_MS_H
+ #include <pppd/chap_ms.h>
+#endif
+
+#ifndef PPP_PROTO_CHAP
+#define PPP_PROTO_CHAP              0xc223
+#endif 
+
+#ifndef PPP_PROTO_EAP
+#define PPP_PROTO_EAP               0xc227
+#endif
+
+#if WITH_PPP_VERSION < PPP_VERSION(2,5,0)
+
+static inline bool debug_on(void)
+{
+    return debug;
+}
+
+static inline const char *ppp_ipparam(void)
+{
+    return ipparam;
+}
+
+static inline int ppp_ifunit(void)
+{
+    return ifunit;
+}
+
+static inline const char *ppp_ifname(void)
+{
+    return ifname;
+}
+
+static inline int ppp_get_mtu(int idx)
+{
+    return netif_get_mtu(idx);
+}
+
+#endif // #if WITH_PPP_VERSION < PPP_VERSION(2,5,0)
+#endif // #ifdef __NM_FORTISSLVPN_PPPD_COMPAT_H__
--- a/src/nm-fortisslvpn-pppd-plugin.c
+++ b/src/nm-fortisslvpn-pppd-plugin.c
@@ -23,12 +23,6 @@
 #define ___CONFIG_H__
 #include <config.h>
 
-#include <pppd/pppd.h>
-#include <pppd/fsm.h>
-#include <pppd/ipcp.h>
-
-#include "nm-default.h"
-
 #include <sys/types.h>
 #include <string.h>
 #include <sys/socket.h>
@@ -42,10 +36,12 @@
 #include <grp.h>
 #include <glib/gstdio.h>
 
+#include "nm-fortisslvpn-pppd-status.h"
+#include "nm-fortisslvpn-pppd-compat.h"
 #include "nm-fortisslvpn-pppd-service-dbus.h"
-#include "nm-fortisslvpn-service.h"
-#include "nm-ppp-status.h"
 
+#include "nm-default.h"
+#include "nm-fortisslvpn-service.h"
 #include "nm-utils/nm-shared-utils.h"
 #include "nm-utils/nm-vpn-plugin-macros.h"
 
@@ -80,7 +76,7 @@ static struct {
 
 int plugin_init (void);
 
-char pppd_version[] = VERSION;
+char pppd_version[] = PPPD_VERSION;
 
 static void
 chroot_sandbox (void)
@@ -296,7 +292,7 @@ get_ip4_routes (in_addr_t ouraddr)
 static void
 nm_ip_up (void *data, int arg)
 {
-	guint32 pppd_made_up_address = htonl (0x0a404040 + ifunit);
+	guint32 pppd_made_up_address = htonl (0x0a404040 + ppp_ifunit());
 	ipcp_options opts = ipcp_gotoptions[0];
 	ipcp_options peer_opts = ipcp_hisoptions[0];
 	GVariantBuilder builder;
@@ -317,7 +313,7 @@ nm_ip_up (void *data, int arg)
 
 	g_variant_builder_add (&builder, "{sv}",
 	                       NM_VPN_PLUGIN_IP4_CONFIG_TUNDEV,
-	                       g_variant_new_string (ifname));
+	                       g_variant_new_string (ppp_ifname()));
 
 	str = g_getenv ("VPN_GATEWAY");
 	if (str) {
@@ -442,8 +438,14 @@ plugin_init (void)
 		return -1;
 	}
 
+#if WITH_PPP_VERSION < PPP_VERSION(2,5,0)
 	add_notifier (&phasechange, nm_phasechange, NULL);
 	add_notifier (&ip_up_notifier, nm_ip_up, NULL);
 	add_notifier (&exitnotify, nm_exit_notify, NULL);
+#else
+	ppp_add_notify (NF_PHASE_CHANGE, nm_phasechange, NULL);
+	ppp_add_notify (NF_IP_UP, nm_ip_up, NULL);
+	ppp_add_notify (NF_EXIT, nm_exit_notify, NULL);
+#endif	
 	return 0;
 }
similarity index 100%
rename from src/nm-ppp-status.h
rename to src/nm-fortisslvpn-pppd-status.h
--- a/src/nm-fortisslvpn-service.c
+++ b/src/nm-fortisslvpn-service.c
@@ -40,7 +40,7 @@
 #include <glib/gstdio.h>
 
 #include "nm-fortissl-properties.h"
-#include "nm-ppp-status.h"
+#include "nm-fortisslvpn-pppd-status.h"
 #include "nm-fortisslvpn-pppd-service-dbus.h"
 #include "nm-utils/nm-shared-utils.h"
 #include "nm-utils/nm-vpn-plugin-macros.h"
-- 
GitLab

From 8773f772d39f8eee6edc1fd2e5437c754ed41e1e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Eivind=20N=C3=A6ss?= <eivnaes@yahoo.com>
Date: Sat, 4 Mar 2023 21:29:54 +0000
Subject: [PATCH] Fixing configure.ac from previous change
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Eivind NÃ¦ss <eivnaes@yahoo.com>
--- a/configure.ac
+++ b/configure.ac
@@ -47,11 +47,7 @@ AC_CHECK_HEADERS(pppd/pppd.h,,
 
 dnl
 dnl Check the presense of other pppd/*.h files
-AC_CHECK_HEADERS([
-    pppd/chap.h
-    pppd/chap-new.h
-    pppd/chap_ms.h
-    ])
+AC_CHECK_HEADERS(pppd/chap.h pppd/chap-new.h pppd/chap_ms.h)
 
 dnl
 dnl Versions >= 2.5.0 will have pkg-config support
-- 
GitLab

From d59819b5d26db44f51bfbb76be3b373c419e408d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Eivind=20N=C3=A6ss?= <eivnaes@yahoo.com>
Date: Wed, 8 Mar 2023 04:30:13 +0000
Subject: [PATCH] Improve compatibility with pppd-2.5.0 release

This allows compiling against the older pppd 2.4 series while still
using the new API in the plugin code. It does so by adding a static
inline function ppp_add_notify().

Additional formatting changes to the nm-fortisslvpn-pppd-compat.h based
on review from Lubomir.
--- a/src/nm-fortisslvpn-pppd-compat.h
+++ b/src/nm-fortisslvpn-pppd-compat.h
@@ -1,32 +1,15 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
-/* nm-sstp-service - sstp (and other pppd) integration with NetworkManager
- *
- * Copyright (C) Eivind NÃ¦ss, eivnaes@yahoo.com
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- */
+/* Copyright (C) 2023 Eivind Naess, eivnaes@yahoo.com */
+/* SPDX-License-Identifier: GPL-2.0-or-later */
 
 #ifndef __NM_FORTISSLVPN_PPPD_COMPAT_H__
 #define __NM_FORTISSLVPN_PPPD_COMPAT_H__
 
-#define INET6      1
-
-// PPP < 2.5.0 defines and exports VERSION which overlaps with current package VERSION define.
-//   this silly macro magic is to work around that.
+/* Define INET6 to compile with IPv6 support against older pppd headers,
+ *   pppd >= 2.5.0 use WITH_PPP_IPV6 and is defined in pppdconf.h */
+#define INET6 1
 
+/* PPP < 2.5.0 defines and exports VERSION which overlaps with current package VERSION define.
+ *   this silly macro magic is to work around that. */
 #undef VERSION
 #include <pppd/pppd.h>
 
@@ -43,51 +26,98 @@
 #include <pppd/upap.h>
 
 #ifdef HAVE_PPPD_CHAP_H
- #include <pppd/chap.h>
+#include <pppd/chap.h>
 #endif
 
 #ifdef HAVE_PPPD_CHAP_NEW_H
- #include <pppd/chap-new.h>
+#include <pppd/chap-new.h>
 #endif
 
 #ifdef HAVE_PPPD_CHAP_MS_H
- #include <pppd/chap_ms.h>
+#include <pppd/chap_ms.h>
 #endif
 
 #ifndef PPP_PROTO_CHAP
-#define PPP_PROTO_CHAP              0xc223
+#define PPP_PROTO_CHAP 0xc223
 #endif 
 
 #ifndef PPP_PROTO_EAP
-#define PPP_PROTO_EAP               0xc227
+#define PPP_PROTO_EAP  0xc227
 #endif
 
+
 #if WITH_PPP_VERSION < PPP_VERSION(2,5,0)
 
-static inline bool debug_on(void)
+static inline bool
+debug_on (void)
+{
+	return debug;
+}
+
+static inline const char
+*ppp_ipparam (void)
 {
-    return debug;
+	return ipparam;
 }
 
-static inline const char *ppp_ipparam(void)
+static inline int
+ppp_ifunit (void)
 {
-    return ipparam;
+	return ifunit;
 }
 
-static inline int ppp_ifunit(void)
+static inline const char *
+ppp_ifname (void)
 {
-    return ifunit;
+	return ifname;
 }
 
-static inline const char *ppp_ifname(void)
+static inline int
+ppp_get_mtu (int idx)
 {
-    return ifname;
+	return netif_get_mtu(idx);
 }
 
-static inline int ppp_get_mtu(int idx)
+typedef enum ppp_notify
+{
+    NF_PID_CHANGE,
+    NF_PHASE_CHANGE,
+    NF_EXIT,
+    NF_SIGNALED,
+    NF_IP_UP,
+    NF_IP_DOWN,
+    NF_IPV6_UP,
+    NF_IPV6_DOWN,
+    NF_AUTH_UP,
+    NF_LINK_DOWN,
+    NF_FORK,
+    NF_MAX_NOTIFY
+} ppp_notify_t;
+
+typedef void (ppp_notify_fn) (void *ctx, int arg);
+
+static inline void
+ppp_add_notify (ppp_notify_t type, ppp_notify_fn *func, void *ctx)
 {
-    return netif_get_mtu(idx);
+	struct notifier **list[NF_MAX_NOTIFY] = {
+		[NF_PID_CHANGE  ] = &pidchange,
+		[NF_PHASE_CHANGE] = &phasechange,
+		[NF_EXIT        ] = &exitnotify,
+		[NF_SIGNALED    ] = &sigreceived,
+		[NF_IP_UP       ] = &ip_up_notifier,
+		[NF_IP_DOWN     ] = &ip_down_notifier,
+		[NF_IPV6_UP     ] = &ipv6_up_notifier,
+		[NF_IPV6_DOWN   ] = &ipv6_down_notifier,
+		[NF_AUTH_UP     ] = &auth_up_notifier,
+		[NF_LINK_DOWN   ] = &link_down_notifier,
+		[NF_FORK        ] = &fork_notifier,
+	};
+
+	struct notifier **notify = list[type];
+	if (notify) {
+		add_notifier(notify, func, ctx);
+	}
 }
 
-#endif // #if WITH_PPP_VERSION < PPP_VERSION(2,5,0)
-#endif // #ifdef __NM_FORTISSLVPN_PPPD_COMPAT_H__
+#endif /* #if WITH_PPP_VERSION < PPP_VERSION(2,5,0) */
+#endif /* #ifdef __NM_FORTISSLVPN_PPPD_COMPAT_H__ */
--- a/src/nm-fortisslvpn-pppd-plugin.c
+++ b/src/nm-fortisslvpn-pppd-plugin.c
@@ -438,14 +438,8 @@ plugin_init (void)
 		return -1;
 	}
 
-#if WITH_PPP_VERSION < PPP_VERSION(2,5,0)
-	add_notifier (&phasechange, nm_phasechange, NULL);
-	add_notifier (&ip_up_notifier, nm_ip_up, NULL);
-	add_notifier (&exitnotify, nm_exit_notify, NULL);
-#else
 	ppp_add_notify (NF_PHASE_CHANGE, nm_phasechange, NULL);
 	ppp_add_notify (NF_IP_UP, nm_ip_up, NULL);
 	ppp_add_notify (NF_EXIT, nm_exit_notify, NULL);
-#endif	
 	return 0;
 }
-- 
GitLab
