-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathipaddr.go
More file actions
100 lines (90 loc) · 1.89 KB
/
ipaddr.go
File metadata and controls
100 lines (90 loc) · 1.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package main
import (
"flag"
"fmt"
"log"
"net"
"os"
"sort"
"strings"
)
func filterIPv6(addr string) bool {
return !strings.Contains(addr, ":")
}
func filterLinkLocal(addr string) bool {
return !strings.HasPrefix(addr, "fe80:")
}
func main() {
flag.Usage = func() {
fmt.Fprintf(flag.CommandLine.Output(), "Usage: %s [-6] [-l] [<interface>]\n\nParameters:\n", os.Args[0])
flag.PrintDefaults()
}
showIPv6 := flag.Bool("6", false, "also show IPv6 addresses")
showLinkLocal := flag.Bool("l", false, "also show IPv6 link-local addresses")
flag.Parse()
filter := func(_ string) bool {
return true
}
if !*showIPv6 {
filter = filterIPv6
} else if !*showLinkLocal {
filter = filterLinkLocal
}
ifaces := getInterfaces(flag.Args())
maxlen := longestName(ifaces)
for _, iface := range ifaces {
printIface(maxlen, iface, filter)
}
}
func getInterfaces(args []string) []net.Interface {
var ifaces []net.Interface
var err error
if len(args) == 0 {
ifaces, err = net.Interfaces()
if err != nil {
log.Fatal(err)
}
}
for _, ifname := range args {
iface, err := net.InterfaceByName(ifname)
if err != nil {
log.Fatal(err)
}
ifaces = append(ifaces, *iface)
}
return ifaces
}
func longestName(ifaces []net.Interface) int {
length := 0
for _, iface := range ifaces {
if len(iface.Name) > length {
length = len(iface.Name)
}
}
return length
}
func printIface(namelen int, iface net.Interface, filter func(string) bool) {
addrs, err := iface.Addrs()
if err != nil {
log.Fatal(err)
}
var strAddrs []string
for _, addr := range addrs {
strAddr := addr.String()
if filter(strAddr) {
strAddrs = append(strAddrs, strAddr)
}
}
if len(strAddrs) == 0 {
return
}
sort.Strings(strAddrs)
fmtStr := fmt.Sprintf("%%-%ds %%s\n", namelen)
ifname := iface.Name
for i, addr := range strAddrs {
if i > 0 {
ifname = ""
}
fmt.Printf(fmtStr, ifname, addr)
}
}