// IfsBackupCmd4.bcpl -- operator interface for backup system
// Copyright Xerox Corporation 1979, 1980, 1981
// Last modified November 17, 1981 8:38 PM by Taft
get "Ifs.decl"
get "IfsSystemInfo.decl"
get "IfsFiles.decl"
get "IfsDirs.decl"
get "Disks.d"
get "IfsBackup.decl"
external
[
// outgoing procedures
BackupMount; BackupDismount
// incoming procedures
GetString; Confirm; AbortCmd; EnableCatch; EndCatch
DestroyCreateParams; CreateIFS; OpenIFS; CloseIFS
LookupIFSFile; TransferLeaderPage; DestroyFD; GetBufferForFD
TotalFreePages
VFileReadPage; VFileWritePage; LockCell; UnlockCell
CopyString; StringCompare
Ws; Wss; Puts; PutTemplate; IFSPrintError; WritePackedDT
ReadCalendar; DoubleSubtract; DoubleUsc; Div
Closes; Errors; SysFree; FreePointer; MoveBlock; Zero
// incoming statics
dsp; infoVMD; backupRunning
]
//----------------------------------------------------------------------------
let BackupMount(cs) be
//----------------------------------------------------------------------------
[
Wss(cs, " (backup pack) ")
let name = 0
let bi = nil
if EnableCatch(cs) then
[ UnlockCell(lv bi); FreePointer(lv name); EndCatch(cs) ]
bi = VFileWritePage(infoVMD, biPage)
LockCell(lv bi)
if bi>>BI.version ne biVersion then
AbortCmd(cs, "*nPlease set backup parameters first.")
name = GetString(cs, 0, Wss, "pack name")
let bfsd = 0
for i = 0 to numBFSD-1 do
[
let bfsd1 = lv bi>>BI.bfsd↑((bi>>BI.iBFSD+i) rem numBFSD)
switchon bfsd1>>BFSD.state into
[
case bfsdUsed:
Zero(bfsd1, lenBFSD) //fall into next case
case bfsdEmpty:
[ if bfsd eq 0 then bfsd = bfsd1; endcase ]
case bfsdUsable:
case bfsdInUse:
[
if StringCompare(name, lv bfsd1>>BFSD.id) eq 0 then
AbortCmd(cs, " -- already mounted.")
endcase
]
]
]
if bfsd eq 0 then AbortCmd(cs, "*nCan't mount any more.")
let ec = nil
let backupFS = OpenIFS(name, lv ec)
FreePointer(lv name)
if backupFS eq 0 then
[ Puts(dsp, $*n); IFSPrintError(dsp, ec); AbortCmd(cs) ]
if backupFS>>IFS.type ne ifsTypeBackup then
[ CloseIFS(backupFS); AbortCmd(cs, "*nNot a backup pack.") ]
// BackupMount (cont'd)
TotalFreePages(backupFS, lv bfsd>>BFSD.freePages)
PutTemplate(dsp, "*n$S ($S), initialized on $P,*n$ED free pages.",
backupFS>>IFS.id, backupFS>>IFS.name, WritePackedDT,
lv backupFS>>IFS.created, lv bfsd>>BFSD.freePages)
let fd = LookupIFSFile("<System>BackupIFS.Dir", lcVHighest, 0, backupFS)
test fd eq 0
ifso
Ws("*nNo files backed up on this pack.")
ifnot
[
let buf = GetBufferForFD(fd)
// no need to lock -- I am the only client of this file system
TransferLeaderPage(fd, buf)
DestroyFD(fd)
PutTemplate(dsp, "*nLast backup occurred at $P.",
WritePackedDT, lv buf>>ILD.created)
let age = vec 1; ReadCalendar(age);
DoubleSubtract(age, lv buf>>ILD.created)
if DoubleUsc(age, lv bi>>BI.fullPeriod) ls 0 then
PutTemplate(dsp, "*nWarning: last backup less than $D days old!",
Div(lv bi>>BI.fullPeriod, 3600, age)/24)
SysFree(buf)
]
CopyString(lv bfsd>>BFSD.id, backupFS>>IFS.id)
CloseIFS(backupFS)
if Confirm(cs, "*nIs this the correct pack?") then
[
bfsd>>BFSD.refresh = Confirm(cs,
"*nDo you want to overwrite (re-initialize) this pack?")
bfsd>>BFSD.state = bfsdUsable
bi>>BI.okToGo = true
]
UnlockCell(lv bi)
]
//----------------------------------------------------------------------------
and BackupDismount(cs) be
//----------------------------------------------------------------------------
[
Wss(cs, " (backup pack) ")
let bi = VFileReadPage(infoVMD, biPage)
if bi>>BI.okToGo % backupRunning then
AbortCmd(cs, "*nBackup system must be disabled and halted.")
let name = GetString(cs, 0, Wss, "pack name")
bi = VFileWritePage(infoVMD, biPage)
LockCell(lv bi)
let found = false
for i = 0 to numBFSD-1 do
if StringCompare(name, lv bi>>BI.bfsd↑i.id) eq 0 then
[
found = true
Zero(lv bi>>BI.bfsd↑i, lenBFSD)
break
]
UnlockCell(lv bi)
SysFree(name)
unless found do AbortCmd(cs, " -- not found")
]