str = getenv("SOCKET_COUNT");
if (str != NULL)
service->socket_count = atoi(str);
+ str = getenv("SSL_SOCKET_COUNT");
+ if (str != NULL)
+ service->ssl_socket_count = atoi(str);
/* set up some kind of logging until we know exactly how and where
we want to log */
io_remove(&l->io);
conn.fd = l->fd;
}
+ conn.ssl = l->ssl;
l->service->master_status.available_count--;
master_status_update(l->service);
l->fd = MASTER_LISTEN_FD_FIRST + i;
l->io = io_add(MASTER_LISTEN_FD_FIRST + i, IO_READ,
master_service_listen, l);
+
+ if (i >= service->socket_count - service->ssl_socket_count)
+ l->ssl = TRUE;
}
}
{
struct service_listener *const *listeners;
ARRAY_TYPE(dup2) dups;
- unsigned int i, count, n = 0, socket_listener_count;
+ unsigned int i, count, n = 0, socket_listener_count, ssl_socket_count;
/* stdin/stdout is already redirected to /dev/null. Other master fds
should have been opened with fd_close_on_exec() so we don't have to
n += socket_listener_count;
}
+ /* first add non-ssl listeners */
for (i = 0; i < count; i++) {
- if (listeners[i]->fd == -1)
- continue;
-
- dup2_append(&dups, listeners[i]->fd,
- MASTER_LISTEN_FD_FIRST + n);
- n++; socket_listener_count++;
+ if (listeners[i]->fd != -1 &&
+ !listeners[i]->set.inetset.set->ssl) {
+ dup2_append(&dups, listeners[i]->fd,
+ MASTER_LISTEN_FD_FIRST + n);
+ n++; socket_listener_count++;
+ }
+ }
+ /* then ssl-listeners */
+ ssl_socket_count = 0;
+ for (i = 0; i < count; i++) {
+ if (listeners[i]->fd != -1 &&
+ listeners[i]->set.inetset.set->ssl) {
+ dup2_append(&dups, listeners[i]->fd,
+ MASTER_LISTEN_FD_FIRST + n);
+ n++; socket_listener_count++;
+ ssl_socket_count++;
+ }
}
dup2_append(&dups, null_fd, MASTER_RESERVED_FD);
service_error(service, "dup2s failed");
env_put(t_strdup_printf("SOCKET_COUNT=%d", socket_listener_count));
+ env_put(t_strdup_printf("SSL_SOCKET_COUNT=%d", ssl_socket_count));
}
static int validate_uid_gid(struct master_settings *set, uid_t uid, gid_t gid,