// IfsTelnetLogin.bcpl -- IFS server telnet Login, Logout, Connect commands // Copyright Xerox Corporation 1979, 1980, 1981 // Last modified November 17, 1981 9:15 PM by Taft get "Ifs.decl" get "IfsRs.decl" get "IfsTelnet.decl" get "IfsFiles.decl" get "IfsDirs.decl" external [ // outgoing procedures ExecLogin; ExecLogout; ExecConnect; ExecDirectory // incoming procedures CreateUserInfo; DestroyUserInfo GetPhrase; GetString; TerminatingChar; Confirm; EnableCatch; EndCatch BeginDefaultPhrase; EndDefaultPhrase TelnetCommandQuit; AbortCmd Login; Connect; Password; FreePointer; IFSPrintError; PutTemplate LookupIFSFile; DestroyFD; ByteBlt Puts; Errors; Wss; Ws; SysFree; FalsePredicate // incoming statics noLoginKT; loginKT; enableKT; entFlag; haltFlag CtxRunning; dsp ] //--------------------------------------------------------------------------- let ExecLogin(cs) be //--------------------------------------------------------------------------- // Login <username> <password> <optional-account> [ let name, password = 0, 0 Wss(cs, " (user) ") if EnableCatch(cs) then [ DestroyUserInfo(CtxRunning>>TCtx.userInfo) CtxRunning>>TCtx.userInfo = CreateUserInfo() FreePointer(lv name, lv password) EndCatch(cs) ] let ui = CtxRunning>>TCtx.userInfo name = GetString(cs, 0, Wss, "user name") Wss(cs, " (password) ") password = GetString(cs, 0, Wss, "password", FalsePredicate) let ec = Login(name, password, ui) FreePointer(lv name, lv password) if ec ne 0 then [ Puts(dsp, $*n); IFSPrintError(dsp, ec); AbortCmd(cs) ] if TerminatingChar(cs) ne $*n then [ Wss(cs, " (account) ") GetPhrase(cs, 0, 0, 0, Wss, "account") ] CtxRunning>>TCtx.topKT = loginKT CtxRunning>>TCtx.capabilities = ui>>UserInfo.capabilities ui>>UserInfo.capabilities = 0 TelnetCommandQuit(cs) //so new topKT is noticed ] //--------------------------------------------------------------------------- and ExecConnect(cs) be //--------------------------------------------------------------------------- // Connect <dir-name> <password> [ let ui = CtxRunning>>TCtx.userInfo let name = 0 let ec = ecConnectPassword Wss(cs, " (to directory) ") if EnableCatch(cs) then [ FreePointer(lv name); EndCatch(cs) ] name = GetString(cs, 0, Wss, "directory name") if TerminatingChar(cs) eq $*n then ec = Connect(name, "", ui) // attempt to connect without password if ec eq ecConnectPassword then [ Wss(cs, " (password) ") let password = GetString(cs, 0, Wss, "password", FalsePredicate) ec = Connect(name, password, ui) SysFree(password) ] if ec ne 0 then [ Puts(dsp, $*n); IFSPrintError(dsp, ec); AbortCmd(cs) ] FreePointer(lv name, lv ui>>UserInfo.defaultDir) ] //--------------------------------------------------------------------------- and ExecLogout(cs) be //--------------------------------------------------------------------------- [ if TerminatingChar(cs) eq $*n % Confirm(cs) then [ if not entFlag & not haltFlag & CtxRunning>>TCtx.userInfo>>UserInfo.capabilities.wheel then unless Confirm(cs, "*nLogins are disabled! Are you sure?") return Puts(cs, $*n) CtxRunning>>TCtx.logout = true TelnetCommandQuit(cs) ] ] //--------------------------------------------------------------------------- and ExecDirectory(cs) be //--------------------------------------------------------------------------- // Directory <default-directory-pathname> [ Wss(cs, " (default) ") let ui = CtxRunning>>RSCtx.userInfo BeginDefaultPhrase(cs) PutTemplate(cs, "<$S>", (ui>>UserInfo.defaultDir ne 0? ui>>UserInfo.defaultDir, ui>>UserInfo.connName)) EndDefaultPhrase(cs) let dir = GetString(cs, 0, Wss, "<directory>subdirectory>...>") test dir>>String.length eq 0 ifso [ FreePointer(lv dir, lv ui>>UserInfo.defaultDir) dir = ui>>UserInfo.connName ] ifnot [ if dir>>String.char↑1 eq $< then [ dir>>String.length = dir>>String.length-1 ByteBlt(dir, 1, dir, 2, dir>>String.length) ] if dir>>String.char↑(dir>>String.length) eq $> then dir>>String.length = dir>>String.length-1 // Check that it is well-formed and that the initial <dir> substring // corresponds to an existing directory name. let ec = nil let fd = LookupIFSFile("", lcVHighest, lv ec, 0, dir) if fd ne 0 then DestroyFD(fd) unless ec eq 0 % ec eq ecFileNotFound do [ SysFree(dir); Errors(cs, 0) ] FreePointer(lv ui>>UserInfo.defaultDir) ui>>UserInfo.defaultDir = dir ] PutTemplate(dsp, "*nDefault directory changed to <$S>.", dir) ]