Isolated platform-dependent functions from main
This commit is contained in:
@@ -15,16 +15,19 @@ include_directories(
|
|||||||
)
|
)
|
||||||
|
|
||||||
set(SOURCE_FILES
|
set(SOURCE_FILES
|
||||||
|
Platform.h
|
||||||
UEFI.h
|
UEFI.h
|
||||||
main.cpp
|
main.cpp
|
||||||
)
|
)
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
set(SOURCE_FILES ${SOURCE_FILES}
|
set(SOURCE_FILES ${SOURCE_FILES}
|
||||||
|
Platform_Windows.cpp
|
||||||
UEFI_Windows.cpp
|
UEFI_Windows.cpp
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
set(SOURCE_FILES ${SOURCE_FILES}
|
set(SOURCE_FILES ${SOURCE_FILES}
|
||||||
|
Platform_Linux.cpp
|
||||||
UEFI_Linux.cpp
|
UEFI_Linux.cpp
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
#ifndef Platform_h__
|
||||||
|
#define Platform_h__
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
namespace Platform {
|
||||||
|
|
||||||
|
void Initialize();
|
||||||
|
void Reboot();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#include "Platform.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/reboot.h>
|
||||||
|
|
||||||
|
void Platform::Initialize()
|
||||||
|
{
|
||||||
|
// TODO: root permission check here
|
||||||
|
}
|
||||||
|
|
||||||
|
void Platform::Reboot()
|
||||||
|
{
|
||||||
|
sync();
|
||||||
|
if (reboot(RB_AUTOBOOT) != -1) {
|
||||||
|
throw std::runtime_error("Failed to initiate reboot.");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
#include "Platform.h"
|
||||||
|
#include <sstream>
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
void SetPrivilege(HANDLE hToken, LPCWSTR lpszPrivilege, bool bEnablePrivilege)
|
||||||
|
{
|
||||||
|
LUID luid;
|
||||||
|
if (!LookupPrivilegeValueW(NULL, lpszPrivilege, &luid)) {
|
||||||
|
std::stringstream message;
|
||||||
|
message << "LookupPrivilegeValue failed: " << GetLastError();
|
||||||
|
throw std::runtime_error(message.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
TOKEN_PRIVILEGES tp;
|
||||||
|
tp.PrivilegeCount = 1;
|
||||||
|
tp.Privileges[0].Luid = luid;
|
||||||
|
if (bEnablePrivilege) {
|
||||||
|
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|
||||||
|
} else {
|
||||||
|
tp.Privileges[0].Attributes = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!AdjustTokenPrivileges(hToken, false, &tp, sizeof(TOKEN_PRIVILEGES), nullptr, nullptr)) {
|
||||||
|
std::stringstream message;
|
||||||
|
message << "AdjustTockenPrivileges failed: " << GetLastError();
|
||||||
|
throw std::runtime_error(message.str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Platform::Initialize()
|
||||||
|
{
|
||||||
|
// Get access token
|
||||||
|
HANDLE hInstance = GetCurrentProcess();
|
||||||
|
HANDLE hToken;
|
||||||
|
if (OpenProcessToken(hInstance, TOKEN_ADJUST_PRIVILEGES, &hToken) == 0) {
|
||||||
|
std::stringstream message;
|
||||||
|
message << "OpenProcessToken failed: " << GetLastError();
|
||||||
|
throw std::runtime_error(message.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable environment edit privileges
|
||||||
|
SetPrivilege(hToken, SE_SYSTEM_ENVIRONMENT_NAME, true);
|
||||||
|
// Enable shutdown privileges
|
||||||
|
SetPrivilege(hToken, SE_SHUTDOWN_NAME, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Platform::Reboot()
|
||||||
|
{
|
||||||
|
if (InitiateSystemShutdown(nullptr, nullptr, 0, false, true) == 0) {
|
||||||
|
std::stringstream message;
|
||||||
|
message << "Failed to initiate reboot: " << GetLastError();
|
||||||
|
throw std::runtime_error(message.str());
|
||||||
|
}
|
||||||
|
}
|
||||||
+3
-43
@@ -1,8 +1,7 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <tclap/CmdLine.h>
|
#include <tclap/CmdLine.h>
|
||||||
#include <boost/optional.hpp>
|
#include <boost/optional.hpp>
|
||||||
#include <unistd.h>
|
#include "Platform.h"
|
||||||
#include <sys/reboot.h>
|
|
||||||
#include "UEFI.h"
|
#include "UEFI.h"
|
||||||
|
|
||||||
#define VERSION "2.0"
|
#define VERSION "2.0"
|
||||||
@@ -16,41 +15,9 @@ void printBootOrder(UEFI& uefi)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Match a BootOption by numerical ID or Description
|
|
||||||
//const UEFI::BootOption* fuzzyFindOption(const std::vector<UEFI::BootOption>& options, const std::string& identifier)
|
|
||||||
//{
|
|
||||||
// // Find by ID
|
|
||||||
// try {
|
|
||||||
// std::size_t numNums;
|
|
||||||
// std::uint16_t id = std::stoi(identifier, &numNums);
|
|
||||||
// if (numNums == options.size()) {
|
|
||||||
// auto it = std::find_if(options.begin(), options.end(), [&id](auto& o) { return o.ID == id; });
|
|
||||||
// if (it != options.end()) {
|
|
||||||
// if (VERBOSE) { // --verbose
|
|
||||||
// std::cout << "UEFI entry matched by ID." << std::endl;
|
|
||||||
// }
|
|
||||||
// return &(*it);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// } catch (std::invalid_argument& e) {
|
|
||||||
// } catch (std::out_of_range& e) { }
|
|
||||||
//
|
|
||||||
// // Find by description
|
|
||||||
// {
|
|
||||||
// auto it = std::find_if(options.begin(), options.end(), [&identifier](auto& o) { return o.Description == identifier; });
|
|
||||||
// if (it != options.end()) {
|
|
||||||
// if (VERBOSE) {
|
|
||||||
// std::cout << "UEFI entry matched by description." << std::endl;
|
|
||||||
// }
|
|
||||||
// return &(*it);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return nullptr;
|
|
||||||
//}
|
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
|
Platform::Initialize();
|
||||||
UEFI uefi;
|
UEFI uefi;
|
||||||
|
|
||||||
// Arguments
|
// Arguments
|
||||||
@@ -156,9 +123,6 @@ int main(int argc, char* argv[])
|
|||||||
*currentDefault = tmp;
|
*currentDefault = tmp;
|
||||||
|
|
||||||
// Apply boot order
|
// Apply boot order
|
||||||
// for (auto& option : order) {
|
|
||||||
// std::cout << option.ID << ": \"" << option.Description << "\"" << std::endl;
|
|
||||||
// }
|
|
||||||
uefi.WriteBootOrder(order);
|
uefi.WriteBootOrder(order);
|
||||||
|
|
||||||
std::cout << "Boot order changed successfully." << std::endl;
|
std::cout << "Boot order changed successfully." << std::endl;
|
||||||
@@ -172,11 +136,7 @@ int main(int argc, char* argv[])
|
|||||||
// Reboot
|
// Reboot
|
||||||
if (!arg_noreboot.getValue() && !arg_current.getValue()) { // --noreboot --current
|
if (!arg_noreboot.getValue() && !arg_current.getValue()) { // --noreboot --current
|
||||||
std::cout << "Rebooting..." << std::endl;
|
std::cout << "Rebooting..." << std::endl;
|
||||||
sync();
|
Platform::Reboot();
|
||||||
if (reboot(RB_AUTOBOOT) != -1) {
|
|
||||||
std::cerr << "Failed to initiate reboot." << std::endl;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user