#251 --remove-source-files deletes sources that were skipped receiver-side (--existing/--ignore-existing/--update). The receiver now reports a per-file outcome for every processed data file when the sender requests removal; the client only unlinks sources the receiver actually wrote. add remove_source_files to the wire config and bump the protocol to 2.5.0. #252 --backup/--suffix/--backup-dir broken by NULL-vs-empty wire loss. Receivers canonicalize the empty wire string back to NULL for backup_dir, temp_dir, partial_dir and suffix, and --suffix is received unconditionally. #253 --partial --partial-dir never installed completed files. file_save_to_disk now renames a fully written partial-dir file into the real destination. #255 STATUS_CHECK read the entire old file before the size/mtime quick check. Old contents are only read when a checksum compare or delta needs them. #256 receive_delta_file failure paths did not set *failed, so the caller sent STATUS_NEXT and waited for a body that never came. Every NULL return now marks the transfer failed. #257 files >64 MiB could not transfer. Whole-file receive caps raised to the 256 MiB connection/allocation ceiling (chunk caps stay 64 MiB) and the client ignores SIGPIPE so a server-side close surfaces as a clean error. Unit tests added: config NULL-vs-empty round trip, incremental quick-check skip/NEXT paths, delta oversize failure, partial-dir install, save-result skip reporting.
161 lines
3.4 KiB
C
161 lines
3.4 KiB
C
#ifndef CONFIG_H
|
|
#define CONFIG_H
|
|
|
|
#include "array_list.h"
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
|
|
typedef enum { TRANSPORT_TCP, TRANSPORT_SSH } TransportType;
|
|
|
|
typedef struct Config {
|
|
char* version;
|
|
char* send_directory;
|
|
char* receive_root_directory;
|
|
bool save_to_disk;
|
|
bool use_multithreading;
|
|
bool use_chunk_serialization;
|
|
bool use_compression;
|
|
bool use_sendfile;
|
|
bool use_metadata;
|
|
bool use_executability;
|
|
bool metadata_explicitly_disabled;
|
|
bool show_progress;
|
|
bool dry_run;
|
|
bool remove_source_files;
|
|
bool use_delete;
|
|
int compression_level;
|
|
int compression_threads;
|
|
unsigned long long chunk_size;
|
|
int ssh_port;
|
|
TransportType transport;
|
|
char* ssh_destination;
|
|
char* fastsync_server_path;
|
|
char** exclude_patterns;
|
|
int exclude_count;
|
|
char** include_patterns;
|
|
int include_count;
|
|
unsigned long long max_size;
|
|
unsigned long long min_size;
|
|
unsigned long long max_alloc;
|
|
bool use_incremental;
|
|
bool ignore_times;
|
|
bool size_only;
|
|
bool use_delta;
|
|
bool whole_file;
|
|
int modify_window;
|
|
uint32_t delta_block_size;
|
|
unsigned long long delta_max_file_size;
|
|
bool use_tls;
|
|
char* server_host;
|
|
int server_port;
|
|
char* tls_cert;
|
|
char* tls_key;
|
|
char* tls_ca;
|
|
int timeout;
|
|
int contimeout;
|
|
bool quiet;
|
|
bool backup;
|
|
char* backup_dir;
|
|
bool stats;
|
|
int max_depth;
|
|
FILE* log_file;
|
|
int queue_size;
|
|
bool follow_symlinks;
|
|
bool partial;
|
|
|
|
// Issue #120: Symlink handling
|
|
bool copy_links;
|
|
bool safe_links;
|
|
bool copy_unsafe_links;
|
|
|
|
// Issue #121: Extended metadata preservation
|
|
bool preserve_hard_links;
|
|
bool preserve_acls;
|
|
bool preserve_xattrs;
|
|
bool preserve_devices;
|
|
bool preserve_sparse;
|
|
|
|
// Issue #122: Output/logging options
|
|
bool itemize_changes;
|
|
char* out_format;
|
|
int info_level;
|
|
int debug_level;
|
|
bool list_only;
|
|
bool human_readable;
|
|
bool eight_bit_output;
|
|
|
|
// Issue #127: Transfer modes
|
|
bool existing;
|
|
bool ignore_existing;
|
|
bool update;
|
|
bool inplace;
|
|
bool use_fsync;
|
|
bool append;
|
|
bool append_verify;
|
|
|
|
// Issue #128: Extended delete options
|
|
bool delete_excluded;
|
|
bool delete_after;
|
|
int max_delete;
|
|
|
|
// Issue #129: Advanced file selection
|
|
ArrayList* filters;
|
|
char* files_from;
|
|
bool cvs_exclude;
|
|
bool prune_empty_dirs;
|
|
bool relative;
|
|
|
|
// Issue #130: Remote shell/connection options
|
|
char* rsh_command;
|
|
char* rsync_path;
|
|
bool old_args;
|
|
char* temp_dir;
|
|
char* compare_dest;
|
|
char* copy_dest;
|
|
char* link_dest;
|
|
|
|
// PR #174: Partial transfer resumption
|
|
char* partial_dir;
|
|
|
|
// PR #178: Backup versioning
|
|
char* suffix;
|
|
|
|
// PR #179: Delete policies
|
|
bool delete_before;
|
|
|
|
// PR #181: IPv6 and bind address
|
|
char* address;
|
|
char* bind_address;
|
|
bool ipv6;
|
|
bool ipv4;
|
|
|
|
// PR #182: Daemon/server mode
|
|
bool daemon;
|
|
char* daemon_config;
|
|
bool server_mode;
|
|
|
|
// PR #183: Checksum comparison
|
|
bool checksum;
|
|
|
|
// PR #184: Compression algorithm negotiation
|
|
char* compress_choice;
|
|
char* chmod_spec;
|
|
|
|
char** skip_compress_suffixes;
|
|
int skip_compress_count;
|
|
bool skip_compress_set;
|
|
} Config;
|
|
|
|
#define PROTOCOL_VERSION "2.5.0"
|
|
#define DEFAULT_CHUNK_SIZE (10 * 1024 * 1024)
|
|
|
|
Config* config_create(void);
|
|
void config_delete(Config* config);
|
|
bool config_send(int file_descriptor, const Config* config);
|
|
Config* config_receive(int file_descriptor);
|
|
bool config_is_remote_dest(const char* s);
|
|
void config_parse_ssh_dest(Config* config);
|
|
|
|
#endif
|