<> <> <> <> DIRECTORY BasicTime USING [GMT], IO USING [STREAM], RemoteFile USING [ServerHandle], Rope USING [ROPE], SunNFS USING [FType] ; UnixRemoteFile: CEDAR DEFINITIONS ~ { <> FileDescriptor: TYPE ~ REF; FType: TYPE ~ SunNFS.FType -- { non(0), reg(1), dir(2), blk(3), chr(4), lnk(5) } -- ; GMT: TYPE ~ BasicTime.GMT; Mode: TYPE ~ CARD32 -- rwxrwxrwx, suid, sgid -- ; ROPE: TYPE ~ Rope.ROPE; ServerHandle: TYPE ~ RemoteFile.ServerHandle; STREAM: TYPE ~ IO.STREAM; <> viewUnix: READONLY ATOM; <> <> UnixServerHandle: TYPE ~ REF UnixServerObject; UnixServerObject: TYPE ~ RECORD [ sH: ServerHandle, procs: UnixServerProcs ]; UnixServerProcs: TYPE ~ REF UnixServerProcsObject; UnixServerProcsObject: TYPE ~ RECORD [ setUser: SetUserProc, open: OpenProc, close: CloseProc, create: CreateProc, delete: DeleteProc, mkDir: MkDirProc, rmDir: RmDirProc, link: LinkProc, symLink: LinkProc, rename: RenameProc, enumerate: EnumerateProc, getInfo: GetInfoProc, setInfo: SetInfoProc, read: ReadProc, write: WriteProc ]; CreateHandle: PROC [serverName: ROPE] RETURNS [h: UnixServerHandle]; <> DestroyHandle: PROC [h: UnixServerHandle]; <> <> SetUser: PROC [h: UnixServerHandle, name: ROPE, password: ROPE] ~ INLINE { h.procs.setUser[h.sH, name, password] }; <> <> SetUserProc: TYPE ~ PROC [sH: ServerHandle, name, password: ROPE]; Open: PROC [h: UnixServerHandle, path: ROPE] RETURNS [fD: FileDescriptor] ~ INLINE { RETURN [h.procs.open[h.sH, path]] }; <> OpenProc: TYPE ~ PROC [sH: ServerHandle, path: ROPE] RETURNS [fD: FileDescriptor]; Close: PROC [h: UnixServerHandle, fD: FileDescriptor] ~ INLINE { h.procs.close[h.sH, fD] }; <> CloseProc: TYPE ~ PROC [sH: ServerHandle, fD: FileDescriptor]; Create: PROC [h: UnixServerHandle, path: ROPE, mode: Mode] RETURNS [fD: FileDescriptor] ~ INLINE { RETURN [h.procs.create[h.sH, path, mode]] }; <> CreateProc: TYPE ~ PROC [sH: ServerHandle, path: ROPE, mode: Mode] RETURNS [fD: FileDescriptor]; Delete: PROC [h: UnixServerHandle, path: ROPE] ~ INLINE { h.procs.delete[h.sH, path] }; <> DeleteProc: TYPE ~ PROC [sH: ServerHandle, path: ROPE]; MkDir: PROC [h: UnixServerHandle, path: ROPE, mode: Mode] ~ INLINE { h.procs.mkDir[h.sH, path, mode] }; <> MkDirProc: TYPE ~ PROC [sH: ServerHandle, path: ROPE, mode: Mode]; RmDir: PROC [h: UnixServerHandle, path: ROPE] ~ INLINE { h.procs.rmDir[h.sH, path] }; <> RmDirProc: TYPE ~ PROC [sH: ServerHandle, path: ROPE]; Link: PROC [h: UnixServerHandle, toPath, asPath: ROPE] ~ INLINE { h.procs.link[h.sH, toPath, asPath] }; <> LinkProc: TYPE ~ PROC [sH: ServerHandle, toPath, asPath: ROPE]; SymLink: PROC [h: UnixServerHandle, toPath, asPath: ROPE] ~ INLINE { h.procs.symLink[h.sH, toPath, asPath] }; <> SymLinkProc: TYPE ~ PROC [sH: ServerHandle, toPath, asPath: ROPE]; Rename: PROC [h: UnixServerHandle, fromPath, toPath: ROPE] ~ INLINE { h.procs.rename[h.sH, fromPath, toPath] }; <> RenameProc: TYPE ~ PROC [sH: ServerHandle, fromPath, toPath: ROPE]; EachNameProc: TYPE ~ PROC [name: ROPE] RETURNS [continue: BOOL _ TRUE]; Enumerate: PROC [h: UnixServerHandle, dirPath: ROPE, pattern: ROPE, eachName: EachNameProc] ~ INLINE { h.procs.enumerate[h.sH, dirPath, pattern, eachName] }; <> EnumerateProc: TYPE ~ PROC [sH: ServerHandle, dirPath: ROPE, pattern: ROPE, eachName: EachNameProc]; GetInfo: PROC [h: UnixServerHandle, fD: FileDescriptor] RETURNS [type: FType, size: CARD, mode: Mode, mTime: GMT] ~ INLINE { [type, size, mode, mTime] _ h.procs.getInfo[h.sH, fD] }; <> GetInfoProc: TYPE ~ PROC [sH: ServerHandle, fD: FileDescriptor] RETURNS [type: FType, size: CARD, mode: Mode, mTime: GMT]; SetInfo: PROC [h: UnixServerHandle, fD: FileDescriptor, mode: Mode, mTime: GMT] ~ INLINE { h.procs.setInfo[h.sH, fD, mode, mTime] }; <> SetInfoProc: TYPE ~ PROC [sH: ServerHandle, fD: FileDescriptor, mode: Mode, mTime: GMT]; Read: PROC [h: UnixServerHandle, fD: FileDescriptor, offset, count: CARD, bOffset: CARD, block: REF TEXT] RETURNS [bytesRead: CARD] ~ INLINE { bytesRead _ h.procs.read[h.sH, fD, offset, count, bOffset, block] }; <> ReadProc: TYPE ~ PROC [sH: ServerHandle, fD: FileDescriptor, offset, count: CARD, bOffset: CARD, block: REF TEXT] RETURNS [bytesRead: CARD]; Write: PROC [h: UnixServerHandle, fD: FileDescriptor, offset, count: CARD, bOffset: CARD, block: REF TEXT] RETURNS [bytesWritten: CARD] ~ INLINE { bytesWritten _ h.procs.write[h.sH, fD, offset, count, bOffset, block] }; <> WriteProc: TYPE ~ PROC [sH: ServerHandle, fD: FileDescriptor, offset, count: CARD, bOffset: CARD, block: REF TEXT] RETURNS [bytesWritten: CARD]; <> OpenReadStream: PROC [h: UnixServerHandle, path: ROPE] RETURNS [str: STREAM]; <> RetrieveFile: PROC [h: UnixServerHandle, path: ROPE, into: STREAM]; <> OpenWriteStream: PROC [h: UnixServerHandle, path: ROPE, mode: Mode] RETURNS [str: STREAM]; <> StoreFile: PROC [h: UnixServerHandle, path: ROPE, mode: Mode, from: STREAM]; <> <> Error: ERROR [code: ATOM, msg: ROPE]; <> <<$viewNotImplemented -- server doesn't export Unix view>> <<>> <<$pathNameSyntax -- syntax error in pathname>> <<>> <<$perm -- caller is not owner>> <<$noent -- no such file or directory>> <<$io -- I/O error>> <<$nxio -- no such device or address>> <<$acces -- access permission denied>> <<$exist -- file already exists>> <<$nodev -- no such device>> <<$notdir -- argument not a directory and should be>> <<$isdir -- argument is a directory and shouldn't be>> <<$fbig -- file would grow too big>> <<$nospc -- no space left on device>> <<$rofs -- file system is readonly>> <<$nametoolong -- file name too long>> <<$notempty -- attempt to remove a nonemtpy directory>> <<$dquot -- disk quota exceeded>> <<$stale -- fhandle argument no longer valid>> <> <<$wrongRPCVersion>> <<$wrongProgram>> <<$wrongProgramVersion>> <<$wrongProc>> <> <<$badCredentials>> <<$wrongCredentials>> <<$badVerifier>> <<$wrongVerifier>> <<$badReplyVerifier>> <<$wrongReplyVerifier>> <<$weakCredentials>> <> <<$timeout>> <<$unknownServer>> <<$unreachable>> <> <<$protocol>> }...