auth_dest_service = imap
inet_listener {
- address = *, ::
port = 143
}
inet_listener {
- address = *, ::
port = 993
ssl = yes
}
auth_dest_service = pop3
inet_listener {
- address = *, ::
port = 110
}
inet_listener {
- address = *, ::
port = 995
ssl = yes
}
# Protocols we want to be serving.
#protocols = imap pop3 lmtp
+# A space separated list of IP or host addresses where to listen in for
+# connections. "*" listens in all IPv4 interfaces. "[::]" listens in all IPv6
+# interfaces. Use "*, [::]" for listening both IPv4 and IPv6. If you want to
+# specify non-default ports or anything more complex, edit conf.d/master.conf.
+#listen = *
+
# Disable LOGIN command and all other plaintext authentications unless
# SSL/TLS is used (LOGINDISABLED capability). Note that if the remote IP
# matches the local IP (ie. you're connecting from the same computer), the
DEF(SET_STR, base_dir),
DEF(SET_STR, libexec_dir),
DEF(SET_STR, protocols),
+ DEF(SET_STR, listen),
DEF(SET_ENUM, ssl),
DEF(SET_UINT, default_process_limit),
DEF(SET_UINT, default_client_limit),
MEMBER(base_dir) PKG_RUNDIR,
MEMBER(libexec_dir) PKG_LIBEXECDIR,
MEMBER(protocols) "imap pop3 lmtp",
+ MEMBER(listen) "*, ::",
MEMBER(ssl) "yes:no:required",
MEMBER(default_process_limit) 100,
MEMBER(default_client_limit) 1000,
const char *base_dir;
const char *libexec_dir;
const char *protocols;
+ const char *listen;
const char *ssl;
unsigned int default_process_limit;
unsigned int default_client_limit;
fd = net_listen(&l->set.inetset.ip, &port, 128);
if (fd < 0) {
service_error(service, "listen(%s, %u) failed: %m",
- set->address, set->port);
+ l->inet_address, set->port);
return errno == EADDRINUSE ? 0 : -1;
}
net_set_nonblock(fd, TRUE);
l->type = SERVICE_LISTENER_INET;
l->fd = -1;
l->set.inetset.set = set;
+ l->inet_address = p_strdup(service->list->pool, address);
if (resolve_ip(address, &l->set.inetset.ip, error_r) < 0)
return NULL;
const char **error_r)
{
static struct service_listener *l;
- const char *const *tmp;
+ const char *const *tmp, *addresses;
bool ssl_disabled = strcmp(service->set->master_set->ssl, "no") == 0;
- tmp = t_strsplit_spaces(set->address, ", ");
+ if (*set->address != '\0')
+ addresses = set->address;
+ else {
+ /* use the default listen address */
+ addresses = service->set->master_set->listen;
+ }
+
+ tmp = t_strsplit_spaces(addresses, ", ");
for (; *tmp != NULL; tmp++) {
if (set->ssl && ssl_disabled)
continue;
int fd; /* may be -1 */
struct io *io;
+ const char *inet_address;
+
union {
struct {
const struct file_listener_settings *set;