protected override void OnPacketReceived(byte[] bytes, IPEndPoint receivedFrom) { var datagram = new DatagramPacket(bytes, bytes.Length, receivedFrom); var packet = new NfsPacket(datagram); var e = new UdpPacketReceivedEventArgs(packet, receivedFrom); //Console.WriteLine("\nPacket Received : EndPoint: " + _listener.Client.Client.LocalEndPoint.ToString()); uint xId = packet.XID = packet.GetUInt(); uint type = packet.GetUInt(); if (type == (int)RpcSignalType.Call) { Call(ref packet, xId); } else if (type == (int)RpcSignalType.Reply) { Reply(ref packet, xId); } //RaisePacketReceived(e); if (packet.ProgramID == this.ProgramID) { //Console.WriteLine("Found program: " + packet.ProgramID); Process(packet, receivedFrom); } }
protected override void Process(NfsPacket packet, IPEndPoint receivedFrom) { //Console.WriteLine("PortmapHandler.Process : recievedFrom: " + receivedFrom.ToString()); //Console.WriteLine("PortmapHandler.Process: Procedure -> " + packet.ProcedureID + ":" + ((PortmapProcedure)packet.ProcedureID).ToString()); switch (packet.ProcedureID) { case (int)PortmapProcedure.NULL: Null(packet, receivedFrom); break; case (int)PortmapProcedure.GETPORT: GetPort(packet, receivedFrom); break; case (int)PortmapProcedure.SET: break; case (int)PortmapProcedure.UNSET: break; case (int)PortmapProcedure.DUMP: break; case (int)PortmapProcedure.CALLIT: break; default: break; } }
protected void SendNull(NfsPacket sourcePacket, IPEndPoint receivedFrom) { NfsPacket packet = new NfsPacket(128); packet.AddReplyHeader(sourcePacket.XID); Send(packet, receivedFrom); }
private void Mount(NfsPacket sourcePacket, IPEndPoint receivedFrom) { NfsReply replyCode = NfsReply.OK; NfsPacket packet = new NfsPacket(128); packet.AddReplyHeader(sourcePacket.XID); // skip past the authentication records sourcePacket.ReadAuthentication(); sourcePacket.ReadAuthentication(); // next should be a dirpath, which is a string. Replace unix style path with local style path String path = sourcePacket.GetString(); if (path == null) { replyCode = NfsReply.ERR_STALE; } else { String original = path.Clone() as String; path = NfsPath.ToWin(path); //Console.WriteLine("MountHandler.Mount : requested: " + original + ", actual: " + path); //if (!Directory.Exists(path)) { // replyCode = NfsReply.ERR_EXIST; //} } // Try to validate this mount, if there is an error make an error packet, otherwise send back the handle. if (replyCode != NfsReply.OK) { packet.SetUInt((uint)replyCode); } else if (false){ //exports.Matches(packet.Source(), path) == false) { // No permission for this mount in the exports file //result.AddLong(NFS.NFSERR_PERM); //Console.Error.WriteLine("!!! Mount request for " + path + "from " + packet.Source() + " denied.\n"); } else { // put together a file handle uint handle = HandleManager.Current.GetHandle(path); var fileHandle = new FileSystem.FileHandle(); fileHandle.Set(handle, (uint)handle, 0); packet.SetUInt((uint)replyCode); fileHandle.Emit(ref packet); } if (replyCode == NfsReply.OK) { MountManager.Current.Add(sourcePacket.RemoteHost, path); } Send(packet, receivedFrom); }
private void Set(NfsPacket sourcePacket, IPEndPoint receivedFrom) { // skip past the authentication records sourcePacket.ReadAuthentication(); sourcePacket.ReadAuthentication(); // Collect the arguments to the procedure uint programId = sourcePacket.GetUInt(); uint version = sourcePacket.GetUInt(); uint protocol = sourcePacket.GetUInt(); uint port = sourcePacket.GetUInt(); NfsPacket packet = new NfsPacket(128); packet.AddReplyHeader(sourcePacket.XID); packet.SetUInt(PORTMAP_TRUE); // portmapMapping toadd = new portmapMapping(prog, vers, prot); // toadd.SetPort(port); // XDRPacket result = new XDRPacket(128); // result.AddReplyHeader(xid); // // look for the chain of versions for this program // long? pl = new long?(prog); // portmapMapping chain = (portmapMapping)mappings[pl]; // if (chain == null) { // mappings.Add(pl, toadd); // result.AddLong(Portmap.PM_TRUE); // } // else { // // See if this version is already registered in the chain // while (chain != null) { // if (chain.Version() == vers && chain.Protocol() == prot) { // result.AddLong(Portmap.PM_FALSE); // break; // } // else if (chain.Next() == null) { // chain.SetNext(toadd); // result.AddLong(Portmap.PM_TRUE); // break; // } // chain = chain.Next(); // } // } Send(packet, receivedFrom); }
private void Null(NfsPacket sourcePacket, IPEndPoint receivedFrom) { // Put together an XDR reply packet NfsPacket packet = new NfsPacket(128); packet.SetUInt(sourcePacket.XID); packet.SetUInt((uint)RpcSignalType.Reply); packet.SetUInt((uint)RpcMessageResult.Accepted); // Put on a NULL authentication packet.AddNullAuthentication(); packet.SetUInt((uint)RpcProcedure.Success); Send(packet, receivedFrom); }
protected virtual void Call(ref NfsPacket packet, uint xId) { uint rpcVersion = packet.RpcVersion = packet.GetUInt(); uint programId = packet.ProgramID = packet.GetUInt(); uint version = packet.NfsVersion = packet.GetUInt(); uint procedure = packet.ProcedureID = packet.GetUInt(); IPHostEntry entry = Dns.GetHostEntry(packet.Source); String[] parts = entry.HostName.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length >= 0) { packet.RemoteHost = parts[0]; } //if (programId == this.ProgramID) { // Console.WriteLine("\nCall: rpcVersion = " + rpcVersion + " programId = " + programId + " version = " + version + " procedure = " + procedure); //} }
private void GetPort(NfsPacket sourcePacket, IPEndPoint receivedFrom) { // skip past the authentication records sourcePacket.ReadAuthentication(); sourcePacket.ReadAuthentication(); // Collect the arguments to the procedure uint programId = sourcePacket.GetUInt(); uint version = sourcePacket.GetUInt(); uint protocol = sourcePacket.GetUInt(); // Put together an XDR reply packet NfsPacket packet = new NfsPacket(128); packet.SetUInt(sourcePacket.XID); packet.SetUInt((uint)RpcSignalType.Reply); packet.SetUInt((uint)RpcMessageResult.Accepted); packet.AddNullAuthentication(); if (!NfsHandlerManager.IsProgramRegistered((int)programId)) { packet.SetUInt((uint)RpcProcedure.ProgramUnavailable); } else { // TODO: add version checking. we're only doing v2 right now. // version mismatch gets the ProgMismatch value. // result.AddLong(RPCConsts.RPCProgMismatch); // result.AddLong(versmin); // result.AddLong(versmax); int port = NfsHandlerManager.GetPort((int)programId); if (port == 0) { packet.SetUInt((uint)RpcProcedure.ProgramMismatch); } else { packet.SetUInt((uint)RpcProcedure.Success); packet.SetUInt((uint)port); } } Send(packet, receivedFrom); }
protected override void Process(NfsPacket packet, IPEndPoint receivedFrom) { //Console.WriteLine("MountHandler.Process : recievedFrom: " + receivedFrom.ToString()); //Console.WriteLine("MountHandler.Process: Procedure -> " + packet.ProcedureID + ":" + ((MountProcedure)packet.ProcedureID).ToString()); switch (packet.ProcedureID) { case (int)MountProcedure.NULL: base.SendNull(packet, receivedFrom); break; case (int)MountProcedure.MNT: Mount(packet, receivedFrom); break; case (int)MountProcedure.UMNT: Unmount(packet, receivedFrom); break; default: break; } }
private void Unmount(NfsPacket sourcePacket, IPEndPoint receivedFrom) { // skip past the authentication records sourcePacket.ReadAuthentication(); sourcePacket.ReadAuthentication(); String path = sourcePacket.GetString(); NfsPacket packet = new NfsPacket(128); path = NfsPath.ToWin(path); HandleManager.Current.GetHandle(path); packet.AddReplyHeader(sourcePacket.XID); packet.SetUInt((uint)NfsReply.OK); //Console.WriteLine("MountHandler.Unmount : requested: " + path); MountManager.Current.Remove(sourcePacket.RemoteHost); Send(packet, receivedFrom); }
public NfsTime(NfsPacket packet) { Read(packet); }
internal virtual bool Emit(ref NfsPacket packet) { packet.SetUInt(_seconds); packet.SetUInt(_milliseconds); return(true); }
internal virtual bool Read(NfsPacket packet) { _seconds = packet.GetUInt(); _milliseconds = packet.GetUInt(); return(true); }
protected virtual void Reply(ref NfsPacket packet, uint xId) { //Console.WriteLine("Reply: I don't handle these"); }
protected virtual void Process(NfsPacket packet, IPEndPoint receivedFrom) { //Console.WriteLine("NfsHandler.Process : recievedFrom: " + receivedFrom.ToString()); }
protected override void Process(NfsPacket packet, IPEndPoint receivedFrom) { //Console.WriteLine("NfsHandler.Process : recievedFrom: " + receivedFrom.ToString()); //Console.WriteLine("NfsHandler.Process: Procedure -> " + packet.ProcedureID + ":" + ((NfsProcedure)packet.ProcedureID).ToString()); // get rid of authentication recorde in packet, we don't use them packet.ReadAuthentication(); packet.ReadAuthentication(); if (packet.ProcedureID == (int)NfsProcedure.NULL) { base.SendNull(packet, receivedFrom); return; } NfsPacket result; uint xid = packet.XID; try { switch (packet.ProcedureID) { case (int)NfsProcedure.GETATTR: result = _directory.GetAttr(packet); break; case (int)NfsProcedure.SETATTR: result = _directory.SetAttr(xid, packet); break; case (int)NfsProcedure.LOOKUP: result = _directory.Lookup(packet); break; case (int)NfsProcedure.READ: result = _io.Read(packet); break; case (int)NfsProcedure.WRITE: result = _io.Write(xid, packet); break; case (int)NfsProcedure.CREATE: result = _directory.Create(xid, packet); break; case (int)NfsProcedure.REMOVE: result = _directory.Remove(xid, packet); break; case (int)NfsProcedure.RENAME: result = _directory.Rename(xid, packet); break; case (int)NfsProcedure.MKDIR: result = _directory.Mkdir(xid, packet); break; case (int)NfsProcedure.RMDIR: result = _directory.Rmdir(xid, packet); break; case (int)NfsProcedure.READDIR: result = _directory.ReadDirectory(packet); break; case (int)NfsProcedure.STATFS: result = _directory.StatFS(packet); break; default: Console.Error.WriteLine("Unsupported NFS procedure called (" + packet.ProcedureID + ") from " + receivedFrom.ToString() + "\n"); throw new NFSException(packet.XID, (uint)NfsReply.ERR_IO); } } catch (NFSException e) { // make a reply packet that includes the error result = new NfsPacket(64); result.AddReplyHeader(packet.XID); result.SetUInt(e.ErrorNumber); } Send(result, receivedFrom); }
internal virtual bool Read(NfsPacket packet) { _seconds = packet.GetUInt(); _milliseconds = packet.GetUInt(); return true; }
private void Mount(NfsPacket sourcePacket, IPEndPoint receivedFrom) { NfsReply replyCode = NfsReply.OK; NfsPacket packet = new NfsPacket(128); packet.AddReplyHeader(sourcePacket.XID); // skip past the authentication records sourcePacket.ReadAuthentication(); sourcePacket.ReadAuthentication(); // next should be a dirpath, which is a string. Replace unix style path with local style path String path = sourcePacket.GetString(); if (path == null) { replyCode = NfsReply.ERR_STALE; } else { String original = path.Clone() as String; path = NfsPath.ToWin(path); //Console.WriteLine("MountHandler.Mount : requested: " + original + ", actual: " + path); //if (!Directory.Exists(path)) { // replyCode = NfsReply.ERR_EXIST; //} } // Try to validate this mount, if there is an error make an error packet, otherwise send back the handle. if (replyCode != NfsReply.OK) { packet.SetUInt((uint)replyCode); } else if (false) //exports.Matches(packet.Source(), path) == false) { // No permission for this mount in the exports file //result.AddLong(NFS.NFSERR_PERM); //Console.Error.WriteLine("!!! Mount request for " + path + "from " + packet.Source() + " denied.\n"); { } else { // put together a file handle uint handle = HandleManager.Current.GetHandle(path); var fileHandle = new FileSystem.FileHandle(); fileHandle.Set(handle, (uint)handle, 0); packet.SetUInt((uint)replyCode); fileHandle.Emit(ref packet); } if (replyCode == NfsReply.OK) { MountManager.Current.Add(sourcePacket.RemoteHost, path); } Send(packet, receivedFrom); }
internal virtual bool Emit(ref NfsPacket packet) { packet.SetUInt(_seconds); packet.SetUInt(_milliseconds); return true; }