1*72252591SKonstantin Belousov /*-
2*72252591SKonstantin Belousov * SPDX-License-Identifier: BSD-2-Clause
3*72252591SKonstantin Belousov *
4*72252591SKonstantin Belousov * Copyright (c) 2026 Alex S <iwtcex@gmail.com>
5*72252591SKonstantin Belousov * Copyright 2026 The FreeBSD Foundation
6*72252591SKonstantin Belousov *
7*72252591SKonstantin Belousov * Portions of this software were developed by
8*72252591SKonstantin Belousov * Konstantin Belousov <kib@FreeBSD.org> under sponsorship from
9*72252591SKonstantin Belousov * the FreeBSD Foundation.
10*72252591SKonstantin Belousov */
11*72252591SKonstantin Belousov
12*72252591SKonstantin Belousov #include <atf-c.h>
13*72252591SKonstantin Belousov #include <dlfcn.h>
14*72252591SKonstantin Belousov #include <fcntl.h>
15*72252591SKonstantin Belousov #include <link.h>
16*72252591SKonstantin Belousov #include <stdio.h>
17*72252591SKonstantin Belousov
18*72252591SKonstantin Belousov ATF_TC_WITHOUT_HEAD(dlopen_hash);
ATF_TC_BODY(dlopen_hash,tc)19*72252591SKonstantin Belousov ATF_TC_BODY(dlopen_hash, tc)
20*72252591SKonstantin Belousov {
21*72252591SKonstantin Belousov void *handle;
22*72252591SKonstantin Belousov char *pathfds;
23*72252591SKonstantin Belousov char *name;
24*72252591SKonstantin Belousov int testdir;
25*72252591SKonstantin Belousov
26*72252591SKonstantin Belousov handle = dlopen("libpythagoras.so.0", RTLD_LAZY);
27*72252591SKonstantin Belousov ATF_REQUIRE(handle == NULL);
28*72252591SKonstantin Belousov
29*72252591SKonstantin Belousov testdir = open(atf_tc_get_config_var(tc, "srcdir"),
30*72252591SKonstantin Belousov O_RDONLY | O_DIRECTORY);
31*72252591SKonstantin Belousov ATF_REQUIRE(testdir >= 0);
32*72252591SKonstantin Belousov
33*72252591SKonstantin Belousov ATF_REQUIRE(asprintf(&pathfds, "%d", testdir) > 0);
34*72252591SKonstantin Belousov ATF_REQUIRE(rtld_set_var("LIBRARY_PATH_FDS", pathfds) == 0);
35*72252591SKonstantin Belousov
36*72252591SKonstantin Belousov ATF_REQUIRE(asprintf(&name, "#%d/libpythagoras.so.0", testdir) > 0);
37*72252591SKonstantin Belousov handle = dlopen(name, RTLD_LAZY);
38*72252591SKonstantin Belousov ATF_REQUIRE(handle != NULL);
39*72252591SKonstantin Belousov }
40*72252591SKonstantin Belousov
ATF_TP_ADD_TCS(tp)41*72252591SKonstantin Belousov ATF_TP_ADD_TCS(tp)
42*72252591SKonstantin Belousov {
43*72252591SKonstantin Belousov ATF_TP_ADD_TC(tp, dlopen_hash);
44*72252591SKonstantin Belousov return atf_no_error();
45*72252591SKonstantin Belousov }
46