From 1924fd5157216684d19221b3b512c7742847bf40 Mon Sep 17 00:00:00 2001 From: TapTap Date: Sat, 18 Jul 2026 16:24:56 +0200 Subject: [PATCH] refactor: merge sendfile and single_calls _no_path variants with send_path bool Replace four send functions (file_send_sendfile, file_send_sendfile_no_path, file_send_single_calls, file_send_single_calls_no_path) with two functions that accept a send_path boolean parameter. Removes ~50 lines of duplicated code. --- src/client/client_send.c | 12 ++++---- src/shared/file.c | 60 +++------------------------------------- src/shared/file.h | 6 ++-- 3 files changed, 12 insertions(+), 66 deletions(-) diff --git a/src/client/client_send.c b/src/client/client_send.c index 093184e..485dfb4 100644 --- a/src/client/client_send.c +++ b/src/client/client_send.c @@ -57,11 +57,11 @@ int send_chunk(Client *client, Chunk *chunk, Config *config) { int rc = incremental_check(client, chunk->items[i]); if (rc < 0) return -1; if (rc > 0) continue; - if (!file_send_sendfile_no_path(chunk->items[i], client->file_descriptor, config->use_metadata)) + if (!file_send_sendfile(chunk->items[i], client->file_descriptor, config->use_metadata, false)) return -1; } else { if (!send_status(client->file_descriptor, STATUS_NEXT)) return -1; - if (!file_send_sendfile(chunk->items[i], client->file_descriptor, config->use_metadata)) + if (!file_send_sendfile(chunk->items[i], client->file_descriptor, config->use_metadata, true)) return -1; } } @@ -71,15 +71,15 @@ int send_chunk(Client *client, Chunk *chunk, Config *config) { int rc = incremental_check(client, chunk->items[i]); if (rc < 0) return -1; if (rc > 0) continue; - if (!file_send_single_calls_no_path(chunk->items[i], client->file_descriptor, + if (!file_send_single_calls(chunk->items[i], client->file_descriptor, config->use_metadata, - config->use_compression ? config->compression_level : 0)) + config->use_compression ? config->compression_level : 0, false)) return -1; } else { if (!send_status(client->file_descriptor, STATUS_NEXT)) return -1; if (!file_send_single_calls(chunk->items[i], client->file_descriptor, - config->use_metadata, - config->use_compression ? config->compression_level : 0)) + config->use_metadata, + config->use_compression ? config->compression_level : 0, true)) return -1; } } diff --git a/src/shared/file.c b/src/shared/file.c index 94a1e6a..b1765dc 100644 --- a/src/shared/file.c +++ b/src/shared/file.c @@ -96,7 +96,7 @@ bool file_load_data(File *file) { return true; } -bool file_send_single_calls_no_path(File *file, int file_descriptor, bool use_metadata, int compression_level) { +bool file_send_single_calls(File *file, int file_descriptor, bool use_metadata, int compression_level, bool send_path) { Data *data_to_send = file->data; Data *compressed_data = NULL; if (compression_level > 0) { @@ -107,59 +107,7 @@ bool file_send_single_calls_no_path(File *file, int file_descriptor, bool use_me } data_to_send = compressed_data; } - if (use_metadata && !metadata_send(file_descriptor, file->metadata)) { - data_destroy(compressed_data); - return false; - } - if (!send_data(file_descriptor, data_to_send)) { - data_destroy(compressed_data); - return false; - } - data_destroy(compressed_data); - return true; -} - -bool file_send_sendfile_no_path(File *file, int file_descriptor, bool use_metadata) { - if (use_metadata && !metadata_send(file_descriptor, file->metadata)) return false; - - int fd = open(file->path, O_RDONLY); - if (fd == -1) { - perror("Could not open file for sendfile"); - return false; - } - - unsigned long long file_size = file->data->size; - if (!send_n_data(file_descriptor, &file_size, sizeof(unsigned long long))) { - close(fd); - return false; - } - - off_t offset = 0; - while (offset < file_size) { - ssize_t sent = sendfile(file_descriptor, fd, &offset, file_size - offset); - if (sent == -1) { - perror("sendfile failed"); - close(fd); - return false; - } - } - - close(fd); - return true; -} - -bool file_send_single_calls(File *file, int file_descriptor, bool use_metadata, int compression_level) { - Data *data_to_send = file->data; - Data *compressed_data = NULL; - if (compression_level > 0) { - compressed_data = data_compress(file->data, compression_level); - if (compressed_data == NULL) { - log_message(LOG_LEVEL_ERROR, "Failed to compress file data"); - return false; - } - data_to_send = compressed_data; - } - if (!send_str(file_descriptor, file->path)) { + if (send_path && !send_str(file_descriptor, file->path)) { data_destroy(compressed_data); return false; } @@ -200,8 +148,8 @@ bool to_disk(const char *path, const void *data, unsigned long long data_size) { return true; } -bool file_send_sendfile(File *file, int file_descriptor, bool use_metadata) { - if (!send_str(file_descriptor, file->path)) return false; +bool file_send_sendfile(File *file, int file_descriptor, bool use_metadata, bool send_path) { + if (send_path && !send_str(file_descriptor, file->path)) return false; if (use_metadata && !metadata_send(file_descriptor, file->metadata)) return false; int fd = open(file->path, O_RDONLY); diff --git a/src/shared/file.h b/src/shared/file.h index feb8fbc..7d96fbc 100644 --- a/src/shared/file.h +++ b/src/shared/file.h @@ -24,10 +24,8 @@ File *file_create(const char *path); void file_destroy(void *item); bool file_load_data(File *file); File *file_receive(Config *config, int file_descriptor); -bool file_send_single_calls(File *file, int file_descriptor, bool use_metadata, int compression_level); -bool file_send_single_calls_no_path(File *file, int file_descriptor, bool use_metadata, int compression_level); -bool file_send_sendfile(File *file, int file_descriptor, bool use_metadata); -bool file_send_sendfile_no_path(File *file, int file_descriptor, bool use_metadata); +bool file_send_single_calls(File *file, int file_descriptor, bool use_metadata, int compression_level, bool send_path); +bool file_send_sendfile(File *file, int file_descriptor, bool use_metadata, bool send_path); size_t file_content_to_buffer(File *file); FileMetadata *file_metadata_create(struct stat *stats); void file_metadata_destroy(void *metadata);