aboutsummaryrefslogtreecommitdiff
path: root/libssh/options.c
diff options
context:
space:
mode:
authorAndreas Schneider <mail@cynapses.org>2009-10-02 14:06:41 +0200
committerAndreas Schneider <mail@cynapses.org>2009-10-02 20:26:14 +0200
commitab5b4c7cfe668ee4103de146c2a739532abfc416 (patch)
treeec30d19a18400dbfa0f94bf90262d2c439c724aa /libssh/options.c
parente78334688fa510a5c859b0367d4d4779efae518a (diff)
downloadlibssh-ab5b4c7cfe668ee4103de146c2a739532abfc416.tar.gz
libssh-ab5b4c7cfe668ee4103de146c2a739532abfc416.tar.xz
libssh-ab5b4c7cfe668ee4103de146c2a739532abfc416.zip
Get rid of the options structure.
Diffstat (limited to 'libssh/options.c')
-rw-r--r--libssh/options.c724
1 files changed, 188 insertions, 536 deletions
diff --git a/libssh/options.c b/libssh/options.c
index 95429b0d..475cba0f 100644
--- a/libssh/options.c
+++ b/libssh/options.c
@@ -33,44 +33,11 @@
#endif
#include <sys/types.h>
#include "libssh/priv.h"
-#include "libssh/options.h"
+#include "libssh/session.h"
#include "libssh/misc.h"
-
-/** \defgroup ssh_options SSH Options
- * \brief options settings for a new SSH session
- */
-/** \addtogroup ssh_options
- * @{ */
-
-/** This structure is freed automaticaly by ssh_disconnect()
- * when you use it. \n
- * It can be used by only one ssh_connect(), not more.\n
- * also by default, ssh1 support is not allowed
- *
- * \brief initializes a new option structure
- * \returns an empty intialized option structure.
- * \see ssh_options_getopt()
-*/
-
-ssh_options ssh_options_new(void) {
- ssh_options option;
-
- option = malloc(sizeof(struct ssh_options_struct));
- if (option == NULL) {
- return NULL;
- }
- ZERO_STRUCTP(option);
- option->port=22; /* set the default port */
- option->fd=-1;
- option->ssh2allowed=1;
-#ifdef WITH_SSH1
- option->ssh1allowed=1;
-#else
- option->ssh1allowed=0;
+#ifdef WITH_SERVER
+#include "libssh/server.h"
#endif
- option->bindport=22;
- return option;
-}
/**
* @brief Duplicate an option structure.
@@ -84,134 +51,101 @@ ssh_options ssh_options_new(void) {
*
* @see ssh_session_connect()
*/
-ssh_options ssh_options_copy(ssh_options opt) {
- ssh_options new = NULL;
+#if 0
+ssh_session ssh_session_copy(ssh_options opt) {
+ ssh_session new = NULL;
int i;
- if (opt == NULL) {
+ if (session == NULL) {
return NULL;
}
- new = ssh_options_new();
+ new = ssh_session_new();
if (new == NULL) {
return NULL;
}
- if (opt->username) {
- new->username = strdup(opt->username);
+ if (session->username) {
+ new->username = strdup(session->username);
if (new->username == NULL) {
goto err;
}
}
- if (opt->host) {
- new->host = strdup(opt->host);
+ if (session->host) {
+ new->host = strdup(session->host);
if (new->host == NULL) {
goto err;
}
}
- if (opt->bindaddr) {
- new->bindaddr = strdup(opt->bindaddr);
+ if (session->bindaddr) {
+ new->bindaddr = strdup(session->bindaddr);
if (new->bindaddr == NULL) {
goto err;
}
}
- if (opt->identity) {
- new->identity=strdup(opt->identity);
+ if (session->identity) {
+ new->identity=strdup(session->identity);
if (new->identity == NULL) {
return NULL;
}
}
- if (opt->ssh_dir) {
- new->ssh_dir = strdup(opt->ssh_dir);
- if (new->ssh_dir == NULL) {
+ if (session->sshdir) {
+ new->ssh_dir = strdup(session->sshdir);
+ if (new->sshdir == NULL) {
goto err;
}
}
- if (opt->known_hosts_file) {
- new->known_hosts_file = strdup(opt->known_hosts_file);
- if (new->known_hosts_file == NULL) {
+ if (session->knownhosts) {
+ new->knownhosts = strdup(session->knownhosts);
+ if (new->knownhosts == NULL) {
goto err;
}
}
- if (opt->dsakey) {
- new->dsakey = strdup(opt->dsakey);
+ if (session->dsakey) {
+ new->dsakey = strdup(session->dsakey);
if (new->dsakey == NULL) {
goto err;
}
}
- if (opt->rsakey) {
- new->rsakey = strdup(opt->rsakey);
+ if (session->rsakey) {
+ new->rsakey = strdup(session->rsakey);
if (new->rsakey == NULL) {
goto err;
}
}
for (i = 0; i < 10; ++i) {
- if (opt->wanted_methods[i]) {
- new->wanted_methods[i] = strdup(opt->wanted_methods[i]);
+ if (session->wanted_methods[i]) {
+ new->wanted_methods[i] = strdup(session->wanted_methods[i]);
if (new->wanted_methods[i] == NULL) {
goto err;
}
}
}
- new->fd = opt->fd;
- new->port = opt->port;
- new->callbacks = opt->callbacks;
- new->timeout = opt->timeout;
- new->timeout_usec = opt->timeout_usec;
- new->ssh2allowed = opt->ssh2allowed;
- new->ssh1allowed = opt->ssh1allowed;
- new->log_verbosity = opt->log_verbosity;
+ new->fd = session->fd;
+ new->port = session->port;
+ new->callbacks = session->callbacks;
+ new->timeout = session->timeout;
+ new->timeout_usec = session->timeout_usec;
+ new->ssh2 = session->ssh2;
+ new->ssh1 = session->ssh1;
+ new->log_verbosity = session->log_verbosity;
return new;
err:
- ssh_options_free(new);
+ ssh_session_free(new);
return NULL;
}
-
-/**
- * @brief Frees an option structure.
- *
- * @param opt Option structure to free.
- */
-void ssh_options_free(ssh_options opt) {
- int i;
-
- if (opt == NULL) {
- return;
- }
-
- /*
- * We don't touch the banner. If the implementation
- * did use it, they have to free it
- */
-
- SAFE_FREE(opt->username);
- SAFE_FREE(opt->host);
- SAFE_FREE(opt->identity);
- SAFE_FREE(opt->bindaddr);
- SAFE_FREE(opt->ssh_dir);
- SAFE_FREE(opt->known_hosts_file);
- SAFE_FREE(opt->dsakey);
- SAFE_FREE(opt->rsakey);
-
- for (i = 0; i < 10; i++) {
- if (opt->wanted_methods[i]) {
- free(opt->wanted_methods[i]);
- }
- }
- ZERO_STRUCTP(opt);
- SAFE_FREE(opt);
-}
+#endif
#ifndef _WIN32
-static char *get_username_from_uid(ssh_options opt, uid_t uid){
+static char *get_username_from_uid(ssh_session session, uid_t uid){
struct passwd *pwd = NULL;
pwd = getpwuid(uid);
if (pwd == NULL) {
- ssh_set_error(opt,SSH_FATAL,"uid %d doesn't exist !",uid);
+ ssh_set_error(session, SSH_FATAL, "uid %d doesn't exist !", uid);
return NULL;
}
@@ -219,24 +153,25 @@ static char *get_username_from_uid(ssh_options opt, uid_t uid){
}
#endif
-static int ssh_options_set_algo(ssh_options opt, int algo, const char *list) {
+static int ssh_options_set_algo(ssh_session session, int algo,
+ const char *list) {
if (!verify_existing_algo(algo, list)) {
- ssh_set_error(opt, SSH_REQUEST_DENIED,
+ ssh_set_error(session, SSH_REQUEST_DENIED,
"Setting method: no algorithm for method \"%s\" (%s)\n",
ssh_kex_nums[algo], list);
return -1;
}
- SAFE_FREE(opt->wanted_methods[algo]);
- opt->wanted_methods[algo] = strdup(list);
- if (opt->wanted_methods[algo] == NULL) {
+ SAFE_FREE(session->wanted_methods[algo]);
+ session->wanted_methods[algo] = strdup(list);
+ if (session->wanted_methods[algo] == NULL) {
return -1;
}
return 0;
}
-static char *dir_expand_dup(ssh_options opt, const char *value, int allowsshdir) {
+static char *dir_expand_dup(ssh_session session, const char *value, int allowsshdir) {
char *new;
if (value[0] == '~' && value[1] == '/') {
@@ -252,19 +187,19 @@ static char *dir_expand_dup(ssh_options opt, const char *value, int allowsshdir)
}
if (allowsshdir && strncmp(value, "SSH_DIR/", 8) == 0) {
size_t lv, ls;
- if (opt->ssh_dir == NULL) {
- if (ssh_options_set(opt, SSH_OPTIONS_SSH_DIR, NULL) < 0)
+ if (session->sshdir == NULL) {
+ if (ssh_options_set(session, SSH_OPTIONS_SSH_DIR, NULL) < 0)
return NULL;
}
value += 7;
lv = strlen(value);
- ls = strlen(opt->ssh_dir);
+ ls = strlen(session->sshdir);
new = malloc(lv + ls + 1);
if (new == NULL)
return NULL;
- memcpy(new, opt->ssh_dir, ls);
+ memcpy(new, session->sshdir, ls);
memcpy(new + ls, value, lv + 1);
return new;
}
@@ -274,7 +209,7 @@ static char *dir_expand_dup(ssh_options opt, const char *value, int allowsshdir)
/**
* @brief This function can set all possible ssh options.
*
- * @param opt An allocated ssh option structure.
+ * @param session An allocated ssh option structure.
*
* @param type The option type to set. This could be one of the
* following:
@@ -403,18 +338,18 @@ static char *dir_expand_dup(ssh_options opt, const char *value, int allowsshdir)
* Set the compression to use for server to client
* communication (string, "none" or "zlib").
*
- * SSH_OPTIONS_SERVER_BINDADDR:
- * SSH_OPTIONS_SERVER_HOSTKEY:
+ * SSH_BIND_OPTIONS_BINDADDR:
+ * SSH_BIND_OPTIONS_HOSTKEY:
* Set the server public key type: ssh-rsa or ssh-dss
* (string).
*
- * SSH_OPTIONS_SERVER_DSAKEY:
+ * SSH_BIND_OPTIONS_DSAKEY:
* Set the path to the dsa ssh host key (string).
*
- * SSH_OPTIONS_SERVER_RSAKEY:
+ * SSH_BIND_OPTIONS_RSAKEY:
* Set the path to the ssh host rsa key (string).
*
- * SSH_OPTIONS_SERVER_BANNER:
+ * SSH_BIND_OPTIONS_BANNER:
* Set the server banner sent to clients (string).
*
* @param value The value to set. This is a generic pointer and the
@@ -423,12 +358,12 @@ static char *dir_expand_dup(ssh_options opt, const char *value, int allowsshdir)
*
* @return 0 on success, < 0 on error.
*/
-int ssh_options_set(ssh_options opt, enum ssh_options_e type,
+int ssh_options_set(ssh_session session, enum ssh_options_e type,
const void *value) {
char *p, *q;
- int i;
+ long int i;
- if (opt == NULL) {
+ if (session == NULL) {
return -1;
}
@@ -440,38 +375,38 @@ int ssh_options_set(ssh_options opt, enum ssh_options_e type,
}
p = strchr(q, '@');
- SAFE_FREE(opt->host);
+ SAFE_FREE(session->host);
if (p) {
*p = '\0';
- opt->host = strdup(p + 1);
- if (opt->host == NULL) {
+ session->host = strdup(p + 1);
+ if (session->host == NULL) {
SAFE_FREE(q);
return -1;
}
- SAFE_FREE(opt->username);
- opt->username = strdup(q);
+ SAFE_FREE(session->username);
+ session->username = strdup(q);
SAFE_FREE(q);
- if (opt->username == NULL) {
+ if (session->username == NULL) {
return -1;
}
} else {
- opt->host = q;
+ session->host = q;
}
break;
case SSH_OPTIONS_PORT:
if (value == NULL) {
- opt->port = 22 & 0xffff;
+ session->port = 22 & 0xffff;
} else {
int *x = (int *) value;
- opt->port = *x & 0xffff;
+ session->port = *x & 0xffff;
}
break;
case SSH_OPTIONS_PORT_STR:
if (value == NULL) {
- opt->port = 22 & 0xffff;
+ session->port = 22 & 0xffff;
} else {
q = strdup(value);
if (q == NULL) {
@@ -483,11 +418,11 @@ int ssh_options_set(ssh_options opt, enum ssh_options_e type,
}
SAFE_FREE(q);
- opt->port = i & 0xffff;
+ session->port = i & 0xffff;
}
break;
case SSH_OPTIONS_USER:
- SAFE_FREE(opt->username);
+ SAFE_FREE(session->username);
if (value == NULL) { /* set default username */
#ifdef _WIN32
DWORD size = 0;
@@ -497,38 +432,38 @@ int ssh_options_set(ssh_options opt, enum ssh_options_e type,
return -1;
}
if (GetUserName(q, &size)) {
- opt->username = q;
+ session->username = q;
} else {
SAFE_FREE(q);
return -1;
}
#else /* _WIN32 */
- q = get_username_from_uid(opt, getuid());
+ q = get_username_from_uid(session, getuid());
if (q == NULL) {
return -1;
}
- opt->username = q;
+ session->username = q;
#endif /* _WIN32 */
} else { /* username provided */
- opt->username = strdup(value);
- if (opt->username == NULL) {
+ session->username = strdup(value);
+ if (session->username == NULL) {
return -1;
}
}
break;
case SSH_OPTIONS_SSH_DIR:
if (value == NULL) {
- SAFE_FREE(opt->ssh_dir);
+ SAFE_FREE(session->sshdir);
/* TODO: why ~/.ssh/ instead of ~/.ssh ? */
- opt->ssh_dir = dir_expand_dup(opt, "~/.ssh/", 0);
- if (opt->ssh_dir == NULL) {
+ session->sshdir = dir_expand_dup(session, "~/.ssh/", 0);
+ if (session->sshdir == NULL) {
return -1;
}
} else {
- SAFE_FREE(opt->ssh_dir);
- opt->ssh_dir = dir_expand_dup(opt, value, 0);
- if (opt->ssh_dir == NULL) {
+ SAFE_FREE(session->sshdir);
+ session->sshdir = dir_expand_dup(session, value, 0);
+ if (session->sshdir == NULL) {
return -1;
}
}
@@ -538,24 +473,24 @@ int ssh_options_set(ssh_options opt, enum ssh_options_e type,
if (value == NULL) {
return -1;
}
- SAFE_FREE(opt->identity);
- opt->identity = dir_expand_dup(opt, value, 1);
- if (opt->identity == NULL) {
+ SAFE_FREE(session->identity);
+ session->identity = dir_expand_dup(session, value, 1);
+ if (session->identity == NULL) {
return -1;
}
break;
case SSH_OPTIONS_KNOWNHOSTS:
if (value == NULL) {
- SAFE_FREE(opt->known_hosts_file);
- opt->known_hosts_file = dir_expand_dup(opt,
- "SSH_DIR/known_hosts", 1);
- if (opt->known_hosts_file == NULL) {
+ SAFE_FREE(session->knownhosts);
+ session->knownhosts = dir_expand_dup(session,
+ "SSH_DIR/known_hosts", 1);
+ if (session->knownhosts == NULL) {
return -1;
}
} else {
- SAFE_FREE(opt->known_hosts_file);
- opt->known_hosts_file = dir_expand_dup(opt, value, 1);
- if (opt->known_hosts_file == NULL) {
+ SAFE_FREE(session->knownhosts);
+ session->knownhosts = dir_expand_dup(session, value, 1);
+ if (session->knownhosts == NULL) {
return -1;
}
}
@@ -566,7 +501,7 @@ int ssh_options_set(ssh_options opt, enum ssh_options_e type,
} else {
long *x = (long *) value;
- opt->timeout = *x;
+ session->timeout = *x;
}
break;
case SSH_OPTIONS_TIMEOUT_USEC:
@@ -575,7 +510,7 @@ int ssh_options_set(ssh_options opt, enum ssh_options_e type,
} else {
long *x = (long *) value;
- opt->timeout_usec = *x;
+ session->timeout_usec = *x;
}
break;
case SSH_OPTIONS_SSH1:
@@ -583,7 +518,7 @@ int ssh_options_set(ssh_options opt, enum ssh_options_e type,
return -1;
} else {
int *x = (int *) value;
- opt->ssh1allowed = *x;
+ session->ssh1 = *x;
}
break;
case SSH_OPTIONS_SSH2:
@@ -591,7 +526,7 @@ int ssh_options_set(ssh_options opt, enum ssh_options_e type,
return -1;
} else {
int *x = (int *) value;
- opt->ssh2allowed = *x;
+ session->ssh2 = *x;
}
break;
case SSH_OPTIONS_LOG_VERBOSITY:
@@ -600,328 +535,140 @@ int ssh_options_set(ssh_options opt, enum ssh_options_e type,
} else {
int *x = (int *) value;
- opt->log_verbosity = *x;
+ session->log_verbosity = *x;
}
case SSH_OPTIONS_CIPHERS_C_S:
if (value == NULL) {
return -1;
} else {
- ssh_options_set_algo(opt, SSH_CRYPT_C_S, value);
+ ssh_options_set_algo(session, SSH_CRYPT_C_S, value);
}
break;
case SSH_OPTIONS_CIPHERS_S_C:
if (value == NULL) {
return -1;
} else {
- ssh_options_set_algo(opt, SSH_CRYPT_S_C, value);
+ ssh_options_set_algo(session, SSH_CRYPT_S_C, value);
}
break;
case SSH_OPTIONS_COMPRESSION_C_S:
if (value == NULL) {
return -1;
} else {
- ssh_options_set_algo(opt, SSH_COMP_C_S, value);
+ ssh_options_set_algo(session, SSH_COMP_C_S, value);
}
break;
case SSH_OPTIONS_COMPRESSION_S_C:
if (value == NULL) {
return -1;
} else {
- ssh_options_set_algo(opt, SSH_COMP_S_C, value);
+ ssh_options_set_algo(session, SSH_COMP_S_C, value);
}
break;
- case SSH_OPTIONS_SERVER_HOSTKEY:
+ default:
+ ssh_set_error(session, SSH_REQUEST_DENIED, "Unkown ssh option %d", type);
+ return -1;
+ break;
+ }
+
+ return 0;
+}
+
+#ifdef WITH_SERVER
+static int ssh_bind_options_set_algo(ssh_bind sshbind, int algo,
+ const char *list) {
+ if (!verify_existing_algo(algo, list)) {
+ ssh_set_error(sshbind, SSH_REQUEST_DENIED,
+ "Setting method: no algorithm for method \"%s\" (%s)\n",
+ ssh_kex_nums[algo], list);
+ return -1;
+ }
+
+ SAFE_FREE(sshbind->wanted_methods[algo]);
+ sshbind->wanted_methods[algo] = strdup(list);
+ if (sshbind->wanted_methods[algo] == NULL) {
+ return -1;
+ }
+
+ return 0;
+}
+
+int ssh_bind_options_set(ssh_bind sshbind, enum ssh_bind_options_e type,
+ const void *value) {
+#if 0
+ char *p, *q;
+ int i;
+#endif
+
+ if (sshbind == NULL) {
+ return -1;
+ }
+
+ switch (type) {
+ case SSH_BIND_OPTIONS_HOSTKEY:
if (value == NULL) {
return -1;
} else {
- ssh_options_set_algo(opt, SSH_HOSTKEYS, value);
+ ssh_bind_options_set_algo(sshbind, SSH_HOSTKEYS, value);
}
break;
- case SSH_OPTIONS_SERVER_BINDADDR:
+ case SSH_BIND_OPTIONS_BINDADDR:
if (value == NULL) {
return -1;
} else {
- opt->bindaddr = strdup(value);
- if (opt->bindaddr == NULL) {
+ sshbind->bindaddr = strdup(value);
+ if (sshbind->bindaddr == NULL) {
return -1;
}
}
break;
- case SSH_OPTIONS_SERVER_BINDPORT:
+ case SSH_BIND_OPTIONS_BINDPORT:
if (value == NULL) {
return -1;
} else {
int *x = (int *) value;
- opt->bindport = *x & 0xffff;
+ sshbind->bindport = *x & 0xffff;
}
break;
- case SSH_OPTIONS_SERVER_DSAKEY:
+ case SSH_BIND_OPTIONS_DSAKEY:
if (value == NULL) {
return -1;
} else {
- opt->dsakey = strdup(value);
- if (opt->dsakey == NULL) {
+ sshbind->dsakey = strdup(value);
+ if (sshbind->dsakey == NULL) {
return -1;
}
}
break;
- case SSH_OPTIONS_SERVER_RSAKEY:
+ case SSH_BIND_OPTIONS_RSAKEY:
if (value == NULL) {
return -1;
} else {
- opt->rsakey = strdup(value);
- if (opt->rsakey == NULL) {
+ sshbind->rsakey = strdup(value);
+ if (sshbind->rsakey == NULL) {
return -1;
}
}
break;
- case SSH_OPTIONS_SERVER_BANNER:
+ case SSH_BIND_OPTIONS_BANNER:
if (value == NULL) {
return -1;
} else {
- opt->banner = strdup(value);
- if (opt->banner == NULL) {
+ sshbind->banner = strdup(value);
+ if (sshbind->banner == NULL) {
return -1;
}
}
break;
default:
- ssh_set_error(opt, SSH_REQUEST_DENIED, "Unkown ssh option %d", type);
+ ssh_set_error(sshbind, SSH_REQUEST_DENIED, "Unkown ssh option %d", type);
return -1;
break;
}
return 0;
}
-
-/**
- * @brief Set destination hostname
- *
- * @param opt The option structure to use.
- *
- * @param hostname The host name to connect.
- *
- * @return 0 on succes, < 0 on error.
- */
-int ssh_options_set_host(ssh_options opt, const char *hostname){
- return ssh_options_set(opt, SSH_OPTIONS_HOST, hostname);
-}
-
-/**
- * @brief Set port to connect or to bind for a connection.
- *
- * @param opt The options structure to use.
- *
- * @param port The port to connect or to bind.
- *
- * @return 0 on success, < 0 on error.
- */
-int ssh_options_set_port(ssh_options opt, unsigned int port) {
- return ssh_options_set(opt, SSH_OPTIONS_PORT, &port);
-}
-
-/**
- * @brief Set the username for authentication
- *
- * @param opt The options structure to use.
- *
- * @param username The username to authenticate.
- *
- * @return 0 on success, -1 on error.
- *
- * @bug this should not be set at options time
- */
-int ssh_options_set_username(ssh_options opt, const char *username) {
- return ssh_options_set(opt, SSH_OPTIONS_USER, username);
-}
-
-/**
- * @brief Set a file descriptor for connection.
- *
- * If you wish to open the socket yourself for a reason or another, set the
- * file descriptor. Don't forget to use ssh_option_set_hostname() as the
- * hostname is used as a key in the known_host mechanism.
- *
- * @param opt The options structure to use.
- *
- * @param fd An opened file descriptor to use.
- *
- * @return 0 on success, < 0 on error.
- */
-int ssh_options_set_fd(ssh_options opt, socket_t fd) {
- return ssh_options_set(opt, SSH_OPTIONS_FD, &fd);
-}
-
-/**
- * @brief Set the local address and port binding.
- *
- * In case your client has multiple IP adresses, select the local address and
- * port to use for the socket.\n
- * If the address or port is not bindable, it may be impossible to connect.
- *
- * @param opt The options structure to use.
- *
- * @param bindaddr The bind address in form of hostname or ip address.
- *
- * @param port The port number to bind.
- *
- * @return 0 on success, < 0 on error.
- */
-int ssh_options_set_bind(ssh_options opt, const char *bindaddr, int port) {
- int rc;
-
- rc = ssh_options_set(opt, SSH_OPTIONS_SERVER_BINDADDR, bindaddr);
- if (rc < 0) {
- return -1;
- }
- rc = ssh_options_set(opt, SSH_OPTIONS_SERVER_BINDPORT, &port);
-
- return rc;
-}
-
-/**
- * @brief Set the ssh directory.
- *
- * The ssh directory is used for files like known_hosts and identity (public
- * and private keys)
- *
- * @param opt The options structure to use.
- *
- * @param dir The directory to set. It may include "%s" which will be
- * replaced by the user home directory.
- *
- * @return 0 on success, < 0 on error.
- *
- * @see ssh_options_set_user_home_dir()
- */
-int ssh_options_set_ssh_dir(ssh_options opt, const char *dir) {
- return ssh_options_set(opt, SSH_OPTIONS_SSH_DIR, dir);
-}
-
-/**
- * @brief Set the known hosts file name.
- *
- * The known hosts file is used to certify remote hosts are genuine.
- *
- * @param opt The options structure to use.
- *
- * @param dir The path to the file including its name. "%s" will be
- * substitued with the user home directory.
- *
- * @return 0 on success, < 0 on error.
- *
- * @see ssh_options_set_user_home_dir()
- */
-int ssh_options_set_known_hosts_file(ssh_options opt, const char *dir){
- return ssh_options_set(opt, SSH_OPTIONS_KNOWNHOSTS, dir);
-}
-
-/**
- * @brief Set the identity file name.
- *
- * The identity file is used authenticate with public key.
- *
- * @param opt The options structure to use.
- *
- * @param identity The path to the file including its name. "%s" will be
- * substitued with the user home directory.
- *
- * @return 0 on success, < 0 on error.
- *
- * @see ssh_options_set_user_home_dir()
- */
-int ssh_options_set_identity(ssh_options opt, const char *identity){
- return ssh_options_set(opt, SSH_OPTIONS_IDENTITY, identity);
-}
-
-/**
- * @brief Set the path to the dsa ssh host key.
- *
- * @param opt The options structure to use.
- *
- * @param dsakey The path to the dsa key to set.
- *
- * @return 0 on success, < 0 on error.
- */
-int ssh_options_set_dsa_server_key(ssh_options opt, const char *dsakey) {
- return ssh_options_set(opt, SSH_OPTIONS_SERVER_DSAKEY, dsakey);
-}
-
-/**
- * @brief Set the path to the ssh host rsa key.
- *
- * @param opt The options structure to use.
- *
- * @param rsakey The path to the rsa key to set.
- *
- * @return 0 on success, < 0 on error.
- */
-int ssh_options_set_rsa_server_key(ssh_options opt, const char *rsakey) {
- return ssh_options_set(opt, SSH_OPTIONS_SERVER_RSAKEY, rsakey);
-}
-
-/**
- * @brief Set the server banner sent to clients.
- *
- * @param opt The options structure to use.
- *
- * @param banner A text banner to be shown.
- *
- * @return 0 on success, < 0 on error.
- */
-int ssh_options_set_banner(ssh_options opt, const char *banner) {
- return ssh_options_set(opt, SSH_OPTIONS_SERVER_BANNER, banner);
-}
-
-/**
- * @brief Set the algorithms to be used for cryptography and compression.
- *
- * The methods are:\n
- * KEX_HOSTKEY (server public key type) : ssh-rsa or ssh-dss\n
- * KEX_CRYPT_C_S (symmetric cipher client to server)\n
- * KEX_CRYPT_S_C (symmetric cipher server to client)\n
- * KEX_COMP_C_S (Compression client to server): zlib or none\n
- * KEX_COMP_S_C (Compression server to client): zlib or none\n
- * You don't have to use this function if using the default ciphers
- * is okay for you\n
- * in order to enable compression client to server, do\n
- * @code
- * ret = ssh_options_set_wanted_algos(opt,KEX_COMP_C_S,"zlib");
- * @endcode
- *
- * @param opt The options structure to use.
- *
- * @param algo The method which needs to be changed.
- *
- * @param list A list of algorithms to be used, in order of preference
- * and separated by commas.
- *
- * @return 0 on success, < 0 on error
- */
-int ssh_options_set_wanted_algos(ssh_options opt, int algo, const char *list) {
- if (opt == NULL || list == NULL) {
- return -1;
- }
-
- if(algo > SSH_LANG_S_C || algo < 0) {
- ssh_set_error(opt, SSH_REQUEST_DENIED, "algo %d out of range", algo);
- return -1;
- }
-
- if (!verify_existing_algo(algo, list)) {
- ssh_set_error(opt, SSH_REQUEST_DENIED, "Setting method: no algorithm "
- "for method \"%s\" (%s)\n", ssh_kex_nums[algo], list);
- return -1;
- }
-
- SAFE_FREE(opt->wanted_methods[algo]);
- opt->wanted_methods[algo] = strdup(list);
- if (opt->wanted_methods[algo] == NULL) {
- return -1;
- }
-
- return 0;
-}
+#endif
/**
* @brief Set a callback to show connection status in realtime.
@@ -941,72 +688,20 @@ int ssh_options_set_wanted_algos(ssh_options opt, int algo, const char *list) {
*
* @see ssh_connect()
*/
-int ssh_options_set_status_callback(ssh_options opt,
+int ssh_set_status_callback(ssh_session session,
void (*callback)(void *arg, float status), void *arg) {
- if (opt == NULL || callback == NULL || opt->callbacks==NULL) {
+ if (session == NULL || callback == NULL || session->callbacks == NULL) {
return -1;
}
- opt->callbacks->connect_status_function = callback;
+ session->callbacks->connect_status_function = callback;
if(arg)
- opt->callbacks->userdata=arg;
+ session->callbacks->userdata = arg;
return 0;
}
/**
- * @brief Set a timeout for the connection.
- *
- * @param opt The options structure to use.
- *
- * @param seconds Number of seconds.
- *
- * @param usec Number of micro seconds.
- *
- * @return 0 on success, < 0 on error.
- *
- * @bug Currently it only timeouts the socket connection, not the
- * complete exchange.
- */
-int ssh_options_set_timeout(ssh_options opt, long seconds, long usec) {
- if (ssh_options_set(opt, SSH_OPTIONS_TIMEOUT, &seconds) < 0) {
- return -1;
- }
-
- return ssh_options_set(opt, SSH_OPTIONS_TIMEOUT_USEC, &usec);
-}
-
-/**
- * @brief Allow or deny the connection to SSH1 servers.
- *
- * Default value is 0 (no connection to SSH1 servers).
- *
- * @param opt The options structure to use.
- *
- * @param allow Non zero value allow ssh1.
- *
- * @return 0 on success, < 0 on error.
- */
-int ssh_options_allow_ssh1(ssh_options opt, int allow) {
- return ssh_options_set(opt, SSH_OPTIONS_SSH1, &allow);
-}
-
-/**
- * @brief Allow or deny the connection to SSH2 servers.
- *
- * Default value is 1 (allow connection to SSH2 servers).
- *
- * @param opt The options structure to use.
- *
- * @param allow Non zero values allow ssh2.
- *
- * @return 0 on success, < 0 on error.
- */
-int ssh_options_allow_ssh2(ssh_options opt, int allow) {
- return ssh_options_set(opt, SSH_OPTIONS_SSH2, &allow);
-}
-
-/**
* @brief Change the writer callback for logging.
*
* Default is a write on stderr.
@@ -1021,37 +716,44 @@ int ssh_options_allow_ssh2(ssh_options opt, int allow) {
*
* @warning The message string may contain format string characters.
*/
-int ssh_options_set_log_function(ssh_options opt, ssh_log_callback cb,
+int ssh_set_log_callback(ssh_session session, ssh_log_callback cb,
void *userdata) {
- if (opt == NULL || cb == NULL || opt->callbacks==NULL) {
+ if (session == NULL || cb == NULL || session->callbacks == NULL) {
return -1;
}
- opt->callbacks->log_function = cb;
+ session->callbacks->log_function = cb;
if(userdata)
- opt->callbacks->userdata = userdata;
+ session->callbacks->userdata = userdata;
return 0;
}
/**
- * @brief Set the session logging priority.
+ * @brief Set the authentication callback.
*
* @param opt The options structure to use.
*
- * @param verbosity The verbosity of the messages. Every log smaller or
- * equal to verbosity will be shown\n
- * SSH_LOG_NOLOG No logging \n
- * SSH_LOG_RARE Rare conditions or warnings\n
- * SSH_LOG_ENTRY Api-accessible entrypoints\n
- * SSH_LOG_PACKET Packet id and size\n
- * SSH_LOG_FUNCTIONS function entering and leaving\n
+ * @param cb The callback function to use.
+ *
+ * @param userdata A pointer to some user data you can pass to the
+ * callback.
*
* @return 0 on success, < 0 on error.
*/
-int ssh_options_set_log_verbosity(ssh_options opt, int verbosity) {
- return ssh_options_set(opt, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);
+int ssh_set_auth_callback(ssh_session session, ssh_auth_callback cb,
+ void *userdata) {
+ if (session == NULL || cb == NULL || session->callbacks == NULL) {
+ return -1;
+ }
+
+ session->callbacks->auth_function = cb;
+ if (userdata != NULL)
+ session->callbacks->userdata = userdata;
+
+ return 0;
}
+
/**
* @brief Parse command line arguments.
*
@@ -1071,7 +773,7 @@ int ssh_options_set_log_verbosity(ssh_options opt, int verbosity) {
*
* @returns 0 on success, < 0 on error.
*
- * @see ssh_options_new()
+ * @see ssh_session_new()
*/
int ssh_options_getopt(ssh_options options, int *argcptr, char **argv) {
char *user = NULL;
@@ -1194,10 +896,10 @@ int ssh_options_getopt(ssh_options options, int *argcptr, char **argv) {
/* set a new option struct */
if (compress) {
- if (ssh_options_set_wanted_algos(options, SSH_COMP_C_S, "zlib") < 0) {
+ if (ssh_options_set(options, SSH_OPTIONS_COMPRESSION_C_S, "zlib") < 0) {
cont = 0;
}
- if (ssh_options_set_wanted_algos(options, SSH_COMP_S_C, "zlib") < 0) {
+ if (ssh_options_set(options, SSH_OPTIONS_COMPRESSION_S_C, "zlib") < 0) {
cont = 0;
}
}
@@ -1211,18 +913,6 @@ int ssh_options_getopt(ssh_options options, int *argcptr, char **argv) {
}
}
- if (cont && usersa) {
- if (ssh_options_set(options, SSH_OPTIONS_SERVER_HOSTKEY, "ssh-rsa") < 0) {
- cont = 0;
- }
- }
-
- if (cont && usedss) {
- if (ssh_options_set(options, SSH_OPTIONS_SERVER_HOSTKEY, "ssh-dss") < 0) {
- cont = 0;
- }
- }
-
if (cont && user) {
if (ssh_options_set(options, SSH_OPTIONS_USER, user) < 0) {
cont = 0;
@@ -1235,19 +925,6 @@ int ssh_options_getopt(ssh_options options, int *argcptr, char **argv) {
}
}
- if (cont && localaddr) {
- if (ssh_options_set(options, SSH_OPTIONS_SERVER_BINDADDR, localaddr) < 0) {
- cont = 0;
- }
- }
-
- if (cont && bindport) {
- i = atoi(bindport);
- if (ssh_options_set(options, SSH_OPTIONS_SERVER_BINDPORT, &i) < 0) {
- cont = 0;
- }
- }
-
ssh_options_set(options, SSH_OPTIONS_PORT_STR, port);
ssh_options_set(options, SSH_OPTIONS_SSH1, &ssh1);
@@ -1262,31 +939,6 @@ int ssh_options_getopt(ssh_options options, int *argcptr, char **argv) {
}
/**
- * @brief Set the authentication callback.
- *
- * @param opt The options structure to use.
- *
- * @param cb The callback function to use.
- *
- * @param userdata A pointer to some user data you can pass to the
- * callback.
- *
- * @return 0 on success, < 0 on error.
- */
-int ssh_options_set_auth_callback(ssh_options opt, ssh_auth_callback cb,
- void *userdata) {
- if (opt == NULL || cb == NULL || opt->callbacks==NULL) {
- return -1;
- }
-
- opt->callbacks->auth_function = cb;
- if(userdata != NULL)
- opt->callbacks->userdata = userdata;
-
- return 0;
-}
-
-/**
* @brief Parse the ssh config file.
*
* This should be the last call of all options, it may overwrite options which