1*4882a593SmuzhiyunFrom 9a51dbca603267fd65a64b38e30a356affba38e3 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com> 3*4882a593SmuzhiyunDate: Thu, 7 Mar 2019 18:20:44 +0800 4*4882a593SmuzhiyunSubject: [PATCH 2/2] Support parsing <configfile>.d/*.conf 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 7*4882a593Smuzhiyun--- 8*4882a593Smuzhiyun input-event-daemon.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++------ 9*4882a593Smuzhiyun 1 file changed, 61 insertions(+), 8 deletions(-) 10*4882a593Smuzhiyun 11*4882a593Smuzhiyundiff --git a/input-event-daemon.c b/input-event-daemon.c 12*4882a593Smuzhiyunindex 2a7b527..a324382 100644 13*4882a593Smuzhiyun--- a/input-event-daemon.c 14*4882a593Smuzhiyun+++ b/input-event-daemon.c 15*4882a593Smuzhiyun@@ -4,6 +4,7 @@ 16*4882a593Smuzhiyun #include <unistd.h> 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #include <ctype.h> 19*4882a593Smuzhiyun+#include <dirent.h> 20*4882a593Smuzhiyun #include <getopt.h> 21*4882a593Smuzhiyun #include <fcntl.h> 22*4882a593Smuzhiyun #include <errno.h> 23*4882a593Smuzhiyun@@ -11,12 +12,15 @@ 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #include <sys/wait.h> 26*4882a593Smuzhiyun #include <sys/select.h> 27*4882a593Smuzhiyun+#include <sys/stat.h> 28*4882a593Smuzhiyun+#include <sys/types.h> 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #include <linux/input.h> 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #include "input-event-daemon.h" 33*4882a593Smuzhiyun #include "input-event-table.h" 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun+#define DEFAULT_CONFIGURE_FILE "/etc/input-event-daemon.conf"; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun static int key_event_compare(const key_event_t *a, const key_event_t *b) { 38*4882a593Smuzhiyun int i, r_cmp; 39*4882a593Smuzhiyun@@ -385,7 +389,7 @@ static void input_parse_event(struct input_event *event, const char *src) { 40*4882a593Smuzhiyun } 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun-void config_parse_file() { 44*4882a593Smuzhiyun+void config_parse_file(const char *configfile) { 45*4882a593Smuzhiyun FILE *config_fd; 46*4882a593Smuzhiyun char buffer[512], *line; 47*4882a593Smuzhiyun char *section = NULL; 48*4882a593Smuzhiyun@@ -394,9 +398,13 @@ void config_parse_file() { 49*4882a593Smuzhiyun int line_num = 0; 50*4882a593Smuzhiyun int listen_len = 0; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun- if((config_fd = fopen(conf.configfile, "r")) == NULL) { 53*4882a593Smuzhiyun+ if(conf.verbose) { 54*4882a593Smuzhiyun+ fprintf(stderr, PROGRAM": Start parsing %s...\n", configfile); 55*4882a593Smuzhiyun+ } 56*4882a593Smuzhiyun+ 57*4882a593Smuzhiyun+ if((config_fd = fopen(configfile, "r")) == NULL) { 58*4882a593Smuzhiyun fprintf(stderr, PROGRAM": fopen(%s): %s\n", 59*4882a593Smuzhiyun- conf.configfile, strerror(errno)); 60*4882a593Smuzhiyun+ configfile, strerror(errno)); 61*4882a593Smuzhiyun exit(EXIT_FAILURE); 62*4882a593Smuzhiyun } 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun@@ -461,7 +469,7 @@ void config_parse_file() { 65*4882a593Smuzhiyun print_error: 66*4882a593Smuzhiyun if(error != NULL) { 67*4882a593Smuzhiyun fprintf(stderr, PROGRAM": %s (%s:%d)\n", 68*4882a593Smuzhiyun- error, conf.configfile, line_num); 69*4882a593Smuzhiyun+ error, configfile, line_num); 70*4882a593Smuzhiyun } 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun@@ -483,6 +491,46 @@ void config_parse_file() { 74*4882a593Smuzhiyun fclose(config_fd); 75*4882a593Smuzhiyun } 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun+//Base on triggerhappy's trigger.c 78*4882a593Smuzhiyun+static int accept_configure_file(const struct dirent *entry) { 79*4882a593Smuzhiyun+ const char *suffix = ".conf"; 80*4882a593Smuzhiyun+ const char *name = entry->d_name; 81*4882a593Smuzhiyun+ char *end = strstr( name, suffix ); 82*4882a593Smuzhiyun+ if ( end && end[ strlen(suffix) ] == '\0' ) { 83*4882a593Smuzhiyun+ return 1; 84*4882a593Smuzhiyun+ } else { 85*4882a593Smuzhiyun+ return 0; 86*4882a593Smuzhiyun+ } 87*4882a593Smuzhiyun+} 88*4882a593Smuzhiyun+ 89*4882a593Smuzhiyun+//Base on triggerhappy's trigger.c 90*4882a593Smuzhiyun+void config_parse_dir(const char *path) { 91*4882a593Smuzhiyun+ struct stat sb; 92*4882a593Smuzhiyun+ struct dirent **namelist; 93*4882a593Smuzhiyun+ int n; 94*4882a593Smuzhiyun+ 95*4882a593Smuzhiyun+ if (stat(path, &sb) < 0 || !S_ISDIR(sb.st_mode)) 96*4882a593Smuzhiyun+ return; 97*4882a593Smuzhiyun+ 98*4882a593Smuzhiyun+ n = scandir(path, &namelist, accept_configure_file, alphasort); 99*4882a593Smuzhiyun+ if ( n < 0) 100*4882a593Smuzhiyun+ return; 101*4882a593Smuzhiyun+ 102*4882a593Smuzhiyun+ while (n--) { 103*4882a593Smuzhiyun+ struct stat sf; 104*4882a593Smuzhiyun+ char *file = namelist[n]->d_name; 105*4882a593Smuzhiyun+ char *sep = "/"; 106*4882a593Smuzhiyun+ char fpath[strlen(path)+strlen(sep)+strlen(file) + 1]; 107*4882a593Smuzhiyun+ strcpy(fpath, path); 108*4882a593Smuzhiyun+ strcat(fpath, sep); 109*4882a593Smuzhiyun+ strcat(fpath, file); 110*4882a593Smuzhiyun+ if (stat(fpath, &sf) != -1 && S_ISREG(sf.st_mode)) 111*4882a593Smuzhiyun+ config_parse_file(fpath); 112*4882a593Smuzhiyun+ free(namelist[n]); 113*4882a593Smuzhiyun+ } 114*4882a593Smuzhiyun+ free(namelist); 115*4882a593Smuzhiyun+} 116*4882a593Smuzhiyun+ 117*4882a593Smuzhiyun static const char *config_key_event(char *shortcut, char *exec) { 118*4882a593Smuzhiyun int i; 119*4882a593Smuzhiyun char *code, *modifier; 120*4882a593Smuzhiyun@@ -619,8 +667,6 @@ static char *config_trim_string(char *str) { 121*4882a593Smuzhiyun void daemon_init() { 122*4882a593Smuzhiyun int i; 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun- conf.configfile = "/etc/input-event-daemon.conf"; 125*4882a593Smuzhiyun- 126*4882a593Smuzhiyun conf.monitor = 0; 127*4882a593Smuzhiyun conf.verbose = 0; 128*4882a593Smuzhiyun conf.daemon = 1; 129*4882a593Smuzhiyun@@ -814,6 +860,7 @@ static void daemon_print_version() { 130*4882a593Smuzhiyun } 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun int main(int argc, char *argv[]) { 133*4882a593Smuzhiyun+ const char *configfile = DEFAULT_CONFIGURE_FILE; 134*4882a593Smuzhiyun int result, arguments = 0, listen_len = 0; 135*4882a593Smuzhiyun static const struct option long_options[] = { 136*4882a593Smuzhiyun { "monitor", no_argument, 0, 'm' }, 137*4882a593Smuzhiyun@@ -859,7 +906,7 @@ int main(int argc, char *argv[]) { 138*4882a593Smuzhiyun return EXIT_SUCCESS; 139*4882a593Smuzhiyun break; 140*4882a593Smuzhiyun case 'c': /* config */ 141*4882a593Smuzhiyun- conf.configfile = optarg; 142*4882a593Smuzhiyun+ configfile = optarg; 143*4882a593Smuzhiyun break; 144*4882a593Smuzhiyun case 'v': /* verbose */ 145*4882a593Smuzhiyun conf.verbose = 1; 146*4882a593Smuzhiyun@@ -891,7 +938,13 @@ int main(int argc, char *argv[]) { 147*4882a593Smuzhiyun if (!conf.listen[0]) 148*4882a593Smuzhiyun input_open_all_listener(); 149*4882a593Smuzhiyun } else { 150*4882a593Smuzhiyun- config_parse_file(); 151*4882a593Smuzhiyun+ char path[strlen(configfile) + 3]; 152*4882a593Smuzhiyun+ 153*4882a593Smuzhiyun+ config_parse_file(configfile); 154*4882a593Smuzhiyun+ 155*4882a593Smuzhiyun+ strcpy(path, configfile); 156*4882a593Smuzhiyun+ strcat(path, ".d"); 157*4882a593Smuzhiyun+ config_parse_dir(path); 158*4882a593Smuzhiyun } 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun daemon_start_listener(); 161*4882a593Smuzhiyun-- 162*4882a593Smuzhiyun2.11.0 163*4882a593Smuzhiyun 164