Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/bareos/bareos.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/stored/sd_backends_dynamic.cc')
-rw-r--r--core/src/stored/sd_backends_dynamic.cc78
1 files changed, 78 insertions, 0 deletions
diff --git a/core/src/stored/sd_backends_dynamic.cc b/core/src/stored/sd_backends_dynamic.cc
new file mode 100644
index 000000000..4917f08b9
--- /dev/null
+++ b/core/src/stored/sd_backends_dynamic.cc
@@ -0,0 +1,78 @@
+/*
+ BAREOSĀ® - Backup Archiving REcovery Open Sourced
+
+ Copyright (C) 2022-2022 Bareos GmbH & Co. KG
+
+ This program is Free Software; you can redistribute it and/or
+ modify it under the terms of version three of the GNU Affero General Public
+ License as published by the Free Software Foundation and included
+ in the file LICENSE.
+
+ 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
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero 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.
+*/
+/**
+ * @file
+ * Dynamic loading of SD backend plugins.
+ */
+
+#include "include/bareos.h"
+
+#include "stored/stored.h"
+#include "sd_backends.h"
+#include <dlfcn.h>
+
+namespace storagedaemon {
+
+#if defined(HAVE_WIN32)
+static const char* kDynLibExtension = ".dll";
+#else
+static const char* kDynLibExtension = ".so";
+#endif
+
+static bool LoadDynamicLibrary(
+ const std::string& library_file,
+ const std::vector<std::string>& library_directories)
+{
+ for (const auto& library_dir : library_directories) {
+ if (dlopen((library_dir + "/" + library_file).c_str(), RTLD_NOW)) {
+ Dmsg0(50, "Loaded dynamic library %s/%s\n", library_dir.c_str(),
+ library_file.c_str());
+ return true;
+ }
+ Dmsg0(50, "Could not load library %s/%s: %s\n", library_dir.c_str(),
+ library_file.c_str(), dlerror());
+ }
+ return false;
+}
+
+bool LoadStorageBackend(const std::string& dev_type,
+ const std::vector<std::string>& backend_directories)
+{
+ using namespace std::string_literals;
+
+ if (dev_type.empty() || backend_directories.empty()) { return false; }
+
+ if (!LoadDynamicLibrary("libbareossd-"s + dev_type + kDynLibExtension,
+ backend_directories)) {
+ return false;
+ }
+
+ if (!PluginRegistry<BackendInterface>::IsRegistered(dev_type)) {
+ Jmsg(nullptr, M_ERROR_TERM, 0,
+ "Loaded backend library for %s did not register its backend. This is "
+ "probably a bug in the backend library.\n",
+ dev_type.c_str());
+ }
+
+ return true;
+}
+
+} /* namespace storagedaemon */