annotate src/master/listener.c @ 9354:687ac828b964 HEAD

lib-index: modseqs weren't tracked properly within session when changes were done.
author Timo Sirainen <tss@iki.fi>
date Tue, 01 Sep 2009 13:05:03 -0400
parents 1877cf23eec7
children 00cd9aacd03c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8590
b9faf4db2a9f Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents: 7561
diff changeset
1 /* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
5887
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "common.h"
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "array.h"
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "ioloop.h"
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "fd-close-on-exec.h"
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "listener.h"
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include <stdlib.h>
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include <unistd.h>
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 static void resolve_ip(const char *set_name, const char *name,
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 struct ip_addr *ip, unsigned int *port)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 struct ip_addr *ip_list;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 const char *p;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 unsigned int ips_count;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 int ret;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 if (*name == '\0') {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 /* defaults to "*" or "[::]" */
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 ip->family = 0;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 return;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 if (name[0] == '[') {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 /* IPv6 address */
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 p = strchr(name, ']');
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 if (p == NULL) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 i_fatal("%s: Missing ']' in address %s",
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 set_name, name);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 name = t_strdup_until(name+1, p);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 p++;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 if (*p == '\0')
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 p = NULL;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 else if (*p != ':') {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 i_fatal("%s: Invalid data after ']' in address %s",
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 set_name, name);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 }
9103
1877cf23eec7 Give a better error message when trying to listen on IPv6 address and IPv6 is disabled.
Timo Sirainen <tss@iki.fi>
parents: 8632
diff changeset
42 #ifndef HAVE_IPV6
1877cf23eec7 Give a better error message when trying to listen on IPv6 address and IPv6 is disabled.
Timo Sirainen <tss@iki.fi>
parents: 8632
diff changeset
43 i_fatal("%s: Compiled without IPv6 support, can't listen on %s",
1877cf23eec7 Give a better error message when trying to listen on IPv6 address and IPv6 is disabled.
Timo Sirainen <tss@iki.fi>
parents: 8632
diff changeset
44 set_name, name);
1877cf23eec7 Give a better error message when trying to listen on IPv6 address and IPv6 is disabled.
Timo Sirainen <tss@iki.fi>
parents: 8632
diff changeset
45 #endif
5887
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 } else {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 p = strrchr(name, ':');
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 if (p != NULL)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 name = t_strdup_until(name, p);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 if (p != NULL) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 if (!is_numeric(p+1, '\0')) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 i_fatal("%s: Invalid port in address %s",
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 set_name, name);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 *port = atoi(p+1);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 if (strcmp(name, "*") == 0) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 /* IPv4 any */
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 net_get_ip_any4(ip);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 return;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 if (strcmp(name, "::") == 0) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 /* IPv6 any */
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 net_get_ip_any6(ip);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 return;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 /* Return the first IP if there happens to be multiple. */
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 ret = net_gethostbyname(name, &ip_list, &ips_count);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 if (ret != 0) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 i_fatal("%s: Can't resolve address %s: %s",
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 set_name, name, net_gethosterror(ret));
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 if (ips_count < 1)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 i_fatal("%s: No IPs for address: %s", set_name, name);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 *ip = ip_list[0];
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 static void
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 check_conflicts_set(const struct settings *set, const struct ip_addr *ip,
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 unsigned int port, const char *name1, const char *name2)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 const struct listener *listens = NULL;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 unsigned int i, count;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 if (array_is_created(&set->listens))
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 listens = array_get(&set->listens, &count);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 else
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 count = 0;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 for (i = 0; i < count; i++) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 if (listens[i].fd <= 0 || listens[i].port != port ||
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 !net_ip_compare(&listens[i].ip, ip))
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 continue;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 i_fatal("Protocols %s and %s are listening in same ip/port",
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 name1, name2);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 if (array_is_created(&set->ssl_listens))
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 listens = array_get(&set->ssl_listens, &count);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 else
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 count = 0;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 for (i = 0; i < count; i++) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 if (listens[i].fd <= 0 || listens[i].port != port ||
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 !net_ip_compare(&listens[i].ip, ip))
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 continue;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 i_fatal("Protocols %ss and %ss are listening in same ip/port",
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 name1, name2);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 static void check_conflicts(const struct ip_addr *ip, unsigned int port,
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 const char *proto)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 struct server_settings *server;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 for (server = settings_root; server != NULL; server = server->next) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 if (server->imap != NULL) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 check_conflicts_set(server->imap, ip, port,
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 "imap", proto);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 if (server->pop3 != NULL) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 check_conflicts_set(server->pop3, ip, port,
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 "pop3", proto);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 static void
7561
1a58b18652a6 Avoid using shadow variables. Unfortunately -Wshadow also complains about
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
137 listener_init(const char *set_name, const char *listen_list,
5887
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 unsigned int default_port, ARRAY_TYPE(listener) *listens_arr)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 const char *const *tmp;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 struct listener l, *listens;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 unsigned int i, count;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 if (!array_is_created(listens_arr))
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 i_array_init(listens_arr, 4);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 listens = array_get_modifiable(listens_arr, &count);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 for (i = 0; i < count; i++)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 listens[i].wanted = FALSE;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 memset(&l, 0, sizeof(l));
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 l.fd = -1;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 l.wanted = TRUE;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154
7561
1a58b18652a6 Avoid using shadow variables. Unfortunately -Wshadow also complains about
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
155 for (tmp = t_strsplit_spaces(listen_list, ", "); *tmp != NULL; tmp++) {
5887
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 l.port = default_port;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 resolve_ip(set_name, *tmp, &l.ip, &l.port);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 /* see if it already exists */
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 for (i = 0; i < count; i++) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 if (listens[i].port == l.port &&
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 net_ip_compare(&listens[i].ip, &l.ip)) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 listens[i].wanted = TRUE;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 break;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 if (i == count) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 array_append(listens_arr, &l, 1);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 listens = array_get_modifiable(listens_arr, &count);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 /* close unwanted fds */
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 for (i = 0; i < count; ) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 if (listens[i].wanted)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 i++;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 else {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 if (listens[i].fd > 0) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 if (close(listens[i].fd) < 0)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 i_error("close(listener) failed: %m");
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 array_delete(listens_arr, i, 1);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 listens = array_get_modifiable(listens_arr, &count);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 static void listener_close_fds(ARRAY_TYPE(listener) *listens_arr)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191 const struct listener *listens;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 unsigned int i, count;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 if (!array_is_created(listens_arr))
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 return;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 listens = array_get(listens_arr, &count);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 for (i = 0; i < count; i++) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 if (listens[i].fd > 0) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 if (close(listens[i].fd) < 0)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 i_error("close(listener) failed: %m");
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 array_free(listens_arr);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 static void listen_parse_and_close_unneeded(struct settings *set)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 const char *const *proto;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 unsigned int default_port;
7561
1a58b18652a6 Avoid using shadow variables. Unfortunately -Wshadow also complains about
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
211 bool nonssl_listen = FALSE, ssl_listen = FALSE;
5887
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 if (set == NULL)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 return;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 /* register wanted protocols */
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 proto = t_strsplit_spaces(set->protocols, " ");
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 for (; *proto != NULL; proto++) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 if (strcasecmp(*proto, "imap") == 0) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 if (set->protocol == MAIL_PROTOCOL_IMAP)
7561
1a58b18652a6 Avoid using shadow variables. Unfortunately -Wshadow also complains about
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
221 nonssl_listen = TRUE;
5887
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 } else if (strcasecmp(*proto, "imaps") == 0) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 if (set->protocol == MAIL_PROTOCOL_IMAP &&
8632
5a4fcfde3e91 Renamed "ssl_disable" setting to "ssl". Added support for ssl=required.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
224 strcmp(set->ssl, "no") != 0)
5887
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 ssl_listen = TRUE;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 } else if (strcasecmp(*proto, "pop3") == 0) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 if (set->protocol == MAIL_PROTOCOL_POP3)
7561
1a58b18652a6 Avoid using shadow variables. Unfortunately -Wshadow also complains about
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
228 nonssl_listen = TRUE;
5887
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 } else if (strcasecmp(*proto, "pop3s") == 0) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 if (set->protocol == MAIL_PROTOCOL_POP3 &&
8632
5a4fcfde3e91 Renamed "ssl_disable" setting to "ssl". Added support for ssl=required.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
231 strcmp(set->ssl, "no") != 0)
5887
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 ssl_listen = TRUE;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235
7561
1a58b18652a6 Avoid using shadow variables. Unfortunately -Wshadow also complains about
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
236 if (!nonssl_listen)
5887
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 listener_close_fds(&set->listens);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 else {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 default_port = set->protocol == MAIL_PROTOCOL_IMAP ? 143 : 110;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 listener_init("listen", set->listen, default_port,
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 &set->listens);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 if (!ssl_listen)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 listener_close_fds(&set->ssl_listens);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 else {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 default_port = set->protocol == MAIL_PROTOCOL_IMAP ? 993 : 995;
6572
79836b3474f4 Use "listen" setting for SSL listeners if "ssl_listen" is empty.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
247 listener_init("ssl_listen", *set->ssl_listen != '\0' ?
79836b3474f4 Use "listen" setting for SSL listeners if "ssl_listen" is empty.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
248 set->ssl_listen : set->listen, default_port,
5887
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 &set->ssl_listens);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 static void listen_copy_old(struct settings *old_set, struct settings *new_set)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 if (old_set == NULL || new_set == NULL) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 if (old_set != NULL) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 listener_close_fds(&old_set->listens);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258 listener_close_fds(&old_set->ssl_listens);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260 return;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 i_assert(!array_is_created(&new_set->listens));
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 i_assert(!array_is_created(&new_set->ssl_listens));
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 new_set->listens = old_set->listens;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 new_set->ssl_listens = old_set->ssl_listens;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 old_set->listens.arr.buffer = NULL;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 old_set->ssl_listens.arr.buffer = NULL;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 static void
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 listener_array_listen_missing(const char *proto,
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 ARRAY_TYPE(listener) *listens_arr, bool retry)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276 {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 struct listener *listens;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 unsigned int i, j, count;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 if (!array_is_created(listens_arr))
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 return;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 listens = array_get_modifiable(listens_arr, &count);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 for (i = 0; i < count; i++) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 if (listens[i].fd > 0)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 continue;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 for (j = 0; j < 10; j++) {
8593
3cccf56e802a Increase listen queues to handle high loads better.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
289 listens[i].fd = net_listen(&listens[i].ip,
3cccf56e802a Increase listen queues to handle high loads better.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
290 &listens[i].port, 128);
5887
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 if (listens[i].fd != -1)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 break;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 if (errno == EADDRINUSE) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 /* retry */
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296 } else if (errno == EINTR &&
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 io_loop_is_running(ioloop)) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 /* SIGHUPing sometimes gets us here.
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 we don't want to die. */
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 } else {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 /* error */
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 break;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 check_conflicts(&listens[i].ip, listens[i].port, proto);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 if (!retry)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 break;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309 /* wait a while and try again. we're SIGHUPing
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 so we most likely just closed it ourself.. */
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 sleep(1);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 if (listens[i].fd == -1) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 i_fatal("listen(%s, %d) failed: %m",
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316 net_ip2addr(&listens[i].ip), listens[i].port);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 net_set_nonblock(listens[i].fd, TRUE);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 fd_close_on_exec(listens[i].fd, TRUE);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323 static void
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 listener_listen_missing(struct settings *set, const char *proto, bool retry)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 listener_array_listen_missing(proto, &set->listens, retry);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327 listener_array_listen_missing(t_strconcat(proto, "s", NULL),
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 &set->ssl_listens, retry);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 void listeners_open_fds(struct server_settings *old_set, bool retry)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332 {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333 struct server_settings *server;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 for (server = settings_root; server != NULL; server = server->next) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336 if (old_set != NULL) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337 listen_copy_old(old_set->imap, server->imap);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 listen_copy_old(old_set->pop3, server->pop3);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 listen_parse_and_close_unneeded(server->imap);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341 listen_parse_and_close_unneeded(server->pop3);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 if (old_set != NULL)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 old_set = old_set->next;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347 for (server = settings_root; server != NULL; server = server->next) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 if (server->imap != NULL)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349 listener_listen_missing(server->imap, "imap", retry);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 if (server->pop3 != NULL)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 listener_listen_missing(server->pop3, "pop3", retry);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 void listeners_close_fds(void)
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356 {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
357 struct server_settings *server;
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359 for (server = settings_root; server != NULL; server = server->next) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 if (server->imap != NULL) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361 listener_close_fds(&server->imap->listens);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
362 listener_close_fds(&server->imap->ssl_listens);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
364 if (server->pop3 != NULL) {
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 listener_close_fds(&server->pop3->listens);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366 listener_close_fds(&server->pop3->ssl_listens);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369 }