1 /*
2 * main.c
3 *
4 * (C)1996-2011 by Marc Huber <Marc.Huber@web.de>
5 * All rights reserved.
6 *
7 * $Id: main.c,v 1.40 2015/03/14 06:11:27 marc Exp marc $
8 *
9 */
10
11 #define __MAIN__
12
13 #include "headers.h"
14 #include "misc/version.h"
15 #include <sys/un.h>
16 #include <grp.h>
17
18 #include "misc/sig_segv.h"
19
20 static const char rcsid[] __attribute__ ((used)) = "$Id: main.c,v 1.40 2015/03/14 06:11:27 marc Exp marc $";
21
22 #ifdef WITH_SSL
23 #include "misc/ssl_init.h"
24 #endif /* WITH_SSL */
25
periodics(struct context * ctx,int cur)26 static void periodics(struct context *ctx, int cur __attribute__ ((unused)))
27 {
28 struct scm_data sd;
29
30 DebugIn(DEBUG_PROC);
31
32 io_sched_renew_proc(ctx->io, ctx, (void *) periodics);
33 process_signals();
34 io_child_reap();
35
36 sd.type = SCM_KEEPALIVE;
37 if (!die_when_idle && common_data.scm_send_msg(0, &sd, -1))
38 die_when_idle = -1;
39
40 if (common_data.users_cur == 0 && die_when_idle) {
41 Debug((DEBUG_PROC, "exiting -- process out of use\n"));
42 mavis_drop(mcx);
43 logmsg("Terminating, no longer needed.");
44 exit(EX_OK);
45 }
46
47 DebugOut(DEBUG_PROC);
48 }
49
main(int argc,char ** argv,char ** envp)50 int main(int argc, char **argv, char **envp)
51 {
52 struct rlimit rlim;
53 struct scm_data_max sd;
54
55 scm_main(argc, argv, envp);
56
57 cfg_init();
58
59 if (!common_data.conffile) {
60 common_data.conffile = argv[optind];
61 common_data.id = argv[optind + 1];
62 }
63 cfg_read_config(common_data.conffile, parse_decls, common_data.id ? common_data.id : common_data.progname);
64
65 if (common_data.parse_only)
66 exit(EX_OK);
67
68 umask(022);
69
70 acl_finish();
71
72 if (!logformat_transfer)
73 logformat_transfer = DEFAULT_LOGFORMAT_TRANSFER;
74 if (!logformat_command)
75 logformat_command = DEFAULT_LOGFORMAT_COMMAND;
76 if (!logformat_event)
77 logformat_event = DEFAULT_LOGFORMAT_EVENT;
78
79 logmsg("startup (version " VERSION ")");
80
81 mavis_detach();
82
83 real_uid = getuid();
84 real_gid = getgid();
85 common_data.pid = getpid();
86
87 srand((u_int) common_data.pid);
88
89
90 #ifdef WITH_SSL
91 if (ssl_cert) {
92 ssl_ctx = ssl_init(ssl_cert, ssl_key, ssl_pass, ssl_ciphers);
93 if (ssl_ctx && ssl_auth)
94 ssl_init_verify(ssl_ctx, ssl_depth, ssl_cafile, ssl_capath);
95 }
96 #endif /* WITH_SSL */
97
98 #ifdef WITH_MMAP
99 pagesize = getpagesize();
100 bufsize_mmap += pagesize - 1;
101 bufsize_mmap /= pagesize;
102 bufsize_mmap *= pagesize;
103 bufsize += pagesize - 1;
104 bufsize /= pagesize;
105 bufsize *= pagesize;
106 #endif /* WITH_MMAP */
107
108 buffer_setsize(bufsize, 0);
109 setup_sig_segv(common_data.coredumpdir, common_data.gcorepath, common_data.debug_cmd);
110 setup_sig_bus();
111
112 setgroups(0, NULL);
113 umask(0);
114 message_init();
115 md_init();
116
117 if (common_data.singleprocess) {
118 common_data.scm_accept = accept_control_raw;
119 io = common_data.io;
120 } else {
121 io = common_data.io = io_init();
122 setproctitle_init(argv, envp);
123 setup_signals();
124 ctx_spawnd = new_context(io);
125 ctx_spawnd->cfn = 0;
126 io_register(io, 0, ctx_spawnd);
127 io_set_cb_i(io, 0, (void *) accept_control);
128 io_clr_cb_o(io, 0);
129 io_set_cb_h(io, 0, (void *) cleanup_spawnd);
130 io_set_cb_e(io, 0, (void *) cleanup_spawnd);
131 io_set_i(io, 0);
132 }
133
134 setup_invalid_callbacks(io);
135
136 if (getrlimit(RLIMIT_NOFILE, &rlim)) {
137 logerr("getrlimit");
138 exit(EX_SOFTWARE);
139 }
140
141 nfds_max = (int) rlim.rlim_cur;
142 sd.type = SCM_MAX;
143 sd.max = (int) (rlim.rlim_cur - 10) / 4;
144 common_data.scm_send_msg(0, (struct scm_data *) &sd, -1);
145
146 io_sched_add(io, new_context(io), (void *) periodics, 60, 0);
147
148 set_proctitle(ACCEPT_YES);
149
150 #ifdef WITH_LWRES
151 idc = io_dns_init(io);
152 #endif /* WITH_LWRES */
153
154 mavis_init(mcx, VERSION);
155
156 setjmp(sigbus_jmpbuf);
157
158 io_main(io);
159 }
160