diff options
Diffstat (limited to 'src/network')
-rw-r--r-- | src/network/kernel/kernel.pri | 6 | ||||
-rw-r--r-- | src/network/kernel/qdnslookup_unix.cpp | 41 |
2 files changed, 33 insertions, 14 deletions
diff --git a/src/network/kernel/kernel.pri b/src/network/kernel/kernel.pri index 11b80d59d5..d7a92a12eb 100644 --- a/src/network/kernel/kernel.pri +++ b/src/network/kernel/kernel.pri @@ -38,7 +38,11 @@ qtConfig(dnslookup) { } unix { - !integrity:qtConfig(dnslookup): SOURCES += kernel/qdnslookup_unix.cpp + !integrity:qtConfig(dnslookup) { + SOURCES += kernel/qdnslookup_unix.cpp + qtConfig(dlopen): QMAKE_USE_PRIVATE += libdl + } + SOURCES += kernel/qhostinfo_unix.cpp qtConfig(linux-netlink): SOURCES += kernel/qnetworkinterface_linux.cpp diff --git a/src/network/kernel/qdnslookup_unix.cpp b/src/network/kernel/qdnslookup_unix.cpp index ce1ec6442a..ee7484ab35 100644 --- a/src/network/kernel/qdnslookup_unix.cpp +++ b/src/network/kernel/qdnslookup_unix.cpp @@ -59,6 +59,10 @@ # include <gnu/lib-names.h> #endif +#if defined(Q_OS_FREEBSD) || QT_CONFIG(dlopen) +# include <dlfcn.h> +#endif + #include <cstring> QT_BEGIN_NAMESPACE @@ -87,6 +91,18 @@ struct QDnsLookupStateDeleter } }; +static QFunctionPointer resolveSymbol(QLibrary &lib, const char *sym) +{ + if (lib.isLoaded()) + return lib.resolve(sym); + +#if defined(RTLD_DEFAULT) && (defined(Q_OS_FREEBSD) || QT_CONFIG(dlopen)) + return reinterpret_cast<QFunctionPointer>(dlsym(RTLD_DEFAULT, sym)); +#else + return nullptr; +#endif +} + static bool resolveLibraryInternal() { QLibrary lib; @@ -96,31 +112,30 @@ static bool resolveLibraryInternal() #endif { lib.setFileName(QLatin1String("resolv")); - if (!lib.load()) - return false; + lib.load(); } - local_dn_expand = dn_expand_proto(lib.resolve("__dn_expand")); + local_dn_expand = dn_expand_proto(resolveSymbol(lib, "__dn_expand")); if (!local_dn_expand) - local_dn_expand = dn_expand_proto(lib.resolve("dn_expand")); + local_dn_expand = dn_expand_proto(resolveSymbol(lib, "dn_expand")); - local_res_nclose = res_nclose_proto(lib.resolve("__res_nclose")); + local_res_nclose = res_nclose_proto(resolveSymbol(lib, "__res_nclose")); if (!local_res_nclose) - local_res_nclose = res_nclose_proto(lib.resolve("res_9_nclose")); + local_res_nclose = res_nclose_proto(resolveSymbol(lib, "res_9_nclose")); if (!local_res_nclose) - local_res_nclose = res_nclose_proto(lib.resolve("res_nclose")); + local_res_nclose = res_nclose_proto(resolveSymbol(lib, "res_nclose")); - local_res_ninit = res_ninit_proto(lib.resolve("__res_ninit")); + local_res_ninit = res_ninit_proto(resolveSymbol(lib, "__res_ninit")); if (!local_res_ninit) - local_res_ninit = res_ninit_proto(lib.resolve("res_9_ninit")); + local_res_ninit = res_ninit_proto(resolveSymbol(lib, "res_9_ninit")); if (!local_res_ninit) - local_res_ninit = res_ninit_proto(lib.resolve("res_ninit")); + local_res_ninit = res_ninit_proto(resolveSymbol(lib, "res_ninit")); - local_res_nquery = res_nquery_proto(lib.resolve("__res_nquery")); + local_res_nquery = res_nquery_proto(resolveSymbol(lib, "__res_nquery")); if (!local_res_nquery) - local_res_nquery = res_nquery_proto(lib.resolve("res_9_nquery")); + local_res_nquery = res_nquery_proto(resolveSymbol(lib, "res_9_nquery")); if (!local_res_nquery) - local_res_nquery = res_nquery_proto(lib.resolve("res_nquery")); + local_res_nquery = res_nquery_proto(resolveSymbol(lib, "res_nquery")); return true; } |