feat: add --fastsync-server-path flag to configure remote server binary path #144

Merged
TapTap merged 1 commits from fastsync-server-path-flag into main 2026-07-21 18:17:36 +02:00
7 changed files with 22 additions and 10 deletions
+5
View File
@@ -56,6 +56,8 @@ static void print_usage(void) {
printf(" --key <path> TLS private key file (PEM)\n");
printf(" --ca <path> TLS CA certificate file (PEM)\n");
printf(" --partial Keep partial files on interrupted transfer\n");
printf(" --fastsync-server-path <path>\n");
printf(" Path to fastsync-server on remote (default: fastsync-server)\n");
printf(" --help Show this help\n");
printf(" -V, --version Show version and exit\n");
}
@@ -224,6 +226,9 @@ int main(int argc, char* argv[]) {
config->tls_ca = str_dup(argv[++i]);
} else if (strcmp(argv[i], "--partial") == 0) {
config->partial = true;
} else if (strcmp(argv[i], "--fastsync-server-path") == 0 && i + 1 < argc) {
free(config->fastsync_server_path);
config->fastsync_server_path = str_dup(argv[++i]);
} else if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--verbose") == 0) {
set_log_level(LOG_LEVEL_DEBUG);
} else if (argv[i][0] == '-') {
+4 -2
View File
@@ -228,7 +228,8 @@ static int send_chunks_multithreaded(void* pipeline_context) {
fprintf(stderr, "Error: -f/--sendfile is not supported with SSH transport\n");
return 1;
}
client = client_connect_ssh(context->config->ssh_destination, context->config->ssh_port);
client = client_connect_ssh(context->config->ssh_destination, context->config->ssh_port,
context->config->fastsync_server_path);
} else if (context->config->use_tls) {
client = client_create();
if (!client || !client_connect_tls(client, context->config->server_host,
@@ -385,7 +386,8 @@ int send_files(Config* config) {
fprintf(stderr, "Error: -f/--sendfile is not supported with SSH transport\n");
return 1;
}
client = client_connect_ssh(config->ssh_destination, config->ssh_port);
client =
client_connect_ssh(config->ssh_destination, config->ssh_port, config->fastsync_server_path);
if (!client)
return 1;
} else if (config->use_tls) {
+3
View File
@@ -34,6 +34,7 @@ Config* config_create(char* version, char* send_directory, char* receive_directo
config->ssh_port = 22;
config->transport = TRANSPORT_TCP;
config->ssh_destination = NULL;
config->fastsync_server_path = NULL;
config->exclude_patterns = NULL;
config->exclude_count = 0;
config->include_patterns = NULL;
@@ -88,6 +89,7 @@ void config_delete(Config* config) {
free(config->send_directory);
free(config->receive_root_directory);
free(config->ssh_destination);
free(config->fastsync_server_path);
for (int i = 0; i < config->exclude_count; i++)
free(config->exclude_patterns[i]);
free(config->exclude_patterns);
@@ -238,6 +240,7 @@ Config* config_receive(int file_descriptor) {
config->ssh_port = 22;
config->transport = TRANSPORT_TCP;
config->ssh_destination = NULL;
config->fastsync_server_path = NULL;
config->exclude_patterns = NULL;
config->exclude_count = 0;
config->include_patterns = NULL;
+1
View File
@@ -24,6 +24,7 @@ typedef struct Config {
int ssh_port;
TransportType transport;
char* ssh_destination;
char* fastsync_server_path;
char** exclude_patterns;
int exclude_count;
char** include_patterns;
+4 -3
View File
@@ -67,7 +67,7 @@ static int parse_remote_dest(const char* dest, RemoteDest* r) {
return 0;
}
Client* client_connect_ssh(const char* destination, int port) {
Client* client_connect_ssh(const char* destination, int port, const char* server_path) {
RemoteDest r;
if (parse_remote_dest(destination, &r) != 0) {
fprintf(stderr, "Invalid remote destination: %s\n", destination);
@@ -152,7 +152,7 @@ Client* client_connect_ssh(const char* destination, int port) {
_exit(1);
}
ssh_argv[ac++] = ssh_user;
ssh_argv[ac++] = "fastsync-server";
ssh_argv[ac++] = (char*)(server_path ? server_path : "fastsync-server");
ssh_argv[ac++] = "--stdio";
ssh_argv[ac] = NULL;
execvp("ssh", ssh_argv);
@@ -174,7 +174,8 @@ Client* client_connect_ssh(const char* destination, int port) {
close(sv[0]);
waitpid(pid, NULL, 0);
remote_dest_destroy(&r);
fprintf(stderr, "Error: could not launch 'fastsync-server --stdio' on remote\n");
fprintf(stderr, "Error: could not launch '%s --stdio' on remote\n",
server_path ? server_path : "fastsync-server");
return NULL;
}
+1 -1
View File
@@ -3,6 +3,6 @@
#include "transport_tcp.h"
Client* client_connect_ssh(const char* destination, int port);
Client* client_connect_ssh(const char* destination, int port, const char* server_path);
#endif
+4 -4
View File
@@ -9,14 +9,14 @@
static void test_ssh_connect_invalid_dest() {
/* Missing colon — parse_remote_dest should fail and return NULL */
/* cppcheck-suppress constVariablePointer */
Client* client = client_connect_ssh("invalid-destination-no-colon", 22);
Client* client = client_connect_ssh("invalid-destination-no-colon", 22, NULL);
EXPECT_NULL(client);
}
/* Test client_connect_ssh with empty destination */
static void test_ssh_connect_empty_dest() {
/* cppcheck-suppress constVariablePointer */
Client* client = client_connect_ssh("", 22);
Client* client = client_connect_ssh("", 22, NULL);
EXPECT_NULL(client);
}
@@ -24,7 +24,7 @@ static void test_ssh_connect_empty_dest() {
* parse_remote_dest succeeds, ssh is exec'd and fails, but the function
* creates a Client that must be cleaned up. */
static void test_ssh_connect_malformed() {
Client* client = client_connect_ssh(":", 22);
Client* client = client_connect_ssh(":", 22, NULL);
/* ssh binary exists, so exec succeeds; the function returns a Client.
* We just verify it doesn't crash and clean up properly. */
if (client != NULL) {
@@ -37,7 +37,7 @@ static void test_ssh_connect_malformed() {
/* Test client_connect_ssh with valid format but unreachable host.
* The function launches ssh which will fail to connect, returns a Client. */
static void test_ssh_connect_unreachable() {
Client* client = client_connect_ssh("nonexistent.invalid:/remote/path", 22);
Client* client = client_connect_ssh("nonexistent.invalid:/remote/path", 22, NULL);
if (client != NULL) {
client_disconnect(client);
client_delete(client);