-- Transport Mechanism: Maintain: un-common commands -- [Indigo]<Grapevine>Maintain>MaintainCommands.mesa -- Andrew Birrell 13-Jan-82 16:18:58 -- Philip Karlton 15-May-81 16:09:26 DIRECTORY Ascii USING[ CR, DEL ], BodyDefs USING[ Connect, maxConnectLength, maxRemarkLength, maxRNameLength, Password, Remark, RName ], MaintainPrivate USING[ CheckConnect, CheckMailName, CheckRealName, Confirm, CopyName, Del, Handle, ReadPassword, ReadWord, RemoveAllMemberships, Update], ProtocolDefs USING[ RegServerEnquirySocket], PupDefs USING[ GetPupAddress, PupAddress, PupNameTrouble ], String USING[ StringToNumber ]; MaintainCommands: PROGRAM IMPORTS MaintainPrivate, ProtocolDefs, PupDefs, String EXPORTS MaintainPrivate = BEGIN OPEN MaintainPrivate; VerifyName: PUBLIC PROCEDURE[handle: MaintainPrivate.Handle] = BEGIN OPEN handle; ReadWord[glass, ": "L, dName]; CheckMailName[dName]; glass.WriteString[" ... ok"L]; END; DeleteIndividual: PUBLIC PROCEDURE[handle: MaintainPrivate.Handle] = BEGIN OPEN handle; ReadWord[glass, ": "L, individual]; CopyName[from: individual, to: dName]; IF Confirm[glass] THEN BEGIN Update[handle: handle, op: DeleteIndividual, name: individual]; glass.WriteChar[Ascii.CR]; glass.WriteString["--> Remove All Memberships"L]; MaintainPrivate.RemoveAllMemberships[handle]; END; END; CreateGroup: PUBLIC PROCEDURE[handle: MaintainPrivate.Handle] = BEGIN OPEN handle; ReadWord[glass, ": "L, group]; CopyName[from: group, to: dName]; Update[handle: handle, op: CreateGroup, name: group]; END; InitializeNewName: PUBLIC PROCEDURE[handle: MaintainPrivate.Handle] = BEGIN OPEN handle; ReadWord[glass, " from old name: "L, name]; CheckRealName[name]; ReadWord[glass, ", creating new name: "L, dName]; Update[handle: handle, op: NewName, name: dName, value: name]; END; DeleteGroup: PUBLIC PROCEDURE[handle: MaintainPrivate.Handle] = BEGIN OPEN handle; ReadWord[glass, ": "L, group]; CopyName[from: group, to: dName]; IF Confirm[glass] THEN BEGIN Update[handle: handle, op: DeleteGroup, name: group]; glass.WriteChar[Ascii.CR]; glass.WriteString["--> Remove All Memberships"L]; MaintainPrivate.RemoveAllMemberships[handle]; END; END; SetPassword: PUBLIC PROCEDURE[handle: MaintainPrivate.Handle] = BEGIN OPEN handle; pwstring: STRING = [32]; pw: BodyDefs.Password; pw ← ReadPassword[glass, " to be: "L, pwstring]; ReadWord[glass, " for individual: "L, individual]; CopyName[from: individual, to: dName]; Update[handle: handle, op: ChangePassword, name: individual, key: pw]; END; SetDecimalPassword: PUBLIC PROCEDURE[handle: MaintainPrivate.Handle] = BEGIN OPEN handle; buffer: STRING = [7] --177777B--; pw: BodyDefs.Password; glass.WriteString[" to be (4 numbers):"L]; FOR i: CARDINAL IN [0..LENGTH[pw]) DO ReadWord[glass, " "L, buffer]; pw[i] ← String.StringToNumber[buffer, 10]; ENDLOOP; ReadWord[glass, " for individual: "L, individual]; CopyName[from: individual, to: dName]; Update[handle: handle, op: ChangePassword, name: individual, key: pw]; END; SetConnect: PUBLIC PROCEDURE[handle: MaintainPrivate.Handle] = BEGIN OPEN handle; connect: BodyDefs.Connect = [BodyDefs.maxConnectLength]; ReadWord[glass, " to be: "L, connect]; IF connect.length > 0 THEN CheckConnect[connect]; ReadWord[glass, " for individual: "L, individual]; CopyName[from: individual, to: dName]; Update[handle: handle, op: ChangeConnect, name: individual, connect: connect]; END; BadRemark: PUBLIC ERROR[bad: CHARACTER] = CODE; SetRemark: PUBLIC PROCEDURE[handle: MaintainPrivate.Handle] = BEGIN OPEN handle; remark: BodyDefs.Remark = [BodyDefs.maxRemarkLength]; IF glass.ReadString[" to be: "L, remark, line] = Ascii.DEL THEN ERROR MaintainPrivate.Del[]; FOR index: CARDINAL IN [0..remark.length) DO SELECT remark[index] FROM ' , '!, '#, '$, '%, '&, '(, '), '*, '+, ',, '-, '., '/, IN ['0..'9], '<, '=, '>, '?, '@, IN ['A..'Z], '[, ("\\"L)[0]--for cedar escapes!--, '], '↑, '←, IN ['a..'z], '{, '|, '}, '~ => NULL; ENDCASE => ERROR BadRemark[remark[index]]; ENDLOOP; ReadWord[glass, " for group: "L, group]; CopyName[from: group, to: dName]; Update[handle: handle, op: ChangeRemark, name: group, remark: remark]; END; RemoveMailbox: PUBLIC PROCEDURE[handle: MaintainPrivate.Handle] = BEGIN OPEN handle; ReadWord[glass, " at server: "L, name]; ReadWord[glass, " from individual: "L, individual]; CopyName[from: individual, to: dName]; Update[handle: handle, op: DeleteMailBox, name: individual, value: name]; END; AddForward: PUBLIC PROCEDURE[handle: MaintainPrivate.Handle] = BEGIN OPEN handle; ReadWord[glass, " to destination recipient: "L, name]; CheckMailName[name]; ReadWord[glass, " for individual: "L, individual]; CopyName[from: individual, to: dName]; Update[handle: handle, op: AddForward, name: individual, value: name]; END; RemoveForward: PUBLIC PROCEDURE[handle: MaintainPrivate.Handle] = BEGIN OPEN handle; ReadWord[glass, " to destination recipient: "L, name]; ReadWord[glass, " from individual: "L, individual]; CopyName[from: individual, to: dName]; Update[handle: handle, op: DeleteForward, name: individual, value: name] END; AddOwner: PUBLIC PROCEDURE[handle: MaintainPrivate.Handle] = BEGIN OPEN handle; ReadWord[glass, ": "L, name]; CheckMailName[name]; ReadWord[glass, " to group: "L, group]; CopyName[from: group, to: dName]; Update[handle: handle, op: AddOwner, name: group, value: name] END; RemoveOwner: PUBLIC PROCEDURE[handle: MaintainPrivate.Handle] = BEGIN OPEN handle; ReadWord[glass, ": "L, name]; ReadWord[glass, " from group: "L, group]; CopyName[from: group, to: dName]; Update[handle: handle, op: DeleteOwner, name: group, value: name]; END; AddFriend: PUBLIC PROCEDURE[handle: MaintainPrivate.Handle] = BEGIN OPEN handle; ReadWord[glass, ": "L, name]; IF name.length = 0 OR name[0] # '* THEN CheckMailName[name]; ReadWord[glass, " to group: "L, group]; CopyName[from: group, to: dName]; Update[handle: handle, op: AddFriend, name: group, value: name]; END; RemoveFriend: PUBLIC PROCEDURE[handle: MaintainPrivate.Handle] = BEGIN OPEN handle; ReadWord[glass, ": "L, name]; ReadWord[glass, " from group: "L, group]; CopyName[from: group, to: dName]; Update[handle: handle, op: DeleteFriend, name: group, value: name]; END; SetServer: PUBLIC PROCEDURE[handle: MaintainPrivate.Handle] = BEGIN OPEN handle; serverSite: BodyDefs.RName = [BodyDefs.maxRNameLength]; addr: PupDefs.PupAddress ← serverAddr; addr.socket ← [0,0]; ReadWord[glass, " to be NLS-name or addr: "L, serverSite]; PupDefs.GetPupAddress[@addr, serverSite ! PupDefs.PupNameTrouble => GOTO bad ]; addr.socket ← ProtocolDefs.RegServerEnquirySocket; IF str # NIL THEN str.delete[str]; str ← NIL; serverAddr ← addr; addrKnown ← TRUE; EXITS bad => handle.glass.WriteString[" ... Bad NLS-name"L]; END; END.