/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <fstream> #include <iostream> #include <string> #include <vector> #include <errno.h> #include <time.h> #include <unistd.h> using std::cerr; using std::cout; using std::endl; using std::getline; using std::ifstream; using std::string; using std::vector; namespace { bool ReadLines(const string& input_file_path, vector<string>* lines) { ifstream watched_file(input_file_path); if (!watched_file.is_open()) { cerr << "Unable to open input file: " << input_file_path << endl; return false; } string line; while (getline(watched_file, line)) { lines->push_back(line); } watched_file.close(); return true; } bool HasSentinel(const vector<string>& lines, const string& sentinel) { for (const auto& line : lines) { if (line.find(sentinel) != string::npos) { return true; } } return false; } } // namespace int main(int argc, const char* argv[]) { if (argc != 5) { cerr << "Invalid usage." << endl; cerr << argv[0] << " <timeout in seconds>" << " <input file path>" << " <success sentinel>" << " <failure sentinel>" << endl; return -EINVAL; } const string timeout_as_str = argv[1]; const string input_file_path = argv[2]; const string success_sentinel = argv[3]; const string failure_sentinel = argv[4]; const int timeout_seconds = atoi(timeout_as_str.c_str()); if (timeout_seconds <= 0) { cerr << "Invalid timeout value (in seconds): " << timeout_as_str << endl; return -EINVAL; } int exit_code = 1; const time_t start_time = time(nullptr); vector<string> lines; while (true) { sleep(1); if (time(nullptr) - start_time > timeout_seconds) { cerr << "Timed out waiting for success/failure sentinel." << endl; break; } // Ignore errors when reading lines. The file may not immediately exist // because it takes the Java process some time to create it. lines.clear(); ReadLines(input_file_path, &lines); if (HasSentinel(lines, success_sentinel)) { exit_code = 0; break; } if (HasSentinel(lines, failure_sentinel)) { break; } } cout << "Found output:" << endl; for (const auto& line : lines) { cout << " " << line << endl; } return exit_code; }