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); } }
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); }
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); } }
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); } }
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); } }
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); } }
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); } }
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); } }
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); } }
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); } }
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); } }
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); }
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); } }
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); } }
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); } }
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); } }