diff options
-rw-r--r-- | libssh/keyfiles.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/libssh/keyfiles.c b/libssh/keyfiles.c index bac0ea2f..d219dc10 100644 --- a/libssh/keyfiles.c +++ b/libssh/keyfiles.c @@ -22,13 +22,15 @@ * MA 02111-1307, USA. */ +#include <ctype.h> +#include <errno.h> +#include <fcntl.h> +#include <sys/stat.h> +#include <sys/types.h> #include <stdio.h> #include <string.h> -#include <errno.h> #include <unistd.h> #include <stdlib.h> -#include <fcntl.h> -#include <ctype.h> #ifndef _WIN32 #include <arpa/inet.h> @@ -1447,6 +1449,7 @@ int ssh_write_knownhost(SSH_SESSION *session) { unsigned char *pubkey_64; char buffer[4096] = {0}; FILE *file; + char *dir; size_t len = 0; if (ssh_options_default_known_hosts_file(session->options) < 0) { @@ -1460,6 +1463,22 @@ int ssh_write_knownhost(SSH_SESSION *session) { return -1; } + /* Check if ~/.ssh exists and create it if not */ + dir = ssh_dirname(session->options->known_hosts_file); + if (dir == NULL) { + ssh_set_error(session, SSH_FATAL, "%s", strerror(errno)); + return -1; + } + if (! ssh_file_readaccess_ok(dir)) { + if (mkdir(dir, 0700) < 0) { + ssh_set_error(session, SSH_FATAL, + "Cannot create %s directory.", dir); + SAFE_FREE(dir); + return -1; + } + } + SAFE_FREE(dir); + file = fopen(session->options->known_hosts_file, "a"); if (file == NULL) { ssh_set_error(session, SSH_FATAL, |