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

Commit 8e16c1d4 authored by Joe Onorato's avatar Joe Onorato Committed by Android (Google) Code Review
Browse files

Merge "Another mac fix"

parents 5066f951 31617e3b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -308,7 +308,7 @@ run_instrumentation_test(const string& packageName, const string& runner, const
        const char* prog = cmd.GetProg();
        char* const* argv = cmd.GetArgv();
        char* const* env = cmd.GetEnv();
        execvpe(prog, argv, env);
        exec_with_path_search(prog, argv, env);
        print_error("Unable to run command: %s", prog);
        exit(1);
    } else {
+37 −3
Original line number Diff line number Diff line
@@ -22,10 +22,13 @@
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/wait.h>

extern char **environ;

Command::Command(const string& prog)
    :prog(prog)
{
@@ -118,7 +121,7 @@ get_command_output(const Command& command, int* err, bool quiet)
        const char* prog = command.GetProg();
        char* const* argv = command.GetArgv();
        char* const* env = command.GetEnv();
        execvpe(prog, argv, env);
        exec_with_path_search(prog, argv, env);
        if (!quiet) {
            print_error("Unable to run command: %s", prog);
        }
@@ -166,7 +169,7 @@ run_command(const Command& command)
        const char* prog = command.GetProg();
        char* const* argv = command.GetArgv();
        char* const* env = command.GetEnv();
        execvpe(prog, argv, env);
        exec_with_path_search(prog, argv, env);
        print_error("Unable to run command: %s", prog);
        exit(1);
    } else {
@@ -181,3 +184,34 @@ run_command(const Command& command)
    }
}

int
exec_with_path_search(const char* prog, char const* const* argv, char const* const* envp)
{
    if (prog[0] == '/') {
        return execve(prog, (char*const*)argv, (char*const*)envp);
    } else {
        char* pathEnv = strdup(getenv("PATH"));
        if (pathEnv == NULL) {
            return 1;
        }
        char* dir = pathEnv;
        while (dir) {
            char* next = strchr(dir, ':');
            if (next != NULL) {
                *next = '\0';
                next++;
            }
            if (dir[0] == '/') {
                struct stat st;
                string executable = string(dir) + "/" + prog;
                if (stat(executable.c_str(), &st) == 0) {
                    execve(executable.c_str(), (char*const*)argv, (char*const*)envp);
                }
            }
            dir = next;
        }
        free(pathEnv);
        return 1;
    }
}
+3 −0
Original line number Diff line number Diff line
@@ -54,5 +54,8 @@ string get_command_output(const Command& command, int* err, bool quiet=false);
 */
int run_command(const Command& command);

// Mac OS doesn't have execvpe. This is the same as execvpe.
int exec_with_path_search(const char* prog, char const* const* argv, char const* const* envp);

#endif // COMMAND_H