+enum {
+ INDEX_DIR, INDEX_HOSTKEYS
+};
+
+static void make_filename(char *filename, int index)
+{
+ char *home;
+ int len;
+ home = getenv("HOME");
+ strncpy(filename, home, FILENAME_MAX);
+ len = strlen(filename);
+ strncpy(filename + len,
+ index == INDEX_DIR ? "/.putty" :
+ index == INDEX_HOSTKEYS ? "/.putty/sshhostkeys" :
+ "/.putty/ERROR", FILENAME_MAX - len);
+ filename[FILENAME_MAX-1] = '\0';
+}
+
+/*
+ * Read an entire line of text from a file. Return a buffer
+ * malloced to be as big as necessary (caller must free).
+ */
+static char *fgetline(FILE *fp)
+{
+ char *ret = smalloc(512);
+ int size = 512, len = 0;
+ while (fgets(ret + len, size - len, fp)) {
+ len += strlen(ret + len);
+ if (ret[len-1] == '\n')
+ break; /* got a newline, we're done */
+ size = len + 512;
+ ret = srealloc(ret, size);
+ }
+ if (len == 0) { /* first fgets returned NULL */
+ sfree(ret);
+ return NULL;
+ }
+ ret[len] = '\0';
+ return ret;
+}
+
+/*
+ * Lines in the host keys file are of the form
+ *
+ * type@port:hostname keydata
+ *
+ * e.g.
+ *
+ * rsa@22:foovax.example.org 0x23,0x293487364395345345....2343
+ */