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