|
25 | 25 | #include "Configuration.h" |
26 | 26 | #include "DaemonApp.h" |
27 | 27 | #include "DisplayManager.h" |
28 | | -#include "XorgDisplayServer.h" |
29 | | -#include "TreelandDisplayServer.h" |
| 28 | +#include "Messages.h" |
30 | 29 | #include "SeatManager.h" |
31 | 30 | #include "SocketServer.h" |
32 | | -#include "Messages.h" |
33 | 31 | #include "SocketWriter.h" |
34 | 32 | #include "TreelandConnector.h" |
| 33 | +#include "TreelandDisplayServer.h" |
| 34 | +#include "XorgDisplayServer.h" |
35 | 35 |
|
| 36 | +#include "config.h" |
| 37 | +#include "Login1Manager.h" |
| 38 | +#include "VirtualTerminal.h" |
| 39 | + |
| 40 | +#include <QDBusConnection> |
| 41 | +#include <QDBusMessage> |
| 42 | +#include <QDBusReply> |
36 | 43 | #include <QDebug> |
37 | 44 | #include <QFile> |
38 | | -#include <QTimer> |
39 | 45 | #include <QLocalSocket> |
| 46 | +#include <QScopeGuard> |
| 47 | +#include <QTimer> |
40 | 48 |
|
| 49 | +#include <fcntl.h> |
41 | 50 | #include <linux/vt.h> |
42 | 51 | #include <pwd.h> |
43 | 52 | #include <qstringliteral.h> |
44 | | -#include <unistd.h> |
45 | | -#include <sys/time.h> |
46 | | - |
| 53 | +#include <systemd/sd-login.h> |
47 | 54 | #include <sys/ioctl.h> |
48 | | -#include <fcntl.h> |
49 | | - |
50 | | -#include <QDBusConnection> |
51 | | -#include <QDBusMessage> |
52 | | -#include <QDBusReply> |
53 | | - |
54 | | -#include "Login1Manager.h" |
55 | | -#include "Login1Session.h" |
56 | | -#include "VirtualTerminal.h" |
57 | | -#include "config.h" |
| 55 | +#include <sys/time.h> |
| 56 | +#include <unistd.h> |
58 | 57 |
|
59 | 58 | #define STRINGIFY(x) #x |
60 | 59 |
|
61 | 60 | namespace DDM { |
62 | 61 | static bool isTtyInUse(const QString &desiredTty) { |
63 | | - if (Logind::isAvailable()) { |
64 | | - OrgFreedesktopLogin1ManagerInterface manager(Logind::serviceName(), Logind::managerPath(), QDBusConnection::systemBus()); |
65 | | - auto reply = manager.ListSessions(); |
66 | | - reply.waitForFinished(); |
67 | | - |
68 | | - const auto info = reply.value(); |
69 | | - for(const SessionInfo &s : info) { |
70 | | - OrgFreedesktopLogin1SessionInterface session(Logind::serviceName(), s.sessionPath.path(), QDBusConnection::systemBus()); |
71 | | - if (desiredTty == session.tTY() && session.state() != QLatin1String("closing")) { |
72 | | - qDebug() << "tty" << desiredTty << "already in use by" << session.user().path.path() << session.state() |
73 | | - << session.display() << session.desktop() << session.vTNr(); |
74 | | - return true; |
75 | | - } |
| 62 | + char **sessions = nullptr; |
| 63 | + auto guard = qScopeGuard([&sessions] { |
| 64 | + if (sessions) { |
| 65 | + for (char **s = sessions; s && *s; ++s) |
| 66 | + free(*s); |
| 67 | + free(sessions); |
| 68 | + } |
| 69 | + }); |
| 70 | + sd_get_sessions(&sessions); |
| 71 | + for (char **s = sessions; s && *s; ++s) { |
| 72 | + char *tty = nullptr; |
| 73 | + char *state = nullptr; |
| 74 | + auto guard2 = qScopeGuard([&tty, &state] { |
| 75 | + if (tty) |
| 76 | + free(tty); |
| 77 | + if (state) |
| 78 | + free(state); |
| 79 | + }); |
| 80 | + if (sd_session_get_tty(*s, &tty) < 0 || sd_session_get_state(*s, &state) < 0) |
| 81 | + continue; |
| 82 | + if (desiredTty == tty && strcmp(state, "closing") != 0) { |
| 83 | + qDebug() << "tty" << desiredTty << "already in use by session" << *s; |
| 84 | + return true; |
76 | 85 | } |
77 | 86 | } |
78 | 87 | return false; |
|
0 commit comments