10578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato/*
20578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * Copyright (C) 2016 The Android Open Source Project
30578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato *
40578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
50578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * you may not use this file except in compliance with the License.
60578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * You may obtain a copy of the License at
70578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato *
80578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
90578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato *
100578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * Unless required by applicable law or agreed to in writing, software
110578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
120578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * See the License for the specific language governing permissions and
140578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * limitations under the License.
150578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato */
160578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato
170578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato#ifndef COMMAND_H
180578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato#define COMMAND_H
190578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato
200578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato#include <map>
210578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato#include <string>
220578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato#include <vector>
230578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato
240578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratousing namespace std;
250578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato
260578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratostruct Command
270578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato{
280578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato    Command(const string& prog);
290578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato    ~Command();
300578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato
310578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato    void AddArg(const string& arg);
320578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato    void AddEnv(const string& name, const string& value);
330578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato
340578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato    const char* GetProg() const;
350578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato    char* const* GetArgv() const;
360578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato    char* const* GetEnv() const;
370578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato
380578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato    string GetCommandline() const;
390578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato
400578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato    string prog;
410578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato    vector<string> args;
420578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato    map<string,string> env;
430578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato};
440578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato
450578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato/**
460578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * Run the command and collect stdout.
470578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * Returns the exit code.
480578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato */
490578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratostring get_command_output(const Command& command, int* err, bool quiet=false);
500578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato
510578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato/**
520578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * Run the command.
530578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * Returns the exit code.
540578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato */
550578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratoint run_command(const Command& command);
560578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato
5731617e3b8ff01bb016446a0d2cb687b25aee42c6Joe Onorato// Mac OS doesn't have execvpe. This is the same as execvpe.
5831617e3b8ff01bb016446a0d2cb687b25aee42c6Joe Onoratoint exec_with_path_search(const char* prog, char const* const* argv, char const* const* envp);
5931617e3b8ff01bb016446a0d2cb687b25aee42c6Joe Onorato
600578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato#endif // COMMAND_H
610578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato
62