OSErr error;
struct enum_settings_state *state;
- state = safemalloc(sizeof(*state));
+ state = snew(struct enum_settings_state);
error = get_session_dir(kDontCreateFolder, &state->vRefNum, &state->dirID);
if (error != noErr) {
- safefree(state);
+ sfree(state);
return NULL;
}
state->index = 1;
return;
}
+/*
+ * This host key cache uses a file in the PuTTY Preferences folder and
+ * stores keys as individual TEXT resources in the resource fork of
+ * that file. This has two problems. Firstly, a resource fork can
+ * contain no more than 2727 resources. Secondly, the Resource
+ * Manager uses a linear search to find a particular resource, which
+ * could make having lots of host keys quite slow.
+ */
+
int verify_host_key(const char *hostname, int port,
const char *keytype, const char *key)
{
char *resname;
Str255 presname;
Handle resvalue;
+ Handle reshandle;
int id;
/* Open the host key file */
UseResFile(keyrefnum);
resname = dupprintf("%s@%d:%s", keytype, port, hostname);
c2pstrcpy(presname, resname);
-
+
+ reshandle = Get1NamedResource(FOUR_CHAR_CODE('TEXT'), presname);
+ if (reshandle != NULL) {
+ /* The resource exists, we're replacing a host key */
+ RemoveResource(reshandle);
+ }
error = PtrToHand(key, &resvalue, strlen(key));
if (error != noErr) goto out;
sfree(resname);
}
-
-
/*
* Emacs magic:
* Local Variables: