Skip to content

Commit bee0e75

Browse files
committed
chore: replace org.freedesktop.login1 D-Bus call with sd-login API
This is more robustic.
1 parent d63a6ba commit bee0e75

1 file changed

Lines changed: 39 additions & 30 deletions

File tree

src/daemon/Display.cpp

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -25,54 +25,63 @@
2525
#include "Configuration.h"
2626
#include "DaemonApp.h"
2727
#include "DisplayManager.h"
28-
#include "XorgDisplayServer.h"
29-
#include "TreelandDisplayServer.h"
28+
#include "Messages.h"
3029
#include "SeatManager.h"
3130
#include "SocketServer.h"
32-
#include "Messages.h"
3331
#include "SocketWriter.h"
3432
#include "TreelandConnector.h"
33+
#include "TreelandDisplayServer.h"
34+
#include "XorgDisplayServer.h"
3535

36+
#include "config.h"
37+
#include "Login1Manager.h"
38+
#include "VirtualTerminal.h"
39+
40+
#include <QDBusConnection>
41+
#include <QDBusMessage>
42+
#include <QDBusReply>
3643
#include <QDebug>
3744
#include <QFile>
38-
#include <QTimer>
3945
#include <QLocalSocket>
46+
#include <QScopeGuard>
47+
#include <QTimer>
4048

49+
#include <fcntl.h>
4150
#include <linux/vt.h>
4251
#include <pwd.h>
4352
#include <qstringliteral.h>
44-
#include <unistd.h>
45-
#include <sys/time.h>
46-
53+
#include <systemd/sd-login.h>
4754
#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>
5857

5958
#define STRINGIFY(x) #x
6059

6160
namespace DDM {
6261
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;
7685
}
7786
}
7887
return false;

0 commit comments

Comments
 (0)