Esempio n. 1
0
        public virtual NfsPacket GetAttr(NfsPacket packet)
        {
            try {
                FileHandle        f  = new FileHandle(packet);
                NfsFileAttributes fa = new NfsFileAttributes();

                string file = GetNameFromHandle(f.Handle, packet.XID);

                if (!File.Exists(file) && !Directory.Exists(file))
                {
                    throw new NFSException(packet.XID, (uint)NfsReply.ERR_NOENT);
                }

                Console.WriteLine("NfsDirectory.GetAttr: file: " + file);
                fa.Load(file);

                NfsPacket reply = new NfsPacket(96);
                reply.AddReplyHeader(packet.XID);
                reply.SetUInt((uint)NfsReply.OK);

                fa.Emit(ref reply);

                return(reply);
            }
            catch (FileNotFoundException) {
                throw new NFSException(packet.XID, (uint)NfsReply.ERR_NOENT);
            }
        }
Esempio n. 2
0
        public virtual NfsPacket Rmdir(uint xid, NfsPacket packet)
        {
            FileHandle fileHandle = new FileHandle(packet);
            string     name       = packet.GetString();

            string dirname = GetNameFromHandle(fileHandle.Handle, xid);
            var    fd      = new FileInfo(Path.Combine(dirname, name));

            // do some correctness checking
            if (fd.Exists == false)
            {
                throw new NFSException(xid, (uint)NfsReply.ERR_NOENT);
            }
            if (NfsFileAttributes.IsDirectory(fd.FullName) == false)
            {
                throw new NFSException(xid, (uint)NfsReply.ERR_NOTDIR);
            }
            // try to remove the directory
            try {
                fd.Delete();
            }
            catch (Exception) {
                throw new NFSException(xid, (uint)NfsReply.ERR_IO);
            }

            NfsPacket reply = new NfsPacket(128);

            reply.AddReplyHeader(xid);
            reply.SetUInt((uint)NfsReply.OK);
            return(reply);
        }
Esempio n. 3
0
        public virtual NfsPacket GetAttr(NfsPacket packet)
        {
            try {
                FileHandle f = new FileHandle(packet);
                NfsFileAttributes fa = new NfsFileAttributes();

                string file = GetNameFromHandle(f.Handle, packet.XID);

                if (!File.Exists(file) && !Directory.Exists(file)) {
                    throw new NFSException(packet.XID, (uint)NfsReply.ERR_NOENT);
                }

                Console.WriteLine("NfsDirectory.GetAttr: file: " + file);
                fa.Load(file);

                NfsPacket reply = new NfsPacket(96);
                reply.AddReplyHeader(packet.XID);
                reply.SetUInt((uint)NfsReply.OK);

                fa.Emit(ref reply);

                return reply;
            }
            catch (FileNotFoundException) {
                throw new NFSException(packet.XID, (uint)NfsReply.ERR_NOENT);
            }
        }
Esempio n. 4
0
        public NfsPacket Read(NfsPacket packet)
        {
            try {
                FileHandle fh         = new FileHandle(packet);
                uint       offset     = packet.GetUInt();
                uint       count      = packet.GetUInt();
                uint       totalCount = packet.GetUInt();           // not used
                uint       xId        = packet.XID;
                int        numberRead;
                byte[]     readbuf;
                String     filePath = HandleManager.Current.GetName(fh.Handle);

                if (filePath == null)
                {
                    throw new NFSException(xId, (uint)NfsReply.ERR_STALE);
                }

                if (count <= 0)
                {
                    Console.Error.WriteLine("\tNfsIO.Read: invalid value for count " + count);
                    throw new NFSException(xId, (uint)NfsReply.ERR_IO);
                }

                using (StreamReader sr = new StreamReader(filePath)) {
                    sr.BaseStream.Seek(offset, SeekOrigin.Begin);
                    readbuf    = new byte[(int)count];
                    numberRead = sr.BaseStream.Read(readbuf, 0, (int)count);
                }

                if (numberRead < 0)
                {
                    Console.Error.WriteLine("\tNfsIO.Read: number read is " + numberRead);
                    numberRead = 0;
                }

                NfsFileAttributes attributes = new NfsFileAttributes(filePath);
                NfsPacket         reply      = new NfsPacket(128 + numberRead);

                reply.AddReplyHeader(xId);
                reply.SetUInt((uint)NfsReply.OK);

                attributes.Emit(ref reply);

                reply.SetData(numberRead, readbuf);

                return(reply);
            }
            catch (FileNotFoundException) {
                throw new NFSException(packet.XID, (uint)NfsReply.ERR_NOENT);
            }
            catch (IOException) {
                throw new NFSException(packet.XID, (uint)NfsReply.ERR_IO);
            }
        }
Esempio n. 5
0
        public NfsPacket Read(NfsPacket packet)
        {
            try {
                FileHandle fh = new FileHandle(packet);
                uint offset = packet.GetUInt();
                uint count = packet.GetUInt();
                uint totalCount = packet.GetUInt(); // not used
                uint xId = packet.XID;
                int numberRead;
                byte[] readbuf;
                String filePath = HandleManager.Current.GetName(fh.Handle);

                if (filePath == null) {
                    throw new NFSException(xId, (uint)NfsReply.ERR_STALE);
                }

                if (count <= 0) {
                    Console.Error.WriteLine("\tNfsIO.Read: invalid value for count " + count);
                    throw new NFSException(xId, (uint)NfsReply.ERR_IO);
                }

                using (StreamReader sr = new StreamReader(filePath)) {
                    sr.BaseStream.Seek(offset, SeekOrigin.Begin);
                    readbuf = new byte[(int)count];
                    numberRead = sr.BaseStream.Read(readbuf, 0, (int)count);
                }

                if (numberRead < 0) {
                    Console.Error.WriteLine("\tNfsIO.Read: number read is " + numberRead);
                    numberRead = 0;
                }

                NfsFileAttributes attributes = new NfsFileAttributes(filePath);
                NfsPacket reply = new NfsPacket(128 + numberRead);

                reply.AddReplyHeader(xId);
                reply.SetUInt((uint)NfsReply.OK);

                attributes.Emit(ref reply);

                reply.SetData(numberRead, readbuf);

                return reply;
            }
            catch (FileNotFoundException) {
                throw new NFSException(packet.XID, (uint)NfsReply.ERR_NOENT);
            }
            catch (IOException) {
                throw new NFSException(packet.XID, (uint)NfsReply.ERR_IO);
            }
        }
Esempio n. 6
0
        public NfsPacket Write(uint xid, NfsPacket packet)
        {
            string fileName = null;

            try {
                // read info out of packet
                FileHandle fh          = new FileHandle(packet);
                uint       beginoffset = packet.GetUInt();
                uint       offset      = packet.GetUInt();
                uint       totalcount  = packet.GetUInt();
                // next comes the data which is a uint of size and the bytes.
                uint datalen      = packet.GetUInt();
                uint packetOffset = (uint)packet.Position;
                packet.Advance(datalen);

                // carry out the write operation
                fileName = HandleManager.Current.GetName(fh.Handle);
                if (fileName == null)
                {
                    throw new NFSException(xid, (uint)NfsReply.ERR_STALE);
                }
                // XXX comment out print lines to improve performance
                // System.out.print("Write(" + fileName + ", " + offset + ", " +
                //		     datalen + ")\n");
                using (StreamWriter sw = new StreamWriter(fileName)) {
                    sw.BaseStream.Seek(offset, SeekOrigin.Begin);
                    sw.BaseStream.Write(packet.Data, (int)packetOffset, (int)datalen);
                }

                // load in new file attributes
                NfsFileAttributes fa = new NfsFileAttributes();
                fa.Load(fileName);

                // create the reply packet
                NfsPacket result = new NfsPacket(128);
                result.Reset();
                result.AddReplyHeader(xid);
                result.SetUInt((uint)NfsReply.OK);
                fa.Emit(ref result);

                return(result);
            }
            catch (IOException) {
                throw new NFSException(xid, (uint)NfsReply.ERR_IO);
            }
            catch (System.Security.SecurityException) {
                throw new NFSException(xid, (uint)NfsReply.ERR_PERM);
            }
        }
Esempio n. 7
0
        public virtual NfsPacket Create(uint xid, NfsPacket packet)
        {
            try {
                FileHandle dirFH   = new FileHandle(packet);
                string     entry   = packet.GetString();
                string     dirName = GetNameFromHandle(dirFH.Handle, xid);
                string     path    = Path.Combine(dirName, entry);

                // make the file

                if (File.Exists(path))
                {
                    throw new NFSException(xid, (uint)NfsReply.ERR_EXIST);
                }

                using (var file = File.Create(path)) { }

                // make a new handle for this file
                FileHandle fh     = new FileHandle();
                long       handle = HandleManager.Current.GetHandle(path);
                fh.Set(dirFH.Root, (uint)handle, dirFH.ReadOnly);

                // get the attributes of this new file
                NfsFileAttributes fa = new NfsFileAttributes();
                fa.Load(path);

                // create the reply packet
                NfsPacket reply = new NfsPacket(128);
                reply.AddReplyHeader(xid);
                reply.SetUInt((uint)NfsReply.OK);
                fh.Emit(ref reply);
                fa.Emit(ref reply);
                return(reply);
            }
            catch (FileNotFoundException) {
                throw new NFSException(xid, (uint)NfsReply.ERR_IO);
            }
            catch (IOException) {
                throw new NFSException(xid, (uint)NfsReply.ERR_IO);
            }
            catch (System.Security.SecurityException) {
                throw new NFSException(xid, (uint)NfsReply.ERR_PERM);
            }
        }
Esempio n. 8
0
        public virtual NfsPacket Create(uint xid, NfsPacket packet)
        {
            try {
                FileHandle dirFH = new FileHandle(packet);
                string entry = packet.GetString();
                string dirName = GetNameFromHandle(dirFH.Handle, xid);
                string path = Path.Combine(dirName, entry);

                // make the file

                if (File.Exists(path)) {
                    throw new NFSException(xid, (uint)NfsReply.ERR_EXIST);
                }

                using (var file = File.Create(path)) { }

                // make a new handle for this file
                FileHandle fh = new FileHandle();
                long handle = HandleManager.Current.GetHandle(path);
                fh.Set(dirFH.Root, (uint)handle, dirFH.ReadOnly);

                // get the attributes of this new file
                NfsFileAttributes fa = new NfsFileAttributes();
                fa.Load(path);

                // create the reply packet
                NfsPacket reply = new NfsPacket(128);
                reply.AddReplyHeader(xid);
                reply.SetUInt((uint)NfsReply.OK);
                fh.Emit(ref reply);
                fa.Emit(ref reply);
                return reply;

            }
            catch (FileNotFoundException) {
                throw new NFSException(xid, (uint)NfsReply.ERR_IO);
            }
            catch (IOException) {
                throw new NFSException(xid, (uint)NfsReply.ERR_IO);
            }
            catch (System.Security.SecurityException) {
                throw new NFSException(xid, (uint)NfsReply.ERR_PERM);
            }
        }
Esempio n. 9
0
        public virtual NfsPacket Lookup(NfsPacket packet)
        {
            try {
                FileHandle dir      = new FileHandle(packet);
                String     entry    = packet.GetString();
                String     dirName  = GetNameFromHandle(dir.Handle, packet.XID);
                String     fileName = Path.Combine(dirName, entry);

                Console.WriteLine("Lookup -> " + entry);

                if (!File.Exists(fileName) && !Directory.Exists(fileName))
                {
                    throw new NFSException(packet.XID, (uint)NfsReply.ERR_NOENT);
                }

                NfsFileAttributes attributes = new NfsFileAttributes();
                attributes.Load(fileName);

                // make a FileHandle for this new path
                uint handleId = HandleManager.Current.GetHandle(fileName);

                FileHandle handle = new FileHandle();
                handle.Set(dir.Root, handleId, dir.ReadOnly);

                // make the reply
                NfsPacket reply = new NfsPacket(128);
                reply.AddReplyHeader(packet.XID);
                reply.SetUInt((uint)NfsReply.OK);

                handle.Emit(ref reply);
                attributes.Emit(ref reply);

                return(reply);
            }
            catch (FileNotFoundException) {
                throw new NFSException(packet.XID, (uint)NfsReply.ERR_NOENT);
            }
        }
Esempio n. 10
0
        public virtual NfsPacket SetAttr(uint xid, NfsPacket packet)
        {
            try {
                FileHandle f        = new FileHandle(packet);
                String     fileName = GetNameFromHandle(f.Handle, xid);

                // the attributes
                int     mode  = (int)packet.GetUInt();
                int     uid   = (int)packet.GetUInt();
                int     gid   = (int)packet.GetUInt();
                int     size  = (int)packet.GetUInt();
                NfsTime atime = new NfsTime(packet);
                NfsTime mtime = new NfsTime(packet);

                // the only attribute that can be set is the size can be set to 0 to truncate the file
                if (size == 0)
                {
                    // truncate by deleting and recreating the file
                    using (var fs = new FileStream(fileName, FileMode.Truncate, FileAccess.ReadWrite)) { }
                }

                NfsPacket reply = new NfsPacket(128);
                reply.AddReplyHeader(xid);
                reply.SetUInt((uint)NfsReply.OK);

                NfsFileAttributes fa = new NfsFileAttributes();
                fa.Load(fileName);
                fa.Emit(ref reply);

                return(reply);
            }
            catch (FileNotFoundException) {
                throw new NFSException(xid, (uint)NfsReply.ERR_NOENT);
            }
            catch (IOException) {
                throw new NFSException(xid, (uint)NfsReply.ERR_PERM);
            }
        }
Esempio n. 11
0
        public virtual NfsPacket Mkdir(uint xid, NfsPacket packet)
        {
            try {
                FileHandle fileHandle = new FileHandle(packet);
                string     entry      = packet.GetString();

                string dirName = GetNameFromHandle(fileHandle.Handle, xid);
                string newdir  = Path.Combine(dirName, entry);

                var dir = new DirectoryInfo(newdir);

                if (dir.Exists)
                {
                    throw new NFSException(xid, (uint)NfsReply.ERR_EXIST);
                }

                dir.Create();

                // make a FileHandle for this directory
                long       handle = HandleManager.Current.GetHandle(newdir);
                FileHandle newFH  = new FileHandle();
                newFH.Set(fileHandle.Root, (uint)handle, fileHandle.ReadOnly);

                // get the attributes
                NfsFileAttributes fa = new NfsFileAttributes();
                fa.Load(newdir);

                NfsPacket reply = new NfsPacket(128);
                reply.AddReplyHeader(xid);
                reply.SetUInt((uint)NfsReply.OK);
                newFH.Emit(ref reply);
                fa.Emit(ref reply);
                return(reply);
            }
            catch (FileNotFoundException) {
                throw new NFSException(xid, (uint)NfsReply.ERR_IO);
            }
        }
Esempio n. 12
0
        public uint Load(String path)
        {
            if (!File.Exists(path) && !Directory.Exists(path))
            {
                throw new FileNotFoundException();
            }

            mode = 0;

            FileAttributes fileAttributes = File.GetAttributes(path);
            Boolean        isDirectory    = fileAttributes.Is(FileAttributes.Directory);
            Boolean        canRead        = NfsFileAttributes.CanRead(path);
            Boolean        canWrite       = NfsFileAttributes.CanWrite(path);

            if (!isDirectory)
            {
                type = FileType.NFREG;
                mode = FilePermissions.UPFILE;
            }
            else if (isDirectory)
            {
                type = FileType.NFDIR;
                mode = FilePermissions.UPDIR;
            }
            else
            {
                Console.Error.WriteLine("NfsFileAttributes.Load: " + path + " has unknown type");
                type = FileType.NFNON;
                mode = 0;                 // don't know what kind of file system object this is
            }

            //if (!isDirectory) {
            //	using (var fs = new FileStream(path, FileMode.Open)) {
            //		canRead = fs.CanRead;
            //		canWrite = fs.CanWrite;
            //	}
            //}
            //else {
            //	canRead = true;
            //	canWrite = !fileAttributes.Is(FileAttributes.ReadOnly);
            //}

            if (canRead)
            {
                mode |= FilePermissions.UP_OREAD | FilePermissions.UP_GREAD | FilePermissions.UP_WREAD;
                mode |= FilePermissions.UP_OEXEC | FilePermissions.UP_GEXEC | FilePermissions.UP_WEXEC;
            }
            if (canWrite)
            {
                mode |= FilePermissions.UP_OWRITE | FilePermissions.UP_GWRITE | FilePermissions.UP_WWRITE;
            }

            // from now on assume either file or directory
            if (!isDirectory)
            {
                nlink = 1;
            }
            else               // directories always have 2 links
            {
                nlink = 2;
            }

            FileInfo file = new FileInfo(path);

            uid       = 0;
            gid       = 0;
            size      = isDirectory ? 512 : (uint)(new FileInfo(path).Length);
            blocksize = 512;             // XXX common value, how do I get this in java?
            rdev      = 0;
            blocks    = (size + blocksize - 1) / blocksize;
            fsid      = isDirectory ? 0 : GetFileSystemId(file);
            fileid    = (uint)HandleManager.Current.GetHandle(path);

            lastAccessed = new NfsTime(file.LastAccessTime);
            lastChanged  = new NfsTime(file.LastWriteTime);
            lastModified = new NfsTime(file.LastWriteTime);

            return((uint)NfsReply.OK);
        }
Esempio n. 13
0
        public NfsPacket Write(uint xid, NfsPacket packet)
        {
            string fileName = null;

            try {
                // read info out of packet
                FileHandle fh = new FileHandle(packet);
                uint beginoffset = packet.GetUInt();
                uint offset = packet.GetUInt();
                uint totalcount = packet.GetUInt();
                // next comes the data which is a uint of size and the bytes.
                uint datalen = packet.GetUInt();
                uint packetOffset = (uint)packet.Position;
                packet.Advance(datalen);

                // carry out the write operation
                fileName = HandleManager.Current.GetName(fh.Handle);
                if (fileName == null) {
                    throw new NFSException(xid, (uint)NfsReply.ERR_STALE);
                }
                // XXX comment out print lines to improve performance
                // System.out.print("Write(" + fileName + ", " + offset + ", " +
                //		     datalen + ")\n");
                using (StreamWriter sw = new StreamWriter(fileName)) {
                    sw.BaseStream.Seek(offset, SeekOrigin.Begin);
                    sw.BaseStream.Write(packet.Data, (int)packetOffset, (int)datalen);
                }

                // load in new file attributes
                NfsFileAttributes fa = new NfsFileAttributes();
                fa.Load(fileName);

                // create the reply packet
                NfsPacket result = new NfsPacket(128);
                result.Reset();
                result.AddReplyHeader(xid);
                result.SetUInt((uint)NfsReply.OK);
                fa.Emit(ref result);

                return result;
            }
            catch (IOException) {
                throw new NFSException(xid, (uint)NfsReply.ERR_IO);
            }
            catch (System.Security.SecurityException) {
                throw new NFSException(xid, (uint)NfsReply.ERR_PERM);
            }
        }
Esempio n. 14
0
        public virtual NfsPacket SetAttr(uint xid, NfsPacket packet)
        {
            try {
                FileHandle f = new FileHandle(packet);
                String fileName = GetNameFromHandle(f.Handle, xid);

                // the attributes
                int mode = (int)packet.GetUInt();
                int uid = (int)packet.GetUInt();
                int gid = (int)packet.GetUInt();
                int size = (int)packet.GetUInt();
                NfsTime atime = new NfsTime(packet);
                NfsTime mtime = new NfsTime(packet);

                // the only attribute that can be set is the size can be set to 0 to truncate the file
                if (size == 0) {
                    // truncate by deleting and recreating the file
                    using (var fs = new FileStream(fileName, FileMode.Truncate, FileAccess.ReadWrite)) { }
                }

                NfsPacket reply = new NfsPacket(128);
                reply.AddReplyHeader(xid);
                reply.SetUInt((uint)NfsReply.OK);

                NfsFileAttributes fa = new NfsFileAttributes();
                fa.Load(fileName);
                fa.Emit(ref reply);

                return reply;
            }
            catch (FileNotFoundException) {
                throw new NFSException(xid, (uint)NfsReply.ERR_NOENT);
            }
            catch (IOException) {
                throw new NFSException(xid, (uint)NfsReply.ERR_PERM);
            }
        }
Esempio n. 15
0
        public virtual NfsPacket Mkdir(uint xid, NfsPacket packet)
        {
            try {
                FileHandle fileHandle = new FileHandle(packet);
                string entry = packet.GetString();

                string dirName = GetNameFromHandle(fileHandle.Handle, xid);
                string newdir = Path.Combine(dirName, entry);

                var dir = new DirectoryInfo(newdir);

                if (dir.Exists) {
                    throw new NFSException(xid, (uint)NfsReply.ERR_EXIST);
                }

                dir.Create();

                // make a FileHandle for this directory
                long handle = HandleManager.Current.GetHandle(newdir);
                FileHandle newFH = new FileHandle();
                newFH.Set(fileHandle.Root, (uint)handle, fileHandle.ReadOnly);

                // get the attributes
                NfsFileAttributes fa = new NfsFileAttributes();
                fa.Load(newdir);

                NfsPacket reply = new NfsPacket(128);
                reply.AddReplyHeader(xid);
                reply.SetUInt((uint)NfsReply.OK);
                newFH.Emit(ref reply);
                fa.Emit(ref reply);
                return reply;

            }
            catch (FileNotFoundException) {
                throw new NFSException(xid, (uint)NfsReply.ERR_IO);
            }
        }
Esempio n. 16
0
        public virtual NfsPacket Lookup(NfsPacket packet)
        {
            try {
                FileHandle dir = new FileHandle(packet);
                String entry = packet.GetString();
                String dirName = GetNameFromHandle(dir.Handle, packet.XID);
                String fileName = Path.Combine(dirName, entry);

                Console.WriteLine("Lookup -> " + entry);

                if (!File.Exists(fileName) && !Directory.Exists(fileName)) {
                    throw new NFSException(packet.XID, (uint)NfsReply.ERR_NOENT);
                }

                NfsFileAttributes attributes = new NfsFileAttributes();
                attributes.Load(fileName);

                // make a FileHandle for this new path
                uint handleId = HandleManager.Current.GetHandle(fileName);

                FileHandle handle = new FileHandle();
                handle.Set(dir.Root, handleId, dir.ReadOnly);

                // make the reply
                NfsPacket reply = new NfsPacket(128);
                reply.AddReplyHeader(packet.XID);
                reply.SetUInt((uint)NfsReply.OK);

                handle.Emit(ref reply);
                attributes.Emit(ref reply);

                return reply;

            }
            catch (FileNotFoundException) {
                throw new NFSException(packet.XID, (uint)NfsReply.ERR_NOENT);
            }
        }