Author: janderwald Date: Wed Aug 29 02:07:54 2007 New Revision: 28635
URL: http://svn.reactos.org/svn/reactos?rev=28635&view=rev Log: - if'd ROS_EMU_TYPE - check for cdrom images + hdd images - check provided image and qemu paths - search for default cdrom image + hdd image
Modified: trunk/reactos/tools/sysreg/rosboot_test.cpp trunk/reactos/tools/sysreg/rosboot_test.h
Modified: trunk/reactos/tools/sysreg/rosboot_test.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/rosboot_test.c... ============================================================================== --- trunk/reactos/tools/sysreg/rosboot_test.cpp (original) +++ trunk/reactos/tools/sysreg/rosboot_test.cpp Wed Aug 29 02:07:54 2007 @@ -97,27 +97,107 @@ OsSupport::sleep(m_DelayRead); } } - +//--------------------------------------------------------------------------------------- + void RosBootTest::getDefaultHDDImage(string & img) + { + img = "output-i386"; + + EnvironmentVariable::getValue(_T("ROS_OUTPUT"), img); + img += _T("\ros.hd"); + } +//--------------------------------------------------------------------------------------- + bool RosBootTest::isFileExisting(string output) + { + FILE * file; + + file = _tfopen(output.c_str(), _T("r")); + + if (file) + { + /* the file exists */ + fclose(file); + return true; + } + return false; + } + +//--------------------------------------------------------------------------------------- + bool RosBootTest::isDefaultHDDImageExisting() + { + string img; + + getDefaultHDDImage(img); + return isFileExisting(img); + } + +//--------------------------------------------------------------------------------------- + bool RosBootTest::createDefaultHDDImage() + { + + string qemuimgdir; + string output; + + if (!getQemuDir(qemuimgdir)) + { + return false; + } + +#ifdef __LINUX___ + qemuimgdir += _T("\qemu-img"); +#else + qemuimgdir += _T("\qemu-img.exe"); +#endif + + TCHAR * options[] = { + _T("create"), + NULL, + _T("100M"), + NULL + }; + + getDefaultHDDImage(output); + options[1] = (TCHAR*)output.c_str(); + + cerr << "Creating HDD Image ..." << output << endl; + if (OsSupport::createProcess ((TCHAR*)qemuimgdir.c_str(), 3, options, true)) + { + m_HDDImage = output; + return true; + } + + return false; + } //---------------------------------------------------------------------------------------- - bool RosBootTest::configureQemu() + bool RosBootTest::isQemuPathValid() { string qemupath; + + if (m_BootCmd.length()) + { + /* the boot cmd is already provided + * check if path to qemu is valid + */ + string::size_type pos = m_BootCmd.find_first_of(_T(" ")); + if (pos == string::npos) + { + /* the bootcmd is certainly not valid */ + return false; + } + qemupath = m_BootCmd.substr(0, pos); + } + else + { + /* the qemu path is provided ROS_EMU_PATH variable */ + qemupath = m_EmuPath; + } + + + return isFileExisting(qemupath); + } +//---------------------------------------------------------------------------------------- + bool RosBootTest::getQemuDir(string & qemupath) + { string::size_type pos; - - bool bootfromcd = false; - bool bootcmdprovided = false; - if (m_CDImage != _T("") ) - { - bootfromcd = true; - } - - if (m_BootCmd != _T("") ) - { - /// - /// boot cmd is provided already - /// - bootcmdprovided = true; - }
#ifdef __LINUX__ pos = m_EmuPath.find_last_of(_T("/")); @@ -130,56 +210,19 @@ return false; } qemupath = m_EmuPath.substr(0, pos); - - - if (m_HDDImage == _T("")) - { - if(!bootfromcd) - { - cerr << "Error: ROS_CD_IMAGE and ROS_HDD_IMAGE is not set!!!" << endl; - return false; - } - string qemuimgdir = qemupath; - m_HDDImage = _T("ros.img"); -#ifdef __LINUX___ - qemuimgdir += _T("\qemu-img"); -#else - qemuimgdir += _T("\qemu-img.exe"); -#endif - /// - /// FIXME - /// call qemu-img to create the tool - /// - TCHAR * options[] = { - _T("create"), - NULL, - _T("100M"), - NULL - }; - string output = "output-i386"; - EnvironmentVariable::getValue(_T("ROS_OUTPUT"), output); - output += _T("\ros.hd"); - options[1] = (TCHAR*)output.c_str(); - - cerr << "Creating HDD Image ..." << output << endl; - if (OsSupport::createProcess ((TCHAR*)qemuimgdir.c_str(), 3, options, true)) - { - m_HDDImage = output; - } - else - { - return false; - } - } - - if (!bootcmdprovided) - { - if (m_MaxMem == "") - { - // default to 64M - m_MaxMem = "64"; - } - string pipe; + return true; + } +//---------------------------------------------------------------------------------------- + bool RosBootTest::createBootCmd() + { + string pipe; + + if (m_MaxMem.length() == 0) + { + /* set default memory size to 64M */ + m_MaxMem = "64"; + } + #ifdef __LINUX__ pipe = _T("stdio"); m_Src = _T(""); @@ -187,75 +230,244 @@ pipe = _T("pipe:qemu"); m_Src = _T("\\.\pipe\qemu"); #endif + string qemudir; + if (!getQemuDir(qemudir)) + { + return false; + }
- - if (bootfromcd) - { - m_BootCmd = m_EmuPath + _T(" -serial ") + pipe + _T(" -m ") + m_MaxMem + _T(" -hda ") + m_HDDImage + _T(" -boot d -cdrom ") + m_CDImage + _T(" -L ") + qemupath; - } - else - { - m_BootCmd = m_EmuPath + _T(" -L ") + qemupath + _T(" -m ") + m_MaxMem + _T(" -boot c -serial ") + pipe + _T(" -hda ") + m_HDDImage; - } - - if (m_KillEmulator == _T("yes")) - { + m_BootCmd = m_EmuPath + _T(" -L ") + qemudir + _T(" -m ") + m_MaxMem + _T(" -hda ") + m_HDDImage + _T(" -serial ") + pipe; + + if (m_CDImage.length()) + { + /* boot from cdrom */ + m_BootCmd += _T(" -boot d -cdrom ") + m_CDImage; + } + else + { + /* boot from hdd */ + m_BootCmd += _T(" -boot c "); + } + #ifdef __LINUX__ - m_BootCmd += _T(" -pidfile pid.txt"); + /* on linux we need get pid in order to be able + * to terminate the emulator in case of errors + * on windows we can get pid as return of CreateProcess + */ + m_BootCmd += _T(" -pidfile pid.txt"); #endif - } - else - { - m_BootCmd += _T(" -no-reboot "); - } - } - else - { + + m_BootCmd += _T(" -no-reboot "); + + return true; + } +//---------------------------------------------------------------------------------------- + bool RosBootTest::extractPipeFromBootCmd() + { string::size_type pos = m_BootCmd.find(_T("-serial")); - if (pos != string::npos) - { - string pipe = m_BootCmd.substr(pos + 7, m_BootCmd.size() - pos -7); - pos = pipe.find(_T("pipe:")); - if (pos == 0) - { + if (pos == string::npos) + { + /* no debug options provided */ + return false; + } + + string pipe = m_BootCmd.substr(pos + 7, m_BootCmd.size() - pos -7); + pos = pipe.find(_T("pipe:")); + if (pos == 0) + { #ifdef __LINUX__ - cerr << "Error: popen doesnot support reading from pipe" << endl; - return false; + cerr << "Error: reading from pipes is not supported with linux hosts - use stdio" << endl; + return false; #else - pipe = pipe.substr(pos + 5, pipe.size() - pos - 5); - pos = pipe.find(_T(" ")); - if (pos != string::npos) - { - m_Src = _T("\\.\pipe\") + pipe.substr(0, pos); - } - else - { - m_Src = _T("\\.\pipe\") + pipe; - } + pipe = pipe.substr(pos + 5, pipe.size() - pos - 5); + pos = pipe.find(_T(" ")); + if (pos != string::npos) + { + m_Src = _T("\\.\pipe\") + pipe.substr(0, pos); + } + else + { + m_Src = _T("\\.\pipe\") + pipe; + } + return true; + } +#endif + pos = pipe.find(_T("stdio")); + if (pos == 0) + { +#ifdef __LINUX__ + m_Src = m_BootCmd; + return true; +#else + cerr << "Error: reading from stdio is not supported for windows hosts - use pipes" << endl; + return false; #endif - } - else - { - pos = pipe.find(_T("stdio")); - if (pos == 0) - { -#ifdef __LINUX__ - m_Src = m_BootCmd; -#else - cerr << "Error: sysreg does not support reading stdio" << endl; - return false; -#endif - - } - - - } - - } - - - } - + } + + cerr << "Error: no valid debug port specified - use stdio / pipes" << endl; + return false; + } +//---------------------------------------------------------------------------------------- + bool RosBootTest::configureHDDImage() + { + if (m_HDDImage.length()) + { + /* check if ROS_HDD_IMAGE points to hdd image */ + return isFileExisting(m_HDDImage); + } + + if (isDefaultHDDImageExisting()) + { + /* ROS_HDD_IMAGE is not set but theres + * a default existing image + * to use */ + getDefaultHDDImage(m_HDDImage); + return true; + } + + if (m_CDImage.length()) + { + /* ROS_CD_IMAGE is set but no ROS_HDD_IMAGE is set + * so create hdd image */ + if (!createDefaultHDDImage()) + { + /* failed to create hdd image */ + cerr << "Error: failed to create hdd image " << endl; + return false; + } + getDefaultHDDImage(m_HDDImage); + return true; + } + /// + /// FIXME + /// scan m_BootCmd if theres -hda param provided + /// and check if it exists + + return true; + } +//---------------------------------------------------------------------------------------- + bool RosBootTest::configureCDImage() + { + if (m_CDImage.length()) + { + /* we have a cd image lets check if its valid */ + if (!isFileExisting(m_CDImage)) + { + cerr << "Error: ROS_CD_IMAGE is not valid" << endl; + return false; + } + return true; + } + + /* ROS_CD_IMAGE is not set + * lets check if m_BootCmd provides it + */ + + if (!m_BootCmd.length()) + { + /* ROS_BOOT_CMD not set + * check if theres a default image + */ + + if (isFileExisting(_T("ReactOS-RegTest.iso"))) + { + m_CDImage = _T("ReactOS-RegTest.iso"); + } + return true; + } + + string::size_type pos = m_BootCmd.find(_T("-boot ")); + if (pos == string::npos) + { + /* ROS_BOOT_CMD must provide a boot parameter*/ + cerr << "Error: ROS_BOOT_CMD misses boot parameter" << endl; + return false; + } + + string rest = m_BootCmd.substr(pos + 6, m_BootCmd.length() - pos - 6); + if (rest.length() < 1) + { + /* boot parameter misses option where to boot from */ + cerr << "Error: ROS_BOOT_CMD misses boot parameter" << endl; + return false; + } + if (rest[0] != _T('c') && rest[0] != _T('d')) + { + cerr << "Error: ROS_BOOT_CMD has invalid boot parameter" << endl; + return false; + } + + if (rest[0] == _T('c')) + { + /* ROS_BOOT_CMD boots from hdd */ + return true; + } + + pos = m_BootCmd.find(_T("-cdrom ")); + if (pos == string::npos) + { + cerr << "Error: ROS_BOOT_CMD misses cdrom parameter" << endl; + return false; + } + rest = m_BootCmd.substr(pos + 7, m_BootCmd.length() - pos - 7); + if (!rest.length()) + { + cerr << "Error: ROS_BOOT_CMD misses cdrom parameter" << endl; + return false; + } + pos = rest.find(_T(" ")); + if (pos != string::npos) + { + rest = rest.substr(0, pos); + } + + if (!isFileExisting(rest)) + { + cerr << "Error: cdrom image " << rest << " does not exist" << endl; + return false; + } + else + { + m_CDImage = rest; + return true; + } + } +//---------------------------------------------------------------------------------------- + bool RosBootTest::configureQemu() + { + if (!isQemuPathValid()) + { + cerr << "Error: the path to qemu is not valid" << endl; + return false; + } + + if (!configureCDImage()) + { + cerr << "Error: failed to set a valid cdrom configuration" << endl; + return false; + } + + if (!configureHDDImage()) + { + cerr << "Error: failed to set a valid hdd configuration" << endl; + return false; + } + + if (m_BootCmd.length()) + { + if (!extractPipeFromBootCmd()) + { + return false; + } + } + else + { + if (!createBootCmd()) + { + return false; + } + } + cerr << "Opening Data Source:" << m_BootCmd << endl;
@@ -283,11 +495,13 @@ //--------------------------------------------------------------------------------------- bool RosBootTest::readConfigurationValues(ConfigParser &conf_parser) { +#if 0 if (!conf_parser.getStringValue(RosBootTest::ROS_EMU_TYPE, m_EmuType)) { cerr << "Error: ROS_EMU_TYPE is not set" << endl; return false; } +#endif
if (!conf_parser.getStringValue(RosBootTest::ROS_EMU_PATH, m_EmuPath)) { @@ -332,7 +546,7 @@ { return false; } - +#if 0 if (m_EmuType == EMU_TYPE_QEMU) { if (!configureQemu()) @@ -357,6 +571,13 @@ cerr << "Error: ROS_EMU_TYPE value is not supported:" << m_EmuType << "=" << EMU_TYPE_QEMU << endl; return false; } +#else + if (!configureQemu()) + { + cerr << "Error: failed to configure qemu" << endl; + return false; + } +#endif #ifndef __LINUX__ OsSupport::sleep(500); #endif
Modified: trunk/reactos/tools/sysreg/rosboot_test.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/rosboot_test.h... ============================================================================== --- trunk/reactos/tools/sysreg/rosboot_test.h (original) +++ trunk/reactos/tools/sysreg/rosboot_test.h Wed Aug 29 02:07:54 2007 @@ -83,6 +83,16 @@
protected:
+ void getDefaultHDDImage(string & img); + bool isFileExisting(string filename); + bool isDefaultHDDImageExisting(); + bool createDefaultHDDImage(); + bool isQemuPathValid(); + bool getQemuDir(string &); + bool createBootCmd(); + bool extractPipeFromBootCmd(); + bool configureCDImage(); + bool configureHDDImage(); void getPidFromFile(); bool executeBootCmd(); void delayRead();