From 6026de46486913c40a9469267c429b2dfa57d806 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 2 Apr 2009 10:13:12 +0000 Subject: Improve ssh_options_set_host(). git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@347 7dcaeef0-15fb-0310-b436-a5af3365683c --- include/libssh/libssh.h | 2 +- libssh/options.c | 60 +++++++++++++++++++++++++++++++++++-------------- sample.c | 5 ++++- 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)){ -- cgit