aboutsummaryrefslogtreecommitdiff
path: root/src/lib/net
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2008-09-26 14:11:26 -0700
committerRuss Cox <rsc@golang.org>2008-09-26 14:11:26 -0700
commit6201a963f1ea19e1473dc13f4d5f397a9eac543a (patch)
tree26c67a72dec44faba761ffd9fac52a927ec58ffe /src/lib/net
parent2662aad7b788cd0bda630d45f659dc12211adc8a (diff)
downloadgo-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/Makefile65
-rw-r--r--src/lib/net/cvt.s38
-rw-r--r--src/lib/net/fd_darwin.go79
-rw-r--r--src/lib/net/fd_linux.go79
-rw-r--r--src/lib/net/ip.go2
-rw-r--r--src/lib/net/net.go171
-rw-r--r--src/lib/net/net_darwin.go70
-rw-r--r--src/lib/net/net_linux.go70
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
+}
+