From 029ae3505828c78eb98f29ba3a6dbec063fba71d Mon Sep 17 00:00:00 2001
From: Matt Johnston <matt@ucc.asn.au>
Date: Mon, 16 Aug 2004 14:46:13 +0000
Subject: [PATCH] create known_hosts properly

--HG--
extra : convert_revision : 3f808121bb4c3b4e0ce32db12525c63d692f1dbd
---
 cli-kex.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/cli-kex.c b/cli-kex.c
index bad559c6..ca29e7d0 100644
--- a/cli-kex.c
+++ b/cli-kex.c
@@ -147,21 +147,27 @@ static void checkhostkey(unsigned char* keyblob, unsigned int keybloblen) {
 	/* Check that ~/.ssh exists - easiest way is just to mkdir */
 	if (mkdir(filename, S_IRWXU) != 0) {
 		if (errno != EEXIST) {
+			dropbear_log(LOG_INFO, "Warning: failed creating ~/.ssh: %s",
+					strerror(errno));
+			TRACE(("mkdir didn't work: %s", strerror(errno)));
 			ask_to_confirm(keyblob, keybloblen);
 			goto out; /* only get here on success */
 		}
 	}
 
 	snprintf(filename, len+18, "%s/.ssh/known_hosts", pw->pw_dir);
-	hostsfile = fopen(filename, "r+");
+	hostsfile = fopen(filename, "a+");
+	fseek(hostsfile, 0, SEEK_SET);
 	
 	/* We mightn't have been able to open it if it was read-only */
 	if (hostsfile == NULL && (errno == EACCES || errno == EROFS)) {
+			TRACE(("trying readonly: %s", strerror(errno)));
 			readonly = 1;
 			hostsfile = fopen(filename, "r");
 	}
 
 	if (hostsfile == NULL) {
+		TRACE(("hostsfile didn't open: %s", strerror(errno)));
 		ask_to_confirm(keyblob, keybloblen);
 		goto out; /* We only get here on success */
 	}
@@ -228,11 +234,12 @@ static void checkhostkey(unsigned char* keyblob, unsigned int keybloblen) {
 	/* If we get here, they said yes */
 
 	if (readonly) {
+		TRACE(("readonly"));
 		goto out;
 	}
 
 	/* put the new entry in the file */
-	fseek(hostsfile, 0, SEEK_END);
+	fseek(hostsfile, 0, SEEK_END); /* In case it wasn't opened append */
 	buf_setpos(line, 0);
 	buf_setlen(line, 0);
 	buf_putbytes(line, ses.remotehost, hostlen);
-- 
GitLab