]> jfr.im git - irc/quakenet/newserv.git/blob - core/main.c
Added new recycling version of sstring as sstring-new.[ch]
[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_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 nsexit();
66
67 freeconfig();
68 finisstring();
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
87 /*
88 * seed the pseudo-random number generator, rand()
89 */
90 void initseed() {
91 struct timeval t;
92
93 gettimeofday(&t, NULL);
94 srand(t.tv_usec);
95 }
96
97 void siginthandler(int sig) {
98 newserv_shutdown_pending = 1;
99 }
100
101 void sigusr1handler(int sig) {
102 newserv_sigusr1_pending = 1;
103 }
104
105 void sighuphandler(int sig) {
106 newserv_sighup_pending = 1;
107 }
108
109 void sigsegvhandler(int sig) {
110 handlecore();
111
112 oldsegv(sig);
113 }