libgo: Update to weekly.2011-11-18.

R=iant
CC=gofrontend-dev
https://golang.org/cl/5488050
diff --git a/libgo/go/syscall/bpf_bsd.go b/libgo/go/syscall/bpf_bsd.go
index 06a2953..f94b723 100644
--- a/libgo/go/syscall/bpf_bsd.go
+++ b/libgo/go/syscall/bpf_bsd.go
@@ -20,54 +20,54 @@
 	return &BpfInsn{Code: uint16(code), Jt: uint8(jt), Jf: uint8(jf), K: uint32(k)}
 }
 
-func BpfBuflen(fd int) (int, int) {
+func BpfBuflen(fd int) (int, error) {
 	var l int
-	_, _, ep := Syscall(SYS_IOCTL, uintptr(fd), BIOCGBLEN, uintptr(unsafe.Pointer(&l)))
-	if e := int(ep); e != 0 {
-		return 0, e
+	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGBLEN, uintptr(unsafe.Pointer(&l)))
+	if err != 0 {
+		return 0, Errno(err)
 	}
-	return l, 0
+	return l, nil
 }
 
-func SetBpfBuflen(fd, l int) (int, int) {
-	_, _, ep := Syscall(SYS_IOCTL, uintptr(fd), BIOCSBLEN, uintptr(unsafe.Pointer(&l)))
-	if e := int(ep); e != 0 {
-		return 0, e
+func SetBpfBuflen(fd, l int) (int, error) {
+	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSBLEN, uintptr(unsafe.Pointer(&l)))
+	if err != 0 {
+		return 0, Errno(err)
 	}
-	return l, 0
+	return l, nil
 }
 
-func BpfDatalink(fd int) (int, int) {
+func BpfDatalink(fd int) (int, error) {
 	var t int
-	_, _, ep := Syscall(SYS_IOCTL, uintptr(fd), BIOCGDLT, uintptr(unsafe.Pointer(&t)))
-	if e := int(ep); e != 0 {
-		return 0, e
+	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGDLT, uintptr(unsafe.Pointer(&t)))
+	if err != 0 {
+		return 0, Errno(err)
 	}
-	return t, 0
+	return t, nil
 }
 
-func SetBpfDatalink(fd, t int) (int, int) {
-	_, _, ep := Syscall(SYS_IOCTL, uintptr(fd), BIOCSDLT, uintptr(unsafe.Pointer(&t)))
-	if e := int(ep); e != 0 {
-		return 0, e
+func SetBpfDatalink(fd, t int) (int, error) {
+	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSDLT, uintptr(unsafe.Pointer(&t)))
+	if err != 0 {
+		return 0, Errno(err)
 	}
-	return t, 0
+	return t, nil
 }
 
-func SetBpfPromisc(fd, m int) int {
-	_, _, ep := Syscall(SYS_IOCTL, uintptr(fd), BIOCPROMISC, uintptr(unsafe.Pointer(&m)))
-	if e := int(ep); e != 0 {
-		return e
+func SetBpfPromisc(fd, m int) error {
+	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCPROMISC, uintptr(unsafe.Pointer(&m)))
+	if err != 0 {
+		return Errno(err)
 	}
-	return 0
+	return nil
 }
 
-func FlushBpf(fd int) int {
-	_, _, ep := Syscall(SYS_IOCTL, uintptr(fd), BIOCFLUSH, 0)
-	if e := int(ep); e != 0 {
-		return e
+func FlushBpf(fd int) error {
+	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCFLUSH, 0)
+	if err != 0 {
+		return Errno(err)
 	}
-	return 0
+	return nil
 }
 
 type ivalue struct {
@@ -75,95 +75,95 @@
 	value int16
 }
 
-func BpfInterface(fd int, name string) (string, int) {
+func BpfInterface(fd int, name string) (string, error) {
 	var iv ivalue
-	_, _, ep := Syscall(SYS_IOCTL, uintptr(fd), BIOCGETIF, uintptr(unsafe.Pointer(&iv)))
-	if e := int(ep); e != 0 {
-		return "", e
+	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGETIF, uintptr(unsafe.Pointer(&iv)))
+	if err != 0 {
+		return "", Errno(err)
 	}
-	return name, 0
+	return name, nil
 }
 
-func SetBpfInterface(fd int, name string) int {
+func SetBpfInterface(fd int, name string) error {
 	var iv ivalue
 	copy(iv.name[:], []byte(name))
-	_, _, ep := Syscall(SYS_IOCTL, uintptr(fd), BIOCSETIF, uintptr(unsafe.Pointer(&iv)))
-	if e := int(ep); e != 0 {
-		return e
+	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSETIF, uintptr(unsafe.Pointer(&iv)))
+	if err != 0 {
+		return Errno(err)
 	}
-	return 0
+	return nil
 }
 
-func BpfTimeout(fd int) (*Timeval, int) {
+func BpfTimeout(fd int) (*Timeval, error) {
 	var tv Timeval
-	_, _, ep := Syscall(SYS_IOCTL, uintptr(fd), BIOCGRTIMEOUT, uintptr(unsafe.Pointer(&tv)))
-	if e := int(ep); e != 0 {
-		return nil, e
+	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGRTIMEOUT, uintptr(unsafe.Pointer(&tv)))
+	if err != 0 {
+		return nil, Errno(err)
 	}
-	return &tv, 0
+	return &tv, nil
 }
 
-func SetBpfTimeout(fd int, tv *Timeval) int {
-	_, _, ep := Syscall(SYS_IOCTL, uintptr(fd), BIOCSRTIMEOUT, uintptr(unsafe.Pointer(tv)))
-	if e := int(ep); e != 0 {
-		return e
+func SetBpfTimeout(fd int, tv *Timeval) error {
+	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSRTIMEOUT, uintptr(unsafe.Pointer(tv)))
+	if err != 0 {
+		return Errno(err)
 	}
-	return 0
+	return nil
 }
 
-func BpfStats(fd int) (*BpfStat, int) {
+func BpfStats(fd int) (*BpfStat, error) {
 	var s BpfStat
-	_, _, ep := Syscall(SYS_IOCTL, uintptr(fd), BIOCGSTATS, uintptr(unsafe.Pointer(&s)))
-	if e := int(ep); e != 0 {
-		return nil, e
+	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGSTATS, uintptr(unsafe.Pointer(&s)))
+	if err != 0 {
+		return nil, Errno(err)
 	}
-	return &s, 0
+	return &s, nil
 }
 
-func SetBpfImmediate(fd, m int) int {
-	_, _, ep := Syscall(SYS_IOCTL, uintptr(fd), BIOCIMMEDIATE, uintptr(unsafe.Pointer(&m)))
-	if e := int(ep); e != 0 {
-		return e
+func SetBpfImmediate(fd, m int) error {
+	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCIMMEDIATE, uintptr(unsafe.Pointer(&m)))
+	if err != 0 {
+		return Errno(err)
 	}
-	return 0
+	return nil
 }
 
-func SetBpf(fd int, i []BpfInsn) int {
+func SetBpf(fd int, i []BpfInsn) error {
 	var p BpfProgram
 	p.Len = uint32(len(i))
 	p.Insns = (*BpfInsn)(unsafe.Pointer(&i[0]))
-	_, _, ep := Syscall(SYS_IOCTL, uintptr(fd), BIOCSETF, uintptr(unsafe.Pointer(&p)))
-	if e := int(ep); e != 0 {
-		return e
+	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSETF, uintptr(unsafe.Pointer(&p)))
+	if err != 0 {
+		return Errno(err)
 	}
-	return 0
+	return nil
 }
 
-func CheckBpfVersion(fd int) int {
+func CheckBpfVersion(fd int) error {
 	var v BpfVersion
-	_, _, ep := Syscall(SYS_IOCTL, uintptr(fd), BIOCVERSION, uintptr(unsafe.Pointer(&v)))
-	if e := int(ep); e != 0 {
-		return e
+	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCVERSION, uintptr(unsafe.Pointer(&v)))
+	if err != 0 {
+		return Errno(err)
 	}
 	if v.Major != BPF_MAJOR_VERSION || v.Minor != BPF_MINOR_VERSION {
 		return EINVAL
 	}
-	return 0
+	return nil
 }
 
-func BpfHeadercmpl(fd int) (int, int) {
+func BpfHeadercmpl(fd int) (int, error) {
 	var f int
-	_, _, ep := Syscall(SYS_IOCTL, uintptr(fd), BIOCGHDRCMPLT, uintptr(unsafe.Pointer(&f)))
-	if e := int(ep); e != 0 {
-		return 0, e
+	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGHDRCMPLT, uintptr(unsafe.Pointer(&f)))
+	if err != 0 {
+		return 0, Errno(err)
 	}
-	return f, 0
+	return f, nil
 }
 
-func SetBpfHeadercmpl(fd, f int) int {
-	_, _, ep := Syscall(SYS_IOCTL, uintptr(fd), BIOCSHDRCMPLT, uintptr(unsafe.Pointer(&f)))
-	if e := int(ep); e != 0 {
-		return e
+func SetBpfHeadercmpl(fd, f int) error {
+	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSHDRCMPLT, uintptr(unsafe.Pointer(&f)))
+	if err != 0 {
+		return Errno(err)
 	}
-	return 0
+	return nil
 }
diff --git a/libgo/go/syscall/env_plan9.go b/libgo/go/syscall/env_plan9.go
new file mode 100644
index 0000000..5185733
--- /dev/null
+++ b/libgo/go/syscall/env_plan9.go
@@ -0,0 +1,74 @@
+// Copyright 2011 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.
+
+// Plan 9 environment variables.
+
+package syscall
+
+import "errors"
+
+func Getenv(key string) (value string, found bool) {
+	if len(key) == 0 {
+		return "", false
+	}
+	f, e := Open("/env/"+key, O_RDONLY)
+	if e != nil {
+		return "", false
+	}
+	defer Close(f)
+
+	l, _ := Seek(f, 0, 2)
+	Seek(f, 0, 0)
+	buf := make([]byte, l)
+	n, e := Read(f, buf)
+	if e != nil {
+		return "", false
+	}
+
+	if n > 0 && buf[n-1] == 0 {
+		buf = buf[:n-1]
+	}
+	return string(buf), true
+}
+
+func Setenv(key, value string) error {
+	if len(key) == 0 {
+		return errors.New("bad arg in system call")
+	}
+
+	f, e := Create("/env/"+key, O_RDWR, 0666)
+	if e != nil {
+		return e
+	}
+	defer Close(f)
+
+	_, e = Write(f, []byte(value))
+	return nil
+}
+
+func Clearenv() {
+	RawSyscall(SYS_RFORK, RFCENVG, 0, 0)
+}
+
+func Environ() []string {
+	env := make([]string, 0, 100)
+
+	f, e := Open("/env", O_RDONLY)
+	if e != nil {
+		panic(e)
+	}
+	defer Close(f)
+
+	names, e := readdirnames(f)
+	if e != nil {
+		panic(e)
+	}
+
+	for _, k := range names {
+		if v, ok := Getenv(k); ok {
+			env = append(env, k+"="+v)
+		}
+	}
+	return env[0:len(env)]
+}
diff --git a/libgo/go/syscall/env_unix.go b/libgo/go/syscall/env_unix.go
new file mode 100644
index 0000000..df25909
--- /dev/null
+++ b/libgo/go/syscall/env_unix.go
@@ -0,0 +1,85 @@
+// Copyright 2010 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.
+
+// +build darwin freebsd linux openbsd
+
+// Unix environment variables.
+
+package syscall
+
+import "sync"
+
+var env map[string]string
+var envOnce sync.Once
+var Envs []string // provided by runtime
+
+func setenv_c(k, v string)
+
+func copyenv() {
+	env = make(map[string]string)
+	for _, s := range Envs {
+		for j := 0; j < len(s); j++ {
+			if s[j] == '=' {
+				env[s[0:j]] = s[j+1:]
+				break
+			}
+		}
+	}
+}
+
+var envLock sync.RWMutex
+
+func Getenv(key string) (value string, found bool) {
+	envOnce.Do(copyenv)
+	if len(key) == 0 {
+		return "", false
+	}
+
+	envLock.RLock()
+	defer envLock.RUnlock()
+
+	v, ok := env[key]
+	if !ok {
+		return "", false
+	}
+	return v, true
+}
+
+func Setenv(key, value string) error {
+	envOnce.Do(copyenv)
+	if len(key) == 0 {
+		return EINVAL
+	}
+
+	envLock.Lock()
+	defer envLock.Unlock()
+
+	env[key] = value
+	setenv_c(key, value) // is a no-op if cgo isn't loaded
+	return nil
+}
+
+func Clearenv() {
+	envOnce.Do(copyenv) // prevent copyenv in Getenv/Setenv
+
+	envLock.Lock()
+	defer envLock.Unlock()
+
+	env = make(map[string]string)
+
+	// TODO(bradfitz): pass through to C
+}
+
+func Environ() []string {
+	envOnce.Do(copyenv)
+	envLock.RLock()
+	defer envLock.RUnlock()
+	a := make([]string, len(env))
+	i := 0
+	for k, v := range env {
+		a[i] = k + "=" + v
+		i++
+	}
+	return a
+}
diff --git a/libgo/go/syscall/env_windows.go b/libgo/go/syscall/env_windows.go
new file mode 100644
index 0000000..8308f10
--- /dev/null
+++ b/libgo/go/syscall/env_windows.go
@@ -0,0 +1,77 @@
+// Copyright 2010 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.
+
+// Windows environment variables.
+
+package syscall
+
+import (
+	"unicode/utf16"
+	"unsafe"
+)
+
+func Getenv(key string) (value string, found bool) {
+	b := make([]uint16, 100)
+	n, e := GetEnvironmentVariable(StringToUTF16Ptr(key), &b[0], uint32(len(b)))
+	if n == 0 && e == ERROR_ENVVAR_NOT_FOUND {
+		return "", false
+	}
+	if n > uint32(len(b)) {
+		b = make([]uint16, n)
+		n, e = GetEnvironmentVariable(StringToUTF16Ptr(key), &b[0], uint32(len(b)))
+		if n > uint32(len(b)) {
+			n = 0
+		}
+	}
+	if n == 0 {
+		return "", false
+	}
+	return string(utf16.Decode(b[0:n])), true
+}
+
+func Setenv(key, value string) error {
+	var v *uint16
+	if len(value) > 0 {
+		v = StringToUTF16Ptr(value)
+	}
+	e := SetEnvironmentVariable(StringToUTF16Ptr(key), v)
+	if e != nil {
+		return e
+	}
+	return nil
+}
+
+func Clearenv() {
+	for _, s := range Environ() {
+		// Environment variables can begin with =
+		// so start looking for the separator = at j=1.
+		// http://blogs.msdn.com/b/oldnewthing/archive/2010/05/06/10008132.aspx
+		for j := 1; j < len(s); j++ {
+			if s[j] == '=' {
+				Setenv(s[0:j], "")
+				break
+			}
+		}
+	}
+}
+
+func Environ() []string {
+	s, e := GetEnvironmentStrings()
+	if e != nil {
+		return nil
+	}
+	defer FreeEnvironmentStrings(s)
+	r := make([]string, 0, 50) // Empty with room to grow.
+	for from, i, p := 0, 0, (*[1 << 24]uint16)(unsafe.Pointer(s)); true; i++ {
+		if p[i] == 0 {
+			// empty string marks the end
+			if i <= from {
+				break
+			}
+			r = append(r, string(utf16.Decode(p[from:i])))
+			from = i + 1
+		}
+	}
+	return r
+}
diff --git a/libgo/go/syscall/errno.c b/libgo/go/syscall/errno.c
index 854b5aa..8e57811 100644
--- a/libgo/go/syscall/errno.c
+++ b/libgo/go/syscall/errno.c
@@ -5,21 +5,22 @@
    license that can be found in the LICENSE file.  */
 
 #include <errno.h>
+#include <stdint.h>
 
 /* errno is typically a macro. These functions set 
    and get errno specific to the libc being used.  */
 
-int GetErrno() asm ("libgo_syscall.syscall.GetErrno");
-void SetErrno(int) asm ("libgo_syscall.syscall.SetErrno");
+uintptr_t GetErrno() asm ("libgo_syscall.syscall.GetErrno");
+void SetErrno(uintptr_t) asm ("libgo_syscall.syscall.SetErrno");
 
-int 
+uintptr_t
 GetErrno()
 {
-  return errno;
+  return (uintptr_t) errno;
 }
 
 void
-SetErrno(int value)
+SetErrno(uintptr_t value)
 {
-  errno = value;
+  errno = (int) value;
 }
diff --git a/libgo/go/syscall/errstr.go b/libgo/go/syscall/errstr.go
index d9f3fe8..5ef10da 100644
--- a/libgo/go/syscall/errstr.go
+++ b/libgo/go/syscall/errstr.go
@@ -6,14 +6,14 @@
 
 package syscall
 
-//sysnb	strerror_r(errnum int, buf []byte) (errno int)
+//sysnb	strerror_r(errnum int, buf []byte) (err error)
 //strerror_r(errnum int, buf *byte, buflen Size_t) int
 
 func Errstr(errnum int) string {
 	for len := 128; ; len *= 2 {
 		b := make([]byte, len)
 		err := strerror_r(errnum, b)
-		if err == 0 {
+		if err == nil {
 			i := 0
 			for b[i] != 0 {
 				i++
diff --git a/libgo/go/syscall/exec_stubs.go b/libgo/go/syscall/exec_stubs.go
index 02b9ec3..74b0af5 100644
--- a/libgo/go/syscall/exec_stubs.go
+++ b/libgo/go/syscall/exec_stubs.go
@@ -14,10 +14,10 @@
 	return ENOSYS;
 }
 
-func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, errno int) {
+func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
 	return -1, ENOSYS;
 }
 
-func raw_ptrace(request int, pid int, addr *byte, data *byte) int {
+func raw_ptrace(request int, pid int, addr *byte, data *byte) Errno {
 	return ENOSYS
 }
diff --git a/libgo/go/syscall/exec_unix.go b/libgo/go/syscall/exec_unix.go
index 60e9770..c9814b7 100644
--- a/libgo/go/syscall/exec_unix.go
+++ b/libgo/go/syscall/exec_unix.go
@@ -11,39 +11,43 @@
 	"unsafe"
 )
 
-//sysnb	raw_fork() (pid Pid_t, errno int)
+//sysnb	raw_fork() (pid Pid_t, err Errno)
 //fork() Pid_t
 
-//sysnb raw_setsid() (errno int)
+//sysnb raw_setsid() (err Errno)
 //setsid() Pid_t
 
-//sysnb	raw_chroot(path *byte) (errno int)
+//sysnb raw_setpgid(pid int, pgid int) (err Errno)
+//setpgid(pid Pid_t, pgid Pid_t) int
+
+//sysnb	raw_chroot(path *byte) (err Errno)
 //chroot(path *byte) int
 
-//sysnb	raw_chdir(path *byte) (errno int)
+//sysnb	raw_chdir(path *byte) (err Errno)
 //chdir(path *byte) int
 
-//sysnb	raw_fcntl(fd int, cmd int, arg int) (val int, errno int)
+//sysnb	raw_fcntl(fd int, cmd int, arg int) (val int, err Errno)
 //fcntl(fd int, cmd int, arg int) int
 
-//sysnb	raw_close(fd int) (errno int)
+//sysnb	raw_close(fd int) (err Errno)
 //close(fd int) int
 
-//sysnb	raw_ioctl(fd int, cmd int, val int) (rval int, errno int)
+//sysnb	raw_ioctl(fd int, cmd int, val int) (rval int, err Errno)
 //ioctl(fd int, cmd int, val int) int
 
-//sysnb	raw_execve(argv0 *byte, argv **byte, envv **byte) (errno int)
+//sysnb	raw_execve(argv0 *byte, argv **byte, envv **byte) (err Errno)
 //execve(argv0 *byte, argv **byte, envv **byte) int
 
-//sysnb	raw_read(fd int, p *byte, np int) (n int, errno int)
-//read(fd int, buf *byte, count Size_t) Ssize_t
-
-//sysnb	raw_write(fd int, buf *byte, count int) int
+//sysnb	raw_write(fd int, buf *byte, count int) (err Errno)
 //write(fd int, buf *byte, count Size_t) Ssize_t
 
 //sysnb	raw_exit(status int)
 //_exit(status int)
 
+// Note: not raw, returns error rather than Errno.
+//sys	read(fd int, p *byte, np int) (n int, err error)
+//read(fd int, buf *byte, count Size_t) Ssize_t
+
 // Lock synchronizing creation of new file descriptors with fork.
 //
 // We want the child in a fork/exec sequence to inherit only the
@@ -106,9 +110,9 @@
 
 func CloseOnExec(fd int) { fcntl(fd, F_SETFD, FD_CLOEXEC) }
 
-func SetNonblock(fd int, nonblocking bool) (errno int) {
+func SetNonblock(fd int, nonblocking bool) (err error) {
 	flag, err := fcntl(fd, F_GETFL, 0)
-	if err != 0 {
+	if err != nil {
 		return err
 	}
 	if nonblocking {
@@ -121,20 +125,22 @@
 }
 
 // Fork, dup fd onto 0..len(fd), and exec(argv0, argvv, envv) in child.
-// If a dup or exec fails, write the errno int to pipe.
+// If a dup or exec fails, write the errno error to pipe.
 // (Pipe is close-on-exec so if exec succeeds, it will be closed.)
 // In the child, this function must not acquire any locks, because
 // they might have been locked at the time of the fork.  This means
 // no rescheduling, no malloc calls, and no new stack segments.
 // The calls to RawSyscall are okay because they are assembly
 // functions that do not grow the stack.
-func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr *ProcAttr, sys *SysProcAttr, pipe int) (pid int, err int) {
+func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr *ProcAttr, sys *SysProcAttr, pipe int) (pid int, err Errno) {
 	// Declare all variables at top in case any
 	// declarations require heap allocation (e.g., err1).
-	var r1 Pid_t
-	var err1 int
-	var nextfd int
-	var i int
+	var (
+		r1 Pid_t
+		err1 Errno
+		nextfd int
+		i int
+	)
 
 	// guard against side effects of shuffling fds below.
 	fd := append([]int(nil), attr.Files...)
@@ -143,7 +149,7 @@
 	// No more allocation or calls of non-assembly functions.
 	r1, err1 = raw_fork()
 	if err1 != 0 {
-		return 0, int(err1)
+		return 0, err1
 	}
 
 	if r1 != 0 {
@@ -171,7 +177,7 @@
 
 	// Set process group
 	if sys.Setpgid {
-		err1 = Setpgid(0, 0)
+		err1 = raw_setpgid(0, 0)
 		if err1 != 0 {
 			goto childerror
 		}
@@ -189,23 +195,35 @@
 	if cred := sys.Credential; cred != nil {
 		ngroups := len(cred.Groups)
 		if ngroups == 0 {
-			err1 = setgroups(0, nil)
+			err2 := setgroups(0, nil)
+			if err2 == nil {
+				err1 = 0
+			} else {
+				err1 = err2.(Errno)
+			}
 		} else {
 			groups := make([]Gid_t, ngroups)
 			for i, v := range cred.Groups {
 				groups[i] = Gid_t(v)
 			}
-			err1 = setgroups(ngroups, &groups[0])
+			err2 := setgroups(ngroups, &groups[0])
+			if err2 == nil {
+				err1 = 0
+			} else {
+				err1 = err2.(Errno)
+			}
 		}
 		if err1 != 0 {
 			goto childerror
 		}
-		err1 = Setgid(int(cred.Gid))
-		if err1 != 0 {
+		err2 := Setgid(int(cred.Gid))
+		if err2 != nil {
+			err1 = err2.(Errno)
 			goto childerror
 		}
-		err1 = Setuid(int(cred.Uid))
-		if err1 != 0 {
+		err2 = Setuid(int(cred.Uid))
+		if err2 != nil {
+			err1 = err2.(Errno)
 			goto childerror
 		}
 	}
@@ -222,8 +240,9 @@
 	// so that pass 2 won't stomp on an fd it needs later.
 	nextfd = int(len(fd))
 	if pipe < nextfd {
-		_, err1 = Dup2(pipe, nextfd)
-		if err1 != 0 {
+		_, err2 := Dup2(pipe, nextfd)
+		if err2 != nil {
+			err1 = err2.(Errno)
 			goto childerror
 		}
 		raw_fcntl(nextfd, F_SETFD, FD_CLOEXEC)
@@ -232,8 +251,9 @@
 	}
 	for i = 0; i < len(fd); i++ {
 		if fd[i] >= 0 && fd[i] < int(i) {
-			_, err1 = Dup2(fd[i], nextfd)
-			if err1 != 0 {
+			_, err2 := Dup2(fd[i], nextfd)
+			if err2 != nil {
+				err1 = err2.(Errno)
 				goto childerror
 			}
 			raw_fcntl(nextfd, F_SETFD, FD_CLOEXEC)
@@ -262,8 +282,9 @@
 		}
 		// The new fd is created NOT close-on-exec,
 		// which is exactly what we want.
-		_, err1 = Dup2(fd[i], i)
-		if err1 != 0 {
+		_, err2 := Dup2(fd[i], i)
+		if err2 != nil {
+			err1 = err2.(Errno)
 			goto childerror
 		}
 	}
@@ -338,10 +359,10 @@
 var zeroProcAttr ProcAttr
 var zeroSysProcAttr SysProcAttr
 
-func forkExec(argv0 string, argv []string, attr *ProcAttr) (pid int, err int) {
+func forkExec(argv0 string, argv []string, attr *ProcAttr) (pid int, err error) {
 	var p [2]int
 	var n int
-	var err1 uintptr
+	var err1 Errno
 	var wstatus WaitStatus
 
 	if attr == nil {
@@ -379,32 +400,32 @@
 	ForkLock.Lock()
 
 	// Allocate child status pipe close on exec.
-	if err = Pipe(p[0:]); err != 0 {
+	if err = Pipe(p[0:]); err != nil {
 		goto error
 	}
-	if _, err = fcntl(p[0], F_SETFD, FD_CLOEXEC); err != 0 {
+	if _, err = fcntl(p[0], F_SETFD, FD_CLOEXEC); err != nil {
 		goto error
 	}
-	if _, err = fcntl(p[1], F_SETFD, FD_CLOEXEC); err != 0 {
+	if _, err = fcntl(p[1], F_SETFD, FD_CLOEXEC); err != nil {
 		goto error
 	}
 
 	// Kick off child.
-	pid, err = forkAndExecInChild(argv0p, argvp, envvp, chroot, dir, attr, sys, p[1])
-	if err != 0 {
+	pid, err1 = forkAndExecInChild(argv0p, argvp, envvp, chroot, dir, attr, sys, p[1])
+	if err1 != 0 {
 		goto error
 	}
 	ForkLock.Unlock()
 
 	// Read child error status from pipe.
 	Close(p[1])
-	n, err = raw_read(p[0], (*byte)(unsafe.Pointer(&err1)), int(unsafe.Sizeof(err1)))
+	n, err = read(p[0], (*byte)(unsafe.Pointer(&err1)), int(unsafe.Sizeof(err1)))
 	Close(p[0])
-	if err != 0 || n != 0 {
+	if err != nil || n != 0 {
 		if n == int(unsafe.Sizeof(err1)) {
-			err = int(err1)
+			err = Errno(err1)
 		}
-		if err == 0 {
+		if err == nil {
 			err = EPIPE
 		}
 
@@ -418,7 +439,7 @@
 	}
 
 	// Read got EOF, so pipe closed on exec, so exec succeeded.
-	return pid, 0
+	return pid, nil
 
 error:
 	if p[0] >= 0 {
@@ -430,20 +451,20 @@
 }
 
 // Combination of fork and exec, careful to be thread safe.
-func ForkExec(argv0 string, argv []string, attr *ProcAttr) (pid int, err int) {
+func ForkExec(argv0 string, argv []string, attr *ProcAttr) (pid int, err error) {
 	return forkExec(argv0, argv, attr)
 }
 
 // StartProcess wraps ForkExec for package os.
-func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid, handle int, err int) {
+func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid, handle int, err error) {
 	pid, err = forkExec(argv0, argv, attr)
 	return pid, 0, err
 }
 
 // Ordinary exec.
-func Exec(argv0 string, argv []string, envv []string) (err int) {
+func Exec(argv0 string, argv []string, envv []string) (err error) {
 	err1 := raw_execve(StringBytePtr(argv0),
 		&StringSlicePtr(argv)[0],
 		&StringSlicePtr(envv)[0])
-	return int(err1)
+	return Errno(err1)
 }
diff --git a/libgo/go/syscall/exec_windows.go b/libgo/go/syscall/exec_windows.go
index e8b540a..2826e2f 100644
--- a/libgo/go/syscall/exec_windows.go
+++ b/libgo/go/syscall/exec_windows.go
@@ -8,8 +8,8 @@
 
 import (
 	"sync"
+	"unicode/utf16"
 	"unsafe"
-	"utf16"
 )
 
 var ForkLock sync.RWMutex
@@ -100,7 +100,7 @@
 // Last bytes are two UCS-2 NULs, or four NUL bytes.
 func createEnvBlock(envv []string) *uint16 {
 	if len(envv) == 0 {
-		return &utf16.Encode([]int("\x00\x00"))[0]
+		return &utf16.Encode([]rune("\x00\x00"))[0]
 	}
 	length := 0
 	for _, s := range envv {
@@ -118,54 +118,54 @@
 	}
 	copy(b[i:i+1], []byte{0})
 
-	return &utf16.Encode([]int(string(b)))[0]
+	return &utf16.Encode([]rune(string(b)))[0]
 }
 
 func CloseOnExec(fd Handle) {
 	SetHandleInformation(Handle(fd), HANDLE_FLAG_INHERIT, 0)
 }
 
-func SetNonblock(fd Handle, nonblocking bool) (errno int) {
-	return 0
+func SetNonblock(fd Handle, nonblocking bool) (err error) {
+	return nil
 }
 
 // getFullPath retrieves the full path of the specified file.
 // Just a wrapper for Windows GetFullPathName api.
-func getFullPath(name string) (path string, err int) {
+func getFullPath(name string) (path string, err error) {
 	p := StringToUTF16Ptr(name)
 	buf := make([]uint16, 100)
 	n, err := GetFullPathName(p, uint32(len(buf)), &buf[0], nil)
-	if err != 0 {
+	if err != nil {
 		return "", err
 	}
 	if n > uint32(len(buf)) {
 		// Windows is asking for bigger buffer.
 		buf = make([]uint16, n)
 		n, err = GetFullPathName(p, uint32(len(buf)), &buf[0], nil)
-		if err != 0 {
+		if err != nil {
 			return "", err
 		}
 		if n > uint32(len(buf)) {
 			return "", EINVAL
 		}
 	}
-	return UTF16ToString(buf[:n]), 0
+	return UTF16ToString(buf[:n]), nil
 }
 
 func isSlash(c uint8) bool {
 	return c == '\\' || c == '/'
 }
 
-func normalizeDir(dir string) (name string, err int) {
+func normalizeDir(dir string) (name string, err error) {
 	ndir, err := getFullPath(dir)
-	if err != 0 {
+	if err != nil {
 		return "", err
 	}
 	if len(ndir) > 2 && isSlash(ndir[0]) && isSlash(ndir[1]) {
 		// dir cannot have \\server\share\path form
 		return "", EINVAL
 	}
-	return ndir, 0
+	return ndir, nil
 }
 
 func volToUpper(ch int) int {
@@ -175,13 +175,13 @@
 	return ch
 }
 
-func joinExeDirAndFName(dir, p string) (name string, err int) {
+func joinExeDirAndFName(dir, p string) (name string, err error) {
 	if len(p) == 0 {
 		return "", EINVAL
 	}
 	if len(p) > 2 && isSlash(p[0]) && isSlash(p[1]) {
 		// \\server\share\path form
-		return p, 0
+		return p, nil
 	}
 	if len(p) > 1 && p[1] == ':' {
 		// has drive letter
@@ -189,10 +189,10 @@
 			return "", EINVAL
 		}
 		if isSlash(p[2]) {
-			return p, 0
+			return p, nil
 		} else {
 			d, err := normalizeDir(dir)
-			if err != 0 {
+			if err != nil {
 				return "", err
 			}
 			if volToUpper(int(p[0])) == volToUpper(int(d[0])) {
@@ -204,7 +204,7 @@
 	} else {
 		// no drive letter
 		d, err := normalizeDir(dir)
-		if err != 0 {
+		if err != nil {
 			return "", err
 		}
 		if isSlash(p[0]) {
@@ -232,7 +232,7 @@
 var zeroProcAttr ProcAttr
 var zeroSysProcAttr SysProcAttr
 
-func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid, handle int, err int) {
+func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid, handle int, err error) {
 	if len(argv0) == 0 {
 		return 0, 0, EWINDOWS
 	}
@@ -255,9 +255,9 @@
 		// argv0 relative to the current directory, and, only once the new
 		// process is started, it does Chdir(attr.Dir). We are adjusting
 		// for that difference here by making argv0 absolute.
-		var err int
+		var err error
 		argv0, err = joinExeDirAndFName(attr.Dir, argv0)
-		if err != 0 {
+		if err != nil {
 			return 0, 0, err
 		}
 	}
@@ -294,7 +294,7 @@
 	for i := range attr.Files {
 		if attr.Files[i] > 0 {
 			err := DuplicateHandle(p, Handle(attr.Files[i]), p, &fd[i], 0, true, DUPLICATE_SAME_ACCESS)
-			if err != 0 {
+			if err != nil {
 				return 0, 0, err
 			}
 			defer CloseHandle(Handle(fd[i]))
@@ -314,14 +314,14 @@
 	pi := new(ProcessInformation)
 
 	err = CreateProcess(argv0p, argvp, nil, nil, true, CREATE_UNICODE_ENVIRONMENT, createEnvBlock(attr.Env), dirp, si, pi)
-	if err != 0 {
+	if err != nil {
 		return 0, 0, err
 	}
 	defer CloseHandle(Handle(pi.Thread))
 
-	return int(pi.ProcessId), int(pi.Process), 0
+	return int(pi.ProcessId), int(pi.Process), nil
 }
 
-func Exec(argv0 string, argv []string, envv []string) (err int) {
+func Exec(argv0 string, argv []string, envv []string) (err error) {
 	return EWINDOWS
 }
diff --git a/libgo/go/syscall/libcall_irix.go b/libgo/go/syscall/libcall_irix.go
index ae45355..69e0db2 100644
--- a/libgo/go/syscall/libcall_irix.go
+++ b/libgo/go/syscall/libcall_irix.go
@@ -4,5 +4,5 @@
 
 package syscall
 
-//sysnb raw_ptrace(request int, pid int, addr *byte, data *byte) (errno int)
+//sysnb raw_ptrace(request int, pid int, addr *byte, data *byte) (err Errno)
 //ptrace(request int, pid Pid_t, addr *byte, data *byte) _C_long
diff --git a/libgo/go/syscall/libcall_linux.go b/libgo/go/syscall/libcall_linux.go
index 3948e51..79f5d48 100644
--- a/libgo/go/syscall/libcall_linux.go
+++ b/libgo/go/syscall/libcall_linux.go
@@ -8,31 +8,31 @@
 
 import "unsafe"
 
-//sys	Openat(dirfd int, path string, flags int, mode uint32) (fd int, errno int)
+//sys	Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
 //openat(dirfd int, path *byte, flags int, mode Mode_t) int
 
-//sys	futimesat(dirfd int, path *byte, times *[2]Timeval) (errno int)
+//sys	futimesat(dirfd int, path *byte, times *[2]Timeval) (err error)
 //futimesat(dirfd int, path *byte, times *[2]Timeval) int
-func Futimesat(dirfd int, path string, tv []Timeval) (errno int) {
+func Futimesat(dirfd int, path string, tv []Timeval) (err error) {
 	if len(tv) != 2 {
 		return EINVAL
 	}
 	return futimesat(dirfd, StringBytePtr(path), (*[2]Timeval)(unsafe.Pointer(&tv[0])))
 }
 
-func Futimes(fd int, tv []Timeval) (errno int) {
+func Futimes(fd int, tv []Timeval) (err error) {
 	// Believe it or not, this is the best we can do on GNU/Linux
 	// (and is what glibc does).
 	return Utimes("/proc/self/fd/"+itoa(fd), tv)
 }
 
-//sys	ptrace(request int, pid int, addr uintptr, data uintptr) (errno int)
+//sys	ptrace(request int, pid int, addr uintptr, data uintptr) (err error)
 //ptrace(request int, pid Pid_t, addr *byte, data *byte) _C_long
 
-//sysnb raw_ptrace(request int, pid int, addr *byte, data *byte) (errno int)
+//sysnb raw_ptrace(request int, pid int, addr *byte, data *byte) (err Errno)
 //ptrace(request int, pid Pid_t, addr *byte, data *byte) _C_long
 
-func ptracePeek(req int, pid int, addr uintptr, out []byte) (count int, errno int) {
+func ptracePeek(req int, pid int, addr uintptr, out []byte) (count int, err error) {
 	// The peek requests are machine-size oriented, so we wrap it
 	// to retrieve arbitrary-length data.
 
@@ -48,9 +48,9 @@
 	// boundary.
 	n := 0
 	if addr%sizeofPtr != 0 {
-		errno = ptrace(req, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0])))
-		if errno != 0 {
-			return 0, errno
+		err = ptrace(req, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0])))
+		if err != nil {
+			return 0, err
 		}
 		n += copy(out, buf[addr%sizeofPtr:])
 		out = out[n:]
@@ -60,27 +60,27 @@
 	for len(out) > 0 {
 		// We use an internal buffer to gaurantee alignment.
 		// It's not documented if this is necessary, but we're paranoid.
-		errno = ptrace(req, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0])))
-		if errno != 0 {
-			return n, errno
+		err = ptrace(req, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0])))
+		if err != nil {
+			return n, err
 		}
 		copied := copy(out, buf[0:])
 		n += copied
 		out = out[copied:]
 	}
 
-	return n, 0
+	return n, nil
 }
 
-func PtracePeekText(pid int, addr uintptr, out []byte) (count int, errno int) {
+func PtracePeekText(pid int, addr uintptr, out []byte) (count int, err error) {
 	return ptracePeek(PTRACE_PEEKTEXT, pid, addr, out)
 }
 
-func PtracePeekData(pid int, addr uintptr, out []byte) (count int, errno int) {
+func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) {
 	return ptracePeek(PTRACE_PEEKDATA, pid, addr, out)
 }
 
-func ptracePoke(pokeReq int, peekReq int, pid int, addr uintptr, data []byte) (count int, errno int) {
+func ptracePoke(pokeReq int, peekReq int, pid int, addr uintptr, data []byte) (count int, err error) {
 	// As for ptracePeek, we need to align our accesses to deal
 	// with the possibility of straddling an invalid page.
 
@@ -88,15 +88,15 @@
 	n := 0
 	if addr%sizeofPtr != 0 {
 		var buf [sizeofPtr]byte
-		errno = ptrace(peekReq, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0])))
-		if errno != 0 {
-			return 0, errno
+		err = ptrace(peekReq, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0])))
+		if err != nil {
+			return 0, err
 		}
 		n += copy(buf[addr%sizeofPtr:], data)
 		word := *((*uintptr)(unsafe.Pointer(&buf[0])))
-		errno = ptrace(pokeReq, pid, addr-addr%sizeofPtr, word)
-		if errno != 0 {
-			return 0, errno
+		err = ptrace(pokeReq, pid, addr-addr%sizeofPtr, word)
+		if err != nil {
+			return 0, err
 		}
 		data = data[n:]
 	}
@@ -104,9 +104,9 @@
 	// Interior.
 	for len(data) > int(sizeofPtr) {
 		word := *((*uintptr)(unsafe.Pointer(&data[0])))
-		errno = ptrace(pokeReq, pid, addr+uintptr(n), word)
-		if errno != 0 {
-			return n, errno
+		err = ptrace(pokeReq, pid, addr+uintptr(n), word)
+		if err != nil {
+			return n, err
 		}
 		n += int(sizeofPtr)
 		data = data[sizeofPtr:]
@@ -115,167 +115,167 @@
 	// Trailing edge.
 	if len(data) > 0 {
 		var buf [sizeofPtr]byte
-		errno = ptrace(peekReq, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0])))
-		if errno != 0 {
-			return n, errno
+		err = ptrace(peekReq, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0])))
+		if err != nil {
+			return n, err
 		}
 		copy(buf[0:], data)
 		word := *((*uintptr)(unsafe.Pointer(&buf[0])))
-		errno = ptrace(pokeReq, pid, addr+uintptr(n), word)
-		if errno != 0 {
-			return n, errno
+		err = ptrace(pokeReq, pid, addr+uintptr(n), word)
+		if err != nil {
+			return n, err
 		}
 		n += len(data)
 	}
 
-	return n, 0
+	return n, nil
 }
 
-func PtracePokeText(pid int, addr uintptr, data []byte) (count int, errno int) {
+func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) {
 	return ptracePoke(PTRACE_POKETEXT, PTRACE_PEEKTEXT, pid, addr, data)
 }
 
-func PtracePokeData(pid int, addr uintptr, data []byte) (count int, errno int) {
+func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) {
 	return ptracePoke(PTRACE_POKEDATA, PTRACE_PEEKDATA, pid, addr, data)
 }
 
-func PtraceGetRegs(pid int, regsout *PtraceRegs) (errno int) {
+func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) {
 	return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
 }
 
-func PtraceSetRegs(pid int, regs *PtraceRegs) (errno int) {
+func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) {
 	return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
 }
 
-func PtraceSetOptions(pid int, options int) (errno int) {
+func PtraceSetOptions(pid int, options int) (err error) {
 	return ptrace(PTRACE_SETOPTIONS, pid, 0, uintptr(options))
 }
 
-func PtraceGetEventMsg(pid int) (msg uint, errno int) {
+func PtraceGetEventMsg(pid int) (msg uint, err error) {
 	var data _C_long
-	errno = ptrace(PTRACE_GETEVENTMSG, pid, 0, uintptr(unsafe.Pointer(&data)))
+	err = ptrace(PTRACE_GETEVENTMSG, pid, 0, uintptr(unsafe.Pointer(&data)))
 	msg = uint(data)
 	return
 }
 
-func PtraceCont(pid int, signal int) (errno int) {
+func PtraceCont(pid int, signal int) (err error) {
 	return ptrace(PTRACE_CONT, pid, 0, uintptr(signal))
 }
 
-func PtraceSingleStep(pid int) (errno int) { return ptrace(PTRACE_SINGLESTEP, pid, 0, 0) }
+func PtraceSingleStep(pid int) (err error) { return ptrace(PTRACE_SINGLESTEP, pid, 0, 0) }
 
-func PtraceAttach(pid int) (errno int) { return ptrace(PTRACE_ATTACH, pid, 0, 0) }
+func PtraceAttach(pid int) (err error) { return ptrace(PTRACE_ATTACH, pid, 0, 0) }
 
-func PtraceDetach(pid int) (errno int) { return ptrace(PTRACE_DETACH, pid, 0, 0) }
+func PtraceDetach(pid int) (err error) { return ptrace(PTRACE_DETACH, pid, 0, 0) }
 
 // FIXME: mksysinfo needs to produce LINUX_REBOOT_MAGIC[12].
 
-// //sys	reboot(magic1 uint, magic2 uint, cmd int, arg string) (errno int)
+// //sys	reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error)
 // //reboot(magic1 uint, magic2 uint, cmd int, arg *byte) int
-// func Reboot(cmd int) (errno int) {
+// func Reboot(cmd int) (err error) {
 // 	return reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, "")
 // }
 
-//sys	Acct(path string) (errno int)
+//sys	Acct(path string) (err error)
 //acct(path *byte) int
 
 // FIXME: mksysinfo Timex
-// //sys	Adjtimex(buf *Timex) (state int, errno int)
+// //sys	Adjtimex(buf *Timex) (state int, err error)
 // //adjtimex(buf *Timex) int
 
-//sys	Faccessat(dirfd int, path string, mode uint32, flags int) (errno int)
+//sys	Faccessat(dirfd int, path string, mode uint32, flags int) (err error)
 //faccessat(dirfd int, pathname *byte, mode int, flags int) int
 
 // FIXME: Only in glibc 2.10 and later.
-// //sys	Fallocate(fd int, mode uint32, off int64, len int64) (errno int)
+// //sys	Fallocate(fd int, mode uint32, off int64, len int64) (err error)
 // //fallocate(fd int, mode int, offset Offset_t, len Offset_t) int
 
-//sys	Fchmodat(dirfd int, path string, mode uint32, flags int) (errno int)
+//sys	Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
 //fchmodat(dirfd int, pathname *byte, mode Mode_t, flags int) int
 
-//sys	Fchownat(dirfd int, path string, uid int, gid int, flags int) (errno int)
+//sys	Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error)
 //fchownat(dirfd int, path *byte, owner Uid_t, group Gid_t, flags int) int
 
-//sys	Flock(fd int, how int) (errno int)
+//sys	Flock(fd int, how int) (err error)
 //flock(fd int, how int) int
 
 // FIXME: mksysinfo statfs
-// //sys	Fstatfs(fd int, buf *Statfs_t) (errno int)
+// //sys	Fstatfs(fd int, buf *Statfs_t) (err error)
 // //fstatfs(fd int, buf *Statfs_t) int
 
 // FIXME: Only available as a syscall.
 // //sysnb	Gettid() (tid int)
 // //gettid() Pid_t
 
-//sys	Ioperm(from int, num int, on int) (errno int)
+//sys	Ioperm(from int, num int, on int) (err error)
 //ioperm(from _C_long, num _C_long, on int) int
 
-//sys	Iopl(level int) (errno int)
+//sys	Iopl(level int) (err error)
 //iopl(level int) int
 
 // FIXME: mksysinfo linux_dirent
 //    Or just abandon this function.
-// //sys	Getdents(fd int, buf []byte) (n int, errno int)
+// //sys	Getdents(fd int, buf []byte) (n int, err error)
 // //getdents64(fd int, buf *byte, count uint)
 
-//sys	InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, errno int)
+//sys	InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error)
 //inotify_add_watch(fd int, pathname *byte, mask uint32) int
 
-//sysnb	InotifyInit() (fd int, errno int)
+//sysnb	InotifyInit() (fd int, err error)
 //inotify_init() int
 
 // FIXME: Only in glibc 2.9 and later.
-// //sysnb	InotifyInit1(flags int) (fd int, errno int)
+// //sysnb	InotifyInit1(flags int) (fd int, err error)
 // //inotify_init1(flags int) int
 
-//sysnb	InotifyRmWatch(fd int, watchdesc uint32) (success int, errno int)
+//sysnb	InotifyRmWatch(fd int, watchdesc uint32) (success int, err error)
 //inotify_rm_watch(fd int, wd uint32) int
 
-//sys	Klogctl(typ int, buf []byte) (n int, errno int)
+//sys	Klogctl(typ int, buf []byte) (n int, err error)
 //klogctl(typ int, bufp *byte, len int) int
 
-//sys	Mkdirat(dirfd int, path string, mode uint32) (errno int)
+//sys	Mkdirat(dirfd int, path string, mode uint32) (err error)
 //mkdirat(dirfd int, path *byte, mode Mode_t) int
 
-//sys	Mknodat(dirfd int, path string, mode uint32, dev int) (errno int)
+//sys	Mknodat(dirfd int, path string, mode uint32, dev int) (err error)
 //mknodat(dirfd int, path *byte, mode Mode_t, dev _dev_t) int
 
-//sys	PivotRoot(newroot string, putold string) (errno int)
+//sys	PivotRoot(newroot string, putold string) (err error)
 //pivot_root(newroot *byte, putold *byte) int
 
-//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (errno int)
+//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 //renameat(olddirfd int, oldpath *byte, newdirfd int, newpath *byte) int
 
-//sys	sendfile(outfd int, infd int, offset *Offset_t, count int) (written int, errno int)
+//sys	sendfile(outfd int, infd int, offset *Offset_t, count int) (written int, err error)
 //sendfile64(outfd int, infd int, offset *Offset_t, count Size_t) Ssize_t
-func Sendfile(outfd int, infd int, offset *int64, count int) (written int, errno int) {
+func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 	var soff Offset_t
 	var psoff *Offset_t
 	if offset != nil {
 		psoff = &soff
 	}
-	written, errno = sendfile(outfd, infd, psoff, count)
+	written, err = sendfile(outfd, infd, psoff, count)
 	if offset != nil {
 		*offset = int64(soff)
 	}
 	return
 }
 
-//sys	Setfsgid(gid int) (errno int)
+//sys	Setfsgid(gid int) (err error)
 //setfsgid(gid Gid_t) int
 
-//sys	Setfsuid(uid int) (errno int)
+//sys	Setfsuid(uid int) (err error)
 //setfsuid(uid Uid_t) int
 
-//sysnb	Setresgid(rgid int, egid int, sgid int) (errno int)
+//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 //setresgid(rgid Gid_t, egid Gid_t, sgid Gid_t) int
 
-//sysnb	Setresuid(ruid int, eguid int, suid int) (errno int)
+//sysnb	Setresuid(ruid int, eguid int, suid int) (err error)
 //setresuid(ruid Uid_t, euid Uid_t, suid Uid_t) int
 
-//sys	splice(rfd int, roff *_loff_t, wfd int, woff *_loff_t, len int, flags int) (n int64, errno int)
+//sys	splice(rfd int, roff *_loff_t, wfd int, woff *_loff_t, len int, flags int) (n int64, err error)
 //splice(rfd int, roff *_loff_t, wfd int, woff *_loff_t, len Size_t, flags uint) Ssize_t
-func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, errno int) {
+func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) {
 	var lroff _loff_t
 	var plroff *_loff_t
 	if (roff != nil) {
@@ -286,7 +286,7 @@
 	if (woff != nil) {
 		plwoff = &lwoff
 	}
-	n, errno = splice(rfd, plroff, wfd, plwoff, len, flags)
+	n, err = splice(rfd, plroff, wfd, plwoff, len, flags)
 	if (roff != nil) {
 		*roff = int64(lroff)
 	}
@@ -297,37 +297,37 @@
 }
 
 // FIXME: mksysinfo statfs
-// //sys	Statfs(path string, buf *Statfs_t) (errno int)
+// //sys	Statfs(path string, buf *Statfs_t) (err error)
 // //statfs(path *byte, buf *Statfs_t) int
 
 // FIXME: Only in glibc 2.6 and later.
-// //sys	SyncFileRange(fd int, off int64, n int64, flags int) (errno int)
+// //sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 // //sync_file_range(fd int, off Offset_t, n Offset_t, flags uint) int
 
 // FIXME: mksysinfo Sysinfo_t
-// //sysnb	Sysinfo(info *Sysinfo_t) (errno int)
+// //sysnb	Sysinfo(info *Sysinfo_t) (err error)
 // //sysinfo(info *Sysinfo_t) int
 
-//sys	Tee(rfd int, wfd int, len int, flags int) (n int64, errno int)
+//sys	Tee(rfd int, wfd int, len int, flags int) (n int64, err error)
 //tee(rfd int, wfd int, len Size_t, flags uint) Ssize_t
 
 // FIXME: Only available as a syscall.
-// //sysnb	Tgkill(tgid int, tid int, sig int) (errno int)
+// //sysnb	Tgkill(tgid int, tid int, sig int) (err error)
 // //tgkill(tgid int, tid int, sig int) int
 
-//sys	unlinkat(dirfd int, path string, flags int) (errno int)
+//sys	unlinkat(dirfd int, path string, flags int) (err error)
 //unlinkat(dirfd int, path *byte, flags int) int
 
-func Unlinkat(dirfd int, path string) (errno int) {
+func Unlinkat(dirfd int, path string) (err error) {
 	return unlinkat(dirfd, path, 0)
 }
 
-//sys	Unmount(target string, flags int) (errno int) = SYS_UMOUNT2
+//sys	Unmount(target string, flags int) (err error) = SYS_UMOUNT2
 //umount2(target *byte, flags int) int
 
-//sys	Unshare(flags int) (errno int)
+//sys	Unshare(flags int) (err error)
 //unshare(flags int) int
 
 // FIXME: mksysinfo Ustat_t
-// //sys	Ustat(dev int, ubuf *Ustat_t) (errno int)
+// //sys	Ustat(dev int, ubuf *Ustat_t) (err error)
 // //ustat(dev _dev_t, ubuf *Ustat_t) int
diff --git a/libgo/go/syscall/libcall_posix.go b/libgo/go/syscall/libcall_posix.go
index 87ed4e6..d90e595 100644
--- a/libgo/go/syscall/libcall_posix.go
+++ b/libgo/go/syscall/libcall_posix.go
@@ -17,43 +17,43 @@
  * Wrapped
  */
 
-//sysnb	pipe(p *[2]int) (errno int)
+//sysnb	pipe(p *[2]int) (err error)
 //pipe(p *[2]int) int
-func Pipe(p []int) (errno int) {
+func Pipe(p []int) (err error) {
 	if len(p) != 2 {
 		return EINVAL
 	}
 	var pp [2]int
-	errno = pipe(&pp)
+	err = pipe(&pp)
 	p[0] = pp[0]
 	p[1] = pp[1]
 	return
 }
 
-//sys	utimes(path string, times *[2]Timeval) (errno int)
+//sys	utimes(path string, times *[2]Timeval) (err error)
 //utimes(path *byte, times *[2]Timeval) int
-func Utimes(path string, tv []Timeval) (errno int) {
+func Utimes(path string, tv []Timeval) (err error) {
 	if len(tv) != 2 {
 		return EINVAL
 	}
 	return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
 }
 
-//sys	getcwd(buf *byte, size Size_t) (errno int)
+//sys	getcwd(buf *byte, size Size_t) (err error)
 //getcwd(buf *byte, size Size_t) *byte
 
 const ImplementsGetwd = true
 
-func Getwd() (ret string, errno int) {
+func Getwd() (ret string, err error) {
 	for len := Size_t(4096); ; len *= 2 {
 		b := make([]byte, len)
 		err := getcwd(&b[0], len)
-		if err == 0 {
-			i := 0;
+		if err == nil {
+			i := 0
 			for b[i] != 0 {
-				i++;
+				i++
 			}
-			return string(b[0:i]), 0;
+			return string(b[0:i]), nil
 		}
 		if err != ERANGE {
 			return "", err
@@ -61,16 +61,16 @@
 	}
 }
 
-//sysnb	getgroups(size int, list *Gid_t) (nn int, errno int)
+//sysnb	getgroups(size int, list *Gid_t) (nn int, err error)
 //getgroups(size int, list *Gid_t) int
 
-func Getgroups() (gids []int, errno int) {
+func Getgroups() (gids []int, err error) {
 	n, err := getgroups(0, nil)
-	if err != 0 {
-		return nil, errno
+	if err != nil {
+		return nil, err
 	}
 	if n == 0 {
-		return nil, 0
+		return nil, nil
 	}
 
 	// Sanity check group count.  Max is 1<<16 on GNU/Linux.
@@ -80,8 +80,8 @@
 
 	a := make([]Gid_t, n)
 	n, err = getgroups(n, &a[0])
-	if err != 0 {
-		return nil, errno
+	if err != nil {
+		return nil, err
 	}
 	gids = make([]int, n)
 	for i, v := range a[0:n] {
@@ -90,10 +90,10 @@
 	return
 }
 
-//sysnb	setgroups(n int, list *Gid_t) (errno int)
+//sysnb	setgroups(n int, list *Gid_t) (err error)
 //setgroups(n Size_t, list *Gid_t) int
 
-func Setgroups(gids []int) (errno int) {
+func Setgroups(gids []int) (err error) {
 	if len(gids) == 0 {
 		return setgroups(0, nil)
 	}
@@ -120,10 +120,10 @@
 func (w WaitStatus) StopSignal() int
 func (w WaitStatus) TrapCause() int
 
-//sys	Mkfifo(path string, mode uint32) (errno int)
+//sys	Mkfifo(path string, mode uint32) (err error)
 //mkfifo(path *byte, mode Mode_t) int
 
-//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, errno int)
+//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
 //select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) int
 
 const nfdbits = unsafe.Sizeof(fds_bits_type) * 8
@@ -154,52 +154,52 @@
 	}
 }
 
-//sys	Access(path string, mode uint32) (errno int)
+//sys	Access(path string, mode uint32) (err error)
 //access(path *byte, mode int) int
 
-//sys	Chdir(path string) (errno int)
+//sys	Chdir(path string) (err error)
 //chdir(path *byte) int
 
-//sys	Chmod(path string, mode uint32) (errno int)
+//sys	Chmod(path string, mode uint32) (err error)
 //chmod(path *byte, mode Mode_t) int
 
-//sys	Chown(path string, uid int, gid int) (errno int)
+//sys	Chown(path string, uid int, gid int) (err error)
 //chown(path *byte, uid Uid_t, gid Gid_t) int
 
-//sys	Chroot(path string) (errno int)
+//sys	Chroot(path string) (err error)
 //chroot(path *byte) int
 
-//sys	Close(fd int) (errno int)
+//sys	Close(fd int) (err error)
 //close(fd int) int
 
-//sys	Creat(path string, mode uint32) (fd int, errno int)
+//sys	Creat(path string, mode uint32) (fd int, err error)
 //creat(path *byte, mode Mode_t) int
 
-//sysnb	Dup(oldfd int) (fd int, errno int)
+//sysnb	Dup(oldfd int) (fd int, err error)
 //dup(oldfd int) int
 
-//sysnb	Dup2(oldfd int, newfd int) (fd int, errno int)
+//sysnb	Dup2(oldfd int, newfd int) (fd int, err error)
 //dup2(oldfd int, newfd int) int
 
 //sys	Exit(code int)
 //exit(code int)
 
-//sys	Fchdir(fd int) (errno int)
+//sys	Fchdir(fd int) (err error)
 //fchdir(fd int) int
 
-//sys	Fchmod(fd int, mode uint32) (errno int)
+//sys	Fchmod(fd int, mode uint32) (err error)
 //fchmod(fd int, mode Mode_t) int
 
-//sys	Fchown(fd int, uid int, gid int) (errno int)
+//sys	Fchown(fd int, uid int, gid int) (err error)
 //fchown(fd int, uid Uid_t, gid Gid_t) int
 
-//sys	fcntl(fd int, cmd int, arg int) (val int, errno int)
+//sys	fcntl(fd int, cmd int, arg int) (val int, err error)
 //fcntl(fd int, cmd int, arg int) int
 
-//sys	Fdatasync(fd int) (errno int)
+//sys	Fdatasync(fd int) (err error)
 //fdatasync(fd int) int
 
-//sys	Fsync(fd int) (errno int)
+//sys	Fsync(fd int) (err error)
 //fsync(fd int) int
 
 //sysnb Getegid() (egid int)
@@ -214,7 +214,7 @@
 //sysnb	Getpagesize() (pagesize int)
 //getpagesize() int
 
-//sysnb	Getpgid(pid int) (pgid int, errno int)
+//sysnb	Getpgid(pid int) (pgid int, err error)
 //getpgid(pid Pid_t) Pid_t
 
 //sysnb	Getpgrp() (pid int)
@@ -227,138 +227,138 @@
 //getppid() Pid_t
 
 // FIXME: mksysinfo Rlimit
-// //sysnb	Getrlimit(resource int, rlim *Rlimit) (errno int)
+// //sysnb	Getrlimit(resource int, rlim *Rlimit) (err error)
 // //getrlimit(resource int, rlim *Rlimit) int
 
-//sysnb	Getrusage(who int, rusage *Rusage) (errno int)
+//sysnb	Getrusage(who int, rusage *Rusage) (err error)
 //getrusage(who int, rusage *Rusage) int
 
-//sysnb	gettimeofday(tv *Timeval, tz *byte) (errno int)
+//sysnb	gettimeofday(tv *Timeval, tz *byte) (err error)
 //gettimeofday(tv *Timeval, tz *byte) int
-func Gettimeofday(tv *Timeval) (errno int) {
+func Gettimeofday(tv *Timeval) (err error) {
 	return gettimeofday(tv, nil)
 }
 
 //sysnb Getuid() (uid int)
 //getuid() Uid_t
 
-//sysnb	Kill(pid int, sig int) (errno int)
+//sysnb	Kill(pid int, sig int) (err error)
 //kill(pid Pid_t, sig int) int
 
-//sys	Lchown(path string, uid int, gid int) (errno int)
+//sys	Lchown(path string, uid int, gid int) (err error)
 //lchown(path *byte, uid Uid_t, gid Gid_t) int
 
-//sys	Link(oldpath string, newpath string) (errno int)
+//sys	Link(oldpath string, newpath string) (err error)
 //link(oldpath *byte, newpath *byte) int
 
-//sys	Mkdir(path string, mode uint32) (errno int)
+//sys	Mkdir(path string, mode uint32) (err error)
 //mkdir(path *byte, mode Mode_t) int
 
-//sys	Mknod(path string, mode uint32, dev int) (errno int)
+//sys	Mknod(path string, mode uint32, dev int) (err error)
 //mknod(path *byte, mode Mode_t, dev _dev_t) int
 
-//sys	Mount(source string, target string, fstype string, flags int, data string) (errno int)
+//sys	Mount(source string, target string, fstype string, flags int, data string) (err error)
 //mount(source *byte, target *byte, fstype *byte, flags _C_long, data *byte) int
 
-//sys	Nanosleep(time *Timespec, leftover *Timespec) (errno int)
+//sys	Nanosleep(time *Timespec, leftover *Timespec) (err error)
 //nanosleep(time *Timespec, leftover *Timespec) int
 
-//sys	Pause() (errno int)
+//sys	Pause() (err error)
 //pause() int
 
-//sys	Read(fd int, p []byte) (n int, errno int)
+//sys	Read(fd int, p []byte) (n int, err error)
 //read(fd int, buf *byte, count Size_t) Ssize_t
 
-//sys	Readlink(path string, buf []byte) (n int, errno int)
+//sys	Readlink(path string, buf []byte) (n int, err error)
 //readlink(path *byte, buf *byte, bufsiz Size_t) Ssize_t
 
-//sys	Rename(oldpath string, newpath string) (errno int)
+//sys	Rename(oldpath string, newpath string) (err error)
 //rename(oldpath *byte, newpath *byte) int
 
-//sys	Rmdir(path string) (errno int)
+//sys	Rmdir(path string) (err error)
 //rmdir(path *byte) int
 
-//sys	Setdomainname(p []byte) (errno int)
+//sys	Setdomainname(p []byte) (err error)
 //setdomainname(name *byte, len Size_t) int
 
-//sys	Sethostname(p []byte) (errno int)
+//sys	Sethostname(p []byte) (err error)
 //sethostname(name *byte, len Size_t) int
 
-//sysnb	Setgid(gid int) (errno int)
+//sysnb	Setgid(gid int) (err error)
 //setgid(gid Gid_t) int
 
-//sysnb Setregid(rgid int, egid int) (errno int)
+//sysnb Setregid(rgid int, egid int) (err error)
 //setregid(rgid Gid_t, egid Gid_t) int
 
-//sysnb	Setpgid(pid int, pgid int) (errno int)
+//sysnb	Setpgid(pid int, pgid int) (err error)
 //setpgid(pid Pid_t, pgid Pid_t) int
 
-//sysnb	Setreuid(ruid int, euid int) (errno int)
+//sysnb	Setreuid(ruid int, euid int) (err error)
 //setreuid(ruid Uid_t, euid Uid_t) int
 
 // FIXME: mksysinfo Rlimit
-// //sysnb	Setrlimit(resource int, rlim *Rlimit) (errno int)
+// //sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 // //setrlimit(resource int, rlim *Rlimit) int
 
-//sysnb	Setsid() (pid int, errno int)
+//sysnb	Setsid() (pid int, err error)
 //setsid() Pid_t
 
-//sysnb	settimeofday(tv *Timeval, tz *byte) (errno int)
+//sysnb	settimeofday(tv *Timeval, tz *byte) (err error)
 //settimeofday(tv *Timeval, tz *byte) int
 
-func Settimeofday(tv *Timeval) (errno int) {
+func Settimeofday(tv *Timeval) (err error) {
 	return settimeofday(tv, nil)
 }
 
-//sysnb	Setuid(uid int) (errno int)
+//sysnb	Setuid(uid int) (err error)
 //setuid(uid Uid_t) int
 
-//sys	Symlink(oldpath string, newpath string) (errno int)
+//sys	Symlink(oldpath string, newpath string) (err error)
 //symlink(oldpath *byte, newpath *byte) int
 
 //sys	Sync()
 //sync()
 
 // FIXME: mksysinfo Time_t
-// //sysnb	Time(t *Time_t) (tt Time_t, errno int)
+// //sysnb	Time(t *Time_t) (tt Time_t, err error)
 // //time(t *Time_t) Time_t
 
 // FIXME: mksysinfo Tms
-// //sysnb	Times(tms *Tms) (ticks uintptr, errno int)
+// //sysnb	Times(tms *Tms) (ticks uintptr, err error)
 // //times(tms *Tms) _clock_t
 
 //sysnb	Umask(mask int) (oldmask int)
 //umask(mask Mode_t) Mode_t
 
-//sys	Unlink(path string) (errno int)
+//sys	Unlink(path string) (err error)
 //unlink(path *byte) int
 
 // FIXME: mksysinfo Utimbuf
-// //sys	Utime(path string, buf *Utimbuf) (errno int)
+// //sys	Utime(path string, buf *Utimbuf) (err error)
 // //utime(path *byte, buf *Utimbuf) int
 
-//sys	Write(fd int, p []byte) (n int, errno int)
+//sys	Write(fd int, p []byte) (n int, err error)
 //write(fd int, buf *byte, count Size_t) Ssize_t
 
-//sys	munmap(addr uintptr, length uintptr) (errno int)
+//sys	munmap(addr uintptr, length uintptr) (err error)
 //munmap(addr *byte, length Size_t) int
 
-//sys Madvise(b []byte, advice int) (errno int)
+//sys Madvise(b []byte, advice int) (err error)
 //madvise(addr *byte, len Size_t, advice int) int
 
-//sys	Mprotect(b []byte, prot int) (errno int)
+//sys	Mprotect(b []byte, prot int) (err error)
 //mprotect(addr *byte, len Size_t, prot int) int
 
-//sys	Mlock(b []byte) (errno int)
+//sys	Mlock(b []byte) (err error)
 //mlock(addr *byte, len Size_t) int
 
-//sys	Munlock(b []byte) (errno int)
+//sys	Munlock(b []byte) (err error)
 //munlock(addr *byte, len Size_t) int
 
-//sys	Mlockall(flags int) (errno int)
+//sys	Mlockall(flags int) (err error)
 //mlockall(flags int) int
 
-//sys	Munlockall() (errno int)
+//sys	Munlockall() (err error)
 //munlockall() int
 
 func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
@@ -378,8 +378,8 @@
 	return
 }
 
-//sysnb	Tcgetattr(fd int, p *Termios) (errno int)
+//sysnb	Tcgetattr(fd int, p *Termios) (err error)
 //tcgetattr(fd int, p *Termios) int
 
-//sys	Tcsetattr(fd int, actions int, p *Termios) (errno int)
+//sys	Tcsetattr(fd int, actions int, p *Termios) (err error)
 //tcsetattr(fd int, actions int, p *Termios) int
diff --git a/libgo/go/syscall/libcall_posix_largefile.go b/libgo/go/syscall/libcall_posix_largefile.go
index acfafec..e898648 100644
--- a/libgo/go/syscall/libcall_posix_largefile.go
+++ b/libgo/go/syscall/libcall_posix_largefile.go
@@ -6,32 +6,32 @@
 
 package syscall
 
-//sys	Fstat(fd int, stat *Stat_t) (errno int)
+//sys	Fstat(fd int, stat *Stat_t) (err error)
 //fstat64(fd int, stat *Stat_t) int
 
-//sys	Ftruncate(fd int, length int64) (errno int)
+//sys	Ftruncate(fd int, length int64) (err error)
 //ftruncate64(fd int, length Offset_t) int
 
-//sys	Lstat(path string, stat *Stat_t) (errno int)
+//sys	Lstat(path string, stat *Stat_t) (err error)
 //lstat64(path *byte, stat *Stat_t) int
 
-//sys	mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, errno int)
+//sys	mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)
 //mmap64(addr *byte, length Size_t, prot int, flags int, fd int, offset Offset_t) *byte
 
-//sys	Open(path string, mode int, perm uint32) (fd int, errno int)
+//sys	Open(path string, mode int, perm uint32) (fd int, err error)
 //open64(path *byte, mode int, perm Mode_t) int
 
-//sys	Pread(fd int, p []byte, offset int64) (n int, errno int)
+//sys	Pread(fd int, p []byte, offset int64) (n int, err error)
 //pread64(fd int, buf *byte, count Size_t, offset Offset_t) Ssize_t
 
-//sys	Pwrite(fd int, p []byte, offset int64) (n int, errno int)
+//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error)
 //pwrite64(fd int, buf *byte, count Size_t, offset Offset_t) Ssize_t
 
-//sys	Seek(fd int, offset int64, whence int) (off int64, errno int)
+//sys	Seek(fd int, offset int64, whence int) (off int64, err error)
 //lseek64(fd int, offset Offset_t, whence int) Offset_t
 
-//sys	Stat(path string, stat *Stat_t) (errno int)
+//sys	Stat(path string, stat *Stat_t) (err error)
 //stat64(path *byte, stat *Stat_t) int
 
-//sys	Truncate(path string, length int64) (errno int)
+//sys	Truncate(path string, length int64) (err error)
 //truncate64(path *byte, length Offset_t) int
diff --git a/libgo/go/syscall/libcall_posix_regfile.go b/libgo/go/syscall/libcall_posix_regfile.go
index b71da0c..9716701 100644
--- a/libgo/go/syscall/libcall_posix_regfile.go
+++ b/libgo/go/syscall/libcall_posix_regfile.go
@@ -7,32 +7,32 @@
 
 package syscall
 
-//sys	Fstat(fd int, stat *Stat_t) (errno int)
+//sys	Fstat(fd int, stat *Stat_t) (err error)
 //fstat(fd int, stat *Stat_t) int
 
-//sys	Ftruncate(fd int, length int64) (errno int)
+//sys	Ftruncate(fd int, length int64) (err error)
 //ftruncate(fd int, length Offset_t) int
 
-//sys	Lstat(path string, stat *Stat_t) (errno int)
+//sys	Lstat(path string, stat *Stat_t) (err error)
 //lstat(path *byte, stat *Stat_t) int
 
-//sys	mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, errno int)
+//sys	mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)
 //mmap(addr *byte, length Size_t, prot int, flags int, fd int, offset Offset_t) *byte
 
-//sys	Open(path string, mode int, perm uint32) (fd int, errno int)
+//sys	Open(path string, mode int, perm uint32) (fd int, err error)
 //open(path *byte, mode int, perm Mode_t) int
 
-//sys	Pread(fd int, p []byte, offset int64) (n int, errno int)
+//sys	Pread(fd int, p []byte, offset int64) (n int, err error)
 //pread(fd int, buf *byte, count Size_t, offset Offset_t) Ssize_t
 
-//sys	Pwrite(fd int, p []byte, offset int64) (n int, errno int)
+//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error)
 //pwrite(fd int, buf *byte, count Size_t, offset Offset_t) Ssize_t
 
-//sys	Seek(fd int, offset int64, whence int) (off int64, errno int)
+//sys	Seek(fd int, offset int64, whence int) (off int64, err error)
 //lseek(fd int, offset Offset_t, whence int) Offset_t
 
-//sys	Stat(path string, stat *Stat_t) (errno int)
+//sys	Stat(path string, stat *Stat_t) (err error)
 //stat(path *byte, stat *Stat_t) int
 
-//sys	Truncate(path string, length int64) (errno int)
+//sys	Truncate(path string, length int64) (err error)
 //truncate(path *byte, length Offset_t) int
diff --git a/libgo/go/syscall/libcall_solaris_386.go b/libgo/go/syscall/libcall_solaris_386.go
index 9c4e966..e94deec 100644
--- a/libgo/go/syscall/libcall_solaris_386.go
+++ b/libgo/go/syscall/libcall_solaris_386.go
@@ -5,8 +5,8 @@
 package syscall
 
 // 32-bit Solaris 2/x86 needs to use _nuname internally, cf. <sys/utsname.h>.
-//sysnb	Uname(buf *Utsname) (errno int)
+//sysnb	Uname(buf *Utsname) (err error)
 //_nuname(buf *Utsname) int
 
-//sysnb raw_ptrace(request int, pid int, addr *byte, data *byte) (errno int)
+//sysnb raw_ptrace(request int, pid int, addr *byte, data *byte) (err Errno)
 //ptrace(request int, pid Pid_t, addr *byte, data *byte) _C_long
diff --git a/libgo/go/syscall/libcall_solaris_amd64.go b/libgo/go/syscall/libcall_solaris_amd64.go
index f0d335d..69b11ba 100644
--- a/libgo/go/syscall/libcall_solaris_amd64.go
+++ b/libgo/go/syscall/libcall_solaris_amd64.go
@@ -5,6 +5,6 @@
 package syscall
 
 // 64-bit ptrace(3C) doesn't exist
-func raw_ptrace(request int, pid int, addr *byte, data *byte) int {
+func raw_ptrace(request int, pid int, addr *byte, data *byte) Errno {
 	return ENOSYS
 }
diff --git a/libgo/go/syscall/libcall_solaris_sparc.go b/libgo/go/syscall/libcall_solaris_sparc.go
index ae45355..69e0db2 100644
--- a/libgo/go/syscall/libcall_solaris_sparc.go
+++ b/libgo/go/syscall/libcall_solaris_sparc.go
@@ -4,5 +4,5 @@
 
 package syscall
 
-//sysnb raw_ptrace(request int, pid int, addr *byte, data *byte) (errno int)
+//sysnb raw_ptrace(request int, pid int, addr *byte, data *byte) (err Errno)
 //ptrace(request int, pid Pid_t, addr *byte, data *byte) _C_long
diff --git a/libgo/go/syscall/libcall_solaris_sparc64.go b/libgo/go/syscall/libcall_solaris_sparc64.go
index f0d335d..69b11ba 100644
--- a/libgo/go/syscall/libcall_solaris_sparc64.go
+++ b/libgo/go/syscall/libcall_solaris_sparc64.go
@@ -5,6 +5,6 @@
 package syscall
 
 // 64-bit ptrace(3C) doesn't exist
-func raw_ptrace(request int, pid int, addr *byte, data *byte) int {
+func raw_ptrace(request int, pid int, addr *byte, data *byte) Errno {
 	return ENOSYS
 }
diff --git a/libgo/go/syscall/libcall_support.go b/libgo/go/syscall/libcall_support.go
index daed807..7449a0a 100644
--- a/libgo/go/syscall/libcall_support.go
+++ b/libgo/go/syscall/libcall_support.go
@@ -8,5 +8,5 @@
 
 func entersyscall()
 func exitsyscall()
-func GetErrno() int
-func SetErrno(int)
+func GetErrno() Errno
+func SetErrno(Errno)
diff --git a/libgo/go/syscall/libcall_uname.go b/libgo/go/syscall/libcall_uname.go
index e4c32b1..519e6dc 100644
--- a/libgo/go/syscall/libcall_uname.go
+++ b/libgo/go/syscall/libcall_uname.go
@@ -4,5 +4,5 @@
 
 package syscall
 
-//sysnb	Uname(buf *Utsname) (errno int)
+//sysnb	Uname(buf *Utsname) (err error)
 //uname(buf *Utsname) int
diff --git a/libgo/go/syscall/libcall_wait4.go b/libgo/go/syscall/libcall_wait4.go
index 7a63bc7..5786869 100644
--- a/libgo/go/syscall/libcall_wait4.go
+++ b/libgo/go/syscall/libcall_wait4.go
@@ -6,14 +6,13 @@
 
 package syscall
 
-//sys	wait4(pid Pid_t, status *int, options int, rusage *Rusage) (wpid Pid_t, errno int)
+//sys	wait4(pid Pid_t, status *int, options int, rusage *Rusage) (wpid Pid_t, err error)
 //wait4(pid Pid_t, status *int, options int, rusage *Rusage) Pid_t
 
-func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, errno int) {
+func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
 	var status int
 	r, err := wait4(Pid_t(pid), &status, options, rusage)
 	wpid = int(r)
-	errno = err
 	if wstatus != nil {
 		*wstatus = WaitStatus(status)
 	}
diff --git a/libgo/go/syscall/libcall_waitpid.go b/libgo/go/syscall/libcall_waitpid.go
index 0144463..1c476d8 100644
--- a/libgo/go/syscall/libcall_waitpid.go
+++ b/libgo/go/syscall/libcall_waitpid.go
@@ -6,14 +6,13 @@
 
 package syscall
 
-//sys	waitpid(pid Pid_t, status *int, options int) (wpid Pid_t, errno int)
+//sys	waitpid(pid Pid_t, status *int, options int) (wpid Pid_t, err error)
 //waitpid(pid Pid_t, status *int, options int) Pid_t
 
-func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, errno int) {
+func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
 	var status int
 	r, err := waitpid(Pid_t(pid), &status, options)
 	wpid = int(r)
-	errno = err
 	if wstatus != nil {
 		*wstatus = WaitStatus(status)
 	}
diff --git a/libgo/go/syscall/lsf_linux.go b/libgo/go/syscall/lsf_linux.go
index 0976688..05d653b 100644
--- a/libgo/go/syscall/lsf_linux.go
+++ b/libgo/go/syscall/lsf_linux.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// GNU/Linux socket filter
+// Linux socket filter
 
 package syscall
 
@@ -18,10 +18,10 @@
 	return &SockFilter{Code: uint16(code), Jt: uint8(jt), Jf: uint8(jf), K: uint32(k)}
 }
 
-func LsfSocket(ifindex, proto int) (int, int) {
+func LsfSocket(ifindex, proto int) (int, error) {
 	var lsall SockaddrLinklayer
 	s, e := Socket(AF_PACKET, SOCK_RAW, proto)
-	if e != 0 {
+	if e != nil {
 		return 0, e
 	}
 	p := (*[2]byte)(unsafe.Pointer(&lsall.Protocol))
@@ -29,11 +29,11 @@
 	p[1] = byte(proto)
 	lsall.Ifindex = ifindex
 	e = Bind(s, &lsall)
-	if e != 0 {
+	if e != nil {
 		Close(s)
 		return 0, e
 	}
-	return s, 0
+	return s, nil
 }
 
 type iflags struct {
@@ -41,17 +41,17 @@
 	flags uint16
 }
 
-func SetLsfPromisc(name string, m bool) int {
+func SetLsfPromisc(name string, m bool) error {
 	s, e := Socket(AF_INET, SOCK_DGRAM, 0)
-	if e != 0 {
+	if e != nil {
 		return e
 	}
 	defer Close(s)
 	var ifl iflags
 	copy(ifl.name[:], []byte(name))
 	_, _, ep := Syscall(SYS_IOCTL, uintptr(s), SIOCGIFFLAGS, uintptr(unsafe.Pointer(&ifl)))
-	if e := int(ep); e != 0 {
-		return e
+	if ep != 0 {
+		return Errno(ep)
 	}
 	if m {
 		ifl.flags |= uint16(IFF_PROMISC)
@@ -59,20 +59,20 @@
 		ifl.flags &= ^uint16(IFF_PROMISC)
 	}
 	_, _, ep = Syscall(SYS_IOCTL, uintptr(s), SIOCSIFFLAGS, uintptr(unsafe.Pointer(&ifl)))
-	if e := int(ep); e != 0 {
-		return e
+	if ep != 0 {
+		return Errno(ep)
 	}
-	return 0
+	return nil
 }
 
-func AttachLsf(fd int, i []SockFilter) int {
+func AttachLsf(fd int, i []SockFilter) error {
 	var p SockFprog
 	p.Len = uint16(len(i))
 	p.Filter = (*SockFilter)(unsafe.Pointer(&i[0]))
 	return setsockopt(fd, SOL_SOCKET, SO_ATTACH_FILTER, uintptr(unsafe.Pointer(&p)), unsafe.Sizeof(p))
 }
 
-func DetachLsf(fd int) int {
+func DetachLsf(fd int) error {
 	var dummy int
 	return setsockopt(fd, SOL_SOCKET, SO_DETACH_FILTER, uintptr(unsafe.Pointer(&dummy)), unsafe.Sizeof(dummy))
 }
diff --git a/libgo/go/syscall/mksyscall.awk b/libgo/go/syscall/mksyscall.awk
index 49828d9..b02989c 100644
--- a/libgo/go/syscall/mksyscall.awk
+++ b/libgo/go/syscall/mksyscall.awk
@@ -12,7 +12,7 @@
 #	  This includes return parameters.
 #	* The parameter lists must give a type for each argument:
 #	   the (x, y, z int) shorthand is not allowed.
-#	* If the return parameter is an error number, it must be named errno.
+#	* If the return parameter is an error, it must be named err.
 
 # A line beginning with //sysnb is like //sys, except that the
 # goroutine will not be suspended during the execution of the library
@@ -217,13 +217,13 @@
 	    goname = goparam[1]
 	    gotype = goparam[2]
 
-	    if (goname == "errno") {
+	    if (goname == "err") {
 		if (cfnresult ~ /^\*/) {
 		    print "\tif _r == nil {"
 		} else {
 		    print "\tif _r < 0 {"
 		}
-		print "\t\terrno = GetErrno()"
+		print "\t\terr = GetErrno()"
 		print "\t}"
 	    } else if (gotype == "uintptr" && cfnresult ~ /^\*/) {
 		printf("\t%s = (%s)(unsafe.Pointer(_r))\n", goname, gotype)
diff --git a/libgo/go/syscall/netlink_linux.go b/libgo/go/syscall/netlink_linux.go
index 4ee78d6..8683bb3 100644
--- a/libgo/go/syscall/netlink_linux.go
+++ b/libgo/go/syscall/netlink_linux.go
@@ -63,31 +63,28 @@
 // NetlinkRIB returns routing information base, as known as RIB,
 // which consists of network facility information, states and
 // parameters.
-func NetlinkRIB(proto, family int) ([]byte, int) {
+func NetlinkRIB(proto, family int) ([]byte, error) {
 	var (
-		s     int
-		e     int
 		lsanl SockaddrNetlink
-		seq   int
 		tab   []byte
 	)
 
-	s, e = Socket(AF_NETLINK, SOCK_RAW, 0)
-	if e != 0 {
+	s, e := Socket(AF_NETLINK, SOCK_RAW, 0)
+	if e != nil {
 		return nil, e
 	}
 	defer Close(s)
 
 	lsanl.Family = AF_NETLINK
 	e = Bind(s, &lsanl)
-	if e != 0 {
+	if e != nil {
 		return nil, e
 	}
 
-	seq++
+	seq := 1
 	wb := newNetlinkRouteRequest(proto, seq, family)
 	e = Sendto(s, wb, 0, &lsanl)
-	if e != 0 {
+	if e != nil {
 		return nil, e
 	}
 
@@ -100,7 +97,7 @@
 
 		rb = make([]byte, Getpagesize())
 		nr, _, e = Recvfrom(s, rb, 0)
-		if e != 0 {
+		if e != nil {
 			return nil, e
 		}
 		if nr < NLMSG_HDRLEN {
@@ -111,7 +108,7 @@
 
 		msgs, _ := ParseNetlinkMessage(rb)
 		for _, m := range msgs {
-			if lsa, e = Getsockname(s); e != 0 {
+			if lsa, e = Getsockname(s); e != nil {
 				return nil, e
 			}
 			switch v := lsa.(type) {
@@ -132,7 +129,7 @@
 	}
 
 done:
-	return tab, 0
+	return tab, nil
 }
 
 // NetlinkMessage represents the netlink message.
@@ -143,18 +140,18 @@
 
 // ParseNetlinkMessage parses buf as netlink messages and returns
 // the slice containing the NetlinkMessage structs.
-func ParseNetlinkMessage(buf []byte) ([]NetlinkMessage, int) {
+func ParseNetlinkMessage(buf []byte) ([]NetlinkMessage, error) {
 	var (
 		h    *NlMsghdr
 		dbuf []byte
 		dlen int
-		e    int
+		e    error
 		msgs []NetlinkMessage
 	)
 
 	for len(buf) >= NLMSG_HDRLEN {
 		h, dbuf, dlen, e = netlinkMessageHeaderAndData(buf)
-		if e != 0 {
+		if e != nil {
 			break
 		}
 		m := NetlinkMessage{}
@@ -167,12 +164,12 @@
 	return msgs, e
 }
 
-func netlinkMessageHeaderAndData(buf []byte) (*NlMsghdr, []byte, int, int) {
+func netlinkMessageHeaderAndData(buf []byte) (*NlMsghdr, []byte, int, error) {
 	h := (*NlMsghdr)(unsafe.Pointer(&buf[0]))
 	if int(h.Len) < NLMSG_HDRLEN || int(h.Len) > len(buf) {
 		return nil, nil, 0, EINVAL
 	}
-	return h, buf[NLMSG_HDRLEN:], nlmAlignOf(int(h.Len)), 0
+	return h, buf[NLMSG_HDRLEN:], nlmAlignOf(int(h.Len)), nil
 }
 
 // NetlinkRouteAttr represents the netlink route attribute.
@@ -184,13 +181,13 @@
 // ParseNetlinkRouteAttr parses msg's payload as netlink route
 // attributes and returns the slice containing the NetlinkRouteAttr
 // structs.
-func ParseNetlinkRouteAttr(msg *NetlinkMessage) ([]NetlinkRouteAttr, int) {
+func ParseNetlinkRouteAttr(msg *NetlinkMessage) ([]NetlinkRouteAttr, error) {
 	var (
 		buf   []byte
 		a     *RtAttr
 		alen  int
 		vbuf  []byte
-		e     int
+		e     error
 		attrs []NetlinkRouteAttr
 	)
 
@@ -207,7 +204,7 @@
 
 	for len(buf) >= SizeofRtAttr {
 		a, vbuf, alen, e = netlinkRouteAttrAndValue(buf)
-		if e != 0 {
+		if e != nil {
 			break
 		}
 		ra := NetlinkRouteAttr{}
@@ -217,13 +214,13 @@
 		buf = buf[alen:]
 	}
 
-	return attrs, 0
+	return attrs, nil
 }
 
-func netlinkRouteAttrAndValue(buf []byte) (*RtAttr, []byte, int, int) {
+func netlinkRouteAttrAndValue(buf []byte) (*RtAttr, []byte, int, error) {
 	h := (*RtAttr)(unsafe.Pointer(&buf[0]))
 	if int(h.Len) < SizeofRtAttr || int(h.Len) > len(buf) {
 		return nil, nil, 0, EINVAL
 	}
-	return h, buf[SizeofRtAttr:], rtaAlignOf(int(h.Len)), 0
+	return h, buf[SizeofRtAttr:], rtaAlignOf(int(h.Len)), nil
 }
diff --git a/libgo/go/syscall/route_bsd.go b/libgo/go/syscall/route_bsd.go
index f6b124b..bc4c15e 100644
--- a/libgo/go/syscall/route_bsd.go
+++ b/libgo/go/syscall/route_bsd.go
@@ -29,29 +29,24 @@
 // RouteRIB returns routing information base, as known as RIB,
 // which consists of network facility information, states and
 // parameters.
-func RouteRIB(facility, param int) ([]byte, int) {
-	var (
-		tab []byte
-		e   int
-	)
-
+func RouteRIB(facility, param int) ([]byte, error) {
 	mib := []_C_int{CTL_NET, AF_ROUTE, 0, 0, _C_int(facility), _C_int(param)}
 
 	// Find size.
 	n := uintptr(0)
-	if e = sysctl(mib, nil, &n, nil, 0); e != 0 {
-		return nil, e
+	if err := sysctl(mib, nil, &n, nil, 0); err != nil {
+		return nil, err
 	}
 	if n == 0 {
-		return nil, 0
+		return nil, nil
 	}
 
-	tab = make([]byte, n)
-	if e = sysctl(mib, &tab[0], &n, nil, 0); e != 0 {
-		return nil, e
+	tab := make([]byte, n)
+	if err := sysctl(mib, &tab[0], &n, nil, 0); err != nil {
+		return nil, err
 	}
 
-	return tab[:n], 0
+	return tab[:n], nil
 }
 
 // RoutingMessage represents a routing message.
@@ -91,7 +86,7 @@
 		switch i {
 		case RTAX_DST, RTAX_GATEWAY:
 			sa, e := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(rsa)))
-			if e != 0 {
+			if e != nil {
 				return nil
 			}
 			if i == RTAX_DST {
@@ -134,7 +129,7 @@
 		return nil
 	}
 	sa, e := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(&m.Data[0])))
-	if e != 0 {
+	if e != nil {
 		return nil
 	}
 	return append(sas, sa)
@@ -163,7 +158,7 @@
 		switch i {
 		case RTAX_IFA:
 			sa, e := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(rsa)))
-			if e != 0 {
+			if e != nil {
 				return nil
 			}
 			sas = append(sas, sa)
@@ -178,7 +173,7 @@
 
 // ParseRoutingMessage parses buf as routing messages and returns
 // the slice containing the RoutingMessage interfaces.
-func ParseRoutingMessage(buf []byte) (msgs []RoutingMessage, errno int) {
+func ParseRoutingMessage(buf []byte) (msgs []RoutingMessage, err error) {
 	for len(buf) >= anyMessageLen {
 		any := (*anyMessage)(unsafe.Pointer(&buf[0]))
 		if any.Version != RTM_VERSION {
@@ -187,11 +182,11 @@
 		msgs = append(msgs, any.toRoutingMessage(buf))
 		buf = buf[any.Msglen:]
 	}
-	return msgs, 0
+	return msgs, nil
 }
 
 // ParseRoutingMessage parses msg's payload as raw sockaddrs and
 // returns the slice containing the Sockaddr interfaces.
-func ParseRoutingSockaddr(msg RoutingMessage) (sas []Sockaddr, errno int) {
-	return append(sas, msg.sockaddr()...), 0
+func ParseRoutingSockaddr(msg RoutingMessage) (sas []Sockaddr, err error) {
+	return append(sas, msg.sockaddr()...), nil
 }
diff --git a/libgo/go/syscall/route_darwin.go b/libgo/go/syscall/route_darwin.go
index 9d3a701..410e70a 100644
--- a/libgo/go/syscall/route_darwin.go
+++ b/libgo/go/syscall/route_darwin.go
@@ -63,7 +63,7 @@
 		switch i {
 		case RTAX_IFA:
 			sa, e := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(rsa)))
-			if e != 0 {
+			if e != nil {
 				return nil
 			}
 			sas = append(sas, sa)
diff --git a/libgo/go/syscall/route_freebsd.go b/libgo/go/syscall/route_freebsd.go
index 0d61d08..094e170 100644
--- a/libgo/go/syscall/route_freebsd.go
+++ b/libgo/go/syscall/route_freebsd.go
@@ -63,7 +63,7 @@
 		switch i {
 		case RTAX_IFA:
 			sa, e := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(rsa)))
-			if e != 0 {
+			if e != nil {
 				return nil
 			}
 			sas = append(sas, sa)
diff --git a/libgo/go/syscall/sleep_rtems.go b/libgo/go/syscall/sleep_rtems.go
index 8992eb5..9d72203 100644
--- a/libgo/go/syscall/sleep_rtems.go
+++ b/libgo/go/syscall/sleep_rtems.go
@@ -6,8 +6,8 @@
 
 package syscall
 
-func Sleep(nsec int64) (errno int) {
+func Sleep(nsec int64) (err error) {
 	ts := NsecToTimespec(nsec)
-	errno = Nanosleep(&ts, nil)
+	err = Nanosleep(&ts, nil)
 	return
 }
diff --git a/libgo/go/syscall/sleep_select.go b/libgo/go/syscall/sleep_select.go
index 3ebaf58..533f554 100644
--- a/libgo/go/syscall/sleep_select.go
+++ b/libgo/go/syscall/sleep_select.go
@@ -6,8 +6,8 @@
 
 package syscall
 
-func Sleep(nsec int64) (errno int) {
+func Sleep(nsec int64) (err error) {
 	tv := NsecToTimeval(nsec);
-	_, err := Select(0, nil, nil, nil, &tv);
+	_, err = Select(0, nil, nil, nil, &tv);
 	return err;
 }
diff --git a/libgo/go/syscall/sockcmsg_linux.go b/libgo/go/syscall/sockcmsg_linux.go
index b025ca5..0b4caa1 100644
--- a/libgo/go/syscall/sockcmsg_linux.go
+++ b/libgo/go/syscall/sockcmsg_linux.go
@@ -26,7 +26,7 @@
 // ParseUnixCredentials decodes a socket control message that contains
 // credentials in a Ucred structure. To receive such a message, the
 // SO_PASSCRED option must be enabled on the socket.
-func ParseUnixCredentials(msg *SocketControlMessage) (*Ucred, int) {
+func ParseUnixCredentials(msg *SocketControlMessage) (*Ucred, error) {
 	if msg.Header.Level != SOL_SOCKET {
 		return nil, EINVAL
 	}
@@ -34,5 +34,5 @@
 		return nil, EINVAL
 	}
 	ucred := *(*Ucred)(unsafe.Pointer(&msg.Data[0]))
-	return &ucred, 0
+	return &ucred, nil
 }
diff --git a/libgo/go/syscall/sockcmsg_unix.go b/libgo/go/syscall/sockcmsg_unix.go
index c9872ae..84c1383 100644
--- a/libgo/go/syscall/sockcmsg_unix.go
+++ b/libgo/go/syscall/sockcmsg_unix.go
@@ -47,17 +47,17 @@
 	Data   []byte
 }
 
-func ParseSocketControlMessage(buf []byte) ([]SocketControlMessage, int) {
+func ParseSocketControlMessage(buf []byte) ([]SocketControlMessage, error) {
 	var (
 		h     *Cmsghdr
 		dbuf  []byte
-		e     int
+		e     error
 		cmsgs []SocketControlMessage
 	)
 
 	for len(buf) >= CmsgLen(0) {
 		h, dbuf, e = socketControlMessageHeaderAndData(buf)
-		if e != 0 {
+		if e != nil {
 			break
 		}
 		m := SocketControlMessage{}
@@ -70,12 +70,12 @@
 	return cmsgs, e
 }
 
-func socketControlMessageHeaderAndData(buf []byte) (*Cmsghdr, []byte, int) {
+func socketControlMessageHeaderAndData(buf []byte) (*Cmsghdr, []byte, error) {
 	h := (*Cmsghdr)(unsafe.Pointer(&buf[0]))
 	if h.Len < SizeofCmsghdr || int(h.Len) > len(buf) {
 		return nil, nil, EINVAL
 	}
-	return h, buf[cmsgAlignOf(SizeofCmsghdr):], 0
+	return h, buf[cmsgAlignOf(SizeofCmsghdr):], nil
 }
 
 // UnixRights encodes a set of open file descriptors into a socket
@@ -99,7 +99,7 @@
 
 // ParseUnixRights decodes a socket control message that contains an
 // integer array of open file descriptors from another process.
-func ParseUnixRights(msg *SocketControlMessage) ([]int, int) {
+func ParseUnixRights(msg *SocketControlMessage) ([]int, error) {
 	if msg.Header.Level != SOL_SOCKET {
 		return nil, EINVAL
 	}
@@ -111,5 +111,5 @@
 		fds[j] = int(*(*int32)(unsafe.Pointer(&msg.Data[i])))
 		j++
 	}
-	return fds, 0
+	return fds, nil
 }
diff --git a/libgo/go/syscall/socket.go b/libgo/go/syscall/socket.go
index e0218ba..005fd84 100644
--- a/libgo/go/syscall/socket.go
+++ b/libgo/go/syscall/socket.go
@@ -17,7 +17,7 @@
 var SocketDisableIPv6 bool
 
 type Sockaddr interface {
-	sockaddr() (ptr *RawSockaddrAny, len Socklen_t, errno int)	// lowercase; only we can define Sockaddrs
+	sockaddr() (ptr *RawSockaddrAny, len Socklen_t, err error)	// lowercase; only we can define Sockaddrs
 }
 
 type RawSockaddrAny struct {
@@ -33,7 +33,7 @@
 	raw RawSockaddrInet4
 }
 
-func (sa *SockaddrInet4) sockaddr() (*RawSockaddrAny, Socklen_t, int) {
+func (sa *SockaddrInet4) sockaddr() (*RawSockaddrAny, Socklen_t, error) {
 	if sa.Port < 0 || sa.Port > 0xFFFF {
 		return nil, 0, EINVAL
 	}
@@ -45,7 +45,7 @@
 	for i := 0; i < len(sa.Addr); i++ {
 		sa.raw.Addr[i] = sa.Addr[i]
 	}
-	return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), n, 0
+	return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), n, nil
 }
 
 type SockaddrInet6 struct {
@@ -55,7 +55,7 @@
 	raw RawSockaddrInet6
 }
 
-func (sa *SockaddrInet6) sockaddr() (*RawSockaddrAny, Socklen_t, int) {
+func (sa *SockaddrInet6) sockaddr() (*RawSockaddrAny, Socklen_t, error) {
 	if sa.Port < 0 || sa.Port > 0xFFFF {
 		return nil, 0, EINVAL
 	}
@@ -68,7 +68,7 @@
 	for i := 0; i < len(sa.Addr); i++ {
 		sa.raw.Addr[i] = sa.Addr[i]
 	}
-	return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), n, 0
+	return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), n, nil
 }
 
 type SockaddrUnix struct {
@@ -76,7 +76,7 @@
 	raw RawSockaddrUnix
 }
 
-func (sa *SockaddrUnix) sockaddr() (*RawSockaddrAny, Socklen_t, int) {
+func (sa *SockaddrUnix) sockaddr() (*RawSockaddrAny, Socklen_t, error) {
 	name := sa.Name
 	n := len(name)
 	if n >= len(sa.raw.Path) || n == 0 {
@@ -92,186 +92,186 @@
 	}
 
 	// length is family (uint16), name, NUL.
-	return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), 2 + Socklen_t(n) + 1, 0
+	return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), 2 + Socklen_t(n) + 1, nil
 }
 
-func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, int) {
+func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) {
 	switch rsa.Addr.Family {
 	case AF_UNIX:
 		pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
 		sa := new(SockaddrUnix)
 		n, err := pp.getLen()
-		if err != 0 {
+		if err != nil {
 			return nil, err
 		}
-		bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]));
-		sa.Name = string(bytes[0:n]);
-		return sa, 0;
+		bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))
+		sa.Name = string(bytes[0:n])
+		return sa, nil
 
 	case AF_INET:
-		pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa));
-		sa := new(SockaddrInet4);
-		p := (*[2]byte)(unsafe.Pointer(&pp.Port));
-		sa.Port = int(p[0])<<8 + int(p[1]);
+		pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
+		sa := new(SockaddrInet4)
+		p := (*[2]byte)(unsafe.Pointer(&pp.Port))
+		sa.Port = int(p[0])<<8 + int(p[1])
 		for i := 0; i < len(sa.Addr); i++ {
-			sa.Addr[i] = pp.Addr[i];
+			sa.Addr[i] = pp.Addr[i]
 		}
-		return sa, 0;
+		return sa, nil
 
 	case AF_INET6:
-		pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa));
-		sa := new(SockaddrInet6);
-		p := (*[2]byte)(unsafe.Pointer(&pp.Port));
-		sa.Port = int(p[0])<<8 + int(p[1]);
+		pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
+		sa := new(SockaddrInet6)
+		p := (*[2]byte)(unsafe.Pointer(&pp.Port))
+		sa.Port = int(p[0])<<8 + int(p[1])
 		for i := 0; i < len(sa.Addr); i++ {
-			sa.Addr[i] = pp.Addr[i];
+			sa.Addr[i] = pp.Addr[i]
 		}
-		return sa, 0;
+		return sa, nil
 	}
 	return anyToSockaddrOS(rsa)
 }
 
-//sys	accept(fd int, sa *RawSockaddrAny, len *Socklen_t) (nfd int, errno int)
+//sys	accept(fd int, sa *RawSockaddrAny, len *Socklen_t) (nfd int, err error)
 //accept(fd int, sa *RawSockaddrAny, len *Socklen_t) int
 
-func Accept(fd int) (nfd int, sa Sockaddr, errno int) {
+func Accept(fd int) (nfd int, sa Sockaddr, err error) {
 	var rsa RawSockaddrAny
 	var len Socklen_t = SizeofSockaddrAny
-	nfd, errno = accept(fd, &rsa, &len)
-	if errno != 0 {
+	nfd, err = accept(fd, &rsa, &len)
+	if err != nil {
 		return
 	}
-	sa, errno = anyToSockaddr(&rsa)
-	if errno != 0 {
+	sa, err = anyToSockaddr(&rsa)
+	if err != nil {
 		Close(nfd)
 		nfd = 0
 	}
 	return
 }
 
-//sysnb	getsockname(fd int, sa *RawSockaddrAny, len *Socklen_t) (errno int)
+//sysnb	getsockname(fd int, sa *RawSockaddrAny, len *Socklen_t) (err error)
 //getsockname(fd int, sa *RawSockaddrAny, len *Socklen_t) int
 
-func Getsockname(fd int) (sa Sockaddr, errno int) {
+func Getsockname(fd int) (sa Sockaddr, err error) {
 	var rsa RawSockaddrAny
 	var len Socklen_t = SizeofSockaddrAny
-	if errno = getsockname(fd, &rsa, &len); errno != 0 {
+	if err = getsockname(fd, &rsa, &len); err != nil {
 		return
 	}
 	return anyToSockaddr(&rsa)
 }
 
-//sysnb getpeername(fd int, sa *RawSockaddrAny, len *Socklen_t) (errno int)
+//sysnb getpeername(fd int, sa *RawSockaddrAny, len *Socklen_t) (err error)
 //getpeername(fd int, sa *RawSockaddrAny, len *Socklen_t) int
 
-func Getpeername(fd int) (sa Sockaddr, errno int) {
+func Getpeername(fd int) (sa Sockaddr, err error) {
 	var rsa RawSockaddrAny
 	var len Socklen_t = SizeofSockaddrAny
-	if getpeername(fd, &rsa, &len); errno != 0 {
+	if err = getpeername(fd, &rsa, &len); err != nil {
 		return
 	}
 	return anyToSockaddr(&rsa)
 }
 
-//sys	bind(fd int, sa *RawSockaddrAny, len Socklen_t) (errno int)
+//sys	bind(fd int, sa *RawSockaddrAny, len Socklen_t) (err error)
 //bind(fd int, sa *RawSockaddrAny, len Socklen_t) int
 
-func Bind(fd int, sa Sockaddr) (errno int) {
+func Bind(fd int, sa Sockaddr) (err error) {
 	ptr, n, err := sa.sockaddr()
-	if err != 0 {
+	if err != nil {
 		return err
 	}
 	return bind(fd, ptr, n)
 }
 
-//sys	connect(s int, addr *RawSockaddrAny, addrlen Socklen_t) (errno int)
+//sys	connect(s int, addr *RawSockaddrAny, addrlen Socklen_t) (err error)
 //connect(s int, addr *RawSockaddrAny, addrlen Socklen_t) int
 
-func Connect(fd int, sa Sockaddr) (errno int) {
+func Connect(fd int, sa Sockaddr) (err error) {
 	ptr, n, err := sa.sockaddr()
-	if err != 0 {
+	if err != nil {
 		return err
 	}
 	return connect(fd, ptr, n)
 }
 
-//sysnb	socket(domain int, typ int, proto int) (fd int, errno int)
+//sysnb	socket(domain int, typ int, proto int) (fd int, err error)
 //socket(domain int, typ int, protocol int) int
 
-func Socket(domain, typ, proto int) (fd, errno int) {
+func Socket(domain, typ, proto int) (fd int, err error) {
 	if domain == AF_INET6 && SocketDisableIPv6 {
 		return -1, EAFNOSUPPORT
 	}
-	fd, errno = socket(domain, typ, proto)
+	fd, err = socket(domain, typ, proto)
 	return
 }
 
-//sysnb	socketpair(domain int, typ int, proto int, fd *[2]int) (errno int)
+//sysnb	socketpair(domain int, typ int, proto int, fd *[2]int) (err error)
 //socketpair(domain int, typ int, protocol int, fd *[2]int) int
 
-func Socketpair(domain, typ, proto int) (fd [2]int, errno int) {
-	errno = socketpair(domain, typ, proto, &fd)
+func Socketpair(domain, typ, proto int) (fd [2]int, err error) {
+	err = socketpair(domain, typ, proto, &fd)
 	return
 }
 
-//sys	getsockopt(s int, level int, name int, val uintptr, vallen *Socklen_t) (errno int)
+//sys	getsockopt(s int, level int, name int, val uintptr, vallen *Socklen_t) (err error)
 //getsockopt(s int, level int, name int, val *byte, vallen *Socklen_t) int
 
-func GetsockoptInt(fd, level, opt int) (value, errno int) {
+func GetsockoptInt(fd, level, opt int) (value int, err error) {
 	var n int32
 	vallen := Socklen_t(4)
-	errno = getsockopt(fd, level, opt, (uintptr)(unsafe.Pointer(&n)), &vallen)
-	return int(n), errno
+	err = getsockopt(fd, level, opt, (uintptr)(unsafe.Pointer(&n)), &vallen)
+	return int(n), err
 }
 
-func GetsockoptInet4Addr(fd, level, opt int) (value [4]byte, errno int) {
+func GetsockoptInet4Addr(fd, level, opt int) (value [4]byte, err error) {
 	vallen := Socklen_t(4)
-	errno = getsockopt(fd, level, opt, uintptr(unsafe.Pointer(&value[0])), &vallen)
-	return value, errno
+	err = getsockopt(fd, level, opt, uintptr(unsafe.Pointer(&value[0])), &vallen)
+	return value, err
 }
 
-func GetsockoptIPMreq(fd, level, opt int) (*IPMreq, int) {
+func GetsockoptIPMreq(fd, level, opt int) (*IPMreq, error) {
 	var value IPMreq
 	vallen := Socklen_t(SizeofIPMreq)
-	errno := getsockopt(fd, level, opt, uintptr(unsafe.Pointer(&value)), &vallen)
-	return &value, errno
+	err := getsockopt(fd, level, opt, uintptr(unsafe.Pointer(&value)), &vallen)
+	return &value, err
 }
 
 /* FIXME: mksysinfo needs to support IPMreqn.
 
-func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, int) {
+func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) {
 	var value IPMreqn
 	vallen := Socklen_t(SizeofIPMreqn)
-	errno := getsockopt(fd, level, opt, uintptr(unsafe.Pointer(&value)), &vallen)
-	return &value, errno
+	err := getsockopt(fd, level, opt, uintptr(unsafe.Pointer(&value)), &vallen)
+	return &value, err
 }
 
 */
 
 /* FIXME: mksysinfo needs to support IPv6Mreq.
 
-func GetsockoptIPv6Mreq(fd, level, opt int) (*IPv6Mreq, int) {
+func GetsockoptIPv6Mreq(fd, level, opt int) (*IPv6Mreq, error) {
 	var value IPv6Mreq
 	vallen := Socklen_t(SizeofIPv6Mreq)
-	errno := getsockopt(fd, level, opt, uintptr(unsafe.Pointer(&value)), &vallen)
-	return &value, errno
+	err := getsockopt(fd, level, opt, uintptr(unsafe.Pointer(&value)), &vallen)
+	return &value, err
 }
 
 */
 
-//sys	setsockopt(s int, level int, name int, val *byte, vallen Socklen_t) (errno int)
+//sys	setsockopt(s int, level int, name int, val *byte, vallen Socklen_t) (err error)
 //setsockopt(s int, level int, optname int, val *byte, vallen Socklen_t) int
 
-func SetsockoptInt(fd, level, opt int, value int) (errno int) {
+func SetsockoptInt(fd, level, opt int, value int) (err error) {
 	var n = int32(value)
 	return setsockopt(fd, level, opt, (*byte)(unsafe.Pointer(&n)), 4)
 }
 
-func SetsockoptInet4Addr(fd, level, opt int, value [4]byte) (errno int) {
+func SetsockoptInet4Addr(fd, level, opt int, value [4]byte) (err error) {
 	return setsockopt(fd, level, opt, (*byte)(unsafe.Pointer(&value[0])), 4)
 }
 
-func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (errno int) {
+func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (err error) {
 	return setsockopt(fd, level, opt, (*byte)(unsafe.Pointer(tv)), Socklen_t(unsafe.Sizeof(*tv)))
 }
 
@@ -280,58 +280,58 @@
 	Linger int32;
 }
 
-func SetsockoptLinger(fd, level, opt int, l *Linger) (errno int) {
+func SetsockoptLinger(fd, level, opt int, l *Linger) (err error) {
 	return setsockopt(fd, level, opt, (*byte)(unsafe.Pointer(l)), Socklen_t(unsafe.Sizeof(*l)));
 }
 
-func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (errno int) {
+func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (err error) {
 	return setsockopt(fd, level, opt, (*byte)(unsafe.Pointer(mreq)), Socklen_t(unsafe.Sizeof(*mreq)))
 }
 
 /* FIXME: mksysinfo needs to support IMPreqn.
 
-func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (errno int) {
+func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) {
 	return setsockopt(fd, level, opt, (*byte)(unsafe.Pointer(mreq)), Socklen_t(unsafe.Sizeof(*mreq)))
 }
 
 */
 
-func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (errno int) {
+func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (err error) {
 	return setsockopt(fd, level, opt, (*byte)(unsafe.Pointer(mreq)), Socklen_t(unsafe.Sizeof(*mreq)))
 }
 
-func SetsockoptString(fd, level, opt int, s string) (errno int) {
+func SetsockoptString(fd, level, opt int, s string) (err error) {
 	return setsockopt(fd, level, opt, (*byte)(unsafe.Pointer(&[]byte(s)[0])), Socklen_t(len(s)))
 }
 
-//sys	recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *Socklen_t) (n int, errno int)
+//sys	recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *Socklen_t) (n int, err error)
 //recvfrom(fd int, buf *byte, len Size_t, flags int, from *RawSockaddrAny, fromlen *Socklen_t) Ssize_t
 
-func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, errno int) {
+func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) {
 	var rsa RawSockaddrAny
 	var len Socklen_t = SizeofSockaddrAny
-	if n, errno = recvfrom(fd, p, flags, &rsa, &len); errno != 0 {
+	if n, err = recvfrom(fd, p, flags, &rsa, &len); err != nil {
 		return
 	}
-	from, errno = anyToSockaddr(&rsa)
+	from, err = anyToSockaddr(&rsa)
 	return
 }
 
-//sys	sendto(s int, buf []byte, flags int, to *RawSockaddrAny, tolen Socklen_t) (errno int)
+//sys	sendto(s int, buf []byte, flags int, to *RawSockaddrAny, tolen Socklen_t) (err error)
 //sendto(s int, buf *byte, len Size_t, flags int, to *RawSockaddrAny, tolen Socklen_t) Ssize_t
 
-func Sendto(fd int, p []byte, flags int, to Sockaddr) (errno int) {
+func Sendto(fd int, p []byte, flags int, to Sockaddr) (err error) {
 	ptr, n, err := to.sockaddr()
-	if err != 0 {
+	if err != nil {
 		return err
 	}
 	return sendto(fd, p, flags, ptr, n)
 }
 
-//sys	recvmsg(s int, msg *Msghdr, flags int) (n int, errno int)
+//sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
 //recvmsg(s int, msg *Msghdr, flags int) Ssize_t
 
-func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, errno int) {
+func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
 	var msg Msghdr
 	var rsa RawSockaddrAny
 	msg.Name = (*byte)(unsafe.Pointer(&rsa))
@@ -353,28 +353,28 @@
 	}
 	msg.Iov = &iov
 	msg.Iovlen = 1
-	if n, errno = recvmsg(fd, &msg, flags); errno != 0 {
+	if n, err = recvmsg(fd, &msg, flags); err != nil {
 		return
 	}
 	oobn = int(msg.Controllen)
 	recvflags = int(msg.Flags)
 	// source address is only specified if the socket is unconnected
 	if rsa.Addr.Family != AF_UNSPEC {
-		from, errno = anyToSockaddr(&rsa)
+		from, err = anyToSockaddr(&rsa)
 	}
 	return
 }
 
-//sys	sendmsg(s int, msg *Msghdr, flags int) (errno int)
+//sys	sendmsg(s int, msg *Msghdr, flags int) (err error)
 //sendmsg(s int, msg *Msghdr, flags int) Ssize_t
 
-func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (errno int) {
+func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
 	var ptr *RawSockaddrAny
 	var salen Socklen_t
 	if to != nil {
-		var err int
+		var err error
 		ptr, salen, err = to.sockaddr()
-		if err != 0 {
+		if err != nil {
 			return err
 		}
 	}
@@ -398,16 +398,16 @@
 	}
 	msg.Iov = &iov
 	msg.Iovlen = 1
-	if errno = sendmsg(fd, &msg, flags); errno != 0 {
+	if err = sendmsg(fd, &msg, flags); err != nil {
 		return
 	}
 	return
 }
 
-//sys	Listen(fd int, n int) (errno int)
+//sys	Listen(fd int, n int) (err error)
 //listen(fd int, n int) int
 
-//sys	Shutdown(fd int, how int) (errno int)
+//sys	Shutdown(fd int, how int) (err error)
 //shutdown(fd int, how int) int
 
 func (iov *Iovec) SetLen(length int) {
diff --git a/libgo/go/syscall/socket_bsd.go b/libgo/go/syscall/socket_bsd.go
index 735baf9..be55991 100644
--- a/libgo/go/syscall/socket_bsd.go
+++ b/libgo/go/syscall/socket_bsd.go
@@ -47,7 +47,7 @@
 	sa.Len = uint8(3 + n) // 2 for Family, Len; 1 for NUL.
 }
 
-func (sa *RawSockaddrUnix) getLen() (int, int) {
+func (sa *RawSockaddrUnix) getLen() (int, error) {
 	if sa.Len < 3 || sa.Len > SizeofSockaddrUnix {
 		return 0, EINVAL
 	}
@@ -59,7 +59,7 @@
 			break
 		}
 	}
-	return n, 0
+	return n, nil
 }
 
 type RawSockaddr struct {
@@ -69,10 +69,10 @@
 }
 
 // BindToDevice binds the socket associated with fd to device.
-func BindToDevice(fd int, device string) (errno int) {
+func BindToDevice(fd int, device string) (err error) {
 	return ENOSYS
 }
 
-func anyToSockaddrOS(rsa *RawSockaddrAny) (Sockaddr, int) {
-	return nil, EAFNOSUPPORT;
+func anyToSockaddrOS(rsa *RawSockaddrAny) (Sockaddr, error) {
+	return nil, EAFNOSUPPORT
 }
diff --git a/libgo/go/syscall/socket_irix.go b/libgo/go/syscall/socket_irix.go
index 8bd55b8..c1fdc65 100644
--- a/libgo/go/syscall/socket_irix.go
+++ b/libgo/go/syscall/socket_irix.go
@@ -41,7 +41,7 @@
 func (sa *RawSockaddrUnix) setLen(int) {
 }
 
-func (sa *RawSockaddrUnix) getLen() (int, int) {
+func (sa *RawSockaddrUnix) getLen() (int, error) {
 	if sa.Path[0] == 0 {
 		// "Abstract" Unix domain socket.
 		// Rewrite leading NUL as @ for textual display.
@@ -61,7 +61,7 @@
 		n++
 	}
 
-	return n, 0
+	return n, nil
 }
 
 type RawSockaddr struct {
@@ -70,7 +70,7 @@
 }
 
 // BindToDevice binds the socket associated with fd to device.
-func BindToDevice(fd int, device string) (errno int) {
+func BindToDevice(fd int, device string) (err error) {
 	return ENOSYS
 }
 
@@ -124,6 +124,6 @@
 	EAI_MAX		= 14
 )
 
-func anyToSockaddrOS(rsa *RawSockaddrAny) (Sockaddr, int) {
-	return nil, EAFNOSUPPORT;
+func anyToSockaddrOS(rsa *RawSockaddrAny) (Sockaddr, error) {
+	return nil, EAFNOSUPPORT
 }
diff --git a/libgo/go/syscall/socket_linux.go b/libgo/go/syscall/socket_linux.go
index 49aac87..212e0b2 100644
--- a/libgo/go/syscall/socket_linux.go
+++ b/libgo/go/syscall/socket_linux.go
@@ -24,7 +24,7 @@
 	raw      RawSockaddrLinklayer
 }
 
-func (sa *SockaddrLinklayer) sockaddr() (*RawSockaddrAny, Socklen_t, int) {
+func (sa *SockaddrLinklayer) sockaddr() (*RawSockaddrAny, Socklen_t, error) {
 	if sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff {
 		return nil, 0, EINVAL
 	}
@@ -37,7 +37,7 @@
 	for i := 0; i < len(sa.Addr); i++ {
 		sa.raw.Addr[i] = sa.Addr[i]
 	}
-	return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), SizeofSockaddrLinklayer, 0
+	return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), SizeofSockaddrLinklayer, nil
 }
 
 type SockaddrNetlink struct {
@@ -48,12 +48,12 @@
 	raw    RawSockaddrNetlink
 }
 
-func (sa *SockaddrNetlink) sockaddr() (*RawSockaddrAny, Socklen_t, int) {
+func (sa *SockaddrNetlink) sockaddr() (*RawSockaddrAny, Socklen_t, error) {
 	sa.raw.Family = AF_NETLINK
 	sa.raw.Pad = sa.Pad
 	sa.raw.Pid = sa.Pid
 	sa.raw.Groups = sa.Groups
-	return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), SizeofSockaddrNetlink, 0
+	return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), SizeofSockaddrNetlink, nil
 }
 
 type RawSockaddrInet4 struct {
@@ -87,7 +87,7 @@
 func (sa *RawSockaddrUnix) setLen(int) {
 }
 
-func (sa *RawSockaddrUnix) getLen() (int, int) {
+func (sa *RawSockaddrUnix) getLen() (int, error) {
 	if sa.Path[0] == 0 {
 		// "Abstract" Unix domain socket.
 		// Rewrite leading NUL as @ for textual display.
@@ -107,7 +107,7 @@
 		n++
 	}
 
-	return n, 0
+	return n, nil
 }
 
 type RawSockaddrLinklayer struct {
@@ -133,11 +133,11 @@
 }
 
 // BindToDevice binds the socket associated with fd to device.
-func BindToDevice(fd int, device string) (errno int) {
+func BindToDevice(fd int, device string) (err error) {
 	return SetsockoptString(fd, SOL_SOCKET, SO_BINDTODEVICE, device)
 }
 
-func anyToSockaddrOS(rsa *RawSockaddrAny) (Sockaddr, int) {
+func anyToSockaddrOS(rsa *RawSockaddrAny) (Sockaddr, error) {
 	switch rsa.Addr.Family {
 	case AF_NETLINK:
 		pp := (*RawSockaddrNetlink)(unsafe.Pointer(rsa))
@@ -146,7 +146,7 @@
 		sa.Pad = pp.Pad
 		sa.Pid = pp.Pid
 		sa.Groups = pp.Groups
-		return sa, 0
+		return sa, nil
 
 	case AF_PACKET:
 		pp := (*RawSockaddrLinklayer)(unsafe.Pointer(rsa))
@@ -159,16 +159,16 @@
 		for i := 0; i < len(sa.Addr); i++ {
 			sa.Addr[i] = pp.Addr[i]
 		}
-		return sa, 0
+		return sa, nil
 	}
 	return nil, EAFNOSUPPORT
 }
 
-//sysnb	EpollCreate(size int) (fd int, errno int)
+//sysnb	EpollCreate(size int) (fd int, err error)
 //epoll_create(size int) int
 
-//sysnb	EpollCtl(epfd int, op int, fd int, event *EpollEvent) (errno int)
+//sysnb	EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error)
 //epoll_ctl(epfd int, op int, fd int, event *EpollEvent) int
 
-//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, errno int)
+//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
 //epoll_wait(epfd int, events *EpollEvent, maxevents int, timeout int) int
diff --git a/libgo/go/syscall/socket_solaris.go b/libgo/go/syscall/socket_solaris.go
index 0c3e6c9..0a03465 100644
--- a/libgo/go/syscall/socket_solaris.go
+++ b/libgo/go/syscall/socket_solaris.go
@@ -42,7 +42,7 @@
 func (sa *RawSockaddrUnix) setLen(int) {
 }
 
-func (sa *RawSockaddrUnix) getLen() (int, int) {
+func (sa *RawSockaddrUnix) getLen() (int, error) {
 	if sa.Path[0] == 0 {
 		// "Abstract" Unix domain socket.
 		// Rewrite leading NUL as @ for textual display.
@@ -62,7 +62,7 @@
 		n++
 	}
 
-	return n, 0
+	return n, nil
 }
 
 type RawSockaddr struct {
@@ -71,10 +71,10 @@
 }
 
 // BindToDevice binds the socket associated with fd to device.
-func BindToDevice(fd int, device string) (errno int) {
+func BindToDevice(fd int, device string) (err error) {
 	return ENOSYS
 }
 
-func anyToSockaddrOS(rsa *RawSockaddrAny) (Sockaddr, int) {
-	return nil, EAFNOSUPPORT;
+func anyToSockaddrOS(rsa *RawSockaddrAny) (Sockaddr, error) {
+	return nil, EAFNOSUPPORT
 }
diff --git a/libgo/go/syscall/syscall.go b/libgo/go/syscall/syscall.go
index a802ba0..ad9df6c 100644
--- a/libgo/go/syscall/syscall.go
+++ b/libgo/go/syscall/syscall.go
@@ -9,8 +9,9 @@
 // packages rather than this one if you can.
 // For details of the functions and data types in this package consult
 // the manuals for the appropriate operating system.
-// These calls return errno == 0 to indicate success; otherwise
-// errno is an operating system error number describing the failure.
+// These calls return err == nil to indicate success; otherwise
+// err is an operating system error describing the failure.
+// On most systems, that error has type syscall.Errno.
 package syscall
 
 import "unsafe"
diff --git a/libgo/go/syscall/syscall_unix.go b/libgo/go/syscall/syscall_unix.go
index c734b2c..899a65c 100644
--- a/libgo/go/syscall/syscall_unix.go
+++ b/libgo/go/syscall/syscall_unix.go
@@ -23,7 +23,7 @@
 // Do a system call.  We look at the size of uintptr to see how to pass
 // the arguments, so that we don't pass a 64-bit value when the function
 // expects a 32-bit one.
-func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
+func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {
 	entersyscall()
 	var r uintptr
 	if unsafe.Sizeof(r) == 4 {
@@ -33,12 +33,12 @@
 		r1 := c_syscall64(int64(trap), int64(a1), int64(a2), int64(a3), 0, 0, 0)
 		r = uintptr(r1)
 	}
-	errno := GetErrno()
+	err = GetErrno()
 	exitsyscall()
-	return r, 0, uintptr(errno)
+	return r, 0, err
 }
 
-func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
+func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {
 	entersyscall()
 	var r uintptr
 	if unsafe.Sizeof(r) == 4 {
@@ -50,12 +50,12 @@
 			int64(a4), int64(a5), int64(a6))
 		r = uintptr(r1)
 	}
-	errno := GetErrno()
+	err = GetErrno()
 	exitsyscall()
-	return r, 0, uintptr(errno)
+	return r, 0, err
 }
 
-func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
+func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {
 	var r uintptr
 	if unsafe.Sizeof(r) == 4 {
 		r1 := c_syscall32(int32(trap), int32(a1), int32(a2), int32(a3), 0, 0, 0)
@@ -64,11 +64,11 @@
 		r1 := c_syscall64(int64(trap), int64(a1), int64(a2), int64(a3), 0, 0, 0)
 		r = uintptr(r1)
 	}
-	errno := GetErrno()
-	return r, 0, uintptr(errno)
+	err = GetErrno()
+	return r, 0, err
 }
 
-func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
+func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {
 	var r uintptr
 	if unsafe.Sizeof(r) == 4 {
 		r1 := c_syscall32(int32(trap), int32(a1), int32(a2), int32(a3),
@@ -79,8 +79,8 @@
 			int64(a4), int64(a5), int64(a6))
 		r = uintptr(r1)
 	}
-	errno := GetErrno()
-	return r, 0, uintptr(errno)
+	err = GetErrno()
+	return r, 0, err
 }
 
 // Mmap manager, for use by operating system-specific implementations.
@@ -89,18 +89,18 @@
 type mmapper struct {
 	sync.Mutex
 	active map[*byte][]byte // active mappings; key is last byte in mapping
-	mmap   func(addr, length uintptr, prot, flags, fd int, offset int64) (uintptr, int)
-	munmap func(addr uintptr, length uintptr) int
+	mmap   func(addr, length uintptr, prot, flags, fd int, offset int64) (uintptr, error)
+	munmap func(addr uintptr, length uintptr) error
 }
 
-func (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, errno int) {
+func (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
 	if length <= 0 {
 		return nil, EINVAL
 	}
 
 	// Map the requested memory.
 	addr, errno := m.mmap(0, uintptr(length), prot, flags, fd, offset)
-	if errno != 0 {
+	if errno != nil {
 		return nil, errno
 	}
 
@@ -119,10 +119,10 @@
 	m.Lock()
 	defer m.Unlock()
 	m.active[p] = b
-	return b, 0
+	return b, nil
 }
 
-func (m *mmapper) Munmap(data []byte) (errno int) {
+func (m *mmapper) Munmap(data []byte) (err error) {
 	if len(data) == 0 || len(data) != cap(data) {
 		return EINVAL
 	}
@@ -137,11 +137,11 @@
 	}
 
 	// Unmap the memory and update m.
-	if errno := m.munmap(uintptr(unsafe.Pointer(&b[0])), uintptr(len(b))); errno != 0 {
+	if errno := m.munmap(uintptr(unsafe.Pointer(&b[0])), uintptr(len(b))); errno != nil {
 		return errno
 	}
 	m.active[p] = nil, false
-	return 0
+	return nil
 }
 
 var mapper = &mmapper{
@@ -150,10 +150,32 @@
 	munmap: munmap,
 }
 
-func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, errno int) {
+func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
 	return mapper.Mmap(fd, offset, length, prot, flags)
 }
 
-func Munmap(b []byte) (errno int) {
+func Munmap(b []byte) (err error) {
 	return mapper.Munmap(b)
 }
+
+
+// An Errno is an unsigned number describing an error condition.
+// It implements the error interface.  The zero Errno is by convention
+// a non-error, so code to convert from Errno to error should use:
+//	err = nil
+//	if errno != 0 {
+//		err = errno
+//	}
+type Errno uintptr
+
+func (e Errno) Error() string {
+	return Errstr(int(e))
+}
+
+func (e Errno) Temporary() bool {
+	return e == EINTR || e == EMFILE || e.Timeout()
+}
+
+func (e Errno) Timeout() bool {
+	return e == EAGAIN || e == EWOULDBLOCK || e == ETIMEDOUT
+}