DIRECTORY RefText USING [New, ReleaseScratch], RuntimeError USING [BoundsFault], SunNFS USING [Cookie, cookieSize, create, CreateProc, FAttr, FHandle, fhSize, FileName, FType, getattr, GetattrProc, link, LinkProc, lookup, LookupProc, maxData, maxNameLen, maxPathLen, mkdir, MkdirProc, null, NullProc, program, programVersion, read, readdir, ReaddirProc, readlink, ReadlinkProc, ReadProc, remove, RemoveProc, rename, RenameProc, rmdir, RmdirProc, SAttr, setattr, SetattrProc, Stat, statfs, StatfsProc, symlink, SymlinkProc, write, WriteProc], SunNFSClient USING [], SunRPC USING [Error, GetAlign, GetBlock, GetCard32, GetEphemeralRefText, GetRefText, Handle, PutAlign, PutBlock, PutCard32, PutRefText, ReleaseReply, SendCallAndReceiveReply, StartCall] ; SunNFSClientStub: CEDAR PROGRAM IMPORTS RefText, RuntimeError, SunRPC EXPORTS SunNFSClient ~ { Handle: TYPE ~ SunRPC.Handle; maxData: CARDINAL ~ SunNFS.maxData; maxPathLen: CARDINAL ~ SunNFS.maxPathLen; maxNameLen: CARDINAL ~ SunNFS.maxNameLen; cookieSize: CARDINAL ~ SunNFS.cookieSize; fhSize: CARDINAL ~ SunNFS.fhSize; fastTimeout: CARD _ 500; mediumTimeout: CARD _ 2000; slowTimeout: CARD _ 5000; defaultRetries: CARD _ 5; noRetries: CARD _ 0; Null: PUBLIC SunNFS.NullProc -- [h: Handle, c: Conversation] -- ~ { SunRPC.StartCall[h, c, SunNFS.program, SunNFS.programVersion, SunNFS.null]; [] _ SunRPC.SendCallAndReceiveReply[h, fastTimeout, defaultRetries]; SunRPC.ReleaseReply[h]; }; Getattr: PUBLIC SunNFS.GetattrProc -- [h: Handle, c: Conversation, file: FHandle] RETURNS [reply: AttrStat] -- ~ { SunRPC.StartCall[h, c, SunNFS.program, SunNFS.programVersion, SunNFS.getattr]; PutFHandle[h, file]; [] _ SunRPC.SendCallAndReceiveReply[h, mediumTimeout, defaultRetries]; IF (reply.status _ GetStat[h]) = ok THEN reply.attributes _ GetFAttr[h]; SunRPC.ReleaseReply[h]; }; Setattr: PUBLIC SunNFS.SetattrProc -- [h: Handle, c: Conversation, file: FHandle, attributes: SAttr] RETURNS [reply: AttrStat] -- ~ { SunRPC.StartCall[h, c, SunNFS.program, SunNFS.programVersion, SunNFS.setattr]; PutFHandle[h, file]; PutSAttr[h, attributes]; [] _ SunRPC.SendCallAndReceiveReply[h, mediumTimeout, noRetries]; IF (reply.status _ GetStat[h]) = ok THEN reply.attributes _ GetFAttr[h]; SunRPC.ReleaseReply[h]; }; Lookup: PUBLIC SunNFS.LookupProc -- [h: Handle, c: Conversation, which: DirOpArgs] RETURNS [reply: DirOpRes] -- ~ { SunRPC.StartCall[h, c, SunNFS.program, SunNFS.programVersion, SunNFS.lookup]; PutFHandle[h, which.dir]; SunRPC.PutRefText[h, which.name]; [] _ SunRPC.SendCallAndReceiveReply[h, mediumTimeout, defaultRetries]; IF (reply.status _ GetStat[h]) = ok THEN { reply.file _ GetFHandle[h]; reply.attributes _ GetFAttr[h]; }; SunRPC.ReleaseReply[h]; }; Readlink: PUBLIC SunNFS.ReadlinkProc -- [h: Handle, c: Conversation, file: FHandle] RETURNS [status: Stat, data: Path] -- ~ { SunRPC.StartCall[h, c, SunNFS.program, SunNFS.programVersion, SunNFS.readlink]; PutFHandle[h, file]; [] _ SunRPC.SendCallAndReceiveReply[h, mediumTimeout, defaultRetries]; IF (status _ GetStat[h]) = ok THEN { data _ SunRPC.GetRefText[h]; }; SunRPC.ReleaseReply[h]; }; Read: PUBLIC SunNFS.ReadProc -- [h: Handle, c: Conversation, file: FHandle, offset, count, bOffset: CARD, block: REF TEXT] RETURNS [reply: AttrStat] -- ~ { SunRPC.StartCall[h, c, SunNFS.program, SunNFS.programVersion, SunNFS.read]; PutFHandle[h, file]; SunRPC.PutCard32[h, offset]; SunRPC.PutCard32[h, count]; SunRPC.PutCard32[h, 0]; -- totalcount (obsolete) [] _ SunRPC.SendCallAndReceiveReply[h, mediumTimeout, defaultRetries]; IF (reply.status _ GetStat[h]) = ok THEN { bytes: CARD; reply.attributes _ GetFAttr[h]; bytes _ SunRPC.GetCard32[h]; SunRPC.GetBlock[h, block, bOffset, bytes]; SunRPC.GetAlign[h]; }; SunRPC.ReleaseReply[h]; }; Write: PUBLIC SunNFS.WriteProc -- [h: Handle, c: Conversation, file: FHandle, offset, count, bOffset: CARD, block: REF TEXT] RETURNS [reply: AttrStat] -- ~ { SunRPC.StartCall[h, c, SunNFS.program, SunNFS.programVersion, SunNFS.write]; PutFHandle[h, file]; SunRPC.PutCard32[h, 0]; -- beginoffset (obsolete) SunRPC.PutCard32[h, offset]; SunRPC.PutCard32[h, count]; -- totalcount (obsolete) SunRPC.PutCard32[h, count]; SunRPC.PutBlock[h, block, bOffset, count]; SunRPC.PutAlign[h, 0]; [] _ SunRPC.SendCallAndReceiveReply[h, mediumTimeout, defaultRetries]; IF (reply.status _ GetStat[h]) = ok THEN reply.attributes _ GetFAttr[h]; SunRPC.ReleaseReply[h]; }; Create: PUBLIC SunNFS.CreateProc -- [h: Handle, c: Conversation, where: DirOpArgs, attributes: SAttr] RETURNS [reply: DirOpRes] -- ~ { SunRPC.StartCall[h, c, SunNFS.program, SunNFS.programVersion, SunNFS.create]; PutFHandle[h, where.dir]; SunRPC.PutRefText[h, where.name]; PutSAttr[h, attributes]; [] _ SunRPC.SendCallAndReceiveReply[h, mediumTimeout, defaultRetries]; IF (reply.status _ GetStat[h]) = ok THEN { reply.file _ GetFHandle[h]; reply.attributes _ GetFAttr[h]; }; SunRPC.ReleaseReply[h]; }; Remove: PUBLIC SunNFS.RemoveProc -- [h: Handle, c: Conversation, which: DirOpArgs] RETURNS [status: Stat] -- ~ { SunRPC.StartCall[h, c, SunNFS.program, SunNFS.programVersion, SunNFS.remove]; PutFHandle[h, which.dir]; SunRPC.PutRefText[h, which.name]; [] _ SunRPC.SendCallAndReceiveReply[h, mediumTimeout, defaultRetries]; status _ GetStat[h]; SunRPC.ReleaseReply[h]; }; Rename: PUBLIC SunNFS.RenameProc -- [h: Handle, c: Conversation, from, to: DirOpArgs] RETURNS [status: Stat] -- ~ { SunRPC.StartCall[h, c, SunNFS.program, SunNFS.programVersion, SunNFS.rename]; PutFHandle[h, from.dir]; SunRPC.PutRefText[h, from.name]; PutFHandle[h, to.dir]; SunRPC.PutRefText[h, to.name]; [] _ SunRPC.SendCallAndReceiveReply[h, mediumTimeout, defaultRetries]; status _ GetStat[h]; SunRPC.ReleaseReply[h]; }; Link: PUBLIC SunNFS.LinkProc -- [h: Handle, c: Conversation, to: FHandle, as: DirOpArgs] RETURNS [status: Stat] -- ~ { SunRPC.StartCall[h, c, SunNFS.program, SunNFS.programVersion, SunNFS.link]; PutFHandle[h, to]; PutFHandle[h, as.dir]; SunRPC.PutRefText[h, as.name]; [] _ SunRPC.SendCallAndReceiveReply[h, mediumTimeout, defaultRetries]; status _ GetStat[h]; SunRPC.ReleaseReply[h]; }; Symlink: PUBLIC SunNFS.SymlinkProc -- [h: Handle, c: Conversation, from: DirOpArgs, to: Path, attributes: SAttr] RETURNS [status: Stat] -- ~ { SunRPC.StartCall[h, c, SunNFS.program, SunNFS.programVersion, SunNFS.symlink]; PutFHandle[h, from.dir]; SunRPC.PutRefText[h, from.name]; SunRPC.PutRefText[h, to]; PutSAttr[h, attributes]; [] _ SunRPC.SendCallAndReceiveReply[h, mediumTimeout, defaultRetries]; status _ GetStat[h]; SunRPC.ReleaseReply[h]; }; Mkdir: PUBLIC SunNFS.MkdirProc -- [h: Handle, c: Conversation, where: DirOpArgs, attributes: SAttr] RETURNS [reply: DirOpRes] -- ~ { SunRPC.StartCall[h, c, SunNFS.program, SunNFS.programVersion, SunNFS.mkdir]; PutFHandle[h, where.dir]; SunRPC.PutRefText[h, where.name]; PutSAttr[h, attributes]; [] _ SunRPC.SendCallAndReceiveReply[h, mediumTimeout, defaultRetries]; IF (reply.status _ GetStat[h]) = ok THEN { reply.file _ GetFHandle[h]; reply.attributes _ GetFAttr[h]; }; SunRPC.ReleaseReply[h]; }; Rmdir: PUBLIC SunNFS.RmdirProc -- [h: Handle, c: Conversation, which: DirOpArgs] RETURNS [status: Stat] -- ~ { SunRPC.StartCall[h, c, SunNFS.program, SunNFS.programVersion, SunNFS.rmdir]; PutFHandle[h, which.dir]; SunRPC.PutRefText[h, which.name]; [] _ SunRPC.SendCallAndReceiveReply[h, mediumTimeout, defaultRetries]; status _ GetStat[h]; SunRPC.ReleaseReply[h]; }; nilCookie: SunNFS.Cookie; Readdir: PUBLIC SunNFS.ReaddirProc -- [h: Handle, c: Conversation, dir: FHandle, cookie: Cookie, count: CARD, eachDirEntry: EachDirEntryProc] RETURNS [status: Stat, eof: BOOL, newCookie: Cookie] -- ~ { fileNameBuf: SunNFS.FileName _ NIL; SunRPC.StartCall[h, c, SunNFS.program, SunNFS.programVersion, SunNFS.readdir]; PutFHandle[h, dir]; IF cookie = NIL THEN { IF (cookie _ nilCookie) = NIL THEN { cookie _ RefText.New[cookieSize]; cookie.length _ cookieSize; FOR i: CARDINAL IN [0..cookieSize) DO cookie[i] _ VAL[0] ENDLOOP; nilCookie _ cookie; }; }; SunRPC.PutBlock[h, cookie, 0, cookie.length]; SunRPC.PutCard32[h, count]; [] _ SunRPC.SendCallAndReceiveReply[h, mediumTimeout, defaultRetries]; IF (status _ GetStat[h]) = ok THEN { eof _ FALSE; newCookie _ RefText.New[cookieSize]; WHILE (SunRPC.GetCard32[h] # 0) -- valid -- DO fileid: CARD _ SunRPC.GetCard32[h]; fileNameBuf _ SunRPC.GetEphemeralRefText[h, fileNameBuf]; SunRPC.GetBlock[h, newCookie, 0, cookieSize]; SunRPC.GetAlign[h]; IF NOT eachDirEntry[fileid, fileNameBuf].continue THEN GOTO Quit; ENDLOOP; eof _ (SunRPC.GetCard32[h] # 0); EXITS Quit => NULL; }; IF fileNameBuf # NIL THEN RefText.ReleaseScratch[fileNameBuf]; SunRPC.ReleaseReply[h]; }; Statfs: PUBLIC SunNFS.StatfsProc -- [h: Handle, c: Conversation, file: FHandle] RETURNS [reply: FSAttrStat] -- ~ { SunRPC.StartCall[h, c, SunNFS.program, SunNFS.programVersion, SunNFS.statfs]; PutFHandle[h, file]; [] _ SunRPC.SendCallAndReceiveReply[h, mediumTimeout, defaultRetries]; IF (reply.status _ GetStat[h]) = ok THEN { reply.attributes.tsize _ SunRPC.GetCard32[h]; reply.attributes.bsize _ SunRPC.GetCard32[h]; reply.attributes.blocks _ SunRPC.GetCard32[h]; reply.attributes.bfree _ SunRPC.GetCard32[h]; reply.attributes.bavail _ SunRPC.GetCard32[h]; }; SunRPC.ReleaseReply[h]; }; PutSAttr: PROC [h: SunRPC.Handle, sAttr: SunNFS.SAttr] ~ { SunRPC.PutCard32[h, sAttr.mode]; SunRPC.PutCard32[h, sAttr.uid]; SunRPC.PutCard32[h, sAttr.gid]; SunRPC.PutCard32[h, sAttr.size]; SunRPC.PutCard32[h, sAttr.atime.seconds]; SunRPC.PutCard32[h, sAttr.atime.useconds]; SunRPC.PutCard32[h, sAttr.mtime.seconds]; SunRPC.PutCard32[h, sAttr.mtime.useconds]; }; PutFHandle: PROC [h: SunRPC.Handle, fH: SunNFS.FHandle] ~ INLINE { SunRPC.PutBlock[h, fH, 0, fH.length]; }; GetFType: PROC [h: SunRPC.Handle] RETURNS [fType: SunNFS.FType] ~ { fType _ VAL[CARDINAL[SunRPC.GetCard32[h]]]; }; GetFAttr: PROC [h: SunRPC.Handle] RETURNS [attr: SunNFS.FAttr] ~ { attr.type _ GetFType[h ! RuntimeError.BoundsFault => { attr.type _ non; CONTINUE }]; attr.mode _ SunRPC.GetCard32[h]; attr.nlink _ SunRPC.GetCard32[h]; attr.uid _ SunRPC.GetCard32[h]; attr.gid _ SunRPC.GetCard32[h]; attr.size _ SunRPC.GetCard32[h]; attr.blocksize _ SunRPC.GetCard32[h]; attr.rdev _ SunRPC.GetCard32[h]; attr.blocks _ SunRPC.GetCard32[h]; attr.fsid _ SunRPC.GetCard32[h]; attr.fileid _ SunRPC.GetCard32[h]; attr.atime.seconds _ SunRPC.GetCard32[h]; attr.atime.useconds _ SunRPC.GetCard32[h]; attr.mtime.seconds _ SunRPC.GetCard32[h]; attr.mtime.useconds _ SunRPC.GetCard32[h]; attr.ctime.seconds _ SunRPC.GetCard32[h]; attr.ctime.useconds _ SunRPC.GetCard32[h]; }; GetFHandle: PROC [h: SunRPC.Handle] RETURNS [fH: SunNFS.FHandle] ~ { fH _ RefText.New[fhSize]; SunRPC.GetBlock[h, fH, 0, fhSize]; }; GetStat: PROC [h: SunRPC.Handle] RETURNS [stat: SunNFS.Stat] ~ INLINE { ENABLE RuntimeError.BoundsFault => ERROR SunRPC.Error[$protocolError]; stat _ GetStatInner[h]; }; GetStatInner: PROC [h: SunRPC.Handle] RETURNS [SunNFS.Stat] ~ { RETURN[VAL[CARDINAL[SunRPC.GetCard32[h]]]]; }; }...  SunNFSClientStub.mesa Demers, November 4, 1987 0:03:44 am PST Types Parameters Procedures Get AttrStat Get AttrStat Put DirOpArgs Get DirOpRes Put DirOpArgs Get DirOpRes Put DirOpArgs Put DirOpArgs Put DirOpArgs Put DirOpArgs Put DirOpArgs Put DirOpArgs Get DirOpRes Put DirOpArgs Κh˜codešœ™K™'K˜—šΟk ˜ Kšœœ˜$Kšœ œ˜!Kšœœΐ˜ΜKšœ œ˜Kšœœ­˜ΉKšœ˜K˜—šΟnœœ˜Kšœ˜%Kšœ ˜K˜head™Kšœœ˜—™ Kšœ œ˜#Kšœ œ˜)Kšœ œ˜)Kšœ œ˜)Kšœœ˜!K˜Kšœ œ˜Kšœœ˜Kšœ œ˜Kšœœ˜Kšœ œ˜—™ šžœœΟc"œ˜CKšœK˜KKšœD˜DK˜K˜K˜—šžœœŸKœ˜rKšœN˜NK˜KšœF˜F™ Kšœ"œ ˜H—K˜K˜K˜—šžœœŸ^œ˜…KšœN˜NK˜K˜KšœA˜A™ Kšœ"œ ˜H—K˜K˜K˜—šžœœŸNœ˜sKšœM˜M™ K˜K˜!—KšœF˜F™ šœ"œ˜*Kšœ˜Kšœ˜K˜——K˜K˜K˜—šžœœŸTœ˜}KšœO˜OK˜KšœF˜Fšœœ˜$K˜K˜—K˜K˜K˜—šžœœŸzœ˜›KšœK˜KK˜K˜Kšœ˜KšœŸ˜0KšœF˜Fšœ"œ˜*Kšœœ˜ K˜Kšœ˜Kšœ*˜*K˜K˜—K˜K˜K˜—šžœœŸzœ˜KšœL˜LK˜KšœŸ˜1K˜KšœŸ˜4K˜K˜*K˜KšœF˜FKšœ"œ ˜HK˜K˜K˜—šžœœŸaœ˜†KšœM˜M™ K˜Kšœ!˜!—K˜KšœF˜F™ šœ"œ˜*Kšœ˜Kšœ˜K˜——K˜K˜K˜—šžœœŸKœ˜pKšœM˜M™ K˜Kšœ!˜!—KšœF˜FK˜K˜K˜K˜—šžœœŸNœ˜sKšœM˜M™ K˜Kšœ ˜ —™ K˜Kšœ˜—KšœF˜FK˜K˜K˜K˜—šžœœŸUœ˜vKšœK˜KK˜™ Kšœ˜Kšœ˜—KšœF˜FK˜K˜K˜K˜—šžœœŸgœ˜ŽKšœN˜N™ K˜Kšœ ˜ —K˜K˜KšœF˜FK˜K˜K˜K˜—šžœœŸNœŸœ˜„KšœL˜L™ K˜Kšœ!˜!—K˜KšœF˜F™ šœ"œ˜*Kšœ˜Kšœ˜K˜——K˜K˜K˜—šžœœŸKœ˜nKšœL˜L™ K˜Kšœ!˜!—KšœF˜FK˜K˜K˜K˜—Kšœ˜K˜šžœœŸ’œ˜ΙKšœœ˜#KšœN˜NK˜šœ œœ˜šœœœ˜$Kšœ!˜!Kšœ˜Kš œœœœ œœ˜AK˜K˜—K˜—Kšœ-˜-K˜KšœF˜Fšœœ˜$Kšœœ˜ Kšœ$˜$šœŸ œ˜.Kšœœ˜#Kšœ9˜9Kšœ-˜-K˜Kšœœ,œœ˜AKšœ˜—Kšœ ˜ š˜Kšœœ˜ —K˜—Kšœœœ%˜>K˜K˜K˜—šžœœŸMœ˜rKšœM˜MK˜KšœF˜Fšœ"œ˜*K˜-Kšœ-˜-Kšœ.˜.Kšœ-˜-Kšœ.˜.K˜—K˜K˜K˜—šžœœ,˜:K˜ K˜K˜Kšœ ˜ Kšœ)˜)Kšœ*˜*Kšœ)˜)Kšœ*˜*K˜K˜—šž œœ*œ˜BKšœ%˜%K˜K˜—šžœœœ˜CKšœœœ˜+K˜K˜—šžœœœ˜BKšœHœ˜TKšœ ˜ Kšœ!˜!Kšœ˜Kšœ˜Kšœ ˜ Kšœ%˜%Kšœ ˜ Kšœ"˜"Kšœ ˜ Kšœ"˜"Kšœ)˜)Kšœ*˜*Kšœ)˜)Kšœ*˜*Kšœ)˜)Kšœ*˜*K˜K˜—šž œœœ˜DKšœ˜Kšœ"˜"K˜K˜—šžœœœœ˜GKšœœ˜FKšœ˜K˜K˜—šž œœœ˜?Kšœœœ˜+K˜——K˜—J˜J˜—…—*ό4„