xref: /aosp_15_r20/system/libvintf/KernelConfigs.cpp (revision 70a7ec852fcefd15a4fb57f8f183a8b1c3aacb08)
1*70a7ec85SAndroid Build Coastguard Worker /*
2*70a7ec85SAndroid Build Coastguard Worker  * Copyright (C) 2023 The Android Open Source Project
3*70a7ec85SAndroid Build Coastguard Worker  *
4*70a7ec85SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*70a7ec85SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*70a7ec85SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*70a7ec85SAndroid Build Coastguard Worker  *
8*70a7ec85SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*70a7ec85SAndroid Build Coastguard Worker  *
10*70a7ec85SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*70a7ec85SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*70a7ec85SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*70a7ec85SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*70a7ec85SAndroid Build Coastguard Worker  * limitations under the License.
15*70a7ec85SAndroid Build Coastguard Worker  */
16*70a7ec85SAndroid Build Coastguard Worker 
17*70a7ec85SAndroid Build Coastguard Worker #include "KernelConfigs.h"
18*70a7ec85SAndroid Build Coastguard Worker 
19*70a7ec85SAndroid Build Coastguard Worker #include <android-base/logging.h>
20*70a7ec85SAndroid Build Coastguard Worker 
21*70a7ec85SAndroid Build Coastguard Worker #include <map>
22*70a7ec85SAndroid Build Coastguard Worker #include <string>
23*70a7ec85SAndroid Build Coastguard Worker 
24*70a7ec85SAndroid Build Coastguard Worker #include <zlib.h>
25*70a7ec85SAndroid Build Coastguard Worker #include "vintf/KernelConfigParser.h"
26*70a7ec85SAndroid Build Coastguard Worker 
27*70a7ec85SAndroid Build Coastguard Worker #define BUFFER_SIZE sysconf(_SC_PAGESIZE)
28*70a7ec85SAndroid Build Coastguard Worker 
29*70a7ec85SAndroid Build Coastguard Worker namespace android {
30*70a7ec85SAndroid Build Coastguard Worker namespace kernelconfigs {
31*70a7ec85SAndroid Build Coastguard Worker 
LoadKernelConfigs(std::map<std::string,std::string> * configs)32*70a7ec85SAndroid Build Coastguard Worker status_t LoadKernelConfigs(std::map<std::string, std::string>* configs) {
33*70a7ec85SAndroid Build Coastguard Worker     vintf::KernelConfigParser parser;
34*70a7ec85SAndroid Build Coastguard Worker     gzFile f = gzopen("/proc/config.gz", "rb");
35*70a7ec85SAndroid Build Coastguard Worker     if (f == NULL) {
36*70a7ec85SAndroid Build Coastguard Worker         LOG(ERROR) << "Could not open /proc/config.gz: " << errno;
37*70a7ec85SAndroid Build Coastguard Worker         return -errno;
38*70a7ec85SAndroid Build Coastguard Worker     }
39*70a7ec85SAndroid Build Coastguard Worker 
40*70a7ec85SAndroid Build Coastguard Worker     char buf[BUFFER_SIZE];
41*70a7ec85SAndroid Build Coastguard Worker     int len;
42*70a7ec85SAndroid Build Coastguard Worker     while ((len = gzread(f, buf, sizeof buf)) > 0) {
43*70a7ec85SAndroid Build Coastguard Worker         parser.process(buf, len);
44*70a7ec85SAndroid Build Coastguard Worker     }
45*70a7ec85SAndroid Build Coastguard Worker     status_t err = OK;
46*70a7ec85SAndroid Build Coastguard Worker     if (len < 0) {
47*70a7ec85SAndroid Build Coastguard Worker         int errnum;
48*70a7ec85SAndroid Build Coastguard Worker         const char* errmsg = gzerror(f, &errnum);
49*70a7ec85SAndroid Build Coastguard Worker         LOG(ERROR) << "Could not read /proc/config.gz: " << errmsg;
50*70a7ec85SAndroid Build Coastguard Worker         err = (errnum == Z_ERRNO ? -errno : errnum);
51*70a7ec85SAndroid Build Coastguard Worker     }
52*70a7ec85SAndroid Build Coastguard Worker     parser.finish();
53*70a7ec85SAndroid Build Coastguard Worker     gzclose(f);
54*70a7ec85SAndroid Build Coastguard Worker     *configs = std::move(parser.configs());
55*70a7ec85SAndroid Build Coastguard Worker     return err;
56*70a7ec85SAndroid Build Coastguard Worker }
57*70a7ec85SAndroid Build Coastguard Worker 
58*70a7ec85SAndroid Build Coastguard Worker }  // namespace kernelconfigs
59*70a7ec85SAndroid Build Coastguard Worker }  // namespace android
60