diff --git a/src/lib/net/dnsclient.go b/src/lib/net/dnsclient.go
index c0a4177..afae7cf 100644
--- a/src/lib/net/dnsclient.go
+++ b/src/lib/net/dnsclient.go
@@ -41,7 +41,7 @@
 
 // Send a request on the connection and hope for a reply.
 // Up to cfg.attempts attempts.
-func _Exchange(cfg *_DNS_Config, c Conn, name string) (m *_DNS_Msg, err *os.Error) {
+func _Exchange(cfg *_DNS_Config, c Conn, name string) (m *_DNS_Msg, err os.Error) {
 	if len(name) >= 256 {
 		return nil, DNS_NameTooLong
 	}
@@ -86,7 +86,7 @@
 // Find answer for name in dns message.
 // On return, if err == nil, addrs != nil.
 // TODO(rsc): Maybe return []IP instead?
-func answer(name string, dns *_DNS_Msg) (addrs []string, err *os.Error) {
+func answer(name string, dns *_DNS_Msg) (addrs []string, err os.Error) {
 	addrs = make([]string, 0, len(dns.answer));
 
 	if dns.rcode == _DNS_RcodeNameError && dns.authoritative {
@@ -137,7 +137,7 @@
 
 // Do a lookup for a single name, which must be rooted
 // (otherwise answer will not find the answers).
-func tryOneName(cfg *_DNS_Config, name string) (addrs []string, err *os.Error) {
+func tryOneName(cfg *_DNS_Config, name string) (addrs []string, err os.Error) {
 	err = DNS_NoServers;
 	for i := 0; i < len(cfg.servers); i++ {
 		// Calling Dial here is scary -- we have to be sure
@@ -168,7 +168,7 @@
 }
 
 var cfg *_DNS_Config
-var dnserr *os.Error
+var dnserr os.Error
 
 func loadConfig() {
 	cfg, dnserr = _DNS_ReadConfig();
@@ -177,7 +177,7 @@
 // LookupHost looks up the host name using the local DNS resolver.
 // It returns the canonical name for the host and an array of that
 // host's addresses.
-func LookupHost(name string) (cname string, addrs []string, err *os.Error)
+func LookupHost(name string) (cname string, addrs []string, err os.Error)
 {
 	// TODO(rsc): Pick out obvious non-DNS names to avoid
 	// sending stupid requests to the server?
diff --git a/src/lib/net/dnsconfig.go b/src/lib/net/dnsconfig.go
index 385d07b..e56d964 100644
--- a/src/lib/net/dnsconfig.go
+++ b/src/lib/net/dnsconfig.go
@@ -22,16 +22,16 @@
 	rotate bool;	// round robin among servers
 }
 
-var _DNS_configError *os.Error;
+var _DNS_configError os.Error;
 
 // See resolv.conf(5) on a Linux machine.
 // TODO(rsc): Supposed to call uname() and chop the beginning
 // of the host name to get the default search domain.
 // We assume it's in resolv.conf anyway.
-func _DNS_ReadConfig() (*_DNS_Config, *os.Error) {
+func _DNS_ReadConfig() (*_DNS_Config, os.Error) {
 	// TODO(rsc): 6g won't let me say file, err :=
 	var file *file;
-	var err *os.Error;
+	var err os.Error;
 	file, err = open("/etc/resolv.conf");
 	if err != nil {
 		return nil, err
diff --git a/src/lib/net/fd.go b/src/lib/net/fd.go
index 8b26efe..b386728 100644
--- a/src/lib/net/fd.go
+++ b/src/lib/net/fd.go
@@ -38,7 +38,7 @@
 }
 
 // Make reads and writes on fd return EAGAIN instead of blocking.
-func setNonblock(fd int64) *os.Error {
+func setNonblock(fd int64) os.Error {
 	flags, e := syscall.Fcntl(fd, syscall.F_GETFL, 0);
 	if e != 0 {
 		return os.ErrnoToError(e)
@@ -97,7 +97,7 @@
 }
 func (s *pollServer) Run();
 
-func newPollServer() (s *pollServer, err *os.Error) {
+func newPollServer() (s *pollServer, err os.Error) {
 	s = new(pollServer);
 	s.cr = make(chan *netFD, 1);
 	s.cw = make(chan *netFD, 1);
@@ -318,7 +318,7 @@
 	pollserver = p
 }
 
-func newFD(fd int64, net, laddr, raddr string) (f *netFD, err *os.Error) {
+func newFD(fd int64, net, laddr, raddr string) (f *netFD, err os.Error) {
 	if pollserver == nil {
 		once.Do(_StartServer);
 	}
@@ -336,7 +336,7 @@
 	return f, nil
 }
 
-func (fd *netFD) Close() *os.Error {
+func (fd *netFD) Close() os.Error {
 	if fd == nil || fd.file == nil {
 		return os.EINVAL
 	}
@@ -355,7 +355,7 @@
 	return e
 }
 
-func (fd *netFD) Read(p []byte) (n int, err *os.Error) {
+func (fd *netFD) Read(p []byte) (n int, err os.Error) {
 	if fd == nil || fd.file == nil {
 		return -1, os.EINVAL
 	}
@@ -374,7 +374,7 @@
 	return n, err
 }
 
-func (fd *netFD) Write(p []byte) (n int, err *os.Error) {
+func (fd *netFD) Write(p []byte) (n int, err os.Error) {
 	if fd == nil || fd.file == nil {
 		return -1, os.EINVAL
 	}
@@ -406,9 +406,9 @@
 	return nn, err
 }
 
-func sockaddrToHostPort(sa *syscall.Sockaddr) (hostport string, err *os.Error)
+func sockaddrToHostPort(sa *syscall.Sockaddr) (hostport string, err os.Error)
 
-func (fd *netFD) Accept(sa *syscall.Sockaddr) (nfd *netFD, err *os.Error) {
+func (fd *netFD) Accept(sa *syscall.Sockaddr) (nfd *netFD, err os.Error) {
 	if fd == nil || fd.file == nil {
 		return nil, os.EINVAL
 	}
diff --git a/src/lib/net/fd_darwin.go b/src/lib/net/fd_darwin.go
index c543755..b4392d0 100644
--- a/src/lib/net/fd_darwin.go
+++ b/src/lib/net/fd_darwin.go
@@ -18,7 +18,7 @@
 	events []syscall.Kevent_t;
 }
 
-func newpollster() (p *pollster, err *os.Error) {
+func newpollster() (p *pollster, err os.Error) {
 	p = new(pollster);
 	var e int64;
 	if p.kq, e = syscall.Kqueue(); e != 0 {
@@ -28,7 +28,7 @@
 	return p, nil
 }
 
-func (p *pollster) AddFD(fd int64, mode int, repeat bool) *os.Error {
+func (p *pollster) AddFD(fd int64, mode int, repeat bool) os.Error {
 	var kmode int16;
 	if mode == 'r' {
 		kmode = syscall.EVFILT_READ
@@ -81,7 +81,7 @@
 	syscall.Kevent(p.kq, &events, &events, nil);
 }
 
-func (p *pollster) WaitFD(nsec int64) (fd int64, mode int, err *os.Error) {
+func (p *pollster) WaitFD(nsec int64) (fd int64, mode int, err os.Error) {
 	var t *syscall.Timespec;
 	for len(p.events) == 0 {
 		if nsec > 0 {
@@ -114,7 +114,7 @@
 	return fd, mode, nil
 }
 
-func (p *pollster) Close() *os.Error {
+func (p *pollster) Close() os.Error {
 	r, e := syscall.Close(p.kq);
 	return os.ErrnoToError(e)
 }
diff --git a/src/lib/net/fd_linux.go b/src/lib/net/fd_linux.go
index ecdf1da..78a1670 100644
--- a/src/lib/net/fd_linux.go
+++ b/src/lib/net/fd_linux.go
@@ -24,7 +24,7 @@
 	events map[int64] uint32;
 }
 
-func newpollster() (p *pollster, err *os.Error) {
+func newpollster() (p *pollster, err os.Error) {
 	p = new(pollster);
 	var e int64;
 
@@ -38,7 +38,7 @@
 	return p, nil
 }
 
-func (p *pollster) AddFD(fd int64, mode int, repeat bool) *os.Error {
+func (p *pollster) AddFD(fd int64, mode int, repeat bool) os.Error {
 	var ev syscall.EpollEvent;
 	var already bool;
 	ev.Fd = int32(fd);
@@ -106,7 +106,7 @@
 	}
 }
 
-func (p *pollster) WaitFD(nsec int64) (fd int64, mode int, err *os.Error) {
+func (p *pollster) WaitFD(nsec int64) (fd int64, mode int, err os.Error) {
 	// Get an event.
 	var evarray [1]syscall.EpollEvent;
 	ev := &evarray[0];
@@ -145,7 +145,7 @@
 	return fd, 'r', nil;
 }
 
-func (p *pollster) Close() *os.Error {
+func (p *pollster) Close() os.Error {
 	r, e := syscall.Close(p.epfd);
 	return os.ErrnoToError(e);
 }
diff --git a/src/lib/net/net.go b/src/lib/net/net.go
index c63972a..737af52 100644
--- a/src/lib/net/net.go
+++ b/src/lib/net/net.go
@@ -19,11 +19,11 @@
 	UnknownSocketFamily = os.NewError("unknown socket family");
 )
 
-func LookupHost(name string) (cname string, addrs []string, err *os.Error)
+func LookupHost(name string) (cname string, addrs []string, err os.Error)
 
 // Split "host:port" into "host" and "port".
 // Host cannot contain colons unless it is bracketed.
-func splitHostPort(hostport string) (host, port string, err *os.Error) {
+func splitHostPort(hostport string) (host, port string, err os.Error) {
 	// The port starts after the last colon.
 	var i int;
 	for i = len(hostport)-1; i >= 0; i-- {
@@ -63,7 +63,7 @@
 // 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, hostport, mode string) (ip []byte, iport int, err *os.Error) {
+func hostPortToIP(net, hostport, mode string) (ip []byte, iport int, err os.Error) {
 	var host, port string;
 	host, port, err = splitHostPort(hostport);
 	if err != nil {
@@ -114,7 +114,7 @@
 }
 
 // Convert socket address into "host:port".
-func sockaddrToHostPort(sa *syscall.Sockaddr) (hostport string, err *os.Error) {
+func sockaddrToHostPort(sa *syscall.Sockaddr) (hostport string, err os.Error) {
 	switch sa.Family {
 	case syscall.AF_INET, syscall.AF_INET6:
 		addr, port, e := sockaddrToIP(sa);
@@ -139,7 +139,7 @@
 
 // Generic socket creation.
 func socket(net, laddr, raddr string, f, p, t int64, la, ra *syscall.Sockaddr)
-	(fd *netFD, err *os.Error)
+	(fd *netFD, err os.Error)
 {
 	// See ../syscall/exec.go for description of ForkLock.
 	syscall.ForkLock.RLock();
@@ -201,17 +201,17 @@
 	return c.fd.fd;
 }
 
-func (c *connBase) Read(b []byte) (n int, err *os.Error) {
+func (c *connBase) Read(b []byte) (n int, err os.Error) {
 	n, err = c.fd.Read(b);
 	return n, err
 }
 
-func (c *connBase) Write(b []byte) (n int, err *os.Error) {
+func (c *connBase) Write(b []byte) (n int, err os.Error) {
 	n, err = c.fd.Write(b);
 	return n, err
 }
 
-func (c *connBase) ReadFrom(b []byte) (n int, raddr string, err *os.Error) {
+func (c *connBase) ReadFrom(b []byte) (n int, raddr string, err os.Error) {
 	if c == nil {
 		return -1, "", os.EINVAL
 	}
@@ -219,7 +219,7 @@
 	return n, c.raddr, err
 }
 
-func (c *connBase) WriteTo(raddr string, b []byte) (n int, err *os.Error) {
+func (c *connBase) WriteTo(raddr string, b []byte) (n int, err os.Error) {
 	if c == nil {
 		return -1, os.EINVAL
 	}
@@ -230,7 +230,7 @@
 	return n, err
 }
 
-func (c *connBase) Close() *os.Error {
+func (c *connBase) Close() os.Error {
 	if c == nil {
 		return os.EINVAL
 	}
@@ -238,57 +238,57 @@
 }
 
 
-func setsockopt_int(fd, level, opt int64, value int) *os.Error {
+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 {
+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 {
+func (c *connBase) SetReadBuffer(bytes int) os.Error {
 	return setsockopt_int(c.sysFD(), syscall.SOL_SOCKET, syscall.SO_RCVBUF, bytes);
 }
 
-func (c *connBase) SetWriteBuffer(bytes int) *os.Error {
+func (c *connBase) SetWriteBuffer(bytes int) os.Error {
 	return setsockopt_int(c.sysFD(), syscall.SOL_SOCKET, syscall.SO_SNDBUF, bytes);
 }
 
-func (c *connBase) SetReadTimeout(nsec int64) *os.Error {
+func (c *connBase) SetReadTimeout(nsec int64) os.Error {
 	c.fd.rdeadline_delta = nsec;
 	return nil;
 }
 
-func (c *connBase) SetWriteTimeout(nsec int64) *os.Error {
+func (c *connBase) SetWriteTimeout(nsec int64) os.Error {
 	c.fd.wdeadline_delta = nsec;
 	return nil;
 }
 
-func (c *connBase) SetTimeout(nsec int64) *os.Error {
+func (c *connBase) SetTimeout(nsec int64) os.Error {
 	if e := c.SetReadTimeout(nsec); e != nil {
 		return e
 	}
 	return c.SetWriteTimeout(nsec)
 }
 
-func (c *connBase) SetReuseAddr(reuse bool) *os.Error {
+func (c *connBase) SetReuseAddr(reuse bool) os.Error {
 	return setsockopt_int(c.sysFD(), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, boolint(reuse));
 }
 
-func (c *connBase) BindToDevice(dev string) *os.Error {
+func (c *connBase) BindToDevice(dev string) os.Error {
 	// TODO(rsc): call setsockopt with null-terminated string pointer
 	return os.EINVAL
 }
 
-func (c *connBase) SetDontRoute(dontroute bool) *os.Error {
+func (c *connBase) SetDontRoute(dontroute bool) os.Error {
 	return setsockopt_int(c.sysFD(), syscall.SOL_SOCKET, syscall.SO_DONTROUTE, boolint(dontroute));
 }
 
-func (c *connBase) SetKeepAlive(keepalive bool) *os.Error {
+func (c *connBase) SetKeepAlive(keepalive bool) os.Error {
 	return setsockopt_int(c.sysFD(), syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, boolint(keepalive));
 }
 
-func (c *connBase) SetLinger(sec int) *os.Error {
+func (c *connBase) SetLinger(sec int) os.Error {
 	e := syscall.Setsockopt_linger(c.sysFD(), syscall.SOL_SOCKET, syscall.SO_LINGER, sec);
 	return os.ErrnoToError(e);
 }
@@ -305,12 +305,12 @@
 const preferIPv4 = false
 
 func internetSocket(net, laddr, raddr string, proto int64, mode string)
-	(fd *netFD, err *os.Error)
+	(fd *netFD, err os.Error)
 {
 	// Parse addresses (unless they are empty).
 	var lip, rip IP;
 	var lport, rport int;
-	var lerr, rerr *os.Error;
+	var lerr, rerr os.Error;
 
 	if laddr != "" {
 		lip, lport, lerr = hostPortToIP(net, laddr, mode);
@@ -343,7 +343,7 @@
 		}
 	}
 
-	var cvt func(addr []byte, port int) (sa *syscall.Sockaddr, err *os.Error);
+	var cvt func(addr []byte, port int) (sa *syscall.Sockaddr, err os.Error);
 	var family int64;
 	if vers == 4 {
 		cvt = v4ToSockaddr;
@@ -378,7 +378,7 @@
 	connBase
 }
 
-func (c *ConnTCP) SetNoDelay(nodelay bool) *os.Error {
+func (c *ConnTCP) SetNoDelay(nodelay bool) os.Error {
 	if c == nil {
 		return os.EINVAL
 	}
@@ -393,7 +393,7 @@
 	return c
 }
 
-func DialTCP(net, laddr, raddr string) (c *ConnTCP, err *os.Error) {
+func DialTCP(net, laddr, raddr string) (c *ConnTCP, err os.Error) {
 	if raddr == "" {
 		return nil, MissingAddress
 	}
@@ -420,7 +420,7 @@
 	return c
 }
 
-func DialUDP(net, laddr, raddr string) (c *ConnUDP, err *os.Error) {
+func DialUDP(net, laddr, raddr string) (c *ConnUDP, err os.Error) {
 	if raddr == "" {
 		return nil, MissingAddress
 	}
@@ -441,48 +441,48 @@
 	// Read blocks until data is ready from the connection
 	// and then reads into b.  It returns the number
 	// of bytes read, or 0 if the connection has been closed.
-	Read(b []byte) (n int, err *os.Error);
+	Read(b []byte) (n int, err os.Error);
 
 	// Write writes the data in b to the connection.
-	Write(b []byte) (n int, err *os.Error);
+	Write(b []byte) (n int, err os.Error);
 
 	// Close closes the connection.
-	Close() *os.Error;
+	Close() os.Error;
 
 	// For packet-based protocols such as UDP,
 	// ReadFrom reads the next packet from the network,
 	// returning the number of bytes read and the remote
 	// address that sent them.
-	ReadFrom(b []byte) (n int, addr string, err *os.Error);
+	ReadFrom(b []byte) (n int, addr string, err os.Error);
 
 	// For packet-based protocols such as UDP,
 	// WriteTo writes the byte buffer b to the network
 	// as a single payload, sending it to the target address.
-	WriteTo(addr string, b []byte) (n int, err *os.Error);
+	WriteTo(addr string, b []byte) (n int, err os.Error);
 
 	// SetReadBuffer sets the size of the operating system's
 	// receive buffer associated with the connection.
-	SetReadBuffer(bytes int) *os.Error;
+	SetReadBuffer(bytes int) os.Error;
 
 	// SetReadBuffer sets the size of the operating system's
 	// transmit buffer associated with the connection.
-	SetWriteBuffer(bytes int) *os.Error;
+	SetWriteBuffer(bytes int) os.Error;
 
 	// SetTimeout sets the read and write deadlines associated
 	// with the connection.
-	SetTimeout(nsec int64) *os.Error;
+	SetTimeout(nsec int64) os.Error;
 
 	// SetReadTimeout sets the time (in nanoseconds) that
 	// Read will wait for data before returning os.EAGAIN.
 	// Setting nsec == 0 (the default) disables the deadline.
-	SetReadTimeout(nsec int64) *os.Error;
+	SetReadTimeout(nsec int64) os.Error;
 
 	// SetWriteTimeout sets the time (in nanoseconds) that
 	// Write will wait to send its data before returning os.EAGAIN.
 	// Setting nsec == 0 (the default) disables the deadline.
 	// Even if write times out, it may return n > 0, indicating that
 	// some of the data was successfully written.
-	SetWriteTimeout(nsec int64) *os.Error;
+	SetWriteTimeout(nsec int64) os.Error;
 
 	// SetLinger sets the behavior of Close() on a connection
 	// which still has data waiting to be sent or to be acknowledged.
@@ -495,22 +495,22 @@
 	//
 	// If sec > 0, Close blocks for at most sec seconds waiting for
 	// data to be sent and acknowledged.
-	SetLinger(sec int) *os.Error;
+	SetLinger(sec int) os.Error;
 
 	// SetReuseAddr sets whether it is okay to reuse addresses
 	// from recent connections that were not properly closed.
-	SetReuseAddr(reuseaddr bool) *os.Error;
+	SetReuseAddr(reuseaddr bool) os.Error;
 
 	// SetDontRoute sets whether outgoing messages should
 	// bypass the system routing tables.
-	SetDontRoute(dontroute bool) *os.Error;
+	SetDontRoute(dontroute bool) os.Error;
 
 	// SetKeepAlive sets whether the operating system should send
 	// keepalive messages on the connection.
-	SetKeepAlive(keepalive bool) *os.Error;
+	SetKeepAlive(keepalive bool) os.Error;
 
 	// BindToDevice binds a connection to a particular network device.
-	BindToDevice(dev string) *os.Error;
+	BindToDevice(dev string) os.Error;
 }
 
 // Dial connects to the remote address raddr on the network net.
@@ -528,7 +528,7 @@
 //	Dial("tcp", "", "google.com:80")
 //	Dial("tcp", "", "[de:ad:be:ef::ca:fe]:80")
 //	Dial("tcp", "127.0.0.1:123", "127.0.0.1:88")
-func Dial(net, laddr, raddr string) (c Conn, err *os.Error) {
+func Dial(net, laddr, raddr string) (c Conn, err os.Error) {
 	switch net {
 	case "tcp", "tcp4", "tcp6":
 		c, err := DialTCP(net, laddr, raddr);
@@ -557,8 +557,8 @@
 // A Listener is a generic network listener.
 // Accept waits for the next connection and Close closes the connection.
 type Listener interface {
-	Accept() (c Conn, raddr string, err *os.Error);
-	Close() *os.Error;
+	Accept() (c Conn, raddr string, err os.Error);
+	Close() os.Error;
 }
 
 // ListenerTCP is a TCP network listener.
@@ -571,7 +571,7 @@
 
 // ListenTCP announces on the TCP address laddr and returns a TCP listener.
 // Net must be "tcp", "tcp4", or "tcp6".
-func ListenTCP(net, laddr string) (l *ListenerTCP, err *os.Error) {
+func ListenTCP(net, laddr string) (l *ListenerTCP, err os.Error) {
 	fd, e := internetSocket(net, laddr, "", syscall.SOCK_STREAM, "listen");
 	if e != nil {
 		return nil, e
@@ -588,7 +588,7 @@
 
 // AcceptTCP accepts the next incoming call and returns the new connection
 // and the remote address.
-func (l *ListenerTCP) AcceptTCP() (c *ConnTCP, raddr string, err *os.Error) {
+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
 	}
@@ -607,7 +607,7 @@
 
 // Accept implements the accept method in the Listener interface;
 // it waits for the next call and returns a generic Conn.
-func (l *ListenerTCP) Accept() (c Conn, raddr string, err *os.Error) {
+func (l *ListenerTCP) Accept() (c Conn, raddr string, err os.Error) {
 	c1, r1, e1 := l.AcceptTCP();
 	if e1 != nil {
 		return nil, "", e1
@@ -617,7 +617,7 @@
 
 // Close stops listening on the TCP address.
 // Already Accepted connections are not closed.
-func (l *ListenerTCP) Close() *os.Error {
+func (l *ListenerTCP) Close() os.Error {
 	if l == nil || l.fd == nil {
 		return os.EINVAL
 	}
@@ -626,7 +626,7 @@
 
 // Listen announces on the local network address laddr.
 // The network string net must be "tcp", "tcp4", or "tcp6".
-func Listen(net, laddr string) (l Listener, err *os.Error) {
+func Listen(net, laddr string) (l Listener, err os.Error) {
 	switch net {
 	case "tcp", "tcp4", "tcp6":
 		l, err := ListenTCP(net, laddr);
diff --git a/src/lib/net/net_darwin.go b/src/lib/net/net_darwin.go
index 78a705a..7e85f08 100644
--- a/src/lib/net/net_darwin.go
+++ b/src/lib/net/net_darwin.go
@@ -11,7 +11,7 @@
 	"unsafe";
 )
 
-func v4ToSockaddr(p IP, port int) (sa1 *syscall.Sockaddr, err *os.Error) {
+func v4ToSockaddr(p IP, port int) (sa1 *syscall.Sockaddr, err os.Error) {
 	p = p.To4();
 	if p == nil || port < 0 || port > 0xFFFF {
 		return nil, os.EINVAL
@@ -27,7 +27,7 @@
 	return (*syscall.Sockaddr)(unsafe.Pointer(sa)), nil
 }
 
-func v6ToSockaddr(p IP, port int) (sa1 *syscall.Sockaddr, err *os.Error) {
+func v6ToSockaddr(p IP, port int) (sa1 *syscall.Sockaddr, err os.Error) {
 	p = p.To16();
 	if p == nil || port < 0 || port > 0xFFFF {
 		return nil, os.EINVAL
@@ -44,7 +44,7 @@
 }
 
 
-func sockaddrToIP(sa1 *syscall.Sockaddr) (p IP, port int, err *os.Error) {
+func sockaddrToIP(sa1 *syscall.Sockaddr) (p IP, port int, err os.Error) {
 	switch sa1.Family {
 	case syscall.AF_INET:
 		sa := (*syscall.SockaddrInet4)(unsafe.Pointer(sa1));
diff --git a/src/lib/net/net_linux.go b/src/lib/net/net_linux.go
index ddc13d3..b6bfe76 100644
--- a/src/lib/net/net_linux.go
+++ b/src/lib/net/net_linux.go
@@ -11,7 +11,7 @@
 	"unsafe";
 )
 
-func v4ToSockaddr(p IP, port int) (sa1 *syscall.Sockaddr, err *os.Error) {
+func v4ToSockaddr(p IP, port int) (sa1 *syscall.Sockaddr, err os.Error) {
 	p = p.To4();
 	if p == nil || port < 0 || port > 0xFFFF {
 		return nil, os.EINVAL
@@ -26,7 +26,7 @@
 	return (*syscall.Sockaddr)(unsafe.Pointer(sa)), nil
 }
 
-func v6ToSockaddr(p IP, port int) (sa1 *syscall.Sockaddr, err *os.Error) {
+func v6ToSockaddr(p IP, port int) (sa1 *syscall.Sockaddr, err os.Error) {
 	p = p.To16();
 	if p == nil || port < 0 || port > 0xFFFF {
 		return nil, os.EINVAL
@@ -49,7 +49,7 @@
 	return (*syscall.Sockaddr)(unsafe.Pointer(sa)), nil
 }
 
-func sockaddrToIP(sa1 *syscall.Sockaddr) (p IP, port int, err *os.Error) {
+func sockaddrToIP(sa1 *syscall.Sockaddr) (p IP, port int, err os.Error) {
 	switch sa1.Family {
 	case syscall.AF_INET:
 		sa := (*syscall.SockaddrInet4)(unsafe.Pointer(sa1));
diff --git a/src/lib/net/parse.go b/src/lib/net/parse.go
index 194f412..72aeff0 100644
--- a/src/lib/net/parse.go
+++ b/src/lib/net/parse.go
@@ -55,7 +55,7 @@
 	return
 }
 
-func open(name string) (*file, *os.Error) {
+func open(name string) (*file, os.Error) {
 	fd, err := os.Open(name, os.O_RDONLY, 0);
 	if err != nil {
 		return nil, err;
diff --git a/src/lib/net/port.go b/src/lib/net/port.go
index cc7f399..073af65 100644
--- a/src/lib/net/port.go
+++ b/src/lib/net/port.go
@@ -19,7 +19,7 @@
 var ErrNoService = os.NewError("unknown network service");
 
 var services map[string] map[string] int
-var servicesError *os.Error
+var servicesError os.Error
 
 func readServices() {
 	services = make(map[string] map[string] int);
@@ -55,7 +55,7 @@
 }
 
 // LookupPort looks up the port for the given network and service.
-func LookupPort(network, service string) (port int, err *os.Error) {
+func LookupPort(network, service string) (port int, err os.Error) {
 	once.Do(readServices);
 
 	switch network {
