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