Restore support for reading /etc/timezone for system zone name

This restores one of the two mechanisms removed in
commit b0383cbd388336f698ceeac11a4f50cdff931dd9,
transformed to fit in with the new cached system-zone determination.

Fixes: QTBUG-87326
Change-Id: Ic270acb0d958e17dbc74a0ff93a5a1843c939678
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
(cherry picked from commit 824d963700a91294ba4a543ebb486aedbd650284)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Edward Welbourne 2021-03-22 13:03:59 +01:00 committed by Qt Cherry-pick Bot
parent 5748c3ccb1
commit 0b50aaafd8

View File

@ -1169,8 +1169,11 @@ public:
*/
const StatIdent local = identify("/etc/localtime");
const StatIdent tz = identify("/etc/TZ");
if (!m_name.isEmpty() && m_last.isValid() && (m_last == local || m_last == tz))
const StatIdent timezone = identify("/etc/timezone");
if (!m_name.isEmpty() && m_last.isValid()
&& (m_last == local || m_last == tz || m_last == timezone)) {
return m_name;
}
m_name = etcLocalTime();
if (!m_name.isEmpty()) {
@ -1178,12 +1181,19 @@ public:
return m_name;
}
m_name = etcTZ();
m_last = m_name.isEmpty() ? StatIdent() : tz;
// Some systems (e.g. uClibc) have a default value for $TZ in /etc/TZ:
m_name = etcContent(QStringLiteral("/etc/TZ"));
if (!m_name.isEmpty()) {
m_last = tz;
return m_name;
}
// Gentoo still (2020, QTBUG-87326) uses this:
m_name = etcContent(QStringLiteral("/etc/timezone"));
m_last = m_name.isEmpty() ? StatIdent() : timezone;
return m_name;
}
private:
QByteArray m_name;
struct StatIdent
@ -1224,10 +1234,8 @@ private:
return QByteArray();
}
static QByteArray etcTZ()
static QByteArray etcContent(const QString &path)
{
// Some systems (e.g. uClibc) have a default value for $TZ in /etc/TZ:
const QString path = QStringLiteral("/etc/TZ");
QFile zone(path);
if (zone.open(QIODevice::ReadOnly))
return zone.readAll().trimmed();