diff options
| author | Russ Cox <rsc@golang.org> | 2008-09-26 14:11:26 -0700 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2008-09-26 14:11:26 -0700 |
| commit | 6201a963f1ea19e1473dc13f4d5f397a9eac543a (patch) | |
| tree | 26c67a72dec44faba761ffd9fac52a927ec58ffe /src/lib/net | |
| parent | 2662aad7b788cd0bda630d45f659dc12211adc8a (diff) | |
| download | go-6201a963f1ea19e1473dc13f4d5f397a9eac543a.tar.xz | |
move src/syscall to src/lib/syscall.
enforce rule: all kernel data structures and constants
go in syscall module.
move things that should be in syscall out of net.
make net a single package.
R=r
OCL=15985
CL=15994
Diffstat (limited to 'src/lib/net')
| -rw-r--r-- | src/lib/net/Makefile | 65 | ||||
| -rw-r--r-- | src/lib/net/cvt.s | 38 | ||||
| -rw-r--r-- | src/lib/net/fd_darwin.go | 79 | ||||
| -rw-r--r-- | src/lib/net/fd_linux.go | 79 | ||||
| -rw-r--r-- | src/lib/net/ip.go | 2 | ||||
| -rw-r--r-- | src/lib/net/net.go | 171 | ||||
| -rw-r--r-- | src/lib/net/net_darwin.go | 70 | ||||
| -rw-r--r-- | src/lib/net/net_linux.go | 70 |
8 files changed, 429 insertions, 145 deletions
diff --git a/src/lib/net/Makefile b/src/lib/net/Makefile index 4788e84e12..553a95d49d 100644 --- a/src/lib/net/Makefile +++ b/src/lib/net/Makefile @@ -2,46 +2,57 @@ # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file. +# DO NOT EDIT. Automatically generated by gobuild. +# gobuild -m net net.go fd_darwin.go ip.go cast_amd64.s net_darwin.go O=6 GC=$(O)g +CC=$(O)c -w AS=$(O)a +AR=$(O)ar -NET=$(GOROOT)/pkg/net.a -SOCKET=$(GOROOT)/pkg/socket.a -IP=$(GOROOT)/pkg/ip.$O +PKG=$(GOROOT)/pkg/net.a -NETO=\ - net.$O\ +install: $(PKG) -SOCKETO=\ - cvt.$O\ - socket_$(GOOS).$O\ +nuke: clean + rm -f $(PKG) -$(NET): $(NETO) - $(O)ar grc $(NET) $(NETO) +clean: + rm -f *.$O *.a -$(NETO): $(IP) $(SOCKET) +%.$O: %.go + $(GC) $*.go -$(SOCKETO): $(IP) +%.$O: %.c + $(CC) $*.c -$(SOCKET): $(SOCKETO) - $(O)ar grc $(SOCKET) $(SOCKETO) - rm $(SOCKETO) +%.$O: %.s + $(AS) $*.s -$(GOROOT)/pkg/%.$O: %.$O - cp $*.$O $(GOROOT)/pkg/$*.$O - rm $*.$O -install: nuke $(IP) $(SOCKET) $(NET) +O1=\ + ip.$O\ + cast_$(GOARCH).$O\ -nuke: - rm -f *.$O *.a $(IP) $(NET) +O2=\ + fd_$(GOOS).$O\ + net_$(GOOS).$O\ -clean: - rm -f *.$O *.a +O3=\ + net.$O\ + +$(PKG): a1 a2 a3 +a1: $(O1) + $(AR) grc $(PKG) $(O1) + rm -f $(O1) +a2: $(O2) + $(AR) grc $(PKG) $(O2) + rm -f $(O2) +a3: $(O3) + $(AR) grc $(PKG) $(O3) + rm -f $(O3) -%.$O: %.go - $(GC) $< +$(O1): nuke +$(O2): a1 +$(O3): a2 -%.$O: %.s - $(AS) $< diff --git a/src/lib/net/cvt.s b/src/lib/net/cvt.s deleted file mode 100644 index 920f52351e..0000000000 --- a/src/lib/net/cvt.s +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Type-unsafe casts. - -TEXT socket·SockaddrPtr(SB),7,$0 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET -TEXT socket·Int32Ptr(SB),7,$0 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET -TEXT socket·LingerPtr(SB),7,$0 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET -TEXT socket·TimevalPtr(SB),7,$0 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET -TEXT socket·SockaddrInet4ToSockaddr(SB),7,$0 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET -TEXT socket·SockaddrToSockaddrInet4(SB),7,$0 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET -TEXT socket·SockaddrInet6ToSockaddr(SB),7,$0 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET -TEXT socket·SockaddrToSockaddrInet6(SB),7,$0 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET diff --git a/src/lib/net/fd_darwin.go b/src/lib/net/fd_darwin.go new file mode 100644 index 0000000000..28b24d9ba3 --- /dev/null +++ b/src/lib/net/fd_darwin.go @@ -0,0 +1,79 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Network file descriptors. + +package net + +import ( + "os"; + "syscall"; + "net" +) + +/* BUG 6g has trouble with this. + +export type FD os.FD; + +export func NewFD(fd int64) (nfd *FD, err *os.Error) { + ofd := os.NewFD(fd) + return ofd, nil +} + +func (fd *FD) Close() *os.Error { + var ofd *os.FD = fd + return ofd.Close() +} + +func (fd *FD) Read(p *[]byte) (n int, err *os.Error) { + var ofd *os.FD = fd; + n, err = ofd.Read(p) + return n, err +} + +func (fd *FD) Write(p *[]byte) (n int, err *os.Error) { + var ofd *os.FD = fd; + n, err = ofd.Write(p) + return n, err +} + +*/ + +// TODO: Replace with kqueue/kevent. + +export type FD struct { + fd int64; + osfd *os.FD; +} + +export func NewFD(fd int64) (nfd *FD, err *os.Error) { + nfd = new(FD); + nfd.osfd = os.NewFD(fd); + nfd.fd = fd + return nfd, nil +} + +func (fd *FD) Close() *os.Error { + return fd.osfd.Close() +} + +func (fd *FD) Read(p *[]byte) (n int, err *os.Error) { + n, err = fd.osfd.Read(p) + return n, err +} + +func (fd *FD) Write(p *[]byte) (n int, err *os.Error) { + n, err = fd.osfd.Write(p) + return n, err +} + +func (fd *FD) Accept(sa *syscall.Sockaddr) (nfd *FD, err *os.Error) { + s, e := syscall.accept(fd.fd, sa); + if e != 0 { + return nil, os.ErrnoToError(e) + } + nfd, err = NewFD(s) + return nfd, err +} + diff --git a/src/lib/net/fd_linux.go b/src/lib/net/fd_linux.go new file mode 100644 index 0000000000..dc7ba2db14 --- /dev/null +++ b/src/lib/net/fd_linux.go @@ -0,0 +1,79 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Network file descriptors. + +package net + +import ( + "os"; + "syscall"; + "net" +) + +/* BUG 6g has trouble with this. + +export type FD os.FD; + +export func NewFD(fd int64) (nfd *FD, err *os.Error) { + ofd := os.NewFD(fd) + return ofd, nil +} + +func (fd *FD) Close() *os.Error { + var ofd *os.FD = fd + return ofd.Close() +} + +func (fd *FD) Read(p *[]byte) (n int, err *os.Error) { + var ofd *os.FD = fd; + n, err = ofd.Read(p) + return n, err +} + +func (fd *FD) Write(p *[]byte) (n int, err *os.Error) { + var ofd *os.FD = fd; + n, err = ofd.Write(p) + return n, err +} + +*/ + +// TODO: Replace with epoll. + +export type FD struct { + fd int64; + osfd *os.FD; +} + +export func NewFD(fd int64) (nfd *FD, err *os.Error) { + nfd = new(FD); + nfd.osfd = os.NewFD(fd); + nfd.fd = fd + return nfd, nil +} + +func (fd *FD) Close() *os.Error { + return fd.osfd.Close() +} + +func (fd *FD) Read(p *[]byte) (n int, err *os.Error) { + n, err = fd.osfd.Read(p) + return n, err +} + +func (fd *FD) Write(p *[]byte) (n int, err *os.Error) { + n, err = fd.osfd.Write(p) + return n, err +} + +func (fd *FD) Accept(sa *syscall.Sockaddr) (nfd *FD, err *os.Error) { + s, e := syscall.accept(fd.fd, sa); + if e != 0 { + return nil, os.ErrnoToError(e) + } + nfd, err = NewFD(s) + return nfd, err +} + diff --git a/src/lib/net/ip.go b/src/lib/net/ip.go index a96ae6709b..8c53d6f189 100644 --- a/src/lib/net/ip.go +++ b/src/lib/net/ip.go @@ -10,7 +10,7 @@ // This library accepts either size of byte array but always // returns 16-byte addresses. -package ip +package net export const ( IPv4len = 4; diff --git a/src/lib/net/net.go b/src/lib/net/net.go index 55fc98a8d0..5ffa83c517 100644 --- a/src/lib/net/net.go +++ b/src/lib/net/net.go @@ -6,8 +6,7 @@ package net import ( "os"; - "ip"; - "socket"; + "net"; "strings"; "syscall" ) @@ -64,7 +63,7 @@ func JoinHostPort(host, port string) string { return host + ":" + port } -func dtoi(s string) (n int, ok bool) { +func xdtoi(s string) (n int, ok bool) { if s == "" || s[0] < '0' || s[0] > '9' { return 0, false } @@ -81,7 +80,7 @@ func dtoi(s string) (n int, ok bool) { // Convert "host:port" into IP address and port. // For now, host and port must be numeric literals. // Eventually, we'll have name resolution. -func HostPortToIP(net string, hostport string) (ipaddr *[]byte, iport int, err *os.Error) { +func HostPortToIP(net string, hostport string) (ip *[]byte, iport int, err *os.Error) { var host, port string; host, port, err = SplitHostPort(hostport); if err != nil { @@ -90,14 +89,14 @@ func HostPortToIP(net string, hostport string) (ipaddr *[]byte, iport int, err * // TODO: Resolve host. - addr := ip.ParseIP(host); + addr := ParseIP(host); if addr == nil { return nil, 0, UnknownHost } // TODO: Resolve port. - p, ok := dtoi(port); + p, ok := xdtoi(port); if !ok || p < 0 || p > 0xFFFF { return nil, 0, UnknownPort } @@ -106,14 +105,14 @@ func HostPortToIP(net string, hostport string) (ipaddr *[]byte, iport int, err * } // Convert socket address into "host:port". -func SockaddrToHostPort(sa *socket.Sockaddr) (hostport string, err *os.Error) { +func SockaddrToHostPort(sa *syscall.Sockaddr) (hostport string, err *os.Error) { switch sa.family { - case socket.AF_INET, socket.AF_INET6: - addr, port, e := socket.SockaddrToIP(sa) + case syscall.AF_INET, syscall.AF_INET6: + addr, port, e := SockaddrToIP(sa) if e != nil { return "", e } - host := ip.IPToString(addr); + host := IPToString(addr); return JoinHostPort(host, strings.itoa(port)), nil default: return "", UnknownSocketFamily @@ -130,45 +129,48 @@ func boolint(b bool) int { } // Generic Socket creation. -func Socket(f, p, t int64, la, ra *socket.Sockaddr) (fd int64, err *os.Error) { - s, e := socket.socket(f, p, t); - if e != nil { - return -1, e +func Socket(f, p, t int64, la, ra *syscall.Sockaddr) (fd *FD, err *os.Error) { + s, e := syscall.socket(f, p, t); + if e != 0 { + return nil, os.ErrnoToError(e) } // Allow reuse of recently-used addresses. - socket.setsockopt_int(s, socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + syscall.setsockopt_int(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) var r int64 if la != nil { - r, e = socket.bind(s, la) - if e != nil { + r, e = syscall.bind(s, la) + if e != 0 { syscall.close(s) - return -1, e + return nil, os.ErrnoToError(e) } } if ra != nil { - r, e = socket.connect(s, ra) - if e != nil { + r, e = syscall.connect(s, ra) + if e != 0 { syscall.close(s) - return -1, e + return nil, os.ErrnoToError(e) } } - return s, nil + fd, err = NewFD(s) + if err != nil { + syscall.close(s) + return nil, err + } + + return fd, nil } // Generic implementation of Conn interface; not exported. - type ConnBase struct { - fd *os.FD; + fd *FD; raddr string; } -// Eventually, these will use epoll or some such. - func (c *ConnBase) FD() int64 { if c == nil || c.fd == nil { return -1 @@ -212,20 +214,29 @@ func (c *ConnBase) Close() *os.Error { return c.fd.Close() } + +func setsockopt_int(fd, level, opt int64, value int) *os.Error { + return os.ErrnoToError(syscall.setsockopt_int(fd, level, opt, value)); +} + +func setsockopt_tv(fd, level, opt int64, nsec int64) *os.Error { + return os.ErrnoToError(syscall.setsockopt_tv(fd, level, opt, nsec)); +} + func (c *ConnBase) SetReadBuffer(bytes int) *os.Error { - return socket.setsockopt_int(c.FD(), socket.SOL_SOCKET, socket.SO_RCVBUF, bytes); + return setsockopt_int(c.FD(), syscall.SOL_SOCKET, syscall.SO_RCVBUF, bytes); } func (c *ConnBase) SetWriteBuffer(bytes int) *os.Error { - return socket.setsockopt_int(c.FD(), socket.SOL_SOCKET, socket.SO_SNDBUF, bytes); + return setsockopt_int(c.FD(), syscall.SOL_SOCKET, syscall.SO_SNDBUF, bytes); } func (c *ConnBase) SetReadTimeout(nsec int64) *os.Error { - return socket.setsockopt_tv(c.FD(), socket.SOL_SOCKET, socket.SO_RCVTIMEO, nsec); + return setsockopt_tv(c.FD(), syscall.SOL_SOCKET, syscall.SO_RCVTIMEO, nsec); } func (c *ConnBase) SetWriteTimeout(nsec int64) *os.Error { - return socket.setsockopt_tv(c.FD(), socket.SOL_SOCKET, socket.SO_SNDTIMEO, nsec); + return setsockopt_tv(c.FD(), syscall.SOL_SOCKET, syscall.SO_SNDTIMEO, nsec); } func (c *ConnBase) SetTimeout(nsec int64) *os.Error { @@ -236,7 +247,7 @@ func (c *ConnBase) SetTimeout(nsec int64) *os.Error { } func (c *ConnBase) SetReuseAddr(reuse bool) *os.Error { - return socket.setsockopt_int(c.FD(), socket.SOL_SOCKET, socket.SO_REUSEADDR, boolint(reuse)); + return setsockopt_int(c.FD(), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, boolint(reuse)); } func (c *ConnBase) BindToDevice(dev string) *os.Error { @@ -245,15 +256,16 @@ func (c *ConnBase) BindToDevice(dev string) *os.Error { } func (c *ConnBase) SetDontRoute(dontroute bool) *os.Error { - return socket.setsockopt_int(c.FD(), socket.SOL_SOCKET, socket.SO_DONTROUTE, boolint(dontroute)); + return setsockopt_int(c.FD(), syscall.SOL_SOCKET, syscall.SO_DONTROUTE, boolint(dontroute)); } func (c *ConnBase) SetKeepAlive(keepalive bool) *os.Error { - return socket.setsockopt_int(c.FD(), socket.SOL_SOCKET, socket.SO_KEEPALIVE, boolint(keepalive)); + return setsockopt_int(c.FD(), syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, boolint(keepalive)); } func (c *ConnBase) SetLinger(sec int) *os.Error { - return socket.setsockopt_linger(c.FD(), socket.SOL_SOCKET, socket.SO_LINGER, sec); + e := syscall.setsockopt_linger(c.FD(), syscall.SOL_SOCKET, syscall.SO_LINGER, sec) + return os.ErrnoToError(e); } @@ -267,7 +279,7 @@ func (c *ConnBase) SetLinger(sec int) *os.Error { // PreferIPv4 here should fall back to the IPv4 socket interface when possible. const PreferIPv4 = false -func InternetSocket(net, laddr, raddr string, proto int64) (fd int64, err *os.Error) { +func InternetSocket(netw, laddr, raddr string, proto int64) (fd *FD, err *os.Error) { // Parse addresses (unless they are empty). var lip, rip *[]byte var lport, rport int @@ -280,22 +292,22 @@ rport = 0; lerr = nil; rerr = nil if laddr != "" { - lip, lport, lerr = HostPortToIP(net, laddr) + lip, lport, lerr = HostPortToIP(netw, laddr) if lerr != nil { - return -1, lerr + return nil, lerr } } if raddr != "" { - rip, rport, rerr = HostPortToIP(net, raddr) + rip, rport, rerr = HostPortToIP(netw, raddr) if rerr != nil { - return -1, rerr + return nil, rerr } } // Figure out IP version. // If network has a suffix like "tcp4", obey it. vers := 0; - switch net[len(net)-1] { + switch netw[len(netw)-1] { case '4': vers = 4 case '6': @@ -304,38 +316,38 @@ rerr = nil // Otherwise, guess. // If the addresses are IPv4 and we prefer IPv4, use 4; else 6. if PreferIPv4 - && (lip == nil || ip.ToIPv4(lip) != nil) - && (rip == nil || ip.ToIPv4(rip) != nil) { + && (lip == nil || ToIPv4(lip) != nil) + && (rip == nil || ToIPv4(rip) != nil) { vers = 4 } else { vers = 6 } } - var cvt *(addr *[]byte, port int) (sa *socket.Sockaddr, err *os.Error) + var cvt *(addr *[]byte, port int) (sa *syscall.Sockaddr, err *os.Error) var family int64 if vers == 4 { - cvt = &socket.IPv4ToSockaddr; - family = socket.AF_INET + cvt = &IPv4ToSockaddr; + family = syscall.AF_INET } else { - cvt = &socket.IPv6ToSockaddr; - family = socket.AF_INET6 + cvt = &IPv6ToSockaddr; + family = syscall.AF_INET6 } - var la, ra *socket.Sockaddr; + var la, ra *syscall.Sockaddr; // BUG la = nil; ra = nil if lip != nil { la, lerr = cvt(lip, lport); if lerr != nil { - return -1, lerr + return nil, lerr } } if rip != nil { ra, rerr = cvt(rip, rport); if rerr != nil { - return -1, rerr + return nil, rerr } } @@ -355,7 +367,7 @@ func (c *ConnTCP) SetNoDelay(nodelay bool) *os.Error { if c == nil { return os.EINVAL } - return socket.setsockopt_int(c.base.fd.fd, socket.IPPROTO_TCP, socket.TCP_NODELAY, boolint(nodelay)) + return setsockopt_int((&c.base).FD(), syscall.IPPROTO_TCP, syscall.TCP_NODELAY, boolint(nodelay)) } // Wrappers @@ -409,19 +421,19 @@ func (c *ConnTCP) SetKeepAlive(keepalive bool) *os.Error { return (&c.base).SetKeepAlive(keepalive) } -func NewConnTCP(fd int64, raddr string) *ConnTCP { +func NewConnTCP(fd *FD, raddr string) *ConnTCP { c := new(ConnTCP); - c.base.fd = os.NewFD(fd); + c.base.fd = fd; c.base.raddr = raddr; c.SetNoDelay(true); return c } -export func DialTCP(net, laddr, raddr string) (c *ConnTCP, err *os.Error) { +export func DialTCP(netw, laddr, raddr string) (c *ConnTCP, err *os.Error) { if raddr == "" { return nil, MissingAddress } - fd, e := InternetSocket(net, laddr, raddr, socket.SOCK_STREAM) + fd, e := InternetSocket(netw, laddr, raddr, syscall.SOCK_STREAM) if e != nil { return nil, e } @@ -484,26 +496,26 @@ var noconn NoConn // Eventually, we plan to allow names in addition to IP addresses, // but that requires writing a DNS library. -export func Dial(net, laddr, raddr string) (c Conn, err *os.Error) { - switch net { +export func Dial(netw, laddr, raddr string) (c Conn, err *os.Error) { + switch netw { case "tcp", "tcp4", "tcp6": - c, err := DialTCP(net, laddr, raddr) + c, err := DialTCP(netw, laddr, raddr) if err != nil { return &noconn, err } return c, nil /* case "udp", "udp4", "upd6": - c, err := DialUDP(net, laddr, raddr) + c, err := DialUDP(netw, laddr, raddr) return c, err case "ether": - c, err := DialEther(net, laddr, raddr) + c, err := DialEther(netw, laddr, raddr) return c, err case "ipv4": - c, err := DialIPv4(net, laddr, raddr) + c, err := DialIPv4(netw, laddr, raddr) return c, err case "ipv6": - c, err := DialIPv6(net, laddr, raddr) + c, err := DialIPv6(netw, laddr, raddr) return c, err */ } @@ -525,22 +537,22 @@ func (l *NoListener) Close() *os.Error { return os.EINVAL } var nolistener NoListener export type ListenerTCP struct { - fd *os.FD; + fd *FD; laddr string } -export func ListenTCP(net, laddr string) (l *ListenerTCP, err *os.Error) { - fd, e := InternetSocket(net, laddr, "", socket.SOCK_STREAM) +export func ListenTCP(netw, laddr string) (l *ListenerTCP, err *os.Error) { + fd, e := InternetSocket(netw, laddr, "", syscall.SOCK_STREAM) if e != nil { return nil, e } - r, e1 := socket.listen(fd, socket.ListenBacklog()) - if e1 != nil { - syscall.close(fd) - return nil, e1 + r, e1 := syscall.listen(fd.fd, ListenBacklog()) + if e1 != 0 { + syscall.close(fd.fd) + return nil, os.ErrnoToError(e1) } l = new(ListenerTCP); - l.fd = os.NewFD(fd); + l.fd = fd return l, nil } @@ -548,15 +560,15 @@ func (l *ListenerTCP) AcceptTCP() (c *ConnTCP, raddr string, err *os.Error) { if l == nil || l.fd == nil || l.fd.fd < 0 { return nil, "", os.EINVAL } - var sa socket.Sockaddr; - fd, e := socket.accept(l.fd.fd, &sa) + var sa syscall.Sockaddr; + fd, e := l.fd.Accept(&sa) if e != nil { return nil, "", e } - raddr, e = SockaddrToHostPort(&sa) - if e != nil { - syscall.close(fd) - return nil, "", e + raddr, err = SockaddrToHostPort(&sa) + if err != nil { + fd.Close() + return nil, "", err } return NewConnTCP(fd, raddr), raddr, nil } @@ -576,10 +588,10 @@ func (l *ListenerTCP) Close() *os.Error { return l.fd.Close() } -export func Listen(net, laddr string) (l Listener, err *os.Error) { - switch net { +export func Listen(netw, laddr string) (l Listener, err *os.Error) { + switch netw { case "tcp", "tcp4", "tcp6": - l, err := ListenTCP(net, laddr) + l, err := ListenTCP(netw, laddr) if err != nil { return &nolistener, err } @@ -590,3 +602,4 @@ export func Listen(net, laddr string) (l Listener, err *os.Error) { } return nil, UnknownNetwork } + diff --git a/src/lib/net/net_darwin.go b/src/lib/net/net_darwin.go new file mode 100644 index 0000000000..3accbe13bb --- /dev/null +++ b/src/lib/net/net_darwin.go @@ -0,0 +1,70 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package net + +import ( + "os"; + "syscall"; + "net" +) + +export func IPv4ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os.Error) { + p = ToIPv4(p) + if p == nil || port < 0 || port > 0xFFFF { + return nil, os.EINVAL + } + sa := new(syscall.SockaddrInet4); + sa.len = syscall.SizeofSockaddrInet4; + sa.family = syscall.AF_INET; + sa.port[0] = byte(port>>8); + sa.port[1] = byte(port); + for i := 0; i < IPv4len; i++ { + sa.addr[i] = p[i] + } + return syscall.SockaddrInet4ToSockaddr(sa), nil +} + +export func IPv6ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os.Error) { + p = ToIPv6(p) + if p == nil || port < 0 || port > 0xFFFF { + return nil, os.EINVAL + } + sa := new(syscall.SockaddrInet6); + sa.len = syscall.SizeofSockaddrInet6; + sa.family = syscall.AF_INET6; + sa.port[0] = byte(port>>8); + sa.port[1] = byte(port); + for i := 0; i < IPv6len; i++ { + sa.addr[i] = p[i] + } + return syscall.SockaddrInet6ToSockaddr(sa), nil +} + +export func SockaddrToIP(sa1 *syscall.Sockaddr) (p *[]byte, port int, err *os.Error) { + switch sa1.family { + case syscall.AF_INET: + sa := syscall.SockaddrToSockaddrInet4(sa1); + a := ToIPv6(&sa.addr) + if a == nil { + return nil, 0, os.EINVAL + } + return a, int(sa.port[0])<<8 + int(sa.port[1]), nil + case syscall.AF_INET6: + sa := syscall.SockaddrToSockaddrInet6(sa1); + a := ToIPv6(&sa.addr) + if a == nil { + return nil, 0, os.EINVAL + } + return a, int(sa.port[0])<<8 + int(sa.port[1]), nil + default: + return nil, 0, os.EINVAL + } + return nil, 0, nil // not reached +} + +export func ListenBacklog() int64 { + return syscall.SOMAXCONN +} + diff --git a/src/lib/net/net_linux.go b/src/lib/net/net_linux.go new file mode 100644 index 0000000000..bc0b8f6d3a --- /dev/null +++ b/src/lib/net/net_linux.go @@ -0,0 +1,70 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package net + +import ( + "os"; + "syscall"; + "net" +) + +export func IPv4ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os.Error) { + p = ToIPv4(p) + if p == nil || port < 0 || port > 0xFFFF { + return nil, os.EINVAL + } + sa := new(syscall.SockaddrInet4); + sa.family = syscall.AF_INET; + sa.port[0] = byte(port>>8); + sa.port[1] = byte(port); + for i := 0; i < IPv4len; i++ { + sa.addr[i] = p[i] + } + return syscall.SockaddrInet4ToSockaddr(sa), nil +} + +export func IPv6ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os.Error) { + p = ToIPv6(p) + if p == nil || port < 0 || port > 0xFFFF { + return nil, os.EINVAL + } + sa := new(syscall.SockaddrInet6); + sa.family = syscall.AF_INET6; + sa.port[0] = byte(port>>8); + sa.port[1] = byte(port); + for i := 0; i < IPv6len; i++ { + sa.addr[i] = p[i] + } + return syscall.SockaddrInet6ToSockaddr(sa), nil +} + +export func SockaddrToIP(sa1 *syscall.Sockaddr) (p *[]byte, port int, err *os.Error) { + switch sa1.family { + case syscall.AF_INET: + sa := syscall.SockaddrToSockaddrInet4(sa1); + a := ToIPv6(&sa.addr) + if a == nil { + return nil, 0, os.EINVAL + } + return a, int(sa.port[0])<<8 + int(sa.port[1]), nil + case syscall.AF_INET6: + sa := syscall.SockaddrToSockaddrInet6(sa1); + a := ToIPv6(&sa.addr) + if a == nil { + return nil, 0, os.EINVAL + } + return a, int(sa.port[0])<<8 + int(sa.port[1]), nil + default: + return nil, 0, os.EINVAL + } + return nil, 0, nil // not reached +} + +export func ListenBacklog() int64 { + // TODO: Read the limit from /proc/sys/net/core/somaxconn, + // to take advantage of kernels that have raised the limit. + return syscall.SOMAXCONN +} + |
