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

Commit 412f0ac4 authored by Narayan Kamath's avatar Narayan Kamath Committed by android-build-merger
Browse files

Merge "Logwrapper: Remove unused support for input / output processing." am: fa339a4f

am: 1e7180f5

Change-Id: I7e7969727b5ddf00b1a32552a911b2383cda2953
parents 6c546660 1e7180f5
Loading
Loading
Loading
Loading
+5 −26
Original line number Diff line number Diff line
@@ -54,9 +54,8 @@ __BEGIN_DECLS
 *           the specified log until the child has exited.
 *   file_path: if log_target has the LOG_FILE bit set, then this parameter
 *           must be set to the pathname of the file to log to.
 *   opts: set to non-NULL if you want to use one or more of the
 *           FORK_EXECVP_OPTION_* features.
 *   opts_len: the length of the opts array. When opts is NULL, pass 0.
 *   unused_opts: currently unused.
 *   unused_opts_len: currently unused.
 *
 * Return value:
 *   0 when logwrap successfully run the child process and captured its status
@@ -72,30 +71,10 @@ __BEGIN_DECLS
#define LOG_KLOG        2
#define LOG_FILE        4

/* Write data to child's stdin. */
#define FORK_EXECVP_OPTION_INPUT             0
/* Capture data from child's stdout and stderr. */
#define FORK_EXECVP_OPTION_CAPTURE_OUTPUT    1

struct AndroidForkExecvpOption {
    int opt_type;
    union {
        struct {
            const uint8_t* input;
            size_t input_len;
        } opt_input;
        struct {
            void (*on_output)(const uint8_t* /*output*/,
                              size_t /*output_len*/,
                              void* /* user_pointer */);
            void* user_pointer;
        } opt_capture_output;
    };
};

// TODO: Remove unused_opts / unused_opts_len in a followup change.
int android_fork_execvp_ext(int argc, char* argv[], int *status, bool ignore_int_quit,
        int log_target, bool abbreviated, char *file_path,
        const struct AndroidForkExecvpOption* opts, size_t opts_len);
        int log_target, bool abbreviated, char *file_path, void* unused_opts,
        int unused_opts_len);

/* Similar to above, except abbreviated logging is not available, and if logwrap
 * is true, logging is to the Android system log, and if false, there is no
+6 −34
Original line number Diff line number Diff line
@@ -291,8 +291,7 @@ static void print_abbr_buf(struct log_info *log_info) {
}

static int parent(const char *tag, int parent_read, pid_t pid,
        int *chld_sts, int log_target, bool abbreviated, char *file_path,
        const struct AndroidForkExecvpOption* opts, size_t opts_len) {
        int *chld_sts, int log_target, bool abbreviated, char *file_path) {
    int status = 0;
    char buffer[4096];
    struct pollfd poll_fds[] = {
@@ -359,13 +358,6 @@ static int parent(const char *tag, int parent_read, pid_t pid,
            sz = TEMP_FAILURE_RETRY(
                read(parent_read, &buffer[b], sizeof(buffer) - 1 - b));

            for (size_t i = 0; sz > 0 && i < opts_len; ++i) {
                if (opts[i].opt_type == FORK_EXECVP_OPTION_CAPTURE_OUTPUT) {
                  opts[i].opt_capture_output.on_output(
                      (uint8_t*)&buffer[b], sz, opts[i].opt_capture_output.user_pointer);
                }
            }

            sz += b;
            // Log one line at a time
            for (b = 0; b < sz; b++) {
@@ -483,7 +475,7 @@ 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,
        const struct AndroidForkExecvpOption* opts, size_t opts_len) {
        void *unused_opts, int unused_opts_len) {
    pid_t pid;
    int parent_ptty;
    int child_ptty;
@@ -493,6 +485,9 @@ int android_fork_execvp_ext(int argc, char* argv[], int *status, bool ignore_int
    sigset_t oldset;
    int rc = 0;

    LOG_ALWAYS_FATAL_IF(unused_opts != NULL);
    LOG_ALWAYS_FATAL_IF(unused_opts_len != 0);

    rc = pthread_mutex_lock(&fd_mutex);
    if (rc) {
        ERROR("failed to lock signal_fd mutex\n");
@@ -538,13 +533,6 @@ int android_fork_execvp_ext(int argc, char* argv[], int *status, bool ignore_int
        pthread_sigmask(SIG_SETMASK, &oldset, NULL);
        close(parent_ptty);

        // redirect stdin, stdout and stderr
        for (size_t 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);
@@ -561,24 +549,8 @@ int android_fork_execvp_ext(int argc, char* argv[], int *status, bool ignore_int
            sigaction(SIGQUIT, &ignact, &quitact);
        }

        for (size_t 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, opts, opts_len);
                    abbreviated, file_path);
    }

    if (ignore_int_quit) {