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