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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
From bfa73ab87c881d32170e87a724c4ed835fa11260 Mon Sep 17 00:00:00 2001
From: Pepper Gray <hello@peppergray.xyz>
Date: Mon, 20 Jul 2026 23:16:21 +0200
Subject: [PATCH] fix sd_bus get/read: use int instead of bool
X-Archived-At: https://github.com/kennylevinsen/seatd/pull/5
seatd fails to read the correct active state on ppc32/musl/llvm:
the functions `sd_bus_message_read_basic` and `sd_bus_get_property_trivial`
use `bool` to read values which fails on big endian.
sd_bus_message_read / Examples / Read a boolean value:
```C
sd_bus_message *m;
int x; /* Do not use C99 "bool" type here, it is typically smaller
in memory and would cause memory corruption */
sd_bus_message_read(m, "b", &x);
```
bool is 1 byte while int is 4/8 byte, thus
`true = 01 00 00 00 (little endian)`
`true = 00 00 00 01 (big endian)`
hence this always reads 0 and reports as inactive on big endian
Bugs: https://bugs.gentoo.org/979604
Signed-off-by: Pepper Gray <hello@peppergray.xyz>
--- a/libseat/backend/logind.c
+++ b/libseat/backend/logind.c
@@ -287,12 +287,14 @@ static const char *seat_name(struct libseat *base) {
static int session_get_active(struct backend_logind *session, bool *active) {
sd_bus_error error = SD_BUS_ERROR_NULL;
+ int value;
int ret = sd_bus_get_property_trivial(session->bus, "org.freedesktop.login1", session->path,
"org.freedesktop.login1.Session", "Active", &error,
- 'b', active);
+ 'b', &value);
if (ret < 0) {
log_errorf("Could not check if session is active: %s", error.message);
}
+ *active = (value != 0);
sd_bus_error_free(&error);
return ret;
@@ -441,14 +443,14 @@ static int handle_properties_changed(sd_bus_message *msg, void *userdata, sd_bus
goto error;
}
- bool value;
+ int value;
ret = sd_bus_message_read_basic(msg, 'b', &value);
if (ret < 0) {
goto error;
}
log_debugf("%s state changed: %d", field, value);
- set_active(session, value);
+ set_active(session, value != 0);
ret = sd_bus_message_exit_container(msg);
if (ret < 0) {
goto error;
@@ -486,7 +488,7 @@ static int handle_properties_changed(sd_bus_message *msg, void *userdata, sd_bus
sd_bus_error error = SD_BUS_ERROR_NULL;
const char *obj = "org.freedesktop.login1.Session";
const char *field = "Active";
- bool value;
+ int value;
ret = sd_bus_get_property_trivial(session->bus, "org.freedesktop.login1",
session->path, obj, field, &error, 'b',
&value);
@@ -496,7 +498,7 @@ static int handle_properties_changed(sd_bus_message *msg, void *userdata, sd_bus
}
log_debugf("%s state changed: %d", field, value);
- set_active(session, value);
+ set_active(session, value != 0);
}
}
if (ret < 0) {
|