Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions nfs/nfs.go
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ type FSInfo struct {
Properties uint32
}

// Dial an RPC svc after getting the port from the portmapper
// DialService Dial an RPC svc after getting the port from the portmapper
func DialService(addr string, prog rpc.Mapping) (*rpc.Client, error) {
pm, err := rpc.DialPortmapper("tcp", addr)
if err != nil {
Expand Down Expand Up @@ -328,7 +328,7 @@ func dialService(addr string, port int) (*rpc.Client, error) {
}

func isAddrInUse(err error) bool {
if er, ok := (err.(*net.OpError)); ok {
if er, ok := err.(*net.OpError); ok {
if syser, ok := er.Err.(*os.SyscallError); ok {
return syser.Err == syscall.EADDRINUSE
}
Expand Down
57 changes: 40 additions & 17 deletions nfs/rpc/portmap.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package rpc

import (
"fmt"
"io"

"github.com/willscott/go-nfs-client/nfs/xdr"
)
Expand All @@ -17,7 +18,9 @@ const (
PmapProg = 100000
PmapVers = 2

PmapProcGetPort = 3
PmapProcSetPort = 1
PMapProcUnsetPort = 2
PmapProcGetPort = 3

IPProtoTCP = 6
IPProtoUDP = 17
Expand Down Expand Up @@ -45,22 +48,7 @@ type Portmapper struct {
}

func (p *Portmapper) Getport(mapping Mapping) (int, error) {
type getport struct {
Header
Mapping
}
msg := &getport{
Header{
Rpcvers: 2,
Prog: PmapProg,
Vers: PmapVers,
Proc: PmapProcGetPort,
Cred: AuthNull,
Verf: AuthNull,
},
mapping,
}
res, err := p.Call(msg)
res, err := p.call(PmapProcGetPort, mapping)
if err != nil {
return 0, err
}
Expand All @@ -71,6 +59,41 @@ func (p *Portmapper) Getport(mapping Mapping) (int, error) {
return int(port), nil
}

func (p *Portmapper) Setport(mapping Mapping) (bool, error) {
res, err := p.call(PmapProcSetPort, mapping)
if err != nil {
return false, err
}

return xdr.ReadBoolean(res)
}

func (p *Portmapper) Unsetport(mapping Mapping) (bool, error) {
res, err := p.call(PMapProcUnsetPort, mapping)
if err != nil {
return false, err
}

return xdr.ReadBoolean(res)
}

func (p *Portmapper) call(proc uint32, mapping Mapping) (io.ReadSeeker, error) {
return p.Call(struct {
Header
Mapping
}{
Header: Header{
Rpcvers: 2,
Prog: PmapProg,
Vers: PmapVers,
Proc: proc,
Cred: AuthNull,
Verf: AuthNull,
},
Mapping: mapping,
})
}

func DialPortmapper(net, host string) (*Portmapper, error) {
client, err := DialTCP(net, nil, fmt.Sprintf("%s:%d", host, PmapPort))
if err != nil {
Expand Down
8 changes: 8 additions & 0 deletions nfs/xdr/decode.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,14 @@ func ReadUint32(r io.Reader) (uint32, error) {
return n, nil
}

func ReadBoolean(r io.Reader) (bool, error) {
var b bool
if err := Read(r, &b); err != nil {
return false, err
}
return b, nil
}

func ReadOpaque(r io.Reader) ([]byte, error) {
length, err := ReadUint32(r)
if err != nil {
Expand Down