aboutsummaryrefslogtreecommitdiff
path: root/tools/numap/internal/hwids/hwids.go
diff options
context:
space:
mode:
authorFranck Cuny <franck@fcuny.net>2024-03-06 06:29:24 -0800
committerFranck Cuny <franck@fcuny.net>2024-03-06 06:29:24 -0800
commit1e4a5aa09c1c8f43722c9c260f011398799a8e8f (patch)
treecd73e0fb8ba53bd21cee6ccf2dcc85639bbbb93f /tools/numap/internal/hwids/hwids.go
parentset correct git email in the profiles (diff)
downloadinfra-1e4a5aa09c1c8f43722c9c260f011398799a8e8f.tar.gz
rename `tools` to `packages` to follow convention
The convention is to use `pkgs` or `packages` for overlays and definition of custom packages. Since I'm already using `pkg` for go, I prefer to use `packages` for my scripts.
Diffstat (limited to 'tools/numap/internal/hwids/hwids.go')
-rw-r--r--tools/numap/internal/hwids/hwids.go148
1 files changed, 0 insertions, 148 deletions
diff --git a/tools/numap/internal/hwids/hwids.go b/tools/numap/internal/hwids/hwids.go
deleted file mode 100644
index 6aa9d8a..0000000
--- a/tools/numap/internal/hwids/hwids.go
+++ /dev/null
@@ -1,148 +0,0 @@
-package hwids
-
-import (
- "bufio"
- "fmt"
- "os"
- "strings"
-)
-
-var pciPath = []string{
- "/usr/share/hwdata/pci.ids",
- "/usr/share/misc/pci.ids",
-}
-
-type PCIType int
-
-const (
- PCIVendor PCIType = iota
- PCIDevice
- PCISubsystem
-)
-
-type PciDevices map[uint16][]PciDevice
-
-// PciDevice represents a PCI device
-type PciDevice struct {
- Type PCIType
- Vendor, Device uint16
- SubVendor, SubDevice uint16
- VendorName, DeviceName string
- SubName string
-}
-
-// Load load the hardware database for PCI devices and return a map of
-// vendor -> list of devices.
-func Load() (PciDevices, error) {
- // if the environment variable HWDATAPATH is set, we add it to the
- // list of paths we check for the hardware database.
- extraPath := os.Getenv("HWDATA")
- if extraPath != "" {
- pciPath = append(pciPath, extraPath)
- }
-
- for _, f := range pciPath {
- fh, err := os.Open(f)
- if err != nil {
- continue
- }
- defer fh.Close()
- return parse(fh)
- }
- return PciDevices{}, fmt.Errorf("hwids: could not find a pci.ids file")
-}
-
-func parse(f *os.File) (PciDevices, error) {
- devices := make(PciDevices)
-
- s := bufio.NewScanner(f)
-
- // this is to keep track of the current device. The format of the
- // file is as follow:
- // vendor vendor_name
- // device device_name <-- single tab
- // subvendor subdevice subsystem_name <-- two tabs
- // the variable is to keep track of the current vendor / device
- cur := PciDevice{}
-
- for s.Scan() {
- l := s.Text()
- // skip empty lines or lines that are a comment
- if len(l) == 0 || l[0] == '#' {
- continue
- }
- // lines starting with a C are the classes definitions, and
- // they are at the end of the file, which means we're done
- // parsing the devices
- if l[0] == 'C' {
- break
- }
-
- parts := strings.SplitN(l, " ", 2)
- if len(parts) != 2 {
- return devices, fmt.Errorf("hwids: malformed PCI ID line (missing ID separator): %s", l)
- }
-
- ids, name := parts[0], parts[1]
- if len(ids) < 2 || len(name) == 0 {
- return devices, fmt.Errorf("hwids: malformed PCI ID line (empty ID or name): %s", l)
- }
-
- cur.Type = PCIVendor
-
- if ids[0] == '\t' {
- if ids[1] == '\t' {
- cur.Type = PCISubsystem
- } else {
- cur.Type = PCIDevice
- }
- }
-
- var err error
- switch cur.Type {
- case PCIVendor:
- _, err = fmt.Sscanf(ids, "%x", &cur.Vendor)
- cur.VendorName = name
- case PCIDevice:
- _, err = fmt.Sscanf(ids, "%x", &cur.Device)
- cur.DeviceName = name
- case PCISubsystem:
- _, err = fmt.Sscanf(ids, "%x %x", &cur.SubVendor, &cur.SubDevice)
- cur.SubName = name
- }
-
- if err != nil {
- return devices, fmt.Errorf("hwids: malformed PCI ID line: %s: %v", l, err)
- }
-
- // This is to reset the state when we are moving to a
- // different vendor or device
- switch cur.Type {
- case PCIVendor:
- cur.Device = 0
- cur.DeviceName = ""
- fallthrough
- case PCIDevice:
- cur.SubVendor = 0
- cur.SubDevice = 0
- cur.SubName = ""
- }
-
- _, ok := devices[cur.Vendor]
- if ok {
- _devices := devices[cur.Vendor]
- _devices = append(_devices, cur)
- devices[cur.Vendor] = _devices
-
- } else {
- _devices := []PciDevice{cur}
- devices[cur.Vendor] = _devices
- }
- }
-
- if err := s.Err(); err != nil {
- return devices, fmt.Errorf("hwids: failed to read PCI ID line: %v", err)
- }
-
- return devices, nil
-}