aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schneider <mail@cynapses.org>2009-04-02 10:13:12 +0000
committerAndreas Schneider <mail@cynapses.org>2009-04-02 10:13:12 +0000
commit6026de46486913c40a9469267c429b2dfa57d806 (patch)
tree6fede1e55d6cef6544f263aad812b38afa87f320
parenta9ef024f1045f696e424c77d7bbde8ce324916ac (diff)
downloadlibssh-6026de46486913c40a9469267c429b2dfa57d806.tar.gz
libssh-6026de46486913c40a9469267c429b2dfa57d806.tar.xz
libssh-6026de46486913c40a9469267c429b2dfa57d806.zip
Improve ssh_options_set_host().
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@347 7dcaeef0-15fb-0310-b436-a5af3365683c
-rw-r--r--include/libssh/libssh.h2
-rw-r--r--libssh/options.c60
-rw-r--r--sample.c5
3 files changed, 48 insertions, 19 deletions
diff --git a/include/libssh/libssh.h b/include/libssh/libssh.h
index 629a0df8..20b28683 100644
--- a/include/libssh/libssh.h
+++ b/include/libssh/libssh.h
@@ -311,7 +311,7 @@ int ssh_options_set_wanted_algos(SSH_OPTIONS *opt, int algo, const char *list);
void ssh_options_set_username(SSH_OPTIONS *opt, const char *username);
void ssh_options_set_port(SSH_OPTIONS *opt, unsigned int port);
int ssh_options_getopt(SSH_OPTIONS *options, int *argcptr, char **argv);
-void ssh_options_set_host(SSH_OPTIONS *opt, const char *host);
+int ssh_options_set_host(SSH_OPTIONS *opt, const char *host);
void ssh_options_set_fd(SSH_OPTIONS *opt, socket_t fd);
void ssh_options_set_bind(SSH_OPTIONS *opt, const char *bindaddr, int port);
void ssh_options_set_identity(SSH_OPTIONS *opt, const char *identity);
diff --git a/libssh/options.c b/libssh/options.c
index 09eb0b30..f38951c8 100644
--- a/libssh/options.c
+++ b/libssh/options.c
@@ -211,24 +211,50 @@ void ssh_options_free(SSH_OPTIONS *opt) {
SAFE_FREE(opt);
}
-/** \brief set destination hostname
- * \param opt option structure
- * \param hostname host name to connect
+/**
+ * @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.
*/
-void ssh_options_set_host(SSH_OPTIONS *opt, const char *hostname){
- char *ptr=strdup(hostname);
- char *ptr2=strchr(ptr,'@');
- if(opt->host) // don't leak memory
- free(opt->host);
- if(ptr2){
- *ptr2=0;
- opt->host=strdup(ptr2+1);
- if(opt->username)
- free(opt->username);
- opt->username=strdup(ptr);
- free(ptr);
- } else
- opt->host=ptr;
+int ssh_options_set_host(SSH_OPTIONS *opt, const char *hostname){
+ char *h;
+ char *p;
+
+ h = strdup(hostname);
+ if (h == NULL) {
+ return -1;
+ }
+ p = strchr(h, '@');
+
+ if (opt->host) {
+ SAFE_FREE(opt->host);
+ }
+
+ if (p) {
+ *p = '\0';
+ opt->host = strdup(p + 1);
+ if (opt->host == NULL) {
+ SAFE_FREE(h);
+ return -1;
+ }
+
+ if (opt->username) {
+ SAFE_FREE(opt->username);
+ }
+ opt->username = strdup(h);
+ SAFE_FREE(h);
+ if (opt->username == NULL) {
+ return -1;
+ }
+ } else {
+ opt->host = h;
+ }
+
+ return 0;
}
/** \brief set username for authentication
diff --git a/sample.c b/sample.c
index 20b19c72..543bcfcd 100644
--- a/sample.c
+++ b/sample.c
@@ -422,7 +422,10 @@ int main(int argc, char **argv){
signal(SIGTERM, do_exit);
if(user)
ssh_options_set_username(options,user);
- ssh_options_set_host(options,host);
+ if (ssh_options_set_host(options,host) < 0) {
+ ssh_options_free(options);
+ return 1;
+ }
session=ssh_new();
ssh_set_options(session,options);
if(ssh_connect(session)){