3a3ac676f36ec2bf83791658f0aa22c4a754f32f
[expresskeys.git] / src-server / on_signal.c
1 /*
2  * on_signal.c -- Support ExpressKeys & Touch Strips on a Wacom Intuos3 tablet.
3  *
4  * Copyright (C) 2005 - Mats Johannesson
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA.
19  *
20  */
21
22 #include "globals.h"
23
24 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
25 /* Function acts as a signal handler replacement for SIGUSR1 and SIGUSR2 */
26 /* On these signals we read a possibly changed configuration file again */
27 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
28
29 void re_read_file_config(int signum)
30 {
31
32         struct program *p;
33
34         FILE *fp;
35         FILE *errorfp;
36
37 /* Open (and truncate) an error log for future reference */
38         
39         if ((errorfp = fopen(total_error_file, "w")) == NULL) {
40                 exit_on_error(errorfp, "%s ERROR: Reread - Can not open %s in write mode\n", our_prog_name, total_error_file);
41         }
42
43 /* Read in an existing configuration file */
44
45         p = external_list;
46         if ((fp = fopen(total_config_file, "r")) == NULL) {
47                 exit_on_error(errorfp, "%s ERROR: Reread - Can not open %s in read mode\n", our_prog_name, total_config_file);
48         } else {
49                 switch (read_file_config((void *)&p, fp)){
50                         
51                         case 0:
52                         fclose(fp);
53                         break;
54
55                         case 1:
56                         fclose(fp);
57                         exit_on_error(errorfp, "%s ERROR: Reread - No complete record found in %s\n", our_prog_name, total_config_file);
58                         
59                         case 2:
60                         fclose(fp);
61                         exit_on_error(errorfp, "%s ERROR: Reread - Memory allocation error while parsing %s\n", our_prog_name, total_config_file);
62                         
63                         default:
64                         fclose(fp);
65                         exit_on_error(errorfp, "%s ERROR: Reread - Unknown error while parsing %s\n", our_prog_name, total_config_file);
66                 }
67         }
68         
69         fclose(errorfp);
70 }
71
72 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
73 /* Function acts as a signal handler replacement for SIGINT, SIGHUP and */
74 /* SIGTERM. All are normal exit signals. We want to trap them in order to */
75 /* perform some house keeping pre-exit. Delete a PID file and free memory */
76 /* Since it takes care of several signals, it could get invoked recursively */
77 /* if some other signal comes in. We use this "volatile" variable to track */
78 /* the case. At the end we restore the default signal handler and raise it */
79 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
80
81 volatile sig_atomic_t clean_up_exit_in_progress = 0;
82 void clean_up_exit(int signum)
83 {
84         int i;
85         struct program *p;
86         p = external_list;
87
88         if (clean_up_exit_in_progress) {
89                 raise(signum);
90         }
91         clean_up_exit_in_progress = 1;
92         
93         if (go_daemon) {
94                 unlink(total_pid_file);
95         }
96
97         if (total_config_dir) {
98                 free(total_config_dir);
99         }
100
101         if (total_config_file) {
102                 free(total_config_file);
103         }
104
105         if (total_pid_file) {
106                 free(total_pid_file);
107         }
108
109         if (total_error_file) {
110                 free(total_error_file);
111         }
112
113         if (num_list) {
114                 for (i = 0; i < num_list; i++, p++) {
115                         free(p->class_name);
116                 }
117         }
118
119         if (pad_info_block) {
120                 XFreeDeviceList(pad_info_block);
121         }
122
123         if (pen_info_block) {
124                 XFreeDeviceList(pen_info_block);
125         }
126
127         if (pad_device) {
128                 XCloseDevice(display, pad_device);
129         }
130
131         if (pen_device) {
132                 XCloseDevice(display, pen_device);
133         }
134
135         if (display) {
136                 XCloseDisplay(display);
137         }
138
139         signal(signum, SIG_DFL);
140         raise(signum);
141 }
142
143 /* End Code */
144