Commit 0786e1fe by Ian Lance Taylor

re PR go/67874 (fd_unix.go does not build when there is fcntl64 and no fcntl syscall)

	PR go/67874
    net, runtime: Call C library fcntl function rather than syscall.Syscall.
    
    Not all systems define a fcntl syscall; some only have fcntl64.
    
    Fixes GCC PR go/67874.
    
    Reviewed-on: https://go-review.googlesource.com/15497

From-SVN: r228576
parent 919e06d3
3039d79149901d25d89c2412bdd8684f3cbcd09e 651e71a729e5dcbd9dc14c1b59b6eff05bfe3d26
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.
...@@ -442,13 +442,21 @@ func (fd *netFD) accept() (netfd *netFD, err error) { ...@@ -442,13 +442,21 @@ func (fd *netFD) accept() (netfd *netFD, err error) {
return netfd, nil return netfd, nil
} }
// Use a helper function to call fcntl. This is defined in C in
// libgo/runtime.
//extern __go_fcntl_uintptr
func fcntl(uintptr, uintptr, uintptr) (uintptr, uintptr)
// tryDupCloexec indicates whether F_DUPFD_CLOEXEC should be used. // tryDupCloexec indicates whether F_DUPFD_CLOEXEC should be used.
// If the kernel doesn't support it, this is set to 0. // If the kernel doesn't support it, this is set to 0.
var tryDupCloexec = int32(1) var tryDupCloexec = int32(1)
func dupCloseOnExec(fd int) (newfd int, err error) { func dupCloseOnExec(fd int) (newfd int, err error) {
if atomic.LoadInt32(&tryDupCloexec) == 1 && syscall.F_DUPFD_CLOEXEC != 0 { if atomic.LoadInt32(&tryDupCloexec) == 1 && syscall.F_DUPFD_CLOEXEC != 0 {
r0, _, e1 := syscall.Syscall(syscall.SYS_FCNTL, uintptr(fd), syscall.F_DUPFD_CLOEXEC, 0) syscall.Entersyscall()
r0, errno := fcntl(uintptr(fd), syscall.F_DUPFD_CLOEXEC, 0)
syscall.Exitsyscall()
e1 := syscall.Errno(errno)
if runtime.GOOS == "darwin" && e1 == syscall.EBADF { if runtime.GOOS == "darwin" && e1 == syscall.EBADF {
// On OS X 10.6 and below (but we only support // On OS X 10.6 and below (but we only support
// >= 10.6), F_DUPFD_CLOEXEC is unsupported // >= 10.6), F_DUPFD_CLOEXEC is unsupported
......
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
#include "config.h" #include "config.h"
#include <errno.h>
#include <stdint.h>
#include <sys/types.h> #include <sys/types.h>
#include <fcntl.h> #include <fcntl.h>
...@@ -32,6 +34,28 @@ __go_fcntl_flock (int fd, int cmd, struct flock *arg) ...@@ -32,6 +34,28 @@ __go_fcntl_flock (int fd, int cmd, struct flock *arg)
return fcntl (fd, cmd, arg); return fcntl (fd, cmd, arg);
} }
// This is for the net package. We use uintptr_t to make sure that
// the types match, since the Go and C "int" types are not the same.
struct go_fcntl_ret {
uintptr_t r;
uintptr_t err;
};
struct go_fcntl_ret
__go_fcntl_uintptr (uintptr_t fd, uintptr_t cmd, uintptr_t arg)
{
int r;
struct go_fcntl_ret ret;
r = fcntl ((int) fd, (int) cmd, (int) arg);
ret.r = (uintptr_t) r;
if (r < 0)
ret.err = (uintptr_t) errno;
else
ret.err = 0;
return ret;
}
#ifdef HAVE_OPEN64 #ifdef HAVE_OPEN64
int int
......
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