libgo: Solaris portability fixes.
authorIan Lance Taylor <ian@gcc.gnu.org>
Fri, 6 Nov 2015 19:15:45 +0000 (19:15 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 6 Nov 2015 19:15:45 +0000 (19:15 +0000)
    Only build net/hook_cloexec.go on GNU/Linux and FreeBSD, because those
    are the only systems with accept4.

    Add syscall/libcall_bsd.go to define sendfile for *BSD and Solaris.

    Revert tcpsockopt_solaris.go back to the earlier version, so that it
    works on Solaris 10.

    Always pass the address of a Pid_t value to TIOCGPGRP and TIOCSPGRP.

    Include <unistd.h> in runtime/go-varargs.c.

    Reviewed-on: https://go-review.googlesource.com/16719

From-SVN: r229880

gcc/go/gofrontend/MERGE
libgo/Makefile.am
libgo/Makefile.in
libgo/go/net/tcpsockopt_solaris.go
libgo/go/syscall/exec_bsd.go
libgo/go/syscall/exec_linux.go
libgo/go/syscall/exec_unix.go
libgo/go/syscall/exec_unix_test.go
libgo/go/syscall/libcall_bsd.go [new file with mode: 0644]
libgo/runtime/go-varargs.c

index dc042d91656e14b8421f156c45914e0a77a1a00a..b17ca93b24ca567913ed4015f89c894d6348e278 100644 (file)
@@ -1,4 +1,4 @@
-47f256e1ed527b2eb4041acf90d33e6abc5e1685
+10c1d6756ed1dcc814c49921c2a5e27f4677e0e6
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index ef671c4a5470bbffd561a5ad8a384c11f0e9072b..bf26a4cb667171107ef861743f4e7e184d91b6d3 100644 (file)
@@ -787,10 +787,14 @@ endif
 endif
 
 if LIBGO_IS_LINUX
-go_net_cloexec_file = go/net/sock_cloexec.go
+go_net_cloexec_file = go/net/sock_cloexec.go go/net/hook_cloexec.go
+else
+if LIBGO_IS_FREEBSD
+go_net_cloexec_file = go/net/sock_cloexec.go go/net/hook_cloexec.go
 else
 go_net_cloexec_file = go/net/sys_cloexec.go
 endif
+endif
 
 if LIBGO_IS_OPENBSD
 go_net_tcpsockopt_file = go/net/tcpsockopt_openbsd.go
@@ -825,7 +829,6 @@ go_net_common_files = \
        go/net/file.go \
        go/net/file_unix.go \
        go/net/hook.go \
-       go/net/hook_cloexec.go \
        go/net/hook_unix.go \
        go/net/hosts.go \
        go/net/interface.go \
@@ -1985,6 +1988,12 @@ else
 syscall_exec_test_file =
 endif
 
+if LIBGO_IS_LINUX
+syscall_os_file =
+else
+syscall_os_file = go/syscall/libcall_bsd.go
+endif
+
 go_base_syscall_files = \
        go/syscall/env_unix.go \
        go/syscall/syscall_errno.go \
@@ -2003,6 +2012,7 @@ go_base_syscall_files = \
        $(syscall_sleep_file) \
        $(syscall_errstr_file) \
        $(syscall_size_file) \
+       $(syscall_os_file) \
        $(syscall_socket_file) \
        $(syscall_socket_os_file) \
        $(syscall_socket_type_file) \
index 44175b96dbf0a1386038e80367ef2cf19e9aea81..bcfed74b9271865a41269910201248d062baae6a 100644 (file)
@@ -1089,8 +1089,9 @@ go_mime_files = \
 @LIBGO_IS_DRAGONFLY_TRUE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_FALSE@go_net_interface_file = go/net/interface_dragonfly.go
 @LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_TRUE@go_net_interface_file = go/net/interface_netbsd.go
 @LIBGO_IS_LINUX_TRUE@go_net_interface_file = go/net/interface_linux.go
-@LIBGO_IS_LINUX_FALSE@go_net_cloexec_file = go/net/sys_cloexec.go
-@LIBGO_IS_LINUX_TRUE@go_net_cloexec_file = go/net/sock_cloexec.go
+@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_LINUX_FALSE@go_net_cloexec_file = go/net/sys_cloexec.go
+@LIBGO_IS_FREEBSD_TRUE@@LIBGO_IS_LINUX_FALSE@go_net_cloexec_file = go/net/sock_cloexec.go go/net/hook_cloexec.go
+@LIBGO_IS_LINUX_TRUE@go_net_cloexec_file = go/net/sock_cloexec.go go/net/hook_cloexec.go
 @LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_DRAGONFLY_FALSE@@LIBGO_IS_OPENBSD_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_net_tcpsockopt_file = go/net/tcpsockopt_unix.go
 @LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_DRAGONFLY_TRUE@@LIBGO_IS_OPENBSD_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_net_tcpsockopt_file = go/net/tcpsockopt_dragonfly.go
 @LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_OPENBSD_FALSE@@LIBGO_IS_SOLARIS_TRUE@go_net_tcpsockopt_file = go/net/tcpsockopt_solaris.go
@@ -1111,7 +1112,6 @@ go_net_common_files = \
        go/net/file.go \
        go/net/file_unix.go \
        go/net/hook.go \
-       go/net/hook_cloexec.go \
        go/net/hook_unix.go \
        go/net/hosts.go \
        go/net/interface.go \
@@ -2076,6 +2076,8 @@ go_unicode_utf8_files = \
 @LIBGO_IS_LINUX_TRUE@syscall_creds_test_file = go/syscall/creds_test.go
 @LIBGO_IS_LINUX_FALSE@syscall_exec_test_file = 
 @LIBGO_IS_LINUX_TRUE@syscall_exec_test_file = go/syscall/exec_linux_test.go go/syscall/syscall_linux_test.go
+@LIBGO_IS_LINUX_FALSE@syscall_os_file = go/syscall/libcall_bsd.go
+@LIBGO_IS_LINUX_TRUE@syscall_os_file = 
 go_base_syscall_files = \
        go/syscall/env_unix.go \
        go/syscall/syscall_errno.go \
@@ -2094,6 +2096,7 @@ go_base_syscall_files = \
        $(syscall_sleep_file) \
        $(syscall_errstr_file) \
        $(syscall_size_file) \
+       $(syscall_os_file) \
        $(syscall_socket_file) \
        $(syscall_socket_os_file) \
        $(syscall_socket_type_file) \
index 31f5df0526f5ff1950956a82fe0d16e29ced982a..eaab6b6787b524c62b336a3c43c124e2eeeb3a07 100644 (file)
@@ -1,7 +1,9 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
+// Copyright 2013 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.
 
+// TCP socket options for solaris
+
 package net
 
 import (
@@ -10,26 +12,16 @@ import (
        "time"
 )
 
+// Set keep alive period.
 func setKeepAlivePeriod(fd *netFD, d time.Duration) error {
        if err := fd.incref(); err != nil {
                return err
        }
        defer fd.decref()
-       // The kernel expects milliseconds so round to next highest
-       // millisecond.
-       d += (time.Millisecond - time.Nanosecond)
-       msecs := int(d / time.Millisecond)
 
-       // Normally we'd do
-       //      syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_KEEPINTVL, secs)
-       // here, but we can't because Solaris does not have TCP_KEEPINTVL.
-       // Solaris has TCP_KEEPALIVE_ABORT_THRESHOLD, but it's not the same
-       // thing, it refers to the total time until aborting (not between
-       // probes), and it uses an exponential backoff algorithm instead of
-       // waiting the same time between probes. We can't hope for the best
-       // and do it anyway, like on Darwin, because Solaris might eventually
-       // allocate a constant with a different meaning for the value of
-       // TCP_KEEPINTVL on illumos.
+       // The kernel expects seconds so round to next highest second.
+       d += (time.Second - time.Nanosecond)
+       secs := int(d.Seconds())
 
-       return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_KEEPALIVE_THRESHOLD, msecs))
+       return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.SO_KEEPALIVE, secs))
 }
index f44e897f39b4a707834bdedcba9db2583f6638d5..9042ce263aae487b19114faba4be498be9794dc8 100644 (file)
@@ -102,11 +102,9 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
        }
 
        if sys.Foreground {
-               pgrp := sys.Pgid
+               pgrp := Pid_t(sys.Pgid)
                if pgrp == 0 {
-                       r1 = raw_getpid()
-
-                       pgrp = int(r1)
+                       pgrp = raw_getpid()
                }
 
                // Place process group in foreground.
index d9600a142ae6b488ef343e46de77fc7d5eaccc85..540efb3a6d8615e39e962c706f11f816fa3f8bcf 100644 (file)
@@ -171,14 +171,9 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
        }
 
        if sys.Foreground {
-               pgrp := int32(sys.Pgid)
+               pgrp := Pid_t(sys.Pgid)
                if pgrp == 0 {
-                       r1 = uintptr(raw_getpid())
-                       if err1 != 0 {
-                               goto childerror
-                       }
-
-                       pgrp = int32(r1)
+                       pgrp = raw_getpid()
                }
 
                // Place process group in foreground.
@@ -236,7 +231,7 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
                // using SIGKILL.
                r1 := raw_getppid()
                if r1 != ppid {
-                       pid = raw_getpid()
+                       pid := raw_getpid()
                        err1 = raw_kill(pid, sys.Pdeathsig)
                        if err1 != 0 {
                                goto childerror
index 218d78cf146e529ff36db9da8b2197bb83cab4d3..d1927de9b4b6d19c009fb55895b146170f01b25a 100644 (file)
@@ -17,10 +17,10 @@ import (
 //sysnb        raw_fork() (pid Pid_t, err Errno)
 //fork() Pid_t
 
-//sysnb        raw_getpid() (pid int)
+//sysnb        raw_getpid() (pid Pid_t)
 //getpid() Pid_t
 
-//sysnb        raw_getppid() (pid int)
+//sysnb        raw_getppid() (pid Pid_t)
 //getppid() Pid_t
 
 //sysnb raw_setsid() (err Errno)
@@ -59,7 +59,7 @@ import (
 //sysnb raw_dup2(oldfd int, newfd int) (err Errno)
 //dup2(oldfd _C_int, newfd _C_int) _C_int
 
-//sysnb raw_kill(pid int, sig Signal) (err Errno)
+//sysnb raw_kill(pid Pid_t, sig Signal) (err Errno)
 //kill(pid Pid_t, sig _C_int) _C_int
 
 //sysnb raw_setgroups(size int, list unsafe.Pointer) (err Errno)
index 9bb95c0f39508a9bd7bdc2761eadb8af7c66cc9a..69c4a1f1798a84c2b4e1bb031430cf0c40be8ae4 100644 (file)
@@ -169,7 +169,7 @@ func TestForeground(t *testing.T) {
                t.Skipf("Can't test Foreground. Couldn't open /dev/tty: %s", err)
        }
 
-       fpgrp := 0
+       fpgrp := syscall.Pid_t(0)
 
        errno := syscall.Ioctl(tty.Fd(), syscall.TIOCGPGRP, uintptr(unsafe.Pointer(&fpgrp)))
        if errno != 0 {
diff --git a/libgo/go/syscall/libcall_bsd.go b/libgo/go/syscall/libcall_bsd.go
new file mode 100644 (file)
index 0000000..4501f88
--- /dev/null
@@ -0,0 +1,27 @@
+// Copyright 2015 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.
+
+// BSD library calls.
+
+package syscall
+
+import "unsafe"
+
+//sys  sendfile(outfd int, infd int, offset *Offset_t, count int) (written int, err error)
+//sendfile(outfd _C_int, infd _C_int, offset *Offset_t, count Size_t) Ssize_t
+func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
+       if raceenabled {
+               raceReleaseMerge(unsafe.Pointer(&ioSync))
+       }
+       var soff Offset_t
+       var psoff *Offset_t
+       if offset != nil {
+               psoff = &soff
+       }
+       written, err = sendfile(outfd, infd, psoff, count)
+       if offset != nil {
+               *offset = int64(soff)
+       }
+       return
+}
index 534c0db94fa61f9f494671fc312a3b443a5bb4a9..691ee56582d015efc0764ec7c195073be4f84295 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <errno.h>
 #include <stdint.h>
+#include <unistd.h>
 #include <sys/types.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>