Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 665118f5 authored by Rom Lemarchand's avatar Rom Lemarchand Committed by Android (Google) Code Review
Browse files

Merge "logwrap: wait for child process when receiving SIGINT or SIGQUIT"

parents 99e19664 75c289aa
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@
#ifndef __LIBS_LOGWRAP_H
#define __LIBS_LOGWRAP_H

#include <stdbool.h>

__BEGIN_DECLS

/*
@@ -36,13 +38,17 @@ __BEGIN_DECLS
 *           NULL-terminated
 *   status: the equivalent child status as populated by wait(status). This
 *           value is only valid when logwrap successfully completes
 *   ignore_int_quit: set to true if you want to completely ignore SIGINT and
 *           SIGQUIT while logwrap is running. This may force the end-user to
 *           send a signal twice to signal the caller (once for the child, and
 *           once for the caller)
 *
 * Return value:
 *   0 when logwrap successfully run the child process and captured its status
 *   -1 when an internal error occurred
 *
 */
int logwrap(int argc, char* argv[], int *status);
int logwrap(int argc, char* argv[], int *status, bool ignore_int_quit);

__END_DECLS

+18 −1
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -59,7 +59,7 @@ int main(int argc, char* argv[]) {
        usage();
    }

    rc = logwrap(argc - 1, &argv[1], &status);
    rc = logwrap(argc - 1, &argv[1], &status, true);
    if (!rc) {
        if (WIFEXITED(status))
            rc = WEXITSTATUS(status);