diff --git a/cmd/yggmail/main.go b/cmd/yggmail/main.go index 2239146..7299beb 100644 --- a/cmd/yggmail/main.go +++ b/cmd/yggmail/main.go @@ -8,8 +8,9 @@ import ( "fmt" "log" "os" + "os/signal" "strings" - "sync" + "syscall" "github.com/emersion/go-sasl" "github.com/emersion/go-smtp" @@ -64,6 +65,7 @@ func main() { if err != nil { panic(err) } + defer storage.Close() log.Printf("Using database file %q\n", *database) skStr, err := storage.ConfigGet("private_key") @@ -131,8 +133,6 @@ func main() { PublicKey: pk, PrivateKey: sk, } - wg := &sync.WaitGroup{} - wg.Add(2) transport, err := transport.NewYggdrasilTransport(rawlog, sk, pk, peerAddrs, *multicast) if err != nil { @@ -155,8 +155,6 @@ func main() { log.Println("Listening for IMAP on:", *imapaddr) go func() { - defer wg.Done() - localBackend := &smtpserver.Backend{ Log: log, Mode: smtpserver.BackendModeInternal, @@ -186,8 +184,6 @@ func main() { }() go func() { - defer wg.Done() - overlayBackend := &smtpserver.Backend{ Log: log, Mode: smtpserver.BackendModeExternal, @@ -208,5 +204,8 @@ func main() { } }() - wg.Wait() + sigs := make(chan os.Signal, 1) + signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) + <-sigs + log.Println("Shutting down") } diff --git a/internal/storage/sqlite3/sqlite3.go b/internal/storage/sqlite3/sqlite3.go index 6f5a39a..a1f7d96 100644 --- a/internal/storage/sqlite3/sqlite3.go +++ b/internal/storage/sqlite3/sqlite3.go @@ -13,6 +13,7 @@ type SQLite3Storage struct { *TableMailboxes *TableMails *TableQueue + db *sql.DB writer *Writer } @@ -22,6 +23,7 @@ func NewSQLite3StorageStorage(filename string) (*SQLite3Storage, error) { return nil, fmt.Errorf("sql.Open: %w", err) } s := &SQLite3Storage{ + db: db, writer: &Writer{ todo: make(chan writerTask), }, @@ -45,6 +47,10 @@ func NewSQLite3StorageStorage(filename string) (*SQLite3Storage, error) { return s, nil } +func (s *SQLite3Storage) Close() error { + return s.db.Close() +} + type Writer struct { running atomic.Bool todo chan writerTask