]> jfr.im git - irc/quakenet/newserv.git/blob - core/main.c
Add core handler.
[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 int newserv_shutdown_pending;
17 int newserv_sigusr1_pending;
18
19 void initseed();
20 void init_logfile();
21 void siginthandler(int sig);
22 void sigusr1handler(int sig);
23 void sigsegvhandler(int sig);
24 void handlecore(void);
25
26 int main(int argc, char **argv) {
27 initseed();
28 inithooks();
29 inithandlers();
30 initschedule();
31
32 init_logfile();
33
34 initsstring();
35
36 if (argc>1) {
37 initconfig(argv[1]);
38 } else {
39 initconfig("newserv.conf");
40 }
41
42 /* Loading the modules will bring in the bulk of the code */
43 initmodules();
44 signal(SIGINT, siginthandler);
45 signal(SIGUSR1, sigusr1handler);
46 signal(SIGSEGV, sigsegvhandler);
47
48 /* Main loop */
49 for(;;) {
50 handleevents(10);
51 doscheduledevents(time(NULL));
52 if (newserv_shutdown_pending) {
53 newserv_shutdown();
54 break;
55 }
56
57 if (newserv_sigusr1_pending) {
58 signal(SIGUSR1, sigusr1handler);
59 triggerhook(HOOK_CORE_SIGUSR1, NULL);
60 newserv_sigusr1_pending=0;
61 }
62 }
63
64 nsexit();
65
66 freeconfig();
67 finisstring();
68 }
69
70 /*
71 * seed the pseudo-random number generator, rand()
72 */
73 void initseed() {
74 struct timeval t;
75
76 gettimeofday(&t, NULL);
77 srand(t.tv_usec);
78 }
79
80 void siginthandler(int sig) {
81 newserv_shutdown_pending = 1;
82 }
83
84 void sigusr1handler(int sig) {
85 newserv_sigusr1_pending = 1;
86 }
87
88 void sigsegvhandler(int sig) {
89 handlecore();
90 }
91