version 0.2.0
[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 #include "globals.h"
22
23 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
24  Function acts as a signal handler replacement for SIGUSR1 and SIGUSR2
25  On these signals we read a possibly changed configuration file again
26  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
27
28 void re_read_file_config(int signum)
29 {
30
31         struct program *p;
32
33         FILE *fp;
34         FILE *errorfp;
35
36 /* Open (and truncate) an error log for future reference */
37         
38         if ((errorfp = fopen(total_error_file, "w")) == NULL) {
39                 exit_on_error(errorfp, "%s ERROR: Reread - Can not open %s in write mode\n", our_prog_name, total_error_file);
40         }
41
42 /* Read in an existing configuration file */
43
44         p = external_list;
45         if ((fp = fopen(total_config_file, "r")) == NULL) {
46                 exit_on_error(errorfp, "%s ERROR: Reread - Can not open %s in read mode\n", our_prog_name, total_config_file);
47         } else {
48                 switch (read_file_config((void *)&p, fp)){
49                         
50                         case 0:
51                         fclose(fp);
52                         break;
53
54                         case 1:
55                         fclose(fp);
56                         exit_on_error(errorfp, "%s ERROR: Reread - No complete record found in %s\n", our_prog_name, total_config_file);
57                         
58                         case 2:
59                         fclose(fp);
60                         exit_on_error(errorfp, "%s ERROR: Reread - Memory allocation error while parsing %s\n", our_prog_name, total_config_file);
61
62                         case 3:
63                         fclose(fp);
64                         exit_on_error(errorfp, "%s ERROR: Reread - Config File Version %d not found\n", our_prog_name, (void *)CONFIG_VERSION);
65
66                         default:
67                         fclose(fp);
68                         exit_on_error(errorfp, "%s ERROR: Reread - Unknown error while parsing %s\n", our_prog_name, total_config_file);
69                 }
70         }
71         
72         fclose(errorfp);
73 }
74
75 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
76  Function acts as a signal handler replacement for SIGINT, SIGHUP and
77  SIGTERM. All are normal exit signals. We want to trap them in order to
78  perform some house keeping pre-exit. Delete a PID file and free memory
79  Since it takes care of several signals, it could get invoked recursively
80  if some other signal comes in. We use this "volatile" variable to track
81  the case. At the end we restore the default signal handler and raise it
82  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
83
84 volatile sig_atomic_t clean_up_exit_in_progress = 0;
85 void clean_up_exit(int signum)
86 {
87         int i;
88         struct program *p;
89         p = external_list;
90
91         if (clean_up_exit_in_progress) {
92                 raise(signum);
93         }
94         clean_up_exit_in_progress = 1;
95         
96         if (go_daemon) {
97                 unlink(total_pid_file);
98         }
99
100         if (total_config_dir) {
101                 free(total_config_dir);
102         }
103
104         if (total_config_file) {
105                 free(total_config_file);
106         }
107
108         if (total_pid_file) {
109                 free(total_pid_file);
110         }
111
112         if (total_error_file) {
113                 free(total_error_file);
114         }
115
116         if (num_list) {
117                 for (i = 0; i < num_list; i++, p++) {
118                         free(p->class_name);
119                 }
120         }
121
122         if (pad_info_block) {
123                 XFreeDeviceList(pad_info_block);
124         }
125
126         if (pen_info_block) {
127                 XFreeDeviceList(pen_info_block);
128         }
129
130         if (pad_device) {
131                 XCloseDevice(display, pad_device);
132         }
133
134         if (pen_device) {
135                 XCloseDevice(display, pen_device);
136         }
137
138         if (display) {
139                 XCloseDisplay(display);
140         }
141
142         signal(signum, SIG_DFL);
143         raise(signum);
144 }
145
146 /* End Code */
147