/[LeafOK_CVS]/pvpgn-1.7.4/src/d2dbs/handle_signal.c
ViewVC logotype

Contents of /pvpgn-1.7.4/src/d2dbs/handle_signal.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (show annotations) (vendor branch)
Tue Jun 6 03:41:38 2006 UTC (19 years, 9 months ago) by sysadm
Branch: GNU, MAIN
CVS Tags: arelease, HEAD
Changes since 1.1: +0 -0 lines
Content type: text/x-csrc
no message

1 /*
2 * Copyright (C) 2000,2001 Onlyer (onlyer@263.net)
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 */
18 #include "common/setup_before.h"
19 #include "setup.h"
20
21 #ifdef STDC_HEADERS
22 # include <stdlib.h>
23 #else
24 # ifdef HAVE_MALLOC_H
25 # include <malloc.h>
26 # endif
27 #endif
28 #include <errno.h>
29 #ifdef HAVE_STRING_H
30 # include <string.h>
31 #else
32 # ifdef HAVE_STRINGS_H
33 # include <strings.h>
34 # endif
35 # ifdef HAVE_MEMORY_H
36 # include <memory.h>
37 # endif
38 #endif
39 #include "compat/strdup.h"
40 #ifdef TIME_WITH_SYS_TIME
41 # include <time.h>
42 # include <sys/time.h>
43 #else
44 # ifdef HAVE_SYS_TIME_H
45 # include <sys/time.h>
46 # else
47 # include <time.h>
48 # endif
49 #endif
50 #ifdef DO_POSIXSIG
51 # include <signal.h>
52 # include "compat/signal.h"
53 #endif
54 #ifdef HAVE_FCNTL_H
55 # include <fcntl.h>
56 #else
57 # ifdef HAVE_SYS_FILE_H
58 # include <sys/file.h>
59 # endif
60 #endif
61 #ifdef HAVE_UNISTD_H
62 # include <unistd.h>
63 #endif
64
65 #include "dbserver.h"
66 #include "prefs.h"
67 #include "d2ladder.h"
68 #include "cmdline_parse.h"
69 #include "handle_signal.h"
70 #include "common/eventlog.h"
71 #include "common/xalloc.h"
72 #include "common/setup_after.h"
73
74 static void on_signal(int s);
75
76 static volatile struct
77 {
78 unsigned char do_quit;
79 unsigned char cancel_quit;
80 unsigned char reload_config;
81 unsigned char save_ladder;
82 unsigned int exit_time;
83 } signal_data ={ 0, 0, 0, 0, 0 };
84
85 extern int d2dbs_handle_signal(void)
86 {
87 time_t now;
88 char const * levels;
89 char * temp;
90 char const * tok;
91
92
93 if (signal_data.cancel_quit) {
94 signal_data.cancel_quit=0;
95 if (!signal_data.exit_time) {
96 eventlog(eventlog_level_info,__FUNCTION__,"there is no previous shutdown to be canceled");
97 } else {
98 signal_data.exit_time=0;
99 eventlog(eventlog_level_info,__FUNCTION__,"shutdown was canceled due to signal");
100 }
101 }
102 if (signal_data.do_quit) {
103 signal_data.do_quit=0;
104 now=time(NULL);
105 if (!signal_data.exit_time) {
106 signal_data.exit_time=now+d2dbs_prefs_get_shutdown_delay();
107 } else {
108 signal_data.exit_time-=d2dbs_prefs_get_shutdown_decr();
109 }
110 eventlog(eventlog_level_info,__FUNCTION__,"the server is going to shutdown in %lu minutes",(signal_data.exit_time-now)/60);
111 }
112 if (signal_data.exit_time) {
113 now=time(NULL);
114 if (now >= (signed)signal_data.exit_time) {
115 eventlog(eventlog_level_info,__FUNCTION__,"shutdown server due to signal");
116 return -1;
117 }
118 }
119 if (signal_data.reload_config) {
120 signal_data.reload_config=0;
121 eventlog(eventlog_level_info,__FUNCTION__,"reloading configuartion file due to signal");
122 if (d2dbs_prefs_reload(d2dbs_cmdline_get_prefs_file())<0) {
123 eventlog(eventlog_level_error,__FUNCTION__,"error reload configuration file,exitting");
124 return -1;
125 }
126 eventlog_clear_level();
127 if ((levels = d2dbs_prefs_get_loglevels()))
128 {
129 temp = xstrdup(levels);
130 tok = strtok(temp,","); /* strtok modifies the string it is passed */
131
132 while (tok)
133 {
134 if (eventlog_add_level(tok)<0)
135 eventlog(eventlog_level_error,__FUNCTION__,"could not add log level \"%s\"",tok);
136 tok = strtok(NULL,",");
137 }
138 xfree(temp);
139 }
140
141 if (!d2dbs_cmdline_get_debugmode()) eventlog_open(d2dbs_prefs_get_logfile());
142 }
143 if (signal_data.save_ladder) {
144 signal_data.save_ladder=0;
145 eventlog(eventlog_level_info,__FUNCTION__,"save ladder data due to signal");
146 d2ladder_saveladder();
147 }
148 return 0;
149 }
150
151 #ifdef WIN32
152 extern void d2dbs_signal_quit_wrapper(void)
153 {
154 signal_data.do_quit=1;
155 }
156
157 extern void d2dbs_signal_reload_config_wrapper(void)
158 {
159 signal_data.reload_config = 1;
160 }
161
162 extern void d2dbs_signal_save_ladder_wrapper(void)
163 {
164 signal_data.save_ladder = 1;
165 }
166
167 extern void d2dbs_signal_exit_wrapper(void)
168 {
169 signal_data.exit_time = 1;
170 signal_data.do_quit = 1;
171 }
172 #else
173 extern int d2dbs_handle_signal_init(void)
174 {
175 signal(SIGINT,on_signal);
176 signal(SIGTERM,on_signal);
177 signal(SIGABRT,on_signal);
178 signal(SIGHUP,on_signal);
179 signal(SIGUSR1,on_signal);
180 signal(SIGPIPE,on_signal);
181 return 0;
182 }
183
184 static void on_signal(int s)
185 {
186 switch (s) {
187 case SIGINT:
188 eventlog(eventlog_level_debug,__FUNCTION__,"sigint received");
189 signal_data.do_quit=1;
190 break;
191 case SIGTERM:
192 eventlog(eventlog_level_debug,__FUNCTION__,"sigint received");
193 signal_data.do_quit=1;
194 break;
195 case SIGABRT:
196 eventlog(eventlog_level_debug,__FUNCTION__,"sigabrt received");
197 signal_data.cancel_quit=1;
198 break;
199 case SIGHUP:
200 eventlog(eventlog_level_debug,__FUNCTION__,"sighup received");
201 signal_data.reload_config=1;
202 break;
203 case SIGUSR1:
204 eventlog(eventlog_level_debug,__FUNCTION__,"sigusr1 received");
205 signal_data.save_ladder=1;
206 break;
207 case SIGPIPE:
208 eventlog(eventlog_level_debug,__FUNCTION__,"sigpipe received");
209 break;
210 }
211 signal(s,on_signal);
212 }
213 #endif
214

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1