From ca4dc259d4055f5cce40567c60876ef8dcf65b58 Mon Sep 17 00:00:00 2001
|
From: Jeffy Chen <jeffy.chen@rock-chips.com>
|
Date: Fri, 29 Jul 2022 16:13:56 +0800
|
Subject: [PATCH 7/7] Support hotplug when listening all devices
|
|
Tested with:
|
Run: input-event-daemon -v -D
|
Hotplug:
|
input-event-daemon: read(/dev/input/event7): No such device
|
input-event-daemon: Adding device: /dev/input/event7...
|
|
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
|
---
|
input-event-daemon.c | 78 +++++++++++++++++++++++++++++++-------------
|
input-event-daemon.h | 1 +
|
2 files changed, 56 insertions(+), 23 deletions(-)
|
|
diff --git a/input-event-daemon.c b/input-event-daemon.c
|
index f67bf17..9ba6dfd 100644
|
--- a/input-event-daemon.c
|
+++ b/input-event-daemon.c
|
@@ -298,7 +298,7 @@ static switch_event_t
|
}
|
|
void input_open_all_listener() {
|
- int i, listen_len = 0;
|
+ int i;
|
char filename[32];
|
|
for(i=0; i<MAX_LISTENER; i++) {
|
@@ -310,17 +310,22 @@ void input_open_all_listener() {
|
}
|
continue;
|
}
|
- conf.listen[listen_len++] = strdup(filename);
|
+ conf.listen[i] = strdup(filename);
|
}
|
+
|
+ conf.dynamic = 1;
|
}
|
|
void input_list_devices() {
|
int fd, i, e;
|
unsigned char evmask[EV_MAX/8 + 1];
|
|
- for(i=0; i < MAX_LISTENER && conf.listen[i] != NULL; i++) {
|
+ for(i=0; i < MAX_LISTENER; i++) {
|
char phys[64] = "no physical path", name[256] = "Unknown Device";
|
|
+ if (!conf.listen[i])
|
+ continue;
|
+
|
fd = open(conf.listen[i], O_RDONLY);
|
if(fd < 0) {
|
fprintf(stderr, PROGRAM": open(%s): %s\n",
|
@@ -703,41 +708,50 @@ void daemon_init() {
|
}
|
}
|
|
-void daemon_start_listener() {
|
- int i, select_r, fd_len;
|
- unsigned long tms_start, tms_end, idle_time = 0;
|
- fd_set fdset, initial_fdset;
|
- struct input_event event;
|
- struct timeval tv, tv_start, tv_end;
|
+static int update_fds(fd_set *fdset) {
|
+ int i, fd_len;
|
|
- /* ignored forked processes */
|
- signal(SIGCHLD, SIG_IGN);
|
+ for(i=0, fd_len=0; i < MAX_LISTENER; i++) {
|
+ if (!conf.listen[i] || conf.listen_fd[i])
|
+ continue;
|
|
- FD_ZERO(&initial_fdset);
|
- fd_len = 0;
|
- for(i=0; i < MAX_LISTENER && conf.listen[i] != NULL; i++) {
|
conf.listen_fd[i] = open(conf.listen[i], O_RDONLY);
|
|
if(conf.listen_fd[i] < 0) {
|
- fprintf(stderr, PROGRAM": open(%s): %s\n",
|
- conf.listen[i], strerror(errno));
|
conf.listen_fd[i] = 0;
|
continue;
|
}
|
if(conf.verbose) {
|
fprintf(stderr, PROGRAM": Adding device: %s...\n", conf.listen[i]);
|
}
|
- FD_SET(conf.listen_fd[i], &initial_fdset);
|
+ FD_SET(conf.listen_fd[i], fdset);
|
fd_len++;
|
}
|
|
+ return fd_len;
|
+}
|
+
|
+void daemon_start_listener() {
|
+ int i, select_r, fd_len, timeout, interval;
|
+ unsigned long tms_start, tms_end, idle_time = 0;
|
+ fd_set fdset, initial_fdset;
|
+ struct input_event event;
|
+ struct timeval tv, tv_start, tv_end;
|
+
|
+ /* ignored forked processes */
|
+ signal(SIGCHLD, SIG_IGN);
|
+
|
+ FD_ZERO(&initial_fdset);
|
+ fd_len = update_fds(&initial_fdset);
|
+
|
if(fd_len == 0) {
|
fprintf(stderr, PROGRAM": no listener found!\n");
|
return;
|
}
|
|
if(conf.verbose) {
|
- fprintf(stderr, PROGRAM": Start listening on %d devices...\n", fd_len);
|
+ fprintf(stderr, PROGRAM": Start listening on %d devices...%s\n",
|
+ fd_len, conf.dynamic ? "dynamically" : "");
|
}
|
|
if(conf.monitor) {
|
@@ -749,9 +763,18 @@ void daemon_start_listener() {
|
}
|
}
|
|
+ if (conf.dynamic)
|
+ interval = 1;
|
+ else
|
+ interval = conf.min_timeout;
|
+
|
+ timeout = 0;
|
while(1) {
|
+ if (conf.dynamic)
|
+ fd_len += update_fds(&initial_fdset);
|
+
|
fdset = initial_fdset;
|
- tv.tv_sec = conf.min_timeout;
|
+ tv.tv_sec = interval;
|
tv.tv_usec = 0;
|
|
gettimeofday(&tv_start, NULL);
|
@@ -764,7 +787,13 @@ void daemon_start_listener() {
|
perror(PROGRAM": select()");
|
break;
|
} else if(select_r == 0) {
|
- idle_time += conf.min_timeout;
|
+ timeout += interval;
|
+ if (timeout < conf.min_timeout)
|
+ continue;
|
+
|
+ idle_time += timeout;
|
+ timeout = 0;
|
+
|
idle_event_parse(idle_time);
|
continue;
|
}
|
@@ -775,6 +804,7 @@ void daemon_start_listener() {
|
if(tms_end - tms_start > 750 || idle_time > 0) {
|
idle_event_parse(IDLE_RESET);
|
idle_time = 0;
|
+ timeout = 0;
|
}
|
|
for(i=0; i<MAX_LISTENER; i++) {
|
@@ -858,9 +888,11 @@ void daemon_clean() {
|
}
|
switch_event_n = 0;
|
|
- for(i=0; i < MAX_LISTENER && conf.listen[i] != NULL; i++) {
|
- free((void*) conf.listen[i]);
|
- conf.listen[i] = NULL;
|
+ for(i=0; i < MAX_LISTENER; i++) {
|
+ if (conf.listen[i]) {
|
+ free((void*) conf.listen[i]);
|
+ conf.listen[i] = NULL;
|
+ }
|
if(conf.listen_fd[i]) {
|
close(conf.listen_fd[i]);
|
}
|
diff --git a/input-event-daemon.h b/input-event-daemon.h
|
index 4a6944b..7d3eacf 100644
|
--- a/input-event-daemon.h
|
+++ b/input-event-daemon.h
|
@@ -23,6 +23,7 @@ struct {
|
unsigned char monitor;
|
unsigned char verbose;
|
unsigned char daemon;
|
+ unsigned char dynamic;
|
|
unsigned long min_timeout;
|
|
--
|
2.20.1
|