Rename listen_address -> server_address and add reference counting.
This will be used by the upcoming relay mode.
This commit is contained in:
@@ -1417,7 +1417,7 @@ bad:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
create_listener(struct listen_address *addr)
|
create_listener(struct server_address *addr)
|
||||||
{
|
{
|
||||||
int flags, on, sock;
|
int flags, on, sock;
|
||||||
const char *family = "inet4";
|
const char *family = "inet4";
|
||||||
@@ -1502,7 +1502,7 @@ listener_cb(int fd, int what, void *v)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
register_listener(struct listen_address *addr, struct sudo_event_base *evbase)
|
register_listener(struct server_address *addr, struct sudo_event_base *evbase)
|
||||||
{
|
{
|
||||||
struct listener *l;
|
struct listener *l;
|
||||||
int sock;
|
int sock;
|
||||||
@@ -1533,7 +1533,7 @@ register_listener(struct listen_address *addr, struct sudo_event_base *evbase)
|
|||||||
static bool
|
static bool
|
||||||
server_setup(struct sudo_event_base *base)
|
server_setup(struct sudo_event_base *base)
|
||||||
{
|
{
|
||||||
struct listen_address *addr;
|
struct server_address *addr;
|
||||||
struct listener *l;
|
struct listener *l;
|
||||||
int nlisteners = 0;
|
int nlisteners = 0;
|
||||||
bool ret, config_tls = false;
|
bool ret, config_tls = false;
|
||||||
|
@@ -98,16 +98,16 @@ union sockaddr_union {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* List of listen addresses.
|
* List of server addresses.
|
||||||
*/
|
*/
|
||||||
struct listen_address {
|
struct server_address {
|
||||||
TAILQ_ENTRY(listen_address) entries;
|
TAILQ_ENTRY(server_address) entries;
|
||||||
char *sa_str;
|
char *sa_str;
|
||||||
union sockaddr_union sa_un;
|
union sockaddr_union sa_un;
|
||||||
socklen_t sa_size;
|
socklen_t sa_size;
|
||||||
bool tls;
|
bool tls;
|
||||||
};
|
};
|
||||||
TAILQ_HEAD(listen_address_list, listen_address);
|
TAILQ_HEAD(server_address_list, server_address);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* List of active network listeners.
|
* List of active network listeners.
|
||||||
@@ -151,7 +151,7 @@ void iolog_close_all(struct connection_closure *closure);
|
|||||||
bool logsrvd_conf_read(const char *path);
|
bool logsrvd_conf_read(const char *path);
|
||||||
const char *logsrvd_conf_iolog_dir(void);
|
const char *logsrvd_conf_iolog_dir(void);
|
||||||
const char *logsrvd_conf_iolog_file(void);
|
const char *logsrvd_conf_iolog_file(void);
|
||||||
struct listen_address_list *logsrvd_conf_listen_address(void);
|
struct server_address_list *logsrvd_conf_listen_address(void);
|
||||||
bool logsrvd_conf_tcp_keepalive(void);
|
bool logsrvd_conf_tcp_keepalive(void);
|
||||||
const char *logsrvd_conf_pid_file(void);
|
const char *logsrvd_conf_pid_file(void);
|
||||||
struct timespec *logsrvd_conf_get_sock_timeout(void);
|
struct timespec *logsrvd_conf_get_sock_timeout(void);
|
||||||
@@ -160,5 +160,7 @@ const struct logsrvd_tls_config *logsrvd_get_tls_config(void);
|
|||||||
struct logsrvd_tls_runtime *logsrvd_get_tls_runtime(void);
|
struct logsrvd_tls_runtime *logsrvd_get_tls_runtime(void);
|
||||||
#endif
|
#endif
|
||||||
mode_t logsrvd_conf_iolog_mode(void);
|
mode_t logsrvd_conf_iolog_mode(void);
|
||||||
|
void address_list_addref(struct server_address_list *);
|
||||||
|
void address_list_delref(struct server_address_list *);
|
||||||
|
|
||||||
#endif /* SUDO_LOGSRVD_H */
|
#endif /* SUDO_LOGSRVD_H */
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-License-Identifier: ISC
|
* SPDX-License-Identifier: ISC
|
||||||
*
|
*
|
||||||
* Copyright (c) 2019-2020 Todd C. Miller <Todd.Miller@sudo.ws>
|
* Copyright (c) 2019-2021 Todd C. Miller <Todd.Miller@sudo.ws>
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
@@ -76,9 +76,14 @@ struct logsrvd_config_section {
|
|||||||
struct logsrvd_config_entry *entries;
|
struct logsrvd_config_entry *entries;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct address_list_container {
|
||||||
|
unsigned int refcnt;
|
||||||
|
struct server_address_list addrs;
|
||||||
|
};
|
||||||
|
|
||||||
static struct logsrvd_config {
|
static struct logsrvd_config {
|
||||||
struct logsrvd_config_server {
|
struct logsrvd_config_server {
|
||||||
struct listen_address_list addresses;
|
struct address_list_container addresses;
|
||||||
struct timespec timeout;
|
struct timespec timeout;
|
||||||
bool tcp_keepalive;
|
bool tcp_keepalive;
|
||||||
char *pid_file;
|
char *pid_file;
|
||||||
@@ -136,10 +141,10 @@ logsrvd_conf_iolog_file(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* server getters */
|
/* server getters */
|
||||||
struct listen_address_list *
|
struct server_address_list *
|
||||||
logsrvd_conf_listen_address(void)
|
logsrvd_conf_listen_address(void)
|
||||||
{
|
{
|
||||||
return &logsrvd_config->server.addresses;
|
return &logsrvd_config->server.addresses.addrs;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
@@ -306,13 +311,13 @@ cb_iolog_maxseq(struct logsrvd_config *config, const char *str)
|
|||||||
|
|
||||||
/* Server callbacks */
|
/* Server callbacks */
|
||||||
static bool
|
static bool
|
||||||
cb_listen_address(struct logsrvd_config *config, const char *str)
|
append_address(struct server_address_list *addresses, const char *str)
|
||||||
{
|
{
|
||||||
struct addrinfo hints, *res, *res0 = NULL;
|
struct addrinfo hints, *res, *res0 = NULL;
|
||||||
char *copy, *host, *port;
|
char *copy, *host, *port;
|
||||||
bool tls, ret = false;
|
bool tls, ret = false;
|
||||||
int error;
|
int error;
|
||||||
debug_decl(cb_iolog_mode, SUDO_DEBUG_UTIL);
|
debug_decl(append_address, SUDO_DEBUG_UTIL);
|
||||||
|
|
||||||
if ((copy = strdup(str)) == NULL) {
|
if ((copy = strdup(str)) == NULL) {
|
||||||
sudo_warn(NULL);
|
sudo_warn(NULL);
|
||||||
@@ -344,7 +349,7 @@ cb_listen_address(struct logsrvd_config *config, const char *str)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
for (res = res0; res != NULL; res = res->ai_next) {
|
for (res = res0; res != NULL; res = res->ai_next) {
|
||||||
struct listen_address *addr;
|
struct server_address *addr;
|
||||||
|
|
||||||
if ((addr = malloc(sizeof(*addr))) == NULL) {
|
if ((addr = malloc(sizeof(*addr))) == NULL) {
|
||||||
sudo_warn(NULL);
|
sudo_warn(NULL);
|
||||||
@@ -358,7 +363,7 @@ cb_listen_address(struct logsrvd_config *config, const char *str)
|
|||||||
memcpy(&addr->sa_un, res->ai_addr, res->ai_addrlen);
|
memcpy(&addr->sa_un, res->ai_addr, res->ai_addrlen);
|
||||||
addr->sa_size = res->ai_addrlen;
|
addr->sa_size = res->ai_addrlen;
|
||||||
addr->tls = tls;
|
addr->tls = tls;
|
||||||
TAILQ_INSERT_TAIL(&config->server.addresses, addr, entries);
|
TAILQ_INSERT_TAIL(addresses, addr, entries);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = true;
|
ret = true;
|
||||||
@@ -369,6 +374,12 @@ done:
|
|||||||
debug_return_bool(ret);
|
debug_return_bool(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
cb_listen_address(struct logsrvd_config *config, const char *str)
|
||||||
|
{
|
||||||
|
return append_address(&config->server.addresses.addrs, str);
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
cb_timeout(struct logsrvd_config *config, const char *str)
|
cb_timeout(struct logsrvd_config *config, const char *str)
|
||||||
{
|
{
|
||||||
@@ -683,6 +694,29 @@ cb_logfile_time_format(struct logsrvd_config *config, const char *str)
|
|||||||
debug_return_bool(true);
|
debug_return_bool(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
address_list_addref(struct server_address_list *al)
|
||||||
|
{
|
||||||
|
struct address_list_container *container =
|
||||||
|
__containerof(al, struct address_list_container, addrs);
|
||||||
|
container->refcnt++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
address_list_delref(struct server_address_list *al)
|
||||||
|
{
|
||||||
|
struct address_list_container *container =
|
||||||
|
__containerof(al, struct address_list_container, addrs);
|
||||||
|
if (--container->refcnt == 0) {
|
||||||
|
struct server_address *addr;
|
||||||
|
while ((addr = TAILQ_FIRST(al))) {
|
||||||
|
TAILQ_REMOVE(al, addr, entries);
|
||||||
|
free(addr->sa_str);
|
||||||
|
free(addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static struct logsrvd_config_entry server_conf_entries[] = {
|
static struct logsrvd_config_entry server_conf_entries[] = {
|
||||||
{ "listen_address", cb_listen_address },
|
{ "listen_address", cb_listen_address },
|
||||||
{ "timeout", cb_timeout },
|
{ "timeout", cb_timeout },
|
||||||
@@ -891,18 +925,13 @@ logsrvd_conf_eventlog_setconf(struct logsrvd_config *config)
|
|||||||
void
|
void
|
||||||
logsrvd_conf_free(struct logsrvd_config *config)
|
logsrvd_conf_free(struct logsrvd_config *config)
|
||||||
{
|
{
|
||||||
struct listen_address *addr;
|
|
||||||
debug_decl(logsrvd_conf_free, SUDO_DEBUG_UTIL);
|
debug_decl(logsrvd_conf_free, SUDO_DEBUG_UTIL);
|
||||||
|
|
||||||
if (config == NULL)
|
if (config == NULL)
|
||||||
debug_return;
|
debug_return;
|
||||||
|
|
||||||
/* struct logsrvd_config_server */
|
/* struct logsrvd_config_server */
|
||||||
while ((addr = TAILQ_FIRST(&config->server.addresses))) {
|
address_list_delref(&config->server.addresses.addrs);
|
||||||
TAILQ_REMOVE(&config->server.addresses, addr, entries);
|
|
||||||
free(addr->sa_str);
|
|
||||||
free(addr);
|
|
||||||
}
|
|
||||||
free(config->server.pid_file);
|
free(config->server.pid_file);
|
||||||
|
|
||||||
/* struct logsrvd_config_iolog */
|
/* struct logsrvd_config_iolog */
|
||||||
@@ -945,7 +974,8 @@ logsrvd_conf_alloc(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Server defaults */
|
/* Server defaults */
|
||||||
TAILQ_INIT(&config->server.addresses);
|
TAILQ_INIT(&config->server.addresses.addrs);
|
||||||
|
config->server.addresses.refcnt = 1;
|
||||||
config->server.timeout.tv_sec = DEFAULT_SOCKET_TIMEOUT_SEC;
|
config->server.timeout.tv_sec = DEFAULT_SOCKET_TIMEOUT_SEC;
|
||||||
config->server.tcp_keepalive = true;
|
config->server.tcp_keepalive = true;
|
||||||
config->server.pid_file = strdup(_PATH_SUDO_LOGSRVD_PID);
|
config->server.pid_file = strdup(_PATH_SUDO_LOGSRVD_PID);
|
||||||
@@ -1036,7 +1066,7 @@ logsrvd_conf_apply(struct logsrvd_config *config)
|
|||||||
debug_decl(logsrvd_conf_apply, SUDO_DEBUG_UTIL);
|
debug_decl(logsrvd_conf_apply, SUDO_DEBUG_UTIL);
|
||||||
|
|
||||||
/* There can be multiple addresses so we can't set a default earlier. */
|
/* There can be multiple addresses so we can't set a default earlier. */
|
||||||
if (TAILQ_EMPTY(&config->server.addresses)) {
|
if (TAILQ_EMPTY(&config->server.addresses.addrs)) {
|
||||||
/* Enable plaintext listender. */
|
/* Enable plaintext listender. */
|
||||||
if (!cb_listen_address(config, "*:" DEFAULT_PORT))
|
if (!cb_listen_address(config, "*:" DEFAULT_PORT))
|
||||||
debug_return_bool(false);
|
debug_return_bool(false);
|
||||||
@@ -1047,10 +1077,10 @@ logsrvd_conf_apply(struct logsrvd_config *config)
|
|||||||
debug_return_bool(false);
|
debug_return_bool(false);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
struct listen_address *addr;
|
struct server_address *addr;
|
||||||
|
|
||||||
/* Check that TLS configuration is valid. */
|
/* Check that TLS configuration is valid. */
|
||||||
TAILQ_FOREACH(addr, &config->server.addresses, entries) {
|
TAILQ_FOREACH(addr, &config->server.addresses.addrs, entries) {
|
||||||
if (!addr->tls)
|
if (!addr->tls)
|
||||||
continue;
|
continue;
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user