Improve closing connection.

v0.9
Martin Dosch 3 months ago
parent 42e2c83eaf
commit 613a9c8639
No known key found for this signature in database
GPG Key ID: 52A57CFCE13D657D

@ -4,6 +4,7 @@
### Changed
- Properly close stream if `Ctrl+C` is pressed in interactive mode.
- Print OS, architecture and go version for flag `--version`.
- Improve closing of connection.
## [v0.8.4] 2024-03-09
### Changed

@ -17,6 +17,7 @@ import (
"os/signal"
"runtime"
"strings"
"sync"
"time"
"github.com/ProtonMail/gopenpgp/v2/crypto" // MIT License
@ -32,8 +33,12 @@ type configuration struct {
alias string
}
func closeAndExit(client *xmpp.Client, cancel context.CancelFunc, err error) {
var mutex sync.Mutex
func closeAndExit(client *xmpp.Client, cancel context.CancelFunc, err error, mutex *sync.Mutex) {
cancel()
mutex.Lock()
defer mutex.Unlock()
client.Close()
if err != nil {
log.Fatal(err)
@ -335,7 +340,7 @@ func main() {
iqc := make(chan xmpp.IQ, defaultBufferSize)
msgc := make(chan xmpp.Chat, defaultBufferSize)
ctx, cancel := context.WithCancel(context.Background())
go rcvStanzas(client, iqc, msgc, ctx, cancel)
go rcvStanzas(client, iqc, msgc, ctx, cancel, &mutex)
for _, r := range getopt.Args() {
var re recipientsType
re.Jid = r
@ -353,7 +358,7 @@ func main() {
for i, recipient := range recipients {
validatedJid, err := MarshalJID(recipient.Jid)
if err != nil {
closeAndExit(client, cancel, err)
closeAndExit(client, cancel, err, &mutex)
}
recipients[i].Jid = validatedJid
}
@ -362,52 +367,52 @@ func main() {
case *flagOxGenPrivKeyX25519:
validatedOwnJid, err := MarshalJID(user)
if err != nil {
closeAndExit(client, cancel, err)
closeAndExit(client, cancel, err, &mutex)
}
err = oxGenPrivKey(validatedOwnJid, client, iqc, *flagOxPassphrase, "x25519")
if err != nil {
closeAndExit(client, cancel, err)
closeAndExit(client, cancel, err, &mutex)
}
os.Exit(0)
case *flagOxGenPrivKeyRSA:
validatedOwnJid, err := MarshalJID(user)
if err != nil {
closeAndExit(client, cancel, err)
closeAndExit(client, cancel, err, &mutex)
}
err = oxGenPrivKey(validatedOwnJid, client, iqc, *flagOxPassphrase, "rsa")
if err != nil {
closeAndExit(client, cancel, err)
closeAndExit(client, cancel, err, &mutex)
}
os.Exit(0)
case *flagOxImportPrivKey != "":
validatedOwnJid, err := MarshalJID(user)
if err != nil {
closeAndExit(client, cancel, err)
closeAndExit(client, cancel, err, &mutex)
}
err = oxImportPrivKey(validatedOwnJid, *flagOxImportPrivKey,
client, iqc)
if err != nil {
closeAndExit(client, cancel, err)
closeAndExit(client, cancel, err, &mutex)
}
os.Exit(0)
case *flagOxDeleteNodes:
validatedOwnJid, err := MarshalJID(user)
if err != nil {
closeAndExit(client, cancel, err)
closeAndExit(client, cancel, err, &mutex)
}
err = oxDeleteNodes(validatedOwnJid, client, iqc)
if err != nil {
closeAndExit(client, cancel, err)
closeAndExit(client, cancel, err, &mutex)
}
os.Exit(0)
case *flagOx:
validatedOwnJid, err := MarshalJID(user)
if err != nil {
closeAndExit(client, cancel, err)
closeAndExit(client, cancel, err, &mutex)
}
oxPrivKey, err = oxGetPrivKey(validatedOwnJid, *flagOxPassphrase)
if err != nil {
closeAndExit(client, cancel, err)
closeAndExit(client, cancel, err, &mutex)
}
}
@ -415,7 +420,7 @@ func main() {
message, err = httpUpload(client, iqc, tlsConfig.ServerName,
*flagHTTPUpload, timeout)
if err != nil {
closeAndExit(client, cancel, err)
closeAndExit(client, cancel, err, &mutex)
}
}
@ -425,7 +430,7 @@ func main() {
// Check if the URI is valid.
uri, err := validURI(message)
if err != nil {
closeAndExit(client, cancel, err)
closeAndExit(client, cancel, err, &mutex)
}
message = uri.String()
}
@ -448,7 +453,7 @@ func main() {
_, err = client.JoinMUCNoHistory(recipient.Jid, alias)
}
if err != nil {
closeAndExit(client, cancel, err)
closeAndExit(client, cancel, err, &mutex)
}
}
}
@ -460,7 +465,7 @@ func main() {
// Send raw XML
_, err = client.SendOrg(message)
if err != nil {
closeAndExit(client, cancel, err)
closeAndExit(client, cancel, err, &mutex)
}
case *flagInteractive:
// Send in endless loop (for usage with e.g. "tail -f").
@ -470,7 +475,7 @@ func main() {
signal.Notify(c, os.Interrupt)
go func() {
for range c {
closeAndExit(client, cancel, nil)
closeAndExit(client, cancel, nil, &mutex)
}
}()
for {
@ -480,7 +485,7 @@ func main() {
return
default:
if err != nil {
closeAndExit(client, cancel, errors.New("failed to read from stdin"))
closeAndExit(client, cancel, errors.New("failed to read from stdin"), &mutex)
}
}
message = strings.TrimSuffix(message, "\n")
@ -505,7 +510,7 @@ func main() {
}
_, err = client.SendOrg(oxMessage)
if err != nil {
closeAndExit(client, cancel, err)
closeAndExit(client, cancel, err, &mutex)
}
default:
_, err = client.Send(xmpp.Chat{
@ -513,7 +518,7 @@ func main() {
Type: msgType, Text: message,
})
if err != nil {
closeAndExit(client, cancel, err)
closeAndExit(client, cancel, err, &mutex)
}
}
}
@ -624,7 +629,7 @@ func main() {
}
_, err = client.SendOrg(oxMessage)
if err != nil {
closeAndExit(client, cancel, err)
closeAndExit(client, cancel, err, &mutex)
}
default:
_, err = client.Send(xmpp.Chat{
@ -632,10 +637,10 @@ func main() {
Type: msgType, Text: message,
})
if err != nil {
closeAndExit(client, cancel, err)
closeAndExit(client, cancel, err, &mutex)
}
}
}
}
closeAndExit(client, cancel, nil)
closeAndExit(client, cancel, nil, &mutex)
}

@ -10,6 +10,7 @@ import (
"fmt"
"log"
"runtime"
"sync"
"time"
"github.com/beevik/etree" // BSD-2-clause
@ -44,9 +45,18 @@ func getIQ(id string, c chan xmpp.IQ, iqc chan xmpp.IQ) {
}
}
func rcvStanzas(client *xmpp.Client, iqc chan xmpp.IQ, msgc chan xmpp.Chat, ctx context.Context, cancel context.CancelFunc) {
func rcvStanzas(client *xmpp.Client, iqc chan xmpp.IQ, msgc chan xmpp.Chat, ctx context.Context, cancel context.CancelFunc, mutex *sync.Mutex) {
var err error
var received interface{}
for {
received, err := client.Recv()
select {
case <-ctx.Done():
return
default:
mutex.Lock()
received, err = client.Recv()
mutex.Unlock()
}
// Don't print errors if the program is getting shut down,
// as the errors might be triggered from trying to read from
// a closed connection.
@ -55,7 +65,8 @@ func rcvStanzas(client *xmpp.Client, iqc chan xmpp.IQ, msgc chan xmpp.Chat, ctx
return
default:
if err != nil {
closeAndExit(client, cancel, err)
mutex.Unlock()
closeAndExit(client, cancel, err, mutex)
}
}
switch v := received.(type) {

Loading…
Cancel
Save