mirror of
https://github.com/yuzu-emu/AppImageKit-checkrt.git
synced 2024-12-25 13:45:36 +00:00
Merge pull request #16 from ilya-fedin/persistent-parent
Fork when starting application and wait for process to complete
This commit is contained in:
commit
ee8125b637
|
@ -1,17 +1,38 @@
|
||||||
--- a/AppRun.c
|
--- a/AppRun.c
|
||||||
+++ b/AppRun.c
|
+++ b/AppRun.c
|
||||||
@@ -164,6 +164,10 @@
|
@@ -32,6 +32,7 @@
|
||||||
char *old_env;
|
#include <dirent.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
+#include <wait.h>
|
||||||
|
|
||||||
|
#define die(...) \
|
||||||
|
do { \
|
||||||
|
@@ -102,6 +103,11 @@
|
||||||
|
line[n] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
+ int pid;
|
||||||
|
+ if ((pid = fork()) == -1) {
|
||||||
|
+ int error = errno;
|
||||||
|
+ die("fork() failed: %s\n", strerror(error));
|
||||||
|
+ } else if (pid == 0) {
|
||||||
|
// count arguments
|
||||||
|
char* arg = exe;
|
||||||
|
int argcount = 0;
|
||||||
|
@@ -165,6 +171,11 @@
|
||||||
size_t length;
|
size_t length;
|
||||||
const char *format;
|
const char *format;
|
||||||
|
|
||||||
+ checkrt(usr_in_appdir);
|
+ checkrt(usr_in_appdir);
|
||||||
+
|
+
|
||||||
+ if (optional_ld_preload)
|
+ if (optional_ld_preload)
|
||||||
+ putenv(optional_ld_preload);
|
+ putenv(optional_ld_preload);
|
||||||
|
+
|
||||||
/* https://docs.python.org/2/using/cmdline.html#envvar-PYTHONHOME */
|
/* https://docs.python.org/2/using/cmdline.html#envvar-PYTHONHOME */
|
||||||
SET_NEW_ENV(new_pythonhome, appdir_s, "PYTHONHOME=%s/usr/", appdir);
|
SET_NEW_ENV(new_pythonhome, appdir_s, "PYTHONHOME=%s/usr/", appdir);
|
||||||
@@ -172,7 +176,7 @@
|
|
||||||
|
@@ -172,7 +183,7 @@
|
||||||
SET_NEW_ENV(new_path, appdir_s*5 + strlen(old_env), "PATH=%s/usr/bin/:%s/usr/sbin/:%s/usr/games/:%s/bin/:%s/sbin/:%s", appdir, appdir, appdir, appdir, appdir, old_env);
|
SET_NEW_ENV(new_path, appdir_s*5 + strlen(old_env), "PATH=%s/usr/bin/:%s/usr/sbin/:%s/usr/games/:%s/bin/:%s/sbin/:%s", appdir, appdir, appdir, appdir, appdir, old_env);
|
||||||
|
|
||||||
old_env = getenv("LD_LIBRARY_PATH") ?: "";
|
old_env = getenv("LD_LIBRARY_PATH") ?: "";
|
||||||
|
@ -20,13 +41,58 @@
|
||||||
|
|
||||||
old_env = getenv("PYTHONPATH") ?: "";
|
old_env = getenv("PYTHONPATH") ?: "";
|
||||||
SET_NEW_ENV(new_pythonpath, appdir_s + strlen(old_env), "PYTHONPATH=%s/usr/share/pyshared/:%s", appdir, old_env);
|
SET_NEW_ENV(new_pythonpath, appdir_s + strlen(old_env), "PYTHONPATH=%s/usr/share/pyshared/:%s", appdir, old_env);
|
||||||
@@ -201,6 +205,9 @@
|
@@ -196,16 +207,29 @@
|
||||||
if (ret == -1)
|
/* Otherwise may get errors because Python cannot write __pycache__ bytecode cache */
|
||||||
die("Error executing '%s': %s\n", exe, strerror(error));
|
putenv("PYTHONDONTWRITEBYTECODE=1");
|
||||||
|
|
||||||
|
- /* Run */
|
||||||
|
- ret = execvp(exe, outargptrs);
|
||||||
|
+ /* Set pid & ppid */
|
||||||
|
+ pid_t pid = getpid();
|
||||||
|
+ pid_t ppid = getppid();
|
||||||
|
|
||||||
|
- int error = errno;
|
||||||
|
+ int pid_len = snprintf(NULL, 0, "%d", pid);
|
||||||
|
+ int ppid_len = snprintf(NULL, 0, "%d", ppid);
|
||||||
|
|
||||||
|
- if (ret == -1)
|
||||||
|
- die("Error executing '%s': %s\n", exe, strerror(error));
|
||||||
|
+ char *s_pid = malloc(pid_len + 1);
|
||||||
|
+ snprintf(s_pid, pid_len + 1, "%d", pid);
|
||||||
|
+
|
||||||
|
+ char *s_ppid = malloc(ppid_len + 1);
|
||||||
|
+ snprintf(s_ppid, ppid_len + 1, "%d", ppid);
|
||||||
|
+
|
||||||
|
+ setenv("PID", s_pid, 1);
|
||||||
|
+ setenv("PPID", s_ppid, 1);
|
||||||
|
+
|
||||||
|
+ /* Run */
|
||||||
|
+ execvp(exe, outargptrs);
|
||||||
|
+
|
||||||
+ free(optional_ld_library_path);
|
+ free(optional_ld_library_path);
|
||||||
+ if (optional_ld_preload)
|
+ if (optional_ld_preload)
|
||||||
+ free(optional_ld_preload);
|
+ free(optional_ld_preload);
|
||||||
free(line);
|
|
||||||
free(desktop_file);
|
- free(line);
|
||||||
|
- free(desktop_file);
|
||||||
free(usr_in_appdir);
|
free(usr_in_appdir);
|
||||||
|
free(new_pythonhome);
|
||||||
|
free(new_path);
|
||||||
|
@@ -215,5 +239,16 @@
|
||||||
|
free(new_perllib);
|
||||||
|
free(new_gsettings_schema_dir);
|
||||||
|
free(new_qt_plugin_path);
|
||||||
|
- return 0;
|
||||||
|
+
|
||||||
|
+ int error = errno;
|
||||||
|
+ die("Error executing '%s': %s\n", exe, strerror(error));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ int status = 0;
|
||||||
|
+ int rv = waitpid(pid, &status, 0);
|
||||||
|
+ status = rv > 0 && WIFEXITED (status) ? WEXITSTATUS (status) : 1;
|
||||||
|
+
|
||||||
|
+ free(line);
|
||||||
|
+ free(desktop_file);
|
||||||
|
+ return status;
|
||||||
|
}
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -38,6 +38,6 @@ AppRun_patched.c: AppRun.c
|
||||||
patch -p1 --output $@ < AppRun.c.patch
|
patch -p1 --output $@ < AppRun.c.patch
|
||||||
|
|
||||||
AppRun.c:
|
AppRun.c:
|
||||||
wget -c "https://raw.githubusercontent.com/AppImage/AppImageKit/appimagetool/master/src/AppRun.c"
|
wget -c "https://raw.githubusercontent.com/AppImage/AppImageKit/master/src/AppRun.c"
|
||||||
|
|
||||||
.PHONY: checkrt test run_tests all clean
|
.PHONY: checkrt test run_tests all clean
|
||||||
|
|
17
env.c
17
env.c
|
@ -43,6 +43,21 @@ void env_free(char* const *env) {
|
||||||
free((char**)env);
|
free((char**)env);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pid_t get_parent_pid() {
|
||||||
|
pid_t ppid = 0;
|
||||||
|
char *s_ppid = getenv("PPID");
|
||||||
|
|
||||||
|
if(s_ppid) {
|
||||||
|
ppid = atoi(s_ppid);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ppid) {
|
||||||
|
ppid = getppid();
|
||||||
|
}
|
||||||
|
|
||||||
|
return ppid;
|
||||||
|
}
|
||||||
|
|
||||||
static size_t get_number_of_variables(FILE *file, char **buffer, size_t *len) {
|
static size_t get_number_of_variables(FILE *file, char **buffer, size_t *len) {
|
||||||
size_t number = 0;
|
size_t number = 0;
|
||||||
|
|
||||||
|
@ -103,7 +118,7 @@ static char* const* read_env_from_process(pid_t pid) {
|
||||||
}
|
}
|
||||||
|
|
||||||
char* const* read_parent_env() {
|
char* const* read_parent_env() {
|
||||||
pid_t ppid = getppid();
|
pid_t ppid = get_parent_pid();
|
||||||
return read_env_from_process(ppid);
|
return read_env_from_process(ppid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
1
env.h
1
env.h
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
pid_t get_parent_pid();
|
||||||
char* const* read_parent_env();
|
char* const* read_parent_env();
|
||||||
void env_free(char* const *env);
|
void env_free(char* const *env);
|
||||||
|
|
||||||
|
|
6
exec.c
6
exec.c
|
@ -79,12 +79,12 @@ static int exec_common(execve_func_t function, const char *filename, char* const
|
||||||
DEBUG("filename %s, fullpath %s\n", filename, fullpath);
|
DEBUG("filename %s, fullpath %s\n", filename, fullpath);
|
||||||
char* const *env = envp;
|
char* const *env = envp;
|
||||||
if (is_external_process(fullpath)) {
|
if (is_external_process(fullpath)) {
|
||||||
DEBUG("External process detected. Restoring env vars from parent %d\n", getppid());
|
DEBUG("External process detected. Restoring env vars from parent %d\n", get_parent_pid());
|
||||||
env = read_parent_env();
|
env = read_parent_env();
|
||||||
if (!env)
|
if (!env) {
|
||||||
env = envp;
|
env = envp;
|
||||||
else
|
|
||||||
DEBUG("Error restoring env vars from parent\n");
|
DEBUG("Error restoring env vars from parent\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
int ret = function(filename, argv, env);
|
int ret = function(filename, argv, env);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue