mirror of
https://github.com/rwinkhart/sys.git
synced 2026-08-28 04:46:44 -04:00
unix: split Pipe/Pipe2/Dup2, use *at replacement calls
This brings over three CLs from the main syscall package: http://golang.org/cl/5833 http://golang.org/cl/5835 http://golang.org/cl/5837 Pipe, Pipe2, and Dup2 are moved from syscall_linux.go to the GOARCH specific variants. On 386 and amd64, Linux kernel version 2.6.23 (the documented minimum Linux kernel version the Go distribution supports) does not support the pipe2 system call, so Pipe continues to call pipe. On ARM, Pipe now calls pipe2. Several system calls are reimplemented in terms of the *at syscalls, passing AT_FDCWD to indicate that pathnames are to be interpreted relative to the current directory. The *at syscalls were added in Linux kernel version 2.6.16. This is in preparation for arm64 support, as the arm64 Linux kernel does not provide the traditional syscall variants. Change-Id: Id6bc6097dc5f4324cd9e429c5e1f3a411a08ce42 Reviewed-on: https://go-review.googlesource.com/10032 Reviewed-by: Rob Pike <r@golang.org>
This commit is contained in:
@@ -26,6 +26,30 @@ func NsecToTimeval(nsec int64) (tv Timeval) {
|
||||
return
|
||||
}
|
||||
|
||||
func Pipe(p []int) (err error) {
|
||||
if len(p) != 2 {
|
||||
return EINVAL
|
||||
}
|
||||
var pp [2]_C_int
|
||||
err = pipe2(&pp, 0)
|
||||
p[0] = int(pp[0])
|
||||
p[1] = int(pp[1])
|
||||
return
|
||||
}
|
||||
|
||||
//sysnb pipe2(p *[2]_C_int, flags int) (err error)
|
||||
|
||||
func Pipe2(p []int, flags int) (err error) {
|
||||
if len(p) != 2 {
|
||||
return EINVAL
|
||||
}
|
||||
var pp [2]_C_int
|
||||
err = pipe2(&pp, flags)
|
||||
p[0] = int(pp[0])
|
||||
p[1] = int(pp[1])
|
||||
return
|
||||
}
|
||||
|
||||
// Underlying system call writes to newoffset via pointer.
|
||||
// Implemented in assembly to avoid allocation.
|
||||
func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno)
|
||||
@@ -57,7 +81,7 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
|
||||
|
||||
// 64-bit file system and 32-bit uid calls
|
||||
// (16-bit uid calls are not always supported in newer kernels)
|
||||
//sys Chown(path string, uid int, gid int) (err error) = SYS_CHOWN32
|
||||
//sys Dup2(oldfd int, newfd int) (err error)
|
||||
//sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32
|
||||
//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
|
||||
//sysnb Getegid() (egid int) = SYS_GETEGID32
|
||||
|
||||
Reference in New Issue
Block a user