123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- diff -Naur a/data/scripts/Xsession b/data/scripts/Xsession
- --- a/data/scripts/Xsession 2020-11-03 10:55:31.000000000 +0100
- +++ b/data/scripts/Xsession 2021-04-03 18:59:31.051127925 +0200
- @@ -62,7 +62,10 @@
- fi
- done
- fi
- -
- +if which dbus-launch >/dev/null && test -z "$DBUS_SESSION_BUS_ADDRESS";
- +then
- + eval "$(dbus-launch --sh-syntax --exit-with-session)"
- +fi
- # Load Xsession scripts
- # OPTIONFILE, USERXSESSION, USERXSESSIONRC and ALTUSERXSESSION are required
- # by the scripts to work
- diff -Naur a/services/sddm-autologin.pam b/services/sddm-autologin.pam
- --- a/services/sddm-autologin.pam 2020-11-03 10:55:31.000000000 +0100
- +++ b/services/sddm-autologin.pam 2021-04-03 19:02:11.514619253 +0200
- @@ -1,6 +1,6 @@
- #%PAM-1.0
- auth required pam_env.so
- -auth required pam_tally2.so file=/var/log/tallylog onerr=succeed
- +auth required pam_faillock.so preauth
- auth required pam_shells.so
- auth required pam_nologin.so
- auth required pam_permit.so
- diff -Naur a/src/common/Session.cpp b/src/common/Session.cpp
- --- a/src/common/Session.cpp 2020-11-03 10:55:31.000000000 +0100
- +++ b/src/common/Session.cpp 2021-04-03 19:00:30.843278097 +0200
- @@ -89,7 +89,7 @@
-
- QString Session::desktopSession() const
- {
- - return fileName().replace(s_entryExtention, QString());
- + return QFileInfo(m_fileName).completeBaseName();
- }
-
- QString Session::desktopNames() const
- diff -Naur a/src/daemon/Seat.cpp b/src/daemon/Seat.cpp
- --- a/src/daemon/Seat.cpp 2020-11-03 10:55:31.000000000 +0100
- +++ b/src/daemon/Seat.cpp 2021-04-03 19:00:20.073491217 +0200
- @@ -28,6 +28,7 @@
-
- #include <QDebug>
- #include <QFile>
- +#include <QTimer>
-
- #include <functional>
-
- @@ -52,7 +53,7 @@
- return m_name;
- }
-
- - bool Seat::createDisplay(int terminalId) {
- + void Seat::createDisplay(int terminalId) {
- //reload config if needed
- mainConfig.load();
-
- @@ -84,12 +85,24 @@
- m_displays << display;
-
- // start the display
- - if (!display->start()) {
- - qCritical() << "Could not start Display server on vt" << terminalId;
- - return false;
- + startDisplay(display);
- + }
- +
- + void Seat::startDisplay(Display *display, int tryNr) {
- + if (display->start())
- + return;
- +
- + // It's possible that the system isn't ready yet (driver not loaded,
- + // device not enumerated, ...). It's not possible to tell when that changes,
- + // so try a few times with a delay in between.
- + qWarning() << "Attempt" << tryNr << "starting the Display server on vt" << display->terminalId() << "failed";
- +
- + if(tryNr >= 3) {
- + qCritical() << "Could not start Display server on vt" << display->terminalId();
- + return;
- }
-
- - return true;
- + QTimer::singleShot(2000, display, [=] { startDisplay(display, tryNr + 1); });
- }
-
- void Seat::removeDisplay(Display* display) {
- diff -Naur a/src/daemon/Seat.h b/src/daemon/Seat.h
- --- a/src/daemon/Seat.h 2020-11-03 10:55:31.000000000 +0100
- +++ b/src/daemon/Seat.h 2021-04-03 19:00:20.073491217 +0200
- @@ -35,13 +35,15 @@
- const QString &name() const;
-
- public slots:
- - bool createDisplay(int terminalId = -1);
- + void createDisplay(int terminalId = -1);
- void removeDisplay(SDDM::Display* display);
-
- private slots:
- void displayStopped();
-
- private:
- + void startDisplay(SDDM::Display *display, int tryNr = 1);
- +
- QString m_name;
-
- QVector<Display *> m_displays;
- diff -Naur a/src/daemon/XorgDisplayServer.cpp b/src/daemon/XorgDisplayServer.cpp
- --- a/src/daemon/XorgDisplayServer.cpp 2020-11-03 10:55:31.000000000 +0100
- +++ b/src/daemon/XorgDisplayServer.cpp 2021-04-03 19:00:20.076824484 +0200
- @@ -118,6 +118,11 @@
- if (m_started)
- return false;
-
- + if (process) {
- + qCritical() << "Tried to start Xorg before previous instance exited";
- + return false;
- + }
- +
- // create process
- process = new QProcess(this);
-
- @@ -136,106 +141,97 @@
- return false;
- }
-
- - if (daemonApp->testing()) {
- - QStringList args;
- - QDir x11socketDir(QStringLiteral("/tmp/.X11-unix"));
- - int display = 100;
- - while (x11socketDir.exists(QStringLiteral("X%1").arg(display))) {
- - ++display;
- - }
- - m_display = QStringLiteral(":%1").arg(display);
- - args << m_display << QStringLiteral("-auth") << m_authPath << QStringLiteral("-br") << QStringLiteral("-noreset") << QStringLiteral("-screen") << QStringLiteral("800x600");
- - process->start(mainConfig.X11.XephyrPath.get(), args);
- -
- -
- - // wait for display server to start
- - if (!process->waitForStarted()) {
- - // log message
- - qCritical() << "Failed to start display server process.";
- -
- - // return fail
- - return false;
- - }
- - emit started();
- - } else {
- - // set process environment
- - QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
- - env.insert(QStringLiteral("XCURSOR_THEME"), mainConfig.Theme.CursorTheme.get());
- - process->setProcessEnvironment(env);
- -
- - //create pipe for communicating with X server
- - //0 == read from X, 1== write to from X
- - int pipeFds[2];
- - if (pipe(pipeFds) != 0) {
- - qCritical("Could not create pipe to start X server");
- - }
- + // set process environment
- + QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
- + env.insert(QStringLiteral("XCURSOR_THEME"), mainConfig.Theme.CursorTheme.get());
- + process->setProcessEnvironment(env);
- +
- + //create pipe for communicating with X server
- + //0 == read from X, 1== write to from X
- + int pipeFds[2];
- + if (pipe(pipeFds) != 0) {
- + qCritical("Could not create pipe to start X server");
- + }
-
- - // start display server
- - QStringList args = mainConfig.X11.ServerArguments.get().split(QLatin1Char(' '), QString::SkipEmptyParts);
- - args << QStringLiteral("-auth") << m_authPath
- + // start display server
- + QStringList args;
- + if (!daemonApp->testing()) {
- + process->setProgram(mainConfig.X11.ServerPath.get());
- + args << mainConfig.X11.ServerArguments.get().split(QLatin1Char(' '), QString::SkipEmptyParts)
- << QStringLiteral("-background") << QStringLiteral("none")
- - << QStringLiteral("-noreset")
- - << QStringLiteral("-displayfd") << QString::number(pipeFds[1])
- << QStringLiteral("-seat") << displayPtr()->seat()->name();
-
- if (displayPtr()->seat()->name() == QLatin1String("seat0")) {
- args << QStringLiteral("vt%1").arg(displayPtr()->terminalId());
- }
- - qDebug() << "Running:"
- - << qPrintable(mainConfig.X11.ServerPath.get())
- - << qPrintable(args.join(QLatin1Char(' ')));
- - process->start(mainConfig.X11.ServerPath.get(), args);
- -
- - // wait for display server to start
- - if (!process->waitForStarted()) {
- - // log message
- - qCritical() << "Failed to start display server process.";
- -
- - // return fail
- - close(pipeFds[0]);
- - return false;
- - }
- + } else {
- + process->setProgram(mainConfig.X11.XephyrPath.get());
- + args << QStringLiteral("-br")
- + << QStringLiteral("-screen") << QStringLiteral("800x600");
- + }
-
- - // close the other side of pipe in our process, otherwise reading
- - // from it may stuck even X server exit.
- - close(pipeFds[1]);
- + args << QStringLiteral("-auth") << m_authPath
- + << QStringLiteral("-noreset")
- + << QStringLiteral("-displayfd") << QString::number(pipeFds[1]);
- +
- + process->setArguments(args);
- + qDebug() << "Running:"
- + << qPrintable(process->program())
- + << qPrintable(process->arguments().join(QLatin1Char(' ')));
- + process->start();
- +
- + // wait for display server to start
- + if (!process->waitForStarted()) {
- + // log message
- + qCritical() << "Failed to start display server process.";
-
- - QFile readPipe;
- + // return fail
- + close(pipeFds[0]);
- + return false;
- + }
-
- - if (!readPipe.open(pipeFds[0], QIODevice::ReadOnly)) {
- - qCritical("Failed to open pipe to start X Server");
- + // close the other side of pipe in our process, otherwise reading
- + // from it may stuck even X server exit.
- + close(pipeFds[1]);
-
- - close(pipeFds[0]);
- - return false;
- - }
- - QByteArray displayNumber = readPipe.readLine();
- - if (displayNumber.size() < 2) {
- - // X server gave nothing (or a whitespace).
- - qCritical("Failed to read display number from pipe");
- + QFile readPipe;
-
- - close(pipeFds[0]);
- - return false;
- - }
- - displayNumber.prepend(QByteArray(":"));
- - displayNumber.remove(displayNumber.size() -1, 1); // trim trailing whitespace
- - m_display = QString::fromLocal8Bit(displayNumber);
- + if (!readPipe.open(pipeFds[0], QIODevice::ReadOnly)) {
- + qCritical("Failed to open pipe to start X Server");
-
- - // close our pipe
- close(pipeFds[0]);
- + stop();
- + return false;
- + }
- + QByteArray displayNumber = readPipe.readLine();
- + if (displayNumber.size() < 2) {
- + // X server gave nothing (or a whitespace).
- + qCritical("Failed to read display number from pipe");
-
- - emit started();
- + close(pipeFds[0]);
- + stop();
- + return false;
- }
- + displayNumber.prepend(QByteArray(":"));
- + displayNumber.remove(displayNumber.size() -1, 1); // trim trailing whitespace
- + m_display = QString::fromLocal8Bit(displayNumber);
- +
- + // close our pipe
- + close(pipeFds[0]);
-
- // The file is also used by the greeter, which does care about the
- // display number. Write the proper entry, if it's different.
- if(m_display != QStringLiteral(":0")) {
- if(!addCookie(m_authPath)) {
- qCritical() << "Failed to write xauth file";
- + stop();
- return false;
- }
- }
- changeOwner(m_authPath);
-
- + emit started();
- +
- // set flag
- m_started = true;
-
- @@ -244,8 +240,7 @@
- }
-
- void XorgDisplayServer::stop() {
- - // check flag
- - if (!m_started)
- + if (!process)
- return;
-
- // log message
- @@ -260,6 +255,12 @@
- }
-
- void XorgDisplayServer::finished() {
- + // clean up
- + if (process) {
- + process->deleteLater();
- + process = nullptr;
- + }
- +
- // check flag
- if (!m_started)
- return;
- @@ -295,10 +296,6 @@
- displayStopScript->deleteLater();
- displayStopScript = nullptr;
-
- - // clean up
- - process->deleteLater();
- - process = nullptr;
- -
- // remove authority file
- QFile::remove(m_authPath);
-
|