package util
import (
"bufio"
"compress/gzip"
"fmt"
"os"
"regexp"
"strings"
)
const (
BOOT_CONFIG_PATH = "/proc/config.gz"
CONFIG_DEBUG_INFO_BTF = "CONFIG_DEBUG_INFO_BTF"
SYS_KERNEL_BTF_VMLINUX = "/sys/kernel/btf/vmlinux"
)
var (
locations = []string{
"/sys/kernel/btf/vmlinux",
}
)
func GetSystemConfig() (map[string]string, error) {
return getAndroidConfig(BOOT_CONFIG_PATH)
}
func getAndroidConfig(filename string) (map[string]string, error) {
var KernelConfig = make(map[string]string)
f, err := os.Open(filename)
if err != nil {
return KernelConfig, err
}
defer f.Close()
var magic []byte
var i int
magic = make([]byte, 2)
i, err = f.Read(magic)
if err != nil {
return KernelConfig, err
}
if i != 2 {
return KernelConfig, fmt.Errorf("read %d bytes, expected 2", i)
}
var s *bufio.Scanner
_, err = f.Seek(0, 0)
if err != nil {
return KernelConfig, err
}
var reader *gzip.Reader
if magic[0] == 0x1f && magic[1] == 0x8b {
reader, err = gzip.NewReader(f)
if err != nil {
return KernelConfig, err
}
s = bufio.NewScanner(reader)
} else {
s = bufio.NewScanner(f)
}
if err = parse(s, KernelConfig); err != nil {
return KernelConfig, err
}
return KernelConfig, nil
}
func IsContainer() (bool, error) {
return false, nil
}
func parse(s *bufio.Scanner, p map[string]string) error {
r, _ := regexp.Compile("^(?:# *)?(CONFIG_\\w*)(?:=| )(y|n|m|is not set|\\d+|0x.+|\".*\")$")
for s.Scan() {
t := s.Text()
if t == "" {
continue
}
m := r.FindStringSubmatch(t)
if m == nil {
continue
}
if len(m) != 3 {
return fmt.Errorf("match is not 3 chars long: %v", m)
}
if len(m[2]) > 1 {
m[2] = strings.Trim(m[2], "\"")
}
p[m[1]] = m[2]
}
if err := s.Err(); err != nil {
return err
}
return nil
}