diff --git a/trunk/101-vboxsf-automount.patch b/trunk/101-vboxsf-automount.patch index 5c665e7..6bbabc3 100644 --- a/trunk/101-vboxsf-automount.patch +++ b/trunk/101-vboxsf-automount.patch @@ -1,20 +1,189 @@ -This ghetto patch attempts to fix shared folder automounting for guests running -Linux 4.16, and also suggests an alternative to mount.vboxsf. +From 369dd2ee3c82c4417fee04aeec933c74fd198e78 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 23 Jan 2018 15:09:20 +0100 +Subject: [PATCH resend] VBoxServiceAutoMount: Change Linux mount code to use + an options string -diff -uprb VirtualBox-5.2.8.orig/src/VBox/Additions/common/VBoxService/VBoxServiceAutoMount.cpp VirtualBox-5.2.8/src/VBox/Additions/common/VBoxService/VBoxServiceAutoMount.cpp ---- VirtualBox-5.2.8.orig/src/VBox/Additions/common/VBoxService/VBoxServiceAutoMount.cpp 2018-02-26 17:57:30.000000000 +0200 -+++ VirtualBox-5.2.8/src/VBox/Additions/common/VBoxService/VBoxServiceAutoMount.cpp 2018-04-07 21:00:05.785735622 +0300 -@@ -346,6 +346,13 @@ static int vbsvcAutoMountSharedFolder(co +Signed-off-by: Hans de Goede +--- + .../common/VBoxService/VBoxServiceAutoMount.cpp | 62 +++------------------- + 1 file changed, 8 insertions(+), 54 deletions(-) + +diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceAutoMount.cpp b/src/VBox/Additions/common/VBoxService/VBoxServiceAutoMount.cpp +--- ./src/VBox/Additions/common/VBoxService/VBoxServiceAutoMount.cpp.orig 2019-04-16 11:09:11.000000000 +0100 ++++ ./src/VBox/Additions/common/VBoxService/VBoxServiceAutoMount.cpp 2019-04-26 17:10:47.178485356 +0100 +@@ -40,6 +40,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -114,6 +115,9 @@ RT_C_DECLS_END + # define VBOXSERVICE_AUTOMOUNT_MIQF SHFL_MIQF_PATH + #endif + ++#ifndef MAX_MNTOPT_STR ++#define MAX_MNTOPT_STR PAGE_SIZE ++#endif + + /********************************************************************************************************************************* + * Structures and Typedefs * +@@ -400,13 +399,13 @@ static int vbsvcAutoMountSharedFolderOld + int rc = vbsvcAutoMountPrepareMountPointOld(pszMountPoint, pszShareName, &Opts); + if (RT_SUCCESS(rc)) + { ++ char szOptBuf[MAX_MNTOPT_STR] = { '\0', }; ++ RTStrPrintf(szOptBuf, sizeof(szOptBuf), "uid=%d,gid=%d,dmode=%0o,fmode=%0o,dmask=%0o,fmask=%0o", ++ Opts.uid, Opts.gid, Opts.dmode, Opts.fmode, Opts.dmask, Opts.fmask); + # ifdef RT_OS_SOLARIS + int fFlags = 0; + if (Opts.ronly) + fFlags |= MS_RDONLY; +- char szOptBuf[MAX_MNTOPT_STR] = { '\0', }; +- RTStrPrintf(szOptBuf, sizeof(szOptBuf), "uid=%d,gid=%d,dmode=%0o,fmode=%0o,dmask=%0o,fmask=%0o", +- Opts.uid, Opts.gid, Opts.dmode, Opts.fmode, Opts.dmask, Opts.fmask); + int r = mount(pszShareName, + pszMountPoint, + fFlags | MS_OPTIONSTR, +@@ -423,35 +422,11 @@ static int vbsvcAutoMountSharedFolderOld + + # else /* RT_OS_LINUX */ + unsigned long fFlags = MS_NODEV; +- +- /*const char *szOptions = { "rw" }; - ??? */ +- struct vbsf_mount_info_new mntinf; +- RT_ZERO(mntinf); +- +- mntinf.nullchar = '\0'; +- mntinf.signature[0] = VBSF_MOUNT_SIGNATURE_BYTE_0; +- mntinf.signature[1] = VBSF_MOUNT_SIGNATURE_BYTE_1; +- mntinf.signature[2] = VBSF_MOUNT_SIGNATURE_BYTE_2; +- mntinf.length = sizeof(mntinf); +- +- mntinf.uid = Opts.uid; +- mntinf.gid = Opts.gid; +- mntinf.ttl = Opts.ttl; +- mntinf.dmode = Opts.dmode; +- mntinf.fmode = Opts.fmode; +- mntinf.dmask = Opts.dmask; +- mntinf.fmask = Opts.fmask; +- mntinf.cMaxIoPages = Opts.cMaxIoPages; +- mntinf.szTag[0] = '\0'; +- +- strcpy(mntinf.name, pszShareName); +- strcpy(mntinf.nls_name, "\0"); +- + int r = mount(pszShareName, + pszMountPoint, "vboxsf", fFlags, - &mntinf); -+ if (r == -1 && errno == EINVAL) -+ { -+ /* Mainline vboxsf accepts regular mount opts. */ -+ char mount_opts[1024]; -+ snprintf(mount_opts, 1024, "gid=%d,dmode=0770,fmode=0770", mntinf.gid); -+ r = mount(pszShareName, pszMountPoint, "vboxsf", fFlags, mount_opts); -+ } +- &mntinf); ++ szOptBuf); if (r == 0) { VGSvcVerbose(0, "vbsvcAutoMountWorker: Shared folder '%s' was mounted to '%s'\n", pszShareName, pszMountPoint); +@@ -484,34 +459,6 @@ static int vbsvcAutoMountSharedFolderOld + } + else /* r == -1, we got some error in errno. */ + { +- if (errno == EPROTO) +- { +- VGSvcVerbose(3, "vbsvcAutoMountWorker: Messed up share name, re-trying ...\n"); +- +- /** @todo r=bird: What on earth is going on here????? Why can't you +- * strcpy(mntinf.name, pszShareName) to fix it again? */ +- +- /* Sometimes the mount utility messes up the share name. Try to +- * un-mangle it again. */ +- char szCWD[RTPATH_MAX]; +- size_t cchCWD; +- if (!getcwd(szCWD, sizeof(szCWD))) +- { +- VGSvcError("vbsvcAutoMountWorker: Failed to get the current working directory\n"); +- szCWD[0] = '\0'; +- } +- cchCWD = strlen(szCWD); +- if (!strncmp(pszMountPoint, szCWD, cchCWD)) +- { +- while (pszMountPoint[cchCWD] == '/') +- ++cchCWD; +- /* We checked before that we have enough space */ +- strcpy(mntinf.name, pszMountPoint + cchCWD); +- } +- r = mount(mntinf.name, pszMountPoint, "vboxsf", fFlags, &mntinf); +- } +- if (r == -1) /* Was there some error from one of the tries above? */ +- { + switch (errno) + { + /* If we get EINVAL here, the system already has mounted the Shared Folder to another +@@ -530,7 +477,6 @@ static int vbsvcAutoMountSharedFolderOld + rc = RTErrConvertFromErrno(errno); + break; + } +- } + } + # endif + } +@@ -1464,51 +1410,21 @@ static int vbsvcAutomounterMountIt(PVBSV + } + + # if defined(RT_OS_LINUX) +- /* +- * Linux a bit more work... +- */ +- struct vbsf_mount_info_new MntInfo; +- RT_ZERO(MntInfo); +- struct vbsf_mount_opts MntOpts; +- RT_ZERO(MntOpts); +- MntInfo.nullchar = '\0'; +- MntInfo.signature[0] = VBSF_MOUNT_SIGNATURE_BYTE_0; +- MntInfo.signature[1] = VBSF_MOUNT_SIGNATURE_BYTE_1; +- MntInfo.signature[2] = VBSF_MOUNT_SIGNATURE_BYTE_2; +- MntInfo.length = sizeof(MntInfo); +- MntInfo.ttl = MntOpts.uid = -1 /*default*/; +- MntInfo.msDirCacheTTL= MntOpts.msDirCacheTTL = -1 /*default*/; +- MntInfo.msInodeTTL = MntOpts.msInodeTTL = -1 /*default*/; +- MntInfo.cMaxIoPages = MntOpts.cMaxIoPages = 0 /*default*/; +- MntInfo.cbDirBuf = MntOpts.cbDirBuf = 0 /*default*/; +- MntInfo.enmCacheMode = MntOpts.enmCacheMode = kVbsfCacheMode_Default; +- MntInfo.uid = MntOpts.uid = 0; +- MntInfo.gid = MntOpts.gid = gidMount; +- MntInfo.dmode = MntOpts.dmode = 0770; +- MntInfo.fmode = MntOpts.fmode = 0770; +- MntInfo.dmask = MntOpts.dmask = 0000; +- MntInfo.fmask = MntOpts.fmask = 0000; +- memcpy(MntInfo.szTag, g_szTag, sizeof(g_szTag)); AssertCompile(sizeof(MntInfo.szTag) >= sizeof(g_szTag)); +- rc = RTStrCopy(MntInfo.name, sizeof(MntInfo.name), pEntry->pszName); +- if (RT_FAILURE(rc)) ++ unsigned long fFlags = MS_NODEV; ++ char szOpts[MAX_MNTOPT_STR] = { '\0', }; ++ ssize_t cchOpts = RTStrPrintf2(szOpts, sizeof(szOpts), ++ "uid=0,gid=%d,dmode=0770,fmode=0770,dmask=0000,fmask=0000", gidMount); ++ if (cchOpts <= 0) + { +- VGSvcError("vbsvcAutomounterMountIt: Share name '%s' is too long for the MntInfo.name field!\n", pEntry->pszName); +- return rc; ++ VGSvcError("vbsvcAutomounterMountIt: szOpts overflow! %zd\n", cchOpts); ++ return VERR_BUFFER_OVERFLOW; + } + +- errno = 0; +- unsigned long fFlags = MS_NODEV; +- rc = mount(pEntry->pszName, pEntry->pszActualMountPoint, "vboxsf", fFlags, &MntInfo); ++ rc = mount(pEntry->pszName, pEntry->pszActualMountPoint, "vboxsf", fFlags, szOpts); + if (rc == 0) + { + VGSvcVerbose(0, "vbsvcAutomounterMountIt: Successfully mounted '%s' on '%s'\n", + pEntry->pszName, pEntry->pszActualMountPoint); +- +- errno = 0; +- rc = vbsfmount_complete(pEntry->pszName, pEntry->pszActualMountPoint, fFlags, &MntOpts); +- if (rc != 0) /* Ignorable. /etc/mtab is probably a link to /proc/mounts. */ +- VGSvcVerbose(1, "vbsvcAutomounterMountIt: vbsfmount_complete failed: %s (%d/%d)\n", +- rc == 1 ? "open_memstream" : rc == 2 ? "setmntent" : rc == 3 ? "addmntent" : "unknown", rc, errno); + return VINF_SUCCESS; + } + else if (errno == EINVAL) diff --git a/trunk/PKGBUILD b/trunk/PKGBUILD index e1ba3cf..60b7696 100644 --- a/trunk/PKGBUILD +++ b/trunk/PKGBUILD @@ -101,7 +101,7 @@ sha256sums=('1b5aa85118c62fb67867b95167b05e66aa154b2caf44c0a3dc932ea5bee85d87' '55224cb74b54b331d691f171efc0d4c058a14f738551f1d8f559146c2908635d' '81900e13d36630488accd8c0bfd2ceb69563fb2c4f0f171caba1cca59d438024' 'da7e58ed37dc23c6202aab3017864579a99e78417f3421ddcc98a198198fe2c9' - 'a784f3cc24652a16385cc63abac6c5178932ca5f3861be7650631b7dafa753a4' + 'd083da2bd4898c65c08335440173c8ed9e01662064f2a99e5011683c96237285' 'f3ed6741f8977f40900c8aa372fa082df1f8723d497d4fff445153c543bc8947') prepare() {