[ros-diffs] [cwittich] 24649: -debug info can now be read from a pipe -fixed a typo -terminate the qemu process on linux

cwittich at svn.reactos.org cwittich at svn.reactos.org
Wed Oct 25 18:02:48 CEST 2006


Author: cwittich
Date: Wed Oct 25 20:02:47 2006
New Revision: 24649

URL: http://svn.reactos.org/svn/reactos?rev=24649&view=rev
Log:
-debug info can now be read from a pipe
-fixed a typo
-terminate the qemu process on linux

Added:
    trunk/reactos/tools/sysreg/namedpipe_reader.cpp
    trunk/reactos/tools/sysreg/namedpipe_reader.h
Modified:
    trunk/reactos/tools/sysreg/rosboot_test.cpp
    trunk/reactos/tools/sysreg/sysreg.mak

Added: trunk/reactos/tools/sysreg/namedpipe_reader.cpp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/namedpipe_reader.cpp?rev=24649&view=auto
==============================================================================
--- trunk/reactos/tools/sysreg/namedpipe_reader.cpp (added)
+++ trunk/reactos/tools/sysreg/namedpipe_reader.cpp Wed Oct 25 20:02:47 2006
@@ -1,0 +1,131 @@
+/* $Id: pipe_reader.cpp 24643 2006-10-24 11:45:21Z janderwald $
+ *
+ * PROJECT:     System regression tool for ReactOS
+ * LICENSE:     GPL - See COPYING in the top level directory
+ * FILE:        tools/sysreg/namedpipe_reader.cpp
+ * PURPOSE:     pipe reader support
+ * PROGRAMMERS: Johannes Anderwald (johannes.anderwald at sbox tugraz at)
+ *				Christoph von Wittich (Christoph at ApiViewer.de)
+ */
+
+#include "namedpipe_reader.h"
+
+#include <iostream>
+#include <assert.h>
+
+namespace System_
+{
+//---------------------------------------------------------------------------------------
+	NamedPipeReader::NamedPipeReader() : h_Pipe(NULL)
+	{
+
+	}
+
+//---------------------------------------------------------------------------------------
+	NamedPipeReader::~NamedPipeReader()
+	{
+
+	}
+
+//---------------------------------------------------------------------------------------
+
+	bool NamedPipeReader::openPipe(string const & PipeCmd)
+	{
+		if (h_Pipe != NULL)
+		{
+			cerr << "NamedPipeReader::openPipe> pipe already open" << endl;
+			return false;
+		}
+
+#ifdef __LINUX__
+
+#else
+		h_Pipe = CreateFile(PipeCmd.c_str(),
+			GENERIC_WRITE | GENERIC_READ,
+			0,
+			NULL,
+			OPEN_EXISTING,
+			FILE_ATTRIBUTE_NORMAL,
+			(HANDLE)
+			NULL);
+
+		if(INVALID_HANDLE_VALUE == h_Pipe) {
+			cerr << "NamedPipeReader::openPipe> failed to open pipe " << PipeCmd << GetLastError() << endl;
+			return false;
+		}
+		else
+		{
+			cout << "NamedPipeReader::openPipe> successfully opened pipe" << endl;
+			return true;
+		}
+
+		ConnectNamedPipe(
+			h_Pipe,
+			0);
+
+#endif
+
+	}
+
+//---------------------------------------------------------------------------------------
+
+	bool NamedPipeReader::closePipe() 
+	{
+		if (!h_Pipe)
+		{
+			cerr << "NamedPipeReader::closePipe> pipe is not open" << endl;
+			return false;
+		}
+
+
+#ifdef __LINUX__
+
+#else
+		DisconnectNamedPipe(h_Pipe);
+		CloseHandle(h_Pipe);
+#endif
+
+		h_Pipe = NULL;
+		return true;
+	}
+
+//---------------------------------------------------------------------------------------
+
+	string::size_type NamedPipeReader::readPipe(string &Buffer)
+	{
+		TCHAR * buf = (TCHAR *)Buffer.c_str();
+		string::size_type size = Buffer.capacity();
+		DWORD cbRead;
+		BOOL fSuccess;
+
+//#ifdef NDEBUG
+		memset(buf, 0x0, sizeof(TCHAR) * size);
+//#endif
+
+#ifdef __LINUX__
+
+#else
+		do 
+		{ 
+			fSuccess = ReadFile( 
+				h_Pipe,
+				buf,
+				size,
+				&cbRead,
+				NULL);
+		 
+			if (! fSuccess && GetLastError() != ERROR_MORE_DATA) 
+				break; 
+		 
+			_tprintf( TEXT("%s\n"), buf ); 
+		} while (!fSuccess);  // repeat loop if ERROR_MORE_DATA 
+
+		if (!fSuccess)
+			return 0;
+#endif
+		
+		return _tcslen(buf);
+	}
+
+
+} // end of namespace System_

Added: trunk/reactos/tools/sysreg/namedpipe_reader.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/namedpipe_reader.h?rev=24649&view=auto
==============================================================================
--- trunk/reactos/tools/sysreg/namedpipe_reader.h (added)
+++ trunk/reactos/tools/sysreg/namedpipe_reader.h Wed Oct 25 20:02:47 2006
@@ -1,0 +1,107 @@
+#ifndef NAMEDPIPE_READER_H__
+#define NAMEDPIPE_READER_H__
+
+/* $Id: namedpipe_reader.h 24643 2006-10-24 11:45:21Z janderwald $
+ *
+ * PROJECT:     System regression tool for ReactOS
+ * LICENSE:     GPL - See COPYING in the top level directory
+ * FILE:        tools/sysreg/namedpipe_reader.h
+ * PURPOSE:     file reading support
+ * PROGRAMMERS: Johannes Anderwald (johannes.anderwald at sbox tugraz at)
+ *				Christoph von Wittich (Christoph at ApiViewer.de)
+ */
+
+
+
+#include "user_types.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef __LINUX__
+
+#else
+	#include <windows.h>
+#endif
+
+namespace System_
+{
+//---------------------------------------------------------------------------------------
+///
+/// class NamedPipeReader
+///
+/// Description: this class implements a named pipe reader. 
+
+	class NamedPipeReader
+	{
+	public:
+
+//---------------------------------------------------------------------------------------
+///
+/// NamedPipeReader
+///
+/// Description: constructor of class PipeReader
+
+		NamedPipeReader();
+
+//---------------------------------------------------------------------------------------
+///
+/// virtual ~NamedPipeReader
+///
+/// Description: destructor of class PipeReader
+
+		virtual ~NamedPipeReader();
+
+//---------------------------------------------------------------------------------------
+///
+/// openPipe
+///
+/// Description: this function attempts to open a pipe. If an pipe is already open or
+/// it fails to open a pipe, the function returns false
+///
+/// @param PipeCmd command of the pipe to open
+///
+/// @return bool
+
+		bool openPipe(const string & PipeCmd);
+
+//---------------------------------------------------------------------------------------
+///
+/// closePipe
+///
+/// Description: closes a pipe. Returns true on success
+///
+/// @return bool
+
+		bool closePipe();
+
+//---------------------------------------------------------------------------------------
+///
+/// readPipe
+///
+/// Description: attempts to read from the pipe. Returns true on success. If it returns
+/// false, call PipeReader::isEoF() to determine if the pipe should be closed
+///
+/// @param Buffer to be written to
+/// @return string::size_type
+
+		string::size_type readPipe(string & Buffer);
+
+//---------------------------------------------------------------------------------------
+///
+/// isEof
+///
+/// Description: returns true if the pipe has reached end of file. The caller should call
+/// closePipe if this function returns true
+
+	bool isEof();
+
+protected:
+	HANDLE h_Pipe;
+
+	}; // end of class NamedPipeReader
+
+} // end of namespace System_
+
+
+
+#endif /* end of NAMEDPIPE_READER_H__ */

Modified: trunk/reactos/tools/sysreg/rosboot_test.cpp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/rosboot_test.cpp?rev=24649&r1=24648&r2=24649&view=diff
==============================================================================
--- trunk/reactos/tools/sysreg/rosboot_test.cpp (original)
+++ trunk/reactos/tools/sysreg/rosboot_test.cpp Wed Oct 25 20:02:47 2006
@@ -11,6 +11,7 @@
 
 #include "rosboot_test.h"
 #include "pipe_reader.h"
+#include "namedpipe_reader.h"
 #include "sym_file.h"
 #include "file_reader.h"
 
@@ -32,6 +33,7 @@
 {
 	using std::vector;
 	using System_::PipeReader;
+	using System_::NamedPipeReader;
 	using System_::SymbolFile;
 	using System_::FileReader;
 
@@ -314,18 +316,42 @@
 //---------------------------------------------------------------------------------------
 	bool RosBootTest::fetchDebugByPipe(string boot_cmd)
 	{
-		PipeReader pipe_reader;
-
-		if (!pipe_reader.openPipe(boot_cmd, string(_T("rt"))))
-		{
-			cerr << "Error: failed to open pipe with cmd: " << boot_cmd <<endl;
-			return false;
-		}
-		string Buffer;
-		Buffer.reserve (500);
-
-		bool ret = true;
-		vector<string> vect;
+		NamedPipeReader namedpipe_reader;
+		string pipecmd = _T("");
+
+#ifdef __LINUX__
+
+#else
+		STARTUPINFO siStartInfo;
+		PROCESS_INFORMATION piProcInfo; 
+
+		ZeroMemory(&siStartInfo, sizeof(STARTUPINFO));
+		ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION));
+
+		siStartInfo.cb = sizeof(STARTUPINFO);
+		siStartInfo.wShowWindow = SW_SHOWNORMAL;
+		siStartInfo.dwFlags = STARTF_USESHOWWINDOW;
+
+		LPTSTR command = _tcsdup(boot_cmd.c_str());
+
+		if (!CreateProcess(NULL, command, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &siStartInfo, &piProcInfo))
+		{
+			cerr << "Error: CreateProcess failed " << boot_cmd <<endl;
+			return false;
+		}
+#endif
+
+		string::size_type pipe_pos = boot_cmd.find (_T("serial pipe:"));
+		pipe_pos += 12;
+		string::size_type pipe_pos_end = boot_cmd.find (_T(" "), pipe_pos);
+		if (pipe_pos != string::npos && pipe_pos > 0 && pipe_pos < boot_cmd.size())
+		{
+			pipecmd = "\\\\.\\pipe\\" + boot_cmd.substr (pipe_pos, pipe_pos_end - pipe_pos);
+		}
+		else
+		{
+			return false;
+		}
 
 		if (m_Delayread)
 		{
@@ -336,14 +362,26 @@
 			_sleep( (clock_t)m_Delayread * CLOCKS_PER_SEC );
 		}
 
-		while(!pipe_reader.isEof ())
+		if (!namedpipe_reader.openPipe(pipecmd))
+		{
+			cerr << "Error: failed to open pipe with cmd: " << boot_cmd <<endl;
+			return false;
+		}
+		string Buffer;
+		Buffer.reserve (500);
+
+		bool ret = true;
+		vector<string> vect;
+
+		while(1)
 		{
 			if (isTimeout(m_Timeout))
 			{
 				break;
 			}
 
-			pipe_reader.readPipe (Buffer);
+			namedpipe_reader.readPipe (Buffer);
+			cout << Buffer.c_str() << endl;
 			vect.push_back (Buffer);
 
 			DebugState state = checkDebugData(vect);
@@ -358,14 +396,13 @@
 				break;
 			}
 		}
-		pipe_reader.closePipe ();
+		namedpipe_reader.closePipe ();
 		return ret;
 	}
 //---------------------------------------------------------------------------------------
 	bool RosBootTest::fetchDebugByFile(string boot_cmd, string debug_log)
 	{
 		PipeReader pipe_reader;
-
 		_tremove(debug_log.c_str ());
 		_tremove(m_PidFile.c_str ());
 		if (!pipe_reader.openPipe(boot_cmd, string(_T("rt"))))
@@ -377,7 +414,7 @@
 		if (m_Delayread)
 		{
 			///
-			/// delay reading untill emulator is ready
+			/// delay reading until emulator is ready
 			///
 
 			_sleep( (clock_t)m_Delayread * CLOCKS_PER_SEC );
@@ -449,7 +486,7 @@
 		if (pid)
 		{
 #ifdef __LINUX__
-
+			kill(pid, SIGTERM);
 #else
 			HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
 			if (hProcess)

Modified: trunk/reactos/tools/sysreg/sysreg.mak
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/sysreg.mak?rev=24649&r1=24648&r2=24649&view=diff
==============================================================================
--- trunk/reactos/tools/sysreg/sysreg.mak (original)
+++ trunk/reactos/tools/sysreg/sysreg.mak Wed Oct 25 20:02:47 2006
@@ -22,6 +22,7 @@
 	conf_parser.cpp \
 	env_var.cpp \
 	pipe_reader.cpp \
+	namedpipe_reader.cpp \
 	rosboot_test.cpp \
 	sym_file.cpp \
 	sysreg.cpp \
@@ -55,6 +56,10 @@
 	$(ECHO_CC)
 	${host_gpp} $(SYSREGBUILD_HOST_CFLAGS) -c $< -o $@
 
+$(SYSREGBUILD_INT_)namedpipe_reader.o: $(SYSREGBUILD_BASE_)namedpipe_reader.cpp | $(SYSREGBUILD_INT)
+	$(ECHO_CC)
+	${host_gpp} $(SYSREGBUILD_HOST_CFLAGS) -c $< -o $@
+
 $(SYSREGBUILD_INT_)rosboot_test.o: $(SYSREGBUILD_BASE_)rosboot_test.cpp | $(SYSREGBUILD_INT)
 	$(ECHO_CC)
 	${host_gpp} $(SYSREGBUILD_HOST_CFLAGS) -c $< -o $@




More information about the Ros-diffs mailing list