mirror of
https://github.com/systemd/systemd.git
synced 2024-12-25 01:34:28 +03:00
Merge pull request #17882 from poettering/logind-async-close
logind: fix closing of button input devices
This commit is contained in:
commit
141d3a14d4
@ -1,7 +1,13 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
#pragma once
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#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);
|
||||
|
@ -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);
|
||||
@ -72,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) {
|
||||
@ -327,14 +313,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 +331,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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user