URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libgo/] [go/] [syscall/] [socket_linux.go] - Rev 747
Compare with Previous | Blame | View Log
// socket_linux.go -- Socket handling specific to GNU/Linux.// Copyright 2010 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 syscallimport "unsafe"const SizeofSockaddrInet4 = 16const SizeofSockaddrInet6 = 28const SizeofSockaddrUnix = 110const SizeofSockaddrLinklayer = 20const SizeofSockaddrNetlink = 12type SockaddrLinklayer struct {Protocol uint16Ifindex intHatype uint16Pkttype uint8Halen uint8Addr [8]byteraw RawSockaddrLinklayer}func (sa *SockaddrLinklayer) sockaddr() (*RawSockaddrAny, Socklen_t, error) {if sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff {return nil, 0, EINVAL}sa.raw.Family = AF_PACKETsa.raw.Protocol = sa.Protocolsa.raw.Ifindex = int32(sa.Ifindex)sa.raw.Hatype = sa.Hatypesa.raw.Pkttype = sa.Pkttypesa.raw.Halen = sa.Halenfor i := 0; i < len(sa.Addr); i++ {sa.raw.Addr[i] = sa.Addr[i]}return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), SizeofSockaddrLinklayer, nil}type SockaddrNetlink struct {Family uint16Pad uint16Pid uint32Groups uint32raw RawSockaddrNetlink}func (sa *SockaddrNetlink) sockaddr() (*RawSockaddrAny, Socklen_t, error) {sa.raw.Family = AF_NETLINKsa.raw.Pad = sa.Padsa.raw.Pid = sa.Pidsa.raw.Groups = sa.Groupsreturn (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), SizeofSockaddrNetlink, nil}type RawSockaddrInet4 struct {Family uint16Port uint16Addr [4]byte /* in_addr */Zero [8]uint8}func (sa *RawSockaddrInet4) setLen() Socklen_t {return SizeofSockaddrInet4}type RawSockaddrInet6 struct {Family uint16Port uint16Flowinfo uint32Addr [16]byte /* in6_addr */Scope_id uint32}func (sa *RawSockaddrInet6) setLen() Socklen_t {return SizeofSockaddrInet6}type RawSockaddrUnix struct {Family uint16Path [108]int8}func (sa *RawSockaddrUnix) setLen(int) {}func (sa *RawSockaddrUnix) getLen() (int, error) {if sa.Path[0] == 0 {// "Abstract" Unix domain socket.// Rewrite leading NUL as @ for textual display.// (This is the standard convention.)// Not friendly to overwrite in place,// but the callers below don't care.sa.Path[0] = '@'}// Assume path ends at NUL.// This is not technically the GNU/Linux semantics for// abstract Unix domain sockets--they are supposed// to be uninterpreted fixed-size binary blobs--but// everyone uses this convention.n := 0for n < len(sa.Path) - 3 && sa.Path[n] != 0 {n++}return n, nil}type RawSockaddrLinklayer struct {Family uint16Protocol uint16Ifindex int32Hatype uint16Pkttype uint8Halen uint8Addr [8]uint8}type RawSockaddrNetlink struct {Family uint16Pad uint16Pid uint32Groups uint32}type RawSockaddr struct {Family uint16Data [14]int8}// BindToDevice binds the socket associated with fd to device.func BindToDevice(fd int, device string) (err error) {return SetsockoptString(fd, SOL_SOCKET, SO_BINDTODEVICE, device)}func anyToSockaddrOS(rsa *RawSockaddrAny) (Sockaddr, error) {switch rsa.Addr.Family {case AF_NETLINK:pp := (*RawSockaddrNetlink)(unsafe.Pointer(rsa))sa := new(SockaddrNetlink)sa.Family = pp.Familysa.Pad = pp.Padsa.Pid = pp.Pidsa.Groups = pp.Groupsreturn sa, nilcase AF_PACKET:pp := (*RawSockaddrLinklayer)(unsafe.Pointer(rsa))sa := new(SockaddrLinklayer)sa.Protocol = pp.Protocolsa.Ifindex = int(pp.Ifindex)sa.Hatype = pp.Hatypesa.Pkttype = pp.Pkttypesa.Halen = pp.Halenfor i := 0; i < len(sa.Addr); i++ {sa.Addr[i] = pp.Addr[i]}return sa, nil}return nil, EAFNOSUPPORT}//sysnb EpollCreate(size int) (fd int, err error)//epoll_create(size int) int//sysnb EpollCreate1(flags int) (fd int, err error)//epoll_create1(flags int) int//sysnb EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error)//epoll_ctl(epfd int, op int, fd int, event *EpollEvent) int//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)//epoll_wait(epfd int, events *EpollEvent, maxevents int, timeout int) int
