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