aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/net/interface_windows.go2
-rw-r--r--src/net/net_windows_test.go53
2 files changed, 54 insertions, 1 deletions
diff --git a/src/net/interface_windows.go b/src/net/interface_windows.go
index e25c1ed560..8cb9d76237 100644
--- a/src/net/interface_windows.go
+++ b/src/net/interface_windows.go
@@ -48,7 +48,7 @@ func getInterfaceInfos() ([]syscall.InterfaceInfo, error) {
return nil, os.NewSyscallError("wsaioctl", err)
}
iilen := ret / uint32(unsafe.Sizeof(iia[0]))
- return iia[:iilen-1], nil
+ return iia[:iilen], nil
}
func bytesEqualIP(a []byte, b []int8) bool {
diff --git a/src/net/net_windows_test.go b/src/net/net_windows_test.go
index da03e10b36..4f6bd45929 100644
--- a/src/net/net_windows_test.go
+++ b/src/net/net_windows_test.go
@@ -6,10 +6,13 @@ package net
import (
"bufio"
+ "bytes"
"fmt"
"io"
"os"
"os/exec"
+ "sort"
+ "strings"
"syscall"
"testing"
"time"
@@ -163,3 +166,53 @@ func TestAcceptIgnoreSomeErrors(t *testing.T) {
t.Fatalf(`"%s" received from recv, but "abc" expected`, s)
}
}
+
+func isWindowsXP(t *testing.T) bool {
+ v, err := syscall.GetVersion()
+ if err != nil {
+ t.Fatalf("GetVersion failed: %v", err)
+ }
+ major := byte(v)
+ return major < 6
+}
+
+func listInterfacesWithNetsh() ([]string, error) {
+ out, err := exec.Command("netsh", "interface", "ip", "show", "config").CombinedOutput()
+ if err != nil {
+ return nil, fmt.Errorf("netsh failed: %v: %q", err, string(out))
+ }
+ lines := bytes.Split(out, []byte{'\r', '\n'})
+ names := make([]string, 0)
+ for _, line := range lines {
+ f := bytes.Split(line, []byte{'"'})
+ if len(f) == 3 {
+ names = append(names, string(f[1]))
+ }
+ }
+ return names, nil
+}
+
+func TestInterfaceList(t *testing.T) {
+ if isWindowsXP(t) {
+ t.Skip("Windows XP netsh command does not provide required functionality")
+ }
+ ift, err := Interfaces()
+ if err != nil {
+ t.Fatal(err)
+ }
+ have := make([]string, 0)
+ for _, ifi := range ift {
+ have = append(have, ifi.Name)
+ }
+ sort.Strings(have)
+
+ want, err := listInterfacesWithNetsh()
+ if err != nil {
+ t.Fatal(err)
+ }
+ sort.Strings(want)
+
+ if strings.Join(want, "/") != strings.Join(have, "/") {
+ t.Fatalf("unexpected interface list %q, want %q", have, want)
+ }
+}