// IfsMailCommand.bcpl -- telnet interface to mail system
// Copyright Xerox Corporation 1980, 1981
// Last modified November 14, 1981 10:41 AM by Taft
get "Ifs.decl"
get "IfsSystemInfo.decl"
get "IfsRs.decl"
get "IfsMail.decl"
get "Pup0.decl"
external
[
// outgoing procedures
ExecMail
// incoming procedures
MailStatus; InitMailStats
CreateKeywordTable; InsertKeyword; DestroyKeywordTable
TelnetCommandQuit; TelnetCommandLoop; SelectKeyword
LockCell; UnlockCell; VFileWritePage; VFileReadPage
Enqueue; Unqueue; Free; FreePointer; ExtractSubstring
MoveBlock; Min; Zero; MultEq
Confirm; DefaultPhrase; GetString; EnumeratePupAddresses
Wss; Ws; Errors; PutTemplate; Plural
// incoming statics
mail; infoVMD; dsp; sysZone; socketQ
]
//----------------------------------------------------------------------------
let ExecMail(cs) be
//----------------------------------------------------------------------------
[
let kt = CreateKeywordTable(9)
InsertKeyword(kt, "Dead-Letter")!0 = 1
InsertKeyword(kt, "Distribution-lists")!0 = 2
InsertKeyword(kt, "Disable")!0 = 3
InsertKeyword(kt, "Enable")!0 = 4
InsertKeyword(kt, "Grapevine")!0 = 5
InsertKeyword(kt, "Quit")!0 = 6
InsertKeyword(kt, "Registry")!0 = 7
InsertKeyword(kt, "Reset")!0 = 8
InsertKeyword(kt, "Status")!0 = 9
TelnetCommandLoop(kt, "*N**", 0, 0, 0, 0, MailSubCommand)
DestroyKeywordTable(kt)
]
//----------------------------------------------------------------------------
and MailString(cs, prompt, msOffset, nil; numargs na) = valof
//----------------------------------------------------------------------------
// 3-argument form installs new string in MS page.
// 4-argument form simply returns the new string.
[
PutTemplate(cs, " ($S) ", prompt)
let ms = VFileWritePage(infoVMD, msPage)
LockCell(lv ms)
DefaultPhrase(cs, ms+msOffset)
UnlockCell(lv ms)
let name = GetString(cs, 0, Wss, prompt)
name>>String.length = Min(name>>String.length, maxMailParamChars)
test na eq 3
ifso
[
ms = VFileWritePage(infoVMD, msPage)
MoveBlock(ms+msOffset, name, name>>String.length rshift 1 +1)
Free(sysZone, name)
]
ifnot
resultis name
]
//----------------------------------------------------------------------------
and MailSubCommand(cs, entry, nil) be
//----------------------------------------------------------------------------
switchon entry!0 into
[
case 1: // Dead-letter
MailString(cs, "recipient name", offset MS.deadLtr/16)
endcase
case 2: // Distribution-lists
MailString(cs, "directory name", offset MS.nameDirDL/16)
endcase
case 3: // Disable
case 4: // Enable
[
let enable = entry!0 eq 4
Wss(cs, " (mail)")
let which = SelectKeyword(cs, "system",
(mail>>Mail.enabled? "forwarding", 0))
if Confirm(cs) then
[
let ms = VFileWritePage(infoVMD, msPage)
// don't bother to LockCell because none of the following can Block
switchon which into
[
case 1: // system
if mail>>Mail.enabled eq 0 & enable then
Enqueue(socketQ, mail>>Mail.rs>>RS.soc)
if mail>>Mail.enabled ne 0 & not enable then
Unqueue(socketQ, mail>>Mail.rs>>RS.soc)
mail>>Mail.enabled = enable
ms>>MS.enabled = enable
endcase
case 2: // forwarding
mail>>Mail.forward = enable
ms>>MS.forward = enable
endcase
]
]
endcase
]
case 5: // Grapevine
[
let name = MailString(cs, "server name", offset MS.gvName/16, nil)
let port = vec lenPort
if name>>String.length ne 0 then
unless EnumeratePupAddresses(name, 0, port) eq 0 &
port>>Port.net ne 0 &
MultEq(lv port>>Port.socket, table [ 0; socketMail ]) do
[ Free(sysZone, name); Errors(cs, 0) ]
MoveBlock(lv VFileWritePage(infoVMD, msPage)>>MS.gvName, name,
name>>String.length rshift 1 +1)
Free(sysZone, name)
endcase
]
case 6: // Quit
TelnetCommandQuit(cs)
case 7: // Registry
MailString(cs, "we are part of", offset MS.registry/16)
endcase
case 8: // Reset
Ws(" (mail statistics)")
if Confirm(cs) then
[
let ms = VFileWritePage(infoVMD, msPage)
LockCell(lv ms); InitMailStats(ms); UnlockCell(lv ms)
]
endcase
case 9: // Status
MailStatus()
endcase
]