70 lines
1.2 KiB
Go
70 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
PathProcPCI = iota
|
|
PathProcUSB
|
|
)
|
|
|
|
func (i *iface) ProcLoc() (err error) {
|
|
spath := strings.Join([]string{i.netpath, "device"}, "/")
|
|
|
|
var real string
|
|
if real, err = filepath.EvalSymlinks(spath); err != nil {
|
|
if errors.Is(err, os.ErrNotExist) {
|
|
err = fmt.Errorf("Interface %s isn't a hardware device", i.names[IfNameKern])
|
|
return
|
|
}
|
|
err = fmt.Errorf("Failed to resolve symlink to device: %w", err)
|
|
return
|
|
}
|
|
|
|
var devpath string
|
|
var ok bool
|
|
|
|
sysdev := strings.Join([]string{SYSFS, "devices/"}, "/")
|
|
if devpath, ok = strings.CutPrefix(real, sysdev); !ok {
|
|
err = fmt.Errorf("Symlink doesn't point to %s\n", sysdev)
|
|
return
|
|
}
|
|
|
|
var (
|
|
pci, usb string
|
|
procmode int
|
|
)
|
|
for _, v := range strings.Split(devpath, "/") {
|
|
if strings.HasPrefix(v, "pci") {
|
|
procmode = PathProcPCI
|
|
continue
|
|
} else if strings.HasPrefix(v, "usb") {
|
|
procmode = PathProcUSB
|
|
continue
|
|
}
|
|
|
|
switch procmode {
|
|
case PathProcPCI:
|
|
{
|
|
if pci, err = i.ProcPCI(v); err != nil {
|
|
continue
|
|
}
|
|
}
|
|
case PathProcUSB:
|
|
{
|
|
if usb, err = i.ProcUSB(v); err != nil {
|
|
continue
|
|
}
|
|
}
|
|
}
|
|
}
|
|
i.names[IfNameLoc] = strings.Join([]string{i.pfx, pci, usb}, "")
|
|
|
|
return
|
|
}
|