aboutsummaryrefslogtreecommitdiff
path: root/src/Process.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2024-12-29 16:00:52 +0100
committerdec05eba <dec05eba@protonmail.com>2024-12-29 16:00:52 +0100
commit4b506e865a6997fd24b39335a96cfeea7d14c209 (patch)
tree1f0735e62e678e913ec40d47a69938957cd3ce61 /src/Process.cpp
parent78f44a9486bbc682ea723bb76a24091421c41d78 (diff)
Make systemctl work in flatpak
Diffstat (limited to 'src/Process.cpp')
-rw-r--r--src/Process.cpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/Process.cpp b/src/Process.cpp
index 2a704de..347c485 100644
--- a/src/Process.cpp
+++ b/src/Process.cpp
@@ -31,6 +31,15 @@ namespace gsr {
return true;
}
+ static int count_num_args(const char **args) {
+ int num_args = 0;
+ while(*args) {
+ ++num_args;
+ ++args;
+ }
+ return num_args;
+ }
+
bool exec_program_daemonized(const char **args) {
/* 1 argument */
if(args[0] == nullptr)
@@ -143,6 +152,30 @@ namespace gsr {
return exit_status;
}
+ int exec_program_on_host_get_stdout(const char **args, std::string &result) {
+ if(count_num_args(args) > 64 - 3) {
+ fprintf(stderr, "Error: too many arguments when trying to launch \"%s\"\n", args[0]);
+ return -1;
+ }
+
+ const bool inside_flatpak = getenv("FLATPAK_ID") != NULL;
+ if(inside_flatpak) {
+ // Assumes programs wont need more than 64 - 3 args
+ const char *modified_args[64] = { "flatpak-spawn", "--host", "--" };
+ for(int i = 3; i < 64; ++i) {
+ const char *arg = args[i - 3];
+ if(!arg) {
+ modified_args[i] = nullptr;
+ break;
+ }
+ modified_args[i] = arg;
+ }
+ return exec_program_get_stdout(modified_args, result);
+ } else {
+ return exec_program_get_stdout(args, result);
+ }
+ }
+
// |output_buffer| should be at least PATH_MAX in size
bool read_cmdline_arg0(const char *filepath, char *output_buffer, int output_buffer_size) {
output_buffer[0] = '\0';