@ -0,0 +1,124 @@ | |||||
// Copyright 2018 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. | |||||
// CPU affinity functions | |||||
package unix | |||||
import ( | |||||
"unsafe" | |||||
) | |||||
const cpuSetSize = _CPU_SETSIZE / _NCPUBITS | |||||
// CPUSet represents a CPU affinity mask. | |||||
type CPUSet [cpuSetSize]cpuMask | |||||
func schedAffinity(trap uintptr, pid int, set *CPUSet) error { | |||||
_, _, e := RawSyscall(trap, uintptr(pid), uintptr(unsafe.Sizeof(*set)), uintptr(unsafe.Pointer(set))) | |||||
if e != 0 { | |||||
return errnoErr(e) | |||||
} | |||||
return nil | |||||
} | |||||
// SchedGetaffinity gets the CPU affinity mask of the thread specified by pid. | |||||
// If pid is 0 the calling thread is used. | |||||
func SchedGetaffinity(pid int, set *CPUSet) error { | |||||
return schedAffinity(SYS_SCHED_GETAFFINITY, pid, set) | |||||
} | |||||
// SchedSetaffinity sets the CPU affinity mask of the thread specified by pid. | |||||
// If pid is 0 the calling thread is used. | |||||
func SchedSetaffinity(pid int, set *CPUSet) error { | |||||
return schedAffinity(SYS_SCHED_SETAFFINITY, pid, set) | |||||
} | |||||
// Zero clears the set s, so that it contains no CPUs. | |||||
func (s *CPUSet) Zero() { | |||||
for i := range s { | |||||
s[i] = 0 | |||||
} | |||||
} | |||||
func cpuBitsIndex(cpu int) int { | |||||
return cpu / _NCPUBITS | |||||
} | |||||
func cpuBitsMask(cpu int) cpuMask { | |||||
return cpuMask(1 << (uint(cpu) % _NCPUBITS)) | |||||
} | |||||
// Set adds cpu to the set s. | |||||
func (s *CPUSet) Set(cpu int) { | |||||
i := cpuBitsIndex(cpu) | |||||
if i < len(s) { | |||||
s[i] |= cpuBitsMask(cpu) | |||||
} | |||||
} | |||||
// Clear removes cpu from the set s. | |||||
func (s *CPUSet) Clear(cpu int) { | |||||
i := cpuBitsIndex(cpu) | |||||
if i < len(s) { | |||||
s[i] &^= cpuBitsMask(cpu) | |||||
} | |||||
} | |||||
// IsSet reports whether cpu is in the set s. | |||||
func (s *CPUSet) IsSet(cpu int) bool { | |||||
i := cpuBitsIndex(cpu) | |||||
if i < len(s) { | |||||
return s[i]&cpuBitsMask(cpu) != 0 | |||||
} | |||||
return false | |||||
} | |||||
// Count returns the number of CPUs in the set s. | |||||
func (s *CPUSet) Count() int { | |||||
c := 0 | |||||
for _, b := range s { | |||||
c += onesCount64(uint64(b)) | |||||
} | |||||
return c | |||||
} | |||||
// onesCount64 is a copy of Go 1.9's math/bits.OnesCount64. | |||||
// Once this package can require Go 1.9, we can delete this | |||||
// and update the caller to use bits.OnesCount64. | |||||
func onesCount64(x uint64) int { | |||||
const m0 = 0x5555555555555555 // 01010101 ... | |||||
const m1 = 0x3333333333333333 // 00110011 ... | |||||
const m2 = 0x0f0f0f0f0f0f0f0f // 00001111 ... | |||||
const m3 = 0x00ff00ff00ff00ff // etc. | |||||
const m4 = 0x0000ffff0000ffff | |||||
// Implementation: Parallel summing of adjacent bits. | |||||
// See "Hacker's Delight", Chap. 5: Counting Bits. | |||||
// The following pattern shows the general approach: | |||||
// | |||||
// x = x>>1&(m0&m) + x&(m0&m) | |||||
// x = x>>2&(m1&m) + x&(m1&m) | |||||
// x = x>>4&(m2&m) + x&(m2&m) | |||||
// x = x>>8&(m3&m) + x&(m3&m) | |||||
// x = x>>16&(m4&m) + x&(m4&m) | |||||
// x = x>>32&(m5&m) + x&(m5&m) | |||||
// return int(x) | |||||
// | |||||
// Masking (& operations) can be left away when there's no | |||||
// danger that a field's sum will carry over into the next | |||||
// field: Since the result cannot be > 64, 8 bits is enough | |||||
// and we can ignore the masks for the shifts by 8 and up. | |||||
// Per "Hacker's Delight", the first line can be simplified | |||||
// more, but it saves at best one instruction, so we leave | |||||
// it alone for clarity. | |||||
const m = 1<<64 - 1 | |||||
x = x>>1&(m0&m) + x&(m0&m) | |||||
x = x>>2&(m1&m) + x&(m1&m) | |||||
x = (x>>4 + x) & (m2 & m) | |||||
x += x >> 8 | |||||
x += x >> 16 | |||||
x += x >> 32 | |||||
return int(x) & (1<<7 - 1) | |||||
} |
@ -0,0 +1,14 @@ | |||||
// Copyright 2018 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. | |||||
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris | |||||
// +build go1.9 | |||||
package unix | |||||
import "syscall" | |||||
type Signal = syscall.Signal | |||||
type Errno = syscall.Errno | |||||
type SysProcAttr = syscall.SysProcAttr |
@ -1,10 +0,0 @@ | |||||
// Copyright 2014 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. | |||||
// +build !gccgo | |||||
#include "textflag.h" | |||||
TEXT ·use(SB),NOSPLIT,$0 | |||||
RET |
@ -0,0 +1,17 @@ | |||||
// Copyright 2018 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. | |||||
// +build !gccgo | |||||
#include "textflag.h" | |||||
// | |||||
// System calls for ppc64, AIX are implemented in runtime/syscall_aix.go | |||||
// | |||||
TEXT ·syscall6(SB),NOSPLIT,$0-88 | |||||
JMP syscall·syscall6(SB) | |||||
TEXT ·rawSyscall6(SB),NOSPLIT,$0-88 | |||||
JMP syscall·rawSyscall6(SB) |
@ -0,0 +1,54 @@ | |||||
// Copyright 2016 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. | |||||
// +build linux | |||||
// +build mips mipsle | |||||
// +build !gccgo | |||||
#include "textflag.h" | |||||
// | |||||
// System calls for mips, Linux | |||||
// | |||||
// Just jump to package syscall's implementation for all these functions. | |||||
// The runtime may know about them. | |||||
TEXT ·Syscall(SB),NOSPLIT,$0-28 | |||||
JMP syscall·Syscall(SB) | |||||
TEXT ·Syscall6(SB),NOSPLIT,$0-40 | |||||
JMP syscall·Syscall6(SB) | |||||
TEXT ·Syscall9(SB),NOSPLIT,$0-52 | |||||
JMP syscall·Syscall9(SB) | |||||
TEXT ·SyscallNoError(SB),NOSPLIT,$0-24 | |||||
JAL runtime·entersyscall(SB) | |||||
MOVW a1+4(FP), R4 | |||||
MOVW a2+8(FP), R5 | |||||
MOVW a3+12(FP), R6 | |||||
MOVW R0, R7 | |||||
MOVW trap+0(FP), R2 // syscall entry | |||||
SYSCALL | |||||
MOVW R2, r1+16(FP) // r1 | |||||
MOVW R3, r2+20(FP) // r2 | |||||
JAL runtime·exitsyscall(SB) | |||||
RET | |||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-28 | |||||
JMP syscall·RawSyscall(SB) | |||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 | |||||
JMP syscall·RawSyscall6(SB) | |||||
TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-24 | |||||
MOVW a1+4(FP), R4 | |||||
MOVW a2+8(FP), R5 | |||||
MOVW a3+12(FP), R6 | |||||
MOVW trap+0(FP), R2 // syscall entry | |||||
SYSCALL | |||||
MOVW R2, r1+16(FP) | |||||
MOVW R3, r2+20(FP) | |||||
RET |
@ -0,0 +1,29 @@ | |||||
// Copyright 2017 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. | |||||
// +build !gccgo | |||||
#include "textflag.h" | |||||
// | |||||
// System call support for ARM, OpenBSD | |||||
// | |||||
// Just jump to package syscall's implementation for all these functions. | |||||
// The runtime may know about them. | |||||
TEXT ·Syscall(SB),NOSPLIT,$0-28 | |||||
B syscall·Syscall(SB) | |||||
TEXT ·Syscall6(SB),NOSPLIT,$0-40 | |||||
B syscall·Syscall6(SB) | |||||
TEXT ·Syscall9(SB),NOSPLIT,$0-52 | |||||
B syscall·Syscall9(SB) | |||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-28 | |||||
B syscall·RawSyscall(SB) | |||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 | |||||
B syscall·RawSyscall6(SB) |
@ -0,0 +1,195 @@ | |||||
// Copyright 2017 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. | |||||
// +build freebsd | |||||
package unix | |||||
import ( | |||||
"errors" | |||||
"fmt" | |||||
) | |||||
// Go implementation of C mostly found in /usr/src/sys/kern/subr_capability.c | |||||
const ( | |||||
// This is the version of CapRights this package understands. See C implementation for parallels. | |||||
capRightsGoVersion = CAP_RIGHTS_VERSION_00 | |||||
capArSizeMin = CAP_RIGHTS_VERSION_00 + 2 | |||||
capArSizeMax = capRightsGoVersion + 2 | |||||
) | |||||
var ( | |||||
bit2idx = []int{ | |||||
-1, 0, 1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, | |||||
4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||||
} | |||||
) | |||||
func capidxbit(right uint64) int { | |||||
return int((right >> 57) & 0x1f) | |||||
} | |||||
func rightToIndex(right uint64) (int, error) { | |||||
idx := capidxbit(right) | |||||
if idx < 0 || idx >= len(bit2idx) { | |||||
return -2, fmt.Errorf("index for right 0x%x out of range", right) | |||||
} | |||||
return bit2idx[idx], nil | |||||
} | |||||
func caprver(right uint64) int { | |||||
return int(right >> 62) | |||||
} | |||||
func capver(rights *CapRights) int { | |||||
return caprver(rights.Rights[0]) | |||||
} | |||||
func caparsize(rights *CapRights) int { | |||||
return capver(rights) + 2 | |||||
} | |||||
// CapRightsSet sets the permissions in setrights in rights. | |||||
func CapRightsSet(rights *CapRights, setrights []uint64) error { | |||||
// This is essentially a copy of cap_rights_vset() | |||||
if capver(rights) != CAP_RIGHTS_VERSION_00 { | |||||
return fmt.Errorf("bad rights version %d", capver(rights)) | |||||
} | |||||
n := caparsize(rights) | |||||
if n < capArSizeMin || n > capArSizeMax { | |||||
return errors.New("bad rights size") | |||||
} | |||||
for _, right := range setrights { | |||||
if caprver(right) != CAP_RIGHTS_VERSION_00 { | |||||
return errors.New("bad right version") | |||||
} | |||||
i, err := rightToIndex(right) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
if i >= n { | |||||
return errors.New("index overflow") | |||||
} | |||||
if capidxbit(rights.Rights[i]) != capidxbit(right) { | |||||
return errors.New("index mismatch") | |||||
} | |||||
rights.Rights[i] |= right | |||||
if capidxbit(rights.Rights[i]) != capidxbit(right) { | |||||
return errors.New("index mismatch (after assign)") | |||||
} | |||||
} | |||||
return nil | |||||
} | |||||
// CapRightsClear clears the permissions in clearrights from rights. | |||||
func CapRightsClear(rights *CapRights, clearrights []uint64) error { | |||||
// This is essentially a copy of cap_rights_vclear() | |||||
if capver(rights) != CAP_RIGHTS_VERSION_00 { | |||||
return fmt.Errorf("bad rights version %d", capver(rights)) | |||||
} | |||||
n := caparsize(rights) | |||||
if n < capArSizeMin || n > capArSizeMax { | |||||
return errors.New("bad rights size") | |||||
} | |||||
for _, right := range clearrights { | |||||
if caprver(right) != CAP_RIGHTS_VERSION_00 { | |||||
return errors.New("bad right version") | |||||
} | |||||
i, err := rightToIndex(right) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
if i >= n { | |||||
return errors.New("index overflow") | |||||
} | |||||
if capidxbit(rights.Rights[i]) != capidxbit(right) { | |||||
return errors.New("index mismatch") | |||||
} | |||||
rights.Rights[i] &= ^(right & 0x01FFFFFFFFFFFFFF) | |||||
if capidxbit(rights.Rights[i]) != capidxbit(right) { | |||||
return errors.New("index mismatch (after assign)") | |||||
} | |||||
} | |||||
return nil | |||||
} | |||||
// CapRightsIsSet checks whether all the permissions in setrights are present in rights. | |||||
func CapRightsIsSet(rights *CapRights, setrights []uint64) (bool, error) { | |||||
// This is essentially a copy of cap_rights_is_vset() | |||||
if capver(rights) != CAP_RIGHTS_VERSION_00 { | |||||
return false, fmt.Errorf("bad rights version %d", capver(rights)) | |||||
} | |||||
n := caparsize(rights) | |||||
if n < capArSizeMin || n > capArSizeMax { | |||||
return false, errors.New("bad rights size") | |||||
} | |||||
for _, right := range setrights { | |||||
if caprver(right) != CAP_RIGHTS_VERSION_00 { | |||||
return false, errors.New("bad right version") | |||||
} | |||||
i, err := rightToIndex(right) | |||||
if err != nil { | |||||
return false, err | |||||
} | |||||
if i >= n { | |||||
return false, errors.New("index overflow") | |||||
} | |||||
if capidxbit(rights.Rights[i]) != capidxbit(right) { | |||||
return false, errors.New("index mismatch") | |||||
} | |||||
if (rights.Rights[i] & right) != right { | |||||
return false, nil | |||||
} | |||||
} | |||||
return true, nil | |||||
} | |||||
func capright(idx uint64, bit uint64) uint64 { | |||||
return ((1 << (57 + idx)) | bit) | |||||
} | |||||
// CapRightsInit returns a pointer to an initialised CapRights structure filled with rights. | |||||
// See man cap_rights_init(3) and rights(4). | |||||
func CapRightsInit(rights []uint64) (*CapRights, error) { | |||||
var r CapRights | |||||
r.Rights[0] = (capRightsGoVersion << 62) | capright(0, 0) | |||||
r.Rights[1] = capright(1, 0) | |||||
err := CapRightsSet(&r, rights) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
return &r, nil | |||||
} | |||||
// CapRightsLimit reduces the operations permitted on fd to at most those contained in rights. | |||||
// The capability rights on fd can never be increased by CapRightsLimit. | |||||
// See man cap_rights_limit(2) and rights(4). | |||||
func CapRightsLimit(fd uintptr, rights *CapRights) error { | |||||
return capRightsLimit(int(fd), rights) | |||||
} | |||||
// CapRightsGet returns a CapRights structure containing the operations permitted on fd. | |||||
// See man cap_rights_get(3) and rights(4). | |||||
func CapRightsGet(fd uintptr) (*CapRights, error) { | |||||
r, err := CapRightsInit(nil) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
err = capRightsGet(capRightsGoVersion, int(fd), r) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
return r, nil | |||||
} |
@ -0,0 +1,27 @@ | |||||
// Copyright 2018 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. | |||||
// +build aix | |||||
// +build ppc | |||||
// Functions to access/create device major and minor numbers matching the | |||||
// encoding used by AIX. | |||||
package unix | |||||
// Major returns the major component of a Linux device number. | |||||
func Major(dev uint64) uint32 { | |||||
return uint32((dev >> 16) & 0xffff) | |||||
} | |||||
// Minor returns the minor component of a Linux device number. | |||||
func Minor(dev uint64) uint32 { | |||||
return uint32(dev & 0xffff) | |||||
} | |||||
// Mkdev returns a Linux device number generated from the given major and minor | |||||
// components. | |||||
func Mkdev(major, minor uint32) uint64 { | |||||
return uint64(((major) << 16) | (minor)) | |||||
} |
@ -0,0 +1,29 @@ | |||||
// Copyright 2018 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. | |||||
// +build aix | |||||
// +build ppc64 | |||||
// Functions to access/create device major and minor numbers matching the | |||||
// encoding used AIX. | |||||
package unix | |||||
// Major returns the major component of a Linux device number. | |||||
func Major(dev uint64) uint32 { | |||||
return uint32((dev & 0x3fffffff00000000) >> 32) | |||||
} | |||||
// Minor returns the minor component of a Linux device number. | |||||
func Minor(dev uint64) uint32 { | |||||
return uint32((dev & 0x00000000ffffffff) >> 0) | |||||
} | |||||
// Mkdev returns a Linux device number generated from the given major and minor | |||||
// components. | |||||
func Mkdev(major, minor uint32) uint64 { | |||||
var DEVNO64 uint64 | |||||
DEVNO64 = 0x8000000000000000 | |||||
return ((uint64(major) << 32) | (uint64(minor) & 0x00000000FFFFFFFF) | DEVNO64) | |||||
} |
@ -0,0 +1,24 @@ | |||||
// Copyright 2017 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. | |||||
// Functions to access/create device major and minor numbers matching the | |||||
// encoding used in Darwin's sys/types.h header. | |||||
package unix | |||||
// Major returns the major component of a Darwin device number. | |||||
func Major(dev uint64) uint32 { | |||||
return uint32((dev >> 24) & 0xff) | |||||
} | |||||
// Minor returns the minor component of a Darwin device number. | |||||
func Minor(dev uint64) uint32 { | |||||
return uint32(dev & 0xffffff) | |||||
} | |||||
// Mkdev returns a Darwin device number generated from the given major and minor | |||||
// components. | |||||
func Mkdev(major, minor uint32) uint64 { | |||||
return (uint64(major) << 24) | uint64(minor) | |||||
} |
@ -0,0 +1,30 @@ | |||||
// Copyright 2017 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. | |||||
// Functions to access/create device major and minor numbers matching the | |||||
// encoding used in Dragonfly's sys/types.h header. | |||||
// | |||||
// The information below is extracted and adapted from sys/types.h: | |||||
// | |||||
// Minor gives a cookie instead of an index since in order to avoid changing the | |||||
// meanings of bits 0-15 or wasting time and space shifting bits 16-31 for | |||||
// devices that don't use them. | |||||
package unix | |||||
// Major returns the major component of a DragonFlyBSD device number. | |||||
func Major(dev uint64) uint32 { | |||||
return uint32((dev >> 8) & 0xff) | |||||
} | |||||
// Minor returns the minor component of a DragonFlyBSD device number. | |||||
func Minor(dev uint64) uint32 { | |||||
return uint32(dev & 0xffff00ff) | |||||
} | |||||
// Mkdev returns a DragonFlyBSD device number generated from the given major and | |||||
// minor components. | |||||
func Mkdev(major, minor uint32) uint64 { | |||||
return (uint64(major) << 8) | uint64(minor) | |||||
} |
@ -0,0 +1,30 @@ | |||||
// Copyright 2017 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. | |||||
// Functions to access/create device major and minor numbers matching the | |||||
// encoding used in FreeBSD's sys/types.h header. | |||||
// | |||||
// The information below is extracted and adapted from sys/types.h: | |||||
// | |||||
// Minor gives a cookie instead of an index since in order to avoid changing the | |||||
// meanings of bits 0-15 or wasting time and space shifting bits 16-31 for | |||||
// devices that don't use them. | |||||
package unix | |||||
// Major returns the major component of a FreeBSD device number. | |||||
func Major(dev uint64) uint32 { | |||||
return uint32((dev >> 8) & 0xff) | |||||
} | |||||
// Minor returns the minor component of a FreeBSD device number. | |||||
func Minor(dev uint64) uint32 { | |||||
return uint32(dev & 0xffff00ff) | |||||
} | |||||
// Mkdev returns a FreeBSD device number generated from the given major and | |||||
// minor components. | |||||
func Mkdev(major, minor uint32) uint64 { | |||||
return (uint64(major) << 8) | uint64(minor) | |||||
} |
@ -0,0 +1,42 @@ | |||||
// Copyright 2017 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. | |||||
// Functions to access/create device major and minor numbers matching the | |||||
// encoding used by the Linux kernel and glibc. | |||||
// | |||||
// The information below is extracted and adapted from bits/sysmacros.h in the | |||||
// glibc sources: | |||||
// | |||||
// dev_t in glibc is 64-bit, with 32-bit major and minor numbers. glibc's | |||||
// default encoding is MMMM Mmmm mmmM MMmm, where M is a hex digit of the major | |||||
// number and m is a hex digit of the minor number. This is backward compatible | |||||
// with legacy systems where dev_t is 16 bits wide, encoded as MMmm. It is also | |||||
// backward compatible with the Linux kernel, which for some architectures uses | |||||
// 32-bit dev_t, encoded as mmmM MMmm. | |||||
package unix | |||||
// Major returns the major component of a Linux device number. | |||||
func Major(dev uint64) uint32 { | |||||
major := uint32((dev & 0x00000000000fff00) >> 8) | |||||
major |= uint32((dev & 0xfffff00000000000) >> 32) | |||||
return major | |||||
} | |||||
// Minor returns the minor component of a Linux device number. | |||||
func Minor(dev uint64) uint32 { | |||||
minor := uint32((dev & 0x00000000000000ff) >> 0) | |||||
minor |= uint32((dev & 0x00000ffffff00000) >> 12) | |||||
return minor | |||||
} | |||||
// Mkdev returns a Linux device number generated from the given major and minor | |||||
// components. | |||||
func Mkdev(major, minor uint32) uint64 { | |||||
dev := (uint64(major) & 0x00000fff) << 8 | |||||
dev |= (uint64(major) & 0xfffff000) << 32 | |||||
dev |= (uint64(minor) & 0x000000ff) << 0 | |||||
dev |= (uint64(minor) & 0xffffff00) << 12 | |||||
return dev | |||||
} |
@ -0,0 +1,29 @@ | |||||
// Copyright 2017 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. | |||||
// Functions to access/create device major and minor numbers matching the | |||||
// encoding used in NetBSD's sys/types.h header. | |||||
package unix | |||||
// Major returns the major component of a NetBSD device number. | |||||
func Major(dev uint64) uint32 { | |||||
return uint32((dev & 0x000fff00) >> 8) | |||||
} | |||||
// Minor returns the minor component of a NetBSD device number. | |||||
func Minor(dev uint64) uint32 { | |||||
minor := uint32((dev & 0x000000ff) >> 0) | |||||
minor |= uint32((dev & 0xfff00000) >> 12) | |||||
return minor | |||||
} | |||||
// Mkdev returns a NetBSD device number generated from the given major and minor | |||||
// components. | |||||
func Mkdev(major, minor uint32) uint64 { | |||||
dev := (uint64(major) << 8) & 0x000fff00 | |||||
dev |= (uint64(minor) << 12) & 0xfff00000 | |||||
dev |= (uint64(minor) << 0) & 0x000000ff | |||||
return dev | |||||
} |
@ -0,0 +1,29 @@ | |||||
// Copyright 2017 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. | |||||
// Functions to access/create device major and minor numbers matching the | |||||
// encoding used in OpenBSD's sys/types.h header. | |||||
package unix | |||||
// Major returns the major component of an OpenBSD device number. | |||||
func Major(dev uint64) uint32 { | |||||
return uint32((dev & 0x0000ff00) >> 8) | |||||
} | |||||
// Minor returns the minor component of an OpenBSD device number. | |||||
func Minor(dev uint64) uint32 { | |||||
minor := uint32((dev & 0x000000ff) >> 0) | |||||
minor |= uint32((dev & 0xffff0000) >> 8) | |||||
return minor | |||||
} | |||||
// Mkdev returns an OpenBSD device number generated from the given major and minor | |||||
// components. | |||||
func Mkdev(major, minor uint32) uint64 { | |||||
dev := (uint64(major) << 8) & 0x0000ff00 | |||||
dev |= (uint64(minor) << 8) & 0xffff0000 | |||||
dev |= (uint64(minor) << 0) & 0x000000ff | |||||
return dev | |||||
} |
@ -0,0 +1,17 @@ | |||||
// Copyright 2009 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. | |||||
// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris | |||||
package unix | |||||
import "syscall" | |||||
// ParseDirent parses up to max directory entries in buf, | |||||
// appending the names to names. It returns the number of | |||||
// bytes consumed from buf, the number of entries added | |||||
// to names, and the new names slice. | |||||
func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { | |||||
return syscall.ParseDirent(buf, max, names) | |||||
} |
@ -0,0 +1,9 @@ | |||||
// Copyright 2016 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. | |||||
// | |||||
// +build ppc64 s390x mips mips64 | |||||
package unix | |||||
const isBigEndian = true |
@ -0,0 +1,9 @@ | |||||
// Copyright 2016 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. | |||||
// | |||||
// +build 386 amd64 amd64p32 arm arm64 ppc64le mipsle mips64le | |||||
package unix | |||||
const isBigEndian = false |
@ -1,14 +0,0 @@ | |||||
// Copyright 2014 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. | |||||
// +build go1.4 | |||||
package unix | |||||
import "syscall" | |||||
func Unsetenv(key string) error { | |||||
// This was added in Go 1.4. | |||||
return syscall.Unsetenv(key) | |||||
} |
@ -0,0 +1,227 @@ | |||||
// Copyright 2017 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. | |||||
// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep | |||||
// them here for backwards compatibility. | |||||
package unix | |||||
const ( | |||||
IFF_SMART = 0x20 | |||||
IFT_1822 = 0x2 | |||||
IFT_A12MPPSWITCH = 0x82 | |||||
IFT_AAL2 = 0xbb | |||||
IFT_AAL5 = 0x31 | |||||
IFT_ADSL = 0x5e | |||||
IFT_AFLANE8023 = 0x3b | |||||
IFT_AFLANE8025 = 0x3c | |||||
IFT_ARAP = 0x58 | |||||
IFT_ARCNET = 0x23 | |||||
IFT_ARCNETPLUS = 0x24 | |||||
IFT_ASYNC = 0x54 | |||||
IFT_ATM = 0x25 | |||||
IFT_ATMDXI = 0x69 | |||||
IFT_ATMFUNI = 0x6a | |||||
IFT_ATMIMA = 0x6b | |||||
IFT_ATMLOGICAL = 0x50 | |||||
IFT_ATMRADIO = 0xbd | |||||
IFT_ATMSUBINTERFACE = 0x86 | |||||
IFT_ATMVCIENDPT = 0xc2 | |||||
IFT_ATMVIRTUAL = 0x95 | |||||
IFT_BGPPOLICYACCOUNTING = 0xa2 | |||||
IFT_BSC = 0x53 | |||||
IFT_CCTEMUL = 0x3d | |||||
IFT_CEPT = 0x13 | |||||
IFT_CES = 0x85 | |||||
IFT_CHANNEL = 0x46 | |||||
IFT_CNR = 0x55 | |||||
IFT_COFFEE = 0x84 | |||||
IFT_COMPOSITELINK = 0x9b | |||||
IFT_DCN = 0x8d | |||||
IFT_DIGITALPOWERLINE = 0x8a | |||||
IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba | |||||
IFT_DLSW = 0x4a | |||||
IFT_DOCSCABLEDOWNSTREAM = 0x80 | |||||
IFT_DOCSCABLEMACLAYER = 0x7f | |||||
IFT_DOCSCABLEUPSTREAM = 0x81 | |||||
IFT_DS0 = 0x51 | |||||
IFT_DS0BUNDLE = 0x52 | |||||
IFT_DS1FDL = 0xaa | |||||
IFT_DS3 = 0x1e | |||||
IFT_DTM = 0x8c | |||||
IFT_DVBASILN = 0xac | |||||
IFT_DVBASIOUT = 0xad | |||||
IFT_DVBRCCDOWNSTREAM = 0x93 | |||||
IFT_DVBRCCMACLAYER = 0x92 | |||||
IFT_DVBRCCUPSTREAM = 0x94 | |||||
IFT_ENC = 0xf4 | |||||
IFT_EON = 0x19 | |||||
IFT_EPLRS = 0x57 | |||||
IFT_ESCON = 0x49 | |||||
IFT_ETHER = 0x6 | |||||
IFT_FAITH = 0xf2 | |||||
IFT_FAST = 0x7d | |||||
IFT_FASTETHER = 0x3e | |||||
IFT_FASTETHERFX = 0x45 | |||||
IFT_FDDI = 0xf | |||||
IFT_FIBRECHANNEL = 0x38 | |||||
IFT_FRAMERELAYINTERCONNECT = 0x3a | |||||
IFT_FRAMERELAYMPI = 0x5c | |||||
IFT_FRDLCIENDPT = 0xc1 | |||||
IFT_FRELAY = 0x20 | |||||
IFT_FRELAYDCE = 0x2c | |||||
IFT_FRF16MFRBUNDLE = 0xa3 | |||||
IFT_FRFORWARD = 0x9e | |||||
IFT_G703AT2MB = 0x43 | |||||
IFT_G703AT64K = 0x42 | |||||
IFT_GIF = 0xf0 | |||||
IFT_GIGABITETHERNET = 0x75 | |||||
IFT_GR303IDT = 0xb2 | |||||
IFT_GR303RDT = 0xb1 | |||||
IFT_H323GATEKEEPER = 0xa4 | |||||
IFT_H323PROXY = 0xa5 | |||||
IFT_HDH1822 = 0x3 | |||||
IFT_HDLC = 0x76 | |||||
IFT_HDSL2 = 0xa8 | |||||
IFT_HIPERLAN2 = 0xb7 | |||||
IFT_HIPPI = 0x2f | |||||
IFT_HIPPIINTERFACE = 0x39 | |||||
IFT_HOSTPAD = 0x5a | |||||
IFT_HSSI = 0x2e | |||||
IFT_HY = 0xe | |||||
IFT_IBM370PARCHAN = 0x48 | |||||
IFT_IDSL = 0x9a | |||||
IFT_IEEE80211 = 0x47 | |||||
IFT_IEEE80212 = 0x37 | |||||
IFT_IEEE8023ADLAG = 0xa1 | |||||
IFT_IFGSN = 0x91 | |||||
IFT_IMT = 0xbe | |||||
IFT_INTERLEAVE = 0x7c | |||||
IFT_IP = 0x7e | |||||
IFT_IPFORWARD = 0x8e | |||||
IFT_IPOVERATM = 0x72 | |||||
IFT_IPOVERCDLC = 0x6d | |||||
IFT_IPOVERCLAW = 0x6e | |||||
IFT_IPSWITCH = 0x4e | |||||
IFT_IPXIP = 0xf9 | |||||
IFT_ISDN = 0x3f | |||||
IFT_ISDNBASIC = 0x14 | |||||
IFT_ISDNPRIMARY = 0x15 | |||||
IFT_ISDNS = 0x4b | |||||
IFT_ISDNU = 0x4c | |||||
IFT_ISO88022LLC = 0x29 | |||||
IFT_ISO88023 = 0x7 | |||||
IFT_ISO88024 = 0x8 | |||||
IFT_ISO88025 = 0x9 | |||||
IFT_ISO88025CRFPINT = 0x62 | |||||
IFT_ISO88025DTR = 0x56 | |||||
IFT_ISO88025FIBER = 0x73 | |||||
IFT_ISO88026 = 0xa | |||||
IFT_ISUP = 0xb3 | |||||
IFT_L3IPXVLAN = 0x89 | |||||
IFT_LAPB = 0x10 | |||||
IFT_LAPD = 0x4d | |||||
IFT_LAPF = 0x77 | |||||
IFT_LOCALTALK = 0x2a | |||||
IFT_LOOP = 0x18 | |||||
IFT_MEDIAMAILOVERIP = 0x8b | |||||
IFT_MFSIGLINK = 0xa7 | |||||
IFT_MIOX25 = 0x26 | |||||
IFT_MODEM = 0x30 | |||||
IFT_MPC = 0x71 | |||||
IFT_MPLS = 0xa6 | |||||
IFT_MPLSTUNNEL = 0x96 | |||||
IFT_MSDSL = 0x8f | |||||
IFT_MVL = 0xbf | |||||
IFT_MYRINET = 0x63 | |||||
IFT_NFAS = 0xaf | |||||
IFT_NSIP = 0x1b | |||||
IFT_OPTICALCHANNEL = 0xc3 | |||||
IFT_OPTICALTRANSPORT = 0xc4 | |||||
IFT_OTHER = 0x1 | |||||
IFT_P10 = 0xc | |||||
IFT_P80 = 0xd | |||||
IFT_PARA = 0x22 | |||||
IFT_PFLOG = 0xf6 | |||||
IFT_PFSYNC = 0xf7 | |||||
IFT_PLC = 0xae | |||||
IFT_POS = 0xab | |||||
IFT_PPPMULTILINKBUNDLE = 0x6c | |||||
IFT_PROPBWAP2MP = 0xb8 | |||||
IFT_PROPCNLS = 0x59 | |||||
IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 | |||||
IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 | |||||
IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 | |||||
IFT_PROPMUX = 0x36 | |||||
IFT_PROPWIRELESSP2P = 0x9d | |||||
IFT_PTPSERIAL = 0x16 | |||||
IFT_PVC = 0xf1 | |||||
IFT_QLLC = 0x44 | |||||
IFT_RADIOMAC = 0xbc | |||||
IFT_RADSL = 0x5f | |||||
IFT_REACHDSL = 0xc0 | |||||
IFT_RFC1483 = 0x9f | |||||
IFT_RS232 = 0x21 | |||||
IFT_RSRB = 0x4f | |||||
IFT_SDLC = 0x11 | |||||
IFT_SDSL = 0x60 | |||||
IFT_SHDSL = 0xa9 | |||||
IFT_SIP = 0x1f | |||||
IFT_SLIP = 0x1c | |||||
IFT_SMDSDXI = 0x2b | |||||
IFT_SMDSICIP = 0x34 | |||||
IFT_SONET = 0x27 | |||||
IFT_SONETOVERHEADCHANNEL = 0xb9 | |||||
IFT_SONETPATH = 0x32 | |||||
IFT_SONETVT = 0x33 | |||||
IFT_SRP = 0x97 | |||||
IFT_SS7SIGLINK = 0x9c | |||||
IFT_STACKTOSTACK = 0x6f | |||||
IFT_STARLAN = 0xb | |||||
IFT_STF = 0xd7 | |||||
IFT_T1 = 0x12 | |||||
IFT_TDLC = 0x74 | |||||
IFT_TERMPAD = 0x5b | |||||
IFT_TR008 = 0xb0 | |||||
IFT_TRANSPHDLC = 0x7b | |||||
IFT_TUNNEL = 0x83 | |||||
IFT_ULTRA = 0x1d | |||||
IFT_USB = 0xa0 | |||||
IFT_V11 = 0x40 | |||||
IFT_V35 = 0x2d | |||||
IFT_V36 = 0x41 | |||||
IFT_V37 = 0x78 | |||||
IFT_VDSL = 0x61 | |||||
IFT_VIRTUALIPADDRESS = 0x70 | |||||
IFT_VOICEEM = 0x64 | |||||
IFT_VOICEENCAP = 0x67 | |||||
IFT_VOICEFXO = 0x65 | |||||
IFT_VOICEFXS = 0x66 | |||||
IFT_VOICEOVERATM = 0x98 | |||||
IFT_VOICEOVERFRAMERELAY = 0x99 | |||||
IFT_VOICEOVERIP = 0x68 | |||||
IFT_X213 = 0x5d | |||||
IFT_X25 = 0x5 | |||||
IFT_X25DDN = 0x4 | |||||
IFT_X25HUNTGROUP = 0x7a | |||||
IFT_X25MLP = 0x79 | |||||
IFT_X25PLE = 0x28 | |||||
IFT_XETHER = 0x1a | |||||
IPPROTO_MAXID = 0x34 | |||||
IPV6_FAITH = 0x1d | |||||
IP_FAITH = 0x16 | |||||
MAP_NORESERVE = 0x40 | |||||
MAP_RENAME = 0x20 | |||||
NET_RT_MAXID = 0x6 | |||||
RTF_PRCLONING = 0x10000 | |||||
RTM_OLDADD = 0x9 | |||||
RTM_OLDDEL = 0xa | |||||
SIOCADDRT = 0x8030720a | |||||
SIOCALIFADDR = 0x8118691b | |||||
SIOCDELRT = 0x8030720b | |||||
SIOCDLIFADDR = 0x8118691d | |||||
SIOCGLIFADDR = 0xc118691c | |||||
SIOCGLIFPHYADDR = 0xc118694b | |||||
SIOCSLIFPHYADDR = 0x8118694a | |||||
) |
@ -0,0 +1,227 @@ | |||||
// Copyright 2017 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. | |||||
// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep | |||||
// them here for backwards compatibility. | |||||
package unix | |||||
const ( | |||||
IFF_SMART = 0x20 | |||||
IFT_1822 = 0x2 | |||||
IFT_A12MPPSWITCH = 0x82 | |||||
IFT_AAL2 = 0xbb | |||||
IFT_AAL5 = 0x31 | |||||
IFT_ADSL = 0x5e | |||||
IFT_AFLANE8023 = 0x3b | |||||
IFT_AFLANE8025 = 0x3c | |||||
IFT_ARAP = 0x58 | |||||
IFT_ARCNET = 0x23 | |||||
IFT_ARCNETPLUS = 0x24 | |||||
IFT_ASYNC = 0x54 | |||||
IFT_ATM = 0x25 | |||||
IFT_ATMDXI = 0x69 | |||||
IFT_ATMFUNI = 0x6a | |||||
IFT_ATMIMA = 0x6b | |||||
IFT_ATMLOGICAL = 0x50 | |||||
IFT_ATMRADIO = 0xbd | |||||
IFT_ATMSUBINTERFACE = 0x86 | |||||
IFT_ATMVCIENDPT = 0xc2 | |||||
IFT_ATMVIRTUAL = 0x95 | |||||
IFT_BGPPOLICYACCOUNTING = 0xa2 | |||||
IFT_BSC = 0x53 | |||||
IFT_CCTEMUL = 0x3d | |||||
IFT_CEPT = 0x13 | |||||
IFT_CES = 0x85 | |||||
IFT_CHANNEL = 0x46 | |||||
IFT_CNR = 0x55 | |||||
IFT_COFFEE = 0x84 | |||||
IFT_COMPOSITELINK = 0x9b | |||||
IFT_DCN = 0x8d | |||||
IFT_DIGITALPOWERLINE = 0x8a | |||||
IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba | |||||
IFT_DLSW = 0x4a | |||||
IFT_DOCSCABLEDOWNSTREAM = 0x80 | |||||
IFT_DOCSCABLEMACLAYER = 0x7f | |||||
IFT_DOCSCABLEUPSTREAM = 0x81 | |||||
IFT_DS0 = 0x51 | |||||
IFT_DS0BUNDLE = 0x52 | |||||
IFT_DS1FDL = 0xaa | |||||
IFT_DS3 = 0x1e | |||||
IFT_DTM = 0x8c | |||||
IFT_DVBASILN = 0xac | |||||
IFT_DVBASIOUT = 0xad | |||||
IFT_DVBRCCDOWNSTREAM = 0x93 | |||||
IFT_DVBRCCMACLAYER = 0x92 | |||||
IFT_DVBRCCUPSTREAM = 0x94 | |||||
IFT_ENC = 0xf4 | |||||
IFT_EON = 0x19 | |||||
IFT_EPLRS = 0x57 | |||||
IFT_ESCON = 0x49 | |||||
IFT_ETHER = 0x6 | |||||
IFT_FAITH = 0xf2 | |||||
IFT_FAST = 0x7d | |||||
IFT_FASTETHER = 0x3e | |||||
IFT_FASTETHERFX = 0x45 | |||||
IFT_FDDI = 0xf | |||||
IFT_FIBRECHANNEL = 0x38 | |||||
IFT_FRAMERELAYINTERCONNECT = 0x3a | |||||
IFT_FRAMERELAYMPI = 0x5c | |||||
IFT_FRDLCIENDPT = 0xc1 | |||||
IFT_FRELAY = 0x20 | |||||
IFT_FRELAYDCE = 0x2c | |||||
IFT_FRF16MFRBUNDLE = 0xa3 | |||||
IFT_FRFORWARD = 0x9e | |||||
IFT_G703AT2MB = 0x43 | |||||
IFT_G703AT64K = 0x42 | |||||
IFT_GIF = 0xf0 | |||||
IFT_GIGABITETHERNET = 0x75 | |||||
IFT_GR303IDT = 0xb2 | |||||
IFT_GR303RDT = 0xb1 | |||||
IFT_H323GATEKEEPER = 0xa4 | |||||
IFT_H323PROXY = 0xa5 | |||||
IFT_HDH1822 = 0x3 | |||||
IFT_HDLC = 0x76 | |||||
IFT_HDSL2 = 0xa8 | |||||
IFT_HIPERLAN2 = 0xb7 | |||||
IFT_HIPPI = 0x2f | |||||
IFT_HIPPIINTERFACE = 0x39 | |||||
IFT_HOSTPAD = 0x5a | |||||
IFT_HSSI = 0x2e | |||||
IFT_HY = 0xe | |||||
IFT_IBM370PARCHAN = 0x48 | |||||
IFT_IDSL = 0x9a | |||||
IFT_IEEE80211 = 0x47 | |||||
IFT_IEEE80212 = 0x37 | |||||
IFT_IEEE8023ADLAG = 0xa1 | |||||
IFT_IFGSN = 0x91 | |||||
IFT_IMT = 0xbe | |||||
IFT_INTERLEAVE = 0x7c | |||||
IFT_IP = 0x7e | |||||
IFT_IPFORWARD = 0x8e | |||||
IFT_IPOVERATM = 0x72 | |||||
IFT_IPOVERCDLC = 0x6d | |||||
IFT_IPOVERCLAW = 0x6e | |||||
IFT_IPSWITCH = 0x4e | |||||
IFT_IPXIP = 0xf9 | |||||
IFT_ISDN = 0x3f | |||||
IFT_ISDNBASIC = 0x14 | |||||
IFT_ISDNPRIMARY = 0x15 | |||||
IFT_ISDNS = 0x4b | |||||
IFT_ISDNU = 0x4c | |||||
IFT_ISO88022LLC = 0x29 | |||||
IFT_ISO88023 = 0x7 | |||||
IFT_ISO88024 = 0x8 | |||||
IFT_ISO88025 = 0x9 | |||||
IFT_ISO88025CRFPINT = 0x62 | |||||
IFT_ISO88025DTR = 0x56 | |||||
IFT_ISO88025FIBER = 0x73 | |||||
IFT_ISO88026 = 0xa | |||||
IFT_ISUP = 0xb3 | |||||
IFT_L3IPXVLAN = 0x89 | |||||
IFT_LAPB = 0x10 | |||||
IFT_LAPD = 0x4d | |||||
IFT_LAPF = 0x77 | |||||
IFT_LOCALTALK = 0x2a | |||||
IFT_LOOP = 0x18 | |||||
IFT_MEDIAMAILOVERIP = 0x8b | |||||
IFT_MFSIGLINK = 0xa7 | |||||
IFT_MIOX25 = 0x26 | |||||
IFT_MODEM = 0x30 | |||||
IFT_MPC = 0x71 | |||||
IFT_MPLS = 0xa6 | |||||
IFT_MPLSTUNNEL = 0x96 | |||||
IFT_MSDSL = 0x8f | |||||
IFT_MVL = 0xbf | |||||
IFT_MYRINET = 0x63 | |||||
IFT_NFAS = 0xaf | |||||
IFT_NSIP = 0x1b | |||||
IFT_OPTICALCHANNEL = 0xc3 | |||||
IFT_OPTICALTRANSPORT = 0xc4 | |||||
IFT_OTHER = 0x1 | |||||
IFT_P10 = 0xc | |||||
IFT_P80 = 0xd | |||||
IFT_PARA = 0x22 | |||||
IFT_PFLOG = 0xf6 | |||||
IFT_PFSYNC = 0xf7 | |||||
IFT_PLC = 0xae | |||||
IFT_POS = 0xab | |||||
IFT_PPPMULTILINKBUNDLE = 0x6c | |||||
IFT_PROPBWAP2MP = 0xb8 | |||||
IFT_PROPCNLS = 0x59 | |||||
IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 | |||||
IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 | |||||
IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 | |||||
IFT_PROPMUX = 0x36 | |||||
IFT_PROPWIRELESSP2P = 0x9d | |||||
IFT_PTPSERIAL = 0x16 | |||||
IFT_PVC = 0xf1 | |||||
IFT_QLLC = 0x44 | |||||
IFT_RADIOMAC = 0xbc | |||||
IFT_RADSL = 0x5f | |||||
IFT_REACHDSL = 0xc0 | |||||
IFT_RFC1483 = 0x9f | |||||
IFT_RS232 = 0x21 | |||||
IFT_RSRB = 0x4f | |||||
IFT_SDLC = 0x11 | |||||
IFT_SDSL = 0x60 | |||||
IFT_SHDSL = 0xa9 | |||||
IFT_SIP = 0x1f | |||||
IFT_SLIP = 0x1c | |||||
IFT_SMDSDXI = 0x2b | |||||
IFT_SMDSICIP = 0x34 | |||||
IFT_SONET = 0x27 | |||||
IFT_SONETOVERHEADCHANNEL = 0xb9 | |||||
IFT_SONETPATH = 0x32 | |||||
IFT_SONETVT = 0x33 | |||||
IFT_SRP = 0x97 | |||||
IFT_SS7SIGLINK = 0x9c | |||||
IFT_STACKTOSTACK = 0x6f | |||||
IFT_STARLAN = 0xb | |||||
IFT_STF = 0xd7 | |||||
IFT_T1 = 0x12 | |||||
IFT_TDLC = 0x74 | |||||
IFT_TERMPAD = 0x5b | |||||
IFT_TR008 = 0xb0 | |||||
IFT_TRANSPHDLC = 0x7b | |||||
IFT_TUNNEL = 0x83 | |||||
IFT_ULTRA = 0x1d | |||||
IFT_USB = 0xa0 | |||||
IFT_V11 = 0x40 | |||||
IFT_V35 = 0x2d | |||||
IFT_V36 = 0x41 | |||||
IFT_V37 = 0x78 | |||||
IFT_VDSL = 0x61 | |||||
IFT_VIRTUALIPADDRESS = 0x70 | |||||
IFT_VOICEEM = 0x64 | |||||
IFT_VOICEENCAP = 0x67 | |||||
IFT_VOICEFXO = 0x65 | |||||
IFT_VOICEFXS = 0x66 | |||||
IFT_VOICEOVERATM = 0x98 | |||||
IFT_VOICEOVERFRAMERELAY = 0x99 | |||||
IFT_VOICEOVERIP = 0x68 | |||||
IFT_X213 = 0x5d | |||||
IFT_X25 = 0x5 | |||||
IFT_X25DDN = 0x4 | |||||
IFT_X25HUNTGROUP = 0x7a | |||||
IFT_X25MLP = 0x79 | |||||
IFT_X25PLE = 0x28 | |||||
IFT_XETHER = 0x1a | |||||
IPPROTO_MAXID = 0x34 | |||||
IPV6_FAITH = 0x1d | |||||
IP_FAITH = 0x16 | |||||
MAP_NORESERVE = 0x40 | |||||
MAP_RENAME = 0x20 | |||||
NET_RT_MAXID = 0x6 | |||||
RTF_PRCLONING = 0x10000 | |||||
RTM_OLDADD = 0x9 | |||||
RTM_OLDDEL = 0xa | |||||
SIOCADDRT = 0x8040720a | |||||
SIOCALIFADDR = 0x8118691b | |||||
SIOCDELRT = 0x8040720b | |||||
SIOCDLIFADDR = 0x8118691d | |||||
SIOCGLIFADDR = 0xc118691c | |||||
SIOCGLIFPHYADDR = 0xc118694b | |||||
SIOCSLIFPHYADDR = 0x8118694a | |||||
) |
@ -0,0 +1,226 @@ | |||||
// Copyright 2017 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 unix | |||||
const ( | |||||
IFT_1822 = 0x2 | |||||
IFT_A12MPPSWITCH = 0x82 | |||||
IFT_AAL2 = 0xbb | |||||
IFT_AAL5 = 0x31 | |||||
IFT_ADSL = 0x5e | |||||
IFT_AFLANE8023 = 0x3b | |||||
IFT_AFLANE8025 = 0x3c | |||||
IFT_ARAP = 0x58 | |||||
IFT_ARCNET = 0x23 | |||||
IFT_ARCNETPLUS = 0x24 | |||||
IFT_ASYNC = 0x54 | |||||
IFT_ATM = 0x25 | |||||
IFT_ATMDXI = 0x69 | |||||
IFT_ATMFUNI = 0x6a | |||||
IFT_ATMIMA = 0x6b | |||||
IFT_ATMLOGICAL = 0x50 | |||||
IFT_ATMRADIO = 0xbd | |||||
IFT_ATMSUBINTERFACE = 0x86 | |||||
IFT_ATMVCIENDPT = 0xc2 | |||||
IFT_ATMVIRTUAL = 0x95 | |||||
IFT_BGPPOLICYACCOUNTING = 0xa2 | |||||
IFT_BSC = 0x53 | |||||
IFT_CCTEMUL = 0x3d | |||||
IFT_CEPT = 0x13 | |||||
IFT_CES = 0x85 | |||||
IFT_CHANNEL = 0x46 | |||||
IFT_CNR = 0x55 | |||||
IFT_COFFEE = 0x84 | |||||
IFT_COMPOSITELINK = 0x9b | |||||
IFT_DCN = 0x8d | |||||
IFT_DIGITALPOWERLINE = 0x8a | |||||
IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba | |||||
IFT_DLSW = 0x4a | |||||
IFT_DOCSCABLEDOWNSTREAM = 0x80 | |||||
IFT_DOCSCABLEMACLAYER = 0x7f | |||||
IFT_DOCSCABLEUPSTREAM = 0x81 | |||||
IFT_DS0 = 0x51 | |||||
IFT_DS0BUNDLE = 0x52 | |||||
IFT_DS1FDL = 0xaa | |||||
IFT_DS3 = 0x1e | |||||
IFT_DTM = 0x8c | |||||
IFT_DVBASILN = 0xac | |||||
IFT_DVBASIOUT = 0xad | |||||
IFT_DVBRCCDOWNSTREAM = 0x93 | |||||
IFT_DVBRCCMACLAYER = 0x92 | |||||
IFT_DVBRCCUPSTREAM = 0x94 | |||||
IFT_ENC = 0xf4 | |||||
IFT_EON = 0x19 | |||||
IFT_EPLRS = 0x57 | |||||
IFT_ESCON = 0x49 | |||||
IFT_ETHER = 0x6 | |||||
IFT_FAST = 0x7d | |||||
IFT_FASTETHER = 0x3e | |||||
IFT_FASTETHERFX = 0x45 | |||||
IFT_FDDI = 0xf | |||||
IFT_FIBRECHANNEL = 0x38 | |||||
IFT_FRAMERELAYINTERCONNECT = 0x3a | |||||
IFT_FRAMERELAYMPI = 0x5c | |||||
IFT_FRDLCIENDPT = 0xc1 | |||||
IFT_FRELAY = 0x20 | |||||
IFT_FRELAYDCE = 0x2c | |||||
IFT_FRF16MFRBUNDLE = 0xa3 | |||||
IFT_FRFORWARD = 0x9e | |||||
IFT_G703AT2MB = 0x43 | |||||
IFT_G703AT64K = 0x42 | |||||
IFT_GIF = 0xf0 | |||||
IFT_GIGABITETHERNET = 0x75 | |||||
IFT_GR303IDT = 0xb2 | |||||
IFT_GR303RDT = 0xb1 | |||||
IFT_H323GATEKEEPER = 0xa4 | |||||
IFT_H323PROXY = 0xa5 | |||||
IFT_HDH1822 = 0x3 | |||||
IFT_HDLC = 0x76 | |||||
IFT_HDSL2 = 0xa8 | |||||
IFT_HIPERLAN2 = 0xb7 | |||||
IFT_HIPPI = 0x2f | |||||
IFT_HIPPIINTERFACE = 0x39 | |||||
IFT_HOSTPAD = 0x5a | |||||
IFT_HSSI = 0x2e | |||||
IFT_HY = 0xe | |||||
IFT_IBM370PARCHAN = 0x48 | |||||
IFT_IDSL = 0x9a | |||||
IFT_IEEE80211 = 0x47 | |||||
IFT_IEEE80212 = 0x37 | |||||
IFT_IEEE8023ADLAG = 0xa1 | |||||
IFT_IFGSN = 0x91 | |||||
IFT_IMT = 0xbe | |||||
IFT_INTERLEAVE = 0x7c | |||||
IFT_IP = 0x7e | |||||
IFT_IPFORWARD = 0x8e | |||||
IFT_IPOVERATM = 0x72 | |||||
IFT_IPOVERCDLC = 0x6d | |||||
IFT_IPOVERCLAW = 0x6e | |||||
IFT_IPSWITCH = 0x4e | |||||
IFT_ISDN = 0x3f | |||||
IFT_ISDNBASIC = 0x14 | |||||
IFT_ISDNPRIMARY = 0x15 | |||||
IFT_ISDNS = 0x4b | |||||
IFT_ISDNU = 0x4c | |||||
IFT_ISO88022LLC = 0x29 | |||||
IFT_ISO88023 = 0x7 | |||||
IFT_ISO88024 = 0x8 | |||||
IFT_ISO88025 = 0x9 | |||||
IFT_ISO88025CRFPINT = 0x62 | |||||
IFT_ISO88025DTR = 0x56 | |||||
IFT_ISO88025FIBER = 0x73 | |||||
IFT_ISO88026 = 0xa | |||||
IFT_ISUP = 0xb3 | |||||
IFT_L3IPXVLAN = 0x89 | |||||
IFT_LAPB = 0x10 | |||||
IFT_LAPD = 0x4d | |||||
IFT_LAPF = 0x77 | |||||
IFT_LOCALTALK = 0x2a | |||||
IFT_LOOP = 0x18 | |||||
IFT_MEDIAMAILOVERIP = 0x8b | |||||
IFT_MFSIGLINK = 0xa7 | |||||
IFT_MIOX25 = 0x26 | |||||
IFT_MODEM = 0x30 | |||||
IFT_MPC = 0x71 | |||||
IFT_MPLS = 0xa6 | |||||
IFT_MPLSTUNNEL = 0x96 | |||||
IFT_MSDSL = 0x8f | |||||
IFT_MVL = 0xbf | |||||
IFT_MYRINET = 0x63 | |||||
IFT_NFAS = 0xaf | |||||
IFT_NSIP = 0x1b | |||||
IFT_OPTICALCHANNEL = 0xc3 | |||||
IFT_OPTICALTRANSPORT = 0xc4 | |||||
IFT_OTHER = 0x1 | |||||
IFT_P10 = 0xc | |||||
IFT_P80 = 0xd | |||||
IFT_PARA = 0x22 | |||||
IFT_PFLOG = 0xf6 | |||||
IFT_PFSYNC = 0xf7 | |||||
IFT_PLC = 0xae | |||||
IFT_POS = 0xab | |||||
IFT_PPPMULTILINKBUNDLE = 0x6c | |||||
IFT_PROPBWAP2MP = 0xb8 | |||||
IFT_PROPCNLS = 0x59 | |||||
IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 | |||||
IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 | |||||
IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 | |||||
IFT_PROPMUX = 0x36 | |||||
IFT_PROPWIRELESSP2P = 0x9d | |||||
IFT_PTPSERIAL = 0x16 | |||||
IFT_PVC = 0xf1 | |||||
IFT_QLLC = 0x44 | |||||
IFT_RADIOMAC = 0xbc | |||||
IFT_RADSL = 0x5f | |||||
IFT_REACHDSL = 0xc0 | |||||
IFT_RFC1483 = 0x9f | |||||
IFT_RS232 = 0x21 | |||||
IFT_RSRB = 0x4f | |||||
IFT_SDLC = 0x11 | |||||
IFT_SDSL = 0x60 | |||||
IFT_SHDSL = 0xa9 | |||||
IFT_SIP = 0x1f | |||||
IFT_SLIP = 0x1c | |||||
IFT_SMDSDXI = 0x2b | |||||
IFT_SMDSICIP = 0x34 | |||||
IFT_SONET = 0x27 | |||||
IFT_SONETOVERHEADCHANNEL = 0xb9 | |||||
IFT_SONETPATH = 0x32 | |||||
IFT_SONETVT = 0x33 | |||||
IFT_SRP = 0x97 | |||||
IFT_SS7SIGLINK = 0x9c | |||||
IFT_STACKTOSTACK = 0x6f | |||||
IFT_STARLAN = 0xb | |||||
IFT_STF = 0xd7 | |||||
IFT_T1 = 0x12 | |||||
IFT_TDLC = 0x74 | |||||
IFT_TERMPAD = 0x5b | |||||
IFT_TR008 = 0xb0 | |||||
IFT_TRANSPHDLC = 0x7b | |||||
IFT_TUNNEL = 0x83 | |||||
IFT_ULTRA = 0x1d | |||||
IFT_USB = 0xa0 | |||||
IFT_V11 = 0x40 | |||||
IFT_V35 = 0x2d | |||||
IFT_V36 = 0x41 | |||||
IFT_V37 = 0x78 | |||||
IFT_VDSL = 0x61 | |||||
IFT_VIRTUALIPADDRESS = 0x70 | |||||
IFT_VOICEEM = 0x64 | |||||
IFT_VOICEENCAP = 0x67 | |||||
IFT_VOICEFXO = 0x65 | |||||
IFT_VOICEFXS = 0x66 | |||||
IFT_VOICEOVERATM = 0x98 | |||||
IFT_VOICEOVERFRAMERELAY = 0x99 | |||||
IFT_VOICEOVERIP = 0x68 | |||||
IFT_X213 = 0x5d | |||||
IFT_X25 = 0x5 | |||||
IFT_X25DDN = 0x4 | |||||
IFT_X25HUNTGROUP = 0x7a | |||||
IFT_X25MLP = 0x79 | |||||
IFT_X25PLE = 0x28 | |||||
IFT_XETHER = 0x1a | |||||
// missing constants on FreeBSD-11.1-RELEASE, copied from old values in ztypes_freebsd_arm.go | |||||
IFF_SMART = 0x20 | |||||
IFT_FAITH = 0xf2 | |||||
IFT_IPXIP = 0xf9 | |||||
IPPROTO_MAXID = 0x34 | |||||
IPV6_FAITH = 0x1d | |||||
IP_FAITH = 0x16 | |||||
MAP_NORESERVE = 0x40 | |||||
MAP_RENAME = 0x20 | |||||
NET_RT_MAXID = 0x6 | |||||
RTF_PRCLONING = 0x10000 | |||||
RTM_OLDADD = 0x9 | |||||
RTM_OLDDEL = 0xa | |||||
SIOCADDRT = 0x8030720a | |||||
SIOCALIFADDR = 0x8118691b | |||||
SIOCDELRT = 0x8030720b | |||||
SIOCDLIFADDR = 0x8118691d | |||||
SIOCGLIFADDR = 0xc118691c | |||||
SIOCGLIFPHYADDR = 0xc118694b | |||||
SIOCSLIFPHYADDR = 0x8118694a | |||||
) |
@ -1,4 +1,4 @@ | |||||
// +build linux,386 linux,arm | |||||
// +build linux,386 linux,arm linux,mips linux,mipsle | |||||
// Copyright 2014 The Go Authors. All rights reserved. | // Copyright 2014 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 |
@ -0,0 +1,30 @@ | |||||
// Copyright 2018 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. | |||||
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris | |||||
package unix | |||||
import "runtime" | |||||
// IoctlSetWinsize performs an ioctl on fd with a *Winsize argument. | |||||
// | |||||
// To change fd's window size, the req argument should be TIOCSWINSZ. | |||||
func IoctlSetWinsize(fd int, req uint, value *Winsize) error { | |||||
// TODO: if we get the chance, remove the req parameter and | |||||
// hardcode TIOCSWINSZ. | |||||
err := ioctlSetWinsize(fd, req, value) | |||||
runtime.KeepAlive(value) | |||||
return err | |||||
} | |||||
// IoctlSetTermios performs an ioctl on fd with a *Termios. | |||||
// | |||||
// The req value will usually be TCSETA or TIOCSETA. | |||||
func IoctlSetTermios(fd int, req uint, value *Termios) error { | |||||
// TODO: if we get the chance, remove the req parameter. | |||||
err := ioctlSetTermios(fd, req, value) | |||||
runtime.KeepAlive(value) | |||||
return err | |||||
} |
@ -0,0 +1,166 @@ | |||||
// Copyright 2016 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. | |||||
// +build openbsd | |||||
// +build 386 amd64 arm | |||||
package unix | |||||
import ( | |||||
"errors" | |||||
"fmt" | |||||
"strconv" | |||||
"syscall" | |||||
"unsafe" | |||||
) | |||||
// Pledge implements the pledge syscall. | |||||
// | |||||
// The pledge syscall does not accept execpromises on OpenBSD releases | |||||
// before 6.3. | |||||
// | |||||
// execpromises must be empty when Pledge is called on OpenBSD | |||||
// releases predating 6.3, otherwise an error will be returned. | |||||
// | |||||
// For more information see pledge(2). | |||||
func Pledge(promises, execpromises string) error { | |||||
maj, min, err := majmin() | |||||
if err != nil { | |||||
return err | |||||
} | |||||
err = pledgeAvailable(maj, min, execpromises) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
pptr, err := syscall.BytePtrFromString(promises) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
// This variable will hold either a nil unsafe.Pointer or | |||||
// an unsafe.Pointer to a string (execpromises). | |||||
var expr unsafe.Pointer | |||||
// If we're running on OpenBSD > 6.2, pass execpromises to the syscall. | |||||
if maj > 6 || (maj == 6 && min > 2) { | |||||
exptr, err := syscall.BytePtrFromString(execpromises) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
expr = unsafe.Pointer(exptr) | |||||
} | |||||
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)), uintptr(expr), 0) | |||||
if e != 0 { | |||||
return e | |||||
} | |||||
return nil | |||||
} | |||||
// PledgePromises implements the pledge syscall. | |||||
// | |||||
// This changes the promises and leaves the execpromises untouched. | |||||
// | |||||
// For more information see pledge(2). | |||||
func PledgePromises(promises string) error { | |||||
maj, min, err := majmin() | |||||
if err != nil { | |||||
return err | |||||
} | |||||
err = pledgeAvailable(maj, min, "") | |||||
if err != nil { | |||||
return err | |||||
} | |||||
// This variable holds the execpromises and is always nil. | |||||
var expr unsafe.Pointer | |||||
pptr, err := syscall.BytePtrFromString(promises) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)), uintptr(expr), 0) | |||||
if e != 0 { | |||||
return e | |||||
} | |||||
return nil | |||||
} | |||||
// PledgeExecpromises implements the pledge syscall. | |||||
// | |||||
// This changes the execpromises and leaves the promises untouched. | |||||
// | |||||
// For more information see pledge(2). | |||||
func PledgeExecpromises(execpromises string) error { | |||||
maj, min, err := majmin() | |||||
if err != nil { | |||||
return err | |||||
} | |||||
err = pledgeAvailable(maj, min, execpromises) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
// This variable holds the promises and is always nil. | |||||
var pptr unsafe.Pointer | |||||
exptr, err := syscall.BytePtrFromString(execpromises) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(pptr), uintptr(unsafe.Pointer(exptr)), 0) | |||||
if e != 0 { | |||||
return e | |||||
} | |||||
return nil | |||||
} | |||||
// majmin returns major and minor version number for an OpenBSD system. | |||||
func majmin() (major int, minor int, err error) { | |||||
var v Utsname | |||||
err = Uname(&v) | |||||
if err != nil { | |||||
return | |||||
} | |||||
major, err = strconv.Atoi(string(v.Release[0])) | |||||
if err != nil { | |||||
err = errors.New("cannot parse major version number returned by uname") | |||||
return | |||||
} | |||||
minor, err = strconv.Atoi(string(v.Release[2])) | |||||
if err != nil { | |||||
err = errors.New("cannot parse minor version number returned by uname") | |||||
return | |||||
} | |||||
return | |||||
} | |||||
// pledgeAvailable checks for availability of the pledge(2) syscall | |||||
// based on the running OpenBSD version. | |||||
func pledgeAvailable(maj, min int, execpromises string) error { | |||||
// If OpenBSD <= 5.9, pledge is not available. | |||||
if (maj == 5 && min != 9) || maj < 5 { | |||||
return fmt.Errorf("pledge syscall is not available on OpenBSD %d.%d", maj, min) | |||||
} | |||||
// If OpenBSD <= 6.2 and execpromises is not empty, | |||||
// return an error - execpromises is not available before 6.3 | |||||
if (maj < 6 || (maj == 6 && min <= 2)) && execpromises != "" { | |||||
return fmt.Errorf("cannot use execpromises on OpenBSD %d.%d", maj, min) | |||||
} | |||||
return nil | |||||
} |
@ -0,0 +1,44 @@ | |||||
// Copyright 2018 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. | |||||
// +build openbsd | |||||
package unix | |||||
import ( | |||||
"syscall" | |||||
"unsafe" | |||||
) | |||||
// Unveil implements the unveil syscall. | |||||
// For more information see unveil(2). | |||||
// Note that the special case of blocking further | |||||
// unveil calls is handled by UnveilBlock. | |||||
func Unveil(path string, flags string) error { | |||||
pathPtr, err := syscall.BytePtrFromString(path) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
flagsPtr, err := syscall.BytePtrFromString(flags) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
_, _, e := syscall.Syscall(SYS_UNVEIL, uintptr(unsafe.Pointer(pathPtr)), uintptr(unsafe.Pointer(flagsPtr)), 0) | |||||
if e != 0 { | |||||
return e | |||||
} | |||||
return nil | |||||
} | |||||
// UnveilBlock blocks future unveil calls. | |||||
// For more information see unveil(2). | |||||
func UnveilBlock() error { | |||||
// Both pointers must be nil. | |||||
var pathUnsafe, flagsUnsafe unsafe.Pointer | |||||
_, _, e := syscall.Syscall(SYS_UNVEIL, uintptr(pathUnsafe), uintptr(flagsUnsafe), 0) | |||||
if e != 0 { | |||||
return e | |||||
} | |||||
return nil | |||||
} |
@ -0,0 +1,15 @@ | |||||
// Copyright 2017 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. | |||||
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris | |||||
// For Unix, get the pagesize from the runtime. | |||||
package unix | |||||
import "syscall" | |||||
func Getpagesize() int { | |||||
return syscall.Getpagesize() | |||||
} |
@ -0,0 +1,547 @@ | |||||
// Copyright 2018 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. | |||||
// +build aix | |||||
// Aix system calls. | |||||
// This file is compiled as ordinary Go code, | |||||
// but it is also input to mksyscall, | |||||
// which parses the //sys lines and generates system call stubs. | |||||
// Note that sometimes we use a lowercase //sys name and | |||||
// wrap it in our own nicer implementation. | |||||
package unix | |||||
import ( | |||||
"syscall" | |||||
"unsafe" | |||||
) | |||||
/* | |||||
* Wrapped | |||||
*/ | |||||
//sys utimes(path string, times *[2]Timeval) (err error) | |||||
func Utimes(path string, tv []Timeval) error { | |||||
if len(tv) != 2 { | |||||
return EINVAL | |||||
} | |||||
return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) | |||||
} | |||||
//sys utimensat(dirfd int, path string, times *[2]Timespec, flag int) (err error) | |||||
func UtimesNano(path string, ts []Timespec) error { | |||||
if len(ts) != 2 { | |||||
return EINVAL | |||||
} | |||||
return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) | |||||
} | |||||
func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { | |||||
if ts == nil { | |||||
return utimensat(dirfd, path, nil, flags) | |||||
} | |||||
if len(ts) != 2 { | |||||
return EINVAL | |||||
} | |||||
return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) | |||||
} | |||||
func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { | |||||
if sa.Port < 0 || sa.Port > 0xFFFF { | |||||
return nil, 0, EINVAL | |||||
} | |||||
sa.raw.Family = AF_INET | |||||
p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) | |||||
p[0] = byte(sa.Port >> 8) | |||||
p[1] = byte(sa.Port) | |||||
for i := 0; i < len(sa.Addr); i++ { | |||||
sa.raw.Addr[i] = sa.Addr[i] | |||||
} | |||||
return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil | |||||
} | |||||
func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { | |||||
if sa.Port < 0 || sa.Port > 0xFFFF { | |||||
return nil, 0, EINVAL | |||||
} | |||||
sa.raw.Family = AF_INET6 | |||||
p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) | |||||
p[0] = byte(sa.Port >> 8) | |||||
p[1] = byte(sa.Port) | |||||
sa.raw.Scope_id = sa.ZoneId | |||||
for i := 0; i < len(sa.Addr); i++ { | |||||
sa.raw.Addr[i] = sa.Addr[i] | |||||
} | |||||
return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil | |||||
} | |||||
func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { | |||||
name := sa.Name | |||||
n := len(name) | |||||
if n > len(sa.raw.Path) { | |||||
return nil, 0, EINVAL | |||||
} | |||||
if n == len(sa.raw.Path) && name[0] != '@' { | |||||
return nil, 0, EINVAL | |||||
} | |||||
sa.raw.Family = AF_UNIX | |||||
for i := 0; i < n; i++ { | |||||
sa.raw.Path[i] = uint8(name[i]) | |||||
} | |||||
// length is family (uint16), name, NUL. | |||||
sl := _Socklen(2) | |||||
if n > 0 { | |||||
sl += _Socklen(n) + 1 | |||||
} | |||||
if sa.raw.Path[0] == '@' { | |||||
sa.raw.Path[0] = 0 | |||||
// Don't count trailing NUL for abstract address. | |||||
sl-- | |||||
} | |||||
return unsafe.Pointer(&sa.raw), sl, nil | |||||
} | |||||
func Getsockname(fd int) (sa Sockaddr, err error) { | |||||
var rsa RawSockaddrAny | |||||
var len _Socklen = SizeofSockaddrAny | |||||
if err = getsockname(fd, &rsa, &len); err != nil { | |||||
return | |||||
} | |||||
return anyToSockaddr(fd, &rsa) | |||||
} | |||||
//sys getcwd(buf []byte) (err error) | |||||
const ImplementsGetwd = true | |||||
func Getwd() (ret string, err error) { | |||||
for len := uint64(4096); ; len *= 2 { | |||||
b := make([]byte, len) | |||||
err := getcwd(b) | |||||
if err == nil { | |||||
i := 0 | |||||
for b[i] != 0 { | |||||
i++ | |||||
} | |||||
return string(b[0:i]), nil | |||||
} | |||||
if err != ERANGE { | |||||
return "", err | |||||
} | |||||
} | |||||
} | |||||
func Getcwd(buf []byte) (n int, err error) { | |||||
err = getcwd(buf) | |||||
if err == nil { | |||||
i := 0 | |||||
for buf[i] != 0 { | |||||
i++ | |||||
} | |||||
n = i + 1 | |||||
} | |||||
return | |||||
} | |||||
func Getgroups() (gids []int, err error) { | |||||
n, err := getgroups(0, nil) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
if n == 0 { | |||||
return nil, nil | |||||
} | |||||
// Sanity check group count. Max is 16 on BSD. | |||||
if n < 0 || n > 1000 { | |||||
return nil, EINVAL | |||||
} | |||||
a := make([]_Gid_t, n) | |||||
n, err = getgroups(n, &a[0]) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
gids = make([]int, n) | |||||
for i, v := range a[0:n] { | |||||
gids[i] = int(v) | |||||
} | |||||
return | |||||
} | |||||
func Setgroups(gids []int) (err error) { | |||||
if len(gids) == 0 { | |||||
return setgroups(0, nil) | |||||
} | |||||
a := make([]_Gid_t, len(gids)) | |||||
for i, v := range gids { | |||||
a[i] = _Gid_t(v) | |||||
} | |||||
return setgroups(len(a), &a[0]) | |||||
} | |||||
/* | |||||
* Socket | |||||
*/ | |||||
//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) | |||||
func Accept(fd int) (nfd int, sa Sockaddr, err error) { | |||||
var rsa RawSockaddrAny | |||||
var len _Socklen = SizeofSockaddrAny | |||||
nfd, err = accept(fd, &rsa, &len) | |||||
if nfd == -1 { | |||||
return | |||||
} | |||||
sa, err = anyToSockaddr(fd, &rsa) | |||||
if err != nil { | |||||
Close(nfd) | |||||
nfd = 0 | |||||
} | |||||
return | |||||
} | |||||
func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { | |||||
// Recvmsg not implemented on AIX | |||||
sa := new(SockaddrUnix) | |||||
return -1, -1, -1, sa, ENOSYS | |||||
} | |||||
func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { | |||||
_, err = SendmsgN(fd, p, oob, to, flags) | |||||
return | |||||
} | |||||
func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { | |||||
// SendmsgN not implemented on AIX | |||||
return -1, ENOSYS | |||||
} | |||||
func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { | |||||
switch rsa.Addr.Family { | |||||
case AF_UNIX: | |||||
pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) | |||||
sa := new(SockaddrUnix) | |||||
// Some versions of AIX have a bug in getsockname (see IV78655). | |||||
// We can't rely on sa.Len being set correctly. | |||||
n := SizeofSockaddrUnix - 3 // substract leading Family, Len, terminating NUL. | |||||
for i := 0; i < n; i++ { | |||||
if pp.Path[i] == 0 { | |||||
n = i | |||||
break | |||||
} | |||||
} | |||||
bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] | |||||
sa.Name = string(bytes) | |||||
return sa, nil | |||||
case AF_INET: | |||||
pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) | |||||
sa := new(SockaddrInet4) | |||||
p := (*[2]byte)(unsafe.Pointer(&pp.Port)) | |||||
sa.Port = int(p[0])<<8 + int(p[1]) | |||||
for i := 0; i < len(sa.Addr); i++ { | |||||
sa.Addr[i] = pp.Addr[i] | |||||
} | |||||
return sa, nil | |||||
case AF_INET6: | |||||
pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) | |||||
sa := new(SockaddrInet6) | |||||
p := (*[2]byte)(unsafe.Pointer(&pp.Port)) | |||||
sa.Port = int(p[0])<<8 + int(p[1]) | |||||
sa.ZoneId = pp.Scope_id | |||||
for i := 0; i < len(sa.Addr); i++ { | |||||
sa.Addr[i] = pp.Addr[i] | |||||
} | |||||
return sa, nil | |||||
} | |||||
return nil, EAFNOSUPPORT | |||||
} | |||||
func Gettimeofday(tv *Timeval) (err error) { | |||||
err = gettimeofday(tv, nil) | |||||
return | |||||
} | |||||
// TODO | |||||
func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { | |||||
return -1, ENOSYS | |||||
} | |||||
//sys getdirent(fd int, buf []byte) (n int, err error) | |||||
func ReadDirent(fd int, buf []byte) (n int, err error) { | |||||
return getdirent(fd, buf) | |||||
} | |||||
//sys wait4(pid Pid_t, status *_C_int, options int, rusage *Rusage) (wpid Pid_t, err error) | |||||
func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { | |||||
var status _C_int | |||||
var r Pid_t | |||||
err = ERESTART | |||||
// AIX wait4 may return with ERESTART errno, while the processus is still | |||||
// active. | |||||
for err == ERESTART { | |||||
r, err = wait4(Pid_t(pid), &status, options, rusage) | |||||
} | |||||
wpid = int(r) | |||||
if wstatus != nil { | |||||
*wstatus = WaitStatus(status) | |||||
} | |||||
return | |||||
} | |||||
/* | |||||
* Wait | |||||
*/ | |||||
type WaitStatus uint32 | |||||
func (w WaitStatus) Stopped() bool { return w&0x40 != 0 } | |||||
func (w WaitStatus) StopSignal() Signal { | |||||
if !w.Stopped() { | |||||
return -1 | |||||
} | |||||
return Signal(w>>8) & 0xFF | |||||
} | |||||
func (w WaitStatus) Exited() bool { return w&0xFF == 0 } | |||||
func (w WaitStatus) ExitStatus() int { | |||||
if !w.Exited() { | |||||
return -1 | |||||
} | |||||
return int((w >> 8) & 0xFF) | |||||
} | |||||
func (w WaitStatus) Signaled() bool { return w&0x40 == 0 && w&0xFF != 0 } | |||||
func (w WaitStatus) Signal() Signal { | |||||
if !w.Signaled() { | |||||
return -1 | |||||
} | |||||
return Signal(w>>16) & 0xFF | |||||
} | |||||
func (w WaitStatus) Continued() bool { return w&0x01000000 != 0 } | |||||
func (w WaitStatus) CoreDump() bool { return w&0x200 != 0 } | |||||
func (w WaitStatus) TrapCause() int { return -1 } | |||||
//sys ioctl(fd int, req uint, arg uintptr) (err error) | |||||
// ioctl itself should not be exposed directly, but additional get/set | |||||
// functions for specific types are permissible. | |||||
// IoctlSetInt performs an ioctl operation which sets an integer value | |||||
// on fd, using the specified request number. | |||||
func IoctlSetInt(fd int, req uint, value int) error { | |||||
return ioctl(fd, req, uintptr(value)) | |||||
} | |||||
func ioctlSetWinsize(fd int, req uint, value *Winsize) error { | |||||
return ioctl(fd, req, uintptr(unsafe.Pointer(value))) | |||||
} | |||||
func ioctlSetTermios(fd int, req uint, value *Termios) error { | |||||
return ioctl(fd, req, uintptr(unsafe.Pointer(value))) | |||||
} | |||||
// IoctlGetInt performs an ioctl operation which gets an integer value | |||||
// from fd, using the specified request number. | |||||
func IoctlGetInt(fd int, req uint) (int, error) { | |||||
var value int | |||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | |||||
return value, err | |||||
} | |||||
func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { | |||||
var value Winsize | |||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | |||||
return &value, err | |||||
} | |||||
func IoctlGetTermios(fd int, req uint) (*Termios, error) { | |||||
var value Termios | |||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | |||||
return &value, err | |||||
} | |||||
// fcntl must never be called with cmd=F_DUP2FD because it doesn't work on AIX | |||||
// There is no way to create a custom fcntl and to keep //sys fcntl easily, | |||||
// Therefore, the programmer must call dup2 instead of fcntl in this case. | |||||
// FcntlInt performs a fcntl syscall on fd with the provided command and argument. | |||||
//sys FcntlInt(fd uintptr, cmd int, arg int) (r int,err error) = fcntl | |||||
// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. | |||||
//sys FcntlFlock(fd uintptr, cmd int, lk *Flock_t) (err error) = fcntl | |||||
//sys fcntl(fd int, cmd int, arg int) (val int, err error) | |||||
func Flock(fd int, how int) (err error) { | |||||
return syscall.Flock(fd, how) | |||||
} | |||||
/* | |||||
* Direct access | |||||
*/ | |||||
//sys Acct(path string) (err error) | |||||
//sys Chdir(path string) (err error) | |||||
//sys Chroot(path string) (err error) | |||||
//sys Close(fd int) (err error) | |||||
//sys Dup(oldfd int) (fd int, err error) | |||||
//sys Exit(code int) | |||||
//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) | |||||
//sys Fchdir(fd int) (err error) | |||||
//sys Fchmod(fd int, mode uint32) (err error) | |||||
//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) | |||||
//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) | |||||
//sys Fdatasync(fd int) (err error) | |||||
//sys Fsync(fd int) (err error) | |||||
// readdir_r | |||||
//sysnb Getpgid(pid int) (pgid int, err error) | |||||
//sys Getpgrp() (pid int) | |||||
//sysnb Getpid() (pid int) | |||||
//sysnb Getppid() (ppid int) | |||||
//sys Getpriority(which int, who int) (prio int, err error) | |||||
//sysnb Getrusage(who int, rusage *Rusage) (err error) | |||||
//sysnb Getsid(pid int) (sid int, err error) | |||||
//sysnb Kill(pid int, sig Signal) (err error) | |||||
//sys Klogctl(typ int, buf []byte) (n int, err error) = syslog | |||||
//sys Mkdir(dirfd int, path string, mode uint32) (err error) | |||||
//sys Mkdirat(dirfd int, path string, mode uint32) (err error) | |||||
//sys Mkfifo(path string, mode uint32) (err error) | |||||
//sys Mknod(path string, mode uint32, dev int) (err error) | |||||
//sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) | |||||
//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) | |||||
//sys Open(path string, mode int, perm uint32) (fd int, err error) = open64 | |||||
//sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) | |||||
//sys read(fd int, p []byte) (n int, err error) | |||||
//sys Readlink(path string, buf []byte) (n int, err error) | |||||
//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) | |||||
//sys Setdomainname(p []byte) (err error) | |||||
//sys Sethostname(p []byte) (err error) | |||||
//sysnb Setpgid(pid int, pgid int) (err error) | |||||
//sysnb Setsid() (pid int, err error) | |||||
//sysnb Settimeofday(tv *Timeval) (err error) | |||||
//sys Setuid(uid int) (err error) | |||||
//sys Setgid(uid int) (err error) | |||||
//sys Setpriority(which int, who int, prio int) (err error) | |||||
//sys Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) | |||||
//sys Sync() | |||||
//sysnb Times(tms *Tms) (ticks uintptr, err error) | |||||
//sysnb Umask(mask int) (oldmask int) | |||||
//sysnb Uname(buf *Utsname) (err error) | |||||
//TODO umount | |||||
// //sys Unmount(target string, flags int) (err error) = umount | |||||
//sys Unlink(path string) (err error) | |||||
//sys Unlinkat(dirfd int, path string, flags int) (err error) | |||||
//sys Ustat(dev int, ubuf *Ustat_t) (err error) | |||||
//sys write(fd int, p []byte) (n int, err error) | |||||
//sys readlen(fd int, p *byte, np int) (n int, err error) = read | |||||
//sys writelen(fd int, p *byte, np int) (n int, err error) = write | |||||
//sys Dup2(oldfd int, newfd int) (err error) | |||||
//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = posix_fadvise64 | |||||
//sys Fchown(fd int, uid int, gid int) (err error) | |||||
//sys Fstat(fd int, stat *Stat_t) (err error) | |||||
//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = fstatat | |||||
//sys Fstatfs(fd int, buf *Statfs_t) (err error) | |||||
//sys Ftruncate(fd int, length int64) (err error) | |||||
//sysnb Getegid() (egid int) | |||||
//sysnb Geteuid() (euid int) | |||||
//sysnb Getgid() (gid int) | |||||
//sysnb Getuid() (uid int) | |||||
//sys Lchown(path string, uid int, gid int) (err error) | |||||
//sys Listen(s int, n int) (err error) | |||||
//sys Lstat(path string, stat *Stat_t) (err error) | |||||
//sys Pause() (err error) | |||||
//sys Pread(fd int, p []byte, offset int64) (n int, err error) = pread64 | |||||
//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = pwrite64 | |||||
//TODO Select | |||||
// //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) | |||||
//sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) | |||||
//sysnb Setregid(rgid int, egid int) (err error) | |||||
//sysnb Setreuid(ruid int, euid int) (err error) | |||||
//sys Shutdown(fd int, how int) (err error) | |||||
//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) | |||||
//sys Stat(path string, stat *Stat_t) (err error) | |||||
//sys Statfs(path string, buf *Statfs_t) (err error) | |||||
//sys Truncate(path string, length int64) (err error) | |||||
//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) | |||||
//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) | |||||
//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) | |||||
//sysnb setgroups(n int, list *_Gid_t) (err error) | |||||
//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) | |||||
//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) | |||||
//sysnb socket(domain int, typ int, proto int) (fd int, err error) | |||||
//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) | |||||
//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) | |||||
//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) | |||||
//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) | |||||
//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) | |||||
//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) | |||||
//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) | |||||
//sys munmap(addr uintptr, length uintptr) (err error) | |||||
var mapper = &mmapper{ | |||||
active: make(map[*byte][]byte), | |||||
mmap: mmap, | |||||
munmap: munmap, | |||||
} | |||||
func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { | |||||
return mapper.Mmap(fd, offset, length, prot, flags) | |||||
} | |||||
func Munmap(b []byte) (err error) { | |||||
return mapper.Munmap(b) | |||||
} | |||||
//sys Madvise(b []byte, advice int) (err error) | |||||
//sys Mprotect(b []byte, prot int) (err error) | |||||
//sys Mlock(b []byte) (err error) | |||||
//sys Mlockall(flags int) (err error) | |||||
//sys Msync(b []byte, flags int) (err error) | |||||
//sys Munlock(b []byte) (err error) | |||||
//sys Munlockall() (err error) | |||||
//sysnb pipe(p *[2]_C_int) (err error) | |||||
func Pipe(p []int) (err error) { | |||||
if len(p) != 2 { | |||||
return EINVAL | |||||
} | |||||
var pp [2]_C_int | |||||
err = pipe(&pp) | |||||
p[0] = int(pp[0]) | |||||
p[1] = int(pp[1]) | |||||
return | |||||
} | |||||
//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) | |||||
func Poll(fds []PollFd, timeout int) (n int, err error) { | |||||
if len(fds) == 0 { | |||||
return poll(nil, 0, timeout) | |||||
} | |||||
return poll(&fds[0], len(fds), timeout) | |||||
} | |||||
//sys gettimeofday(tv *Timeval, tzp *Timezone) (err error) | |||||
//sysnb Time(t *Time_t) (tt Time_t, err error) | |||||
//sys Utime(path string, buf *Utimbuf) (err error) |
@ -0,0 +1,34 @@ | |||||
// Copyright 2018 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. | |||||
// +build aix | |||||
// +build ppc | |||||
package unix | |||||
//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) = getrlimit64 | |||||
//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) = setrlimit64 | |||||
//sys Seek(fd int, offset int64, whence int) (off int64, err error) = lseek64 | |||||
//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) | |||||
func setTimespec(sec, nsec int64) Timespec { | |||||
return Timespec{Sec: int32(sec), Nsec: int32(nsec)} | |||||
} | |||||
func setTimeval(sec, usec int64) Timeval { | |||||
return Timeval{Sec: int32(sec), Usec: int32(usec)} | |||||
} | |||||
func (iov *Iovec) SetLen(length int) { | |||||
iov.Len = uint32(length) | |||||
} | |||||
func (msghdr *Msghdr) SetControllen(length int) { | |||||
msghdr.Controllen = uint32(length) | |||||
} | |||||
func (cmsg *Cmsghdr) SetLen(length int) { | |||||
cmsg.Len = uint32(length) | |||||
} |
@ -0,0 +1,34 @@ | |||||
// Copyright 2018 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. | |||||
// +build aix | |||||
// +build ppc64 | |||||
package unix | |||||
//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) | |||||
//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) | |||||
//sys Seek(fd int, offset int64, whence int) (off int64, err error) = lseek | |||||
//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) = mmap64 | |||||
func setTimespec(sec, nsec int64) Timespec { | |||||
return Timespec{Sec: sec, Nsec: nsec} | |||||
} | |||||
func setTimeval(sec, usec int64) Timeval { | |||||
return Timeval{Sec: int64(sec), Usec: int32(usec)} | |||||
} | |||||
func (iov *Iovec) SetLen(length int) { | |||||
iov.Len = uint64(length) | |||||
} | |||||
func (msghdr *Msghdr) SetControllen(length int) { | |||||
msghdr.Controllen = uint32(length) | |||||
} | |||||
func (cmsg *Cmsghdr) SetLen(length int) { | |||||
cmsg.Len = uint32(length) | |||||
} |
@ -0,0 +1,13 @@ | |||||
// Copyright 2016 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. | |||||
// +build amd64,linux | |||||
// +build !gccgo | |||||
package unix | |||||
import "syscall" | |||||
//go:noescape | |||||
func gettimeofday(tv *Timeval) (err syscall.Errno) |
@ -0,0 +1,14 @@ | |||||
// Copyright 2018 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. | |||||
// +build linux,!gccgo | |||||
package unix | |||||
// SyscallNoError may be used instead of Syscall for syscalls that don't fail. | |||||
func SyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) | |||||
// RawSyscallNoError may be used instead of RawSyscall for syscalls that don't | |||||
// fail. | |||||
func RawSyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) |
@ -0,0 +1,16 @@ | |||||
// Copyright 2018 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. | |||||
// +build linux,!gccgo,386 | |||||
package unix | |||||
import "syscall" | |||||
// 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) | |||||
func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err syscall.Errno) | |||||
func rawsocketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err syscall.Errno) |
@ -0,0 +1,30 @@ | |||||
// Copyright 2018 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. | |||||
// +build linux,gccgo,386 | |||||
package unix | |||||
import ( | |||||
"syscall" | |||||
"unsafe" | |||||
) | |||||
func seek(fd int, offset int64, whence int) (int64, syscall.Errno) { | |||||
var newoffset int64 | |||||
offsetLow := uint32(offset & 0xffffffff) | |||||
offsetHigh := uint32((offset >> 32) & 0xffffffff) | |||||
_, _, err := Syscall6(SYS__LLSEEK, uintptr(fd), uintptr(offsetHigh), uintptr(offsetLow), uintptr(unsafe.Pointer(&newoffset)), uintptr(whence), 0) | |||||
return newoffset, err | |||||
} | |||||
func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (int, syscall.Errno) { | |||||
fd, _, err := Syscall(SYS_SOCKETCALL, uintptr(call), uintptr(unsafe.Pointer(&a0)), 0) | |||||
return int(fd), err | |||||
} | |||||
func rawsocketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (int, syscall.Errno) { | |||||
fd, _, err := RawSyscall(SYS_SOCKETCALL, uintptr(call), uintptr(unsafe.Pointer(&a0)), 0) | |||||
return int(fd), err | |||||
} |
@ -0,0 +1,20 @@ | |||||
// Copyright 2018 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. | |||||
// +build linux,gccgo,arm | |||||
package unix | |||||
import ( | |||||
"syscall" | |||||
"unsafe" | |||||
) | |||||
func seek(fd int, offset int64, whence int) (int64, syscall.Errno) { | |||||
var newoffset int64 | |||||
offsetLow := uint32(offset & 0xffffffff) | |||||
offsetHigh := uint32((offset >> 32) & 0xffffffff) | |||||
_, _, err := Syscall6(SYS__LLSEEK, uintptr(fd), uintptr(offsetHigh), uintptr(offsetLow), uintptr(unsafe.Pointer(&newoffset)), uintptr(whence), 0) | |||||
return newoffset, err | |||||
} |
@ -0,0 +1,233 @@ | |||||
// Copyright 2016 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. | |||||
// +build linux | |||||
// +build mips mipsle | |||||
package unix | |||||
import ( | |||||
"syscall" | |||||
"unsafe" | |||||
) | |||||
func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) | |||||
//sys Dup2(oldfd int, newfd int) (err error) | |||||
//sysnb EpollCreate(size int) (fd int, err error) | |||||
//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) | |||||
//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 | |||||
//sys Fchown(fd int, uid int, gid int) (err error) | |||||
//sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 | |||||
//sysnb Getegid() (egid int) | |||||
//sysnb Geteuid() (euid int) | |||||
//sysnb Getgid() (gid int) | |||||
//sysnb Getuid() (uid int) | |||||
//sys Lchown(path string, uid int, gid int) (err error) | |||||
//sys Listen(s int, n int) (err error) | |||||
//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 | |||||
//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 | |||||
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT | |||||
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 | |||||
//sys Setfsgid(gid int) (err error) | |||||
//sys Setfsuid(uid int) (err error) | |||||
//sysnb Setregid(rgid int, egid int) (err error) | |||||
//sysnb Setresgid(rgid int, egid int, sgid int) (err error) | |||||
//sysnb Setresuid(ruid int, euid int, suid int) (err error) | |||||
//sysnb Setreuid(ruid int, euid int) (err error) | |||||
//sys Shutdown(fd int, how int) (err error) | |||||
//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) | |||||
//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) | |||||
//sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 | |||||
//sys Ustat(dev int, ubuf *Ustat_t) (err error) | |||||
//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) | |||||
//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) | |||||
//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) | |||||
//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) | |||||
//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) | |||||
//sysnb setgroups(n int, list *_Gid_t) (err error) | |||||
//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) | |||||
//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) | |||||
//sysnb socket(domain int, typ int, proto int) (fd int, err error) | |||||
//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) | |||||
//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) | |||||
//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) | |||||
//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) | |||||
//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) | |||||
//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) | |||||
//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) | |||||
//sysnb InotifyInit() (fd int, err error) | |||||
//sys Ioperm(from int, num int, on int) (err error) | |||||
//sys Iopl(level int) (err error) | |||||
//sys futimesat(dirfd int, path string, times *[2]Timeval) (err error) | |||||
//sysnb Gettimeofday(tv *Timeval) (err error) | |||||
//sysnb Time(t *Time_t) (tt Time_t, err error) | |||||
//sys Utime(path string, buf *Utimbuf) (err error) | |||||
//sys utimes(path string, times *[2]Timeval) (err error) | |||||
//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 | |||||
//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 | |||||
//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 | |||||
//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 | |||||
//sys Pause() (err error) | |||||
func Fstatfs(fd int, buf *Statfs_t) (err error) { | |||||
_, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) | |||||
if e != 0 { | |||||
err = errnoErr(e) | |||||
} | |||||
return | |||||
} | |||||
func Statfs(path string, buf *Statfs_t) (err error) { | |||||
p, err := BytePtrFromString(path) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
_, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(p)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) | |||||
if e != 0 { | |||||
err = errnoErr(e) | |||||
} | |||||
return | |||||
} | |||||
func Seek(fd int, offset int64, whence int) (off int64, err error) { | |||||
_, _, e := Syscall6(SYS__LLSEEK, uintptr(fd), uintptr(offset>>32), uintptr(offset), uintptr(unsafe.Pointer(&off)), uintptr(whence), 0) | |||||
if e != 0 { | |||||
err = errnoErr(e) | |||||
} | |||||
return | |||||
} | |||||
func setTimespec(sec, nsec int64) Timespec { | |||||
return Timespec{Sec: int32(sec), Nsec: int32(nsec)} | |||||
} | |||||
func setTimeval(sec, usec int64) Timeval { | |||||
return Timeval{Sec: int32(sec), Usec: int32(usec)} | |||||
} | |||||
//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 | |||||
} | |||||
//sysnb pipe() (p1 int, p2 int, err error) | |||||
func Pipe(p []int) (err error) { | |||||
if len(p) != 2 { | |||||
return EINVAL | |||||
} | |||||
p[0], p[1], err = pipe() | |||||
return | |||||
} | |||||
//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) | |||||
func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { | |||||
page := uintptr(offset / 4096) | |||||
if offset != int64(page)*4096 { | |||||
return 0, EINVAL | |||||
} | |||||
return mmap2(addr, length, prot, flags, fd, page) | |||||
} | |||||
const rlimInf32 = ^uint32(0) | |||||
const rlimInf64 = ^uint64(0) | |||||
type rlimit32 struct { | |||||
Cur uint32 | |||||
Max uint32 | |||||
} | |||||
//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT | |||||
func Getrlimit(resource int, rlim *Rlimit) (err error) { | |||||
err = prlimit(0, resource, nil, rlim) | |||||
if err != ENOSYS { | |||||
return err | |||||
} | |||||
rl := rlimit32{} | |||||
err = getrlimit(resource, &rl) | |||||
if err != nil { | |||||
return | |||||
} | |||||
if rl.Cur == rlimInf32 { | |||||
rlim.Cur = rlimInf64 | |||||
} else { | |||||
rlim.Cur = uint64(rl.Cur) | |||||
} | |||||
if rl.Max == rlimInf32 { | |||||
rlim.Max = rlimInf64 | |||||
} else { | |||||
rlim.Max = uint64(rl.Max) | |||||
} | |||||
return | |||||
} | |||||
//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT | |||||
func Setrlimit(resource int, rlim *Rlimit) (err error) { | |||||
err = prlimit(0, resource, rlim, nil) | |||||
if err != ENOSYS { | |||||
return err | |||||
} | |||||
rl := rlimit32{} | |||||
if rlim.Cur == rlimInf64 { | |||||
rl.Cur = rlimInf32 | |||||
} else if rlim.Cur < uint64(rlimInf32) { | |||||
rl.Cur = uint32(rlim.Cur) | |||||
} else { | |||||
return EINVAL | |||||
} | |||||
if rlim.Max == rlimInf64 { | |||||
rl.Max = rlimInf32 | |||||
} else if rlim.Max < uint64(rlimInf32) { | |||||
rl.Max = uint32(rlim.Max) | |||||
} else { | |||||
return EINVAL | |||||
} | |||||
return setrlimit(resource, &rl) | |||||
} | |||||
func (r *PtraceRegs) PC() uint64 { return r.Epc } | |||||
func (r *PtraceRegs) SetPC(pc uint64) { r.Epc = pc } | |||||
func (iov *Iovec) SetLen(length int) { | |||||
iov.Len = uint32(length) | |||||
} | |||||
func (msghdr *Msghdr) SetControllen(length int) { | |||||
msghdr.Controllen = uint32(length) | |||||
} | |||||
func (cmsg *Cmsghdr) SetLen(length int) { | |||||
cmsg.Len = uint32(length) | |||||
} | |||||
//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) | |||||
func Poll(fds []PollFd, timeout int) (n int, err error) { | |||||
if len(fds) == 0 { | |||||
return poll(nil, 0, timeout) | |||||
} | |||||
return poll(&fds[0], len(fds), timeout) | |||||
} |
@ -0,0 +1,209 @@ | |||||
// Copyright 2018 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. | |||||
// +build riscv64,linux | |||||
package unix | |||||
import "unsafe" | |||||
func EpollCreate(size int) (fd int, err error) { | |||||
if size <= 0 { | |||||
return -1, EINVAL | |||||
} | |||||
return EpollCreate1(0) | |||||
} | |||||
//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT | |||||
//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 | |||||
//sys Fchown(fd int, uid int, gid int) (err error) | |||||
//sys Fstat(fd int, stat *Stat_t) (err error) | |||||
//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) | |||||
//sys Fstatfs(fd int, buf *Statfs_t) (err error) | |||||
//sys Ftruncate(fd int, length int64) (err error) | |||||
//sysnb Getegid() (egid int) | |||||
//sysnb Geteuid() (euid int) | |||||
//sysnb Getgid() (gid int) | |||||
//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) | |||||
//sysnb Getuid() (uid int) | |||||
//sys Listen(s int, n int) (err error) | |||||
//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 | |||||
//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 | |||||
//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK | |||||
func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { | |||||
var ts *Timespec | |||||
if timeout != nil { | |||||
ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} | |||||
} | |||||
return Pselect(nfd, r, w, e, ts, nil) | |||||
} | |||||
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) | |||||
//sys Setfsgid(gid int) (err error) | |||||
//sys Setfsuid(uid int) (err error) | |||||
//sysnb Setregid(rgid int, egid int) (err error) | |||||
//sysnb Setresgid(rgid int, egid int, sgid int) (err error) | |||||
//sysnb Setresuid(ruid int, euid int, suid int) (err error) | |||||
//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) | |||||
//sysnb Setreuid(ruid int, euid int) (err error) | |||||
//sys Shutdown(fd int, how int) (err error) | |||||
//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) | |||||
func Stat(path string, stat *Stat_t) (err error) { | |||||
return Fstatat(AT_FDCWD, path, stat, 0) | |||||
} | |||||
func Lchown(path string, uid int, gid int) (err error) { | |||||
return Fchownat(AT_FDCWD, path, uid, gid, AT_SYMLINK_NOFOLLOW) | |||||
} | |||||
func Lstat(path string, stat *Stat_t) (err error) { | |||||
return Fstatat(AT_FDCWD, path, stat, AT_SYMLINK_NOFOLLOW) | |||||
} | |||||
//sys Statfs(path string, buf *Statfs_t) (err error) | |||||
//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) | |||||
//sys Truncate(path string, length int64) (err error) | |||||
func Ustat(dev int, ubuf *Ustat_t) (err error) { | |||||
return ENOSYS | |||||
} | |||||
//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) | |||||
//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) | |||||
//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) | |||||
//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) | |||||
//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) | |||||
//sysnb setgroups(n int, list *_Gid_t) (err error) | |||||
//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) | |||||
//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) | |||||
//sysnb socket(domain int, typ int, proto int) (fd int, err error) | |||||
//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) | |||||
//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) | |||||
//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) | |||||
//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) | |||||
//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) | |||||
//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) | |||||
//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) | |||||
//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) | |||||
//sysnb Gettimeofday(tv *Timeval) (err error) | |||||
func setTimespec(sec, nsec int64) Timespec { | |||||
return Timespec{Sec: sec, Nsec: nsec} | |||||
} | |||||
func setTimeval(sec, usec int64) Timeval { | |||||
return Timeval{Sec: sec, Usec: usec} | |||||
} | |||||
func futimesat(dirfd int, path string, tv *[2]Timeval) (err error) { | |||||
if tv == nil { | |||||
return utimensat(dirfd, path, nil, 0) | |||||
} | |||||
ts := []Timespec{ | |||||
NsecToTimespec(TimevalToNsec(tv[0])), | |||||
NsecToTimespec(TimevalToNsec(tv[1])), | |||||
} | |||||
return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) | |||||
} | |||||
func Time(t *Time_t) (Time_t, error) { | |||||
var tv Timeval | |||||
err := Gettimeofday(&tv) | |||||
if err != nil { | |||||
return 0, err | |||||
} | |||||
if t != nil { | |||||
*t = Time_t(tv.Sec) | |||||
} | |||||
return Time_t(tv.Sec), nil | |||||
} | |||||
func Utime(path string, buf *Utimbuf) error { | |||||
tv := []Timeval{ | |||||
{Sec: buf.Actime}, | |||||
{Sec: buf.Modtime}, | |||||
} | |||||
return Utimes(path, tv) | |||||
} | |||||
func utimes(path string, tv *[2]Timeval) (err error) { | |||||
if tv == nil { | |||||
return utimensat(AT_FDCWD, path, nil, 0) | |||||
} | |||||
ts := []Timespec{ | |||||
NsecToTimespec(TimevalToNsec(tv[0])), | |||||
NsecToTimespec(TimevalToNsec(tv[1])), | |||||
} | |||||
return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) | |||||
} | |||||
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 | |||||
} | |||||
func (r *PtraceRegs) PC() uint64 { return r.Pc } | |||||
func (r *PtraceRegs) SetPC(pc uint64) { r.Pc = pc } | |||||
func (iov *Iovec) SetLen(length int) { | |||||
iov.Len = uint64(length) | |||||
} | |||||
func (msghdr *Msghdr) SetControllen(length int) { | |||||
msghdr.Controllen = uint64(length) | |||||
} | |||||
func (cmsg *Cmsghdr) SetLen(length int) { | |||||
cmsg.Len = uint64(length) | |||||
} | |||||
func InotifyInit() (fd int, err error) { | |||||
return InotifyInit1(0) | |||||
} | |||||
func Dup2(oldfd int, newfd int) (err error) { | |||||
return Dup3(oldfd, newfd, 0) | |||||
} | |||||
func Pause() error { | |||||
_, err := ppoll(nil, 0, nil, nil) | |||||
return err | |||||
} | |||||
func Poll(fds []PollFd, timeout int) (n int, err error) { | |||||
var ts *Timespec | |||||
if timeout >= 0 { | |||||
ts = new(Timespec) | |||||
*ts = NsecToTimespec(int64(timeout) * 1e6) | |||||
} | |||||
if len(fds) == 0 { | |||||
return ppoll(nil, 0, ts, nil) | |||||
} | |||||
return ppoll(&fds[0], len(fds), ts, nil) | |||||
} |
@ -0,0 +1,146 @@ | |||||
// Copyright 2009 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. | |||||
// +build sparc64,linux | |||||
package unix | |||||
//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) | |||||
//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 | |||||
//sys Dup2(oldfd int, newfd int) (err error) | |||||
//sys Fchown(fd int, uid int, gid int) (err error) | |||||
//sys Fstat(fd int, stat *Stat_t) (err error) | |||||
//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 | |||||
//sys Fstatfs(fd int, buf *Statfs_t) (err error) | |||||
//sys Ftruncate(fd int, length int64) (err error) | |||||
//sysnb Getegid() (egid int) | |||||
//sysnb Geteuid() (euid int) | |||||
//sysnb Getgid() (gid int) | |||||
//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) | |||||
//sysnb Getuid() (uid int) | |||||
//sysnb InotifyInit() (fd int, err error) | |||||
//sys Lchown(path string, uid int, gid int) (err error) | |||||
//sys Listen(s int, n int) (err error) | |||||
//sys Lstat(path string, stat *Stat_t) (err error) | |||||
//sys Pause() (err error) | |||||
//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 | |||||
//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 | |||||
//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK | |||||
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) | |||||
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) | |||||
//sys Setfsgid(gid int) (err error) | |||||
//sys Setfsuid(uid int) (err error) | |||||
//sysnb Setregid(rgid int, egid int) (err error) | |||||
//sysnb Setresgid(rgid int, egid int, sgid int) (err error) | |||||
//sysnb Setresuid(ruid int, euid int, suid int) (err error) | |||||
//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) | |||||
//sysnb Setreuid(ruid int, euid int) (err error) | |||||
//sys Shutdown(fd int, how int) (err error) | |||||
//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) | |||||
//sys Stat(path string, stat *Stat_t) (err error) | |||||
//sys Statfs(path string, buf *Statfs_t) (err error) | |||||
//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) | |||||
//sys Truncate(path string, length int64) (err error) | |||||
//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) | |||||
//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) | |||||
//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) | |||||
//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) | |||||
//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) | |||||
//sysnb setgroups(n int, list *_Gid_t) (err error) | |||||
//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) | |||||
//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) | |||||
//sysnb socket(domain int, typ int, proto int) (fd int, err error) | |||||
//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) | |||||
//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) | |||||
//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) | |||||
//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) | |||||
//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) | |||||
//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) | |||||
//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) | |||||
//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) | |||||
func Ioperm(from int, num int, on int) (err error) { | |||||
return ENOSYS | |||||
} | |||||
func Iopl(level int) (err error) { | |||||
return ENOSYS | |||||
} | |||||
//sys futimesat(dirfd int, path string, times *[2]Timeval) (err error) | |||||
//sysnb Gettimeofday(tv *Timeval) (err error) | |||||
func Time(t *Time_t) (tt Time_t, err error) { | |||||
var tv Timeval | |||||
err = Gettimeofday(&tv) | |||||
if err != nil { | |||||
return 0, err | |||||
} | |||||
if t != nil { | |||||
*t = Time_t(tv.Sec) | |||||
} | |||||
return Time_t(tv.Sec), nil | |||||
} | |||||
//sys Utime(path string, buf *Utimbuf) (err error) | |||||
//sys utimes(path string, times *[2]Timeval) (err error) | |||||
func setTimespec(sec, nsec int64) Timespec { | |||||
return Timespec{Sec: sec, Nsec: nsec} | |||||
} | |||||
func setTimeval(sec, usec int64) Timeval { | |||||
return Timeval{Sec: sec, Usec: int32(usec)} | |||||
} | |||||
func (r *PtraceRegs) PC() uint64 { return r.Tpc } | |||||
func (r *PtraceRegs) SetPC(pc uint64) { r.Tpc = pc } | |||||
func (iov *Iovec) SetLen(length int) { | |||||
iov.Len = uint64(length) | |||||
} | |||||
func (msghdr *Msghdr) SetControllen(length int) { | |||||
msghdr.Controllen = uint64(length) | |||||
} | |||||
func (cmsg *Cmsghdr) SetLen(length int) { | |||||
cmsg.Len = uint64(length) | |||||
} | |||||
//sysnb pipe(p *[2]_C_int) (err error) | |||||
func Pipe(p []int) (err error) { | |||||
if len(p) != 2 { | |||||
return EINVAL | |||||
} | |||||
var pp [2]_C_int | |||||
err = pipe(&pp) | |||||
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 | |||||
} | |||||
//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) | |||||
func Poll(fds []PollFd, timeout int) (n int, err error) { | |||||
if len(fds) == 0 { | |||||
return poll(nil, 0, timeout) | |||||
} | |||||
return poll(&fds[0], len(fds), timeout) | |||||
} |
@ -1,11 +0,0 @@ | |||||
// Copyright 2013 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. | |||||
// +build dragonfly freebsd netbsd openbsd | |||||
package unix | |||||
const ImplementsGetwd = false | |||||
func Getwd() (string, error) { return "", ENOTSUP } |
@ -0,0 +1,37 @@ | |||||
// Copyright 2017 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. | |||||
// +build arm,openbsd | |||||
package unix | |||||
func setTimespec(sec, nsec int64) Timespec { | |||||
return Timespec{Sec: sec, Nsec: int32(nsec)} | |||||
} | |||||
func setTimeval(sec, usec int64) Timeval { | |||||
return Timeval{Sec: sec, Usec: int32(usec)} | |||||
} | |||||
func SetKevent(k *Kevent_t, fd, mode, flags int) { | |||||
k.Ident = uint32(fd) | |||||
k.Filter = int16(mode) | |||||
k.Flags = uint16(flags) | |||||
} | |||||
func (iov *Iovec) SetLen(length int) { | |||||
iov.Len = uint32(length) | |||||
} | |||||
func (msghdr *Msghdr) SetControllen(length int) { | |||||
msghdr.Controllen = uint32(length) | |||||
} | |||||
func (cmsg *Cmsghdr) SetLen(length int) { | |||||
cmsg.Len = uint32(length) | |||||
} | |||||
// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions | |||||
// of openbsd/arm the syscall is called sysctl instead of __sysctl. | |||||
const SYS___SYSCTL = SYS_SYSCTL |
@ -0,0 +1,15 @@ | |||||
// Copyright 2016 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. | |||||
// +build darwin dragonfly freebsd linux netbsd openbsd solaris | |||||
// +build !gccgo | |||||
package unix | |||||
import "syscall" | |||||
func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) | |||||
func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) | |||||
func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) | |||||
func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) |
@ -0,0 +1,82 @@ | |||||
// Copyright 2017 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. | |||||
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris | |||||
package unix | |||||
import "time" | |||||
// TimespecToNsec converts a Timespec value into a number of | |||||
// nanoseconds since the Unix epoch. | |||||
func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } | |||||
// NsecToTimespec takes a number of nanoseconds since the Unix epoch | |||||
// and returns the corresponding Timespec value. | |||||
func NsecToTimespec(nsec int64) Timespec { | |||||
sec := nsec / 1e9 | |||||
nsec = nsec % 1e9 | |||||
if nsec < 0 { | |||||
nsec += 1e9 | |||||
sec-- | |||||
} | |||||
return setTimespec(sec, nsec) | |||||
} | |||||
// TimeToTimespec converts t into a Timespec. | |||||
// On some 32-bit systems the range of valid Timespec values are smaller | |||||
// than that of time.Time values. So if t is out of the valid range of | |||||
// Timespec, it returns a zero Timespec and ERANGE. | |||||
func TimeToTimespec(t time.Time) (Timespec, error) { | |||||
sec := t.Unix() | |||||
nsec := int64(t.Nanosecond()) | |||||
ts := setTimespec(sec, nsec) | |||||
// Currently all targets have either int32 or int64 for Timespec.Sec. | |||||
// If there were a new target with floating point type for it, we have | |||||
// to consider the rounding error. | |||||
if int64(ts.Sec) != sec { | |||||
return Timespec{}, ERANGE | |||||
} | |||||
return ts, nil | |||||
} | |||||
// TimevalToNsec converts a Timeval value into a number of nanoseconds | |||||
// since the Unix epoch. | |||||
func TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 } | |||||
// NsecToTimeval takes a number of nanoseconds since the Unix epoch | |||||
// and returns the corresponding Timeval value. | |||||
func NsecToTimeval(nsec int64) Timeval { | |||||
nsec += 999 // round up to microsecond | |||||
usec := nsec % 1e9 / 1e3 | |||||
sec := nsec / 1e9 | |||||
if usec < 0 { | |||||
usec += 1e6 | |||||
sec-- | |||||
} | |||||
return setTimeval(sec, usec) | |||||
} | |||||
// Unix returns ts as the number of seconds and nanoseconds elapsed since the | |||||
// Unix epoch. | |||||
func (ts *Timespec) Unix() (sec int64, nsec int64) { | |||||
return int64(ts.Sec), int64(ts.Nsec) | |||||
} | |||||
// Unix returns tv as the number of seconds and nanoseconds elapsed since the | |||||
// Unix epoch. | |||||
func (tv *Timeval) Unix() (sec int64, nsec int64) { | |||||
return int64(tv.Sec), int64(tv.Usec) * 1000 | |||||
} | |||||
// Nano returns ts as the number of nanoseconds elapsed since the Unix epoch. | |||||
func (ts *Timespec) Nano() int64 { | |||||
return int64(ts.Sec)*1e9 + int64(ts.Nsec) | |||||
} | |||||
// Nano returns tv as the number of nanoseconds elapsed since the Unix epoch. | |||||
func (tv *Timeval) Nano() int64 { | |||||
return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000 | |||||
} |
@ -0,0 +1,236 @@ | |||||
// Copyright 2018 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. | |||||
// +build ignore | |||||
// +build aix | |||||
/* | |||||
Input to cgo -godefs. See also mkerrors.sh and mkall.sh | |||||
*/ | |||||
// +godefs map struct_in_addr [4]byte /* in_addr */ | |||||
// +godefs map struct_in6_addr [16]byte /* in6_addr */ | |||||
package unix | |||||
/* | |||||
#include <sys/types.h> | |||||
#include <sys/time.h> | |||||
#include <sys/limits.h> | |||||
#include <sys/un.h> | |||||
#include <utime.h> | |||||
#include <sys/utsname.h> | |||||
#include <sys/poll.h> | |||||
#include <sys/resource.h> | |||||
#include <sys/stat.h> | |||||
#include <sys/statfs.h> | |||||
#include <sys/termio.h> | |||||
#include <sys/ioctl.h> | |||||
#include <termios.h> | |||||
#include <net/if.h> | |||||
#include <net/if_dl.h> | |||||
#include <netinet/in.h> | |||||
#include <netinet/icmp6.h> | |||||
#include <dirent.h> | |||||
#include <fcntl.h> | |||||
enum { | |||||
sizeofPtr = sizeof(void*), | |||||
}; | |||||
union sockaddr_all { | |||||
struct sockaddr s1; // this one gets used for fields | |||||
struct sockaddr_in s2; // these pad it out | |||||
struct sockaddr_in6 s3; | |||||
struct sockaddr_un s4; | |||||
struct sockaddr_dl s5; | |||||
}; | |||||
struct sockaddr_any { | |||||
struct sockaddr addr; | |||||
char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; | |||||
}; | |||||
*/ | |||||
import "C" | |||||
// Machine characteristics | |||||
const ( | |||||
SizeofPtr = C.sizeofPtr | |||||
SizeofShort = C.sizeof_short | |||||
SizeofInt = C.sizeof_int | |||||
SizeofLong = C.sizeof_long | |||||
SizeofLongLong = C.sizeof_longlong | |||||
PathMax = C.PATH_MAX | |||||
) | |||||
// Basic types | |||||
type ( | |||||
_C_short C.short | |||||
_C_int C.int | |||||
_C_long C.long | |||||
_C_long_long C.longlong | |||||
) | |||||
type off64 C.off64_t | |||||
type off C.off_t | |||||
type Mode_t C.mode_t | |||||
// Time | |||||
type Timespec C.struct_timespec | |||||
type StTimespec C.struct_st_timespec | |||||
type Timeval C.struct_timeval | |||||
type Timeval32 C.struct_timeval32 | |||||
type Timex C.struct_timex | |||||
type Time_t C.time_t | |||||
type Tms C.struct_tms | |||||
type Utimbuf C.struct_utimbuf | |||||
type Timezone C.struct_timezone | |||||
// Processes | |||||
type Rusage C.struct_rusage | |||||
type Rlimit C.struct_rlimit64 | |||||
type Pid_t C.pid_t | |||||
type _Gid_t C.gid_t | |||||
type dev_t C.dev_t | |||||
// Files | |||||
type Stat_t C.struct_stat | |||||
type StatxTimestamp C.struct_statx_timestamp | |||||
type Statx_t C.struct_statx | |||||
type Dirent C.struct_dirent | |||||
// Sockets | |||||
type RawSockaddrInet4 C.struct_sockaddr_in | |||||
type RawSockaddrInet6 C.struct_sockaddr_in6 | |||||
type RawSockaddrUnix C.struct_sockaddr_un | |||||
type RawSockaddr C.struct_sockaddr | |||||
type RawSockaddrAny C.struct_sockaddr_any | |||||
type _Socklen C.socklen_t | |||||
type Cmsghdr C.struct_cmsghdr | |||||
type ICMPv6Filter C.struct_icmp6_filter | |||||
type Iovec C.struct_iovec | |||||
type IPMreq C.struct_ip_mreq | |||||
type IPv6Mreq C.struct_ipv6_mreq | |||||
type IPv6MTUInfo C.struct_ip6_mtuinfo | |||||
type Linger C.struct_linger | |||||
type Msghdr C.struct_msghdr | |||||
const ( | |||||
SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in | |||||
SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 | |||||
SizeofSockaddrAny = C.sizeof_struct_sockaddr_any | |||||
SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un | |||||
SizeofLinger = C.sizeof_struct_linger | |||||
SizeofIPMreq = C.sizeof_struct_ip_mreq | |||||
SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq | |||||
SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo | |||||
SizeofMsghdr = C.sizeof_struct_msghdr | |||||
SizeofCmsghdr = C.sizeof_struct_cmsghdr | |||||
SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter | |||||
) | |||||
// Routing and interface messages | |||||
const ( | |||||
SizeofIfMsghdr = C.sizeof_struct_if_msghdr | |||||
) | |||||
type IfMsgHdr C.struct_if_msghdr | |||||
// Misc | |||||
type FdSet C.fd_set | |||||
type Utsname C.struct_utsname | |||||
type Ustat_t C.struct_ustat | |||||
type Sigset_t C.sigset_t | |||||
const ( | |||||
AT_FDCWD = C.AT_FDCWD | |||||
AT_REMOVEDIR = C.AT_REMOVEDIR | |||||
AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW | |||||
) | |||||
// Terminal handling | |||||
type Termios C.struct_termios | |||||
type Termio C.struct_termio | |||||
type Winsize C.struct_winsize | |||||
//poll | |||||
type PollFd struct { | |||||
Fd int32 | |||||
Events uint16 | |||||
Revents uint16 | |||||
} | |||||
const ( | |||||
POLLERR = C.POLLERR | |||||
POLLHUP = C.POLLHUP | |||||
POLLIN = C.POLLIN | |||||
POLLNVAL = C.POLLNVAL | |||||
POLLOUT = C.POLLOUT | |||||
POLLPRI = C.POLLPRI | |||||
POLLRDBAND = C.POLLRDBAND | |||||
POLLRDNORM = C.POLLRDNORM | |||||
POLLWRBAND = C.POLLWRBAND | |||||
POLLWRNORM = C.POLLWRNORM | |||||
) | |||||
//flock_t | |||||
type Flock_t C.struct_flock64 | |||||
// Statfs | |||||
type Fsid_t C.struct_fsid_t | |||||
type Fsid64_t C.struct_fsid64_t | |||||
type Statfs_t C.struct_statfs | |||||
const RNDGETENTCNT = 0x80045200 |