imap: fix build on macos

Fix the following build error on mac os:

 worker/imap/worker.go:368:29: undefined: syscall.TCP_KEEPCNT
 worker/imap/worker.go:376:29: undefined: syscall.TCP_KEEPINTVL

These symbols are not defined on darwin.

Fixes: 5dfeff75f3 ("imap: add tcp connection options")
Signed-off-by: Robin Jarry <robin@jarry.cc>
This commit is contained in:
Robin Jarry 2021-12-11 20:53:10 +01:00
parent 175d0efeb2
commit 15a4cc7d0a
4 changed files with 36 additions and 7 deletions

View file

@ -82,6 +82,9 @@ available:
By default, the system tcp socket settings are used. By default, the system tcp socket settings are used.
If keepalive-period is specified, this option defaults to 3 probes. If keepalive-period is specified, this option defaults to 3 probes.
This option is only supported on linux. On other platforms, it will be
ignored.
*keepalive-interval* *keepalive-interval*
The interval between subsequential keepalive probes, regardless of what The interval between subsequential keepalive probes, regardless of what
the connection has exchanged in the meantime. Fractional seconds are the connection has exchanged in the meantime. Fractional seconds are
@ -90,6 +93,9 @@ available:
By default, the system tcp socket settings are used. By default, the system tcp socket settings are used.
If keepalive-period is specified, this option defaults to 3s. If keepalive-period is specified, this option defaults to 3s.
This option is only supported on linux. On other platforms, it will be
ignored.
# SEE ALSO # SEE ALSO
*aerc*(1) *aerc-config*(5) *aerc*(1) *aerc-config*(5)

11
lib/keepalive_dummy.go Normal file
View file

@ -0,0 +1,11 @@
//+build !linux
package lib
func SetTcpKeepaliveProbes(fd, count int) error {
return nil
}
func SetTcpKeepaliveInterval(fd, interval int) error {
return nil
}

17
lib/keepalive_linux.go Normal file
View file

@ -0,0 +1,17 @@
//+build linux
package lib
import (
"syscall"
)
func SetTcpKeepaliveProbes(fd, count int) error {
return syscall.SetsockoptInt(
fd, syscall.IPPROTO_TCP, syscall.TCP_KEEPCNT, count)
}
func SetTcpKeepaliveInterval(fd, interval int) error {
return syscall.SetsockoptInt(
fd, syscall.IPPROTO_TCP, syscall.TCP_KEEPINTVL, interval)
}

View file

@ -7,7 +7,6 @@ import (
"net/url" "net/url"
"strconv" "strconv"
"strings" "strings"
"syscall"
"time" "time"
"github.com/emersion/go-imap" "github.com/emersion/go-imap"
@ -364,17 +363,13 @@ func (w *IMAPWorker) setKeepaliveParameters(conn *net.TCPConn) error {
err = rawConn.Control(func(fdPtr uintptr) { err = rawConn.Control(func(fdPtr uintptr) {
fd := int(fdPtr) fd := int(fdPtr)
// Max number of probes before failure // Max number of probes before failure
err := syscall.SetsockoptInt( err := lib.SetTcpKeepaliveProbes(fd, w.config.keepalive_probes)
fd, syscall.IPPROTO_TCP, syscall.TCP_KEEPCNT,
w.config.keepalive_probes)
if err != nil { if err != nil {
w.worker.Logger.Printf( w.worker.Logger.Printf(
"cannot set tcp keepalive probes: %v\n", err) "cannot set tcp keepalive probes: %v\n", err)
} }
// Wait time after an unsuccessful probe // Wait time after an unsuccessful probe
err = syscall.SetsockoptInt( err = lib.SetTcpKeepaliveInterval(fd, w.config.keepalive_interval)
fd, syscall.IPPROTO_TCP, syscall.TCP_KEEPINTVL,
w.config.keepalive_interval)
if err != nil { if err != nil {
w.worker.Logger.Printf( w.worker.Logger.Printf(
"cannot set tcp keepalive interval: %v\n", err) "cannot set tcp keepalive interval: %v\n", err)