.github
alerting
client
config
core
docs
example
jsonpath
k8s
k8stest
metric
pattern
security
static
vendor
cloud.google.com
github.com
golang.org
x
crypto
net
bpf
context
http
http2
idna
internal
iana
socket
cmsghdr.go
cmsghdr_bsd.go
cmsghdr_linux_32bit.go
cmsghdr_linux_64bit.go
cmsghdr_solaris_64bit.go
cmsghdr_stub.go
empty.s
error_unix.go
error_windows.go
iovec_32bit.go
iovec_64bit.go
iovec_solaris_64bit.go
iovec_stub.go
mmsghdr_stub.go
mmsghdr_unix.go
msghdr_bsd.go
msghdr_bsdvar.go
msghdr_linux.go
msghdr_linux_32bit.go
msghdr_linux_64bit.go
msghdr_openbsd.go
msghdr_solaris_64bit.go
msghdr_stub.go
norace.go
race.go
rawconn.go
rawconn_mmsg.go
rawconn_msg.go
rawconn_nommsg.go
rawconn_nomsg.go
socket.go
sys.go
sys_bsd.go
sys_bsdvar.go
sys_const_unix.go
sys_darwin.go
sys_dragonfly.go
sys_go1_11_darwin.go
sys_linkname.go
sys_linux.go
sys_linux_386.go
sys_linux_386.s
sys_linux_amd64.go
sys_linux_arm.go
sys_linux_arm64.go
sys_linux_mips.go
sys_linux_mips64.go
sys_linux_mips64le.go
sys_linux_mipsle.go
sys_linux_ppc64.go
sys_linux_ppc64le.go
sys_linux_riscv64.go
sys_linux_s390x.go
sys_linux_s390x.s
sys_netbsd.go
sys_posix.go
sys_solaris.go
sys_solaris_amd64.s
sys_stub.go
sys_unix.go
sys_windows.go
zsys_aix_ppc64.go
zsys_darwin_386.go
zsys_darwin_amd64.go
zsys_darwin_arm.go
zsys_darwin_arm64.go
zsys_dragonfly_amd64.go
zsys_freebsd_386.go
zsys_freebsd_amd64.go
zsys_freebsd_arm.go
zsys_freebsd_arm64.go
zsys_linux_386.go
zsys_linux_amd64.go
zsys_linux_arm.go
zsys_linux_arm64.go
zsys_linux_mips.go
zsys_linux_mips64.go
zsys_linux_mips64le.go
zsys_linux_mipsle.go
zsys_linux_ppc64.go
zsys_linux_ppc64le.go
zsys_linux_riscv64.go
zsys_linux_s390x.go
zsys_netbsd_386.go
zsys_netbsd_amd64.go
zsys_netbsd_arm.go
zsys_netbsd_arm64.go
zsys_openbsd_386.go
zsys_openbsd_amd64.go
zsys_openbsd_arm.go
zsys_openbsd_arm64.go
zsys_solaris_amd64.go
ipv4
ipv6
AUTHORS
CONTRIBUTORS
LICENSE
PATENTS
oauth2
sys
text
time
google.golang.org
gopkg.in
k8s.io
sigs.k8s.io
modules.txt
watchdog
.dockerignore
.gitattributes
.gitignore
Dockerfile
LICENSE.md
README.md
config.yaml
go.mod
go.sum
gzip.go
main.go
65 lines
1.3 KiB
Go
65 lines
1.3 KiB
Go
// Copyright 2017 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package socket
|
|
|
|
import (
|
|
"errors"
|
|
"net"
|
|
"os"
|
|
"syscall"
|
|
)
|
|
|
|
// A Conn represents a raw connection.
|
|
type Conn struct {
|
|
network string
|
|
c syscall.RawConn
|
|
}
|
|
|
|
// NewConn returns a new raw connection.
|
|
func NewConn(c net.Conn) (*Conn, error) {
|
|
var err error
|
|
var cc Conn
|
|
switch c := c.(type) {
|
|
case *net.TCPConn:
|
|
cc.network = "tcp"
|
|
cc.c, err = c.SyscallConn()
|
|
case *net.UDPConn:
|
|
cc.network = "udp"
|
|
cc.c, err = c.SyscallConn()
|
|
case *net.IPConn:
|
|
cc.network = "ip"
|
|
cc.c, err = c.SyscallConn()
|
|
default:
|
|
return nil, errors.New("unknown connection type")
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &cc, nil
|
|
}
|
|
|
|
func (o *Option) get(c *Conn, b []byte) (int, error) {
|
|
var operr error
|
|
var n int
|
|
fn := func(s uintptr) {
|
|
n, operr = getsockopt(s, o.Level, o.Name, b)
|
|
}
|
|
if err := c.c.Control(fn); err != nil {
|
|
return 0, err
|
|
}
|
|
return n, os.NewSyscallError("getsockopt", operr)
|
|
}
|
|
|
|
func (o *Option) set(c *Conn, b []byte) error {
|
|
var operr error
|
|
fn := func(s uintptr) {
|
|
operr = setsockopt(s, o.Level, o.Name, b)
|
|
}
|
|
if err := c.c.Control(fn); err != nil {
|
|
return err
|
|
}
|
|
return os.NewSyscallError("setsockopt", operr)
|
|
}
|