summaryrefslogtreecommitdiffstats
path: root/src/fastd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fastd.c')
-rw-r--r--src/fastd.c455
1 files changed, 229 insertions, 226 deletions
diff --git a/src/fastd.c b/src/fastd.c
index 47daada..2649ef2 100644
--- a/src/fastd.c
+++ b/src/fastd.c
@@ -58,6 +58,9 @@
#endif
+fastd_context_t ctx;
+
+
static volatile bool sighup = false;
static volatile bool terminate = false;
static volatile bool dump = false;
@@ -79,7 +82,7 @@ static void on_sigchld(int signo UNUSED) {
while (waitpid(-1, NULL, WNOHANG) > 0) {}
}
-static void init_signals(fastd_context_t *ctx) {
+static void init_signals(void) {
struct sigaction action;
action.sa_flags = 0;
@@ -90,56 +93,56 @@ static void init_signals(fastd_context_t *ctx) {
action.sa_handler = on_sighup;
if (sigaction(SIGHUP, &action, NULL))
- exit_errno(ctx, "sigaction");
+ exit_errno("sigaction");
action.sa_handler = on_terminate;
if (sigaction(SIGTERM, &action, NULL))
- exit_errno(ctx, "sigaction");
+ exit_errno("sigaction");
if (sigaction(SIGQUIT, &action, NULL))
- exit_errno(ctx, "sigaction");
+ exit_errno("sigaction");
if (sigaction(SIGINT, &action, NULL))
- exit_errno(ctx, "sigaction");
+ exit_errno("sigaction");
action.sa_handler = on_sigusr1;
if (sigaction(SIGUSR1, &action, NULL))
- exit_errno(ctx, "sigaction");
+ exit_errno("sigaction");
action.sa_handler = on_sigchld;
if (sigaction(SIGCHLD, &action, NULL))
- exit_errno(ctx, "sigaction");
+ exit_errno("sigaction");
action.sa_handler = SIG_IGN;
if (sigaction(SIGPIPE, &action, NULL))
- exit_errno(ctx, "sigaction");
+ exit_errno("sigaction");
if (sigaction(SIGTTIN, &action, NULL))
- exit_errno(ctx, "sigaction");
+ exit_errno("sigaction");
if (sigaction(SIGTTOU, &action, NULL))
- exit_errno(ctx, "sigaction");
+ exit_errno("sigaction");
}
-void fastd_open_pipe(fastd_context_t *ctx, int *readfd, int *writefd) {
+void fastd_open_pipe(int *readfd, int *writefd) {
int pipefd[2];
if (pipe(pipefd))
- exit_errno(ctx, "pipe");
+ exit_errno("pipe");
- fastd_setfd(ctx, pipefd[0], FD_CLOEXEC, 0);
- fastd_setfd(ctx, pipefd[1], FD_CLOEXEC, 0);
+ fastd_setfd(pipefd[0], FD_CLOEXEC, 0);
+ fastd_setfd(pipefd[1], FD_CLOEXEC, 0);
*readfd = pipefd[0];
*writefd = pipefd[1];
}
-static void init_log(fastd_context_t *ctx) {
+static void init_log(void) {
uid_t uid = geteuid();
gid_t gid = getegid();
if (conf.user || conf.group) {
if (setegid(conf.gid) < 0)
- pr_debug_errno(ctx, "setegid");
+ pr_debug_errno("setegid");
if (seteuid(conf.uid) < 0)
- pr_debug_errno(ctx, "seteuid");
+ pr_debug_errno("seteuid");
}
if (conf.log_syslog_level > LL_UNSPEC)
@@ -152,88 +155,88 @@ static void init_log(fastd_context_t *ctx) {
file->config = config;
file->fd = open(config->filename, O_WRONLY|O_APPEND|O_CREAT, 0600);
- file->next = ctx->log_files;
- ctx->log_files = file;
+ file->next = ctx.log_files;
+ ctx.log_files = file;
}
- ctx->log_initialized = true;
+ ctx.log_initialized = true;
if (seteuid(uid) < 0)
- pr_debug_errno(ctx, "seteuid");
+ pr_debug_errno("seteuid");
if (setegid(gid) < 0)
- pr_debug_errno(ctx, "setegid");
+ pr_debug_errno("setegid");
}
-static void close_log(fastd_context_t *ctx) {
- while (ctx->log_files) {
- fastd_log_fd_t *next = ctx->log_files->next;
+static void close_log(void) {
+ while (ctx.log_files) {
+ fastd_log_fd_t *next = ctx.log_files->next;
- close(ctx->log_files->fd);
- free(ctx->log_files);
+ close(ctx.log_files->fd);
+ free(ctx.log_files);
- ctx->log_files = next;
+ ctx.log_files = next;
}
closelog();
}
-static void init_sockets(fastd_context_t *ctx) {
- ctx->socks = malloc(conf.n_bind_addrs * sizeof(fastd_socket_t));
+static void init_sockets(void) {
+ ctx.socks = malloc(conf.n_bind_addrs * sizeof(fastd_socket_t));
unsigned i;
fastd_bind_address_t *addr = conf.bind_addrs;
for (i = 0; i < conf.n_bind_addrs; i++) {
- ctx->socks[i] = (fastd_socket_t){ .fd = -2, .addr = addr };
+ ctx.socks[i] = (fastd_socket_t){ .fd = -2, .addr = addr };
if (addr == conf.bind_addr_default_v4)
- ctx->sock_default_v4 = &ctx->socks[i];
+ ctx.sock_default_v4 = &ctx.socks[i];
if (addr == conf.bind_addr_default_v6)
- ctx->sock_default_v6 = &ctx->socks[i];
+ ctx.sock_default_v6 = &ctx.socks[i];
addr = addr->next;
}
- ctx->n_socks = conf.n_bind_addrs;
+ ctx.n_socks = conf.n_bind_addrs;
}
-void fastd_setfd(const fastd_context_t *ctx, int fd, int set, int unset) {
+void fastd_setfd(const int fd, int set, int unset) {
int flags = fcntl(fd, F_GETFD);
if (flags < 0)
- exit_errno(ctx, "Getting file descriptor flags failed: fcntl");
+ exit_errno("Getting file descriptor flags failed: fcntl");
if (fcntl(fd, F_SETFD, (flags|set) & (~unset)) < 0)
- exit_errno(ctx, "Setting file descriptor flags failed: fcntl");
+ exit_errno("Setting file descriptor flags failed: fcntl");
}
-void fastd_setfl(const fastd_context_t *ctx, int fd, int set, int unset) {
+void fastd_setfl(const int fd, int set, int unset) {
int flags = fcntl(fd, F_GETFL);
if (flags < 0)
- exit_errno(ctx, "Getting file status flags failed: fcntl");
+ exit_errno("Getting file status flags failed: fcntl");
if (fcntl(fd, F_SETFL, (flags|set) & (~unset)) < 0)
- exit_errno(ctx, "Setting file status flags failed: fcntl");
+ exit_errno("Setting file status flags failed: fcntl");
}
-static void close_sockets(fastd_context_t *ctx) {
+static void close_sockets(void) {
unsigned i;
- for (i = 0; i < ctx->n_socks; i++)
- fastd_socket_close(ctx, &ctx->socks[i]);
+ for (i = 0; i < ctx.n_socks; i++)
+ fastd_socket_close(&ctx.socks[i]);
- free(ctx->socks);
+ free(ctx.socks);
}
-static inline void handle_forward(fastd_context_t *ctx, fastd_peer_t *source_peer, fastd_buffer_t buffer) {
- fastd_eth_addr_t dest_addr = fastd_get_dest_address(ctx, buffer);
+static inline void handle_forward(fastd_peer_t *source_peer, fastd_buffer_t buffer) {
+ fastd_eth_addr_t dest_addr = fastd_get_dest_address(buffer);
if (fastd_eth_addr_is_unicast(dest_addr)) {
- fastd_peer_t *dest_peer = fastd_peer_find_by_eth_addr(ctx, dest_addr);
+ fastd_peer_t *dest_peer = fastd_peer_find_by_eth_addr(dest_addr);
if (dest_peer) {
if (dest_peer != source_peer)
- conf.protocol->send(ctx, dest_peer, buffer);
+ conf.protocol->send(dest_peer, buffer);
else
fastd_buffer_free(buffer);
@@ -241,50 +244,50 @@ static inline void handle_forward(fastd_context_t *ctx, fastd_peer_t *source_pee
}
}
- fastd_send_all(ctx, source_peer, buffer);
+ fastd_send_all(source_peer, buffer);
}
-void fastd_handle_receive(fastd_context_t *ctx, fastd_peer_t *peer, fastd_buffer_t buffer) {
+void fastd_handle_receive(fastd_peer_t *peer, fastd_buffer_t buffer) {
if (conf.mode == MODE_TAP) {
if (buffer.len < ETH_HLEN) {
- pr_debug(ctx, "received truncated packet");
+ pr_debug("received truncated packet");
fastd_buffer_free(buffer);
return;
}
- fastd_eth_addr_t src_addr = fastd_get_source_address(ctx, buffer);
+ fastd_eth_addr_t src_addr = fastd_get_source_address(buffer);
if (fastd_eth_addr_is_unicast(src_addr))
- fastd_peer_eth_addr_add(ctx, peer, src_addr);
+ fastd_peer_eth_addr_add(peer, src_addr);
}
- ctx->rx.packets++;
- ctx->rx.bytes += buffer.len;
+ ctx.rx.packets++;
+ ctx.rx.bytes += buffer.len;
- fastd_tuntap_write(ctx, buffer);
+ fastd_tuntap_write(buffer);
if (conf.mode == MODE_TAP && conf.forward) {
- handle_forward(ctx, peer, buffer);
+ handle_forward(peer, buffer);
return;
}
fastd_buffer_free(buffer);
}
-static inline void on_pre_up(fastd_context_t *ctx) {
- fastd_shell_command_exec(ctx, &conf.on_pre_up, NULL, NULL, NULL);
+static inline void on_pre_up(void) {
+ fastd_shell_command_exec(&conf.on_pre_up, NULL, NULL, NULL);
}
-static inline void on_up(fastd_context_t *ctx) {
- fastd_shell_command_exec(ctx, &conf.on_up, NULL, NULL, NULL);
+static inline void on_up(void) {
+ fastd_shell_command_exec(&conf.on_up, NULL, NULL, NULL);
}
-static inline void on_down(fastd_context_t *ctx) {
- fastd_shell_command_exec(ctx, &conf.on_down, NULL, NULL, NULL);
+static inline void on_down(void) {
+ fastd_shell_command_exec(&conf.on_down, NULL, NULL, NULL);
}
-static inline void on_post_down(fastd_context_t *ctx) {
- fastd_shell_command_exec(ctx, &conf.on_post_down, NULL, NULL, NULL);
+static inline void on_post_down(void) {
+ fastd_shell_command_exec(&conf.on_post_down, NULL, NULL, NULL);
}
static fastd_peer_group_t* init_peer_group(const fastd_peer_group_config_t *config, fastd_peer_group_t *parent) {
@@ -304,8 +307,8 @@ static fastd_peer_group_t* init_peer_group(const fastd_peer_group_config_t *conf
return ret;
}
-static void init_peer_groups(fastd_context_t *ctx) {
- ctx->peer_group = init_peer_group(conf.peer_group, NULL);
+static void init_peer_groups(void) {
+ ctx.peer_group = init_peer_group(conf.peer_group, NULL);
}
static void free_peer_group(fastd_peer_group_t *group) {
@@ -319,38 +322,38 @@ static void free_peer_group(fastd_peer_group_t *group) {
free(group);
}
-static void delete_peer_groups(fastd_context_t *ctx) {
- free_peer_group(ctx->peer_group);
+static void delete_peer_groups(void) {
+ free_peer_group(ctx.peer_group);
}
-static void init_peers(fastd_context_t *ctx) {
+static void init_peers(void) {
fastd_peer_config_t *peer_conf;
for (peer_conf = conf.peers; peer_conf; peer_conf = peer_conf->next)
- conf.protocol->peer_configure(ctx, peer_conf);
+ conf.protocol->peer_configure(peer_conf);
for (peer_conf = conf.peers; peer_conf; peer_conf = peer_conf->next) {
- bool enable = conf.protocol->peer_check(ctx, peer_conf);
+ bool enable = conf.protocol->peer_check(peer_conf);
if (enable && !peer_conf->enabled)
- fastd_peer_add(ctx, peer_conf);
+ fastd_peer_add(peer_conf);
peer_conf->enabled = enable;
}
size_t i;
- for (i = 0; i < VECTOR_LEN(ctx->peers);) {
- fastd_peer_t *peer = VECTOR_INDEX(ctx->peers, i);
+ for (i = 0; i < VECTOR_LEN(ctx.peers);) {
+ fastd_peer_t *peer = VECTOR_INDEX(ctx.peers, i);
if (peer->config) {
if (!peer->config->enabled) {
- pr_info(ctx, "previously enabled peer %P disabled, deleting.", peer);
- fastd_peer_delete(ctx, peer);
+ pr_info("previously enabled peer %P disabled, deleting.", peer);
+ fastd_peer_delete(peer);
continue;
}
}
else {
- if (!conf.protocol->peer_check_temporary(ctx, peer)) {
- fastd_peer_delete(ctx, peer);
+ if (!conf.protocol->peer_check_temporary(peer)) {
+ fastd_peer_delete(peer);
continue;
}
}
@@ -359,93 +362,93 @@ static void init_peers(fastd_context_t *ctx) {
}
}
-static void delete_peers(fastd_context_t *ctx) {
- while (VECTOR_LEN(ctx->peers))
- fastd_peer_delete(ctx, VECTOR_INDEX(ctx->peers, VECTOR_LEN(ctx->peers)-1));
+static void delete_peers(void) {
+ while (VECTOR_LEN(ctx.peers))
+ fastd_peer_delete(VECTOR_INDEX(ctx.peers, VECTOR_LEN(ctx.peers)-1));
}
-static void dump_state(fastd_context_t *ctx) {
- pr_info(ctx, "TX stats: %U packet(s), %U byte(s); dropped: %U packet(s), %U byte(s); error: %U packet(s), %U byte(s)",
- ctx->tx.packets, ctx->tx.bytes, ctx->tx_dropped.packets, ctx->tx_dropped.bytes, ctx->tx_error.packets, ctx->tx_error.bytes);
- pr_info(ctx, "RX stats: %U packet(s), %U byte(s)", ctx->rx.packets, ctx->rx.bytes);
+static void dump_state(void) {
+ pr_info("TX stats: %U packet(s), %U byte(s); dropped: %U packet(s), %U byte(s); error: %U packet(s), %U byte(s)",
+ ctx.tx.packets, ctx.tx.bytes, ctx.tx_dropped.packets, ctx.tx_dropped.bytes, ctx.tx_error.packets, ctx.tx_error.bytes);
+ pr_info("RX stats: %U packet(s), %U byte(s)", ctx.rx.packets, ctx.rx.bytes);
- pr_info(ctx, "dumping peers:");
+ pr_info("dumping peers:");
size_t i;
- for (i = 0; i < VECTOR_LEN(ctx->peers);) {
- fastd_peer_t *peer = VECTOR_INDEX(ctx->peers, i);
+ for (i = 0; i < VECTOR_LEN(ctx.peers);) {
+ fastd_peer_t *peer = VECTOR_INDEX(ctx.peers, i);
if (!fastd_peer_is_established(peer)) {
- pr_info(ctx, "peer %P not connected, address: %I", peer, &peer->address);
+ pr_info("peer %P not connected, address: %I", peer, &peer->address);
continue;
}
if (conf.mode == MODE_TAP) {
unsigned int eth_addresses = 0;
size_t i;
- for (i = 0; i < VECTOR_LEN(ctx->eth_addrs); i++) {
- if (VECTOR_INDEX(ctx->eth_addrs, i).peer == peer)
+ for (i = 0; i < VECTOR_LEN(ctx.eth_addrs); i++) {
+ if (VECTOR_INDEX(ctx.eth_addrs, i).peer == peer)
eth_addresses++;
}
- pr_info(ctx, "peer %P connected, address: %I, associated MAC addresses: %u", peer, &peer->address, eth_addresses);
+ pr_info("peer %P connected, address: %I, associated MAC addresses: %u", peer, &peer->address, eth_addresses);
}
else {
- pr_info(ctx, "peer %P connected, address: %I", peer, &peer->address);
+ pr_info("peer %P connected, address: %I", peer, &peer->address);
}
}
- pr_info(ctx, "dump finished.");
+ pr_info("dump finished.");
}
-static inline void no_valid_address_debug(fastd_context_t *ctx, const fastd_peer_t *peer) {
- pr_debug(ctx, "not sending a handshake to %P (no valid address resolved)", peer);
+static inline void no_valid_address_debug(const fastd_peer_t *peer) {
+ pr_debug("not sending a handshake to %P (no valid address resolved)", peer);
}
-static void send_handshake(fastd_context_t *ctx, fastd_peer_t *peer) {
+static void send_handshake(fastd_peer_t *peer) {
if (!fastd_peer_is_established(peer)) {
if (!peer->next_remote->n_addresses) {
- no_valid_address_debug(ctx, peer);
+ no_valid_address_debug(peer);
return;
}
- fastd_peer_claim_address(ctx, peer, NULL, NULL, &peer->next_remote->addresses[peer->next_remote->current_address]);
- fastd_peer_reset_socket(ctx, peer);
+ fastd_peer_claim_address(peer, NULL, NULL, &peer->next_remote->addresses[peer->next_remote->current_address]);
+ fastd_peer_reset_socket(peer);
}
if (!peer->sock)
return;
if (peer->address.sa.sa_family == AF_UNSPEC) {
- no_valid_address_debug(ctx, peer);
+ no_valid_address_debug(peer);
return;
}
- if (!fastd_timed_out(ctx, &peer->last_handshake_timeout)
+ if (!fastd_timed_out(&peer->last_handshake_timeout)
&& fastd_peer_address_equal(&peer->address, &peer->last_handshake_address)) {
- pr_debug(ctx, "not sending a handshake to %P as we sent one a short time ago", peer);
+ pr_debug("not sending a handshake to %P as we sent one a short time ago", peer);
return;
}
- pr_debug(ctx, "sending handshake to %P[%I]...", peer, &peer->address);
- peer->last_handshake_timeout = fastd_in_seconds(ctx, conf.min_handshake_interval);
+ pr_debug("sending handshake to %P[%I]...", peer, &peer->address);
+ peer->last_handshake_timeout = fastd_in_seconds(conf.min_handshake_interval);
peer->last_handshake_address = peer->address;
- conf.protocol->handshake_init(ctx, peer->sock, &peer->local_address, &peer->address, peer);
+ conf.protocol->handshake_init(peer->sock, &peer->local_address, &peer->address, peer);
}
-static void handle_handshake_queue(fastd_context_t *ctx) {
- if (!ctx->handshake_queue.next)
+static void handle_handshake_queue(void) {
+ if (!ctx.handshake_queue.next)
return;
- fastd_peer_t *peer = container_of(ctx->handshake_queue.next, fastd_peer_t, handshake_entry);
- if (!fastd_timed_out(ctx, &peer->next_handshake))
+ fastd_peer_t *peer = container_of(ctx.handshake_queue.next, fastd_peer_t, handshake_entry);
+ if (!fastd_timed_out(&peer->next_handshake))
return;
- fastd_peer_schedule_handshake_default(ctx, peer);
+ fastd_peer_schedule_handshake_default(peer);
- if (!fastd_peer_may_connect(ctx, peer)) {
+ if (!fastd_peer_may_connect(peer)) {
if (peer->next_remote != NULL) {
- pr_debug(ctx, "temporarily disabling handshakes with %P", peer);
+ pr_debug("temporarily disabling handshakes with %P", peer);
peer->next_remote = NULL;
}
@@ -453,7 +456,7 @@ static void handle_handshake_queue(fastd_context_t *ctx) {
}
if (peer->next_remote || fastd_peer_is_established(peer)) {
- send_handshake(ctx, peer);
+ send_handshake(peer);
if (fastd_peer_is_established(peer))
return;
@@ -470,27 +473,27 @@ static void handle_handshake_queue(fastd_context_t *ctx) {
peer->next_remote->current_address = 0;
if (fastd_remote_is_dynamic(peer->next_remote))
- fastd_resolve_peer(ctx, peer, peer->next_remote);
+ fastd_resolve_peer(peer, peer->next_remote);
}
-static void enable_temporaries(fastd_context_t *ctx) {
+static void enable_temporaries(void) {
size_t i;
- for (i = 0; i < VECTOR_LEN(ctx->peers_temp); i++)
- fastd_peer_enable_temporary(ctx, VECTOR_INDEX(ctx->peers_temp, i));
+ for (i = 0; i < VECTOR_LEN(ctx.peers_temp); i++)
+ fastd_peer_enable_temporary(VECTOR_INDEX(ctx.peers_temp, i));
- VECTOR_RESIZE(ctx->peers_temp, 0);
+ VECTOR_RESIZE(ctx.peers_temp, 0);
}
-static bool maintain_peer(fastd_context_t *ctx, fastd_peer_t *peer) {
+static bool maintain_peer(fastd_peer_t *peer) {
if (fastd_peer_is_temporary(peer) || fastd_peer_is_established(peer)) {
/* check for peer timeout */
- if (fastd_timed_out(ctx, &peer->timeout)) {
+ if (fastd_timed_out(&peer->timeout)) {
if (fastd_peer_is_temporary(peer)) {
- fastd_peer_delete(ctx, peer);
+ fastd_peer_delete(peer);
return false;
}
else {
- fastd_peer_reset(ctx, peer);
+ fastd_peer_reset(peer);
return true;
}
}
@@ -499,34 +502,34 @@ static bool maintain_peer(fastd_context_t *ctx, fastd_peer_t *peer) {
if (!fastd_peer_is_established(peer))
return true;
- if (!fastd_timed_out(ctx, &peer->keepalive_timeout))
+ if (!fastd_timed_out(&peer->keepalive_timeout))
return true;
- pr_debug2(ctx, "sending keepalive to %P", peer);
- conf.protocol->send(ctx, peer, fastd_buffer_alloc(ctx, 0, conf.min_encrypt_head_space, conf.min_encrypt_tail_space));
+ pr_debug2("sending keepalive to %P", peer);
+ conf.protocol->send(peer, fastd_buffer_alloc(0, conf.min_encrypt_head_space, conf.min_encrypt_tail_space));
}
return true;
}
-static void maintenance(fastd_context_t *ctx) {
- fastd_socket_handle_binds(ctx);
+static void maintenance(void) {
+ fastd_socket_handle_binds();
size_t i;
- for (i = 0; i < VECTOR_LEN(ctx->peers);) {
- fastd_peer_t *peer = VECTOR_INDEX(ctx->peers, i);
+ for (i = 0; i < VECTOR_LEN(ctx.peers);) {
+ fastd_peer_t *peer = VECTOR_INDEX(ctx.peers, i);
- if (maintain_peer(ctx, peer))
+ if (maintain_peer(peer))
i++;
}
- fastd_peer_eth_addr_cleanup(ctx);
+ fastd_peer_eth_addr_cleanup();
- ctx->next_maintenance.tv_sec += conf.maintenance_interval;
+ ctx.next_maintenance.tv_sec += conf.maintenance_interval;
}
-static void close_fds(fastd_context_t *ctx) {
+static void close_fds(void) {
struct rlimit rl;
int fd, maxfd;
@@ -543,12 +546,12 @@ static void close_fds(fastd_context_t *ctx) {
}
if (errno != EBADF)
- pr_error_errno(ctx, "close");
+ pr_error_errno("close");
}
}
}
-static void write_pid(fastd_context_t *ctx, pid_t pid) {
+static void write_pid(pid_t pid) {
if (!conf.pid_file)
return;
@@ -557,98 +560,98 @@ static void write_pid(fastd_context_t *ctx, pid_t pid) {
if (conf.user || conf.group) {
if (setegid(conf.gid) < 0)
- pr_debug_errno(ctx, "setegid");
+ pr_debug_errno("setegid");
if (seteuid(conf.uid) < 0)
- pr_debug_errno(ctx, "seteuid");
+ pr_debug_errno("seteuid");
}
int fd = open(conf.pid_file, O_WRONLY|O_CREAT|O_TRUNC, 0666);
if (fd < 0) {
- pr_error_errno(ctx, "can't write PID file: open");
+ pr_error_errno("can't write PID file: open");
goto end;
}
if (dprintf(fd, "%i", pid) < 0)
- pr_error_errno(ctx, "can't write PID file: dprintf");
+ pr_error_errno("can't write PID file: dprintf");
if (close(fd) < 0)
- pr_warn_errno(ctx, "close");
+ pr_warn_errno("close");
end:
if (seteuid(uid) < 0)
- pr_debug_errno(ctx, "seteuid");
+ pr_debug_errno("seteuid");
if (setegid(gid) < 0)
- pr_debug_errno(ctx, "setegid");
+ pr_debug_errno("setegid");
}
-static void set_user(fastd_context_t *ctx) {
+static void set_user(void) {
if (conf.user || conf.group) {
if (setgid(conf.gid) < 0)
- exit_errno(ctx, "setgid");
+ exit_errno("setgid");
if (setuid(conf.uid) < 0)
- exit_errno(ctx, "setuid");
+ exit_errno("setuid");
- pr_info(ctx, "Changed to UID %i, GID %i.", conf.uid, conf.gid);
+ pr_info("Changed to UID %i, GID %i.", conf.uid, conf.gid);
}
}
-static void set_groups(fastd_context_t *ctx) {
+static void set_groups(void) {
if (conf.groups) {
if (setgroups(conf.n_groups, conf.groups) < 0) {
if (errno != EPERM)
- pr_debug_errno(ctx, "setgroups");
+ pr_debug_errno("setgroups");
}
}
else if (conf.user || conf.group) {
if (setgroups(1, &conf.gid) < 0) {
if (errno != EPERM)
- pr_debug_errno(ctx, "setgroups");
+ pr_debug_errno("setgroups");
}
}
}
-static void drop_caps(fastd_context_t *ctx) {
- set_user(ctx);
- fastd_cap_drop(ctx);
+static void drop_caps(void) {
+ set_user();
+ fastd_cap_drop();
}
/* will double fork and forward potential exit codes from the child to the parent */
-static int daemonize(fastd_context_t *ctx) {
+static int daemonize(void) {
static const uint8_t ERROR_STATUS = 1;
uint8_t status = 1;
int parent_rpipe, parent_wpipe;
- fastd_open_pipe(ctx, &parent_rpipe, &parent_wpipe);
+ fastd_open_pipe(&parent_rpipe, &parent_wpipe);
pid_t fork1 = fork();
if (fork1 < 0) {
- exit_errno(ctx, "fork");
+ exit_errno("fork");
}
else if (fork1 == 0) {
/* child 1 */
if (close(parent_rpipe) < 0)
- pr_error_errno(ctx, "close");
+ pr_error_errno("close");
if (setsid() < 0)
- pr_error_errno(ctx, "setsid");
+ pr_error_errno("setsid");
int child_rpipe, child_wpipe;
- fastd_open_pipe(ctx, &child_rpipe, &child_wpipe);
+ fastd_open_pipe(&child_rpipe, &child_wpipe);
pid_t fork2 = fork();
if (fork2 < 0) {
write(parent_wpipe, &ERROR_STATUS, 1);
- exit_errno(ctx, "fork");
+ exit_errno("fork");
}
else if (fork2 == 0) {
/* child 2 */
if (close(child_rpipe) < 0 || close(parent_wpipe) < 0) {
write(child_wpipe, &ERROR_STATUS, 1);
- pr_error_errno(ctx, "close");
+ pr_error_errno("close");
}
return child_wpipe;
@@ -668,7 +671,7 @@ static int daemonize(fastd_context_t *ctx) {
if (ret < 0) {
write(child_wpipe, &ERROR_STATUS, 1);
- pr_error_errno(ctx, "waitpid");
+ pr_error_errno("waitpid");
}
if (WIFEXITED(child_status)) {
@@ -679,7 +682,7 @@ static int daemonize(fastd_context_t *ctx) {
else {
write(parent_wpipe, &ERROR_STATUS, 1);
if (WIFSIGNALED(child_status))
- exit_error(ctx, "child exited with signal %i", WTERMSIG(child_status));
+ exit_error("child exited with signal %i", WTERMSIG(child_status));
exit(1);
}
}
@@ -692,10 +695,10 @@ static int daemonize(fastd_context_t *ctx) {
action.sa_handler = SIG_IGN;
if (sigaction(SIGCHLD, &action, NULL))
- exit_errno(ctx, "sigaction");
+ exit_errno("sigaction");
if (read(parent_rpipe, &status, 1) < 0)
- exit_errno(ctx, "read");
+ exit_errno("read");
exit(status);
}
@@ -704,7 +707,7 @@ static int daemonize(fastd_context_t *ctx) {
}
#ifdef USE_SYSTEMD
-static void notify_systemd(fastd_context_t *ctx, const char *notify_socket) {
+static void notify_systemd(const char *notify_socket) {
int fd;
struct sockaddr_un sa = {};
@@ -722,20 +725,20 @@ static void notify_systemd(fastd_context_t *ctx, const char *notify_socket) {
sa.sun_path[0] = 0;
if (connect(fd, (struct sockaddr*)&sa, offsetof(struct sockaddr_un, sun_path) + strnlen(notify_socket, sizeof(sa.sun_path))) < 0) {
- pr_debug_errno(ctx, "unable to connect to notify socket: connect");
+ pr_debug_errno("unable to connect to notify socket: connect");
close(fd);
return;
}
dprintf(fd, "READY=1\nMAINPID=%lu", (unsigned long) getpid());
- pr_debug(ctx, "sent startup notification to systemd");
+ pr_debug("sent startup notification to systemd");
close(fd);
}
#endif
int main(int argc, char *argv[]) {
- fastd_context_t ctx = {};
+ memset(&ctx, 0, sizeof(ctx));
int status_fd = -1;
#ifdef USE_SYSTEMD
@@ -749,38 +752,38 @@ int main(int argc, char *argv[]) {
}
#endif
- close_fds(&ctx);
+ close_fds();
- fastd_random_bytes(&ctx, &ctx.randseed, sizeof(ctx.randseed), false);
+ fastd_random_bytes(&ctx.randseed, sizeof(ctx.randseed), false);
- fastd_configure(&ctx, argc, argv);
+ fastd_configure(argc, argv);
if (conf.verify_config) {
- fastd_config_verify(&ctx);
+ fastd_config_verify();
exit(0);
}
if (conf.generate_key) {
- conf.protocol->generate_key(&ctx);
+ conf.protocol->generate_key();
exit(0);
}
- conf.protocol_config = conf.protocol->init(&ctx);
+ conf.protocol_config = conf.protocol->init();
if (conf.show_key) {
conf.protocol->show_key();
exit(0);
}
- init_signals(&ctx);
+ init_signals();
if (conf.daemon)
- status_fd = daemonize(&ctx);
+ status_fd = daemonize();
if (chdir("/"))
- pr_error(&ctx, "can't chdir to `/': %s", strerror(errno));
+ pr_error("can't chdir to `/': %s", strerror(errno));
- init_log(&ctx);
+ init_log();
#ifdef HAVE_LIBSODIUM
sodium_init();
@@ -792,39 +795,39 @@ int main(int argc, char *argv[]) {
OPENSSL_config(NULL);
#endif
- fastd_config_check(&ctx);
+ fastd_config_check();
- fastd_update_time(&ctx);
+ fastd_update_time();
- ctx.next_maintenance = fastd_in_seconds(&ctx, conf.maintenance_interval);
+ ctx.next_maintenance = fastd_in_seconds(conf.maintenance_interval);
ctx.unknown_handshakes[0].timeout = ctx.now;
- pr_info(&ctx, "fastd " FASTD_VERSION " starting");
+ pr_info("fastd " FASTD_VERSION " starting");
- fastd_cap_init(&ctx);
+ fastd_cap_init();
/* change groups early as the can be relevant for file access (for PID file & log files) */
- set_groups(&ctx);
+ set_groups();
- init_sockets(&ctx);
- fastd_async_init(&ctx);
- fastd_poll_init(&ctx);
+ init_sockets();
+ fastd_async_init();
+ fastd_poll_init();
- if (!fastd_socket_handle_binds(&ctx))
- exit_error(&ctx, "unable to bind default socket");
+ if (!fastd_socket_handle_binds())
+ exit_error("unable to bind default socket");
- on_pre_up(&ctx);
+ on_pre_up();
- fastd_tuntap_open(&ctx);
+ fastd_tuntap_open();
- init_peer_groups(&ctx);
+ init_peer_groups();
- write_pid(&ctx, getpid());
+ write_pid(getpid());
#ifdef USE_SYSTEMD
if (notify_socket) {
- notify_systemd(&ctx, notify_socket);
+ notify_systemd(notify_socket);
free(notify_socket);
}
#endif
@@ -832,40 +835,40 @@ int main(int argc, char *argv[]) {
if (status_fd >= 0) {
static const uint8_t STATUS = 0;
if (write(status_fd, &STATUS, 1) < 0)
- exit_errno(&ctx, "status: write");
+ exit_errno("status: write");
if (close(status_fd))
- exit_errno(&ctx, "status: close");
+ exit_errno("status: close");
}
if (conf.drop_caps == DROP_CAPS_EARLY)
- drop_caps(&ctx);
+ drop_caps();
- on_up(&ctx);
+ on_up();
if (conf.drop_caps == DROP_CAPS_ON)
- drop_caps(&ctx);
+ drop_caps();
else if (conf.drop_caps == DROP_CAPS_OFF)
- set_user(&ctx);
+ set_user();
- fastd_config_load_peer_dirs(&ctx);
+ fastd_config_load_peer_dirs();
VECTOR_ALLOC(ctx.eth_addrs, 0);
VECTOR_ALLOC(ctx.peers, 0);
VECTOR_ALLOC(ctx.peers_temp, 0);
- fastd_peer_hashtable_init(&ctx);
+ fastd_peer_hashtable_init();
- init_peers(&ctx);
+ init_peers();
while (!terminate) {
- handle_handshake_queue(&ctx);
+ handle_handshake_queue();
- fastd_poll_handle(&ctx);
+ fastd_poll_handle();
- enable_temporaries(&ctx);
+ enable_temporaries();
- if (fastd_timed_out(&ctx, &ctx.next_maintenance))
- maintenance(&ctx);
+ if (fastd_timed_out(&ctx.next_maintenance))
+ maintenance();
sigset_t set, oldset;
sigemptyset(&set);
@@ -874,35 +877,35 @@ int main(int argc, char *argv[]) {
if (sighup) {
sighup = false;
- pr_info(&ctx, "reconfigure triggered");
+ pr_info("reconfigure triggered");
- close_log(&ctx);
- init_log(&ctx);
+ close_log();
+ init_log();
- fastd_config_load_peer_dirs(&ctx);
- init_peers(&ctx);
+ fastd_config_load_peer_dirs();
+ init_peers();
}
if (dump) {
dump = false;
- dump_state(&ctx);
+ dump_state();
}
pthread_sigmask(SIG_SETMASK, &oldset, NULL);
}
- on_down(&ctx);
+ on_down();
- delete_peers(&ctx);
- delete_peer_groups(&ctx);
+ delete_peers();
+ delete_peer_groups();
- fastd_tuntap_close(&ctx);
- close_sockets(&ctx);
- fastd_poll_free(&ctx);
+ fastd_tuntap_close();
+ close_sockets();
+ fastd_poll_free();
- on_post_down(&ctx);
+ on_post_down();
- fastd_peer_hashtable_free(&ctx);
+ fastd_peer_hashtable_free();
VECTOR_FREE(ctx.peers_temp);
VECTOR_FREE(ctx.peers);
@@ -917,8 +920,8 @@ int main(int argc, char *argv[]) {
ERR_free_strings();
#endif
- close_log(&ctx);
- fastd_config_release(&ctx);
+ close_log();
+ fastd_config_release();
return 0;
}