diff options
author | Rom Lemarchand <romlem@google.com> | 2013-01-29 00:12:11 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-01-29 00:12:11 +0000 |
commit | 665118f502baa3d3acaf6aa50c3dd14fdc14779d (patch) | |
tree | d8fe5fafc90f5511e996295bec3df0c6d5cd3d57 /logwrapper/logwrap.c | |
parent | 99e1966400559f9fcc18174e37ccf8a0e5265ffc (diff) | |
parent | 75c289aab9b81dc2235680cf141a4b183ee49391 (diff) | |
download | system_core-665118f502baa3d3acaf6aa50c3dd14fdc14779d.zip system_core-665118f502baa3d3acaf6aa50c3dd14fdc14779d.tar.gz system_core-665118f502baa3d3acaf6aa50c3dd14fdc14779d.tar.bz2 |
Merge "logwrap: wait for child process when receiving SIGINT or SIGQUIT"
Diffstat (limited to 'logwrapper/logwrap.c')
-rw-r--r-- | logwrapper/logwrap.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/logwrapper/logwrap.c b/logwrapper/logwrap.c index 016e12a..ccb2c10 100644 --- a/logwrapper/logwrap.c +++ b/logwrapper/logwrap.c @@ -182,13 +182,15 @@ void sigchld_handler(int sig) { write(signal_fd_write, &sig, 1); } -int logwrap(int argc, char* argv[], int *status) { +int logwrap(int argc, char* argv[], int *status, bool ignore_int_quit) { pid_t pid; int parent_ptty; int child_ptty; char *child_devname = NULL; struct sigaction chldact; struct sigaction oldchldact; + struct sigaction intact; + struct sigaction quitact; sigset_t blockset; sigset_t oldset; int sockets[2]; @@ -210,6 +212,8 @@ int logwrap(int argc, char* argv[], int *status) { } sigemptyset(&blockset); + sigaddset(&blockset, SIGINT); + sigaddset(&blockset, SIGQUIT); sigaddset(&blockset, SIGCHLD); sigprocmask(SIG_BLOCK, &blockset, &oldset); @@ -234,6 +238,8 @@ int logwrap(int argc, char* argv[], int *status) { child(argc, argv); } else { + struct sigaction ignact; + memset(&chldact, 0, sizeof(chldact)); chldact.sa_handler = sigchld_handler; chldact.sa_flags = SA_NOCLDSTOP; @@ -248,6 +254,13 @@ int logwrap(int argc, char* argv[], int *status) { "handler and might cause interaction issues"); } + if (ignore_int_quit) { + memset(&ignact, 0, sizeof(ignact)); + ignact.sa_handler = SIG_IGN; + sigaction(SIGINT, &ignact, &intact); + sigaction(SIGQUIT, &ignact, &quitact); + } + rc = socketpair(AF_UNIX, SOCK_STREAM, 0, sockets); if (rc == -1) { ERROR("socketpair failed: %s\n", strerror(errno)); @@ -267,6 +280,10 @@ int logwrap(int argc, char* argv[], int *status) { close(sockets[0]); close(sockets[1]); err_socketpair: + if (ignore_int_quit) { + sigaction(SIGINT, &intact, NULL); + sigaction(SIGQUIT, &quitact, NULL); + } sigaction(SIGCHLD, &oldchldact, NULL); err_fork: sigprocmask(SIG_SETMASK, &oldset, NULL); |