// IfsTelnetAdmin.bcpl -- privileged IFS server telnet commands
// Copyright Xerox Corporation 1979, 1981
// Last modified November 25, 1981 2:57 PM by Taft
get "Ifs.decl"
get "IfsRs.decl"
get "IfsTelnet.decl"
get "IfsFiles.decl"
get "IfsDirs.decl"
external
[
// outgoing procedures
ExecEnable; ExecDisable; ExecCreate; ExecDestroy; ExecHalt
// incoming procedures
ExecChangeDirectory; GetString; Confirm; TelnetCommandQuit
EnableCatch; EndCatch;
EnableTimeServ; EnableNameServ; EnableBootServ; EnablePress
GetDIF; ReadDIF; DestroyUser; Password
Wss; Ws; Puts; Closes; Resets; Errors; PutTemplate; IFSPrintError;
SysAllocateZero; SysFree; MoveBlock; SetBlock; FreePointer
// incoming statics
CtxRunning; dsp; loginKT; enableKT; entFlag; haltFlag;
]
//---------------------------------------------------------------------------
let ExecEnable(cs) be
//---------------------------------------------------------------------------
[
if CtxRunning>>TCtx.capabilities<<Capabilities.wheel eq 0 then Errors(cs, 0)
CtxRunning>>TCtx.userInfo>>UserInfo.capabilities.wheel = true
CtxRunning>>TCtx.topKT = enableKT
TelnetCommandQuit(cs) //force prompt string to be recomputed
]
//---------------------------------------------------------------------------
and ExecDisable(cs) be
//---------------------------------------------------------------------------
[
CtxRunning>>TCtx.userInfo>>UserInfo.capabilities.wheel = false
CtxRunning>>TCtx.topKT = loginKT
TelnetCommandQuit(cs) //force prompt string to be recomputed
]
//---------------------------------------------------------------------------
and ExecCreate(cs) be
//---------------------------------------------------------------------------
// Create <directory> <password> <subcommands>
[
Wss(cs, " (directory) ")
let name, dif = 0, 0
if EnableCatch(cs) then
[
FreePointer(lv name, lv dif)
EndCatch(cs)
]
name = GetString(cs, 0, Wss, "directory name")
let difName = nil
dif = GetDIF(name, true, lv difName) // accept only real DIF
let new = dif eq 0
test new
ifso
[
Wss(cs, " [New] (password) ")
dif = ReadDIF("Default-User")
if dif eq 0 then dif = SysAllocateZero(lenDIF)
let password = GetString(cs, 0, Wss, "password")
test password>>String.length eq 0
ifso SetBlock(lv dif>>DIF.password, -1, size DIF.password/16)
ifnot Password(password, lv dif>>DIF.password, true)
SysFree(password)
]
ifnot
[
Wss(cs, " [Old]")
SysFree(name)
name = difName
]
// Accept "Change Directory-Parameters" subcommands
ExecChangeDirectory(cs, name, dif, new)
FreePointer(lv name, lv dif)
]
//---------------------------------------------------------------------------
and ExecDestroy(cs) be
//---------------------------------------------------------------------------
[
Wss(cs, " (directory) ")
let name = 0
if EnableCatch(cs) then [ FreePointer(lv name); EndCatch(cs) ]
name = GetString(cs, 0, Wss, "directory name")
if Confirm(cs) then
[
let ec = DestroyUser(name)
if ec ne 0 then
[ Ws("*nFailed: "); IFSPrintError(dsp, ec) ]
]
FreePointer(lv name)
]
//---------------------------------------------------------------------------
and ExecHalt(cs) be
//---------------------------------------------------------------------------
[
Wss(cs, " (the system) ")
if Confirm(cs) then
[
entFlag = false
haltFlag = true //notify Reaper
EnableTimeServ(false) // turn off misc servers
EnableNameServ(false)
EnableBootServ(false)
EnablePress(false)
]
Ws("*n[You must log out before the system will halt.]")
]