-- Registration Server - Defs for operations on a registry. -- [Indigo]<Grapevine>MS>RegServerDefs.mesa -- J. Dion, September 8, 1979 -- Andrew Birrell 27-Oct-82 15:48:41 DIRECTORY BodyDefs USING[ oldestTime, RName, Timestamp], HeapDefs USING[ ObjectNumber, ReaderHandle, WriterHandle], ProtocolDefs USING[ Connect, Password, Remark, ReturnCode, RNameType, RSOperation], RegBTreeDefs USING[ RegistryObject ]; RegServerDefs: DEFINITIONS = BEGIN Registration: PROGRAM; -- Module that handles incoming connections -- RegMail: PROGRAM; -- Module for generating RS-internal mail for updates -- CreateIndividual: PROCEDURE [name: BodyDefs.RName, password: ProtocolDefs.Password] RETURNS [ProtocolDefs.ReturnCode]; -- creates a new individual entry with no mailbox sites DeleteIndividual: PROCEDURE [name: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- deletes an individual entry. CreateGroup: PROCEDURE [name, caller: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- creates a new group entry with no members and a single -- maintainer, the creator. DeleteGroup: PROCEDURE [name: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- deletes a group if caller has sufficient privilege. CreateRegistry: PROCEDURE [entry, caller: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- creates a new registry. DeleteRegistry: PROCEDURE [entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- deletes a registry (must it be empty?). ChangePassword: PROCEDURE [entry: BodyDefs.RName, pw: ProtocolDefs.Password] RETURNS [ProtocolDefs.ReturnCode]; -- changes the password of an individual. ChangeConnect: PROCEDURE [entry: BodyDefs.RName, connect: ProtocolDefs.Connect] RETURNS [ProtocolDefs.ReturnCode]; -- changes the connect-site of an individual. ChangeRemark: PROCEDURE [entry: BodyDefs.RName, remark: ProtocolDefs.Remark] RETURNS [ProtocolDefs.ReturnCode]; -- changes the remark for a group. AddMailbox: PROCEDURE [name, entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- adds a mailbox to an individual. DeleteMailbox: PROCEDURE [name, entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- Deletes a mailbox from an individual. AddForward: PROCEDURE [name, entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- adds a forwarding for an individual. DeleteForward: PROCEDURE [name, entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- Deletes forwarding from an individual. AddMember: PROCEDURE [name, entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- adds a member to a group. DeleteMember: PROCEDURE [name, entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- Deletes a member from a group. AddOwner: PROCEDURE [name, entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- adds an owner to a group. DeleteOwner: PROCEDURE [name, entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- Deletes an owner from a group. AddFriend: PROCEDURE [name, entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- adds a member to the "friends" acl of a group. DeleteFriend: PROCEDURE [name, entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- Deletes a member from the "friends" acl of a group. AddListOfMembers: PROC[ name: BodyDefs.RName, reader: HeapDefs.ReaderHandle] RETURNS[ ProtocolDefs.ReturnCode ]; -- "reader" is sublist containing desired R-Names -- NewName: PROC[new, old: BodyDefs.RName] RETURNS[ProtocolDefs.ReturnCode]; UpdateSublist: PROCEDURE [name, element: BodyDefs.RName, op: ProtocolDefs.RSOperation, prevStamp: BodyDefs.Timestamp ← BodyDefs.oldestTime] RETURNS [rc: ProtocolDefs.ReturnCode]; -- Update a sublist of entry; inform other R-Servers iff "prevStamp=oldestTime" -- Update: PROCEDURE [object: HeapDefs.ObjectNumber]; -- updates a registry entry with the heap object 'object' -- which is a possibly more recent version of the entry. The result -- which replaces the entry is constructed by merging the old and new -- versions on the basis of the timestamps of their components. CheckRName: PROCEDURE [entry: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp] RETURNS [ProtocolDefs.ReturnCode]; -- checks whether the R-Name is known -- Read: PROCEDURE [entry: BodyDefs.RName] RETURNS [reader: HeapDefs.ReaderHandle, rc: ProtocolDefs.ReturnCode, components, password: CARDINAL]; -- returns a reader for the entire registry entry for the -- group or individual -- Expand: PROCEDURE [entry: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp] RETURNS [HeapDefs.ReaderHandle, ProtocolDefs.ReturnCode]; -- returns a reader for the member list of a group or the -- mailbox list for an individual. ReadMembers: PROCEDURE [entry: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp] RETURNS [HeapDefs.ReaderHandle, ProtocolDefs.ReturnCode]; -- returns a reader for the member list of a group. ReadOwners: PROCEDURE [entry: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp] RETURNS [HeapDefs.ReaderHandle, ProtocolDefs.ReturnCode]; -- returns a reader for the "owners list of a group ReadFriends: PROCEDURE [entry: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp] RETURNS [HeapDefs.ReaderHandle, ProtocolDefs.ReturnCode]; -- returns a reader for the "friends" list of a group ReadRegistryMembers: PROCEDURE [entry: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp] RETURNS [HeapDefs.ReaderHandle, ProtocolDefs.ReturnCode]; -- returns a reader for the member list of a group's registry. ReadRegistryOwners: PROCEDURE [entry: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp] RETURNS [HeapDefs.ReaderHandle, ProtocolDefs.ReturnCode]; -- returns a reader for the "owners" list of a group's registry ReadRegistryFriends: PROCEDURE [entry: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp] RETURNS [HeapDefs.ReaderHandle, ProtocolDefs.ReturnCode]; -- returns a reader for the "friends" list of a group's registry ReadPassword: PROCEDURE [entry: BodyDefs.RName] RETURNS [ProtocolDefs.Password, ProtocolDefs.ReturnCode]; -- returns the password of an individual. ReadConnect: PROCEDURE [entry: BodyDefs.RName, connect: ProtocolDefs.Connect] RETURNS [ProtocolDefs.ReturnCode]; -- returns the connect-site of an individual. ReadRemark: PROCEDURE [entry: BodyDefs.RName, remark: ProtocolDefs.Remark] RETURNS [ProtocolDefs.ReturnCode]; -- Access control operations -- Membership: TYPE = {yes, no, badList--includes WrongServer--}; MembershipGrade:TYPE = MACHINE DEPENDENT{self(0), registry(1)}; MembershipAcl: TYPE = MACHINE DEPENDENT{members(0), owners(1), friends(2)}; MembershipLevel:TYPE = MACHINE DEPENDENT{direct(0), closure(1), upArrow(2)}; -- direct looks only in the specified list -- -- upArrow is closure by following names of form "foo↑.reg" -- -- closure is general closure operation -- -- self looks in the specified group, registry looks in its registry -- -- members, owners, friends look in the appropriate sub-list -- IsInList: PROCEDURE[entry: BodyDefs.RName, member: BodyDefs.RName, level: MembershipLevel, grade: MembershipGrade, acl: MembershipAcl ] RETURNS[ membership: Membership, rc: ProtocolDefs.ReturnCode ]; -- general "IsMember" function -- IsMember: PROCEDURE[entry: BodyDefs.RName, member: BodyDefs.RName, level: MembershipLevel] RETURNS[ membership: Membership, rc: ProtocolDefs.ReturnCode ] = INLINE { [membership,rc] ← IsInList[entry, member, level, self, members] }; IsOwner: PROCEDURE[entry: BodyDefs.RName, member: BodyDefs.RName, level: MembershipLevel] RETURNS[ membership: Membership, rc: ProtocolDefs.ReturnCode ] = INLINE { [membership,rc] ← IsInList[entry, member, level, self, owners] }; IsFriend: PROCEDURE[entry: BodyDefs.RName, member: BodyDefs.RName, level: MembershipLevel] RETURNS[ membership: Membership, rc: ProtocolDefs.ReturnCode ] = INLINE { [membership,rc] ← IsInList[entry, member, level, self, friends] }; MailUpdate: PROC[entry: BodyDefs.RName, stamp: BodyDefs.Timestamp, element: BodyDefs.RName, op: ProtocolDefs.RSOperation, rsMailObj: HeapDefs.ObjectNumber]; -- sends entry to other R-Servers then frees object -- ReadMail: PROC; -- infinite loop reading R-Server internal mail -- ConsiderPurging: PROC[RegBTreeDefs.RegistryObject,BodyDefs.Timestamp] RETURNS[BOOLEAN]; -- says whether entry may be worth purging -- ReallyPurge: PROC[BodyDefs.RName, RegBTreeDefs.RegistryObject, BodyDefs.Timestamp] RETURNS[BOOLEAN,HeapDefs.WriterHandle]; -- purges old deleted info from entry. Returns writer on new entry; -- Doesn't change the timestamp -- -- enumeration for registry removal in RegAccess -- EnumeratedMembers: PROC[name: BodyDefs.RName, type: ProtocolDefs.RNameType] RETURNS[reader: HeapDefs.ReaderHandle]; END.