74 lines
1.9 KiB
Go
74 lines
1.9 KiB
Go
|
// Copyright 2014 Mikio Hara. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
package tcp
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"os"
|
||
|
"sync"
|
||
|
"syscall"
|
||
|
"time"
|
||
|
"unsafe"
|
||
|
|
||
|
"github.com/mikioh/tcpopt"
|
||
|
)
|
||
|
|
||
|
var options [soMax]option
|
||
|
|
||
|
func ioctl(s uintptr, ioc int, b []byte) error {
|
||
|
return errors.New("not implemented")
|
||
|
}
|
||
|
|
||
|
var keepAlive = struct {
|
||
|
sync.RWMutex
|
||
|
syscall.TCPKeepalive
|
||
|
}{
|
||
|
TCPKeepalive: syscall.TCPKeepalive{
|
||
|
OnOff: 1,
|
||
|
Time: uint32(2 * time.Hour / time.Millisecond),
|
||
|
Interval: uint32(time.Second / time.Millisecond),
|
||
|
},
|
||
|
}
|
||
|
|
||
|
func setsockopt(s uintptr, level, name int, b []byte) error {
|
||
|
var kai tcpopt.KeepAliveIdleInterval
|
||
|
var kap tcpopt.KeepAliveProbeInterval
|
||
|
if level == kai.Level() && name == kai.Name() {
|
||
|
keepAlive.Lock()
|
||
|
defer keepAlive.Unlock()
|
||
|
prev := keepAlive.Time
|
||
|
keepAlive.Time = nativeEndian.Uint32(b)
|
||
|
rv := uint32(0)
|
||
|
siz := uint32(unsafe.Sizeof(keepAlive))
|
||
|
if err := syscall.WSAIoctl(syscall.Handle(s), syscall.SIO_KEEPALIVE_VALS, (*byte)(unsafe.Pointer(&keepAlive)), siz, nil, 0, &rv, nil, 0); err != nil {
|
||
|
keepAlive.Time = prev
|
||
|
return os.NewSyscallError("wsaioctl", err)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
if level == kap.Level() && name == kap.Name() {
|
||
|
keepAlive.Lock()
|
||
|
defer keepAlive.Unlock()
|
||
|
prev := keepAlive.Interval
|
||
|
keepAlive.Interval = nativeEndian.Uint32(b)
|
||
|
rv := uint32(0)
|
||
|
siz := uint32(unsafe.Sizeof(keepAlive))
|
||
|
if err := syscall.WSAIoctl(syscall.Handle(s), syscall.SIO_KEEPALIVE_VALS, (*byte)(unsafe.Pointer(&keepAlive)), siz, nil, 0, &rv, nil, 0); err != nil {
|
||
|
keepAlive.Interval = prev
|
||
|
return os.NewSyscallError("wsaioctl", err)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
if len(b) == 4 {
|
||
|
v := int(nativeEndian.Uint32(b))
|
||
|
return syscall.SetsockoptInt(syscall.Handle(s), level, name, v)
|
||
|
}
|
||
|
return errors.New("not implemented")
|
||
|
}
|
||
|
|
||
|
func getsockopt(s uintptr, level, name int, b []byte) (int, error) {
|
||
|
return 0, errors.New("not implemented")
|
||
|
}
|