net_nacl.go 17 KB

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