diff --git a/client.go b/client.go index 8802a0b..548c549 100644 --- a/client.go +++ b/client.go @@ -10,6 +10,26 @@ import ( // NewClient creates TFTP client for server on address provided. func NewClient(addr string) (*Client, error) { + a, err := net.ResolveUDPAddr("udp", addr) + if err != nil { + return nil, fmt.Errorf("resolving address %s: %v", addr, err) + } + return &Client{ + addr: a, + timeout: defaultTimeout, + retries: defaultRetries, + localAddr: &net.UDPAddr{}, + }, nil +} + +// NewClientWithLocalAddr creates TFTP client for server on local ip address laddr provided. +func NewClientWithLocalAddr(addr string, localaddr string) (*Client, error) { + if localaddr == "" { + return nil, fmt.Errorf("localaddr is empty") + } + if net.ParseIP(localaddr) == nil { + return nil, fmt.Errorf("provided localaddr: %s is not valid ip addr", localaddr) + } a, err := net.ResolveUDPAddr("udp", addr) if err != nil { return nil, fmt.Errorf("resolving address %s: %v", addr, err) @@ -18,6 +38,10 @@ func NewClient(addr string) (*Client, error) { addr: a, timeout: defaultTimeout, retries: defaultRetries, + localAddr: &net.UDPAddr{ + IP: net.ParseIP(localaddr), + Port: 0, + }, }, nil } @@ -57,17 +81,18 @@ func (c *Client) RequestTSize(s bool) { // Client stores data about a single TFTP client type Client struct { - addr *net.UDPAddr - timeout time.Duration - retries int - backoff backoffFunc - blksize int - tsize bool + addr *net.UDPAddr + timeout time.Duration + retries int + backoff backoffFunc + blksize int + tsize bool + localAddr *net.UDPAddr } // Send starts outgoing file transmission. It returns io.ReaderFrom or error. func (c Client) Send(filename string, mode string) (io.ReaderFrom, error) { - conn, err := net.ListenUDP("udp", &net.UDPAddr{}) + conn, err := net.ListenUDP("udp", c.localAddr) if err != nil { return nil, err } @@ -97,7 +122,7 @@ func (c Client) Send(filename string, mode string) (io.ReaderFrom, error) { // Receive starts incoming file transmission. It returns io.WriterTo or error. func (c Client) Receive(filename string, mode string) (io.WriterTo, error) { - conn, err := net.ListenUDP("udp", &net.UDPAddr{}) + conn, err := net.ListenUDP("udp", c.localAddr) if err != nil { return nil, err } diff --git a/go.mod b/go.mod index 1ce9954..fb8e513 100644 --- a/go.mod +++ b/go.mod @@ -1,7 +1,12 @@ -module github.com/pin/tftp/v3 +module github.com/tejaskumark/tftp/v2 go 1.23.0 +retract ( + v1.0.1 // Contains retractions only. + v1.0.0 // Published accidentally. +) + require golang.org/x/net v0.43.0 require golang.org/x/sys v0.35.0 // indirect diff --git a/receiver.go b/receiver.go index 7244567..8a94e30 100644 --- a/receiver.go +++ b/receiver.go @@ -8,7 +8,7 @@ import ( "strconv" "time" - "github.com/pin/tftp/v3/netascii" + "github.com/tejaskumark/tftp/v2/netascii" ) // IncomingTransfer provides methods that expose information associated with diff --git a/sender.go b/sender.go index 1fd50db..0208974 100644 --- a/sender.go +++ b/sender.go @@ -8,7 +8,7 @@ import ( "strconv" "time" - "github.com/pin/tftp/v3/netascii" + "github.com/tejaskumark/tftp/v2/netascii" ) // OutgoingTransfer provides methods to set the outgoing transfer size and