From c8830a04b4adc3048b76c658fa1084e749f188da Mon Sep 17 00:00:00 2001 From: kokokodak <82901997+kokokodak@users.noreply.github.com> Date: Wed, 14 Jul 2021 14:43:34 +0300 Subject: Add support for OpenBSD (#779) * OpenBSD: add basic support modified: Build/Include/Makefile.inc modified: Driver/Fuse/FuseService.cpp modified: Main/FatalErrorHandler.cpp modified: Makefile modified: Platform/Unix/File.cpp modified: Platform/Unix/FilesystemPath.cpp modified: Platform/Unix/SystemInfo.cpp * OpenBSD: some necessary files were missing new file: Core/Unix/OpenBSD/CoreOpenBSD.cpp new file: Core/Unix/OpenBSD/CoreOpenBSD.h new file: Core/Unix/OpenBSD/System.h --- src/Core/Unix/OpenBSD/CoreOpenBSD.cpp | 166 ++++++++++++++++++++++++++++++++++ src/Core/Unix/OpenBSD/CoreOpenBSD.h | 44 +++++++++ src/Core/Unix/OpenBSD/System.h | 19 ++++ 3 files changed, 229 insertions(+) create mode 100755 src/Core/Unix/OpenBSD/CoreOpenBSD.cpp create mode 100755 src/Core/Unix/OpenBSD/CoreOpenBSD.h create mode 100755 src/Core/Unix/OpenBSD/System.h (limited to 'src/Core/Unix') diff --git a/src/Core/Unix/OpenBSD/CoreOpenBSD.cpp b/src/Core/Unix/OpenBSD/CoreOpenBSD.cpp new file mode 100755 index 00000000..0b55b401 --- /dev/null +++ b/src/Core/Unix/OpenBSD/CoreOpenBSD.cpp @@ -0,0 +1,166 @@ +/* $OpenBSD$ */ +/* + Based on FreeBSD/CoreFreeBSD.cpp + + Derived from source code of TrueCrypt 7.1a, which is + Copyright (c) 2008-2012 TrueCrypt Developers Association and which is governed + by the TrueCrypt License 3.0. + + Modifications and additions to the original source code (contained in this file) + and all other portions of this file are Copyright (c) 2013-2017 IDRIX + and are governed by the Apache License 2.0 the full text of which is + contained in the file License.txt included in VeraCrypt binary and source + code distribution packages. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "CoreOpenBSD.h" +#include "Core/Unix/CoreServiceProxy.h" + +namespace VeraCrypt +{ + CoreOpenBSD::CoreOpenBSD () + { + } + + CoreOpenBSD::~CoreOpenBSD () + { + } + + DevicePath CoreOpenBSD::AttachFileToLoopDevice (const FilePath &filePath, bool readOnly) const + { + list args; + + if (readOnly) + { + throw; + } + + // find an available vnd + int freeVnd = -1; + for (int vnd = 0; vnd <= 3; vnd++) + { + stringstream devPath; + devPath << "/dev/vnd" << vnd << "c"; + + if (FilesystemPath (devPath.str()).IsBlockDevice() || FilesystemPath (devPath.str()).IsCharacterDevice()) + { + make_shared_auto (HostDevice, device); + device->Path = devPath.str(); + try + { + GetDeviceSize (device->Path); + } + catch (...) + { + freeVnd = vnd; + break; + } + } + } + + if (freeVnd == -1) + throw "couldn't find free vnd"; + + args.push_back ("-c"); + + stringstream freePath; + freePath << "vnd" << freeVnd; + args.push_back (freePath.str()); + + args.push_back (filePath); + + Process::Execute ("vnconfig", args); + + return "/dev/" + freePath.str() + "c"; + } + + void CoreOpenBSD::DetachLoopDevice (const DevicePath &devicePath) const + { + list args; + args.push_back ("-u"); + args.push_back (devicePath); + + for (int t = 0; true; t++) + { + try + { + Process::Execute ("vnconfig", args); + break; + } + catch (ExecutedProcessFailed&) + { + if (t > 5) + throw; + Thread::Sleep (200); + } + } + } + + // not sure what this is used for + HostDeviceList CoreOpenBSD::GetHostDevices (bool pathListOnly) const + { + throw; + } + + MountedFilesystemList CoreOpenBSD::GetMountedFilesystems (const DevicePath &devicePath, const DirectoryPath &mountPoint) const + { + + static Mutex mutex; + ScopeLock sl (mutex); + + struct statfs *sysMountList; + int count = getmntinfo (&sysMountList, MNT_NOWAIT); + throw_sys_if (count == 0); + + MountedFilesystemList mountedFilesystems; + + for (int i = 0; i < count; i++) + { + make_shared_auto (MountedFilesystem, mf); + + if (sysMountList[i].f_mntfromname[0]) + mf->Device = DevicePath (sysMountList[i].f_mntfromname); + else + continue; + + if (sysMountList[i].f_mntonname[0]) + mf->MountPoint = DirectoryPath (sysMountList[i].f_mntonname); + + mf->Type = sysMountList[i].f_fstypename; + + if ((devicePath.IsEmpty() || devicePath == mf->Device) && (mountPoint.IsEmpty() || mountPoint == mf->MountPoint)) + mountedFilesystems.push_back (mf); + } + + return mountedFilesystems; + } + + void CoreOpenBSD::MountFilesystem (const DevicePath &devicePath, const DirectoryPath &mountPoint, const string &filesystemType, bool readOnly, const string &systemMountOptions) const + { + try + { + // Try to mount FAT by default as mount is unable to probe filesystem type on BSD + CoreUnix::MountFilesystem (devicePath, mountPoint, filesystemType.empty() ? "msdos" : filesystemType, readOnly, systemMountOptions); + } + catch (ExecutedProcessFailed&) + { + if (!filesystemType.empty()) + throw; + + CoreUnix::MountFilesystem (devicePath, mountPoint, filesystemType, readOnly, systemMountOptions); + } + } + +#ifdef TC_OPENBSD + unique_ptr Core (new CoreServiceProxy ); + unique_ptr CoreDirect (new CoreOpenBSD); +#endif +} diff --git a/src/Core/Unix/OpenBSD/CoreOpenBSD.h b/src/Core/Unix/OpenBSD/CoreOpenBSD.h new file mode 100755 index 00000000..3f6c48b5 --- /dev/null +++ b/src/Core/Unix/OpenBSD/CoreOpenBSD.h @@ -0,0 +1,44 @@ +/* $OpenBSD$ */ +/* + Based on FreeBSD/CoreFreeBSD.h + + Derived from source code of TrueCrypt 7.1a, which is + Copyright (c) 2008-2012 TrueCrypt Developers Association and which is governed + by the TrueCrypt License 3.0. + + Modifications and additions to the original source code (contained in this file) + and all other portions of this file are Copyright (c) 2013-2017 IDRIX + and are governed by the Apache License 2.0 the full text of which is + contained in the file License.txt included in VeraCrypt binary and source + code distribution packages. +*/ + +#ifndef TC_HEADER_Core_CoreOpenBSD +#define TC_HEADER_Core_CoreOpenBSD + +#include "System.h" +#include "Core/Unix/CoreUnix.h" + +namespace VeraCrypt +{ + class CoreOpenBSD : public CoreUnix + { + public: + CoreOpenBSD (); + virtual ~CoreOpenBSD (); + + virtual HostDeviceList GetHostDevices (bool pathListOnly = false) const; + + protected: + virtual DevicePath AttachFileToLoopDevice (const FilePath &filePath, bool readOnly) const; + virtual void DetachLoopDevice (const DevicePath &devicePath) const; + virtual MountedFilesystemList GetMountedFilesystems (const DevicePath &devicePath = DevicePath(), const DirectoryPath &mountPoint = DirectoryPath()) const; + virtual void MountFilesystem (const DevicePath &devicePath, const DirectoryPath &mountPoint, const string &filesystemType, bool readOnly, const string &systemMountOptions) const; + + private: + CoreOpenBSD (const CoreOpenBSD &); + CoreOpenBSD &operator= (const CoreOpenBSD &); + }; +} + +#endif // TC_HEADER_Core_CoreOpenBSD diff --git a/src/Core/Unix/OpenBSD/System.h b/src/Core/Unix/OpenBSD/System.h new file mode 100755 index 00000000..90b24b2a --- /dev/null +++ b/src/Core/Unix/OpenBSD/System.h @@ -0,0 +1,19 @@ +/* $OpenBSD$ */ +/* + Based on FreeBSD/System.h + + Derived from source code of TrueCrypt 7.1a, which is + Copyright (c) 2008-2012 TrueCrypt Developers Association and which is governed + by the TrueCrypt License 3.0. + + Modifications and additions to the original source code (contained in this file) + and all other portions of this file are Copyright (c) 2013-2017 IDRIX + and are governed by the Apache License 2.0 the full text of which is + contained in the file License.txt included in VeraCrypt binary and source + code distribution packages. +*/ + +#ifndef TC_HEADER_Platform_OpenBSD_System +#define TC_HEADER_Platform_OpenBSD_System + +#endif // TC_HEADER_Platform_OpenBSD_System -- cgit v1.2.3