// IfsTelnetGroup.bcpl -- Commands dealing with group membership // Copyright Xerox Corporation 1979, 1981 // Last modified November 18, 1981 12:02 PM by Taft get "IfsFiles.decl" get "IfsDirs.decl" get "Streams.d" get "IfsRS.decl" get "CmdScan.decl" external [ // outgoing procedures ExecChangeGroup; ExecShowGroup // incoming procedures CreateKeywordTable; InsertKeyword; DestroyKeywordTable GetString; GetGroup; AbortCmd; PrintSubFilename TelnetCommandLoop; TelnetSubcommandPrompt; TelnetAborting; Plural LookupIFSFile; NextFD; DestroyFD OpenIFSStream; KsBufferAddress; CloseIFSStream GetDIF; UpdateCachedDIF; WheelCall SysFree; FreePointer; GetBit; SetBit Gets; Errors; Wss; Ws; PutTemplate; IFSPrintError // incoming statics CtxRunning; dsp; enableGrapevineGroup ] //---------------------------------------------------------------------------- let ExecChangeGroup(cs) be //---------------------------------------------------------------------------- // Change Group-membership <group> <subcommands> // Subcommands are: // Add <user> // Remove <user> [ Wss(cs, " (of group) ") let group = GetGroup(cs) if CtxRunning>>RSCtx.userInfo>>UserInfo.capabilities.wheel eq 0 then [ let dif = GetDIF(0, true) // read my DIF from file system if dif eq 0 then Errors(cs, 0) let own = GetBit(lv dif>>DIF.ownedGroups, group) SysFree(dif) unless own do AbortCmd(cs, "*nYou do not have access to manipulate that group.") ] if enableGrapevineGroup then [ Ws("*n[Caution: Grapevine group-membership checking is enabled.") Ws("*n Changes involving Grapevine R-Names will not be permanent.]") ] let kt = CreateKeywordTable(2) InsertKeyword(kt, "Add")!0 = true InsertKeyword(kt, "Remove")!0 = false TelnetCommandLoop(kt, TelnetSubcommandPrompt(), true, group, 0, 0, SetGroup) DestroyKeywordTable(kt) ] //---------------------------------------------------------------------------- and SetGroup(cs, entry, group) be //---------------------------------------------------------------------------- // Add|Remove <user> [ Wss(cs, " (user) ") let name = GetString(cs, 0, Wss, "directory name") let dif = GetDIF(name, true) // accept only real DIFs if dif eq 0 then [ SysFree(name); Errors(cs, 0) ] SetBit(lv dif>>DIF.userGroups, group, entry!0) UpdateCachedDIF(name, dif) FreePointer(lv name, lv dif) ] //---------------------------------------------------------------------------- and ExecShowGroup(cs) be //---------------------------------------------------------------------------- // Show Group-membership <group> [ Wss(cs, " (of group) ") let group = GetGroup(cs) if enableGrapevineGroup then [ Ws("*n[Caution: Grapevine group-membership checking is enabled.") Ws("*n Information about Grapevine R-Names may not be up-to-date.]") ] let numUsers = 0 let fd = LookupIFSFile("<**>!1", lcVExplicit+lcMultiple) if fd ne 0 then [ [ // repeat if TelnetAborting() break if fd>>FD.dr>>DR.type ne drTypeDIF then loop let stream = WheelCall(OpenIFSStream, fd, 0, modeRead, wordItem) if stream ne 0 then [ // DIF is in the stream buffer now if GetBit(lv KsBufferAddress(stream)>>DIF.userGroups, group) then [ Ws((numUsers rem 5 eq 0? "*n", ", ")) PrintSubFilename(dsp, fd, 2, fd>>FD.lenDirString-1) numUsers = numUsers+1 ] CloseIFSStream(stream) ] ] repeatwhile NextFD(fd) DestroyFD(fd) ] PutTemplate(dsp, "*n$D user$S in group $D.", numUsers, Plural(numUsers), group) ]