[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[PATCH] gccgo patch 3-5 (9)



Hi,

Attached are patches to enable gccgo to build properly on Debian
GNU/Hurd on gcc-4.7 (4.7.3-4).

patch3.diff: src/libgo/Makefile.am: Use variable LIBGO_IS_GNU to add
functions for GNU/Hurd.

patch4.diff: src/libgo/go/syscall/libcall_gnu.go: New file, copied
from libcall_posix.go with the mount function removed.

patch5.diff: src/libgo/go/net/sock_gnu.go: New file, copied from
sock_bsd.go, with function maxListenerBacklog() empty (to be
reimplemented)

--- a/src/libgo/Makefile.am
+++ b/src/libgo/Makefile.am
@@ -666,6 +666,12 @@
 go_net_sockopt_file = go/net/sockopt_bsd.go
 go_net_sockoptip_file = go/net/sockoptip_bsd.go go/net/sockoptip_freebsd.go
 else
+if LIBGO_IS_GNU
+go_net_cgo_file = go/net/cgo_linux.go
+go_net_sock_file = go/net/sock_gnu.go
+go_net_sockopt_file = go/net/sockopt_bsd.go
+go_net_sockoptip_file = go/net/sockoptip_bsd.go go/net/sockoptip_netbsd.go
+else
 go_net_cgo_file = go/net/cgo_bsd.go
 go_net_sock_file = go/net/sock_bsd.go
 go_net_sockopt_file = go/net/sockopt_bsd.go
@@ -674,6 +680,7 @@
 endif
 endif
 endif
+endif
 
 if LIBGO_IS_LINUX
 go_net_sendfile_file = go/net/sendfile_linux.go
@@ -763,11 +770,15 @@
 if LIBGO_IS_RTEMS
 go_os_sys_file = go/os/sys_uname.go
 else
+if LIBGO_IS_GNU
+go_os_sys_file = go/os/sys_uname.go
+else
 go_os_sys_file = go/os/sys_bsd.go
 endif
 endif
 endif
 endif
+endif
 
 if LIBGO_IS_SOLARIS
 go_os_stat_file = go/os/stat_solaris.go
@@ -1395,10 +1406,15 @@
 syscall_exec_file = go/syscall/exec_unix.go
 syscall_exec_os_file = go/syscall/exec_linux.go
 else
+if LIBGO_IS_GNU
+syscall_exec_file = go/syscall/exec_unix.go
+syscall_exec_os_file = go/syscall/exec_gnu.go
+else
 syscall_exec_file = go/syscall/exec_unix.go
 syscall_exec_os_file = go/syscall/exec_bsd.go
 endif
 endif
+endif
 
 # Define Wait4.
 if LIBGO_IS_RTEMS
@@ -1512,11 +1528,17 @@
 syscall_lsf_file =
 endif
 
+if LIBGO_IS_GNU
+syscall_libcall_file = go/syscall/libcall_gnu.go
+else
+syscall_libcall_file = go/syscall/libcall_posix.go
+endif
+
 go_base_syscall_files = \
 	go/syscall/env_unix.go \
 	go/syscall/syscall_errno.go \
 	go/syscall/libcall_support.go \
-	go/syscall/libcall_posix.go \
+	$(syscall_libcall_file) \
 	go/syscall/socket.go \
 	go/syscall/sockcmsg_unix.go \
 	go/syscall/str.go \
--- /dev/null
+++ b/src/libgo/go/syscall/libcall_gnu.go
@@ -0,0 +1,391 @@
+// 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.
+
+// POSIX library calls.
+// Removed the mount call for GNU/Hurd, it exists but use translators.
+// This is not similar to as descibed in sys/mount.h
+// This file is compiled as ordinary Go code,
+// but it is also input to mksyscall,
+// which parses the //sys lines and generates library call stubs.
+// Note that sometimes we use a lowercase //sys name and
+// wrap it in our own nicer implementation.
+
+package syscall
+
+import "unsafe"
+
+/*
+ * Wrapped
+ */
+
+//sysnb	pipe(p *[2]int) (err error)
+//pipe(p *[2]int) int
+func Pipe(p []int) (err error) {
+	if len(p) != 2 {
+		return EINVAL
+	}
+	var pp [2]int
+	err = pipe(&pp)
+	p[0] = pp[0]
+	p[1] = pp[1]
+	return
+}
+
+//sys	utimes(path string, times *[2]Timeval) (err error)
+//utimes(path *byte, times *[2]Timeval) 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) (err error)
+//getcwd(buf *byte, size Size_t) *byte
+
+const ImplementsGetwd = true
+
+func Getwd() (ret string, err error) {
+	for len := Size_t(4096); ; len *= 2 {
+		b := make([]byte, len)
+		err := getcwd(&b[0], len)
+		if err == nil {
+			i := 0
+			for b[i] != 0 {
+				i++
+			}
+			return string(b[0:i]), nil
+		}
+		if err != ERANGE {
+			return "", err
+		}
+	}
+}
+
+func Getcwd(buf []byte) (n int, err error) {
+	err = getcwd(&buf[0], Size_t(len(buf)))
+	if err == nil {
+		i := 0
+		for buf[i] != 0 {
+			i++
+		}
+		n = i + 1
+	}
+	return
+}
+
+//sysnb	getgroups(size int, list *Gid_t) (nn int, err error)
+//getgroups(size int, list *Gid_t) int
+
+func Getgroups() (gids []int, err error) {
+	n, err := getgroups(0, nil)
+	if err != nil {
+		return nil, err
+	}
+	if n == 0 {
+		return nil, nil
+	}
+
+	// Sanity check group count.  Max is 1<<16 on GNU/Linux.
+	if n < 0 || n > 1<<20 {
+		return nil, EINVAL
+	}
+
+	a := make([]Gid_t, n)
+	n, err = getgroups(n, &a[0])
+	if err != nil {
+		return nil, err
+	}
+	gids = make([]int, n)
+	for i, v := range a[0:n] {
+		gids[i] = int(v)
+	}
+	return
+}
+
+//sysnb	setgroups(n int, list *Gid_t) (err error)
+//setgroups(n Size_t, list *Gid_t) int
+
+func Setgroups(gids []int) (err error) {
+	if len(gids) == 0 {
+		return setgroups(0, nil)
+	}
+
+	a := make([]Gid_t, len(gids))
+	for i, v := range gids {
+		a[i] = Gid_t(v)
+	}
+	return setgroups(len(a), &a[0])
+}
+
+type WaitStatus uint32
+
+// The WaitStatus methods are implemented in C, to pick up the macros
+// #defines in <sys/wait.h>.
+
+func (w WaitStatus) Exited() bool
+func (w WaitStatus) Signaled() bool
+func (w WaitStatus) Stopped() bool
+func (w WaitStatus) Continued() bool
+func (w WaitStatus) CoreDump() bool
+func (w WaitStatus) ExitStatus() int
+func (w WaitStatus) Signal() Signal
+func (w WaitStatus) StopSignal() Signal
+func (w WaitStatus) TrapCause() 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, err error)
+//select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) int
+
+const nfdbits = int(unsafe.Sizeof(fds_bits_type) * 8)
+
+type FdSet struct {
+	Bits [(FD_SETSIZE + nfdbits - 1) / nfdbits]fds_bits_type
+}
+
+func FDSet(fd int, set *FdSet) {
+	set.Bits[fd/nfdbits] |= (1 << (uint)(fd%nfdbits))
+}
+
+func FDClr(fd int, set *FdSet) {
+	set.Bits[fd/nfdbits] &^= (1 << (uint)(fd%nfdbits))
+}
+
+func FDIsSet(fd int, set *FdSet) bool {
+	if set.Bits[fd/nfdbits]&(1<<(uint)(fd%nfdbits)) != 0 {
+		return true
+	} else {
+		return false
+	}
+}
+
+func FDZero(set *FdSet) {
+	for i := range set.Bits {
+		set.Bits[i] = 0
+	}
+}
+
+//sys	Access(path string, mode uint32) (err error)
+//access(path *byte, mode int) int
+
+//sys	Chdir(path string) (err error)
+//chdir(path *byte) int
+
+//sys	Chmod(path string, mode uint32) (err error)
+//chmod(path *byte, mode Mode_t) 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) (err error)
+//chroot(path *byte) int
+
+//sys	Close(fd int) (err error)
+//close(fd int) int
+
+//sys	Creat(path string, mode uint32) (fd int, err error)
+//creat(path *byte, mode Mode_t) int
+
+//sysnb	Dup(oldfd int) (fd int, err error)
+//dup(oldfd int) int
+
+//sysnb	Dup2(oldfd int, newfd int) (err error)
+//dup2(oldfd int, newfd int) int
+
+//sys	Exit(code int)
+//exit(code int)
+
+//sys	Fchdir(fd int) (err error)
+//fchdir(fd int) int
+
+//sys	Fchmod(fd int, mode uint32) (err error)
+//fchmod(fd int, mode Mode_t) 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, err error)
+//fcntl(fd int, cmd int, arg int) int
+
+//sys	Fdatasync(fd int) (err error)
+//fdatasync(fd int) int
+
+//sys	Fsync(fd int) (err error)
+//fsync(fd int) int
+
+//sysnb Getegid() (egid int)
+//getegid() Gid_t
+
+//sysnb Geteuid() (euid int)
+//geteuid() Uid_t
+
+//sysnb Getgid() (gid int)
+//getgid() Gid_t
+
+//sysnb	Getpagesize() (pagesize int)
+//getpagesize() int
+
+//sysnb	Getpgid(pid int) (pgid int, err error)
+//getpgid(pid Pid_t) Pid_t
+
+//sysnb	Getpgrp() (pid int)
+//getpgrp() Pid_t
+
+//sysnb	Getpid() (pid int)
+//getpid() Pid_t
+
+//sysnb	Getppid() (ppid int)
+//getppid() Pid_t
+
+//sysnb	Getrlimit(resource int, rlim *Rlimit) (err error)
+//getrlimit(resource int, rlim *Rlimit) int
+
+//sysnb	Getrusage(who int, rusage *Rusage) (err error)
+//getrusage(who int, rusage *Rusage) int
+
+//sysnb	gettimeofday(tv *Timeval, tz *byte) (err error)
+//gettimeofday(tv *Timeval, tz *byte) int
+func Gettimeofday(tv *Timeval) (err error) {
+	return gettimeofday(tv, nil)
+}
+
+//sysnb Getuid() (uid int)
+//getuid() Uid_t
+
+//sysnb	Kill(pid int, sig Signal) (err error)
+//kill(pid Pid_t, sig int) 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) (err error)
+//link(oldpath *byte, newpath *byte) int
+
+//sys	Mkdir(path string, mode uint32) (err error)
+//mkdir(path *byte, mode Mode_t) int
+
+//sys	Mknod(path string, mode uint32, dev int) (err error)
+//mknod(path *byte, mode Mode_t, dev _dev_t) int
+
+//sys	Nanosleep(time *Timespec, leftover *Timespec) (err error)
+//nanosleep(time *Timespec, leftover *Timespec) int
+
+//sys	Pause() (err error)
+//pause() 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, err error)
+//readlink(path *byte, buf *byte, bufsiz Size_t) Ssize_t
+
+//sys	Rename(oldpath string, newpath string) (err error)
+//rename(oldpath *byte, newpath *byte) int
+
+//sys	Rmdir(path string) (err error)
+//rmdir(path *byte) int
+
+//sys	Setdomainname(p []byte) (err error)
+//setdomainname(name *byte, len Size_t) int
+
+//sys	Sethostname(p []byte) (err error)
+//sethostname(name *byte, len Size_t) int
+
+//sysnb	Setgid(gid int) (err error)
+//setgid(gid Gid_t) int
+
+//sysnb Setregid(rgid int, egid int) (err error)
+//setregid(rgid Gid_t, egid Gid_t) int
+
+//sysnb	Setpgid(pid int, pgid int) (err error)
+//setpgid(pid Pid_t, pgid Pid_t) int
+
+//sysnb	Setreuid(ruid int, euid int) (err error)
+//setreuid(ruid Uid_t, euid Uid_t) int
+
+//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
+//setrlimit(resource int, rlim *Rlimit) int
+
+//sysnb	Setsid() (pid int, err error)
+//setsid() Pid_t
+
+//sysnb	settimeofday(tv *Timeval, tz *byte) (err error)
+//settimeofday(tv *Timeval, tz *byte) int
+
+func Settimeofday(tv *Timeval) (err error) {
+	return settimeofday(tv, nil)
+}
+
+//sysnb	Setuid(uid int) (err error)
+//setuid(uid Uid_t) int
+
+//sys	Symlink(oldpath string, newpath string) (err error)
+//symlink(oldpath *byte, newpath *byte) int
+
+//sys	Sync()
+//sync()
+
+//sysnb	Time(t *Time_t) (tt Time_t, err error)
+//time(t *Time_t) Time_t
+
+//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) (err error)
+//unlink(path *byte) int
+
+//sys	Utime(path string, buf *Utimbuf) (err error)
+//utime(path *byte, buf *Utimbuf) 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) (err error)
+//munmap(addr *byte, length Size_t) int
+
+//sys Madvise(b []byte, advice int) (err error)
+//madvise(addr *byte, len Size_t, advice int) int
+
+//sys	Mprotect(b []byte, prot int) (err error)
+//mprotect(addr *byte, len Size_t, prot int) int
+
+//sys	Mlock(b []byte) (err error)
+//mlock(addr *byte, len Size_t) int
+
+//sys	Munlock(b []byte) (err error)
+//munlock(addr *byte, len Size_t) int
+
+//sys	Mlockall(flags int) (err error)
+//mlockall(flags int) int
+
+//sys	Munlockall() (err error)
+//munlockall() int
+
+func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
+
+func NsecToTimespec(nsec int64) (ts Timespec) {
+	ts.Sec = Timespec_sec_t(nsec / 1e9)
+	ts.Nsec = Timespec_nsec_t(nsec % 1e9)
+	return
+}
+
+func TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 }
+
+func NsecToTimeval(nsec int64) (tv Timeval) {
+	nsec += 999 // round up to microsecond
+	tv.Sec = Timeval_sec_t(nsec / 1e9)
+	tv.Usec = Timeval_usec_t(nsec % 1e9 / 1e3)
+	return
+}
+
+//sysnb	Tcgetattr(fd int, p *Termios) (err error)
+//tcgetattr(fd int, p *Termios) int
+
+//sys	Tcsetattr(fd int, actions int, p *Termios) (err error)
+//tcsetattr(fd int, actions int, p *Termios) int
--- /dev/null
+++ b/src/libgo/go/net/sock_gnu.go
@@ -0,0 +1,43 @@
+// Copyright 2009 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Sockets for GNU/Hurd
+
+package net
+
+import "syscall"
+
+func maxListenerBacklog() int {
+       // TODO: Implement this
+       return syscall.SOMAXCONN
+}
+
+func listenerSockaddr(s, f int, la syscall.Sockaddr, toAddr func(syscall.Sockaddr) Addr) (syscall.Sockaddr, error) {
+	a := toAddr(la)
+	if a == nil {
+		return la, nil
+	}
+	switch v := a.(type) {
+	case *TCPAddr, *UnixAddr:
+		err := setDefaultListenerSockopts(s)
+		if err != nil {
+			return nil, err
+		}
+	case *UDPAddr:
+		if v.IP.IsMulticast() {
+			err := setDefaultMulticastSockopts(s)
+			if err != nil {
+				return nil, err
+			}
+			switch f {
+			case syscall.AF_INET:
+				v.IP = IPv4zero
+			case syscall.AF_INET6:
+				v.IP = IPv6unspecified
+			}
+			return v.sockaddr(f)
+		}
+	}
+	return la, nil
+}

Reply to: