// Log.bcpl - Routines for handling logging entries.
// Copyright Xerox Corporation 1979
// last modified October 7, 1978 3:42 AM by Boggs
get "AltoFileSys.d"
get "Streams.d"
external
[
// outgoing procedures
LogOpen; LogClose; MakeLogEntry
// incoming statics
disableLogging
fpSysLog; faSysLog
sysZone; sysDisk
]
// incoming procedures
DefaultArgs
EnumerateFp
CreateDiskStream
MoveBlock
DayTime
FileLength
WriteBlock
CloseDiskStream
KsBufferAddress
KsSetBufferAddress
CleanupDiskStream
Allocate
Free
LnPageSize
ReturnFrom
JumpToFa
GetCurrentFa
]
static [ disableLogging; LogS ]
// L O G S
//---------------------------------------------------------------------------
structure LOGV: // Log entry value
//---------------------------------------------------------------------------
[
type bit 6
length bit 10
time @TIME
fp @FP //Usually for file access
]
manifest lLOGV = size LOGV/16
manifest // LOGV types
[
typLogFree = 0
typLogOpenFile = 1 //Accessed a file.
typLogDeleteFile = 2 //Deleted a file.
typLogCreateFile = 3 //Created a brand new file.
typLogRenameFile = 4 //Re-used an allocated file
typLogReformatDirectory = 5 //Re-shuffled directory.
typLogString = 63 //Bcpl string for all to see.
]
// Make log entries -- but not references to system files.
let LogOpen(zone) be unless disableLogging then
[
LogS=CreateDiskStream(fpSysLog, 0, 0, 0, 0, zone, noLog)
if LogS eq 0 then return
LogS>>ST.error=LogRetX
LogS>>ST.par1=LogOpen
FileLength(LogS) // Get to the end
LogXClose(zone)
]
and LogClose(zone) be if LogS then
[
LogS>>ST.par1=LogClose
LogXOpen(zone)
CloseDiskStream(LogS)
LogS=0
]
and LogXOpen(zone) be
[
let a=Allocate(zone, 256)
KsSetBufferAddress(LogS, a)
JumpToFa(LogS, faSysLog) //Fill the buffer.
FileLength(LogS) //Make damn sure at end!
]
and LogXClose(zone) be
[
CleanupDiskStream(LogS)
GetCurrentFa(LogS, faSysLog) // remember a disk address
let a=KsBufferAddress(LogS)
Free(zone, a)
]
and MakeLogEntry(logType, filePtr, logInfo, zone, disk; numargs n) be
[
static svp
DefaultArgs(lv n, -2, 0, sysZone, sysDisk)
let CheckLogFp(fp) be
[ if svp ne 0 &
svp>>FP.leaderVirtualDa eq fp>>FP.leaderVirtualDa
then svp=0
]
svp=filePtr
EnumerateFp(CheckLogFp)
if LogS eq 0 % logInfo eq noLog % disk ne sysDisk %
(filePtr ne 0 & (svp eq 0 % filePtr>>FP.serialNumber.nolog ne 0))
then return
LogS>>ST.par1=MakeLogEntry
LogXOpen(zone)
if LogS eq 0 then return //Error encountered in "xopen"
let a=vec lLOGV
MoveBlock(lv a>>LOGV.fp, filePtr, lFP)
DayTime(lv a>>LOGV.time)
a>>LOGV.type=logType
let l=(logInfo ne 0)? logInfo!0, 0
a>>LOGV.length=lLOGV+l
//[ external [ Wns; FilePos; Ws; dsp ]
// Ws("Log at "); Wns(dsp, FilePos(LogS)); Ws(" for ")
// Wns(dsp, lLOGV+l); Ws("*N")
//]
WriteBlock(LogS, a, lLOGV)
if l then WriteBlock(LogS, logInfo+1, l)
LogXClose(zone)
]
and LogRetX() be
[
let s=LogS
LogS=0
ReturnFrom(s>>ST.par1)
]