tcpsock_solaris.mx raw

   1  // Copyright 2024 The Go Authors. All rights reserved.
   2  // Use of this source code is governed by a BSD-style
   3  // license that can be found in the LICENSE file.
   4  
   5  //go:build !illumos
   6  
   7  package net
   8  
   9  import (
  10  	"internal/syscall/unix"
  11  	"syscall"
  12  )
  13  
  14  // SetKeepAliveConfig configures keep-alive messages sent by the operating system.
  15  func (c *TCPConn) SetKeepAliveConfig(config KeepAliveConfig) error {
  16  	if !c.ok() {
  17  		return syscall.EINVAL
  18  	}
  19  
  20  	if err := setKeepAlive(c.fd, config.Enable); err != nil {
  21  		return &OpError{Op: "set", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
  22  	}
  23  	if unix.SupportTCPKeepAliveIdleIntvlCNT() {
  24  		if err := setKeepAliveIdle(c.fd, config.Idle); err != nil {
  25  			return &OpError{Op: "set", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
  26  		}
  27  		if err := setKeepAliveInterval(c.fd, config.Interval); err != nil {
  28  			return &OpError{Op: "set", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
  29  		}
  30  		if err := setKeepAliveCount(c.fd, config.Count); err != nil {
  31  			return &OpError{Op: "set", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
  32  		}
  33  	} else if err := setKeepAliveIdleAndIntervalAndCount(c.fd, config.Idle, config.Interval, config.Count); err != nil {
  34  		return &OpError{Op: "set", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
  35  	}
  36  
  37  	return nil
  38  }
  39