summaryrefslogtreecommitdiff
path: root/server/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'server/main.c')
-rw-r--r--server/main.c72
1 files changed, 53 insertions, 19 deletions
diff --git a/server/main.c b/server/main.c
index 19832b8..b3ec4e4 100644
--- a/server/main.c
+++ b/server/main.c
@@ -99,9 +99,10 @@ static int do_net_setup P((void)), initialize P((void));
static void usage P((void)), do_reset P((void));
static SIGNAL_RETURN_TYPE bye P((int)),
dbug_on P((int)), dbug_off P((int)),
- dump_db P((int)), dump_strings P((int)),
+ sig_dump_db P((int)), sig_dump_strings P((int)),
reset P((int)), reap P((int));
static void read_from_dump P((char *dumpfile));
+static void dump_db P((void)), dump_strings P((void));
#ifndef DEBUG
static void detach P((void));
@@ -142,6 +143,9 @@ int zalone;
struct timeval t_local; /* store current time for other uses */
+static int dump_db_flag = 0;
+static int dump_strings_flag = 0;
+
u_long npackets; /* number of packets processed */
long uptime; /* when we started operations */
static int nofork;
@@ -286,10 +290,11 @@ main(argc, argv)
action.sa_handler = reap;
sigaction(SIGCHLD, &action, NULL);
- action.sa_handler = dump_db;
+ action.sa_handler = sig_dump_db;
sigaction(SIGFPE, &action, NULL);
+ sigaction(SIGXCPU, &action, NULL);
- action.sa_handler = dump_strings;
+ action.sa_handler = sig_dump_strings;
sigaction(SIGEMT, &action, NULL);
action.sa_handler = reset;
@@ -300,15 +305,19 @@ main(argc, argv)
(void) signal(SIGUSR1, dbug_on);
(void) signal(SIGUSR2, dbug_off);
(void) signal(SIGCHLD, reap);
- (void) signal(SIGFPE, dump_db);
- (void) signal(SIGEMT, dump_strings);
+ (void) signal(SIGFPE, sig_dump_db);
+ (void) signal(SIGXCPU, sig_dump_db);
+ (void) signal(SIGEMT, sig_dump_strings);
(void) signal(SIGHUP, reset);
#endif /* POSIX */
syslog(LOG_NOTICE, "Ready for action");
+ /* Initialize t_local for other uses */
+ (void) gettimeofday(&t_local, (struct timezone *)0);
/* GO! */
uptime = NOW;
+
#ifdef DEBUG_MALLOC
malloc_inuse(&m_size);
#endif
@@ -316,11 +325,17 @@ main(argc, argv)
if (doreset)
do_reset();
+ if (dump_db_flag)
+ dump_db();
+ if (dump_strings_flag)
+ dump_strings();
+
+ nexthost_tv.tv_usec = 0;
tvp = &nexthost_tv;
+
if (nexttimo != 0L) {
nexthost_tv.tv_sec = nexttimo - NOW;
- nexthost_tv.tv_usec = 0;
- if (nexthost_tv.tv_sec < 0) {
+ if (nexthost_tv.tv_sec <= 0) {
/* timeout has passed! */
/* so we process one timeout, then pop to
select, polling for input. This way we get
@@ -331,7 +346,7 @@ main(argc, argv)
nexthost_tv.tv_sec = 0;
}
} else { /* no timeouts to process */
- tvp = (struct timeval *) NULL;
+ nexthost_tv.tv_sec = 15;
}
readable = interesting;
if (msgs_queued()) {
@@ -340,8 +355,8 @@ main(argc, argv)
nfound = 1;
FD_ZERO(&readable);
} else
- nfound = select(nfildes, &readable, (fd_set *) NULL,
- (fd_set *) NULL, tvp);
+ nfound = select(nfildes, &readable, (fd_set *) 0,
+ (fd_set *) 0, tvp);
/* Initialize t_local for other uses */
(void) gettimeofday(&t_local, (struct timezone *)0);
@@ -578,19 +593,26 @@ int fork_for_dump = 0;
static SIGNAL_RETURN_TYPE
#ifdef __STDC__
-dump_strings (int sig)
+sig_dump_strings (int sig)
#else
-dump_strings(sig)
+sig_dump_strings(sig)
int sig;
#endif
{
+ dump_strings_flag = 1;
+ SIG_RETURN;
+}
+
+static void dump_strings()
+{
FILE *fp;
int oerrno = errno;
fp = fopen ("/usr/tmp/zephyr.strings", "w");
if (!fp) {
syslog (LOG_ERR, "can't open strings dump file: %m");
errno = oerrno;
- SIG_RETURN;
+ dump_strings_flag = 0;
+ return;
}
syslog (LOG_INFO, "dumping strings to disk");
print_zstring_table(fp);
@@ -599,17 +621,24 @@ dump_strings(sig)
else
syslog (LOG_INFO, "dump done");
oerrno = errno;
- SIG_RETURN;
+ dump_strings_flag = 0;
+ return;
}
static SIGNAL_RETURN_TYPE
#ifdef __STDC__
-dump_db(int sig)
+sig_dump_db(int sig)
#else
-dump_db(sig)
+sig_dump_db(sig)
int sig;
#endif
{
+ dump_db_flag = 1;
+ SIG_RETURN;
+}
+
+static void dump_db()
+{
/* dump the in-core database to human-readable form on disk */
FILE *fp;
int oerrno = errno;
@@ -627,11 +656,15 @@ dump_db(sig)
pid = -1;
#endif
if (pid > 0)
- SIG_RETURN;
+ {
+ dump_db_flag = 0;
+ return;
+ }
if ((fp = fopen("/usr/tmp/zephyr.db", "w")) == (FILE *)0) {
syslog(LOG_ERR, "can't open dump database");
errno = oerrno;
- SIG_RETURN;
+ dump_db_flag = 0;
+ return;
}
syslog(LOG_INFO, "dumping to disk");
server_dump_servers(fp);
@@ -644,7 +677,8 @@ dump_db(sig)
if (pid == 0)
exit (0);
errno = oerrno;
- SIG_RETURN;
+ dump_db_flag = 0;
+ return;
}
static SIGNAL_RETURN_TYPE