1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*d57664e9SAndroid Build Coastguard Worker * 4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*d57664e9SAndroid Build Coastguard Worker * 8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*d57664e9SAndroid Build Coastguard Worker * 10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*d57664e9SAndroid Build Coastguard Worker * limitations under the License. 15*d57664e9SAndroid Build Coastguard Worker */ 16*d57664e9SAndroid Build Coastguard Worker 17*d57664e9SAndroid Build Coastguard Worker #ifndef UTIL_H 18*d57664e9SAndroid Build Coastguard Worker #define UTIL_H 19*d57664e9SAndroid Build Coastguard Worker 20*d57664e9SAndroid Build Coastguard Worker #include <sys/types.h> 21*d57664e9SAndroid Build Coastguard Worker 22*d57664e9SAndroid Build Coastguard Worker #include <map> 23*d57664e9SAndroid Build Coastguard Worker #include <string> 24*d57664e9SAndroid Build Coastguard Worker #include <vector> 25*d57664e9SAndroid Build Coastguard Worker 26*d57664e9SAndroid Build Coastguard Worker using namespace std; 27*d57664e9SAndroid Build Coastguard Worker 28*d57664e9SAndroid Build Coastguard Worker struct FileInfo 29*d57664e9SAndroid Build Coastguard Worker { 30*d57664e9SAndroid Build Coastguard Worker bool exists; 31*d57664e9SAndroid Build Coastguard Worker time_t mtime; 32*d57664e9SAndroid Build Coastguard Worker time_t ctime; 33*d57664e9SAndroid Build Coastguard Worker off_t size; 34*d57664e9SAndroid Build Coastguard Worker 35*d57664e9SAndroid Build Coastguard Worker FileInfo(); 36*d57664e9SAndroid Build Coastguard Worker FileInfo(const FileInfo& that); 37*d57664e9SAndroid Build Coastguard Worker explicit FileInfo(const string& filename); 38*d57664e9SAndroid Build Coastguard Worker ~FileInfo(); 39*d57664e9SAndroid Build Coastguard Worker 40*d57664e9SAndroid Build Coastguard Worker bool operator==(const FileInfo& that) const; 41*d57664e9SAndroid Build Coastguard Worker bool operator!=(const FileInfo& that) const; 42*d57664e9SAndroid Build Coastguard Worker }; 43*d57664e9SAndroid Build Coastguard Worker 44*d57664e9SAndroid Build Coastguard Worker 45*d57664e9SAndroid Build Coastguard Worker /** 46*d57664e9SAndroid Build Coastguard Worker * Record for a file that we are watching 47*d57664e9SAndroid Build Coastguard Worker */ 48*d57664e9SAndroid Build Coastguard Worker struct TrackedFile { 49*d57664e9SAndroid Build Coastguard Worker string filename; 50*d57664e9SAndroid Build Coastguard Worker FileInfo fileInfo; 51*d57664e9SAndroid Build Coastguard Worker 52*d57664e9SAndroid Build Coastguard Worker TrackedFile(); 53*d57664e9SAndroid Build Coastguard Worker TrackedFile(const TrackedFile& that); 54*d57664e9SAndroid Build Coastguard Worker explicit TrackedFile(const string& filename); 55*d57664e9SAndroid Build Coastguard Worker ~TrackedFile(); 56*d57664e9SAndroid Build Coastguard Worker 57*d57664e9SAndroid Build Coastguard Worker // Returns if the file has changed. If it doesn't currently exist, returns true. 58*d57664e9SAndroid Build Coastguard Worker bool HasChanged() const; 59*d57664e9SAndroid Build Coastguard Worker }; 60*d57664e9SAndroid Build Coastguard Worker 61*d57664e9SAndroid Build Coastguard Worker /** 62*d57664e9SAndroid Build Coastguard Worker * Get FileInfo structures recursively for all the files and symlinks in a directory. 63*d57664e9SAndroid Build Coastguard Worker * Does not traverse symlinks, but it does record them. 64*d57664e9SAndroid Build Coastguard Worker */ 65*d57664e9SAndroid Build Coastguard Worker void get_directory_contents(const string& dir, map<string,FileInfo>* results); 66*d57664e9SAndroid Build Coastguard Worker 67*d57664e9SAndroid Build Coastguard Worker bool directory_contents_differ(const map<string,FileInfo>& before, 68*d57664e9SAndroid Build Coastguard Worker const map<string,FileInfo>& after); 69*d57664e9SAndroid Build Coastguard Worker 70*d57664e9SAndroid Build Coastguard Worker string escape_quotes(const char* str); 71*d57664e9SAndroid Build Coastguard Worker 72*d57664e9SAndroid Build Coastguard Worker string escape_for_commandline(const char* str); 73*d57664e9SAndroid Build Coastguard Worker 74*d57664e9SAndroid Build Coastguard Worker string trim(const string& trim); 75*d57664e9SAndroid Build Coastguard Worker 76*d57664e9SAndroid Build Coastguard Worker bool starts_with(const string& str, const string& prefix); 77*d57664e9SAndroid Build Coastguard Worker 78*d57664e9SAndroid Build Coastguard Worker bool ends_with(const string& str, const string& suffix); 79*d57664e9SAndroid Build Coastguard Worker 80*d57664e9SAndroid Build Coastguard Worker void split_lines(vector<string>* result, const string& str); 81*d57664e9SAndroid Build Coastguard Worker 82*d57664e9SAndroid Build Coastguard Worker string read_file(const string& filename); 83*d57664e9SAndroid Build Coastguard Worker 84*d57664e9SAndroid Build Coastguard Worker bool is_executable(const string& filename); 85*d57664e9SAndroid Build Coastguard Worker 86*d57664e9SAndroid Build Coastguard Worker string dirname(const string& filename); 87*d57664e9SAndroid Build Coastguard Worker string leafname(const string& filename); 88*d57664e9SAndroid Build Coastguard Worker 89*d57664e9SAndroid Build Coastguard Worker #endif // UTIL_H 90*d57664e9SAndroid Build Coastguard Worker 91