summaryrefslogtreecommitdiffstats
path: root/logwrapper/logwrap.c
diff options
context:
space:
mode:
authorYusuke Sato <yusukes@google.com>2015-08-19 22:31:08 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-08-19 22:31:08 +0000
commit2ef82cffad897bc16dc1bde1763bf99875da6cbb (patch)
tree2355c5e64ea64c25c5f3107afe02267d0365086b /logwrapper/logwrap.c
parent22b510adc53787e580c591f27613ce0a7f7e7c29 (diff)
parentd1b11a04903be74ba6a47307d8c3ef2731e3f4ab (diff)
downloadsystem_core-2ef82cffad897bc16dc1bde1763bf99875da6cbb.tar.gz
system_core-2ef82cffad897bc16dc1bde1763bf99875da6cbb.tar.bz2
system_core-2ef82cffad897bc16dc1bde1763bf99875da6cbb.zip
am d1b11a04: am e656be33: Merge "Add |opts| argument to android_fork_execvp_ext"
* commit 'd1b11a04903be74ba6a47307d8c3ef2731e3f4ab': Add |opts| argument to android_fork_execvp_ext
Diffstat (limited to 'logwrapper/logwrap.c')
-rw-r--r--logwrapper/logwrap.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/logwrapper/logwrap.c b/logwrapper/logwrap.c
index 44455d157..29aaad40f 100644
--- a/logwrapper/logwrap.c
+++ b/logwrapper/logwrap.c
@@ -474,7 +474,8 @@ static void child(int argc, char* argv[]) {
}
int android_fork_execvp_ext(int argc, char* argv[], int *status, bool ignore_int_quit,
- int log_target, bool abbreviated, char *file_path) {
+ int log_target, bool abbreviated, char *file_path,
+ const struct AndroidForkExecvpOption* opts, size_t opts_len) {
pid_t pid;
int parent_ptty;
int child_ptty;
@@ -483,6 +484,7 @@ int android_fork_execvp_ext(int argc, char* argv[], int *status, bool ignore_int
sigset_t blockset;
sigset_t oldset;
int rc = 0;
+ size_t i;
rc = pthread_mutex_lock(&fd_mutex);
if (rc) {
@@ -529,7 +531,13 @@ int android_fork_execvp_ext(int argc, char* argv[], int *status, bool ignore_int
pthread_sigmask(SIG_SETMASK, &oldset, NULL);
close(parent_ptty);
- // redirect stdout and stderr
+ // redirect stdin, stdout and stderr
+ for (i = 0; i < opts_len; ++i) {
+ if (opts[i].opt_type == FORK_EXECVP_OPTION_INPUT) {
+ dup2(child_ptty, 0);
+ break;
+ }
+ }
dup2(child_ptty, 1);
dup2(child_ptty, 2);
close(child_ptty);
@@ -546,6 +554,22 @@ int android_fork_execvp_ext(int argc, char* argv[], int *status, bool ignore_int
sigaction(SIGQUIT, &ignact, &quitact);
}
+ for (i = 0; i < opts_len; ++i) {
+ if (opts[i].opt_type == FORK_EXECVP_OPTION_INPUT) {
+ size_t left = opts[i].opt_input.input_len;
+ const uint8_t* input = opts[i].opt_input.input;
+ while (left > 0) {
+ ssize_t res =
+ TEMP_FAILURE_RETRY(write(parent_ptty, input, left));
+ if (res < 0) {
+ break;
+ }
+ left -= res;
+ input += res;
+ }
+ }
+ }
+
rc = parent(argv[0], parent_ptty, pid, status, log_target,
abbreviated, file_path);
}