1*4882a593SmuzhiyunFrom fca8f74afe7d96c37d1649350d2fda0b7f0f9151 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com>
3*4882a593SmuzhiyunDate: Mon, 13 May 2019 17:45:21 +0800
4*4882a593SmuzhiyunSubject: [PATCH 3/7] Support dynamic remove devices when not available.
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunIt's the same behaviour as triggerhappy.
7*4882a593Smuzhiyun
8*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
9*4882a593Smuzhiyun---
10*4882a593Smuzhiyun input-event-daemon.c | 20 +++++++++++++++-----
11*4882a593Smuzhiyun 1 file changed, 15 insertions(+), 5 deletions(-)
12*4882a593Smuzhiyun
13*4882a593Smuzhiyundiff --git a/input-event-daemon.c b/input-event-daemon.c
14*4882a593Smuzhiyunindex 646d00d..f124250 100644
15*4882a593Smuzhiyun--- a/input-event-daemon.c
16*4882a593Smuzhiyun+++ b/input-event-daemon.c
17*4882a593Smuzhiyun@@ -690,19 +690,23 @@ void daemon_start_listener() {
18*4882a593Smuzhiyun     signal(SIGCHLD, SIG_IGN);
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun     FD_ZERO(&initial_fdset);
21*4882a593Smuzhiyun+    fd_len = 0;
22*4882a593Smuzhiyun     for(i=0; i < MAX_LISTENER && conf.listen[i] != NULL; i++) {
23*4882a593Smuzhiyun         conf.listen_fd[i] = open(conf.listen[i], O_RDONLY);
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun         if(conf.listen_fd[i] < 0) {
26*4882a593Smuzhiyun             fprintf(stderr, PROGRAM": open(%s): %s\n",
27*4882a593Smuzhiyun                 conf.listen[i], strerror(errno));
28*4882a593Smuzhiyun-            exit(EXIT_FAILURE);
29*4882a593Smuzhiyun+            conf.listen_fd[i] = 0;
30*4882a593Smuzhiyun+            continue;
31*4882a593Smuzhiyun+        }
32*4882a593Smuzhiyun+        if(conf.verbose) {
33*4882a593Smuzhiyun+            fprintf(stderr, PROGRAM": Adding device: %s...\n", conf.listen[i]);
34*4882a593Smuzhiyun         }
35*4882a593Smuzhiyun         FD_SET(conf.listen_fd[i], &initial_fdset);
36*4882a593Smuzhiyun+        fd_len++;
37*4882a593Smuzhiyun     }
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun-    fd_len = i;
40*4882a593Smuzhiyun-
41*4882a593Smuzhiyun     if(fd_len == 0) {
42*4882a593Smuzhiyun         fprintf(stderr, PROGRAM": no listener found!\n");
43*4882a593Smuzhiyun         return;
44*4882a593Smuzhiyun@@ -749,12 +753,18 @@ void daemon_start_listener() {
45*4882a593Smuzhiyun             idle_time = 0;
46*4882a593Smuzhiyun         }
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun-        for(i=0; i<fd_len; i++) {
49*4882a593Smuzhiyun+        for(i=0; i<MAX_LISTENER; i++) {
50*4882a593Smuzhiyun             if(FD_ISSET(conf.listen_fd[i], &fdset)) {
51*4882a593Smuzhiyun                 if(read(conf.listen_fd[i], &event, sizeof(event)) < 0) {
52*4882a593Smuzhiyun                     fprintf(stderr, PROGRAM": read(%s): %s\n",
53*4882a593Smuzhiyun                         conf.listen[i], strerror(errno));
54*4882a593Smuzhiyun-                    break;
55*4882a593Smuzhiyun+
56*4882a593Smuzhiyun+                    /* read error? Remove the device! */
57*4882a593Smuzhiyun+                    FD_CLR(conf.listen_fd[i], &initial_fdset);
58*4882a593Smuzhiyun+                    close(conf.listen_fd[i]);
59*4882a593Smuzhiyun+                    conf.listen_fd[i] = 0;
60*4882a593Smuzhiyun+                    fd_len --;
61*4882a593Smuzhiyun+                    continue;
62*4882a593Smuzhiyun                 }
63*4882a593Smuzhiyun                 input_parse_event(&event, conf.listen[i]);
64*4882a593Smuzhiyun             }
65*4882a593Smuzhiyun--
66*4882a593Smuzhiyun2.20.1
67*4882a593Smuzhiyun
68