remove vendor
parent
ca8ca518a5
commit
7f3008279b
@ -1,3 +0,0 @@
|
|||||||
# This source code refers to The Go Authors for copyright purposes.
|
|
||||||
# The master list of authors is in the main Go distribution,
|
|
||||||
# visible at https://tip.golang.org/AUTHORS.
|
|
@ -1,3 +0,0 @@
|
|||||||
# This source code was written by the Go contributors.
|
|
||||||
# The master list of contributors is in the main Go distribution,
|
|
||||||
# visible at https://tip.golang.org/CONTRIBUTORS.
|
|
@ -1,27 +0,0 @@
|
|||||||
Copyright (c) 2009 The Go Authors. All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above
|
|
||||||
copyright notice, this list of conditions and the following disclaimer
|
|
||||||
in the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
* Neither the name of Google Inc. nor the names of its
|
|
||||||
contributors may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@ -1,22 +0,0 @@
|
|||||||
Additional IP Rights Grant (Patents)
|
|
||||||
|
|
||||||
"This implementation" means the copyrightable works distributed by
|
|
||||||
Google as part of the Go project.
|
|
||||||
|
|
||||||
Google hereby grants to You a perpetual, worldwide, non-exclusive,
|
|
||||||
no-charge, royalty-free, irrevocable (except as stated in this section)
|
|
||||||
patent license to make, have made, use, offer to sell, sell, import,
|
|
||||||
transfer and otherwise run, modify and propagate the contents of this
|
|
||||||
implementation of Go, where such license applies only to those patent
|
|
||||||
claims, both currently owned or controlled by Google and acquired in
|
|
||||||
the future, licensable by Google that are necessarily infringed by this
|
|
||||||
implementation of Go. This grant does not include claims that would be
|
|
||||||
infringed only as a consequence of further modification of this
|
|
||||||
implementation. If you or your agent or exclusive licensee institute or
|
|
||||||
order or agree to the institution of patent litigation against any
|
|
||||||
entity (including a cross-claim or counterclaim in a lawsuit) alleging
|
|
||||||
that this implementation of Go or any code incorporated within this
|
|
||||||
implementation of Go constitutes direct or contributory patent
|
|
||||||
infringement, or inducement of patent infringement, then any patent
|
|
||||||
rights granted to you under this License for this implementation of Go
|
|
||||||
shall terminate as of the date such litigation is filed.
|
|
@ -1,951 +0,0 @@
|
|||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package terminal
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"io"
|
|
||||||
"sync"
|
|
||||||
"unicode/utf8"
|
|
||||||
)
|
|
||||||
|
|
||||||
// EscapeCodes contains escape sequences that can be written to the terminal in
|
|
||||||
// order to achieve different styles of text.
|
|
||||||
type EscapeCodes struct {
|
|
||||||
// Foreground colors
|
|
||||||
Black, Red, Green, Yellow, Blue, Magenta, Cyan, White []byte
|
|
||||||
|
|
||||||
// Reset all attributes
|
|
||||||
Reset []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
var vt100EscapeCodes = EscapeCodes{
|
|
||||||
Black: []byte{keyEscape, '[', '3', '0', 'm'},
|
|
||||||
Red: []byte{keyEscape, '[', '3', '1', 'm'},
|
|
||||||
Green: []byte{keyEscape, '[', '3', '2', 'm'},
|
|
||||||
Yellow: []byte{keyEscape, '[', '3', '3', 'm'},
|
|
||||||
Blue: []byte{keyEscape, '[', '3', '4', 'm'},
|
|
||||||
Magenta: []byte{keyEscape, '[', '3', '5', 'm'},
|
|
||||||
Cyan: []byte{keyEscape, '[', '3', '6', 'm'},
|
|
||||||
White: []byte{keyEscape, '[', '3', '7', 'm'},
|
|
||||||
|
|
||||||
Reset: []byte{keyEscape, '[', '0', 'm'},
|
|
||||||
}
|
|
||||||
|
|
||||||
// Terminal contains the state for running a VT100 terminal that is capable of
|
|
||||||
// reading lines of input.
|
|
||||||
type Terminal struct {
|
|
||||||
// AutoCompleteCallback, if non-null, is called for each keypress with
|
|
||||||
// the full input line and the current position of the cursor (in
|
|
||||||
// bytes, as an index into |line|). If it returns ok=false, the key
|
|
||||||
// press is processed normally. Otherwise it returns a replacement line
|
|
||||||
// and the new cursor position.
|
|
||||||
AutoCompleteCallback func(line string, pos int, key rune) (newLine string, newPos int, ok bool)
|
|
||||||
|
|
||||||
// Escape contains a pointer to the escape codes for this terminal.
|
|
||||||
// It's always a valid pointer, although the escape codes themselves
|
|
||||||
// may be empty if the terminal doesn't support them.
|
|
||||||
Escape *EscapeCodes
|
|
||||||
|
|
||||||
// lock protects the terminal and the state in this object from
|
|
||||||
// concurrent processing of a key press and a Write() call.
|
|
||||||
lock sync.Mutex
|
|
||||||
|
|
||||||
c io.ReadWriter
|
|
||||||
prompt []rune
|
|
||||||
|
|
||||||
// line is the current line being entered.
|
|
||||||
line []rune
|
|
||||||
// pos is the logical position of the cursor in line
|
|
||||||
pos int
|
|
||||||
// echo is true if local echo is enabled
|
|
||||||
echo bool
|
|
||||||
// pasteActive is true iff there is a bracketed paste operation in
|
|
||||||
// progress.
|
|
||||||
pasteActive bool
|
|
||||||
|
|
||||||
// cursorX contains the current X value of the cursor where the left
|
|
||||||
// edge is 0. cursorY contains the row number where the first row of
|
|
||||||
// the current line is 0.
|
|
||||||
cursorX, cursorY int
|
|
||||||
// maxLine is the greatest value of cursorY so far.
|
|
||||||
maxLine int
|
|
||||||
|
|
||||||
termWidth, termHeight int
|
|
||||||
|
|
||||||
// outBuf contains the terminal data to be sent.
|
|
||||||
outBuf []byte
|
|
||||||
// remainder contains the remainder of any partial key sequences after
|
|
||||||
// a read. It aliases into inBuf.
|
|
||||||
remainder []byte
|
|
||||||
inBuf [256]byte
|
|
||||||
|
|
||||||
// history contains previously entered commands so that they can be
|
|
||||||
// accessed with the up and down keys.
|
|
||||||
history stRingBuffer
|
|
||||||
// historyIndex stores the currently accessed history entry, where zero
|
|
||||||
// means the immediately previous entry.
|
|
||||||
historyIndex int
|
|
||||||
// When navigating up and down the history it's possible to return to
|
|
||||||
// the incomplete, initial line. That value is stored in
|
|
||||||
// historyPending.
|
|
||||||
historyPending string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewTerminal runs a VT100 terminal on the given ReadWriter. If the ReadWriter is
|
|
||||||
// a local terminal, that terminal must first have been put into raw mode.
|
|
||||||
// prompt is a string that is written at the start of each input line (i.e.
|
|
||||||
// "> ").
|
|
||||||
func NewTerminal(c io.ReadWriter, prompt string) *Terminal {
|
|
||||||
return &Terminal{
|
|
||||||
Escape: &vt100EscapeCodes,
|
|
||||||
c: c,
|
|
||||||
prompt: []rune(prompt),
|
|
||||||
termWidth: 80,
|
|
||||||
termHeight: 24,
|
|
||||||
echo: true,
|
|
||||||
historyIndex: -1,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
keyCtrlD = 4
|
|
||||||
keyCtrlU = 21
|
|
||||||
keyEnter = '\r'
|
|
||||||
keyEscape = 27
|
|
||||||
keyBackspace = 127
|
|
||||||
keyUnknown = 0xd800 /* UTF-16 surrogate area */ + iota
|
|
||||||
keyUp
|
|
||||||
keyDown
|
|
||||||
keyLeft
|
|
||||||
keyRight
|
|
||||||
keyAltLeft
|
|
||||||
keyAltRight
|
|
||||||
keyHome
|
|
||||||
keyEnd
|
|
||||||
keyDeleteWord
|
|
||||||
keyDeleteLine
|
|
||||||
keyClearScreen
|
|
||||||
keyPasteStart
|
|
||||||
keyPasteEnd
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
crlf = []byte{'\r', '\n'}
|
|
||||||
pasteStart = []byte{keyEscape, '[', '2', '0', '0', '~'}
|
|
||||||
pasteEnd = []byte{keyEscape, '[', '2', '0', '1', '~'}
|
|
||||||
)
|
|
||||||
|
|
||||||
// bytesToKey tries to parse a key sequence from b. If successful, it returns
|
|
||||||
// the key and the remainder of the input. Otherwise it returns utf8.RuneError.
|
|
||||||
func bytesToKey(b []byte, pasteActive bool) (rune, []byte) {
|
|
||||||
if len(b) == 0 {
|
|
||||||
return utf8.RuneError, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if !pasteActive {
|
|
||||||
switch b[0] {
|
|
||||||
case 1: // ^A
|
|
||||||
return keyHome, b[1:]
|
|
||||||
case 5: // ^E
|
|
||||||
return keyEnd, b[1:]
|
|
||||||
case 8: // ^H
|
|
||||||
return keyBackspace, b[1:]
|
|
||||||
case 11: // ^K
|
|
||||||
return keyDeleteLine, b[1:]
|
|
||||||
case 12: // ^L
|
|
||||||
return keyClearScreen, b[1:]
|
|
||||||
case 23: // ^W
|
|
||||||
return keyDeleteWord, b[1:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if b[0] != keyEscape {
|
|
||||||
if !utf8.FullRune(b) {
|
|
||||||
return utf8.RuneError, b
|
|
||||||
}
|
|
||||||
r, l := utf8.DecodeRune(b)
|
|
||||||
return r, b[l:]
|
|
||||||
}
|
|
||||||
|
|
||||||
if !pasteActive && len(b) >= 3 && b[0] == keyEscape && b[1] == '[' {
|
|
||||||
switch b[2] {
|
|
||||||
case 'A':
|
|
||||||
return keyUp, b[3:]
|
|
||||||
case 'B':
|
|
||||||
return keyDown, b[3:]
|
|
||||||
case 'C':
|
|
||||||
return keyRight, b[3:]
|
|
||||||
case 'D':
|
|
||||||
return keyLeft, b[3:]
|
|
||||||
case 'H':
|
|
||||||
return keyHome, b[3:]
|
|
||||||
case 'F':
|
|
||||||
return keyEnd, b[3:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !pasteActive && len(b) >= 6 && b[0] == keyEscape && b[1] == '[' && b[2] == '1' && b[3] == ';' && b[4] == '3' {
|
|
||||||
switch b[5] {
|
|
||||||
case 'C':
|
|
||||||
return keyAltRight, b[6:]
|
|
||||||
case 'D':
|
|
||||||
return keyAltLeft, b[6:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteStart) {
|
|
||||||
return keyPasteStart, b[6:]
|
|
||||||
}
|
|
||||||
|
|
||||||
if pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteEnd) {
|
|
||||||
return keyPasteEnd, b[6:]
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we get here then we have a key that we don't recognise, or a
|
|
||||||
// partial sequence. It's not clear how one should find the end of a
|
|
||||||
// sequence without knowing them all, but it seems that [a-zA-Z~] only
|
|
||||||
// appears at the end of a sequence.
|
|
||||||
for i, c := range b[0:] {
|
|
||||||
if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '~' {
|
|
||||||
return keyUnknown, b[i+1:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return utf8.RuneError, b
|
|
||||||
}
|
|
||||||
|
|
||||||
// queue appends data to the end of t.outBuf
|
|
||||||
func (t *Terminal) queue(data []rune) {
|
|
||||||
t.outBuf = append(t.outBuf, []byte(string(data))...)
|
|
||||||
}
|
|
||||||
|
|
||||||
var eraseUnderCursor = []rune{' ', keyEscape, '[', 'D'}
|
|
||||||
var space = []rune{' '}
|
|
||||||
|
|
||||||
func isPrintable(key rune) bool {
|
|
||||||
isInSurrogateArea := key >= 0xd800 && key <= 0xdbff
|
|
||||||
return key >= 32 && !isInSurrogateArea
|
|
||||||
}
|
|
||||||
|
|
||||||
// moveCursorToPos appends data to t.outBuf which will move the cursor to the
|
|
||||||
// given, logical position in the text.
|
|
||||||
func (t *Terminal) moveCursorToPos(pos int) {
|
|
||||||
if !t.echo {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
x := visualLength(t.prompt) + pos
|
|
||||||
y := x / t.termWidth
|
|
||||||
x = x % t.termWidth
|
|
||||||
|
|
||||||
up := 0
|
|
||||||
if y < t.cursorY {
|
|
||||||
up = t.cursorY - y
|
|
||||||
}
|
|
||||||
|
|
||||||
down := 0
|
|
||||||
if y > t.cursorY {
|
|
||||||
down = y - t.cursorY
|
|
||||||
}
|
|
||||||
|
|
||||||
left := 0
|
|
||||||
if x < t.cursorX {
|
|
||||||
left = t.cursorX - x
|
|
||||||
}
|
|
||||||
|
|
||||||
right := 0
|
|
||||||
if x > t.cursorX {
|
|
||||||
right = x - t.cursorX
|
|
||||||
}
|
|
||||||
|
|
||||||
t.cursorX = x
|
|
||||||
t.cursorY = y
|
|
||||||
t.move(up, down, left, right)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Terminal) move(up, down, left, right int) {
|
|
||||||
movement := make([]rune, 3*(up+down+left+right))
|
|
||||||
m := movement
|
|
||||||
for i := 0; i < up; i++ {
|
|
||||||
m[0] = keyEscape
|
|
||||||
m[1] = '['
|
|
||||||
m[2] = 'A'
|
|
||||||
m = m[3:]
|
|
||||||
}
|
|
||||||
for i := 0; i < down; i++ {
|
|
||||||
m[0] = keyEscape
|
|
||||||
m[1] = '['
|
|
||||||
m[2] = 'B'
|
|
||||||
m = m[3:]
|
|
||||||
}
|
|
||||||
for i := 0; i < left; i++ {
|
|
||||||
m[0] = keyEscape
|
|
||||||
m[1] = '['
|
|
||||||
m[2] = 'D'
|
|
||||||
m = m[3:]
|
|
||||||
}
|
|
||||||
for i := 0; i < right; i++ {
|
|
||||||
m[0] = keyEscape
|
|
||||||
m[1] = '['
|
|
||||||
m[2] = 'C'
|
|
||||||
m = m[3:]
|
|
||||||
}
|
|
||||||
|
|
||||||
t.queue(movement)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Terminal) clearLineToRight() {
|
|
||||||
op := []rune{keyEscape, '[', 'K'}
|
|
||||||
t.queue(op)
|
|
||||||
}
|
|
||||||
|
|
||||||
const maxLineLength = 4096
|
|
||||||
|
|
||||||
func (t *Terminal) setLine(newLine []rune, newPos int) {
|
|
||||||
if t.echo {
|
|
||||||
t.moveCursorToPos(0)
|
|
||||||
t.writeLine(newLine)
|
|
||||||
for i := len(newLine); i < len(t.line); i++ {
|
|
||||||
t.writeLine(space)
|
|
||||||
}
|
|
||||||
t.moveCursorToPos(newPos)
|
|
||||||
}
|
|
||||||
t.line = newLine
|
|
||||||
t.pos = newPos
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Terminal) advanceCursor(places int) {
|
|
||||||
t.cursorX += places
|
|
||||||
t.cursorY += t.cursorX / t.termWidth
|
|
||||||
if t.cursorY > t.maxLine {
|
|
||||||
t.maxLine = t.cursorY
|
|
||||||
}
|
|
||||||
t.cursorX = t.cursorX % t.termWidth
|
|
||||||
|
|
||||||
if places > 0 && t.cursorX == 0 {
|
|
||||||
// Normally terminals will advance the current position
|
|
||||||
// when writing a character. But that doesn't happen
|
|
||||||
// for the last character in a line. However, when
|
|
||||||
// writing a character (except a new line) that causes
|
|
||||||
// a line wrap, the position will be advanced two
|
|
||||||
// places.
|
|
||||||
//
|
|
||||||
// So, if we are stopping at the end of a line, we
|
|
||||||
// need to write a newline so that our cursor can be
|
|
||||||
// advanced to the next line.
|
|
||||||
t.outBuf = append(t.outBuf, '\r', '\n')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Terminal) eraseNPreviousChars(n int) {
|
|
||||||
if n == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if t.pos < n {
|
|
||||||
n = t.pos
|
|
||||||
}
|
|
||||||
t.pos -= n
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
|
|
||||||
copy(t.line[t.pos:], t.line[n+t.pos:])
|
|
||||||
t.line = t.line[:len(t.line)-n]
|
|
||||||
if t.echo {
|
|
||||||
t.writeLine(t.line[t.pos:])
|
|
||||||
for i := 0; i < n; i++ {
|
|
||||||
t.queue(space)
|
|
||||||
}
|
|
||||||
t.advanceCursor(n)
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// countToLeftWord returns then number of characters from the cursor to the
|
|
||||||
// start of the previous word.
|
|
||||||
func (t *Terminal) countToLeftWord() int {
|
|
||||||
if t.pos == 0 {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
pos := t.pos - 1
|
|
||||||
for pos > 0 {
|
|
||||||
if t.line[pos] != ' ' {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
pos--
|
|
||||||
}
|
|
||||||
for pos > 0 {
|
|
||||||
if t.line[pos] == ' ' {
|
|
||||||
pos++
|
|
||||||
break
|
|
||||||
}
|
|
||||||
pos--
|
|
||||||
}
|
|
||||||
|
|
||||||
return t.pos - pos
|
|
||||||
}
|
|
||||||
|
|
||||||
// countToRightWord returns then number of characters from the cursor to the
|
|
||||||
// start of the next word.
|
|
||||||
func (t *Terminal) countToRightWord() int {
|
|
||||||
pos := t.pos
|
|
||||||
for pos < len(t.line) {
|
|
||||||
if t.line[pos] == ' ' {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
pos++
|
|
||||||
}
|
|
||||||
for pos < len(t.line) {
|
|
||||||
if t.line[pos] != ' ' {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
pos++
|
|
||||||
}
|
|
||||||
return pos - t.pos
|
|
||||||
}
|
|
||||||
|
|
||||||
// visualLength returns the number of visible glyphs in s.
|
|
||||||
func visualLength(runes []rune) int {
|
|
||||||
inEscapeSeq := false
|
|
||||||
length := 0
|
|
||||||
|
|
||||||
for _, r := range runes {
|
|
||||||
switch {
|
|
||||||
case inEscapeSeq:
|
|
||||||
if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') {
|
|
||||||
inEscapeSeq = false
|
|
||||||
}
|
|
||||||
case r == '\x1b':
|
|
||||||
inEscapeSeq = true
|
|
||||||
default:
|
|
||||||
length++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return length
|
|
||||||
}
|
|
||||||
|
|
||||||
// handleKey processes the given key and, optionally, returns a line of text
|
|
||||||
// that the user has entered.
|
|
||||||
func (t *Terminal) handleKey(key rune) (line string, ok bool) {
|
|
||||||
if t.pasteActive && key != keyEnter {
|
|
||||||
t.addKeyToLine(key)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
switch key {
|
|
||||||
case keyBackspace:
|
|
||||||
if t.pos == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.eraseNPreviousChars(1)
|
|
||||||
case keyAltLeft:
|
|
||||||
// move left by a word.
|
|
||||||
t.pos -= t.countToLeftWord()
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
case keyAltRight:
|
|
||||||
// move right by a word.
|
|
||||||
t.pos += t.countToRightWord()
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
case keyLeft:
|
|
||||||
if t.pos == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.pos--
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
case keyRight:
|
|
||||||
if t.pos == len(t.line) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.pos++
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
case keyHome:
|
|
||||||
if t.pos == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.pos = 0
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
case keyEnd:
|
|
||||||
if t.pos == len(t.line) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.pos = len(t.line)
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
case keyUp:
|
|
||||||
entry, ok := t.history.NthPreviousEntry(t.historyIndex + 1)
|
|
||||||
if !ok {
|
|
||||||
return "", false
|
|
||||||
}
|
|
||||||
if t.historyIndex == -1 {
|
|
||||||
t.historyPending = string(t.line)
|
|
||||||
}
|
|
||||||
t.historyIndex++
|
|
||||||
runes := []rune(entry)
|
|
||||||
t.setLine(runes, len(runes))
|
|
||||||
case keyDown:
|
|
||||||
switch t.historyIndex {
|
|
||||||
case -1:
|
|
||||||
return
|
|
||||||
case 0:
|
|
||||||
runes := []rune(t.historyPending)
|
|
||||||
t.setLine(runes, len(runes))
|
|
||||||
t.historyIndex--
|
|
||||||
default:
|
|
||||||
entry, ok := t.history.NthPreviousEntry(t.historyIndex - 1)
|
|
||||||
if ok {
|
|
||||||
t.historyIndex--
|
|
||||||
runes := []rune(entry)
|
|
||||||
t.setLine(runes, len(runes))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case keyEnter:
|
|
||||||
t.moveCursorToPos(len(t.line))
|
|
||||||
t.queue([]rune("\r\n"))
|
|
||||||
line = string(t.line)
|
|
||||||
ok = true
|
|
||||||
t.line = t.line[:0]
|
|
||||||
t.pos = 0
|
|
||||||
t.cursorX = 0
|
|
||||||
t.cursorY = 0
|
|
||||||
t.maxLine = 0
|
|
||||||
case keyDeleteWord:
|
|
||||||
// Delete zero or more spaces and then one or more characters.
|
|
||||||
t.eraseNPreviousChars(t.countToLeftWord())
|
|
||||||
case keyDeleteLine:
|
|
||||||
// Delete everything from the current cursor position to the
|
|
||||||
// end of line.
|
|
||||||
for i := t.pos; i < len(t.line); i++ {
|
|
||||||
t.queue(space)
|
|
||||||
t.advanceCursor(1)
|
|
||||||
}
|
|
||||||
t.line = t.line[:t.pos]
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
case keyCtrlD:
|
|
||||||
// Erase the character under the current position.
|
|
||||||
// The EOF case when the line is empty is handled in
|
|
||||||
// readLine().
|
|
||||||
if t.pos < len(t.line) {
|
|
||||||
t.pos++
|
|
||||||
t.eraseNPreviousChars(1)
|
|
||||||
}
|
|
||||||
case keyCtrlU:
|
|
||||||
t.eraseNPreviousChars(t.pos)
|
|
||||||
case keyClearScreen:
|
|
||||||
// Erases the screen and moves the cursor to the home position.
|
|
||||||
t.queue([]rune("\x1b[2J\x1b[H"))
|
|
||||||
t.queue(t.prompt)
|
|
||||||
t.cursorX, t.cursorY = 0, 0
|
|
||||||
t.advanceCursor(visualLength(t.prompt))
|
|
||||||
t.setLine(t.line, t.pos)
|
|
||||||
default:
|
|
||||||
if t.AutoCompleteCallback != nil {
|
|
||||||
prefix := string(t.line[:t.pos])
|
|
||||||
suffix := string(t.line[t.pos:])
|
|
||||||
|
|
||||||
t.lock.Unlock()
|
|
||||||
newLine, newPos, completeOk := t.AutoCompleteCallback(prefix+suffix, len(prefix), key)
|
|
||||||
t.lock.Lock()
|
|
||||||
|
|
||||||
if completeOk {
|
|
||||||
t.setLine([]rune(newLine), utf8.RuneCount([]byte(newLine)[:newPos]))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !isPrintable(key) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if len(t.line) == maxLineLength {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.addKeyToLine(key)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// addKeyToLine inserts the given key at the current position in the current
|
|
||||||
// line.
|
|
||||||
func (t *Terminal) addKeyToLine(key rune) {
|
|
||||||
if len(t.line) == cap(t.line) {
|
|
||||||
newLine := make([]rune, len(t.line), 2*(1+len(t.line)))
|
|
||||||
copy(newLine, t.line)
|
|
||||||
t.line = newLine
|
|
||||||
}
|
|
||||||
t.line = t.line[:len(t.line)+1]
|
|
||||||
copy(t.line[t.pos+1:], t.line[t.pos:])
|
|
||||||
t.line[t.pos] = key
|
|
||||||
if t.echo {
|
|
||||||
t.writeLine(t.line[t.pos:])
|
|
||||||
}
|
|
||||||
t.pos++
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Terminal) writeLine(line []rune) {
|
|
||||||
for len(line) != 0 {
|
|
||||||
remainingOnLine := t.termWidth - t.cursorX
|
|
||||||
todo := len(line)
|
|
||||||
if todo > remainingOnLine {
|
|
||||||
todo = remainingOnLine
|
|
||||||
}
|
|
||||||
t.queue(line[:todo])
|
|
||||||
t.advanceCursor(visualLength(line[:todo]))
|
|
||||||
line = line[todo:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// writeWithCRLF writes buf to w but replaces all occurrences of \n with \r\n.
|
|
||||||
func writeWithCRLF(w io.Writer, buf []byte) (n int, err error) {
|
|
||||||
for len(buf) > 0 {
|
|
||||||
i := bytes.IndexByte(buf, '\n')
|
|
||||||
todo := len(buf)
|
|
||||||
if i >= 0 {
|
|
||||||
todo = i
|
|
||||||
}
|
|
||||||
|
|
||||||
var nn int
|
|
||||||
nn, err = w.Write(buf[:todo])
|
|
||||||
n += nn
|
|
||||||
if err != nil {
|
|
||||||
return n, err
|
|
||||||
}
|
|
||||||
buf = buf[todo:]
|
|
||||||
|
|
||||||
if i >= 0 {
|
|
||||||
if _, err = w.Write(crlf); err != nil {
|
|
||||||
return n, err
|
|
||||||
}
|
|
||||||
n++
|
|
||||||
buf = buf[1:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return n, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Terminal) Write(buf []byte) (n int, err error) {
|
|
||||||
t.lock.Lock()
|
|
||||||
defer t.lock.Unlock()
|
|
||||||
|
|
||||||
if t.cursorX == 0 && t.cursorY == 0 {
|
|
||||||
// This is the easy case: there's nothing on the screen that we
|
|
||||||
// have to move out of the way.
|
|
||||||
return writeWithCRLF(t.c, buf)
|
|
||||||
}
|
|
||||||
|
|
||||||
// We have a prompt and possibly user input on the screen. We
|
|
||||||
// have to clear it first.
|
|
||||||
t.move(0 /* up */, 0 /* down */, t.cursorX /* left */, 0 /* right */)
|
|
||||||
t.cursorX = 0
|
|
||||||
t.clearLineToRight()
|
|
||||||
|
|
||||||
for t.cursorY > 0 {
|
|
||||||
t.move(1 /* up */, 0, 0, 0)
|
|
||||||
t.cursorY--
|
|
||||||
t.clearLineToRight()
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err = t.c.Write(t.outBuf); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.outBuf = t.outBuf[:0]
|
|
||||||
|
|
||||||
if n, err = writeWithCRLF(t.c, buf); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
t.writeLine(t.prompt)
|
|
||||||
if t.echo {
|
|
||||||
t.writeLine(t.line)
|
|
||||||
}
|
|
||||||
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
|
|
||||||
if _, err = t.c.Write(t.outBuf); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.outBuf = t.outBuf[:0]
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReadPassword temporarily changes the prompt and reads a password, without
|
|
||||||
// echo, from the terminal.
|
|
||||||
func (t *Terminal) ReadPassword(prompt string) (line string, err error) {
|
|
||||||
t.lock.Lock()
|
|
||||||
defer t.lock.Unlock()
|
|
||||||
|
|
||||||
oldPrompt := t.prompt
|
|
||||||
t.prompt = []rune(prompt)
|
|
||||||
t.echo = false
|
|
||||||
|
|
||||||
line, err = t.readLine()
|
|
||||||
|
|
||||||
t.prompt = oldPrompt
|
|
||||||
t.echo = true
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReadLine returns a line of input from the terminal.
|
|
||||||
func (t *Terminal) ReadLine() (line string, err error) {
|
|
||||||
t.lock.Lock()
|
|
||||||
defer t.lock.Unlock()
|
|
||||||
|
|
||||||
return t.readLine()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Terminal) readLine() (line string, err error) {
|
|
||||||
// t.lock must be held at this point
|
|
||||||
|
|
||||||
if t.cursorX == 0 && t.cursorY == 0 {
|
|
||||||
t.writeLine(t.prompt)
|
|
||||||
t.c.Write(t.outBuf)
|
|
||||||
t.outBuf = t.outBuf[:0]
|
|
||||||
}
|
|
||||||
|
|
||||||
lineIsPasted := t.pasteActive
|
|
||||||
|
|
||||||
for {
|
|
||||||
rest := t.remainder
|
|
||||||
lineOk := false
|
|
||||||
for !lineOk {
|
|
||||||
var key rune
|
|
||||||
key, rest = bytesToKey(rest, t.pasteActive)
|
|
||||||
if key == utf8.RuneError {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if !t.pasteActive {
|
|
||||||
if key == keyCtrlD {
|
|
||||||
if len(t.line) == 0 {
|
|
||||||
return "", io.EOF
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if key == keyPasteStart {
|
|
||||||
t.pasteActive = true
|
|
||||||
if len(t.line) == 0 {
|
|
||||||
lineIsPasted = true
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
} else if key == keyPasteEnd {
|
|
||||||
t.pasteActive = false
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if !t.pasteActive {
|
|
||||||
lineIsPasted = false
|
|
||||||
}
|
|
||||||
line, lineOk = t.handleKey(key)
|
|
||||||
}
|
|
||||||
if len(rest) > 0 {
|
|
||||||
n := copy(t.inBuf[:], rest)
|
|
||||||
t.remainder = t.inBuf[:n]
|
|
||||||
} else {
|
|
||||||
t.remainder = nil
|
|
||||||
}
|
|
||||||
t.c.Write(t.outBuf)
|
|
||||||
t.outBuf = t.outBuf[:0]
|
|
||||||
if lineOk {
|
|
||||||
if t.echo {
|
|
||||||
t.historyIndex = -1
|
|
||||||
t.history.Add(line)
|
|
||||||
}
|
|
||||||
if lineIsPasted {
|
|
||||||
err = ErrPasteIndicator
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// t.remainder is a slice at the beginning of t.inBuf
|
|
||||||
// containing a partial key sequence
|
|
||||||
readBuf := t.inBuf[len(t.remainder):]
|
|
||||||
var n int
|
|
||||||
|
|
||||||
t.lock.Unlock()
|
|
||||||
n, err = t.c.Read(readBuf)
|
|
||||||
t.lock.Lock()
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
t.remainder = t.inBuf[:n+len(t.remainder)]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetPrompt sets the prompt to be used when reading subsequent lines.
|
|
||||||
func (t *Terminal) SetPrompt(prompt string) {
|
|
||||||
t.lock.Lock()
|
|
||||||
defer t.lock.Unlock()
|
|
||||||
|
|
||||||
t.prompt = []rune(prompt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Terminal) clearAndRepaintLinePlusNPrevious(numPrevLines int) {
|
|
||||||
// Move cursor to column zero at the start of the line.
|
|
||||||
t.move(t.cursorY, 0, t.cursorX, 0)
|
|
||||||
t.cursorX, t.cursorY = 0, 0
|
|
||||||
t.clearLineToRight()
|
|
||||||
for t.cursorY < numPrevLines {
|
|
||||||
// Move down a line
|
|
||||||
t.move(0, 1, 0, 0)
|
|
||||||
t.cursorY++
|
|
||||||
t.clearLineToRight()
|
|
||||||
}
|
|
||||||
// Move back to beginning.
|
|
||||||
t.move(t.cursorY, 0, 0, 0)
|
|
||||||
t.cursorX, t.cursorY = 0, 0
|
|
||||||
|
|
||||||
t.queue(t.prompt)
|
|
||||||
t.advanceCursor(visualLength(t.prompt))
|
|
||||||
t.writeLine(t.line)
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Terminal) SetSize(width, height int) error {
|
|
||||||
t.lock.Lock()
|
|
||||||
defer t.lock.Unlock()
|
|
||||||
|
|
||||||
if width == 0 {
|
|
||||||
width = 1
|
|
||||||
}
|
|
||||||
|
|
||||||
oldWidth := t.termWidth
|
|
||||||
t.termWidth, t.termHeight = width, height
|
|
||||||
|
|
||||||
switch {
|
|
||||||
case width == oldWidth:
|
|
||||||
// If the width didn't change then nothing else needs to be
|
|
||||||
// done.
|
|
||||||
return nil
|
|
||||||
case len(t.line) == 0 && t.cursorX == 0 && t.cursorY == 0:
|
|
||||||
// If there is nothing on current line and no prompt printed,
|
|
||||||
// just do nothing
|
|
||||||
return nil
|
|
||||||
case width < oldWidth:
|
|
||||||
// Some terminals (e.g. xterm) will truncate lines that were
|
|
||||||
// too long when shinking. Others, (e.g. gnome-terminal) will
|
|
||||||
// attempt to wrap them. For the former, repainting t.maxLine
|
|
||||||
// works great, but that behaviour goes badly wrong in the case
|
|
||||||
// of the latter because they have doubled every full line.
|
|
||||||
|
|
||||||
// We assume that we are working on a terminal that wraps lines
|
|
||||||
// and adjust the cursor position based on every previous line
|
|
||||||
// wrapping and turning into two. This causes the prompt on
|
|
||||||
// xterms to move upwards, which isn't great, but it avoids a
|
|
||||||
// huge mess with gnome-terminal.
|
|
||||||
if t.cursorX >= t.termWidth {
|
|
||||||
t.cursorX = t.termWidth - 1
|
|
||||||
}
|
|
||||||
t.cursorY *= 2
|
|
||||||
t.clearAndRepaintLinePlusNPrevious(t.maxLine * 2)
|
|
||||||
case width > oldWidth:
|
|
||||||
// If the terminal expands then our position calculations will
|
|
||||||
// be wrong in the future because we think the cursor is
|
|
||||||
// |t.pos| chars into the string, but there will be a gap at
|
|
||||||
// the end of any wrapped line.
|
|
||||||
//
|
|
||||||
// But the position will actually be correct until we move, so
|
|
||||||
// we can move back to the beginning and repaint everything.
|
|
||||||
t.clearAndRepaintLinePlusNPrevious(t.maxLine)
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := t.c.Write(t.outBuf)
|
|
||||||
t.outBuf = t.outBuf[:0]
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
type pasteIndicatorError struct{}
|
|
||||||
|
|
||||||
func (pasteIndicatorError) Error() string {
|
|
||||||
return "terminal: ErrPasteIndicator not correctly handled"
|
|
||||||
}
|
|
||||||
|
|
||||||
// ErrPasteIndicator may be returned from ReadLine as the error, in addition
|
|
||||||
// to valid line data. It indicates that bracketed paste mode is enabled and
|
|
||||||
// that the returned line consists only of pasted data. Programs may wish to
|
|
||||||
// interpret pasted data more literally than typed data.
|
|
||||||
var ErrPasteIndicator = pasteIndicatorError{}
|
|
||||||
|
|
||||||
// SetBracketedPasteMode requests that the terminal bracket paste operations
|
|
||||||
// with markers. Not all terminals support this but, if it is supported, then
|
|
||||||
// enabling this mode will stop any autocomplete callback from running due to
|
|
||||||
// pastes. Additionally, any lines that are completely pasted will be returned
|
|
||||||
// from ReadLine with the error set to ErrPasteIndicator.
|
|
||||||
func (t *Terminal) SetBracketedPasteMode(on bool) {
|
|
||||||
if on {
|
|
||||||
io.WriteString(t.c, "\x1b[?2004h")
|
|
||||||
} else {
|
|
||||||
io.WriteString(t.c, "\x1b[?2004l")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// stRingBuffer is a ring buffer of strings.
|
|
||||||
type stRingBuffer struct {
|
|
||||||
// entries contains max elements.
|
|
||||||
entries []string
|
|
||||||
max int
|
|
||||||
// head contains the index of the element most recently added to the ring.
|
|
||||||
head int
|
|
||||||
// size contains the number of elements in the ring.
|
|
||||||
size int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *stRingBuffer) Add(a string) {
|
|
||||||
if s.entries == nil {
|
|
||||||
const defaultNumEntries = 100
|
|
||||||
s.entries = make([]string, defaultNumEntries)
|
|
||||||
s.max = defaultNumEntries
|
|
||||||
}
|
|
||||||
|
|
||||||
s.head = (s.head + 1) % s.max
|
|
||||||
s.entries[s.head] = a
|
|
||||||
if s.size < s.max {
|
|
||||||
s.size++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NthPreviousEntry returns the value passed to the nth previous call to Add.
|
|
||||||
// If n is zero then the immediately prior value is returned, if one, then the
|
|
||||||
// next most recent, and so on. If such an element doesn't exist then ok is
|
|
||||||
// false.
|
|
||||||
func (s *stRingBuffer) NthPreviousEntry(n int) (value string, ok bool) {
|
|
||||||
if n >= s.size {
|
|
||||||
return "", false
|
|
||||||
}
|
|
||||||
index := s.head - n
|
|
||||||
if index < 0 {
|
|
||||||
index += s.max
|
|
||||||
}
|
|
||||||
return s.entries[index], true
|
|
||||||
}
|
|
||||||
|
|
||||||
// readPasswordLine reads from reader until it finds \n or io.EOF.
|
|
||||||
// The slice returned does not include the \n.
|
|
||||||
// readPasswordLine also ignores any \r it finds.
|
|
||||||
func readPasswordLine(reader io.Reader) ([]byte, error) {
|
|
||||||
var buf [1]byte
|
|
||||||
var ret []byte
|
|
||||||
|
|
||||||
for {
|
|
||||||
n, err := reader.Read(buf[:])
|
|
||||||
if n > 0 {
|
|
||||||
switch buf[0] {
|
|
||||||
case '\n':
|
|
||||||
return ret, nil
|
|
||||||
case '\r':
|
|
||||||
// remove \r from passwords on Windows
|
|
||||||
default:
|
|
||||||
ret = append(ret, buf[0])
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
if err == io.EOF && len(ret) > 0 {
|
|
||||||
return ret, nil
|
|
||||||
}
|
|
||||||
return ret, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,114 +0,0 @@
|
|||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build darwin dragonfly freebsd linux,!appengine netbsd openbsd
|
|
||||||
|
|
||||||
// Package terminal provides support functions for dealing with terminals, as
|
|
||||||
// commonly found on UNIX systems.
|
|
||||||
//
|
|
||||||
// Putting a terminal into raw mode is the most common requirement:
|
|
||||||
//
|
|
||||||
// oldState, err := terminal.MakeRaw(0)
|
|
||||||
// if err != nil {
|
|
||||||
// panic(err)
|
|
||||||
// }
|
|
||||||
// defer terminal.Restore(0, oldState)
|
|
||||||
package terminal // import "golang.org/x/crypto/ssh/terminal"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"golang.org/x/sys/unix"
|
|
||||||
)
|
|
||||||
|
|
||||||
// State contains the state of a terminal.
|
|
||||||
type State struct {
|
|
||||||
termios unix.Termios
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsTerminal returns true if the given file descriptor is a terminal.
|
|
||||||
func IsTerminal(fd int) bool {
|
|
||||||
_, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
|
|
||||||
return err == nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MakeRaw put the terminal connected to the given file descriptor into raw
|
|
||||||
// mode and returns the previous state of the terminal so that it can be
|
|
||||||
// restored.
|
|
||||||
func MakeRaw(fd int) (*State, error) {
|
|
||||||
termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
oldState := State{termios: *termios}
|
|
||||||
|
|
||||||
// This attempts to replicate the behaviour documented for cfmakeraw in
|
|
||||||
// the termios(3) manpage.
|
|
||||||
termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON
|
|
||||||
termios.Oflag &^= unix.OPOST
|
|
||||||
termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN
|
|
||||||
termios.Cflag &^= unix.CSIZE | unix.PARENB
|
|
||||||
termios.Cflag |= unix.CS8
|
|
||||||
termios.Cc[unix.VMIN] = 1
|
|
||||||
termios.Cc[unix.VTIME] = 0
|
|
||||||
if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, termios); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &oldState, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetState returns the current state of a terminal which may be useful to
|
|
||||||
// restore the terminal after a signal.
|
|
||||||
func GetState(fd int) (*State, error) {
|
|
||||||
termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &State{termios: *termios}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Restore restores the terminal connected to the given file descriptor to a
|
|
||||||
// previous state.
|
|
||||||
func Restore(fd int, state *State) error {
|
|
||||||
return unix.IoctlSetTermios(fd, ioctlWriteTermios, &state.termios)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetSize returns the dimensions of the given terminal.
|
|
||||||
func GetSize(fd int) (width, height int, err error) {
|
|
||||||
ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ)
|
|
||||||
if err != nil {
|
|
||||||
return -1, -1, err
|
|
||||||
}
|
|
||||||
return int(ws.Col), int(ws.Row), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// passwordReader is an io.Reader that reads from a specific file descriptor.
|
|
||||||
type passwordReader int
|
|
||||||
|
|
||||||
func (r passwordReader) Read(buf []byte) (int, error) {
|
|
||||||
return unix.Read(int(r), buf)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReadPassword reads a line of input from a terminal without local echo. This
|
|
||||||
// is commonly used for inputting passwords and other sensitive data. The slice
|
|
||||||
// returned does not include the \n.
|
|
||||||
func ReadPassword(fd int) ([]byte, error) {
|
|
||||||
termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
newState := *termios
|
|
||||||
newState.Lflag &^= unix.ECHO
|
|
||||||
newState.Lflag |= unix.ICANON | unix.ISIG
|
|
||||||
newState.Iflag |= unix.ICRNL
|
|
||||||
if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, &newState); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer unix.IoctlSetTermios(fd, ioctlWriteTermios, termios)
|
|
||||||
|
|
||||||
return readPasswordLine(passwordReader(fd))
|
|
||||||
}
|
|
@ -1,12 +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 darwin dragonfly freebsd netbsd openbsd
|
|
||||||
|
|
||||||
package terminal
|
|
||||||
|
|
||||||
import "golang.org/x/sys/unix"
|
|
||||||
|
|
||||||
const ioctlReadTermios = unix.TIOCGETA
|
|
||||||
const ioctlWriteTermios = unix.TIOCSETA
|
|
@ -1,10 +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.
|
|
||||||
|
|
||||||
package terminal
|
|
||||||
|
|
||||||
import "golang.org/x/sys/unix"
|
|
||||||
|
|
||||||
const ioctlReadTermios = unix.TCGETS
|
|
||||||
const ioctlWriteTermios = unix.TCSETS
|
|
@ -1,58 +0,0 @@
|
|||||||
// 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.
|
|
||||||
|
|
||||||
// Package terminal provides support functions for dealing with terminals, as
|
|
||||||
// commonly found on UNIX systems.
|
|
||||||
//
|
|
||||||
// Putting a terminal into raw mode is the most common requirement:
|
|
||||||
//
|
|
||||||
// oldState, err := terminal.MakeRaw(0)
|
|
||||||
// if err != nil {
|
|
||||||
// panic(err)
|
|
||||||
// }
|
|
||||||
// defer terminal.Restore(0, oldState)
|
|
||||||
package terminal
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"runtime"
|
|
||||||
)
|
|
||||||
|
|
||||||
type State struct{}
|
|
||||||
|
|
||||||
// IsTerminal returns true if the given file descriptor is a terminal.
|
|
||||||
func IsTerminal(fd int) bool {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// MakeRaw put the terminal connected to the given file descriptor into raw
|
|
||||||
// mode and returns the previous state of the terminal so that it can be
|
|
||||||
// restored.
|
|
||||||
func MakeRaw(fd int) (*State, error) {
|
|
||||||
return nil, fmt.Errorf("terminal: MakeRaw not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetState returns the current state of a terminal which may be useful to
|
|
||||||
// restore the terminal after a signal.
|
|
||||||
func GetState(fd int) (*State, error) {
|
|
||||||
return nil, fmt.Errorf("terminal: GetState not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Restore restores the terminal connected to the given file descriptor to a
|
|
||||||
// previous state.
|
|
||||||
func Restore(fd int, state *State) error {
|
|
||||||
return fmt.Errorf("terminal: Restore not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetSize returns the dimensions of the given terminal.
|
|
||||||
func GetSize(fd int) (width, height int, err error) {
|
|
||||||
return 0, 0, fmt.Errorf("terminal: GetSize not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReadPassword reads a line of input from a terminal without local echo. This
|
|
||||||
// is commonly used for inputting passwords and other sensitive data. The slice
|
|
||||||
// returned does not include the \n.
|
|
||||||
func ReadPassword(fd int) ([]byte, error) {
|
|
||||||
return nil, fmt.Errorf("terminal: ReadPassword not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
|
|
||||||
}
|
|
@ -1,124 +0,0 @@
|
|||||||
// Copyright 2015 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 solaris
|
|
||||||
|
|
||||||
package terminal // import "golang.org/x/crypto/ssh/terminal"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"golang.org/x/sys/unix"
|
|
||||||
"io"
|
|
||||||
"syscall"
|
|
||||||
)
|
|
||||||
|
|
||||||
// State contains the state of a terminal.
|
|
||||||
type State struct {
|
|
||||||
termios unix.Termios
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsTerminal returns true if the given file descriptor is a terminal.
|
|
||||||
func IsTerminal(fd int) bool {
|
|
||||||
_, err := unix.IoctlGetTermio(fd, unix.TCGETA)
|
|
||||||
return err == nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReadPassword reads a line of input from a terminal without local echo. This
|
|
||||||
// is commonly used for inputting passwords and other sensitive data. The slice
|
|
||||||
// returned does not include the \n.
|
|
||||||
func ReadPassword(fd int) ([]byte, error) {
|
|
||||||
// see also: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libast/common/uwin/getpass.c
|
|
||||||
val, err := unix.IoctlGetTermios(fd, unix.TCGETS)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
oldState := *val
|
|
||||||
|
|
||||||
newState := oldState
|
|
||||||
newState.Lflag &^= syscall.ECHO
|
|
||||||
newState.Lflag |= syscall.ICANON | syscall.ISIG
|
|
||||||
newState.Iflag |= syscall.ICRNL
|
|
||||||
err = unix.IoctlSetTermios(fd, unix.TCSETS, &newState)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer unix.IoctlSetTermios(fd, unix.TCSETS, &oldState)
|
|
||||||
|
|
||||||
var buf [16]byte
|
|
||||||
var ret []byte
|
|
||||||
for {
|
|
||||||
n, err := syscall.Read(fd, buf[:])
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if n == 0 {
|
|
||||||
if len(ret) == 0 {
|
|
||||||
return nil, io.EOF
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if buf[n-1] == '\n' {
|
|
||||||
n--
|
|
||||||
}
|
|
||||||
ret = append(ret, buf[:n]...)
|
|
||||||
if n < len(buf) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MakeRaw puts the terminal connected to the given file descriptor into raw
|
|
||||||
// mode and returns the previous state of the terminal so that it can be
|
|
||||||
// restored.
|
|
||||||
// see http://cr.illumos.org/~webrev/andy_js/1060/
|
|
||||||
func MakeRaw(fd int) (*State, error) {
|
|
||||||
termios, err := unix.IoctlGetTermios(fd, unix.TCGETS)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
oldState := State{termios: *termios}
|
|
||||||
|
|
||||||
termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON
|
|
||||||
termios.Oflag &^= unix.OPOST
|
|
||||||
termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN
|
|
||||||
termios.Cflag &^= unix.CSIZE | unix.PARENB
|
|
||||||
termios.Cflag |= unix.CS8
|
|
||||||
termios.Cc[unix.VMIN] = 1
|
|
||||||
termios.Cc[unix.VTIME] = 0
|
|
||||||
|
|
||||||
if err := unix.IoctlSetTermios(fd, unix.TCSETS, termios); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &oldState, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Restore restores the terminal connected to the given file descriptor to a
|
|
||||||
// previous state.
|
|
||||||
func Restore(fd int, oldState *State) error {
|
|
||||||
return unix.IoctlSetTermios(fd, unix.TCSETS, &oldState.termios)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetState returns the current state of a terminal which may be useful to
|
|
||||||
// restore the terminal after a signal.
|
|
||||||
func GetState(fd int) (*State, error) {
|
|
||||||
termios, err := unix.IoctlGetTermios(fd, unix.TCGETS)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &State{termios: *termios}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetSize returns the dimensions of the given terminal.
|
|
||||||
func GetSize(fd int) (width, height int, err error) {
|
|
||||||
ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ)
|
|
||||||
if err != nil {
|
|
||||||
return 0, 0, err
|
|
||||||
}
|
|
||||||
return int(ws.Col), int(ws.Row), nil
|
|
||||||
}
|
|
@ -1,103 +0,0 @@
|
|||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build windows
|
|
||||||
|
|
||||||
// Package terminal provides support functions for dealing with terminals, as
|
|
||||||
// commonly found on UNIX systems.
|
|
||||||
//
|
|
||||||
// Putting a terminal into raw mode is the most common requirement:
|
|
||||||
//
|
|
||||||
// oldState, err := terminal.MakeRaw(0)
|
|
||||||
// if err != nil {
|
|
||||||
// panic(err)
|
|
||||||
// }
|
|
||||||
// defer terminal.Restore(0, oldState)
|
|
||||||
package terminal
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"golang.org/x/sys/windows"
|
|
||||||
)
|
|
||||||
|
|
||||||
type State struct {
|
|
||||||
mode uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsTerminal returns true if the given file descriptor is a terminal.
|
|
||||||
func IsTerminal(fd int) bool {
|
|
||||||
var st uint32
|
|
||||||
err := windows.GetConsoleMode(windows.Handle(fd), &st)
|
|
||||||
return err == nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MakeRaw put the terminal connected to the given file descriptor into raw
|
|
||||||
// mode and returns the previous state of the terminal so that it can be
|
|
||||||
// restored.
|
|
||||||
func MakeRaw(fd int) (*State, error) {
|
|
||||||
var st uint32
|
|
||||||
if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
raw := st &^ (windows.ENABLE_ECHO_INPUT | windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT)
|
|
||||||
if err := windows.SetConsoleMode(windows.Handle(fd), raw); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &State{st}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetState returns the current state of a terminal which may be useful to
|
|
||||||
// restore the terminal after a signal.
|
|
||||||
func GetState(fd int) (*State, error) {
|
|
||||||
var st uint32
|
|
||||||
if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &State{st}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Restore restores the terminal connected to the given file descriptor to a
|
|
||||||
// previous state.
|
|
||||||
func Restore(fd int, state *State) error {
|
|
||||||
return windows.SetConsoleMode(windows.Handle(fd), state.mode)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetSize returns the dimensions of the given terminal.
|
|
||||||
func GetSize(fd int) (width, height int, err error) {
|
|
||||||
var info windows.ConsoleScreenBufferInfo
|
|
||||||
if err := windows.GetConsoleScreenBufferInfo(windows.Handle(fd), &info); err != nil {
|
|
||||||
return 0, 0, err
|
|
||||||
}
|
|
||||||
return int(info.Size.X), int(info.Size.Y), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReadPassword reads a line of input from a terminal without local echo. This
|
|
||||||
// is commonly used for inputting passwords and other sensitive data. The slice
|
|
||||||
// returned does not include the \n.
|
|
||||||
func ReadPassword(fd int) ([]byte, error) {
|
|
||||||
var st uint32
|
|
||||||
if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
old := st
|
|
||||||
|
|
||||||
st &^= (windows.ENABLE_ECHO_INPUT)
|
|
||||||
st |= (windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT)
|
|
||||||
if err := windows.SetConsoleMode(windows.Handle(fd), st); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer windows.SetConsoleMode(windows.Handle(fd), old)
|
|
||||||
|
|
||||||
var h windows.Handle
|
|
||||||
p, _ := windows.GetCurrentProcess()
|
|
||||||
if err := windows.DuplicateHandle(p, windows.Handle(fd), p, &h, 0, false, windows.DUPLICATE_SAME_ACCESS); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
f := os.NewFile(uintptr(h), "stdin")
|
|
||||||
defer f.Close()
|
|
||||||
return readPasswordLine(f)
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
# This source code refers to The Go Authors for copyright purposes.
|
|
||||||
# The master list of authors is in the main Go distribution,
|
|
||||||
# visible at http://tip.golang.org/AUTHORS.
|
|
@ -1,3 +0,0 @@
|
|||||||
# This source code was written by the Go contributors.
|
|
||||||
# The master list of contributors is in the main Go distribution,
|
|
||||||
# visible at http://tip.golang.org/CONTRIBUTORS.
|
|
@ -1,27 +0,0 @@
|
|||||||
Copyright (c) 2009 The Go Authors. All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above
|
|
||||||
copyright notice, this list of conditions and the following disclaimer
|
|
||||||
in the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
* Neither the name of Google Inc. nor the names of its
|
|
||||||
contributors may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@ -1,22 +0,0 @@
|
|||||||
Additional IP Rights Grant (Patents)
|
|
||||||
|
|
||||||
"This implementation" means the copyrightable works distributed by
|
|
||||||
Google as part of the Go project.
|
|
||||||
|
|
||||||
Google hereby grants to You a perpetual, worldwide, non-exclusive,
|
|
||||||
no-charge, royalty-free, irrevocable (except as stated in this section)
|
|
||||||
patent license to make, have made, use, offer to sell, sell, import,
|
|
||||||
transfer and otherwise run, modify and propagate the contents of this
|
|
||||||
implementation of Go, where such license applies only to those patent
|
|
||||||
claims, both currently owned or controlled by Google and acquired in
|
|
||||||
the future, licensable by Google that are necessarily infringed by this
|
|
||||||
implementation of Go. This grant does not include claims that would be
|
|
||||||
infringed only as a consequence of further modification of this
|
|
||||||
implementation. If you or your agent or exclusive licensee institute or
|
|
||||||
order or agree to the institution of patent litigation against any
|
|
||||||
entity (including a cross-claim or counterclaim in a lawsuit) alleging
|
|
||||||
that this implementation of Go or any code incorporated within this
|
|
||||||
implementation of Go constitutes direct or contributory patent
|
|
||||||
infringement, or inducement of patent infringement, then any patent
|
|
||||||
rights granted to you under this License for this implementation of Go
|
|
||||||
shall terminate as of the date such litigation is filed.
|
|
@ -1,124 +0,0 @@
|
|||||||
// 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)
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
// 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 !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for 386, Darwin
|
|
||||||
//
|
|
||||||
|
|
||||||
// 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 ·RawSyscall(SB),NOSPLIT,$0-28
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
@ -1,29 +0,0 @@
|
|||||||
// 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 !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for AMD64, Darwin
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-104
|
|
||||||
JMP syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
@ -1,30 +0,0 @@
|
|||||||
// Copyright 2015 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
|
|
||||||
// +build arm,darwin
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for ARM, Darwin
|
|
||||||
//
|
|
||||||
|
|
||||||
// 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)
|
|
@ -1,30 +0,0 @@
|
|||||||
// Copyright 2015 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
|
|
||||||
// +build arm64,darwin
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for AMD64, Darwin
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
B syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
B syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-104
|
|
||||||
B syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
B syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
B syscall·RawSyscall6(SB)
|
|
@ -1,29 +0,0 @@
|
|||||||
// 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 !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for AMD64, DragonFly
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-104
|
|
||||||
JMP syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
@ -1,29 +0,0 @@
|
|||||||
// 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 !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for 386, FreeBSD
|
|
||||||
//
|
|
||||||
|
|
||||||
// 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 ·RawSyscall(SB),NOSPLIT,$0-28
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
@ -1,29 +0,0 @@
|
|||||||
// 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 !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for AMD64, FreeBSD
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-104
|
|
||||||
JMP syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
@ -1,29 +0,0 @@
|
|||||||
// Copyright 2012 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, FreeBSD
|
|
||||||
//
|
|
||||||
|
|
||||||
// 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)
|
|
@ -1,65 +0,0 @@
|
|||||||
// 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 !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System calls for 386, Linux
|
|
||||||
//
|
|
||||||
|
|
||||||
// See ../runtime/sys_linux_386.s for the reason why we always use int 0x80
|
|
||||||
// instead of the glibc-specific "CALL 0x10(GS)".
|
|
||||||
#define INVOKE_SYSCALL INT $0x80
|
|
||||||
|
|
||||||
// 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 ·SyscallNoError(SB),NOSPLIT,$0-24
|
|
||||||
CALL runtime·entersyscall(SB)
|
|
||||||
MOVL trap+0(FP), AX // syscall entry
|
|
||||||
MOVL a1+4(FP), BX
|
|
||||||
MOVL a2+8(FP), CX
|
|
||||||
MOVL a3+12(FP), DX
|
|
||||||
MOVL $0, SI
|
|
||||||
MOVL $0, DI
|
|
||||||
INVOKE_SYSCALL
|
|
||||||
MOVL AX, r1+16(FP)
|
|
||||||
MOVL DX, r2+20(FP)
|
|
||||||
CALL 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
|
|
||||||
MOVL trap+0(FP), AX // syscall entry
|
|
||||||
MOVL a1+4(FP), BX
|
|
||||||
MOVL a2+8(FP), CX
|
|
||||||
MOVL a3+12(FP), DX
|
|
||||||
MOVL $0, SI
|
|
||||||
MOVL $0, DI
|
|
||||||
INVOKE_SYSCALL
|
|
||||||
MOVL AX, r1+16(FP)
|
|
||||||
MOVL DX, r2+20(FP)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·socketcall(SB),NOSPLIT,$0-36
|
|
||||||
JMP syscall·socketcall(SB)
|
|
||||||
|
|
||||||
TEXT ·rawsocketcall(SB),NOSPLIT,$0-36
|
|
||||||
JMP syscall·rawsocketcall(SB)
|
|
||||||
|
|
||||||
TEXT ·seek(SB),NOSPLIT,$0-28
|
|
||||||
JMP syscall·seek(SB)
|
|
@ -1,57 +0,0 @@
|
|||||||
// 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 !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System calls for AMD64, Linux
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·SyscallNoError(SB),NOSPLIT,$0-48
|
|
||||||
CALL runtime·entersyscall(SB)
|
|
||||||
MOVQ a1+8(FP), DI
|
|
||||||
MOVQ a2+16(FP), SI
|
|
||||||
MOVQ a3+24(FP), DX
|
|
||||||
MOVQ $0, R10
|
|
||||||
MOVQ $0, R8
|
|
||||||
MOVQ $0, R9
|
|
||||||
MOVQ trap+0(FP), AX // syscall entry
|
|
||||||
SYSCALL
|
|
||||||
MOVQ AX, r1+32(FP)
|
|
||||||
MOVQ DX, r2+40(FP)
|
|
||||||
CALL runtime·exitsyscall(SB)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48
|
|
||||||
MOVQ a1+8(FP), DI
|
|
||||||
MOVQ a2+16(FP), SI
|
|
||||||
MOVQ a3+24(FP), DX
|
|
||||||
MOVQ $0, R10
|
|
||||||
MOVQ $0, R8
|
|
||||||
MOVQ $0, R9
|
|
||||||
MOVQ trap+0(FP), AX // syscall entry
|
|
||||||
SYSCALL
|
|
||||||
MOVQ AX, r1+32(FP)
|
|
||||||
MOVQ DX, r2+40(FP)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·gettimeofday(SB),NOSPLIT,$0-16
|
|
||||||
JMP syscall·gettimeofday(SB)
|
|
@ -1,56 +0,0 @@
|
|||||||
// 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 !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System calls for arm, Linux
|
|
||||||
//
|
|
||||||
|
|
||||||
// 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 ·SyscallNoError(SB),NOSPLIT,$0-24
|
|
||||||
BL runtime·entersyscall(SB)
|
|
||||||
MOVW trap+0(FP), R7
|
|
||||||
MOVW a1+4(FP), R0
|
|
||||||
MOVW a2+8(FP), R1
|
|
||||||
MOVW a3+12(FP), R2
|
|
||||||
MOVW $0, R3
|
|
||||||
MOVW $0, R4
|
|
||||||
MOVW $0, R5
|
|
||||||
SWI $0
|
|
||||||
MOVW R0, r1+16(FP)
|
|
||||||
MOVW $0, R0
|
|
||||||
MOVW R0, r2+20(FP)
|
|
||||||
BL runtime·exitsyscall(SB)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-28
|
|
||||||
B syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
|
|
||||||
B syscall·RawSyscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-24
|
|
||||||
MOVW trap+0(FP), R7 // syscall entry
|
|
||||||
MOVW a1+4(FP), R0
|
|
||||||
MOVW a2+8(FP), R1
|
|
||||||
MOVW a3+12(FP), R2
|
|
||||||
SWI $0
|
|
||||||
MOVW R0, r1+16(FP)
|
|
||||||
MOVW $0, R0
|
|
||||||
MOVW R0, r2+20(FP)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·seek(SB),NOSPLIT,$0-28
|
|
||||||
B syscall·seek(SB)
|
|
@ -1,52 +0,0 @@
|
|||||||
// Copyright 2015 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 arm64
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
B syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
B syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·SyscallNoError(SB),NOSPLIT,$0-48
|
|
||||||
BL runtime·entersyscall(SB)
|
|
||||||
MOVD a1+8(FP), R0
|
|
||||||
MOVD a2+16(FP), R1
|
|
||||||
MOVD a3+24(FP), R2
|
|
||||||
MOVD $0, R3
|
|
||||||
MOVD $0, R4
|
|
||||||
MOVD $0, R5
|
|
||||||
MOVD trap+0(FP), R8 // syscall entry
|
|
||||||
SVC
|
|
||||||
MOVD R0, r1+32(FP) // r1
|
|
||||||
MOVD R1, r2+40(FP) // r2
|
|
||||||
BL runtime·exitsyscall(SB)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
B syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
B syscall·RawSyscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48
|
|
||||||
MOVD a1+8(FP), R0
|
|
||||||
MOVD a2+16(FP), R1
|
|
||||||
MOVD a3+24(FP), R2
|
|
||||||
MOVD $0, R3
|
|
||||||
MOVD $0, R4
|
|
||||||
MOVD $0, R5
|
|
||||||
MOVD trap+0(FP), R8 // syscall entry
|
|
||||||
SVC
|
|
||||||
MOVD R0, r1+32(FP)
|
|
||||||
MOVD R1, r2+40(FP)
|
|
||||||
RET
|
|
@ -1,56 +0,0 @@
|
|||||||
// Copyright 2015 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 mips64 mips64le
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System calls for mips64, Linux
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·SyscallNoError(SB),NOSPLIT,$0-48
|
|
||||||
JAL runtime·entersyscall(SB)
|
|
||||||
MOVV a1+8(FP), R4
|
|
||||||
MOVV a2+16(FP), R5
|
|
||||||
MOVV a3+24(FP), R6
|
|
||||||
MOVV R0, R7
|
|
||||||
MOVV R0, R8
|
|
||||||
MOVV R0, R9
|
|
||||||
MOVV trap+0(FP), R2 // syscall entry
|
|
||||||
SYSCALL
|
|
||||||
MOVV R2, r1+32(FP)
|
|
||||||
MOVV R3, r2+40(FP)
|
|
||||||
JAL runtime·exitsyscall(SB)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48
|
|
||||||
MOVV a1+8(FP), R4
|
|
||||||
MOVV a2+16(FP), R5
|
|
||||||
MOVV a3+24(FP), R6
|
|
||||||
MOVV R0, R7
|
|
||||||
MOVV R0, R8
|
|
||||||
MOVV R0, R9
|
|
||||||
MOVV trap+0(FP), R2 // syscall entry
|
|
||||||
SYSCALL
|
|
||||||
MOVV R2, r1+32(FP)
|
|
||||||
MOVV R3, r2+40(FP)
|
|
||||||
RET
|
|
@ -1,54 +0,0 @@
|
|||||||
// 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
|
|
@ -1,56 +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 linux
|
|
||||||
// +build ppc64 ppc64le
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System calls for ppc64, Linux
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
BR syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
BR syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·SyscallNoError(SB),NOSPLIT,$0-48
|
|
||||||
BL runtime·entersyscall(SB)
|
|
||||||
MOVD a1+8(FP), R3
|
|
||||||
MOVD a2+16(FP), R4
|
|
||||||
MOVD a3+24(FP), R5
|
|
||||||
MOVD R0, R6
|
|
||||||
MOVD R0, R7
|
|
||||||
MOVD R0, R8
|
|
||||||
MOVD trap+0(FP), R9 // syscall entry
|
|
||||||
SYSCALL R9
|
|
||||||
MOVD R3, r1+32(FP)
|
|
||||||
MOVD R4, r2+40(FP)
|
|
||||||
BL runtime·exitsyscall(SB)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
BR syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
BR syscall·RawSyscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48
|
|
||||||
MOVD a1+8(FP), R3
|
|
||||||
MOVD a2+16(FP), R4
|
|
||||||
MOVD a3+24(FP), R5
|
|
||||||
MOVD R0, R6
|
|
||||||
MOVD R0, R7
|
|
||||||
MOVD R0, R8
|
|
||||||
MOVD trap+0(FP), R9 // syscall entry
|
|
||||||
SYSCALL R9
|
|
||||||
MOVD R3, r1+32(FP)
|
|
||||||
MOVD R4, r2+40(FP)
|
|
||||||
RET
|
|
@ -1,56 +0,0 @@
|
|||||||
// 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 s390x
|
|
||||||
// +build linux
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System calls for s390x, Linux
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
BR syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
BR syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·SyscallNoError(SB),NOSPLIT,$0-48
|
|
||||||
BL runtime·entersyscall(SB)
|
|
||||||
MOVD a1+8(FP), R2
|
|
||||||
MOVD a2+16(FP), R3
|
|
||||||
MOVD a3+24(FP), R4
|
|
||||||
MOVD $0, R5
|
|
||||||
MOVD $0, R6
|
|
||||||
MOVD $0, R7
|
|
||||||
MOVD trap+0(FP), R1 // syscall entry
|
|
||||||
SYSCALL
|
|
||||||
MOVD R2, r1+32(FP)
|
|
||||||
MOVD R3, r2+40(FP)
|
|
||||||
BL runtime·exitsyscall(SB)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
BR syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
BR syscall·RawSyscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48
|
|
||||||
MOVD a1+8(FP), R2
|
|
||||||
MOVD a2+16(FP), R3
|
|
||||||
MOVD a3+24(FP), R4
|
|
||||||
MOVD $0, R5
|
|
||||||
MOVD $0, R6
|
|
||||||
MOVD $0, R7
|
|
||||||
MOVD trap+0(FP), R1 // syscall entry
|
|
||||||
SYSCALL
|
|
||||||
MOVD R2, r1+32(FP)
|
|
||||||
MOVD R3, r2+40(FP)
|
|
||||||
RET
|
|
@ -1,29 +0,0 @@
|
|||||||
// 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 !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for 386, NetBSD
|
|
||||||
//
|
|
||||||
|
|
||||||
// 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 ·RawSyscall(SB),NOSPLIT,$0-28
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
@ -1,29 +0,0 @@
|
|||||||
// 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 !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for AMD64, NetBSD
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-104
|
|
||||||
JMP syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
@ -1,29 +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 !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for ARM, NetBSD
|
|
||||||
//
|
|
||||||
|
|
||||||
// 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)
|
|
@ -1,29 +0,0 @@
|
|||||||
// 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 !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for 386, OpenBSD
|
|
||||||
//
|
|
||||||
|
|
||||||
// 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 ·RawSyscall(SB),NOSPLIT,$0-28
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
@ -1,29 +0,0 @@
|
|||||||
// 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 !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for AMD64, OpenBSD
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-104
|
|
||||||
JMP syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
@ -1,29 +0,0 @@
|
|||||||
// 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)
|
|
@ -1,17 +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"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System calls for amd64, Solaris are implemented in runtime/syscall_solaris.go
|
|
||||||
//
|
|
||||||
|
|
||||||
TEXT ·sysvicall6(SB),NOSPLIT,$0-88
|
|
||||||
JMP syscall·sysvicall6(SB)
|
|
||||||
|
|
||||||
TEXT ·rawSysvicall6(SB),NOSPLIT,$0-88
|
|
||||||
JMP syscall·rawSysvicall6(SB)
|
|
@ -1,35 +0,0 @@
|
|||||||
// 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.
|
|
||||||
|
|
||||||
// Bluetooth sockets and messages
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
// Bluetooth Protocols
|
|
||||||
const (
|
|
||||||
BTPROTO_L2CAP = 0
|
|
||||||
BTPROTO_HCI = 1
|
|
||||||
BTPROTO_SCO = 2
|
|
||||||
BTPROTO_RFCOMM = 3
|
|
||||||
BTPROTO_BNEP = 4
|
|
||||||
BTPROTO_CMTP = 5
|
|
||||||
BTPROTO_HIDP = 6
|
|
||||||
BTPROTO_AVDTP = 7
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
HCI_CHANNEL_RAW = 0
|
|
||||||
HCI_CHANNEL_USER = 1
|
|
||||||
HCI_CHANNEL_MONITOR = 2
|
|
||||||
HCI_CHANNEL_CONTROL = 3
|
|
||||||
)
|
|
||||||
|
|
||||||
// Socketoption Level
|
|
||||||
const (
|
|
||||||
SOL_BLUETOOTH = 0x112
|
|
||||||
SOL_HCI = 0x0
|
|
||||||
SOL_L2CAP = 0x6
|
|
||||||
SOL_RFCOMM = 0x12
|
|
||||||
SOL_SCO = 0x11
|
|
||||||
)
|
|
@ -1,195 +0,0 @@
|
|||||||
// 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
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
// Copyright 2015 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
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
const (
|
|
||||||
R_OK = 0x4
|
|
||||||
W_OK = 0x2
|
|
||||||
X_OK = 0x1
|
|
||||||
)
|
|
@ -1,24 +0,0 @@
|
|||||||
// 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)
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
// 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)
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
// 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)
|
|
||||||
}
|
|
@ -1,42 +0,0 @@
|
|||||||
// 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
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
// 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
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
// 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
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
// 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 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)
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
// 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
|
|
@ -1,9 +0,0 @@
|
|||||||
// 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,31 +0,0 @@
|
|||||||
// Copyright 2010 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build darwin dragonfly freebsd linux netbsd openbsd solaris
|
|
||||||
|
|
||||||
// Unix environment variables.
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import "syscall"
|
|
||||||
|
|
||||||
func Getenv(key string) (value string, found bool) {
|
|
||||||
return syscall.Getenv(key)
|
|
||||||
}
|
|
||||||
|
|
||||||
func Setenv(key, value string) error {
|
|
||||||
return syscall.Setenv(key, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
func Clearenv() {
|
|
||||||
syscall.Clearenv()
|
|
||||||
}
|
|
||||||
|
|
||||||
func Environ() []string {
|
|
||||||
return syscall.Environ()
|
|
||||||
}
|
|
||||||
|
|
||||||
func Unsetenv(key string) error {
|
|
||||||
return syscall.Unsetenv(key)
|
|
||||||
}
|
|
@ -1,227 +0,0 @@
|
|||||||
// 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
|
|
||||||
)
|
|
@ -1,227 +0,0 @@
|
|||||||
// 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
|
|
||||||
)
|
|
@ -1,226 +0,0 @@
|
|||||||
// 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,28 +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 darwin dragonfly freebsd linux netbsd openbsd
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import "unsafe"
|
|
||||||
|
|
||||||
// fcntl64Syscall is usually SYS_FCNTL, but is overridden on 32-bit Linux
|
|
||||||
// systems by flock_linux_32bit.go to be SYS_FCNTL64.
|
|
||||||
var fcntl64Syscall uintptr = SYS_FCNTL
|
|
||||||
|
|
||||||
// FcntlInt performs a fcntl syscall on fd with the provided command and argument.
|
|
||||||
func FcntlInt(fd uintptr, cmd, arg int) (int, error) {
|
|
||||||
valptr, _, err := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(arg))
|
|
||||||
return int(valptr), err
|
|
||||||
}
|
|
||||||
|
|
||||||
// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command.
|
|
||||||
func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error {
|
|
||||||
_, _, errno := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(unsafe.Pointer(lk)))
|
|
||||||
if errno == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return errno
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
// +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
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
// On 32-bit Linux systems, the fcntl syscall that matches Go's
|
|
||||||
// Flock_t type is SYS_FCNTL64, not SYS_FCNTL.
|
|
||||||
fcntl64Syscall = SYS_FCNTL64
|
|
||||||
}
|
|
@ -1,61 +0,0 @@
|
|||||||
// Copyright 2015 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
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import "syscall"
|
|
||||||
|
|
||||||
// We can't use the gc-syntax .s files for gccgo. On the plus side
|
|
||||||
// much of the functionality can be written directly in Go.
|
|
||||||
|
|
||||||
//extern gccgoRealSyscallNoError
|
|
||||||
func realSyscallNoError(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r uintptr)
|
|
||||||
|
|
||||||
//extern gccgoRealSyscall
|
|
||||||
func realSyscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r, errno uintptr)
|
|
||||||
|
|
||||||
func SyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) {
|
|
||||||
syscall.Entersyscall()
|
|
||||||
r := realSyscallNoError(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0)
|
|
||||||
syscall.Exitsyscall()
|
|
||||||
return r, 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) {
|
|
||||||
syscall.Entersyscall()
|
|
||||||
r, errno := realSyscall(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0)
|
|
||||||
syscall.Exitsyscall()
|
|
||||||
return r, 0, syscall.Errno(errno)
|
|
||||||
}
|
|
||||||
|
|
||||||
func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) {
|
|
||||||
syscall.Entersyscall()
|
|
||||||
r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, 0, 0, 0)
|
|
||||||
syscall.Exitsyscall()
|
|
||||||
return r, 0, syscall.Errno(errno)
|
|
||||||
}
|
|
||||||
|
|
||||||
func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) {
|
|
||||||
syscall.Entersyscall()
|
|
||||||
r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9)
|
|
||||||
syscall.Exitsyscall()
|
|
||||||
return r, 0, syscall.Errno(errno)
|
|
||||||
}
|
|
||||||
|
|
||||||
func RawSyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) {
|
|
||||||
r := realSyscallNoError(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0)
|
|
||||||
return r, 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) {
|
|
||||||
r, errno := realSyscall(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0)
|
|
||||||
return r, 0, syscall.Errno(errno)
|
|
||||||
}
|
|
||||||
|
|
||||||
func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) {
|
|
||||||
r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, 0, 0, 0)
|
|
||||||
return r, 0, syscall.Errno(errno)
|
|
||||||
}
|
|
@ -1,47 +0,0 @@
|
|||||||
// Copyright 2015 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 <errno.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#define _STRINGIFY2_(x) #x
|
|
||||||
#define _STRINGIFY_(x) _STRINGIFY2_(x)
|
|
||||||
#define GOSYM_PREFIX _STRINGIFY_(__USER_LABEL_PREFIX__)
|
|
||||||
|
|
||||||
// Call syscall from C code because the gccgo support for calling from
|
|
||||||
// Go to C does not support varargs functions.
|
|
||||||
|
|
||||||
struct ret {
|
|
||||||
uintptr_t r;
|
|
||||||
uintptr_t err;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ret
|
|
||||||
gccgoRealSyscall(uintptr_t trap, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, uintptr_t a7, uintptr_t a8, uintptr_t a9)
|
|
||||||
{
|
|
||||||
struct ret r;
|
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
r.r = syscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9);
|
|
||||||
r.err = errno;
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
uintptr_t
|
|
||||||
gccgoRealSyscallNoError(uintptr_t trap, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, uintptr_t a7, uintptr_t a8, uintptr_t a9)
|
|
||||||
{
|
|
||||||
return syscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Define the use function in C so that it is not inlined.
|
|
||||||
|
|
||||||
extern void use(void *) __asm__ (GOSYM_PREFIX GOPKGPATH ".use") __attribute__((noinline));
|
|
||||||
|
|
||||||
void
|
|
||||||
use(void *p __attribute__ ((unused)))
|
|
||||||
{
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
// Copyright 2015 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,linux,amd64
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import "syscall"
|
|
||||||
|
|
||||||
//extern gettimeofday
|
|
||||||
func realGettimeofday(*Timeval, *byte) int32
|
|
||||||
|
|
||||||
func gettimeofday(tv *Timeval) (err syscall.Errno) {
|
|
||||||
r := realGettimeofday(tv, nil)
|
|
||||||
if r < 0 {
|
|
||||||
return syscall.GetErrno()
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
@ -1,98 +0,0 @@
|
|||||||
// 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 ignore
|
|
||||||
|
|
||||||
// mkpost processes the output of cgo -godefs to
|
|
||||||
// modify the generated types. It is used to clean up
|
|
||||||
// the sys API in an architecture specific manner.
|
|
||||||
//
|
|
||||||
// mkpost is run after cgo -godefs; see README.md.
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"go/format"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
"regexp"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
// Get the OS and architecture (using GOARCH_TARGET if it exists)
|
|
||||||
goos := os.Getenv("GOOS")
|
|
||||||
goarch := os.Getenv("GOARCH_TARGET")
|
|
||||||
if goarch == "" {
|
|
||||||
goarch = os.Getenv("GOARCH")
|
|
||||||
}
|
|
||||||
// Check that we are using the new build system if we should be.
|
|
||||||
if goos == "linux" && goarch != "sparc64" {
|
|
||||||
if os.Getenv("GOLANG_SYS_BUILD") != "docker" {
|
|
||||||
os.Stderr.WriteString("In the new build system, mkpost should not be called directly.\n")
|
|
||||||
os.Stderr.WriteString("See README.md\n")
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
b, err := ioutil.ReadAll(os.Stdin)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Intentionally export __val fields in Fsid and Sigset_t
|
|
||||||
valRegex := regexp.MustCompile(`type (Fsid|Sigset_t) struct {(\s+)X__val(\s+\S+\s+)}`)
|
|
||||||
b = valRegex.ReplaceAll(b, []byte("type $1 struct {${2}Val$3}"))
|
|
||||||
|
|
||||||
// If we have empty Ptrace structs, we should delete them. Only s390x emits
|
|
||||||
// nonempty Ptrace structs.
|
|
||||||
ptraceRexexp := regexp.MustCompile(`type Ptrace((Psw|Fpregs|Per) struct {\s*})`)
|
|
||||||
b = ptraceRexexp.ReplaceAll(b, nil)
|
|
||||||
|
|
||||||
// Replace the control_regs union with a blank identifier for now.
|
|
||||||
controlRegsRegex := regexp.MustCompile(`(Control_regs)\s+\[0\]uint64`)
|
|
||||||
b = controlRegsRegex.ReplaceAll(b, []byte("_ [0]uint64"))
|
|
||||||
|
|
||||||
// Remove fields that are added by glibc
|
|
||||||
// Note that this is unstable as the identifers are private.
|
|
||||||
removeFieldsRegex := regexp.MustCompile(`X__glibc\S*`)
|
|
||||||
b = removeFieldsRegex.ReplaceAll(b, []byte("_"))
|
|
||||||
|
|
||||||
// Convert [65]int8 to [65]byte in Utsname members to simplify
|
|
||||||
// conversion to string; see golang.org/issue/20753
|
|
||||||
convertUtsnameRegex := regexp.MustCompile(`((Sys|Node|Domain)name|Release|Version|Machine)(\s+)\[(\d+)\]u?int8`)
|
|
||||||
b = convertUtsnameRegex.ReplaceAll(b, []byte("$1$3[$4]byte"))
|
|
||||||
|
|
||||||
// Remove spare fields (e.g. in Statx_t)
|
|
||||||
spareFieldsRegex := regexp.MustCompile(`X__spare\S*`)
|
|
||||||
b = spareFieldsRegex.ReplaceAll(b, []byte("_"))
|
|
||||||
|
|
||||||
// Remove cgo padding fields
|
|
||||||
removePaddingFieldsRegex := regexp.MustCompile(`Pad_cgo_\d+`)
|
|
||||||
b = removePaddingFieldsRegex.ReplaceAll(b, []byte("_"))
|
|
||||||
|
|
||||||
// Remove padding, hidden, or unused fields
|
|
||||||
removeFieldsRegex = regexp.MustCompile(`\b(X_\S+|Padding)`)
|
|
||||||
b = removeFieldsRegex.ReplaceAll(b, []byte("_"))
|
|
||||||
|
|
||||||
// Remove the first line of warning from cgo
|
|
||||||
b = b[bytes.IndexByte(b, '\n')+1:]
|
|
||||||
// Modify the command in the header to include:
|
|
||||||
// mkpost, our own warning, and a build tag.
|
|
||||||
replacement := fmt.Sprintf(`$1 | go run mkpost.go
|
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
|
||||||
|
|
||||||
// +build %s,%s`, goarch, goos)
|
|
||||||
cgoCommandRegex := regexp.MustCompile(`(cgo -godefs .*)`)
|
|
||||||
b = cgoCommandRegex.ReplaceAll(b, []byte(replacement))
|
|
||||||
|
|
||||||
// gofmt
|
|
||||||
b, err = format.Source(b)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
os.Stdout.Write(b)
|
|
||||||
}
|
|
@ -1,38 +0,0 @@
|
|||||||
// 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 (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
SYS_PLEDGE = 108
|
|
||||||
)
|
|
||||||
|
|
||||||
// Pledge implements the pledge syscall. For more information see pledge(2).
|
|
||||||
func Pledge(promises string, paths []string) error {
|
|
||||||
promisesPtr, err := syscall.BytePtrFromString(promises)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
promisesUnsafe, pathsUnsafe := unsafe.Pointer(promisesPtr), unsafe.Pointer(nil)
|
|
||||||
if paths != nil {
|
|
||||||
var pathsPtr []*byte
|
|
||||||
if pathsPtr, err = syscall.SlicePtrFromStrings(paths); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
pathsUnsafe = unsafe.Pointer(&pathsPtr[0])
|
|
||||||
}
|
|
||||||
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(promisesUnsafe), uintptr(pathsUnsafe), 0)
|
|
||||||
if e != 0 {
|
|
||||||
return e
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
// 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 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()
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
// Copyright 2012 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,race linux,race freebsd,race
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"runtime"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
const raceenabled = true
|
|
||||||
|
|
||||||
func raceAcquire(addr unsafe.Pointer) {
|
|
||||||
runtime.RaceAcquire(addr)
|
|
||||||
}
|
|
||||||
|
|
||||||
func raceReleaseMerge(addr unsafe.Pointer) {
|
|
||||||
runtime.RaceReleaseMerge(addr)
|
|
||||||
}
|
|
||||||
|
|
||||||
func raceReadRange(addr unsafe.Pointer, len int) {
|
|
||||||
runtime.RaceReadRange(addr, len)
|
|
||||||
}
|
|
||||||
|
|
||||||
func raceWriteRange(addr unsafe.Pointer, len int) {
|
|
||||||
runtime.RaceWriteRange(addr, len)
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
// Copyright 2012 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,!race linux,!race freebsd,!race netbsd openbsd solaris dragonfly
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
const raceenabled = false
|
|
||||||
|
|
||||||
func raceAcquire(addr unsafe.Pointer) {
|
|
||||||
}
|
|
||||||
|
|
||||||
func raceReleaseMerge(addr unsafe.Pointer) {
|
|
||||||
}
|
|
||||||
|
|
||||||
func raceReadRange(addr unsafe.Pointer, len int) {
|
|
||||||
}
|
|
||||||
|
|
||||||
func raceWriteRange(addr unsafe.Pointer, len int) {
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Socket control messages
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import "unsafe"
|
|
||||||
|
|
||||||
// UnixCredentials encodes credentials into a socket control message
|
|
||||||
// for sending to another process. This can be used for
|
|
||||||
// authentication.
|
|
||||||
func UnixCredentials(ucred *Ucred) []byte {
|
|
||||||
b := make([]byte, CmsgSpace(SizeofUcred))
|
|
||||||
h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
|
|
||||||
h.Level = SOL_SOCKET
|
|
||||||
h.Type = SCM_CREDENTIALS
|
|
||||||
h.SetLen(CmsgLen(SizeofUcred))
|
|
||||||
*((*Ucred)(cmsgData(h))) = *ucred
|
|
||||||
return b
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseUnixCredentials decodes a socket control message that contains
|
|
||||||
// credentials in a Ucred structure. To receive such a message, the
|
|
||||||
// SO_PASSCRED option must be enabled on the socket.
|
|
||||||
func ParseUnixCredentials(m *SocketControlMessage) (*Ucred, error) {
|
|
||||||
if m.Header.Level != SOL_SOCKET {
|
|
||||||
return nil, EINVAL
|
|
||||||
}
|
|
||||||
if m.Header.Type != SCM_CREDENTIALS {
|
|
||||||
return nil, EINVAL
|
|
||||||
}
|
|
||||||
ucred := *(*Ucred)(unsafe.Pointer(&m.Data[0]))
|
|
||||||
return &ucred, nil
|
|
||||||
}
|
|
@ -1,104 +0,0 @@
|
|||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build darwin dragonfly freebsd linux netbsd openbsd solaris
|
|
||||||
|
|
||||||
// Socket control messages
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import "unsafe"
|
|
||||||
|
|
||||||
// Round the length of a raw sockaddr up to align it properly.
|
|
||||||
func cmsgAlignOf(salen int) int {
|
|
||||||
salign := sizeofPtr
|
|
||||||
// NOTE: It seems like 64-bit Darwin, DragonFly BSD and
|
|
||||||
// Solaris kernels still require 32-bit aligned access to
|
|
||||||
// network subsystem.
|
|
||||||
if darwin64Bit || dragonfly64Bit || solaris64Bit {
|
|
||||||
salign = 4
|
|
||||||
}
|
|
||||||
return (salen + salign - 1) & ^(salign - 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CmsgLen returns the value to store in the Len field of the Cmsghdr
|
|
||||||
// structure, taking into account any necessary alignment.
|
|
||||||
func CmsgLen(datalen int) int {
|
|
||||||
return cmsgAlignOf(SizeofCmsghdr) + datalen
|
|
||||||
}
|
|
||||||
|
|
||||||
// CmsgSpace returns the number of bytes an ancillary element with
|
|
||||||
// payload of the passed data length occupies.
|
|
||||||
func CmsgSpace(datalen int) int {
|
|
||||||
return cmsgAlignOf(SizeofCmsghdr) + cmsgAlignOf(datalen)
|
|
||||||
}
|
|
||||||
|
|
||||||
func cmsgData(h *Cmsghdr) unsafe.Pointer {
|
|
||||||
return unsafe.Pointer(uintptr(unsafe.Pointer(h)) + uintptr(cmsgAlignOf(SizeofCmsghdr)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// SocketControlMessage represents a socket control message.
|
|
||||||
type SocketControlMessage struct {
|
|
||||||
Header Cmsghdr
|
|
||||||
Data []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseSocketControlMessage parses b as an array of socket control
|
|
||||||
// messages.
|
|
||||||
func ParseSocketControlMessage(b []byte) ([]SocketControlMessage, error) {
|
|
||||||
var msgs []SocketControlMessage
|
|
||||||
i := 0
|
|
||||||
for i+CmsgLen(0) <= len(b) {
|
|
||||||
h, dbuf, err := socketControlMessageHeaderAndData(b[i:])
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
m := SocketControlMessage{Header: *h, Data: dbuf}
|
|
||||||
msgs = append(msgs, m)
|
|
||||||
i += cmsgAlignOf(int(h.Len))
|
|
||||||
}
|
|
||||||
return msgs, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func socketControlMessageHeaderAndData(b []byte) (*Cmsghdr, []byte, error) {
|
|
||||||
h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
|
|
||||||
if h.Len < SizeofCmsghdr || uint64(h.Len) > uint64(len(b)) {
|
|
||||||
return nil, nil, EINVAL
|
|
||||||
}
|
|
||||||
return h, b[cmsgAlignOf(SizeofCmsghdr):h.Len], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnixRights encodes a set of open file descriptors into a socket
|
|
||||||
// control message for sending to another process.
|
|
||||||
func UnixRights(fds ...int) []byte {
|
|
||||||
datalen := len(fds) * 4
|
|
||||||
b := make([]byte, CmsgSpace(datalen))
|
|
||||||
h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
|
|
||||||
h.Level = SOL_SOCKET
|
|
||||||
h.Type = SCM_RIGHTS
|
|
||||||
h.SetLen(CmsgLen(datalen))
|
|
||||||
data := cmsgData(h)
|
|
||||||
for _, fd := range fds {
|
|
||||||
*(*int32)(data) = int32(fd)
|
|
||||||
data = unsafe.Pointer(uintptr(data) + 4)
|
|
||||||
}
|
|
||||||
return b
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseUnixRights decodes a socket control message that contains an
|
|
||||||
// integer array of open file descriptors from another process.
|
|
||||||
func ParseUnixRights(m *SocketControlMessage) ([]int, error) {
|
|
||||||
if m.Header.Level != SOL_SOCKET {
|
|
||||||
return nil, EINVAL
|
|
||||||
}
|
|
||||||
if m.Header.Type != SCM_RIGHTS {
|
|
||||||
return nil, EINVAL
|
|
||||||
}
|
|
||||||
fds := make([]int, len(m.Data)>>2)
|
|
||||||
for i, j := 0, 0; i < len(m.Data); i += 4 {
|
|
||||||
fds[j] = int(*(*int32)(unsafe.Pointer(&m.Data[i])))
|
|
||||||
j++
|
|
||||||
}
|
|
||||||
return fds, nil
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
// 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 darwin dragonfly freebsd linux netbsd openbsd solaris
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
func itoa(val int) string { // do it here rather than with fmt to avoid dependency
|
|
||||||
if val < 0 {
|
|
||||||
return "-" + uitoa(uint(-val))
|
|
||||||
}
|
|
||||||
return uitoa(uint(val))
|
|
||||||
}
|
|
||||||
|
|
||||||
func uitoa(val uint) string {
|
|
||||||
var buf [32]byte // big enough for int64
|
|
||||||
i := len(buf) - 1
|
|
||||||
for val >= 10 {
|
|
||||||
buf[i] = byte(val%10 + '0')
|
|
||||||
i--
|
|
||||||
val /= 10
|
|
||||||
}
|
|
||||||
buf[i] = byte(val + '0')
|
|
||||||
return string(buf[i:])
|
|
||||||
}
|
|
@ -1,54 +0,0 @@
|
|||||||
// 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 darwin dragonfly freebsd linux netbsd openbsd solaris
|
|
||||||
|
|
||||||
// Package unix contains an interface to the low-level operating system
|
|
||||||
// primitives. OS details vary depending on the underlying system, and
|
|
||||||
// by default, godoc will display OS-specific documentation for the current
|
|
||||||
// system. If you want godoc to display OS documentation for another
|
|
||||||
// system, set $GOOS and $GOARCH to the desired system. For example, if
|
|
||||||
// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS
|
|
||||||
// to freebsd and $GOARCH to arm.
|
|
||||||
//
|
|
||||||
// The primary use of this package is inside other packages that provide a more
|
|
||||||
// portable interface to the system, such as "os", "time" and "net". Use
|
|
||||||
// those packages rather than this one if you can.
|
|
||||||
//
|
|
||||||
// For details of the functions and data types in this package consult
|
|
||||||
// the manuals for the appropriate operating system.
|
|
||||||
//
|
|
||||||
// These calls return err == nil to indicate success; otherwise
|
|
||||||
// err represents an operating system error describing the failure and
|
|
||||||
// holds a value of type syscall.Errno.
|
|
||||||
package unix // import "golang.org/x/sys/unix"
|
|
||||||
|
|
||||||
import "strings"
|
|
||||||
|
|
||||||
// ByteSliceFromString returns a NUL-terminated slice of bytes
|
|
||||||
// containing the text of s. If s contains a NUL byte at any
|
|
||||||
// location, it returns (nil, EINVAL).
|
|
||||||
func ByteSliceFromString(s string) ([]byte, error) {
|
|
||||||
if strings.IndexByte(s, 0) != -1 {
|
|
||||||
return nil, EINVAL
|
|
||||||
}
|
|
||||||
a := make([]byte, len(s)+1)
|
|
||||||
copy(a, s)
|
|
||||||
return a, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// BytePtrFromString returns a pointer to a NUL-terminated array of
|
|
||||||
// bytes containing the text of s. If s contains a NUL byte at any
|
|
||||||
// location, it returns (nil, EINVAL).
|
|
||||||
func BytePtrFromString(s string) (*byte, error) {
|
|
||||||
a, err := ByteSliceFromString(s)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &a[0], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Single-word zero for use when we need a valid pointer to 0 bytes.
|
|
||||||
// See mkunix.pl.
|
|
||||||
var _zero uintptr
|
|
@ -1,624 +0,0 @@
|
|||||||
// 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 darwin dragonfly freebsd netbsd openbsd
|
|
||||||
|
|
||||||
// BSD system call wrappers shared by *BSD based systems
|
|
||||||
// including OS X (Darwin) and FreeBSD. Like the other
|
|
||||||
// syscall_*.go files it is compiled as Go code but also
|
|
||||||
// used as input to mksyscall which parses the //sys
|
|
||||||
// lines and generates system call stubs.
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"runtime"
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Wrapped
|
|
||||||
*/
|
|
||||||
|
|
||||||
//sysnb getgroups(ngid int, gid *_Gid_t) (n int, err error)
|
|
||||||
//sysnb setgroups(ngid int, gid *_Gid_t) (err error)
|
|
||||||
|
|
||||||
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])
|
|
||||||
}
|
|
||||||
|
|
||||||
func ReadDirent(fd int, buf []byte) (n int, err error) {
|
|
||||||
// Final argument is (basep *uintptr) and the syscall doesn't take nil.
|
|
||||||
// 64 bits should be enough. (32 bits isn't even on 386). Since the
|
|
||||||
// actual system call is getdirentries64, 64 is a good guess.
|
|
||||||
// TODO(rsc): Can we use a single global basep for all calls?
|
|
||||||
var base = (*uintptr)(unsafe.Pointer(new(uint64)))
|
|
||||||
return Getdirentries(fd, buf, base)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wait status is 7 bits at bottom, either 0 (exited),
|
|
||||||
// 0x7F (stopped), or a signal number that caused an exit.
|
|
||||||
// The 0x80 bit is whether there was a core dump.
|
|
||||||
// An extra number (exit code, signal causing a stop)
|
|
||||||
// is in the high bits.
|
|
||||||
|
|
||||||
type WaitStatus uint32
|
|
||||||
|
|
||||||
const (
|
|
||||||
mask = 0x7F
|
|
||||||
core = 0x80
|
|
||||||
shift = 8
|
|
||||||
|
|
||||||
exited = 0
|
|
||||||
stopped = 0x7F
|
|
||||||
)
|
|
||||||
|
|
||||||
func (w WaitStatus) Exited() bool { return w&mask == exited }
|
|
||||||
|
|
||||||
func (w WaitStatus) ExitStatus() int {
|
|
||||||
if w&mask != exited {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
return int(w >> shift)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 }
|
|
||||||
|
|
||||||
func (w WaitStatus) Signal() syscall.Signal {
|
|
||||||
sig := syscall.Signal(w & mask)
|
|
||||||
if sig == stopped || sig == 0 {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
return sig
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 }
|
|
||||||
|
|
||||||
func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP }
|
|
||||||
|
|
||||||
func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP }
|
|
||||||
|
|
||||||
func (w WaitStatus) StopSignal() syscall.Signal {
|
|
||||||
if !w.Stopped() {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
return syscall.Signal(w>>shift) & 0xFF
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w WaitStatus) TrapCause() int { return -1 }
|
|
||||||
|
|
||||||
//sys wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error)
|
|
||||||
|
|
||||||
func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
|
|
||||||
var status _C_int
|
|
||||||
wpid, err = wait4(pid, &status, options, rusage)
|
|
||||||
if wstatus != nil {
|
|
||||||
*wstatus = WaitStatus(status)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (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 socket(domain int, typ int, proto int) (fd int, 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 getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
|
|
||||||
//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
|
|
||||||
//sys Shutdown(s int, how int) (err error)
|
|
||||||
|
|
||||||
func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) {
|
|
||||||
if sa.Port < 0 || sa.Port > 0xFFFF {
|
|
||||||
return nil, 0, EINVAL
|
|
||||||
}
|
|
||||||
sa.raw.Len = SizeofSockaddrInet4
|
|
||||||
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), _Socklen(sa.raw.Len), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) {
|
|
||||||
if sa.Port < 0 || sa.Port > 0xFFFF {
|
|
||||||
return nil, 0, EINVAL
|
|
||||||
}
|
|
||||||
sa.raw.Len = SizeofSockaddrInet6
|
|
||||||
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), _Socklen(sa.raw.Len), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) {
|
|
||||||
name := sa.Name
|
|
||||||
n := len(name)
|
|
||||||
if n >= len(sa.raw.Path) || n == 0 {
|
|
||||||
return nil, 0, EINVAL
|
|
||||||
}
|
|
||||||
sa.raw.Len = byte(3 + n) // 2 for Family, Len; 1 for NUL
|
|
||||||
sa.raw.Family = AF_UNIX
|
|
||||||
for i := 0; i < n; i++ {
|
|
||||||
sa.raw.Path[i] = int8(name[i])
|
|
||||||
}
|
|
||||||
return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sa *SockaddrDatalink) sockaddr() (unsafe.Pointer, _Socklen, error) {
|
|
||||||
if sa.Index == 0 {
|
|
||||||
return nil, 0, EINVAL
|
|
||||||
}
|
|
||||||
sa.raw.Len = sa.Len
|
|
||||||
sa.raw.Family = AF_LINK
|
|
||||||
sa.raw.Index = sa.Index
|
|
||||||
sa.raw.Type = sa.Type
|
|
||||||
sa.raw.Nlen = sa.Nlen
|
|
||||||
sa.raw.Alen = sa.Alen
|
|
||||||
sa.raw.Slen = sa.Slen
|
|
||||||
for i := 0; i < len(sa.raw.Data); i++ {
|
|
||||||
sa.raw.Data[i] = sa.Data[i]
|
|
||||||
}
|
|
||||||
return unsafe.Pointer(&sa.raw), SizeofSockaddrDatalink, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) {
|
|
||||||
switch rsa.Addr.Family {
|
|
||||||
case AF_LINK:
|
|
||||||
pp := (*RawSockaddrDatalink)(unsafe.Pointer(rsa))
|
|
||||||
sa := new(SockaddrDatalink)
|
|
||||||
sa.Len = pp.Len
|
|
||||||
sa.Family = pp.Family
|
|
||||||
sa.Index = pp.Index
|
|
||||||
sa.Type = pp.Type
|
|
||||||
sa.Nlen = pp.Nlen
|
|
||||||
sa.Alen = pp.Alen
|
|
||||||
sa.Slen = pp.Slen
|
|
||||||
for i := 0; i < len(sa.Data); i++ {
|
|
||||||
sa.Data[i] = pp.Data[i]
|
|
||||||
}
|
|
||||||
return sa, nil
|
|
||||||
|
|
||||||
case AF_UNIX:
|
|
||||||
pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
|
|
||||||
if pp.Len < 2 || pp.Len > SizeofSockaddrUnix {
|
|
||||||
return nil, EINVAL
|
|
||||||
}
|
|
||||||
sa := new(SockaddrUnix)
|
|
||||||
|
|
||||||
// Some BSDs include the trailing NUL in the length, whereas
|
|
||||||
// others do not. Work around this by subtracting the leading
|
|
||||||
// family and len. The path is then scanned to see if a NUL
|
|
||||||
// terminator still exists within the length.
|
|
||||||
n := int(pp.Len) - 2 // subtract leading Family, Len
|
|
||||||
for i := 0; i < n; i++ {
|
|
||||||
if pp.Path[i] == 0 {
|
|
||||||
// found early NUL; assume Len included the NUL
|
|
||||||
// or was overestimating.
|
|
||||||
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 Accept(fd int) (nfd int, sa Sockaddr, err error) {
|
|
||||||
var rsa RawSockaddrAny
|
|
||||||
var len _Socklen = SizeofSockaddrAny
|
|
||||||
nfd, err = accept(fd, &rsa, &len)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if runtime.GOOS == "darwin" && len == 0 {
|
|
||||||
// Accepted socket has no address.
|
|
||||||
// This is likely due to a bug in xnu kernels,
|
|
||||||
// where instead of ECONNABORTED error socket
|
|
||||||
// is accepted, but has no address.
|
|
||||||
Close(nfd)
|
|
||||||
return 0, nil, ECONNABORTED
|
|
||||||
}
|
|
||||||
sa, err = anyToSockaddr(&rsa)
|
|
||||||
if err != nil {
|
|
||||||
Close(nfd)
|
|
||||||
nfd = 0
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Getsockname(fd int) (sa Sockaddr, err error) {
|
|
||||||
var rsa RawSockaddrAny
|
|
||||||
var len _Socklen = SizeofSockaddrAny
|
|
||||||
if err = getsockname(fd, &rsa, &len); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// TODO(jsing): DragonFly has a "bug" (see issue 3349), which should be
|
|
||||||
// reported upstream.
|
|
||||||
if runtime.GOOS == "dragonfly" && rsa.Addr.Family == AF_UNSPEC && rsa.Addr.Len == 0 {
|
|
||||||
rsa.Addr.Family = AF_UNIX
|
|
||||||
rsa.Addr.Len = SizeofSockaddrUnix
|
|
||||||
}
|
|
||||||
return anyToSockaddr(&rsa)
|
|
||||||
}
|
|
||||||
|
|
||||||
//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)
|
|
||||||
|
|
||||||
// GetsockoptString returns the string value of the socket option opt for the
|
|
||||||
// socket associated with fd at the given socket level.
|
|
||||||
func GetsockoptString(fd, level, opt int) (string, error) {
|
|
||||||
buf := make([]byte, 256)
|
|
||||||
vallen := _Socklen(len(buf))
|
|
||||||
err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return string(buf[:vallen-1]), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
//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)
|
|
||||||
|
|
||||||
func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
|
|
||||||
var msg Msghdr
|
|
||||||
var rsa RawSockaddrAny
|
|
||||||
msg.Name = (*byte)(unsafe.Pointer(&rsa))
|
|
||||||
msg.Namelen = uint32(SizeofSockaddrAny)
|
|
||||||
var iov Iovec
|
|
||||||
if len(p) > 0 {
|
|
||||||
iov.Base = (*byte)(unsafe.Pointer(&p[0]))
|
|
||||||
iov.SetLen(len(p))
|
|
||||||
}
|
|
||||||
var dummy byte
|
|
||||||
if len(oob) > 0 {
|
|
||||||
// receive at least one normal byte
|
|
||||||
if len(p) == 0 {
|
|
||||||
iov.Base = &dummy
|
|
||||||
iov.SetLen(1)
|
|
||||||
}
|
|
||||||
msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
|
|
||||||
msg.SetControllen(len(oob))
|
|
||||||
}
|
|
||||||
msg.Iov = &iov
|
|
||||||
msg.Iovlen = 1
|
|
||||||
if n, err = recvmsg(fd, &msg, flags); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
oobn = int(msg.Controllen)
|
|
||||||
recvflags = int(msg.Flags)
|
|
||||||
// source address is only specified if the socket is unconnected
|
|
||||||
if rsa.Addr.Family != AF_UNSPEC {
|
|
||||||
from, err = anyToSockaddr(&rsa)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
|
|
||||||
|
|
||||||
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) {
|
|
||||||
var ptr unsafe.Pointer
|
|
||||||
var salen _Socklen
|
|
||||||
if to != nil {
|
|
||||||
ptr, salen, err = to.sockaddr()
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var msg Msghdr
|
|
||||||
msg.Name = (*byte)(unsafe.Pointer(ptr))
|
|
||||||
msg.Namelen = uint32(salen)
|
|
||||||
var iov Iovec
|
|
||||||
if len(p) > 0 {
|
|
||||||
iov.Base = (*byte)(unsafe.Pointer(&p[0]))
|
|
||||||
iov.SetLen(len(p))
|
|
||||||
}
|
|
||||||
var dummy byte
|
|
||||||
if len(oob) > 0 {
|
|
||||||
// send at least one normal byte
|
|
||||||
if len(p) == 0 {
|
|
||||||
iov.Base = &dummy
|
|
||||||
iov.SetLen(1)
|
|
||||||
}
|
|
||||||
msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
|
|
||||||
msg.SetControllen(len(oob))
|
|
||||||
}
|
|
||||||
msg.Iov = &iov
|
|
||||||
msg.Iovlen = 1
|
|
||||||
if n, err = sendmsg(fd, &msg, flags); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
if len(oob) > 0 && len(p) == 0 {
|
|
||||||
n = 0
|
|
||||||
}
|
|
||||||
return n, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error)
|
|
||||||
|
|
||||||
func Kevent(kq int, changes, events []Kevent_t, timeout *Timespec) (n int, err error) {
|
|
||||||
var change, event unsafe.Pointer
|
|
||||||
if len(changes) > 0 {
|
|
||||||
change = unsafe.Pointer(&changes[0])
|
|
||||||
}
|
|
||||||
if len(events) > 0 {
|
|
||||||
event = unsafe.Pointer(&events[0])
|
|
||||||
}
|
|
||||||
return kevent(kq, change, len(changes), event, len(events), timeout)
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL
|
|
||||||
|
|
||||||
// sysctlmib translates name to mib number and appends any additional args.
|
|
||||||
func sysctlmib(name string, args ...int) ([]_C_int, error) {
|
|
||||||
// Translate name to mib number.
|
|
||||||
mib, err := nametomib(name)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, a := range args {
|
|
||||||
mib = append(mib, _C_int(a))
|
|
||||||
}
|
|
||||||
|
|
||||||
return mib, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func Sysctl(name string) (string, error) {
|
|
||||||
return SysctlArgs(name)
|
|
||||||
}
|
|
||||||
|
|
||||||
func SysctlArgs(name string, args ...int) (string, error) {
|
|
||||||
buf, err := SysctlRaw(name, args...)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
n := len(buf)
|
|
||||||
|
|
||||||
// Throw away terminating NUL.
|
|
||||||
if n > 0 && buf[n-1] == '\x00' {
|
|
||||||
n--
|
|
||||||
}
|
|
||||||
return string(buf[0:n]), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func SysctlUint32(name string) (uint32, error) {
|
|
||||||
return SysctlUint32Args(name)
|
|
||||||
}
|
|
||||||
|
|
||||||
func SysctlUint32Args(name string, args ...int) (uint32, error) {
|
|
||||||
mib, err := sysctlmib(name, args...)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
n := uintptr(4)
|
|
||||||
buf := make([]byte, 4)
|
|
||||||
if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
if n != 4 {
|
|
||||||
return 0, EIO
|
|
||||||
}
|
|
||||||
return *(*uint32)(unsafe.Pointer(&buf[0])), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func SysctlUint64(name string, args ...int) (uint64, error) {
|
|
||||||
mib, err := sysctlmib(name, args...)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
n := uintptr(8)
|
|
||||||
buf := make([]byte, 8)
|
|
||||||
if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
if n != 8 {
|
|
||||||
return 0, EIO
|
|
||||||
}
|
|
||||||
return *(*uint64)(unsafe.Pointer(&buf[0])), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func SysctlRaw(name string, args ...int) ([]byte, error) {
|
|
||||||
mib, err := sysctlmib(name, args...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find size.
|
|
||||||
n := uintptr(0)
|
|
||||||
if err := sysctl(mib, nil, &n, nil, 0); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if n == 0 {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read into buffer of that size.
|
|
||||||
buf := make([]byte, n)
|
|
||||||
if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// The actual call may return less than the original reported required
|
|
||||||
// size so ensure we deal with that.
|
|
||||||
return buf[:n], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys utimes(path string, timeval *[2]Timeval) (err error)
|
|
||||||
|
|
||||||
func Utimes(path string, tv []Timeval) error {
|
|
||||||
if tv == nil {
|
|
||||||
return utimes(path, nil)
|
|
||||||
}
|
|
||||||
if len(tv) != 2 {
|
|
||||||
return EINVAL
|
|
||||||
}
|
|
||||||
return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
|
|
||||||
}
|
|
||||||
|
|
||||||
func UtimesNano(path string, ts []Timespec) error {
|
|
||||||
if ts == nil {
|
|
||||||
err := utimensat(AT_FDCWD, path, nil, 0)
|
|
||||||
if err != ENOSYS {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return utimes(path, nil)
|
|
||||||
}
|
|
||||||
if len(ts) != 2 {
|
|
||||||
return EINVAL
|
|
||||||
}
|
|
||||||
// Darwin setattrlist can set nanosecond timestamps
|
|
||||||
err := setattrlistTimes(path, ts, 0)
|
|
||||||
if err != ENOSYS {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
|
|
||||||
if err != ENOSYS {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// Not as efficient as it could be because Timespec and
|
|
||||||
// Timeval have different types in the different OSes
|
|
||||||
tv := [2]Timeval{
|
|
||||||
NsecToTimeval(TimespecToNsec(ts[0])),
|
|
||||||
NsecToTimeval(TimespecToNsec(ts[1])),
|
|
||||||
}
|
|
||||||
return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[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
|
|
||||||
}
|
|
||||||
err := setattrlistTimes(path, ts, flags)
|
|
||||||
if err != ENOSYS {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags)
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys futimes(fd int, timeval *[2]Timeval) (err error)
|
|
||||||
|
|
||||||
func Futimes(fd int, tv []Timeval) error {
|
|
||||||
if tv == nil {
|
|
||||||
return futimes(fd, nil)
|
|
||||||
}
|
|
||||||
if len(tv) != 2 {
|
|
||||||
return EINVAL
|
|
||||||
}
|
|
||||||
return futimes(fd, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys fcntl(fd int, cmd int, arg int) (val int, err error)
|
|
||||||
|
|
||||||
//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)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: wrap
|
|
||||||
// Acct(name nil-string) (err error)
|
|
||||||
// Gethostuuid(uuid *byte, timeout *Timespec) (err error)
|
|
||||||
// Ptrace(req int, pid int, addr uintptr, data int) (ret 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, behav int) (err error)
|
|
||||||
//sys Mlock(b []byte) (err error)
|
|
||||||
//sys Mlockall(flags int) (err error)
|
|
||||||
//sys Mprotect(b []byte, prot int) (err error)
|
|
||||||
//sys Msync(b []byte, flags int) (err error)
|
|
||||||
//sys Munlock(b []byte) (err error)
|
|
||||||
//sys Munlockall() (err error)
|
|
@ -1,602 +0,0 @@
|
|||||||
// Copyright 2009,2010 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Darwin 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, either here or in
|
|
||||||
// syscall_bsd.go or syscall_unix.go.
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
const ImplementsGetwd = true
|
|
||||||
|
|
||||||
func Getwd() (string, error) {
|
|
||||||
buf := make([]byte, 2048)
|
|
||||||
attrs, err := getAttrList(".", attrList{CommonAttr: attrCmnFullpath}, buf, 0)
|
|
||||||
if err == nil && len(attrs) == 1 && len(attrs[0]) >= 2 {
|
|
||||||
wd := string(attrs[0])
|
|
||||||
// Sanity check that it's an absolute path and ends
|
|
||||||
// in a null byte, which we then strip.
|
|
||||||
if wd[0] == '/' && wd[len(wd)-1] == 0 {
|
|
||||||
return wd[:len(wd)-1], nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// If pkg/os/getwd.go gets ENOTSUP, it will fall back to the
|
|
||||||
// slow algorithm.
|
|
||||||
return "", ENOTSUP
|
|
||||||
}
|
|
||||||
|
|
||||||
// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets.
|
|
||||||
type SockaddrDatalink struct {
|
|
||||||
Len uint8
|
|
||||||
Family uint8
|
|
||||||
Index uint16
|
|
||||||
Type uint8
|
|
||||||
Nlen uint8
|
|
||||||
Alen uint8
|
|
||||||
Slen uint8
|
|
||||||
Data [12]int8
|
|
||||||
raw RawSockaddrDatalink
|
|
||||||
}
|
|
||||||
|
|
||||||
// Translate "kern.hostname" to []_C_int{0,1,2,3}.
|
|
||||||
func nametomib(name string) (mib []_C_int, err error) {
|
|
||||||
const siz = unsafe.Sizeof(mib[0])
|
|
||||||
|
|
||||||
// NOTE(rsc): It seems strange to set the buffer to have
|
|
||||||
// size CTL_MAXNAME+2 but use only CTL_MAXNAME
|
|
||||||
// as the size. I don't know why the +2 is here, but the
|
|
||||||
// kernel uses +2 for its own implementation of this function.
|
|
||||||
// I am scared that if we don't include the +2 here, the kernel
|
|
||||||
// will silently write 2 words farther than we specify
|
|
||||||
// and we'll get memory corruption.
|
|
||||||
var buf [CTL_MAXNAME + 2]_C_int
|
|
||||||
n := uintptr(CTL_MAXNAME) * siz
|
|
||||||
|
|
||||||
p := (*byte)(unsafe.Pointer(&buf[0]))
|
|
||||||
bytes, err := ByteSliceFromString(name)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Magic sysctl: "setting" 0.3 to a string name
|
|
||||||
// lets you read back the array of integers form.
|
|
||||||
if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return buf[0 : n/siz], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error)
|
|
||||||
func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) }
|
|
||||||
func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) }
|
|
||||||
|
|
||||||
const (
|
|
||||||
attrBitMapCount = 5
|
|
||||||
attrCmnFullpath = 0x08000000
|
|
||||||
)
|
|
||||||
|
|
||||||
type attrList struct {
|
|
||||||
bitmapCount uint16
|
|
||||||
_ uint16
|
|
||||||
CommonAttr uint32
|
|
||||||
VolAttr uint32
|
|
||||||
DirAttr uint32
|
|
||||||
FileAttr uint32
|
|
||||||
Forkattr uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
func getAttrList(path string, attrList attrList, attrBuf []byte, options uint) (attrs [][]byte, err error) {
|
|
||||||
if len(attrBuf) < 4 {
|
|
||||||
return nil, errors.New("attrBuf too small")
|
|
||||||
}
|
|
||||||
attrList.bitmapCount = attrBitMapCount
|
|
||||||
|
|
||||||
var _p0 *byte
|
|
||||||
_p0, err = BytePtrFromString(path)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
_, _, e1 := Syscall6(
|
|
||||||
SYS_GETATTRLIST,
|
|
||||||
uintptr(unsafe.Pointer(_p0)),
|
|
||||||
uintptr(unsafe.Pointer(&attrList)),
|
|
||||||
uintptr(unsafe.Pointer(&attrBuf[0])),
|
|
||||||
uintptr(len(attrBuf)),
|
|
||||||
uintptr(options),
|
|
||||||
0,
|
|
||||||
)
|
|
||||||
if e1 != 0 {
|
|
||||||
return nil, e1
|
|
||||||
}
|
|
||||||
size := *(*uint32)(unsafe.Pointer(&attrBuf[0]))
|
|
||||||
|
|
||||||
// dat is the section of attrBuf that contains valid data,
|
|
||||||
// without the 4 byte length header. All attribute offsets
|
|
||||||
// are relative to dat.
|
|
||||||
dat := attrBuf
|
|
||||||
if int(size) < len(attrBuf) {
|
|
||||||
dat = dat[:size]
|
|
||||||
}
|
|
||||||
dat = dat[4:] // remove length prefix
|
|
||||||
|
|
||||||
for i := uint32(0); int(i) < len(dat); {
|
|
||||||
header := dat[i:]
|
|
||||||
if len(header) < 8 {
|
|
||||||
return attrs, errors.New("truncated attribute header")
|
|
||||||
}
|
|
||||||
datOff := *(*int32)(unsafe.Pointer(&header[0]))
|
|
||||||
attrLen := *(*uint32)(unsafe.Pointer(&header[4]))
|
|
||||||
if datOff < 0 || uint32(datOff)+attrLen > uint32(len(dat)) {
|
|
||||||
return attrs, errors.New("truncated results; attrBuf too small")
|
|
||||||
}
|
|
||||||
end := uint32(datOff) + attrLen
|
|
||||||
attrs = append(attrs, dat[datOff:end])
|
|
||||||
i = end
|
|
||||||
if r := i % 4; r != 0 {
|
|
||||||
i += (4 - r)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
//sysnb pipe() (r int, w int, err error)
|
|
||||||
|
|
||||||
func Pipe(p []int) (err error) {
|
|
||||||
if len(p) != 2 {
|
|
||||||
return EINVAL
|
|
||||||
}
|
|
||||||
p[0], p[1], err = pipe()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
|
|
||||||
var _p0 unsafe.Pointer
|
|
||||||
var bufsize uintptr
|
|
||||||
if len(buf) > 0 {
|
|
||||||
_p0 = unsafe.Pointer(&buf[0])
|
|
||||||
bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf))
|
|
||||||
}
|
|
||||||
r0, _, e1 := Syscall(SYS_GETFSSTAT64, uintptr(_p0), bufsize, uintptr(flags))
|
|
||||||
n = int(r0)
|
|
||||||
if e1 != 0 {
|
|
||||||
err = e1
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func setattrlistTimes(path string, times []Timespec, flags int) error {
|
|
||||||
_p0, err := BytePtrFromString(path)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
var attrList attrList
|
|
||||||
attrList.bitmapCount = ATTR_BIT_MAP_COUNT
|
|
||||||
attrList.CommonAttr = ATTR_CMN_MODTIME | ATTR_CMN_ACCTIME
|
|
||||||
|
|
||||||
// order is mtime, atime: the opposite of Chtimes
|
|
||||||
attributes := [2]Timespec{times[1], times[0]}
|
|
||||||
options := 0
|
|
||||||
if flags&AT_SYMLINK_NOFOLLOW != 0 {
|
|
||||||
options |= FSOPT_NOFOLLOW
|
|
||||||
}
|
|
||||||
_, _, e1 := Syscall6(
|
|
||||||
SYS_SETATTRLIST,
|
|
||||||
uintptr(unsafe.Pointer(_p0)),
|
|
||||||
uintptr(unsafe.Pointer(&attrList)),
|
|
||||||
uintptr(unsafe.Pointer(&attributes)),
|
|
||||||
uintptr(unsafe.Sizeof(attributes)),
|
|
||||||
uintptr(options),
|
|
||||||
0,
|
|
||||||
)
|
|
||||||
if e1 != 0 {
|
|
||||||
return e1
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func utimensat(dirfd int, path string, times *[2]Timespec, flags int) error {
|
|
||||||
// Darwin doesn't support SYS_UTIMENSAT
|
|
||||||
return ENOSYS
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Wrapped
|
|
||||||
*/
|
|
||||||
|
|
||||||
//sys kill(pid int, signum int, posix int) (err error)
|
|
||||||
|
|
||||||
func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(signum), 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
|
|
||||||
}
|
|
||||||
|
|
||||||
func Uname(uname *Utsname) error {
|
|
||||||
mib := []_C_int{CTL_KERN, KERN_OSTYPE}
|
|
||||||
n := unsafe.Sizeof(uname.Sysname)
|
|
||||||
if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
mib = []_C_int{CTL_KERN, KERN_HOSTNAME}
|
|
||||||
n = unsafe.Sizeof(uname.Nodename)
|
|
||||||
if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
mib = []_C_int{CTL_KERN, KERN_OSRELEASE}
|
|
||||||
n = unsafe.Sizeof(uname.Release)
|
|
||||||
if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
mib = []_C_int{CTL_KERN, KERN_VERSION}
|
|
||||||
n = unsafe.Sizeof(uname.Version)
|
|
||||||
if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// The version might have newlines or tabs in it, convert them to
|
|
||||||
// spaces.
|
|
||||||
for i, b := range uname.Version {
|
|
||||||
if b == '\n' || b == '\t' {
|
|
||||||
if i == len(uname.Version)-1 {
|
|
||||||
uname.Version[i] = 0
|
|
||||||
} else {
|
|
||||||
uname.Version[i] = ' '
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mib = []_C_int{CTL_HW, HW_MACHINE}
|
|
||||||
n = unsafe.Sizeof(uname.Machine)
|
|
||||||
if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Exposed directly
|
|
||||||
*/
|
|
||||||
//sys Access(path string, mode uint32) (err error)
|
|
||||||
//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error)
|
|
||||||
//sys Chdir(path string) (err error)
|
|
||||||
//sys Chflags(path string, flags int) (err error)
|
|
||||||
//sys Chmod(path string, mode uint32) (err error)
|
|
||||||
//sys Chown(path string, uid int, gid int) (err error)
|
|
||||||
//sys Chroot(path string) (err error)
|
|
||||||
//sys Close(fd int) (err error)
|
|
||||||
//sys Dup(fd int) (nfd int, err error)
|
|
||||||
//sys Dup2(from int, to int) (err error)
|
|
||||||
//sys Exchangedata(path1 string, path2 string, options 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 Fchflags(fd int, flags int) (err error)
|
|
||||||
//sys Fchmod(fd int, mode uint32) (err error)
|
|
||||||
//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
|
|
||||||
//sys Fchown(fd int, uid int, gid int) (err error)
|
|
||||||
//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error)
|
|
||||||
//sys Flock(fd int, how int) (err error)
|
|
||||||
//sys Fpathconf(fd int, name int) (val int, err error)
|
|
||||||
//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
|
|
||||||
//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64
|
|
||||||
//sys Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_FSTATFS64
|
|
||||||
//sys Fsync(fd int) (err error)
|
|
||||||
//sys Ftruncate(fd int, length int64) (err error)
|
|
||||||
//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS_GETDIRENTRIES64
|
|
||||||
//sys Getdtablesize() (size int)
|
|
||||||
//sysnb Getegid() (egid int)
|
|
||||||
//sysnb Geteuid() (uid int)
|
|
||||||
//sysnb Getgid() (gid int)
|
|
||||||
//sysnb Getpgid(pid int) (pgid int, err error)
|
|
||||||
//sysnb Getpgrp() (pgrp int)
|
|
||||||
//sysnb Getpid() (pid int)
|
|
||||||
//sysnb Getppid() (ppid int)
|
|
||||||
//sys Getpriority(which int, who int) (prio int, err error)
|
|
||||||
//sysnb Getrlimit(which int, lim *Rlimit) (err error)
|
|
||||||
//sysnb Getrusage(who int, rusage *Rusage) (err error)
|
|
||||||
//sysnb Getsid(pid int) (sid int, err error)
|
|
||||||
//sysnb Getuid() (uid int)
|
|
||||||
//sysnb Issetugid() (tainted bool)
|
|
||||||
//sys Kqueue() (fd int, err error)
|
|
||||||
//sys Lchown(path string, uid int, gid int) (err error)
|
|
||||||
//sys Link(path string, link string) (err error)
|
|
||||||
//sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error)
|
|
||||||
//sys Listen(s int, backlog int) (err error)
|
|
||||||
//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
|
|
||||||
//sys Mkdir(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 Open(path string, mode int, perm uint32) (fd int, err error)
|
|
||||||
//sys Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error)
|
|
||||||
//sys Pathconf(path string, name int) (val int, err error)
|
|
||||||
//sys Pread(fd int, p []byte, offset int64) (n int, err error)
|
|
||||||
//sys Pwrite(fd int, p []byte, offset int64) (n int, err error)
|
|
||||||
//sys read(fd int, p []byte) (n int, err error)
|
|
||||||
//sys Readlink(path string, buf []byte) (n int, err error)
|
|
||||||
//sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error)
|
|
||||||
//sys Rename(from string, to string) (err error)
|
|
||||||
//sys Renameat(fromfd int, from string, tofd int, to string) (err error)
|
|
||||||
//sys Revoke(path string) (err error)
|
|
||||||
//sys Rmdir(path string) (err error)
|
|
||||||
//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
|
|
||||||
//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
|
|
||||||
//sys Setegid(egid int) (err error)
|
|
||||||
//sysnb Seteuid(euid int) (err error)
|
|
||||||
//sysnb Setgid(gid int) (err error)
|
|
||||||
//sys Setlogin(name string) (err error)
|
|
||||||
//sysnb Setpgid(pid int, pgid int) (err error)
|
|
||||||
//sys Setpriority(which int, who int, prio int) (err error)
|
|
||||||
//sys Setprivexec(flag int) (err error)
|
|
||||||
//sysnb Setregid(rgid int, egid int) (err error)
|
|
||||||
//sysnb Setreuid(ruid int, euid int) (err error)
|
|
||||||
//sysnb Setrlimit(which int, lim *Rlimit) (err error)
|
|
||||||
//sysnb Setsid() (pid int, err error)
|
|
||||||
//sysnb Settimeofday(tp *Timeval) (err error)
|
|
||||||
//sysnb Setuid(uid int) (err error)
|
|
||||||
//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
|
|
||||||
//sys Statfs(path string, stat *Statfs_t) (err error) = SYS_STATFS64
|
|
||||||
//sys Symlink(path string, link string) (err error)
|
|
||||||
//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error)
|
|
||||||
//sys Sync() (err error)
|
|
||||||
//sys Truncate(path string, length int64) (err error)
|
|
||||||
//sys Umask(newmask int) (oldmask int)
|
|
||||||
//sys Undelete(path string) (err error)
|
|
||||||
//sys Unlink(path string) (err error)
|
|
||||||
//sys Unlinkat(dirfd int, path string, flags int) (err error)
|
|
||||||
//sys Unmount(path string, flags int) (err error)
|
|
||||||
//sys write(fd int, p []byte) (n int, err error)
|
|
||||||
//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)
|
|
||||||
//sys munmap(addr uintptr, length uintptr) (err error)
|
|
||||||
//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ
|
|
||||||
//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Unimplemented
|
|
||||||
*/
|
|
||||||
// Profil
|
|
||||||
// Sigaction
|
|
||||||
// Sigprocmask
|
|
||||||
// Getlogin
|
|
||||||
// Sigpending
|
|
||||||
// Sigaltstack
|
|
||||||
// Ioctl
|
|
||||||
// Reboot
|
|
||||||
// Execve
|
|
||||||
// Vfork
|
|
||||||
// Sbrk
|
|
||||||
// Sstk
|
|
||||||
// Ovadvise
|
|
||||||
// Mincore
|
|
||||||
// Setitimer
|
|
||||||
// Swapon
|
|
||||||
// Select
|
|
||||||
// Sigsuspend
|
|
||||||
// Readv
|
|
||||||
// Writev
|
|
||||||
// Nfssvc
|
|
||||||
// Getfh
|
|
||||||
// Quotactl
|
|
||||||
// Mount
|
|
||||||
// Csops
|
|
||||||
// Waitid
|
|
||||||
// Add_profil
|
|
||||||
// Kdebug_trace
|
|
||||||
// Sigreturn
|
|
||||||
// Atsocket
|
|
||||||
// Kqueue_from_portset_np
|
|
||||||
// Kqueue_portset
|
|
||||||
// Getattrlist
|
|
||||||
// Setattrlist
|
|
||||||
// Getdirentriesattr
|
|
||||||
// Searchfs
|
|
||||||
// Delete
|
|
||||||
// Copyfile
|
|
||||||
// Watchevent
|
|
||||||
// Waitevent
|
|
||||||
// Modwatch
|
|
||||||
// Getxattr
|
|
||||||
// Fgetxattr
|
|
||||||
// Setxattr
|
|
||||||
// Fsetxattr
|
|
||||||
// Removexattr
|
|
||||||
// Fremovexattr
|
|
||||||
// Listxattr
|
|
||||||
// Flistxattr
|
|
||||||
// Fsctl
|
|
||||||
// Initgroups
|
|
||||||
// Posix_spawn
|
|
||||||
// Nfsclnt
|
|
||||||
// Fhopen
|
|
||||||
// Minherit
|
|
||||||
// Semsys
|
|
||||||
// Msgsys
|
|
||||||
// Shmsys
|
|
||||||
// Semctl
|
|
||||||
// Semget
|
|
||||||
// Semop
|
|
||||||
// Msgctl
|
|
||||||
// Msgget
|
|
||||||
// Msgsnd
|
|
||||||
// Msgrcv
|
|
||||||
// Shmat
|
|
||||||
// Shmctl
|
|
||||||
// Shmdt
|
|
||||||
// Shmget
|
|
||||||
// Shm_open
|
|
||||||
// Shm_unlink
|
|
||||||
// Sem_open
|
|
||||||
// Sem_close
|
|
||||||
// Sem_unlink
|
|
||||||
// Sem_wait
|
|
||||||
// Sem_trywait
|
|
||||||
// Sem_post
|
|
||||||
// Sem_getvalue
|
|
||||||
// Sem_init
|
|
||||||
// Sem_destroy
|
|
||||||
// Open_extended
|
|
||||||
// Umask_extended
|
|
||||||
// Stat_extended
|
|
||||||
// Lstat_extended
|
|
||||||
// Fstat_extended
|
|
||||||
// Chmod_extended
|
|
||||||
// Fchmod_extended
|
|
||||||
// Access_extended
|
|
||||||
// Settid
|
|
||||||
// Gettid
|
|
||||||
// Setsgroups
|
|
||||||
// Getsgroups
|
|
||||||
// Setwgroups
|
|
||||||
// Getwgroups
|
|
||||||
// Mkfifo_extended
|
|
||||||
// Mkdir_extended
|
|
||||||
// Identitysvc
|
|
||||||
// Shared_region_check_np
|
|
||||||
// Shared_region_map_np
|
|
||||||
// __pthread_mutex_destroy
|
|
||||||
// __pthread_mutex_init
|
|
||||||
// __pthread_mutex_lock
|
|
||||||
// __pthread_mutex_trylock
|
|
||||||
// __pthread_mutex_unlock
|
|
||||||
// __pthread_cond_init
|
|
||||||
// __pthread_cond_destroy
|
|
||||||
// __pthread_cond_broadcast
|
|
||||||
// __pthread_cond_signal
|
|
||||||
// Setsid_with_pid
|
|
||||||
// __pthread_cond_timedwait
|
|
||||||
// Aio_fsync
|
|
||||||
// Aio_return
|
|
||||||
// Aio_suspend
|
|
||||||
// Aio_cancel
|
|
||||||
// Aio_error
|
|
||||||
// Aio_read
|
|
||||||
// Aio_write
|
|
||||||
// Lio_listio
|
|
||||||
// __pthread_cond_wait
|
|
||||||
// Iopolicysys
|
|
||||||
// __pthread_kill
|
|
||||||
// __pthread_sigmask
|
|
||||||
// __sigwait
|
|
||||||
// __disable_threadsignal
|
|
||||||
// __pthread_markcancel
|
|
||||||
// __pthread_canceled
|
|
||||||
// __semwait_signal
|
|
||||||
// Proc_info
|
|
||||||
// sendfile
|
|
||||||
// Stat64_extended
|
|
||||||
// Lstat64_extended
|
|
||||||
// Fstat64_extended
|
|
||||||
// __pthread_chdir
|
|
||||||
// __pthread_fchdir
|
|
||||||
// Audit
|
|
||||||
// Auditon
|
|
||||||
// Getauid
|
|
||||||
// Setauid
|
|
||||||
// Getaudit
|
|
||||||
// Setaudit
|
|
||||||
// Getaudit_addr
|
|
||||||
// Setaudit_addr
|
|
||||||
// Auditctl
|
|
||||||
// Bsdthread_create
|
|
||||||
// Bsdthread_terminate
|
|
||||||
// Stack_snapshot
|
|
||||||
// Bsdthread_register
|
|
||||||
// Workq_open
|
|
||||||
// Workq_ops
|
|
||||||
// __mac_execve
|
|
||||||
// __mac_syscall
|
|
||||||
// __mac_get_file
|
|
||||||
// __mac_set_file
|
|
||||||
// __mac_get_link
|
|
||||||
// __mac_set_link
|
|
||||||
// __mac_get_proc
|
|
||||||
// __mac_set_proc
|
|
||||||
// __mac_get_fd
|
|
||||||
// __mac_set_fd
|
|
||||||
// __mac_get_pid
|
|
||||||
// __mac_get_lcid
|
|
||||||
// __mac_get_lctx
|
|
||||||
// __mac_set_lctx
|
|
||||||
// Setlcid
|
|
||||||
// Read_nocancel
|
|
||||||
// Write_nocancel
|
|
||||||
// Open_nocancel
|
|
||||||
// Close_nocancel
|
|
||||||
// Wait4_nocancel
|
|
||||||
// Recvmsg_nocancel
|
|
||||||
// Sendmsg_nocancel
|
|
||||||
// Recvfrom_nocancel
|
|
||||||
// Accept_nocancel
|
|
||||||
// Fcntl_nocancel
|
|
||||||
// Select_nocancel
|
|
||||||
// Fsync_nocancel
|
|
||||||
// Connect_nocancel
|
|
||||||
// Sigsuspend_nocancel
|
|
||||||
// Readv_nocancel
|
|
||||||
// Writev_nocancel
|
|
||||||
// Sendto_nocancel
|
|
||||||
// Pread_nocancel
|
|
||||||
// Pwrite_nocancel
|
|
||||||
// Waitid_nocancel
|
|
||||||
// Poll_nocancel
|
|
||||||
// Msgsnd_nocancel
|
|
||||||
// Msgrcv_nocancel
|
|
||||||
// Sem_wait_nocancel
|
|
||||||
// Aio_suspend_nocancel
|
|
||||||
// __sigwait_nocancel
|
|
||||||
// __semwait_signal_nocancel
|
|
||||||
// __mac_mount
|
|
||||||
// __mac_get_mount
|
|
||||||
// __mac_getfsstat
|
|
@ -1,68 +0,0 @@
|
|||||||
// 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 386,darwin
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
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 gettimeofday(tp *Timeval) (sec int32, usec int32, err error)
|
|
||||||
func Gettimeofday(tv *Timeval) (err error) {
|
|
||||||
// The tv passed to gettimeofday must be non-nil
|
|
||||||
// but is otherwise unused. The answers come back
|
|
||||||
// in the two registers.
|
|
||||||
sec, usec, err := gettimeofday(tv)
|
|
||||||
tv.Sec = int32(sec)
|
|
||||||
tv.Usec = int32(usec)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
|
|
||||||
var length = uint64(count)
|
|
||||||
|
|
||||||
_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(*offset>>32), uintptr(unsafe.Pointer(&length)), 0, 0, 0, 0)
|
|
||||||
|
|
||||||
written = int(length)
|
|
||||||
|
|
||||||
if e1 != 0 {
|
|
||||||
err = e1
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
|
||||||
|
|
||||||
// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
|
|
||||||
// of darwin/386 the syscall is called sysctl instead of __sysctl.
|
|
||||||
const SYS___SYSCTL = SYS_SYSCTL
|
|
@ -1,68 +0,0 @@
|
|||||||
// 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 amd64,darwin
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
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)}
|
|
||||||
}
|
|
||||||
|
|
||||||
//sysnb gettimeofday(tp *Timeval) (sec int64, usec int32, err error)
|
|
||||||
func Gettimeofday(tv *Timeval) (err error) {
|
|
||||||
// The tv passed to gettimeofday must be non-nil
|
|
||||||
// but is otherwise unused. The answers come back
|
|
||||||
// in the two registers.
|
|
||||||
sec, usec, err := gettimeofday(tv)
|
|
||||||
tv.Sec = sec
|
|
||||||
tv.Usec = usec
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func SetKevent(k *Kevent_t, fd, mode, flags int) {
|
|
||||||
k.Ident = uint64(fd)
|
|
||||||
k.Filter = int16(mode)
|
|
||||||
k.Flags = uint16(flags)
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
|
|
||||||
var length = uint64(count)
|
|
||||||
|
|
||||||
_, _, e1 := Syscall6(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(unsafe.Pointer(&length)), 0, 0)
|
|
||||||
|
|
||||||
written = int(length)
|
|
||||||
|
|
||||||
if e1 != 0 {
|
|
||||||
err = e1
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
|
||||||
|
|
||||||
// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
|
|
||||||
// of darwin/amd64 the syscall is called sysctl instead of __sysctl.
|
|
||||||
const SYS___SYSCTL = SYS_SYSCTL
|
|
@ -1,66 +0,0 @@
|
|||||||
// Copyright 2015 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
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
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 gettimeofday(tp *Timeval) (sec int32, usec int32, err error)
|
|
||||||
func Gettimeofday(tv *Timeval) (err error) {
|
|
||||||
// The tv passed to gettimeofday must be non-nil
|
|
||||||
// but is otherwise unused. The answers come back
|
|
||||||
// in the two registers.
|
|
||||||
sec, usec, err := gettimeofday(tv)
|
|
||||||
tv.Sec = int32(sec)
|
|
||||||
tv.Usec = int32(usec)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
|
|
||||||
var length = uint64(count)
|
|
||||||
|
|
||||||
_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(*offset>>32), uintptr(unsafe.Pointer(&length)), 0, 0, 0, 0)
|
|
||||||
|
|
||||||
written = int(length)
|
|
||||||
|
|
||||||
if e1 != 0 {
|
|
||||||
err = e1
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic
|
|
||||||
|
|
||||||
// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
|
|
||||||
// of darwin/arm the syscall is called sysctl instead of __sysctl.
|
|
||||||
const SYS___SYSCTL = SYS_SYSCTL
|
|
@ -1,68 +0,0 @@
|
|||||||
// Copyright 2015 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 arm64,darwin
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
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)}
|
|
||||||
}
|
|
||||||
|
|
||||||
//sysnb gettimeofday(tp *Timeval) (sec int64, usec int32, err error)
|
|
||||||
func Gettimeofday(tv *Timeval) (err error) {
|
|
||||||
// The tv passed to gettimeofday must be non-nil
|
|
||||||
// but is otherwise unused. The answers come back
|
|
||||||
// in the two registers.
|
|
||||||
sec, usec, err := gettimeofday(tv)
|
|
||||||
tv.Sec = sec
|
|
||||||
tv.Usec = usec
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func SetKevent(k *Kevent_t, fd, mode, flags int) {
|
|
||||||
k.Ident = uint64(fd)
|
|
||||||
k.Filter = int16(mode)
|
|
||||||
k.Flags = uint16(flags)
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
|
|
||||||
var length = uint64(count)
|
|
||||||
|
|
||||||
_, _, e1 := Syscall6(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(unsafe.Pointer(&length)), 0, 0)
|
|
||||||
|
|
||||||
written = int(length)
|
|
||||||
|
|
||||||
if e1 != 0 {
|
|
||||||
err = e1
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic
|
|
||||||
|
|
||||||
// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
|
|
||||||
// of darwin/arm64 the syscall is called sysctl instead of __sysctl.
|
|
||||||
const SYS___SYSCTL = SYS_SYSCTL
|
|
@ -1,523 +0,0 @@
|
|||||||
// 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.
|
|
||||||
|
|
||||||
// DragonFly BSD 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, either here or in
|
|
||||||
// syscall_bsd.go or syscall_unix.go.
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import "unsafe"
|
|
||||||
|
|
||||||
// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets.
|
|
||||||
type SockaddrDatalink struct {
|
|
||||||
Len uint8
|
|
||||||
Family uint8
|
|
||||||
Index uint16
|
|
||||||
Type uint8
|
|
||||||
Nlen uint8
|
|
||||||
Alen uint8
|
|
||||||
Slen uint8
|
|
||||||
Data [12]int8
|
|
||||||
Rcf uint16
|
|
||||||
Route [16]uint16
|
|
||||||
raw RawSockaddrDatalink
|
|
||||||
}
|
|
||||||
|
|
||||||
// Translate "kern.hostname" to []_C_int{0,1,2,3}.
|
|
||||||
func nametomib(name string) (mib []_C_int, err error) {
|
|
||||||
const siz = unsafe.Sizeof(mib[0])
|
|
||||||
|
|
||||||
// NOTE(rsc): It seems strange to set the buffer to have
|
|
||||||
// size CTL_MAXNAME+2 but use only CTL_MAXNAME
|
|
||||||
// as the size. I don't know why the +2 is here, but the
|
|
||||||
// kernel uses +2 for its own implementation of this function.
|
|
||||||
// I am scared that if we don't include the +2 here, the kernel
|
|
||||||
// will silently write 2 words farther than we specify
|
|
||||||
// and we'll get memory corruption.
|
|
||||||
var buf [CTL_MAXNAME + 2]_C_int
|
|
||||||
n := uintptr(CTL_MAXNAME) * siz
|
|
||||||
|
|
||||||
p := (*byte)(unsafe.Pointer(&buf[0]))
|
|
||||||
bytes, err := ByteSliceFromString(name)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Magic sysctl: "setting" 0.3 to a string name
|
|
||||||
// lets you read back the array of integers form.
|
|
||||||
if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return buf[0 : n/siz], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
//sysnb pipe() (r int, w int, err error)
|
|
||||||
|
|
||||||
func Pipe(p []int) (err error) {
|
|
||||||
if len(p) != 2 {
|
|
||||||
return EINVAL
|
|
||||||
}
|
|
||||||
p[0], p[1], err = pipe()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys extpread(fd int, p []byte, flags int, offset int64) (n int, err error)
|
|
||||||
func Pread(fd int, p []byte, offset int64) (n int, err error) {
|
|
||||||
return extpread(fd, p, 0, offset)
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error)
|
|
||||||
func Pwrite(fd int, p []byte, offset int64) (n int, err error) {
|
|
||||||
return extpwrite(fd, p, 0, offset)
|
|
||||||
}
|
|
||||||
|
|
||||||
func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) {
|
|
||||||
var rsa RawSockaddrAny
|
|
||||||
var len _Socklen = SizeofSockaddrAny
|
|
||||||
nfd, err = accept4(fd, &rsa, &len, flags)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if len > SizeofSockaddrAny {
|
|
||||||
panic("RawSockaddrAny too small")
|
|
||||||
}
|
|
||||||
sa, err = anyToSockaddr(&rsa)
|
|
||||||
if err != nil {
|
|
||||||
Close(nfd)
|
|
||||||
nfd = 0
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const ImplementsGetwd = true
|
|
||||||
|
|
||||||
//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD
|
|
||||||
|
|
||||||
func Getwd() (string, error) {
|
|
||||||
var buf [PathMax]byte
|
|
||||||
_, err := Getcwd(buf[0:])
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
n := clen(buf[:])
|
|
||||||
if n < 1 {
|
|
||||||
return "", EINVAL
|
|
||||||
}
|
|
||||||
return string(buf[:n]), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
|
|
||||||
var _p0 unsafe.Pointer
|
|
||||||
var bufsize uintptr
|
|
||||||
if len(buf) > 0 {
|
|
||||||
_p0 = unsafe.Pointer(&buf[0])
|
|
||||||
bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf))
|
|
||||||
}
|
|
||||||
r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags))
|
|
||||||
n = int(r0)
|
|
||||||
if e1 != 0 {
|
|
||||||
err = e1
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func setattrlistTimes(path string, times []Timespec, flags int) error {
|
|
||||||
// used on Darwin for UtimesNano
|
|
||||||
return ENOSYS
|
|
||||||
}
|
|
||||||
|
|
||||||
//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
|
|
||||||
}
|
|
||||||
|
|
||||||
func sysctlUname(mib []_C_int, old *byte, oldlen *uintptr) error {
|
|
||||||
err := sysctl(mib, old, oldlen, nil, 0)
|
|
||||||
if err != nil {
|
|
||||||
// Utsname members on Dragonfly are only 32 bytes and
|
|
||||||
// the syscall returns ENOMEM in case the actual value
|
|
||||||
// is longer.
|
|
||||||
if err == ENOMEM {
|
|
||||||
err = nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func Uname(uname *Utsname) error {
|
|
||||||
mib := []_C_int{CTL_KERN, KERN_OSTYPE}
|
|
||||||
n := unsafe.Sizeof(uname.Sysname)
|
|
||||||
if err := sysctlUname(mib, &uname.Sysname[0], &n); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
uname.Sysname[unsafe.Sizeof(uname.Sysname)-1] = 0
|
|
||||||
|
|
||||||
mib = []_C_int{CTL_KERN, KERN_HOSTNAME}
|
|
||||||
n = unsafe.Sizeof(uname.Nodename)
|
|
||||||
if err := sysctlUname(mib, &uname.Nodename[0], &n); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
uname.Nodename[unsafe.Sizeof(uname.Nodename)-1] = 0
|
|
||||||
|
|
||||||
mib = []_C_int{CTL_KERN, KERN_OSRELEASE}
|
|
||||||
n = unsafe.Sizeof(uname.Release)
|
|
||||||
if err := sysctlUname(mib, &uname.Release[0], &n); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
uname.Release[unsafe.Sizeof(uname.Release)-1] = 0
|
|
||||||
|
|
||||||
mib = []_C_int{CTL_KERN, KERN_VERSION}
|
|
||||||
n = unsafe.Sizeof(uname.Version)
|
|
||||||
if err := sysctlUname(mib, &uname.Version[0], &n); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// The version might have newlines or tabs in it, convert them to
|
|
||||||
// spaces.
|
|
||||||
for i, b := range uname.Version {
|
|
||||||
if b == '\n' || b == '\t' {
|
|
||||||
if i == len(uname.Version)-1 {
|
|
||||||
uname.Version[i] = 0
|
|
||||||
} else {
|
|
||||||
uname.Version[i] = ' '
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mib = []_C_int{CTL_HW, HW_MACHINE}
|
|
||||||
n = unsafe.Sizeof(uname.Machine)
|
|
||||||
if err := sysctlUname(mib, &uname.Machine[0], &n); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
uname.Machine[unsafe.Sizeof(uname.Machine)-1] = 0
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Exposed directly
|
|
||||||
*/
|
|
||||||
//sys Access(path string, mode uint32) (err error)
|
|
||||||
//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error)
|
|
||||||
//sys Chdir(path string) (err error)
|
|
||||||
//sys Chflags(path string, flags int) (err error)
|
|
||||||
//sys Chmod(path string, mode uint32) (err error)
|
|
||||||
//sys Chown(path string, uid int, gid int) (err error)
|
|
||||||
//sys Chroot(path string) (err error)
|
|
||||||
//sys Close(fd int) (err error)
|
|
||||||
//sys Dup(fd int) (nfd int, err error)
|
|
||||||
//sys Dup2(from int, to int) (err error)
|
|
||||||
//sys Exit(code int)
|
|
||||||
//sys Fchdir(fd int) (err error)
|
|
||||||
//sys Fchflags(fd int, flags int) (err error)
|
|
||||||
//sys Fchmod(fd int, mode uint32) (err error)
|
|
||||||
//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
|
|
||||||
//sys Fchown(fd int, uid int, gid int) (err error)
|
|
||||||
//sys Flock(fd int, how int) (err error)
|
|
||||||
//sys Fpathconf(fd int, name int) (val 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, stat *Statfs_t) (err error)
|
|
||||||
//sys Fsync(fd int) (err error)
|
|
||||||
//sys Ftruncate(fd int, length int64) (err error)
|
|
||||||
//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error)
|
|
||||||
//sys Getdtablesize() (size int)
|
|
||||||
//sysnb Getegid() (egid int)
|
|
||||||
//sysnb Geteuid() (uid int)
|
|
||||||
//sysnb Getgid() (gid int)
|
|
||||||
//sysnb Getpgid(pid int) (pgid int, err error)
|
|
||||||
//sysnb Getpgrp() (pgrp int)
|
|
||||||
//sysnb Getpid() (pid int)
|
|
||||||
//sysnb Getppid() (ppid int)
|
|
||||||
//sys Getpriority(which int, who int) (prio int, err error)
|
|
||||||
//sysnb Getrlimit(which int, lim *Rlimit) (err error)
|
|
||||||
//sysnb Getrusage(who int, rusage *Rusage) (err error)
|
|
||||||
//sysnb Getsid(pid int) (sid int, err error)
|
|
||||||
//sysnb Gettimeofday(tv *Timeval) (err error)
|
|
||||||
//sysnb Getuid() (uid int)
|
|
||||||
//sys Issetugid() (tainted bool)
|
|
||||||
//sys Kill(pid int, signum syscall.Signal) (err error)
|
|
||||||
//sys Kqueue() (fd int, err error)
|
|
||||||
//sys Lchown(path string, uid int, gid int) (err error)
|
|
||||||
//sys Link(path string, link string) (err error)
|
|
||||||
//sys Listen(s int, backlog int) (err error)
|
|
||||||
//sys Lstat(path string, stat *Stat_t) (err error)
|
|
||||||
//sys Mkdir(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 Nanosleep(time *Timespec, leftover *Timespec) (err error)
|
|
||||||
//sys Open(path string, mode int, perm uint32) (fd int, err error)
|
|
||||||
//sys Pathconf(path string, name int) (val int, err error)
|
|
||||||
//sys read(fd int, p []byte) (n int, err error)
|
|
||||||
//sys Readlink(path string, buf []byte) (n int, err error)
|
|
||||||
//sys Rename(from string, to string) (err error)
|
|
||||||
//sys Revoke(path string) (err error)
|
|
||||||
//sys Rmdir(path string) (err error)
|
|
||||||
//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
|
|
||||||
//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
|
|
||||||
//sysnb Setegid(egid int) (err error)
|
|
||||||
//sysnb Seteuid(euid int) (err error)
|
|
||||||
//sysnb Setgid(gid int) (err error)
|
|
||||||
//sys Setlogin(name string) (err error)
|
|
||||||
//sysnb Setpgid(pid int, pgid int) (err error)
|
|
||||||
//sys Setpriority(which int, who int, prio int) (err error)
|
|
||||||
//sysnb Setregid(rgid int, egid int) (err error)
|
|
||||||
//sysnb Setreuid(ruid int, euid 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(which int, lim *Rlimit) (err error)
|
|
||||||
//sysnb Setsid() (pid int, err error)
|
|
||||||
//sysnb Settimeofday(tp *Timeval) (err error)
|
|
||||||
//sysnb Setuid(uid int) (err error)
|
|
||||||
//sys Stat(path string, stat *Stat_t) (err error)
|
|
||||||
//sys Statfs(path string, stat *Statfs_t) (err error)
|
|
||||||
//sys Symlink(path string, link string) (err error)
|
|
||||||
//sys Sync() (err error)
|
|
||||||
//sys Truncate(path string, length int64) (err error)
|
|
||||||
//sys Umask(newmask int) (oldmask int)
|
|
||||||
//sys Undelete(path string) (err error)
|
|
||||||
//sys Unlink(path string) (err error)
|
|
||||||
//sys Unmount(path string, flags int) (err error)
|
|
||||||
//sys write(fd int, p []byte) (n int, err error)
|
|
||||||
//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)
|
|
||||||
//sys munmap(addr uintptr, length uintptr) (err error)
|
|
||||||
//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ
|
|
||||||
//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE
|
|
||||||
//sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error)
|
|
||||||
//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Unimplemented
|
|
||||||
* TODO(jsing): Update this list for DragonFly.
|
|
||||||
*/
|
|
||||||
// Profil
|
|
||||||
// Sigaction
|
|
||||||
// Sigprocmask
|
|
||||||
// Getlogin
|
|
||||||
// Sigpending
|
|
||||||
// Sigaltstack
|
|
||||||
// Reboot
|
|
||||||
// Execve
|
|
||||||
// Vfork
|
|
||||||
// Sbrk
|
|
||||||
// Sstk
|
|
||||||
// Ovadvise
|
|
||||||
// Mincore
|
|
||||||
// Setitimer
|
|
||||||
// Swapon
|
|
||||||
// Select
|
|
||||||
// Sigsuspend
|
|
||||||
// Readv
|
|
||||||
// Writev
|
|
||||||
// Nfssvc
|
|
||||||
// Getfh
|
|
||||||
// Quotactl
|
|
||||||
// Mount
|
|
||||||
// Csops
|
|
||||||
// Waitid
|
|
||||||
// Add_profil
|
|
||||||
// Kdebug_trace
|
|
||||||
// Sigreturn
|
|
||||||
// Atsocket
|
|
||||||
// Kqueue_from_portset_np
|
|
||||||
// Kqueue_portset
|
|
||||||
// Getattrlist
|
|
||||||
// Setattrlist
|
|
||||||
// Getdirentriesattr
|
|
||||||
// Searchfs
|
|
||||||
// Delete
|
|
||||||
// Copyfile
|
|
||||||
// Watchevent
|
|
||||||
// Waitevent
|
|
||||||
// Modwatch
|
|
||||||
// Getxattr
|
|
||||||
// Fgetxattr
|
|
||||||
// Setxattr
|
|
||||||
// Fsetxattr
|
|
||||||
// Removexattr
|
|
||||||
// Fremovexattr
|
|
||||||
// Listxattr
|
|
||||||
// Flistxattr
|
|
||||||
// Fsctl
|
|
||||||
// Initgroups
|
|
||||||
// Posix_spawn
|
|
||||||
// Nfsclnt
|
|
||||||
// Fhopen
|
|
||||||
// Minherit
|
|
||||||
// Semsys
|
|
||||||
// Msgsys
|
|
||||||
// Shmsys
|
|
||||||
// Semctl
|
|
||||||
// Semget
|
|
||||||
// Semop
|
|
||||||
// Msgctl
|
|
||||||
// Msgget
|
|
||||||
// Msgsnd
|
|
||||||
// Msgrcv
|
|
||||||
// Shmat
|
|
||||||
// Shmctl
|
|
||||||
// Shmdt
|
|
||||||
// Shmget
|
|
||||||
// Shm_open
|
|
||||||
// Shm_unlink
|
|
||||||
// Sem_open
|
|
||||||
// Sem_close
|
|
||||||
// Sem_unlink
|
|
||||||
// Sem_wait
|
|
||||||
// Sem_trywait
|
|
||||||
// Sem_post
|
|
||||||
// Sem_getvalue
|
|
||||||
// Sem_init
|
|
||||||
// Sem_destroy
|
|
||||||
// Open_extended
|
|
||||||
// Umask_extended
|
|
||||||
// Stat_extended
|
|
||||||
// Lstat_extended
|
|
||||||
// Fstat_extended
|
|
||||||
// Chmod_extended
|
|
||||||
// Fchmod_extended
|
|
||||||
// Access_extended
|
|
||||||
// Settid
|
|
||||||
// Gettid
|
|
||||||
// Setsgroups
|
|
||||||
// Getsgroups
|
|
||||||
// Setwgroups
|
|
||||||
// Getwgroups
|
|
||||||
// Mkfifo_extended
|
|
||||||
// Mkdir_extended
|
|
||||||
// Identitysvc
|
|
||||||
// Shared_region_check_np
|
|
||||||
// Shared_region_map_np
|
|
||||||
// __pthread_mutex_destroy
|
|
||||||
// __pthread_mutex_init
|
|
||||||
// __pthread_mutex_lock
|
|
||||||
// __pthread_mutex_trylock
|
|
||||||
// __pthread_mutex_unlock
|
|
||||||
// __pthread_cond_init
|
|
||||||
// __pthread_cond_destroy
|
|
||||||
// __pthread_cond_broadcast
|
|
||||||
// __pthread_cond_signal
|
|
||||||
// Setsid_with_pid
|
|
||||||
// __pthread_cond_timedwait
|
|
||||||
// Aio_fsync
|
|
||||||
// Aio_return
|
|
||||||
// Aio_suspend
|
|
||||||
// Aio_cancel
|
|
||||||
// Aio_error
|
|
||||||
// Aio_read
|
|
||||||
// Aio_write
|
|
||||||
// Lio_listio
|
|
||||||
// __pthread_cond_wait
|
|
||||||
// Iopolicysys
|
|
||||||
// __pthread_kill
|
|
||||||
// __pthread_sigmask
|
|
||||||
// __sigwait
|
|
||||||
// __disable_threadsignal
|
|
||||||
// __pthread_markcancel
|
|
||||||
// __pthread_canceled
|
|
||||||
// __semwait_signal
|
|
||||||
// Proc_info
|
|
||||||
// Stat64_extended
|
|
||||||
// Lstat64_extended
|
|
||||||
// Fstat64_extended
|
|
||||||
// __pthread_chdir
|
|
||||||
// __pthread_fchdir
|
|
||||||
// Audit
|
|
||||||
// Auditon
|
|
||||||
// Getauid
|
|
||||||
// Setauid
|
|
||||||
// Getaudit
|
|
||||||
// Setaudit
|
|
||||||
// Getaudit_addr
|
|
||||||
// Setaudit_addr
|
|
||||||
// Auditctl
|
|
||||||
// Bsdthread_create
|
|
||||||
// Bsdthread_terminate
|
|
||||||
// Stack_snapshot
|
|
||||||
// Bsdthread_register
|
|
||||||
// Workq_open
|
|
||||||
// Workq_ops
|
|
||||||
// __mac_execve
|
|
||||||
// __mac_syscall
|
|
||||||
// __mac_get_file
|
|
||||||
// __mac_set_file
|
|
||||||
// __mac_get_link
|
|
||||||
// __mac_set_link
|
|
||||||
// __mac_get_proc
|
|
||||||
// __mac_set_proc
|
|
||||||
// __mac_get_fd
|
|
||||||
// __mac_set_fd
|
|
||||||
// __mac_get_pid
|
|
||||||
// __mac_get_lcid
|
|
||||||
// __mac_get_lctx
|
|
||||||
// __mac_set_lctx
|
|
||||||
// Setlcid
|
|
||||||
// Read_nocancel
|
|
||||||
// Write_nocancel
|
|
||||||
// Open_nocancel
|
|
||||||
// Close_nocancel
|
|
||||||
// Wait4_nocancel
|
|
||||||
// Recvmsg_nocancel
|
|
||||||
// Sendmsg_nocancel
|
|
||||||
// Recvfrom_nocancel
|
|
||||||
// Accept_nocancel
|
|
||||||
// Fcntl_nocancel
|
|
||||||
// Select_nocancel
|
|
||||||
// Fsync_nocancel
|
|
||||||
// Connect_nocancel
|
|
||||||
// Sigsuspend_nocancel
|
|
||||||
// Readv_nocancel
|
|
||||||
// Writev_nocancel
|
|
||||||
// Sendto_nocancel
|
|
||||||
// Pread_nocancel
|
|
||||||
// Pwrite_nocancel
|
|
||||||
// Waitid_nocancel
|
|
||||||
// Msgsnd_nocancel
|
|
||||||
// Msgrcv_nocancel
|
|
||||||
// Sem_wait_nocancel
|
|
||||||
// Aio_suspend_nocancel
|
|
||||||
// __sigwait_nocancel
|
|
||||||
// __semwait_signal_nocancel
|
|
||||||
// __mac_mount
|
|
||||||
// __mac_get_mount
|
|
||||||
// __mac_getfsstat
|
|
@ -1,52 +0,0 @@
|
|||||||
// 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 amd64,dragonfly
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
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 SetKevent(k *Kevent_t, fd, mode, flags int) {
|
|
||||||
k.Ident = uint64(fd)
|
|
||||||
k.Filter = int16(mode)
|
|
||||||
k.Flags = uint16(flags)
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
|
|
||||||
var writtenOut uint64 = 0
|
|
||||||
_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0)
|
|
||||||
|
|
||||||
written = int(writtenOut)
|
|
||||||
|
|
||||||
if e1 != 0 {
|
|
||||||
err = e1
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
|
@ -1,756 +0,0 @@
|
|||||||
// Copyright 2009,2010 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// FreeBSD 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, either here or in
|
|
||||||
// syscall_bsd.go or syscall_unix.go.
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets.
|
|
||||||
type SockaddrDatalink struct {
|
|
||||||
Len uint8
|
|
||||||
Family uint8
|
|
||||||
Index uint16
|
|
||||||
Type uint8
|
|
||||||
Nlen uint8
|
|
||||||
Alen uint8
|
|
||||||
Slen uint8
|
|
||||||
Data [46]int8
|
|
||||||
raw RawSockaddrDatalink
|
|
||||||
}
|
|
||||||
|
|
||||||
// Translate "kern.hostname" to []_C_int{0,1,2,3}.
|
|
||||||
func nametomib(name string) (mib []_C_int, err error) {
|
|
||||||
const siz = unsafe.Sizeof(mib[0])
|
|
||||||
|
|
||||||
// NOTE(rsc): It seems strange to set the buffer to have
|
|
||||||
// size CTL_MAXNAME+2 but use only CTL_MAXNAME
|
|
||||||
// as the size. I don't know why the +2 is here, but the
|
|
||||||
// kernel uses +2 for its own implementation of this function.
|
|
||||||
// I am scared that if we don't include the +2 here, the kernel
|
|
||||||
// will silently write 2 words farther than we specify
|
|
||||||
// and we'll get memory corruption.
|
|
||||||
var buf [CTL_MAXNAME + 2]_C_int
|
|
||||||
n := uintptr(CTL_MAXNAME) * siz
|
|
||||||
|
|
||||||
p := (*byte)(unsafe.Pointer(&buf[0]))
|
|
||||||
bytes, err := ByteSliceFromString(name)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Magic sysctl: "setting" 0.3 to a string name
|
|
||||||
// lets you read back the array of integers form.
|
|
||||||
if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return buf[0 : n/siz], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
//sysnb pipe() (r int, w int, err error)
|
|
||||||
|
|
||||||
func Pipe(p []int) (err error) {
|
|
||||||
if len(p) != 2 {
|
|
||||||
return EINVAL
|
|
||||||
}
|
|
||||||
p[0], p[1], err = pipe()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) {
|
|
||||||
var value IPMreqn
|
|
||||||
vallen := _Socklen(SizeofIPMreqn)
|
|
||||||
errno := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
|
|
||||||
return &value, errno
|
|
||||||
}
|
|
||||||
|
|
||||||
func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) {
|
|
||||||
return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq))
|
|
||||||
}
|
|
||||||
|
|
||||||
func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) {
|
|
||||||
var rsa RawSockaddrAny
|
|
||||||
var len _Socklen = SizeofSockaddrAny
|
|
||||||
nfd, err = accept4(fd, &rsa, &len, flags)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if len > SizeofSockaddrAny {
|
|
||||||
panic("RawSockaddrAny too small")
|
|
||||||
}
|
|
||||||
sa, err = anyToSockaddr(&rsa)
|
|
||||||
if err != nil {
|
|
||||||
Close(nfd)
|
|
||||||
nfd = 0
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const ImplementsGetwd = true
|
|
||||||
|
|
||||||
//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD
|
|
||||||
|
|
||||||
func Getwd() (string, error) {
|
|
||||||
var buf [PathMax]byte
|
|
||||||
_, err := Getcwd(buf[0:])
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
n := clen(buf[:])
|
|
||||||
if n < 1 {
|
|
||||||
return "", EINVAL
|
|
||||||
}
|
|
||||||
return string(buf[:n]), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
|
|
||||||
var _p0 unsafe.Pointer
|
|
||||||
var bufsize uintptr
|
|
||||||
if len(buf) > 0 {
|
|
||||||
_p0 = unsafe.Pointer(&buf[0])
|
|
||||||
bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf))
|
|
||||||
}
|
|
||||||
r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags))
|
|
||||||
n = int(r0)
|
|
||||||
if e1 != 0 {
|
|
||||||
err = e1
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func setattrlistTimes(path string, times []Timespec, flags int) error {
|
|
||||||
// used on Darwin for UtimesNano
|
|
||||||
return ENOSYS
|
|
||||||
}
|
|
||||||
|
|
||||||
// Derive extattr namespace and attribute name
|
|
||||||
|
|
||||||
func xattrnamespace(fullattr string) (ns int, attr string, err error) {
|
|
||||||
s := strings.IndexByte(fullattr, '.')
|
|
||||||
if s == -1 {
|
|
||||||
return -1, "", ENOATTR
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace := fullattr[0:s]
|
|
||||||
attr = fullattr[s+1:]
|
|
||||||
|
|
||||||
switch namespace {
|
|
||||||
case "user":
|
|
||||||
return EXTATTR_NAMESPACE_USER, attr, nil
|
|
||||||
case "system":
|
|
||||||
return EXTATTR_NAMESPACE_SYSTEM, attr, nil
|
|
||||||
default:
|
|
||||||
return -1, "", ENOATTR
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func initxattrdest(dest []byte, idx int) (d unsafe.Pointer) {
|
|
||||||
if len(dest) > idx {
|
|
||||||
return unsafe.Pointer(&dest[idx])
|
|
||||||
} else {
|
|
||||||
return unsafe.Pointer(_zero)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FreeBSD implements its own syscalls to handle extended attributes
|
|
||||||
|
|
||||||
func Getxattr(file string, attr string, dest []byte) (sz int, err error) {
|
|
||||||
d := initxattrdest(dest, 0)
|
|
||||||
destsize := len(dest)
|
|
||||||
|
|
||||||
nsid, a, err := xattrnamespace(attr)
|
|
||||||
if err != nil {
|
|
||||||
return -1, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return ExtattrGetFile(file, nsid, a, uintptr(d), destsize)
|
|
||||||
}
|
|
||||||
|
|
||||||
func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) {
|
|
||||||
d := initxattrdest(dest, 0)
|
|
||||||
destsize := len(dest)
|
|
||||||
|
|
||||||
nsid, a, err := xattrnamespace(attr)
|
|
||||||
if err != nil {
|
|
||||||
return -1, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return ExtattrGetFd(fd, nsid, a, uintptr(d), destsize)
|
|
||||||
}
|
|
||||||
|
|
||||||
func Lgetxattr(link string, attr string, dest []byte) (sz int, err error) {
|
|
||||||
d := initxattrdest(dest, 0)
|
|
||||||
destsize := len(dest)
|
|
||||||
|
|
||||||
nsid, a, err := xattrnamespace(attr)
|
|
||||||
if err != nil {
|
|
||||||
return -1, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return ExtattrGetLink(link, nsid, a, uintptr(d), destsize)
|
|
||||||
}
|
|
||||||
|
|
||||||
// flags are unused on FreeBSD
|
|
||||||
|
|
||||||
func Fsetxattr(fd int, attr string, data []byte, flags int) (err error) {
|
|
||||||
d := unsafe.Pointer(&data[0])
|
|
||||||
datasiz := len(data)
|
|
||||||
|
|
||||||
nsid, a, err := xattrnamespace(attr)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = ExtattrSetFd(fd, nsid, a, uintptr(d), datasiz)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Setxattr(file string, attr string, data []byte, flags int) (err error) {
|
|
||||||
d := unsafe.Pointer(&data[0])
|
|
||||||
datasiz := len(data)
|
|
||||||
|
|
||||||
nsid, a, err := xattrnamespace(attr)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = ExtattrSetFile(file, nsid, a, uintptr(d), datasiz)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Lsetxattr(link string, attr string, data []byte, flags int) (err error) {
|
|
||||||
d := unsafe.Pointer(&data[0])
|
|
||||||
datasiz := len(data)
|
|
||||||
|
|
||||||
nsid, a, err := xattrnamespace(attr)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = ExtattrSetLink(link, nsid, a, uintptr(d), datasiz)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Removexattr(file string, attr string) (err error) {
|
|
||||||
nsid, a, err := xattrnamespace(attr)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
err = ExtattrDeleteFile(file, nsid, a)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Fremovexattr(fd int, attr string) (err error) {
|
|
||||||
nsid, a, err := xattrnamespace(attr)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
err = ExtattrDeleteFd(fd, nsid, a)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Lremovexattr(link string, attr string) (err error) {
|
|
||||||
nsid, a, err := xattrnamespace(attr)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
err = ExtattrDeleteLink(link, nsid, a)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Listxattr(file string, dest []byte) (sz int, err error) {
|
|
||||||
d := initxattrdest(dest, 0)
|
|
||||||
destsiz := len(dest)
|
|
||||||
|
|
||||||
// FreeBSD won't allow you to list xattrs from multiple namespaces
|
|
||||||
s := 0
|
|
||||||
for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {
|
|
||||||
stmp, e := ExtattrListFile(file, nsid, uintptr(d), destsiz)
|
|
||||||
|
|
||||||
/* Errors accessing system attrs are ignored so that
|
|
||||||
* we can implement the Linux-like behavior of omitting errors that
|
|
||||||
* we don't have read permissions on
|
|
||||||
*
|
|
||||||
* Linux will still error if we ask for user attributes on a file that
|
|
||||||
* we don't have read permissions on, so don't ignore those errors
|
|
||||||
*/
|
|
||||||
if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
|
|
||||||
continue
|
|
||||||
} else if e != nil {
|
|
||||||
return s, e
|
|
||||||
}
|
|
||||||
|
|
||||||
s += stmp
|
|
||||||
destsiz -= s
|
|
||||||
if destsiz < 0 {
|
|
||||||
destsiz = 0
|
|
||||||
}
|
|
||||||
d = initxattrdest(dest, s)
|
|
||||||
}
|
|
||||||
|
|
||||||
return s, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func Flistxattr(fd int, dest []byte) (sz int, err error) {
|
|
||||||
d := initxattrdest(dest, 0)
|
|
||||||
destsiz := len(dest)
|
|
||||||
|
|
||||||
s := 0
|
|
||||||
for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {
|
|
||||||
stmp, e := ExtattrListFd(fd, nsid, uintptr(d), destsiz)
|
|
||||||
if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
|
|
||||||
continue
|
|
||||||
} else if e != nil {
|
|
||||||
return s, e
|
|
||||||
}
|
|
||||||
|
|
||||||
s += stmp
|
|
||||||
destsiz -= s
|
|
||||||
if destsiz < 0 {
|
|
||||||
destsiz = 0
|
|
||||||
}
|
|
||||||
d = initxattrdest(dest, s)
|
|
||||||
}
|
|
||||||
|
|
||||||
return s, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func Llistxattr(link string, dest []byte) (sz int, err error) {
|
|
||||||
d := initxattrdest(dest, 0)
|
|
||||||
destsiz := len(dest)
|
|
||||||
|
|
||||||
s := 0
|
|
||||||
for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {
|
|
||||||
stmp, e := ExtattrListLink(link, nsid, uintptr(d), destsiz)
|
|
||||||
if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
|
|
||||||
continue
|
|
||||||
} else if e != nil {
|
|
||||||
return s, e
|
|
||||||
}
|
|
||||||
|
|
||||||
s += stmp
|
|
||||||
destsiz -= s
|
|
||||||
if destsiz < 0 {
|
|
||||||
destsiz = 0
|
|
||||||
}
|
|
||||||
d = initxattrdest(dest, s)
|
|
||||||
}
|
|
||||||
|
|
||||||
return s, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
//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
|
|
||||||
}
|
|
||||||
|
|
||||||
func Uname(uname *Utsname) error {
|
|
||||||
mib := []_C_int{CTL_KERN, KERN_OSTYPE}
|
|
||||||
n := unsafe.Sizeof(uname.Sysname)
|
|
||||||
if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
mib = []_C_int{CTL_KERN, KERN_HOSTNAME}
|
|
||||||
n = unsafe.Sizeof(uname.Nodename)
|
|
||||||
if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
mib = []_C_int{CTL_KERN, KERN_OSRELEASE}
|
|
||||||
n = unsafe.Sizeof(uname.Release)
|
|
||||||
if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
mib = []_C_int{CTL_KERN, KERN_VERSION}
|
|
||||||
n = unsafe.Sizeof(uname.Version)
|
|
||||||
if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// The version might have newlines or tabs in it, convert them to
|
|
||||||
// spaces.
|
|
||||||
for i, b := range uname.Version {
|
|
||||||
if b == '\n' || b == '\t' {
|
|
||||||
if i == len(uname.Version)-1 {
|
|
||||||
uname.Version[i] = 0
|
|
||||||
} else {
|
|
||||||
uname.Version[i] = ' '
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mib = []_C_int{CTL_HW, HW_MACHINE}
|
|
||||||
n = unsafe.Sizeof(uname.Machine)
|
|
||||||
if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Exposed directly
|
|
||||||
*/
|
|
||||||
//sys Access(path string, mode uint32) (err error)
|
|
||||||
//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error)
|
|
||||||
//sys CapEnter() (err error)
|
|
||||||
//sys capRightsGet(version int, fd int, rightsp *CapRights) (err error) = SYS___CAP_RIGHTS_GET
|
|
||||||
//sys capRightsLimit(fd int, rightsp *CapRights) (err error)
|
|
||||||
//sys Chdir(path string) (err error)
|
|
||||||
//sys Chflags(path string, flags int) (err error)
|
|
||||||
//sys Chmod(path string, mode uint32) (err error)
|
|
||||||
//sys Chown(path string, uid int, gid int) (err error)
|
|
||||||
//sys Chroot(path string) (err error)
|
|
||||||
//sys Close(fd int) (err error)
|
|
||||||
//sys Dup(fd int) (nfd int, err error)
|
|
||||||
//sys Dup2(from int, to int) (err error)
|
|
||||||
//sys Exit(code int)
|
|
||||||
//sys ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)
|
|
||||||
//sys ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)
|
|
||||||
//sys ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error)
|
|
||||||
//sys ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error)
|
|
||||||
//sys ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)
|
|
||||||
//sys ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)
|
|
||||||
//sys ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error)
|
|
||||||
//sys ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error)
|
|
||||||
//sys ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)
|
|
||||||
//sys ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)
|
|
||||||
//sys ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error)
|
|
||||||
//sys ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error)
|
|
||||||
//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_POSIX_FADVISE
|
|
||||||
//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error)
|
|
||||||
//sys Fchdir(fd int) (err error)
|
|
||||||
//sys Fchflags(fd int, flags int) (err error)
|
|
||||||
//sys Fchmod(fd int, mode uint32) (err error)
|
|
||||||
//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
|
|
||||||
//sys Fchown(fd int, uid int, gid int) (err error)
|
|
||||||
//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error)
|
|
||||||
//sys Flock(fd int, how int) (err error)
|
|
||||||
//sys Fpathconf(fd int, name int) (val 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, stat *Statfs_t) (err error)
|
|
||||||
//sys Fsync(fd int) (err error)
|
|
||||||
//sys Ftruncate(fd int, length int64) (err error)
|
|
||||||
//sys Getdents(fd int, buf []byte) (n int, err error)
|
|
||||||
//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error)
|
|
||||||
//sys Getdtablesize() (size int)
|
|
||||||
//sysnb Getegid() (egid int)
|
|
||||||
//sysnb Geteuid() (uid int)
|
|
||||||
//sysnb Getgid() (gid int)
|
|
||||||
//sysnb Getpgid(pid int) (pgid int, err error)
|
|
||||||
//sysnb Getpgrp() (pgrp int)
|
|
||||||
//sysnb Getpid() (pid int)
|
|
||||||
//sysnb Getppid() (ppid int)
|
|
||||||
//sys Getpriority(which int, who int) (prio int, err error)
|
|
||||||
//sysnb Getrlimit(which int, lim *Rlimit) (err error)
|
|
||||||
//sysnb Getrusage(who int, rusage *Rusage) (err error)
|
|
||||||
//sysnb Getsid(pid int) (sid int, err error)
|
|
||||||
//sysnb Gettimeofday(tv *Timeval) (err error)
|
|
||||||
//sysnb Getuid() (uid int)
|
|
||||||
//sys Issetugid() (tainted bool)
|
|
||||||
//sys Kill(pid int, signum syscall.Signal) (err error)
|
|
||||||
//sys Kqueue() (fd int, err error)
|
|
||||||
//sys Lchown(path string, uid int, gid int) (err error)
|
|
||||||
//sys Link(path string, link string) (err error)
|
|
||||||
//sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error)
|
|
||||||
//sys Listen(s int, backlog int) (err error)
|
|
||||||
//sys Lstat(path string, stat *Stat_t) (err error)
|
|
||||||
//sys Mkdir(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 Nanosleep(time *Timespec, leftover *Timespec) (err error)
|
|
||||||
//sys Open(path string, mode int, perm uint32) (fd int, err error)
|
|
||||||
//sys Openat(fdat int, path string, mode int, perm uint32) (fd int, err error)
|
|
||||||
//sys Pathconf(path string, name int) (val int, err error)
|
|
||||||
//sys Pread(fd int, p []byte, offset int64) (n int, err error)
|
|
||||||
//sys Pwrite(fd int, p []byte, offset int64) (n int, err error)
|
|
||||||
//sys read(fd int, p []byte) (n int, err error)
|
|
||||||
//sys Readlink(path string, buf []byte) (n int, err error)
|
|
||||||
//sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error)
|
|
||||||
//sys Rename(from string, to string) (err error)
|
|
||||||
//sys Renameat(fromfd int, from string, tofd int, to string) (err error)
|
|
||||||
//sys Revoke(path string) (err error)
|
|
||||||
//sys Rmdir(path string) (err error)
|
|
||||||
//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
|
|
||||||
//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
|
|
||||||
//sysnb Setegid(egid int) (err error)
|
|
||||||
//sysnb Seteuid(euid int) (err error)
|
|
||||||
//sysnb Setgid(gid int) (err error)
|
|
||||||
//sys Setlogin(name string) (err error)
|
|
||||||
//sysnb Setpgid(pid int, pgid int) (err error)
|
|
||||||
//sys Setpriority(which int, who int, prio int) (err error)
|
|
||||||
//sysnb Setregid(rgid int, egid int) (err error)
|
|
||||||
//sysnb Setreuid(ruid int, euid 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(which int, lim *Rlimit) (err error)
|
|
||||||
//sysnb Setsid() (pid int, err error)
|
|
||||||
//sysnb Settimeofday(tp *Timeval) (err error)
|
|
||||||
//sysnb Setuid(uid int) (err error)
|
|
||||||
//sys Stat(path string, stat *Stat_t) (err error)
|
|
||||||
//sys Statfs(path string, stat *Statfs_t) (err error)
|
|
||||||
//sys Symlink(path string, link string) (err error)
|
|
||||||
//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error)
|
|
||||||
//sys Sync() (err error)
|
|
||||||
//sys Truncate(path string, length int64) (err error)
|
|
||||||
//sys Umask(newmask int) (oldmask int)
|
|
||||||
//sys Undelete(path string) (err error)
|
|
||||||
//sys Unlink(path string) (err error)
|
|
||||||
//sys Unlinkat(dirfd int, path string, flags int) (err error)
|
|
||||||
//sys Unmount(path string, flags int) (err error)
|
|
||||||
//sys write(fd int, p []byte) (n int, err error)
|
|
||||||
//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)
|
|
||||||
//sys munmap(addr uintptr, length uintptr) (err error)
|
|
||||||
//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ
|
|
||||||
//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE
|
|
||||||
//sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error)
|
|
||||||
//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Unimplemented
|
|
||||||
*/
|
|
||||||
// Profil
|
|
||||||
// Sigaction
|
|
||||||
// Sigprocmask
|
|
||||||
// Getlogin
|
|
||||||
// Sigpending
|
|
||||||
// Sigaltstack
|
|
||||||
// Ioctl
|
|
||||||
// Reboot
|
|
||||||
// Execve
|
|
||||||
// Vfork
|
|
||||||
// Sbrk
|
|
||||||
// Sstk
|
|
||||||
// Ovadvise
|
|
||||||
// Mincore
|
|
||||||
// Setitimer
|
|
||||||
// Swapon
|
|
||||||
// Select
|
|
||||||
// Sigsuspend
|
|
||||||
// Readv
|
|
||||||
// Writev
|
|
||||||
// Nfssvc
|
|
||||||
// Getfh
|
|
||||||
// Quotactl
|
|
||||||
// Mount
|
|
||||||
// Csops
|
|
||||||
// Waitid
|
|
||||||
// Add_profil
|
|
||||||
// Kdebug_trace
|
|
||||||
// Sigreturn
|
|
||||||
// Atsocket
|
|
||||||
// Kqueue_from_portset_np
|
|
||||||
// Kqueue_portset
|
|
||||||
// Getattrlist
|
|
||||||
// Setattrlist
|
|
||||||
// Getdirentriesattr
|
|
||||||
// Searchfs
|
|
||||||
// Delete
|
|
||||||
// Copyfile
|
|
||||||
// Watchevent
|
|
||||||
// Waitevent
|
|
||||||
// Modwatch
|
|
||||||
// Getxattr
|
|
||||||
// Fgetxattr
|
|
||||||
// Setxattr
|
|
||||||
// Fsetxattr
|
|
||||||
// Removexattr
|
|
||||||
// Fremovexattr
|
|
||||||
// Listxattr
|
|
||||||
// Flistxattr
|
|
||||||
// Fsctl
|
|
||||||
// Initgroups
|
|
||||||
// Posix_spawn
|
|
||||||
// Nfsclnt
|
|
||||||
// Fhopen
|
|
||||||
// Minherit
|
|
||||||
// Semsys
|
|
||||||
// Msgsys
|
|
||||||
// Shmsys
|
|
||||||
// Semctl
|
|
||||||
// Semget
|
|
||||||
// Semop
|
|
||||||
// Msgctl
|
|
||||||
// Msgget
|
|
||||||
// Msgsnd
|
|
||||||
// Msgrcv
|
|
||||||
// Shmat
|
|
||||||
// Shmctl
|
|
||||||
// Shmdt
|
|
||||||
// Shmget
|
|
||||||
// Shm_open
|
|
||||||
// Shm_unlink
|
|
||||||
// Sem_open
|
|
||||||
// Sem_close
|
|
||||||
// Sem_unlink
|
|
||||||
// Sem_wait
|
|
||||||
// Sem_trywait
|
|
||||||
// Sem_post
|
|
||||||
// Sem_getvalue
|
|
||||||
// Sem_init
|
|
||||||
// Sem_destroy
|
|
||||||
// Open_extended
|
|
||||||
// Umask_extended
|
|
||||||
// Stat_extended
|
|
||||||
// Lstat_extended
|
|
||||||
// Fstat_extended
|
|
||||||
// Chmod_extended
|
|
||||||
// Fchmod_extended
|
|
||||||
// Access_extended
|
|
||||||
// Settid
|
|
||||||
// Gettid
|
|
||||||
// Setsgroups
|
|
||||||
// Getsgroups
|
|
||||||
// Setwgroups
|
|
||||||
// Getwgroups
|
|
||||||
// Mkfifo_extended
|
|
||||||
// Mkdir_extended
|
|
||||||
// Identitysvc
|
|
||||||
// Shared_region_check_np
|
|
||||||
// Shared_region_map_np
|
|
||||||
// __pthread_mutex_destroy
|
|
||||||
// __pthread_mutex_init
|
|
||||||
// __pthread_mutex_lock
|
|
||||||
// __pthread_mutex_trylock
|
|
||||||
// __pthread_mutex_unlock
|
|
||||||
// __pthread_cond_init
|
|
||||||
// __pthread_cond_destroy
|
|
||||||
// __pthread_cond_broadcast
|
|
||||||
// __pthread_cond_signal
|
|
||||||
// Setsid_with_pid
|
|
||||||
// __pthread_cond_timedwait
|
|
||||||
// Aio_fsync
|
|
||||||
// Aio_return
|
|
||||||
// Aio_suspend
|
|
||||||
// Aio_cancel
|
|
||||||
// Aio_error
|
|
||||||
// Aio_read
|
|
||||||
// Aio_write
|
|
||||||
// Lio_listio
|
|
||||||
// __pthread_cond_wait
|
|
||||||
// Iopolicysys
|
|
||||||
// __pthread_kill
|
|
||||||
// __pthread_sigmask
|
|
||||||
// __sigwait
|
|
||||||
// __disable_threadsignal
|
|
||||||
// __pthread_markcancel
|
|
||||||
// __pthread_canceled
|
|
||||||
// __semwait_signal
|
|
||||||
// Proc_info
|
|
||||||
// Stat64_extended
|
|
||||||
// Lstat64_extended
|
|
||||||
// Fstat64_extended
|
|
||||||
// __pthread_chdir
|
|
||||||
// __pthread_fchdir
|
|
||||||
// Audit
|
|
||||||
// Auditon
|
|
||||||
// Getauid
|
|
||||||
// Setauid
|
|
||||||
// Getaudit
|
|
||||||
// Setaudit
|
|
||||||
// Getaudit_addr
|
|
||||||
// Setaudit_addr
|
|
||||||
// Auditctl
|
|
||||||
// Bsdthread_create
|
|
||||||
// Bsdthread_terminate
|
|
||||||
// Stack_snapshot
|
|
||||||
// Bsdthread_register
|
|
||||||
// Workq_open
|
|
||||||
// Workq_ops
|
|
||||||
// __mac_execve
|
|
||||||
// __mac_syscall
|
|
||||||
// __mac_get_file
|
|
||||||
// __mac_set_file
|
|
||||||
// __mac_get_link
|
|
||||||
// __mac_set_link
|
|
||||||
// __mac_get_proc
|
|
||||||
// __mac_set_proc
|
|
||||||
// __mac_get_fd
|
|
||||||
// __mac_set_fd
|
|
||||||
// __mac_get_pid
|
|
||||||
// __mac_get_lcid
|
|
||||||
// __mac_get_lctx
|
|
||||||
// __mac_set_lctx
|
|
||||||
// Setlcid
|
|
||||||
// Read_nocancel
|
|
||||||
// Write_nocancel
|
|
||||||
// Open_nocancel
|
|
||||||
// Close_nocancel
|
|
||||||
// Wait4_nocancel
|
|
||||||
// Recvmsg_nocancel
|
|
||||||
// Sendmsg_nocancel
|
|
||||||
// Recvfrom_nocancel
|
|
||||||
// Accept_nocancel
|
|
||||||
// Fcntl_nocancel
|
|
||||||
// Select_nocancel
|
|
||||||
// Fsync_nocancel
|
|
||||||
// Connect_nocancel
|
|
||||||
// Sigsuspend_nocancel
|
|
||||||
// Readv_nocancel
|
|
||||||
// Writev_nocancel
|
|
||||||
// Sendto_nocancel
|
|
||||||
// Pread_nocancel
|
|
||||||
// Pwrite_nocancel
|
|
||||||
// Waitid_nocancel
|
|
||||||
// Poll_nocancel
|
|
||||||
// Msgsnd_nocancel
|
|
||||||
// Msgrcv_nocancel
|
|
||||||
// Sem_wait_nocancel
|
|
||||||
// Aio_suspend_nocancel
|
|
||||||
// __sigwait_nocancel
|
|
||||||
// __semwait_signal_nocancel
|
|
||||||
// __mac_mount
|
|
||||||
// __mac_get_mount
|
|
||||||
// __mac_getfsstat
|
|
@ -1,52 +0,0 @@
|
|||||||
// 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 386,freebsd
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
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 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)
|
|
||||||
}
|
|
||||||
|
|
||||||
func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
|
|
||||||
var writtenOut uint64 = 0
|
|
||||||
_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr((*offset)>>32), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0)
|
|
||||||
|
|
||||||
written = int(writtenOut)
|
|
||||||
|
|
||||||
if e1 != 0 {
|
|
||||||
err = e1
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
|
@ -1,52 +0,0 @@
|
|||||||
// 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 amd64,freebsd
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
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 SetKevent(k *Kevent_t, fd, mode, flags int) {
|
|
||||||
k.Ident = uint64(fd)
|
|
||||||
k.Filter = int16(mode)
|
|
||||||
k.Flags = uint16(flags)
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
|
|
||||||
var writtenOut uint64 = 0
|
|
||||||
_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0)
|
|
||||||
|
|
||||||
written = int(writtenOut)
|
|
||||||
|
|
||||||
if e1 != 0 {
|
|
||||||
err = e1
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
|
@ -1,52 +0,0 @@
|
|||||||
// Copyright 2012 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,freebsd
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
|
|
||||||
var writtenOut uint64 = 0
|
|
||||||
_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr((*offset)>>32), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0)
|
|
||||||
|
|
||||||
written = int(writtenOut)
|
|
||||||
|
|
||||||
if e1 != 0 {
|
|
||||||
err = e1
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
|
File diff suppressed because it is too large
Load Diff
@ -1,391 +0,0 @@
|
|||||||
// 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.
|
|
||||||
|
|
||||||
// TODO(rsc): Rewrite all nn(SP) references into name+(nn-8)(FP)
|
|
||||||
// so that go vet can check that they are correct.
|
|
||||||
|
|
||||||
// +build 386,linux
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
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 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
|
|
||||||
}
|
|
||||||
|
|
||||||
// 64-bit file system and 32-bit uid calls
|
|
||||||
// (386 default is 32-bit file system and 16-bit uid).
|
|
||||||
//sys Dup2(oldfd int, newfd int) (err error)
|
|
||||||
//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64_64
|
|
||||||
//sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32
|
|
||||||
//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 Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64
|
|
||||||
//sysnb Getegid() (egid int) = SYS_GETEGID32
|
|
||||||
//sysnb Geteuid() (euid int) = SYS_GETEUID32
|
|
||||||
//sysnb Getgid() (gid int) = SYS_GETGID32
|
|
||||||
//sysnb Getuid() (uid int) = SYS_GETUID32
|
|
||||||
//sysnb InotifyInit() (fd int, err error)
|
|
||||||
//sys Ioperm(from int, num int, on int) (err error)
|
|
||||||
//sys Iopl(level int) (err error)
|
|
||||||
//sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32
|
|
||||||
//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
|
|
||||||
//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 sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
|
|
||||||
//sys Setfsgid(gid int) (err error) = SYS_SETFSGID32
|
|
||||||
//sys Setfsuid(uid int) (err error) = SYS_SETFSUID32
|
|
||||||
//sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32
|
|
||||||
//sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32
|
|
||||||
//sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32
|
|
||||||
//sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32
|
|
||||||
//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
|
|
||||||
//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
|
|
||||||
//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error)
|
|
||||||
//sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
|
|
||||||
//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32
|
|
||||||
//sysnb setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32
|
|
||||||
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
|
|
||||||
|
|
||||||
//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error)
|
|
||||||
//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
|
|
||||||
//sys Pause() (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)
|
|
||||||
}
|
|
||||||
|
|
||||||
type rlimit32 struct {
|
|
||||||
Cur uint32
|
|
||||||
Max uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT
|
|
||||||
|
|
||||||
const rlimInf32 = ^uint32(0)
|
|
||||||
const rlimInf64 = ^uint64(0)
|
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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 Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
|
|
||||||
newoffset, errno := seek(fd, offset, whence)
|
|
||||||
if errno != 0 {
|
|
||||||
return 0, errno
|
|
||||||
}
|
|
||||||
return newoffset, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Vsyscalls on amd64.
|
|
||||||
//sysnb Gettimeofday(tv *Timeval) (err error)
|
|
||||||
//sysnb Time(t *Time_t) (tt Time_t, err error)
|
|
||||||
|
|
||||||
//sys Utime(path string, buf *Utimbuf) (err error)
|
|
||||||
|
|
||||||
// On x86 Linux, all the socket calls go through an extra indirection,
|
|
||||||
// I think because the 5-register system call interface can't handle
|
|
||||||
// the 6-argument calls like sendto and recvfrom. Instead the
|
|
||||||
// arguments to the underlying system call are the number below
|
|
||||||
// and a pointer to an array of uintptr. We hide the pointer in the
|
|
||||||
// socketcall assembly to avoid allocation on every system call.
|
|
||||||
|
|
||||||
const (
|
|
||||||
// see linux/net.h
|
|
||||||
_SOCKET = 1
|
|
||||||
_BIND = 2
|
|
||||||
_CONNECT = 3
|
|
||||||
_LISTEN = 4
|
|
||||||
_ACCEPT = 5
|
|
||||||
_GETSOCKNAME = 6
|
|
||||||
_GETPEERNAME = 7
|
|
||||||
_SOCKETPAIR = 8
|
|
||||||
_SEND = 9
|
|
||||||
_RECV = 10
|
|
||||||
_SENDTO = 11
|
|
||||||
_RECVFROM = 12
|
|
||||||
_SHUTDOWN = 13
|
|
||||||
_SETSOCKOPT = 14
|
|
||||||
_GETSOCKOPT = 15
|
|
||||||
_SENDMSG = 16
|
|
||||||
_RECVMSG = 17
|
|
||||||
_ACCEPT4 = 18
|
|
||||||
_RECVMMSG = 19
|
|
||||||
_SENDMMSG = 20
|
|
||||||
)
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {
|
|
||||||
fd, e := socketcall(_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)
|
|
||||||
if e != 0 {
|
|
||||||
err = e
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {
|
|
||||||
fd, e := socketcall(_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)
|
|
||||||
if e != 0 {
|
|
||||||
err = e
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {
|
|
||||||
_, e := rawsocketcall(_GETSOCKNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)
|
|
||||||
if e != 0 {
|
|
||||||
err = e
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {
|
|
||||||
_, e := rawsocketcall(_GETPEERNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)
|
|
||||||
if e != 0 {
|
|
||||||
err = e
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) {
|
|
||||||
_, e := rawsocketcall(_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0)
|
|
||||||
if e != 0 {
|
|
||||||
err = e
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {
|
|
||||||
_, e := socketcall(_BIND, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0)
|
|
||||||
if e != 0 {
|
|
||||||
err = e
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {
|
|
||||||
_, e := socketcall(_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0)
|
|
||||||
if e != 0 {
|
|
||||||
err = e
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func socket(domain int, typ int, proto int) (fd int, err error) {
|
|
||||||
fd, e := rawsocketcall(_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0)
|
|
||||||
if e != 0 {
|
|
||||||
err = e
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {
|
|
||||||
_, e := socketcall(_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)
|
|
||||||
if e != 0 {
|
|
||||||
err = e
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {
|
|
||||||
_, e := socketcall(_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), vallen, 0)
|
|
||||||
if e != 0 {
|
|
||||||
err = e
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {
|
|
||||||
var base uintptr
|
|
||||||
if len(p) > 0 {
|
|
||||||
base = uintptr(unsafe.Pointer(&p[0]))
|
|
||||||
}
|
|
||||||
n, e := socketcall(_RECVFROM, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))
|
|
||||||
if e != 0 {
|
|
||||||
err = e
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {
|
|
||||||
var base uintptr
|
|
||||||
if len(p) > 0 {
|
|
||||||
base = uintptr(unsafe.Pointer(&p[0]))
|
|
||||||
}
|
|
||||||
_, e := socketcall(_SENDTO, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen))
|
|
||||||
if e != 0 {
|
|
||||||
err = e
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
|
|
||||||
n, e := socketcall(_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)
|
|
||||||
if e != 0 {
|
|
||||||
err = e
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
|
|
||||||
n, e := socketcall(_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)
|
|
||||||
if e != 0 {
|
|
||||||
err = e
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Listen(s int, n int) (err error) {
|
|
||||||
_, e := socketcall(_LISTEN, uintptr(s), uintptr(n), 0, 0, 0, 0)
|
|
||||||
if e != 0 {
|
|
||||||
err = e
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Shutdown(s, how int) (err error) {
|
|
||||||
_, e := socketcall(_SHUTDOWN, uintptr(s), uintptr(how), 0, 0, 0, 0)
|
|
||||||
if e != 0 {
|
|
||||||
err = e
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
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 = e
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Statfs(path string, buf *Statfs_t) (err error) {
|
|
||||||
pathp, err := BytePtrFromString(path)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
|
|
||||||
if e != 0 {
|
|
||||||
err = e
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *PtraceRegs) PC() uint64 { return uint64(uint32(r.Eip)) }
|
|
||||||
|
|
||||||
func (r *PtraceRegs) SetPC(pc uint64) { r.Eip = int32(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)
|
|
||||||
}
|
|
@ -1,157 +0,0 @@
|
|||||||
// 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 amd64,linux
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
//sys Dup2(oldfd int, newfd 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 Fstat(fd int, stat *Stat_t) (err error)
|
|
||||||
//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT
|
|
||||||
//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 Ioperm(from int, num int, on int) (err error)
|
|
||||||
//sys Iopl(level 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
|
|
||||||
|
|
||||||
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) {
|
|
||||||
// Use fstatat, because Android's seccomp policy blocks stat.
|
|
||||||
return Fstatat(AT_FDCWD, path, stat, 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
//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 Gettimeofday(tv *Timeval) (err error) {
|
|
||||||
errno := gettimeofday(tv)
|
|
||||||
if errno != 0 {
|
|
||||||
return errno
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func Time(t *Time_t) (tt Time_t, err error) {
|
|
||||||
var tv Timeval
|
|
||||||
errno := gettimeofday(&tv)
|
|
||||||
if errno != 0 {
|
|
||||||
return 0, errno
|
|
||||||
}
|
|
||||||
if t != nil {
|
|
||||||
*t = Time_t(tv.Sec)
|
|
||||||
}
|
|
||||||
return Time_t(tv.Sec), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys Utime(path string, buf *Utimbuf) (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}
|
|
||||||
}
|
|
||||||
|
|
||||||
//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
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *PtraceRegs) PC() uint64 { return r.Rip }
|
|
||||||
|
|
||||||
func (r *PtraceRegs) SetPC(pc uint64) { r.Rip = 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)
|
|
||||||
}
|
|
||||||
|
|
||||||
//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,13 +0,0 @@
|
|||||||
// 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)
|
|
@ -1,255 +0,0 @@
|
|||||||
// 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 arm,linux
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
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 Pipe(p []int) (err error) {
|
|
||||||
if len(p) != 2 {
|
|
||||||
return EINVAL
|
|
||||||
}
|
|
||||||
var pp [2]_C_int
|
|
||||||
err = pipe2(&pp, 0)
|
|
||||||
p[0] = int(pp[0])
|
|
||||||
p[1] = int(pp[1])
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
//sysnb pipe2(p *[2]_C_int, flags int) (err error)
|
|
||||||
|
|
||||||
func Pipe2(p []int, flags int) (err error) {
|
|
||||||
if len(p) != 2 {
|
|
||||||
return EINVAL
|
|
||||||
}
|
|
||||||
var pp [2]_C_int
|
|
||||||
err = pipe2(&pp, flags)
|
|
||||||
p[0] = int(pp[0])
|
|
||||||
p[1] = int(pp[1])
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Underlying system call writes to newoffset via pointer.
|
|
||||||
// Implemented in assembly to avoid allocation.
|
|
||||||
func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno)
|
|
||||||
|
|
||||||
func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
|
|
||||||
newoffset, errno := seek(fd, offset, whence)
|
|
||||||
if errno != 0 {
|
|
||||||
return 0, errno
|
|
||||||
}
|
|
||||||
return newoffset, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
//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) = SYS_GETGROUPS32
|
|
||||||
//sysnb setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32
|
|
||||||
//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 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)
|
|
||||||
//sysnb socketpair(domain int, typ int, flags int, fd *[2]int32) (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)
|
|
||||||
|
|
||||||
// 64-bit file system and 32-bit uid calls
|
|
||||||
// (16-bit uid calls are not always supported in newer kernels)
|
|
||||||
//sys Dup2(oldfd int, newfd int) (err error)
|
|
||||||
//sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32
|
|
||||||
//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
|
|
||||||
//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64
|
|
||||||
//sysnb Getegid() (egid int) = SYS_GETEGID32
|
|
||||||
//sysnb Geteuid() (euid int) = SYS_GETEUID32
|
|
||||||
//sysnb Getgid() (gid int) = SYS_GETGID32
|
|
||||||
//sysnb Getuid() (uid int) = SYS_GETUID32
|
|
||||||
//sysnb InotifyInit() (fd int, err error)
|
|
||||||
//sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32
|
|
||||||
//sys Listen(s int, n int) (err error)
|
|
||||||
//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
|
|
||||||
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
|
|
||||||
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
|
|
||||||
//sys Setfsgid(gid int) (err error) = SYS_SETFSGID32
|
|
||||||
//sys Setfsuid(uid int) (err error) = SYS_SETFSUID32
|
|
||||||
//sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32
|
|
||||||
//sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32
|
|
||||||
//sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32
|
|
||||||
//sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32
|
|
||||||
//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 Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
|
|
||||||
|
|
||||||
// Vsyscalls on amd64.
|
|
||||||
//sysnb Gettimeofday(tv *Timeval) (err error)
|
|
||||||
//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
|
|
||||||
//sys Pause() (err error)
|
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
//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 Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
|
|
||||||
//sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64
|
|
||||||
|
|
||||||
func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
|
|
||||||
_, _, e1 := Syscall6(SYS_ARM_FADVISE64_64, uintptr(fd), uintptr(advice), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32))
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, 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 = e
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Statfs(path string, buf *Statfs_t) (err error) {
|
|
||||||
pathp, err := BytePtrFromString(path)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
|
|
||||||
if e != 0 {
|
|
||||||
err = e
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
type rlimit32 struct {
|
|
||||||
Cur uint32
|
|
||||||
Max uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_UGETRLIMIT
|
|
||||||
|
|
||||||
const rlimInf32 = ^uint32(0)
|
|
||||||
const rlimInf64 = ^uint64(0)
|
|
||||||
|
|
||||||
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 uint64(r.Uregs[15]) }
|
|
||||||
|
|
||||||
func (r *PtraceRegs) SetPC(pc uint64) { r.Uregs[15] = uint32(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)
|
|
||||||
}
|
|
@ -1,190 +0,0 @@
|
|||||||
// Copyright 2015 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 arm64,linux
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
//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)
|
|
||||||
//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 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 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() (err error) {
|
|
||||||
_, _, e1 := Syscall6(SYS_PPOLL, 0, 0, 0, 0, 0, 0)
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO(dfc): constants that should be in zsysnum_linux_arm64.go, remove
|
|
||||||
// these when the deprecated syscalls that the syscall package relies on
|
|
||||||
// are removed.
|
|
||||||
const (
|
|
||||||
SYS_GETPGRP = 1060
|
|
||||||
SYS_UTIMES = 1037
|
|
||||||
SYS_FUTIMESAT = 1066
|
|
||||||
SYS_PAUSE = 1061
|
|
||||||
SYS_USTAT = 1070
|
|
||||||
SYS_UTIME = 1063
|
|
||||||
SYS_LCHOWN = 1032
|
|
||||||
SYS_TIME = 1062
|
|
||||||
SYS_EPOLL_CREATE = 1042
|
|
||||||
SYS_EPOLL_WAIT = 1069
|
|
||||||
)
|
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
// 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)
|
|
@ -1,21 +0,0 @@
|
|||||||
// 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
|
|
||||||
// +build gccgo
|
|
||||||
// +build 386 arm
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno) {
|
|
||||||
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
|
|
||||||
}
|
|
@ -1,210 +0,0 @@
|
|||||||
// Copyright 2015 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 mips64 mips64le
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
//sys Dup2(oldfd int, newfd 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 Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT
|
|
||||||
//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 Lchown(path string, uid int, gid int) (err error)
|
|
||||||
//sys Listen(s int, n int) (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
|
|
||||||
|
|
||||||
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)
|
|
||||||
//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)
|
|
||||||
|
|
||||||
//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)
|
|
||||||
|
|
||||||
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 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 Ioperm(from int, num int, on int) (err error) {
|
|
||||||
return ENOSYS
|
|
||||||
}
|
|
||||||
|
|
||||||
func Iopl(level int) (err error) {
|
|
||||||
return ENOSYS
|
|
||||||
}
|
|
||||||
|
|
||||||
type stat_t struct {
|
|
||||||
Dev uint32
|
|
||||||
Pad0 [3]int32
|
|
||||||
Ino uint64
|
|
||||||
Mode uint32
|
|
||||||
Nlink uint32
|
|
||||||
Uid uint32
|
|
||||||
Gid uint32
|
|
||||||
Rdev uint32
|
|
||||||
Pad1 [3]uint32
|
|
||||||
Size int64
|
|
||||||
Atime uint32
|
|
||||||
Atime_nsec uint32
|
|
||||||
Mtime uint32
|
|
||||||
Mtime_nsec uint32
|
|
||||||
Ctime uint32
|
|
||||||
Ctime_nsec uint32
|
|
||||||
Blksize uint32
|
|
||||||
Pad2 uint32
|
|
||||||
Blocks int64
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys fstat(fd int, st *stat_t) (err error)
|
|
||||||
//sys lstat(path string, st *stat_t) (err error)
|
|
||||||
//sys stat(path string, st *stat_t) (err error)
|
|
||||||
|
|
||||||
func Fstat(fd int, s *Stat_t) (err error) {
|
|
||||||
st := &stat_t{}
|
|
||||||
err = fstat(fd, st)
|
|
||||||
fillStat_t(s, st)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Lstat(path string, s *Stat_t) (err error) {
|
|
||||||
st := &stat_t{}
|
|
||||||
err = lstat(path, st)
|
|
||||||
fillStat_t(s, st)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Stat(path string, s *Stat_t) (err error) {
|
|
||||||
st := &stat_t{}
|
|
||||||
err = stat(path, st)
|
|
||||||
fillStat_t(s, st)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func fillStat_t(s *Stat_t, st *stat_t) {
|
|
||||||
s.Dev = st.Dev
|
|
||||||
s.Ino = st.Ino
|
|
||||||
s.Mode = st.Mode
|
|
||||||
s.Nlink = st.Nlink
|
|
||||||
s.Uid = st.Uid
|
|
||||||
s.Gid = st.Gid
|
|
||||||
s.Rdev = st.Rdev
|
|
||||||
s.Size = st.Size
|
|
||||||
s.Atim = Timespec{int64(st.Atime), int64(st.Atime_nsec)}
|
|
||||||
s.Mtim = Timespec{int64(st.Mtime), int64(st.Mtime_nsec)}
|
|
||||||
s.Ctim = Timespec{int64(st.Ctime), int64(st.Ctime_nsec)}
|
|
||||||
s.Blksize = st.Blksize
|
|
||||||
s.Blocks = st.Blocks
|
|
||||||
}
|
|
||||||
|
|
||||||
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 = uint64(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (msghdr *Msghdr) SetControllen(length int) {
|
|
||||||
msghdr.Controllen = uint64(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
|
||||||
cmsg.Len = uint64(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)
|
|
||||||
}
|
|
@ -1,232 +0,0 @@
|
|||||||
// 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)
|
|
||||||
//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 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)
|
|
||||||
|
|
||||||
//sysnb Gettimeofday(tv *Timeval) (err error)
|
|
||||||
//sysnb Time(t *Time_t) (tt Time_t, 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 Utime(path string, buf *Utimbuf) (err error)
|
|
||||||
//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
|
|
||||||
//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
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
//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)
|
|
||||||
}
|
|
@ -1,128 +0,0 @@
|
|||||||
// 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 linux
|
|
||||||
// +build ppc64 ppc64le
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
|
|
||||||
//sys Dup2(oldfd int, newfd 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 Fstat(fd int, stat *Stat_t) (err error)
|
|
||||||
//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT
|
|
||||||
//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) = SYS_UGETRLIMIT
|
|
||||||
//sysnb Getuid() (uid int)
|
|
||||||
//sysnb InotifyInit() (fd int, err error)
|
|
||||||
//sys Ioperm(from int, num int, on int) (err error)
|
|
||||||
//sys Iopl(level 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__NEWSELECT
|
|
||||||
//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_SYNC_FILE_RANGE2
|
|
||||||
//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)
|
|
||||||
|
|
||||||
//sysnb Gettimeofday(tv *Timeval) (err error)
|
|
||||||
//sysnb Time(t *Time_t) (tt Time_t, err error)
|
|
||||||
|
|
||||||
//sys Utime(path string, buf *Utimbuf) (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 (r *PtraceRegs) PC() uint64 { return r.Nip }
|
|
||||||
|
|
||||||
func (r *PtraceRegs) SetPC(pc uint64) { r.Nip = 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,320 +0,0 @@
|
|||||||
// 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 s390x,linux
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
//sys Dup2(oldfd int, newfd 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 Fstat(fd int, stat *Stat_t) (err error)
|
|
||||||
//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT
|
|
||||||
//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 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 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)
|
|
||||||
//sysnb getgroups(n int, list *_Gid_t) (nn int, err error)
|
|
||||||
//sysnb setgroups(n int, list *_Gid_t) (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)
|
|
||||||
|
|
||||||
func setTimespec(sec, nsec int64) Timespec {
|
|
||||||
return Timespec{Sec: sec, Nsec: nsec}
|
|
||||||
}
|
|
||||||
|
|
||||||
func setTimeval(sec, usec int64) Timeval {
|
|
||||||
return Timeval{Sec: sec, Usec: usec}
|
|
||||||
}
|
|
||||||
|
|
||||||
//sysnb pipe2(p *[2]_C_int, flags int) (err error)
|
|
||||||
|
|
||||||
func Pipe(p []int) (err error) {
|
|
||||||
if len(p) != 2 {
|
|
||||||
return EINVAL
|
|
||||||
}
|
|
||||||
var pp [2]_C_int
|
|
||||||
err = pipe2(&pp, 0) // pipe2 is the same as pipe when flags are set to 0.
|
|
||||||
p[0] = int(pp[0])
|
|
||||||
p[1] = int(pp[1])
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
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 Ioperm(from int, num int, on int) (err error) {
|
|
||||||
return ENOSYS
|
|
||||||
}
|
|
||||||
|
|
||||||
func Iopl(level int) (err error) {
|
|
||||||
return ENOSYS
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *PtraceRegs) PC() uint64 { return r.Psw.Addr }
|
|
||||||
|
|
||||||
func (r *PtraceRegs) SetPC(pc uint64) { r.Psw.Addr = 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)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Linux on s390x uses the old mmap interface, which requires arguments to be passed in a struct.
|
|
||||||
// mmap2 also requires arguments to be passed in a struct; it is currently not exposed in <asm/unistd.h>.
|
|
||||||
func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
|
|
||||||
mmap_args := [6]uintptr{addr, length, uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)}
|
|
||||||
r0, _, e1 := Syscall(SYS_MMAP, uintptr(unsafe.Pointer(&mmap_args[0])), 0, 0)
|
|
||||||
xaddr = uintptr(r0)
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// On s390x Linux, all the socket calls go through an extra indirection.
|
|
||||||
// The arguments to the underlying system call (SYS_SOCKETCALL) are the
|
|
||||||
// number below and a pointer to an array of uintptr.
|
|
||||||
const (
|
|
||||||
// see linux/net.h
|
|
||||||
netSocket = 1
|
|
||||||
netBind = 2
|
|
||||||
netConnect = 3
|
|
||||||
netListen = 4
|
|
||||||
netAccept = 5
|
|
||||||
netGetSockName = 6
|
|
||||||
netGetPeerName = 7
|
|
||||||
netSocketPair = 8
|
|
||||||
netSend = 9
|
|
||||||
netRecv = 10
|
|
||||||
netSendTo = 11
|
|
||||||
netRecvFrom = 12
|
|
||||||
netShutdown = 13
|
|
||||||
netSetSockOpt = 14
|
|
||||||
netGetSockOpt = 15
|
|
||||||
netSendMsg = 16
|
|
||||||
netRecvMsg = 17
|
|
||||||
netAccept4 = 18
|
|
||||||
netRecvMMsg = 19
|
|
||||||
netSendMMsg = 20
|
|
||||||
)
|
|
||||||
|
|
||||||
func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (int, error) {
|
|
||||||
args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))}
|
|
||||||
fd, _, err := Syscall(SYS_SOCKETCALL, netAccept, uintptr(unsafe.Pointer(&args)), 0)
|
|
||||||
if err != 0 {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return int(fd), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (int, error) {
|
|
||||||
args := [4]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags)}
|
|
||||||
fd, _, err := Syscall(SYS_SOCKETCALL, netAccept4, uintptr(unsafe.Pointer(&args)), 0)
|
|
||||||
if err != 0 {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return int(fd), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error {
|
|
||||||
args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))}
|
|
||||||
_, _, err := RawSyscall(SYS_SOCKETCALL, netGetSockName, uintptr(unsafe.Pointer(&args)), 0)
|
|
||||||
if err != 0 {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error {
|
|
||||||
args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))}
|
|
||||||
_, _, err := RawSyscall(SYS_SOCKETCALL, netGetPeerName, uintptr(unsafe.Pointer(&args)), 0)
|
|
||||||
if err != 0 {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func socketpair(domain int, typ int, flags int, fd *[2]int32) error {
|
|
||||||
args := [4]uintptr{uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd))}
|
|
||||||
_, _, err := RawSyscall(SYS_SOCKETCALL, netSocketPair, uintptr(unsafe.Pointer(&args)), 0)
|
|
||||||
if err != 0 {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func bind(s int, addr unsafe.Pointer, addrlen _Socklen) error {
|
|
||||||
args := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)}
|
|
||||||
_, _, err := Syscall(SYS_SOCKETCALL, netBind, uintptr(unsafe.Pointer(&args)), 0)
|
|
||||||
if err != 0 {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func connect(s int, addr unsafe.Pointer, addrlen _Socklen) error {
|
|
||||||
args := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)}
|
|
||||||
_, _, err := Syscall(SYS_SOCKETCALL, netConnect, uintptr(unsafe.Pointer(&args)), 0)
|
|
||||||
if err != 0 {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func socket(domain int, typ int, proto int) (int, error) {
|
|
||||||
args := [3]uintptr{uintptr(domain), uintptr(typ), uintptr(proto)}
|
|
||||||
fd, _, err := RawSyscall(SYS_SOCKETCALL, netSocket, uintptr(unsafe.Pointer(&args)), 0)
|
|
||||||
if err != 0 {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return int(fd), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) error {
|
|
||||||
args := [5]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen))}
|
|
||||||
_, _, err := Syscall(SYS_SOCKETCALL, netGetSockOpt, uintptr(unsafe.Pointer(&args)), 0)
|
|
||||||
if err != 0 {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) error {
|
|
||||||
args := [4]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val)}
|
|
||||||
_, _, err := Syscall(SYS_SOCKETCALL, netSetSockOpt, uintptr(unsafe.Pointer(&args)), 0)
|
|
||||||
if err != 0 {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (int, error) {
|
|
||||||
var base uintptr
|
|
||||||
if len(p) > 0 {
|
|
||||||
base = uintptr(unsafe.Pointer(&p[0]))
|
|
||||||
}
|
|
||||||
args := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))}
|
|
||||||
n, _, err := Syscall(SYS_SOCKETCALL, netRecvFrom, uintptr(unsafe.Pointer(&args)), 0)
|
|
||||||
if err != 0 {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return int(n), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) error {
|
|
||||||
var base uintptr
|
|
||||||
if len(p) > 0 {
|
|
||||||
base = uintptr(unsafe.Pointer(&p[0]))
|
|
||||||
}
|
|
||||||
args := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen)}
|
|
||||||
_, _, err := Syscall(SYS_SOCKETCALL, netSendTo, uintptr(unsafe.Pointer(&args)), 0)
|
|
||||||
if err != 0 {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func recvmsg(s int, msg *Msghdr, flags int) (int, error) {
|
|
||||||
args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)}
|
|
||||||
n, _, err := Syscall(SYS_SOCKETCALL, netRecvMsg, uintptr(unsafe.Pointer(&args)), 0)
|
|
||||||
if err != 0 {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return int(n), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func sendmsg(s int, msg *Msghdr, flags int) (int, error) {
|
|
||||||
args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)}
|
|
||||||
n, _, err := Syscall(SYS_SOCKETCALL, netSendMsg, uintptr(unsafe.Pointer(&args)), 0)
|
|
||||||
if err != 0 {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return int(n), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func Listen(s int, n int) error {
|
|
||||||
args := [2]uintptr{uintptr(s), uintptr(n)}
|
|
||||||
_, _, err := Syscall(SYS_SOCKETCALL, netListen, uintptr(unsafe.Pointer(&args)), 0)
|
|
||||||
if err != 0 {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func Shutdown(s, how int) error {
|
|
||||||
args := [2]uintptr{uintptr(s), uintptr(how)}
|
|
||||||
_, _, err := Syscall(SYS_SOCKETCALL, netShutdown, uintptr(unsafe.Pointer(&args)), 0)
|
|
||||||
if err != 0 {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
//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,144 +0,0 @@
|
|||||||
// 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
|
|
||||||
}
|
|
||||||
|
|
||||||
//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)
|
|
||||||
|
|
||||||
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,567 +0,0 @@
|
|||||||
// Copyright 2009,2010 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// NetBSD 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, either here or in
|
|
||||||
// syscall_bsd.go or syscall_unix.go.
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets.
|
|
||||||
type SockaddrDatalink struct {
|
|
||||||
Len uint8
|
|
||||||
Family uint8
|
|
||||||
Index uint16
|
|
||||||
Type uint8
|
|
||||||
Nlen uint8
|
|
||||||
Alen uint8
|
|
||||||
Slen uint8
|
|
||||||
Data [12]int8
|
|
||||||
raw RawSockaddrDatalink
|
|
||||||
}
|
|
||||||
|
|
||||||
func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
|
||||||
|
|
||||||
func sysctlNodes(mib []_C_int) (nodes []Sysctlnode, err error) {
|
|
||||||
var olen uintptr
|
|
||||||
|
|
||||||
// Get a list of all sysctl nodes below the given MIB by performing
|
|
||||||
// a sysctl for the given MIB with CTL_QUERY appended.
|
|
||||||
mib = append(mib, CTL_QUERY)
|
|
||||||
qnode := Sysctlnode{Flags: SYSCTL_VERS_1}
|
|
||||||
qp := (*byte)(unsafe.Pointer(&qnode))
|
|
||||||
sz := unsafe.Sizeof(qnode)
|
|
||||||
if err = sysctl(mib, nil, &olen, qp, sz); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now that we know the size, get the actual nodes.
|
|
||||||
nodes = make([]Sysctlnode, olen/sz)
|
|
||||||
np := (*byte)(unsafe.Pointer(&nodes[0]))
|
|
||||||
if err = sysctl(mib, np, &olen, qp, sz); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nodes, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func nametomib(name string) (mib []_C_int, err error) {
|
|
||||||
// Split name into components.
|
|
||||||
var parts []string
|
|
||||||
last := 0
|
|
||||||
for i := 0; i < len(name); i++ {
|
|
||||||
if name[i] == '.' {
|
|
||||||
parts = append(parts, name[last:i])
|
|
||||||
last = i + 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
parts = append(parts, name[last:])
|
|
||||||
|
|
||||||
// Discover the nodes and construct the MIB OID.
|
|
||||||
for partno, part := range parts {
|
|
||||||
nodes, err := sysctlNodes(mib)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
for _, node := range nodes {
|
|
||||||
n := make([]byte, 0)
|
|
||||||
for i := range node.Name {
|
|
||||||
if node.Name[i] != 0 {
|
|
||||||
n = append(n, byte(node.Name[i]))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if string(n) == part {
|
|
||||||
mib = append(mib, _C_int(node.Num))
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(mib) != partno+1 {
|
|
||||||
return nil, EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return mib, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
//sysnb pipe() (fd1 int, fd2 int, err error)
|
|
||||||
func Pipe(p []int) (err error) {
|
|
||||||
if len(p) != 2 {
|
|
||||||
return EINVAL
|
|
||||||
}
|
|
||||||
p[0], p[1], err = pipe()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys getdents(fd int, buf []byte) (n int, err error)
|
|
||||||
func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
|
|
||||||
return getdents(fd, buf)
|
|
||||||
}
|
|
||||||
|
|
||||||
const ImplementsGetwd = true
|
|
||||||
|
|
||||||
//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD
|
|
||||||
|
|
||||||
func Getwd() (string, error) {
|
|
||||||
var buf [PathMax]byte
|
|
||||||
_, err := Getcwd(buf[0:])
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
n := clen(buf[:])
|
|
||||||
if n < 1 {
|
|
||||||
return "", EINVAL
|
|
||||||
}
|
|
||||||
return string(buf[:n]), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
|
|
||||||
return -1, ENOSYS
|
|
||||||
}
|
|
||||||
|
|
||||||
func setattrlistTimes(path string, times []Timespec, flags int) error {
|
|
||||||
// used on Darwin for UtimesNano
|
|
||||||
return ENOSYS
|
|
||||||
}
|
|
||||||
|
|
||||||
//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
|
|
||||||
}
|
|
||||||
|
|
||||||
func Uname(uname *Utsname) error {
|
|
||||||
mib := []_C_int{CTL_KERN, KERN_OSTYPE}
|
|
||||||
n := unsafe.Sizeof(uname.Sysname)
|
|
||||||
if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
mib = []_C_int{CTL_KERN, KERN_HOSTNAME}
|
|
||||||
n = unsafe.Sizeof(uname.Nodename)
|
|
||||||
if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
mib = []_C_int{CTL_KERN, KERN_OSRELEASE}
|
|
||||||
n = unsafe.Sizeof(uname.Release)
|
|
||||||
if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
mib = []_C_int{CTL_KERN, KERN_VERSION}
|
|
||||||
n = unsafe.Sizeof(uname.Version)
|
|
||||||
if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// The version might have newlines or tabs in it, convert them to
|
|
||||||
// spaces.
|
|
||||||
for i, b := range uname.Version {
|
|
||||||
if b == '\n' || b == '\t' {
|
|
||||||
if i == len(uname.Version)-1 {
|
|
||||||
uname.Version[i] = 0
|
|
||||||
} else {
|
|
||||||
uname.Version[i] = ' '
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mib = []_C_int{CTL_HW, HW_MACHINE}
|
|
||||||
n = unsafe.Sizeof(uname.Machine)
|
|
||||||
if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Exposed directly
|
|
||||||
*/
|
|
||||||
//sys Access(path string, mode uint32) (err error)
|
|
||||||
//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error)
|
|
||||||
//sys Chdir(path string) (err error)
|
|
||||||
//sys Chflags(path string, flags int) (err error)
|
|
||||||
//sys Chmod(path string, mode uint32) (err error)
|
|
||||||
//sys Chown(path string, uid int, gid int) (err error)
|
|
||||||
//sys Chroot(path string) (err error)
|
|
||||||
//sys Close(fd int) (err error)
|
|
||||||
//sys Dup(fd int) (nfd int, err error)
|
|
||||||
//sys Dup2(from int, to int) (err error)
|
|
||||||
//sys Exit(code int)
|
|
||||||
//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_POSIX_FADVISE
|
|
||||||
//sys Fchdir(fd int) (err error)
|
|
||||||
//sys Fchflags(fd int, flags int) (err error)
|
|
||||||
//sys Fchmod(fd int, mode uint32) (err error)
|
|
||||||
//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
|
|
||||||
//sys Fchown(fd int, uid int, gid int) (err error)
|
|
||||||
//sys Flock(fd int, how int) (err error)
|
|
||||||
//sys Fpathconf(fd int, name int) (val 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 Fsync(fd int) (err error)
|
|
||||||
//sys Ftruncate(fd int, length int64) (err error)
|
|
||||||
//sysnb Getegid() (egid int)
|
|
||||||
//sysnb Geteuid() (uid int)
|
|
||||||
//sysnb Getgid() (gid int)
|
|
||||||
//sysnb Getpgid(pid int) (pgid int, err error)
|
|
||||||
//sysnb Getpgrp() (pgrp int)
|
|
||||||
//sysnb Getpid() (pid int)
|
|
||||||
//sysnb Getppid() (ppid int)
|
|
||||||
//sys Getpriority(which int, who int) (prio int, err error)
|
|
||||||
//sysnb Getrlimit(which int, lim *Rlimit) (err error)
|
|
||||||
//sysnb Getrusage(who int, rusage *Rusage) (err error)
|
|
||||||
//sysnb Getsid(pid int) (sid int, err error)
|
|
||||||
//sysnb Gettimeofday(tv *Timeval) (err error)
|
|
||||||
//sysnb Getuid() (uid int)
|
|
||||||
//sys Issetugid() (tainted bool)
|
|
||||||
//sys Kill(pid int, signum syscall.Signal) (err error)
|
|
||||||
//sys Kqueue() (fd int, err error)
|
|
||||||
//sys Lchown(path string, uid int, gid int) (err error)
|
|
||||||
//sys Link(path string, link string) (err error)
|
|
||||||
//sys Listen(s int, backlog int) (err error)
|
|
||||||
//sys Lstat(path string, stat *Stat_t) (err error)
|
|
||||||
//sys Mkdir(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 Nanosleep(time *Timespec, leftover *Timespec) (err error)
|
|
||||||
//sys Open(path string, mode int, perm uint32) (fd int, err error)
|
|
||||||
//sys Pathconf(path string, name int) (val int, err error)
|
|
||||||
//sys Pread(fd int, p []byte, offset int64) (n int, err error)
|
|
||||||
//sys Pwrite(fd int, p []byte, offset int64) (n int, err error)
|
|
||||||
//sys read(fd int, p []byte) (n int, err error)
|
|
||||||
//sys Readlink(path string, buf []byte) (n int, err error)
|
|
||||||
//sys Rename(from string, to string) (err error)
|
|
||||||
//sys Revoke(path string) (err error)
|
|
||||||
//sys Rmdir(path string) (err error)
|
|
||||||
//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
|
|
||||||
//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
|
|
||||||
//sysnb Setegid(egid int) (err error)
|
|
||||||
//sysnb Seteuid(euid int) (err error)
|
|
||||||
//sysnb Setgid(gid int) (err error)
|
|
||||||
//sysnb Setpgid(pid int, pgid int) (err error)
|
|
||||||
//sys Setpriority(which int, who int, prio int) (err error)
|
|
||||||
//sysnb Setregid(rgid int, egid int) (err error)
|
|
||||||
//sysnb Setreuid(ruid int, euid int) (err error)
|
|
||||||
//sysnb Setrlimit(which int, lim *Rlimit) (err error)
|
|
||||||
//sysnb Setsid() (pid int, err error)
|
|
||||||
//sysnb Settimeofday(tp *Timeval) (err error)
|
|
||||||
//sysnb Setuid(uid int) (err error)
|
|
||||||
//sys Stat(path string, stat *Stat_t) (err error)
|
|
||||||
//sys Symlink(path string, link string) (err error)
|
|
||||||
//sys Sync() (err error)
|
|
||||||
//sys Truncate(path string, length int64) (err error)
|
|
||||||
//sys Umask(newmask int) (oldmask int)
|
|
||||||
//sys Unlink(path string) (err error)
|
|
||||||
//sys Unmount(path string, flags int) (err error)
|
|
||||||
//sys write(fd int, p []byte) (n int, err error)
|
|
||||||
//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)
|
|
||||||
//sys munmap(addr uintptr, length uintptr) (err error)
|
|
||||||
//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ
|
|
||||||
//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE
|
|
||||||
//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Unimplemented
|
|
||||||
*/
|
|
||||||
// ____semctl13
|
|
||||||
// __clone
|
|
||||||
// __fhopen40
|
|
||||||
// __fhstat40
|
|
||||||
// __fhstatvfs140
|
|
||||||
// __fstat30
|
|
||||||
// __getcwd
|
|
||||||
// __getfh30
|
|
||||||
// __getlogin
|
|
||||||
// __lstat30
|
|
||||||
// __mount50
|
|
||||||
// __msgctl13
|
|
||||||
// __msync13
|
|
||||||
// __ntp_gettime30
|
|
||||||
// __posix_chown
|
|
||||||
// __posix_fchown
|
|
||||||
// __posix_lchown
|
|
||||||
// __posix_rename
|
|
||||||
// __setlogin
|
|
||||||
// __shmctl13
|
|
||||||
// __sigaction_sigtramp
|
|
||||||
// __sigaltstack14
|
|
||||||
// __sigpending14
|
|
||||||
// __sigprocmask14
|
|
||||||
// __sigsuspend14
|
|
||||||
// __sigtimedwait
|
|
||||||
// __stat30
|
|
||||||
// __syscall
|
|
||||||
// __vfork14
|
|
||||||
// _ksem_close
|
|
||||||
// _ksem_destroy
|
|
||||||
// _ksem_getvalue
|
|
||||||
// _ksem_init
|
|
||||||
// _ksem_open
|
|
||||||
// _ksem_post
|
|
||||||
// _ksem_trywait
|
|
||||||
// _ksem_unlink
|
|
||||||
// _ksem_wait
|
|
||||||
// _lwp_continue
|
|
||||||
// _lwp_create
|
|
||||||
// _lwp_ctl
|
|
||||||
// _lwp_detach
|
|
||||||
// _lwp_exit
|
|
||||||
// _lwp_getname
|
|
||||||
// _lwp_getprivate
|
|
||||||
// _lwp_kill
|
|
||||||
// _lwp_park
|
|
||||||
// _lwp_self
|
|
||||||
// _lwp_setname
|
|
||||||
// _lwp_setprivate
|
|
||||||
// _lwp_suspend
|
|
||||||
// _lwp_unpark
|
|
||||||
// _lwp_unpark_all
|
|
||||||
// _lwp_wait
|
|
||||||
// _lwp_wakeup
|
|
||||||
// _pset_bind
|
|
||||||
// _sched_getaffinity
|
|
||||||
// _sched_getparam
|
|
||||||
// _sched_setaffinity
|
|
||||||
// _sched_setparam
|
|
||||||
// acct
|
|
||||||
// aio_cancel
|
|
||||||
// aio_error
|
|
||||||
// aio_fsync
|
|
||||||
// aio_read
|
|
||||||
// aio_return
|
|
||||||
// aio_suspend
|
|
||||||
// aio_write
|
|
||||||
// break
|
|
||||||
// clock_getres
|
|
||||||
// clock_gettime
|
|
||||||
// clock_settime
|
|
||||||
// compat_09_ogetdomainname
|
|
||||||
// compat_09_osetdomainname
|
|
||||||
// compat_09_ouname
|
|
||||||
// compat_10_omsgsys
|
|
||||||
// compat_10_osemsys
|
|
||||||
// compat_10_oshmsys
|
|
||||||
// compat_12_fstat12
|
|
||||||
// compat_12_getdirentries
|
|
||||||
// compat_12_lstat12
|
|
||||||
// compat_12_msync
|
|
||||||
// compat_12_oreboot
|
|
||||||
// compat_12_oswapon
|
|
||||||
// compat_12_stat12
|
|
||||||
// compat_13_sigaction13
|
|
||||||
// compat_13_sigaltstack13
|
|
||||||
// compat_13_sigpending13
|
|
||||||
// compat_13_sigprocmask13
|
|
||||||
// compat_13_sigreturn13
|
|
||||||
// compat_13_sigsuspend13
|
|
||||||
// compat_14___semctl
|
|
||||||
// compat_14_msgctl
|
|
||||||
// compat_14_shmctl
|
|
||||||
// compat_16___sigaction14
|
|
||||||
// compat_16___sigreturn14
|
|
||||||
// compat_20_fhstatfs
|
|
||||||
// compat_20_fstatfs
|
|
||||||
// compat_20_getfsstat
|
|
||||||
// compat_20_statfs
|
|
||||||
// compat_30___fhstat30
|
|
||||||
// compat_30___fstat13
|
|
||||||
// compat_30___lstat13
|
|
||||||
// compat_30___stat13
|
|
||||||
// compat_30_fhopen
|
|
||||||
// compat_30_fhstat
|
|
||||||
// compat_30_fhstatvfs1
|
|
||||||
// compat_30_getdents
|
|
||||||
// compat_30_getfh
|
|
||||||
// compat_30_ntp_gettime
|
|
||||||
// compat_30_socket
|
|
||||||
// compat_40_mount
|
|
||||||
// compat_43_fstat43
|
|
||||||
// compat_43_lstat43
|
|
||||||
// compat_43_oaccept
|
|
||||||
// compat_43_ocreat
|
|
||||||
// compat_43_oftruncate
|
|
||||||
// compat_43_ogetdirentries
|
|
||||||
// compat_43_ogetdtablesize
|
|
||||||
// compat_43_ogethostid
|
|
||||||
// compat_43_ogethostname
|
|
||||||
// compat_43_ogetkerninfo
|
|
||||||
// compat_43_ogetpagesize
|
|
||||||
// compat_43_ogetpeername
|
|
||||||
// compat_43_ogetrlimit
|
|
||||||
// compat_43_ogetsockname
|
|
||||||
// compat_43_okillpg
|
|
||||||
// compat_43_olseek
|
|
||||||
// compat_43_ommap
|
|
||||||
// compat_43_oquota
|
|
||||||
// compat_43_orecv
|
|
||||||
// compat_43_orecvfrom
|
|
||||||
// compat_43_orecvmsg
|
|
||||||
// compat_43_osend
|
|
||||||
// compat_43_osendmsg
|
|
||||||
// compat_43_osethostid
|
|
||||||
// compat_43_osethostname
|
|
||||||
// compat_43_osetrlimit
|
|
||||||
// compat_43_osigblock
|
|
||||||
// compat_43_osigsetmask
|
|
||||||
// compat_43_osigstack
|
|
||||||
// compat_43_osigvec
|
|
||||||
// compat_43_otruncate
|
|
||||||
// compat_43_owait
|
|
||||||
// compat_43_stat43
|
|
||||||
// execve
|
|
||||||
// extattr_delete_fd
|
|
||||||
// extattr_delete_file
|
|
||||||
// extattr_delete_link
|
|
||||||
// extattr_get_fd
|
|
||||||
// extattr_get_file
|
|
||||||
// extattr_get_link
|
|
||||||
// extattr_list_fd
|
|
||||||
// extattr_list_file
|
|
||||||
// extattr_list_link
|
|
||||||
// extattr_set_fd
|
|
||||||
// extattr_set_file
|
|
||||||
// extattr_set_link
|
|
||||||
// extattrctl
|
|
||||||
// fchroot
|
|
||||||
// fdatasync
|
|
||||||
// fgetxattr
|
|
||||||
// fktrace
|
|
||||||
// flistxattr
|
|
||||||
// fork
|
|
||||||
// fremovexattr
|
|
||||||
// fsetxattr
|
|
||||||
// fstatvfs1
|
|
||||||
// fsync_range
|
|
||||||
// getcontext
|
|
||||||
// getitimer
|
|
||||||
// getvfsstat
|
|
||||||
// getxattr
|
|
||||||
// ktrace
|
|
||||||
// lchflags
|
|
||||||
// lchmod
|
|
||||||
// lfs_bmapv
|
|
||||||
// lfs_markv
|
|
||||||
// lfs_segclean
|
|
||||||
// lfs_segwait
|
|
||||||
// lgetxattr
|
|
||||||
// lio_listio
|
|
||||||
// listxattr
|
|
||||||
// llistxattr
|
|
||||||
// lremovexattr
|
|
||||||
// lseek
|
|
||||||
// lsetxattr
|
|
||||||
// lutimes
|
|
||||||
// madvise
|
|
||||||
// mincore
|
|
||||||
// minherit
|
|
||||||
// modctl
|
|
||||||
// mq_close
|
|
||||||
// mq_getattr
|
|
||||||
// mq_notify
|
|
||||||
// mq_open
|
|
||||||
// mq_receive
|
|
||||||
// mq_send
|
|
||||||
// mq_setattr
|
|
||||||
// mq_timedreceive
|
|
||||||
// mq_timedsend
|
|
||||||
// mq_unlink
|
|
||||||
// mremap
|
|
||||||
// msgget
|
|
||||||
// msgrcv
|
|
||||||
// msgsnd
|
|
||||||
// nfssvc
|
|
||||||
// ntp_adjtime
|
|
||||||
// pmc_control
|
|
||||||
// pmc_get_info
|
|
||||||
// pollts
|
|
||||||
// preadv
|
|
||||||
// profil
|
|
||||||
// pselect
|
|
||||||
// pset_assign
|
|
||||||
// pset_create
|
|
||||||
// pset_destroy
|
|
||||||
// ptrace
|
|
||||||
// pwritev
|
|
||||||
// quotactl
|
|
||||||
// rasctl
|
|
||||||
// readv
|
|
||||||
// reboot
|
|
||||||
// removexattr
|
|
||||||
// sa_enable
|
|
||||||
// sa_preempt
|
|
||||||
// sa_register
|
|
||||||
// sa_setconcurrency
|
|
||||||
// sa_stacks
|
|
||||||
// sa_yield
|
|
||||||
// sbrk
|
|
||||||
// sched_yield
|
|
||||||
// semconfig
|
|
||||||
// semget
|
|
||||||
// semop
|
|
||||||
// setcontext
|
|
||||||
// setitimer
|
|
||||||
// setxattr
|
|
||||||
// shmat
|
|
||||||
// shmdt
|
|
||||||
// shmget
|
|
||||||
// sstk
|
|
||||||
// statvfs1
|
|
||||||
// swapctl
|
|
||||||
// sysarch
|
|
||||||
// syscall
|
|
||||||
// timer_create
|
|
||||||
// timer_delete
|
|
||||||
// timer_getoverrun
|
|
||||||
// timer_gettime
|
|
||||||
// timer_settime
|
|
||||||
// undelete
|
|
||||||
// utrace
|
|
||||||
// uuidgen
|
|
||||||
// vadvise
|
|
||||||
// vfork
|
|
||||||
// writev
|
|
@ -1,33 +0,0 @@
|
|||||||
// 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 386,netbsd
|
|
||||||
|
|
||||||
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 = uint32(mode)
|
|
||||||
k.Flags = uint32(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)
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
// 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 amd64,netbsd
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
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 SetKevent(k *Kevent_t, fd, mode, flags int) {
|
|
||||||
k.Ident = uint64(fd)
|
|
||||||
k.Filter = uint32(mode)
|
|
||||||
k.Flags = uint32(flags)
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
@ -1,33 +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 arm,netbsd
|
|
||||||
|
|
||||||
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 = uint32(mode)
|
|
||||||
k.Flags = uint32(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)
|
|
||||||
}
|
|
@ -1,367 +0,0 @@
|
|||||||
// Copyright 2009,2010 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// OpenBSD 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, either here or in
|
|
||||||
// syscall_bsd.go or syscall_unix.go.
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"sort"
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets.
|
|
||||||
type SockaddrDatalink struct {
|
|
||||||
Len uint8
|
|
||||||
Family uint8
|
|
||||||
Index uint16
|
|
||||||
Type uint8
|
|
||||||
Nlen uint8
|
|
||||||
Alen uint8
|
|
||||||
Slen uint8
|
|
||||||
Data [24]int8
|
|
||||||
raw RawSockaddrDatalink
|
|
||||||
}
|
|
||||||
|
|
||||||
func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
|
||||||
|
|
||||||
func nametomib(name string) (mib []_C_int, err error) {
|
|
||||||
i := sort.Search(len(sysctlMib), func(i int) bool {
|
|
||||||
return sysctlMib[i].ctlname >= name
|
|
||||||
})
|
|
||||||
if i < len(sysctlMib) && sysctlMib[i].ctlname == name {
|
|
||||||
return sysctlMib[i].ctloid, nil
|
|
||||||
}
|
|
||||||
return nil, EINVAL
|
|
||||||
}
|
|
||||||
|
|
||||||
//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 getdents(fd int, buf []byte) (n int, err error)
|
|
||||||
func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
|
|
||||||
return getdents(fd, buf)
|
|
||||||
}
|
|
||||||
|
|
||||||
const ImplementsGetwd = true
|
|
||||||
|
|
||||||
//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD
|
|
||||||
|
|
||||||
func Getwd() (string, error) {
|
|
||||||
var buf [PathMax]byte
|
|
||||||
_, err := Getcwd(buf[0:])
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
n := clen(buf[:])
|
|
||||||
if n < 1 {
|
|
||||||
return "", EINVAL
|
|
||||||
}
|
|
||||||
return string(buf[:n]), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
|
|
||||||
return -1, ENOSYS
|
|
||||||
}
|
|
||||||
|
|
||||||
func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
|
|
||||||
var _p0 unsafe.Pointer
|
|
||||||
var bufsize uintptr
|
|
||||||
if len(buf) > 0 {
|
|
||||||
_p0 = unsafe.Pointer(&buf[0])
|
|
||||||
bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf))
|
|
||||||
}
|
|
||||||
r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags))
|
|
||||||
n = int(r0)
|
|
||||||
if e1 != 0 {
|
|
||||||
err = e1
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func setattrlistTimes(path string, times []Timespec, flags int) error {
|
|
||||||
// used on Darwin for UtimesNano
|
|
||||||
return ENOSYS
|
|
||||||
}
|
|
||||||
|
|
||||||
//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
|
|
||||||
}
|
|
||||||
|
|
||||||
func Uname(uname *Utsname) error {
|
|
||||||
mib := []_C_int{CTL_KERN, KERN_OSTYPE}
|
|
||||||
n := unsafe.Sizeof(uname.Sysname)
|
|
||||||
if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
mib = []_C_int{CTL_KERN, KERN_HOSTNAME}
|
|
||||||
n = unsafe.Sizeof(uname.Nodename)
|
|
||||||
if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
mib = []_C_int{CTL_KERN, KERN_OSRELEASE}
|
|
||||||
n = unsafe.Sizeof(uname.Release)
|
|
||||||
if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
mib = []_C_int{CTL_KERN, KERN_VERSION}
|
|
||||||
n = unsafe.Sizeof(uname.Version)
|
|
||||||
if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// The version might have newlines or tabs in it, convert them to
|
|
||||||
// spaces.
|
|
||||||
for i, b := range uname.Version {
|
|
||||||
if b == '\n' || b == '\t' {
|
|
||||||
if i == len(uname.Version)-1 {
|
|
||||||
uname.Version[i] = 0
|
|
||||||
} else {
|
|
||||||
uname.Version[i] = ' '
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mib = []_C_int{CTL_HW, HW_MACHINE}
|
|
||||||
n = unsafe.Sizeof(uname.Machine)
|
|
||||||
if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Exposed directly
|
|
||||||
*/
|
|
||||||
//sys Access(path string, mode uint32) (err error)
|
|
||||||
//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error)
|
|
||||||
//sys Chdir(path string) (err error)
|
|
||||||
//sys Chflags(path string, flags int) (err error)
|
|
||||||
//sys Chmod(path string, mode uint32) (err error)
|
|
||||||
//sys Chown(path string, uid int, gid int) (err error)
|
|
||||||
//sys Chroot(path string) (err error)
|
|
||||||
//sys Close(fd int) (err error)
|
|
||||||
//sys Dup(fd int) (nfd int, err error)
|
|
||||||
//sys Dup2(from int, to int) (err error)
|
|
||||||
//sys Exit(code int)
|
|
||||||
//sys Fchdir(fd int) (err error)
|
|
||||||
//sys Fchflags(fd int, flags int) (err error)
|
|
||||||
//sys Fchmod(fd int, mode uint32) (err error)
|
|
||||||
//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
|
|
||||||
//sys Fchown(fd int, uid int, gid int) (err error)
|
|
||||||
//sys Flock(fd int, how int) (err error)
|
|
||||||
//sys Fpathconf(fd int, name int) (val 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, stat *Statfs_t) (err error)
|
|
||||||
//sys Fsync(fd int) (err error)
|
|
||||||
//sys Ftruncate(fd int, length int64) (err error)
|
|
||||||
//sysnb Getegid() (egid int)
|
|
||||||
//sysnb Geteuid() (uid int)
|
|
||||||
//sysnb Getgid() (gid int)
|
|
||||||
//sysnb Getpgid(pid int) (pgid int, err error)
|
|
||||||
//sysnb Getpgrp() (pgrp int)
|
|
||||||
//sysnb Getpid() (pid int)
|
|
||||||
//sysnb Getppid() (ppid int)
|
|
||||||
//sys Getpriority(which int, who int) (prio int, err error)
|
|
||||||
//sysnb Getrlimit(which int, lim *Rlimit) (err error)
|
|
||||||
//sysnb Getrtable() (rtable int, err error)
|
|
||||||
//sysnb Getrusage(who int, rusage *Rusage) (err error)
|
|
||||||
//sysnb Getsid(pid int) (sid int, err error)
|
|
||||||
//sysnb Gettimeofday(tv *Timeval) (err error)
|
|
||||||
//sysnb Getuid() (uid int)
|
|
||||||
//sys Issetugid() (tainted bool)
|
|
||||||
//sys Kill(pid int, signum syscall.Signal) (err error)
|
|
||||||
//sys Kqueue() (fd int, err error)
|
|
||||||
//sys Lchown(path string, uid int, gid int) (err error)
|
|
||||||
//sys Link(path string, link string) (err error)
|
|
||||||
//sys Listen(s int, backlog int) (err error)
|
|
||||||
//sys Lstat(path string, stat *Stat_t) (err error)
|
|
||||||
//sys Mkdir(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 Nanosleep(time *Timespec, leftover *Timespec) (err error)
|
|
||||||
//sys Open(path string, mode int, perm uint32) (fd int, err error)
|
|
||||||
//sys Pathconf(path string, name int) (val int, err error)
|
|
||||||
//sys Pread(fd int, p []byte, offset int64) (n int, err error)
|
|
||||||
//sys Pwrite(fd int, p []byte, offset int64) (n int, err error)
|
|
||||||
//sys read(fd int, p []byte) (n int, err error)
|
|
||||||
//sys Readlink(path string, buf []byte) (n int, err error)
|
|
||||||
//sys Rename(from string, to string) (err error)
|
|
||||||
//sys Revoke(path string) (err error)
|
|
||||||
//sys Rmdir(path string) (err error)
|
|
||||||
//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
|
|
||||||
//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
|
|
||||||
//sysnb Setegid(egid int) (err error)
|
|
||||||
//sysnb Seteuid(euid int) (err error)
|
|
||||||
//sysnb Setgid(gid int) (err error)
|
|
||||||
//sys Setlogin(name string) (err error)
|
|
||||||
//sysnb Setpgid(pid int, pgid int) (err error)
|
|
||||||
//sys Setpriority(which int, who int, prio int) (err error)
|
|
||||||
//sysnb Setregid(rgid int, egid int) (err error)
|
|
||||||
//sysnb Setreuid(ruid int, euid 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(which int, lim *Rlimit) (err error)
|
|
||||||
//sysnb Setrtable(rtable int) (err error)
|
|
||||||
//sysnb Setsid() (pid int, err error)
|
|
||||||
//sysnb Settimeofday(tp *Timeval) (err error)
|
|
||||||
//sysnb Setuid(uid int) (err error)
|
|
||||||
//sys Stat(path string, stat *Stat_t) (err error)
|
|
||||||
//sys Statfs(path string, stat *Statfs_t) (err error)
|
|
||||||
//sys Symlink(path string, link string) (err error)
|
|
||||||
//sys Sync() (err error)
|
|
||||||
//sys Truncate(path string, length int64) (err error)
|
|
||||||
//sys Umask(newmask int) (oldmask int)
|
|
||||||
//sys Unlink(path string) (err error)
|
|
||||||
//sys Unmount(path string, flags int) (err error)
|
|
||||||
//sys write(fd int, p []byte) (n int, err error)
|
|
||||||
//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)
|
|
||||||
//sys munmap(addr uintptr, length uintptr) (err error)
|
|
||||||
//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ
|
|
||||||
//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE
|
|
||||||
//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Unimplemented
|
|
||||||
*/
|
|
||||||
// __getcwd
|
|
||||||
// __semctl
|
|
||||||
// __syscall
|
|
||||||
// __sysctl
|
|
||||||
// adjfreq
|
|
||||||
// break
|
|
||||||
// clock_getres
|
|
||||||
// clock_gettime
|
|
||||||
// clock_settime
|
|
||||||
// closefrom
|
|
||||||
// execve
|
|
||||||
// faccessat
|
|
||||||
// fchmodat
|
|
||||||
// fchownat
|
|
||||||
// fcntl
|
|
||||||
// fhopen
|
|
||||||
// fhstat
|
|
||||||
// fhstatfs
|
|
||||||
// fork
|
|
||||||
// fstatat
|
|
||||||
// futimens
|
|
||||||
// getfh
|
|
||||||
// getgid
|
|
||||||
// getitimer
|
|
||||||
// getlogin
|
|
||||||
// getresgid
|
|
||||||
// getresuid
|
|
||||||
// getthrid
|
|
||||||
// ktrace
|
|
||||||
// lfs_bmapv
|
|
||||||
// lfs_markv
|
|
||||||
// lfs_segclean
|
|
||||||
// lfs_segwait
|
|
||||||
// linkat
|
|
||||||
// mincore
|
|
||||||
// minherit
|
|
||||||
// mkdirat
|
|
||||||
// mkfifoat
|
|
||||||
// mknodat
|
|
||||||
// mount
|
|
||||||
// mquery
|
|
||||||
// msgctl
|
|
||||||
// msgget
|
|
||||||
// msgrcv
|
|
||||||
// msgsnd
|
|
||||||
// nfssvc
|
|
||||||
// nnpfspioctl
|
|
||||||
// openat
|
|
||||||
// preadv
|
|
||||||
// profil
|
|
||||||
// pwritev
|
|
||||||
// quotactl
|
|
||||||
// readlinkat
|
|
||||||
// readv
|
|
||||||
// reboot
|
|
||||||
// renameat
|
|
||||||
// rfork
|
|
||||||
// sched_yield
|
|
||||||
// semget
|
|
||||||
// semop
|
|
||||||
// setgroups
|
|
||||||
// setitimer
|
|
||||||
// setsockopt
|
|
||||||
// shmat
|
|
||||||
// shmctl
|
|
||||||
// shmdt
|
|
||||||
// shmget
|
|
||||||
// sigaction
|
|
||||||
// sigaltstack
|
|
||||||
// sigpending
|
|
||||||
// sigprocmask
|
|
||||||
// sigreturn
|
|
||||||
// sigsuspend
|
|
||||||
// symlinkat
|
|
||||||
// sysarch
|
|
||||||
// syscall
|
|
||||||
// threxit
|
|
||||||
// thrsigdivert
|
|
||||||
// thrsleep
|
|
||||||
// thrwakeup
|
|
||||||
// unlinkat
|
|
||||||
// vfork
|
|
||||||
// writev
|
|
@ -1,33 +0,0 @@
|
|||||||
// 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 386,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)
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue