| // Copyright 2023 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package sysinfo |
| |
| import ( |
| "bufio" |
| "bytes" |
| "io" |
| "os" |
| "strings" |
| ) |
| |
| func readLinuxProcCPUInfo(buf []byte) error { |
| f, err := os.Open("/proc/cpuinfo") |
| if err != nil { |
| return err |
| } |
| defer f.Close() |
| |
| _, err = io.ReadFull(f, buf) |
| if err != nil && err != io.ErrUnexpectedEOF { |
| return err |
| } |
| |
| return nil |
| } |
| |
| func osCpuInfoName() string { |
| modelName := "" |
| cpuMHz := "" |
| |
| // The 512-byte buffer is enough to hold the contents of CPU0 |
| buf := make([]byte, 512) |
| err := readLinuxProcCPUInfo(buf) |
| if err != nil { |
| return "" |
| } |
| |
| scanner := bufio.NewScanner(bytes.NewReader(buf)) |
| for scanner.Scan() { |
| line := scanner.Text() |
| if !strings.Contains(line, ":") { |
| continue |
| } |
| |
| field := strings.SplitN(line, ": ", 2) |
| switch strings.TrimSpace(field[0]) { |
| case "Model Name", "model name": |
| modelName = field[1] |
| case "CPU MHz", "cpu MHz": |
| cpuMHz = field[1] |
| } |
| } |
| |
| if modelName == "" { |
| return "" |
| } |
| |
| if cpuMHz == "" { |
| return modelName |
| } |
| |
| // The modelName field already contains the frequency information, |
| // so the cpuMHz field information is not needed. |
| // modelName filed example: |
| // Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz |
| f := [...]string{"GHz", "MHz"} |
| for _, v := range f { |
| if strings.Contains(modelName, v) { |
| return modelName |
| } |
| } |
| |
| return modelName + " @ " + cpuMHz + "MHz" |
| } |