// IfsTelnetStat.bcpl -- IFS system statistics commands
// Copyright Xerox Corporation 1979, 1980, 1981
// Last modified November 12, 1981 5:30 PM by Taft
get "Ifs.decl"
get "IfsSystemInfo.decl"
get "IfsRs.decl"
get "IfsFiles.decl"
get "Disks.d"
get "Tfs.d"
get "Pup0.decl"
get "Pup1.decl"
external
[
// outgoing procedures
ExecSystat; ExecDskStat; ExecStatistics; TotalFreePages; ExecDayTime
// incoming procedures
LeafSystat; MemStatistics; DiskStatistics; DirStatistics; MailStatus
ServStatistics
ReadDIF; ReadCalendar; ActiveJobs; Plural; WRITEUDT; PrintPort
TerminatingChar; SelectKeyword
Puts; Wss; Ws; PutTemplate; SysFree; Zero; MoveBlock
DoubleAdd; DoubleSubtract; Div
VFileReadPage
// incoming statics
dsp; CtxRunning; primaryIFS
jobT; maxJobs; lenJobT; leafPresent; infoVMD
]
//---------------------------------------------------------------------------
let ExecDskStat(cs) be
//---------------------------------------------------------------------------
[
let dif = ReadDIF(CtxRunning>>RSCtx.userInfo>>UserInfo.connName)
if dif ne 0 then
[
PutTemplate(dsp, "*n$UED pages used out of $UED in directory <$S>.",
lv dif>>DIF.diskPageUsage, lv dif>>DIF.diskPageLimit,
CtxRunning>>RSCtx.userInfo>>UserInfo.connName)
SysFree(dif)
]
let free, used = vec 1, vec 1
TotalFreePages(primaryIFS, free, used)
DoubleSubtract(used, free)
PutTemplate(dsp, "*n$ED pages used, $ED left in the system.", used, free)
]
//---------------------------------------------------------------------------
and TotalFreePages(fs, pFree, pTotal; numargs na) be
//---------------------------------------------------------------------------
// Returns in the doubleword pointed to be pFree the total number of
// free pages in the file system fs. If pTotal supplied, also returns
// the total size of the file system in the doubleword pointed to by pTotal.
[
let foo = nil // cell after na
if na ls 3 then pTotal = lv na
Zero(pFree, 2); Zero(pTotal, 2)
let pagesH, pagesL = 0, nil
for unit = 0 to fs>>IFS.numUnits-1 do
[
let kdh = fs>>IFS.lpdt↑unit>>DSK.diskKd
pagesL = kdh>>KDH.freePages
DoubleAdd(pFree, lv pagesH)
pagesL = kdh>>TFSKD.nVTracks * kdh>>KDH.nHeads * kdh>>KDH.nSectors
DoubleAdd(pTotal, lv pagesH)
]
]
//---------------------------------------------------------------------------
and ExecSystat(cs) be
//---------------------------------------------------------------------------
[
let now = vec 1
ReadCalendar(now)
DoubleSubtract(now, lv VFileReadPage(infoVMD, spPage)>>SysParams.ifsStartTime)
let seconds = nil
let hours = Div(now, 3600, lv seconds)
let users = ActiveJobs()
PutTemplate(dsp, "*nIFS up $D:$2F0D:$2F0D, $D user$S out of $D.",
hours, seconds/60, seconds rem 60, users, Plural(users), maxJobs)
for i = 0 to lenJobT-1 do
[
let ctx = jobT>>JobT↑i
if ctx ne 0 then
[
let name = ctx>>RSCtx.userInfo
if name ne 0 then name = name>>UserInfo.userName
if name eq 0 then name = "Not logged in"
Puts(dsp, $*n); Ws(name)
for j = name>>String.length to 15 do Puts(dsp, $*s)
Ws(selecton ctx>>RSCtx.type into
[
case jobTypeFTP: " FTP "
case jobTypeMTP: " MTP "
case jobTypeTelnet: " Telnet"
case jobTypeBackup: " Backup"
case jobTypeMail: " Mail "
case jobTypeMiscellaneous: " Misc. "
case jobTypeLeaf: " Leaf "
case jobTypePress: " Press "
case jobTypeNameUpdate: " NameUp"
case jobTypeBootUpdate: " BootUp"
case jobTypeCopyDisk: " CpyDsk"
default: " ?? "
])
if ctx>>RSCtx.bspSoc ne 0 then
[
let port = vec lenPort
MoveBlock(port, lv ctx>>RSCtx.bspSoc>>PupSoc.frnPort, lenPort)
port>>Port.socket↑1 = 0; port>>Port.socket↑2 = 0
Ws(" ["); PrintPort(dsp, port); Puts(dsp, $])
]
]
]
if leafPresent then LeafSystat();
]
//---------------------------------------------------------------------------
and ExecStatistics(cs) be
//---------------------------------------------------------------------------
[
test TerminatingChar(cs) eq $*n
ifso
[
MemStatistics(); DiskStatistics(); DirStatistics();
ServStatistics(); MailStatus()
]
ifnot
[
Wss(cs, " (for)")
switchon SelectKeyword(cs, "Memory", "Disk", "Directory",
"Mail", "Servers") into
[
case 1: MemStatistics(); endcase
case 2: DiskStatistics(); endcase
case 3: DirStatistics(); endcase
case 4: MailStatus(); endcase
case 5: ServStatistics(); endcase
]
]
]
//---------------------------------------------------------------------------
and ExecDayTime(cs) be
//---------------------------------------------------------------------------
[
Ws(" = ")
WRITEUDT(dsp, 0, true)
]