From 1d9aa4d572b661fd6500c55ab524141332f76230 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 9 Dec 2020 10:07:12 +0100 Subject: [PATCH 1/3] async: add trivial cleanup wrapper for asynchronous_close() --- src/basic/async.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/basic/async.h b/src/basic/async.h index 9ada32c994..e0bbaa5658 100644 --- a/src/basic/async.h +++ b/src/basic/async.h @@ -1,7 +1,13 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once +#include + +#include "macro.h" + int asynchronous_job(void* (*func)(void *p), void *arg); int asynchronous_sync(pid_t *ret_pid); int asynchronous_close(int fd); + +DEFINE_TRIVIAL_CLEANUP_FUNC(int, asynchronous_close); From c74d5fe25d53263c143f0a9c2698d8bb483e398c Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 7 Dec 2020 10:51:15 +0100 Subject: [PATCH 2/3] logind: fix closing of button input devices This is a fix of #17751. Specifically: 1. Sort #include headers again 2. Remove tabs, as per coding style 3. Don't install fds in half-initialized objects 4. Use asynchronous_close() everywhere That all said: Quit frankly, I am not convinced we should do all this at all. If close()ing of these input devices is really that slow, then this should probably be fixed in the kernel, not worked around in userspace like this. --- src/login/logind-button.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/login/logind-button.c b/src/login/logind-button.c index 60de2dccad..0e38b5f57c 100644 --- a/src/login/logind-button.c +++ b/src/login/logind-button.c @@ -8,12 +8,12 @@ #include "sd-messages.h" #include "alloc-util.h" +#include "async.h" #include "fd-util.h" #include "logind-button.h" #include "missing_input.h" #include "string-util.h" #include "util.h" -#include "async.h" #define CONST_MAX5(a, b, c, d, e) CONST_MAX(CONST_MAX(a, b), CONST_MAX(CONST_MAX(c, d), e)) @@ -60,11 +60,7 @@ void button_free(Button *b) { sd_event_source_unref(b->io_event_source); sd_event_source_unref(b->check_event_source); - if (b->fd >= 0) - /* If the device has been unplugged close() returns - * ENODEV, let's ignore this, hence we don't use - * safe_close() */ - (void) asynchronous_close(b->fd); + asynchronous_close(b->fd); free(b->name); free(b->seat); @@ -327,14 +323,14 @@ static int button_set_mask(const char *name, int fd) { } int button_open(Button *b) { - _cleanup_close_ int fd = -1; + _cleanup_(asynchronous_closep) int fd = -1; const char *p; char name[256]; int r; assert(b); - b->fd = safe_close(b->fd); + b->fd = asynchronous_close(b->fd); p = strjoina("/dev/input/", b->name); @@ -345,12 +341,10 @@ int button_open(Button *b) { r = button_suitable(fd); if (r < 0) return log_warning_errno(r, "Failed to determine whether input device %s is relevant to us: %m", p); - if (r == 0) { - b->fd = TAKE_FD(fd); + if (r == 0) return log_debug_errno(SYNTHETIC_ERRNO(EADDRNOTAVAIL), "Device %s does not expose keys or switches relevant to us, ignoring.", p); - } - + if (ioctl(fd, EVIOCGNAME(sizeof name), name) < 0) return log_error_errno(errno, "Failed to get input name for %s: %m", p); From f2835dd4a69996807f40efaed857287fdca8de93 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 9 Dec 2020 10:07:37 +0100 Subject: [PATCH 3/3] logind: use free_and_strdup() where appropriate --- src/login/logind-button.c | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/login/logind-button.c b/src/login/logind-button.c index 0e38b5f57c..0ee6702068 100644 --- a/src/login/logind-button.c +++ b/src/login/logind-button.c @@ -68,19 +68,9 @@ void button_free(Button *b) { } int button_set_seat(Button *b, const char *sn) { - char *s; - assert(b); - assert(sn); - s = strdup(sn); - if (!s) - return -ENOMEM; - - free(b->seat); - b->seat = s; - - return 0; + return free_and_strdup(&b->seat, sn); } static void button_lid_switch_handle_action(Manager *manager, bool is_edge) {