-- 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.