7#include <qplatformdefs.h>
8#include <QtCore/qbytearray.h>
9#include <QtCore/qmutex.h>
10#include <QtCore/qstring.h>
11#include <QtCore/qvarlengtharray.h>
13#include <QtCore/private/qlocale_p.h>
14#include <QtCore/private/qlocking_p.h>
20Q_CONSTINIT
static QBasicMutex environmentMutex;
23
24
25
26
27
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
53 const auto locker = qt_scoped_lock(environmentMutex);
54 return QByteArray(::getenv(varName));
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
107 QVarLengthArray<
wchar_t, 32> wname(qsizetype(strlen(varName)) + 1);
108 for (qsizetype i = 0; i < wname.size(); ++i)
109 wname[i] = uchar(varName[i]);
110 size_t requiredSize = 0;
111 auto locker = qt_unique_lock(environmentMutex);
112 _wgetenv_s(&requiredSize, 0, 0, wname.data());
113 if (requiredSize == 0)
115 QString buffer(qsizetype(requiredSize), Qt::Uninitialized);
116 _wgetenv_s(&requiredSize,
reinterpret_cast<
wchar_t *>(buffer.data()), requiredSize,
120 Q_ASSERT(buffer.endsWith(QChar(u'\0')));
124 const auto locker = qt_scoped_lock(environmentMutex);
125 const char *value = ::getenv(varName);
129#if defined(Q_OS_DARWIN)
130 return QString::fromUtf8(value).normalized(QString::NormalizationForm_C);
132 return QString::fromLocal8Bit(value);
139 return qEnvironmentVariable(varName, QString());
143
144
145
146
147
148
149
150
151
152
153
156 const auto locker = qt_scoped_lock(environmentMutex);
157 const char *
const value = ::getenv(varName);
158 return !value || !*value;
162QT_WARNING_DISABLE_GCC(
"-Wmaybe-uninitialized")
164
165
166
167
168
169
170
171
172
173
174
175
176
179 std::optional<qint64> value = qEnvironmentVariableIntegerValue(varName);
180 if (value && *value !=
int(*value))
181 value =
std::nullopt;
184 return int(value.value_or(0));
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214std::optional<qint64> qEnvironmentVariableIntegerValue(
const char *varName)
noexcept
216 const auto locker = qt_scoped_lock(environmentMutex);
217 const char *
const buffer = ::getenv(varName);
220 auto r = QLocaleData::bytearrayToLongLong(buffer, 0);
227
228
229
230
231
232
233
234
235
236
237
238
241 const auto locker = qt_scoped_lock(environmentMutex);
242 return ::getenv(varName) !=
nullptr;
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267bool qputenv(
const char *varName, QByteArrayView raw)
269 auto protect = [](
const char *str) {
return str ? str :
""; };
271 std::string value{protect(raw.data()), size_t(raw.size())};
273#if defined(Q_CC_MSVC)
274 const auto locker = qt_scoped_lock(environmentMutex);
275 return _putenv_s(varName, value.data()) == 0;
276#elif (defined(_POSIX_VERSION) && (_POSIX_VERSION-0
) >= 200112L
) || defined(Q_OS_HAIKU)
278 const auto locker = qt_scoped_lock(environmentMutex);
279 return setenv(varName, value.data(),
true) == 0;
282 buffer += protect(varName);
285 char *envVar = qstrdup(buffer.data());
287 const auto locker = qt_scoped_lock(environmentMutex);
288 return putenv(envVar);
297
298
299
300
301
302
303
304
305
306
309#if defined(Q_CC_MSVC)
310 const auto locker = qt_scoped_lock(environmentMutex);
311 return _putenv_s(varName,
"") == 0;
312#elif (defined(_POSIX_VERSION) && (_POSIX_VERSION-0
) >= 200112L
) || defined(Q_OS_BSD4) || defined(Q_OS_HAIKU)
314 const auto locker = qt_scoped_lock(environmentMutex);
315 return unsetenv(varName) == 0;
316#elif defined(Q_CC_MINGW)
318 QByteArray buffer(varName);
320 const auto locker = qt_scoped_lock(environmentMutex);
321 return putenv(buffer.constData()) == 0;
327 char *envVar = qstrdup(buffer.constData());
328 const auto locker = qt_scoped_lock(environmentMutex);
329 return putenv(envVar) == 0;
334
335
336
337
338
341 const auto locker = qt_scoped_lock(environmentMutex);
350
351
354 const auto locker = qt_scoped_lock(environmentMutex);
363
364
365
368 const auto locker = qt_scoped_lock(environmentMutex);
374 return !localtime_s(local, &utc);
375#elif QT_CONFIG(thread) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
381 if (tm *res = localtime_r(&utc, local)) {
382 Q_ASSERT(res == local);
391 if (tm *res = localtime(&utc)) {
400
401
402
403
404
405
406
407
408
416 const auto locker = qt_scoped_lock(environmentMutex);
418 ok = _get_tzname(&size, name,
sizeof(name), dstIndex) == 0;
420 Q_ASSERT(!ok || size <
sizeof(name));
422 const char *
const src = tzname[dstIndex];
423 size = src ? strlen(src) : 0;
424 ok = src !=
nullptr && size <
sizeof(name);
426 memcpy(name, src, size + 1);
429 return ok ? QString::fromLocal8Bit(name, qsizetype(size)) : QString();
bool qLocalTime(time_t utc, struct tm *local)
QString qEnvironmentVariable(const char *varName, const QString &defaultValue)
bool qputenv(const char *varName, QByteArrayView raw)
time_t qMkTime(struct tm *when)
QString qTzName(int dstIndex)
QString qEnvironmentVariable(const char *varName)
Q_CORE_EXPORT bool qEnvironmentVariableIsEmpty(const char *varName) noexcept
Q_CORE_EXPORT bool qEnvironmentVariableIsSet(const char *varName) noexcept
Q_CORE_EXPORT int qEnvironmentVariableIntValue(const char *varName, bool *ok=nullptr) noexcept
Q_CORE_EXPORT bool qunsetenv(const char *varName)