annotate src/lib-master/master-service.c @ 22488:052396bac097

lib-master: master_service_import_environment() - use a data stack frame This way the caller doesn't have to do it.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 08 Jun 2017 00:33:32 +0300
parents e60f0e893992
children a9c51256847e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21389
diff changeset
1 /* Copyright (c) 2005-2017 Dovecot authors, see the included COPYING file */
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "lib-signals.h"
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "ioloop.h"
14069
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
6 #include "abspath.h"
9239
1cb45d4389d4 Binaries now take -o key=value parameters to override settings.
Timo Sirainen <tss@iki.fi>
parents: 9235
diff changeset
7 #include "array.h"
13877
cdf2c63ece6a Listener names are now in struct master_service_connection.name
Timo Sirainen <tss@iki.fi>
parents: 13726
diff changeset
8 #include "strescape.h"
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "env-util.h"
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "home-expand.h"
10120
b584904d3bc7 Moved process title init to lib-master. With Linux-hack enabled it now preserves command args.
Timo Sirainen <tss@iki.fi>
parents: 10119
diff changeset
11 #include "process-title.h"
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "restrict-access.h"
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "fd-close-on-exec.h"
9300
b66054f9b8fb Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 9282
diff changeset
14 #include "settings-parser.h"
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include "syslog-util.h"
14069
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
16 #include "master-instance.h"
10473
a0d99b374aa4 imap, pop3: Close auth/config connections when we stop accepting more connections.
Timo Sirainen <tss@iki.fi>
parents: 10472
diff changeset
17 #include "master-login.h"
15931
6b0c284ecede lib-master: If ssl settings are used, initialize ssl context automatically.
Timo Sirainen <tss@iki.fi>
parents: 15904
diff changeset
18 #include "master-service-ssl.h"
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 #include "master-service-private.h"
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 #include "master-service-settings.h"
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 #include <unistd.h>
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
23 #include <sys/stat.h>
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 #include <syslog.h>
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 #define DEFAULT_CONFIG_FILE_PATH SYSCONFDIR"/dovecot.conf"
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 /* getenv(MASTER_CONFIG_FILE_ENV) provides path to configuration file/socket */
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 #define MASTER_CONFIG_FILE_ENV "CONFIG_FILE"
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 /* getenv(MASTER_DOVECOT_VERSION_ENV) provides master's version number */
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 #define MASTER_DOVECOT_VERSION_ENV "DOVECOT_VERSION"
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
34 /* when we're full of connections, how often to check if login state has
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
35 changed. we normally notice it immediately because of a signal, so this is
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
36 just a fallback against race conditions. */
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
37 #define MASTER_SERVICE_STATE_CHECK_MSECS 1000
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
38
10171
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
39 /* If die callback hasn't managed to stop the service for this many seconds,
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
40 force it. */
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
41 #define MASTER_SERVICE_DIE_TIMEOUT_MSECS (30*1000)
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
42
9348
0c587f108916 lib-master has now a global master_service variable that all binaries use.
Timo Sirainen <tss@iki.fi>
parents: 9345
diff changeset
43 struct master_service *master_service;
0c587f108916 lib-master has now a global master_service variable that all binaries use.
Timo Sirainen <tss@iki.fi>
parents: 9345
diff changeset
44
10472
32949365f28d lib-master: Close listener fds when we stop accepting more connections.
Timo Sirainen <tss@iki.fi>
parents: 10440
diff changeset
45 static void master_service_io_listeners_close(struct master_service *service);
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
46 static void master_service_refresh_login_state(struct master_service *service);
18940
ec912a6039f5 lib-master: If idle-die callback returns FALSE, notify master that we don't want to die.
Timo Sirainen <tss@iki.fi>
parents: 18939
diff changeset
47 static void
ec912a6039f5 lib-master: If idle-die callback returns FALSE, notify master that we don't want to die.
Timo Sirainen <tss@iki.fi>
parents: 18939
diff changeset
48 master_status_send(struct master_service *service, bool important_update);
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
49
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 const char *master_service_getopt_string(void)
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 {
14096
dd4626a996b6 lib-master no longer uses 's' option, but it wasn't removed from getopt string.
Timo Sirainen <tss@iki.fi>
parents: 14069
diff changeset
52 return "c:i:ko:OL";
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 }
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 static void sig_die(const siginfo_t *si, void *context)
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 {
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 struct master_service *service = context;
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58
10440
e6362e056ef2 lib-master: Die on SIGINT only if we're running standalone or not handling clients.
Timo Sirainen <tss@iki.fi>
parents: 10276
diff changeset
59 /* SIGINT comes either from master process or from keyboard. we don't
e6362e056ef2 lib-master: Die on SIGINT only if we're running standalone or not handling clients.
Timo Sirainen <tss@iki.fi>
parents: 10276
diff changeset
60 want to log it in either case.*/
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 if (si->si_signo != SIGINT) {
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 i_warning("Killed with signal %d (by pid=%s uid=%s code=%s)",
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 si->si_signo, dec2str(si->si_pid),
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 dec2str(si->si_uid),
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 lib_signal_code_to_str(si->si_signo, si->si_code));
11626
c9e8144974f1 lib-master: MASTER_SERVICE_FLAG_NO_IDLE_DIE wasn't actually working.
Timo Sirainen <tss@iki.fi>
parents: 11596
diff changeset
66 } else if ((service->flags & MASTER_SERVICE_FLAG_NO_IDLE_DIE) != 0) {
c9e8144974f1 lib-master: MASTER_SERVICE_FLAG_NO_IDLE_DIE wasn't actually working.
Timo Sirainen <tss@iki.fi>
parents: 11596
diff changeset
67 /* never die when idling */
c9e8144974f1 lib-master: MASTER_SERVICE_FLAG_NO_IDLE_DIE wasn't actually working.
Timo Sirainen <tss@iki.fi>
parents: 11596
diff changeset
68 return;
c9e8144974f1 lib-master: MASTER_SERVICE_FLAG_NO_IDLE_DIE wasn't actually working.
Timo Sirainen <tss@iki.fi>
parents: 11596
diff changeset
69 } else if ((service->flags & MASTER_SERVICE_FLAG_STANDALONE) == 0) {
10440
e6362e056ef2 lib-master: Die on SIGINT only if we're running standalone or not handling clients.
Timo Sirainen <tss@iki.fi>
parents: 10276
diff changeset
70 /* SIGINT came from master. die only if we're not handling
e6362e056ef2 lib-master: Die on SIGINT only if we're running standalone or not handling clients.
Timo Sirainen <tss@iki.fi>
parents: 10276
diff changeset
71 any clients currently. */
e6362e056ef2 lib-master: Die on SIGINT only if we're running standalone or not handling clients.
Timo Sirainen <tss@iki.fi>
parents: 10276
diff changeset
72 if (service->master_status.available_count !=
e6362e056ef2 lib-master: Die on SIGINT only if we're running standalone or not handling clients.
Timo Sirainen <tss@iki.fi>
parents: 10276
diff changeset
73 service->total_available_count)
e6362e056ef2 lib-master: Die on SIGINT only if we're running standalone or not handling clients.
Timo Sirainen <tss@iki.fi>
parents: 10276
diff changeset
74 return;
13082
c55ea4fc3344 lib-master: Added master_service_set_idle_die_callback()
Timo Sirainen <tss@iki.fi>
parents: 13081
diff changeset
75
c55ea4fc3344 lib-master: Added master_service_set_idle_die_callback()
Timo Sirainen <tss@iki.fi>
parents: 13081
diff changeset
76 if (service->idle_die_callback != NULL &&
18940
ec912a6039f5 lib-master: If idle-die callback returns FALSE, notify master that we don't want to die.
Timo Sirainen <tss@iki.fi>
parents: 18939
diff changeset
77 !service->idle_die_callback()) {
ec912a6039f5 lib-master: If idle-die callback returns FALSE, notify master that we don't want to die.
Timo Sirainen <tss@iki.fi>
parents: 18939
diff changeset
78 /* we don't want to die - send a notification to master
ec912a6039f5 lib-master: If idle-die callback returns FALSE, notify master that we don't want to die.
Timo Sirainen <tss@iki.fi>
parents: 18939
diff changeset
79 so it doesn't think we're ignoring it completely. */
ec912a6039f5 lib-master: If idle-die callback returns FALSE, notify master that we don't want to die.
Timo Sirainen <tss@iki.fi>
parents: 18939
diff changeset
80 master_status_send(service, FALSE);
13082
c55ea4fc3344 lib-master: Added master_service_set_idle_die_callback()
Timo Sirainen <tss@iki.fi>
parents: 13081
diff changeset
81 return;
18940
ec912a6039f5 lib-master: If idle-die callback returns FALSE, notify master that we don't want to die.
Timo Sirainen <tss@iki.fi>
parents: 18939
diff changeset
82 }
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 }
10440
e6362e056ef2 lib-master: Die on SIGINT only if we're running standalone or not handling clients.
Timo Sirainen <tss@iki.fi>
parents: 10276
diff changeset
84
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents: 11735
diff changeset
85 service->killed = TRUE;
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 io_loop_stop(service->ioloop);
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 }
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88
22027
38826e486570 lib-master: When running under master, close listeners immediately on SIGQUIT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22026
diff changeset
89 static void sig_close_listeners(const siginfo_t *si ATTR_UNUSED, void *context)
38826e486570 lib-master: When running under master, close listeners immediately on SIGQUIT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22026
diff changeset
90 {
38826e486570 lib-master: When running under master, close listeners immediately on SIGQUIT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22026
diff changeset
91 struct master_service *service = context;
38826e486570 lib-master: When running under master, close listeners immediately on SIGQUIT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22026
diff changeset
92
38826e486570 lib-master: When running under master, close listeners immediately on SIGQUIT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22026
diff changeset
93 /* We're in a signal handler: Close listeners immediately so master
38826e486570 lib-master: When running under master, close listeners immediately on SIGQUIT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22026
diff changeset
94 can successfully restart. We can safely close only those listeners
38826e486570 lib-master: When running under master, close listeners immediately on SIGQUIT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22026
diff changeset
95 that don't have an io, but this shouldn't be a big problem. If there
38826e486570 lib-master: When running under master, close listeners immediately on SIGQUIT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22026
diff changeset
96 is an active io, the service is unlikely to be unresposive for
38826e486570 lib-master: When running under master, close listeners immediately on SIGQUIT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22026
diff changeset
97 longer periods of time, so the listener gets closed soon enough via
22075
baa85b2663b5 lib-master: Replace listeners with /dev/null in SIGQUIT instead of closing
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22027
diff changeset
98 master_status_error().
baa85b2663b5 lib-master: Replace listeners with /dev/null in SIGQUIT instead of closing
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22027
diff changeset
99
baa85b2663b5 lib-master: Replace listeners with /dev/null in SIGQUIT instead of closing
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22027
diff changeset
100 For extra safety we don't actually close() the fd, but instead
baa85b2663b5 lib-master: Replace listeners with /dev/null in SIGQUIT instead of closing
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22027
diff changeset
101 replace it with /dev/null. This way it won't be replaced with some
baa85b2663b5 lib-master: Replace listeners with /dev/null in SIGQUIT instead of closing
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22027
diff changeset
102 other new fd and attempted to be used in unexpected ways. */
22027
38826e486570 lib-master: When running under master, close listeners immediately on SIGQUIT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22026
diff changeset
103 for (unsigned int i = 0; i < service->socket_count; i++) {
38826e486570 lib-master: When running under master, close listeners immediately on SIGQUIT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22026
diff changeset
104 if (service->listeners[i].fd != -1 &&
38826e486570 lib-master: When running under master, close listeners immediately on SIGQUIT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22026
diff changeset
105 service->listeners[i].io == NULL) {
22075
baa85b2663b5 lib-master: Replace listeners with /dev/null in SIGQUIT instead of closing
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22027
diff changeset
106 if (dup2(dev_null_fd, service->listeners[i].fd) < 0)
baa85b2663b5 lib-master: Replace listeners with /dev/null in SIGQUIT instead of closing
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22027
diff changeset
107 lib_signals_syscall_error("signal: dup2(/dev/null, listener) failed: ");
baa85b2663b5 lib-master: Replace listeners with /dev/null in SIGQUIT instead of closing
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22027
diff changeset
108 service->listeners[i].closed = TRUE;
22027
38826e486570 lib-master: When running under master, close listeners immediately on SIGQUIT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22026
diff changeset
109 }
38826e486570 lib-master: When running under master, close listeners immediately on SIGQUIT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22026
diff changeset
110 }
38826e486570 lib-master: When running under master, close listeners immediately on SIGQUIT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22026
diff changeset
111 }
38826e486570 lib-master: When running under master, close listeners immediately on SIGQUIT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22026
diff changeset
112
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
113 static void
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
114 sig_state_changed(const siginfo_t *si ATTR_UNUSED, void *context)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
115 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
116 struct master_service *service = context;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
117
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
118 master_service_refresh_login_state(service);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
119 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
120
11458
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
121 static void master_service_verify_version_string(struct master_service *service)
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 {
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 if (service->version_string != NULL &&
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 strcmp(service->version_string, PACKAGE_VERSION) != 0) {
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 i_fatal("Dovecot version mismatch: "
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 "Master is v%s, %s is v"PACKAGE_VERSION" "
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 "(if you don't care, set version_ignore=yes)",
11118
a0d0ed6a2b63 lib-master: Fixed version mismatch error message.
Timo Sirainen <tss@iki.fi>
parents: 11102
diff changeset
128 service->version_string, service->name);
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 }
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 }
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131
18951
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
132 static void master_service_init_socket_listeners(struct master_service *service)
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
133 {
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
134 unsigned int i;
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
135 const char *value;
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
136 bool have_ssl_sockets = FALSE;
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
137
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
138 if (service->socket_count == 0)
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
139 return;
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
140
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
141 service->listeners =
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
142 i_new(struct master_service_listener, service->socket_count);
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
143
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
144 for (i = 0; i < service->socket_count; i++) {
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
145 struct master_service_listener *l = &service->listeners[i];
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
146
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
147 l->service = service;
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
148 l->fd = MASTER_LISTEN_FD_FIRST + i;
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
149
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
150 value = getenv(t_strdup_printf("SOCKET%u_SETTINGS", i));
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
151 if (value != NULL) {
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
152 const char *const *settings =
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
153 t_strsplit_tabescaped(value);
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
154
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
155 if (*settings != NULL) {
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
156 l->name = i_strdup_empty(*settings);
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
157 settings++;
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
158 }
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
159 while (*settings != NULL) {
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
160 if (strcmp(*settings, "ssl") == 0) {
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
161 l->ssl = TRUE;
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
162 have_ssl_sockets = TRUE;
18952
4d7a83ddb644 lib-master: Added support for HAProxy protocol.
Timo Sirainen <tss@iki.fi>
parents: 18951
diff changeset
163 } else if (strcmp(*settings, "haproxy") == 0) {
4d7a83ddb644 lib-master: Added support for HAProxy protocol.
Timo Sirainen <tss@iki.fi>
parents: 18951
diff changeset
164 l->haproxy = TRUE;
18951
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
165 }
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
166 settings++;
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
167 }
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
168 }
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
169 }
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
170 service->want_ssl_settings = have_ssl_sockets ||
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
171 (service->flags & MASTER_SERVICE_FLAG_USE_SSL_SETTINGS) != 0;
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
172 }
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
173
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 struct master_service *
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 master_service_init(const char *name, enum master_service_flags flags,
10120
b584904d3bc7 Moved process title init to lib-master. With Linux-hack enabled it now preserves command args.
Timo Sirainen <tss@iki.fi>
parents: 10119
diff changeset
176 int *argc, char **argv[], const char *getopt_str)
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 {
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 struct master_service *service;
18951
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
179 unsigned int count;
13726
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
180 const char *value;
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 i_assert(name != NULL);
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183
9214
7def7fa61d68 master: Fixes to handling logging.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
184 #ifdef DEBUG
9396
674024d7bcb7 DEBUG: lib-master no longer verifies fd leaks for programs running standalone.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
185 if (getenv("GDB") == NULL &&
674024d7bcb7 DEBUG: lib-master no longer verifies fd leaks for programs running standalone.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
186 (flags & MASTER_SERVICE_FLAG_STANDALONE) == 0) {
13726
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
187 value = getenv("SOCKET_COUNT");
19036
f78e38c7cba2 Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents: 19001
diff changeset
188 if (value == NULL || str_to_uint(value, &count) < 0)
f78e38c7cba2 Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents: 19001
diff changeset
189 count = 0;
9214
7def7fa61d68 master: Fixes to handling logging.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
190 fd_debug_verify_leaks(MASTER_LISTEN_FD_FIRST + count, 1024);
7def7fa61d68 master: Fixes to handling logging.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
191 }
7def7fa61d68 master: Fixes to handling logging.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
192 #endif
10951
edd11ffa467c lib-master: If binary isn't standalone, enable core dumping at startup.
Timo Sirainen <tss@iki.fi>
parents: 10944
diff changeset
193 if ((flags & MASTER_SERVICE_FLAG_STANDALONE) == 0) {
edd11ffa467c lib-master: If binary isn't standalone, enable core dumping at startup.
Timo Sirainen <tss@iki.fi>
parents: 10944
diff changeset
194 /* make sure we can dump core, at least until
edd11ffa467c lib-master: If binary isn't standalone, enable core dumping at startup.
Timo Sirainen <tss@iki.fi>
parents: 10944
diff changeset
195 privileges are dropped. (i'm not really sure why this
edd11ffa467c lib-master: If binary isn't standalone, enable core dumping at startup.
Timo Sirainen <tss@iki.fi>
parents: 10944
diff changeset
196 is needed, because doing the same just before exec
edd11ffa467c lib-master: If binary isn't standalone, enable core dumping at startup.
Timo Sirainen <tss@iki.fi>
parents: 10944
diff changeset
197 doesn't help, and exec shouldn't affect this with
edd11ffa467c lib-master: If binary isn't standalone, enable core dumping at startup.
Timo Sirainen <tss@iki.fi>
parents: 10944
diff changeset
198 non-setuid/gid binaries..) */
edd11ffa467c lib-master: If binary isn't standalone, enable core dumping at startup.
Timo Sirainen <tss@iki.fi>
parents: 10944
diff changeset
199 restrict_access_allow_coredumps(TRUE);
edd11ffa467c lib-master: If binary isn't standalone, enable core dumping at startup.
Timo Sirainen <tss@iki.fi>
parents: 10944
diff changeset
200 }
9214
7def7fa61d68 master: Fixes to handling logging.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
201
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 /* NOTE: we start rooted, so keep the code minimal until
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 restrict_access_by_env() is called */
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 lib_init();
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 /* Set a logging prefix temporarily. This will be ignored once the log
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 is properly initialized */
15201
d00cf8e0dae7 i_set_failure_prefix() now takes printf-like parameters.
Timo Sirainen <tss@iki.fi>
parents: 15183
diff changeset
207 i_set_failure_prefix("%s(init): ", name);
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208
10796
aee98ecae688 lib-master: Ignore SIGALRM and SIGPIPE as early as possible.
Timo Sirainen <tss@iki.fi>
parents: 10794
diff changeset
209 /* ignore these signals as early as possible */
16508
754d244b8249 Call master_service_init_finish() only after all of the initialization is done.
Timo Sirainen <tss@iki.fi>
parents: 16319
diff changeset
210 lib_signals_init();
10796
aee98ecae688 lib-master: Ignore SIGALRM and SIGPIPE as early as possible.
Timo Sirainen <tss@iki.fi>
parents: 10794
diff changeset
211 lib_signals_ignore(SIGPIPE, TRUE);
aee98ecae688 lib-master: Ignore SIGALRM and SIGPIPE as early as possible.
Timo Sirainen <tss@iki.fi>
parents: 10794
diff changeset
212 lib_signals_ignore(SIGALRM, FALSE);
aee98ecae688 lib-master: Ignore SIGALRM and SIGPIPE as early as possible.
Timo Sirainen <tss@iki.fi>
parents: 10794
diff changeset
213
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
214 if (getenv(MASTER_UID_ENV) == NULL)
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 flags |= MASTER_SERVICE_FLAG_STANDALONE;
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216
10188
affb52c62add Fixed Linux proctitle hack and enabled it by default now.
Timo Sirainen <tss@iki.fi>
parents: 10171
diff changeset
217 process_title_init(argv);
10120
b584904d3bc7 Moved process title init to lib-master. With Linux-hack enabled it now preserves command args.
Timo Sirainen <tss@iki.fi>
parents: 10119
diff changeset
218
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 service = i_new(struct master_service, 1);
10120
b584904d3bc7 Moved process title init to lib-master. With Linux-hack enabled it now preserves command args.
Timo Sirainen <tss@iki.fi>
parents: 10119
diff changeset
220 service->argc = *argc;
b584904d3bc7 Moved process title init to lib-master. With Linux-hack enabled it now preserves command args.
Timo Sirainen <tss@iki.fi>
parents: 10119
diff changeset
221 service->argv = *argv;
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 service->name = i_strdup(name);
10147
ef1ca7e1a9f9 lib-master: Fixed getopt_string containing "+" GNU extension.
Timo Sirainen <tss@iki.fi>
parents: 10120
diff changeset
223 /* keep getopt_str first in case it contains "+" */
14629
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14370
diff changeset
224 service->getopt_str = *getopt_str == '\0' ?
10147
ef1ca7e1a9f9 lib-master: Fixed getopt_string containing "+" GNU extension.
Timo Sirainen <tss@iki.fi>
parents: 10120
diff changeset
225 i_strdup(master_service_getopt_string()) :
ef1ca7e1a9f9 lib-master: Fixed getopt_string containing "+" GNU extension.
Timo Sirainen <tss@iki.fi>
parents: 10120
diff changeset
226 i_strconcat(getopt_str, master_service_getopt_string(), NULL);
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 service->flags = flags;
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 service->ioloop = io_loop_create();
15904
d3cf06639864 Replaced all -1U and (unsigned int)-1 with UINT_MAX.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
229 service->service_count_left = UINT_MAX;
9282
6bb773332683 lib-master: Added support for keeping config connection open and reusing it for later requests.
Timo Sirainen <tss@iki.fi>
parents: 9269
diff changeset
230 service->config_fd = -1;
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
231
14069
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
232 service->config_path = i_strdup(getenv(MASTER_CONFIG_FILE_ENV));
17794
ccc5701dae72 lib-master: Earlier config file path fix broke reusing existing config socket lookups.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
233 if (service->config_path == NULL)
14069
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
234 service->config_path = i_strdup(DEFAULT_CONFIG_FILE_PATH);
17794
ccc5701dae72 lib-master: Earlier config file path fix broke reusing existing config socket lookups.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
235 else
ccc5701dae72 lib-master: Earlier config file path fix broke reusing existing config socket lookups.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
236 service->config_path_from_master = TRUE;
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
238 if ((flags & MASTER_SERVICE_FLAG_STANDALONE) == 0) {
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 service->version_string = getenv(MASTER_DOVECOT_VERSION_ENV);
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
240 service->socket_count = 1;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
241 } else {
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 service->version_string = PACKAGE_VERSION;
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
243 }
18951
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
244
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
245 /* listener configuration */
13726
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
246 value = getenv("SOCKET_COUNT");
19036
f78e38c7cba2 Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents: 19001
diff changeset
247 if (value != NULL && str_to_uint(value, &service->socket_count) < 0)
f78e38c7cba2 Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents: 19001
diff changeset
248 i_fatal("Invalid SOCKET_COUNT environment");
18951
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
249 T_BEGIN {
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
250 master_service_init_socket_listeners(service);
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
251 } T_END;
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 /* set up some kind of logging until we know exactly how and where
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 we want to log */
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
255 if (getenv("LOG_SERVICE") != NULL)
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 i_set_failure_internal();
15201
d00cf8e0dae7 i_set_failure_prefix() now takes printf-like parameters.
Timo Sirainen <tss@iki.fi>
parents: 15183
diff changeset
257 if (getenv("USER") != NULL)
d00cf8e0dae7 i_set_failure_prefix() now takes printf-like parameters.
Timo Sirainen <tss@iki.fi>
parents: 15183
diff changeset
258 i_set_failure_prefix("%s(%s): ", name, getenv("USER"));
d00cf8e0dae7 i_set_failure_prefix() now takes printf-like parameters.
Timo Sirainen <tss@iki.fi>
parents: 15183
diff changeset
259 else
d00cf8e0dae7 i_set_failure_prefix() now takes printf-like parameters.
Timo Sirainen <tss@iki.fi>
parents: 15183
diff changeset
260 i_set_failure_prefix("%s: ", name);
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261
13726
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
262 if ((flags & MASTER_SERVICE_FLAG_STANDALONE) == 0) {
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
263 /* initialize master_status structure */
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
264 value = getenv(MASTER_UID_ENV);
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
265 if (value == NULL ||
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
266 str_to_uint(value, &service->master_status.uid) < 0)
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
267 i_fatal(MASTER_UID_ENV" missing");
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
268 service->master_status.pid = getpid();
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
269
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
270 /* set the default limit */
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
271 value = getenv(MASTER_CLIENT_LIMIT_ENV);
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
272 if (value == NULL || str_to_uint(value, &count) < 0 ||
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
273 count == 0)
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
274 i_fatal(MASTER_CLIENT_LIMIT_ENV" missing");
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
275 master_service_set_client_limit(service, count);
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
276
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
277 /* seve the process limit */
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
278 value = getenv(MASTER_PROCESS_LIMIT_ENV);
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
279 if (value != NULL && str_to_uint(value, &count) == 0 &&
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
280 count > 0)
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
281 service->process_limit = count;
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
282
16178
c32bfc54bc50 lib-master: Added master_service_get_process_min_avail()
Timo Sirainen <tss@iki.fi>
parents: 16140
diff changeset
283 value = getenv(MASTER_PROCESS_MIN_AVAIL_ENV);
c32bfc54bc50 lib-master: Added master_service_get_process_min_avail()
Timo Sirainen <tss@iki.fi>
parents: 16140
diff changeset
284 if (value != NULL && str_to_uint(value, &count) == 0 &&
c32bfc54bc50 lib-master: Added master_service_get_process_min_avail()
Timo Sirainen <tss@iki.fi>
parents: 16140
diff changeset
285 count > 0)
c32bfc54bc50 lib-master: Added master_service_get_process_min_avail()
Timo Sirainen <tss@iki.fi>
parents: 16140
diff changeset
286 service->process_min_avail = count;
c32bfc54bc50 lib-master: Added master_service_get_process_min_avail()
Timo Sirainen <tss@iki.fi>
parents: 16140
diff changeset
287
13726
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
288 /* set the default service count */
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
289 value = getenv(MASTER_SERVICE_COUNT_ENV);
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
290 if (value != NULL && str_to_uint(value, &count) == 0 &&
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
291 count > 0)
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
292 master_service_set_service_count(service, count);
13969
3963862a4086 lib-master: Send service's idle_kill value to process in environment.
Timo Sirainen <tss@iki.fi>
parents: 13877
diff changeset
293
3963862a4086 lib-master: Send service's idle_kill value to process in environment.
Timo Sirainen <tss@iki.fi>
parents: 13877
diff changeset
294 /* set the idle kill timeout */
3963862a4086 lib-master: Send service's idle_kill value to process in environment.
Timo Sirainen <tss@iki.fi>
parents: 13877
diff changeset
295 value = getenv(MASTER_SERVICE_IDLE_KILL_ENV);
3963862a4086 lib-master: Send service's idle_kill value to process in environment.
Timo Sirainen <tss@iki.fi>
parents: 13877
diff changeset
296 if (value != NULL && str_to_uint(value, &count) == 0)
3963862a4086 lib-master: Send service's idle_kill value to process in environment.
Timo Sirainen <tss@iki.fi>
parents: 13877
diff changeset
297 service->idle_kill_secs = count;
13726
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
298 } else {
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
299 master_service_set_client_limit(service, 1);
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
300 master_service_set_service_count(service, 1);
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
301 }
16627
eb63eca74471 lib-master: If MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN is set, open the config socket before dropping privileges.
Timo Sirainen <tss@iki.fi>
parents: 16508
diff changeset
302 if ((flags & MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN) != 0) {
eb63eca74471 lib-master: If MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN is set, open the config socket before dropping privileges.
Timo Sirainen <tss@iki.fi>
parents: 16508
diff changeset
303 /* since we're going to keep the config socket open anyway,
eb63eca74471 lib-master: If MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN is set, open the config socket before dropping privileges.
Timo Sirainen <tss@iki.fi>
parents: 16508
diff changeset
304 open it now so we can read settings even after privileges
eb63eca74471 lib-master: If MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN is set, open the config socket before dropping privileges.
Timo Sirainen <tss@iki.fi>
parents: 16508
diff changeset
305 are dropped. */
eb63eca74471 lib-master: If MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN is set, open the config socket before dropping privileges.
Timo Sirainen <tss@iki.fi>
parents: 16508
diff changeset
306 master_service_config_socket_try_open(service);
eb63eca74471 lib-master: If MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN is set, open the config socket before dropping privileges.
Timo Sirainen <tss@iki.fi>
parents: 16508
diff changeset
307 }
13726
c6f5203bf59f lib-master: Set service/client limits already in master_service_init()
Timo Sirainen <tss@iki.fi>
parents: 13293
diff changeset
308
11458
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
309 master_service_verify_version_string(service);
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 return service;
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 }
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312
10119
1e63221f5c83 Moved most of getopt() handling to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
313 int master_getopt(struct master_service *service)
1e63221f5c83 Moved most of getopt() handling to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
314 {
1e63221f5c83 Moved most of getopt() handling to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
315 int c;
1e63221f5c83 Moved most of getopt() handling to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
316
18925
ff17864ba6e0 lib-master: Make sure we can't accidentally add duplicate getopt args.
Timo Sirainen <tss@iki.fi>
parents: 18671
diff changeset
317 i_assert(master_getopt_str_is_valid(service->getopt_str));
ff17864ba6e0 lib-master: Make sure we can't accidentally add duplicate getopt args.
Timo Sirainen <tss@iki.fi>
parents: 18671
diff changeset
318
10119
1e63221f5c83 Moved most of getopt() handling to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
319 while ((c = getopt(service->argc, service->argv,
1e63221f5c83 Moved most of getopt() handling to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
320 service->getopt_str)) > 0) {
1e63221f5c83 Moved most of getopt() handling to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
321 if (!master_service_parse_option(service, c, optarg))
1e63221f5c83 Moved most of getopt() handling to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
322 break;
1e63221f5c83 Moved most of getopt() handling to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
323 }
1e63221f5c83 Moved most of getopt() handling to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
324 return c;
1e63221f5c83 Moved most of getopt() handling to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
325 }
1e63221f5c83 Moved most of getopt() handling to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
326
18925
ff17864ba6e0 lib-master: Make sure we can't accidentally add duplicate getopt args.
Timo Sirainen <tss@iki.fi>
parents: 18671
diff changeset
327 bool master_getopt_str_is_valid(const char *str)
ff17864ba6e0 lib-master: Make sure we can't accidentally add duplicate getopt args.
Timo Sirainen <tss@iki.fi>
parents: 18671
diff changeset
328 {
ff17864ba6e0 lib-master: Make sure we can't accidentally add duplicate getopt args.
Timo Sirainen <tss@iki.fi>
parents: 18671
diff changeset
329 unsigned int i, j;
ff17864ba6e0 lib-master: Make sure we can't accidentally add duplicate getopt args.
Timo Sirainen <tss@iki.fi>
parents: 18671
diff changeset
330
ff17864ba6e0 lib-master: Make sure we can't accidentally add duplicate getopt args.
Timo Sirainen <tss@iki.fi>
parents: 18671
diff changeset
331 /* make sure there are no duplicates. there are few enough characters
ff17864ba6e0 lib-master: Make sure we can't accidentally add duplicate getopt args.
Timo Sirainen <tss@iki.fi>
parents: 18671
diff changeset
332 that this should be fast enough. */
ff17864ba6e0 lib-master: Make sure we can't accidentally add duplicate getopt args.
Timo Sirainen <tss@iki.fi>
parents: 18671
diff changeset
333 for (i = 0; str[i] != '\0'; i++) {
ff17864ba6e0 lib-master: Make sure we can't accidentally add duplicate getopt args.
Timo Sirainen <tss@iki.fi>
parents: 18671
diff changeset
334 if (str[i] == ':' || str[i] == '+' || str[i] == '-')
ff17864ba6e0 lib-master: Make sure we can't accidentally add duplicate getopt args.
Timo Sirainen <tss@iki.fi>
parents: 18671
diff changeset
335 continue;
ff17864ba6e0 lib-master: Make sure we can't accidentally add duplicate getopt args.
Timo Sirainen <tss@iki.fi>
parents: 18671
diff changeset
336 for (j = i+1; str[j] != '\0'; j++) {
ff17864ba6e0 lib-master: Make sure we can't accidentally add duplicate getopt args.
Timo Sirainen <tss@iki.fi>
parents: 18671
diff changeset
337 if (str[i] == str[j])
ff17864ba6e0 lib-master: Make sure we can't accidentally add duplicate getopt args.
Timo Sirainen <tss@iki.fi>
parents: 18671
diff changeset
338 return FALSE;
ff17864ba6e0 lib-master: Make sure we can't accidentally add duplicate getopt args.
Timo Sirainen <tss@iki.fi>
parents: 18671
diff changeset
339 }
ff17864ba6e0 lib-master: Make sure we can't accidentally add duplicate getopt args.
Timo Sirainen <tss@iki.fi>
parents: 18671
diff changeset
340 }
ff17864ba6e0 lib-master: Make sure we can't accidentally add duplicate getopt args.
Timo Sirainen <tss@iki.fi>
parents: 18671
diff changeset
341 return TRUE;
ff17864ba6e0 lib-master: Make sure we can't accidentally add duplicate getopt args.
Timo Sirainen <tss@iki.fi>
parents: 18671
diff changeset
342 }
ff17864ba6e0 lib-master: Make sure we can't accidentally add duplicate getopt args.
Timo Sirainen <tss@iki.fi>
parents: 18671
diff changeset
343
9912
37bc3a3d4464 Removed mail_log_max_lines_per_sec setting and related code.
Timo Sirainen <tss@iki.fi>
parents: 9881
diff changeset
344 void master_service_init_log(struct master_service *service,
37bc3a3d4464 Removed mail_log_max_lines_per_sec setting and related code.
Timo Sirainen <tss@iki.fi>
parents: 9881
diff changeset
345 const char *prefix)
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 {
18320
13021170e269 lib-master: Get log timestamp prefix from LOG_STDERR_TIMESTAMP environment.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
347 const char *path, *timestamp;
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348
9345
0dbc2dc0877c master process shouldn't log to stderr. Changed the lib-master flag to _DONT_LOG_TO_STDERR.
Timo Sirainen <tss@iki.fi>
parents: 9337
diff changeset
349 if ((service->flags & MASTER_SERVICE_FLAG_STANDALONE) != 0 &&
0dbc2dc0877c master process shouldn't log to stderr. Changed the lib-master flag to _DONT_LOG_TO_STDERR.
Timo Sirainen <tss@iki.fi>
parents: 9337
diff changeset
350 (service->flags & MASTER_SERVICE_FLAG_DONT_LOG_TO_STDERR) == 0) {
18320
13021170e269 lib-master: Get log timestamp prefix from LOG_STDERR_TIMESTAMP environment.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
351 timestamp = getenv("LOG_STDERR_TIMESTAMP");
13021170e269 lib-master: Get log timestamp prefix from LOG_STDERR_TIMESTAMP environment.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
352 if (timestamp != NULL)
13021170e269 lib-master: Get log timestamp prefix from LOG_STDERR_TIMESTAMP environment.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
353 i_set_failure_timestamp_format(timestamp);
9066
4f64d429985a doveadm: Log to stderr.
Timo Sirainen <tss@iki.fi>
parents: 9059
diff changeset
354 i_set_failure_file("/dev/stderr", "");
4f64d429985a doveadm: Log to stderr.
Timo Sirainen <tss@iki.fi>
parents: 9059
diff changeset
355 return;
4f64d429985a doveadm: Log to stderr.
Timo Sirainen <tss@iki.fi>
parents: 9059
diff changeset
356 }
4f64d429985a doveadm: Log to stderr.
Timo Sirainen <tss@iki.fi>
parents: 9059
diff changeset
357
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
358 if (getenv("LOG_SERVICE") != NULL && !service->log_directly) {
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
359 /* logging via log service */
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 i_set_failure_internal();
15201
d00cf8e0dae7 i_set_failure_prefix() now takes printf-like parameters.
Timo Sirainen <tss@iki.fi>
parents: 15183
diff changeset
361 i_set_failure_prefix("%s", prefix);
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
362 return;
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 }
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
364
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
365 if (service->set == NULL) {
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
366 i_set_failure_file("/dev/stderr", prefix);
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
367 return;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
368 }
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
369
11557
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
370 if (strcmp(service->set->log_path, "syslog") != 0) {
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
371 /* error logging goes to file or stderr */
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
372 path = home_expand(service->set->log_path);
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
373 i_set_failure_file(path, prefix);
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
374 }
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
375
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
376 if (strcmp(service->set->log_path, "syslog") == 0 ||
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
377 strcmp(service->set->info_log_path, "syslog") == 0 ||
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
378 strcmp(service->set->debug_log_path, "syslog") == 0) {
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
379 /* something gets logged to syslog */
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380 int facility;
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382 if (!syslog_facility_find(service->set->syslog_facility,
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 &facility))
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384 facility = LOG_MAIL;
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 i_set_failure_syslog("dovecot", LOG_NDELAY, facility);
15201
d00cf8e0dae7 i_set_failure_prefix() now takes printf-like parameters.
Timo Sirainen <tss@iki.fi>
parents: 15183
diff changeset
386 i_set_failure_prefix("%s", prefix);
11557
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
387
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
388 if (strcmp(service->set->log_path, "syslog") != 0) {
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
389 /* set error handlers back to file */
14629
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14370
diff changeset
390 i_set_fatal_handler(default_fatal_handler);
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14370
diff changeset
391 i_set_error_handler(default_error_handler);
11557
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
392 }
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393 }
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394
11557
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
395 if (*service->set->info_log_path != '\0' &&
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
396 strcmp(service->set->info_log_path, "syslog") != 0) {
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
397 path = home_expand(service->set->info_log_path);
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
398 if (*path != '\0')
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
399 i_set_info_file(path);
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
400 }
9959
80472a77d765 Added debug_log_path setting and i_debug() call.
Timo Sirainen <tss@iki.fi>
parents: 9923
diff changeset
401
11557
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
402 if (*service->set->debug_log_path != '\0' &&
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
403 strcmp(service->set->debug_log_path, "syslog") != 0) {
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
404 path = home_expand(service->set->debug_log_path);
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
405 if (*path != '\0')
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
406 i_set_debug_file(path);
3edf323da761 Log paths now support "syslog" string.
Timo Sirainen <tss@iki.fi>
parents: 11516
diff changeset
407 }
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408 i_set_failure_timestamp_format(service->set->log_timestamp);
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
409 }
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410
9878
c58c40a83bbd lib-master: Added master_service_set_die_with_master.
Timo Sirainen <tss@iki.fi>
parents: 9868
diff changeset
411 void master_service_set_die_with_master(struct master_service *service,
c58c40a83bbd lib-master: Added master_service_set_die_with_master.
Timo Sirainen <tss@iki.fi>
parents: 9868
diff changeset
412 bool set)
c58c40a83bbd lib-master: Added master_service_set_die_with_master.
Timo Sirainen <tss@iki.fi>
parents: 9868
diff changeset
413 {
c58c40a83bbd lib-master: Added master_service_set_die_with_master.
Timo Sirainen <tss@iki.fi>
parents: 9868
diff changeset
414 service->die_with_master = set;
c58c40a83bbd lib-master: Added master_service_set_die_with_master.
Timo Sirainen <tss@iki.fi>
parents: 9868
diff changeset
415 }
c58c40a83bbd lib-master: Added master_service_set_die_with_master.
Timo Sirainen <tss@iki.fi>
parents: 9868
diff changeset
416
10171
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
417 void master_service_set_die_callback(struct master_service *service,
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
418 void (*callback)(void))
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
419 {
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
420 service->die_callback = callback;
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
421 }
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
422
13082
c55ea4fc3344 lib-master: Added master_service_set_idle_die_callback()
Timo Sirainen <tss@iki.fi>
parents: 13081
diff changeset
423 void master_service_set_idle_die_callback(struct master_service *service,
c55ea4fc3344 lib-master: Added master_service_set_idle_die_callback()
Timo Sirainen <tss@iki.fi>
parents: 13081
diff changeset
424 bool (*callback)(void))
c55ea4fc3344 lib-master: Added master_service_set_idle_die_callback()
Timo Sirainen <tss@iki.fi>
parents: 13081
diff changeset
425 {
c55ea4fc3344 lib-master: Added master_service_set_idle_die_callback()
Timo Sirainen <tss@iki.fi>
parents: 13081
diff changeset
426 service->idle_die_callback = callback;
c55ea4fc3344 lib-master: Added master_service_set_idle_die_callback()
Timo Sirainen <tss@iki.fi>
parents: 13081
diff changeset
427 }
c55ea4fc3344 lib-master: Added master_service_set_idle_die_callback()
Timo Sirainen <tss@iki.fi>
parents: 13081
diff changeset
428
14069
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
429 static bool get_instance_config(const char *name, const char **config_path_r)
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
430 {
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
431 struct master_instance_list *list;
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
432 const struct master_instance *inst;
14950
543852ebb327 Made PKG_STATEDIR configurable with state_dir setting.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
433 const char *instance_path, *path;
14069
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
434
15183
04cd35e86025 lib-master: Fixed crashing with -i <instance> parameter handling.
Timo Sirainen <tss@iki.fi>
parents: 15088
diff changeset
435 /* note that we don't have any settings yet. we're just finding out
04cd35e86025 lib-master: Fixed crashing with -i <instance> parameter handling.
Timo Sirainen <tss@iki.fi>
parents: 15088
diff changeset
436 which dovecot.conf we even want to read! so we must use the
04cd35e86025 lib-master: Fixed crashing with -i <instance> parameter handling.
Timo Sirainen <tss@iki.fi>
parents: 15088
diff changeset
437 hardcoded state_dir path. */
04cd35e86025 lib-master: Fixed crashing with -i <instance> parameter handling.
Timo Sirainen <tss@iki.fi>
parents: 15088
diff changeset
438 instance_path = t_strconcat(PKG_STATEDIR"/"MASTER_INSTANCE_FNAME, NULL);
14950
543852ebb327 Made PKG_STATEDIR configurable with state_dir setting.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
439 list = master_instance_list_init(instance_path);
14069
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
440 inst = master_instance_list_find_by_name(list, name);
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
441 if (inst != NULL) {
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
442 path = t_strdup_printf("%s/dovecot.conf", inst->base_dir);
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
443 if (t_readlink(path, config_path_r) < 0)
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
444 i_fatal("readlink(%s) failed: %m", path);
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
445 }
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
446 master_instance_list_deinit(&list);
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
447 return inst != NULL;
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
448 }
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
449
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450 bool master_service_parse_option(struct master_service *service,
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
451 int opt, const char *arg)
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
452 {
14069
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
453 const char *path;
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
454
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
455 switch (opt) {
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
456 case 'c':
20688
f5aefbab9677 lib-master: don't leak config path
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 19552
diff changeset
457 i_free(service->config_path);
14069
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
458 service->config_path = i_strdup(arg);
17794
ccc5701dae72 lib-master: Earlier config file path fix broke reusing existing config socket lookups.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
459 service->config_path_changed_with_param = TRUE;
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
460 break;
14069
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
461 case 'i':
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
462 if (!get_instance_config(arg, &path))
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
463 i_fatal("Unknown instance name: %s", arg);
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
464 service->config_path = i_strdup(path);
17794
ccc5701dae72 lib-master: Earlier config file path fix broke reusing existing config socket lookups.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
465 service->config_path_changed_with_param = TRUE;
14069
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
466 break;
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
467 case 'k':
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
468 service->keep_environment = TRUE;
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
469 break;
9239
1cb45d4389d4 Binaries now take -o key=value parameters to override settings.
Timo Sirainen <tss@iki.fi>
parents: 9235
diff changeset
470 case 'o':
1cb45d4389d4 Binaries now take -o key=value parameters to override settings.
Timo Sirainen <tss@iki.fi>
parents: 9235
diff changeset
471 if (!array_is_created(&service->config_overrides))
1cb45d4389d4 Binaries now take -o key=value parameters to override settings.
Timo Sirainen <tss@iki.fi>
parents: 9235
diff changeset
472 i_array_init(&service->config_overrides, 16);
1cb45d4389d4 Binaries now take -o key=value parameters to override settings.
Timo Sirainen <tss@iki.fi>
parents: 9235
diff changeset
473 array_append(&service->config_overrides, &arg, 1);
1cb45d4389d4 Binaries now take -o key=value parameters to override settings.
Timo Sirainen <tss@iki.fi>
parents: 9235
diff changeset
474 break;
9336
fa195866a79a lib-master: Added -O parameter to use program default settings.
Timo Sirainen <tss@iki.fi>
parents: 9300
diff changeset
475 case 'O':
10092
4d21bb0fff3a lib-master: Added _NO_CONFIG_SETTIGS and _NO_ENV_SETTINGS flags.
Timo Sirainen <tss@iki.fi>
parents: 10089
diff changeset
476 service->flags |= MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS;
9336
fa195866a79a lib-master: Added -O parameter to use program default settings.
Timo Sirainen <tss@iki.fi>
parents: 9300
diff changeset
477 break;
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
478 case 'L':
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
479 service->log_directly = TRUE;
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
480 break;
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
481 default:
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
482 return FALSE;
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
483 }
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
484 return TRUE;
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
485 }
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
486
9807
41188b7db88a lib-master: If accept() fails and there are no clients, die instead of waiting forever.
Timo Sirainen <tss@iki.fi>
parents: 9441
diff changeset
487 static void master_service_error(struct master_service *service)
41188b7db88a lib-master: If accept() fails and there are no clients, die instead of waiting forever.
Timo Sirainen <tss@iki.fi>
parents: 9441
diff changeset
488 {
10264
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
489 master_service_stop_new_connections(service);
9807
41188b7db88a lib-master: If accept() fails and there are no clients, die instead of waiting forever.
Timo Sirainen <tss@iki.fi>
parents: 9441
diff changeset
490 if (service->master_status.available_count ==
10171
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
491 service->total_available_count || service->die_with_master) {
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
492 if (service->die_callback == NULL)
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
493 master_service_stop(service);
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
494 else {
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
495 service->to_die =
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
496 timeout_add(MASTER_SERVICE_DIE_TIMEOUT_MSECS,
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
497 master_service_stop,
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
498 service);
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
499 service->die_callback();
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
500 }
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
501 }
9807
41188b7db88a lib-master: If accept() fails and there are no clients, die instead of waiting forever.
Timo Sirainen <tss@iki.fi>
parents: 9441
diff changeset
502 }
41188b7db88a lib-master: If accept() fails and there are no clients, die instead of waiting forever.
Timo Sirainen <tss@iki.fi>
parents: 9441
diff changeset
503
14921
d3db2ba15d00 Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents: 14728
diff changeset
504 static void master_status_error(struct master_service *service)
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
505 {
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
506 /* status fd is a write-only pipe, so if we're here it means the
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
507 master wants us to die (or died itself). don't die until all
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
508 service connections are finished. */
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
509 io_remove(&service->io_status_error);
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
510
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
511 /* the log fd may also be closed already, don't die when trying to
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
512 log later */
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
513 i_set_failure_ignore_errors(TRUE);
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
514
9807
41188b7db88a lib-master: If accept() fails and there are no clients, die instead of waiting forever.
Timo Sirainen <tss@iki.fi>
parents: 9441
diff changeset
515 master_service_error(service);
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
516 }
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
517
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
518 void master_service_init_finish(struct master_service *service)
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
519 {
13065
6fdee880c5dc Use SA_RESTART flag for signals wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
520 enum libsig_flags sigint_flags = LIBSIG_FLAG_DELAYED;
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
521 struct stat st;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
522
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
523 /* set default signal handlers */
13065
6fdee880c5dc Use SA_RESTART flag for signals wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
524 if ((service->flags & MASTER_SERVICE_FLAG_STANDALONE) == 0)
6fdee880c5dc Use SA_RESTART flag for signals wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
525 sigint_flags |= LIBSIG_FLAG_RESTART;
6fdee880c5dc Use SA_RESTART flag for signals wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
526 lib_signals_set_handler(SIGINT, sigint_flags, sig_die, service);
6fdee880c5dc Use SA_RESTART flag for signals wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
527 lib_signals_set_handler(SIGTERM, LIBSIG_FLAG_DELAYED, sig_die, service);
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
528 if ((service->flags & MASTER_SERVICE_FLAG_TRACK_LOGIN_STATE) != 0) {
13065
6fdee880c5dc Use SA_RESTART flag for signals wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
529 lib_signals_set_handler(SIGUSR1, LIBSIG_FLAGS_SAFE,
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
530 sig_state_changed, service);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
531 }
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
532
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
533 if ((service->flags & MASTER_SERVICE_FLAG_STANDALONE) == 0) {
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
534 if (fstat(MASTER_STATUS_FD, &st) < 0 || !S_ISFIFO(st.st_mode))
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
535 i_fatal("Must be started by dovecot master process");
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
536
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
537 /* start listening errors for status fd, it means master died */
12564
b0ec48006d57 master-child API change: Use a separate fd for tracking when master dies.
Timo Sirainen <tss@iki.fi>
parents: 12439
diff changeset
538 service->io_status_error = io_add(MASTER_DEAD_FD, IO_ERROR,
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
539 master_status_error, service);
22027
38826e486570 lib-master: When running under master, close listeners immediately on SIGQUIT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22026
diff changeset
540 lib_signals_set_handler(SIGQUIT, 0, sig_close_listeners, service);
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
541 }
9923
77228b5431e1 *-login: Fixed dropping oldest connection when reaching all limits.
Timo Sirainen <tss@iki.fi>
parents: 9912
diff changeset
542 master_service_io_listeners_add(service);
15962
effecdd32cb0 login: Don't fail at startup by trying to load SSL plugin.
Timo Sirainen <tss@iki.fi>
parents: 15931
diff changeset
543 if (service->want_ssl_settings &&
effecdd32cb0 login: Don't fail at startup by trying to load SSL plugin.
Timo Sirainen <tss@iki.fi>
parents: 15931
diff changeset
544 (service->flags & MASTER_SERVICE_FLAG_NO_SSL_INIT) == 0)
15931
6b0c284ecede lib-master: If ssl settings are used, initialize ssl context automatically.
Timo Sirainen <tss@iki.fi>
parents: 15904
diff changeset
545 master_service_ssl_ctx_init(service);
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
546
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
547 if ((service->flags & MASTER_SERVICE_FLAG_STD_CLIENT) != 0) {
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
548 /* we already have a connection to be served */
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
549 service->master_status.available_count--;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
550 }
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
551 master_status_update(service);
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
552 }
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
553
22488
052396bac097 lib-master: master_service_import_environment() - use a data stack frame
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22487
diff changeset
554 static void master_service_import_environment_real(const char *import_environment)
22487
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
555 {
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
556 const char *const *envs, *key, *value;
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
557 ARRAY_TYPE(const_string) keys;
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
558
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
559 if (*import_environment == '\0')
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
560 return;
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
561
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
562 t_array_init(&keys, 8);
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
563 /* preserve existing DOVECOT_PRESERVE_ENVS */
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
564 value = getenv(DOVECOT_PRESERVE_ENVS_ENV);
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
565 if (value != NULL)
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
566 array_append(&keys, &value, 1);
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
567 /* add new environments */
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
568 envs = t_strsplit_spaces(import_environment, " ");
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
569 for (; *envs != NULL; envs++) {
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
570 value = strchr(*envs, '=');
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
571 if (value == NULL)
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
572 key = *envs;
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
573 else {
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
574 key = t_strdup_until(*envs, value);
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
575 env_put(*envs);
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
576 }
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
577 array_append(&keys, &key, 1);
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
578 }
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
579 array_append_zero(&keys);
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
580
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
581 value = t_strarray_join(array_idx(&keys, 0), " ");
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
582 env_put(t_strconcat(DOVECOT_PRESERVE_ENVS_ENV"=", value, NULL));
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
583 }
e60f0e893992 master: Move master_set_import_environment() to lib-master
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22075
diff changeset
584
22488
052396bac097 lib-master: master_service_import_environment() - use a data stack frame
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22487
diff changeset
585 void master_service_import_environment(const char *import_environment)
052396bac097 lib-master: master_service_import_environment() - use a data stack frame
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22487
diff changeset
586 {
052396bac097 lib-master: master_service_import_environment() - use a data stack frame
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22487
diff changeset
587 T_BEGIN {
052396bac097 lib-master: master_service_import_environment() - use a data stack frame
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22487
diff changeset
588 master_service_import_environment_real(import_environment);
052396bac097 lib-master: master_service_import_environment() - use a data stack frame
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22487
diff changeset
589 } T_END;
052396bac097 lib-master: master_service_import_environment() - use a data stack frame
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22487
diff changeset
590 }
052396bac097 lib-master: master_service_import_environment() - use a data stack frame
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22487
diff changeset
591
12726
cec7fa92ff48 Added import_environment setting.
Timo Sirainen <tss@iki.fi>
parents: 12564
diff changeset
592 void master_service_env_clean(void)
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
593 {
12726
cec7fa92ff48 Added import_environment setting.
Timo Sirainen <tss@iki.fi>
parents: 12564
diff changeset
594 const char *value = getenv(DOVECOT_PRESERVE_ENVS_ENV);
cec7fa92ff48 Added import_environment setting.
Timo Sirainen <tss@iki.fi>
parents: 12564
diff changeset
595
cec7fa92ff48 Added import_environment setting.
Timo Sirainen <tss@iki.fi>
parents: 12564
diff changeset
596 if (value == NULL || *value == '\0')
cec7fa92ff48 Added import_environment setting.
Timo Sirainen <tss@iki.fi>
parents: 12564
diff changeset
597 env_clean();
cec7fa92ff48 Added import_environment setting.
Timo Sirainen <tss@iki.fi>
parents: 12564
diff changeset
598 else T_BEGIN {
cec7fa92ff48 Added import_environment setting.
Timo Sirainen <tss@iki.fi>
parents: 12564
diff changeset
599 value = t_strconcat(value, " "DOVECOT_PRESERVE_ENVS_ENV, NULL);
cec7fa92ff48 Added import_environment setting.
Timo Sirainen <tss@iki.fi>
parents: 12564
diff changeset
600 env_clean_except(t_strsplit_spaces(value, " "));
cec7fa92ff48 Added import_environment setting.
Timo Sirainen <tss@iki.fi>
parents: 12564
diff changeset
601 } T_END;
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
602 }
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
603
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
604 void master_service_set_client_limit(struct master_service *service,
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
605 unsigned int client_limit)
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
606 {
9868
63d2755c9211 lib-master: Make sure master_status.available_count is updated correctly.
Timo Sirainen <tss@iki.fi>
parents: 9864
diff changeset
607 unsigned int used;
63d2755c9211 lib-master: Make sure master_status.available_count is updated correctly.
Timo Sirainen <tss@iki.fi>
parents: 9864
diff changeset
608
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
609 i_assert(service->master_status.available_count ==
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
610 service->total_available_count);
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
611
9868
63d2755c9211 lib-master: Make sure master_status.available_count is updated correctly.
Timo Sirainen <tss@iki.fi>
parents: 9864
diff changeset
612 used = service->total_available_count -
63d2755c9211 lib-master: Make sure master_status.available_count is updated correctly.
Timo Sirainen <tss@iki.fi>
parents: 9864
diff changeset
613 service->master_status.available_count;
63d2755c9211 lib-master: Make sure master_status.available_count is updated correctly.
Timo Sirainen <tss@iki.fi>
parents: 9864
diff changeset
614 i_assert(client_limit >= used);
63d2755c9211 lib-master: Make sure master_status.available_count is updated correctly.
Timo Sirainen <tss@iki.fi>
parents: 9864
diff changeset
615
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
616 service->total_available_count = client_limit;
9868
63d2755c9211 lib-master: Make sure master_status.available_count is updated correctly.
Timo Sirainen <tss@iki.fi>
parents: 9864
diff changeset
617 service->master_status.available_count = client_limit - used;
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
618 }
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
619
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
620 unsigned int master_service_get_client_limit(struct master_service *service)
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
621 {
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
622 return service->total_available_count;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
623 }
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
624
13081
a5ab569ee4cd master process now tells its children their service's process_limit.
Timo Sirainen <tss@iki.fi>
parents: 13065
diff changeset
625 unsigned int master_service_get_process_limit(struct master_service *service)
a5ab569ee4cd master process now tells its children their service's process_limit.
Timo Sirainen <tss@iki.fi>
parents: 13065
diff changeset
626 {
a5ab569ee4cd master process now tells its children their service's process_limit.
Timo Sirainen <tss@iki.fi>
parents: 13065
diff changeset
627 return service->process_limit;
a5ab569ee4cd master process now tells its children their service's process_limit.
Timo Sirainen <tss@iki.fi>
parents: 13065
diff changeset
628 }
a5ab569ee4cd master process now tells its children their service's process_limit.
Timo Sirainen <tss@iki.fi>
parents: 13065
diff changeset
629
16178
c32bfc54bc50 lib-master: Added master_service_get_process_min_avail()
Timo Sirainen <tss@iki.fi>
parents: 16140
diff changeset
630 unsigned int master_service_get_process_min_avail(struct master_service *service)
c32bfc54bc50 lib-master: Added master_service_get_process_min_avail()
Timo Sirainen <tss@iki.fi>
parents: 16140
diff changeset
631 {
c32bfc54bc50 lib-master: Added master_service_get_process_min_avail()
Timo Sirainen <tss@iki.fi>
parents: 16140
diff changeset
632 return service->process_min_avail;
c32bfc54bc50 lib-master: Added master_service_get_process_min_avail()
Timo Sirainen <tss@iki.fi>
parents: 16140
diff changeset
633 }
c32bfc54bc50 lib-master: Added master_service_get_process_min_avail()
Timo Sirainen <tss@iki.fi>
parents: 16140
diff changeset
634
13969
3963862a4086 lib-master: Send service's idle_kill value to process in environment.
Timo Sirainen <tss@iki.fi>
parents: 13877
diff changeset
635 unsigned int master_service_get_idle_kill_secs(struct master_service *service)
3963862a4086 lib-master: Send service's idle_kill value to process in environment.
Timo Sirainen <tss@iki.fi>
parents: 13877
diff changeset
636 {
3963862a4086 lib-master: Send service's idle_kill value to process in environment.
Timo Sirainen <tss@iki.fi>
parents: 13877
diff changeset
637 return service->idle_kill_secs;
3963862a4086 lib-master: Send service's idle_kill value to process in environment.
Timo Sirainen <tss@iki.fi>
parents: 13877
diff changeset
638 }
3963862a4086 lib-master: Send service's idle_kill value to process in environment.
Timo Sirainen <tss@iki.fi>
parents: 13877
diff changeset
639
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
640 void master_service_set_service_count(struct master_service *service,
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
641 unsigned int count)
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
642 {
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
643 unsigned int used;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
644
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
645 used = service->total_available_count -
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
646 service->master_status.available_count;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
647 i_assert(count >= used);
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
648
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
649 if (service->total_available_count > count) {
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
650 service->total_available_count = count;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
651 service->master_status.available_count = count - used;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
652 }
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
653 service->service_count_left = count;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
654 }
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
655
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
656 unsigned int master_service_get_service_count(struct master_service *service)
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
657 {
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
658 return service->service_count_left;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
659 }
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
660
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
661 unsigned int master_service_get_socket_count(struct master_service *service)
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
662 {
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
663 return service->socket_count;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
664 }
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
665
18671
5614bc437643 lib-master: Added master_service_get_socket_name()
Timo Sirainen <tss@iki.fi>
parents: 18320
diff changeset
666 const char *master_service_get_socket_name(struct master_service *service,
5614bc437643 lib-master: Added master_service_get_socket_name()
Timo Sirainen <tss@iki.fi>
parents: 18320
diff changeset
667 int listen_fd)
5614bc437643 lib-master: Added master_service_get_socket_name()
Timo Sirainen <tss@iki.fi>
parents: 18320
diff changeset
668 {
5614bc437643 lib-master: Added master_service_get_socket_name()
Timo Sirainen <tss@iki.fi>
parents: 18320
diff changeset
669 unsigned int i;
5614bc437643 lib-master: Added master_service_get_socket_name()
Timo Sirainen <tss@iki.fi>
parents: 18320
diff changeset
670
5614bc437643 lib-master: Added master_service_get_socket_name()
Timo Sirainen <tss@iki.fi>
parents: 18320
diff changeset
671 i_assert(listen_fd >= MASTER_LISTEN_FD_FIRST);
5614bc437643 lib-master: Added master_service_get_socket_name()
Timo Sirainen <tss@iki.fi>
parents: 18320
diff changeset
672
5614bc437643 lib-master: Added master_service_get_socket_name()
Timo Sirainen <tss@iki.fi>
parents: 18320
diff changeset
673 i = listen_fd - MASTER_LISTEN_FD_FIRST;
18951
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
674 i_assert(i < service->socket_count);
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
675 return service->listeners[i].name != NULL ?
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
676 service->listeners[i].name : "";
18671
5614bc437643 lib-master: Added master_service_get_socket_name()
Timo Sirainen <tss@iki.fi>
parents: 18320
diff changeset
677 }
5614bc437643 lib-master: Added master_service_get_socket_name()
Timo Sirainen <tss@iki.fi>
parents: 18320
diff changeset
678
9923
77228b5431e1 *-login: Fixed dropping oldest connection when reaching all limits.
Timo Sirainen <tss@iki.fi>
parents: 9912
diff changeset
679 void master_service_set_avail_overflow_callback(struct master_service *service,
77228b5431e1 *-login: Fixed dropping oldest connection when reaching all limits.
Timo Sirainen <tss@iki.fi>
parents: 9912
diff changeset
680 void (*callback)(void))
77228b5431e1 *-login: Fixed dropping oldest connection when reaching all limits.
Timo Sirainen <tss@iki.fi>
parents: 9912
diff changeset
681 {
77228b5431e1 *-login: Fixed dropping oldest connection when reaching all limits.
Timo Sirainen <tss@iki.fi>
parents: 9912
diff changeset
682 service->avail_overflow_callback = callback;
77228b5431e1 *-login: Fixed dropping oldest connection when reaching all limits.
Timo Sirainen <tss@iki.fi>
parents: 9912
diff changeset
683 }
77228b5431e1 *-login: Fixed dropping oldest connection when reaching all limits.
Timo Sirainen <tss@iki.fi>
parents: 9912
diff changeset
684
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
685 const char *master_service_get_config_path(struct master_service *service)
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
686 {
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
687 return service->config_path;
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
688 }
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
689
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
690 const char *master_service_get_version_string(struct master_service *service)
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
691 {
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
692 return service->version_string;
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
693 }
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
694
9413
84f96a722fcc lib-master: Added master_service_get_name().
Timo Sirainen <tss@iki.fi>
parents: 9396
diff changeset
695 const char *master_service_get_name(struct master_service *service)
84f96a722fcc lib-master: Added master_service_get_name().
Timo Sirainen <tss@iki.fi>
parents: 9396
diff changeset
696 {
84f96a722fcc lib-master: Added master_service_get_name().
Timo Sirainen <tss@iki.fi>
parents: 9396
diff changeset
697 return service->name;
84f96a722fcc lib-master: Added master_service_get_name().
Timo Sirainen <tss@iki.fi>
parents: 9396
diff changeset
698 }
84f96a722fcc lib-master: Added master_service_get_name().
Timo Sirainen <tss@iki.fi>
parents: 9396
diff changeset
699
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
700 void master_service_run(struct master_service *service,
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
701 master_service_connection_callback_t *callback)
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
702 {
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
703 service->callback = callback;
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
704 io_loop_run(service->ioloop);
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
705 service->callback = NULL;
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
706 }
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
707
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
708 void master_service_stop(struct master_service *service)
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
709 {
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
710 io_loop_stop(service->ioloop);
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
711 }
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
712
10264
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
713 void master_service_stop_new_connections(struct master_service *service)
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
714 {
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
715 unsigned int current_count;
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
716
10472
32949365f28d lib-master: Close listener fds when we stop accepting more connections.
Timo Sirainen <tss@iki.fi>
parents: 10440
diff changeset
717 if (service->stopping)
32949365f28d lib-master: Close listener fds when we stop accepting more connections.
Timo Sirainen <tss@iki.fi>
parents: 10440
diff changeset
718 return;
32949365f28d lib-master: Close listener fds when we stop accepting more connections.
Timo Sirainen <tss@iki.fi>
parents: 10440
diff changeset
719
10264
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
720 service->stopping = TRUE;
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
721 master_service_io_listeners_remove(service);
10472
32949365f28d lib-master: Close listener fds when we stop accepting more connections.
Timo Sirainen <tss@iki.fi>
parents: 10440
diff changeset
722 master_service_io_listeners_close(service);
10264
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
723
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
724 /* make sure we stop after servicing current connections */
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
725 current_count = service->total_available_count -
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
726 service->master_status.available_count;
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
727 service->service_count_left = current_count;
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
728 service->total_available_count = current_count;
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
729
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
730 if (current_count == 0)
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
731 master_service_stop(service);
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
732 else {
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
733 /* notify master that we're not accepting any more
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
734 connections */
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
735 service->master_status.available_count = 0;
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
736 master_status_update(service);
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
737 }
10473
a0d99b374aa4 imap, pop3: Close auth/config connections when we stop accepting more connections.
Timo Sirainen <tss@iki.fi>
parents: 10472
diff changeset
738 if (service->login != NULL)
a0d99b374aa4 imap, pop3: Close auth/config connections when we stop accepting more connections.
Timo Sirainen <tss@iki.fi>
parents: 10472
diff changeset
739 master_login_stop(service->login);
10264
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
740 }
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
741
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents: 11735
diff changeset
742 bool master_service_is_killed(struct master_service *service)
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents: 11735
diff changeset
743 {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents: 11735
diff changeset
744 return service->killed;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents: 11735
diff changeset
745 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents: 11735
diff changeset
746
16319
b8be0d35228e lib-master: Added master_service_is_master_stopped()
Timo Sirainen <tss@iki.fi>
parents: 16178
diff changeset
747 bool master_service_is_master_stopped(struct master_service *service)
b8be0d35228e lib-master: Added master_service_is_master_stopped()
Timo Sirainen <tss@iki.fi>
parents: 16178
diff changeset
748 {
19392
52cbfa793147 lib-master: master_service_is_master_stopped() now returns FALSE if running standalone.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
749 return service->io_status_error == NULL &&
52cbfa793147 lib-master: master_service_is_master_stopped() now returns FALSE if running standalone.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
750 (service->flags & MASTER_SERVICE_FLAG_STANDALONE) == 0;
16319
b8be0d35228e lib-master: Added master_service_is_master_stopped()
Timo Sirainen <tss@iki.fi>
parents: 16178
diff changeset
751 }
b8be0d35228e lib-master: Added master_service_is_master_stopped()
Timo Sirainen <tss@iki.fi>
parents: 16178
diff changeset
752
9235
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9218
diff changeset
753 void master_service_anvil_send(struct master_service *service, const char *cmd)
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9218
diff changeset
754 {
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9218
diff changeset
755 ssize_t ret;
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9218
diff changeset
756
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9218
diff changeset
757 if ((service->flags & MASTER_SERVICE_FLAG_STANDALONE) != 0)
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9218
diff changeset
758 return;
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9218
diff changeset
759
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9218
diff changeset
760 ret = write(MASTER_ANVIL_FD, cmd, strlen(cmd));
9880
cce684dfe3e7 anvil: Stop immediately when master asks, instead of waiting for clients to finish.
Timo Sirainen <tss@iki.fi>
parents: 9878
diff changeset
761 if (ret < 0) {
cce684dfe3e7 anvil: Stop immediately when master asks, instead of waiting for clients to finish.
Timo Sirainen <tss@iki.fi>
parents: 9878
diff changeset
762 if (errno == EPIPE) {
cce684dfe3e7 anvil: Stop immediately when master asks, instead of waiting for clients to finish.
Timo Sirainen <tss@iki.fi>
parents: 9878
diff changeset
763 /* anvil process was probably recreated, don't bother
cce684dfe3e7 anvil: Stop immediately when master asks, instead of waiting for clients to finish.
Timo Sirainen <tss@iki.fi>
parents: 9878
diff changeset
764 logging an error about losing connection to it */
cce684dfe3e7 anvil: Stop immediately when master asks, instead of waiting for clients to finish.
Timo Sirainen <tss@iki.fi>
parents: 9878
diff changeset
765 return;
cce684dfe3e7 anvil: Stop immediately when master asks, instead of waiting for clients to finish.
Timo Sirainen <tss@iki.fi>
parents: 9878
diff changeset
766 }
9235
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9218
diff changeset
767 i_error("write(anvil) failed: %m");
9880
cce684dfe3e7 anvil: Stop immediately when master asks, instead of waiting for clients to finish.
Timo Sirainen <tss@iki.fi>
parents: 9878
diff changeset
768 } else if (ret == 0)
9235
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9218
diff changeset
769 i_error("write(anvil) failed: EOF");
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9218
diff changeset
770 else {
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9218
diff changeset
771 i_assert((size_t)ret == strlen(cmd));
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9218
diff changeset
772 }
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9218
diff changeset
773 }
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9218
diff changeset
774
13277
030e33bde821 lib-master: Added master_service_client_connection_created()
Timo Sirainen <tss@iki.fi>
parents: 13082
diff changeset
775 void master_service_client_connection_created(struct master_service *service)
030e33bde821 lib-master: Added master_service_client_connection_created()
Timo Sirainen <tss@iki.fi>
parents: 13082
diff changeset
776 {
030e33bde821 lib-master: Added master_service_client_connection_created()
Timo Sirainen <tss@iki.fi>
parents: 13082
diff changeset
777 i_assert(service->master_status.available_count > 0);
030e33bde821 lib-master: Added master_service_client_connection_created()
Timo Sirainen <tss@iki.fi>
parents: 13082
diff changeset
778 service->master_status.available_count--;
030e33bde821 lib-master: Added master_service_client_connection_created()
Timo Sirainen <tss@iki.fi>
parents: 13082
diff changeset
779 master_status_update(service);
030e33bde821 lib-master: Added master_service_client_connection_created()
Timo Sirainen <tss@iki.fi>
parents: 13082
diff changeset
780 }
030e33bde821 lib-master: Added master_service_client_connection_created()
Timo Sirainen <tss@iki.fi>
parents: 13082
diff changeset
781
22026
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
782 static bool master_service_want_listener(struct master_service *service)
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
783 {
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
784 if (service->master_status.available_count > 0) {
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
785 /* more concurrent clients can still be added */
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
786 return TRUE;
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
787 }
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
788 if (service->service_count_left == 1) {
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
789 /* after handling this client, the whole process will stop. */
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
790 return FALSE;
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
791 }
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
792 if (service->avail_overflow_callback != NULL) {
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
793 /* overflow callback is set. it's possible that the current
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
794 existing client may be replaced by a new client, which needs
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
795 the listener to try to accept new connections. */
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
796 return TRUE;
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
797 }
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
798 /* the listener isn't needed until the current client is disconnected */
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
799 return FALSE;
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
800 }
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
801
18948
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
802 void master_service_client_connection_handled(struct master_service *service,
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
803 struct master_service_connection *conn)
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
804 {
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
805 if (!conn->accepted) {
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
806 if (close(conn->fd) < 0)
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
807 i_error("close(service connection) failed: %m");
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
808 master_service_client_connection_destroyed(service);
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
809 } else if (conn->fifo) {
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
810 /* reading FIFOs stays open forever, don't count them
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
811 as real clients */
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
812 master_service_client_connection_destroyed(service);
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
813 }
22026
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
814 if (!master_service_want_listener(service)) {
18948
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
815 i_assert(service->listeners != NULL);
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
816 master_service_io_listeners_remove(service);
22026
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
817 if (service->service_count_left == 1) {
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
818 /* we're not going to accept any more connections after
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
819 this. go ahead and close the connection early. don't
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
820 do this before calling callback, because it may want
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
821 to access the listen_fd (e.g. to check socket
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
822 permissions). */
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
823 master_service_io_listeners_close(service);
7835a8a35d66 lib-master: Remove listener's IO earlier if possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
824 }
18948
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
825 }
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
826 }
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
827
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
828 void master_service_client_connection_callback(struct master_service *service,
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
829 struct master_service_connection *conn)
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
830 {
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
831 service->callback(conn);
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
832
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
833 master_service_client_connection_handled(service, conn);
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
834 }
b9ccd6349654 lib-master: Moved connection accepting code to its own functions.
Timo Sirainen <tss@iki.fi>
parents: 18940
diff changeset
835
11388
b8d3c96e61a7 lib-master API changed to avoid accidentally leaking client connections.
Timo Sirainen <tss@iki.fi>
parents: 11118
diff changeset
836 void master_service_client_connection_accept(struct master_service_connection *conn)
b8d3c96e61a7 lib-master API changed to avoid accidentally leaking client connections.
Timo Sirainen <tss@iki.fi>
parents: 11118
diff changeset
837 {
b8d3c96e61a7 lib-master API changed to avoid accidentally leaking client connections.
Timo Sirainen <tss@iki.fi>
parents: 11118
diff changeset
838 conn->accepted = TRUE;
b8d3c96e61a7 lib-master API changed to avoid accidentally leaking client connections.
Timo Sirainen <tss@iki.fi>
parents: 11118
diff changeset
839 }
b8d3c96e61a7 lib-master API changed to avoid accidentally leaking client connections.
Timo Sirainen <tss@iki.fi>
parents: 11118
diff changeset
840
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
841 void master_service_client_connection_destroyed(struct master_service *service)
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
842 {
9437
e18fb0a361ef lib-master: Fixed crashing on deinit when listening on fifos.
Timo Sirainen <tss@iki.fi>
parents: 9431
diff changeset
843 /* we can listen again */
9923
77228b5431e1 *-login: Fixed dropping oldest connection when reaching all limits.
Timo Sirainen <tss@iki.fi>
parents: 9912
diff changeset
844 master_service_io_listeners_add(service);
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
845
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
846 i_assert(service->total_available_count > 0);
10944
183b1b4f6386 lib-master: Don't assert-crash if client_limit < service_count.
Timo Sirainen <tss@iki.fi>
parents: 10833
diff changeset
847 i_assert(service->service_count_left > 0);
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
848
10944
183b1b4f6386 lib-master: Don't assert-crash if client_limit < service_count.
Timo Sirainen <tss@iki.fi>
parents: 10833
diff changeset
849 if (service->service_count_left == service->total_available_count) {
183b1b4f6386 lib-master: Don't assert-crash if client_limit < service_count.
Timo Sirainen <tss@iki.fi>
parents: 10833
diff changeset
850 service->total_available_count--;
183b1b4f6386 lib-master: Don't assert-crash if client_limit < service_count.
Timo Sirainen <tss@iki.fi>
parents: 10833
diff changeset
851 service->service_count_left--;
183b1b4f6386 lib-master: Don't assert-crash if client_limit < service_count.
Timo Sirainen <tss@iki.fi>
parents: 10833
diff changeset
852 } else {
15904
d3cf06639864 Replaced all -1U and (unsigned int)-1 with UINT_MAX.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
853 if (service->service_count_left != UINT_MAX)
10944
183b1b4f6386 lib-master: Don't assert-crash if client_limit < service_count.
Timo Sirainen <tss@iki.fi>
parents: 10833
diff changeset
854 service->service_count_left--;
183b1b4f6386 lib-master: Don't assert-crash if client_limit < service_count.
Timo Sirainen <tss@iki.fi>
parents: 10833
diff changeset
855
9868
63d2755c9211 lib-master: Make sure master_status.available_count is updated correctly.
Timo Sirainen <tss@iki.fi>
parents: 9864
diff changeset
856 i_assert(service->master_status.available_count <
63d2755c9211 lib-master: Make sure master_status.available_count is updated correctly.
Timo Sirainen <tss@iki.fi>
parents: 9864
diff changeset
857 service->total_available_count);
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
858 service->master_status.available_count++;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
859 }
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
860
10944
183b1b4f6386 lib-master: Don't assert-crash if client_limit < service_count.
Timo Sirainen <tss@iki.fi>
parents: 10833
diff changeset
861 if (service->service_count_left == 0) {
183b1b4f6386 lib-master: Don't assert-crash if client_limit < service_count.
Timo Sirainen <tss@iki.fi>
parents: 10833
diff changeset
862 i_assert(service->master_status.available_count ==
183b1b4f6386 lib-master: Don't assert-crash if client_limit < service_count.
Timo Sirainen <tss@iki.fi>
parents: 10833
diff changeset
863 service->total_available_count);
183b1b4f6386 lib-master: Don't assert-crash if client_limit < service_count.
Timo Sirainen <tss@iki.fi>
parents: 10833
diff changeset
864 master_service_stop(service);
183b1b4f6386 lib-master: Don't assert-crash if client_limit < service_count.
Timo Sirainen <tss@iki.fi>
parents: 10833
diff changeset
865 } else if ((service->io_status_error == NULL ||
183b1b4f6386 lib-master: Don't assert-crash if client_limit < service_count.
Timo Sirainen <tss@iki.fi>
parents: 10833
diff changeset
866 service->listeners == NULL) &&
183b1b4f6386 lib-master: Don't assert-crash if client_limit < service_count.
Timo Sirainen <tss@iki.fi>
parents: 10833
diff changeset
867 service->master_status.available_count ==
183b1b4f6386 lib-master: Don't assert-crash if client_limit < service_count.
Timo Sirainen <tss@iki.fi>
parents: 10833
diff changeset
868 service->total_available_count) {
9441
d43232f22ace lib-master: Non-listening processes should die when their std-client is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 9438
diff changeset
869 /* we've finished handling all clients, and
d43232f22ace lib-master: Non-listening processes should die when their std-client is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 9438
diff changeset
870 a) master has closed the connection
d43232f22ace lib-master: Non-listening processes should die when their std-client is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 9438
diff changeset
871 b) there are no listeners (std-client?) */
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
872 master_service_stop(service);
10944
183b1b4f6386 lib-master: Don't assert-crash if client_limit < service_count.
Timo Sirainen <tss@iki.fi>
parents: 10833
diff changeset
873 } else {
183b1b4f6386 lib-master: Don't assert-crash if client_limit < service_count.
Timo Sirainen <tss@iki.fi>
parents: 10833
diff changeset
874 master_status_update(service);
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
875 }
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
876 }
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
877
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
878 static void master_service_set_login_state(struct master_service *service,
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
879 enum master_login_state state)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
880 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
881 if (service->to_overflow_state != NULL)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
882 timeout_remove(&service->to_overflow_state);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
883
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
884 switch (state) {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
885 case MASTER_LOGIN_STATE_NONFULL:
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
886 service->call_avail_overflow = FALSE;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
887 if (service->master_status.available_count > 0)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
888 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
889
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
890 /* some processes should now be able to handle new connections,
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
891 although we can't. but there may be race conditions, so
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
892 make sure that we'll check again soon if the state has
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
893 changed to "full" without our knowledge. */
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
894 service->to_overflow_state =
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
895 timeout_add(MASTER_SERVICE_STATE_CHECK_MSECS,
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
896 master_service_refresh_login_state,
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
897 service);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
898 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
899 case MASTER_LOGIN_STATE_FULL:
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
900 /* make sure we're listening for more connections */
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
901 service->call_avail_overflow = TRUE;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
902 master_service_io_listeners_add(service);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
903 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
904 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
905 i_error("Invalid master login state: %d", state);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
906 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
907
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
908 static void master_service_refresh_login_state(struct master_service *service)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
909 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
910 int ret;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
911
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
912 ret = lseek(MASTER_LOGIN_NOTIFY_FD, 0, SEEK_CUR);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
913 if (ret < 0)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
914 i_error("lseek(login notify fd) failed: %m");
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
915 else
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
916 master_service_set_login_state(service, ret);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
917 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
918
10194
40d8df2b4111 imap, pop3: Connection counting fixes.
Timo Sirainen <tss@iki.fi>
parents: 10188
diff changeset
919 void master_service_close_config_fd(struct master_service *service)
10033
40a71105529b lib-master: If config fd is kept open, close it after last connection has been created.
Timo Sirainen <tss@iki.fi>
parents: 9959
diff changeset
920 {
40a71105529b lib-master: If config fd is kept open, close it after last connection has been created.
Timo Sirainen <tss@iki.fi>
parents: 9959
diff changeset
921 if (service->config_fd != -1) {
40a71105529b lib-master: If config fd is kept open, close it after last connection has been created.
Timo Sirainen <tss@iki.fi>
parents: 9959
diff changeset
922 if (close(service->config_fd) < 0)
40a71105529b lib-master: If config fd is kept open, close it after last connection has been created.
Timo Sirainen <tss@iki.fi>
parents: 9959
diff changeset
923 i_error("close(master config fd) failed: %m");
40a71105529b lib-master: If config fd is kept open, close it after last connection has been created.
Timo Sirainen <tss@iki.fi>
parents: 9959
diff changeset
924 service->config_fd = -1;
40a71105529b lib-master: If config fd is kept open, close it after last connection has been created.
Timo Sirainen <tss@iki.fi>
parents: 9959
diff changeset
925 }
40a71105529b lib-master: If config fd is kept open, close it after last connection has been created.
Timo Sirainen <tss@iki.fi>
parents: 9959
diff changeset
926 }
40a71105529b lib-master: If config fd is kept open, close it after last connection has been created.
Timo Sirainen <tss@iki.fi>
parents: 9959
diff changeset
927
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
928 void master_service_deinit(struct master_service **_service)
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
929 {
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
930 struct master_service *service = *_service;
18951
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
931 unsigned int i;
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
932
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
933 *_service = NULL;
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
934
18952
4d7a83ddb644 lib-master: Added support for HAProxy protocol.
Timo Sirainen <tss@iki.fi>
parents: 18951
diff changeset
935 master_service_haproxy_abort(service);
4d7a83ddb644 lib-master: Added support for HAProxy protocol.
Timo Sirainen <tss@iki.fi>
parents: 18951
diff changeset
936
10199
9d13e9f78d52 lib-master: Fixes to handling master-login services.
Timo Sirainen <tss@iki.fi>
parents: 10194
diff changeset
937 master_service_io_listeners_remove(service);
15931
6b0c284ecede lib-master: If ssl settings are used, initialize ssl context automatically.
Timo Sirainen <tss@iki.fi>
parents: 15904
diff changeset
938 master_service_ssl_ctx_deinit(service);
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
939
10033
40a71105529b lib-master: If config fd is kept open, close it after last connection has been created.
Timo Sirainen <tss@iki.fi>
parents: 9959
diff changeset
940 master_service_close_config_fd(service);
10171
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
941 if (service->to_die != NULL)
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10147
diff changeset
942 timeout_remove(&service->to_die);
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
943 if (service->to_overflow_state != NULL)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10092
diff changeset
944 timeout_remove(&service->to_overflow_state);
10833
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
945 if (service->to_status != NULL)
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
946 timeout_remove(&service->to_status);
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
947 if (service->io_status_error != NULL)
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
948 io_remove(&service->io_status_error);
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
949 if (service->io_status_write != NULL)
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
950 io_remove(&service->io_status_write);
9239
1cb45d4389d4 Binaries now take -o key=value parameters to override settings.
Timo Sirainen <tss@iki.fi>
parents: 9235
diff changeset
951 if (array_is_created(&service->config_overrides))
1cb45d4389d4 Binaries now take -o key=value parameters to override settings.
Timo Sirainen <tss@iki.fi>
parents: 9235
diff changeset
952 array_free(&service->config_overrides);
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
953
9300
b66054f9b8fb Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 9282
diff changeset
954 if (service->set_parser != NULL) {
b66054f9b8fb Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 9282
diff changeset
955 settings_parser_deinit(&service->set_parser);
b66054f9b8fb Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 9282
diff changeset
956 pool_unref(&service->set_pool);
b66054f9b8fb Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 9282
diff changeset
957 }
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
958 lib_signals_deinit();
16923
5eae6c491d44 Call lib_atexit() callbacks before destroying the lib-master ioloop.
Timo Sirainen <tss@iki.fi>
parents: 16875
diff changeset
959 /* run atexit callbacks before destroying ioloop */
5eae6c491d44 Call lib_atexit() callbacks before destroying the lib-master ioloop.
Timo Sirainen <tss@iki.fi>
parents: 16875
diff changeset
960 lib_atexit_run();
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
961 io_loop_destroy(&service->ioloop);
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
962
18951
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
963 for (i = 0; i < service->socket_count; i++)
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
964 i_free(service->listeners[i].name);
9881
8ad868df4649 Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 9880
diff changeset
965 i_free(service->listeners);
10119
1e63221f5c83 Moved most of getopt() handling to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
966 i_free(service->getopt_str);
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
967 i_free(service->name);
14069
3fa544e4f26b lib-master: Added -i parameter to read config by instance name rather than path.
Timo Sirainen <tss@iki.fi>
parents: 13969
diff changeset
968 i_free(service->config_path);
9059
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
969 i_free(service);
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
970
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
971 lib_deinit();
94ecf8a8ed68 Added lib-master and mail-storage-service code that makes it easier to build new Dovecot binaries.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
972 }
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
973
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
974 static void master_service_listen(struct master_service_listener *l)
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
975 {
9923
77228b5431e1 *-login: Fixed dropping oldest connection when reaching all limits.
Timo Sirainen <tss@iki.fi>
parents: 9912
diff changeset
976 struct master_service *service = l->service;
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
977 struct master_service_connection conn;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
978
9923
77228b5431e1 *-login: Fixed dropping oldest connection when reaching all limits.
Timo Sirainen <tss@iki.fi>
parents: 9912
diff changeset
979 if (service->master_status.available_count == 0) {
77228b5431e1 *-login: Fixed dropping oldest connection when reaching all limits.
Timo Sirainen <tss@iki.fi>
parents: 9912
diff changeset
980 /* we are full. stop listening for now, unless overflow
77228b5431e1 *-login: Fixed dropping oldest connection when reaching all limits.
Timo Sirainen <tss@iki.fi>
parents: 9912
diff changeset
981 callback destroys one of the existing connections */
77228b5431e1 *-login: Fixed dropping oldest connection when reaching all limits.
Timo Sirainen <tss@iki.fi>
parents: 9912
diff changeset
982 if (service->call_avail_overflow &&
11516
67b8de25154c lib-master: Try to send master status more reliably.
Timo Sirainen <tss@iki.fi>
parents: 11458
diff changeset
983 service->avail_overflow_callback != NULL)
9923
77228b5431e1 *-login: Fixed dropping oldest connection when reaching all limits.
Timo Sirainen <tss@iki.fi>
parents: 9912
diff changeset
984 service->avail_overflow_callback();
77228b5431e1 *-login: Fixed dropping oldest connection when reaching all limits.
Timo Sirainen <tss@iki.fi>
parents: 9912
diff changeset
985
77228b5431e1 *-login: Fixed dropping oldest connection when reaching all limits.
Timo Sirainen <tss@iki.fi>
parents: 9912
diff changeset
986 if (service->master_status.available_count == 0) {
10199
9d13e9f78d52 lib-master: Fixes to handling master-login services.
Timo Sirainen <tss@iki.fi>
parents: 10194
diff changeset
987 master_service_io_listeners_remove(service);
9923
77228b5431e1 *-login: Fixed dropping oldest connection when reaching all limits.
Timo Sirainen <tss@iki.fi>
parents: 9912
diff changeset
988 return;
77228b5431e1 *-login: Fixed dropping oldest connection when reaching all limits.
Timo Sirainen <tss@iki.fi>
parents: 9912
diff changeset
989 }
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
990 }
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
991
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21322
diff changeset
992 i_zero(&conn);
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
993 conn.listen_fd = l->fd;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
994 conn.fd = net_accept(l->fd, &conn.remote_ip, &conn.remote_port);
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
995 if (conn.fd < 0) {
12011
565f18727209 lib-master: Fixed accepting FIFO connections with BSDI.
Timo Sirainen <tss@iki.fi>
parents: 11897
diff changeset
996 struct stat st;
565f18727209 lib-master: Fixed accepting FIFO connections with BSDI.
Timo Sirainen <tss@iki.fi>
parents: 11897
diff changeset
997 int orig_errno = errno;
565f18727209 lib-master: Fixed accepting FIFO connections with BSDI.
Timo Sirainen <tss@iki.fi>
parents: 11897
diff changeset
998
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
999 if (conn.fd == -1)
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1000 return;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1001
12011
565f18727209 lib-master: Fixed accepting FIFO connections with BSDI.
Timo Sirainen <tss@iki.fi>
parents: 11897
diff changeset
1002 if (errno == ENOTSOCK) {
565f18727209 lib-master: Fixed accepting FIFO connections with BSDI.
Timo Sirainen <tss@iki.fi>
parents: 11897
diff changeset
1003 /* it's not a socket. should be a fifo. */
565f18727209 lib-master: Fixed accepting FIFO connections with BSDI.
Timo Sirainen <tss@iki.fi>
parents: 11897
diff changeset
1004 } else if (errno == EINVAL &&
12278
3385e9028410 lib-master: Properly fixed accepting FIFO connections with BSDI.
Timo Sirainen <tss@iki.fi>
parents: 12011
diff changeset
1005 (fstat(l->fd, &st) == 0 && S_ISFIFO(st.st_mode))) {
12011
565f18727209 lib-master: Fixed accepting FIFO connections with BSDI.
Timo Sirainen <tss@iki.fi>
parents: 11897
diff changeset
1006 /* BSDI fails accept(fifo) with EINVAL. */
565f18727209 lib-master: Fixed accepting FIFO connections with BSDI.
Timo Sirainen <tss@iki.fi>
parents: 11897
diff changeset
1007 } else {
565f18727209 lib-master: Fixed accepting FIFO connections with BSDI.
Timo Sirainen <tss@iki.fi>
parents: 11897
diff changeset
1008 errno = orig_errno;
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1009 i_error("net_accept() failed: %m");
14188
701709f472e9 lib-master: If accept() fails, stop listening only temporarily, not permanently.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
1010 /* try again later after one of the existing
701709f472e9 lib-master: If accept() fails, stop listening only temporarily, not permanently.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
1011 connections has died */
701709f472e9 lib-master: If accept() fails, stop listening only temporarily, not permanently.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
1012 master_service_io_listeners_remove(service);
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1013 return;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1014 }
12011
565f18727209 lib-master: Fixed accepting FIFO connections with BSDI.
Timo Sirainen <tss@iki.fi>
parents: 11897
diff changeset
1015 /* use the "listener" as the connection fd and stop the
565f18727209 lib-master: Fixed accepting FIFO connections with BSDI.
Timo Sirainen <tss@iki.fi>
parents: 11897
diff changeset
1016 listener. */
9864
5b36fa967538 lib-master: Fixes to handling FIFO connections. Also expose the FIFOness to caller.
Timo Sirainen <tss@iki.fi>
parents: 9839
diff changeset
1017 conn.fd = l->fd;
9438
27dfd1f5d46b log, lib-master: More fifo handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 9437
diff changeset
1018 conn.listen_fd = l->fd;
9864
5b36fa967538 lib-master: Fixes to handling FIFO connections. Also expose the FIFOness to caller.
Timo Sirainen <tss@iki.fi>
parents: 9839
diff changeset
1019 conn.fifo = TRUE;
5b36fa967538 lib-master: Fixes to handling FIFO connections. Also expose the FIFOness to caller.
Timo Sirainen <tss@iki.fi>
parents: 9839
diff changeset
1020
5b36fa967538 lib-master: Fixes to handling FIFO connections. Also expose the FIFOness to caller.
Timo Sirainen <tss@iki.fi>
parents: 9839
diff changeset
1021 io_remove(&l->io);
5b36fa967538 lib-master: Fixes to handling FIFO connections. Also expose the FIFOness to caller.
Timo Sirainen <tss@iki.fi>
parents: 9839
diff changeset
1022 l->fd = -1;
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1023 }
9218
4a42f694b762 inet_listeners now support ssl=yes. For now only login processes support it.
Timo Sirainen <tss@iki.fi>
parents: 9214
diff changeset
1024 conn.ssl = l->ssl;
19001
acfe208a656d lib-master: struct master_service_connection.name must never be NULL, use "" instead.
Timo Sirainen <tss@iki.fi>
parents: 18952
diff changeset
1025 conn.name = master_service_get_socket_name(service, conn.listen_fd);
18949
71f4b77c519f lib-master: Added local and real IP addresses and ports to struct master_service_connection.
Stephan Bosch <stephan@rename-it.nl>
parents: 18948
diff changeset
1026
71f4b77c519f lib-master: Added local and real IP addresses and ports to struct master_service_connection.
Stephan Bosch <stephan@rename-it.nl>
parents: 18948
diff changeset
1027 (void)net_getsockname(conn.fd, &conn.local_ip, &conn.local_port);
71f4b77c519f lib-master: Added local and real IP addresses and ports to struct master_service_connection.
Stephan Bosch <stephan@rename-it.nl>
parents: 18948
diff changeset
1028 conn.real_remote_ip = conn.remote_ip;
71f4b77c519f lib-master: Added local and real IP addresses and ports to struct master_service_connection.
Stephan Bosch <stephan@rename-it.nl>
parents: 18948
diff changeset
1029 conn.real_remote_port = conn.remote_port;
71f4b77c519f lib-master: Added local and real IP addresses and ports to struct master_service_connection.
Stephan Bosch <stephan@rename-it.nl>
parents: 18948
diff changeset
1030 conn.real_local_ip = conn.local_ip;
71f4b77c519f lib-master: Added local and real IP addresses and ports to struct master_service_connection.
Stephan Bosch <stephan@rename-it.nl>
parents: 18948
diff changeset
1031 conn.real_local_port = conn.local_port;
71f4b77c519f lib-master: Added local and real IP addresses and ports to struct master_service_connection.
Stephan Bosch <stephan@rename-it.nl>
parents: 18948
diff changeset
1032
9268
f389f56a68a8 master services: When accepting connections, set them nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 9239
diff changeset
1033 net_set_nonblock(conn.fd, TRUE);
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1034
13277
030e33bde821 lib-master: Added master_service_client_connection_created()
Timo Sirainen <tss@iki.fi>
parents: 13082
diff changeset
1035 master_service_client_connection_created(service);
18952
4d7a83ddb644 lib-master: Added support for HAProxy protocol.
Timo Sirainen <tss@iki.fi>
parents: 18951
diff changeset
1036 if (l->haproxy)
4d7a83ddb644 lib-master: Added support for HAProxy protocol.
Timo Sirainen <tss@iki.fi>
parents: 18951
diff changeset
1037 master_service_haproxy_new(service, &conn);
4d7a83ddb644 lib-master: Added support for HAProxy protocol.
Timo Sirainen <tss@iki.fi>
parents: 18951
diff changeset
1038 else
4d7a83ddb644 lib-master: Added support for HAProxy protocol.
Timo Sirainen <tss@iki.fi>
parents: 18951
diff changeset
1039 master_service_client_connection_callback(service, &conn);
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1040 }
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1041
9923
77228b5431e1 *-login: Fixed dropping oldest connection when reaching all limits.
Timo Sirainen <tss@iki.fi>
parents: 9912
diff changeset
1042 void master_service_io_listeners_add(struct master_service *service)
9437
e18fb0a361ef lib-master: Fixed crashing on deinit when listening on fifos.
Timo Sirainen <tss@iki.fi>
parents: 9431
diff changeset
1043 {
e18fb0a361ef lib-master: Fixed crashing on deinit when listening on fifos.
Timo Sirainen <tss@iki.fi>
parents: 9431
diff changeset
1044 unsigned int i;
e18fb0a361ef lib-master: Fixed crashing on deinit when listening on fifos.
Timo Sirainen <tss@iki.fi>
parents: 9431
diff changeset
1045
11102
64bead0067b0 lib-master: Changed post-login process's client counting to make sense again.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
1046 if (service->stopping)
10264
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
1047 return;
7bdb5816f797 lib-master: Added master_service_stop_new_connections().
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
1048
9437
e18fb0a361ef lib-master: Fixed crashing on deinit when listening on fifos.
Timo Sirainen <tss@iki.fi>
parents: 9431
diff changeset
1049 for (i = 0; i < service->socket_count; i++) {
e18fb0a361ef lib-master: Fixed crashing on deinit when listening on fifos.
Timo Sirainen <tss@iki.fi>
parents: 9431
diff changeset
1050 struct master_service_listener *l = &service->listeners[i];
e18fb0a361ef lib-master: Fixed crashing on deinit when listening on fifos.
Timo Sirainen <tss@iki.fi>
parents: 9431
diff changeset
1051
22075
baa85b2663b5 lib-master: Replace listeners with /dev/null in SIGQUIT instead of closing
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22027
diff changeset
1052 if (l->io == NULL && l->fd != -1 && !l->closed) {
9437
e18fb0a361ef lib-master: Fixed crashing on deinit when listening on fifos.
Timo Sirainen <tss@iki.fi>
parents: 9431
diff changeset
1053 l->io = io_add(MASTER_LISTEN_FD_FIRST + i, IO_READ,
e18fb0a361ef lib-master: Fixed crashing on deinit when listening on fifos.
Timo Sirainen <tss@iki.fi>
parents: 9431
diff changeset
1054 master_service_listen, l);
e18fb0a361ef lib-master: Fixed crashing on deinit when listening on fifos.
Timo Sirainen <tss@iki.fi>
parents: 9431
diff changeset
1055 }
e18fb0a361ef lib-master: Fixed crashing on deinit when listening on fifos.
Timo Sirainen <tss@iki.fi>
parents: 9431
diff changeset
1056 }
e18fb0a361ef lib-master: Fixed crashing on deinit when listening on fifos.
Timo Sirainen <tss@iki.fi>
parents: 9431
diff changeset
1057 }
e18fb0a361ef lib-master: Fixed crashing on deinit when listening on fifos.
Timo Sirainen <tss@iki.fi>
parents: 9431
diff changeset
1058
10199
9d13e9f78d52 lib-master: Fixes to handling master-login services.
Timo Sirainen <tss@iki.fi>
parents: 10194
diff changeset
1059 void master_service_io_listeners_remove(struct master_service *service)
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1060 {
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1061 unsigned int i;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1062
18951
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
1063 for (i = 0; i < service->socket_count; i++) {
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
1064 if (service->listeners[i].io != NULL)
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
1065 io_remove(&service->listeners[i].io);
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1066 }
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1067 }
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1068
14728
983c6ff12cc9 Moved ssl_* settings from login-common to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 14674
diff changeset
1069 void master_service_ssl_io_listeners_remove(struct master_service *service)
983c6ff12cc9 Moved ssl_* settings from login-common to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 14674
diff changeset
1070 {
983c6ff12cc9 Moved ssl_* settings from login-common to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 14674
diff changeset
1071 unsigned int i;
983c6ff12cc9 Moved ssl_* settings from login-common to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 14674
diff changeset
1072
18951
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
1073 for (i = 0; i < service->socket_count; i++) {
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
1074 if (service->listeners[i].io != NULL &&
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
1075 service->listeners[i].ssl)
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
1076 io_remove(&service->listeners[i].io);
14728
983c6ff12cc9 Moved ssl_* settings from login-common to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 14674
diff changeset
1077 }
983c6ff12cc9 Moved ssl_* settings from login-common to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 14674
diff changeset
1078 }
983c6ff12cc9 Moved ssl_* settings from login-common to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 14674
diff changeset
1079
10472
32949365f28d lib-master: Close listener fds when we stop accepting more connections.
Timo Sirainen <tss@iki.fi>
parents: 10440
diff changeset
1080 static void master_service_io_listeners_close(struct master_service *service)
32949365f28d lib-master: Close listener fds when we stop accepting more connections.
Timo Sirainen <tss@iki.fi>
parents: 10440
diff changeset
1081 {
32949365f28d lib-master: Close listener fds when we stop accepting more connections.
Timo Sirainen <tss@iki.fi>
parents: 10440
diff changeset
1082 unsigned int i;
32949365f28d lib-master: Close listener fds when we stop accepting more connections.
Timo Sirainen <tss@iki.fi>
parents: 10440
diff changeset
1083
18951
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
1084 /* close via listeners. some fds might be pipes that are
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
1085 currently handled as clients. we don't want to close them. */
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
1086 for (i = 0; i < service->socket_count; i++) {
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
1087 if (service->listeners[i].fd != -1) {
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
1088 if (close(service->listeners[i].fd) < 0) {
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
1089 i_error("close(listener %d) failed: %m",
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
1090 service->listeners[i].fd);
10472
32949365f28d lib-master: Close listener fds when we stop accepting more connections.
Timo Sirainen <tss@iki.fi>
parents: 10440
diff changeset
1091 }
18951
52368e60177c master: Changed passing of listener settings from master to process to be more flexible.
Timo Sirainen <tss@iki.fi>
parents: 18949
diff changeset
1092 service->listeners[i].fd = -1;
10472
32949365f28d lib-master: Close listener fds when we stop accepting more connections.
Timo Sirainen <tss@iki.fi>
parents: 10440
diff changeset
1093 }
32949365f28d lib-master: Close listener fds when we stop accepting more connections.
Timo Sirainen <tss@iki.fi>
parents: 10440
diff changeset
1094 }
32949365f28d lib-master: Close listener fds when we stop accepting more connections.
Timo Sirainen <tss@iki.fi>
parents: 10440
diff changeset
1095 }
32949365f28d lib-master: Close listener fds when we stop accepting more connections.
Timo Sirainen <tss@iki.fi>
parents: 10440
diff changeset
1096
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1097 static bool master_status_update_is_important(struct master_service *service)
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1098 {
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1099 if (service->master_status.available_count == 0)
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1100 return TRUE;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1101 if (!service->initial_status_sent)
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1102 return TRUE;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1103 return FALSE;
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1104 }
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1105
18939
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1106 static void
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1107 master_status_send(struct master_service *service, bool important_update)
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1108 {
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1109 ssize_t ret;
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1110
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1111 if (service->to_status != NULL)
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1112 timeout_remove(&service->to_status);
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1113
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1114 ret = write(MASTER_STATUS_FD, &service->master_status,
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1115 sizeof(service->master_status));
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1116 if (ret == sizeof(service->master_status)) {
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1117 /* success */
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1118 if (service->io_status_write != NULL) {
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1119 /* delayed important update sent successfully */
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1120 io_remove(&service->io_status_write);
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1121 }
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1122 service->last_sent_status_time = ioloop_time;
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1123 service->last_sent_status_avail_count =
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1124 service->master_status.available_count;
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1125 service->initial_status_sent = TRUE;
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1126 } else if (ret >= 0) {
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1127 /* shouldn't happen? */
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1128 i_error("write(master_status_fd) returned %d", (int)ret);
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1129 service->master_status.pid = 0;
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1130 } else if (errno != EAGAIN) {
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1131 /* failure */
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1132 if (errno != EPIPE)
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1133 i_error("write(master_status_fd) failed: %m");
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1134 service->master_status.pid = 0;
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1135 } else if (important_update) {
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1136 /* reader is busy, but it's important to get this notification
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1137 through. send it when possible. */
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1138 if (service->io_status_write == NULL) {
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1139 service->io_status_write =
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1140 io_add(MASTER_STATUS_FD, IO_WRITE,
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1141 master_status_update, service);
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1142 }
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1143 }
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1144 }
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1145
10194
40d8df2b4111 imap, pop3: Connection counting fixes.
Timo Sirainen <tss@iki.fi>
parents: 10188
diff changeset
1146 void master_status_update(struct master_service *service)
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1147 {
10833
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1148 bool important_update;
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1149
12372
4d91cec713cf lib-master: Added MASTER_SERVICE_FLAG_UPDATE_PROCTITLE for showing number of connections in ps.
Timo Sirainen <tss@iki.fi>
parents: 12348
diff changeset
1150 if ((service->flags & MASTER_SERVICE_FLAG_UPDATE_PROCTITLE) != 0 &&
4d91cec713cf lib-master: Added MASTER_SERVICE_FLAG_UPDATE_PROCTITLE for showing number of connections in ps.
Timo Sirainen <tss@iki.fi>
parents: 12348
diff changeset
1151 service->set != NULL && service->set->verbose_proctitle) T_BEGIN {
4d91cec713cf lib-master: Added MASTER_SERVICE_FLAG_UPDATE_PROCTITLE for showing number of connections in ps.
Timo Sirainen <tss@iki.fi>
parents: 12348
diff changeset
1152 unsigned int used_count = service->total_available_count -
4d91cec713cf lib-master: Added MASTER_SERVICE_FLAG_UPDATE_PROCTITLE for showing number of connections in ps.
Timo Sirainen <tss@iki.fi>
parents: 12348
diff changeset
1153 service->master_status.available_count;
4d91cec713cf lib-master: Added MASTER_SERVICE_FLAG_UPDATE_PROCTITLE for showing number of connections in ps.
Timo Sirainen <tss@iki.fi>
parents: 12348
diff changeset
1154
4d91cec713cf lib-master: Added MASTER_SERVICE_FLAG_UPDATE_PROCTITLE for showing number of connections in ps.
Timo Sirainen <tss@iki.fi>
parents: 12348
diff changeset
1155 process_title_set(t_strdup_printf("[%u connections]",
4d91cec713cf lib-master: Added MASTER_SERVICE_FLAG_UPDATE_PROCTITLE for showing number of connections in ps.
Timo Sirainen <tss@iki.fi>
parents: 12348
diff changeset
1156 used_count));
4d91cec713cf lib-master: Added MASTER_SERVICE_FLAG_UPDATE_PROCTITLE for showing number of connections in ps.
Timo Sirainen <tss@iki.fi>
parents: 12348
diff changeset
1157 } T_END;
4d91cec713cf lib-master: Added MASTER_SERVICE_FLAG_UPDATE_PROCTITLE for showing number of connections in ps.
Timo Sirainen <tss@iki.fi>
parents: 12348
diff changeset
1158
10833
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1159 important_update = master_status_update_is_important(service);
11516
67b8de25154c lib-master: Try to send master status more reliably.
Timo Sirainen <tss@iki.fi>
parents: 11458
diff changeset
1160 if (service->master_status.pid == 0 ||
10833
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1161 service->master_status.available_count ==
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1162 service->last_sent_status_avail_count) {
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1163 /* a) closed, b) updating to same state */
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1164 if (service->to_status != NULL)
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1165 timeout_remove(&service->to_status);
11516
67b8de25154c lib-master: Try to send master status more reliably.
Timo Sirainen <tss@iki.fi>
parents: 11458
diff changeset
1166 if (service->io_status_write != NULL)
67b8de25154c lib-master: Try to send master status more reliably.
Timo Sirainen <tss@iki.fi>
parents: 11458
diff changeset
1167 io_remove(&service->io_status_write);
10833
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1168 return;
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1169 }
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1170 if (ioloop_time == service->last_sent_status_time &&
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1171 !important_update) {
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1172 /* don't spam master */
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1173 if (service->to_status != NULL)
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1174 timeout_reset(service->to_status);
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1175 else {
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1176 service->to_status =
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1177 timeout_add(1000, master_status_update,
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1178 service);
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1179 }
11516
67b8de25154c lib-master: Try to send master status more reliably.
Timo Sirainen <tss@iki.fi>
parents: 11458
diff changeset
1180 if (service->io_status_write != NULL)
67b8de25154c lib-master: Try to send master status more reliably.
Timo Sirainen <tss@iki.fi>
parents: 11458
diff changeset
1181 io_remove(&service->io_status_write);
10833
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1182 return;
df4d4fd0db00 lib-master: Avoid sending status updates to master too often.
Timo Sirainen <tss@iki.fi>
parents: 10796
diff changeset
1183 }
18939
10df63e74ed6 lib-master: Code cleanup - split master_status_update() to two functions.
Timo Sirainen <tss@iki.fi>
parents: 18925
diff changeset
1184 master_status_send(service, important_update);
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9066
diff changeset
1185 }
11458
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
1186
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
1187 bool version_string_verify(const char *line, const char *service_name,
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
1188 unsigned major_version)
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
1189 {
16022
9a8eaf97559d lib-master: Added version_string_verify_full()
Timo Sirainen <tss@iki.fi>
parents: 15962
diff changeset
1190 unsigned int minor_version;
9a8eaf97559d lib-master: Added version_string_verify_full()
Timo Sirainen <tss@iki.fi>
parents: 15962
diff changeset
1191
9a8eaf97559d lib-master: Added version_string_verify_full()
Timo Sirainen <tss@iki.fi>
parents: 15962
diff changeset
1192 return version_string_verify_full(line, service_name,
9a8eaf97559d lib-master: Added version_string_verify_full()
Timo Sirainen <tss@iki.fi>
parents: 15962
diff changeset
1193 major_version, &minor_version);
9a8eaf97559d lib-master: Added version_string_verify_full()
Timo Sirainen <tss@iki.fi>
parents: 15962
diff changeset
1194 }
9a8eaf97559d lib-master: Added version_string_verify_full()
Timo Sirainen <tss@iki.fi>
parents: 15962
diff changeset
1195
9a8eaf97559d lib-master: Added version_string_verify_full()
Timo Sirainen <tss@iki.fi>
parents: 15962
diff changeset
1196 bool version_string_verify_full(const char *line, const char *service_name,
9a8eaf97559d lib-master: Added version_string_verify_full()
Timo Sirainen <tss@iki.fi>
parents: 15962
diff changeset
1197 unsigned major_version,
9a8eaf97559d lib-master: Added version_string_verify_full()
Timo Sirainen <tss@iki.fi>
parents: 15962
diff changeset
1198 unsigned int *minor_version_r)
9a8eaf97559d lib-master: Added version_string_verify_full()
Timo Sirainen <tss@iki.fi>
parents: 15962
diff changeset
1199 {
21322
5ab8dc1a4a6f global: Change string position/length from unsigned int to size_t
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21114
diff changeset
1200 size_t service_name_len = strlen(service_name);
11458
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
1201 bool ret;
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
1202
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
1203 if (strncmp(line, "VERSION\t", 8) != 0)
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
1204 return FALSE;
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
1205 line += 8;
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
1206
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
1207 if (strncmp(line, service_name, service_name_len) != 0 ||
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
1208 line[service_name_len] != '\t')
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
1209 return FALSE;
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
1210 line += service_name_len + 1;
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
1211
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
1212 T_BEGIN {
16022
9a8eaf97559d lib-master: Added version_string_verify_full()
Timo Sirainen <tss@iki.fi>
parents: 15962
diff changeset
1213 const char *p = strchr(line, '\t');
9a8eaf97559d lib-master: Added version_string_verify_full()
Timo Sirainen <tss@iki.fi>
parents: 15962
diff changeset
1214
9a8eaf97559d lib-master: Added version_string_verify_full()
Timo Sirainen <tss@iki.fi>
parents: 15962
diff changeset
1215 if (p == NULL)
9a8eaf97559d lib-master: Added version_string_verify_full()
Timo Sirainen <tss@iki.fi>
parents: 15962
diff changeset
1216 ret = FALSE;
9a8eaf97559d lib-master: Added version_string_verify_full()
Timo Sirainen <tss@iki.fi>
parents: 15962
diff changeset
1217 else {
9a8eaf97559d lib-master: Added version_string_verify_full()
Timo Sirainen <tss@iki.fi>
parents: 15962
diff changeset
1218 ret = str_uint_equals(t_strdup_until(line, p),
9a8eaf97559d lib-master: Added version_string_verify_full()
Timo Sirainen <tss@iki.fi>
parents: 15962
diff changeset
1219 major_version);
9a8eaf97559d lib-master: Added version_string_verify_full()
Timo Sirainen <tss@iki.fi>
parents: 15962
diff changeset
1220 if (str_to_uint(p+1, minor_version_r) < 0)
9a8eaf97559d lib-master: Added version_string_verify_full()
Timo Sirainen <tss@iki.fi>
parents: 15962
diff changeset
1221 ret = FALSE;
9a8eaf97559d lib-master: Added version_string_verify_full()
Timo Sirainen <tss@iki.fi>
parents: 15962
diff changeset
1222 }
11458
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
1223 } T_END;
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
1224 return ret;
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11388
diff changeset
1225 }