-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathcmd.cpp
More file actions
41 lines (38 loc) · 1.2 KB
/
cmd.cpp
File metadata and controls
41 lines (38 loc) · 1.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "cmd.h"
#include <QEventLoop>
#include <QProcess>
#include <QThread>
#include <QString>
using namespace Qt::Literals::StringLiterals;
// Used by most modules for command line stuff
Result runProc(const QString &program, const QStringList &arguments) noexcept
{
QEventLoop loop;
QProcess proc;
proc.setProcessChannelMode(QProcess::MergedChannels);
QObject::connect(&proc, QOverload<QProcess::ProcessError>::of(&QProcess::errorOccurred), &loop, &QEventLoop::quit);
QObject::connect(&proc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), &loop, &QEventLoop::quit);
proc.start(program, arguments);
loop.exec();
proc.disconnect(&loop);
return {proc.exitCode(), proc.readAll().trimmed()};
}
Result runCmd(const QString &cmd) noexcept
{
return runProc(u"/bin/sh"_s, {u"-c"_s, cmd});
}
int runSystem(const char *command) noexcept
{
QEventLoop loop;
int rc = 0;
QThread *thread = QThread::create([command, &rc]() noexcept {
rc = system(command);
});
if (thread != nullptr) {
QObject::connect(thread, &QThread::finished, &loop, &QEventLoop::quit);
thread->start();
loop.exec();
delete thread;
}
return rc;
}