summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mscp.h2
-rw-r--r--src/main.c12
-rw-r--r--src/mscp.c11
-rw-r--r--src/pymscp.c11
-rw-r--r--test/test_python.py1
5 files changed, 28 insertions, 9 deletions
diff --git a/include/mscp.h b/include/mscp.h
index 7d21ac1..aff28ce 100644
--- a/include/mscp.h
+++ b/include/mscp.h
@@ -43,7 +43,7 @@ struct mscp_opts {
size_t max_chunk_sz; /** maximum chunk size (default file size/nr_threads) */
size_t buf_sz; /** buffer size, default 16k. */
char coremask[MSCP_MAX_COREMASK_STR]; /** hex to specifiy usable cpu cores */
- int max_startups; /* sshd MaxStartups conccurent connections */
+ int max_startups; /* sshd MaxStartups concurrent connections */
int severity; /** messaging severity. set MSCP_SERVERITY_* */
int msg_fd; /** fd to output message. default STDOUT (0),
diff --git a/src/main.c b/src/main.c
index fc8893b..33d737b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -24,7 +24,7 @@
void usage(bool print_help) {
printf("mscp v" VERSION ": copy files over multiple ssh connections\n"
"\n"
- "Usage: mscp [vqDHdNh] [-n nr_conns] [-m coremask]\n"
+ "Usage: mscp [vqDHdNh] [-n nr_conns] [-m coremask] [-u max_startups]\n"
" [-s min_chunk_sz] [-S max_chunk_sz] [-a nr_ahead] [-b buf_sz]\n"
" [-l login_name] [-p port] [-i identity_file]\n"
" [-c cipher_spec] [-M hmac_spec] [-C compress] source ... target\n"
@@ -36,6 +36,8 @@ void usage(bool print_help) {
printf(" -n NR_CONNECTIONS number of connections "
"(default: floor(log(cores)*2)+1)\n"
" -m COREMASK hex value to specify cores where threads pinned\n"
+ " -u MAX_STARTUPS number of concurrent outgoing connections "
+ "(default: 8)\n"
" -s MIN_CHUNK_SIZE min chunk size (default: 64MB)\n"
" -S MAX_CHUNK_SIZE max chunk size (default: filesize/nr_conn)\n"
"\n"
@@ -52,7 +54,8 @@ void usage(bool print_help) {
" -i IDENTITY identity file for public key authentication\n"
" -c CIPHER cipher spec\n"
" -M HMAC hmac spec\n"
- " -C COMPRESS enable compression: yes, no, zlib, zlib@openssh.com\n"
+ " -C COMPRESS enable compression: "
+ "yes, no, zlib, zlib@openssh.com\n"
" -H disable hostkey check\n"
" -d increment ssh debug output level\n"
" -N enable Nagle's algorithm (default disabled)\n"
@@ -204,7 +207,7 @@ int main(int argc, char **argv)
memset(&o, 0, sizeof(o));
o.severity = MSCP_SEVERITY_WARN;
- while ((ch = getopt(argc, argv, "n:m:s:S:a:b:vqDrl:p:i:c:M:C:HdNh")) != -1) {
+ while ((ch = getopt(argc, argv, "n:m:u:s:S:a:b:vqDrl:p:i:c:M:C:HdNh")) != -1) {
switch (ch) {
case 'n':
o.nr_threads = atoi(optarg);
@@ -217,6 +220,9 @@ int main(int argc, char **argv)
case 'm':
strncpy(o.coremask, optarg, sizeof(o.coremask));
break;
+ case 'u':
+ o.max_startups = atoi(optarg);
+ break;
case 's':
o.min_chunk_sz = atoi(optarg);
break;
diff --git a/src/mscp.c b/src/mscp.c
index 9ba7f83..46e714c 100644
--- a/src/mscp.c
+++ b/src/mscp.c
@@ -26,7 +26,7 @@ struct mscp {
int *cores; /* usable cpu cores by COREMASK */
int nr_cores; /* length of array of cores */
- sem_t sem; /* semaphore for conccurent
+ sem_t sem; /* semaphore for concurrent
* connecting ssh sessions */
sftp_session first; /* first sftp session */
@@ -193,6 +193,10 @@ static int validate_and_set_defaut_params(struct mscp_opts *o)
if (o->max_startups == 0)
o->max_startups = DEFAULT_MAX_STARTUPS;
+ else if (o->max_startups < 0) {
+ mscp_set_error("invalid max_startups: %d", o->max_startups);
+ return -1;
+ }
if (o->msg_fd == 0)
o->msg_fd = STDOUT_FILENO;
@@ -219,8 +223,9 @@ struct mscp *mscp_init(const char *remote_host, int direction,
mprint_set_severity(o->severity);
- if (validate_and_set_defaut_params(o) < 0)
- goto free_out;
+ if (validate_and_set_defaut_params(o) < 0) {
+ return NULL;
+ }
m = malloc(sizeof(*m));
if (!m) {
diff --git a/src/pymscp.c b/src/pymscp.c
index 49bc85e..0a0642e 100644
--- a/src/pymscp.c
+++ b/src/pymscp.c
@@ -74,7 +74,7 @@ static int release_instance(struct instance *i)
/* wrapper functions */
-static PyObject *wrap_mscp_init(PyObject *sef, PyObject *args, PyObject *kw)
+static PyObject *wrap_mscp_init(PyObject *self, PyObject *args, PyObject *kw)
{
/*
* Initialize struct mscp with options. wrap_mscp_init
@@ -89,10 +89,14 @@ static PyObject *wrap_mscp_init(PyObject *sef, PyObject *args, PyObject *kw)
/* mscp_opts */
"nr_threads", /* int */
"nr_ahead", /* int */
+
"min_chunk_sz", /* unsigned long */
"max_chunk_sz", /* unsigned long */
"buf_sz", /* unsigned long */
+
"coremask", /* const char * */
+
+ "max_startups", /* int */
"severity", /* int, MSCP_SERVERITY_* */
"msg_fd", /* int */
@@ -100,17 +104,19 @@ static PyObject *wrap_mscp_init(PyObject *sef, PyObject *args, PyObject *kw)
"login_name", /* const char * */
"port", /* const char * */
"identity", /* const char * */
+
"cipher", /* const char * */
"hmac", /* const char * */
"compress", /* const char * */
"password", /* const char * */
"passphrase", /* const char * */
+
"debug_level", /* int */
"no_hostkey_check", /* bool */
"enable_nagle", /* bool */
NULL,
};
- const char *fmt = "si" "|iikkksii" "ssssssssipp";
+ const char *fmt = "si" "|" "ii" "kkk" "s" "iii" "sss" "sssss" "ipp";
char *coremask = NULL;
char *login_name = NULL, *port = NULL, *identity = NULL;
char *cipher = NULL, *hmac = NULL, *compress = NULL;
@@ -137,6 +143,7 @@ static PyObject *wrap_mscp_init(PyObject *sef, PyObject *args, PyObject *kw)
&i->mo.max_chunk_sz,
&i->mo.buf_sz,
&coremask,
+ &i->mo.max_startups,
&i->mo.severity,
&i->mo.msg_fd,
&login_name,
diff --git a/test/test_python.py b/test/test_python.py
index 3038b76..3ac2a6e 100644
--- a/test/test_python.py
+++ b/test/test_python.py
@@ -71,6 +71,7 @@ param_kwargs = [
{ "min_chunk_sz": 1 * 1024 * 1024 },
{ "max_chunk_sz": 64 * 1024 * 1024 },
{ "coremask": "0x0f" },
+ { "max_startups": 5 },
{ "severity": mscp.SEVERITY_NONE },
{ "cipher": "aes128-gcm@openssh.com" },
{ "compress": "yes" },