diff options
Diffstat (limited to 'intern/wayland_dynload/intern/wayland_dynload_libdecor.c')
-rw-r--r-- | intern/wayland_dynload/intern/wayland_dynload_libdecor.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/intern/wayland_dynload/intern/wayland_dynload_libdecor.c b/intern/wayland_dynload/intern/wayland_dynload_libdecor.c new file mode 100644 index 00000000000..d8bdd27bb27 --- /dev/null +++ b/intern/wayland_dynload/intern/wayland_dynload_libdecor.c @@ -0,0 +1,61 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup intern_wayland_dynload + * + * Wrapper functions for `<libdecor.h>`. + */ + +#include <stdlib.h> /* `atexit`. */ + +#include "wayland_dynload_API.h" +#include "wayland_dynload_utils.h" + +#include "wayland_dynload_libdecor.h" /* Own include. */ + +/* Public handle. */ +struct WaylandDynload_Libdecor wayland_dynload_libdecor = {NULL}; + +static DynamicLibrary lib = NULL; + +bool wayland_dynload_libdecor_init(const bool verbose) +{ + /* Library paths. */ + const char *paths[] = { + "libdecor-0.so.0", + "libdecor-0.so", + }; + const int paths_num = sizeof(paths) / sizeof(*paths); + int path_index; + if (!(lib = dynamic_library_open_array_with_error(paths, paths_num, verbose, &path_index))) { + return false; + } + if (atexit(wayland_dynload_libdecor_exit)) { + return false; + } + +#define WAYLAND_DYNLOAD_FN(symbol) \ + if (!(wayland_dynload_libdecor.symbol = dynamic_library_find_with_error( \ + lib, #symbol, paths[path_index]))) { \ + return false; \ + } +#include "wayland_dynload_libdecor.h" +#undef WAYLAND_DYNLOAD_FN + + return true; +} + +void wayland_dynload_libdecor_exit(void) +{ + if (lib != NULL) { + dynamic_library_close(lib); /* Ignore errors. */ + lib = NULL; + } +} + +/* Validate local signatures against the original header. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wredundant-decls" +#define WAYLAND_DYNLOAD_VALIDATE +#include "wayland_dynload_libdecor.h" +#pragma GCC diagnostic pop |