Message ID | yddaaih84sl.fsf@manam.CeBiTec.Uni-Bielefeld.DE |
---|---|
State | New |
Headers | show |
I believe that all of these issues have been handled. Thanks. Ian Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> writes: > Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> writes: > >> The recent merge of libgo from upstream broke bootstrap with Go on >> Solaris: unless _XOPEN_SOURCE is defined as 400 or above, struct msghdr >> has no msg_control, msg_controllen, and msg_flags members, but uses >> msg_accrights and msg_accrightslen instead. >> >> I've fixed this (and the bootstrap) like this in mksysinfo.sh: >> >> diff -r 77ad95adb9e1 libgo/mksysinfo.sh >> --- a/libgo/mksysinfo.sh Sun Jan 23 23:05:50 2011 +0100 >> +++ b/libgo/mksysinfo.sh Sun Jan 23 23:08:31 2011 +0100 >> @@ -57,7 +57,8 @@ >> #include <unistd.h> >> EOF >> >> -${CC} -D_GNU_SOURCE -fdump-go-spec=gen-sysinfo.go -S -o sysinfo.s sysinfo.c >> +#${CC} -D_GNU_SOURCE -fdump-go-spec=gen-sysinfo.go -S -o sysinfo.s sysinfo.c >> +${CC} -std=gnu99 -D_XOPEN_SOURCE=600 -D__EXTENSIONS__ -fdump-go-spec=gen-sysinfo.go -S -o sysinfo.s sysinfo.c >> >> echo 'package syscall' > ${OUT} >> >> I think we really need to introduce the target_triplet arg to >> mksysinfo.sh again which I already had in my original Solaris libgo >> patch. I really doubt that we can find macros which make those >> parts/versions of libc visible that are needed in libgo, but have no ill >> effect on other platforms. > > I see you've already fixed the problem above, and a few others I had to > work around during the weekend. > > In the meantime, I've fixed most of the remaining stuff: > >> While this restores libgo bootstrap, there are several other issues that >> need to be dealt with: >> >> * In go/time/zoneinfo_unix.go, zoneDir is /usr/share/lib/zoneinfo/ on >> Solaris, not /usr/share/zoneinfo/. Hardcoding this change fixes >> time/check, but of course this isn't appropriate. > > Already handled by you: I have a slightly different patch that iterates > over an array of strings rather than adding a second variable, but > whatever works is fine with me. > >> * We need to avoid unconditionally using -Wl,--whole-archive, which is >> only available with GNU ld (and, rarely, vendor linkers like the >> Solaris 11 ld that also implement it). > > Patch here: > > http://gcc.gnu.org/ml/gcc-patches/2011-01/msg02304.html > >> * Currently, go/os/sys_linux.go is used everywhere which doesn't work >> since only Linux has /proc/sys/kernel/hostname. I wonder what the >> best solution is, though: >> >> Solaris /bin/hostname uses sysinfo(SI_HOSTNAME), there's also >> gethostname(3C) and of course uname(2). > > While your sys_uname.go works on 64-bit Solaris 11/x86, it fails on > 32-bit: > > --- FAIL: os_test.TestHostname > Hostname() = "", want "fuego" > > syscall.Uname is entered with errno = 4 and left the same, though I > tried various ways to clear errno. Probably my insufficient > understanding of Go. > >> * There are several more functions that need largefile variants on >> 32-bit Solaris: >> >> readdir_r needs to use readdir64_r and Dirent needs to correspond to >> _dirent64 >> >> stat, fstat and lstat need to use *stat64, and Stat needs to become >> _stat64. >> >> There may be more instances, but those are the easy ones so far. I'm >> unsure where best to place those declarations: >> >> *stat might go into syscalls/sysfile_stat{regfile, largefile}.go >> >> readdir_r is currently in go/os/dir.go, but the variants obviously >> should go somewhere into syscalls. > > I've fixed this in the patch below. > > The testsuite failures are now down to > > Sun ld warning: > > target/47378 ld warning linking with libgo.so: relocation bound to a symbol with STV_PROTECTED visibility > > In DejaGnu this could simply be pruned. > > FAIL: flag > flag provided but not defined: -x > --- FAIL: flag_test.TestEverything > VisitAll misses some flags > Visit fails after set > > Cf. flag/flag.go (parseOne): BUG comment? > > FAIL: http > --- FAIL: http.TestClient > Get http://www.google.com/robots.txt: dial tcp www.google.com:http: dial udp 129.70.160.15:53: Network is unreachable > --- FAIL: http.TestClientHead > dial tcp www.google.com:http: dial udp 129.70.160.15:53: Network is unreachable > --- FAIL: http.TestRedirect > Get http://google.com/: dial tcp google.com:http: dial udp 129.70.160.15:53: Network is unreachable > > No wonder: I've been running the test without network access, so DNS > queries will fail of course. The testcase needs to handle this. > > FAIL: net > --- FAIL: net.TestDialGoogle > lookup www.google.com: dial udp 129.70.160.15:53: Network is unreachable > --- FAIL: net.TestGoogleSRV > failed: dial udp 129.70.160.15:53: Network is unreachable > no results > > Same: no net -> no DNS, from go/net/dialgoogle_test.go, need to handle > Network is unreachable error > > --- FAIL: net.TestLookupPort > LookupPort("tcp", "gopher") = 0, unknown port tcp/gopher; want 70 > LookupPort("tcp", "http") = 0, unknown port tcp/http; want 80 > > Not in Solaris 11 /etc/services, from go/net/port_test.go. > > FAIL: netchan > 2011/01/29 22:45:08 netchan export: error decoding client header:EOF > --- FAIL: netchan.TestErrorForIllegalChannel > new importer: dial tcp 127.0.0.1:61752: Interrupted system call > > Strange, works if run individually, perhaps errno uninitialized, same as > TestHostname? > > FAIL: os > --- FAIL: os_test.TestChdirAndGetwd > Getwd returned "/usr/bin" want "/bin" > > Expected: /bin is a symlink on Solaris. > > --- FAIL: os_test.TestHostname > Hostname() = "", want "fuego" > > See above > > FAIL: syslog > --- FAIL: syslog.TestDial > Dial() failed: Unix syslog delivery error > --- FAIL: syslog.TestNew > New() failed: Unix syslog delivery error > --- FAIL: syslog.TestNewLogger > NewLogger() failed > > Solaris syslog uses a STREAMS device (/dev/conslog) and putmsg(2) for > communication with syslogd, not /dev/log. I wonder how best to handle > this, since this is most likely not a public interface, though one can > study the implementation in the OpenSoalaris sources. It might be better > to simply use the libc openlog/syslog/closelog functions instead of > reimplementing them in Go. > > 64-bit only: > > /bin/ksh: line 1: 23137: Abort > FAIL: websocket > 2011/01/29 22:47:53 Test WebSocket server listening on 127.0.0.1:32824 > panic: Dial failed: websocket.Dial ws://127.0.0.1:32824/echo: dial tcp 127.0.0.1:32824: Interrupted system call > /vol/gcc/src/hg/trunk/solaris/libgo/testsuite/gotest: line 316: 23205: Abort > make: *** [websocket/check] Error 1 > > Same as above: PASSes if run individually. > > The following patch has been tested on i386-pc-solaris2.11, but before > your recent patches and with a couple of other workarounds which > shouldn't be necessary anymore. > > Ok for mainline? > > Rainer > > > 2011-01-30 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> > > * go/os/dir.go (libc_readdir_r): Move ... > * go/os/dir_regfile.go: ... here. New file. > * go/os/dir_largefile.go: New file. > * mksysinfo.sh: Handle _dirent64, Solaris 2 d_name. > * Makefile.am (go_os_dir_file): New variable. > (go_os_files): Use it. > > * syscalls/sysfile_posix.go (libc_stat, libc_fstat, libc_lstat): > Move ... > * syscalls/sysfile_stat_regfile.go: ... here. New file. > * syscalls/sysfile_stat_largefile.go: New file. > * mksysinfo.sh: Handle _stat64. > * Makefile.am (syscall_stat_file): New variable. > (go_syscall_files): Use it. > * Makefile.in: Regenerate. > > * configure.ac: Check for <sys/syscall.h>. > * mksysinfo.sh (sysinfo.c) [HAVE_SYS_SYSCALL_H]: Include > <sys/syscall.h>. > * configure: Regenerate. > * config.h.in: Regenerate. > > diff -r 1364b9899eed libgo/Makefile.am > --- a/libgo/Makefile.am Sun Jan 30 12:31:01 2011 +0100 > +++ b/libgo/Makefile.am Sun Jan 30 22:58:03 2011 +0100 > @@ -1,6 +1,6 @@ > # Makefile.am -- Go library Makefile. > > -# Copyright 2009 The Go Authors. All rights reserved. > +# Copyright 2009, 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. > > @@ -657,6 +657,16 @@ > go/netchan/export.go \ > go/netchan/import.go > > +if LIBGO_IS_SOLARIS > +if LIBGO_IS_386 > +go_os_dir_file = go/os/dir_largefile.go > +else > +go_os_dir_file = go/os/dir_regfile.go > +endif > +else > +go_os_dir_file = go/os/dir_regfile.go > +endif > + > if LIBGO_IS_LINUX > go_os_sys_file = go/os/sys_linux.go > else > @@ -672,6 +682,7 @@ > endif > > go_os_files = \ > + $(go_os_dir_file) \ > go/os/dir.go \ > go/os/env.go \ > go/os/env_unix.go \ > @@ -1111,18 +1122,23 @@ > if LIBGO_IS_LINUX > # Always use lseek64 on GNU/Linux. > syscall_filesize_file = syscalls/sysfile_largefile.go > +syscall_stat_file = syscalls/sysfile_stat_regfile.go > else # !LIBGO_IS_LINUX > if LIBGO_IS_SOLARIS > +# FIXME: Same for sparc vs. sparc64. Introduce new/additional conditional? > if LIBGO_IS_386 > # Use lseek64 on 386 Solaris. > syscall_filesize_file = syscalls/sysfile_largefile.go > +syscall_stat_file = syscalls/sysfile_stat_largefile.go > else # !LIBGO_IS_LINUX && LIBGO_IS_SOLARIS && !LIBGO_IS_386 > # Use lseek on amd64 Solaris. > syscall_filesize_file = syscalls/sysfile_regfile.go > +syscall_stat_file = syscalls/sysfile_stat_regfile.go > endif # !LIBGO_IS_386 > else # !LIBGO_IS_LINUX && !LIBGO_IS_SOLARIS > # Use lseek by default. > syscall_filesize_file = syscalls/sysfile_regfile.go > +syscall_stat_file = syscalls/sysfile_stat_regfile.go > endif # !LIBGO_IS_SOLARIS > endif # !LIBGO_IS_LINUX > > @@ -1195,6 +1211,7 @@ > syscalls/exec_helpers.go \ > $(syscall_exec_os_file) \ > $(syscall_filesize_file) \ > + $(syscall_stat_file) \ > $(syscall_sleep_file) \ > syscalls/socket.go \ > $(syscall_socket_os_file) \ > diff -r 1364b9899eed libgo/configure.ac > --- a/libgo/configure.ac Sun Jan 30 12:31:01 2011 +0100 > +++ b/libgo/configure.ac Sun Jan 30 22:58:03 2011 +0100 > @@ -1,6 +1,6 @@ > # configure.ac -- Go library configure script. > > -# Copyright 2009 The Go Authors. All rights reserved. > +# Copyright 2009, 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. > > @@ -328,7 +328,7 @@ > > GCC_CHECK_UNWIND_GETIPINFO > > -AC_CHECK_HEADERS(sys/mman.h syscall.h sys/epoll.h sys/ptrace.h sys/user.h sys/utsname.h) > +AC_CHECK_HEADERS(sys/mman.h syscall.h sys/epoll.h sys/ptrace.h sys/syscall.h sys/user.h sys/utsname.h) > AM_CONDITIONAL(HAVE_SYS_MMAN_H, test "$ac_cv_header_sys_mman_h" = yes) > AC_CHECK_FUNCS(srandom random strsignal) > > diff -r 1364b9899eed libgo/go/os/dir.go > --- a/libgo/go/os/dir.go Sun Jan 30 12:31:01 2011 +0100 > +++ b/libgo/go/os/dir.go Sun Jan 30 22:58:03 2011 +0100 > @@ -1,4 +1,4 @@ > -// Copyright 2009 The Go Authors. All rights reserved. > +// Copyright 2009, 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. > > @@ -11,7 +11,6 @@ > > func libc_dup(fd int) int __asm__ ("dup") > func libc_opendir(*byte) *syscall.DIR __asm__ ("opendir") > -func libc_readdir_r(*syscall.DIR, *syscall.Dirent, **syscall.Dirent) int __asm__ ("readdir_r") > func libc_closedir(*syscall.DIR) int __asm__ ("closedir") > > // FIXME: pathconf returns long, not int. > diff -r 1364b9899eed libgo/go/os/dir_largefile.go > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/libgo/go/os/dir_largefile.go Sun Jan 30 22:58:03 2011 +0100 > @@ -0,0 +1,12 @@ > +// dir_largefile.go -- For systems which use the large file interface for > +// readdir_r. > + > +// 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. > + > +package os > + > +import "syscall" > + > +func libc_readdir_r(*syscall.DIR, *syscall.Dirent, **syscall.Dirent) int __asm__ ("readdir64_r") > diff -r 1364b9899eed libgo/go/os/dir_regfile.go > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/libgo/go/os/dir_regfile.go Sun Jan 30 22:58:03 2011 +0100 > @@ -0,0 +1,12 @@ > +// dir_regfile.go -- For systems which do not use the large file interface > +// for readdir_r. > + > +// 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. > + > +package os > + > +import "syscall" > + > +func libc_readdir_r(*syscall.DIR, *syscall.Dirent, **syscall.Dirent) int __asm__ ("readdir_r") > diff -r 1364b9899eed libgo/mksysinfo.sh > --- a/libgo/mksysinfo.sh Sun Jan 30 12:31:01 2011 +0100 > +++ b/libgo/mksysinfo.sh Sun Jan 30 22:58:03 2011 +0100 > @@ -1,6 +1,6 @@ > #!/bin/sh > > -# Copyright 2009 The Go Authors. All rights reserved. > +# Copyright 2009, 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. > > @@ -42,6 +45,9 @@ > #if defined(HAVE_SYSCALL_H) > #include <syscall.h> > #endif > +#if defined(HAVE_SYS_SYSCALL_H) > +#include <sys/syscall.h> > +#endif > #if defined(HAVE_SYS_EPOLL_H) > #include <sys/epoll.h> > #endif > @@ -306,36 +317,47 @@ > fi > > # The stat type. > -grep 'type _stat ' gen-sysinfo.go | \ > - sed -e 's/type _stat/type Stat_t/' \ > - -e 's/st_dev/Dev/' \ > - -e 's/st_ino/Ino/' \ > - -e 's/st_nlink/Nlink/' \ > - -e 's/st_mode/Mode/' \ > - -e 's/st_uid/Uid/' \ > - -e 's/st_gid/Gid/' \ > - -e 's/st_rdev/Rdev/' \ > - -e 's/st_size/Size/' \ > - -e 's/st_blksize/Blksize/' \ > - -e 's/st_blocks/Blocks/' \ > - -e 's/st_atim/Atime/' \ > - -e 's/st_mtim/Mtime/' \ > - -e 's/st_ctim/Ctime/' \ > - -e 's/\([^a-zA-Z0-9_]\)_timeval\([^a-zA-Z0-9_]\)/\1Timeval\2/g' \ > - -e 's/\([^a-zA-Z0-9_]\)_timespec\([^a-zA-Z0-9_]\)/\1Timespec\2/g' \ > - -e 's/\([^a-zA-Z0-9_]\)_timestruc_t\([^a-zA-Z0-9_]\)/\1Timestruc\2/g' \ > - >> ${OUT} > +# Prefer largefile variant if available. > +stat=`grep '^type _stat64 ' gen-sysinfo.go` > +if test "$stat" != ""; then > + grep '^type _stat64 ' gen-sysinfo.go > +else > + grep '^type _stat ' gen-sysinfo.go > +fi | sed -e 's/type _stat\(64\)\?/type Stat_t/' \ > + -e 's/st_dev/Dev/' \ > + -e 's/st_ino/Ino/' \ > + -e 's/st_nlink/Nlink/' \ > + -e 's/st_mode/Mode/' \ > + -e 's/st_uid/Uid/' \ > + -e 's/st_gid/Gid/' \ > + -e 's/st_rdev/Rdev/' \ > + -e 's/st_size/Size/' \ > + -e 's/st_blksize/Blksize/' \ > + -e 's/st_blocks/Blocks/' \ > + -e 's/st_atim/Atime/' \ > + -e 's/st_mtim/Mtime/' \ > + -e 's/st_ctim/Ctime/' \ > + -e 's/\([^a-zA-Z0-9_]\)_timeval\([^a-zA-Z0-9_]\)/\1Timeval\2/g' \ > + -e 's/\([^a-zA-Z0-9_]\)_timespec\([^a-zA-Z0-9_]\)/\1Timespec\2/g' \ > + -e 's/\([^a-zA-Z0-9_]\)_timestruc_t\([^a-zA-Z0-9_]\)/\1Timestruc\2/g' \ > + >> ${OUT} > > # The directory searching types. > -grep '^type _dirent ' gen-sysinfo.go | \ > - sed -e 's/type _dirent/type Dirent/' \ > - -e 's/d_name/Name/' \ > - -e 's/]int8/]byte/' \ > - -e 's/d_ino/Ino/' \ > - -e 's/d_off/Off/' \ > - -e 's/d_reclen/Reclen/' \ > - -e 's/d_type/Type/' \ > - >> ${OUT} > +# Prefer largefile variant if available. > +dirent=`grep '^type _dirent64 ' gen-sysinfo.go` > +if test "$dirent" != ""; then > + grep '^type _dirent64 ' gen-sysinfo.go > +else > + grep '^type _dirent ' gen-sysinfo.go > +fi | sed -e 's/type _dirent\(64\)\?/type Dirent/' \ > + -e 's/d_name \[0+1\]/d_name [0+256]/' \ > + -e 's/d_name/Name/' \ > + -e 's/]int8/]byte/' \ > + -e 's/d_ino/Ino/' \ > + -e 's/d_off/Off/' \ > + -e 's/d_reclen/Reclen/' \ > + -e 's/d_type/Type/' \ > + >> ${OUT} > echo "type DIR _DIR" >> ${OUT} > > # The rusage struct. > diff -r 1364b9899eed libgo/syscalls/sysfile_posix.go > --- a/libgo/syscalls/sysfile_posix.go Sun Jan 30 12:31:01 2011 +0100 > +++ b/libgo/syscalls/sysfile_posix.go Sun Jan 30 22:58:03 2011 +0100 > @@ -1,6 +1,6 @@ > // sysfile_posix.go -- POSIX File handling. > > -// Copyright 2010 The Go Authors. All rights reserved. > +// Copyright 2010, 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. > > @@ -18,9 +18,6 @@ > func libc_write(fd int, buf *byte, count Size_t) Ssize_t __asm__ ("write"); > func libc_fsync(fd int) int __asm__ ("fsync") > func libc_pipe(filedes *int) int __asm__("pipe"); > -func libc_stat(name *byte, buf *Stat_t) int __asm__ ("stat"); > -func libc_fstat(fd int, buf *Stat_t) int __asm__ ("fstat"); > -func libc_lstat(name *byte, buf *Stat_t) int __asm__ ("lstat"); > func libc_unlink(name *byte) int __asm__ ("unlink"); > func libc_rmdir(name *byte) int __asm__ ("rmdir"); > func libc_fcntl(fd int, cmd int, arg int) int __asm__ ("fcntl"); > diff -r 1364b9899eed libgo/syscalls/sysfile_stat_largefile.go > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/libgo/syscalls/sysfile_stat_largefile.go Sun Jan 30 22:58:03 2011 +0100 > @@ -0,0 +1,12 @@ > +// sysfile_stat_largefile.go -- For systems which use the large file interface > +// for *stat. > + > +// 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. > + > +package syscall > + > +func libc_stat(name *byte, buf *Stat_t) int __asm__ ("stat64"); > +func libc_fstat(fd int, buf *Stat_t) int __asm__ ("fstat64"); > +func libc_lstat(name *byte, buf *Stat_t) int __asm__ ("lstat64"); > diff -r 1364b9899eed libgo/syscalls/sysfile_stat_regfile.go > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/libgo/syscalls/sysfile_stat_regfile.go Sun Jan 30 22:58:03 2011 +0100 > @@ -0,0 +1,12 @@ > +// sysfile_stat_regfile.go -- For systems which do not use the large file > +// interface for *stat. > + > +// 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. > + > +package syscall > + > +func libc_stat(name *byte, buf *Stat_t) int __asm__ ("stat"); > +func libc_fstat(fd int, buf *Stat_t) int __asm__ ("fstat"); > +func libc_lstat(name *byte, buf *Stat_t) int __asm__ ("lstat");
diff -r 1364b9899eed libgo/Makefile.am --- a/libgo/Makefile.am Sun Jan 30 12:31:01 2011 +0100 +++ b/libgo/Makefile.am Sun Jan 30 22:58:03 2011 +0100 @@ -1,6 +1,6 @@ # Makefile.am -- Go library Makefile. -# Copyright 2009 The Go Authors. All rights reserved. +# Copyright 2009, 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. @@ -657,6 +657,16 @@ go/netchan/export.go \ go/netchan/import.go +if LIBGO_IS_SOLARIS +if LIBGO_IS_386 +go_os_dir_file = go/os/dir_largefile.go +else +go_os_dir_file = go/os/dir_regfile.go +endif +else +go_os_dir_file = go/os/dir_regfile.go +endif + if LIBGO_IS_LINUX go_os_sys_file = go/os/sys_linux.go else @@ -672,6 +682,7 @@ endif go_os_files = \ + $(go_os_dir_file) \ go/os/dir.go \ go/os/env.go \ go/os/env_unix.go \ @@ -1111,18 +1122,23 @@ if LIBGO_IS_LINUX # Always use lseek64 on GNU/Linux. syscall_filesize_file = syscalls/sysfile_largefile.go +syscall_stat_file = syscalls/sysfile_stat_regfile.go else # !LIBGO_IS_LINUX if LIBGO_IS_SOLARIS +# FIXME: Same for sparc vs. sparc64. Introduce new/additional conditional? if LIBGO_IS_386 # Use lseek64 on 386 Solaris. syscall_filesize_file = syscalls/sysfile_largefile.go +syscall_stat_file = syscalls/sysfile_stat_largefile.go else # !LIBGO_IS_LINUX && LIBGO_IS_SOLARIS && !LIBGO_IS_386 # Use lseek on amd64 Solaris. syscall_filesize_file = syscalls/sysfile_regfile.go +syscall_stat_file = syscalls/sysfile_stat_regfile.go endif # !LIBGO_IS_386 else # !LIBGO_IS_LINUX && !LIBGO_IS_SOLARIS # Use lseek by default. syscall_filesize_file = syscalls/sysfile_regfile.go +syscall_stat_file = syscalls/sysfile_stat_regfile.go endif # !LIBGO_IS_SOLARIS endif # !LIBGO_IS_LINUX @@ -1195,6 +1211,7 @@ syscalls/exec_helpers.go \ $(syscall_exec_os_file) \ $(syscall_filesize_file) \ + $(syscall_stat_file) \ $(syscall_sleep_file) \ syscalls/socket.go \ $(syscall_socket_os_file) \ diff -r 1364b9899eed libgo/configure.ac --- a/libgo/configure.ac Sun Jan 30 12:31:01 2011 +0100 +++ b/libgo/configure.ac Sun Jan 30 22:58:03 2011 +0100 @@ -1,6 +1,6 @@ # configure.ac -- Go library configure script. -# Copyright 2009 The Go Authors. All rights reserved. +# Copyright 2009, 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. @@ -328,7 +328,7 @@ GCC_CHECK_UNWIND_GETIPINFO -AC_CHECK_HEADERS(sys/mman.h syscall.h sys/epoll.h sys/ptrace.h sys/user.h sys/utsname.h) +AC_CHECK_HEADERS(sys/mman.h syscall.h sys/epoll.h sys/ptrace.h sys/syscall.h sys/user.h sys/utsname.h) AM_CONDITIONAL(HAVE_SYS_MMAN_H, test "$ac_cv_header_sys_mman_h" = yes) AC_CHECK_FUNCS(srandom random strsignal) diff -r 1364b9899eed libgo/go/os/dir.go --- a/libgo/go/os/dir.go Sun Jan 30 12:31:01 2011 +0100 +++ b/libgo/go/os/dir.go Sun Jan 30 22:58:03 2011 +0100 @@ -1,4 +1,4 @@ -// Copyright 2009 The Go Authors. All rights reserved. +// Copyright 2009, 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. @@ -11,7 +11,6 @@ func libc_dup(fd int) int __asm__ ("dup") func libc_opendir(*byte) *syscall.DIR __asm__ ("opendir") -func libc_readdir_r(*syscall.DIR, *syscall.Dirent, **syscall.Dirent) int __asm__ ("readdir_r") func libc_closedir(*syscall.DIR) int __asm__ ("closedir") // FIXME: pathconf returns long, not int. diff -r 1364b9899eed libgo/go/os/dir_largefile.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libgo/go/os/dir_largefile.go Sun Jan 30 22:58:03 2011 +0100 @@ -0,0 +1,12 @@ +// dir_largefile.go -- For systems which use the large file interface for +// readdir_r. + +// 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. + +package os + +import "syscall" + +func libc_readdir_r(*syscall.DIR, *syscall.Dirent, **syscall.Dirent) int __asm__ ("readdir64_r") diff -r 1364b9899eed libgo/go/os/dir_regfile.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libgo/go/os/dir_regfile.go Sun Jan 30 22:58:03 2011 +0100 @@ -0,0 +1,12 @@ +// dir_regfile.go -- For systems which do not use the large file interface +// for readdir_r. + +// 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. + +package os + +import "syscall" + +func libc_readdir_r(*syscall.DIR, *syscall.Dirent, **syscall.Dirent) int __asm__ ("readdir_r") diff -r 1364b9899eed libgo/mksysinfo.sh --- a/libgo/mksysinfo.sh Sun Jan 30 12:31:01 2011 +0100 +++ b/libgo/mksysinfo.sh Sun Jan 30 22:58:03 2011 +0100 @@ -1,6 +1,6 @@ #!/bin/sh -# Copyright 2009 The Go Authors. All rights reserved. +# Copyright 2009, 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. @@ -42,6 +45,9 @@ #if defined(HAVE_SYSCALL_H) #include <syscall.h> #endif +#if defined(HAVE_SYS_SYSCALL_H) +#include <sys/syscall.h> +#endif #if defined(HAVE_SYS_EPOLL_H) #include <sys/epoll.h> #endif @@ -306,36 +317,47 @@ fi # The stat type. -grep 'type _stat ' gen-sysinfo.go | \ - sed -e 's/type _stat/type Stat_t/' \ - -e 's/st_dev/Dev/' \ - -e 's/st_ino/Ino/' \ - -e 's/st_nlink/Nlink/' \ - -e 's/st_mode/Mode/' \ - -e 's/st_uid/Uid/' \ - -e 's/st_gid/Gid/' \ - -e 's/st_rdev/Rdev/' \ - -e 's/st_size/Size/' \ - -e 's/st_blksize/Blksize/' \ - -e 's/st_blocks/Blocks/' \ - -e 's/st_atim/Atime/' \ - -e 's/st_mtim/Mtime/' \ - -e 's/st_ctim/Ctime/' \ - -e 's/\([^a-zA-Z0-9_]\)_timeval\([^a-zA-Z0-9_]\)/\1Timeval\2/g' \ - -e 's/\([^a-zA-Z0-9_]\)_timespec\([^a-zA-Z0-9_]\)/\1Timespec\2/g' \ - -e 's/\([^a-zA-Z0-9_]\)_timestruc_t\([^a-zA-Z0-9_]\)/\1Timestruc\2/g' \ - >> ${OUT} +# Prefer largefile variant if available. +stat=`grep '^type _stat64 ' gen-sysinfo.go` +if test "$stat" != ""; then + grep '^type _stat64 ' gen-sysinfo.go +else + grep '^type _stat ' gen-sysinfo.go +fi | sed -e 's/type _stat\(64\)\?/type Stat_t/' \ + -e 's/st_dev/Dev/' \ + -e 's/st_ino/Ino/' \ + -e 's/st_nlink/Nlink/' \ + -e 's/st_mode/Mode/' \ + -e 's/st_uid/Uid/' \ + -e 's/st_gid/Gid/' \ + -e 's/st_rdev/Rdev/' \ + -e 's/st_size/Size/' \ + -e 's/st_blksize/Blksize/' \ + -e 's/st_blocks/Blocks/' \ + -e 's/st_atim/Atime/' \ + -e 's/st_mtim/Mtime/' \ + -e 's/st_ctim/Ctime/' \ + -e 's/\([^a-zA-Z0-9_]\)_timeval\([^a-zA-Z0-9_]\)/\1Timeval\2/g' \ + -e 's/\([^a-zA-Z0-9_]\)_timespec\([^a-zA-Z0-9_]\)/\1Timespec\2/g' \ + -e 's/\([^a-zA-Z0-9_]\)_timestruc_t\([^a-zA-Z0-9_]\)/\1Timestruc\2/g' \ + >> ${OUT} # The directory searching types. -grep '^type _dirent ' gen-sysinfo.go | \ - sed -e 's/type _dirent/type Dirent/' \ - -e 's/d_name/Name/' \ - -e 's/]int8/]byte/' \ - -e 's/d_ino/Ino/' \ - -e 's/d_off/Off/' \ - -e 's/d_reclen/Reclen/' \ - -e 's/d_type/Type/' \ - >> ${OUT} +# Prefer largefile variant if available. +dirent=`grep '^type _dirent64 ' gen-sysinfo.go` +if test "$dirent" != ""; then + grep '^type _dirent64 ' gen-sysinfo.go +else + grep '^type _dirent ' gen-sysinfo.go +fi | sed -e 's/type _dirent\(64\)\?/type Dirent/' \ + -e 's/d_name \[0+1\]/d_name [0+256]/' \ + -e 's/d_name/Name/' \ + -e 's/]int8/]byte/' \ + -e 's/d_ino/Ino/' \ + -e 's/d_off/Off/' \ + -e 's/d_reclen/Reclen/' \ + -e 's/d_type/Type/' \ + >> ${OUT} echo "type DIR _DIR" >> ${OUT} # The rusage struct. diff -r 1364b9899eed libgo/syscalls/sysfile_posix.go --- a/libgo/syscalls/sysfile_posix.go Sun Jan 30 12:31:01 2011 +0100 +++ b/libgo/syscalls/sysfile_posix.go Sun Jan 30 22:58:03 2011 +0100 @@ -1,6 +1,6 @@ // sysfile_posix.go -- POSIX File handling. -// Copyright 2010 The Go Authors. All rights reserved. +// Copyright 2010, 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. @@ -18,9 +18,6 @@ func libc_write(fd int, buf *byte, count Size_t) Ssize_t __asm__ ("write"); func libc_fsync(fd int) int __asm__ ("fsync") func libc_pipe(filedes *int) int __asm__("pipe"); -func libc_stat(name *byte, buf *Stat_t) int __asm__ ("stat"); -func libc_fstat(fd int, buf *Stat_t) int __asm__ ("fstat"); -func libc_lstat(name *byte, buf *Stat_t) int __asm__ ("lstat"); func libc_unlink(name *byte) int __asm__ ("unlink"); func libc_rmdir(name *byte) int __asm__ ("rmdir"); func libc_fcntl(fd int, cmd int, arg int) int __asm__ ("fcntl"); diff -r 1364b9899eed libgo/syscalls/sysfile_stat_largefile.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libgo/syscalls/sysfile_stat_largefile.go Sun Jan 30 22:58:03 2011 +0100 @@ -0,0 +1,12 @@ +// sysfile_stat_largefile.go -- For systems which use the large file interface +// for *stat. + +// 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. + +package syscall + +func libc_stat(name *byte, buf *Stat_t) int __asm__ ("stat64"); +func libc_fstat(fd int, buf *Stat_t) int __asm__ ("fstat64"); +func libc_lstat(name *byte, buf *Stat_t) int __asm__ ("lstat64"); diff -r 1364b9899eed libgo/syscalls/sysfile_stat_regfile.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libgo/syscalls/sysfile_stat_regfile.go Sun Jan 30 22:58:03 2011 +0100 @@ -0,0 +1,12 @@ +// sysfile_stat_regfile.go -- For systems which do not use the large file +// interface for *stat. + +// 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. + +package syscall + +func libc_stat(name *byte, buf *Stat_t) int __asm__ ("stat"); +func libc_fstat(fd int, buf *Stat_t) int __asm__ ("fstat"); +func libc_lstat(name *byte, buf *Stat_t) int __asm__ ("lstat");