From 6f8348627aad09edda3e4ad5f9174f334bc27cd8 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Mon, 4 Jan 2021 12:22:21 -0800 Subject: [PATCH 01/18] unix: fix darwin pipe implementation The raw syscall returned the two pipes whereas the libc call takes a pointer to a location to write the two pipes. When we switched over from raw syscalls to libc calls, this change in behavior was missed. Fixes golang/go#43498 Change-Id: Icee2204dcb8be8fc94be0df106e1ff061cafa446 Reviewed-on: https://go-review.googlesource.com/c/sys/+/281432 Trust: Keith Randall Run-TryBot: Keith Randall TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor --- unix/syscall_darwin.go | 7 +++++-- unix/syscall_unix_test.go | 36 +++++++++++++++++++++++++++++++++++ unix/zsyscall_darwin_386.go | 6 ++---- unix/zsyscall_darwin_amd64.go | 6 ++---- unix/zsyscall_darwin_arm.go | 6 ++---- unix/zsyscall_darwin_arm64.go | 6 ++---- 6 files changed, 49 insertions(+), 18 deletions(-) diff --git a/unix/syscall_darwin.go b/unix/syscall_darwin.go index b6257389..16f9c226 100644 --- a/unix/syscall_darwin.go +++ b/unix/syscall_darwin.go @@ -119,13 +119,16 @@ type attrList struct { Forkattr uint32 } -//sysnb pipe() (r int, w int, err error) +//sysnb pipe(p *[2]int32) (err error) func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } - p[0], p[1], err = pipe() + var x [2]int32 + err = pipe(&x) + p[0] = int(x[0]) + p[1] = int(x[1]) return } diff --git a/unix/syscall_unix_test.go b/unix/syscall_unix_test.go index 473e7908..41de3b84 100644 --- a/unix/syscall_unix_test.go +++ b/unix/syscall_unix_test.go @@ -896,3 +896,39 @@ func chtmpdir(t *testing.T) func() { os.RemoveAll(d) } } + +func TestPipe(t *testing.T) { + const s = "hello" + var pipes [2]int + unix.Pipe(pipes[:]) + r := pipes[0] + w := pipes[1] + go func() { + n, err := unix.Write(w, []byte(s)) + if err != nil { + t.Fatalf("bad write: %s\n", err) + } + if n != len(s) { + t.Fatalf("bad write count: %d\n", n) + } + err = unix.Close(w) + if err != nil { + t.Fatalf("bad close: %s\n", err) + } + }() + var buf [10 + len(s)]byte + n, err := unix.Read(r, buf[:]) + if err != nil { + t.Fatalf("bad read: %s\n", err) + } + if n != len(s) { + t.Fatalf("bad read count: %d\n", n) + } + if string(buf[:n]) != s { + t.Fatalf("bad contents: %s\n", string(buf[:n])) + } + err = unix.Close(r) + if err != nil { + t.Fatalf("bad close: %s\n", err) + } +} diff --git a/unix/zsyscall_darwin_386.go b/unix/zsyscall_darwin_386.go index 36ab7eab..38771834 100644 --- a/unix/zsyscall_darwin_386.go +++ b/unix/zsyscall_darwin_386.go @@ -462,10 +462,8 @@ func libc_munlockall_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe() (r int, w int, err error) { - r0, r1, e1 := syscall_rawSyscall(funcPC(libc_pipe_trampoline), 0, 0, 0) - r = int(r0) - w = int(r1) +func pipe(p *[2]int32) (err error) { + _, _, e1 := syscall_rawSyscall(funcPC(libc_pipe_trampoline), uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { err = errnoErr(e1) } diff --git a/unix/zsyscall_darwin_amd64.go b/unix/zsyscall_darwin_amd64.go index 7b854cc2..508e5639 100644 --- a/unix/zsyscall_darwin_amd64.go +++ b/unix/zsyscall_darwin_amd64.go @@ -462,10 +462,8 @@ func libc_munlockall_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe() (r int, w int, err error) { - r0, r1, e1 := syscall_rawSyscall(funcPC(libc_pipe_trampoline), 0, 0, 0) - r = int(r0) - w = int(r1) +func pipe(p *[2]int32) (err error) { + _, _, e1 := syscall_rawSyscall(funcPC(libc_pipe_trampoline), uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { err = errnoErr(e1) } diff --git a/unix/zsyscall_darwin_arm.go b/unix/zsyscall_darwin_arm.go index 8e79ad37..c0c771f4 100644 --- a/unix/zsyscall_darwin_arm.go +++ b/unix/zsyscall_darwin_arm.go @@ -462,10 +462,8 @@ func libc_munlockall_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe() (r int, w int, err error) { - r0, r1, e1 := syscall_rawSyscall(funcPC(libc_pipe_trampoline), 0, 0, 0) - r = int(r0) - w = int(r1) +func pipe(p *[2]int32) (err error) { + _, _, e1 := syscall_rawSyscall(funcPC(libc_pipe_trampoline), uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { err = errnoErr(e1) } diff --git a/unix/zsyscall_darwin_arm64.go b/unix/zsyscall_darwin_arm64.go index 99509b12..9b01a79c 100644 --- a/unix/zsyscall_darwin_arm64.go +++ b/unix/zsyscall_darwin_arm64.go @@ -462,10 +462,8 @@ func libc_munlockall_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe() (r int, w int, err error) { - r0, r1, e1 := syscall_rawSyscall(funcPC(libc_pipe_trampoline), 0, 0, 0) - r = int(r0) - w = int(r1) +func pipe(p *[2]int32) (err error) { + _, _, e1 := syscall_rawSyscall(funcPC(libc_pipe_trampoline), uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { err = errnoErr(e1) } From 16f7687f5001b816ff9f6b586071238941e88a9d Mon Sep 17 00:00:00 2001 From: Artyom Pervukhin Date: Tue, 5 Jan 2021 16:42:53 +0300 Subject: [PATCH 02/18] unix: don't call testing.T.Fatalf in a background goroutine > Those methods [...] must be called only from the goroutine running the > Test function. For golang/go#43498 Change-Id: I847067936ade613a21b059c90219bd285425f0aa Reviewed-on: https://go-review.googlesource.com/c/sys/+/280622 Reviewed-by: Keith Randall Run-TryBot: Keith Randall TryBot-Result: Go Bot Trust: Ian Lance Taylor --- unix/syscall_unix_test.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/unix/syscall_unix_test.go b/unix/syscall_unix_test.go index 41de3b84..e9cc5b1c 100644 --- a/unix/syscall_unix_test.go +++ b/unix/syscall_unix_test.go @@ -906,14 +906,17 @@ func TestPipe(t *testing.T) { go func() { n, err := unix.Write(w, []byte(s)) if err != nil { - t.Fatalf("bad write: %s\n", err) + t.Errorf("bad write: %s\n", err) + return } if n != len(s) { - t.Fatalf("bad write count: %d\n", n) + t.Errorf("bad write count: %d\n", n) + return } err = unix.Close(w) if err != nil { - t.Fatalf("bad close: %s\n", err) + t.Errorf("bad close: %s\n", err) + return } }() var buf [10 + len(s)]byte From 0df2131ae363d24eb52316e51d47503aee0642e6 Mon Sep 17 00:00:00 2001 From: Alex Brainman Date: Wed, 6 Jan 2021 18:08:16 +1100 Subject: [PATCH 03/18] windows: add GetShellWindow and GetWindowThreadProcessId I am trying to implement https://devblogs.microsoft.com/oldnewthing/20190425-00/?p=102443 so I need these functions. Change-Id: Id5082e4cc450569ffd021f4a300d56de325e4952 Reviewed-on: https://go-review.googlesource.com/c/sys/+/280717 Trust: Alex Brainman Trust: Brad Fitzpatrick Run-TryBot: Alex Brainman TryBot-Result: Go Bot Reviewed-by: Brad Fitzpatrick --- windows/syscall_windows.go | 2 ++ windows/zsyscall_windows.go | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/windows/syscall_windows.go b/windows/syscall_windows.go index 8ad1cae8..38344590 100644 --- a/windows/syscall_windows.go +++ b/windows/syscall_windows.go @@ -213,6 +213,8 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys CancelIoEx(s Handle, o *Overlapped) (err error) //sys CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW //sys OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) (handle Handle, err error) +//sys GetWindowThreadProcessId(wnd uintptr, pid *uint32) (tid uint32) = user32.GetWindowThreadProcessId +//sys GetShellWindow() (desktopWindow uintptr) = user32.GetShellWindow //sys ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int32) (err error) [failretval<=32] = shell32.ShellExecuteW //sys shGetKnownFolderPath(id *KNOWNFOLDERID, flags uint32, token Token, path **uint16) (ret error) = shell32.SHGetKnownFolderPath //sys TerminateProcess(handle Handle, exitcode uint32) (err error) diff --git a/windows/zsyscall_windows.go b/windows/zsyscall_windows.go index 5ad0b9bf..06273735 100644 --- a/windows/zsyscall_windows.go +++ b/windows/zsyscall_windows.go @@ -341,6 +341,8 @@ var ( procSHGetKnownFolderPath = modshell32.NewProc("SHGetKnownFolderPath") procShellExecuteW = modshell32.NewProc("ShellExecuteW") procExitWindowsEx = moduser32.NewProc("ExitWindowsEx") + procGetShellWindow = moduser32.NewProc("GetShellWindow") + procGetWindowThreadProcessId = moduser32.NewProc("GetWindowThreadProcessId") procMessageBoxW = moduser32.NewProc("MessageBoxW") procCreateEnvironmentBlock = moduserenv.NewProc("CreateEnvironmentBlock") procDestroyEnvironmentBlock = moduserenv.NewProc("DestroyEnvironmentBlock") @@ -2896,6 +2898,18 @@ func ExitWindowsEx(flags uint32, reason uint32) (err error) { return } +func GetShellWindow() (desktopWindow uintptr) { + r0, _, _ := syscall.Syscall(procGetShellWindow.Addr(), 0, 0, 0, 0) + desktopWindow = uintptr(r0) + return +} + +func GetWindowThreadProcessId(wnd uintptr, pid *uint32) (tid uint32) { + r0, _, _ := syscall.Syscall(procGetWindowThreadProcessId.Addr(), 2, uintptr(wnd), uintptr(unsafe.Pointer(pid)), 0) + tid = uint32(r0) + return +} + func MessageBox(hwnd Handle, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) { r0, _, e1 := syscall.Syscall6(procMessageBoxW.Addr(), 4, uintptr(hwnd), uintptr(unsafe.Pointer(text)), uintptr(unsafe.Pointer(caption)), uintptr(boxtype), 0, 0) ret = int32(r0) From 789bb1bd4061037aab923f91266e7b94b91f0eb5 Mon Sep 17 00:00:00 2001 From: Matt Layher Date: Sat, 9 Jan 2021 15:58:26 -0500 Subject: [PATCH 04/18] unix: add ethtool generic netlink constants for Linux For more information about this interface, see: https://www.kernel.org/doc/html/latest/networking/ethtool-netlink.html. Change-Id: I4fe37e7dce3c52d72286bee047de2b49fe559b13 Reviewed-on: https://go-review.googlesource.com/c/sys/+/282812 Run-TryBot: Matt Layher TryBot-Result: Go Bot Reviewed-by: Tobias Klauser Trust: Tobias Klauser Trust: Matt Layher --- unix/linux/types.go | 314 ++++++++++++++++++++++++++++++++++++++++++ unix/mkerrors.sh | 2 + unix/zerrors_linux.go | 119 ++++++++++++++++ unix/ztypes_linux.go | 308 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 743 insertions(+) diff --git a/unix/linux/types.go b/unix/linux/types.go index 9a51b206..b5aad83c 100644 --- a/unix/linux/types.go +++ b/unix/linux/types.go @@ -88,6 +88,7 @@ struct termios2 { #include #include #include +#include #include #include #include @@ -3166,3 +3167,316 @@ const ( MPLS_IPTUNNEL_TTL = C.MPLS_IPTUNNEL_TTL MPLS_IPTUNNEL_MAX = C.MPLS_IPTUNNEL_MAX ) + +// ethtool netlink interface, generated using: +// perl -nlE '/^\s*(ETHTOOL_\w+)/ && say "$1 = C.$1"' ethtool_netlink.h +// +// Note that a couple of constants produced by this command will be duplicated +// by mkerrors.sh, so some manual pruning was necessary. +const ( + ETHTOOL_MSG_USER_NONE = C.ETHTOOL_MSG_USER_NONE + ETHTOOL_MSG_STRSET_GET = C.ETHTOOL_MSG_STRSET_GET + ETHTOOL_MSG_LINKINFO_GET = C.ETHTOOL_MSG_LINKINFO_GET + ETHTOOL_MSG_LINKINFO_SET = C.ETHTOOL_MSG_LINKINFO_SET + ETHTOOL_MSG_LINKMODES_GET = C.ETHTOOL_MSG_LINKMODES_GET + ETHTOOL_MSG_LINKMODES_SET = C.ETHTOOL_MSG_LINKMODES_SET + ETHTOOL_MSG_LINKSTATE_GET = C.ETHTOOL_MSG_LINKSTATE_GET + ETHTOOL_MSG_DEBUG_GET = C.ETHTOOL_MSG_DEBUG_GET + ETHTOOL_MSG_DEBUG_SET = C.ETHTOOL_MSG_DEBUG_SET + ETHTOOL_MSG_WOL_GET = C.ETHTOOL_MSG_WOL_GET + ETHTOOL_MSG_WOL_SET = C.ETHTOOL_MSG_WOL_SET + ETHTOOL_MSG_FEATURES_GET = C.ETHTOOL_MSG_FEATURES_GET + ETHTOOL_MSG_FEATURES_SET = C.ETHTOOL_MSG_FEATURES_SET + ETHTOOL_MSG_PRIVFLAGS_GET = C.ETHTOOL_MSG_PRIVFLAGS_GET + ETHTOOL_MSG_PRIVFLAGS_SET = C.ETHTOOL_MSG_PRIVFLAGS_SET + ETHTOOL_MSG_RINGS_GET = C.ETHTOOL_MSG_RINGS_GET + ETHTOOL_MSG_RINGS_SET = C.ETHTOOL_MSG_RINGS_SET + ETHTOOL_MSG_CHANNELS_GET = C.ETHTOOL_MSG_CHANNELS_GET + ETHTOOL_MSG_CHANNELS_SET = C.ETHTOOL_MSG_CHANNELS_SET + ETHTOOL_MSG_COALESCE_GET = C.ETHTOOL_MSG_COALESCE_GET + ETHTOOL_MSG_COALESCE_SET = C.ETHTOOL_MSG_COALESCE_SET + ETHTOOL_MSG_PAUSE_GET = C.ETHTOOL_MSG_PAUSE_GET + ETHTOOL_MSG_PAUSE_SET = C.ETHTOOL_MSG_PAUSE_SET + ETHTOOL_MSG_EEE_GET = C.ETHTOOL_MSG_EEE_GET + ETHTOOL_MSG_EEE_SET = C.ETHTOOL_MSG_EEE_SET + ETHTOOL_MSG_TSINFO_GET = C.ETHTOOL_MSG_TSINFO_GET + ETHTOOL_MSG_CABLE_TEST_ACT = C.ETHTOOL_MSG_CABLE_TEST_ACT + ETHTOOL_MSG_CABLE_TEST_TDR_ACT = C.ETHTOOL_MSG_CABLE_TEST_TDR_ACT + ETHTOOL_MSG_TUNNEL_INFO_GET = C.ETHTOOL_MSG_TUNNEL_INFO_GET + ETHTOOL_MSG_USER_MAX = C.ETHTOOL_MSG_USER_MAX + ETHTOOL_MSG_KERNEL_NONE = C.ETHTOOL_MSG_KERNEL_NONE + ETHTOOL_MSG_STRSET_GET_REPLY = C.ETHTOOL_MSG_STRSET_GET_REPLY + ETHTOOL_MSG_LINKINFO_GET_REPLY = C.ETHTOOL_MSG_LINKINFO_GET_REPLY + ETHTOOL_MSG_LINKINFO_NTF = C.ETHTOOL_MSG_LINKINFO_NTF + ETHTOOL_MSG_LINKMODES_GET_REPLY = C.ETHTOOL_MSG_LINKMODES_GET_REPLY + ETHTOOL_MSG_LINKMODES_NTF = C.ETHTOOL_MSG_LINKMODES_NTF + ETHTOOL_MSG_LINKSTATE_GET_REPLY = C.ETHTOOL_MSG_LINKSTATE_GET_REPLY + ETHTOOL_MSG_DEBUG_GET_REPLY = C.ETHTOOL_MSG_DEBUG_GET_REPLY + ETHTOOL_MSG_DEBUG_NTF = C.ETHTOOL_MSG_DEBUG_NTF + ETHTOOL_MSG_WOL_GET_REPLY = C.ETHTOOL_MSG_WOL_GET_REPLY + ETHTOOL_MSG_WOL_NTF = C.ETHTOOL_MSG_WOL_NTF + ETHTOOL_MSG_FEATURES_GET_REPLY = C.ETHTOOL_MSG_FEATURES_GET_REPLY + ETHTOOL_MSG_FEATURES_SET_REPLY = C.ETHTOOL_MSG_FEATURES_SET_REPLY + ETHTOOL_MSG_FEATURES_NTF = C.ETHTOOL_MSG_FEATURES_NTF + ETHTOOL_MSG_PRIVFLAGS_GET_REPLY = C.ETHTOOL_MSG_PRIVFLAGS_GET_REPLY + ETHTOOL_MSG_PRIVFLAGS_NTF = C.ETHTOOL_MSG_PRIVFLAGS_NTF + ETHTOOL_MSG_RINGS_GET_REPLY = C.ETHTOOL_MSG_RINGS_GET_REPLY + ETHTOOL_MSG_RINGS_NTF = C.ETHTOOL_MSG_RINGS_NTF + ETHTOOL_MSG_CHANNELS_GET_REPLY = C.ETHTOOL_MSG_CHANNELS_GET_REPLY + ETHTOOL_MSG_CHANNELS_NTF = C.ETHTOOL_MSG_CHANNELS_NTF + ETHTOOL_MSG_COALESCE_GET_REPLY = C.ETHTOOL_MSG_COALESCE_GET_REPLY + ETHTOOL_MSG_COALESCE_NTF = C.ETHTOOL_MSG_COALESCE_NTF + ETHTOOL_MSG_PAUSE_GET_REPLY = C.ETHTOOL_MSG_PAUSE_GET_REPLY + ETHTOOL_MSG_PAUSE_NTF = C.ETHTOOL_MSG_PAUSE_NTF + ETHTOOL_MSG_EEE_GET_REPLY = C.ETHTOOL_MSG_EEE_GET_REPLY + ETHTOOL_MSG_EEE_NTF = C.ETHTOOL_MSG_EEE_NTF + ETHTOOL_MSG_TSINFO_GET_REPLY = C.ETHTOOL_MSG_TSINFO_GET_REPLY + ETHTOOL_MSG_CABLE_TEST_NTF = C.ETHTOOL_MSG_CABLE_TEST_NTF + ETHTOOL_MSG_CABLE_TEST_TDR_NTF = C.ETHTOOL_MSG_CABLE_TEST_TDR_NTF + ETHTOOL_MSG_TUNNEL_INFO_GET_REPLY = C.ETHTOOL_MSG_TUNNEL_INFO_GET_REPLY + ETHTOOL_MSG_KERNEL_MAX = C.ETHTOOL_MSG_KERNEL_MAX + ETHTOOL_A_HEADER_UNSPEC = C.ETHTOOL_A_HEADER_UNSPEC + ETHTOOL_A_HEADER_DEV_INDEX = C.ETHTOOL_A_HEADER_DEV_INDEX + ETHTOOL_A_HEADER_DEV_NAME = C.ETHTOOL_A_HEADER_DEV_NAME + ETHTOOL_A_HEADER_FLAGS = C.ETHTOOL_A_HEADER_FLAGS + ETHTOOL_A_HEADER_MAX = C.ETHTOOL_A_HEADER_MAX + ETHTOOL_A_BITSET_BIT_UNSPEC = C.ETHTOOL_A_BITSET_BIT_UNSPEC + ETHTOOL_A_BITSET_BIT_INDEX = C.ETHTOOL_A_BITSET_BIT_INDEX + ETHTOOL_A_BITSET_BIT_NAME = C.ETHTOOL_A_BITSET_BIT_NAME + ETHTOOL_A_BITSET_BIT_VALUE = C.ETHTOOL_A_BITSET_BIT_VALUE + ETHTOOL_A_BITSET_BIT_MAX = C.ETHTOOL_A_BITSET_BIT_MAX + ETHTOOL_A_BITSET_BITS_UNSPEC = C.ETHTOOL_A_BITSET_BITS_UNSPEC + ETHTOOL_A_BITSET_BITS_BIT = C.ETHTOOL_A_BITSET_BITS_BIT + ETHTOOL_A_BITSET_BITS_MAX = C.ETHTOOL_A_BITSET_BITS_MAX + ETHTOOL_A_BITSET_UNSPEC = C.ETHTOOL_A_BITSET_UNSPEC + ETHTOOL_A_BITSET_NOMASK = C.ETHTOOL_A_BITSET_NOMASK + ETHTOOL_A_BITSET_SIZE = C.ETHTOOL_A_BITSET_SIZE + ETHTOOL_A_BITSET_BITS = C.ETHTOOL_A_BITSET_BITS + ETHTOOL_A_BITSET_VALUE = C.ETHTOOL_A_BITSET_VALUE + ETHTOOL_A_BITSET_MASK = C.ETHTOOL_A_BITSET_MASK + ETHTOOL_A_BITSET_MAX = C.ETHTOOL_A_BITSET_MAX + ETHTOOL_A_STRING_UNSPEC = C.ETHTOOL_A_STRING_UNSPEC + ETHTOOL_A_STRING_INDEX = C.ETHTOOL_A_STRING_INDEX + ETHTOOL_A_STRING_VALUE = C.ETHTOOL_A_STRING_VALUE + ETHTOOL_A_STRING_MAX = C.ETHTOOL_A_STRING_MAX + ETHTOOL_A_STRINGS_UNSPEC = C.ETHTOOL_A_STRINGS_UNSPEC + ETHTOOL_A_STRINGS_STRING = C.ETHTOOL_A_STRINGS_STRING + ETHTOOL_A_STRINGS_MAX = C.ETHTOOL_A_STRINGS_MAX + ETHTOOL_A_STRINGSET_UNSPEC = C.ETHTOOL_A_STRINGSET_UNSPEC + ETHTOOL_A_STRINGSET_ID = C.ETHTOOL_A_STRINGSET_ID + ETHTOOL_A_STRINGSET_COUNT = C.ETHTOOL_A_STRINGSET_COUNT + ETHTOOL_A_STRINGSET_STRINGS = C.ETHTOOL_A_STRINGSET_STRINGS + ETHTOOL_A_STRINGSET_MAX = C.ETHTOOL_A_STRINGSET_MAX + ETHTOOL_A_STRINGSETS_UNSPEC = C.ETHTOOL_A_STRINGSETS_UNSPEC + ETHTOOL_A_STRINGSETS_STRINGSET = C.ETHTOOL_A_STRINGSETS_STRINGSET + ETHTOOL_A_STRINGSETS_MAX = C.ETHTOOL_A_STRINGSETS_MAX + ETHTOOL_A_STRSET_UNSPEC = C.ETHTOOL_A_STRSET_UNSPEC + ETHTOOL_A_STRSET_HEADER = C.ETHTOOL_A_STRSET_HEADER + ETHTOOL_A_STRSET_STRINGSETS = C.ETHTOOL_A_STRSET_STRINGSETS + ETHTOOL_A_STRSET_COUNTS_ONLY = C.ETHTOOL_A_STRSET_COUNTS_ONLY + ETHTOOL_A_STRSET_MAX = C.ETHTOOL_A_STRSET_MAX + ETHTOOL_A_LINKINFO_UNSPEC = C.ETHTOOL_A_LINKINFO_UNSPEC + ETHTOOL_A_LINKINFO_HEADER = C.ETHTOOL_A_LINKINFO_HEADER + ETHTOOL_A_LINKINFO_PORT = C.ETHTOOL_A_LINKINFO_PORT + ETHTOOL_A_LINKINFO_PHYADDR = C.ETHTOOL_A_LINKINFO_PHYADDR + ETHTOOL_A_LINKINFO_TP_MDIX = C.ETHTOOL_A_LINKINFO_TP_MDIX + ETHTOOL_A_LINKINFO_TP_MDIX_CTRL = C.ETHTOOL_A_LINKINFO_TP_MDIX_CTRL + ETHTOOL_A_LINKINFO_TRANSCEIVER = C.ETHTOOL_A_LINKINFO_TRANSCEIVER + ETHTOOL_A_LINKINFO_MAX = C.ETHTOOL_A_LINKINFO_MAX + ETHTOOL_A_LINKMODES_UNSPEC = C.ETHTOOL_A_LINKMODES_UNSPEC + ETHTOOL_A_LINKMODES_HEADER = C.ETHTOOL_A_LINKMODES_HEADER + ETHTOOL_A_LINKMODES_AUTONEG = C.ETHTOOL_A_LINKMODES_AUTONEG + ETHTOOL_A_LINKMODES_OURS = C.ETHTOOL_A_LINKMODES_OURS + ETHTOOL_A_LINKMODES_PEER = C.ETHTOOL_A_LINKMODES_PEER + ETHTOOL_A_LINKMODES_SPEED = C.ETHTOOL_A_LINKMODES_SPEED + ETHTOOL_A_LINKMODES_DUPLEX = C.ETHTOOL_A_LINKMODES_DUPLEX + ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG = C.ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG + ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE = C.ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE + ETHTOOL_A_LINKMODES_MAX = C.ETHTOOL_A_LINKMODES_MAX + ETHTOOL_A_LINKSTATE_UNSPEC = C.ETHTOOL_A_LINKSTATE_UNSPEC + ETHTOOL_A_LINKSTATE_HEADER = C.ETHTOOL_A_LINKSTATE_HEADER + ETHTOOL_A_LINKSTATE_LINK = C.ETHTOOL_A_LINKSTATE_LINK + ETHTOOL_A_LINKSTATE_SQI = C.ETHTOOL_A_LINKSTATE_SQI + ETHTOOL_A_LINKSTATE_SQI_MAX = C.ETHTOOL_A_LINKSTATE_SQI_MAX + ETHTOOL_A_LINKSTATE_EXT_STATE = C.ETHTOOL_A_LINKSTATE_EXT_STATE + ETHTOOL_A_LINKSTATE_EXT_SUBSTATE = C.ETHTOOL_A_LINKSTATE_EXT_SUBSTATE + ETHTOOL_A_LINKSTATE_MAX = C.ETHTOOL_A_LINKSTATE_MAX + ETHTOOL_A_DEBUG_UNSPEC = C.ETHTOOL_A_DEBUG_UNSPEC + ETHTOOL_A_DEBUG_HEADER = C.ETHTOOL_A_DEBUG_HEADER + ETHTOOL_A_DEBUG_MSGMASK = C.ETHTOOL_A_DEBUG_MSGMASK + ETHTOOL_A_DEBUG_MAX = C.ETHTOOL_A_DEBUG_MAX + ETHTOOL_A_WOL_UNSPEC = C.ETHTOOL_A_WOL_UNSPEC + ETHTOOL_A_WOL_HEADER = C.ETHTOOL_A_WOL_HEADER + ETHTOOL_A_WOL_MODES = C.ETHTOOL_A_WOL_MODES + ETHTOOL_A_WOL_SOPASS = C.ETHTOOL_A_WOL_SOPASS + ETHTOOL_A_WOL_MAX = C.ETHTOOL_A_WOL_MAX + ETHTOOL_A_FEATURES_UNSPEC = C.ETHTOOL_A_FEATURES_UNSPEC + ETHTOOL_A_FEATURES_HEADER = C.ETHTOOL_A_FEATURES_HEADER + ETHTOOL_A_FEATURES_HW = C.ETHTOOL_A_FEATURES_HW + ETHTOOL_A_FEATURES_WANTED = C.ETHTOOL_A_FEATURES_WANTED + ETHTOOL_A_FEATURES_ACTIVE = C.ETHTOOL_A_FEATURES_ACTIVE + ETHTOOL_A_FEATURES_NOCHANGE = C.ETHTOOL_A_FEATURES_NOCHANGE + ETHTOOL_A_FEATURES_MAX = C.ETHTOOL_A_FEATURES_MAX + ETHTOOL_A_PRIVFLAGS_UNSPEC = C.ETHTOOL_A_PRIVFLAGS_UNSPEC + ETHTOOL_A_PRIVFLAGS_HEADER = C.ETHTOOL_A_PRIVFLAGS_HEADER + ETHTOOL_A_PRIVFLAGS_FLAGS = C.ETHTOOL_A_PRIVFLAGS_FLAGS + ETHTOOL_A_PRIVFLAGS_MAX = C.ETHTOOL_A_PRIVFLAGS_MAX + ETHTOOL_A_RINGS_UNSPEC = C.ETHTOOL_A_RINGS_UNSPEC + ETHTOOL_A_RINGS_HEADER = C.ETHTOOL_A_RINGS_HEADER + ETHTOOL_A_RINGS_RX_MAX = C.ETHTOOL_A_RINGS_RX_MAX + ETHTOOL_A_RINGS_RX_MINI_MAX = C.ETHTOOL_A_RINGS_RX_MINI_MAX + ETHTOOL_A_RINGS_RX_JUMBO_MAX = C.ETHTOOL_A_RINGS_RX_JUMBO_MAX + ETHTOOL_A_RINGS_TX_MAX = C.ETHTOOL_A_RINGS_TX_MAX + ETHTOOL_A_RINGS_RX = C.ETHTOOL_A_RINGS_RX + ETHTOOL_A_RINGS_RX_MINI = C.ETHTOOL_A_RINGS_RX_MINI + ETHTOOL_A_RINGS_RX_JUMBO = C.ETHTOOL_A_RINGS_RX_JUMBO + ETHTOOL_A_RINGS_TX = C.ETHTOOL_A_RINGS_TX + ETHTOOL_A_RINGS_MAX = C.ETHTOOL_A_RINGS_MAX + ETHTOOL_A_CHANNELS_UNSPEC = C.ETHTOOL_A_CHANNELS_UNSPEC + ETHTOOL_A_CHANNELS_HEADER = C.ETHTOOL_A_CHANNELS_HEADER + ETHTOOL_A_CHANNELS_RX_MAX = C.ETHTOOL_A_CHANNELS_RX_MAX + ETHTOOL_A_CHANNELS_TX_MAX = C.ETHTOOL_A_CHANNELS_TX_MAX + ETHTOOL_A_CHANNELS_OTHER_MAX = C.ETHTOOL_A_CHANNELS_OTHER_MAX + ETHTOOL_A_CHANNELS_COMBINED_MAX = C.ETHTOOL_A_CHANNELS_COMBINED_MAX + ETHTOOL_A_CHANNELS_RX_COUNT = C.ETHTOOL_A_CHANNELS_RX_COUNT + ETHTOOL_A_CHANNELS_TX_COUNT = C.ETHTOOL_A_CHANNELS_TX_COUNT + ETHTOOL_A_CHANNELS_OTHER_COUNT = C.ETHTOOL_A_CHANNELS_OTHER_COUNT + ETHTOOL_A_CHANNELS_COMBINED_COUNT = C.ETHTOOL_A_CHANNELS_COMBINED_COUNT + ETHTOOL_A_CHANNELS_MAX = C.ETHTOOL_A_CHANNELS_MAX + ETHTOOL_A_COALESCE_UNSPEC = C.ETHTOOL_A_COALESCE_UNSPEC + ETHTOOL_A_COALESCE_HEADER = C.ETHTOOL_A_COALESCE_HEADER + ETHTOOL_A_COALESCE_RX_USECS = C.ETHTOOL_A_COALESCE_RX_USECS + ETHTOOL_A_COALESCE_RX_MAX_FRAMES = C.ETHTOOL_A_COALESCE_RX_MAX_FRAMES + ETHTOOL_A_COALESCE_RX_USECS_IRQ = C.ETHTOOL_A_COALESCE_RX_USECS_IRQ + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_IRQ = C.ETHTOOL_A_COALESCE_RX_MAX_FRAMES_IRQ + ETHTOOL_A_COALESCE_TX_USECS = C.ETHTOOL_A_COALESCE_TX_USECS + ETHTOOL_A_COALESCE_TX_MAX_FRAMES = C.ETHTOOL_A_COALESCE_TX_MAX_FRAMES + ETHTOOL_A_COALESCE_TX_USECS_IRQ = C.ETHTOOL_A_COALESCE_TX_USECS_IRQ + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_IRQ = C.ETHTOOL_A_COALESCE_TX_MAX_FRAMES_IRQ + ETHTOOL_A_COALESCE_STATS_BLOCK_USECS = C.ETHTOOL_A_COALESCE_STATS_BLOCK_USECS + ETHTOOL_A_COALESCE_USE_ADAPTIVE_RX = C.ETHTOOL_A_COALESCE_USE_ADAPTIVE_RX + ETHTOOL_A_COALESCE_USE_ADAPTIVE_TX = C.ETHTOOL_A_COALESCE_USE_ADAPTIVE_TX + ETHTOOL_A_COALESCE_PKT_RATE_LOW = C.ETHTOOL_A_COALESCE_PKT_RATE_LOW + ETHTOOL_A_COALESCE_RX_USECS_LOW = C.ETHTOOL_A_COALESCE_RX_USECS_LOW + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_LOW = C.ETHTOOL_A_COALESCE_RX_MAX_FRAMES_LOW + ETHTOOL_A_COALESCE_TX_USECS_LOW = C.ETHTOOL_A_COALESCE_TX_USECS_LOW + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_LOW = C.ETHTOOL_A_COALESCE_TX_MAX_FRAMES_LOW + ETHTOOL_A_COALESCE_PKT_RATE_HIGH = C.ETHTOOL_A_COALESCE_PKT_RATE_HIGH + ETHTOOL_A_COALESCE_RX_USECS_HIGH = C.ETHTOOL_A_COALESCE_RX_USECS_HIGH + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_HIGH = C.ETHTOOL_A_COALESCE_RX_MAX_FRAMES_HIGH + ETHTOOL_A_COALESCE_TX_USECS_HIGH = C.ETHTOOL_A_COALESCE_TX_USECS_HIGH + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH = C.ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH + ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL = C.ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL + ETHTOOL_A_COALESCE_MAX = C.ETHTOOL_A_COALESCE_MAX + ETHTOOL_A_PAUSE_UNSPEC = C.ETHTOOL_A_PAUSE_UNSPEC + ETHTOOL_A_PAUSE_HEADER = C.ETHTOOL_A_PAUSE_HEADER + ETHTOOL_A_PAUSE_AUTONEG = C.ETHTOOL_A_PAUSE_AUTONEG + ETHTOOL_A_PAUSE_RX = C.ETHTOOL_A_PAUSE_RX + ETHTOOL_A_PAUSE_TX = C.ETHTOOL_A_PAUSE_TX + ETHTOOL_A_PAUSE_STATS = C.ETHTOOL_A_PAUSE_STATS + ETHTOOL_A_PAUSE_MAX = C.ETHTOOL_A_PAUSE_MAX + ETHTOOL_A_PAUSE_STAT_UNSPEC = C.ETHTOOL_A_PAUSE_STAT_UNSPEC + ETHTOOL_A_PAUSE_STAT_PAD = C.ETHTOOL_A_PAUSE_STAT_PAD + ETHTOOL_A_PAUSE_STAT_TX_FRAMES = C.ETHTOOL_A_PAUSE_STAT_TX_FRAMES + ETHTOOL_A_PAUSE_STAT_RX_FRAMES = C.ETHTOOL_A_PAUSE_STAT_RX_FRAMES + ETHTOOL_A_PAUSE_STAT_MAX = C.ETHTOOL_A_PAUSE_STAT_MAX + ETHTOOL_A_EEE_UNSPEC = C.ETHTOOL_A_EEE_UNSPEC + ETHTOOL_A_EEE_HEADER = C.ETHTOOL_A_EEE_HEADER + ETHTOOL_A_EEE_MODES_OURS = C.ETHTOOL_A_EEE_MODES_OURS + ETHTOOL_A_EEE_MODES_PEER = C.ETHTOOL_A_EEE_MODES_PEER + ETHTOOL_A_EEE_ACTIVE = C.ETHTOOL_A_EEE_ACTIVE + ETHTOOL_A_EEE_ENABLED = C.ETHTOOL_A_EEE_ENABLED + ETHTOOL_A_EEE_TX_LPI_ENABLED = C.ETHTOOL_A_EEE_TX_LPI_ENABLED + ETHTOOL_A_EEE_TX_LPI_TIMER = C.ETHTOOL_A_EEE_TX_LPI_TIMER + ETHTOOL_A_EEE_MAX = C.ETHTOOL_A_EEE_MAX + ETHTOOL_A_TSINFO_UNSPEC = C.ETHTOOL_A_TSINFO_UNSPEC + ETHTOOL_A_TSINFO_HEADER = C.ETHTOOL_A_TSINFO_HEADER + ETHTOOL_A_TSINFO_TIMESTAMPING = C.ETHTOOL_A_TSINFO_TIMESTAMPING + ETHTOOL_A_TSINFO_TX_TYPES = C.ETHTOOL_A_TSINFO_TX_TYPES + ETHTOOL_A_TSINFO_RX_FILTERS = C.ETHTOOL_A_TSINFO_RX_FILTERS + ETHTOOL_A_TSINFO_PHC_INDEX = C.ETHTOOL_A_TSINFO_PHC_INDEX + ETHTOOL_A_TSINFO_MAX = C.ETHTOOL_A_TSINFO_MAX + ETHTOOL_A_CABLE_TEST_UNSPEC = C.ETHTOOL_A_CABLE_TEST_UNSPEC + ETHTOOL_A_CABLE_TEST_HEADER = C.ETHTOOL_A_CABLE_TEST_HEADER + ETHTOOL_A_CABLE_TEST_MAX = C.ETHTOOL_A_CABLE_TEST_MAX + ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC = C.ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC + ETHTOOL_A_CABLE_RESULT_CODE_OK = C.ETHTOOL_A_CABLE_RESULT_CODE_OK + ETHTOOL_A_CABLE_RESULT_CODE_OPEN = C.ETHTOOL_A_CABLE_RESULT_CODE_OPEN + ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT = C.ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT + ETHTOOL_A_CABLE_RESULT_CODE_CROSS_SHORT = C.ETHTOOL_A_CABLE_RESULT_CODE_CROSS_SHORT + ETHTOOL_A_CABLE_PAIR_A = C.ETHTOOL_A_CABLE_PAIR_A + ETHTOOL_A_CABLE_PAIR_B = C.ETHTOOL_A_CABLE_PAIR_B + ETHTOOL_A_CABLE_PAIR_C = C.ETHTOOL_A_CABLE_PAIR_C + ETHTOOL_A_CABLE_PAIR_D = C.ETHTOOL_A_CABLE_PAIR_D + ETHTOOL_A_CABLE_RESULT_UNSPEC = C.ETHTOOL_A_CABLE_RESULT_UNSPEC + ETHTOOL_A_CABLE_RESULT_PAIR = C.ETHTOOL_A_CABLE_RESULT_PAIR + ETHTOOL_A_CABLE_RESULT_CODE = C.ETHTOOL_A_CABLE_RESULT_CODE + ETHTOOL_A_CABLE_RESULT_MAX = C.ETHTOOL_A_CABLE_RESULT_MAX + ETHTOOL_A_CABLE_FAULT_LENGTH_UNSPEC = C.ETHTOOL_A_CABLE_FAULT_LENGTH_UNSPEC + ETHTOOL_A_CABLE_FAULT_LENGTH_PAIR = C.ETHTOOL_A_CABLE_FAULT_LENGTH_PAIR + ETHTOOL_A_CABLE_FAULT_LENGTH_CM = C.ETHTOOL_A_CABLE_FAULT_LENGTH_CM + ETHTOOL_A_CABLE_FAULT_LENGTH_MAX = C.ETHTOOL_A_CABLE_FAULT_LENGTH_MAX + ETHTOOL_A_CABLE_TEST_NTF_STATUS_UNSPEC = C.ETHTOOL_A_CABLE_TEST_NTF_STATUS_UNSPEC + ETHTOOL_A_CABLE_TEST_NTF_STATUS_STARTED = C.ETHTOOL_A_CABLE_TEST_NTF_STATUS_STARTED + ETHTOOL_A_CABLE_TEST_NTF_STATUS_COMPLETED = C.ETHTOOL_A_CABLE_TEST_NTF_STATUS_COMPLETED + ETHTOOL_A_CABLE_NEST_UNSPEC = C.ETHTOOL_A_CABLE_NEST_UNSPEC + ETHTOOL_A_CABLE_NEST_RESULT = C.ETHTOOL_A_CABLE_NEST_RESULT + ETHTOOL_A_CABLE_NEST_FAULT_LENGTH = C.ETHTOOL_A_CABLE_NEST_FAULT_LENGTH + ETHTOOL_A_CABLE_NEST_MAX = C.ETHTOOL_A_CABLE_NEST_MAX + ETHTOOL_A_CABLE_TEST_NTF_UNSPEC = C.ETHTOOL_A_CABLE_TEST_NTF_UNSPEC + ETHTOOL_A_CABLE_TEST_NTF_HEADER = C.ETHTOOL_A_CABLE_TEST_NTF_HEADER + ETHTOOL_A_CABLE_TEST_NTF_STATUS = C.ETHTOOL_A_CABLE_TEST_NTF_STATUS + ETHTOOL_A_CABLE_TEST_NTF_NEST = C.ETHTOOL_A_CABLE_TEST_NTF_NEST + ETHTOOL_A_CABLE_TEST_NTF_MAX = C.ETHTOOL_A_CABLE_TEST_NTF_MAX + ETHTOOL_A_CABLE_TEST_TDR_CFG_UNSPEC = C.ETHTOOL_A_CABLE_TEST_TDR_CFG_UNSPEC + ETHTOOL_A_CABLE_TEST_TDR_CFG_FIRST = C.ETHTOOL_A_CABLE_TEST_TDR_CFG_FIRST + ETHTOOL_A_CABLE_TEST_TDR_CFG_LAST = C.ETHTOOL_A_CABLE_TEST_TDR_CFG_LAST + ETHTOOL_A_CABLE_TEST_TDR_CFG_STEP = C.ETHTOOL_A_CABLE_TEST_TDR_CFG_STEP + ETHTOOL_A_CABLE_TEST_TDR_CFG_PAIR = C.ETHTOOL_A_CABLE_TEST_TDR_CFG_PAIR + ETHTOOL_A_CABLE_TEST_TDR_CFG_MAX = C.ETHTOOL_A_CABLE_TEST_TDR_CFG_MAX + ETHTOOL_A_CABLE_TEST_TDR_UNSPEC = C.ETHTOOL_A_CABLE_TEST_TDR_UNSPEC + ETHTOOL_A_CABLE_TEST_TDR_HEADER = C.ETHTOOL_A_CABLE_TEST_TDR_HEADER + ETHTOOL_A_CABLE_TEST_TDR_CFG = C.ETHTOOL_A_CABLE_TEST_TDR_CFG + ETHTOOL_A_CABLE_TEST_TDR_MAX = C.ETHTOOL_A_CABLE_TEST_TDR_MAX + ETHTOOL_A_CABLE_AMPLITUDE_UNSPEC = C.ETHTOOL_A_CABLE_AMPLITUDE_UNSPEC + ETHTOOL_A_CABLE_AMPLITUDE_PAIR = C.ETHTOOL_A_CABLE_AMPLITUDE_PAIR + ETHTOOL_A_CABLE_AMPLITUDE_mV = C.ETHTOOL_A_CABLE_AMPLITUDE_mV + ETHTOOL_A_CABLE_AMPLITUDE_MAX = C.ETHTOOL_A_CABLE_AMPLITUDE_MAX + ETHTOOL_A_CABLE_PULSE_UNSPEC = C.ETHTOOL_A_CABLE_PULSE_UNSPEC + ETHTOOL_A_CABLE_PULSE_mV = C.ETHTOOL_A_CABLE_PULSE_mV + ETHTOOL_A_CABLE_PULSE_MAX = C.ETHTOOL_A_CABLE_PULSE_MAX + ETHTOOL_A_CABLE_STEP_UNSPEC = C.ETHTOOL_A_CABLE_STEP_UNSPEC + ETHTOOL_A_CABLE_STEP_FIRST_DISTANCE = C.ETHTOOL_A_CABLE_STEP_FIRST_DISTANCE + ETHTOOL_A_CABLE_STEP_LAST_DISTANCE = C.ETHTOOL_A_CABLE_STEP_LAST_DISTANCE + ETHTOOL_A_CABLE_STEP_STEP_DISTANCE = C.ETHTOOL_A_CABLE_STEP_STEP_DISTANCE + ETHTOOL_A_CABLE_STEP_MAX = C.ETHTOOL_A_CABLE_STEP_MAX + ETHTOOL_A_CABLE_TDR_NEST_UNSPEC = C.ETHTOOL_A_CABLE_TDR_NEST_UNSPEC + ETHTOOL_A_CABLE_TDR_NEST_STEP = C.ETHTOOL_A_CABLE_TDR_NEST_STEP + ETHTOOL_A_CABLE_TDR_NEST_AMPLITUDE = C.ETHTOOL_A_CABLE_TDR_NEST_AMPLITUDE + ETHTOOL_A_CABLE_TDR_NEST_PULSE = C.ETHTOOL_A_CABLE_TDR_NEST_PULSE + ETHTOOL_A_CABLE_TDR_NEST_MAX = C.ETHTOOL_A_CABLE_TDR_NEST_MAX + ETHTOOL_A_CABLE_TEST_TDR_NTF_UNSPEC = C.ETHTOOL_A_CABLE_TEST_TDR_NTF_UNSPEC + ETHTOOL_A_CABLE_TEST_TDR_NTF_HEADER = C.ETHTOOL_A_CABLE_TEST_TDR_NTF_HEADER + ETHTOOL_A_CABLE_TEST_TDR_NTF_STATUS = C.ETHTOOL_A_CABLE_TEST_TDR_NTF_STATUS + ETHTOOL_A_CABLE_TEST_TDR_NTF_NEST = C.ETHTOOL_A_CABLE_TEST_TDR_NTF_NEST + ETHTOOL_A_CABLE_TEST_TDR_NTF_MAX = C.ETHTOOL_A_CABLE_TEST_TDR_NTF_MAX + ETHTOOL_UDP_TUNNEL_TYPE_VXLAN = C.ETHTOOL_UDP_TUNNEL_TYPE_VXLAN + ETHTOOL_UDP_TUNNEL_TYPE_GENEVE = C.ETHTOOL_UDP_TUNNEL_TYPE_GENEVE + ETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE = C.ETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE + ETHTOOL_A_TUNNEL_UDP_ENTRY_UNSPEC = C.ETHTOOL_A_TUNNEL_UDP_ENTRY_UNSPEC + ETHTOOL_A_TUNNEL_UDP_ENTRY_PORT = C.ETHTOOL_A_TUNNEL_UDP_ENTRY_PORT + ETHTOOL_A_TUNNEL_UDP_ENTRY_TYPE = C.ETHTOOL_A_TUNNEL_UDP_ENTRY_TYPE + ETHTOOL_A_TUNNEL_UDP_ENTRY_MAX = C.ETHTOOL_A_TUNNEL_UDP_ENTRY_MAX + ETHTOOL_A_TUNNEL_UDP_TABLE_UNSPEC = C.ETHTOOL_A_TUNNEL_UDP_TABLE_UNSPEC + ETHTOOL_A_TUNNEL_UDP_TABLE_SIZE = C.ETHTOOL_A_TUNNEL_UDP_TABLE_SIZE + ETHTOOL_A_TUNNEL_UDP_TABLE_TYPES = C.ETHTOOL_A_TUNNEL_UDP_TABLE_TYPES + ETHTOOL_A_TUNNEL_UDP_TABLE_ENTRY = C.ETHTOOL_A_TUNNEL_UDP_TABLE_ENTRY + ETHTOOL_A_TUNNEL_UDP_TABLE_MAX = C.ETHTOOL_A_TUNNEL_UDP_TABLE_MAX + ETHTOOL_A_TUNNEL_UDP_UNSPEC = C.ETHTOOL_A_TUNNEL_UDP_UNSPEC + ETHTOOL_A_TUNNEL_UDP_TABLE = C.ETHTOOL_A_TUNNEL_UDP_TABLE + ETHTOOL_A_TUNNEL_UDP_MAX = C.ETHTOOL_A_TUNNEL_UDP_MAX + ETHTOOL_A_TUNNEL_INFO_UNSPEC = C.ETHTOOL_A_TUNNEL_INFO_UNSPEC + ETHTOOL_A_TUNNEL_INFO_HEADER = C.ETHTOOL_A_TUNNEL_INFO_HEADER + ETHTOOL_A_TUNNEL_INFO_UDP_PORTS = C.ETHTOOL_A_TUNNEL_INFO_UDP_PORTS + ETHTOOL_A_TUNNEL_INFO_MAX = C.ETHTOOL_A_TUNNEL_INFO_MAX +) diff --git a/unix/mkerrors.sh b/unix/mkerrors.sh index 928fa7a9..b8313e98 100755 --- a/unix/mkerrors.sh +++ b/unix/mkerrors.sh @@ -204,6 +204,7 @@ struct ltchars { #include #include #include +#include #include #include #include @@ -563,6 +564,7 @@ ccflags="$@" $2 ~ /^TIPC_/ || $2 !~ "DEVLINK_RELOAD_LIMITS_VALID_MASK" && $2 ~ /^DEVLINK_/ || + $2 ~ /^ETHTOOL_/ || $2 ~ /^LWTUNNEL_IP/ || $2 !~ "WMESGLEN" && $2 ~ /^W[A-Z0-9]+$/ || diff --git a/unix/zerrors_linux.go b/unix/zerrors_linux.go index f73b4efd..b3463a8b 100644 --- a/unix/zerrors_linux.go +++ b/unix/zerrors_linux.go @@ -527,6 +527,119 @@ const ( EPOLL_CTL_DEL = 0x2 EPOLL_CTL_MOD = 0x3 EROFS_SUPER_MAGIC_V1 = 0xe0f5e1e2 + ESP_V4_FLOW = 0xa + ESP_V6_FLOW = 0xc + ETHER_FLOW = 0x12 + ETHTOOL_BUSINFO_LEN = 0x20 + ETHTOOL_EROMVERS_LEN = 0x20 + ETHTOOL_FEC_AUTO = 0x2 + ETHTOOL_FEC_BASER = 0x10 + ETHTOOL_FEC_LLRS = 0x20 + ETHTOOL_FEC_NONE = 0x1 + ETHTOOL_FEC_OFF = 0x4 + ETHTOOL_FEC_RS = 0x8 + ETHTOOL_FLAG_ALL = 0x7 + ETHTOOL_FLAG_COMPACT_BITSETS = 0x1 + ETHTOOL_FLAG_OMIT_REPLY = 0x2 + ETHTOOL_FLAG_STATS = 0x4 + ETHTOOL_FLASHDEV = 0x33 + ETHTOOL_FLASH_MAX_FILENAME = 0x80 + ETHTOOL_FWVERS_LEN = 0x20 + ETHTOOL_F_COMPAT = 0x4 + ETHTOOL_F_UNSUPPORTED = 0x1 + ETHTOOL_F_WISH = 0x2 + ETHTOOL_GCHANNELS = 0x3c + ETHTOOL_GCOALESCE = 0xe + ETHTOOL_GDRVINFO = 0x3 + ETHTOOL_GEEE = 0x44 + ETHTOOL_GEEPROM = 0xb + ETHTOOL_GENL_NAME = "ethtool" + ETHTOOL_GENL_VERSION = 0x1 + ETHTOOL_GET_DUMP_DATA = 0x40 + ETHTOOL_GET_DUMP_FLAG = 0x3f + ETHTOOL_GET_TS_INFO = 0x41 + ETHTOOL_GFEATURES = 0x3a + ETHTOOL_GFECPARAM = 0x50 + ETHTOOL_GFLAGS = 0x25 + ETHTOOL_GGRO = 0x2b + ETHTOOL_GGSO = 0x23 + ETHTOOL_GLINK = 0xa + ETHTOOL_GLINKSETTINGS = 0x4c + ETHTOOL_GMODULEEEPROM = 0x43 + ETHTOOL_GMODULEINFO = 0x42 + ETHTOOL_GMSGLVL = 0x7 + ETHTOOL_GPAUSEPARAM = 0x12 + ETHTOOL_GPERMADDR = 0x20 + ETHTOOL_GPFLAGS = 0x27 + ETHTOOL_GPHYSTATS = 0x4a + ETHTOOL_GREGS = 0x4 + ETHTOOL_GRINGPARAM = 0x10 + ETHTOOL_GRSSH = 0x46 + ETHTOOL_GRXCLSRLALL = 0x30 + ETHTOOL_GRXCLSRLCNT = 0x2e + ETHTOOL_GRXCLSRULE = 0x2f + ETHTOOL_GRXCSUM = 0x14 + ETHTOOL_GRXFH = 0x29 + ETHTOOL_GRXFHINDIR = 0x38 + ETHTOOL_GRXNTUPLE = 0x36 + ETHTOOL_GRXRINGS = 0x2d + ETHTOOL_GSET = 0x1 + ETHTOOL_GSG = 0x18 + ETHTOOL_GSSET_INFO = 0x37 + ETHTOOL_GSTATS = 0x1d + ETHTOOL_GSTRINGS = 0x1b + ETHTOOL_GTSO = 0x1e + ETHTOOL_GTUNABLE = 0x48 + ETHTOOL_GTXCSUM = 0x16 + ETHTOOL_GUFO = 0x21 + ETHTOOL_GWOL = 0x5 + ETHTOOL_MCGRP_MONITOR_NAME = "monitor" + ETHTOOL_NWAY_RST = 0x9 + ETHTOOL_PERQUEUE = 0x4b + ETHTOOL_PHYS_ID = 0x1c + ETHTOOL_PHY_EDPD_DFLT_TX_MSECS = 0xffff + ETHTOOL_PHY_EDPD_DISABLE = 0x0 + ETHTOOL_PHY_EDPD_NO_TX = 0xfffe + ETHTOOL_PHY_FAST_LINK_DOWN_OFF = 0xff + ETHTOOL_PHY_FAST_LINK_DOWN_ON = 0x0 + ETHTOOL_PHY_GTUNABLE = 0x4e + ETHTOOL_PHY_STUNABLE = 0x4f + ETHTOOL_RESET = 0x34 + ETHTOOL_RXNTUPLE_ACTION_CLEAR = -0x2 + ETHTOOL_RXNTUPLE_ACTION_DROP = -0x1 + ETHTOOL_RX_FLOW_SPEC_RING = 0xffffffff + ETHTOOL_RX_FLOW_SPEC_RING_VF = 0xff00000000 + ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF = 0x20 + ETHTOOL_SCHANNELS = 0x3d + ETHTOOL_SCOALESCE = 0xf + ETHTOOL_SEEE = 0x45 + ETHTOOL_SEEPROM = 0xc + ETHTOOL_SET_DUMP = 0x3e + ETHTOOL_SFEATURES = 0x3b + ETHTOOL_SFECPARAM = 0x51 + ETHTOOL_SFLAGS = 0x26 + ETHTOOL_SGRO = 0x2c + ETHTOOL_SGSO = 0x24 + ETHTOOL_SLINKSETTINGS = 0x4d + ETHTOOL_SMSGLVL = 0x8 + ETHTOOL_SPAUSEPARAM = 0x13 + ETHTOOL_SPFLAGS = 0x28 + ETHTOOL_SRINGPARAM = 0x11 + ETHTOOL_SRSSH = 0x47 + ETHTOOL_SRXCLSRLDEL = 0x31 + ETHTOOL_SRXCLSRLINS = 0x32 + ETHTOOL_SRXCSUM = 0x15 + ETHTOOL_SRXFH = 0x2a + ETHTOOL_SRXFHINDIR = 0x39 + ETHTOOL_SRXNTUPLE = 0x35 + ETHTOOL_SSET = 0x2 + ETHTOOL_SSG = 0x19 + ETHTOOL_STSO = 0x1f + ETHTOOL_STUNABLE = 0x49 + ETHTOOL_STXCSUM = 0x17 + ETHTOOL_SUFO = 0x22 + ETHTOOL_SWOL = 0x6 + ETHTOOL_TEST = 0x1a ETH_P_1588 = 0x88f7 ETH_P_8021AD = 0x88a8 ETH_P_8021AH = 0x88e7 @@ -996,6 +1109,7 @@ const ( IPV6_DONTFRAG = 0x3e IPV6_DROP_MEMBERSHIP = 0x15 IPV6_DSTOPTS = 0x3b + IPV6_FLOW = 0x11 IPV6_FREEBIND = 0x4e IPV6_HDRINCL = 0x24 IPV6_HOPLIMIT = 0x34 @@ -1045,6 +1159,7 @@ const ( IPV6_TRANSPARENT = 0x4b IPV6_UNICAST_HOPS = 0x10 IPV6_UNICAST_IF = 0x4c + IPV6_USER_FLOW = 0xe IPV6_V6ONLY = 0x1a IPV6_XFRM_POLICY = 0x23 IP_ADD_MEMBERSHIP = 0x23 @@ -1101,6 +1216,7 @@ const ( IP_TTL = 0x2 IP_UNBLOCK_SOURCE = 0x25 IP_UNICAST_IF = 0x32 + IP_USER_FLOW = 0xd IP_XFRM_POLICY = 0x11 ISOFS_SUPER_MAGIC = 0x9660 ISTRIP = 0x20 @@ -2340,6 +2456,8 @@ const ( TCP_TX_DELAY = 0x25 TCP_ULP = 0x1f TCP_USER_TIMEOUT = 0x12 + TCP_V4_FLOW = 0x1 + TCP_V6_FLOW = 0x5 TCP_WINDOW_CLAMP = 0xa TCP_ZEROCOPY_RECEIVE = 0x23 TFD_TIMER_ABSTIME = 0x1 @@ -2466,6 +2584,7 @@ const ( VM_SOCKETS_INVALID_VERSION = 0xffffffff VQUIT = 0x1 VT0 = 0x0 + WAKE_MAGIC = 0x20 WALL = 0x40000000 WCLONE = 0x80000000 WCONTINUED = 0x8 diff --git a/unix/ztypes_linux.go b/unix/ztypes_linux.go index 9f73d669..5ab36711 100644 --- a/unix/ztypes_linux.go +++ b/unix/ztypes_linux.go @@ -3222,3 +3222,311 @@ const ( MPLS_IPTUNNEL_TTL = 0x2 MPLS_IPTUNNEL_MAX = 0x2 ) + +const ( + ETHTOOL_MSG_USER_NONE = 0x0 + ETHTOOL_MSG_STRSET_GET = 0x1 + ETHTOOL_MSG_LINKINFO_GET = 0x2 + ETHTOOL_MSG_LINKINFO_SET = 0x3 + ETHTOOL_MSG_LINKMODES_GET = 0x4 + ETHTOOL_MSG_LINKMODES_SET = 0x5 + ETHTOOL_MSG_LINKSTATE_GET = 0x6 + ETHTOOL_MSG_DEBUG_GET = 0x7 + ETHTOOL_MSG_DEBUG_SET = 0x8 + ETHTOOL_MSG_WOL_GET = 0x9 + ETHTOOL_MSG_WOL_SET = 0xa + ETHTOOL_MSG_FEATURES_GET = 0xb + ETHTOOL_MSG_FEATURES_SET = 0xc + ETHTOOL_MSG_PRIVFLAGS_GET = 0xd + ETHTOOL_MSG_PRIVFLAGS_SET = 0xe + ETHTOOL_MSG_RINGS_GET = 0xf + ETHTOOL_MSG_RINGS_SET = 0x10 + ETHTOOL_MSG_CHANNELS_GET = 0x11 + ETHTOOL_MSG_CHANNELS_SET = 0x12 + ETHTOOL_MSG_COALESCE_GET = 0x13 + ETHTOOL_MSG_COALESCE_SET = 0x14 + ETHTOOL_MSG_PAUSE_GET = 0x15 + ETHTOOL_MSG_PAUSE_SET = 0x16 + ETHTOOL_MSG_EEE_GET = 0x17 + ETHTOOL_MSG_EEE_SET = 0x18 + ETHTOOL_MSG_TSINFO_GET = 0x19 + ETHTOOL_MSG_CABLE_TEST_ACT = 0x1a + ETHTOOL_MSG_CABLE_TEST_TDR_ACT = 0x1b + ETHTOOL_MSG_TUNNEL_INFO_GET = 0x1c + ETHTOOL_MSG_USER_MAX = 0x1c + ETHTOOL_MSG_KERNEL_NONE = 0x0 + ETHTOOL_MSG_STRSET_GET_REPLY = 0x1 + ETHTOOL_MSG_LINKINFO_GET_REPLY = 0x2 + ETHTOOL_MSG_LINKINFO_NTF = 0x3 + ETHTOOL_MSG_LINKMODES_GET_REPLY = 0x4 + ETHTOOL_MSG_LINKMODES_NTF = 0x5 + ETHTOOL_MSG_LINKSTATE_GET_REPLY = 0x6 + ETHTOOL_MSG_DEBUG_GET_REPLY = 0x7 + ETHTOOL_MSG_DEBUG_NTF = 0x8 + ETHTOOL_MSG_WOL_GET_REPLY = 0x9 + ETHTOOL_MSG_WOL_NTF = 0xa + ETHTOOL_MSG_FEATURES_GET_REPLY = 0xb + ETHTOOL_MSG_FEATURES_SET_REPLY = 0xc + ETHTOOL_MSG_FEATURES_NTF = 0xd + ETHTOOL_MSG_PRIVFLAGS_GET_REPLY = 0xe + ETHTOOL_MSG_PRIVFLAGS_NTF = 0xf + ETHTOOL_MSG_RINGS_GET_REPLY = 0x10 + ETHTOOL_MSG_RINGS_NTF = 0x11 + ETHTOOL_MSG_CHANNELS_GET_REPLY = 0x12 + ETHTOOL_MSG_CHANNELS_NTF = 0x13 + ETHTOOL_MSG_COALESCE_GET_REPLY = 0x14 + ETHTOOL_MSG_COALESCE_NTF = 0x15 + ETHTOOL_MSG_PAUSE_GET_REPLY = 0x16 + ETHTOOL_MSG_PAUSE_NTF = 0x17 + ETHTOOL_MSG_EEE_GET_REPLY = 0x18 + ETHTOOL_MSG_EEE_NTF = 0x19 + ETHTOOL_MSG_TSINFO_GET_REPLY = 0x1a + ETHTOOL_MSG_CABLE_TEST_NTF = 0x1b + ETHTOOL_MSG_CABLE_TEST_TDR_NTF = 0x1c + ETHTOOL_MSG_TUNNEL_INFO_GET_REPLY = 0x1d + ETHTOOL_MSG_KERNEL_MAX = 0x1d + ETHTOOL_A_HEADER_UNSPEC = 0x0 + ETHTOOL_A_HEADER_DEV_INDEX = 0x1 + ETHTOOL_A_HEADER_DEV_NAME = 0x2 + ETHTOOL_A_HEADER_FLAGS = 0x3 + ETHTOOL_A_HEADER_MAX = 0x3 + ETHTOOL_A_BITSET_BIT_UNSPEC = 0x0 + ETHTOOL_A_BITSET_BIT_INDEX = 0x1 + ETHTOOL_A_BITSET_BIT_NAME = 0x2 + ETHTOOL_A_BITSET_BIT_VALUE = 0x3 + ETHTOOL_A_BITSET_BIT_MAX = 0x3 + ETHTOOL_A_BITSET_BITS_UNSPEC = 0x0 + ETHTOOL_A_BITSET_BITS_BIT = 0x1 + ETHTOOL_A_BITSET_BITS_MAX = 0x1 + ETHTOOL_A_BITSET_UNSPEC = 0x0 + ETHTOOL_A_BITSET_NOMASK = 0x1 + ETHTOOL_A_BITSET_SIZE = 0x2 + ETHTOOL_A_BITSET_BITS = 0x3 + ETHTOOL_A_BITSET_VALUE = 0x4 + ETHTOOL_A_BITSET_MASK = 0x5 + ETHTOOL_A_BITSET_MAX = 0x5 + ETHTOOL_A_STRING_UNSPEC = 0x0 + ETHTOOL_A_STRING_INDEX = 0x1 + ETHTOOL_A_STRING_VALUE = 0x2 + ETHTOOL_A_STRING_MAX = 0x2 + ETHTOOL_A_STRINGS_UNSPEC = 0x0 + ETHTOOL_A_STRINGS_STRING = 0x1 + ETHTOOL_A_STRINGS_MAX = 0x1 + ETHTOOL_A_STRINGSET_UNSPEC = 0x0 + ETHTOOL_A_STRINGSET_ID = 0x1 + ETHTOOL_A_STRINGSET_COUNT = 0x2 + ETHTOOL_A_STRINGSET_STRINGS = 0x3 + ETHTOOL_A_STRINGSET_MAX = 0x3 + ETHTOOL_A_STRINGSETS_UNSPEC = 0x0 + ETHTOOL_A_STRINGSETS_STRINGSET = 0x1 + ETHTOOL_A_STRINGSETS_MAX = 0x1 + ETHTOOL_A_STRSET_UNSPEC = 0x0 + ETHTOOL_A_STRSET_HEADER = 0x1 + ETHTOOL_A_STRSET_STRINGSETS = 0x2 + ETHTOOL_A_STRSET_COUNTS_ONLY = 0x3 + ETHTOOL_A_STRSET_MAX = 0x3 + ETHTOOL_A_LINKINFO_UNSPEC = 0x0 + ETHTOOL_A_LINKINFO_HEADER = 0x1 + ETHTOOL_A_LINKINFO_PORT = 0x2 + ETHTOOL_A_LINKINFO_PHYADDR = 0x3 + ETHTOOL_A_LINKINFO_TP_MDIX = 0x4 + ETHTOOL_A_LINKINFO_TP_MDIX_CTRL = 0x5 + ETHTOOL_A_LINKINFO_TRANSCEIVER = 0x6 + ETHTOOL_A_LINKINFO_MAX = 0x6 + ETHTOOL_A_LINKMODES_UNSPEC = 0x0 + ETHTOOL_A_LINKMODES_HEADER = 0x1 + ETHTOOL_A_LINKMODES_AUTONEG = 0x2 + ETHTOOL_A_LINKMODES_OURS = 0x3 + ETHTOOL_A_LINKMODES_PEER = 0x4 + ETHTOOL_A_LINKMODES_SPEED = 0x5 + ETHTOOL_A_LINKMODES_DUPLEX = 0x6 + ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG = 0x7 + ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE = 0x8 + ETHTOOL_A_LINKMODES_MAX = 0x8 + ETHTOOL_A_LINKSTATE_UNSPEC = 0x0 + ETHTOOL_A_LINKSTATE_HEADER = 0x1 + ETHTOOL_A_LINKSTATE_LINK = 0x2 + ETHTOOL_A_LINKSTATE_SQI = 0x3 + ETHTOOL_A_LINKSTATE_SQI_MAX = 0x4 + ETHTOOL_A_LINKSTATE_EXT_STATE = 0x5 + ETHTOOL_A_LINKSTATE_EXT_SUBSTATE = 0x6 + ETHTOOL_A_LINKSTATE_MAX = 0x6 + ETHTOOL_A_DEBUG_UNSPEC = 0x0 + ETHTOOL_A_DEBUG_HEADER = 0x1 + ETHTOOL_A_DEBUG_MSGMASK = 0x2 + ETHTOOL_A_DEBUG_MAX = 0x2 + ETHTOOL_A_WOL_UNSPEC = 0x0 + ETHTOOL_A_WOL_HEADER = 0x1 + ETHTOOL_A_WOL_MODES = 0x2 + ETHTOOL_A_WOL_SOPASS = 0x3 + ETHTOOL_A_WOL_MAX = 0x3 + ETHTOOL_A_FEATURES_UNSPEC = 0x0 + ETHTOOL_A_FEATURES_HEADER = 0x1 + ETHTOOL_A_FEATURES_HW = 0x2 + ETHTOOL_A_FEATURES_WANTED = 0x3 + ETHTOOL_A_FEATURES_ACTIVE = 0x4 + ETHTOOL_A_FEATURES_NOCHANGE = 0x5 + ETHTOOL_A_FEATURES_MAX = 0x5 + ETHTOOL_A_PRIVFLAGS_UNSPEC = 0x0 + ETHTOOL_A_PRIVFLAGS_HEADER = 0x1 + ETHTOOL_A_PRIVFLAGS_FLAGS = 0x2 + ETHTOOL_A_PRIVFLAGS_MAX = 0x2 + ETHTOOL_A_RINGS_UNSPEC = 0x0 + ETHTOOL_A_RINGS_HEADER = 0x1 + ETHTOOL_A_RINGS_RX_MAX = 0x2 + ETHTOOL_A_RINGS_RX_MINI_MAX = 0x3 + ETHTOOL_A_RINGS_RX_JUMBO_MAX = 0x4 + ETHTOOL_A_RINGS_TX_MAX = 0x5 + ETHTOOL_A_RINGS_RX = 0x6 + ETHTOOL_A_RINGS_RX_MINI = 0x7 + ETHTOOL_A_RINGS_RX_JUMBO = 0x8 + ETHTOOL_A_RINGS_TX = 0x9 + ETHTOOL_A_RINGS_MAX = 0x9 + ETHTOOL_A_CHANNELS_UNSPEC = 0x0 + ETHTOOL_A_CHANNELS_HEADER = 0x1 + ETHTOOL_A_CHANNELS_RX_MAX = 0x2 + ETHTOOL_A_CHANNELS_TX_MAX = 0x3 + ETHTOOL_A_CHANNELS_OTHER_MAX = 0x4 + ETHTOOL_A_CHANNELS_COMBINED_MAX = 0x5 + ETHTOOL_A_CHANNELS_RX_COUNT = 0x6 + ETHTOOL_A_CHANNELS_TX_COUNT = 0x7 + ETHTOOL_A_CHANNELS_OTHER_COUNT = 0x8 + ETHTOOL_A_CHANNELS_COMBINED_COUNT = 0x9 + ETHTOOL_A_CHANNELS_MAX = 0x9 + ETHTOOL_A_COALESCE_UNSPEC = 0x0 + ETHTOOL_A_COALESCE_HEADER = 0x1 + ETHTOOL_A_COALESCE_RX_USECS = 0x2 + ETHTOOL_A_COALESCE_RX_MAX_FRAMES = 0x3 + ETHTOOL_A_COALESCE_RX_USECS_IRQ = 0x4 + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_IRQ = 0x5 + ETHTOOL_A_COALESCE_TX_USECS = 0x6 + ETHTOOL_A_COALESCE_TX_MAX_FRAMES = 0x7 + ETHTOOL_A_COALESCE_TX_USECS_IRQ = 0x8 + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_IRQ = 0x9 + ETHTOOL_A_COALESCE_STATS_BLOCK_USECS = 0xa + ETHTOOL_A_COALESCE_USE_ADAPTIVE_RX = 0xb + ETHTOOL_A_COALESCE_USE_ADAPTIVE_TX = 0xc + ETHTOOL_A_COALESCE_PKT_RATE_LOW = 0xd + ETHTOOL_A_COALESCE_RX_USECS_LOW = 0xe + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_LOW = 0xf + ETHTOOL_A_COALESCE_TX_USECS_LOW = 0x10 + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_LOW = 0x11 + ETHTOOL_A_COALESCE_PKT_RATE_HIGH = 0x12 + ETHTOOL_A_COALESCE_RX_USECS_HIGH = 0x13 + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_HIGH = 0x14 + ETHTOOL_A_COALESCE_TX_USECS_HIGH = 0x15 + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH = 0x16 + ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL = 0x17 + ETHTOOL_A_COALESCE_MAX = 0x17 + ETHTOOL_A_PAUSE_UNSPEC = 0x0 + ETHTOOL_A_PAUSE_HEADER = 0x1 + ETHTOOL_A_PAUSE_AUTONEG = 0x2 + ETHTOOL_A_PAUSE_RX = 0x3 + ETHTOOL_A_PAUSE_TX = 0x4 + ETHTOOL_A_PAUSE_STATS = 0x5 + ETHTOOL_A_PAUSE_MAX = 0x5 + ETHTOOL_A_PAUSE_STAT_UNSPEC = 0x0 + ETHTOOL_A_PAUSE_STAT_PAD = 0x1 + ETHTOOL_A_PAUSE_STAT_TX_FRAMES = 0x2 + ETHTOOL_A_PAUSE_STAT_RX_FRAMES = 0x3 + ETHTOOL_A_PAUSE_STAT_MAX = 0x3 + ETHTOOL_A_EEE_UNSPEC = 0x0 + ETHTOOL_A_EEE_HEADER = 0x1 + ETHTOOL_A_EEE_MODES_OURS = 0x2 + ETHTOOL_A_EEE_MODES_PEER = 0x3 + ETHTOOL_A_EEE_ACTIVE = 0x4 + ETHTOOL_A_EEE_ENABLED = 0x5 + ETHTOOL_A_EEE_TX_LPI_ENABLED = 0x6 + ETHTOOL_A_EEE_TX_LPI_TIMER = 0x7 + ETHTOOL_A_EEE_MAX = 0x7 + ETHTOOL_A_TSINFO_UNSPEC = 0x0 + ETHTOOL_A_TSINFO_HEADER = 0x1 + ETHTOOL_A_TSINFO_TIMESTAMPING = 0x2 + ETHTOOL_A_TSINFO_TX_TYPES = 0x3 + ETHTOOL_A_TSINFO_RX_FILTERS = 0x4 + ETHTOOL_A_TSINFO_PHC_INDEX = 0x5 + ETHTOOL_A_TSINFO_MAX = 0x5 + ETHTOOL_A_CABLE_TEST_UNSPEC = 0x0 + ETHTOOL_A_CABLE_TEST_HEADER = 0x1 + ETHTOOL_A_CABLE_TEST_MAX = 0x1 + ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC = 0x0 + ETHTOOL_A_CABLE_RESULT_CODE_OK = 0x1 + ETHTOOL_A_CABLE_RESULT_CODE_OPEN = 0x2 + ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT = 0x3 + ETHTOOL_A_CABLE_RESULT_CODE_CROSS_SHORT = 0x4 + ETHTOOL_A_CABLE_PAIR_A = 0x0 + ETHTOOL_A_CABLE_PAIR_B = 0x1 + ETHTOOL_A_CABLE_PAIR_C = 0x2 + ETHTOOL_A_CABLE_PAIR_D = 0x3 + ETHTOOL_A_CABLE_RESULT_UNSPEC = 0x0 + ETHTOOL_A_CABLE_RESULT_PAIR = 0x1 + ETHTOOL_A_CABLE_RESULT_CODE = 0x2 + ETHTOOL_A_CABLE_RESULT_MAX = 0x2 + ETHTOOL_A_CABLE_FAULT_LENGTH_UNSPEC = 0x0 + ETHTOOL_A_CABLE_FAULT_LENGTH_PAIR = 0x1 + ETHTOOL_A_CABLE_FAULT_LENGTH_CM = 0x2 + ETHTOOL_A_CABLE_FAULT_LENGTH_MAX = 0x2 + ETHTOOL_A_CABLE_TEST_NTF_STATUS_UNSPEC = 0x0 + ETHTOOL_A_CABLE_TEST_NTF_STATUS_STARTED = 0x1 + ETHTOOL_A_CABLE_TEST_NTF_STATUS_COMPLETED = 0x2 + ETHTOOL_A_CABLE_NEST_UNSPEC = 0x0 + ETHTOOL_A_CABLE_NEST_RESULT = 0x1 + ETHTOOL_A_CABLE_NEST_FAULT_LENGTH = 0x2 + ETHTOOL_A_CABLE_NEST_MAX = 0x2 + ETHTOOL_A_CABLE_TEST_NTF_UNSPEC = 0x0 + ETHTOOL_A_CABLE_TEST_NTF_HEADER = 0x1 + ETHTOOL_A_CABLE_TEST_NTF_STATUS = 0x2 + ETHTOOL_A_CABLE_TEST_NTF_NEST = 0x3 + ETHTOOL_A_CABLE_TEST_NTF_MAX = 0x3 + ETHTOOL_A_CABLE_TEST_TDR_CFG_UNSPEC = 0x0 + ETHTOOL_A_CABLE_TEST_TDR_CFG_FIRST = 0x1 + ETHTOOL_A_CABLE_TEST_TDR_CFG_LAST = 0x2 + ETHTOOL_A_CABLE_TEST_TDR_CFG_STEP = 0x3 + ETHTOOL_A_CABLE_TEST_TDR_CFG_PAIR = 0x4 + ETHTOOL_A_CABLE_TEST_TDR_CFG_MAX = 0x4 + ETHTOOL_A_CABLE_TEST_TDR_UNSPEC = 0x0 + ETHTOOL_A_CABLE_TEST_TDR_HEADER = 0x1 + ETHTOOL_A_CABLE_TEST_TDR_CFG = 0x2 + ETHTOOL_A_CABLE_TEST_TDR_MAX = 0x2 + ETHTOOL_A_CABLE_AMPLITUDE_UNSPEC = 0x0 + ETHTOOL_A_CABLE_AMPLITUDE_PAIR = 0x1 + ETHTOOL_A_CABLE_AMPLITUDE_mV = 0x2 + ETHTOOL_A_CABLE_AMPLITUDE_MAX = 0x2 + ETHTOOL_A_CABLE_PULSE_UNSPEC = 0x0 + ETHTOOL_A_CABLE_PULSE_mV = 0x1 + ETHTOOL_A_CABLE_PULSE_MAX = 0x1 + ETHTOOL_A_CABLE_STEP_UNSPEC = 0x0 + ETHTOOL_A_CABLE_STEP_FIRST_DISTANCE = 0x1 + ETHTOOL_A_CABLE_STEP_LAST_DISTANCE = 0x2 + ETHTOOL_A_CABLE_STEP_STEP_DISTANCE = 0x3 + ETHTOOL_A_CABLE_STEP_MAX = 0x3 + ETHTOOL_A_CABLE_TDR_NEST_UNSPEC = 0x0 + ETHTOOL_A_CABLE_TDR_NEST_STEP = 0x1 + ETHTOOL_A_CABLE_TDR_NEST_AMPLITUDE = 0x2 + ETHTOOL_A_CABLE_TDR_NEST_PULSE = 0x3 + ETHTOOL_A_CABLE_TDR_NEST_MAX = 0x3 + ETHTOOL_A_CABLE_TEST_TDR_NTF_UNSPEC = 0x0 + ETHTOOL_A_CABLE_TEST_TDR_NTF_HEADER = 0x1 + ETHTOOL_A_CABLE_TEST_TDR_NTF_STATUS = 0x2 + ETHTOOL_A_CABLE_TEST_TDR_NTF_NEST = 0x3 + ETHTOOL_A_CABLE_TEST_TDR_NTF_MAX = 0x3 + ETHTOOL_UDP_TUNNEL_TYPE_VXLAN = 0x0 + ETHTOOL_UDP_TUNNEL_TYPE_GENEVE = 0x1 + ETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE = 0x2 + ETHTOOL_A_TUNNEL_UDP_ENTRY_UNSPEC = 0x0 + ETHTOOL_A_TUNNEL_UDP_ENTRY_PORT = 0x1 + ETHTOOL_A_TUNNEL_UDP_ENTRY_TYPE = 0x2 + ETHTOOL_A_TUNNEL_UDP_ENTRY_MAX = 0x2 + ETHTOOL_A_TUNNEL_UDP_TABLE_UNSPEC = 0x0 + ETHTOOL_A_TUNNEL_UDP_TABLE_SIZE = 0x1 + ETHTOOL_A_TUNNEL_UDP_TABLE_TYPES = 0x2 + ETHTOOL_A_TUNNEL_UDP_TABLE_ENTRY = 0x3 + ETHTOOL_A_TUNNEL_UDP_TABLE_MAX = 0x3 + ETHTOOL_A_TUNNEL_UDP_UNSPEC = 0x0 + ETHTOOL_A_TUNNEL_UDP_TABLE = 0x1 + ETHTOOL_A_TUNNEL_UDP_MAX = 0x1 + ETHTOOL_A_TUNNEL_INFO_UNSPEC = 0x0 + ETHTOOL_A_TUNNEL_INFO_HEADER = 0x1 + ETHTOOL_A_TUNNEL_INFO_UDP_PORTS = 0x2 + ETHTOOL_A_TUNNEL_INFO_MAX = 0x2 +) From 489259a85091f60ac24636e6f0eeda70f530a981 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Mon, 11 Jan 2021 16:21:51 +0100 Subject: [PATCH 05/18] unix: add Pipe2 for solaris We already implement Pipe2 for illumos and it seems solaris provides the pipe2 syscall as well, see https://docs.oracle.com/cd/E88353_01/html/E37841/pipe2-2.html. Fixes golang/go#40613 Change-Id: I135cb1e78e6c67567d30d7eed266d00ef8fd6c3a Reviewed-on: https://go-review.googlesource.com/c/sys/+/283032 Trust: Tobias Klauser Run-TryBot: Tobias Klauser TryBot-Result: Go Bot Reviewed-by: Matt Layher --- unix/syscall_illumos.go | 13 ----------- unix/syscall_solaris.go | 13 +++++++++++ unix/syscall_solaris_test.go | 42 ++++++++++++++++++++++++++++++++++ unix/zsyscall_illumos_amd64.go | 15 +----------- unix/zsyscall_solaris_amd64.go | 13 +++++++++++ 5 files changed, 69 insertions(+), 27 deletions(-) diff --git a/unix/syscall_illumos.go b/unix/syscall_illumos.go index bbc4f3ea..7a2d4120 100644 --- a/unix/syscall_illumos.go +++ b/unix/syscall_illumos.go @@ -75,16 +75,3 @@ func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) { } return } - -//sysnb pipe2(p *[2]_C_int, flags int) (err error) - -func Pipe2(p []int, flags int) error { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err := pipe2(&pp, flags) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return err -} diff --git a/unix/syscall_solaris.go b/unix/syscall_solaris.go index fee6e995..184786ed 100644 --- a/unix/syscall_solaris.go +++ b/unix/syscall_solaris.go @@ -68,6 +68,19 @@ func Pipe(p []int) (err error) { return nil } +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) error { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err := pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return err +} + func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { if sa.Port < 0 || sa.Port > 0xFFFF { return nil, 0, EINVAL diff --git a/unix/syscall_solaris_test.go b/unix/syscall_solaris_test.go index d3e7d2b2..ae2c40c5 100644 --- a/unix/syscall_solaris_test.go +++ b/unix/syscall_solaris_test.go @@ -13,6 +13,48 @@ import ( "golang.org/x/sys/unix" ) +func TestPipe2(t *testing.T) { + const s = "hello" + var pipes [2]int + err := unix.Pipe2(pipes[:], 0) + if err != nil { + t.Fatalf("pipe2: %v", err) + } + r := pipes[0] + w := pipes[1] + go func() { + n, err := unix.Write(w, []byte(s)) + if err != nil { + t.Errorf("bad write: %v", err) + return + } + if n != len(s) { + t.Errorf("bad write count: %d", n) + return + } + err = unix.Close(w) + if err != nil { + t.Errorf("bad close: %v", err) + return + } + }() + var buf [10 + len(s)]byte + n, err := unix.Read(r, buf[:]) + if err != nil { + t.Fatalf("bad read: %v", err) + } + if n != len(s) { + t.Fatalf("bad read count: %d", n) + } + if string(buf[:n]) != s { + t.Fatalf("bad contents: %s", string(buf[:n])) + } + err = unix.Close(r) + if err != nil { + t.Fatalf("bad close: %v", err) + } +} + func TestStatvfs(t *testing.T) { if err := unix.Statvfs("", nil); err == nil { t.Fatal(`Statvfs("") expected failure`) diff --git a/unix/zsyscall_illumos_amd64.go b/unix/zsyscall_illumos_amd64.go index d3af083f..665dd9e4 100644 --- a/unix/zsyscall_illumos_amd64.go +++ b/unix/zsyscall_illumos_amd64.go @@ -14,22 +14,19 @@ import ( //go:cgo_import_dynamic libc_writev writev "libc.so" //go:cgo_import_dynamic libc_pwritev pwritev "libc.so" //go:cgo_import_dynamic libc_accept4 accept4 "libsocket.so" -//go:cgo_import_dynamic libc_pipe2 pipe2 "libc.so" //go:linkname procreadv libc_readv //go:linkname procpreadv libc_preadv //go:linkname procwritev libc_writev //go:linkname procpwritev libc_pwritev //go:linkname procaccept4 libc_accept4 -//go:linkname procpipe2 libc_pipe2 var ( procreadv, procpreadv, procwritev, procpwritev, - procaccept4, - procpipe2 syscallFunc + procaccept4 syscallFunc ) // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -102,13 +99,3 @@ func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, } return } - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func pipe2(p *[2]_C_int, flags int) (err error) { - _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procpipe2)), 2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0, 0, 0, 0) - if e1 != 0 { - err = e1 - } - return -} diff --git a/unix/zsyscall_solaris_amd64.go b/unix/zsyscall_solaris_amd64.go index a96165d4..6dbb8371 100644 --- a/unix/zsyscall_solaris_amd64.go +++ b/unix/zsyscall_solaris_amd64.go @@ -11,6 +11,7 @@ import ( ) //go:cgo_import_dynamic libc_pipe pipe "libc.so" +//go:cgo_import_dynamic libc_pipe2 pipe2 "libc.so" //go:cgo_import_dynamic libc_getsockname getsockname "libsocket.so" //go:cgo_import_dynamic libc_getcwd getcwd "libc.so" //go:cgo_import_dynamic libc_getgroups getgroups "libc.so" @@ -140,6 +141,7 @@ import ( //go:cgo_import_dynamic libc_recvfrom recvfrom "libsocket.so" //go:linkname procpipe libc_pipe +//go:linkname procpipe2 libc_pipe2 //go:linkname procgetsockname libc_getsockname //go:linkname procGetcwd libc_getcwd //go:linkname procgetgroups libc_getgroups @@ -270,6 +272,7 @@ import ( var ( procpipe, + procpipe2, procgetsockname, procGetcwd, procgetgroups, @@ -412,6 +415,16 @@ func pipe(p *[2]_C_int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procpipe2)), 2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetsockname)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) if e1 != 0 { From 59c308dcf3cce479e66405f7f4ed446c39cbe82d Mon Sep 17 00:00:00 2001 From: Alex Brainman Date: Mon, 11 Jan 2021 16:46:25 +1100 Subject: [PATCH 06/18] windows: use HWND type in MessageBox, GetShellWindow and GetWindowThreadProcessId This matches usual win32api conventions. While we're at it, we group together user32.dll functions together. This CL was based on CL 282634 with all but MessageBox, GetShellWindow and GetWindowThreadProcessId changes removed to prevent compatibility break. Change-Id: I7e17c581723c41580a49c5612cabc7a5c13c0f15 Reviewed-on: https://go-review.googlesource.com/c/sys/+/282972 Run-TryBot: Alex Brainman TryBot-Result: Go Bot Reviewed-by: Brad Fitzpatrick Trust: Alex Brainman --- windows/syscall_windows.go | 9 +++++---- windows/zsyscall_windows.go | 10 +++++----- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/windows/syscall_windows.go b/windows/syscall_windows.go index 38344590..d249919c 100644 --- a/windows/syscall_windows.go +++ b/windows/syscall_windows.go @@ -18,6 +18,7 @@ import ( ) type Handle uintptr +type HWND uintptr const ( InvalidHandle = ^Handle(0) @@ -213,9 +214,11 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys CancelIoEx(s Handle, o *Overlapped) (err error) //sys CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW //sys OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) (handle Handle, err error) -//sys GetWindowThreadProcessId(wnd uintptr, pid *uint32) (tid uint32) = user32.GetWindowThreadProcessId -//sys GetShellWindow() (desktopWindow uintptr) = user32.GetShellWindow //sys ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int32) (err error) [failretval<=32] = shell32.ShellExecuteW +//sys GetWindowThreadProcessId(hwnd HWND, pid *uint32) (tid uint32) = user32.GetWindowThreadProcessId +//sys GetShellWindow() (shellWindow HWND) = user32.GetShellWindow +//sys MessageBox(hwnd HWND, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) [failretval==0] = user32.MessageBoxW +//sys ExitWindowsEx(flags uint32, reason uint32) (err error) = user32.ExitWindowsEx //sys shGetKnownFolderPath(id *KNOWNFOLDERID, flags uint32, token Token, path **uint16) (ret error) = shell32.SHGetKnownFolderPath //sys TerminateProcess(handle Handle, exitcode uint32) (err error) //sys GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) @@ -346,8 +349,6 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys QueryDosDevice(deviceName *uint16, targetPath *uint16, max uint32) (n uint32, err error) [failretval==0] = QueryDosDeviceW //sys SetVolumeLabel(rootPathName *uint16, volumeName *uint16) (err error) = SetVolumeLabelW //sys SetVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16) (err error) = SetVolumeMountPointW -//sys MessageBox(hwnd Handle, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) [failretval==0] = user32.MessageBoxW -//sys ExitWindowsEx(flags uint32, reason uint32) (err error) = user32.ExitWindowsEx //sys InitiateSystemShutdownEx(machineName *uint16, message *uint16, timeout uint32, forceAppsClosed bool, rebootAfterShutdown bool, reason uint32) (err error) = advapi32.InitiateSystemShutdownExW //sys SetProcessShutdownParameters(level uint32, flags uint32) (err error) = kernel32.SetProcessShutdownParameters //sys GetProcessShutdownParameters(level *uint32, flags *uint32) (err error) = kernel32.GetProcessShutdownParameters diff --git a/windows/zsyscall_windows.go b/windows/zsyscall_windows.go index 06273735..cd5e8528 100644 --- a/windows/zsyscall_windows.go +++ b/windows/zsyscall_windows.go @@ -2898,19 +2898,19 @@ func ExitWindowsEx(flags uint32, reason uint32) (err error) { return } -func GetShellWindow() (desktopWindow uintptr) { +func GetShellWindow() (shellWindow HWND) { r0, _, _ := syscall.Syscall(procGetShellWindow.Addr(), 0, 0, 0, 0) - desktopWindow = uintptr(r0) + shellWindow = HWND(r0) return } -func GetWindowThreadProcessId(wnd uintptr, pid *uint32) (tid uint32) { - r0, _, _ := syscall.Syscall(procGetWindowThreadProcessId.Addr(), 2, uintptr(wnd), uintptr(unsafe.Pointer(pid)), 0) +func GetWindowThreadProcessId(hwnd HWND, pid *uint32) (tid uint32) { + r0, _, _ := syscall.Syscall(procGetWindowThreadProcessId.Addr(), 2, uintptr(hwnd), uintptr(unsafe.Pointer(pid)), 0) tid = uint32(r0) return } -func MessageBox(hwnd Handle, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) { +func MessageBox(hwnd HWND, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) { r0, _, e1 := syscall.Syscall6(procMessageBoxW.Addr(), 4, uintptr(hwnd), uintptr(unsafe.Pointer(text)), uintptr(unsafe.Pointer(caption)), uintptr(boxtype), 0, 0) ret = int32(r0) if ret == 0 { From eaf3bda374d2a980e9df5f177688797b217716b9 Mon Sep 17 00:00:00 2001 From: Matt Layher Date: Tue, 12 Jan 2021 17:58:51 -0500 Subject: [PATCH 07/18] unix: add ethtool constants for Linux The ethtool generic netlink interface also uses these constants in addition to the ones I previously added. For more information about this interface, see: https://www.kernel.org/doc/html/latest/networking/ethtool-netlink.html. Change-Id: I8861e5faa23bfc0179725314fc5a528486e328b2 Reviewed-on: https://go-review.googlesource.com/c/sys/+/283413 Trust: Matt Layher Run-TryBot: Matt Layher TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor --- unix/linux/types.go | 155 +++++++++++++++++++++++++++++++++++++++++- unix/zerrors_linux.go | 1 - unix/ztypes_linux.go | 151 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 305 insertions(+), 2 deletions(-) diff --git a/unix/linux/types.go b/unix/linux/types.go index b5aad83c..3e5f1ead 100644 --- a/unix/linux/types.go +++ b/unix/linux/types.go @@ -88,6 +88,7 @@ struct termios2 { #include #include #include +#include #include #include #include @@ -3168,12 +3169,164 @@ const ( MPLS_IPTUNNEL_MAX = C.MPLS_IPTUNNEL_MAX ) -// ethtool netlink interface, generated using: +// ethtool and its netlink interface, generated using: +// +// perl -nlE '/^\s*(ETHTOOL_\w+)/ && say "$1 = C.$1"' ethtool.h // perl -nlE '/^\s*(ETHTOOL_\w+)/ && say "$1 = C.$1"' ethtool_netlink.h // // Note that a couple of constants produced by this command will be duplicated // by mkerrors.sh, so some manual pruning was necessary. const ( + ETHTOOL_ID_UNSPEC = C.ETHTOOL_ID_UNSPEC + ETHTOOL_RX_COPYBREAK = C.ETHTOOL_RX_COPYBREAK + ETHTOOL_TX_COPYBREAK = C.ETHTOOL_TX_COPYBREAK + ETHTOOL_PFC_PREVENTION_TOUT = C.ETHTOOL_PFC_PREVENTION_TOUT + ETHTOOL_TUNABLE_UNSPEC = C.ETHTOOL_TUNABLE_UNSPEC + ETHTOOL_TUNABLE_U8 = C.ETHTOOL_TUNABLE_U8 + ETHTOOL_TUNABLE_U16 = C.ETHTOOL_TUNABLE_U16 + ETHTOOL_TUNABLE_U32 = C.ETHTOOL_TUNABLE_U32 + ETHTOOL_TUNABLE_U64 = C.ETHTOOL_TUNABLE_U64 + ETHTOOL_TUNABLE_STRING = C.ETHTOOL_TUNABLE_STRING + ETHTOOL_TUNABLE_S8 = C.ETHTOOL_TUNABLE_S8 + ETHTOOL_TUNABLE_S16 = C.ETHTOOL_TUNABLE_S16 + ETHTOOL_TUNABLE_S32 = C.ETHTOOL_TUNABLE_S32 + ETHTOOL_TUNABLE_S64 = C.ETHTOOL_TUNABLE_S64 + ETHTOOL_PHY_ID_UNSPEC = C.ETHTOOL_PHY_ID_UNSPEC + ETHTOOL_PHY_DOWNSHIFT = C.ETHTOOL_PHY_DOWNSHIFT + ETHTOOL_PHY_FAST_LINK_DOWN = C.ETHTOOL_PHY_FAST_LINK_DOWN + ETHTOOL_PHY_EDPD = C.ETHTOOL_PHY_EDPD + ETHTOOL_LINK_EXT_STATE_AUTONEG = C.ETHTOOL_LINK_EXT_STATE_AUTONEG + ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE = C.ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE + ETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH = C.ETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH + ETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY = C.ETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY + ETHTOOL_LINK_EXT_STATE_NO_CABLE = C.ETHTOOL_LINK_EXT_STATE_NO_CABLE + ETHTOOL_LINK_EXT_STATE_CABLE_ISSUE = C.ETHTOOL_LINK_EXT_STATE_CABLE_ISSUE + ETHTOOL_LINK_EXT_STATE_EEPROM_ISSUE = C.ETHTOOL_LINK_EXT_STATE_EEPROM_ISSUE + ETHTOOL_LINK_EXT_STATE_CALIBRATION_FAILURE = C.ETHTOOL_LINK_EXT_STATE_CALIBRATION_FAILURE + ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED = C.ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED + ETHTOOL_LINK_EXT_STATE_OVERHEAT = C.ETHTOOL_LINK_EXT_STATE_OVERHEAT + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED = C.ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED + ETHTOOL_LINK_EXT_SUBSTATE_AN_ACK_NOT_RECEIVED = C.ETHTOOL_LINK_EXT_SUBSTATE_AN_ACK_NOT_RECEIVED + ETHTOOL_LINK_EXT_SUBSTATE_AN_NEXT_PAGE_EXCHANGE_FAILED = C.ETHTOOL_LINK_EXT_SUBSTATE_AN_NEXT_PAGE_EXCHANGE_FAILED + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED_FORCE_MODE = C.ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED_FORCE_MODE + ETHTOOL_LINK_EXT_SUBSTATE_AN_FEC_MISMATCH_DURING_OVERRIDE = C.ETHTOOL_LINK_EXT_SUBSTATE_AN_FEC_MISMATCH_DURING_OVERRIDE + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_HCD = C.ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_HCD + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_FRAME_LOCK_NOT_ACQUIRED = C.ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_FRAME_LOCK_NOT_ACQUIRED + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_INHIBIT_TIMEOUT = C.ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_INHIBIT_TIMEOUT + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_PARTNER_DID_NOT_SET_RECEIVER_READY = C.ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_PARTNER_DID_NOT_SET_RECEIVER_READY + ETHTOOL_LINK_EXT_SUBSTATE_LT_REMOTE_FAULT = C.ETHTOOL_LINK_EXT_SUBSTATE_LT_REMOTE_FAULT + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_BLOCK_LOCK = C.ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_BLOCK_LOCK + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_AM_LOCK = C.ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_AM_LOCK + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_GET_ALIGN_STATUS = C.ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_GET_ALIGN_STATUS + ETHTOOL_LINK_EXT_SUBSTATE_LLM_FC_FEC_IS_NOT_LOCKED = C.ETHTOOL_LINK_EXT_SUBSTATE_LLM_FC_FEC_IS_NOT_LOCKED + ETHTOOL_LINK_EXT_SUBSTATE_LLM_RS_FEC_IS_NOT_LOCKED = C.ETHTOOL_LINK_EXT_SUBSTATE_LLM_RS_FEC_IS_NOT_LOCKED + ETHTOOL_LINK_EXT_SUBSTATE_BSI_LARGE_NUMBER_OF_PHYSICAL_ERRORS = C.ETHTOOL_LINK_EXT_SUBSTATE_BSI_LARGE_NUMBER_OF_PHYSICAL_ERRORS + ETHTOOL_LINK_EXT_SUBSTATE_BSI_UNSUPPORTED_RATE = C.ETHTOOL_LINK_EXT_SUBSTATE_BSI_UNSUPPORTED_RATE + ETHTOOL_LINK_EXT_SUBSTATE_CI_UNSUPPORTED_CABLE = C.ETHTOOL_LINK_EXT_SUBSTATE_CI_UNSUPPORTED_CABLE + ETHTOOL_LINK_EXT_SUBSTATE_CI_CABLE_TEST_FAILURE = C.ETHTOOL_LINK_EXT_SUBSTATE_CI_CABLE_TEST_FAILURE + ETHTOOL_FLASH_ALL_REGIONS = C.ETHTOOL_FLASH_ALL_REGIONS + ETHTOOL_F_UNSUPPORTED__BIT = C.ETHTOOL_F_UNSUPPORTED__BIT + ETHTOOL_F_WISH__BIT = C.ETHTOOL_F_WISH__BIT + ETHTOOL_F_COMPAT__BIT = C.ETHTOOL_F_COMPAT__BIT + ETHTOOL_FEC_NONE_BIT = C.ETHTOOL_FEC_NONE_BIT + ETHTOOL_FEC_AUTO_BIT = C.ETHTOOL_FEC_AUTO_BIT + ETHTOOL_FEC_OFF_BIT = C.ETHTOOL_FEC_OFF_BIT + ETHTOOL_FEC_RS_BIT = C.ETHTOOL_FEC_RS_BIT + ETHTOOL_FEC_BASER_BIT = C.ETHTOOL_FEC_BASER_BIT + ETHTOOL_FEC_LLRS_BIT = C.ETHTOOL_FEC_LLRS_BIT + ETHTOOL_LINK_MODE_10baseT_Half_BIT = C.ETHTOOL_LINK_MODE_10baseT_Half_BIT + ETHTOOL_LINK_MODE_10baseT_Full_BIT = C.ETHTOOL_LINK_MODE_10baseT_Full_BIT + ETHTOOL_LINK_MODE_100baseT_Half_BIT = C.ETHTOOL_LINK_MODE_100baseT_Half_BIT + ETHTOOL_LINK_MODE_100baseT_Full_BIT = C.ETHTOOL_LINK_MODE_100baseT_Full_BIT + ETHTOOL_LINK_MODE_1000baseT_Half_BIT = C.ETHTOOL_LINK_MODE_1000baseT_Half_BIT + ETHTOOL_LINK_MODE_1000baseT_Full_BIT = C.ETHTOOL_LINK_MODE_1000baseT_Full_BIT + ETHTOOL_LINK_MODE_Autoneg_BIT = C.ETHTOOL_LINK_MODE_Autoneg_BIT + ETHTOOL_LINK_MODE_TP_BIT = C.ETHTOOL_LINK_MODE_TP_BIT + ETHTOOL_LINK_MODE_AUI_BIT = C.ETHTOOL_LINK_MODE_AUI_BIT + ETHTOOL_LINK_MODE_MII_BIT = C.ETHTOOL_LINK_MODE_MII_BIT + ETHTOOL_LINK_MODE_FIBRE_BIT = C.ETHTOOL_LINK_MODE_FIBRE_BIT + ETHTOOL_LINK_MODE_BNC_BIT = C.ETHTOOL_LINK_MODE_BNC_BIT + ETHTOOL_LINK_MODE_10000baseT_Full_BIT = C.ETHTOOL_LINK_MODE_10000baseT_Full_BIT + ETHTOOL_LINK_MODE_Pause_BIT = C.ETHTOOL_LINK_MODE_Pause_BIT + ETHTOOL_LINK_MODE_Asym_Pause_BIT = C.ETHTOOL_LINK_MODE_Asym_Pause_BIT + ETHTOOL_LINK_MODE_2500baseX_Full_BIT = C.ETHTOOL_LINK_MODE_2500baseX_Full_BIT + ETHTOOL_LINK_MODE_Backplane_BIT = C.ETHTOOL_LINK_MODE_Backplane_BIT + ETHTOOL_LINK_MODE_1000baseKX_Full_BIT = C.ETHTOOL_LINK_MODE_1000baseKX_Full_BIT + ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT = C.ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT + ETHTOOL_LINK_MODE_10000baseKR_Full_BIT = C.ETHTOOL_LINK_MODE_10000baseKR_Full_BIT + ETHTOOL_LINK_MODE_10000baseR_FEC_BIT = C.ETHTOOL_LINK_MODE_10000baseR_FEC_BIT + ETHTOOL_LINK_MODE_20000baseMLD2_Full_BIT = C.ETHTOOL_LINK_MODE_20000baseMLD2_Full_BIT + ETHTOOL_LINK_MODE_20000baseKR2_Full_BIT = C.ETHTOOL_LINK_MODE_20000baseKR2_Full_BIT + ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT = C.ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT + ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT = C.ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT + ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT = C.ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT + ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT = C.ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT + ETHTOOL_LINK_MODE_56000baseKR4_Full_BIT = C.ETHTOOL_LINK_MODE_56000baseKR4_Full_BIT + ETHTOOL_LINK_MODE_56000baseCR4_Full_BIT = C.ETHTOOL_LINK_MODE_56000baseCR4_Full_BIT + ETHTOOL_LINK_MODE_56000baseSR4_Full_BIT = C.ETHTOOL_LINK_MODE_56000baseSR4_Full_BIT + ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT = C.ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT + ETHTOOL_LINK_MODE_25000baseCR_Full_BIT = C.ETHTOOL_LINK_MODE_25000baseCR_Full_BIT + ETHTOOL_LINK_MODE_25000baseKR_Full_BIT = C.ETHTOOL_LINK_MODE_25000baseKR_Full_BIT + ETHTOOL_LINK_MODE_25000baseSR_Full_BIT = C.ETHTOOL_LINK_MODE_25000baseSR_Full_BIT + ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT = C.ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT + ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT = C.ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT + ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT = C.ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT + ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT = C.ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT + ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT = C.ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT + ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT = C.ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT + ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT = C.ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT + ETHTOOL_LINK_MODE_1000baseX_Full_BIT = C.ETHTOOL_LINK_MODE_1000baseX_Full_BIT + ETHTOOL_LINK_MODE_10000baseCR_Full_BIT = C.ETHTOOL_LINK_MODE_10000baseCR_Full_BIT + ETHTOOL_LINK_MODE_10000baseSR_Full_BIT = C.ETHTOOL_LINK_MODE_10000baseSR_Full_BIT + ETHTOOL_LINK_MODE_10000baseLR_Full_BIT = C.ETHTOOL_LINK_MODE_10000baseLR_Full_BIT + ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT = C.ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT + ETHTOOL_LINK_MODE_10000baseER_Full_BIT = C.ETHTOOL_LINK_MODE_10000baseER_Full_BIT + ETHTOOL_LINK_MODE_2500baseT_Full_BIT = C.ETHTOOL_LINK_MODE_2500baseT_Full_BIT + ETHTOOL_LINK_MODE_5000baseT_Full_BIT = C.ETHTOOL_LINK_MODE_5000baseT_Full_BIT + ETHTOOL_LINK_MODE_FEC_NONE_BIT = C.ETHTOOL_LINK_MODE_FEC_NONE_BIT + ETHTOOL_LINK_MODE_FEC_RS_BIT = C.ETHTOOL_LINK_MODE_FEC_RS_BIT + ETHTOOL_LINK_MODE_FEC_BASER_BIT = C.ETHTOOL_LINK_MODE_FEC_BASER_BIT + ETHTOOL_LINK_MODE_50000baseKR_Full_BIT = C.ETHTOOL_LINK_MODE_50000baseKR_Full_BIT + ETHTOOL_LINK_MODE_50000baseSR_Full_BIT = C.ETHTOOL_LINK_MODE_50000baseSR_Full_BIT + ETHTOOL_LINK_MODE_50000baseCR_Full_BIT = C.ETHTOOL_LINK_MODE_50000baseCR_Full_BIT + ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT = C.ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT + ETHTOOL_LINK_MODE_50000baseDR_Full_BIT = C.ETHTOOL_LINK_MODE_50000baseDR_Full_BIT + ETHTOOL_LINK_MODE_100000baseKR2_Full_BIT = C.ETHTOOL_LINK_MODE_100000baseKR2_Full_BIT + ETHTOOL_LINK_MODE_100000baseSR2_Full_BIT = C.ETHTOOL_LINK_MODE_100000baseSR2_Full_BIT + ETHTOOL_LINK_MODE_100000baseCR2_Full_BIT = C.ETHTOOL_LINK_MODE_100000baseCR2_Full_BIT + ETHTOOL_LINK_MODE_100000baseLR2_ER2_FR2_Full_BIT = C.ETHTOOL_LINK_MODE_100000baseLR2_ER2_FR2_Full_BIT + ETHTOOL_LINK_MODE_100000baseDR2_Full_BIT = C.ETHTOOL_LINK_MODE_100000baseDR2_Full_BIT + ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT = C.ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT + ETHTOOL_LINK_MODE_200000baseSR4_Full_BIT = C.ETHTOOL_LINK_MODE_200000baseSR4_Full_BIT + ETHTOOL_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT = C.ETHTOOL_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT + ETHTOOL_LINK_MODE_200000baseDR4_Full_BIT = C.ETHTOOL_LINK_MODE_200000baseDR4_Full_BIT + ETHTOOL_LINK_MODE_200000baseCR4_Full_BIT = C.ETHTOOL_LINK_MODE_200000baseCR4_Full_BIT + ETHTOOL_LINK_MODE_100baseT1_Full_BIT = C.ETHTOOL_LINK_MODE_100baseT1_Full_BIT + ETHTOOL_LINK_MODE_1000baseT1_Full_BIT = C.ETHTOOL_LINK_MODE_1000baseT1_Full_BIT + ETHTOOL_LINK_MODE_400000baseKR8_Full_BIT = C.ETHTOOL_LINK_MODE_400000baseKR8_Full_BIT + ETHTOOL_LINK_MODE_400000baseSR8_Full_BIT = C.ETHTOOL_LINK_MODE_400000baseSR8_Full_BIT + ETHTOOL_LINK_MODE_400000baseLR8_ER8_FR8_Full_BIT = C.ETHTOOL_LINK_MODE_400000baseLR8_ER8_FR8_Full_BIT + ETHTOOL_LINK_MODE_400000baseDR8_Full_BIT = C.ETHTOOL_LINK_MODE_400000baseDR8_Full_BIT + ETHTOOL_LINK_MODE_400000baseCR8_Full_BIT = C.ETHTOOL_LINK_MODE_400000baseCR8_Full_BIT + ETHTOOL_LINK_MODE_FEC_LLRS_BIT = C.ETHTOOL_LINK_MODE_FEC_LLRS_BIT + ETHTOOL_LINK_MODE_100000baseKR_Full_BIT = C.ETHTOOL_LINK_MODE_100000baseKR_Full_BIT + ETHTOOL_LINK_MODE_100000baseSR_Full_BIT = C.ETHTOOL_LINK_MODE_100000baseSR_Full_BIT + ETHTOOL_LINK_MODE_100000baseLR_ER_FR_Full_BIT = C.ETHTOOL_LINK_MODE_100000baseLR_ER_FR_Full_BIT + ETHTOOL_LINK_MODE_100000baseCR_Full_BIT = C.ETHTOOL_LINK_MODE_100000baseCR_Full_BIT + ETHTOOL_LINK_MODE_100000baseDR_Full_BIT = C.ETHTOOL_LINK_MODE_100000baseDR_Full_BIT + ETHTOOL_LINK_MODE_200000baseKR2_Full_BIT = C.ETHTOOL_LINK_MODE_200000baseKR2_Full_BIT + ETHTOOL_LINK_MODE_200000baseSR2_Full_BIT = C.ETHTOOL_LINK_MODE_200000baseSR2_Full_BIT + ETHTOOL_LINK_MODE_200000baseLR2_ER2_FR2_Full_BIT = C.ETHTOOL_LINK_MODE_200000baseLR2_ER2_FR2_Full_BIT + ETHTOOL_LINK_MODE_200000baseDR2_Full_BIT = C.ETHTOOL_LINK_MODE_200000baseDR2_Full_BIT + ETHTOOL_LINK_MODE_200000baseCR2_Full_BIT = C.ETHTOOL_LINK_MODE_200000baseCR2_Full_BIT + ETHTOOL_LINK_MODE_400000baseKR4_Full_BIT = C.ETHTOOL_LINK_MODE_400000baseKR4_Full_BIT + ETHTOOL_LINK_MODE_400000baseSR4_Full_BIT = C.ETHTOOL_LINK_MODE_400000baseSR4_Full_BIT + ETHTOOL_LINK_MODE_400000baseLR4_ER4_FR4_Full_BIT = C.ETHTOOL_LINK_MODE_400000baseLR4_ER4_FR4_Full_BIT + ETHTOOL_LINK_MODE_400000baseDR4_Full_BIT = C.ETHTOOL_LINK_MODE_400000baseDR4_Full_BIT + ETHTOOL_LINK_MODE_400000baseCR4_Full_BIT = C.ETHTOOL_LINK_MODE_400000baseCR4_Full_BIT + ETHTOOL_LINK_MODE_100baseFX_Half_BIT = C.ETHTOOL_LINK_MODE_100baseFX_Half_BIT + ETHTOOL_LINK_MODE_100baseFX_Full_BIT = C.ETHTOOL_LINK_MODE_100baseFX_Full_BIT + ETHTOOL_MSG_USER_NONE = C.ETHTOOL_MSG_USER_NONE ETHTOOL_MSG_STRSET_GET = C.ETHTOOL_MSG_STRSET_GET ETHTOOL_MSG_LINKINFO_GET = C.ETHTOOL_MSG_LINKINFO_GET diff --git a/unix/zerrors_linux.go b/unix/zerrors_linux.go index b3463a8b..9556fada 100644 --- a/unix/zerrors_linux.go +++ b/unix/zerrors_linux.go @@ -609,7 +609,6 @@ const ( ETHTOOL_RXNTUPLE_ACTION_DROP = -0x1 ETHTOOL_RX_FLOW_SPEC_RING = 0xffffffff ETHTOOL_RX_FLOW_SPEC_RING_VF = 0xff00000000 - ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF = 0x20 ETHTOOL_SCHANNELS = 0x3d ETHTOOL_SCOALESCE = 0xf ETHTOOL_SEEE = 0x45 diff --git a/unix/ztypes_linux.go b/unix/ztypes_linux.go index 5ab36711..d78ce077 100644 --- a/unix/ztypes_linux.go +++ b/unix/ztypes_linux.go @@ -3224,6 +3224,157 @@ const ( ) const ( + ETHTOOL_ID_UNSPEC = 0x0 + ETHTOOL_RX_COPYBREAK = 0x1 + ETHTOOL_TX_COPYBREAK = 0x2 + ETHTOOL_PFC_PREVENTION_TOUT = 0x3 + ETHTOOL_TUNABLE_UNSPEC = 0x0 + ETHTOOL_TUNABLE_U8 = 0x1 + ETHTOOL_TUNABLE_U16 = 0x2 + ETHTOOL_TUNABLE_U32 = 0x3 + ETHTOOL_TUNABLE_U64 = 0x4 + ETHTOOL_TUNABLE_STRING = 0x5 + ETHTOOL_TUNABLE_S8 = 0x6 + ETHTOOL_TUNABLE_S16 = 0x7 + ETHTOOL_TUNABLE_S32 = 0x8 + ETHTOOL_TUNABLE_S64 = 0x9 + ETHTOOL_PHY_ID_UNSPEC = 0x0 + ETHTOOL_PHY_DOWNSHIFT = 0x1 + ETHTOOL_PHY_FAST_LINK_DOWN = 0x2 + ETHTOOL_PHY_EDPD = 0x3 + ETHTOOL_LINK_EXT_STATE_AUTONEG = 0x0 + ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE = 0x1 + ETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH = 0x2 + ETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY = 0x3 + ETHTOOL_LINK_EXT_STATE_NO_CABLE = 0x4 + ETHTOOL_LINK_EXT_STATE_CABLE_ISSUE = 0x5 + ETHTOOL_LINK_EXT_STATE_EEPROM_ISSUE = 0x6 + ETHTOOL_LINK_EXT_STATE_CALIBRATION_FAILURE = 0x7 + ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED = 0x8 + ETHTOOL_LINK_EXT_STATE_OVERHEAT = 0x9 + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED = 0x1 + ETHTOOL_LINK_EXT_SUBSTATE_AN_ACK_NOT_RECEIVED = 0x2 + ETHTOOL_LINK_EXT_SUBSTATE_AN_NEXT_PAGE_EXCHANGE_FAILED = 0x3 + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED_FORCE_MODE = 0x4 + ETHTOOL_LINK_EXT_SUBSTATE_AN_FEC_MISMATCH_DURING_OVERRIDE = 0x5 + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_HCD = 0x6 + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_FRAME_LOCK_NOT_ACQUIRED = 0x1 + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_INHIBIT_TIMEOUT = 0x2 + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_PARTNER_DID_NOT_SET_RECEIVER_READY = 0x3 + ETHTOOL_LINK_EXT_SUBSTATE_LT_REMOTE_FAULT = 0x4 + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_BLOCK_LOCK = 0x1 + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_AM_LOCK = 0x2 + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_GET_ALIGN_STATUS = 0x3 + ETHTOOL_LINK_EXT_SUBSTATE_LLM_FC_FEC_IS_NOT_LOCKED = 0x4 + ETHTOOL_LINK_EXT_SUBSTATE_LLM_RS_FEC_IS_NOT_LOCKED = 0x5 + ETHTOOL_LINK_EXT_SUBSTATE_BSI_LARGE_NUMBER_OF_PHYSICAL_ERRORS = 0x1 + ETHTOOL_LINK_EXT_SUBSTATE_BSI_UNSUPPORTED_RATE = 0x2 + ETHTOOL_LINK_EXT_SUBSTATE_CI_UNSUPPORTED_CABLE = 0x1 + ETHTOOL_LINK_EXT_SUBSTATE_CI_CABLE_TEST_FAILURE = 0x2 + ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF = 0x20 + ETHTOOL_FLASH_ALL_REGIONS = 0x0 + ETHTOOL_F_UNSUPPORTED__BIT = 0x0 + ETHTOOL_F_WISH__BIT = 0x1 + ETHTOOL_F_COMPAT__BIT = 0x2 + ETHTOOL_FEC_NONE_BIT = 0x0 + ETHTOOL_FEC_AUTO_BIT = 0x1 + ETHTOOL_FEC_OFF_BIT = 0x2 + ETHTOOL_FEC_RS_BIT = 0x3 + ETHTOOL_FEC_BASER_BIT = 0x4 + ETHTOOL_FEC_LLRS_BIT = 0x5 + ETHTOOL_LINK_MODE_10baseT_Half_BIT = 0x0 + ETHTOOL_LINK_MODE_10baseT_Full_BIT = 0x1 + ETHTOOL_LINK_MODE_100baseT_Half_BIT = 0x2 + ETHTOOL_LINK_MODE_100baseT_Full_BIT = 0x3 + ETHTOOL_LINK_MODE_1000baseT_Half_BIT = 0x4 + ETHTOOL_LINK_MODE_1000baseT_Full_BIT = 0x5 + ETHTOOL_LINK_MODE_Autoneg_BIT = 0x6 + ETHTOOL_LINK_MODE_TP_BIT = 0x7 + ETHTOOL_LINK_MODE_AUI_BIT = 0x8 + ETHTOOL_LINK_MODE_MII_BIT = 0x9 + ETHTOOL_LINK_MODE_FIBRE_BIT = 0xa + ETHTOOL_LINK_MODE_BNC_BIT = 0xb + ETHTOOL_LINK_MODE_10000baseT_Full_BIT = 0xc + ETHTOOL_LINK_MODE_Pause_BIT = 0xd + ETHTOOL_LINK_MODE_Asym_Pause_BIT = 0xe + ETHTOOL_LINK_MODE_2500baseX_Full_BIT = 0xf + ETHTOOL_LINK_MODE_Backplane_BIT = 0x10 + ETHTOOL_LINK_MODE_1000baseKX_Full_BIT = 0x11 + ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT = 0x12 + ETHTOOL_LINK_MODE_10000baseKR_Full_BIT = 0x13 + ETHTOOL_LINK_MODE_10000baseR_FEC_BIT = 0x14 + ETHTOOL_LINK_MODE_20000baseMLD2_Full_BIT = 0x15 + ETHTOOL_LINK_MODE_20000baseKR2_Full_BIT = 0x16 + ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT = 0x17 + ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT = 0x18 + ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT = 0x19 + ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT = 0x1a + ETHTOOL_LINK_MODE_56000baseKR4_Full_BIT = 0x1b + ETHTOOL_LINK_MODE_56000baseCR4_Full_BIT = 0x1c + ETHTOOL_LINK_MODE_56000baseSR4_Full_BIT = 0x1d + ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT = 0x1e + ETHTOOL_LINK_MODE_25000baseCR_Full_BIT = 0x1f + ETHTOOL_LINK_MODE_25000baseKR_Full_BIT = 0x20 + ETHTOOL_LINK_MODE_25000baseSR_Full_BIT = 0x21 + ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT = 0x22 + ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT = 0x23 + ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT = 0x24 + ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT = 0x25 + ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT = 0x26 + ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT = 0x27 + ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT = 0x28 + ETHTOOL_LINK_MODE_1000baseX_Full_BIT = 0x29 + ETHTOOL_LINK_MODE_10000baseCR_Full_BIT = 0x2a + ETHTOOL_LINK_MODE_10000baseSR_Full_BIT = 0x2b + ETHTOOL_LINK_MODE_10000baseLR_Full_BIT = 0x2c + ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT = 0x2d + ETHTOOL_LINK_MODE_10000baseER_Full_BIT = 0x2e + ETHTOOL_LINK_MODE_2500baseT_Full_BIT = 0x2f + ETHTOOL_LINK_MODE_5000baseT_Full_BIT = 0x30 + ETHTOOL_LINK_MODE_FEC_NONE_BIT = 0x31 + ETHTOOL_LINK_MODE_FEC_RS_BIT = 0x32 + ETHTOOL_LINK_MODE_FEC_BASER_BIT = 0x33 + ETHTOOL_LINK_MODE_50000baseKR_Full_BIT = 0x34 + ETHTOOL_LINK_MODE_50000baseSR_Full_BIT = 0x35 + ETHTOOL_LINK_MODE_50000baseCR_Full_BIT = 0x36 + ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT = 0x37 + ETHTOOL_LINK_MODE_50000baseDR_Full_BIT = 0x38 + ETHTOOL_LINK_MODE_100000baseKR2_Full_BIT = 0x39 + ETHTOOL_LINK_MODE_100000baseSR2_Full_BIT = 0x3a + ETHTOOL_LINK_MODE_100000baseCR2_Full_BIT = 0x3b + ETHTOOL_LINK_MODE_100000baseLR2_ER2_FR2_Full_BIT = 0x3c + ETHTOOL_LINK_MODE_100000baseDR2_Full_BIT = 0x3d + ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT = 0x3e + ETHTOOL_LINK_MODE_200000baseSR4_Full_BIT = 0x3f + ETHTOOL_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT = 0x40 + ETHTOOL_LINK_MODE_200000baseDR4_Full_BIT = 0x41 + ETHTOOL_LINK_MODE_200000baseCR4_Full_BIT = 0x42 + ETHTOOL_LINK_MODE_100baseT1_Full_BIT = 0x43 + ETHTOOL_LINK_MODE_1000baseT1_Full_BIT = 0x44 + ETHTOOL_LINK_MODE_400000baseKR8_Full_BIT = 0x45 + ETHTOOL_LINK_MODE_400000baseSR8_Full_BIT = 0x46 + ETHTOOL_LINK_MODE_400000baseLR8_ER8_FR8_Full_BIT = 0x47 + ETHTOOL_LINK_MODE_400000baseDR8_Full_BIT = 0x48 + ETHTOOL_LINK_MODE_400000baseCR8_Full_BIT = 0x49 + ETHTOOL_LINK_MODE_FEC_LLRS_BIT = 0x4a + ETHTOOL_LINK_MODE_100000baseKR_Full_BIT = 0x4b + ETHTOOL_LINK_MODE_100000baseSR_Full_BIT = 0x4c + ETHTOOL_LINK_MODE_100000baseLR_ER_FR_Full_BIT = 0x4d + ETHTOOL_LINK_MODE_100000baseCR_Full_BIT = 0x4e + ETHTOOL_LINK_MODE_100000baseDR_Full_BIT = 0x4f + ETHTOOL_LINK_MODE_200000baseKR2_Full_BIT = 0x50 + ETHTOOL_LINK_MODE_200000baseSR2_Full_BIT = 0x51 + ETHTOOL_LINK_MODE_200000baseLR2_ER2_FR2_Full_BIT = 0x52 + ETHTOOL_LINK_MODE_200000baseDR2_Full_BIT = 0x53 + ETHTOOL_LINK_MODE_200000baseCR2_Full_BIT = 0x54 + ETHTOOL_LINK_MODE_400000baseKR4_Full_BIT = 0x55 + ETHTOOL_LINK_MODE_400000baseSR4_Full_BIT = 0x56 + ETHTOOL_LINK_MODE_400000baseLR4_ER4_FR4_Full_BIT = 0x57 + ETHTOOL_LINK_MODE_400000baseDR4_Full_BIT = 0x58 + ETHTOOL_LINK_MODE_400000baseCR4_Full_BIT = 0x59 + ETHTOOL_LINK_MODE_100baseFX_Half_BIT = 0x5a + ETHTOOL_LINK_MODE_100baseFX_Full_BIT = 0x5b + ETHTOOL_MSG_USER_NONE = 0x0 ETHTOOL_MSG_STRSET_GET = 0x1 ETHTOOL_MSG_LINKINFO_GET = 0x2 From 3196cb8d8e45180446c28482af5ee4f10c928b4c Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Wed, 13 Jan 2021 11:22:59 +0100 Subject: [PATCH 08/18] unix: add Pipe2 on netbsd Also move TestPipe2 into a separate file, enabling it for all platforms where Pipe2 is available. Change-Id: I1a31e9563f5f60ef0e994abc1db57b7f1c58fe88 Reviewed-on: https://go-review.googlesource.com/c/sys/+/283593 Trust: Tobias Klauser Trust: Benny Siegert Run-TryBot: Tobias Klauser Reviewed-by: Benny Siegert TryBot-Result: Go Bot --- unix/pipe2_test.go | 55 +++++++++++++++++++++++++++++++++++ unix/syscall_netbsd.go | 15 ++++++++++ unix/syscall_solaris_test.go | 42 -------------------------- unix/zsyscall_netbsd_386.go | 10 +++++++ unix/zsyscall_netbsd_amd64.go | 10 +++++++ unix/zsyscall_netbsd_arm.go | 10 +++++++ unix/zsyscall_netbsd_arm64.go | 10 +++++++ 7 files changed, 110 insertions(+), 42 deletions(-) create mode 100644 unix/pipe2_test.go diff --git a/unix/pipe2_test.go b/unix/pipe2_test.go new file mode 100644 index 00000000..3cd3bbde --- /dev/null +++ b/unix/pipe2_test.go @@ -0,0 +1,55 @@ +// Copyright 2021 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. + +// +build dragonfly freebsd linux netbsd openbsd solaris + +package unix_test + +import ( + "testing" + + "golang.org/x/sys/unix" +) + +func TestPipe2(t *testing.T) { + const s = "hello" + var pipes [2]int + err := unix.Pipe2(pipes[:], 0) + if err != nil { + t.Fatalf("pipe2: %v", err) + } + r := pipes[0] + w := pipes[1] + go func() { + n, err := unix.Write(w, []byte(s)) + if err != nil { + t.Errorf("bad write: %v", err) + return + } + if n != len(s) { + t.Errorf("bad write count: %d", n) + return + } + err = unix.Close(w) + if err != nil { + t.Errorf("bad close: %v", err) + return + } + }() + var buf [10 + len(s)]byte + n, err := unix.Read(r, buf[:]) + if err != nil { + t.Fatalf("bad read: %v", err) + } + if n != len(s) { + t.Fatalf("bad read count: %d", n) + } + if string(buf[:n]) != s { + t.Fatalf("bad contents: %s", string(buf[:n])) + } + err = unix.Close(r) + if err != nil { + t.Fatalf("bad close: %v", err) + } +} diff --git a/unix/syscall_netbsd.go b/unix/syscall_netbsd.go index 1e6843b4..93a14622 100644 --- a/unix/syscall_netbsd.go +++ b/unix/syscall_netbsd.go @@ -111,6 +111,7 @@ func direntNamlen(buf []byte) (uint64, bool) { } //sysnb pipe() (fd1 int, fd2 int, err error) + func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL @@ -119,7 +120,21 @@ func Pipe(p []int) (err error) { return } +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) error { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err := pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return err +} + //sys Getdents(fd int, buf []byte) (n int, err error) + func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { n, err = Getdents(fd, buf) if err != nil || basep == nil { diff --git a/unix/syscall_solaris_test.go b/unix/syscall_solaris_test.go index ae2c40c5..d3e7d2b2 100644 --- a/unix/syscall_solaris_test.go +++ b/unix/syscall_solaris_test.go @@ -13,48 +13,6 @@ import ( "golang.org/x/sys/unix" ) -func TestPipe2(t *testing.T) { - const s = "hello" - var pipes [2]int - err := unix.Pipe2(pipes[:], 0) - if err != nil { - t.Fatalf("pipe2: %v", err) - } - r := pipes[0] - w := pipes[1] - go func() { - n, err := unix.Write(w, []byte(s)) - if err != nil { - t.Errorf("bad write: %v", err) - return - } - if n != len(s) { - t.Errorf("bad write count: %d", n) - return - } - err = unix.Close(w) - if err != nil { - t.Errorf("bad close: %v", err) - return - } - }() - var buf [10 + len(s)]byte - n, err := unix.Read(r, buf[:]) - if err != nil { - t.Fatalf("bad read: %v", err) - } - if n != len(s) { - t.Fatalf("bad read count: %d", n) - } - if string(buf[:n]) != s { - t.Fatalf("bad contents: %s", string(buf[:n])) - } - err = unix.Close(r) - if err != nil { - t.Fatalf("bad close: %v", err) - } -} - func TestStatvfs(t *testing.T) { if err := unix.Statvfs("", nil); err == nil { t.Fatal(`Statvfs("") expected failure`) diff --git a/unix/zsyscall_netbsd_386.go b/unix/zsyscall_netbsd_386.go index 3bbd9e39..1d6f71d9 100644 --- a/unix/zsyscall_netbsd_386.go +++ b/unix/zsyscall_netbsd_386.go @@ -362,6 +362,16 @@ func pipe() (fd1 int, fd2 int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { diff --git a/unix/zsyscall_netbsd_amd64.go b/unix/zsyscall_netbsd_amd64.go index d8cf5012..82f50506 100644 --- a/unix/zsyscall_netbsd_amd64.go +++ b/unix/zsyscall_netbsd_amd64.go @@ -362,6 +362,16 @@ func pipe() (fd1 int, fd2 int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { diff --git a/unix/zsyscall_netbsd_arm.go b/unix/zsyscall_netbsd_arm.go index 1153fe69..b4db55a0 100644 --- a/unix/zsyscall_netbsd_arm.go +++ b/unix/zsyscall_netbsd_arm.go @@ -362,6 +362,16 @@ func pipe() (fd1 int, fd2 int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { diff --git a/unix/zsyscall_netbsd_arm64.go b/unix/zsyscall_netbsd_arm64.go index 24b4ebb4..e9f6d797 100644 --- a/unix/zsyscall_netbsd_arm64.go +++ b/unix/zsyscall_netbsd_arm64.go @@ -362,6 +362,16 @@ func pipe() (fd1 int, fd2 int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { From ba0562f347e0fec88c12887c32a4b4d14d9352b3 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Wed, 13 Jan 2021 12:58:38 +0100 Subject: [PATCH 09/18] unix: re-generate linux consts after CL 283413 ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF was removed from linux/types.go and mkerrors.sh will catch it instead. Change-Id: I76e063cbfee4411e5ea9f2e0e5359e169d56b195 Reviewed-on: https://go-review.googlesource.com/c/sys/+/283595 Trust: Tobias Klauser Trust: Matt Layher Reviewed-by: Matt Layher Run-TryBot: Tobias Klauser TryBot-Result: Go Bot --- unix/zerrors_linux.go | 1 + unix/ztypes_linux.go | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/unix/zerrors_linux.go b/unix/zerrors_linux.go index 9556fada..b3463a8b 100644 --- a/unix/zerrors_linux.go +++ b/unix/zerrors_linux.go @@ -609,6 +609,7 @@ const ( ETHTOOL_RXNTUPLE_ACTION_DROP = -0x1 ETHTOOL_RX_FLOW_SPEC_RING = 0xffffffff ETHTOOL_RX_FLOW_SPEC_RING_VF = 0xff00000000 + ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF = 0x20 ETHTOOL_SCHANNELS = 0x3d ETHTOOL_SCOALESCE = 0xf ETHTOOL_SEEE = 0x45 diff --git a/unix/ztypes_linux.go b/unix/ztypes_linux.go index d78ce077..9f3b1a4e 100644 --- a/unix/ztypes_linux.go +++ b/unix/ztypes_linux.go @@ -3271,7 +3271,6 @@ const ( ETHTOOL_LINK_EXT_SUBSTATE_BSI_UNSUPPORTED_RATE = 0x2 ETHTOOL_LINK_EXT_SUBSTATE_CI_UNSUPPORTED_CABLE = 0x1 ETHTOOL_LINK_EXT_SUBSTATE_CI_CABLE_TEST_FAILURE = 0x2 - ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF = 0x20 ETHTOOL_FLASH_ALL_REGIONS = 0x0 ETHTOOL_F_UNSUPPORTED__BIT = 0x0 ETHTOOL_F_WISH__BIT = 0x1 From 4bcb84eeeb78d47aae60461dac79349e427b5349 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Wed, 13 Jan 2021 17:44:44 +0000 Subject: [PATCH 10/18] Revert "unix: add Pipe2 on netbsd" This reverts CL 283593. Reason for revert: breaks DragonflyBSD builders and was submitted during code freeze. Change-Id: I784f58ae56f7259d5176921d7a61070e0ac7cb52 Reviewed-on: https://go-review.googlesource.com/c/sys/+/283597 Trust: Tobias Klauser Run-TryBot: Tobias Klauser TryBot-Result: Go Bot Reviewed-by: Dmitri Shuralyov --- unix/pipe2_test.go | 55 ----------------------------------- unix/syscall_netbsd.go | 15 ---------- unix/syscall_solaris_test.go | 42 ++++++++++++++++++++++++++ unix/zsyscall_netbsd_386.go | 10 ------- unix/zsyscall_netbsd_amd64.go | 10 ------- unix/zsyscall_netbsd_arm.go | 10 ------- unix/zsyscall_netbsd_arm64.go | 10 ------- 7 files changed, 42 insertions(+), 110 deletions(-) delete mode 100644 unix/pipe2_test.go diff --git a/unix/pipe2_test.go b/unix/pipe2_test.go deleted file mode 100644 index 3cd3bbde..00000000 --- a/unix/pipe2_test.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2021 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. - -// +build dragonfly freebsd linux netbsd openbsd solaris - -package unix_test - -import ( - "testing" - - "golang.org/x/sys/unix" -) - -func TestPipe2(t *testing.T) { - const s = "hello" - var pipes [2]int - err := unix.Pipe2(pipes[:], 0) - if err != nil { - t.Fatalf("pipe2: %v", err) - } - r := pipes[0] - w := pipes[1] - go func() { - n, err := unix.Write(w, []byte(s)) - if err != nil { - t.Errorf("bad write: %v", err) - return - } - if n != len(s) { - t.Errorf("bad write count: %d", n) - return - } - err = unix.Close(w) - if err != nil { - t.Errorf("bad close: %v", err) - return - } - }() - var buf [10 + len(s)]byte - n, err := unix.Read(r, buf[:]) - if err != nil { - t.Fatalf("bad read: %v", err) - } - if n != len(s) { - t.Fatalf("bad read count: %d", n) - } - if string(buf[:n]) != s { - t.Fatalf("bad contents: %s", string(buf[:n])) - } - err = unix.Close(r) - if err != nil { - t.Fatalf("bad close: %v", err) - } -} diff --git a/unix/syscall_netbsd.go b/unix/syscall_netbsd.go index 93a14622..1e6843b4 100644 --- a/unix/syscall_netbsd.go +++ b/unix/syscall_netbsd.go @@ -111,7 +111,6 @@ func direntNamlen(buf []byte) (uint64, bool) { } //sysnb pipe() (fd1 int, fd2 int, err error) - func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL @@ -120,21 +119,7 @@ func Pipe(p []int) (err error) { return } -//sysnb pipe2(p *[2]_C_int, flags int) (err error) - -func Pipe2(p []int, flags int) error { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err := pipe2(&pp, flags) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return err -} - //sys Getdents(fd int, buf []byte) (n int, err error) - func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { n, err = Getdents(fd, buf) if err != nil || basep == nil { diff --git a/unix/syscall_solaris_test.go b/unix/syscall_solaris_test.go index d3e7d2b2..ae2c40c5 100644 --- a/unix/syscall_solaris_test.go +++ b/unix/syscall_solaris_test.go @@ -13,6 +13,48 @@ import ( "golang.org/x/sys/unix" ) +func TestPipe2(t *testing.T) { + const s = "hello" + var pipes [2]int + err := unix.Pipe2(pipes[:], 0) + if err != nil { + t.Fatalf("pipe2: %v", err) + } + r := pipes[0] + w := pipes[1] + go func() { + n, err := unix.Write(w, []byte(s)) + if err != nil { + t.Errorf("bad write: %v", err) + return + } + if n != len(s) { + t.Errorf("bad write count: %d", n) + return + } + err = unix.Close(w) + if err != nil { + t.Errorf("bad close: %v", err) + return + } + }() + var buf [10 + len(s)]byte + n, err := unix.Read(r, buf[:]) + if err != nil { + t.Fatalf("bad read: %v", err) + } + if n != len(s) { + t.Fatalf("bad read count: %d", n) + } + if string(buf[:n]) != s { + t.Fatalf("bad contents: %s", string(buf[:n])) + } + err = unix.Close(r) + if err != nil { + t.Fatalf("bad close: %v", err) + } +} + func TestStatvfs(t *testing.T) { if err := unix.Statvfs("", nil); err == nil { t.Fatal(`Statvfs("") expected failure`) diff --git a/unix/zsyscall_netbsd_386.go b/unix/zsyscall_netbsd_386.go index 1d6f71d9..3bbd9e39 100644 --- a/unix/zsyscall_netbsd_386.go +++ b/unix/zsyscall_netbsd_386.go @@ -362,16 +362,6 @@ func pipe() (fd1 int, fd2 int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe2(p *[2]_C_int, flags int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { diff --git a/unix/zsyscall_netbsd_amd64.go b/unix/zsyscall_netbsd_amd64.go index 82f50506..d8cf5012 100644 --- a/unix/zsyscall_netbsd_amd64.go +++ b/unix/zsyscall_netbsd_amd64.go @@ -362,16 +362,6 @@ func pipe() (fd1 int, fd2 int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe2(p *[2]_C_int, flags int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { diff --git a/unix/zsyscall_netbsd_arm.go b/unix/zsyscall_netbsd_arm.go index b4db55a0..1153fe69 100644 --- a/unix/zsyscall_netbsd_arm.go +++ b/unix/zsyscall_netbsd_arm.go @@ -362,16 +362,6 @@ func pipe() (fd1 int, fd2 int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe2(p *[2]_C_int, flags int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { diff --git a/unix/zsyscall_netbsd_arm64.go b/unix/zsyscall_netbsd_arm64.go index e9f6d797..24b4ebb4 100644 --- a/unix/zsyscall_netbsd_arm64.go +++ b/unix/zsyscall_netbsd_arm64.go @@ -362,16 +362,6 @@ func pipe() (fd1 int, fd2 int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe2(p *[2]_C_int, flags int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { From b64e53b001e413bd5067f36d4e439eded3827374 Mon Sep 17 00:00:00 2001 From: Roland Shoemaker Date: Mon, 11 Jan 2021 10:06:18 -0800 Subject: [PATCH 11/18] execabs: create execabs package This package provides an alternative to os/exec that guarantees never to satisfy a PATH lookup using an executable in the current directory. Change-Id: Id978f8039fe21687059c788836c79ae8e0930e92 Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/949732 Reviewed-by: Katie Hockman Reviewed-by: Russ Cox Reviewed-on: https://go-review.googlesource.com/c/sys/+/284753 Trust: Roland Shoemaker Run-TryBot: Roland Shoemaker Reviewed-by: Russ Cox Reviewed-by: Katie Hockman TryBot-Result: Go Bot --- execabs/execabs.go | 102 ++++++++++++++++++++++++++++++++++++++ execabs/execabs_test.go | 107 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 209 insertions(+) create mode 100644 execabs/execabs.go create mode 100644 execabs/execabs_test.go diff --git a/execabs/execabs.go b/execabs/execabs.go new file mode 100644 index 00000000..78192498 --- /dev/null +++ b/execabs/execabs.go @@ -0,0 +1,102 @@ +// Copyright 2020 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 execabs is a drop-in replacement for os/exec +// that requires PATH lookups to find absolute paths. +// That is, execabs.Command("cmd") runs the same PATH lookup +// as exec.Command("cmd"), but if the result is a path +// which is relative, the Run and Start methods will report +// an error instead of running the executable. +// +// See https://blog.golang.org/path-security for more information +// about when it may be necessary or appropriate to use this package. +package execabs + +import ( + "context" + "fmt" + "os/exec" + "path/filepath" + "reflect" + "unsafe" +) + +// ErrNotFound is the error resulting if a path search failed to find an executable file. +// It is an alias for exec.ErrNotFound. +var ErrNotFound = exec.ErrNotFound + +// Cmd represents an external command being prepared or run. +// It is an alias for exec.Cmd. +type Cmd = exec.Cmd + +// Error is returned by LookPath when it fails to classify a file as an executable. +// It is an alias for exec.Error. +type Error = exec.Error + +// An ExitError reports an unsuccessful exit by a command. +// It is an alias for exec.ExitError. +type ExitError = exec.ExitError + +func relError(file, path string) error { + return fmt.Errorf("%s resolves to executable in current directory (.%c%s)", file, filepath.Separator, path) +} + +// LookPath searches for an executable named file in the directories +// named by the PATH environment variable. If file contains a slash, +// it is tried directly and the PATH is not consulted. The result will be +// an absolute path. +// +// LookPath differs from exec.LookPath in its handling of PATH lookups, +// which are used for file names without slashes. If exec.LookPath's +// PATH lookup would have returned an executable from the current directory, +// LookPath instead returns an error. +func LookPath(file string) (string, error) { + path, err := exec.LookPath(file) + if err != nil { + return "", err + } + if filepath.Base(file) == file && !filepath.IsAbs(path) { + return "", relError(file, path) + } + return path, nil +} + +func fixCmd(name string, cmd *exec.Cmd) { + if filepath.Base(name) == name && !filepath.IsAbs(cmd.Path) { + // exec.Command was called with a bare binary name and + // exec.LookPath returned a path which is not absolute. + // Set cmd.lookPathErr and clear cmd.Path so that it + // cannot be run. + lookPathErr := (*error)(unsafe.Pointer(reflect.ValueOf(cmd).Elem().FieldByName("lookPathErr").Addr().Pointer())) + if *lookPathErr == nil { + *lookPathErr = relError(name, cmd.Path) + } + cmd.Path = "" + } +} + +// CommandContext is like Command but includes a context. +// +// The provided context is used to kill the process (by calling os.Process.Kill) +// if the context becomes done before the command completes on its own. +func CommandContext(ctx context.Context, name string, arg ...string) *exec.Cmd { + cmd := exec.CommandContext(ctx, name, arg...) + fixCmd(name, cmd) + return cmd + +} + +// Command returns the Cmd struct to execute the named program with the given arguments. +// See exec.Command for most details. +// +// Command differs from exec.Command in its handling of PATH lookups, +// which are used when the program name contains no slashes. +// If exec.Command would have returned an exec.Cmd configured to run an +// executable from the current directory, Command instead +// returns an exec.Cmd that will return an error from Start or Run. +func Command(name string, arg ...string) *exec.Cmd { + cmd := exec.Command(name, arg...) + fixCmd(name, cmd) + return cmd +} diff --git a/execabs/execabs_test.go b/execabs/execabs_test.go new file mode 100644 index 00000000..a0b88dd2 --- /dev/null +++ b/execabs/execabs_test.go @@ -0,0 +1,107 @@ +// Copyright 2020 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 execabs + +import ( + "context" + "fmt" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "runtime" + "testing" +) + +func TestFixCmd(t *testing.T) { + cmd := &exec.Cmd{Path: "hello"} + fixCmd("hello", cmd) + if cmd.Path != "" { + t.Errorf("fixCmd didn't clear cmd.Path") + } + expectedErr := fmt.Sprintf("hello resolves to executable in current directory (.%chello)", filepath.Separator) + if err := cmd.Run(); err == nil { + t.Fatal("Command.Run didn't fail") + } else if err.Error() != expectedErr { + t.Fatalf("Command.Run returned unexpected error: want %q, got %q", expectedErr, err.Error()) + } +} + +func TestCommand(t *testing.T) { + for _, cmd := range []func(string) *Cmd{ + func(s string) *Cmd { return Command(s) }, + func(s string) *Cmd { return CommandContext(context.Background(), s) }, + } { + tmpDir, err := ioutil.TempDir("", "execabs-test") + if err != nil { + t.Fatalf("ioutil.TempDir failed: %s", err) + } + defer os.RemoveAll(tmpDir) + executable := "execabs-test" + if runtime.GOOS == "windows" { + executable += ".exe" + } + if err = ioutil.WriteFile(filepath.Join(tmpDir, executable), []byte{1, 2, 3}, 0111); err != nil { + t.Fatalf("ioutil.WriteFile failed: %s", err) + } + cwd, err := os.Getwd() + if err != nil { + t.Fatalf("os.Getwd failed: %s", err) + } + defer os.Chdir(cwd) + if err = os.Chdir(tmpDir); err != nil { + t.Fatalf("os.Chdir failed: %s", err) + } + if runtime.GOOS != "windows" { + // add "." to PATH so that exec.LookPath looks in the current directory on + // non-windows platforms as well + origPath := os.Getenv("PATH") + defer os.Setenv("PATH", origPath) + os.Setenv("PATH", fmt.Sprintf(".:%s", origPath)) + } + expectedErr := fmt.Sprintf("execabs-test resolves to executable in current directory (.%c%s)", filepath.Separator, executable) + if err = cmd("execabs-test").Run(); err == nil { + t.Fatalf("Command.Run didn't fail when exec.LookPath returned a relative path") + } else if err.Error() != expectedErr { + t.Errorf("Command.Run returned unexpected error: want %q, got %q", expectedErr, err.Error()) + } + } +} + +func TestLookPath(t *testing.T) { + tmpDir, err := ioutil.TempDir("", "execabs-test") + if err != nil { + t.Fatalf("ioutil.TempDir failed: %s", err) + } + defer os.RemoveAll(tmpDir) + executable := "execabs-test" + if runtime.GOOS == "windows" { + executable += ".exe" + } + if err = ioutil.WriteFile(filepath.Join(tmpDir, executable), []byte{1, 2, 3}, 0111); err != nil { + t.Fatalf("ioutil.WriteFile failed: %s", err) + } + cwd, err := os.Getwd() + if err != nil { + t.Fatalf("os.Getwd failed: %s", err) + } + defer os.Chdir(cwd) + if err = os.Chdir(tmpDir); err != nil { + t.Fatalf("os.Chdir failed: %s", err) + } + if runtime.GOOS != "windows" { + // add "." to PATH so that exec.LookPath looks in the current directory on + // non-windows platforms as well + origPath := os.Getenv("PATH") + defer os.Setenv("PATH", origPath) + os.Setenv("PATH", fmt.Sprintf(".:%s", origPath)) + } + expectedErr := fmt.Sprintf("execabs-test resolves to executable in current directory (.%c%s)", filepath.Separator, executable) + if _, err := LookPath("execabs-test"); err == nil { + t.Fatalf("LookPath didn't fail when finding a non-relative path") + } else if err.Error() != expectedErr { + t.Errorf("LookPath returned unexpected error: want %q, got %q", expectedErr, err.Error()) + } +} From 04d7465088b8adeccf882a9ae1e0423323c7bd9d Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Thu, 21 Jan 2021 15:17:19 +0100 Subject: [PATCH 12/18] windows: correct signature of recently added GetWindowThreadProcessId MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This function returns 0 and sets last error on failure. While this isn't said explicitly on MSDN, there's no PID 0, and trivial reverse engineering shows that this is the case. For example: .text:00000001800035ED loc_1800035ED: ; CODE XREF: GetWindowThreadProcessId+23↑j .text:00000001800035ED ; GetWindowThreadProcessId+3D↑j ... .text:00000001800035ED mov ecx, 578h ; LastError .text:00000001800035F2 call cs:__imp_RtlSetLastWin32Error .text:00000001800035F9 nop dword ptr [rax+rax+00h] .text:00000001800035FE .text:00000001800035FE loc_1800035FE: ; CODE XREF: GetWindowThreadProcessId+65↑j .text:00000001800035FE xor eax, eax .text:0000000180003600 jmp short loc_1800035AA This function was also just added by a user who is likely its only consumer, so this error is not too late to fix. Change-Id: I5dd24e78c006686bb8f1288ad0fe63cd67df56a6 Reviewed-on: https://go-review.googlesource.com/c/sys/+/285272 Trust: Jason A. Donenfeld Trust: Alex Brainman Run-TryBot: Jason A. Donenfeld TryBot-Result: Go Bot Reviewed-by: Alex Brainman --- windows/syscall_windows.go | 2 +- windows/zsyscall_windows.go | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/windows/syscall_windows.go b/windows/syscall_windows.go index d249919c..1c2e80a9 100644 --- a/windows/syscall_windows.go +++ b/windows/syscall_windows.go @@ -215,7 +215,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW //sys OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) (handle Handle, err error) //sys ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int32) (err error) [failretval<=32] = shell32.ShellExecuteW -//sys GetWindowThreadProcessId(hwnd HWND, pid *uint32) (tid uint32) = user32.GetWindowThreadProcessId +//sys GetWindowThreadProcessId(hwnd HWND, pid *uint32) (tid uint32, err error) = user32.GetWindowThreadProcessId //sys GetShellWindow() (shellWindow HWND) = user32.GetShellWindow //sys MessageBox(hwnd HWND, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) [failretval==0] = user32.MessageBoxW //sys ExitWindowsEx(flags uint32, reason uint32) (err error) = user32.ExitWindowsEx diff --git a/windows/zsyscall_windows.go b/windows/zsyscall_windows.go index cd5e8528..8a79ea15 100644 --- a/windows/zsyscall_windows.go +++ b/windows/zsyscall_windows.go @@ -2904,9 +2904,12 @@ func GetShellWindow() (shellWindow HWND) { return } -func GetWindowThreadProcessId(hwnd HWND, pid *uint32) (tid uint32) { - r0, _, _ := syscall.Syscall(procGetWindowThreadProcessId.Addr(), 2, uintptr(hwnd), uintptr(unsafe.Pointer(pid)), 0) +func GetWindowThreadProcessId(hwnd HWND, pid *uint32) (tid uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetWindowThreadProcessId.Addr(), 2, uintptr(hwnd), uintptr(unsafe.Pointer(pid)), 0) tid = uint32(r0) + if tid == 0 { + err = errnoErr(e1) + } return } From a8b976e07c7b0ff014c8da1d5352077edaf678d4 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Fri, 22 Jan 2021 14:20:47 +0100 Subject: [PATCH 13/18] windows: add Find*ChangeNotification APIs for file and directory monitoring https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-findfirstchangenotificationw https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-findnextchangenotification https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-findclosechangenotification Change-Id: If7abfd63cd7a60e7f95ffad9aca2b7b7b74c94f0 Reviewed-on: https://go-review.googlesource.com/c/sys/+/285713 Trust: Jason A. Donenfeld Run-TryBot: Jason A. Donenfeld TryBot-Result: Go Bot Reviewed-by: Brad Fitzpatrick --- windows/syscall_windows.go | 3 +++ windows/types_windows.go | 2 +- windows/zsyscall_windows.go | 41 +++++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/windows/syscall_windows.go b/windows/syscall_windows.go index 1c2e80a9..fda9c558 100644 --- a/windows/syscall_windows.go +++ b/windows/syscall_windows.go @@ -264,6 +264,9 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) = kernel32.VirtualProtect //sys TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) = mswsock.TransmitFile //sys ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) = kernel32.ReadDirectoryChangesW +//sys FindFirstChangeNotification(path string, watchSubtree bool, notifyFilter uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.FindFirstChangeNotificationW +//sys FindNextChangeNotification(handle Handle) (err error) +//sys FindCloseChangeNotification(handle Handle) (err error) //sys CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) = crypt32.CertOpenSystemStoreW //sys CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) = crypt32.CertOpenStore //sys CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) [failretval==nil] = crypt32.CertEnumCertificatesInStore diff --git a/windows/types_windows.go b/windows/types_windows.go index b3bd0da4..dc8017dd 100644 --- a/windows/types_windows.go +++ b/windows/types_windows.go @@ -227,7 +227,7 @@ const ( ) const ( - // filters for ReadDirectoryChangesW + // filters for ReadDirectoryChangesW and FindFirstChangeNotificationW FILE_NOTIFY_CHANGE_FILE_NAME = 0x001 FILE_NOTIFY_CHANGE_DIR_NAME = 0x002 FILE_NOTIFY_CHANGE_ATTRIBUTES = 0x004 diff --git a/windows/zsyscall_windows.go b/windows/zsyscall_windows.go index 8a79ea15..a164e984 100644 --- a/windows/zsyscall_windows.go +++ b/windows/zsyscall_windows.go @@ -183,9 +183,12 @@ var ( procDuplicateHandle = modkernel32.NewProc("DuplicateHandle") procExitProcess = modkernel32.NewProc("ExitProcess") procFindClose = modkernel32.NewProc("FindClose") + procFindCloseChangeNotification = modkernel32.NewProc("FindCloseChangeNotification") + procFindFirstChangeNotificationW = modkernel32.NewProc("FindFirstChangeNotificationW") procFindFirstFileW = modkernel32.NewProc("FindFirstFileW") procFindFirstVolumeMountPointW = modkernel32.NewProc("FindFirstVolumeMountPointW") procFindFirstVolumeW = modkernel32.NewProc("FindFirstVolumeW") + procFindNextChangeNotification = modkernel32.NewProc("FindNextChangeNotification") procFindNextFileW = modkernel32.NewProc("FindNextFileW") procFindNextVolumeMountPointW = modkernel32.NewProc("FindNextVolumeMountPointW") procFindNextVolumeW = modkernel32.NewProc("FindNextVolumeW") @@ -1525,6 +1528,36 @@ func FindClose(handle Handle) (err error) { return } +func FindCloseChangeNotification(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procFindCloseChangeNotification.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func FindFirstChangeNotification(path string, watchSubtree bool, notifyFilter uint32) (handle Handle, err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(path) + if err != nil { + return + } + return _FindFirstChangeNotification(_p0, watchSubtree, notifyFilter) +} + +func _FindFirstChangeNotification(path *uint16, watchSubtree bool, notifyFilter uint32) (handle Handle, err error) { + var _p1 uint32 + if watchSubtree { + _p1 = 1 + } + r0, _, e1 := syscall.Syscall(procFindFirstChangeNotificationW.Addr(), 3, uintptr(unsafe.Pointer(path)), uintptr(_p1), uintptr(notifyFilter)) + handle = Handle(r0) + if handle == InvalidHandle { + err = errnoErr(e1) + } + return +} + func findFirstFile1(name *uint16, data *win32finddata1) (handle Handle, err error) { r0, _, e1 := syscall.Syscall(procFindFirstFileW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(data)), 0) handle = Handle(r0) @@ -1552,6 +1585,14 @@ func FindFirstVolume(volumeName *uint16, bufferLength uint32) (handle Handle, er return } +func FindNextChangeNotification(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procFindNextChangeNotification.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func findNextFile1(handle Handle, data *win32finddata1) (err error) { r1, _, e1 := syscall.Syscall(procFindNextFileW.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(data)), 0) if r1 == 0 { From 9b0068b26619c2b42438dc1d6335afefe7cdedf6 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Fri, 22 Jan 2021 10:43:18 +0100 Subject: [PATCH 14/18] execabs: disable tests on ios and js/wasm TestCommand and TestLookPath fail on the js/wasm builder and likely fail on ios as well. Like the tests in internal/execabs, skip them for these platforms. This fixes the js/wasm builder after CL 284753. For golang/go#11811 Change-Id: I1038128bd4c7bd410ac1357dedda5e3eef5c7bbb Reviewed-on: https://go-review.googlesource.com/c/sys/+/285712 Trust: Tobias Klauser Run-TryBot: Tobias Klauser TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor --- execabs/execabs_test.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/execabs/execabs_test.go b/execabs/execabs_test.go index a0b88dd2..1e8cf786 100644 --- a/execabs/execabs_test.go +++ b/execabs/execabs_test.go @@ -15,6 +15,27 @@ import ( "testing" ) +// hasExec reports whether the current system can start new processes +// using os.StartProcess or (more commonly) exec.Command. +// Copied from internal/testenv.HasExec +func hasExec() bool { + switch runtime.GOOS { + case "js", "ios": + return false + } + return true +} + +// mustHaveExec checks that the current system can start new processes +// using os.StartProcess or (more commonly) exec.Command. +// If not, mustHaveExec calls t.Skip with an explanation. +// Copied from internal/testenv.MustHaveExec +func mustHaveExec(t testing.TB) { + if !hasExec() { + t.Skipf("skipping test: cannot exec subprocess on %s/%s", runtime.GOOS, runtime.GOARCH) + } +} + func TestFixCmd(t *testing.T) { cmd := &exec.Cmd{Path: "hello"} fixCmd("hello", cmd) @@ -30,6 +51,8 @@ func TestFixCmd(t *testing.T) { } func TestCommand(t *testing.T) { + mustHaveExec(t) + for _, cmd := range []func(string) *Cmd{ func(s string) *Cmd { return Command(s) }, func(s string) *Cmd { return CommandContext(context.Background(), s) }, @@ -71,6 +94,8 @@ func TestCommand(t *testing.T) { } func TestLookPath(t *testing.T) { + mustHaveExec(t) + tmpDir, err := ioutil.TempDir("", "execabs-test") if err != nil { t.Fatalf("ioutil.TempDir failed: %s", err) From 4df39788e6bac3f2c7c594c6f63d7770497cd693 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Fri, 22 Jan 2021 14:23:17 +0100 Subject: [PATCH 15/18] windows: add missing crypt/cert API functions for examining certificate objects This adds these functions and the various enums and constants required to use them: https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptdecodeobject https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptqueryobject https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certgetnamestringw https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certfindextension We also use this opportunity to clean up formatting of the previous crypt APIs added: a few lines slipped in that used "//sys ", with spaces, instead of "//sys\t" with a tab. This fixes that up for consistency. Change-Id: I925d3d29b5255f70ee2368e8906c45b8b22115ce Reviewed-on: https://go-review.googlesource.com/c/sys/+/285714 Run-TryBot: Jason A. Donenfeld TryBot-Result: Go Bot Reviewed-by: Brad Fitzpatrick Trust: Jason A. Donenfeld --- windows/syscall_windows.go | 20 +++--- windows/types_windows.go | 129 ++++++++++++++++++++++++++++++++++-- windows/zsyscall_windows.go | 32 +++++++++ 3 files changed, 169 insertions(+), 12 deletions(-) diff --git a/windows/syscall_windows.go b/windows/syscall_windows.go index fda9c558..5c1102c0 100644 --- a/windows/syscall_windows.go +++ b/windows/syscall_windows.go @@ -268,18 +268,22 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys FindNextChangeNotification(handle Handle) (err error) //sys FindCloseChangeNotification(handle Handle) (err error) //sys CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) = crypt32.CertOpenSystemStoreW -//sys CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) = crypt32.CertOpenStore +//sys CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) = crypt32.CertOpenStore //sys CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) [failretval==nil] = crypt32.CertEnumCertificatesInStore -//sys CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) = crypt32.CertAddCertificateContextToStore +//sys CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) = crypt32.CertAddCertificateContextToStore //sys CertCloseStore(store Handle, flags uint32) (err error) = crypt32.CertCloseStore //sys CertDeleteCertificateFromStore(certContext *CertContext) (err error) = crypt32.CertDeleteCertificateFromStore //sys CertDuplicateCertificateContext(certContext *CertContext) (dupContext *CertContext) = crypt32.CertDuplicateCertificateContext -//sys PFXImportCertStore(pfx *CryptDataBlob, password *uint16, flags uint32) (store Handle, err error) = crypt32.PFXImportCertStore -//sys CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) = crypt32.CertGetCertificateChain -//sys CertFreeCertificateChain(ctx *CertChainContext) = crypt32.CertFreeCertificateChain -//sys CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) [failretval==nil] = crypt32.CertCreateCertificateContext -//sys CertFreeCertificateContext(ctx *CertContext) (err error) = crypt32.CertFreeCertificateContext -//sys CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) = crypt32.CertVerifyCertificateChainPolicy +//sys PFXImportCertStore(pfx *CryptDataBlob, password *uint16, flags uint32) (store Handle, err error) = crypt32.PFXImportCertStore +//sys CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) = crypt32.CertGetCertificateChain +//sys CertFreeCertificateChain(ctx *CertChainContext) = crypt32.CertFreeCertificateChain +//sys CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) [failretval==nil] = crypt32.CertCreateCertificateContext +//sys CertFreeCertificateContext(ctx *CertContext) (err error) = crypt32.CertFreeCertificateContext +//sys CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) = crypt32.CertVerifyCertificateChainPolicy +//sys CertGetNameString(certContext *CertContext, nameType uint32, flags uint32, typePara unsafe.Pointer, name *uint16, size uint32) (chars uint32) = crypt32.CertGetNameStringW +//sys CertFindExtension(objId *byte, countExtensions uint32, extensions *CertExtension) (ret *CertExtension) = crypt32.CertFindExtension +//sys CryptQueryObject(objectType uint32, object unsafe.Pointer, expectedContentTypeFlags uint32, expectedFormatTypeFlags uint32, flags uint32, msgAndCertEncodingType *uint32, contentType *uint32, formatType *uint32, certStore *Handle, msg *Handle, context *unsafe.Pointer) (err error) = crypt32.CryptQueryObject +//sys CryptDecodeObject(encodingType uint32, structType *byte, encodedBytes *byte, lenEncodedBytes uint32, flags uint32, decoded unsafe.Pointer, decodedLen *uint32) (err error) = crypt32.CryptDecodeObject //sys RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) = advapi32.RegOpenKeyExW //sys RegCloseKey(key Handle) (regerrno error) = advapi32.RegCloseKey //sys RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegQueryInfoKeyW diff --git a/windows/types_windows.go b/windows/types_windows.go index dc8017dd..8da35b04 100644 --- a/windows/types_windows.go +++ b/windows/types_windows.go @@ -427,6 +427,67 @@ const ( CERT_CLOSE_STORE_FORCE_FLAG = 0x00000001 CERT_CLOSE_STORE_CHECK_FLAG = 0x00000002 + /* CryptQueryObject object type */ + CERT_QUERY_OBJECT_FILE = 1 + CERT_QUERY_OBJECT_BLOB = 2 + + /* CryptQueryObject content type flags */ + CERT_QUERY_CONTENT_CERT = 1 + CERT_QUERY_CONTENT_CTL = 2 + CERT_QUERY_CONTENT_CRL = 3 + CERT_QUERY_CONTENT_SERIALIZED_STORE = 4 + CERT_QUERY_CONTENT_SERIALIZED_CERT = 5 + CERT_QUERY_CONTENT_SERIALIZED_CTL = 6 + CERT_QUERY_CONTENT_SERIALIZED_CRL = 7 + CERT_QUERY_CONTENT_PKCS7_SIGNED = 8 + CERT_QUERY_CONTENT_PKCS7_UNSIGNED = 9 + CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED = 10 + CERT_QUERY_CONTENT_PKCS10 = 11 + CERT_QUERY_CONTENT_PFX = 12 + CERT_QUERY_CONTENT_CERT_PAIR = 13 + CERT_QUERY_CONTENT_PFX_AND_LOAD = 14 + CERT_QUERY_CONTENT_FLAG_CERT = (1 << CERT_QUERY_CONTENT_CERT) + CERT_QUERY_CONTENT_FLAG_CTL = (1 << CERT_QUERY_CONTENT_CTL) + CERT_QUERY_CONTENT_FLAG_CRL = (1 << CERT_QUERY_CONTENT_CRL) + CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE = (1 << CERT_QUERY_CONTENT_SERIALIZED_STORE) + CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT = (1 << CERT_QUERY_CONTENT_SERIALIZED_CERT) + CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL = (1 << CERT_QUERY_CONTENT_SERIALIZED_CTL) + CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL = (1 << CERT_QUERY_CONTENT_SERIALIZED_CRL) + CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED = (1 << CERT_QUERY_CONTENT_PKCS7_SIGNED) + CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED = (1 << CERT_QUERY_CONTENT_PKCS7_UNSIGNED) + CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED = (1 << CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED) + CERT_QUERY_CONTENT_FLAG_PKCS10 = (1 << CERT_QUERY_CONTENT_PKCS10) + CERT_QUERY_CONTENT_FLAG_PFX = (1 << CERT_QUERY_CONTENT_PFX) + CERT_QUERY_CONTENT_FLAG_CERT_PAIR = (1 << CERT_QUERY_CONTENT_CERT_PAIR) + CERT_QUERY_CONTENT_FLAG_PFX_AND_LOAD = (1 << CERT_QUERY_CONTENT_PFX_AND_LOAD) + CERT_QUERY_CONTENT_FLAG_ALL = (CERT_QUERY_CONTENT_FLAG_CERT | CERT_QUERY_CONTENT_FLAG_CTL | CERT_QUERY_CONTENT_FLAG_CRL | CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE | CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT | CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL | CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL | CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED | CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED | CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED | CERT_QUERY_CONTENT_FLAG_PKCS10 | CERT_QUERY_CONTENT_FLAG_PFX | CERT_QUERY_CONTENT_FLAG_CERT_PAIR) + CERT_QUERY_CONTENT_FLAG_ALL_ISSUER_CERT = (CERT_QUERY_CONTENT_FLAG_CERT | CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE | CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT | CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED | CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED) + + /* CryptQueryObject format type flags */ + CERT_QUERY_FORMAT_BINARY = 1 + CERT_QUERY_FORMAT_BASE64_ENCODED = 2 + CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED = 3 + CERT_QUERY_FORMAT_FLAG_BINARY = (1 << CERT_QUERY_FORMAT_BINARY) + CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED = (1 << CERT_QUERY_FORMAT_BASE64_ENCODED) + CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED = (1 << CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED) + CERT_QUERY_FORMAT_FLAG_ALL = (CERT_QUERY_FORMAT_FLAG_BINARY | CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED | CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED) + + /* CertGetNameString name types */ + CERT_NAME_EMAIL_TYPE = 1 + CERT_NAME_RDN_TYPE = 2 + CERT_NAME_ATTR_TYPE = 3 + CERT_NAME_SIMPLE_DISPLAY_TYPE = 4 + CERT_NAME_FRIENDLY_DISPLAY_TYPE = 5 + CERT_NAME_DNS_TYPE = 6 + CERT_NAME_URL_TYPE = 7 + CERT_NAME_UPN_TYPE = 8 + + /* CertGetNameString flags */ + CERT_NAME_ISSUER_FLAG = 0x1 + CERT_NAME_DISABLE_IE4_UTF8_FLAG = 0x10000 + CERT_NAME_SEARCH_ALL_NAMES_FLAG = 0x2 + CERT_NAME_STR_ENABLE_PUNYCODE_FLAG = 0x00200000 + /* AuthType values for SSLExtraCertChainPolicyPara struct */ AUTHTYPE_CLIENT = 1 AUTHTYPE_SERVER = 2 @@ -1051,7 +1112,57 @@ type MibIfRow struct { } type CertInfo struct { - // Not implemented + Version uint32 + SerialNumber CryptIntegerBlob + SignatureAlgorithm CryptAlgorithmIdentifier + Issuer CertNameBlob + NotBefore Filetime + NotAfter Filetime + Subject CertNameBlob + SubjectPublicKeyInfo CertPublicKeyInfo + IssuerUniqueId CryptBitBlob + SubjectUniqueId CryptBitBlob + CountExtensions uint32 + Extensions *CertExtension +} + +type CertExtension struct { + ObjId *byte + Critical bool + Value CryptObjidBlob +} + +type CryptAlgorithmIdentifier struct { + ObjId *byte + Parameters CryptObjidBlob +} + +type CertPublicKeyInfo struct { + Algorithm CryptAlgorithmIdentifier + PublicKey CryptBitBlob +} + +type DataBlob struct { + Size uint32 + Data *byte +} +type CryptIntegerBlob DataBlob +type CryptUintBlob DataBlob +type CryptObjidBlob DataBlob +type CertNameBlob DataBlob +type CertRdnValueBlob DataBlob +type CertBlob DataBlob +type CrlBlob DataBlob +type CryptDataBlob DataBlob +type CryptHashBlob DataBlob +type CryptDigestBlob DataBlob +type CryptDerBlob DataBlob +type CryptAttrBlob DataBlob + +type CryptBitBlob struct { + Size uint32 + Data *byte + UnusedBits uint32 } type CertContext struct { @@ -1157,9 +1268,19 @@ type CertChainPolicyStatus struct { ExtraPolicyStatus Pointer } -type CryptDataBlob struct { - Size uint32 - Data *byte +type CertPolicy struct { + Identifier *byte + CountQualifiers uint32 + Qualifiers *CertPolicyQualifierInfo +} + +type CertPoliciesInfo struct { + Count uint32 + PolicyInfos *CertPolicy +} + +type CertPolicyQualifierInfo struct { + // Not implemented } const ( diff --git a/windows/zsyscall_windows.go b/windows/zsyscall_windows.go index a164e984..4545585f 100644 --- a/windows/zsyscall_windows.go +++ b/windows/zsyscall_windows.go @@ -145,12 +145,16 @@ var ( procCertDeleteCertificateFromStore = modcrypt32.NewProc("CertDeleteCertificateFromStore") procCertDuplicateCertificateContext = modcrypt32.NewProc("CertDuplicateCertificateContext") procCertEnumCertificatesInStore = modcrypt32.NewProc("CertEnumCertificatesInStore") + procCertFindExtension = modcrypt32.NewProc("CertFindExtension") procCertFreeCertificateChain = modcrypt32.NewProc("CertFreeCertificateChain") procCertFreeCertificateContext = modcrypt32.NewProc("CertFreeCertificateContext") procCertGetCertificateChain = modcrypt32.NewProc("CertGetCertificateChain") + procCertGetNameStringW = modcrypt32.NewProc("CertGetNameStringW") procCertOpenStore = modcrypt32.NewProc("CertOpenStore") procCertOpenSystemStoreW = modcrypt32.NewProc("CertOpenSystemStoreW") procCertVerifyCertificateChainPolicy = modcrypt32.NewProc("CertVerifyCertificateChainPolicy") + procCryptDecodeObject = modcrypt32.NewProc("CryptDecodeObject") + procCryptQueryObject = modcrypt32.NewProc("CryptQueryObject") procPFXImportCertStore = modcrypt32.NewProc("PFXImportCertStore") procDnsNameCompare_W = moddnsapi.NewProc("DnsNameCompare_W") procDnsQuery_W = moddnsapi.NewProc("DnsQuery_W") @@ -1202,6 +1206,12 @@ func CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (contex return } +func CertFindExtension(objId *byte, countExtensions uint32, extensions *CertExtension) (ret *CertExtension) { + r0, _, _ := syscall.Syscall(procCertFindExtension.Addr(), 3, uintptr(unsafe.Pointer(objId)), uintptr(countExtensions), uintptr(unsafe.Pointer(extensions))) + ret = (*CertExtension)(unsafe.Pointer(r0)) + return +} + func CertFreeCertificateChain(ctx *CertChainContext) { syscall.Syscall(procCertFreeCertificateChain.Addr(), 1, uintptr(unsafe.Pointer(ctx)), 0, 0) return @@ -1223,6 +1233,12 @@ func CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, a return } +func CertGetNameString(certContext *CertContext, nameType uint32, flags uint32, typePara unsafe.Pointer, name *uint16, size uint32) (chars uint32) { + r0, _, _ := syscall.Syscall6(procCertGetNameStringW.Addr(), 6, uintptr(unsafe.Pointer(certContext)), uintptr(nameType), uintptr(flags), uintptr(typePara), uintptr(unsafe.Pointer(name)), uintptr(size)) + chars = uint32(r0) + return +} + func CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) { r0, _, e1 := syscall.Syscall6(procCertOpenStore.Addr(), 5, uintptr(storeProvider), uintptr(msgAndCertEncodingType), uintptr(cryptProv), uintptr(flags), uintptr(para), 0) handle = Handle(r0) @@ -1249,6 +1265,22 @@ func CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext return } +func CryptDecodeObject(encodingType uint32, structType *byte, encodedBytes *byte, lenEncodedBytes uint32, flags uint32, decoded unsafe.Pointer, decodedLen *uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procCryptDecodeObject.Addr(), 7, uintptr(encodingType), uintptr(unsafe.Pointer(structType)), uintptr(unsafe.Pointer(encodedBytes)), uintptr(lenEncodedBytes), uintptr(flags), uintptr(decoded), uintptr(unsafe.Pointer(decodedLen)), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func CryptQueryObject(objectType uint32, object unsafe.Pointer, expectedContentTypeFlags uint32, expectedFormatTypeFlags uint32, flags uint32, msgAndCertEncodingType *uint32, contentType *uint32, formatType *uint32, certStore *Handle, msg *Handle, context *unsafe.Pointer) (err error) { + r1, _, e1 := syscall.Syscall12(procCryptQueryObject.Addr(), 11, uintptr(objectType), uintptr(object), uintptr(expectedContentTypeFlags), uintptr(expectedFormatTypeFlags), uintptr(flags), uintptr(unsafe.Pointer(msgAndCertEncodingType)), uintptr(unsafe.Pointer(contentType)), uintptr(unsafe.Pointer(formatType)), uintptr(unsafe.Pointer(certStore)), uintptr(unsafe.Pointer(msg)), uintptr(unsafe.Pointer(context)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func PFXImportCertStore(pfx *CryptDataBlob, password *uint16, flags uint32) (store Handle, err error) { r0, _, e1 := syscall.Syscall(procPFXImportCertStore.Addr(), 3, uintptr(unsafe.Pointer(pfx)), uintptr(unsafe.Pointer(password)), uintptr(flags)) store = Handle(r0) From 07034700bc4cc170e0b3eec0a16ba45abdff7768 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Fri, 22 Jan 2021 17:59:47 +0100 Subject: [PATCH 16/18] windows: add WinVerifyTrustEx function This commit adds the function and the required structs for it. This is the same as the WinVerifyTrust function but has the more correct signature. https://docs.microsoft.com/en-us/windows/win32/api/wintrust/nf-wintrust-winverifytrustex Change-Id: I43ae20302ba85a6ae1fc32ad4c34b59bee0a6a35 Reviewed-on: https://go-review.googlesource.com/c/sys/+/285715 Run-TryBot: Jason A. Donenfeld TryBot-Result: Go Bot Trust: Jason A. Donenfeld Reviewed-by: Brad Fitzpatrick --- windows/syscall_windows.go | 2 + windows/types_windows.go | 86 +++++++++++++++++++++++++++++++++++++ windows/zsyscall_windows.go | 10 +++++ 3 files changed, 98 insertions(+) diff --git a/windows/syscall_windows.go b/windows/syscall_windows.go index 5c1102c0..13d74250 100644 --- a/windows/syscall_windows.go +++ b/windows/syscall_windows.go @@ -22,6 +22,7 @@ type HWND uintptr const ( InvalidHandle = ^Handle(0) + InvalidHWND = ^HWND(0) // Flags for DefineDosDevice. DDD_EXACT_MATCH_ON_REMOVE = 0x00000004 @@ -284,6 +285,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys CertFindExtension(objId *byte, countExtensions uint32, extensions *CertExtension) (ret *CertExtension) = crypt32.CertFindExtension //sys CryptQueryObject(objectType uint32, object unsafe.Pointer, expectedContentTypeFlags uint32, expectedFormatTypeFlags uint32, flags uint32, msgAndCertEncodingType *uint32, contentType *uint32, formatType *uint32, certStore *Handle, msg *Handle, context *unsafe.Pointer) (err error) = crypt32.CryptQueryObject //sys CryptDecodeObject(encodingType uint32, structType *byte, encodedBytes *byte, lenEncodedBytes uint32, flags uint32, decoded unsafe.Pointer, decodedLen *uint32) (err error) = crypt32.CryptDecodeObject +//sys WinVerifyTrustEx(hwnd HWND, actionId *GUID, data *WinTrustData) (ret error) = wintrust.WinVerifyTrustEx //sys RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) = advapi32.RegOpenKeyExW //sys RegCloseKey(key Handle) (regerrno error) = advapi32.RegCloseKey //sys RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegQueryInfoKeyW diff --git a/windows/types_windows.go b/windows/types_windows.go index 8da35b04..453f56fd 100644 --- a/windows/types_windows.go +++ b/windows/types_windows.go @@ -520,10 +520,58 @@ const ( REALTIME_PRIORITY_CLASS = 0x00000100 ) +/* wintrust.h constants for WinVerifyTrustEx */ +const ( + WTD_UI_ALL = 1 + WTD_UI_NONE = 2 + WTD_UI_NOBAD = 3 + WTD_UI_NOGOOD = 4 + + WTD_REVOKE_NONE = 0 + WTD_REVOKE_WHOLECHAIN = 1 + + WTD_CHOICE_FILE = 1 + WTD_CHOICE_CATALOG = 2 + WTD_CHOICE_BLOB = 3 + WTD_CHOICE_SIGNER = 4 + WTD_CHOICE_CERT = 5 + + WTD_STATEACTION_IGNORE = 0x00000000 + WTD_STATEACTION_VERIFY = 0x00000010 + WTD_STATEACTION_CLOSE = 0x00000002 + WTD_STATEACTION_AUTO_CACHE = 0x00000003 + WTD_STATEACTION_AUTO_CACHE_FLUSH = 0x00000004 + + WTD_USE_IE4_TRUST_FLAG = 0x1 + WTD_NO_IE4_CHAIN_FLAG = 0x2 + WTD_NO_POLICY_USAGE_FLAG = 0x4 + WTD_REVOCATION_CHECK_NONE = 0x10 + WTD_REVOCATION_CHECK_END_CERT = 0x20 + WTD_REVOCATION_CHECK_CHAIN = 0x40 + WTD_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT = 0x80 + WTD_SAFER_FLAG = 0x100 + WTD_HASH_ONLY_FLAG = 0x200 + WTD_USE_DEFAULT_OSVER_CHECK = 0x400 + WTD_LIFETIME_SIGNING_FLAG = 0x800 + WTD_CACHE_ONLY_URL_RETRIEVAL = 0x1000 + WTD_DISABLE_MD2_MD4 = 0x2000 + WTD_MOTW = 0x4000 + + WTD_UICONTEXT_EXECUTE = 0 + WTD_UICONTEXT_INSTALL = 1 +) + var ( OID_PKIX_KP_SERVER_AUTH = []byte("1.3.6.1.5.5.7.3.1\x00") OID_SERVER_GATED_CRYPTO = []byte("1.3.6.1.4.1.311.10.3.3\x00") OID_SGC_NETSCAPE = []byte("2.16.840.1.113730.4.1\x00") + + WINTRUST_ACTION_GENERIC_VERIFY_V2 = GUID{ + Data1: 0xaac56b, + Data2: 0xcd44, + Data3: 0x11d0, + Data4: [8]byte{0x8c, 0xc2, 0x0, 0xc0, 0x4f, 0xc2, 0x95, 0xee}, + } ) // Pointer represents a pointer to an arbitrary Windows type. @@ -1283,6 +1331,44 @@ type CertPolicyQualifierInfo struct { // Not implemented } +type CertStrongSignPara struct { + Size uint32 + InfoChoice uint32 + InfoOrSerializedInfoOrOID unsafe.Pointer +} + +type WinTrustData struct { + Size uint32 + PolicyCallbackData uintptr + SIPClientData uintptr + UIChoice uint32 + RevocationChecks uint32 + UnionChoice uint32 + FileOrCatalogOrBlobOrSgnrOrCert unsafe.Pointer + StateAction uint32 + StateData Handle + URLReference *uint16 + ProvFlags uint32 + UIContext uint32 + SignatureSettings *WinTrustSignatureSettings +} + +type WinTrustFileInfo struct { + Size uint32 + FilePath *uint16 + File Handle + KnownSubject *GUID +} + +type WinTrustSignatureSettings struct { + Size uint32 + Index uint32 + Flags uint32 + SecondarySigs uint32 + VerifiedSigIndex uint32 + CryptoPolicy *CertStrongSignPara +} + const ( // do not reorder HKEY_CLASSES_ROOT = 0x80000000 + iota diff --git a/windows/zsyscall_windows.go b/windows/zsyscall_windows.go index 4545585f..b28a1934 100644 --- a/windows/zsyscall_windows.go +++ b/windows/zsyscall_windows.go @@ -51,6 +51,7 @@ var ( modshell32 = NewLazySystemDLL("shell32.dll") moduser32 = NewLazySystemDLL("user32.dll") moduserenv = NewLazySystemDLL("userenv.dll") + modwintrust = NewLazySystemDLL("wintrust.dll") modws2_32 = NewLazySystemDLL("ws2_32.dll") modwtsapi32 = NewLazySystemDLL("wtsapi32.dll") @@ -354,6 +355,7 @@ var ( procCreateEnvironmentBlock = moduserenv.NewProc("CreateEnvironmentBlock") procDestroyEnvironmentBlock = moduserenv.NewProc("DestroyEnvironmentBlock") procGetUserProfileDirectoryW = moduserenv.NewProc("GetUserProfileDirectoryW") + procWinVerifyTrustEx = modwintrust.NewProc("WinVerifyTrustEx") procFreeAddrInfoW = modws2_32.NewProc("FreeAddrInfoW") procGetAddrInfoW = modws2_32.NewProc("GetAddrInfoW") procWSACleanup = modws2_32.NewProc("WSACleanup") @@ -3023,6 +3025,14 @@ func GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) { return } +func WinVerifyTrustEx(hwnd HWND, actionId *GUID, data *WinTrustData) (ret error) { + r0, _, _ := syscall.Syscall(procWinVerifyTrustEx.Addr(), 3, uintptr(hwnd), uintptr(unsafe.Pointer(actionId)), uintptr(unsafe.Pointer(data))) + if r0 != 0 { + ret = syscall.Errno(r0) + } + return +} + func FreeAddrInfoW(addrinfo *AddrinfoW) { syscall.Syscall(procFreeAddrInfoW.Addr(), 1, uintptr(unsafe.Pointer(addrinfo)), 0, 0) return From 1d476976d117e1bdd11a68e2b0d4c2eb15555b25 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Fri, 22 Jan 2021 18:27:41 +0100 Subject: [PATCH 17/18] windows: add support for DPAPI DPAPI allows machine or user-based blob encryption, using APIs from crypt32: https://docs.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptunprotectdata https://docs.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptprotectdata Change-Id: I57fb4f1877a5fb7629809e79111cbfa02b11cca3 Reviewed-on: https://go-review.googlesource.com/c/sys/+/285716 Run-TryBot: Jason A. Donenfeld TryBot-Result: Go Bot Trust: Jason A. Donenfeld Reviewed-by: Brad Fitzpatrick --- windows/syscall_windows.go | 2 ++ windows/types_windows.go | 23 +++++++++++++++++++++++ windows/zsyscall_windows.go | 18 ++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/windows/syscall_windows.go b/windows/syscall_windows.go index 13d74250..0197df87 100644 --- a/windows/syscall_windows.go +++ b/windows/syscall_windows.go @@ -285,6 +285,8 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys CertFindExtension(objId *byte, countExtensions uint32, extensions *CertExtension) (ret *CertExtension) = crypt32.CertFindExtension //sys CryptQueryObject(objectType uint32, object unsafe.Pointer, expectedContentTypeFlags uint32, expectedFormatTypeFlags uint32, flags uint32, msgAndCertEncodingType *uint32, contentType *uint32, formatType *uint32, certStore *Handle, msg *Handle, context *unsafe.Pointer) (err error) = crypt32.CryptQueryObject //sys CryptDecodeObject(encodingType uint32, structType *byte, encodedBytes *byte, lenEncodedBytes uint32, flags uint32, decoded unsafe.Pointer, decodedLen *uint32) (err error) = crypt32.CryptDecodeObject +//sys CryptProtectData(dataIn *DataBlob, name *uint16, optionalEntropy *DataBlob, reserved uintptr, promptStruct *CryptProtectPromptStruct, flags uint32, dataOut *DataBlob) (err error) = crypt32.CryptProtectData +//sys CryptUnprotectData(dataIn *DataBlob, name **uint16, optionalEntropy *DataBlob, reserved uintptr, promptStruct *CryptProtectPromptStruct, flags uint32, dataOut *DataBlob) (err error) = crypt32.CryptUnprotectData //sys WinVerifyTrustEx(hwnd HWND, actionId *GUID, data *WinTrustData) (ret error) = wintrust.WinVerifyTrustEx //sys RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) = advapi32.RegOpenKeyExW //sys RegCloseKey(key Handle) (regerrno error) = advapi32.RegCloseKey diff --git a/windows/types_windows.go b/windows/types_windows.go index 453f56fd..1f51bb8a 100644 --- a/windows/types_windows.go +++ b/windows/types_windows.go @@ -498,6 +498,22 @@ const ( SECURITY_FLAG_IGNORE_WRONG_USAGE = 0x00000200 SECURITY_FLAG_IGNORE_CERT_CN_INVALID = 0x00001000 SECURITY_FLAG_IGNORE_CERT_DATE_INVALID = 0x00002000 + + /* Flags for Crypt[Un]ProtectData */ + CRYPTPROTECT_UI_FORBIDDEN = 0x1 + CRYPTPROTECT_LOCAL_MACHINE = 0x4 + CRYPTPROTECT_CRED_SYNC = 0x8 + CRYPTPROTECT_AUDIT = 0x10 + CRYPTPROTECT_NO_RECOVERY = 0x20 + CRYPTPROTECT_VERIFY_PROTECTION = 0x40 + CRYPTPROTECT_CRED_REGENERATE = 0x80 + + /* Flags for CryptProtectPromptStruct */ + CRYPTPROTECT_PROMPT_ON_UNPROTECT = 1 + CRYPTPROTECT_PROMPT_ON_PROTECT = 2 + CRYPTPROTECT_PROMPT_RESERVED = 4 + CRYPTPROTECT_PROMPT_STRONG = 8 + CRYPTPROTECT_PROMPT_REQUIRE_STRONG = 16 ) const ( @@ -1337,6 +1353,13 @@ type CertStrongSignPara struct { InfoOrSerializedInfoOrOID unsafe.Pointer } +type CryptProtectPromptStruct struct { + Size uint32 + PromptFlags uint32 + App HWND + Prompt *uint16 +} + type WinTrustData struct { Size uint32 PolicyCallbackData uintptr diff --git a/windows/zsyscall_windows.go b/windows/zsyscall_windows.go index b28a1934..c38c59d7 100644 --- a/windows/zsyscall_windows.go +++ b/windows/zsyscall_windows.go @@ -155,7 +155,9 @@ var ( procCertOpenSystemStoreW = modcrypt32.NewProc("CertOpenSystemStoreW") procCertVerifyCertificateChainPolicy = modcrypt32.NewProc("CertVerifyCertificateChainPolicy") procCryptDecodeObject = modcrypt32.NewProc("CryptDecodeObject") + procCryptProtectData = modcrypt32.NewProc("CryptProtectData") procCryptQueryObject = modcrypt32.NewProc("CryptQueryObject") + procCryptUnprotectData = modcrypt32.NewProc("CryptUnprotectData") procPFXImportCertStore = modcrypt32.NewProc("PFXImportCertStore") procDnsNameCompare_W = moddnsapi.NewProc("DnsNameCompare_W") procDnsQuery_W = moddnsapi.NewProc("DnsQuery_W") @@ -1275,6 +1277,14 @@ func CryptDecodeObject(encodingType uint32, structType *byte, encodedBytes *byte return } +func CryptProtectData(dataIn *DataBlob, name *uint16, optionalEntropy *DataBlob, reserved uintptr, promptStruct *CryptProtectPromptStruct, flags uint32, dataOut *DataBlob) (err error) { + r1, _, e1 := syscall.Syscall9(procCryptProtectData.Addr(), 7, uintptr(unsafe.Pointer(dataIn)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(optionalEntropy)), uintptr(reserved), uintptr(unsafe.Pointer(promptStruct)), uintptr(flags), uintptr(unsafe.Pointer(dataOut)), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func CryptQueryObject(objectType uint32, object unsafe.Pointer, expectedContentTypeFlags uint32, expectedFormatTypeFlags uint32, flags uint32, msgAndCertEncodingType *uint32, contentType *uint32, formatType *uint32, certStore *Handle, msg *Handle, context *unsafe.Pointer) (err error) { r1, _, e1 := syscall.Syscall12(procCryptQueryObject.Addr(), 11, uintptr(objectType), uintptr(object), uintptr(expectedContentTypeFlags), uintptr(expectedFormatTypeFlags), uintptr(flags), uintptr(unsafe.Pointer(msgAndCertEncodingType)), uintptr(unsafe.Pointer(contentType)), uintptr(unsafe.Pointer(formatType)), uintptr(unsafe.Pointer(certStore)), uintptr(unsafe.Pointer(msg)), uintptr(unsafe.Pointer(context)), 0) if r1 == 0 { @@ -1283,6 +1293,14 @@ func CryptQueryObject(objectType uint32, object unsafe.Pointer, expectedContentT return } +func CryptUnprotectData(dataIn *DataBlob, name **uint16, optionalEntropy *DataBlob, reserved uintptr, promptStruct *CryptProtectPromptStruct, flags uint32, dataOut *DataBlob) (err error) { + r1, _, e1 := syscall.Syscall9(procCryptUnprotectData.Addr(), 7, uintptr(unsafe.Pointer(dataIn)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(optionalEntropy)), uintptr(reserved), uintptr(unsafe.Pointer(promptStruct)), uintptr(flags), uintptr(unsafe.Pointer(dataOut)), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func PFXImportCertStore(pfx *CryptDataBlob, password *uint16, flags uint32) (store Handle, err error) { r0, _, e1 := syscall.Syscall(procPFXImportCertStore.Addr(), 3, uintptr(unsafe.Pointer(pfx)), uintptr(unsafe.Pointer(password)), uintptr(flags)) store = Handle(r0) From 22da62e12c0cd9c1da93581e1113ca4d82a5be14 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Sun, 24 Jan 2021 13:57:14 +0100 Subject: [PATCH 18/18] windows: correct struct name and bool type This fixes the name of a struct to match Microsoft's documentation. It also reverts a change I made in the last patchset of CL 285714. The idea there was that a Go bool would suffice for a win32 BOOL, because of little endian. But in fact, a value of 0xff000000 would be treated as false by Go but true by C, which is a problem. So this changes to using a vanilla int32 type, which matches the C "int" used in the Microsoft headers. Change-Id: Id7cd306e916b3754e8dfe32bf11ec30cad3a13b4 Reviewed-on: https://go-review.googlesource.com/c/sys/+/285717 Trust: Jason A. Donenfeld Run-TryBot: Jason A. Donenfeld TryBot-Result: Go Bot Reviewed-by: Brad Fitzpatrick --- windows/types_windows.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/windows/types_windows.go b/windows/types_windows.go index 1f51bb8a..fd426076 100644 --- a/windows/types_windows.go +++ b/windows/types_windows.go @@ -1192,7 +1192,7 @@ type CertInfo struct { type CertExtension struct { ObjId *byte - Critical bool + Critical int32 Value CryptObjidBlob } @@ -1332,7 +1332,7 @@ type CertChainPolicyStatus struct { ExtraPolicyStatus Pointer } -type CertPolicy struct { +type CertPolicyInfo struct { Identifier *byte CountQualifiers uint32 Qualifiers *CertPolicyQualifierInfo @@ -1340,7 +1340,7 @@ type CertPolicy struct { type CertPoliciesInfo struct { Count uint32 - PolicyInfos *CertPolicy + PolicyInfos *CertPolicyInfo } type CertPolicyQualifierInfo struct {