+#define SEED_SIZE 512
+
+void read_random_seed(noise_consumer_t consumer)
+{
+ short puttyVRefNum;
+ long puttyDirID;
+ OSErr error;
+ char buf[SEED_SIZE];
+ short refnum;
+ long count = SEED_SIZE;
+
+ if (get_putty_dir(kDontCreateFolder, &puttyVRefNum, &puttyDirID) != noErr)
+ return;
+ if (HOpenDF(puttyVRefNum, puttyDirID, "\pPuTTY Random Seed", fsRdPerm,
+ &refnum) != noErr)
+ return;
+ error = FSRead(refnum, &count, buf);
+ if (error != noErr && error != eofErr)
+ return;
+ (*consumer)(buf, count);
+ FSClose(refnum);
+}
+
+void write_random_seed(void *data, int len)
+{
+ short puttyVRefNum, tmpVRefNum;
+ long puttyDirID, tmpDirID;
+ OSErr error;
+ FSSpec dstfile, tmpfile;
+ short refnum;
+ long count = len;
+
+ if (get_putty_dir(kCreateFolder, &puttyVRefNum, &puttyDirID) != noErr)
+ return;
+
+ error = FSMakeFSSpec(puttyVRefNum, puttyDirID, "\pPuTTY Random Seed",
+ &dstfile);
+ if (error != noErr && error != fnfErr) return;
+
+ /* Create a temporary file to save to first. */
+ error = FindFolder(puttyVRefNum, kTemporaryFolderType, kCreateFolder,
+ &tmpVRefNum, &tmpDirID);
+ if (error != noErr) return;
+ error = FSMakeFSSpec(tmpVRefNum, tmpDirID, "\pPuTTY Random Seed",
+ &tmpfile);
+ if (error != noErr && error != fnfErr) return;
+ if (error == noErr) {
+ error = FSpDelete(&tmpfile);
+ if (error != noErr) return;
+ }
+ error = FSpCreate(&tmpfile, PUTTY_CREATOR, SEED_TYPE, smRoman);
+ if (error != noErr) return;
+
+ if (FSpOpenDF(&tmpfile, fsWrPerm, &refnum) != noErr) goto fail;
+
+ if (FSWrite(refnum, &count, data) != noErr) goto fail2;
+ if (FSClose(refnum) != noErr) goto fail;
+
+ if (FSpExchangeFiles(&tmpfile, &dstfile) != noErr) goto fail;
+ if (FSpDelete(&tmpfile) != noErr) return;
+
+ return;
+
+ fail2:
+ FSClose(refnum);
+ fail:
+ FSpDelete(&tmpfile);
+}