From 4489dfa8c5d6730122141db0c17d8d3e6ba2c1c2 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 5 Nov 2014 00:38:21 -0800 Subject: [PATCH] net: added InterfaceMultiaddrs --- multiaddr/multiaddr.go | 30 ++++++++++++++++++++---------- net/convert.go | 9 ++++++++- net/convert_test.go | 2 +- net/doc.go | 4 ++-- net/net.go | 19 ++++++++++++++++++- net/net_test.go | 2 +- 6 files changed, 50 insertions(+), 16 deletions(-) diff --git a/multiaddr/multiaddr.go b/multiaddr/multiaddr.go index 3fb6137..df57238 100644 --- a/multiaddr/multiaddr.go +++ b/multiaddr/multiaddr.go @@ -7,17 +7,15 @@ import ( "os" ma "github.com/jbenet/go-multiaddr" + manet "github.com/jbenet/go-multiaddr/net" ) -var usage = `multiaddr conversion -usage: multiaddr [fmt] <>` - -var formats = []string{"string", "bytes", "hex", "raw"} +var formats = []string{"string", "bytes", "hex", "slice"} var format string func init() { flag.Usage = func() { - fmt.Fprintf(os.Stderr, "usage: %s \n\nFlags:\n", os.Args[0]) + fmt.Fprintf(os.Stderr, "usage: %s []\n\nFlags:\n", os.Args[0]) flag.PrintDefaults() } @@ -29,8 +27,14 @@ func init() { func main() { flag.Parse() args := flag.Args() - if len(args) != 1 { - die("error: can only take one argument") + if len(args) == 0 { + maddrs, err := manet.InterfaceMultiaddrs() + if err != nil { + die(err) + } + + output(maddrs...) + return } m, err := ma.NewMultiaddr(args[0]) @@ -38,16 +42,22 @@ func main() { die(err) } - fmt.Println(outfmt(m)) + output(m) +} + +func output(ms ...ma.Multiaddr) { + for _, m := range ms { + fmt.Println(outfmt(m)) + } } func outfmt(m ma.Multiaddr) string { switch format { case "string": return m.String() - case "bytes": + case "slice": return fmt.Sprintf("%v", m.Bytes()) - case "raw": + case "bytes": return string(m.Bytes()) case "hex": return "0x" + hex.EncodeToString(m.Bytes()) diff --git a/net/convert.go b/net/convert.go index 435814b..d1dc7af 100644 --- a/net/convert.go +++ b/net/convert.go @@ -1,4 +1,4 @@ -package net +package manet import ( "fmt" @@ -70,6 +70,13 @@ func FromNetAddr(a net.Addr) (ma.Multiaddr, error) { } return FromIP(ac.IP) + case "ip+net": + ac, ok := a.(*net.IPNet) + if !ok { + return nil, errIncorrectNetAddr + } + return FromIP(ac.IP) + default: return nil, fmt.Errorf("unknown network %v", a.Network()) } diff --git a/net/convert_test.go b/net/convert_test.go index cdcdc6c..4064f96 100644 --- a/net/convert_test.go +++ b/net/convert_test.go @@ -1,4 +1,4 @@ -package net +package manet import ( "net" diff --git a/net/doc.go b/net/doc.go index d73b865..040ad3f 100644 --- a/net/doc.go +++ b/net/doc.go @@ -1,5 +1,5 @@ -// Package net provides Multiaddr specific versions of common +// Package manet provides Multiaddr specific versions of common // functions in stdlib's net package. This means wrappers of // standard net symbols like net.Dial and net.Listen, as well // as conversion to/from net.Addr. -package net +package manet diff --git a/net/net.go b/net/net.go index 07bb3c1..e577d0a 100644 --- a/net/net.go +++ b/net/net.go @@ -1,4 +1,4 @@ -package net +package manet import ( "fmt" @@ -216,3 +216,20 @@ func Listen(laddr ma.Multiaddr) (Listener, error) { laddr: laddr, }, nil } + +// InterfaceMultiaddrs will return the addresses matching net.InterfaceAddrs +func InterfaceMultiaddrs() ([]ma.Multiaddr, error) { + addrs, err := net.InterfaceAddrs() + if err != nil { + return nil, err + } + + maddrs := make([]ma.Multiaddr, len(addrs)) + for i, a := range addrs { + maddrs[i], err = FromNetAddr(a) + if err != nil { + return nil, err + } + } + return maddrs, nil +} diff --git a/net/net_test.go b/net/net_test.go index 8bdddc8..c212c7c 100644 --- a/net/net_test.go +++ b/net/net_test.go @@ -1,4 +1,4 @@ -package net +package manet import ( "bytes"