diff --git a/.github/workflows/builditmac.yaml b/.github/workflows/builditmac.yaml index e7d7c555..b9d091f5 100644 --- a/.github/workflows/builditmac.yaml +++ b/.github/workflows/builditmac.yaml @@ -25,6 +25,9 @@ jobs: cp dist/SOURCE.URL cslol-manager-macos/ cp build/cslol-tools/wad-* cslol-manager-macos/ cp -R build/cslol-manager.app cslol-manager-macos/ + cp build/cslol-manager-elevate cslol-manager-macos/cslol-manager.app/Contents/MacOS/ + plutil -replace CFBundleExecutable -string cslol-manager-elevate cslol-manager-macos/cslol-manager.app/Contents/Info.plist + plutil -replace CFBundleName -string cslol-manager-elevate cslol-manager-macos/cslol-manager.app/Contents/Info.plist mkdir cslol-manager-macos/cslol-manager.app/Contents/MacOS/cslol-tools cp build/cslol-tools/mod-tools cslol-manager-macos/cslol-manager.app/Contents/MacOS/cslol-tools tar caf cslol-manager-macos.tar.xz cslol-manager-macos/ diff --git a/CMakeLists.txt b/CMakeLists.txt index dd697b1c..3be922c0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,9 @@ cmake_minimum_required(VERSION 3.20) -project(cslol-manager LANGUAGES CXX) +project(cslol-manager LANGUAGES CXX C) +set(CMAKE_C_STANDARD 99) +set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTOUIC ON) @@ -51,6 +53,9 @@ elseif(APPLE) src/main.cpp src/res/icon.icns ) + add_executable(cslol-manager-elevate + src/main_elevate.c + ) set_target_properties(cslol-manager PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/src/res/MacOSXBundleInfo.plist.in" diff --git a/src/main_elevate.c b/src/main_elevate.c new file mode 100644 index 00000000..f9dafe0c --- /dev/null +++ b/src/main_elevate.c @@ -0,0 +1,48 @@ +#include +#include +#include + +#include +#include +#include +#include + +#define COMMAND_CHAR_COUNT_MAX 1000 + PATH_MAX + +int main() +{ + char pathBuff[PATH_MAX]; + uint32_t buffSize = PATH_MAX; + + // + // Find the absolute path + // of this executable. + // + if (_NSGetExecutablePath(pathBuff, &buffSize) != KERN_SUCCESS) + return -1; + + // + // Remove the file component of the abs. path. + // + char *parentDir = dirname(pathBuff); + + char str[COMMAND_CHAR_COUNT_MAX]; + + sprintf( + str, + "do shell script \"sudo %s/cslol-manager >/dev/null 2>&1 &\"" + " with prompt \"CSLOL-Manager needs administrator privileges to restart.\"" + " with administrator privileges" + " without altering line endings", + parentDir + ); + + int code = execlp ( + "osascript", + "osascript", + "-e", + str, + NULL); + + return code; +} \ No newline at end of file