Features and enhancements (#70, #36, #34, #33, #32, #57, #40, #37) #90

Merged
TapTap merged 13 commits from fix/enhancements into main 2026-07-21 15:00:32 +02:00
9 changed files with 51 additions and 47 deletions
Showing only changes of commit 3923421224 - Show all commits
+7 -7
View File
@@ -16,16 +16,16 @@ DirectoryScanner* directory_scanner_create(char* root_directory, bool use_metada
int exclude_count, char** include_patterns, int exclude_count, char** include_patterns,
int include_count, unsigned long long max_size, int include_count, unsigned long long max_size,
unsigned long long min_size) { unsigned long long min_size) {
return directory_scanner_create_full(root_directory, use_metadata, chunk_size, return directory_scanner_create_full(root_directory, use_metadata, chunk_size, exclude_patterns,
exclude_patterns, exclude_count, exclude_count, include_patterns, include_count, max_size,
include_patterns, include_count, min_size, true);
max_size, min_size, true);
} }
DirectoryScanner* directory_scanner_create_full(char* root_directory, bool use_metadata, DirectoryScanner* directory_scanner_create_full(char* root_directory, bool use_metadata,
unsigned long long chunk_size, char** exclude_patterns, unsigned long long chunk_size,
int exclude_count, char** include_patterns, char** exclude_patterns, int exclude_count,
int include_count, unsigned long long max_size, char** include_patterns, int include_count,
unsigned long long max_size,
unsigned long long min_size, bool follow_symlinks) { unsigned long long min_size, bool follow_symlinks) {
DirectoryScanner* scanner = malloc(sizeof(DirectoryScanner)); DirectoryScanner* scanner = malloc(sizeof(DirectoryScanner));
if (scanner == NULL) if (scanner == NULL)
+4 -3
View File
@@ -27,9 +27,10 @@ DirectoryScanner* directory_scanner_create(char* root_directory, bool use_metada
int include_count, unsigned long long max_size, int include_count, unsigned long long max_size,
unsigned long long min_size); unsigned long long min_size);
DirectoryScanner* directory_scanner_create_full(char* root_directory, bool use_metadata, DirectoryScanner* directory_scanner_create_full(char* root_directory, bool use_metadata,
unsigned long long chunk_size, char** exclude_patterns, unsigned long long chunk_size,
int exclude_count, char** include_patterns, char** exclude_patterns, int exclude_count,
int include_count, unsigned long long max_size, char** include_patterns, int include_count,
unsigned long long max_size,
unsigned long long min_size, bool follow_symlinks); unsigned long long min_size, bool follow_symlinks);
Chunk* directory_scanner_next(DirectoryScanner* scanner); Chunk* directory_scanner_next(DirectoryScanner* scanner);
void directory_scanner_destroy(DirectoryScanner* scanner); void directory_scanner_destroy(DirectoryScanner* scanner);
+12 -10
View File
@@ -44,8 +44,10 @@ Server* server_create(int port) {
// Try IPv6 first, fall back to IPv4 // Try IPv6 first, fall back to IPv4
int fd = socket(AF_INET6, SOCK_STREAM, 0); int fd = socket(AF_INET6, SOCK_STREAM, 0);
sa_family_t domain = AF_INET6;
if (fd < 0) { if (fd < 0) {
fd = socket(AF_INET, SOCK_STREAM, 0); fd = socket(AF_INET, SOCK_STREAM, 0);
domain = AF_INET;
} }
if (fd < 0) { if (fd < 0) {
perror("Could not create Socket!"); perror("Could not create Socket!");
@@ -69,32 +71,29 @@ Server* server_create(int port) {
return NULL; return NULL;
} }
// Determine address family from the actual socket // Use the domain from the socket we actually created
struct sockaddr_storage* addr = &server->address; struct sockaddr_storage* addr = &server->address;
socklen_t addr_len = sizeof(*addr);
if (getsockname(fd, (struct sockaddr*)addr, &addr_len) == 0) {
// Use the family of the socket we actually created
}
struct sockaddr_in* addr4 = (struct sockaddr_in*)addr; struct sockaddr_in* addr4 = (struct sockaddr_in*)addr;
struct sockaddr_in6* addr6 = (struct sockaddr_in6*)addr; struct sockaddr_in6* addr6 = (struct sockaddr_in6*)addr;
if (addr->ss_family == AF_INET6) { if (domain == AF_INET6) {
addr6->sin6_family = AF_INET6; addr6->sin6_family = AF_INET6;
addr6->sin6_addr = in6addr_any; addr6->sin6_addr = in6addr_any;
addr6->sin6_port = htons(port); addr6->sin6_port = htons(port);
addr->ss_family = AF_INET6;
server->address_length = sizeof(struct sockaddr_in6); server->address_length = sizeof(struct sockaddr_in6);
} else { } else {
addr4->sin_family = AF_INET; addr4->sin_family = AF_INET;
addr4->sin_addr.s_addr = INADDR_ANY; addr4->sin_addr.s_addr = INADDR_ANY;
addr4->sin_port = htons(port); addr4->sin_port = htons(port);
addr->ss_family = AF_INET;
server->address_length = sizeof(struct sockaddr_in); server->address_length = sizeof(struct sockaddr_in);
} }
if (bind(server->file_descriptor, (struct sockaddr*)&server->address, server->address_length) < if (bind(server->file_descriptor, (struct sockaddr*)&server->address, server->address_length) <
0) { 0) {
// If IPv6 bind failed (maybe no IPv6), try IPv4 // If IPv6 bind failed (maybe no IPv6), try IPv4
if (addr->ss_family == AF_INET6) { if (domain == AF_INET6) {
close(fd); close(fd);
fd = socket(AF_INET, SOCK_STREAM, 0); fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0) { if (fd < 0) {
@@ -254,8 +253,11 @@ bool client_connect(Client* client, char* host, int port) {
} }
// Save the connected address // Save the connected address
memcpy(&client->address, rp->ai_addr, rp->ai_addrlen); socklen_t addr_len = rp->ai_addrlen;
client->address_length = rp->ai_addrlen; if (addr_len > sizeof(client->address))
addr_len = sizeof(client->address);
memcpy(&client->address, rp->ai_addr, addr_len);
client->address_length = addr_len;
freeaddrinfo(res); freeaddrinfo(res);
// Close old fd if any and set new one // Close old fd if any and set new one
+8 -7
View File
@@ -22,8 +22,8 @@ static void test_sendfile_basic() {
/* Set the size so file_send_sendfile can report it */ /* Set the size so file_send_sendfile can report it */
file->data->size = len; file->data->size = len;
Config* cfg = config_create(str_dup(PROTOCOL_VERSION), str_dup("/tmp"), str_dup("/tmp"), Config* cfg = config_create(str_dup(PROTOCOL_VERSION), str_dup("/tmp"), str_dup("/tmp"), false,
false, false, false, false, false, 0, false, 0); false, false, false, false, 0, false, 0);
EXPECT_NOT_NULL(cfg); EXPECT_NOT_NULL(cfg);
int p[2]; int p[2];
@@ -80,8 +80,8 @@ static void test_sendfile_empty_file() {
EXPECT_NOT_NULL(file); EXPECT_NOT_NULL(file);
file->data->size = 0; file->data->size = 0;
Config* cfg = config_create(str_dup(PROTOCOL_VERSION), str_dup("/tmp"), str_dup("/tmp"), Config* cfg = config_create(str_dup(PROTOCOL_VERSION), str_dup("/tmp"), str_dup("/tmp"), false,
false, false, false, false, false, 0, false, 0); false, false, false, false, 0, false, 0);
EXPECT_NOT_NULL(cfg); EXPECT_NOT_NULL(cfg);
int p[2]; int p[2];
@@ -161,8 +161,8 @@ static void test_sendfile_compression_fallback() {
file->data->size = (size_t)st.st_size; file->data->size = (size_t)st.st_size;
EXPECT_TRUE(file_load_data(file)); EXPECT_TRUE(file_load_data(file));
Config* cfg = config_create(str_dup(PROTOCOL_VERSION), str_dup("/tmp"), str_dup("/tmp"), Config* cfg = config_create(str_dup(PROTOCOL_VERSION), str_dup("/tmp"), str_dup("/tmp"), false,
false, false, false, true, false, 3, false, 0); false, false, true, false, 3, false, 0);
EXPECT_NOT_NULL(cfg); EXPECT_NOT_NULL(cfg);
int p[2]; int p[2];
@@ -226,7 +226,8 @@ static void test_sendfile_no_path() {
close(p[1]); close(p[1]);
/* When send_path is false, the sender still sends file_type + data */ /* When send_path is false, the sender still sends file_type + data */
int file_type; int file_type;
receive_int(p[0], &file_type); EXPECT_TRUE(receive_int(p[0], &file_type));
EXPECT_EQ_INT(file_type, (int)FILE_TYPE_REGULAR);
Data* received = receive_data(p[0]); Data* received = receive_data(p[0]);
close(p[0]); close(p[0]);
+10 -10
View File
@@ -8,8 +8,8 @@
/* Test pipeline_context_sender_create/destroy with valid arguments */ /* Test pipeline_context_sender_create/destroy with valid arguments */
static void test_sender_create_destroy() { static void test_sender_create_destroy() {
Config* cfg = config_create(str_dup("1.0"), str_dup("/src"), str_dup("/dst"), Config* cfg = config_create(str_dup("1.0"), str_dup("/src"), str_dup("/dst"), false, false, false,
false, false, false, false, false, 0, false, 0); false, false, 0, false, 0);
EXPECT_NOT_NULL(cfg); EXPECT_NOT_NULL(cfg);
Queue* q_scanner = queue_create(5, NULL); Queue* q_scanner = queue_create(5, NULL);
@@ -32,8 +32,8 @@ static void test_sender_create_destroy() {
/* Test pipeline_context_receiver_create/destroy with valid arguments */ /* Test pipeline_context_receiver_create/destroy with valid arguments */
static void test_receiver_create_destroy() { static void test_receiver_create_destroy() {
Config* cfg = config_create(str_dup("2.0"), str_dup("/src"), str_dup("/dst"), Config* cfg = config_create(str_dup("2.0"), str_dup("/src"), str_dup("/dst"), true, true, false,
true, true, false, false, false, 0, false, 0); false, false, 0, false, 0);
EXPECT_NOT_NULL(cfg); EXPECT_NOT_NULL(cfg);
Queue* q = queue_create(20, NULL); Queue* q = queue_create(20, NULL);
@@ -51,8 +51,8 @@ static void test_receiver_create_destroy() {
/* Test that create handles various queue capacities */ /* Test that create handles various queue capacities */
static void test_sender_queue_capacities() { static void test_sender_queue_capacities() {
Config* cfg = config_create(str_dup("3.0"), str_dup("/src"), str_dup("/dst"), Config* cfg = config_create(str_dup("3.0"), str_dup("/src"), str_dup("/dst"), false, false, false,
false, false, false, false, false, 0, false, 0); false, false, 0, false, 0);
EXPECT_NOT_NULL(cfg); EXPECT_NOT_NULL(cfg);
/* Single-element queues */ /* Single-element queues */
@@ -67,8 +67,8 @@ static void test_sender_queue_capacities() {
/* Test that create handles zero-capacity queues */ /* Test that create handles zero-capacity queues */
static void test_sender_zero_capacity() { static void test_sender_zero_capacity() {
Config* cfg = config_create(str_dup("4.0"), str_dup("/src"), str_dup("/dst"), Config* cfg = config_create(str_dup("4.0"), str_dup("/src"), str_dup("/dst"), false, false, false,
false, false, false, false, false, 0, false, 0); false, false, 0, false, 0);
EXPECT_NOT_NULL(cfg); EXPECT_NOT_NULL(cfg);
Queue* q1 = queue_create(0, NULL); Queue* q1 = queue_create(0, NULL);
@@ -82,8 +82,8 @@ static void test_sender_zero_capacity() {
/* Test receiver with zero file_descriptor */ /* Test receiver with zero file_descriptor */
static void test_receiver_fd_zero() { static void test_receiver_fd_zero() {
Config* cfg = config_create(str_dup("5.0"), str_dup("/src"), str_dup("/dst"), Config* cfg = config_create(str_dup("5.0"), str_dup("/src"), str_dup("/dst"), false, false, false,
false, false, false, false, false, 0, false, 0); false, false, 0, false, 0);
Queue* q = queue_create(5, NULL); Queue* q = queue_create(5, NULL);
PipelineContextReceiver* ctx = pipeline_context_receiver_create(cfg, q, 0); PipelineContextReceiver* ctx = pipeline_context_receiver_create(cfg, q, 0);
EXPECT_NOT_NULL(ctx); EXPECT_NOT_NULL(ctx);