32#if defined(RES_NORELOAD)
37#elif defined(Q_OS_DARWIN)
42#elif defined(Q_OS_FREEBSD)
46#elif defined(Q_OS_OPENBSD)
50#elif defined(Q_OS_QNX)
56#if QT_CONFIG(libresolv)
60 Q_CONSTINIT
static QT_STATBUF lastStat = {};
61 Q_CONSTINIT
static QBasicMutex mutex = {};
62 if (QT_STATBUF st; QT_STAT(_PATH_RESCONF, &st) == 0) {
63 QMutexLocker locker(&mutex);
65 if ((_res.options & RES_INIT) == 0)
67 else if (lastStat.st_ctime != st.st_ctime)
69 else if (lastStat.st_dev != st.st_dev || lastStat.st_ino != st.st_ino)
97QString QHostInfo::localDomainName()
99#if QT_CONFIG(libresolv)
100 auto domainNameFromRes = [](res_state r) {
103 domainName = QUrl::fromAce(r->defdname);
104 if (domainName.isEmpty())
105 domainName = QUrl::fromAce(r->dnsrch[0]);
108 std::remove_pointer_t<res_state> state = {};
109 if (res_ninit(&state) == 0) {
111 auto guard = qScopeGuard([&] { res_nclose(&state); });
112 return domainNameFromRes(&state);
116 maybeRefreshResolver();
117 return domainNameFromRes(&_res);
123 if (!resolvconf.open(QIODevice::ReadOnly))
127 QByteArray lineArray;
128 while (resolvconf.readLineInto(&lineArray)) {
129 QByteArrayView line = QByteArrayView(lineArray).trimmed();
130 constexpr QByteArrayView domainWithSpace =
"domain ";
131 if (line.startsWith(domainWithSpace))
132 return QUrl::fromAce(line.mid(domainWithSpace.size()).trimmed().toByteArray());
135 constexpr QByteArrayView searchWithSpace =
"search ";
136 if (domainName.isEmpty() && line.startsWith(searchWithSpace)) {
137 QByteArrayView searchDomain = line.mid(searchWithSpace.size()).trimmed();
138 int pos = searchDomain.indexOf(
' ');
140 searchDomain.truncate(pos);
141 domainName = QUrl::fromAce(searchDomain.toByteArray());