@ -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. | |||
// 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 |