2017-05-24 11:57:15 +00:00
|
|
|
|
|
|
|
/*
|
2018-03-12 14:03:15 +00:00
|
|
|
* Odyssey.
|
2017-05-24 11:57:15 +00:00
|
|
|
*
|
2018-04-04 13:19:58 +00:00
|
|
|
* Scalable PostgreSQL connection pooler.
|
2020-04-02 11:00:56 +00:00
|
|
|
*/
|
2017-05-24 11:57:15 +00:00
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdarg.h>
|
2018-08-28 14:43:46 +00:00
|
|
|
#include <stdint.h>
|
2017-05-24 11:57:15 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
2018-08-28 14:43:46 +00:00
|
|
|
#include <ctype.h>
|
2017-05-31 15:47:15 +00:00
|
|
|
#include <inttypes.h>
|
2017-07-17 14:05:46 +00:00
|
|
|
#include <assert.h>
|
2017-05-24 11:57:15 +00:00
|
|
|
|
|
|
|
#include <machinarium.h>
|
2018-08-28 14:43:46 +00:00
|
|
|
#include <kiwi.h>
|
|
|
|
#include <odyssey.h>
|
2017-05-24 11:57:15 +00:00
|
|
|
|
2018-08-28 14:43:46 +00:00
|
|
|
void
|
|
|
|
od_config_init(od_config_t *config)
|
2017-05-24 11:57:15 +00:00
|
|
|
{
|
2020-07-21 18:29:50 +00:00
|
|
|
config->daemonize = 0;
|
|
|
|
config->priority = 0;
|
|
|
|
config->log_debug = 0;
|
|
|
|
config->log_to_stdout = 1;
|
|
|
|
config->log_config = 0;
|
|
|
|
config->log_session = 1;
|
|
|
|
config->log_query = 0;
|
|
|
|
config->log_file = NULL;
|
|
|
|
config->log_stats = 1;
|
|
|
|
config->stats_interval = 3;
|
|
|
|
config->log_format = NULL;
|
|
|
|
config->pid_file = NULL;
|
|
|
|
config->unix_socket_dir = NULL;
|
|
|
|
config->unix_socket_mode = NULL;
|
|
|
|
config->log_syslog = 0;
|
|
|
|
config->log_syslog_ident = NULL;
|
|
|
|
config->log_syslog_facility = NULL;
|
|
|
|
config->readahead = 8192;
|
|
|
|
config->nodelay = 1;
|
|
|
|
config->keepalive = 15;
|
|
|
|
config->keepalive_keep_interval = 5;
|
|
|
|
config->keepalive_probes = 3;
|
|
|
|
config->workers = 1;
|
|
|
|
config->resolvers = 1;
|
|
|
|
config->client_max_set = 0;
|
|
|
|
config->client_max = 0;
|
|
|
|
config->client_max_routing = 0;
|
|
|
|
config->server_login_retry = 1;
|
|
|
|
config->cache_coroutine = 0;
|
|
|
|
config->cache_msg_gc_size = 0;
|
|
|
|
config->coroutine_stack_size = 4;
|
2018-03-06 15:23:52 +00:00
|
|
|
od_list_init(&config->listen);
|
2017-05-24 11:57:15 +00:00
|
|
|
}
|
|
|
|
|
2019-10-15 14:15:37 +00:00
|
|
|
void
|
|
|
|
od_config_reload(od_config_t *current_config, od_config_t *new_config)
|
|
|
|
{
|
2020-04-02 11:00:56 +00:00
|
|
|
current_config->client_max = new_config->client_max;
|
2019-10-15 14:15:37 +00:00
|
|
|
current_config->client_max_routing = new_config->client_max_routing;
|
2020-01-23 05:30:31 +00:00
|
|
|
current_config->server_login_retry = new_config->server_login_retry;
|
2019-10-15 14:15:37 +00:00
|
|
|
}
|
|
|
|
|
2017-08-28 13:59:41 +00:00
|
|
|
static void
|
2020-04-02 11:00:56 +00:00
|
|
|
od_config_listen_free(od_config_listen_t *);
|
2017-08-28 13:59:41 +00:00
|
|
|
|
2018-08-28 14:43:46 +00:00
|
|
|
void
|
|
|
|
od_config_free(od_config_t *config)
|
2017-05-24 11:57:15 +00:00
|
|
|
{
|
|
|
|
od_list_t *i, *n;
|
2020-04-02 11:00:56 +00:00
|
|
|
od_list_foreach_safe(&config->listen, i, n)
|
|
|
|
{
|
2018-08-28 14:43:46 +00:00
|
|
|
od_config_listen_t *listen;
|
|
|
|
listen = od_container_of(i, od_config_listen_t, link);
|
|
|
|
od_config_listen_free(listen);
|
2017-08-28 13:59:41 +00:00
|
|
|
}
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->log_file)
|
|
|
|
free(config->log_file);
|
|
|
|
if (config->log_format)
|
|
|
|
free(config->log_format);
|
|
|
|
if (config->pid_file)
|
|
|
|
free(config->pid_file);
|
2018-07-02 15:41:17 +00:00
|
|
|
if (config->unix_socket_dir)
|
|
|
|
free(config->unix_socket_dir);
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->log_syslog_ident)
|
|
|
|
free(config->log_syslog_ident);
|
|
|
|
if (config->log_syslog_facility)
|
|
|
|
free(config->log_syslog_facility);
|
2017-08-28 13:59:41 +00:00
|
|
|
}
|
|
|
|
|
2020-04-02 11:00:56 +00:00
|
|
|
od_config_listen_t *
|
2018-08-28 14:43:46 +00:00
|
|
|
od_config_listen_add(od_config_t *config)
|
2017-08-28 13:59:41 +00:00
|
|
|
{
|
2018-08-28 14:43:46 +00:00
|
|
|
od_config_listen_t *listen;
|
2020-04-02 11:00:56 +00:00
|
|
|
listen = (od_config_listen_t *)malloc(sizeof(*listen));
|
2017-08-28 13:59:41 +00:00
|
|
|
if (listen == NULL)
|
|
|
|
return NULL;
|
|
|
|
memset(listen, 0, sizeof(*listen));
|
2020-04-02 11:00:56 +00:00
|
|
|
listen->port = 6432;
|
|
|
|
listen->backlog = 128;
|
2019-12-01 18:21:23 +00:00
|
|
|
listen->client_login_timeout = 15000;
|
2017-08-28 13:59:41 +00:00
|
|
|
od_list_init(&listen->link);
|
2018-03-06 15:23:52 +00:00
|
|
|
od_list_append(&config->listen, &listen->link);
|
2017-08-28 13:59:41 +00:00
|
|
|
return listen;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2018-08-28 14:43:46 +00:00
|
|
|
od_config_listen_free(od_config_listen_t *config)
|
2017-08-28 13:59:41 +00:00
|
|
|
{
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->host)
|
|
|
|
free(config->host);
|
|
|
|
if (config->tls)
|
|
|
|
free(config->tls);
|
|
|
|
if (config->tls_ca_file)
|
|
|
|
free(config->tls_ca_file);
|
|
|
|
if (config->tls_key_file)
|
|
|
|
free(config->tls_key_file);
|
|
|
|
if (config->tls_cert_file)
|
|
|
|
free(config->tls_cert_file);
|
|
|
|
if (config->tls_protocols)
|
|
|
|
free(config->tls_protocols);
|
|
|
|
free(config);
|
2017-05-24 11:57:15 +00:00
|
|
|
}
|
|
|
|
|
2018-08-28 14:43:46 +00:00
|
|
|
int
|
|
|
|
od_config_validate(od_config_t *config, od_logger_t *logger)
|
2017-05-24 11:57:15 +00:00
|
|
|
{
|
2017-08-31 14:14:58 +00:00
|
|
|
/* workers */
|
2018-11-14 13:14:13 +00:00
|
|
|
if (config->workers <= 0) {
|
2017-09-21 13:44:19 +00:00
|
|
|
od_error(logger, "config", NULL, NULL, "bad workers number");
|
2017-08-31 14:14:58 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2018-02-26 14:29:10 +00:00
|
|
|
/* resolvers */
|
2018-11-14 13:14:13 +00:00
|
|
|
if (config->resolvers <= 0) {
|
2018-02-26 14:29:10 +00:00
|
|
|
od_error(logger, "config", NULL, NULL, "bad resolvers number");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2018-06-04 11:51:13 +00:00
|
|
|
/* coroutine_stack_size */
|
2018-06-05 10:02:58 +00:00
|
|
|
if (config->coroutine_stack_size < 4) {
|
2020-04-02 11:00:56 +00:00
|
|
|
od_error(
|
|
|
|
logger, "config", NULL, NULL, "bad coroutine_stack_size number");
|
2018-06-04 11:51:13 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2017-07-27 12:06:59 +00:00
|
|
|
/* log format */
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->log_format == NULL) {
|
2017-09-21 13:44:19 +00:00
|
|
|
od_error(logger, "config", NULL, NULL, "log is not defined");
|
|
|
|
return -1;
|
2017-07-27 12:06:59 +00:00
|
|
|
}
|
|
|
|
|
2018-07-03 13:02:46 +00:00
|
|
|
/* unix_socket_mode */
|
|
|
|
if (config->unix_socket_dir) {
|
|
|
|
if (config->unix_socket_mode == NULL) {
|
2020-04-02 11:00:56 +00:00
|
|
|
od_error(
|
|
|
|
logger, "config", NULL, NULL, "unix_socket_mode is not set");
|
2018-07-03 13:02:46 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-05-24 11:57:15 +00:00
|
|
|
/* listen */
|
2018-03-06 15:23:52 +00:00
|
|
|
if (od_list_empty(&config->listen)) {
|
2017-09-21 13:44:19 +00:00
|
|
|
od_error(logger, "config", NULL, NULL, "no listen servers defined");
|
2017-07-13 12:18:46 +00:00
|
|
|
return -1;
|
|
|
|
}
|
2018-08-28 14:43:46 +00:00
|
|
|
|
2017-08-29 14:43:41 +00:00
|
|
|
od_list_t *i;
|
2018-08-28 14:43:46 +00:00
|
|
|
od_list_foreach(&config->listen, i)
|
|
|
|
{
|
|
|
|
od_config_listen_t *listen;
|
|
|
|
listen = od_container_of(i, od_config_listen_t, link);
|
2017-08-29 14:43:41 +00:00
|
|
|
if (listen->host == NULL) {
|
2018-07-02 15:41:17 +00:00
|
|
|
if (config->unix_socket_dir == NULL) {
|
2020-04-02 11:00:56 +00:00
|
|
|
od_error(
|
|
|
|
logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
"listen host is not set and no unix_socket_dir is specified");
|
2018-07-02 15:41:17 +00:00
|
|
|
return -1;
|
|
|
|
}
|
2017-05-24 11:57:15 +00:00
|
|
|
}
|
2018-07-02 15:41:17 +00:00
|
|
|
|
2017-08-29 14:43:41 +00:00
|
|
|
/* tls */
|
|
|
|
if (listen->tls) {
|
|
|
|
if (strcmp(listen->tls, "disable") == 0) {
|
2018-12-06 14:23:15 +00:00
|
|
|
listen->tls_mode = OD_CONFIG_TLS_DISABLE;
|
2020-04-02 11:00:56 +00:00
|
|
|
} else if (strcmp(listen->tls, "allow") == 0) {
|
2018-12-06 14:23:15 +00:00
|
|
|
listen->tls_mode = OD_CONFIG_TLS_ALLOW;
|
2020-04-02 11:00:56 +00:00
|
|
|
} else if (strcmp(listen->tls, "require") == 0) {
|
2018-12-06 14:23:15 +00:00
|
|
|
listen->tls_mode = OD_CONFIG_TLS_REQUIRE;
|
2020-04-02 11:00:56 +00:00
|
|
|
} else if (strcmp(listen->tls, "verify_ca") == 0) {
|
2018-12-06 14:23:15 +00:00
|
|
|
listen->tls_mode = OD_CONFIG_TLS_VERIFY_CA;
|
2020-04-02 11:00:56 +00:00
|
|
|
} else if (strcmp(listen->tls, "verify_full") == 0) {
|
2018-12-06 14:23:15 +00:00
|
|
|
listen->tls_mode = OD_CONFIG_TLS_VERIFY_FULL;
|
2017-08-29 14:43:41 +00:00
|
|
|
} else {
|
2017-09-21 13:44:19 +00:00
|
|
|
od_error(logger, "config", NULL, NULL, "unknown tls mode");
|
2017-08-29 14:43:41 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
2017-05-24 11:57:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-04-02 11:00:56 +00:00
|
|
|
static inline char *
|
|
|
|
od_config_yes_no(int value)
|
|
|
|
{
|
2017-06-01 09:45:49 +00:00
|
|
|
return value ? "yes" : "no";
|
|
|
|
}
|
|
|
|
|
2018-08-28 14:43:46 +00:00
|
|
|
void
|
2018-12-06 14:23:15 +00:00
|
|
|
od_config_print(od_config_t *config, od_logger_t *logger)
|
2017-05-24 11:57:15 +00:00
|
|
|
{
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
2018-06-04 11:51:13 +00:00
|
|
|
"daemonize %s",
|
2018-03-06 15:23:52 +00:00
|
|
|
od_config_yes_no(config->daemonize));
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
"priority %d",
|
|
|
|
config->priority);
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->pid_file)
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
"pid_file %s",
|
|
|
|
config->pid_file);
|
2018-07-03 13:02:46 +00:00
|
|
|
if (config->unix_socket_dir) {
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
"unix_socket_dir %s",
|
|
|
|
config->unix_socket_dir);
|
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
"unix_socket_mode %s",
|
|
|
|
config->unix_socket_mode);
|
2018-07-03 13:02:46 +00:00
|
|
|
}
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->log_format)
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
"log_format %s",
|
|
|
|
config->log_format);
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->log_file)
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
"log_file %s",
|
|
|
|
config->log_file);
|
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
2018-06-04 11:51:13 +00:00
|
|
|
"log_to_stdout %s",
|
2018-03-06 15:23:52 +00:00
|
|
|
od_config_yes_no(config->log_to_stdout));
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
2018-06-04 11:51:13 +00:00
|
|
|
"log_syslog %s",
|
2018-03-06 15:23:52 +00:00
|
|
|
od_config_yes_no(config->log_syslog));
|
|
|
|
if (config->log_syslog_ident)
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
"log_syslog_ident %s",
|
|
|
|
config->log_syslog_ident);
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->log_syslog_facility)
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
"log_syslog_facility %s",
|
|
|
|
config->log_syslog_facility);
|
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
2018-06-04 11:51:13 +00:00
|
|
|
"log_debug %s",
|
2018-03-06 15:23:52 +00:00
|
|
|
od_config_yes_no(config->log_debug));
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
2018-06-04 11:51:13 +00:00
|
|
|
"log_config %s",
|
2018-03-06 15:23:52 +00:00
|
|
|
od_config_yes_no(config->log_config));
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
2018-06-04 11:51:13 +00:00
|
|
|
"log_session %s",
|
2018-03-06 15:23:52 +00:00
|
|
|
od_config_yes_no(config->log_session));
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
2018-06-04 11:51:13 +00:00
|
|
|
"log_query %s",
|
2018-03-06 15:23:52 +00:00
|
|
|
od_config_yes_no(config->log_query));
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
2018-06-04 11:51:13 +00:00
|
|
|
"log_stats %s",
|
2018-03-06 15:23:52 +00:00
|
|
|
od_config_yes_no(config->log_stats));
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
"stats_interval %d",
|
|
|
|
config->stats_interval);
|
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
"readahead %d",
|
|
|
|
config->readahead);
|
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
2018-06-04 11:51:13 +00:00
|
|
|
"nodelay %s",
|
2018-03-06 15:23:52 +00:00
|
|
|
od_config_yes_no(config->nodelay));
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
"keepalive %d",
|
|
|
|
config->keepalive);
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->client_max_set)
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
"client_max %d",
|
|
|
|
config->client_max);
|
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
"client_max_routing %d",
|
|
|
|
config->client_max_routing);
|
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
"server_login_retry %d",
|
|
|
|
config->server_login_retry);
|
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
"cache_msg_gc_size %d",
|
|
|
|
config->cache_msg_gc_size);
|
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
"cache_coroutine %d",
|
|
|
|
config->cache_coroutine);
|
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
"coroutine_stack_size %d",
|
|
|
|
config->coroutine_stack_size);
|
|
|
|
od_log(
|
|
|
|
logger, "config", NULL, NULL, "workers %d", config->workers);
|
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
"resolvers %d",
|
|
|
|
config->resolvers);
|
2017-09-21 13:44:19 +00:00
|
|
|
od_log(logger, "config", NULL, NULL, "");
|
2017-05-24 11:57:15 +00:00
|
|
|
od_list_t *i;
|
2018-03-06 15:23:52 +00:00
|
|
|
od_list_foreach(&config->listen, i)
|
2017-09-21 13:44:19 +00:00
|
|
|
{
|
2018-08-28 14:43:46 +00:00
|
|
|
od_config_listen_t *listen;
|
|
|
|
listen = od_container_of(i, od_config_listen_t, link);
|
2017-09-21 13:44:19 +00:00
|
|
|
od_log(logger, "config", NULL, NULL, "listen");
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
" host %s",
|
|
|
|
listen->host ? listen->host : "<unix socket>");
|
|
|
|
od_log(
|
|
|
|
logger, "config", NULL, NULL, " port %d", listen->port);
|
|
|
|
od_log(
|
|
|
|
logger, "config", NULL, NULL, " backlog %d", listen->backlog);
|
2017-08-29 14:43:41 +00:00
|
|
|
if (listen->tls)
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(
|
|
|
|
logger, "config", NULL, NULL, " tls %s", listen->tls);
|
2017-08-29 14:43:41 +00:00
|
|
|
if (listen->tls_ca_file)
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
" tls_ca_file %s",
|
|
|
|
listen->tls_ca_file);
|
2017-08-29 14:43:41 +00:00
|
|
|
if (listen->tls_key_file)
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
" tls_key_file %s",
|
|
|
|
listen->tls_key_file);
|
2017-08-29 14:43:41 +00:00
|
|
|
if (listen->tls_cert_file)
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
" tls_cert_file %s",
|
|
|
|
listen->tls_cert_file);
|
2017-08-29 14:43:41 +00:00
|
|
|
if (listen->tls_protocols)
|
2020-04-02 11:00:56 +00:00
|
|
|
od_log(logger,
|
|
|
|
"config",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
" tls_protocols %s",
|
|
|
|
listen->tls_protocols);
|
2017-09-21 13:44:19 +00:00
|
|
|
od_log(logger, "config", NULL, NULL, "");
|
2017-05-24 11:57:15 +00:00
|
|
|
}
|
|
|
|
}
|