Ejemplo n.º 1
0
        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)));
        }
Ejemplo n.º 2
0
        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)));
        }
Ejemplo n.º 3
0
        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)));
        }
Ejemplo n.º 4
0
        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)));
        }
Ejemplo n.º 5
0
        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));
        }
Ejemplo n.º 6
0
        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();
                }
            }
        }