diff options
| author | Andrew Nitrogenesis <112193680+nitrogenez@users.noreply.github.com> | 2023-04-07 17:03:26 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-07 15:03:26 +0100 |
| commit | a35ea4d242b5890b6bb878fcc2ed36b9f10d9412 (patch) | |
| tree | ba1324566e08c0afeef4ccef88703cfed42ccff5 /src/main.cpp | |
| parent | d8645cd148949c7ceaf516c1c9af0c2a88810e67 (diff) | |
Better and more secure argument parsing, and code reformatting (#1976)
* Better and more secure argument parsing, and code reformatting
* Changes to resolve PR conversation
* Formatted via clang-format, fixed typos
* More typos
Diffstat (limited to 'src/main.cpp')
| -rw-r--r-- | src/main.cpp | 71 |
1 files changed, 51 insertions, 20 deletions
diff --git a/src/main.cpp b/src/main.cpp index 669ece50..99066429 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,11 +3,26 @@ #include "Compositor.hpp" #include "config/ConfigManager.hpp" #include "init/initHelpers.hpp" + #include <iostream> +#include <iterator> +#include <vector> +#include <stdexcept> +#include <string> +#include <filesystem> + #ifdef USES_SYSTEMD #include <systemd/sd-daemon.h> // for sd_notify #endif +void help() { + std::cout << "usage: Hyprland [arg [...]].\n"; + std::cout << "\nArguments:\n"; + std::cout << " --help -h - Show this message again\n"; + std::cout << " --config FILE -c FILE - Specify config file to use\n"; + std::cout << " --i-am-really-stupid - Omits root user privileges check (why would you do that?)\n"; +} + int main(int argc, char** argv) { if (!getenv("XDG_RUNTIME_DIR")) @@ -17,6 +32,7 @@ int main(int argc, char** argv) { std::string cmd = ""; for (auto i = 0; i < argc; ++i) cmd += std::string(i == 0 ? "" : " ") + argv[i]; + setenv("HYPRLAND_CMD", cmd.c_str(), 1); setenv("XDG_BACKEND", "wayland", 1); setenv("_JAVA_AWT_WM_NONREPARENTING", "1", 1); @@ -24,30 +40,45 @@ int main(int argc, char** argv) { setenv("XDG_CURRENT_DESKTOP", "Hyprland", 1); // parse some args - std::string configPath; - bool ignoreSudo = false; - for (int i = 1; i < argc; ++i) { - if (!strcmp(argv[i], "--i-am-really-stupid")) + std::string configPath; + bool ignoreSudo = false; + + std::vector<std::string> args{argv + 1, argv + argc}; + + for (auto it = args.begin(); it != args.end(); it++) { + if (it->compare("--i-am-really-stupid") == 0 && !ignoreSudo) { + std::cout << "[ WARNING ] Running Hyprland with superuser privileges might damage your system\n"; + ignoreSudo = true; - else if ((!strcmp(argv[i], "-c") || !strcmp(argv[i], "--config")) && argc >= i + 2) { - configPath = std::string(argv[++i]); - Debug::log(LOG, "Using config location %s.", configPath.c_str()); - } else { - std::cout << "Hyprland usage: Hyprland [arg [...]].\n\nArguments:\n" - << "--help -h | Show this help message\n" - << "--config -c | Specify config file to use\n"; - return 1; } - } - if (!ignoreSudo) { - if (Init::isSudo()) { - std::cout << "Hyprland shall not be run as the root user. If you really want to, use the --i-am-really-stupid flag.\n"; - return 1; + else if (it->compare("-c") == 0 || it->compare("--config") == 0) { + if (std::next(it)->c_str() == nullptr) { + help(); + return 1; + } + std::string next_arg = std::next(it)->c_str(); + + if (!std::filesystem::exists(next_arg)) { + std::cerr << "[ ERROR ] Config path '" << next_arg << "' doesn't exist!\n"; + help(); + + return 1; + } + + configPath = next_arg; + Debug::log(LOG, "User-specified config location: '%s'", configPath.c_str()); + continue; } - } else { - std::cout << "Running with ignored root checks, I surely hope you know what you're doing.\n"; - sleep(1); + } + + if (!ignoreSudo && Init::isSudo()) { + std::cerr << "[ ERROR ] Hyprland was launched with superuser priveleges, but the privileges check is not omitted.\n"; + std::cerr << " Hint: Use the --i-am-really-stupid flag to omit that check.\n"; + + return 1; + } else if (ignoreSudo && Init::isSudo()) { + std::cout << "Superuser privileges check is omitted. I hope you know what you're doing.\n"; } std::cout << "Welcome to Hyprland!\n"; |
