swayidle: Fix sleep inhibitor not being acquired
Fixes #3377. The sleep lock file descriptor was immediately closed after it was acquired due to the dbus message being freed. Now the fd is duplicated before the message is freed so the inhibitor stays active.
This commit is contained in:
parent
688f4137a5
commit
5a24ed2bf2
|
@ -1,6 +1,7 @@
|
||||||
#define _POSIX_C_SOURCE 200809L
|
#define _POSIX_C_SOURCE 200809L
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
@ -104,9 +105,21 @@ static void acquire_sleep_lock(void) {
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
wlr_log(WLR_ERROR, "Failed to parse D-Bus response for Inhibit: %s",
|
wlr_log(WLR_ERROR, "Failed to parse D-Bus response for Inhibit: %s",
|
||||||
strerror(-ret));
|
strerror(-ret));
|
||||||
|
sd_bus_error_free(&error);
|
||||||
|
sd_bus_message_unref(msg);
|
||||||
|
return;
|
||||||
} else {
|
} else {
|
||||||
wlr_log(WLR_INFO, "Got sleep lock: %d", lock_fd);
|
wlr_log(WLR_INFO, "Got sleep lock: %d", lock_fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sd_bus_message_unref closes the file descriptor so we need
|
||||||
|
// to copy it beforehand
|
||||||
|
lock_fd = fcntl(lock_fd, F_DUPFD_CLOEXEC, 3);
|
||||||
|
if (lock_fd < 0) {
|
||||||
|
wlr_log(WLR_ERROR, "Failed to copy sleep lock fd: %s",
|
||||||
|
strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
sd_bus_error_free(&error);
|
sd_bus_error_free(&error);
|
||||||
sd_bus_message_unref(msg);
|
sd_bus_message_unref(msg);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue