diff --git a/conn/conn.go b/conn/conn.go index dd0c8c5..1eae432 100644 --- a/conn/conn.go +++ b/conn/conn.go @@ -31,6 +31,16 @@ func (c Conn) Keys() (*sam3.I2PKeys, error) { return c.SaveKeys() } +func (m Conn) Cleanup() error { + if err := m.SAMConn.Close(); err != nil { + return err + } + if err := m.StreamSession.Close(); err != nil { + return err + } + return nil +} + func NewConn(sam *sam3.SAM, addr, path string, opts []string) (*Conn, error) { var c Conn var err error diff --git a/conn/conn_options.go b/conn/conn_options.go new file mode 100644 index 0000000..8221932 --- /dev/null +++ b/conn/conn_options.go @@ -0,0 +1 @@ +package conn diff --git a/conn/conn_test.go b/conn/conn_test.go new file mode 100644 index 0000000..8221932 --- /dev/null +++ b/conn/conn_test.go @@ -0,0 +1 @@ +package conn diff --git a/main.go b/main.go index b75684b..e7bc8db 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "flag" + "log" "os" "os/signal" "strings" @@ -141,7 +142,9 @@ func main() { go func() { for sig := range c { if sig == os.Interrupt { - //tunsocks.Cleanup() + if err := tunsocks.Cleanup(); nil { + log.Println(err.Error()) + } } } }() @@ -149,5 +152,4 @@ func main() { } else { panic(tunerr) } - } diff --git a/resolve/resolver.go b/resolve/resolver.go index b63e57b..ce928f6 100644 --- a/resolve/resolver.go +++ b/resolve/resolver.go @@ -33,6 +33,10 @@ func (r Resolver) ResolveI2P(ctx context.Context, name string) (context.Context, return ctx, &raddr, nil } +func (r Resolver) Cleanup() error { + return r.SAMResolver.SAM.Close() +} + func (r Resolver) ValidateI2PAddr(name string) bool { noi2p := false for _, suffix := range r.allowedSuffixes { diff --git a/resolve/resolver_test.go b/resolve/resolver_test.go new file mode 100644 index 0000000..d356a7b --- /dev/null +++ b/resolve/resolver_test.go @@ -0,0 +1 @@ +package resolver diff --git a/socks/manager.go b/socks/manager.go index 35d1553..8fe4d0e 100644 --- a/socks/manager.go +++ b/socks/manager.go @@ -53,6 +53,15 @@ func (m Manager) Dial(ctx context.Context, network, addr string) (net.Conn, erro return m.DialI2P(ctx, addr) } +func (m Manager) Cleanup() error { + for _, c := range m.conns { + if err := c.Cleanup(); err != nil { + return err + } + } + return m.SAM.Close() +} + func NewManager(samhost, samport, datadir string, samopts []string) (*Manager, error) { return NewManagerFromOptions( SetHost(samhost),