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); }
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 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); }
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); }
internal virtual bool Emit(ref NfsPacket packet) { packet.SetUInt(_seconds); packet.SetUInt(_milliseconds); 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); }
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); }
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 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); }
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); }
internal virtual bool Emit(ref NfsPacket packet) { packet.SetUInt(_seconds); packet.SetUInt(_milliseconds); return true; }
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); }
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 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); }