@@ -178,7 +178,11 @@ void Process::finished(int exitCode, QProcess::ExitStatus exitStatus)
178
178
179
179
void Process::startup (QStringList args)
180
180
{
181
+ #ifdef Q_OS_ANDROID
182
+ QProcessEnvironment pe = interactiveProcessEnvironment ();
183
+ #else
181
184
QProcessEnvironment pe = QProcessEnvironment::systemEnvironment ();
185
+ #endif
182
186
183
187
foreach (const QString &key, mConfig .env .keys ()) {
184
188
qDebug () << key << mConfig .env .value (key);
@@ -239,3 +243,70 @@ void Process::setConfig(const Config &config)
239
243
{
240
244
mConfig = config;
241
245
}
246
+
247
+ QProcessEnvironment Process::interactiveProcessEnvironment () const
248
+ {
249
+ QProcessEnvironment env;
250
+
251
+ QProcess process;
252
+ process.start (" sh" );
253
+ if (!process.waitForStarted (3000 )) {
254
+ printf (" Could not start shell.\n " );
255
+ return env;
256
+ }
257
+
258
+ process.write (" source /system/etc/mkshrc\n " );
259
+ process.write (" export -p\n " );
260
+ process.closeWriteChannel ();
261
+
262
+ printf (" waiting for process to finish\n " );
263
+ if (!process.waitForFinished (1000 )) {
264
+ printf (" did not finish: terminate\n " );
265
+ process.terminate ();
266
+ if (!process.waitForFinished (1000 )) {
267
+ printf (" did not terminate: kill\n " );
268
+ process.kill ();
269
+ if (!process.waitForFinished (1000 )) {
270
+ printf (" Could not stop process.\n " );
271
+ }
272
+ }
273
+ }
274
+
275
+ QList<QByteArray> list = process.readAllStandardOutput ().split (' \n ' );
276
+ if (list.isEmpty ())
277
+ printf (" Failed to read environment output\n " );
278
+
279
+ foreach (QByteArray entry, list) {
280
+ if (entry.startsWith (" export " )) {
281
+ entry = entry.mid (7 );
282
+ } else if (entry.startsWith (" declare -x " )) {
283
+ entry = entry.mid (11 );
284
+ } else {
285
+ continue ;
286
+ }
287
+
288
+ QByteArray key;
289
+ QByteArray value;
290
+ int index = entry.indexOf (' =' );
291
+
292
+ if (index > 0 ) {
293
+ key = entry.left (index );
294
+ value = entry.mid (index + 1 );
295
+ } else {
296
+ key = entry;
297
+ // value is empty
298
+ }
299
+
300
+ // Remove simple escaping.
301
+ // This is not complete.
302
+ if (value.startsWith (' \' ' ) and value.endsWith (' \' ' ))
303
+ value = value.mid (1 , value.size ()-2 );
304
+ else if (value.startsWith (' "' ) and value.endsWith (' "' ))
305
+ value = value.mid (1 , value.size ()-2 );
306
+
307
+ env.insert (key, value);
308
+ }
309
+
310
+ return env;
311
+ }
312
+
0 commit comments