fix possible crash on user deletion
[srvx.git] / src / main-win32.c
1 #include "common.h"
2 #include "conf.h"
3 #include "gline.h"
4 #include "ioset.h"
5 #include "modcmd.h"
6 #include "saxdb.h"
7 #include "mail.h"
8 #include "timeq.h"
9
10 #include "chanserv.h"
11 #include "global.h"
12 #include "modules.h"
13 #include "opserv.h"
14
15 #define sleep(x) Sleep((x) * 1000)
16 #include "main-common.c"
17
18 #include <windows.h>
19
20 static int daemon;
21 static int debug;
22
23 void parse_options(LPSTR args)
24 {
25     const char *replay_file_name;
26     const char *arg;
27     char *argv[16];
28     unsigned int jj;
29     unsigned int check_conf;
30     int argc;
31     int ii;
32
33     argc = split_line(args, 0, ArrayLength(argv), argv);
34     if (argc < 1)
35         return;
36
37     replay_file_name = NULL;
38     check_conf = 0;
39     daemon = 1;
40     for (ii = 0; ii < argc; ++ii) {
41         arg = argv[ii];
42         if ((arg[0] == '/') || (arg[0] == '-' && arg[1] == '-')) {
43             arg += 1 + (arg[0] == '-' && arg[1] == '-');
44             if (!strcmp(arg, "config")) {
45             } else if (!strcmp(arg, "debug")) {
46                 debug = 1;
47             } else if (!strcmp(arg, "foreground")) {
48                 daemon = 0;
49             } else if (!strcmp(arg, "check")) {
50                 check_conf = 1;
51             } else if (!strcmp(arg, "replay")) {
52                 replay_file_name = argv[++ii];
53             } else if (!strcmp(arg, "version")) {
54                 version();
55                 license();
56                 exit(0);
57             } else {
58                 usage("srvx");
59                 exit(0);
60             }
61         } else if (arg[0] == '-') {
62             for (jj = 1; arg[jj] != '\0'; ++jj) {
63                 switch (arg[jj]) {
64                 case 'c': services_config = argv[++ii]; break;
65                 case 'd': debug = 1; break;
66                 case 'f': daemon = 0; break;
67                 case 'k': check_conf = 1; break;
68                 case 'r': replay_file_name = argv[++ii]; break;
69                     break;
70                 case 'v':
71                     version();
72                     license();
73                     exit(0);
74                 default:
75                     usage("srvx");
76                     exit(0);
77                 }
78             }
79         }
80     }
81
82     if (check_conf) {
83         if (conf_read(services_config)) {
84             printf("%s appears to be a valid configuration file.\n", services_config);
85         } else {
86             printf("%s is an invalid configuration file.\n", services_config);
87         }
88         exit(0);
89     }
90
91     if (replay_file_name) {
92         replay_file = fopen(optarg, "r");
93         if (!replay_file) {
94             fprintf(stderr, "Could not open %s for reading: %s (%d)\n",
95                     optarg, strerror(errno), errno);
96             exit(0);
97         }
98     }
99 }
100
101 int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
102 {
103     tools_init();
104     parse_options(lpCmdLine);
105     log_module(MAIN_LOG, LOG_INFO, "Initializing daemon...");
106
107     if (!conf_read(services_config)) {
108         log_module(MAIN_LOG, LOG_FATAL, "Unable to read %s.", services_config);
109         exit(0);
110     }
111
112     boot_time = time(&now);
113     conf_register_reload(uplink_compile);
114     atexit(call_exit_funcs);
115     reg_exit_func(main_shutdown);
116
117     log_init();
118     MAIN_LOG = log_register_type("srvx", "file:main.log");
119     if (debug)
120         log_debug();
121     ioset_init();
122     init_structs();
123     init_parse();
124     modcmd_init();
125     saxdb_init();
126     gline_init();
127     mail_init();
128     helpfile_init();
129     conf_globals();
130     conf_rlimits();
131     modules_init();
132     message_register_table(msgtab);
133     modcmd_finalize();
134     saxdb_finalize();
135     helpfile_finalize();
136     modules_finalize();
137     reg_exit_func(saxdb_write_all);
138     srand(time(&now));
139     ioset_run();
140
141     return quit_services;
142     (void)hInst; (void)hPrevInst; (void)nCmdShow;
143 }
144