mirror of
https://github.com/rwinkhart/sys.git
synced 2026-09-01 06:46:44 -04:00
unix: add ifreq and ifreqData helpers for Linux
ifreq is difficult to use in Go due to the union field in particular. This situation is made worse due to the need to comply with Go's unsafe.Pointer rules. This CL generates the raw ifreq type and also adds an ifreqData type of the same size which is specialized for use with unsafe.Pointer. We also replace the existing ifreqEthtool (which was not padded to the correct size) with the new APIs and add a test to verify that IoctlGetEthtoolDrvinfo functions properly by checking the name of the driver for each network interface. Future uses of ifreq in package unix can expand upon this type with additional getter and setter methods to deal with the unsafe casts to and from the union byte array. We may also consider exporting ifreq and ifreqData if necessary. Change-Id: Ibf73a10e774b4336815c674bb867bbb7ec1b9c71 Reviewed-on: https://go-review.googlesource.com/c/sys/+/340369 Run-TryBot: Matt Layher <mdlayher@gmail.com> Trust: Matt Layher <mdlayher@gmail.com> Reviewed-by: Ian Lance Taylor <iant@golang.org> TryBot-Result: Go Bot <gobot@golang.org>
This commit is contained in:
@@ -13,6 +13,7 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
@@ -26,6 +27,39 @@ import (
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
func TestIoctlGetEthtoolDrvinfo(t *testing.T) {
|
||||
if runtime.GOOS == "android" {
|
||||
t.Skip("ethtool driver info is not available on android, skipping test")
|
||||
}
|
||||
|
||||
s, err := unix.Socket(unix.AF_INET, unix.SOCK_STREAM, 0)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to open socket: %v", err)
|
||||
}
|
||||
defer unix.Close(s)
|
||||
|
||||
ifis, err := net.Interfaces()
|
||||
if err != nil {
|
||||
t.Fatalf("failed to get network interfaces: %v", err)
|
||||
}
|
||||
|
||||
// Print the interface name and associated driver information for each
|
||||
// network interface supported by ethtool.
|
||||
for _, ifi := range ifis {
|
||||
drv, err := unix.IoctlGetEthtoolDrvinfo(s, ifi.Name)
|
||||
if err != nil {
|
||||
if err == unix.EOPNOTSUPP {
|
||||
continue
|
||||
}
|
||||
|
||||
t.Fatalf("failed to get ethtool driver info for %q: %v", ifi.Name, err)
|
||||
}
|
||||
|
||||
// Trim trailing NULLs.
|
||||
t.Logf("%s: %q", ifi.Name, string(bytes.TrimRight(drv.Driver[:], "\x00")))
|
||||
}
|
||||
}
|
||||
|
||||
func TestIoctlGetInt(t *testing.T) {
|
||||
f, err := os.Open("/dev/random")
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user