diff --git a/native/jni/utils/include/utils.h b/native/jni/utils/include/utils.h index e4c79ec2d..96a9dab41 100644 --- a/native/jni/utils/include/utils.h +++ b/native/jni/utils/include/utils.h @@ -20,6 +20,9 @@ int file_to_vector(const char *filename, Vector &arr); char *strdup2(const char *s, size_t *size = nullptr); +int exec_array(bool err, int *fd, void (*pre_exec)(void), const char **argv); +int exec_command(bool err, int *fd, void (*cb)(void), const char *argv0, ...); + extern "C" { #endif @@ -91,8 +94,6 @@ unsigned get_system_uid(); unsigned get_radio_uid(); ssize_t fdgets(char *buf, size_t size, int fd); int is_num(const char *s); -int exec_array(bool err, int *fd, void (*cb)(void), const char **argv); -int exec_command(bool err, int *fd, void (*cb)(void), const char *argv0, ...); int exec_command_sync(const char *argv0, ...); int fork_dont_care(); void gen_rand_str(char *buf, int len); diff --git a/native/jni/utils/misc.cpp b/native/jni/utils/misc.cpp index 62a1c9383..43752db31 100644 --- a/native/jni/utils/misc.cpp +++ b/native/jni/utils/misc.cpp @@ -184,9 +184,9 @@ int __fsetxattr(int fd, const char *name, const void *value, size_t size, int fl fd == nullptr -> Ignore output *fd < 0 -> Open pipe and set *fd to the read end *fd >= 0 -> STDOUT (or STDERR) will be redirected to *fd - *cb -> A callback function which calls after forking + *pre_exec -> A callback function called after forking, before execvp */ -int exec_array(bool err, int *fd, void (*cb)(void), const char **argv) { +int exec_array(bool err, int *fd, void (*pre_exec)(void), const char **argv) { int pipefd[2], outfd = -1; if (fd) { @@ -209,15 +209,16 @@ int exec_array(bool err, int *fd, void (*cb)(void), const char **argv) { return pid; } - if (fd) { + if (outfd >= 0) { xdup2(outfd, STDOUT_FILENO); if (err) xdup2(outfd, STDERR_FILENO); + close(outfd); } - // Setup environment - if (cb) - cb(); + // Call the pre-exec callback + if (pre_exec) + pre_exec(); execvp(argv[0], (char **) argv); PLOGE("execvp %s", argv[0]);