loader: Add OpenBSD support
authorBrad Smith <brad@comstyle.com>
Wed, 31 Aug 2022 00:14:18 +0000 (20:14 -0400)
committerCharles Giessen <46324611+charles-lunarg@users.noreply.github.com>
Wed, 31 Aug 2022 16:02:13 +0000 (10:02 -0600)
14 files changed:
loader/get_environment.c
loader/get_environment.h
loader/stack_allocation.h
loader/vk_loader_platform.h
tests/framework/framework_config.h.in
tests/framework/shim/shim.h
tests/framework/shim/shim_common.cpp
tests/framework/shim/unix_shim.cpp
tests/framework/test_environment.cpp
tests/framework/test_util.cpp
tests/framework/test_util.h
tests/loader_envvar_tests.cpp
tests/loader_regression_tests.cpp
tests/loader_testing_main.cpp

index 42412389560d899974a694ca662c634e860ac36a..41ed61f66fd8e80ce4d5c853c76f36d8a76de3b0 100644 (file)
@@ -32,7 +32,7 @@
 #include "log.h"
 
 // Environment variables
-#if defined(__linux__) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__QNXNTO__) || defined(__FreeBSD__)
+#if defined(__linux__) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__QNXNTO__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 
 bool is_high_integrity() { return geteuid() != getuid() || getegid() != getgid(); }
 
@@ -44,7 +44,7 @@ char *loader_getenv(const char *name, const struct loader_instance *inst) {
 }
 
 char *loader_secure_getenv(const char *name, const struct loader_instance *inst) {
-#if defined(__APPLE__) || defined(__FreeBSD__)
+#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)
     // Apple does not appear to have a secure getenv implementation.
     // The main difference between secure getenv and getenv is that secure getenv
     // returns NULL if the process is being run with elevated privileges by a normal user.
index 0da7286a789b412bb4e0a8ce031b539720a7d80d..2b1663b41289f64dc792058f1acf8d3c473b6bee 100644 (file)
 char *loader_getenv(const char *name, const struct loader_instance *inst);
 void loader_free_getenv(char *val, const struct loader_instance *inst);
 
-#if defined(WIN32) || defined(__linux__) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__QNXNTO__) || defined(__FreeBSD__)
+#if defined(WIN32) || defined(__linux__) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__QNXNTO__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 
 bool is_high_integrity();
 
 char *loader_secure_getenv(const char *name, const struct loader_instance *inst);
 
-#endif
\ No newline at end of file
+#endif
index 0ddd5ca3c78793eec8d5cd1607dacad11843fe3a..c724de6cab46febc57789bd14a800bb9cd239e2f 100644 (file)
@@ -34,7 +34,7 @@
 #include <alloca.h>
 #endif
 
-#if defined(__linux__) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__QNXNTO__) || defined(__FreeBSD__)
+#if defined(__linux__) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__QNXNTO__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 #define loader_stack_alloc(size) alloca(size)
 #elif defined(_WIN32)
 #define loader_stack_alloc(size) _alloca(size)
index 864eaf4be22b4bdd6dff96cce95e7978fdcd9d9a..8ad97545e5f6dbf466c7168a73154f03b76ce319 100644 (file)
@@ -24,7 +24,7 @@
  */
 #pragma once
 
-#if defined(__FreeBSD__)
+#if defined(__FreeBSD__) || defined(__OpenBSD__)
 #include <sys/types.h>
 #include <sys/select.h>
 #endif
@@ -43,7 +43,7 @@
 #include "dlopen_fuchsia.h"
 #endif  // defined(__Fuchsia__)
 
-#if defined(__linux__) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__QNXNTO__) || defined(__FreeBSD__)
+#if defined(__linux__) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__QNXNTO__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 #include <unistd.h>
 // Note: The following file is for dynamic loading:
 #include <dlfcn.h>
@@ -98,7 +98,7 @@
 #define LAYERS_PATH_ENV "VK_LAYER_PATH"
 #define ENABLED_LAYERS_ENV "VK_INSTANCE_LAYERS"
 
-#if defined(__linux__) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__QNXNTO__) || defined(__FreeBSD__)
+#if defined(__linux__) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__QNXNTO__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 /* Linux-specific common code: */
 
 // VK Library Filenames, Paths, etc.:
@@ -219,7 +219,7 @@ static inline void loader_platform_thread_once_fn(pthread_once_t *ctl, void (*fu
 
 #endif
 
-#if defined(__linux__) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__QNXNTO__) || defined(__FreeBSD__)
+#if defined(__linux__) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__QNXNTO__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 
 // File IO
 static inline bool loader_platform_file_exists(const char *path) {
index 4b956937b4f9b7f90346b33f4587be17d3f2913d..406722cb397c47417d616ac15919a9c55543aa9b 100644 (file)
@@ -72,7 +72,7 @@
 #define BAD_DUMMY_BINARY_WINDOWS_64 "${CMAKE_CURRENT_SOURCE_DIR}/data/binaries/libdummy_library_elf_64.dll"
 #define BAD_DUMMY_BINARY_WINDOWS_32 "${CMAKE_CURRENT_SOURCE_DIR}/data/binaries/libdummy_library_elf_32.dll"
 #endif
-#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
+#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 #define DUMMY_BINARY_LINUX_64 "${CMAKE_CURRENT_SOURCE_DIR}/data/binaries/libdummy_library_elf_64.so"
 #define DUMMY_BINARY_LINUX_32 "${CMAKE_CURRENT_SOURCE_DIR}/data/binaries/libdummy_library_elf_32.so"
 #define BAD_DUMMY_BINARY_LINUX_64 "${CMAKE_CURRENT_SOURCE_DIR}/data/binaries/dummy_library_pe_64.so"
index 4b0c8bc23c50cdf516d13e6516dd93157453e73e..066ec3e649e74736beb2c451820e4763c0b7e33b 100644 (file)
@@ -110,7 +110,7 @@ struct D3DKMT_Adapter {
     D3DKMT_Adapter& add_path(fs::path src, std::vector<std::wstring>& dest);
 };
 
-#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
+#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 
 struct DirEntry {
     DIR* directory;
@@ -181,7 +181,7 @@ struct PlatformShim {
     size_t created_key_count = 0;
     std::vector<HKeyHandle> created_keys;
 
-#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
+#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)
     bool is_fake_path(fs::path const& path);
     fs::path const& get_fake_path(fs::path const& path);
 
index e946c0d4c134bb56314e5ff2b075070fac5e86f5..dd4c4bf8e57065943995f3de22bf2ac49136a75d 100644 (file)
@@ -42,7 +42,7 @@ std::vector<std::string> parse_env_var_list(std::string const& var) {
     for (size_t i = 0; i < var.size(); i++) {
 #if defined(WIN32)
         if (var[i] == ';') {
-#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
+#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)
         if (var[i] == ':') {
 #endif
             if (len != 0) {
@@ -145,7 +145,7 @@ void PlatformShim::add_CM_Device_ID(std::wstring const& id, fs::path const& icd_
 
 void PlatformShim::redirect_category(fs::path const& new_path, ManifestCategory search_category) {}
 
-#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
+#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 
 #include <dirent.h>
 #include <unistd.h>
index 1fdadbcfbe9c37c3560c69f2c2e44b8fd0f0f186..c52bec7bc00b11d3885c9e8228e81b0daac86880 100644 (file)
@@ -29,7 +29,7 @@
 
 static PlatformShim platform_shim;
 extern "C" {
-#if defined(__linux__) || defined(__FreeBSD__)
+#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 PlatformShim* get_platform_shim(std::vector<fs::FolderManager>* folders) {
     platform_shim = PlatformShim(folders);
     return &platform_shim;
@@ -42,7 +42,7 @@ FRAMEWORK_EXPORT PlatformShim* get_platform_shim(std::vector<fs::FolderManager>*
 #endif
 
 // Necessary for MacOS function shimming
-#if defined(__linux__) || defined(__FreeBSD__)
+#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 #define OPENDIR_FUNC_NAME opendir
 #define READDIR_FUNC_NAME readdir
 #define CLOSEDIR_FUNC_NAME closedir
index 7654be7239a0718443903b4bfe477da2623cc3a8..5d058ab52c3651a114a9f5e344b5e203993770fb 100644 (file)
@@ -142,7 +142,7 @@ PlatformShimWrapper::PlatformShimWrapper(std::vector<fs::FolderManager>* folders
     PFN_get_platform_shim get_platform_shim_func = shim_library.get_symbol(GET_PLATFORM_SHIM_STR);
     assert(get_platform_shim_func != NULL && "Must be able to get \"platform_shim\"");
     platform_shim = get_platform_shim_func(folders);
-#elif defined(__linux__) || defined(__FreeBSD__)
+#elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__)
     platform_shim = get_platform_shim(folders);
 #endif
     platform_shim->reset();
index e77b2c375ffc2eb1855fb3fddce8fecaad14b6a7..f7acaee190771c5e59b53295976ec9afa0f59b0e 100644 (file)
@@ -77,7 +77,7 @@ std::string get_env_var(std::string const& name, bool report_failure) {
     }
     return narrow(value);
 }
-#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
+#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 
 void set_env_var(std::string const& name, std::string const& value) { setenv(name.c_str(), value.c_str(), 1); }
 void remove_env_var(std::string const& name) { unsetenv(name.c_str()); }
@@ -224,7 +224,7 @@ std::string make_native(std::string const& in_path) {
         else
             out += c;
     }
-#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
+#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)
     for (size_t i = 0; i < in_path.size(); i++) {
         if (i + 1 < in_path.size() && in_path[i] == '\\' && in_path[i + 1] == '\\') {
             out += '/';
index f3ee26b23e924ef02be5c1a99b8643c535777634..d9f4d2bd1261f1fa9fef4221b3c6d6ef19392908 100644 (file)
@@ -66,7 +66,7 @@
 #include <direct.h>
 #include <windows.h>
 #include <strsafe.h>
-#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
+#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 #include <dirent.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -109,7 +109,7 @@ void set_env_var(std::string const& name, std::string const& value);
 void remove_env_var(std::string const& name);
 std::string get_env_var(std::string const& name, bool report_failure = true);
 
-#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
+#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 void set_env_var(std::string const& name, std::string const& value);
 void remove_env_var(std::string const& name);
 std::string get_env_var(std::string const& name, bool report_failure = true);
@@ -141,7 +141,7 @@ struct path {
    private:
 #if defined(WIN32)
     static const char path_separator = '\\';
-#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
+#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)
     static const char path_separator = '/';
 #endif
 
@@ -282,7 +282,7 @@ inline char* loader_platform_get_proc_address_error(const char* name) {
     return errorMsg;
 }
 
-#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
+#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 
 typedef void* loader_platform_dl_handle;
 inline loader_platform_dl_handle loader_platform_open_library(const char* libPath) {
index b7d7534f3a57cc7fa110947c11f918de7829a8d1..63e050c9be40748d9e53df1aa673e20b599cc0f8 100644 (file)
@@ -151,7 +151,7 @@ TEST(EnvVarICDOverrideSetup, TestOnlyDriverEnvVar) {
     remove_env_var("VK_DRIVER_FILES");
 }
 
-#if defined(__linux__) || defined(__FreeBSD__)
+#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 // Make sure the loader reports the correct message based on if USE_UNSAFE_FILE_SEARCH is set or not
 TEST(EnvVarICDOverrideSetup, NonSecureEnvVarLookup) {
     FrameworkEnvironment env{};
@@ -255,7 +255,7 @@ TEST(EnvVarICDOverrideSetup, TestBothDriverEnvVars) {
     remove_env_var("VK_ADD_DRIVER_FILES");
 }
 
-#if defined(__linux__) || defined(__FreeBSD__)
+#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 // Test VK_LAYER_PATH environment variable
 TEST(EnvVarICDOverrideSetup, TestOnlyLayerEnvVar) {
     FrameworkEnvironment env{};
index da1b3721f3659946cee729cee329cb7d05f962b0..0b7389ecd5a982759ba2c2ed629acb7a0c54ef16 100644 (file)
@@ -1027,7 +1027,7 @@ TEST(TryLoadWrongBinaries, WrongICD) {
 #if _WIN32 || _WIN64
     ASSERT_TRUE(log.find("Failed to open dynamic library"));
 #endif
-#if defined(__linux__) || defined(__FreeBSD__)
+#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 #if defined(__x86_64__)
     ASSERT_TRUE(log.find("wrong ELF class: ELFCLASS32"));
 #else
index 36c018e4a3e59a5f0b284df709273afa5a3c472f..eb2c8f836cde1d2e468e3ca2ae144e0002d0c98f 100644 (file)
@@ -58,13 +58,13 @@ int main(int argc, char** argv) {
     remove_env_var("VK_LOADER_DEBUG");
     remove_env_var("VK_LOADER_DISABLE_INST_EXT_FILTER");
 
-#if defined(__linux__) || defined(__FreeBSD__)
+#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__)
     set_env_var("XDG_CONFIG_HOME", "/etc");
     set_env_var("XDG_CONFIG_DIRS", "/etc");
     set_env_var("XDG_DATA_HOME", "/etc");
     set_env_var("XDG_DATA_DIRS", "/etc");
 #endif
-#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
+#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)
     set_env_var("HOME", "/home/fake_home");
 #endif