diff --git a/convert.go b/convert.go index b1e5446..11ee7d5 100644 --- a/convert.go +++ b/convert.go @@ -4,6 +4,8 @@ import ( "fmt" "net" "path/filepath" + "runtime" + "strings" ma "github.com/multiformats/go-multiaddr" ) @@ -192,6 +194,10 @@ func DialArgs(m ma.Multiaddr) (string, string, error) { } return network, "[" + ip + "]" + ":" + port, nil case "unix": + if runtime.GOOS == "windows" { + // convert /c:/... to c:\... + ip = filepath.FromSlash(strings.TrimLeft(ip, "/")) + } return network, ip, nil default: return "", "", fmt.Errorf("%s is not a 'thin waist' address", m) @@ -263,6 +269,16 @@ func parseUnixNetAddr(a net.Addr) (ma.Multiaddr, error) { if !ok { return nil, errIncorrectNetAddr } - cleaned := filepath.Clean(ac.Name) - return ma.NewComponent("unix", cleaned) + + path := ac.Name + if runtime.GOOS == "windows" { + // Convert c:\foobar\... to c:/foobar/... + path = filepath.ToSlash(path) + } + if len(path) == 0 || path[0] != '/' { + // convert "" and "c:/..." to "/..." + path = "/" + path + } + + return ma.NewComponent("unix", path) } diff --git a/convert_test.go b/convert_test.go index 33250a0..21d36ec 100644 --- a/convert_test.go +++ b/convert_test.go @@ -2,6 +2,7 @@ package manet import ( "net" + "runtime" "testing" ma "github.com/multiformats/go-multiaddr" @@ -64,6 +65,24 @@ func TestFromIP4(t *testing.T) { }) } +func TestFromUnix(t *testing.T) { + path := "/C:/foo/bar" + if runtime.GOOS == "windows" { + path = `C:\foo\bar` + } + testConvert(t, "/unix/C:/foo/bar", func() (ma.Multiaddr, error) { + return FromNetAddr(&net.UnixAddr{Name: path, Net: "unix"}) + }) +} + +func TestToUnix(t *testing.T) { + path := "/C:/foo/bar" + if runtime.GOOS == "windows" { + path = `C:\foo\bar` + } + testToNetAddr(t, "/unix/C:/foo/bar", "unix", path) +} + func TestFromIP6(t *testing.T) { testConvert(t, "/ip6/2001:4860:0:2001::68", func() (ma.Multiaddr, error) { return FromNetAddr(&net.IPAddr{IP: net.ParseIP("2001:4860:0:2001::68")})