diff --git a/gio/tests/meson.build b/gio/tests/meson.build index c825b0cd7..56a04cce1 100644 --- a/gio/tests/meson.build +++ b/gio/tests/meson.build @@ -12,20 +12,20 @@ test_c_args = [ '-UG_DISABLE_ASSERT', ] -# workaround for https://github.com/mesonbuild/meson/issues/6880 -if build_machine.system() == 'linux' - libutil_name = 'libutil' - libutil = run_command('sh', '-c', - '''ldconfig -p | grep -o "[[:space:]]@0@\.so\(\.[0-9]\+\)\?\b"''' - .format(libutil_name), check: false).stdout().strip().split('\n') +libutil_dep = dependency('', required : false) - if libutil.length() > 0 - message('Found libutil as @0@'.format(libutil[0])) - test_c_args += '-DLIBUTIL_SONAME="@0@"'.format(libutil[0]) - else - warning('libutil not found') - endif # libutil.length() > 0 -endif # build_machine.system() == 'linux' +if cc.has_header('pty.h') + have_openpty = cc.has_function('openpty', prefix : '#include ') + + if host_machine.system() == 'linux' and not have_openpty + libutil_dep = cc.find_library('util', required : false) + have_openpty = cc.has_function('openpty', dependencies : libutil_dep, prefix : '#include ') + endif + + if have_openpty + test_c_args += '-DHAVE_OPENPTY' + endif +endif if host_machine.system() == 'windows' common_gio_tests_deps += [iphlpapi_dep, winsock2, cc.find_library ('secur32')] @@ -91,7 +91,7 @@ gio_tests = { 'network-monitor' : {}, 'network-monitor-race' : {}, 'permission' : {}, - 'pollable' : {'dependencies' : [libdl_dep]}, + 'pollable' : {'dependencies' : [libutil_dep]}, 'power-profile-monitor' : {}, 'proxy-test' : {}, 'readwrite' : {}, diff --git a/gio/tests/pollable.c b/gio/tests/pollable.c index 516d7f4e4..97c26c25d 100644 --- a/gio/tests/pollable.c +++ b/gio/tests/pollable.c @@ -22,12 +22,20 @@ #include #ifdef G_OS_UNIX -#include #include +#ifdef HAVE_OPENPTY +#include +#endif #include #include #endif +/* openpty() is non-standard and might not be available on all kernels + * and libc implementations, but glibc on Linux definitely has it */ +#if defined(__linux__) && defined(__GNUC__) && !defined(HAVE_OPENPTY) +#error Should have been able to find openpty on GNU/Linux +#endif + GMainLoop *loop; GPollableInputStream *in; GOutputStream *out; @@ -185,31 +193,19 @@ test_pollable_unix_pipe (void) static void test_pollable_unix_pty (void) { - int (*openpty_impl) (int *, int *, char *, void *, void *); +#ifdef HAVE_OPENPTY int a, b, status; -#ifdef LIBUTIL_SONAME - void *handle; #endif g_test_summary ("Test that PTYs are considered pollable"); -#ifdef LIBUTIL_SONAME - handle = dlopen (LIBUTIL_SONAME, RTLD_GLOBAL | RTLD_LAZY); - g_assert_nonnull (handle); -#endif +#ifdef HAVE_OPENPTY + status = openpty (&a, &b, NULL, NULL, NULL); - openpty_impl = dlsym (RTLD_DEFAULT, "openpty"); - if (openpty_impl == NULL) - { - g_test_skip ("System does not support openpty()"); - goto close_libutil; - } - - status = openpty_impl (&a, &b, NULL, NULL, NULL); if (status == -1) { g_test_skip ("Unable to open PTY"); - goto close_libutil; + return; } in = G_POLLABLE_INPUT_STREAM (g_unix_input_stream_new (a, TRUE)); @@ -222,12 +218,8 @@ test_pollable_unix_pty (void) close (a); close (b); - -close_libutil: -#ifdef LIBUTIL_SONAME - dlclose (handle); #else - return; + g_test_skip ("openpty not found"); #endif }