diff options
| author | Mikio Hara <mikioh.mikioh@gmail.com> | 2011-05-18 16:33:41 -0700 |
|---|---|---|
| committer | Brad Fitzpatrick <bradfitz@golang.org> | 2011-05-18 16:33:41 -0700 |
| commit | 1d550bdedf4fe73de48a1d77897f651a1bf5b9f3 (patch) | |
| tree | 54fca428a6db26fe1962e3075690fb2cf8b4b6d6 /src/pkg/syscall/syscall_linux.go | |
| parent | 0a2650f3988554674f1d0a160b1f057322db5240 (diff) | |
| download | go-1d550bdedf4fe73de48a1d77897f651a1bf5b9f3.tar.xz | |
syscall: add netlink support for linux/386, linux/amd64, linux/arm
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/4535078
Diffstat (limited to 'src/pkg/syscall/syscall_linux.go')
| -rw-r--r-- | src/pkg/syscall/syscall_linux.go | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/pkg/syscall/syscall_linux.go b/src/pkg/syscall/syscall_linux.go index 4a3797c20c..cd040530e7 100644 --- a/src/pkg/syscall/syscall_linux.go +++ b/src/pkg/syscall/syscall_linux.go @@ -290,8 +290,33 @@ func (sa *SockaddrLinklayer) sockaddr() (uintptr, _Socklen, int) { return uintptr(unsafe.Pointer(&sa.raw)), SizeofSockaddrLinklayer, 0 } +type SockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 + raw RawSockaddrNetlink +} + +func (sa *SockaddrNetlink) sockaddr() (uintptr, _Socklen, int) { + sa.raw.Family = AF_NETLINK + sa.raw.Pad = sa.Pad + sa.raw.Pid = sa.Pid + sa.raw.Groups = sa.Groups + return uintptr(unsafe.Pointer(&sa.raw)), SizeofSockaddrNetlink, 0 +} + func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, int) { switch rsa.Addr.Family { + case AF_NETLINK: + pp := (*RawSockaddrNetlink)(unsafe.Pointer(rsa)) + sa := new(SockaddrNetlink) + sa.Family = pp.Family + sa.Pad = pp.Pad + sa.Pid = pp.Pid + sa.Groups = pp.Groups + return sa, 0 + case AF_PACKET: pp := (*RawSockaddrLinklayer)(unsafe.Pointer(rsa)) sa := new(SockaddrLinklayer) @@ -489,7 +514,7 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from oobn = int(msg.Controllen) recvflags = int(msg.Flags) // source address is only specified if the socket is unconnected - if rsa.Addr.Family != 0 { + if rsa.Addr.Family != AF_UNSPEC { from, errno = anyToSockaddr(&rsa) } return |
