Handle SIGINT/SIGTERM, close database descriptior (fixes #5)

This commit is contained in:
Neil Alexander
2021-07-10 13:33:48 +01:00
parent c7b5325820
commit 2afb313061
2 changed files with 13 additions and 8 deletions

View File

@@ -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")
}

View File

@@ -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