fix: initialize ssl_ctx in server_create, update tests for sockaddr_storage API
CI / lint (pull_request) Failing after 2s
CI / build-and-test (pull_request) Has been skipped
CI / sanitizers (address) (pull_request) Has been skipped
CI / sanitizers (undefined) (pull_request) Has been skipped
CI / fuzz-build (pull_request) Has been skipped
CI / coverage (pull_request) Has been skipped
CI / valgrind (pull_request) Has been skipped

This commit is contained in:
2026-07-20 19:39:13 +02:00
parent 6b8979a040
commit a2bcda1fcf
40 changed files with 1988 additions and 176 deletions
+51 -7
View File
@@ -11,11 +11,47 @@
#include "transport_tls.h"
#include "unistd.h"
#include "utils.h"
#include <libgen.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Check if a file path should be excluded based on config patterns
static bool is_excluded(const char* path, const Config* config) {
// Extract filename from path
char* path_dup = str_dup(path);
if (!path_dup)
return false;
char* fname = basename(path_dup);
// Check exclude patterns
for (int i = 0; i < config->exclude_count; i++) {
if (glob_match(config->exclude_patterns[i], fname)) {
free(path_dup);
return true;
}
}
// Check include patterns (if any, file must match at least one)
if (config->include_count > 0) {
bool included = false;
for (int i = 0; i < config->include_count; i++) {
if (glob_match(config->include_patterns[i], fname)) {
included = true;
break;
}
}
if (!included) {
free(path_dup);
return true;
}
}
free(path_dup);
return false;
}
int receive_files(Config* config, int fd) {
Status status;
if (!receive_status(fd, &status))
@@ -29,7 +65,7 @@ int receive_files(Config* config, int fd) {
goto next;
if (file == NULL && !skipped)
return -1;
if (config->save_to_disk)
if (config->save_to_disk && !is_excluded(file->path, config))
file_save_to_disk(config->receive_root_directory, file);
file_destroy(file);
} else if (status == STATUS_CHUNK) {
@@ -39,7 +75,7 @@ int receive_files(Config* config, int fd) {
return -1;
}
for (int i = 0; i < chunk->element_count; i++) {
if (config->save_to_disk)
if (config->save_to_disk && !is_excluded(chunk->items[i]->path, config))
file_save_to_disk(config->receive_root_directory, chunk->items[i]);
}
chunk_destroy(chunk);
@@ -50,7 +86,7 @@ int receive_files(Config* config, int fd) {
send_status(fd, STATUS_ERROR);
return -1;
}
if (config->save_to_disk)
if (config->save_to_disk && !is_excluded(file->path, config))
file_save_to_disk(config->receive_root_directory, file);
file_destroy(file);
}
@@ -113,13 +149,11 @@ void handler(int file_descriptor) {
}
static Server* g_server = NULL;
static volatile sig_atomic_t g_server_cleanup_requested = 0;
static void cleanup(int sig) {
(void)sig;
if (g_server) {
server_delete(&g_server);
}
_exit(0);
g_server_cleanup_requested = 1;
}
static void print_server_usage(void) {
@@ -135,6 +169,7 @@ static void print_server_usage(void) {
printf(" --ca <path> TLS CA certificate file (PEM)\n");
printf(" -v, --verbose Enable debug logging\n");
printf(" --help Show this help\n");
printf(" -V, --version Show version and exit\n");
}
int main(int argc, char* argv[]) {
@@ -149,6 +184,9 @@ int main(int argc, char* argv[]) {
if (strcmp(argv[i], "--help") == 0) {
print_server_usage();
return 0;
} else if (strcmp(argv[i], "-V") == 0 || strcmp(argv[i], "--version") == 0) {
printf("fastsync-server version %s\n", PROTOCOL_VERSION);
return 0;
} else if (strcmp(argv[i], "--stdio") == 0) {
io_set_fds(STDIN_FILENO, STDOUT_FILENO);
handler(STDIN_FILENO);
@@ -205,5 +243,11 @@ int main(int argc, char* argv[]) {
} else {
server_listen(g_server, handler);
}
/* Graceful shutdown: if a signal requested cleanup, delete the server */
if (g_server_cleanup_requested) {
log_message(LOG_LEVEL_INFO, "Shutdown requested, cleaning up");
server_delete(&g_server);
}
return 0;
}