summaryrefslogtreecommitdiffstats
path: root/libssh/options.c
diff options
context:
space:
mode:
Diffstat (limited to 'libssh/options.c')
-rw-r--r--libssh/options.c60
1 files changed, 43 insertions, 17 deletions
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