#!/bin/sh


if [ $(id -u) != 0 ]; then
    echo "root needed...."
    exit 1
fi

dpkg -l virtualbox-6* | grep -q 6.0 || exit 2
#grep -q 6.0.10-132072

echo "starting..."
cd /usr/share/virtualbox/src/vboxhost

cat <<"EOF" > vbox-linux5.3.patch
From 9ca0f54813ca7a2f615ff4a3e5d6e9f1a92d9e0c Mon Sep 17 00:00:00 2001
From: Larry Finger <Larry.Finger@lwfinger.net>
Date: Mon, 26 Aug 2019 05:05:53 +0200
Subject: [PATCH] Support linux-5.3

https://www.virtualbox.org/pipermail/vbox-dev/2019-July/015297.html

Signed-off-by: Holger Paradies <retabell@gmx.de>
---
 vboxdrv/r0drv/linux/mp-r0drv-linux.c | 22 ++++++++++++++++------
 vboxnetflt/linux/VBoxNetFlt-linux.c  |  7 +++++--
 2 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/vboxdrv/r0drv/linux/mp-r0drv-linux.c b/vboxdrv/r0drv/linux/mp-r0drv-linux.c
index ee219b7..0b737df 100644
--- a/vboxdrv/r0drv/linux/mp-r0drv-linux.c
+++ b/vboxdrv/r0drv/linux/mp-r0drv-linux.c
@@ -283,12 +283,16 @@ RTDECL(int) RTMpOnAll(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)
     if (RTCpuSetCount(&OnlineSet) > 1)
     {
         /* Fire the function on all other CPUs without waiting for completion. */
-# if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 3, 0)
+       smp_call_function(rtmpLinuxAllWrapper, &Args, 0 /* wait */);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
         int rc = smp_call_function(rtmpLinuxAllWrapper, &Args, 0 /* wait */);
-# else
+#else
         int rc = smp_call_function(rtmpLinuxAllWrapper, &Args, 0 /* retry */, 0 /* wait */);
-# endif
+#endif
+# if LINUX_VERSION_CODE < KERNEL_VERSION(5, 3, 0)
         Assert(!rc); NOREF(rc);
+#endif
     }
 #endif
 
@@ -326,7 +330,9 @@ RTDECL(int) RTMpOnOthers(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)
 {
 #ifdef CONFIG_SMP
     IPRT_LINUX_SAVE_EFL_AC();
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 3, 0)
     int rc;
+#endif
     RTMPARGS Args;
 
     RTTHREADPREEMPTSTATE PreemptState = RTTHREADPREEMPTSTATE_INITIALIZER;
@@ -337,14 +343,18 @@ RTDECL(int) RTMpOnOthers(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)
     Args.cHits = 0;
 
     RTThreadPreemptDisable(&PreemptState);
-# if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 3, 0)
+    smp_call_function(rtmpLinuxWrapper, &Args, 1 /* wait */);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
     rc = smp_call_function(rtmpLinuxWrapper, &Args, 1 /* wait */);
-# else /* older kernels */
+#else /* older kernels */
     rc = smp_call_function(rtmpLinuxWrapper, &Args, 0 /* retry */, 1 /* wait */);
-# endif /* older kernels */
+#endif /* older kernels */
     RTThreadPreemptRestore(&PreemptState);
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 3, 0)
     Assert(rc == 0); NOREF(rc);
+#endif
     IPRT_LINUX_RESTORE_EFL_AC();
 #else
     RT_NOREF(pfnWorker, pvUser1, pvUser2);
diff --git a/vboxnetflt/linux/VBoxNetFlt-linux.c b/vboxnetflt/linux/VBoxNetFlt-linux.c
index 0068f04..391c411 100644
--- a/vboxnetflt/linux/VBoxNetFlt-linux.c
+++ b/vboxnetflt/linux/VBoxNetFlt-linux.c
@@ -2123,7 +2123,10 @@ static int vboxNetFltLinuxEnumeratorCallback(struct notifier_block *self, unsign
 #endif
     if (in_dev != NULL)
     {
-        for_ifa(in_dev) {
+       /* macros for_ifa() and endfor_ifa() disappear for kernel 5.3
+        * Code them directly */
+        struct in_ifaddr *ifa;
+       for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
             if (VBOX_IPV4_IS_LOOPBACK(ifa->ifa_address))
                 return NOTIFY_OK;
 
@@ -2137,7 +2140,7 @@ static int vboxNetFltLinuxEnumeratorCallback(struct notifier_block *self, unsign
 
             pThis->pSwitchPort->pfnNotifyHostAddress(pThis->pSwitchPort,
                 /* :fAdded */ true, kIntNetAddrType_IPv4, &ifa->ifa_address);
-        } endfor_ifa(in_dev);
+        }
     }
 
     /*
-- 
2.11.0


EOF
patch --no-backup-if-mismatch -p1 <vbox-linux5.3.patch
rm -f vbox-linux5.3.patch
/sbin/vboxconfig
cd -
