1*20733378SAndroid Build Coastguard Worker /* 2*20733378SAndroid Build Coastguard Worker * Copyright (C) 2024 The Android Open Source Project 3*20733378SAndroid Build Coastguard Worker * 4*20733378SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*20733378SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*20733378SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*20733378SAndroid Build Coastguard Worker * 8*20733378SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*20733378SAndroid Build Coastguard Worker * 10*20733378SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*20733378SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*20733378SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*20733378SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*20733378SAndroid Build Coastguard Worker * limitations under the License. 15*20733378SAndroid Build Coastguard Worker */ 16*20733378SAndroid Build Coastguard Worker 17*20733378SAndroid Build Coastguard Worker #pragma once 18*20733378SAndroid Build Coastguard Worker 19*20733378SAndroid Build Coastguard Worker #include <string> 20*20733378SAndroid Build Coastguard Worker #include <sys/stat.h> 21*20733378SAndroid Build Coastguard Worker 22*20733378SAndroid Build Coastguard Worker #include <android-base/result.h> 23*20733378SAndroid Build Coastguard Worker #include <android-base/file.h> 24*20733378SAndroid Build Coastguard Worker 25*20733378SAndroid Build Coastguard Worker #define RETURN_IF_ERROR(RESULT, ERROR) \ 26*20733378SAndroid Build Coastguard Worker if (!RESULT.ok()) {\ 27*20733378SAndroid Build Coastguard Worker return android::base::Error() << ERROR << ": " << RESULT.error();\ 28*20733378SAndroid Build Coastguard Worker } 29*20733378SAndroid Build Coastguard Worker 30*20733378SAndroid Build Coastguard Worker namespace android { 31*20733378SAndroid Build Coastguard Worker namespace aconfigd { 32*20733378SAndroid Build Coastguard Worker 33*20733378SAndroid Build Coastguard Worker /// Remove files in a dir 34*20733378SAndroid Build Coastguard Worker base::Result<void> RemoveFilesInDir(const std::string& dir); 35*20733378SAndroid Build Coastguard Worker 36*20733378SAndroid Build Coastguard Worker /// Copy file 37*20733378SAndroid Build Coastguard Worker base::Result<void> CopyFile(const std::string& src, 38*20733378SAndroid Build Coastguard Worker const std::string& dst, 39*20733378SAndroid Build Coastguard Worker mode_t mode); 40*20733378SAndroid Build Coastguard Worker 41*20733378SAndroid Build Coastguard Worker /// Get a file's timestamp in nano second 42*20733378SAndroid Build Coastguard Worker base::Result<uint64_t> GetFileTimeStamp(const std::string& file); 43*20733378SAndroid Build Coastguard Worker 44*20733378SAndroid Build Coastguard Worker /// Check if file exists 45*20733378SAndroid Build Coastguard Worker bool FileExists(const std::string& file); 46*20733378SAndroid Build Coastguard Worker 47*20733378SAndroid Build Coastguard Worker /// Check if file exists and has non zero size 48*20733378SAndroid Build Coastguard Worker bool FileNonZeroSize(const std::string& file); 49*20733378SAndroid Build Coastguard Worker 50*20733378SAndroid Build Coastguard Worker /// Get file digest 51*20733378SAndroid Build Coastguard Worker base::Result<std::string> GetFilesDigest(const std::vector<std::string>& files); 52*20733378SAndroid Build Coastguard Worker 53*20733378SAndroid Build Coastguard Worker /// Read protobuf from file 54*20733378SAndroid Build Coastguard Worker template <typename T> ReadPbFromFile(const std::string & pb_file)55*20733378SAndroid Build Coastguard Worker base::Result<T> ReadPbFromFile(const std::string& pb_file) { 56*20733378SAndroid Build Coastguard Worker auto pb = T(); 57*20733378SAndroid Build Coastguard Worker if (FileExists(pb_file)) { 58*20733378SAndroid Build Coastguard Worker auto content = std::string(); 59*20733378SAndroid Build Coastguard Worker if (!base::ReadFileToString(pb_file, &content)) { 60*20733378SAndroid Build Coastguard Worker return base::ErrnoError() << "ReadFileToString() failed"; 61*20733378SAndroid Build Coastguard Worker } 62*20733378SAndroid Build Coastguard Worker 63*20733378SAndroid Build Coastguard Worker if (!pb.ParseFromString(content)) { 64*20733378SAndroid Build Coastguard Worker return base::ErrnoError() << "Unable to parse to protobuf"; 65*20733378SAndroid Build Coastguard Worker } 66*20733378SAndroid Build Coastguard Worker } 67*20733378SAndroid Build Coastguard Worker return pb; 68*20733378SAndroid Build Coastguard Worker } 69*20733378SAndroid Build Coastguard Worker 70*20733378SAndroid Build Coastguard Worker /// Write protobuf to file 71*20733378SAndroid Build Coastguard Worker template <typename T> 72*20733378SAndroid Build Coastguard Worker base::Result<void> WritePbToFile(const T& pb, 73*20733378SAndroid Build Coastguard Worker const std::string& file_name, 74*20733378SAndroid Build Coastguard Worker mode_t mode = 0644) { 75*20733378SAndroid Build Coastguard Worker auto content = std::string(); 76*20733378SAndroid Build Coastguard Worker if (!pb.SerializeToString(&content)) { 77*20733378SAndroid Build Coastguard Worker return base::ErrnoError() << "Unable to serialize protobuf to string"; 78*20733378SAndroid Build Coastguard Worker } 79*20733378SAndroid Build Coastguard Worker 80*20733378SAndroid Build Coastguard Worker if (!base::WriteStringToFile(content, file_name)) { 81*20733378SAndroid Build Coastguard Worker return base::ErrnoError() << "WriteStringToFile() failed"; 82*20733378SAndroid Build Coastguard Worker } 83*20733378SAndroid Build Coastguard Worker 84*20733378SAndroid Build Coastguard Worker if (chmod(file_name.c_str(), mode) == -1) { 85*20733378SAndroid Build Coastguard Worker return base::ErrnoError() << "chmod() failed"; 86*20733378SAndroid Build Coastguard Worker }; 87*20733378SAndroid Build Coastguard Worker 88*20733378SAndroid Build Coastguard Worker return {}; 89*20733378SAndroid Build Coastguard Worker } 90*20733378SAndroid Build Coastguard Worker 91*20733378SAndroid Build Coastguard Worker /// convert override type enum to string 92*20733378SAndroid Build Coastguard Worker std::string OverrideTypeToStr(const StorageRequestMessage::FlagOverrideType&); 93*20733378SAndroid Build Coastguard Worker 94*20733378SAndroid Build Coastguard Worker }// namespace aconfig 95*20733378SAndroid Build Coastguard Worker } // namespace android 96