mirror of
https://github.com/golang/sys.git
synced 2026-02-08 11:46:04 +03:00
If we use a local type, it won't compare properly with errors from the rest of the standard library. Errors are the one type from syscall that propagates through the system, so it's important to have only one type for them. Ditto for syscall.Signal. LGTM=dave R=rsc, dave CC=golang-codereviews https://golang.org/cl/123490043
80 lines
1.8 KiB
Go
80 lines
1.8 KiB
Go
// Copyright 2011 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.
|
|
|
|
// Linux socket filter
|
|
|
|
package unix
|
|
|
|
import (
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
func LsfStmt(code, k int) *SockFilter {
|
|
return &SockFilter{Code: uint16(code), K: uint32(k)}
|
|
}
|
|
|
|
func LsfJump(code, k, jt, jf int) *SockFilter {
|
|
return &SockFilter{Code: uint16(code), Jt: uint8(jt), Jf: uint8(jf), K: uint32(k)}
|
|
}
|
|
|
|
func LsfSocket(ifindex, proto int) (int, error) {
|
|
var lsall SockaddrLinklayer
|
|
s, e := Socket(AF_PACKET, SOCK_RAW, proto)
|
|
if e != nil {
|
|
return 0, e
|
|
}
|
|
p := (*[2]byte)(unsafe.Pointer(&lsall.Protocol))
|
|
p[0] = byte(proto >> 8)
|
|
p[1] = byte(proto)
|
|
lsall.Ifindex = ifindex
|
|
e = Bind(s, &lsall)
|
|
if e != nil {
|
|
Close(s)
|
|
return 0, e
|
|
}
|
|
return s, nil
|
|
}
|
|
|
|
type iflags struct {
|
|
name [IFNAMSIZ]byte
|
|
flags uint16
|
|
}
|
|
|
|
func SetLsfPromisc(name string, m bool) error {
|
|
s, e := Socket(AF_INET, SOCK_DGRAM, 0)
|
|
if e != nil {
|
|
return e
|
|
}
|
|
defer Close(s)
|
|
var ifl iflags
|
|
copy(ifl.name[:], []byte(name))
|
|
_, _, ep := Syscall(SYS_IOCTL, uintptr(s), SIOCGIFFLAGS, uintptr(unsafe.Pointer(&ifl)))
|
|
if ep != 0 {
|
|
return syscall.Errno(ep)
|
|
}
|
|
if m {
|
|
ifl.flags |= uint16(IFF_PROMISC)
|
|
} else {
|
|
ifl.flags &= ^uint16(IFF_PROMISC)
|
|
}
|
|
_, _, ep = Syscall(SYS_IOCTL, uintptr(s), SIOCSIFFLAGS, uintptr(unsafe.Pointer(&ifl)))
|
|
if ep != 0 {
|
|
return syscall.Errno(ep)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func AttachLsf(fd int, i []SockFilter) error {
|
|
var p SockFprog
|
|
p.Len = uint16(len(i))
|
|
p.Filter = (*SockFilter)(unsafe.Pointer(&i[0]))
|
|
return setsockopt(fd, SOL_SOCKET, SO_ATTACH_FILTER, unsafe.Pointer(&p), unsafe.Sizeof(p))
|
|
}
|
|
|
|
func DetachLsf(fd int) error {
|
|
var dummy int
|
|
return setsockopt(fd, SOL_SOCKET, SO_DETACH_FILTER, unsafe.Pointer(&dummy), unsafe.Sizeof(dummy))
|
|
}
|