diff --git a/resolve/resolver.go b/resolve/resolver.go index 596b78e..b63e57b 100644 --- a/resolve/resolver.go +++ b/resolve/resolver.go @@ -13,6 +13,8 @@ import ( type Resolver struct { *sam3.SAMResolver + samhost string + samport string allowedSuffixes []string } @@ -47,13 +49,20 @@ func (r Resolver) ValidateI2PAddr(name string) bool { return noi2p } -func NewResolver() (*Resolver, error) { - return NewResolverFromOptions() +func NewResolver(samhost, samport string) (*Resolver, error) { + return NewResolverFromOptions(SetHost(samhost), SetPort(samport)) } -func NewResolverFromOptions() (*Resolver, error) { +func NewResolverFromOptions(opts ...func(*Resolver) error) (*Resolver, error) { var r Resolver r.allowedSuffixes = []string{".i2p", ".b32.i2p"} + r.samhost = "127.0.0.1" + r.samport = "7656" + for _, o := range opts { + if err := o(&r); err != nil { + return nil, err + } + } var err error r.SAMResolver, err = sam3.NewFullSAMResolver("127.0.0.1:7656") if err != nil { diff --git a/resolve/resolver_options.go b/resolve/resolver_options.go new file mode 100644 index 0000000..21b484e --- /dev/null +++ b/resolve/resolver_options.go @@ -0,0 +1,32 @@ +package resolver + +import ( + "fmt" + "strconv" +) + +//Option is a Resolver option +type Option func(*Resolver) error + +//SetHost sets the host of the client's SAM bridge +func SetHost(s string) func(*Resolver) error { + return func(c *Resolver) error { + c.samhost = s + return nil + } +} + +//SetPort sets the port of the client's SAM bridge +func SetPort(v string) func(*Resolver) error { + return func(c *Resolver) error { + port, err := strconv.Atoi(v) + if err != nil { + return fmt.Errorf("Invalid port; non-number.") + } + if port < 65536 && port > -1 { + c.samport = v + return nil + } + return fmt.Errorf("Invalid port.") + } +} diff --git a/socks/manager.go b/socks/manager.go index a5d8b56..35d1553 100644 --- a/socks/manager.go +++ b/socks/manager.go @@ -77,7 +77,7 @@ func NewManagerFromOptions(opts ...func(*Manager) error) (*Manager, error) { if err != nil { return nil, err } - if r, err := resolver.NewResolver(); err == nil { + if r, err := resolver.NewResolver(m.samhost, m.samport); err == nil { m.Config = socks5.Config{ Resolver: r, Dial: m.Dial,