github.com/tcnksm/go@v0.0.0-20141208075154-439b32936367/src/syscall/net_nacl.go (about)

     1  // Copyright 2013 The Go Authors.  All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // A simulated network for use within NaCl.
     6  // The simulation is not particularly tied to NaCl,
     7  // but other systems have real networks.
     8  
     9  package syscall
    10  
    11  import (
    12  	"sync"
    13  	"sync/atomic"
    14  )
    15  
    16  // Interface to timers implemented in package runtime.
    17  // Must be in sync with ../runtime/runtime.h:/^struct.Timer$
    18  // Really for use by package time, but we cannot import time here.
    19  
    20  type runtimeTimer struct {
    21  	i      int
    22  	when   int64
    23  	period int64
    24  	f      func(interface{}, uintptr) // NOTE: must not be closure
    25  	arg    interface{}
    26  	seq    uintptr
    27  }
    28  
    29  func startTimer(*runtimeTimer)
    30  func stopTimer(*runtimeTimer) bool
    31  
    32  type timer struct {
    33  	expired bool
    34  	q       *queue
    35  	r       runtimeTimer
    36  }
    37  
    38  func (t *timer) start(q *queue, deadline int64) {
    39  	if deadline == 0 {
    40  		return
    41  	}
    42  	t.q = q
    43  	t.r.when = deadline
    44  	t.r.f = timerExpired
    45  	t.r.arg = t
    46  	startTimer(&t.r)
    47  }
    48  
    49  func (t *timer) stop() {
    50  	stopTimer(&t.r)
    51  }
    52  
    53  func timerExpired(i interface{}, seq uintptr) {
    54  	t := i.(*timer)
    55  	go func() {
    56  		t.q.Lock()
    57  		defer t.q.Unlock()
    58  		t.expired = true
    59  		t.q.canRead.Broadcast()
    60  		t.q.canWrite.Broadcast()
    61  	}()
    62  }
    63  
    64  // Network constants and data structures. These match the traditional values.
    65  
    66  const (
    67  	AF_UNSPEC = iota
    68  	AF_UNIX
    69  	AF_INET
    70  	AF_INET6
    71  )
    72  
    73  const (
    74  	SHUT_RD = iota
    75  	SHUT_WR
    76  	SHUT_RDWR
    77  )
    78  
    79  const (
    80  	SOCK_STREAM = 1 + iota
    81  	SOCK_DGRAM
    82  	SOCK_RAW
    83  	SOCK_SEQPACKET
    84  )
    85  
    86  const (
    87  	IPPROTO_IP   = 0
    88  	IPPROTO_IPV4 = 4
    89  	IPPROTO_IPV6 = 0x29
    90  	IPPROTO_TCP  = 6
    91  	IPPROTO_UDP  = 0x11
    92  )
    93  
    94  // Misc constants expected by package net but not supported.
    95  const (
    96  	_ = iota
    97  	SOL_SOCKET
    98  	SO_TYPE
    99  	NET_RT_IFLIST
   100  	IFNAMSIZ
   101  	IFF_UP
   102  	IFF_BROADCAST
   103  	IFF_LOOPBACK
   104  	IFF_POINTOPOINT
   105  	IFF_MULTICAST
   106  	IPV6_V6ONLY
   107  	SOMAXCONN
   108  	F_DUPFD_CLOEXEC
   109  	SO_BROADCAST
   110  	SO_REUSEADDR
   111  	SO_REUSEPORT
   112  	SO_RCVBUF
   113  	SO_SNDBUF
   114  	SO_KEEPALIVE
   115  	SO_LINGER
   116  	SO_ERROR
   117  	IP_PORTRANGE
   118  	IP_PORTRANGE_DEFAULT
   119  	IP_PORTRANGE_LOW
   120  	IP_PORTRANGE_HIGH
   121  	IP_MULTICAST_IF
   122  	IP_MULTICAST_LOOP
   123  	IP_ADD_MEMBERSHIP
   124  	IPV6_PORTRANGE
   125  	IPV6_PORTRANGE_DEFAULT
   126  	IPV6_PORTRANGE_LOW
   127  	IPV6_PORTRANGE_HIGH
   128  	IPV6_MULTICAST_IF
   129  	IPV6_MULTICAST_LOOP
   130  	IPV6_JOIN_GROUP
   131  	TCP_NODELAY
   132  	TCP_KEEPINTVL
   133  	TCP_KEEPIDLE
   134  
   135  	SYS_FCNTL = 500 // unsupported
   136  )
   137  
   138  var SocketDisableIPv6 bool
   139  
   140  // A Sockaddr is one of the SockaddrXxx structs.
   141  type Sockaddr interface {
   142  	// copy returns a copy of the underlying data.
   143  	copy() Sockaddr
   144  
   145  	// key returns the value of the underlying data,
   146  	// for comparison as a map key.
   147  	key() interface{}
   148  }
   149  
   150  type SockaddrInet4 struct {
   151  	Port int
   152  	Addr [4]byte
   153  }
   154  
   155  func (sa *SockaddrInet4) copy() Sockaddr {
   156  	sa1 := *sa
   157  	return &sa1
   158  }
   159  
   160  func (sa *SockaddrInet4) key() interface{} { return *sa }
   161  
   162  type SockaddrInet6 struct {
   163  	Port   int
   164  	ZoneId uint32
   165  	Addr   [16]byte
   166  }
   167  
   168  func (sa *SockaddrInet6) copy() Sockaddr {
   169  	sa1 := *sa
   170  	return &sa1
   171  }
   172  
   173  func (sa *SockaddrInet6) key() interface{} { return *sa }
   174  
   175  type SockaddrUnix struct {
   176  	Name string
   177  }
   178  
   179  func (sa *SockaddrUnix) copy() Sockaddr {
   180  	sa1 := *sa
   181  	return &sa1
   182  }
   183  
   184  func (sa *SockaddrUnix) key() interface{} { return *sa }
   185  
   186  type SockaddrDatalink struct {
   187  	Len    uint8
   188  	Family uint8
   189  	Index  uint16
   190  	Type   uint8
   191  	Nlen   uint8
   192  	Alen   uint8
   193  	Slen   uint8
   194  	Data   [12]int8
   195  }
   196  
   197  func (sa *SockaddrDatalink) copy() Sockaddr {
   198  	sa1 := *sa
   199  	return &sa1
   200  }
   201  
   202  func (sa *SockaddrDatalink) key() interface{} { return *sa }
   203  
   204  // RoutingMessage represents a routing message.
   205  type RoutingMessage interface {
   206  	unimplemented()
   207  }
   208  
   209  type IPMreq struct {
   210  	Multiaddr [4]byte /* in_addr */
   211  	Interface [4]byte /* in_addr */
   212  }
   213  
   214  type IPv6Mreq struct {
   215  	Multiaddr [16]byte /* in6_addr */
   216  	Interface uint32
   217  }
   218  
   219  type Linger struct {
   220  	Onoff  int32
   221  	Linger int32
   222  }
   223  
   224  type ICMPv6Filter struct {
   225  	Filt [8]uint32
   226  }
   227  
   228  // A queue is the bookkeeping for a synchronized buffered queue.
   229  // We do not use channels because we need to be able to handle
   230  // writes after and during close, and because a chan byte would
   231  // require too many send and receive operations in real use.
   232  type queue struct {
   233  	sync.Mutex
   234  	canRead  sync.Cond
   235  	canWrite sync.Cond
   236  	r        int // total read index
   237  	w        int // total write index
   238  	m        int // index mask
   239  	closed   bool
   240  }
   241  
   242  func (q *queue) init(size int) {
   243  	if size&(size-1) != 0 {
   244  		panic("invalid queue size - must be power of two")
   245  	}
   246  	q.canRead.L = &q.Mutex
   247  	q.canWrite.L = &q.Mutex
   248  	q.m = size - 1
   249  }
   250  
   251  func past(deadline int64) bool {
   252  	sec, nsec := now()
   253  	return deadline > 0 && deadline < sec*1e9+int64(nsec)
   254  }
   255  
   256  func (q *queue) waitRead(n int, deadline int64) (int, error) {
   257  	if past(deadline) {
   258  		return 0, EAGAIN
   259  	}
   260  	var t timer
   261  	t.start(q, deadline)
   262  	for q.w-q.r == 0 && !q.closed && !t.expired {
   263  		q.canRead.Wait()
   264  	}
   265  	t.stop()
   266  	m := q.w - q.r
   267  	if m == 0 && t.expired {
   268  		return 0, EAGAIN
   269  	}
   270  	if m > n {
   271  		m = n
   272  		q.canRead.Signal() // wake up next reader too
   273  	}
   274  	q.canWrite.Signal()
   275  	return m, nil
   276  }
   277  
   278  func (q *queue) waitWrite(n int, deadline int64) (int, error) {
   279  	if past(deadline) {
   280  		return 0, EAGAIN
   281  	}
   282  	var t timer
   283  	t.start(q, deadline)
   284  	for q.w-q.r > q.m && !q.closed && !t.expired {
   285  		q.canWrite.Wait()
   286  	}
   287  	t.stop()
   288  	m := q.m + 1 - (q.w - q.r)
   289  	if m == 0 && t.expired {
   290  		return 0, EAGAIN
   291  	}
   292  	if m == 0 {
   293  		return 0, EAGAIN
   294  	}
   295  	if m > n {
   296  		m = n
   297  		q.canWrite.Signal() // wake up next writer too
   298  	}
   299  	q.canRead.Signal()
   300  	return m, nil
   301  }
   302  
   303  func (q *queue) close() {
   304  	q.Lock()
   305  	defer q.Unlock()
   306  	q.closed = true
   307  	q.canRead.Broadcast()
   308  	q.canWrite.Broadcast()
   309  }
   310  
   311  // A byteq is a byte queue.
   312  type byteq struct {
   313  	queue
   314  	data []byte
   315  }
   316  
   317  func newByteq() *byteq {
   318  	q := &byteq{
   319  		data: make([]byte, 4096),
   320  	}
   321  	q.init(len(q.data))
   322  	return q
   323  }
   324  
   325  func (q *byteq) read(b []byte, deadline int64) (int, error) {
   326  	q.Lock()
   327  	defer q.Unlock()
   328  	n, err := q.waitRead(len(b), deadline)
   329  	if err != nil {
   330  		return 0, err
   331  	}
   332  	b = b[:n]
   333  	for len(b) > 0 {
   334  		m := copy(b, q.data[q.r&q.m:])
   335  		q.r += m
   336  		b = b[m:]
   337  	}
   338  	return n, nil
   339  }
   340  
   341  func (q *byteq) write(b []byte, deadline int64) (n int, err error) {
   342  	q.Lock()
   343  	defer q.Unlock()
   344  	for n < len(b) {
   345  		nn, err := q.waitWrite(len(b[n:]), deadline)
   346  		if err != nil {
   347  			return n, err
   348  		}
   349  		bb := b[n : n+nn]
   350  		n += nn
   351  		for len(bb) > 0 {
   352  			m := copy(q.data[q.w&q.m:], bb)
   353  			q.w += m
   354  			bb = bb[m:]
   355  		}
   356  	}
   357  	return n, nil
   358  }
   359  
   360  // A msgq is a queue of messages.
   361  type msgq struct {
   362  	queue
   363  	data []interface{}
   364  }
   365  
   366  func newMsgq() *msgq {
   367  	q := &msgq{
   368  		data: make([]interface{}, 32),
   369  	}
   370  	q.init(len(q.data))
   371  	return q
   372  }
   373  
   374  func (q *msgq) read(deadline int64) (interface{}, error) {
   375  	q.Lock()
   376  	defer q.Unlock()
   377  	n, err := q.waitRead(1, deadline)
   378  	if err != nil {
   379  		return nil, err
   380  	}
   381  	if n == 0 {
   382  		return nil, nil
   383  	}
   384  	m := q.data[q.r&q.m]
   385  	q.r++
   386  	return m, nil
   387  }
   388  
   389  func (q *msgq) write(m interface{}, deadline int64) error {
   390  	q.Lock()
   391  	defer q.Unlock()
   392  	_, err := q.waitWrite(1, deadline)
   393  	if err != nil {
   394  		return err
   395  	}
   396  	q.data[q.w&q.m] = m
   397  	q.w++
   398  	return nil
   399  }
   400  
   401  // An addr is a sequence of bytes uniquely identifying a network address.
   402  // It is not human-readable.
   403  type addr string
   404  
   405  // A conn is one side of a stream-based network connection.
   406  // That is, a stream-based network connection is a pair of cross-connected conns.
   407  type conn struct {
   408  	rd     *byteq
   409  	wr     *byteq
   410  	local  addr
   411  	remote addr
   412  }
   413  
   414  // A pktconn is one side of a packet-based network connection.
   415  // That is, a packet-based network connection is a pair of cross-connected pktconns.
   416  type pktconn struct {
   417  	rd     *msgq
   418  	wr     *msgq
   419  	local  addr
   420  	remote addr
   421  }
   422  
   423  // A listener accepts incoming stream-based network connections.
   424  type listener struct {
   425  	rd    *msgq
   426  	local addr
   427  }
   428  
   429  // A netFile is an open network file.
   430  type netFile struct {
   431  	defaultFileImpl
   432  	proto      *netproto
   433  	sotype     int
   434  	listener   *msgq
   435  	packet     *msgq
   436  	rd         *byteq
   437  	wr         *byteq
   438  	rddeadline int64
   439  	wrdeadline int64
   440  	addr       Sockaddr
   441  	raddr      Sockaddr
   442  }
   443  
   444  // A netAddr is a network address in the global listener map.
   445  // All the fields must have defined == operations.
   446  type netAddr struct {
   447  	proto  *netproto
   448  	sotype int
   449  	addr   interface{}
   450  }
   451  
   452  // net records the state of the network.
   453  // It maps a network address to the listener on that address.
   454  var net = struct {
   455  	sync.Mutex
   456  	listener map[netAddr]*netFile
   457  }{
   458  	listener: make(map[netAddr]*netFile),
   459  }
   460  
   461  // TODO(rsc): Some day, do a better job with port allocation.
   462  // For playground programs, incrementing is fine.
   463  var nextport = 2
   464  
   465  // A netproto contains protocol-specific functionality
   466  // (one for AF_INET, one for AF_INET6 and so on).
   467  // It is a struct instead of an interface because the
   468  // implementation needs no state, and I expect to
   469  // add some data fields at some point.
   470  type netproto struct {
   471  	bind func(*netFile, Sockaddr) error
   472  }
   473  
   474  var netprotoAF_INET = &netproto{
   475  	bind: func(f *netFile, sa Sockaddr) error {
   476  		if sa == nil {
   477  			f.addr = &SockaddrInet4{
   478  				Port: nextport,
   479  				Addr: [4]byte{127, 0, 0, 1},
   480  			}
   481  			nextport++
   482  			return nil
   483  		}
   484  		addr, ok := sa.(*SockaddrInet4)
   485  		if !ok {
   486  			return EINVAL
   487  		}
   488  		addr = addr.copy().(*SockaddrInet4)
   489  		if addr.Port == 0 {
   490  			addr.Port = nextport
   491  			nextport++
   492  		}
   493  		f.addr = addr
   494  		return nil
   495  	},
   496  }
   497  
   498  var netprotos = map[int]*netproto{
   499  	AF_INET: netprotoAF_INET,
   500  }
   501  
   502  // These functions implement the usual BSD socket operations.
   503  
   504  func (f *netFile) bind(sa Sockaddr) error {
   505  	if f.addr != nil {
   506  		return EISCONN
   507  	}
   508  	if err := f.proto.bind(f, sa); err != nil {
   509  		return err
   510  	}
   511  	if f.sotype == SOCK_DGRAM {
   512  		_, ok := net.listener[netAddr{f.proto, f.sotype, f.addr.key()}]
   513  		if ok {
   514  			f.addr = nil
   515  			return EADDRINUSE
   516  		}
   517  		net.listener[netAddr{f.proto, f.sotype, f.addr.key()}] = f
   518  		f.packet = newMsgq()
   519  	}
   520  	return nil
   521  }
   522  
   523  func (f *netFile) listen(backlog int) error {
   524  	net.Lock()
   525  	defer net.Unlock()
   526  	if f.listener != nil {
   527  		return EINVAL
   528  	}
   529  	_, ok := net.listener[netAddr{f.proto, f.sotype, f.addr.key()}]
   530  	if ok {
   531  		return EADDRINUSE
   532  	}
   533  	net.listener[netAddr{f.proto, f.sotype, f.addr.key()}] = f
   534  	f.listener = newMsgq()
   535  	return nil
   536  }
   537  
   538  func (f *netFile) accept() (fd int, sa Sockaddr, err error) {
   539  	msg, err := f.listener.read(f.readDeadline())
   540  	if err != nil {
   541  		return -1, nil, err
   542  	}
   543  	newf, ok := msg.(*netFile)
   544  	if !ok {
   545  		// must be eof
   546  		return -1, nil, EAGAIN
   547  	}
   548  	return newFD(newf), newf.raddr.copy(), nil
   549  }
   550  
   551  func (f *netFile) connect(sa Sockaddr) error {
   552  	if past(f.writeDeadline()) {
   553  		return EAGAIN
   554  	}
   555  	if f.addr == nil {
   556  		if err := f.bind(nil); err != nil {
   557  			return err
   558  		}
   559  	}
   560  	net.Lock()
   561  	if sa == nil {
   562  		net.Unlock()
   563  		return EINVAL
   564  	}
   565  	sa = sa.copy()
   566  	if f.raddr != nil {
   567  		net.Unlock()
   568  		return EISCONN
   569  	}
   570  	if f.sotype == SOCK_DGRAM {
   571  		net.Unlock()
   572  		f.raddr = sa
   573  		return nil
   574  	}
   575  	if f.listener != nil {
   576  		net.Unlock()
   577  		return EISCONN
   578  	}
   579  	l, ok := net.listener[netAddr{f.proto, f.sotype, sa.key()}]
   580  	if !ok {
   581  		net.Unlock()
   582  		return ECONNREFUSED
   583  	}
   584  	f.raddr = sa
   585  	f.rd = newByteq()
   586  	f.wr = newByteq()
   587  	newf := &netFile{
   588  		proto:  f.proto,
   589  		sotype: f.sotype,
   590  		addr:   f.raddr,
   591  		raddr:  f.addr,
   592  		rd:     f.wr,
   593  		wr:     f.rd,
   594  	}
   595  	net.Unlock()
   596  	l.listener.write(newf, f.writeDeadline())
   597  	return nil
   598  }
   599  
   600  func (f *netFile) read(b []byte) (int, error) {
   601  	if f.rd == nil {
   602  		if f.raddr != nil {
   603  			n, _, err := f.recvfrom(b, 0)
   604  			return n, err
   605  		}
   606  		return 0, ENOTCONN
   607  	}
   608  	return f.rd.read(b, f.readDeadline())
   609  }
   610  
   611  func (f *netFile) write(b []byte) (int, error) {
   612  	if f.wr == nil {
   613  		if f.raddr != nil {
   614  			err := f.sendto(b, 0, f.raddr)
   615  			var n int
   616  			if err == nil {
   617  				n = len(b)
   618  			}
   619  			return n, err
   620  		}
   621  		return 0, ENOTCONN
   622  	}
   623  	return f.wr.write(b, f.writeDeadline())
   624  }
   625  
   626  type pktmsg struct {
   627  	buf  []byte
   628  	addr Sockaddr
   629  }
   630  
   631  func (f *netFile) recvfrom(p []byte, flags int) (n int, from Sockaddr, err error) {
   632  	if f.sotype != SOCK_DGRAM {
   633  		return 0, nil, EINVAL
   634  	}
   635  	if f.packet == nil {
   636  		return 0, nil, ENOTCONN
   637  	}
   638  	msg1, err := f.packet.read(f.readDeadline())
   639  	if err != nil {
   640  		return 0, nil, err
   641  	}
   642  	msg, ok := msg1.(*pktmsg)
   643  	if !ok {
   644  		return 0, nil, EAGAIN
   645  	}
   646  	return copy(p, msg.buf), msg.addr, nil
   647  }
   648  
   649  func (f *netFile) sendto(p []byte, flags int, to Sockaddr) error {
   650  	if f.sotype != SOCK_DGRAM {
   651  		return EINVAL
   652  	}
   653  	if f.packet == nil {
   654  		if err := f.bind(nil); err != nil {
   655  			return err
   656  		}
   657  	}
   658  	net.Lock()
   659  	if to == nil {
   660  		net.Unlock()
   661  		return EINVAL
   662  	}
   663  	to = to.copy()
   664  	l, ok := net.listener[netAddr{f.proto, f.sotype, to.key()}]
   665  	if !ok || l.packet == nil {
   666  		net.Unlock()
   667  		return ECONNREFUSED
   668  	}
   669  	net.Unlock()
   670  	msg := &pktmsg{
   671  		buf:  make([]byte, len(p)),
   672  		addr: f.addr,
   673  	}
   674  	copy(msg.buf, p)
   675  	l.packet.write(msg, f.writeDeadline())
   676  	return nil
   677  }
   678  
   679  func (f *netFile) close() error {
   680  	if f.listener != nil {
   681  		f.listener.close()
   682  	}
   683  	if f.packet != nil {
   684  		f.packet.close()
   685  	}
   686  	if f.rd != nil {
   687  		f.rd.close()
   688  	}
   689  	if f.wr != nil {
   690  		f.wr.close()
   691  	}
   692  	return nil
   693  }
   694  
   695  func fdToNetFile(fd int) (*netFile, error) {
   696  	f, err := fdToFile(fd)
   697  	if err != nil {
   698  		return nil, err
   699  	}
   700  	impl := f.impl
   701  	netf, ok := impl.(*netFile)
   702  	if !ok {
   703  		return nil, EINVAL
   704  	}
   705  	return netf, nil
   706  }
   707  
   708  func Socket(proto, sotype, unused int) (fd int, err error) {
   709  	p := netprotos[proto]
   710  	if p == nil {
   711  		return -1, EPROTONOSUPPORT
   712  	}
   713  	if sotype != SOCK_STREAM && sotype != SOCK_DGRAM {
   714  		return -1, ESOCKTNOSUPPORT
   715  	}
   716  	f := &netFile{
   717  		proto:  p,
   718  		sotype: sotype,
   719  	}
   720  	return newFD(f), nil
   721  }
   722  
   723  func Bind(fd int, sa Sockaddr) error {
   724  	f, err := fdToNetFile(fd)
   725  	if err != nil {
   726  		return err
   727  	}
   728  	return f.bind(sa)
   729  }
   730  
   731  func StopIO(fd int) error {
   732  	f, err := fdToNetFile(fd)
   733  	if err != nil {
   734  		return err
   735  	}
   736  	f.close()
   737  	return nil
   738  }
   739  
   740  func Listen(fd int, backlog int) error {
   741  	f, err := fdToNetFile(fd)
   742  	if err != nil {
   743  		return err
   744  	}
   745  	return f.listen(backlog)
   746  }
   747  
   748  func Accept(fd int) (newfd int, sa Sockaddr, err error) {
   749  	f, err := fdToNetFile(fd)
   750  	if err != nil {
   751  		return 0, nil, err
   752  	}
   753  	return f.accept()
   754  }
   755  
   756  func Getsockname(fd int) (sa Sockaddr, err error) {
   757  	f, err := fdToNetFile(fd)
   758  	if err != nil {
   759  		return nil, err
   760  	}
   761  	if f.addr == nil {
   762  		return nil, ENOTCONN
   763  	}
   764  	return f.addr.copy(), nil
   765  }
   766  
   767  func Getpeername(fd int) (sa Sockaddr, err error) {
   768  	f, err := fdToNetFile(fd)
   769  	if err != nil {
   770  		return nil, err
   771  	}
   772  	if f.raddr == nil {
   773  		return nil, ENOTCONN
   774  	}
   775  	return f.raddr.copy(), nil
   776  }
   777  
   778  func Connect(fd int, sa Sockaddr) error {
   779  	f, err := fdToNetFile(fd)
   780  	if err != nil {
   781  		return err
   782  	}
   783  	return f.connect(sa)
   784  }
   785  
   786  func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) {
   787  	f, err := fdToNetFile(fd)
   788  	if err != nil {
   789  		return 0, nil, err
   790  	}
   791  	return f.recvfrom(p, flags)
   792  }
   793  
   794  func Sendto(fd int, p []byte, flags int, to Sockaddr) error {
   795  	f, err := fdToNetFile(fd)
   796  	if err != nil {
   797  		return err
   798  	}
   799  	return f.sendto(p, flags, to)
   800  }
   801  
   802  func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn, recvflags int, from Sockaddr, err error) {
   803  	f, err := fdToNetFile(fd)
   804  	if err != nil {
   805  		return
   806  	}
   807  	n, from, err = f.recvfrom(p, flags)
   808  	return
   809  }
   810  
   811  func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) error {
   812  	_, err := SendmsgN(fd, p, oob, to, flags)
   813  	return err
   814  }
   815  
   816  func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
   817  	f, err := fdToNetFile(fd)
   818  	if err != nil {
   819  		return 0, err
   820  	}
   821  	switch f.sotype {
   822  	case SOCK_STREAM:
   823  		n, err = f.write(p)
   824  	case SOCK_DGRAM:
   825  		n = len(p)
   826  		err = f.sendto(p, flags, to)
   827  	}
   828  	if err != nil {
   829  		return 0, err
   830  	}
   831  	return n, nil
   832  }
   833  
   834  func GetsockoptInt(fd, level, opt int) (value int, err error) {
   835  	f, err := fdToNetFile(fd)
   836  	if err != nil {
   837  		return 0, err
   838  	}
   839  	switch {
   840  	case level == SOL_SOCKET && opt == SO_TYPE:
   841  		return f.sotype, nil
   842  	}
   843  	return 0, ENOTSUP
   844  }
   845  
   846  func SetsockoptInt(fd, level, opt int, value int) error {
   847  	return nil
   848  }
   849  
   850  func SetsockoptByte(fd, level, opt int, value byte) error {
   851  	_, err := fdToNetFile(fd)
   852  	if err != nil {
   853  		return err
   854  	}
   855  	return ENOTSUP
   856  }
   857  
   858  func SetsockoptLinger(fd, level, opt int, l *Linger) error {
   859  	return nil
   860  }
   861  
   862  func SetReadDeadline(fd int, t int64) error {
   863  	f, err := fdToNetFile(fd)
   864  	if err != nil {
   865  		return err
   866  	}
   867  	atomic.StoreInt64(&f.rddeadline, t)
   868  	return nil
   869  }
   870  
   871  func (f *netFile) readDeadline() int64 {
   872  	return atomic.LoadInt64(&f.rddeadline)
   873  }
   874  
   875  func SetWriteDeadline(fd int, t int64) error {
   876  	f, err := fdToNetFile(fd)
   877  	if err != nil {
   878  		return err
   879  	}
   880  	atomic.StoreInt64(&f.wrdeadline, t)
   881  	return nil
   882  }
   883  
   884  func (f *netFile) writeDeadline() int64 {
   885  	return atomic.LoadInt64(&f.wrdeadline)
   886  }
   887  
   888  func Shutdown(fd int, how int) error {
   889  	f, err := fdToNetFile(fd)
   890  	if err != nil {
   891  		return err
   892  	}
   893  	switch how {
   894  	case SHUT_RD:
   895  		f.rd.close()
   896  	case SHUT_WR:
   897  		f.wr.close()
   898  	case SHUT_RDWR:
   899  		f.rd.close()
   900  		f.wr.close()
   901  	}
   902  	return nil
   903  }
   904  
   905  func SetsockoptICMPv6Filter(fd, level, opt int, filter *ICMPv6Filter) error { panic("SetsockoptICMPv") }
   906  func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) error               { panic("SetsockoptIPMreq") }
   907  func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) error           { panic("SetsockoptIPv") }
   908  func SetsockoptInet4Addr(fd, level, opt int, value [4]byte) error           { panic("SetsockoptInet") }
   909  func SetsockoptString(fd, level, opt int, s string) error                   { panic("SetsockoptString") }
   910  func SetsockoptTimeval(fd, level, opt int, tv *Timeval) error               { panic("SetsockoptTimeval") }
   911  func Socketpair(domain, typ, proto int) (fd [2]int, err error)              { panic("Socketpair") }
   912  
   913  func SetNonblock(fd int, nonblocking bool) error { return nil }