public ReadDirPlusReply READDIRPLUS(ReadDirPlusCall readDirPlusCall) { ShareObject directoryShareObject; Status status = sharedFileSystem.TryGetSharedObject(readDirPlusCall.directoryHandle, out directoryShareObject); if (status != Status.Ok) { return(new ReadDirPlusReply(status, OptionalFileAttributes.None)); } UInt64 cookie = readDirPlusCall.cookie; EntryPlus lastEntry = null; GenericArrayBuilder <EntryPlus> entriesBuilder = new GenericArrayBuilder <EntryPlus>(); UInt32 directoryInfoByteCount = 0; Boolean foundCookieObject; if (cookie > 0) { if (cookie == directoryShareObject.cookie) { foundCookieObject = true; } else { foundCookieObject = false; } } else { foundCookieObject = true; // This is the first call so there is no cookie to look for // Handle the '.' directory (will always be included if cookie is 0) if (lastEntry != null) { lastEntry.IsNotLastEntry(); } lastEntry = new EntryPlus( directoryShareObject.fileID, ".", directoryShareObject.cookie, directoryShareObject.optionalFileAttributes, directoryShareObject.optionalFileHandleClass); entriesBuilder.Add(lastEntry); directoryInfoByteCount += 16 + (UInt32)directoryShareObject.shareLeafName.Length; } FileType currentFileType = FileType.Directory; String[] objectNames = Directory.GetDirectories(directoryShareObject.localPathAndName); while (true) { for (int i = 0; i < objectNames.Length; i++) { String objectName = objectNames[i]; ShareObject shareObject = sharedFileSystem.TryGetSharedObject(currentFileType, directoryShareObject.localPathAndName, objectName); if (shareObject == null) { if (NfsServerLog.warningLogger != null) { NfsServerLog.warningLogger.WriteLine("[{0}] [Warning] Could not create or access share object for local directory '{1}'", serviceName, objectName); } continue; } if (!foundCookieObject) { if (shareObject.cookie == cookie) { foundCookieObject = true; } } else { UInt32 entryInfoByteCount = 16 + (UInt32)shareObject.shareLeafName.Length; if (directoryInfoByteCount + entryInfoByteCount > readDirPlusCall.maxDirectoryBytes) { return(new ReadDirPlusReply(directoryShareObject.optionalFileAttributes, null, entriesBuilder.Build(), false)); } directoryInfoByteCount += entryInfoByteCount; shareObject.RefreshFileAttributes(sharedFileSystem.permissions); if (lastEntry != null) { lastEntry.IsNotLastEntry(); } lastEntry = new EntryPlus( shareObject.fileID, shareObject.shareLeafName, shareObject.cookie, shareObject.optionalFileAttributes,//OptionalFileAttributes.None, shareObject.optionalFileHandleClass); entriesBuilder.Add(lastEntry); } } if (currentFileType == FileType.Directory) { objectNames = Directory.GetFiles(directoryShareObject.localPathAndName); currentFileType = FileType.Regular; } else { break; } } directoryShareObject.RefreshFileAttributes(sharedFileSystem.permissions); if (!foundCookieObject) { return(new ReadDirPlusReply(Status.ErrorBadCookie, directoryShareObject.optionalFileAttributes)); } return(new ReadDirPlusReply(directoryShareObject.optionalFileAttributes, null, entriesBuilder.Build(), true)); }
static void Main(string[] args) { if (args.Length != 2) { Console.Error.WriteLine("Error: Expected 2 command line arguments but got {0}", args.Length); return; } // // Options // Boolean forceMountToUsePrivelegedSourcePort = false; Boolean forceNfsToUsePrivelegedSourcePort = false; IPAddress serverHost = EndPoints.ParseIPOrResolveHost(args[0], DnsPriority.IPv4ThenIPv6); String remoteMountDirectory = args[1]; // // // RpcTcpClientConnection portmapConnection = null; RpcTcpClientConnection mountConnection = null; RpcTcpClientConnection nfsConnection = null; DateTime epoch = new DateTime(1970, 1, 1); UInt32 stamp = (UInt32)DateTime.Now.Subtract(epoch).TotalSeconds; RpcCredentials portmapCredentials = RpcCredentials.None; RpcCredentials mountCredentials = RpcCredentials.CreateUnixCredentials(new RpcUnixCredentials(stamp, //0x509d4ff4U, "hplx0274.boi.hp.com", 0, 0, new UInt32[] { 0, 1, 1, 2, 3, 4, 6, 10, 101, 10000, 10070, 10091, 39747 })); RpcCredentials nfsCredentials = mountCredentials; try { StringBuilder builder = new StringBuilder(); Buf buffer = new Buf(1024, 1024); // // Make connection to portmap service // portmapConnection = new RpcTcpClientConnection(new Socket(serverHost.AddressFamily, SocketType.Stream, ProtocolType.Tcp), PortMap2.ProgramHeader, portmapCredentials, RpcVerifier.None); //IPEndPoint portmapEndPoint = new IPEndPoint(serverHost, 111); portmapConnection.socket.Connect(serverHost, 111); // // Dump // PortMap2Procedure.DumpReply dumpReply = new PortMap2Procedure.DumpReply(); ISerializer dumpReplySerializer = dumpReply.CreateSerializer(); portmapConnection.CallBlockingTcp(PortMap2.DUMP, VoidSerializer.Instance, dumpReply.CreateSerializer(), buffer); builder.Length = 0; dumpReplySerializer.DataString(builder); Console.WriteLine(builder.ToString()); // // Get Nfs Port // Mapping getNfsPortMapping = new Mapping( Nfs3.ProgramHeader.program, Nfs3.ProgramHeader.programVersion, PortMap.IPProtocolTcp, 0 // Port 0 ); GetPortReply getNfsPortReply = portmapConnection.CallBlockingTcp(PortMap2.GETPORT, getNfsPortMapping.CreateSerializerAdapater(), GetPortReply.Serializer, buffer); Console.WriteLine("Nfs Port: {0}", getNfsPortReply.port); // // Connect to NFS Service // nfsConnection = new RpcTcpClientConnection(new Socket(serverHost.AddressFamily, SocketType.Stream, ProtocolType.Tcp), Nfs3.ProgramHeader, nfsCredentials, RpcVerifier.None); if (forceNfsToUsePrivelegedSourcePort) { nfsConnection.BindToPrivelegedPort(); } nfsConnection.socket.Connect(serverHost, (Int32)getNfsPortReply.port); // // Test NFS Service // nfsConnection.CallBlockingTcp((UInt32)Nfs3Command.NULL, VoidSerializer.Instance, VoidSerializer.Instance, buffer); // // Get Mount Port // Mapping getMountPort = new Mapping( Mount3.ProgramHeader.program, Mount3.ProgramHeader.programVersion, PortMap.IPProtocolTcp, 0 // Port 0 ); GetPortReply getMountPortReply = portmapConnection.CallBlockingTcp(PortMap2.GETPORT, getMountPort.CreateSerializerAdapater(), GetPortReply.Serializer, buffer); Console.WriteLine("Mount Port: {0}", getMountPortReply.port); // // Connect to Mount Service // mountConnection = new RpcTcpClientConnection(new Socket(serverHost.AddressFamily, SocketType.Stream, ProtocolType.Tcp), Mount3.ProgramHeader, mountCredentials, RpcVerifier.None); if (forceMountToUsePrivelegedSourcePort) { mountConnection.BindToPrivelegedPort(); } mountConnection.socket.Connect(serverHost, (Int32)getMountPortReply.port); // // Test Mount Service // mountConnection.CallBlockingTcp <Object>(Mount.NULL, VoidSerializer.Instance, VoidInstanceSerializer.Instance, buffer); // // Mount the remote direcory // Mount3Reply mountReply = new Mount3Reply(Status.ErrorInvalidArgument); ISerializer mountReplySerializer = mountReply.CreateSerializer(); MountCall mountCall = new MountCall(remoteMountDirectory); mountConnection.CallBlockingTcp(Mount.MNT, mountCall.CreateSerializer(), mountReplySerializer, buffer); Console.WriteLine(); Console.WriteLine(DataStringBuilder.DataString(mountReplySerializer, builder)); AssertOK(mountReply.status); Byte[] rootDirectoryHandle = mountReply.fileHandle; ReadDirPlusCall readDirPlusCall = new ReadDirPlusCall(rootDirectoryHandle, 0, null, 512, UInt32.MaxValue); ReadDirPlusReply readDirPlusReply = new ReadDirPlusReply(Status.ErrorInvalidArgument, null); nfsConnection.CallBlockingTcp((UInt32)Nfs3Command.READDIRPLUS, readDirPlusCall.CreateSerializer(), readDirPlusReply.CreateSerializer(), buffer); for (int i = 0; i < readDirPlusReply.entries.Length; i++) { EntryPlus entry = readDirPlusReply.entries[i]; Console.WriteLine("Entry[{0}] = {1}", i, entry.fileName); } //Console.WriteLine(); //Console.WriteLine(ISerializerString.DataString(readDirPlus.reply.CreateSerializer())); /* * * // * // Get FileSystemInfo * // * Nfs3Procedure.FSInfoCall fileSystemInfo = new Nfs3Procedure.FSInfoCall(rootDirectoryHandle); * nfsConnection.CallBlockingTcp(fileSystemInfo.CreateSerializer(), buffer); * Console.WriteLine(); * //Console.WriteLine(fileSystemInfo.reply.ToNiceString()); * * //AssertOK(fileSystemInfo.reply.status); * * // * // Get File Attributes * // * Nfs3Procedure.GetFileAttributes getFileAttributes = new Nfs3Procedure.GetFileAttributes(new Nfs3Procedure.GetFileAttributesCall( * rootDirectoryHandle * )); * nfsConnection.CallBlockingTcp(getFileAttributes, buffer); * Console.WriteLine(); * Console.WriteLine(getFileAttributes.reply.ToNiceString()); * * AssertOK(getFileAttributes.reply.status); * * // * // Access the file * // * Nfs3Procedure.Access access = new Nfs3Procedure.Access(new Nfs3Procedure.AccessCall( * rootDirectoryHandle, * Nfs3Procedure.AccessFlags.Delete | Nfs3Procedure.AccessFlags.Execute | Nfs3Procedure.AccessFlags.Extend | * Nfs3Procedure.AccessFlags.Lookup | Nfs3Procedure.AccessFlags.Modify | Nfs3Procedure.AccessFlags.Read * )); * nfsConnection.CallBlockingTcp(access, buffer); * Console.WriteLine(); * Console.WriteLine(access.reply.ToNiceString()); * * AssertOK(access.reply.status); * * // * // * // * * Nfs3Procedure.ReadDirPlus readDirPlus = new Nfs3Procedure.ReadDirPlus(new Nfs3Procedure.ReadDirPlusCall( * rootDirectoryHandle, 0, null, Int32.MaxValue, Int32.MaxValue)); * nfsConnection.CallBlockingTcp(readDirPlus, buffer); * * AssertOK(readDirPlus.reply.status); * * if (readDirPlus.reply.entriesIncluded) * { * Nfs3Procedure.EntryPlus entryPlus = readDirPlus.reply.entry; * * while(true) * { * Console.WriteLine(); * Console.WriteLine("ID '{0}' Name '{1}' Cookie '{2}'", entryPlus.fileID, entryPlus.fileName, * entryPlus.cookie); * * Nfs3Procedure.Lookup lookup = new Nfs3Procedure.Lookup(new Nfs3Procedure.LookupCall( * rootDirectoryHandle, entryPlus.fileName)); * nfsConnection.CallBlockingTcp(lookup, buffer); * * AssertOK(lookup.reply.status); * * Console.WriteLine(" FileHandle: {0}", BitConverter.ToString(lookup.reply.fileHandle)); * * Nfs3Procedure.Read read = new Nfs3Procedure.Read(new Nfs3Procedure.ReadCall( * lookup.reply.fileHandle, 0, fileSystemInfo.reply.readSizeMax)); * nfsConnection.CallBlockingTcp(read, buffer); * * if(read.reply.status == Nfs3Procedure.Status.Ok) * { * if(read.reply.count <= 0) * { * Console.WriteLine(" FileLength: {0}", read.reply.count); * } * else * { * Console.WriteLine(" FileLength: {0} FirstPart: '{1}'", read.reply.count, * Encoding.UTF8.GetString(read.reply.fileData.bytes, 0, (read.reply.count > 10U)? 10 : (Int32)read.reply.count)); * } * } * * if(!entryPlus.nextEntryIncluded) break; * entryPlus = entryPlus.nextEntry; * } * } * * * // * // * // * * String temporaryTestDirectory = "TemporaryTestDir"; * String temporaryRenameDirectory = "TemporaryTestDirRenamed"; * String temporaryTestFileName = "TemporaryTestFile"; * * // * // check if test directory exists and remove it if it does * // * Lookup lookupTestDirectory = new Lookup(new LookupCall(rootDirectoryHandle, temporaryTestDirectory)); * nfsConnection.CallBlockingTcp(lookupTestDirectory, buffer); * * if (lookupTestDirectory.reply.status == Status.Ok) * { * Rmdir quickFixRmdir = new Rmdir(new RemoveCall(rootDirectoryHandle, temporaryTestDirectory)); * nfsConnection.CallBlockingTcp(quickFixRmdir, buffer); * * AssertOK(quickFixRmdir.reply.status); * } * else * { * if (lookupTestDirectory.reply.status != Status.ErrorNoSuchFileOrDirectory) * throw new InvalidOperationException(String.Format("Expected OK or NoSuchFileOrDirectory but got '{0}'", lookupTestDirectory.reply.status)); * } * * * * * // * // Test MkDir * // * Mkdir mkdir = new Mkdir(new MkdirCall(rootDirectoryHandle, temporaryTestDirectory, new SetAttributesStruct( * false, 0, false, 0, false, 0, false, 0, null, null))); * nfsConnection.CallBlockingTcp(mkdir, buffer); * Console.WriteLine(); * Console.WriteLine(mkdir.reply.ToNiceString()); * * AssertOK(mkdir.reply.status); * if (mkdir.reply.optionalFileHandle.fileHandleIncluded == false) throw new Exception("no file handle returned from mkdir"); * * Byte[] newDirectoryHandle = mkdir.reply.optionalFileHandle.fileHandle; * * * // * // Test Create * // * * Create create = new Create(new CreateCall(newDirectoryHandle, temporaryTestFileName, CreateModeEnum.Unchecked, * new SetAttributesStruct( * false, 0, * false, 0, * false, 0, * false, 0, * null, * null))); * nfsConnection.CallBlockingTcp(create, buffer); * Console.WriteLine(); * Console.WriteLine(create.reply.ToNiceString()); * * AssertOK(create.reply.status); * if (create.reply.optionalFileHandle.fileHandleIncluded == false) throw new Exception("no file handle returned from Create"); * * Byte[] newFileHandle = create.reply.optionalFileHandle.fileHandle; * * // * // Test Write * // * Byte[] testWriteData = Encoding.UTF8.GetBytes("test data\r\nthis is a test write over nfs\r\n"); * Write write = new Write(new WriteCall(newFileHandle, StableHowEnum.Unstable, * testWriteData, 0, (UInt32)testWriteData.Length)); * nfsConnection.CallBlockingTcp(write, buffer); * * AssertOK(write.reply.status); * * // * // Test SetAttr * // * SetFileAttributes setAttributes = new SetFileAttributes(new SetFileAttributesCall( * newFileHandle, * new SetAttributesStruct(false, 0, false, 0, false, 0, false, 0, null, null), * null)); * nfsConnection.CallBlockingTcp(setAttributes, buffer); * Console.WriteLine(); * Console.WriteLine(setAttributes.reply.ToNiceString()); * * AssertOK(setAttributes.reply.status); * * // * // Test Remove * // * Remove remove = new Remove(new RemoveCall(newDirectoryHandle, temporaryTestFileName)); * nfsConnection.CallBlockingTcp(remove, buffer); * * Console.WriteLine(); * Console.WriteLine(remove.reply.ToNiceString()); * * AssertOK(remove.reply.status); * * // remove parent directory * remove = new Remove(new RemoveCall(rootDirectoryHandle, temporaryTestDirectory)); * nfsConnection.CallBlockingTcp(remove, buffer); * * Console.WriteLine(); * Console.WriteLine(remove.reply.ToNiceString()); * * AssertOK(remove.reply.status); * * // make parent directory again * nfsConnection.CallBlockingTcp(mkdir, buffer); * * Console.WriteLine(); * Console.WriteLine(mkdir.reply.ToNiceString()); * * AssertOK(mkdir.reply.status); * if (mkdir.reply.optionalFileHandle.fileHandleIncluded == false) throw new Exception("no file handle returned from mkdir"); * newDirectoryHandle = mkdir.reply.optionalFileHandle.fileHandle; * * * Rename rename = new Rename(new RenameCall(rootDirectoryHandle, temporaryTestDirectory, * rootDirectoryHandle, temporaryRenameDirectory)); * nfsConnection.CallBlockingTcp(rename, buffer); * * Console.WriteLine(); * Console.WriteLine(rename.reply.ToNiceString()); * * AssertOK(rename.reply.status); * * * // remove parent directory again using rmdir instead of remove * Rmdir rmdir = new Rmdir(new RemoveCall(rootDirectoryHandle, temporaryRenameDirectory)); * nfsConnection.CallBlockingTcp(rmdir, buffer); * * Console.WriteLine(); * Console.WriteLine(rmdir.reply.ToNiceString()); * * AssertOK(rmdir.reply.status); */ } finally { if (portmapConnection != null) { portmapConnection.Dispose(); } if (mountConnection != null) { mountConnection.Dispose(); } if (nfsConnection != null) { nfsConnection.Dispose(); } } }