fix: resolve all bug issues (#158, #163, #164, #165, #166, #167, #168, #169)

This commit is contained in:
2026-07-29 19:02:09 +02:00
parent 269ce0749b
commit 4f383cc5a5
21 changed files with 1498 additions and 385 deletions
+47 -63
View File
@@ -25,6 +25,44 @@
#define STREAM_THRESHOLD (64ULL * 1024 * 1024)
/* Print dry-run manifest showing files that would be transferred. Returns 0 on success. */
static int send_dry_run_manifest(Config* config) {
DirectoryScanner* scanner = directory_scanner_create(
config->send_directory, config->use_metadata, config->chunk_size, config->exclude_patterns,
config->exclude_count, config->include_patterns, config->include_count, config->max_size,
config->min_size, config->max_depth);
if (!scanner)
return -1;
Chunk* chunk;
int file_count = 0;
unsigned long long total_bytes = 0;
printf("Dry run: files to be transferred\n");
while ((chunk = directory_scanner_next(scanner)) != NULL) {
for (int i = 0; i < chunk->element_count; i++) {
printf(" %s (%zu bytes)\n", chunk->items[i]->path, chunk->items[i]->data->size);
total_bytes += chunk->items[i]->data->size;
file_count++;
}
chunk_destroy(chunk);
}
directory_scanner_destroy(scanner);
printf("Total: %d files, %.1f MB\n", file_count, total_bytes / 1048576.0);
return 0;
}
/* Send the delete manifest (list of files) to the server. Returns 0 on success, -1 on failure. */
static int send_delete_manifest(int fd, ArrayList* manifest) {
if (!send_status(fd, STATUS_MANIFEST))
return -1;
if (!send_int(fd, manifest->size))
return -1;
for (int i = 0; i < manifest->size; i++) {
if (!send_str(fd, (char*)manifest->items[i]))
return -1;
}
return 0;
}
static int incremental_check(Client* client, File* file, DeltaSignature** out_sig) {
*out_sig = NULL;
if (!send_status(client->file_descriptor, STATUS_CHECK))
@@ -268,14 +306,8 @@ static int send_chunks_multithreaded(void* pipeline_context) {
&context->condition_not_full_loader, &context->loader_done);
if (current_chunk == NULL) {
if (context->config->use_delete) {
if (!send_status(client->file_descriptor, STATUS_MANIFEST))
if (send_delete_manifest(client->file_descriptor, context->manifest) != 0)
goto send_fail;
if (!send_int(client->file_descriptor, context->manifest->size))
goto send_fail;
for (int i = 0; i < context->manifest->size; i++) {
if (!send_str(client->file_descriptor, (char*)context->manifest->items[i]))
goto send_fail;
}
}
if (!send_status(client->file_descriptor, STATUS_FINISHED))
goto send_fail;
@@ -365,27 +397,8 @@ static int load_files_multithreaded(void* pipeline_context) {
}
int send_files(Config* config) {
if (config->dry_run) {
DirectoryScanner* scanner = directory_scanner_create(
config->send_directory, config->use_metadata, config->chunk_size, config->exclude_patterns,
config->exclude_count, config->include_patterns, config->include_count, config->max_size,
config->min_size, config->max_depth);
Chunk* chunk;
int file_count = 0;
unsigned long long total_bytes = 0;
printf("Dry run: files to be transferred\n");
while ((chunk = directory_scanner_next(scanner)) != NULL) {
for (int i = 0; i < chunk->element_count; i++) {
printf(" %s (%zu bytes)\n", chunk->items[i]->path, chunk->items[i]->data->size);
total_bytes += chunk->items[i]->data->size;
file_count++;
}
chunk_destroy(chunk);
}
directory_scanner_destroy(scanner);
printf("Total: %d files, %.1f MB\n", file_count, total_bytes / 1048576.0);
return 0;
}
if (config->dry_run)
return send_dry_run_manifest(config);
Client* client;
if (config->transport == TRANSPORT_SSH) {
@@ -470,20 +483,10 @@ int send_files(Config* config) {
chunk_destroy(current_chunk);
}
if (config->use_delete) {
if (!send_status(client->file_descriptor, STATUS_MANIFEST)) {
if (send_delete_manifest(client->file_descriptor, manifest) != 0) {
array_list_delete(manifest);
goto send_fail;
}
if (!send_int(client->file_descriptor, manifest->size)) {
array_list_delete(manifest);
goto send_fail;
}
for (int i = 0; i < manifest->size; i++) {
if (!send_str(client->file_descriptor, (char*)manifest->items[i])) {
array_list_delete(manifest);
goto send_fail;
}
}
array_list_delete(manifest);
}
if (!send_status(client->file_descriptor, STATUS_FINISHED))
@@ -498,37 +501,18 @@ int send_files(Config* config) {
directory_scanner_destroy(scanner);
client_disconnect(client);
client_delete(client);
return ok ? 0 : -1;
return ok ? 0 : 1;
send_fail:
directory_scanner_destroy(scanner);
client_disconnect(client);
client_delete(client);
return -1;
return 1;
}
int send_files_multithreaded(Config* config) {
if (config->dry_run) {
DirectoryScanner* scanner = directory_scanner_create(
config->send_directory, config->use_metadata, config->chunk_size, config->exclude_patterns,
config->exclude_count, config->include_patterns, config->include_count, config->max_size,
config->min_size, config->max_depth);
Chunk* chunk;
int file_count = 0;
unsigned long long total_bytes = 0;
printf("Dry run: files to be transferred\n");
while ((chunk = directory_scanner_next(scanner)) != NULL) {
for (int i = 0; i < chunk->element_count; i++) {
printf(" %s (%zu bytes)\n", chunk->items[i]->path, chunk->items[i]->data->size);
total_bytes += chunk->items[i]->data->size;
file_count++;
}
chunk_destroy(chunk);
}
directory_scanner_destroy(scanner);
printf("Total: %d files, %.1f MB\n", file_count, total_bytes / 1048576.0);
return 0;
}
if (config->dry_run)
return send_dry_run_manifest(config);
long pages = sysconf(_SC_AVPHYS_PAGES);
long page_size = sysconf(_SC_PAGE_SIZE);
@@ -575,5 +559,5 @@ int send_files_multithreaded(Config* config) {
thrd_join(sender, &sender_result);
pipeline_context_sender_destroy(context);
return sender_result == thrd_success ? 0 : -1;
return sender_result == thrd_success ? 0 : 1;
}