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 }