public SetFileAttributesReply SETATTR(SetFileAttributesCall setFileAttributesCall) { ShareObject shareObject; Status status = sharedFileSystem.TryGetSharedObject(setFileAttributesCall.fileHandle, out shareObject); if (status != Status.Ok) { return(new SetFileAttributesReply(status, BeforeAndAfterAttributes.None)); } shareObject.RefreshFileAttributes(sharedFileSystem.permissions); SizeAndTimes before = AutoExtensions.CreateSizeAndTimes(shareObject.fileAttributes); // TODO: change the permissions return(new SetFileAttributesReply(Status.Ok, new BeforeAndAfterAttributes(before, shareObject.fileAttributes))); }
public MkdirReply MKDIR(MkdirCall mkdirCall) { ShareObject parentDirectoryShareObject; Status status = sharedFileSystem.TryGetSharedObject(mkdirCall.directoryHandle, out parentDirectoryShareObject); if (status != Status.Ok) { return(new MkdirReply(status, BeforeAndAfterAttributes.None)); } String localPathAndName = PlatformPath.LocalCombine(parentDirectoryShareObject.localPathAndName, mkdirCall.newDirectoryName); ShareObject mkdirDirectoryShareObject; status = sharedFileSystem.TryGetSharedObject(localPathAndName, mkdirCall.newDirectoryName, out mkdirDirectoryShareObject); if (status == Nfs3Procedure.Status.Ok) { return(new MkdirReply(Status.ErrorAlreadyExists, BeforeAndAfterAttributes.None)); } if (status != Nfs3Procedure.Status.ErrorNoSuchFileOrDirectory) { return(new MkdirReply(status, BeforeAndAfterAttributes.None)); } parentDirectoryShareObject.RefreshFileAttributes(sharedFileSystem.permissions); SizeAndTimes directorySizeAndTimesBeforeCreate = AutoExtensions.CreateSizeAndTimes(parentDirectoryShareObject.fileAttributes); // Todo: handle exceptions Directory.CreateDirectory(localPathAndName); status = sharedFileSystem.TryGetSharedObject(localPathAndName, mkdirCall.newDirectoryName, out mkdirDirectoryShareObject); if (status != Nfs3Procedure.Status.Ok) { return(new MkdirReply(status, BeforeAndAfterAttributes.None)); } mkdirDirectoryShareObject.RefreshFileAttributes(sharedFileSystem.permissions); parentDirectoryShareObject.RefreshFileAttributes(sharedFileSystem.permissions); return(new MkdirReply(mkdirDirectoryShareObject.optionalFileHandleClass, parentDirectoryShareObject.optionalFileAttributes, new BeforeAndAfterAttributes(directorySizeAndTimesBeforeCreate, parentDirectoryShareObject.fileAttributes))); }
public RenameReply RENAME(RenameCall renameCall) { ShareObject oldParentDirectoryShareObject; ShareObject newParentDirectoryShareObject; Status status = sharedFileSystem.TryGetSharedObject(renameCall.oldDirectoryHandle, out oldParentDirectoryShareObject); if (status != Status.Ok) { return(new RenameReply(status, BeforeAndAfterAttributes.None, BeforeAndAfterAttributes.None)); } status = sharedFileSystem.TryGetSharedObject(renameCall.newDirectoryHandle, out newParentDirectoryShareObject); if (status != Status.Ok) { return(new RenameReply(status, BeforeAndAfterAttributes.None, BeforeAndAfterAttributes.None)); } oldParentDirectoryShareObject.RefreshFileAttributes(sharedFileSystem.permissions); SizeAndTimes oldDirectorySizeAndTimesBeforeCreate = AutoExtensions.CreateSizeAndTimes(oldParentDirectoryShareObject.fileAttributes); newParentDirectoryShareObject.RefreshFileAttributes(sharedFileSystem.permissions); SizeAndTimes newDirectorySizeAndTimesBeforeCreate = AutoExtensions.CreateSizeAndTimes(newParentDirectoryShareObject.fileAttributes); status = sharedFileSystem.Move(oldParentDirectoryShareObject, renameCall.oldName, newParentDirectoryShareObject, renameCall.newName); if (status != Status.Ok) { return(new RenameReply(status, BeforeAndAfterAttributes.None, BeforeAndAfterAttributes.None)); } oldParentDirectoryShareObject.RefreshFileAttributes(sharedFileSystem.permissions); newParentDirectoryShareObject.RefreshFileAttributes(sharedFileSystem.permissions); return(new RenameReply(Status.Ok, new BeforeAndAfterAttributes(oldDirectorySizeAndTimesBeforeCreate, oldParentDirectoryShareObject.fileAttributes), new BeforeAndAfterAttributes(newDirectorySizeAndTimesBeforeCreate, newParentDirectoryShareObject.fileAttributes))); }
public RemoveReply REMOVE(RemoveCall removeCall) { ShareObject parentDirectoryShareObject; Status status = sharedFileSystem.TryGetSharedObject(removeCall.directoryHandle, out parentDirectoryShareObject); if (status != Status.Ok) { return(new RemoveReply(status, BeforeAndAfterAttributes.None)); } parentDirectoryShareObject.RefreshFileAttributes(sharedFileSystem.permissions); SizeAndTimes directorySizeAndTimesBeforeCreate = AutoExtensions.CreateSizeAndTimes(parentDirectoryShareObject.fileAttributes); status = sharedFileSystem.RemoveFileOrDirectory(parentDirectoryShareObject.localPathAndName, removeCall.fileName); if (status != Status.Ok) { return(new RemoveReply(status, BeforeAndAfterAttributes.None)); } parentDirectoryShareObject.RefreshFileAttributes(sharedFileSystem.permissions); return(new RemoveReply(Status.Ok, new BeforeAndAfterAttributes(directorySizeAndTimesBeforeCreate, parentDirectoryShareObject.fileAttributes))); }
public WriteReply WRITE(WriteCall writeCall) { ShareObject shareObject; Status status = sharedFileSystem.TryGetSharedObject(writeCall.fileHandle, out shareObject); if (status != Status.Ok) { return(new WriteReply(status, BeforeAndAfterAttributes.None)); } if (shareObject.fileType != FileType.Regular) { return(new WriteReply(Status.ErrorInvalidArgument, BeforeAndAfterAttributes.None)); } shareObject.RefreshFileAttributes(sharedFileSystem.permissions); SizeAndTimes sizeAndTimesBeforeWrite = AutoExtensions.CreateSizeAndTimes(shareObject.fileAttributes); FileInfo fileInfo = shareObject.AccessFileInfo(); // // TODO: in the future in order to enhance performance, I could implement UNSTABLE writes, // which means I could return the reply before the write is finished. // using (FileStream fileStream = fileInfo.Open(FileMode.Open)) { fileStream.Position = (Int64)writeCall.offset; fileStream.Write(writeCall.data.array, (Int32)writeCall.data.offset, (Int32)writeCall.data.length); } shareObject.RefreshFileAttributes(sharedFileSystem.permissions); return(new WriteReply(new BeforeAndAfterAttributes(sizeAndTimesBeforeWrite, shareObject.fileAttributes), writeCall.data.length, writeCall.stableHow, null)); }
public CreateReply CREATE(CreateCall createCall) { if (createCall.mode == CreateModeEnum.Exclusive) { return(new CreateReply(Status.ErrorNotSupported, BeforeAndAfterAttributes.None)); } ShareObject directoryShareObject; Status status = sharedFileSystem.TryGetSharedObject(createCall.directoryHandle, out directoryShareObject); if (status != Status.Ok) { return(new CreateReply(status, BeforeAndAfterAttributes.None)); } FileStream fileStream = null; try { String localPathAndName = PlatformPath.LocalCombine(directoryShareObject.localPathAndName, createCall.newFileName); ShareObject fileShareObject; status = sharedFileSystem.TryGetSharedObject(localPathAndName, createCall.newFileName, out fileShareObject); if (status == Nfs3Procedure.Status.Ok) { fileShareObject.RefreshFileAttributes(sharedFileSystem.permissions); // The file already exists if (createCall.mode == CreateModeEnum.Guarded) { return(new CreateReply(Status.ErrorAlreadyExists, BeforeAndAfterAttributes.None)); } } else { if (status != Nfs3Procedure.Status.ErrorNoSuchFileOrDirectory) { return(new CreateReply(status, BeforeAndAfterAttributes.None)); } } directoryShareObject.RefreshFileAttributes(sharedFileSystem.permissions); SizeAndTimes directorySizeAndTimesBeforeCreate = AutoExtensions.CreateSizeAndTimes(directoryShareObject.fileAttributes); // Todo: handle exceptions fileStream = new FileStream(localPathAndName, FileMode.Create); fileStream.Dispose(); status = sharedFileSystem.TryGetSharedObject(localPathAndName, createCall.newFileName, out fileShareObject); if (status != Nfs3Procedure.Status.Ok) { return(new CreateReply(status, BeforeAndAfterAttributes.None)); } fileShareObject.RefreshFileAttributes(sharedFileSystem.permissions); directoryShareObject.RefreshFileAttributes(sharedFileSystem.permissions); return(new CreateReply(fileShareObject.optionalFileHandleClass, fileShareObject.optionalFileAttributes, new BeforeAndAfterAttributes(directorySizeAndTimesBeforeCreate, directoryShareObject.fileAttributes))); } finally { if (fileStream != null) { fileStream.Dispose(); } } }