fix build on windows
This commit is contained in:
parent
328b96a33e
commit
e1500b8e6d
|
|
@ -14,6 +14,7 @@ target_include_directories(shell PRIVATE include)
|
|||
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT shell)
|
||||
target_compile_definitions(shell PRIVATE _CRT_SECURE_NO_WARNINGS)
|
||||
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
|
||||
endif()
|
||||
|
|
|
|||
20
src/main.cpp
20
src/main.cpp
|
|
@ -92,8 +92,11 @@ int main()
|
|||
result = sh::isExec(tokens[0]);
|
||||
if (result)
|
||||
{
|
||||
std::vector<char*> args;
|
||||
args.push_back(const_cast<char*>(result.value().filename().c_str()));// have exe path on seperate element for execv
|
||||
std::string filename = result.value().filename().string();
|
||||
std::string fullPath = result.value().string();
|
||||
#ifdef _WIN32
|
||||
std::vector<const char*> args;
|
||||
args.push_back(filename.c_str());// have exe path on seperate element for _spawnv
|
||||
|
||||
for (size_t i = 1; i < tokens.size(); i++)
|
||||
{
|
||||
|
|
@ -101,8 +104,8 @@ int main()
|
|||
}
|
||||
|
||||
args.push_back(nullptr);
|
||||
#ifdef _WIN32
|
||||
intptr_t status = _spawnv(_P_WAIT, result.value().c_str(), args.data());
|
||||
|
||||
intptr_t status = _spawnv(_P_WAIT, fullPath.c_str(), args.data());
|
||||
|
||||
if (status == -1)
|
||||
{
|
||||
|
|
@ -110,6 +113,15 @@ int main()
|
|||
return 1;
|
||||
}
|
||||
#else
|
||||
std::vector<char*> args;
|
||||
args.push_back(const_cast<char*>(filename.c_str()));// have exe path on seperate element for execv
|
||||
|
||||
for (size_t i = 1; i < tokens.size(); i++)
|
||||
{
|
||||
args.push_back(const_cast<char*>(tokens[i].c_str()));
|
||||
}
|
||||
|
||||
args.push_back(nullptr);
|
||||
pid_t pid = fork();
|
||||
if (pid == 0)
|
||||
{// child process
|
||||
|
|
|
|||
|
|
@ -96,14 +96,16 @@ namespace sh
|
|||
|
||||
std::optional<std::filesystem::path> isExec(const std::string& input)
|
||||
{
|
||||
|
||||
std::string pathEnv {std::getenv("PATH")};
|
||||
std::string pathEnv{ std::getenv("PATH") };
|
||||
#ifdef _WIN32
|
||||
constexpr char delimiter {';'};
|
||||
constexpr char delimiter{';'};
|
||||
// windows executable extensions
|
||||
const std::vector<std::string> extensions{ "", ".exe", ".bat", ".cmd", ".com" };
|
||||
#else
|
||||
constexpr char delimiter {':'};
|
||||
constexpr char delimiter{':'};
|
||||
const std::vector<std::string> extensions{""};
|
||||
#endif
|
||||
//add our current path, put a delimiter so std::string::find doesn't skip the last token
|
||||
|
||||
pathEnv.append(1, delimiter);
|
||||
pathEnv.append(std::filesystem::current_path().string());
|
||||
pathEnv.append(1, delimiter);
|
||||
|
|
@ -114,28 +116,27 @@ namespace sh
|
|||
|
||||
while (nextDelimIndex != std::string::npos)
|
||||
{
|
||||
std::filesystem::path basePath = pathEnv.substr(startCharIndex, nextDelimIndex - startCharIndex);
|
||||
|
||||
currentPath = pathEnv.substr(startCharIndex, nextDelimIndex - startCharIndex);
|
||||
currentPath /= input;
|
||||
for (const auto& ext : extensions)
|
||||
{
|
||||
currentPath = basePath / (input + ext);
|
||||
|
||||
namespace fs = std::filesystem;
|
||||
|
||||
if (!fs::exists(currentPath))
|
||||
if (fs::exists(currentPath))
|
||||
{
|
||||
startCharIndex = nextDelimIndex + 1;
|
||||
nextDelimIndex = pathEnv.find(delimiter, startCharIndex);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((fs::status(currentPath).permissions() & fs::perms::owner_exec) != fs::perms::owner_exec)
|
||||
{// fullPath exists but cant executed
|
||||
startCharIndex = nextDelimIndex + 1;
|
||||
nextDelimIndex = pathEnv.find(delimiter, startCharIndex);
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
return currentPath;
|
||||
}
|
||||
}
|
||||
|
||||
startCharIndex = nextDelimIndex + 1;
|
||||
nextDelimIndex = pathEnv.find(delimiter, startCharIndex);
|
||||
}
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue