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