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.
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*
The interval between subsequential keepalive probes, regardless of what
the connection has exchanged in the meantime. Fractional seconds are
@ -90,6 +93,9 @@ available:
By default, the system tcp socket settings are used.
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
*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"
"strconv"
"strings"
"syscall"
"time"
"github.com/emersion/go-imap"
@ -364,17 +363,13 @@ func (w *IMAPWorker) setKeepaliveParameters(conn *net.TCPConn) error {
err = rawConn.Control(func(fdPtr uintptr) {
fd := int(fdPtr)
// Max number of probes before failure
err := syscall.SetsockoptInt(
fd, syscall.IPPROTO_TCP, syscall.TCP_KEEPCNT,
w.config.keepalive_probes)
err := lib.SetTcpKeepaliveProbes(fd, w.config.keepalive_probes)
if err != nil {
w.worker.Logger.Printf(
"cannot set tcp keepalive probes: %v\n", err)
}
// Wait time after an unsuccessful probe
err = syscall.SetsockoptInt(
fd, syscall.IPPROTO_TCP, syscall.TCP_KEEPINTVL,
w.config.keepalive_interval)
err = lib.SetTcpKeepaliveInterval(fd, w.config.keepalive_interval)
if err != nil {
w.worker.Logger.Printf(
"cannot set tcp keepalive interval: %v\n", err)