as the connection fd and stop the listener. */
io_remove(&l->io);
conn.fd = dup(l->fd);
+ conn.listen_fd = l->fd;
if (conn.fd == -1) {
i_error("dup() failed: %m");
return;
}
- io_remove(&l->io);
}
conn.ssl = l->ssl;
net_set_nonblock(conn.fd, TRUE);
handshake.prefix_len);
*data += sizeof(handshake) + handshake.prefix_len;
}
- if (strcmp(log->prefix, MASTER_LOG_PREFIX_NAME) == 0) {
- if (log->fd != MASTER_LISTEN_FD_FIRST) {
- i_error("Received master prefix in handshake "
- "from non-master fd %d", log->fd);
- return FALSE;
- }
- log->master = TRUE;
+ if (strcmp(log->prefix, MASTER_LOG_PREFIX_NAME) == 0 && !log->master) {
+ i_error("Received master prefix in handshake "
+ "from non-master fd %d", log->fd);
+ return FALSE;
}
log->handshaked = TRUE;
return TRUE;
}
}
-struct log_connection *log_connection_create(int fd)
+struct log_connection *log_connection_create(int fd, bool master)
{
struct log_connection *log;
log->io = io_add(fd, IO_READ, log_connection_input, log);
log->clients = hash_table_create(default_pool, default_pool, 0,
NULL, NULL);
+ log->master = master;
array_idx_set(&logs_by_fd, fd, &log);
DLLIST_PREPEND(&log_connections, log);
#ifndef LOG_CONNECTION_H
#define LOG_CONNECTION_H
-struct log_connection *log_connection_create(int fd);
+struct log_connection *log_connection_create(int fd, bool master);
void log_connection_destroy(struct log_connection *log);
void log_connections_init(void);
static void client_connected(const struct master_service_connection *conn)
{
- log_connection_create(conn->fd);
+ bool master = conn->listen_fd == MASTER_LISTEN_FD_FIRST;
+
+ log_connection_create(conn->fd, master);
}
int main(int argc, char *argv[])