30
30
#include < QTcpSocket>
31
31
#include < errno.h>
32
32
33
+ bool parseConfigFileDirectory (Config *config, const QString &dirName);
33
34
static int pipefd[2 ];
34
35
35
36
static void signalhandler (int )
@@ -90,13 +91,13 @@ Process::Process()
90
91
, mDebuggee(0 )
91
92
, mDebug(false )
92
93
, mStdoutFd(1 )
94
+ , mBeingRestarted(false )
93
95
{
94
96
mProcess ->setProcessChannelMode (QProcess::SeparateChannels);
95
97
connect (mProcess , &QProcess::readyReadStandardError, this , &Process::readyReadStandardError);
96
98
connect (mProcess , &QProcess::readyReadStandardOutput, this , &Process::readyReadStandardOutput);
97
99
connect (mProcess , (void (QProcess::*)(int , QProcess::ExitStatus))&QProcess::finished, this , &Process::finished);
98
100
connect (mProcess , (void (QProcess::*)(QProcess::ProcessError))&QProcess::error, this , &Process::error);
99
- connect (mProcess , (void (QProcess::*)(int , QProcess::ExitStatus))&QProcess::finished, qApp, &QCoreApplication::quit);
100
101
101
102
if (pipe2 (pipefd, O_CLOEXEC) != 0 )
102
103
qWarning (" Could not create pipe" );
@@ -195,7 +196,8 @@ void Process::error(QProcess::ProcessError error)
195
196
printf (" Unknown error\n " );
196
197
break ;
197
198
}
198
- qApp->quit ();
199
+ if (!mBeingRestarted )
200
+ qApp->quit ();
199
201
}
200
202
201
203
void Process::finished (int exitCode, QProcess::ExitStatus exitStatus)
@@ -204,28 +206,41 @@ void Process::finished(int exitCode, QProcess::ExitStatus exitStatus)
204
206
printf (" Process exited with exit code %d\n " , exitCode);
205
207
else
206
208
printf (" Process stopped\n " );
209
+ if (!mBeingRestarted ) {
210
+ qDebug () << " quit" ;
211
+ qApp->quit ();
212
+ }
207
213
}
208
214
209
- void Process::startup (QStringList args )
215
+ void Process::startup ()
210
216
{
211
217
#ifdef Q_OS_ANDROID
212
218
QProcessEnvironment pe = interactiveProcessEnvironment ();
213
219
#else
214
220
QProcessEnvironment pe = QProcessEnvironment::systemEnvironment ();
215
221
#endif
222
+ QStringList args = mStartupArguments ;
223
+ mBeingRestarted = false ;
224
+
225
+ Config actualConfig = mConfig ;
226
+
227
+ // Parse temporary config files
228
+ // This needs to be done on every startup because those files are expected to change.
229
+ parseConfigFileDirectory (&actualConfig, " /var/lib/b2qt/appcontroller.conf.d" );
230
+ parseConfigFileDirectory (&actualConfig, " /tmp/b2qt/appcontroller.conf.d" );
216
231
217
- foreach (const QString &key, mConfig .env .keys ()) {
232
+ foreach (const QString &key, actualConfig .env .keys ()) {
218
233
if (!pe.contains (key)) {
219
- qDebug () << key << mConfig .env .value (key);
220
- pe.insert (key, mConfig .env .value (key));
234
+ qDebug () << key << actualConfig .env .value (key);
235
+ pe.insert (key, actualConfig .env .value (key));
221
236
}
222
237
}
223
- if (!mConfig .base .isEmpty ())
224
- pe.insert (QLatin1String (" B2QT_BASE" ), mConfig .base );
225
- if (!mConfig .platform .isEmpty ())
226
- pe.insert (QLatin1String (" B2QT_PLATFORM" ), mConfig .platform );
238
+ if (!actualConfig .base .isEmpty ())
239
+ pe.insert (QLatin1String (" B2QT_BASE" ), actualConfig .base );
240
+ if (!actualConfig .platform .isEmpty ())
241
+ pe.insert (QLatin1String (" B2QT_PLATFORM" ), actualConfig .platform );
227
242
228
- args.append (mConfig .args );
243
+ args.append (actualConfig .args );
229
244
230
245
mProcess ->setProcessEnvironment (pe);
231
246
mBinary = args.first ();
@@ -236,7 +251,8 @@ void Process::startup(QStringList args)
236
251
237
252
void Process::start (const QStringList &args)
238
253
{
239
- startup (args);
254
+ mStartupArguments = args;
255
+ startup ();
240
256
}
241
257
242
258
void Process::stop ()
@@ -260,6 +276,14 @@ void Process::stop()
260
276
mProcess ->kill ();
261
277
}
262
278
279
+ void Process::restart ()
280
+ {
281
+ printf (" Restarting application\n " );
282
+ mBeingRestarted = true ;
283
+ stop ();
284
+ startup ();
285
+ }
286
+
263
287
void Process::incomingConnection (int i)
264
288
{
265
289
int fd = accept (i, NULL , NULL );
@@ -287,6 +311,8 @@ void Process::incomingConnection(int i)
287
311
288
312
if (command == " stop" )
289
313
stop ();
314
+ else if (command == " restart" )
315
+ restart ();
290
316
else
291
317
stop ();
292
318
}
0 commit comments