diff mbox

Fix remaining libgo testsuite failures on Solaris 2

Message ID yddaaih84sl.fsf@manam.CeBiTec.Uni-Bielefeld.DE
State New
Headers show

Commit Message

Rainer Orth Jan. 31, 2011, 3:35 p.m. UTC
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.

Comments

Ian Lance Taylor March 31, 2011, 11:10 p.m. UTC | #1
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 mbox

Patch

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");