forked from quickshell/quickshell
launch: fix use after free of command options
This commit is contained in:
parent
b528be9426
commit
74f371850d
2 changed files with 18 additions and 14 deletions
|
@ -1,5 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include <CLI/App.hpp>
|
#include <CLI/App.hpp>
|
||||||
|
@ -26,6 +27,7 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CommandState {
|
struct CommandState {
|
||||||
|
std::unique_ptr<CLI::App> app;
|
||||||
struct {
|
struct {
|
||||||
int argc = 0;
|
int argc = 0;
|
||||||
char** argv = nullptr;
|
char** argv = nullptr;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include <CLI/App.hpp>
|
#include <CLI/App.hpp>
|
||||||
#include <CLI/CLI.hpp> // NOLINT: Need to include this for impls of some CLI11 classes
|
#include <CLI/CLI.hpp> // NOLINT: Need to include this for impls of some CLI11 classes
|
||||||
|
@ -90,30 +91,31 @@ int parseCommand(int argc, char** argv, CommandState& state) {
|
||||||
return group;
|
return group;
|
||||||
};
|
};
|
||||||
|
|
||||||
auto cli = CLI::App();
|
state.app = std::make_unique<CLI::App>();
|
||||||
|
auto* cli = state.app.get();
|
||||||
|
|
||||||
// Require 0-1 subcommands. Without this, positionals can be parsed as more subcommands.
|
// Require 0-1 subcommands. Without this, positionals can be parsed as more subcommands.
|
||||||
cli.require_subcommand(0, 1);
|
cli->require_subcommand(0, 1);
|
||||||
|
|
||||||
addConfigSelection(&cli);
|
addConfigSelection(cli);
|
||||||
addLoggingOptions(&cli, false);
|
addLoggingOptions(cli, false);
|
||||||
addDebugOptions(&cli);
|
addDebugOptions(cli);
|
||||||
|
|
||||||
{
|
{
|
||||||
cli.add_option_group("")->add_flag("--private-check-compat", state.misc.checkCompat);
|
cli->add_option_group("")->add_flag("--private-check-compat", state.misc.checkCompat);
|
||||||
|
|
||||||
cli.add_flag("-V,--version", state.misc.printVersion)
|
cli->add_flag("-V,--version", state.misc.printVersion)
|
||||||
->description("Print quickshell's version and exit.");
|
->description("Print quickshell's version and exit.");
|
||||||
|
|
||||||
cli.add_flag("-n,--no-duplicate", state.misc.noDuplicate)
|
cli->add_flag("-n,--no-duplicate", state.misc.noDuplicate)
|
||||||
->description("Exit immediately if another instance of the given config is running.");
|
->description("Exit immediately if another instance of the given config is running.");
|
||||||
|
|
||||||
cli.add_flag("-d,--daemonize", state.misc.daemonize)
|
cli->add_flag("-d,--daemonize", state.misc.daemonize)
|
||||||
->description("Detach from the controlling terminal.");
|
->description("Detach from the controlling terminal.");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
auto* sub = cli.add_subcommand("log", "Print quickshell logs.");
|
auto* sub = cli->add_subcommand("log", "Print quickshell logs.");
|
||||||
|
|
||||||
auto* file = sub->add_option("file", state.log.file, "Log file to read.");
|
auto* file = sub->add_option("file", state.log.file, "Log file to read.");
|
||||||
|
|
||||||
|
@ -135,7 +137,7 @@ int parseCommand(int argc, char** argv, CommandState& state) {
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
auto* sub = cli.add_subcommand("list", "List running quickshell instances.");
|
auto* sub = cli->add_subcommand("list", "List running quickshell instances.");
|
||||||
|
|
||||||
auto* all = sub->add_flag("-a,--all", state.instance.all)
|
auto* all = sub->add_flag("-a,--all", state.instance.all)
|
||||||
->description("List all instances.\n"
|
->description("List all instances.\n"
|
||||||
|
@ -151,7 +153,7 @@ int parseCommand(int argc, char** argv, CommandState& state) {
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
auto* sub = cli.add_subcommand("kill", "Kill quickshell instances.");
|
auto* sub = cli->add_subcommand("kill", "Kill quickshell instances.");
|
||||||
//sub->add_flag("-a,--all", "Kill all matching instances instead of just one.");
|
//sub->add_flag("-a,--all", "Kill all matching instances instead of just one.");
|
||||||
auto* instance = addInstanceSelection(sub);
|
auto* instance = addInstanceSelection(sub);
|
||||||
addConfigSelection(sub)->excludes(instance);
|
addConfigSelection(sub)->excludes(instance);
|
||||||
|
@ -161,7 +163,7 @@ int parseCommand(int argc, char** argv, CommandState& state) {
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
auto* sub = cli.add_subcommand("msg", "Send messages to IpcHandlers.")->require_option();
|
auto* sub = cli->add_subcommand("msg", "Send messages to IpcHandlers.")->require_option();
|
||||||
|
|
||||||
auto* target = sub->add_option("target", state.ipc.target, "The target to message.");
|
auto* target = sub->add_option("target", state.ipc.target, "The target to message.");
|
||||||
|
|
||||||
|
@ -188,7 +190,7 @@ int parseCommand(int argc, char** argv, CommandState& state) {
|
||||||
state.subcommand.msg = sub;
|
state.subcommand.msg = sub;
|
||||||
}
|
}
|
||||||
|
|
||||||
CLI11_PARSE(cli, argc, argv);
|
CLI11_PARSE(*cli, argc, argv);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue