Commit 9da92cbd by Ian Lance Taylor

libgo: Solaris portability fixes.

    
    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
parent e78d485e
47f256e1ed527b2eb4041acf90d33e6abc5e1685 10c1d6756ed1dcc814c49921c2a5e27f4677e0e6
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -787,10 +787,14 @@ endif ...@@ -787,10 +787,14 @@ endif
endif endif
if LIBGO_IS_LINUX 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 else
go_net_cloexec_file = go/net/sys_cloexec.go go_net_cloexec_file = go/net/sys_cloexec.go
endif endif
endif
if LIBGO_IS_OPENBSD if LIBGO_IS_OPENBSD
go_net_tcpsockopt_file = go/net/tcpsockopt_openbsd.go go_net_tcpsockopt_file = go/net/tcpsockopt_openbsd.go
...@@ -825,7 +829,6 @@ go_net_common_files = \ ...@@ -825,7 +829,6 @@ go_net_common_files = \
go/net/file.go \ go/net/file.go \
go/net/file_unix.go \ go/net/file_unix.go \
go/net/hook.go \ go/net/hook.go \
go/net/hook_cloexec.go \
go/net/hook_unix.go \ go/net/hook_unix.go \
go/net/hosts.go \ go/net/hosts.go \
go/net/interface.go \ go/net/interface.go \
...@@ -1985,6 +1988,12 @@ else ...@@ -1985,6 +1988,12 @@ else
syscall_exec_test_file = syscall_exec_test_file =
endif endif
if LIBGO_IS_LINUX
syscall_os_file =
else
syscall_os_file = go/syscall/libcall_bsd.go
endif
go_base_syscall_files = \ go_base_syscall_files = \
go/syscall/env_unix.go \ go/syscall/env_unix.go \
go/syscall/syscall_errno.go \ go/syscall/syscall_errno.go \
...@@ -2003,6 +2012,7 @@ go_base_syscall_files = \ ...@@ -2003,6 +2012,7 @@ go_base_syscall_files = \
$(syscall_sleep_file) \ $(syscall_sleep_file) \
$(syscall_errstr_file) \ $(syscall_errstr_file) \
$(syscall_size_file) \ $(syscall_size_file) \
$(syscall_os_file) \
$(syscall_socket_file) \ $(syscall_socket_file) \
$(syscall_socket_os_file) \ $(syscall_socket_os_file) \
$(syscall_socket_type_file) \ $(syscall_socket_type_file) \
......
...@@ -1089,8 +1089,9 @@ go_mime_files = \ ...@@ -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_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_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_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_FREEBSD_FALSE@@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_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_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_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 @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 = \ ...@@ -1111,7 +1112,6 @@ go_net_common_files = \
go/net/file.go \ go/net/file.go \
go/net/file_unix.go \ go/net/file_unix.go \
go/net/hook.go \ go/net/hook.go \
go/net/hook_cloexec.go \
go/net/hook_unix.go \ go/net/hook_unix.go \
go/net/hosts.go \ go/net/hosts.go \
go/net/interface.go \ go/net/interface.go \
...@@ -2076,6 +2076,8 @@ go_unicode_utf8_files = \ ...@@ -2076,6 +2076,8 @@ go_unicode_utf8_files = \
@LIBGO_IS_LINUX_TRUE@syscall_creds_test_file = go/syscall/creds_test.go @LIBGO_IS_LINUX_TRUE@syscall_creds_test_file = go/syscall/creds_test.go
@LIBGO_IS_LINUX_FALSE@syscall_exec_test_file = @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_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_base_syscall_files = \
go/syscall/env_unix.go \ go/syscall/env_unix.go \
go/syscall/syscall_errno.go \ go/syscall/syscall_errno.go \
...@@ -2094,6 +2096,7 @@ go_base_syscall_files = \ ...@@ -2094,6 +2096,7 @@ go_base_syscall_files = \
$(syscall_sleep_file) \ $(syscall_sleep_file) \
$(syscall_errstr_file) \ $(syscall_errstr_file) \
$(syscall_size_file) \ $(syscall_size_file) \
$(syscall_os_file) \
$(syscall_socket_file) \ $(syscall_socket_file) \
$(syscall_socket_os_file) \ $(syscall_socket_os_file) \
$(syscall_socket_type_file) \ $(syscall_socket_type_file) \
......
// 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 // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// TCP socket options for solaris
package net package net
import ( import (
...@@ -10,26 +12,16 @@ import ( ...@@ -10,26 +12,16 @@ import (
"time" "time"
) )
// Set keep alive period.
func setKeepAlivePeriod(fd *netFD, d time.Duration) error { func setKeepAlivePeriod(fd *netFD, d time.Duration) error {
if err := fd.incref(); err != nil { if err := fd.incref(); err != nil {
return err return err
} }
defer fd.decref() 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 // The kernel expects seconds so round to next highest second.
// syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_KEEPINTVL, secs) d += (time.Second - time.Nanosecond)
// here, but we can't because Solaris does not have TCP_KEEPINTVL. secs := int(d.Seconds())
// 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.
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))
} }
...@@ -102,11 +102,9 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr ...@@ -102,11 +102,9 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
} }
if sys.Foreground { if sys.Foreground {
pgrp := sys.Pgid pgrp := Pid_t(sys.Pgid)
if pgrp == 0 { if pgrp == 0 {
r1 = raw_getpid() pgrp = raw_getpid()
pgrp = int(r1)
} }
// Place process group in foreground. // Place process group in foreground.
......
...@@ -171,14 +171,9 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr ...@@ -171,14 +171,9 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
} }
if sys.Foreground { if sys.Foreground {
pgrp := int32(sys.Pgid) pgrp := Pid_t(sys.Pgid)
if pgrp == 0 { if pgrp == 0 {
r1 = uintptr(raw_getpid()) pgrp = raw_getpid()
if err1 != 0 {
goto childerror
}
pgrp = int32(r1)
} }
// Place process group in foreground. // Place process group in foreground.
...@@ -236,7 +231,7 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr ...@@ -236,7 +231,7 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
// using SIGKILL. // using SIGKILL.
r1 := raw_getppid() r1 := raw_getppid()
if r1 != ppid { if r1 != ppid {
pid = raw_getpid() pid := raw_getpid()
err1 = raw_kill(pid, sys.Pdeathsig) err1 = raw_kill(pid, sys.Pdeathsig)
if err1 != 0 { if err1 != 0 {
goto childerror goto childerror
......
...@@ -17,10 +17,10 @@ import ( ...@@ -17,10 +17,10 @@ import (
//sysnb raw_fork() (pid Pid_t, err Errno) //sysnb raw_fork() (pid Pid_t, err Errno)
//fork() Pid_t //fork() Pid_t
//sysnb raw_getpid() (pid int) //sysnb raw_getpid() (pid Pid_t)
//getpid() Pid_t //getpid() Pid_t
//sysnb raw_getppid() (pid int) //sysnb raw_getppid() (pid Pid_t)
//getppid() Pid_t //getppid() Pid_t
//sysnb raw_setsid() (err Errno) //sysnb raw_setsid() (err Errno)
...@@ -59,7 +59,7 @@ import ( ...@@ -59,7 +59,7 @@ import (
//sysnb raw_dup2(oldfd int, newfd int) (err Errno) //sysnb raw_dup2(oldfd int, newfd int) (err Errno)
//dup2(oldfd _C_int, newfd _C_int) _C_int //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 //kill(pid Pid_t, sig _C_int) _C_int
//sysnb raw_setgroups(size int, list unsafe.Pointer) (err Errno) //sysnb raw_setgroups(size int, list unsafe.Pointer) (err Errno)
......
...@@ -169,7 +169,7 @@ func TestForeground(t *testing.T) { ...@@ -169,7 +169,7 @@ func TestForeground(t *testing.T) {
t.Skipf("Can't test Foreground. Couldn't open /dev/tty: %s", err) 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))) errno := syscall.Ioctl(tty.Fd(), syscall.TIOCGPGRP, uintptr(unsafe.Pointer(&fpgrp)))
if errno != 0 { if errno != 0 {
......
// 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
}
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <errno.h> #include <errno.h>
#include <stdint.h> #include <stdint.h>
#include <unistd.h>
#include <sys/types.h> #include <sys/types.h>
#include <fcntl.h> #include <fcntl.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment