diff options
author | Andreas Schneider <mail@cynapses.org> | 2009-04-02 10:13:12 +0000 |
---|---|---|
committer | Andreas Schneider <mail@cynapses.org> | 2009-04-02 10:13:12 +0000 |
commit | 6026de46486913c40a9469267c429b2dfa57d806 (patch) | |
tree | 6fede1e55d6cef6544f263aad812b38afa87f320 | |
parent | a9ef024f1045f696e424c77d7bbde8ce324916ac (diff) | |
download | libssh-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.h | 2 | ||||
-rw-r--r-- | libssh/options.c | 60 | ||||
-rw-r--r-- | 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 @@ -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)){ |