8#include <qplatformdefs.h>
9#include <QtCore/qbytearray.h>
10#include <QtCore/qmutex.h>
11#include <QtCore/qstring.h>
12#include <QtCore/qvarlengtharray.h>
14#include <QtCore/private/qlocale_p.h>
15#include <QtCore/private/qlocking_p.h>
21Q_CONSTINIT
static QBasicMutex environmentMutex;
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
69 const auto locker = qt_scoped_lock(environmentMutex);
70 return QByteArray(::getenv(varName));
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
123 QVarLengthArray<
wchar_t, 32> wname(qsizetype(strlen(varName)) + 1);
124 for (qsizetype i = 0; i < wname.size(); ++i)
125 wname[i] = uchar(varName[i]);
126 size_t requiredSize = 0;
127 auto locker = qt_unique_lock(environmentMutex);
128 _wgetenv_s(&requiredSize, 0, 0, wname.data());
129 if (requiredSize == 0)
131 QString buffer(qsizetype(requiredSize), Qt::Uninitialized);
132 _wgetenv_s(&requiredSize,
reinterpret_cast<
wchar_t *>(buffer.data()), requiredSize,
136 Q_ASSERT(buffer.endsWith(QChar(u'\0')));
140 const auto locker = qt_scoped_lock(environmentMutex);
141 const char *value = ::getenv(varName);
145#if defined(Q_OS_DARWIN)
146 return QString::fromUtf8(value).normalized(QString::NormalizationForm_C);
148 return QString::fromLocal8Bit(value);
155 return qEnvironmentVariable(varName, QString());
159
160
161
162
163
164
165
166
167
168
169
172 const auto locker = qt_scoped_lock(environmentMutex);
173 const char *
const value = ::getenv(varName);
174 return !value || !*value;
178QT_WARNING_DISABLE_GCC(
"-Wmaybe-uninitialized")
180
181
182
183
184
185
186
187
188
189
190
191
192
195 std::optional<qint64> value = qEnvironmentVariableIntegerValue(varName);
196 if (value && *value !=
int(*value))
197 value =
std::nullopt;
200 return int(value.value_or(0));
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230std::optional<qint64> qEnvironmentVariableIntegerValue(
const char *varName)
noexcept
232 const auto locker = qt_scoped_lock(environmentMutex);
233 const char *
const buffer = ::getenv(varName);
236 auto r = QLocaleData::bytearrayToLongLong(buffer, 0);
243
244
245
246
247
248
249
250
251
252
253
254
257 const auto locker = qt_scoped_lock(environmentMutex);
258 return ::getenv(varName) !=
nullptr;
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283bool qputenv(
const char *varName, QByteArrayView raw)
285 auto protect = [](
const char *str) {
return str ? str :
""; };
287 std::string value{protect(raw.data()), size_t(raw.size())};
289#if defined(Q_CC_MSVC)
290 const auto locker = qt_scoped_lock(environmentMutex);
291 return _putenv_s(varName, value.data()) == 0;
292#elif (defined(_POSIX_VERSION) && (_POSIX_VERSION-0
) >= 200112L
) || defined(Q_OS_HAIKU)
294 const auto locker = qt_scoped_lock(environmentMutex);
295 return setenv(varName, value.data(),
true) == 0;
298 buffer += protect(varName);
301 char *envVar = qstrdup(buffer.data());
303 const auto locker = qt_scoped_lock(environmentMutex);
304 return putenv(envVar);
313
314
315
316
317
318
319
320
321
322
325#if defined(Q_CC_MSVC)
326 const auto locker = qt_scoped_lock(environmentMutex);
327 return _putenv_s(varName,
"") == 0;
328#elif (defined(_POSIX_VERSION) && (_POSIX_VERSION-0
) >= 200112L
) || defined(Q_OS_BSD4) || defined(Q_OS_HAIKU)
330 const auto locker = qt_scoped_lock(environmentMutex);
331 return unsetenv(varName) == 0;
332#elif defined(Q_CC_MINGW)
334 QByteArray buffer(varName);
336 const auto locker = qt_scoped_lock(environmentMutex);
337 return putenv(buffer.constData()) == 0;
343 char *envVar = qstrdup(buffer.constData());
344 const auto locker = qt_scoped_lock(environmentMutex);
345 return putenv(envVar) == 0;
350
351
352
353
354
357 const auto locker = qt_scoped_lock(environmentMutex);
366
367
370 const auto locker = qt_scoped_lock(environmentMutex);
379
380
381
384 const auto locker = qt_scoped_lock(environmentMutex);
390 return !localtime_s(local, &utc);
391#elif QT_CONFIG(thread) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
397 if (tm *res = localtime_r(&utc, local)) {
398 Q_ASSERT(res == local);
407 if (tm *res = localtime(&utc)) {
416
417
418
419
420
421
422
423
424
432 const auto locker = qt_scoped_lock(environmentMutex);
434 ok = _get_tzname(&size, name,
sizeof(name), dstIndex) == 0;
436 Q_ASSERT(!ok || size <
sizeof(name));
438 const char *
const src = tzname[dstIndex];
439 size = src ? strlen(src) : 0;
440 ok = src !=
nullptr && size <
sizeof(name);
442 memcpy(name, src, size + 1);
445 return ok ? QString::fromLocal8Bit(name, qsizetype(size)) : QString();
Combined button and popup list for selecting options.
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)