// GateConName.bcpl -- talks to the Name server // Last modified July 2, 1983 10:23 PM by Boggs get "Pup0.decl" get "Pup1.decl" get "PupNameServ.decl" external [ // outgoing procedures CreateNameCtx; RestartName; Name; NameSummary // incoming procedures OpenLevel1Socket; CloseLevel1Socket GetBuf; ReleasePBI; AppendStringToPup; GetPartner Zero; MoveBlock; Allocate; Free; Enqueue; ReturnFrom InitializeContext; Block; SetTimer; TimerHasExpired; Noop Ws; Wss; PutTemplate; Puts; PrintPort; GetString; Confirm ResetCmdMenu; CreateCmdBox; TopLevel; BoxProc SendCommand; MiscCmd // incoming statics dsp; sysZone; ctxQ; gcHost; oldStatsQ; wheel ] static @nu structure NU: // nu -> this 'global frame' for this module [ soc word // -> PupSoc stats word // -> Name Server Stats block timer word // update stats when this expires ] manifest lenNU = size NU/16 //---------------------------------------------------------------------------- let CreateNameCtx() be //---------------------------------------------------------------------------- [ Enqueue(ctxQ, InitializeContext(Allocate(sysZone, 150), 150, NameCtx)) nu = Allocate(sysZone, lenNU); Zero(nu, lenNU) nu>>NU.soc = Allocate(sysZone, lenPupSoc); OpenLevel1Socket(nu>>NU.soc) ] //--------------------------------------------------------------------------- and RestartName() be //--------------------------------------------------------------------------- [ SetTimer(lv nu>>NU.timer, 0) if nu>>NU.stats ne 0 then [ Enqueue(oldStatsQ, nu>>NU.stats); nu>>NU.stats = 0 ] ] //---------------------------------------------------------------------------- and Name() be //---------------------------------------------------------------------------- [ ResetCmdMenu() CreateCmdBox(TopLevel, "TopLevel") CreateCmdBox(NameToAddress, "Name->Address") CreateCmdBox(AddressToName, "Address->Name") if gcHost ne 0 then [ CreateCmdBox(NameStats, "NameStats") CreateCmdBox(NetDirVersion, "NetDirVersion") if wheel then [ CreateCmdBox(LockName, "Lock") CreateCmdBox(UnlockName, "Unlock") ] ] // ResetCmdMenu destroyed the BoxQ which BoxProc is following. // If we just return now, BoxProc will get horribly confused. // So don't let it continue: force a return from BoxProc. ReturnFrom(BoxProc) ] //---------------------------------------------------------------------------- and NameCtx(ctx) be //a context //---------------------------------------------------------------------------- [ Block() repeatuntil TimerHasExpired(lv nu>>NU.timer) & gcHost ne 0 SetTimer(lv nu>>NU.timer, 1000) // 10 sec let pbi = GetBuf(nu>>NU.soc) pbi>>PBI.pup.dPort.socket↑2 = psMiscServ pbi = SendCommand(pbi, ptNetDirStatsRequest, pupOvBytes, (nu>>NU.stats? 1, 3)) if pbi ne 0 then [ let stats = lv pbi>>PBI.pup.words if pbi>>PBI.pup.type eq ptNetDirStatsReply & stats>>Stats.version eq nameStatsVersion then [ if nu>>NU.stats then Enqueue(oldStatsQ, nu>>NU.stats) let lenStatBlock = (pbi>>PBI.pup.length-pupOvBytes+1)/2 nu>>NU.stats = Allocate(sysZone, lenStatBlock) MoveBlock(nu>>NU.stats, stats, lenStatBlock) ] ReleasePBI(pbi) ] ] repeat //---------------------------------------------------------------------------- and NameSummary(stream) be //---------------------------------------------------------------------------- [ if nu>>NU.stats ne 0 then PutTemplate(stream, "Name: $EUD ", lv nu>>NU.stats>>Stats.nameReqs) ] //---------------------------------------------------------------------------- and NameStats() be //---------------------------------------------------------------------------- [ let oldStats = nu>>NU.stats SetTimer(lv nu>>NU.timer, 0) let timer = nil; SetTimer(lv timer, 500) // 5 sec Block() repeatuntil TimerHasExpired(lv timer) % nu>>NU.stats ne oldStats test nu>>NU.stats ne oldStats ifso Ws("*NName Server stats:") ifnot [ Ws("*NThe Name Server doesn't answer.") if nu>>NU.stats ne 0 then Ws("*NWhen last heard from its stats were:") ] if nu>>NU.stats ne 0 then [ PutTemplate(dsp, "*NLookups: $EUD Dirs Sent: $EUD Cache Hits: $EUD Cache Misses: $EUD", lv nu>>NU.stats>>Stats.nameReqs, lv nu>>NU.stats>>Stats.dirReqs, lv nu>>NU.stats>>Stats.cacheHits, lv nu>>NU.stats>>Stats.cacheMisses) ] ] //--------------------------------------------------------------------------- and NameToAddress() be //--------------------------------------------------------------------------- [ let name = vec 128; unless GetString("*NName: ", name) return Lookup(ptNetDirLookup, name) ] //--------------------------------------------------------------------------- and AddressToName() be //--------------------------------------------------------------------------- [ let name = vec 128; unless GetString("*NAddress: ", name) return let port = vec lenPort; unless GetPartner(name, dsp, port) return Lookup(ptNetDirLookup1, port) ] //--------------------------------------------------------------------------- and Lookup(type, arg) be //--------------------------------------------------------------------------- [ let soc = vec lenPupSoc; OpenLevel1Socket(soc) let pbi = GetBuf(soc) pbi>>PBI.pup.dPort.socket↑2 = psMiscServ test type eq ptNetDirLookup ifso AppendStringToPup(pbi, 1, arg) ifnot [ MoveBlock(lv pbi>>PBI.pup.words, arg, lenPort) pbi>>PBI.pup.length = pupOvBytes +6 ] pbi = SendCommand(pbi, type) test pbi ne 0 ifso [ switchon pbi>>PBI.pup.type into [ case ptNetDirReply1: case ptNetDirError: [ for i = 1 to pbi>>PBI.pup.length-pupOvBytes do Puts(dsp, pbi>>PBI.pup.bytes↑i) endcase ] case ptNetDirReply: [ for i = 1 to pbi>>PBI.pup.length-pupOvBytes by 6 do PutTemplate(dsp, "$P ", PrintPort, lv pbi>>PBI.pup.bytes↑i) endcase ] ] ReleasePBI(pbi) ] ifnot Ws(" - no response") CloseLevel1Socket(soc) ] //---------------------------------------------------------------------------- and NetDirVersion() be //---------------------------------------------------------------------------- [ let version = 0 MiscCmd(ptNetDirVersion, ptNetDirVersion, PrintVersion, lv version, 1) ] //---------------------------------------------------------------------------- and PrintVersion(pbi) be //---------------------------------------------------------------------------- PutTemplate(dsp, "*NNetDir version = $UD", pbi>>PBI.pup.words↑1) //---------------------------------------------------------------------------- and LockName() be if Confirm("*NLock Name Server") then //---------------------------------------------------------------------------- MiscCmd(ptNetDirLockRequest, ptNetDirLockReply, Noop) //---------------------------------------------------------------------------- and UnlockName() be MiscCmd(ptNetDirUnlockRequest, ptNetDirUnlockReply, Noop) //----------------------------------------------------------------------------