]> jfr.im git - irc/quakenet/newserv.git/blob - core/main.c
ec6f4abce165d1d9a73949888257c9a97bfe43a4
[irc/quakenet/newserv.git] / core / main.c
1 #include "../lib/sstring.h"
2 #include "events.h"
3 #include "schedule.h"
4 #include "hooks.h"
5 #include "modules.h"
6 #include "config.h"
7 #include "error.h"
8 #include "nsmalloc.h"
9
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <time.h>
13 #include <sys/time.h>
14 #include <signal.h>
15
16 void initseed();
17 void init_logfile();
18 void siginthandler(int sig);
19 void sigusr1handler(int sig);
20 void sigsegvhandler(int sig);
21 void sighuphandler(int sig);
22 void handlecore(void);
23 void handlesignals(void);
24
25 int newserv_shutdown_pending;
26 static int newserv_sigint_pending, newserv_sigusr1_pending, newserv_sighup_pending;
27 static void (*oldsegv)(int);
28
29 int main(int argc, char **argv) {
30 initseed();
31 inithooks();
32 inithandlers();
33 initschedule();
34
35 init_logfile();
36
37 initsstring();
38
39 if (argc>1) {
40 initconfig(argv[1]);
41 } else {
42 initconfig("newserv.conf");
43 }
44
45 /* Loading the modules will bring in the bulk of the code */
46 initmodules();
47 signal(SIGINT, siginthandler);
48 signal(SIGUSR1, sigusr1handler);
49 signal(SIGHUP, sighuphandler);
50 oldsegv = signal(SIGSEGV, sigsegvhandler);
51
52 /* Main loop */
53 for(;;) {
54 handleevents(10);
55 doscheduledevents(time(NULL));
56
57 if (newserv_shutdown_pending) {
58 newserv_shutdown();
59 break;
60 }
61
62 handlesignals();
63 }
64
65 freeconfig();
66 finisstring();
67
68 nsexit();
69 }
70
71 void handlesignals(void) {
72 if (newserv_sigusr1_pending) {
73 signal(SIGUSR1, sigusr1handler);
74 Error("core", ERR_INFO, "SIGUSR1 received.");
75 triggerhook(HOOK_CORE_SIGUSR1, NULL);
76 newserv_sigusr1_pending=0;
77 }
78
79 if (newserv_sighup_pending) {
80 signal(SIGHUP, sighuphandler);
81 Error("core", ERR_INFO, "SIGHUP received, rehashing...");
82 triggerhook(HOOK_CORE_REHASH, (void *)1);
83 newserv_sighup_pending=0;
84 }
85
86 if (newserv_sigint_pending) {
87 Error("core", ERR_INFO, "SIGINT received, terminating.");
88 triggerhook(HOOK_CORE_SIGINT, NULL);
89 newserv_sigint_pending=0;
90 newserv_shutdown_pending=1;
91 }
92 }
93
94 /*
95 * seed the pseudo-random number generator, rand()
96 */
97 void initseed() {
98 struct timeval t;
99
100 gettimeofday(&t, NULL);
101 srand(t.tv_usec);
102 }
103
104 void siginthandler(int sig) {
105 newserv_sigint_pending = 1;
106 }
107
108 void sigusr1handler(int sig) {
109 newserv_sigusr1_pending = 1;
110 }
111
112 void sighuphandler(int sig) {
113 newserv_sighup_pending = 1;
114 }
115
116 void sigsegvhandler(int sig) {
117 handlecore();
118
119 oldsegv(sig);
120 }