xref: /aosp_15_r20/system/server_configurable_flags/aconfigd/aconfigd_util.h (revision 207333786ba243bc7d4d69ef6b05487aa7071806)
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