<> <> <> DIRECTORY Basics USING [Comparison], BasicTime USING [GMT], Arpa USING [Address], ArpaUDP USING [Port], FSBackdoor USING [ErrorCode, Version], FSRemoteFileBackdoor USING [DeleteProc, DoIOProc, EnumerateForInfoProc, EnumerateForNamesProc, GetInfoProc, GetServerProc, RenameProc, RetrieveProc, ServerHandle, StoreProc, SweepProc, ValidateProc], Rope USING [ROPE], SunNFS USING [DirOpRes, FHandle, Stat, TimeVal], SunRPC USING [Handle], SunRPCAuth USING [Conversation] ; SunNFSFSRemoteFile: CEDAR DEFINITIONS ~ { <> ROPE: TYPE ~ Rope.ROPE; ServerHandle: TYPE ~ FSRemoteFileBackdoor.ServerHandle; Version: TYPE ~ FSBackdoor.Version; <> ServerData: TYPE ~ REF ServerDataObject; ServerDataObject: TYPE ~ RECORD [ ttl: CARD, downMsg: ROPE, -- non-NIL => down hostName: ROPE, address: Arpa.Address, port: ArpaUDP.Port, h: SunRPC.Handle, c: SunRPCAuth.Conversation, <> remoteDirs: RemoteDirHandle, <> mountPort: ArpaUDP.Port, cachedHandles: REF ]; ObtainRPCHandleAndConversation: PROC [sH: ServerHandle] RETURNS [h: SunRPC.Handle, c: SunRPCAuth.Conversation]; <> ReleaseRPCHandleAndConversation: PROC [sH: ServerHandle, h: SunRPC.Handle, c: SunRPCAuth.Conversation]; <> SunNFSGetServer: FSRemoteFileBackdoor.GetServerProc; SunNFSSweep: FSRemoteFileBackdoor.SweepProc; SunNFSValidate: FSRemoteFileBackdoor.ValidateProc; SunNFSDelete: FSRemoteFileBackdoor.DeleteProc; SunNFSEnumerateForInfo: FSRemoteFileBackdoor.EnumerateForInfoProc; SunNFSEnumerateForNames: FSRemoteFileBackdoor.EnumerateForNamesProc; SunNFSGetInfo: FSRemoteFileBackdoor.GetInfoProc; SunNFSRename: FSRemoteFileBackdoor.RenameProc; SunNFSRetrieve: FSRemoteFileBackdoor.RetrieveProc; SunNFSStore: FSRemoteFileBackdoor.StoreProc; SunNFSDoIO: FSRemoteFileBackdoor.DoIOProc; <> RemoteDirHandle: TYPE ~ REF RemoteDirObject; RemoteDirObject: TYPE ~ RECORD [ parent, child, sibling: RemoteDirHandle, nameComponent: ROPE, -- u/l case exactly as on server fHandle: SunNFS.FHandle, createMode: CARD, -- default mode for files created in this directory createModeTTL: CARDINAL, content: DirEntries, contentMTime: SunNFS.TimeVal, contentTTL: CARDINAL, contentLocked: BOOL _ FALSE, contentAvailable: CONDITION, useCount: CARDINAL, ttl: CARDINAL ]; DirEntries: TYPE ~ REF DirEntriesObject; DirEntriesObject: TYPE ~ RECORD [ next: DirEntries _ NIL, count: CARDINAL _ 0, entries: SEQUENCE maxCount: CARDINAL OF ROPE ]; GetRemoteDirRoot: PROC [sH: ServerHandle] RETURNS [dH: RemoteDirHandle]; <> GetRemoteDirChild: PROC [sH: ServerHandle, dH: RemoteDirHandle, childName: ROPE, create: BOOL] RETURNS [dHChild: RemoteDirHandle, created: BOOL]; <> <> <> CreateSubdirectory: PROC [sH: ServerHandle, dH: RemoteDirHandle, name: ROPE, desiredMode: CARD] RETURNS [fH: SunNFS.FHandle]; <> InsertRemoteDirChild: PROC [dH: RemoteDirHandle, childName: ROPE, fHandle: SunNFS.FHandle] RETURNS [dHChild: RemoteDirHandle]; <> PinRemoteDirPath: PROC [dH: RemoteDirHandle]; <> <> UnPinRemoteDir: PROC [dH: RemoteDirHandle] RETURNS [dHParent: RemoteDirHandle]; <> UnPinRemoteDirPath: PROC [dH: RemoteDirHandle]; <> <<>> SweepRemoteDirCache: PROC [root: RemoteDirHandle, seconds: CARD]; <> GetCreateMode: PROC [sH: ServerHandle, dH: RemoteDirHandle, forDirectory: BOOL _ FALSE] RETURNS [createMode: CARD]; <> EachDirEntryProc: TYPE ~ PROC [entryName: ROPE] RETURNS [continue: BOOL _ TRUE]; EnumerateDirectory: PROC [sH: ServerHandle, dH: RemoteDirHandle, eachDirEntry: EachDirEntryProc, staleOK: BOOL _ FALSE]; <> <> <> FollowDirPath: PROC [sH: ServerHandle, nR: NameReader, case: BOOL, create: BOOL] RETURNS [dH: RemoteDirHandle]; <> <> <> <> <> LookupThruSymLinks: PROC [sH: ServerHandle, dH: RemoteDirHandle, name: ROPE] RETURNS [SunNFS.DirOpRes]; <> <> <> <> caseFileNamePrefix: READONLY ROPE; caseFileNamePrefixLen: READONLY INT; CreateCaseFile: PROC [sH: ServerHandle, dH: RemoteDirHandle, base: ROPE]; <> CollectCaseFile: PROC [sH: ServerHandle, dH: RemoteDirHandle, base: ROPE]; <> <> VersionInfo: TYPE ~ { missing, bang, bangNumber, bangStar, bangH, bangL }; <> versionPartLeftBracket: READONLY ROPE; versionPartLeftBracketLen: READONLY INT; versionPartRightBracket: READONLY CHAR; versionPartRightBracketLen: READONLY INT; DecodeVersionFromNFSName: PROC [name: ROPE, checkCase: BOOL _ FALSE] RETURNS [nameWithoutVersion: ROPE, version: Version, caseOK: BOOL]; <> <> <<>> EncodeVersionInNFSName: PROC [name: ROPE, version: Version] RETURNS [nameWithVersion: ROPE]; <> <> NameReader: TYPE ~ REF NameReaderObject; NameReaderObject: TYPE ~ RECORD [ text: REF READONLY TEXT, index: CARDINAL ]; ReadDirComponent: PROC [nR: NameReader, case: BOOL] RETURNS [component: ROPE]; <foo!17", the first call of ReadDirComponent will return NIL and leave things ready for ReadBaseComponent.>> <> ReadBaseComponent: PROC [nR: NameReader, case: BOOL, stripVersion: BOOL _ FALSE] RETURNS [base: ROPE, vI: VersionInfo, version: Version, isPattern: BOOL, patternHead: ROPE]; <> <> <> CreateNameReader: PROC [r: ROPE] RETURNS [nR: NameReader]; ResetNameReader: PROC [nR: NameReader, position: INTEGER]; <> <> NameWriter: TYPE ~ REF NameWriterObject; NameWriterObject: TYPE ~ RECORD [ text: REF TEXT ]; CreateNameWriter: PROC RETURNS [nW: NameWriter]; <> WriteDirComponent: PROC [nW: NameWriter, component: ROPE]; WriteBaseComponent: PROC [nW: NameWriter, component: ROPE]; <" if the writer is currently empty, then appends component.>> <" unconditionally, then appends component.>> <> RetractComponent: PROC [nW: NameWriter]; RetractAndReturnComponent: PROC [nW: NameWriter] RETURNS [r: ROPE]; <<"Back up" the last component written to the writer.>> RopeFromNameWriter: PROC [nW: NameWriter] RETURNS [ROPE]; <