summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRyo Nakamura <upa@haeena.net>2024-04-12 23:08:22 +0900
committerRyo Nakamura <upa@haeena.net>2024-04-12 23:08:22 +0900
commita1b9afefe50fbbdf6391e94ab21e6e7645eabe4d (patch)
tree8f0fa87ac9c014395a60781c9a3af55060d6b70a /src
parentbf7e2c3ae340464d4de7b4ba105decdbd7c40450 (diff)
add -o SSH_OPTION option
Diffstat (limited to 'src')
-rw-r--r--src/main.c21
-rw-r--r--src/ssh.c16
2 files changed, 31 insertions, 6 deletions
diff --git a/src/main.c b/src/main.c
index d8f680b..ae163e5 100644
--- a/src/main.c
+++ b/src/main.c
@@ -28,8 +28,9 @@ void usage(bool print_help)
" [-u max_startups] [-I interval] [-W checkpoint] [-R checkpoint]\n"
" [-s min_chunk_sz] [-S max_chunk_sz] [-a nr_ahead]\n"
" [-b buf_sz] [-L limit_bitrate]\n"
- " [-l login_name] [-P port] [-F ssh_config] [-i identity_file]\n"
- " [-c cipher_spec] [-M hmac_spec] [-C compress] [-g congestion]\n"
+ " [-l login_name] [-P port] [-F ssh_config] [-o ssh_option]\n"
+ " [-i identity_file] [-c cipher_spec] [-M hmac_spec]\n"
+ " [-C compress] [-g congestion]\n"
" source ... target\n"
"\n");
@@ -60,7 +61,8 @@ void usage(bool print_help)
"\n"
" -l LOGIN_NAME login name\n"
" -P PORT port number\n"
- " -F CONFIG path to user ssh config (default ~/.ssh/config)\n"
+ " -F SSH_CONFIG path to user ssh config (default ~/.ssh/config)\n"
+ " -o SSH_OPTION ssh_config option\n"
" -i IDENTITY identity file for public key authentication\n"
" -c CIPHER cipher spec\n"
" -M HMAC hmac spec\n"
@@ -267,6 +269,7 @@ int main(int argc, char **argv)
int direction = 0;
char *remote = NULL, *checkpoint_save = NULL, *checkpoint_load = NULL;
bool dryrun = false, resume = false;
+ int nr_options = 0;
size_t factor = 1;
char *unit;
@@ -274,7 +277,7 @@ int main(int argc, char **argv)
memset(&o, 0, sizeof(o));
o.severity = MSCP_SEVERITY_WARN;
-#define mscpopts "n:m:u:I:W:R:s:S:a:b:L:46vqDrl:P:i:F:c:M:C:g:pdNh"
+#define mscpopts "n:m:u:I:W:R:s:S:a:b:L:46vqDrl:P:i:F:o:c:M:C:g:pdNh"
while ((ch = getopt(argc, argv, mscpopts)) != -1) {
switch (ch) {
case 'n':
@@ -359,6 +362,16 @@ int main(int argc, char **argv)
case 'F':
s.config = optarg;
break;
+ case 'o':
+ nr_options++;
+ s.options = realloc(s.options, sizeof(char *) * (nr_options + 1));
+ if (!s.options) {
+ pr_err("realloc: %s", strerrno());
+ return 1;
+ }
+ s.options[nr_options - 1] = optarg;
+ s.options[nr_options] = NULL;
+ break;
case 'i':
s.identity = optarg;
break;
diff --git a/src/ssh.c b/src/ssh.c
index 16e2b0c..2ea81a9 100644
--- a/src/ssh.c
+++ b/src/ssh.c
@@ -4,12 +4,13 @@
#include <unistd.h>
#include <stdlib.h>
-#include "libssh/callbacks.h"
-
#include <ssh.h>
#include <mscp.h>
#include <strerrno.h>
+#include "libssh/callbacks.h"
+#include "libssh/options.h"
+
static int ssh_verify_known_hosts(ssh_session session);
static int ssh_authenticate_kbdint(ssh_session session);
@@ -87,6 +88,17 @@ static int ssh_set_opts(ssh_session ssh, struct mscp_ssh_opts *opts)
return -1;
}
+ if (opts->options) {
+ int n;
+ for (n = 0; opts->options[n]; n++) {
+ if (ssh_config_parse_string(ssh, opts->options[n]) != SSH_OK) {
+ priv_set_errv("failed to set ssh option %s: %s",
+ opts->options[n]);
+ return -1;
+ }
+ }
+ }
+
return 0;
}