#include "entropyFile.h"
#include "debug.h"
#include <Files.h>
#include <Folders.h>
#include <Errors.h>
#include <Script.h> // for smSystemScript
#ifdef DEBUG
#define ENTROPY_FOLDER kPreferencesFolderType
#else
#define ENTROPY_FOLDER kSystemPreferencesFolderType
#endif
#define ENTROPY_FILE_NAME "\pSystem Entropy"
#define ENTROPY_FILE_CREATOR 'yarw'
#define ENTROPY_FILE_TYPE 'ENTR'
static OSErr openEntropyFile(
Boolean doCreate,
Boolean writeAccess, short *refNum) {
FSSpec fsp;
OSErr ortn;
short vRefNum;
long dirID;
SInt8 perm;
if(doCreate && !writeAccess) {
return paramErr;
}
*refNum = 0;
ortn = FindFolder(kOnSystemDisk,
ENTROPY_FOLDER,
kDontCreateFolder,
&vRefNum,
&dirID);
if(ortn) {
errorLog1("openEntropyFile: FindFolder returned %d\n", (int)ortn);
return ioErr;
}
ortn = FSMakeFSSpec(vRefNum, dirID, ENTROPY_FILE_NAME, &fsp);
switch(ortn) {
case noErr:
break;
case fnfErr:
if(!doCreate) {
return fnfErr;
}
else {
break;
}
default:
errorLog1("openEntropyFile: FSMakeFSSpec returned %d\n", (int)ortn);
return ioErr;
}
if(doCreate && (ortn == fnfErr)) {
ortn = FSpCreate(&fsp,
ENTROPY_FILE_CREATOR,
ENTROPY_FILE_TYPE,
smSystemScript);
if(ortn) {
errorLog1("openEntropyFile: FSpCreate returned %d\n", (int)ortn);
return ortn;
}
}
perm = (writeAccess ? fsRdWrPerm : fsRdPerm);
ortn = FSpOpenDF(&fsp, perm, refNum);
if(ortn) {
errorLog1("openEntropyFile: FSpOpenDF returned %d\n", (int)ortn);
}
return ortn;
}
OSErr writeEntropyFile(
UInt8 *bytes,
UInt32 numBytes,
Boolean append)
{
OSErr ortn;
short refNum;
long eof;
long actLength = numBytes;
ortn = openEntropyFile(true, true, &refNum);
if(ortn) {
return ortn;
}
if(append) {
ortn = GetEOF(refNum, &eof);
if(ortn) {
goto done;
}
}
else {
ortn = SetEOF(refNum, 0);
if(ortn) {
goto done;
}
eof = 0;
}
ortn = SetFPos(refNum, fsFromStart, eof);
if(ortn) {
goto done;
}
ortn = FSWrite(refNum, &actLength, bytes);
if((ortn == noErr) && (actLength != numBytes)) {
errorLog0("writeEntropyFile: short write\n");
}
done:
FSClose(refNum);
return ortn;
}
OSErr readEntropyFile(
UInt8 *bytes,
UInt32 numBytes, UInt32 *actualBytes) {
OSErr ortn;
short refNum;
long actLength = numBytes;
ortn = openEntropyFile(false, false, &refNum);
if(ortn) {
return ortn;
}
ortn = FSRead(refNum, &actLength, bytes);
*actualBytes = actLength;
FSClose(refNum);
return ortn;
}