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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (hide 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 sysadm 1.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