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