Vendor updated
parent
29e68260f4
commit
c50a2e5a2a
|
|
@ -1,24 +1,24 @@
|
||||||
[](https://godoc.org/gopkg.in/asn1-ber.v1) [](https://travis-ci.org/go-asn1-ber/asn1-ber)
|
[](https://godoc.org/gopkg.in/asn1-ber.v1) [](https://travis-ci.org/go-asn1-ber/asn1-ber)
|
||||||
|
|
||||||
|
|
||||||
ASN1 BER Encoding / Decoding Library for the GO programming language.
|
ASN1 BER Encoding / Decoding Library for the GO programming language.
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
|
|
||||||
Required libraries:
|
Required libraries:
|
||||||
None
|
None
|
||||||
|
|
||||||
Working:
|
Working:
|
||||||
Very basic encoding / decoding needed for LDAP protocol
|
Very basic encoding / decoding needed for LDAP protocol
|
||||||
|
|
||||||
Tests Implemented:
|
Tests Implemented:
|
||||||
A few
|
A few
|
||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
Fix all encoding / decoding to conform to ASN1 BER spec
|
Fix all encoding / decoding to conform to ASN1 BER spec
|
||||||
Implement Tests / Benchmarks
|
Implement Tests / Benchmarks
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
The Go gopher was designed by Renee French. (http://reneefrench.blogspot.com/)
|
The Go gopher was designed by Renee French. (http://reneefrench.blogspot.com/)
|
||||||
The design is licensed under the Creative Commons 3.0 Attributions license.
|
The design is licensed under the Creative Commons 3.0 Attributions license.
|
||||||
Read this article for more details: http://blog.golang.org/gopher
|
Read this article for more details: http://blog.golang.org/gopher
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,22 @@
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2011-2015 Michael Mitton (mmitton@gmail.com)
|
Copyright (c) 2011-2015 Michael Mitton (mmitton@gmail.com)
|
||||||
Portions copyright (c) 2015-2016 go-ldap Authors
|
Portions copyright (c) 2015-2016 go-ldap Authors
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
in the Software without restriction, including without limitation the rights
|
in the Software without restriction, including without limitation the rights
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
furnished to do so, subject to the following conditions:
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/*
|
/*
|
||||||
Package ldap provides basic LDAP v3 functionality.
|
Package ldap provides basic LDAP v3 functionality.
|
||||||
*/
|
*/
|
||||||
package ldap
|
package ldap
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,139 +1,139 @@
|
||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
// Copyright 2011 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package ssh
|
package ssh
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/asn1"
|
"encoding/asn1"
|
||||||
"errors"
|
"errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
var krb5OID []byte
|
var krb5OID []byte
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
krb5OID, _ = asn1.Marshal(krb5Mesh)
|
krb5OID, _ = asn1.Marshal(krb5Mesh)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GSSAPIClient provides the API to plug-in GSSAPI authentication for client logins.
|
// GSSAPIClient provides the API to plug-in GSSAPI authentication for client logins.
|
||||||
type GSSAPIClient interface {
|
type GSSAPIClient interface {
|
||||||
// InitSecContext initiates the establishment of a security context for GSS-API between the
|
// InitSecContext initiates the establishment of a security context for GSS-API between the
|
||||||
// ssh client and ssh server. Initially the token parameter should be specified as nil.
|
// ssh client and ssh server. Initially the token parameter should be specified as nil.
|
||||||
// The routine may return a outputToken which should be transferred to
|
// The routine may return a outputToken which should be transferred to
|
||||||
// the ssh server, where the ssh server will present it to
|
// the ssh server, where the ssh server will present it to
|
||||||
// AcceptSecContext. If no token need be sent, InitSecContext will indicate this by setting
|
// AcceptSecContext. If no token need be sent, InitSecContext will indicate this by setting
|
||||||
// needContinue to false. To complete the context
|
// needContinue to false. To complete the context
|
||||||
// establishment, one or more reply tokens may be required from the ssh
|
// establishment, one or more reply tokens may be required from the ssh
|
||||||
// server;if so, InitSecContext will return a needContinue which is true.
|
// server;if so, InitSecContext will return a needContinue which is true.
|
||||||
// In this case, InitSecContext should be called again when the
|
// In this case, InitSecContext should be called again when the
|
||||||
// reply token is received from the ssh server, passing the reply
|
// reply token is received from the ssh server, passing the reply
|
||||||
// token to InitSecContext via the token parameters.
|
// token to InitSecContext via the token parameters.
|
||||||
// See RFC 2743 section 2.2.1 and RFC 4462 section 3.4.
|
// See RFC 2743 section 2.2.1 and RFC 4462 section 3.4.
|
||||||
InitSecContext(target string, token []byte, isGSSDelegCreds bool) (outputToken []byte, needContinue bool, err error)
|
InitSecContext(target string, token []byte, isGSSDelegCreds bool) (outputToken []byte, needContinue bool, err error)
|
||||||
// GetMIC generates a cryptographic MIC for the SSH2 message, and places
|
// GetMIC generates a cryptographic MIC for the SSH2 message, and places
|
||||||
// the MIC in a token for transfer to the ssh server.
|
// the MIC in a token for transfer to the ssh server.
|
||||||
// The contents of the MIC field are obtained by calling GSS_GetMIC()
|
// The contents of the MIC field are obtained by calling GSS_GetMIC()
|
||||||
// over the following, using the GSS-API context that was just
|
// over the following, using the GSS-API context that was just
|
||||||
// established:
|
// established:
|
||||||
// string session identifier
|
// string session identifier
|
||||||
// byte SSH_MSG_USERAUTH_REQUEST
|
// byte SSH_MSG_USERAUTH_REQUEST
|
||||||
// string user name
|
// string user name
|
||||||
// string service
|
// string service
|
||||||
// string "gssapi-with-mic"
|
// string "gssapi-with-mic"
|
||||||
// See RFC 2743 section 2.3.1 and RFC 4462 3.5.
|
// See RFC 2743 section 2.3.1 and RFC 4462 3.5.
|
||||||
GetMIC(micFiled []byte) ([]byte, error)
|
GetMIC(micFiled []byte) ([]byte, error)
|
||||||
// Whenever possible, it should be possible for
|
// Whenever possible, it should be possible for
|
||||||
// DeleteSecContext() calls to be successfully processed even
|
// DeleteSecContext() calls to be successfully processed even
|
||||||
// if other calls cannot succeed, thereby enabling context-related
|
// if other calls cannot succeed, thereby enabling context-related
|
||||||
// resources to be released.
|
// resources to be released.
|
||||||
// In addition to deleting established security contexts,
|
// In addition to deleting established security contexts,
|
||||||
// gss_delete_sec_context must also be able to delete "half-built"
|
// gss_delete_sec_context must also be able to delete "half-built"
|
||||||
// security contexts resulting from an incomplete sequence of
|
// security contexts resulting from an incomplete sequence of
|
||||||
// InitSecContext()/AcceptSecContext() calls.
|
// InitSecContext()/AcceptSecContext() calls.
|
||||||
// See RFC 2743 section 2.2.3.
|
// See RFC 2743 section 2.2.3.
|
||||||
DeleteSecContext() error
|
DeleteSecContext() error
|
||||||
}
|
}
|
||||||
|
|
||||||
// GSSAPIServer provides the API to plug in GSSAPI authentication for server logins.
|
// GSSAPIServer provides the API to plug in GSSAPI authentication for server logins.
|
||||||
type GSSAPIServer interface {
|
type GSSAPIServer interface {
|
||||||
// AcceptSecContext allows a remotely initiated security context between the application
|
// AcceptSecContext allows a remotely initiated security context between the application
|
||||||
// and a remote peer to be established by the ssh client. The routine may return a
|
// and a remote peer to be established by the ssh client. The routine may return a
|
||||||
// outputToken which should be transferred to the ssh client,
|
// outputToken which should be transferred to the ssh client,
|
||||||
// where the ssh client will present it to InitSecContext.
|
// where the ssh client will present it to InitSecContext.
|
||||||
// If no token need be sent, AcceptSecContext will indicate this
|
// If no token need be sent, AcceptSecContext will indicate this
|
||||||
// by setting the needContinue to false. To
|
// by setting the needContinue to false. To
|
||||||
// complete the context establishment, one or more reply tokens may be
|
// complete the context establishment, one or more reply tokens may be
|
||||||
// required from the ssh client. if so, AcceptSecContext
|
// required from the ssh client. if so, AcceptSecContext
|
||||||
// will return a needContinue which is true, in which case it
|
// will return a needContinue which is true, in which case it
|
||||||
// should be called again when the reply token is received from the ssh
|
// should be called again when the reply token is received from the ssh
|
||||||
// client, passing the token to AcceptSecContext via the
|
// client, passing the token to AcceptSecContext via the
|
||||||
// token parameters.
|
// token parameters.
|
||||||
// The srcName return value is the authenticated username.
|
// The srcName return value is the authenticated username.
|
||||||
// See RFC 2743 section 2.2.2 and RFC 4462 section 3.4.
|
// See RFC 2743 section 2.2.2 and RFC 4462 section 3.4.
|
||||||
AcceptSecContext(token []byte) (outputToken []byte, srcName string, needContinue bool, err error)
|
AcceptSecContext(token []byte) (outputToken []byte, srcName string, needContinue bool, err error)
|
||||||
// VerifyMIC verifies that a cryptographic MIC, contained in the token parameter,
|
// VerifyMIC verifies that a cryptographic MIC, contained in the token parameter,
|
||||||
// fits the supplied message is received from the ssh client.
|
// fits the supplied message is received from the ssh client.
|
||||||
// See RFC 2743 section 2.3.2.
|
// See RFC 2743 section 2.3.2.
|
||||||
VerifyMIC(micField []byte, micToken []byte) error
|
VerifyMIC(micField []byte, micToken []byte) error
|
||||||
// Whenever possible, it should be possible for
|
// Whenever possible, it should be possible for
|
||||||
// DeleteSecContext() calls to be successfully processed even
|
// DeleteSecContext() calls to be successfully processed even
|
||||||
// if other calls cannot succeed, thereby enabling context-related
|
// if other calls cannot succeed, thereby enabling context-related
|
||||||
// resources to be released.
|
// resources to be released.
|
||||||
// In addition to deleting established security contexts,
|
// In addition to deleting established security contexts,
|
||||||
// gss_delete_sec_context must also be able to delete "half-built"
|
// gss_delete_sec_context must also be able to delete "half-built"
|
||||||
// security contexts resulting from an incomplete sequence of
|
// security contexts resulting from an incomplete sequence of
|
||||||
// InitSecContext()/AcceptSecContext() calls.
|
// InitSecContext()/AcceptSecContext() calls.
|
||||||
// See RFC 2743 section 2.2.3.
|
// See RFC 2743 section 2.2.3.
|
||||||
DeleteSecContext() error
|
DeleteSecContext() error
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// OpenSSH supports Kerberos V5 mechanism only for GSS-API authentication,
|
// OpenSSH supports Kerberos V5 mechanism only for GSS-API authentication,
|
||||||
// so we also support the krb5 mechanism only.
|
// so we also support the krb5 mechanism only.
|
||||||
// See RFC 1964 section 1.
|
// See RFC 1964 section 1.
|
||||||
krb5Mesh = asn1.ObjectIdentifier{1, 2, 840, 113554, 1, 2, 2}
|
krb5Mesh = asn1.ObjectIdentifier{1, 2, 840, 113554, 1, 2, 2}
|
||||||
)
|
)
|
||||||
|
|
||||||
// The GSS-API authentication method is initiated when the client sends an SSH_MSG_USERAUTH_REQUEST
|
// The GSS-API authentication method is initiated when the client sends an SSH_MSG_USERAUTH_REQUEST
|
||||||
// See RFC 4462 section 3.2.
|
// See RFC 4462 section 3.2.
|
||||||
type userAuthRequestGSSAPI struct {
|
type userAuthRequestGSSAPI struct {
|
||||||
N uint32
|
N uint32
|
||||||
OIDS []asn1.ObjectIdentifier
|
OIDS []asn1.ObjectIdentifier
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseGSSAPIPayload(payload []byte) (*userAuthRequestGSSAPI, error) {
|
func parseGSSAPIPayload(payload []byte) (*userAuthRequestGSSAPI, error) {
|
||||||
n, rest, ok := parseUint32(payload)
|
n, rest, ok := parseUint32(payload)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("parse uint32 failed")
|
return nil, errors.New("parse uint32 failed")
|
||||||
}
|
}
|
||||||
s := &userAuthRequestGSSAPI{
|
s := &userAuthRequestGSSAPI{
|
||||||
N: n,
|
N: n,
|
||||||
OIDS: make([]asn1.ObjectIdentifier, n),
|
OIDS: make([]asn1.ObjectIdentifier, n),
|
||||||
}
|
}
|
||||||
for i := 0; i < int(n); i++ {
|
for i := 0; i < int(n); i++ {
|
||||||
var (
|
var (
|
||||||
desiredMech []byte
|
desiredMech []byte
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
desiredMech, rest, ok = parseString(rest)
|
desiredMech, rest, ok = parseString(rest)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("parse string failed")
|
return nil, errors.New("parse string failed")
|
||||||
}
|
}
|
||||||
if rest, err = asn1.Unmarshal(desiredMech, &s.OIDS[i]); err != nil {
|
if rest, err = asn1.Unmarshal(desiredMech, &s.OIDS[i]); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return s, nil
|
return s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// See RFC 4462 section 3.6.
|
// See RFC 4462 section 3.6.
|
||||||
func buildMIC(sessionID string, username string, service string, authMethod string) []byte {
|
func buildMIC(sessionID string, username string, service string, authMethod string) []byte {
|
||||||
out := make([]byte, 0, 0)
|
out := make([]byte, 0, 0)
|
||||||
out = appendString(out, sessionID)
|
out = appendString(out, sessionID)
|
||||||
out = append(out, msgUserAuthRequest)
|
out = append(out, msgUserAuthRequest)
|
||||||
out = appendString(out, username)
|
out = appendString(out, username)
|
||||||
out = appendString(out, service)
|
out = appendString(out, service)
|
||||||
out = appendString(out, authMethod)
|
out = appendString(out, authMethod)
|
||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,116 +1,116 @@
|
||||||
package ssh
|
package ssh
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
)
|
)
|
||||||
|
|
||||||
// streamLocalChannelOpenDirectMsg is a struct used for SSH_MSG_CHANNEL_OPEN message
|
// streamLocalChannelOpenDirectMsg is a struct used for SSH_MSG_CHANNEL_OPEN message
|
||||||
// with "direct-streamlocal@openssh.com" string.
|
// with "direct-streamlocal@openssh.com" string.
|
||||||
//
|
//
|
||||||
// See openssh-portable/PROTOCOL, section 2.4. connection: Unix domain socket forwarding
|
// See openssh-portable/PROTOCOL, section 2.4. connection: Unix domain socket forwarding
|
||||||
// https://github.com/openssh/openssh-portable/blob/master/PROTOCOL#L235
|
// https://github.com/openssh/openssh-portable/blob/master/PROTOCOL#L235
|
||||||
type streamLocalChannelOpenDirectMsg struct {
|
type streamLocalChannelOpenDirectMsg struct {
|
||||||
socketPath string
|
socketPath string
|
||||||
reserved0 string
|
reserved0 string
|
||||||
reserved1 uint32
|
reserved1 uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
// forwardedStreamLocalPayload is a struct used for SSH_MSG_CHANNEL_OPEN message
|
// forwardedStreamLocalPayload is a struct used for SSH_MSG_CHANNEL_OPEN message
|
||||||
// with "forwarded-streamlocal@openssh.com" string.
|
// with "forwarded-streamlocal@openssh.com" string.
|
||||||
type forwardedStreamLocalPayload struct {
|
type forwardedStreamLocalPayload struct {
|
||||||
SocketPath string
|
SocketPath string
|
||||||
Reserved0 string
|
Reserved0 string
|
||||||
}
|
}
|
||||||
|
|
||||||
// streamLocalChannelForwardMsg is a struct used for SSH2_MSG_GLOBAL_REQUEST message
|
// streamLocalChannelForwardMsg is a struct used for SSH2_MSG_GLOBAL_REQUEST message
|
||||||
// with "streamlocal-forward@openssh.com"/"cancel-streamlocal-forward@openssh.com" string.
|
// with "streamlocal-forward@openssh.com"/"cancel-streamlocal-forward@openssh.com" string.
|
||||||
type streamLocalChannelForwardMsg struct {
|
type streamLocalChannelForwardMsg struct {
|
||||||
socketPath string
|
socketPath string
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListenUnix is similar to ListenTCP but uses a Unix domain socket.
|
// ListenUnix is similar to ListenTCP but uses a Unix domain socket.
|
||||||
func (c *Client) ListenUnix(socketPath string) (net.Listener, error) {
|
func (c *Client) ListenUnix(socketPath string) (net.Listener, error) {
|
||||||
c.handleForwardsOnce.Do(c.handleForwards)
|
c.handleForwardsOnce.Do(c.handleForwards)
|
||||||
m := streamLocalChannelForwardMsg{
|
m := streamLocalChannelForwardMsg{
|
||||||
socketPath,
|
socketPath,
|
||||||
}
|
}
|
||||||
// send message
|
// send message
|
||||||
ok, _, err := c.SendRequest("streamlocal-forward@openssh.com", true, Marshal(&m))
|
ok, _, err := c.SendRequest("streamlocal-forward@openssh.com", true, Marshal(&m))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("ssh: streamlocal-forward@openssh.com request denied by peer")
|
return nil, errors.New("ssh: streamlocal-forward@openssh.com request denied by peer")
|
||||||
}
|
}
|
||||||
ch := c.forwards.add(&net.UnixAddr{Name: socketPath, Net: "unix"})
|
ch := c.forwards.add(&net.UnixAddr{Name: socketPath, Net: "unix"})
|
||||||
|
|
||||||
return &unixListener{socketPath, c, ch}, nil
|
return &unixListener{socketPath, c, ch}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) dialStreamLocal(socketPath string) (Channel, error) {
|
func (c *Client) dialStreamLocal(socketPath string) (Channel, error) {
|
||||||
msg := streamLocalChannelOpenDirectMsg{
|
msg := streamLocalChannelOpenDirectMsg{
|
||||||
socketPath: socketPath,
|
socketPath: socketPath,
|
||||||
}
|
}
|
||||||
ch, in, err := c.OpenChannel("direct-streamlocal@openssh.com", Marshal(&msg))
|
ch, in, err := c.OpenChannel("direct-streamlocal@openssh.com", Marshal(&msg))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
go DiscardRequests(in)
|
go DiscardRequests(in)
|
||||||
return ch, err
|
return ch, err
|
||||||
}
|
}
|
||||||
|
|
||||||
type unixListener struct {
|
type unixListener struct {
|
||||||
socketPath string
|
socketPath string
|
||||||
|
|
||||||
conn *Client
|
conn *Client
|
||||||
in <-chan forward
|
in <-chan forward
|
||||||
}
|
}
|
||||||
|
|
||||||
// Accept waits for and returns the next connection to the listener.
|
// Accept waits for and returns the next connection to the listener.
|
||||||
func (l *unixListener) Accept() (net.Conn, error) {
|
func (l *unixListener) Accept() (net.Conn, error) {
|
||||||
s, ok := <-l.in
|
s, ok := <-l.in
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, io.EOF
|
return nil, io.EOF
|
||||||
}
|
}
|
||||||
ch, incoming, err := s.newCh.Accept()
|
ch, incoming, err := s.newCh.Accept()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
go DiscardRequests(incoming)
|
go DiscardRequests(incoming)
|
||||||
|
|
||||||
return &chanConn{
|
return &chanConn{
|
||||||
Channel: ch,
|
Channel: ch,
|
||||||
laddr: &net.UnixAddr{
|
laddr: &net.UnixAddr{
|
||||||
Name: l.socketPath,
|
Name: l.socketPath,
|
||||||
Net: "unix",
|
Net: "unix",
|
||||||
},
|
},
|
||||||
raddr: &net.UnixAddr{
|
raddr: &net.UnixAddr{
|
||||||
Name: "@",
|
Name: "@",
|
||||||
Net: "unix",
|
Net: "unix",
|
||||||
},
|
},
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close closes the listener.
|
// Close closes the listener.
|
||||||
func (l *unixListener) Close() error {
|
func (l *unixListener) Close() error {
|
||||||
// this also closes the listener.
|
// this also closes the listener.
|
||||||
l.conn.forwards.remove(&net.UnixAddr{Name: l.socketPath, Net: "unix"})
|
l.conn.forwards.remove(&net.UnixAddr{Name: l.socketPath, Net: "unix"})
|
||||||
m := streamLocalChannelForwardMsg{
|
m := streamLocalChannelForwardMsg{
|
||||||
l.socketPath,
|
l.socketPath,
|
||||||
}
|
}
|
||||||
ok, _, err := l.conn.SendRequest("cancel-streamlocal-forward@openssh.com", true, Marshal(&m))
|
ok, _, err := l.conn.SendRequest("cancel-streamlocal-forward@openssh.com", true, Marshal(&m))
|
||||||
if err == nil && !ok {
|
if err == nil && !ok {
|
||||||
err = errors.New("ssh: cancel-streamlocal-forward@openssh.com failed")
|
err = errors.New("ssh: cancel-streamlocal-forward@openssh.com failed")
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Addr returns the listener's network address.
|
// Addr returns the listener's network address.
|
||||||
func (l *unixListener) Addr() net.Addr {
|
func (l *unixListener) Addr() net.Addr {
|
||||||
return &net.UnixAddr{
|
return &net.UnixAddr{
|
||||||
Name: l.socketPath,
|
Name: l.socketPath,
|
||||||
Net: "unix",
|
Net: "unix",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,474 +1,474 @@
|
||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
// Copyright 2011 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package ssh
|
package ssh
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Listen requests the remote peer open a listening socket on
|
// Listen requests the remote peer open a listening socket on
|
||||||
// addr. Incoming connections will be available by calling Accept on
|
// addr. Incoming connections will be available by calling Accept on
|
||||||
// the returned net.Listener. The listener must be serviced, or the
|
// the returned net.Listener. The listener must be serviced, or the
|
||||||
// SSH connection may hang.
|
// SSH connection may hang.
|
||||||
// N must be "tcp", "tcp4", "tcp6", or "unix".
|
// N must be "tcp", "tcp4", "tcp6", or "unix".
|
||||||
func (c *Client) Listen(n, addr string) (net.Listener, error) {
|
func (c *Client) Listen(n, addr string) (net.Listener, error) {
|
||||||
switch n {
|
switch n {
|
||||||
case "tcp", "tcp4", "tcp6":
|
case "tcp", "tcp4", "tcp6":
|
||||||
laddr, err := net.ResolveTCPAddr(n, addr)
|
laddr, err := net.ResolveTCPAddr(n, addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return c.ListenTCP(laddr)
|
return c.ListenTCP(laddr)
|
||||||
case "unix":
|
case "unix":
|
||||||
return c.ListenUnix(addr)
|
return c.ListenUnix(addr)
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("ssh: unsupported protocol: %s", n)
|
return nil, fmt.Errorf("ssh: unsupported protocol: %s", n)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Automatic port allocation is broken with OpenSSH before 6.0. See
|
// Automatic port allocation is broken with OpenSSH before 6.0. See
|
||||||
// also https://bugzilla.mindrot.org/show_bug.cgi?id=2017. In
|
// also https://bugzilla.mindrot.org/show_bug.cgi?id=2017. In
|
||||||
// particular, OpenSSH 5.9 sends a channelOpenMsg with port number 0,
|
// particular, OpenSSH 5.9 sends a channelOpenMsg with port number 0,
|
||||||
// rather than the actual port number. This means you can never open
|
// rather than the actual port number. This means you can never open
|
||||||
// two different listeners with auto allocated ports. We work around
|
// two different listeners with auto allocated ports. We work around
|
||||||
// this by trying explicit ports until we succeed.
|
// this by trying explicit ports until we succeed.
|
||||||
|
|
||||||
const openSSHPrefix = "OpenSSH_"
|
const openSSHPrefix = "OpenSSH_"
|
||||||
|
|
||||||
var portRandomizer = rand.New(rand.NewSource(time.Now().UnixNano()))
|
var portRandomizer = rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||||
|
|
||||||
// isBrokenOpenSSHVersion returns true if the given version string
|
// isBrokenOpenSSHVersion returns true if the given version string
|
||||||
// specifies a version of OpenSSH that is known to have a bug in port
|
// specifies a version of OpenSSH that is known to have a bug in port
|
||||||
// forwarding.
|
// forwarding.
|
||||||
func isBrokenOpenSSHVersion(versionStr string) bool {
|
func isBrokenOpenSSHVersion(versionStr string) bool {
|
||||||
i := strings.Index(versionStr, openSSHPrefix)
|
i := strings.Index(versionStr, openSSHPrefix)
|
||||||
if i < 0 {
|
if i < 0 {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
i += len(openSSHPrefix)
|
i += len(openSSHPrefix)
|
||||||
j := i
|
j := i
|
||||||
for ; j < len(versionStr); j++ {
|
for ; j < len(versionStr); j++ {
|
||||||
if versionStr[j] < '0' || versionStr[j] > '9' {
|
if versionStr[j] < '0' || versionStr[j] > '9' {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
version, _ := strconv.Atoi(versionStr[i:j])
|
version, _ := strconv.Atoi(versionStr[i:j])
|
||||||
return version < 6
|
return version < 6
|
||||||
}
|
}
|
||||||
|
|
||||||
// autoPortListenWorkaround simulates automatic port allocation by
|
// autoPortListenWorkaround simulates automatic port allocation by
|
||||||
// trying random ports repeatedly.
|
// trying random ports repeatedly.
|
||||||
func (c *Client) autoPortListenWorkaround(laddr *net.TCPAddr) (net.Listener, error) {
|
func (c *Client) autoPortListenWorkaround(laddr *net.TCPAddr) (net.Listener, error) {
|
||||||
var sshListener net.Listener
|
var sshListener net.Listener
|
||||||
var err error
|
var err error
|
||||||
const tries = 10
|
const tries = 10
|
||||||
for i := 0; i < tries; i++ {
|
for i := 0; i < tries; i++ {
|
||||||
addr := *laddr
|
addr := *laddr
|
||||||
addr.Port = 1024 + portRandomizer.Intn(60000)
|
addr.Port = 1024 + portRandomizer.Intn(60000)
|
||||||
sshListener, err = c.ListenTCP(&addr)
|
sshListener, err = c.ListenTCP(&addr)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
laddr.Port = addr.Port
|
laddr.Port = addr.Port
|
||||||
return sshListener, err
|
return sshListener, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil, fmt.Errorf("ssh: listen on random port failed after %d tries: %v", tries, err)
|
return nil, fmt.Errorf("ssh: listen on random port failed after %d tries: %v", tries, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RFC 4254 7.1
|
// RFC 4254 7.1
|
||||||
type channelForwardMsg struct {
|
type channelForwardMsg struct {
|
||||||
addr string
|
addr string
|
||||||
rport uint32
|
rport uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
// handleForwards starts goroutines handling forwarded connections.
|
// handleForwards starts goroutines handling forwarded connections.
|
||||||
// It's called on first use by (*Client).ListenTCP to not launch
|
// It's called on first use by (*Client).ListenTCP to not launch
|
||||||
// goroutines until needed.
|
// goroutines until needed.
|
||||||
func (c *Client) handleForwards() {
|
func (c *Client) handleForwards() {
|
||||||
go c.forwards.handleChannels(c.HandleChannelOpen("forwarded-tcpip"))
|
go c.forwards.handleChannels(c.HandleChannelOpen("forwarded-tcpip"))
|
||||||
go c.forwards.handleChannels(c.HandleChannelOpen("forwarded-streamlocal@openssh.com"))
|
go c.forwards.handleChannels(c.HandleChannelOpen("forwarded-streamlocal@openssh.com"))
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListenTCP requests the remote peer open a listening socket
|
// ListenTCP requests the remote peer open a listening socket
|
||||||
// on laddr. Incoming connections will be available by calling
|
// on laddr. Incoming connections will be available by calling
|
||||||
// Accept on the returned net.Listener.
|
// Accept on the returned net.Listener.
|
||||||
func (c *Client) ListenTCP(laddr *net.TCPAddr) (net.Listener, error) {
|
func (c *Client) ListenTCP(laddr *net.TCPAddr) (net.Listener, error) {
|
||||||
c.handleForwardsOnce.Do(c.handleForwards)
|
c.handleForwardsOnce.Do(c.handleForwards)
|
||||||
if laddr.Port == 0 && isBrokenOpenSSHVersion(string(c.ServerVersion())) {
|
if laddr.Port == 0 && isBrokenOpenSSHVersion(string(c.ServerVersion())) {
|
||||||
return c.autoPortListenWorkaround(laddr)
|
return c.autoPortListenWorkaround(laddr)
|
||||||
}
|
}
|
||||||
|
|
||||||
m := channelForwardMsg{
|
m := channelForwardMsg{
|
||||||
laddr.IP.String(),
|
laddr.IP.String(),
|
||||||
uint32(laddr.Port),
|
uint32(laddr.Port),
|
||||||
}
|
}
|
||||||
// send message
|
// send message
|
||||||
ok, resp, err := c.SendRequest("tcpip-forward", true, Marshal(&m))
|
ok, resp, err := c.SendRequest("tcpip-forward", true, Marshal(&m))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("ssh: tcpip-forward request denied by peer")
|
return nil, errors.New("ssh: tcpip-forward request denied by peer")
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the original port was 0, then the remote side will
|
// If the original port was 0, then the remote side will
|
||||||
// supply a real port number in the response.
|
// supply a real port number in the response.
|
||||||
if laddr.Port == 0 {
|
if laddr.Port == 0 {
|
||||||
var p struct {
|
var p struct {
|
||||||
Port uint32
|
Port uint32
|
||||||
}
|
}
|
||||||
if err := Unmarshal(resp, &p); err != nil {
|
if err := Unmarshal(resp, &p); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
laddr.Port = int(p.Port)
|
laddr.Port = int(p.Port)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register this forward, using the port number we obtained.
|
// Register this forward, using the port number we obtained.
|
||||||
ch := c.forwards.add(laddr)
|
ch := c.forwards.add(laddr)
|
||||||
|
|
||||||
return &tcpListener{laddr, c, ch}, nil
|
return &tcpListener{laddr, c, ch}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// forwardList stores a mapping between remote
|
// forwardList stores a mapping between remote
|
||||||
// forward requests and the tcpListeners.
|
// forward requests and the tcpListeners.
|
||||||
type forwardList struct {
|
type forwardList struct {
|
||||||
sync.Mutex
|
sync.Mutex
|
||||||
entries []forwardEntry
|
entries []forwardEntry
|
||||||
}
|
}
|
||||||
|
|
||||||
// forwardEntry represents an established mapping of a laddr on a
|
// forwardEntry represents an established mapping of a laddr on a
|
||||||
// remote ssh server to a channel connected to a tcpListener.
|
// remote ssh server to a channel connected to a tcpListener.
|
||||||
type forwardEntry struct {
|
type forwardEntry struct {
|
||||||
laddr net.Addr
|
laddr net.Addr
|
||||||
c chan forward
|
c chan forward
|
||||||
}
|
}
|
||||||
|
|
||||||
// forward represents an incoming forwarded tcpip connection. The
|
// forward represents an incoming forwarded tcpip connection. The
|
||||||
// arguments to add/remove/lookup should be address as specified in
|
// arguments to add/remove/lookup should be address as specified in
|
||||||
// the original forward-request.
|
// the original forward-request.
|
||||||
type forward struct {
|
type forward struct {
|
||||||
newCh NewChannel // the ssh client channel underlying this forward
|
newCh NewChannel // the ssh client channel underlying this forward
|
||||||
raddr net.Addr // the raddr of the incoming connection
|
raddr net.Addr // the raddr of the incoming connection
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *forwardList) add(addr net.Addr) chan forward {
|
func (l *forwardList) add(addr net.Addr) chan forward {
|
||||||
l.Lock()
|
l.Lock()
|
||||||
defer l.Unlock()
|
defer l.Unlock()
|
||||||
f := forwardEntry{
|
f := forwardEntry{
|
||||||
laddr: addr,
|
laddr: addr,
|
||||||
c: make(chan forward, 1),
|
c: make(chan forward, 1),
|
||||||
}
|
}
|
||||||
l.entries = append(l.entries, f)
|
l.entries = append(l.entries, f)
|
||||||
return f.c
|
return f.c
|
||||||
}
|
}
|
||||||
|
|
||||||
// See RFC 4254, section 7.2
|
// See RFC 4254, section 7.2
|
||||||
type forwardedTCPPayload struct {
|
type forwardedTCPPayload struct {
|
||||||
Addr string
|
Addr string
|
||||||
Port uint32
|
Port uint32
|
||||||
OriginAddr string
|
OriginAddr string
|
||||||
OriginPort uint32
|
OriginPort uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseTCPAddr parses the originating address from the remote into a *net.TCPAddr.
|
// parseTCPAddr parses the originating address from the remote into a *net.TCPAddr.
|
||||||
func parseTCPAddr(addr string, port uint32) (*net.TCPAddr, error) {
|
func parseTCPAddr(addr string, port uint32) (*net.TCPAddr, error) {
|
||||||
if port == 0 || port > 65535 {
|
if port == 0 || port > 65535 {
|
||||||
return nil, fmt.Errorf("ssh: port number out of range: %d", port)
|
return nil, fmt.Errorf("ssh: port number out of range: %d", port)
|
||||||
}
|
}
|
||||||
ip := net.ParseIP(string(addr))
|
ip := net.ParseIP(string(addr))
|
||||||
if ip == nil {
|
if ip == nil {
|
||||||
return nil, fmt.Errorf("ssh: cannot parse IP address %q", addr)
|
return nil, fmt.Errorf("ssh: cannot parse IP address %q", addr)
|
||||||
}
|
}
|
||||||
return &net.TCPAddr{IP: ip, Port: int(port)}, nil
|
return &net.TCPAddr{IP: ip, Port: int(port)}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *forwardList) handleChannels(in <-chan NewChannel) {
|
func (l *forwardList) handleChannels(in <-chan NewChannel) {
|
||||||
for ch := range in {
|
for ch := range in {
|
||||||
var (
|
var (
|
||||||
laddr net.Addr
|
laddr net.Addr
|
||||||
raddr net.Addr
|
raddr net.Addr
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
switch channelType := ch.ChannelType(); channelType {
|
switch channelType := ch.ChannelType(); channelType {
|
||||||
case "forwarded-tcpip":
|
case "forwarded-tcpip":
|
||||||
var payload forwardedTCPPayload
|
var payload forwardedTCPPayload
|
||||||
if err = Unmarshal(ch.ExtraData(), &payload); err != nil {
|
if err = Unmarshal(ch.ExtraData(), &payload); err != nil {
|
||||||
ch.Reject(ConnectionFailed, "could not parse forwarded-tcpip payload: "+err.Error())
|
ch.Reject(ConnectionFailed, "could not parse forwarded-tcpip payload: "+err.Error())
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// RFC 4254 section 7.2 specifies that incoming
|
// RFC 4254 section 7.2 specifies that incoming
|
||||||
// addresses should list the address, in string
|
// addresses should list the address, in string
|
||||||
// format. It is implied that this should be an IP
|
// format. It is implied that this should be an IP
|
||||||
// address, as it would be impossible to connect to it
|
// address, as it would be impossible to connect to it
|
||||||
// otherwise.
|
// otherwise.
|
||||||
laddr, err = parseTCPAddr(payload.Addr, payload.Port)
|
laddr, err = parseTCPAddr(payload.Addr, payload.Port)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ch.Reject(ConnectionFailed, err.Error())
|
ch.Reject(ConnectionFailed, err.Error())
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
raddr, err = parseTCPAddr(payload.OriginAddr, payload.OriginPort)
|
raddr, err = parseTCPAddr(payload.OriginAddr, payload.OriginPort)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ch.Reject(ConnectionFailed, err.Error())
|
ch.Reject(ConnectionFailed, err.Error())
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
case "forwarded-streamlocal@openssh.com":
|
case "forwarded-streamlocal@openssh.com":
|
||||||
var payload forwardedStreamLocalPayload
|
var payload forwardedStreamLocalPayload
|
||||||
if err = Unmarshal(ch.ExtraData(), &payload); err != nil {
|
if err = Unmarshal(ch.ExtraData(), &payload); err != nil {
|
||||||
ch.Reject(ConnectionFailed, "could not parse forwarded-streamlocal@openssh.com payload: "+err.Error())
|
ch.Reject(ConnectionFailed, "could not parse forwarded-streamlocal@openssh.com payload: "+err.Error())
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
laddr = &net.UnixAddr{
|
laddr = &net.UnixAddr{
|
||||||
Name: payload.SocketPath,
|
Name: payload.SocketPath,
|
||||||
Net: "unix",
|
Net: "unix",
|
||||||
}
|
}
|
||||||
raddr = &net.UnixAddr{
|
raddr = &net.UnixAddr{
|
||||||
Name: "@",
|
Name: "@",
|
||||||
Net: "unix",
|
Net: "unix",
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
panic(fmt.Errorf("ssh: unknown channel type %s", channelType))
|
panic(fmt.Errorf("ssh: unknown channel type %s", channelType))
|
||||||
}
|
}
|
||||||
if ok := l.forward(laddr, raddr, ch); !ok {
|
if ok := l.forward(laddr, raddr, ch); !ok {
|
||||||
// Section 7.2, implementations MUST reject spurious incoming
|
// Section 7.2, implementations MUST reject spurious incoming
|
||||||
// connections.
|
// connections.
|
||||||
ch.Reject(Prohibited, "no forward for address")
|
ch.Reject(Prohibited, "no forward for address")
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove removes the forward entry, and the channel feeding its
|
// remove removes the forward entry, and the channel feeding its
|
||||||
// listener.
|
// listener.
|
||||||
func (l *forwardList) remove(addr net.Addr) {
|
func (l *forwardList) remove(addr net.Addr) {
|
||||||
l.Lock()
|
l.Lock()
|
||||||
defer l.Unlock()
|
defer l.Unlock()
|
||||||
for i, f := range l.entries {
|
for i, f := range l.entries {
|
||||||
if addr.Network() == f.laddr.Network() && addr.String() == f.laddr.String() {
|
if addr.Network() == f.laddr.Network() && addr.String() == f.laddr.String() {
|
||||||
l.entries = append(l.entries[:i], l.entries[i+1:]...)
|
l.entries = append(l.entries[:i], l.entries[i+1:]...)
|
||||||
close(f.c)
|
close(f.c)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// closeAll closes and clears all forwards.
|
// closeAll closes and clears all forwards.
|
||||||
func (l *forwardList) closeAll() {
|
func (l *forwardList) closeAll() {
|
||||||
l.Lock()
|
l.Lock()
|
||||||
defer l.Unlock()
|
defer l.Unlock()
|
||||||
for _, f := range l.entries {
|
for _, f := range l.entries {
|
||||||
close(f.c)
|
close(f.c)
|
||||||
}
|
}
|
||||||
l.entries = nil
|
l.entries = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *forwardList) forward(laddr, raddr net.Addr, ch NewChannel) bool {
|
func (l *forwardList) forward(laddr, raddr net.Addr, ch NewChannel) bool {
|
||||||
l.Lock()
|
l.Lock()
|
||||||
defer l.Unlock()
|
defer l.Unlock()
|
||||||
for _, f := range l.entries {
|
for _, f := range l.entries {
|
||||||
if laddr.Network() == f.laddr.Network() && laddr.String() == f.laddr.String() {
|
if laddr.Network() == f.laddr.Network() && laddr.String() == f.laddr.String() {
|
||||||
f.c <- forward{newCh: ch, raddr: raddr}
|
f.c <- forward{newCh: ch, raddr: raddr}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
type tcpListener struct {
|
type tcpListener struct {
|
||||||
laddr *net.TCPAddr
|
laddr *net.TCPAddr
|
||||||
|
|
||||||
conn *Client
|
conn *Client
|
||||||
in <-chan forward
|
in <-chan forward
|
||||||
}
|
}
|
||||||
|
|
||||||
// Accept waits for and returns the next connection to the listener.
|
// Accept waits for and returns the next connection to the listener.
|
||||||
func (l *tcpListener) Accept() (net.Conn, error) {
|
func (l *tcpListener) Accept() (net.Conn, error) {
|
||||||
s, ok := <-l.in
|
s, ok := <-l.in
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, io.EOF
|
return nil, io.EOF
|
||||||
}
|
}
|
||||||
ch, incoming, err := s.newCh.Accept()
|
ch, incoming, err := s.newCh.Accept()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
go DiscardRequests(incoming)
|
go DiscardRequests(incoming)
|
||||||
|
|
||||||
return &chanConn{
|
return &chanConn{
|
||||||
Channel: ch,
|
Channel: ch,
|
||||||
laddr: l.laddr,
|
laddr: l.laddr,
|
||||||
raddr: s.raddr,
|
raddr: s.raddr,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close closes the listener.
|
// Close closes the listener.
|
||||||
func (l *tcpListener) Close() error {
|
func (l *tcpListener) Close() error {
|
||||||
m := channelForwardMsg{
|
m := channelForwardMsg{
|
||||||
l.laddr.IP.String(),
|
l.laddr.IP.String(),
|
||||||
uint32(l.laddr.Port),
|
uint32(l.laddr.Port),
|
||||||
}
|
}
|
||||||
|
|
||||||
// this also closes the listener.
|
// this also closes the listener.
|
||||||
l.conn.forwards.remove(l.laddr)
|
l.conn.forwards.remove(l.laddr)
|
||||||
ok, _, err := l.conn.SendRequest("cancel-tcpip-forward", true, Marshal(&m))
|
ok, _, err := l.conn.SendRequest("cancel-tcpip-forward", true, Marshal(&m))
|
||||||
if err == nil && !ok {
|
if err == nil && !ok {
|
||||||
err = errors.New("ssh: cancel-tcpip-forward failed")
|
err = errors.New("ssh: cancel-tcpip-forward failed")
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Addr returns the listener's network address.
|
// Addr returns the listener's network address.
|
||||||
func (l *tcpListener) Addr() net.Addr {
|
func (l *tcpListener) Addr() net.Addr {
|
||||||
return l.laddr
|
return l.laddr
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dial initiates a connection to the addr from the remote host.
|
// Dial initiates a connection to the addr from the remote host.
|
||||||
// The resulting connection has a zero LocalAddr() and RemoteAddr().
|
// The resulting connection has a zero LocalAddr() and RemoteAddr().
|
||||||
func (c *Client) Dial(n, addr string) (net.Conn, error) {
|
func (c *Client) Dial(n, addr string) (net.Conn, error) {
|
||||||
var ch Channel
|
var ch Channel
|
||||||
switch n {
|
switch n {
|
||||||
case "tcp", "tcp4", "tcp6":
|
case "tcp", "tcp4", "tcp6":
|
||||||
// Parse the address into host and numeric port.
|
// Parse the address into host and numeric port.
|
||||||
host, portString, err := net.SplitHostPort(addr)
|
host, portString, err := net.SplitHostPort(addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
port, err := strconv.ParseUint(portString, 10, 16)
|
port, err := strconv.ParseUint(portString, 10, 16)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
ch, err = c.dial(net.IPv4zero.String(), 0, host, int(port))
|
ch, err = c.dial(net.IPv4zero.String(), 0, host, int(port))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
// Use a zero address for local and remote address.
|
// Use a zero address for local and remote address.
|
||||||
zeroAddr := &net.TCPAddr{
|
zeroAddr := &net.TCPAddr{
|
||||||
IP: net.IPv4zero,
|
IP: net.IPv4zero,
|
||||||
Port: 0,
|
Port: 0,
|
||||||
}
|
}
|
||||||
return &chanConn{
|
return &chanConn{
|
||||||
Channel: ch,
|
Channel: ch,
|
||||||
laddr: zeroAddr,
|
laddr: zeroAddr,
|
||||||
raddr: zeroAddr,
|
raddr: zeroAddr,
|
||||||
}, nil
|
}, nil
|
||||||
case "unix":
|
case "unix":
|
||||||
var err error
|
var err error
|
||||||
ch, err = c.dialStreamLocal(addr)
|
ch, err = c.dialStreamLocal(addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &chanConn{
|
return &chanConn{
|
||||||
Channel: ch,
|
Channel: ch,
|
||||||
laddr: &net.UnixAddr{
|
laddr: &net.UnixAddr{
|
||||||
Name: "@",
|
Name: "@",
|
||||||
Net: "unix",
|
Net: "unix",
|
||||||
},
|
},
|
||||||
raddr: &net.UnixAddr{
|
raddr: &net.UnixAddr{
|
||||||
Name: addr,
|
Name: addr,
|
||||||
Net: "unix",
|
Net: "unix",
|
||||||
},
|
},
|
||||||
}, nil
|
}, nil
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("ssh: unsupported protocol: %s", n)
|
return nil, fmt.Errorf("ssh: unsupported protocol: %s", n)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DialTCP connects to the remote address raddr on the network net,
|
// DialTCP connects to the remote address raddr on the network net,
|
||||||
// which must be "tcp", "tcp4", or "tcp6". If laddr is not nil, it is used
|
// which must be "tcp", "tcp4", or "tcp6". If laddr is not nil, it is used
|
||||||
// as the local address for the connection.
|
// as the local address for the connection.
|
||||||
func (c *Client) DialTCP(n string, laddr, raddr *net.TCPAddr) (net.Conn, error) {
|
func (c *Client) DialTCP(n string, laddr, raddr *net.TCPAddr) (net.Conn, error) {
|
||||||
if laddr == nil {
|
if laddr == nil {
|
||||||
laddr = &net.TCPAddr{
|
laddr = &net.TCPAddr{
|
||||||
IP: net.IPv4zero,
|
IP: net.IPv4zero,
|
||||||
Port: 0,
|
Port: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ch, err := c.dial(laddr.IP.String(), laddr.Port, raddr.IP.String(), raddr.Port)
|
ch, err := c.dial(laddr.IP.String(), laddr.Port, raddr.IP.String(), raddr.Port)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &chanConn{
|
return &chanConn{
|
||||||
Channel: ch,
|
Channel: ch,
|
||||||
laddr: laddr,
|
laddr: laddr,
|
||||||
raddr: raddr,
|
raddr: raddr,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// RFC 4254 7.2
|
// RFC 4254 7.2
|
||||||
type channelOpenDirectMsg struct {
|
type channelOpenDirectMsg struct {
|
||||||
raddr string
|
raddr string
|
||||||
rport uint32
|
rport uint32
|
||||||
laddr string
|
laddr string
|
||||||
lport uint32
|
lport uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) dial(laddr string, lport int, raddr string, rport int) (Channel, error) {
|
func (c *Client) dial(laddr string, lport int, raddr string, rport int) (Channel, error) {
|
||||||
msg := channelOpenDirectMsg{
|
msg := channelOpenDirectMsg{
|
||||||
raddr: raddr,
|
raddr: raddr,
|
||||||
rport: uint32(rport),
|
rport: uint32(rport),
|
||||||
laddr: laddr,
|
laddr: laddr,
|
||||||
lport: uint32(lport),
|
lport: uint32(lport),
|
||||||
}
|
}
|
||||||
ch, in, err := c.OpenChannel("direct-tcpip", Marshal(&msg))
|
ch, in, err := c.OpenChannel("direct-tcpip", Marshal(&msg))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
go DiscardRequests(in)
|
go DiscardRequests(in)
|
||||||
return ch, err
|
return ch, err
|
||||||
}
|
}
|
||||||
|
|
||||||
type tcpChan struct {
|
type tcpChan struct {
|
||||||
Channel // the backing channel
|
Channel // the backing channel
|
||||||
}
|
}
|
||||||
|
|
||||||
// chanConn fulfills the net.Conn interface without
|
// chanConn fulfills the net.Conn interface without
|
||||||
// the tcpChan having to hold laddr or raddr directly.
|
// the tcpChan having to hold laddr or raddr directly.
|
||||||
type chanConn struct {
|
type chanConn struct {
|
||||||
Channel
|
Channel
|
||||||
laddr, raddr net.Addr
|
laddr, raddr net.Addr
|
||||||
}
|
}
|
||||||
|
|
||||||
// LocalAddr returns the local network address.
|
// LocalAddr returns the local network address.
|
||||||
func (t *chanConn) LocalAddr() net.Addr {
|
func (t *chanConn) LocalAddr() net.Addr {
|
||||||
return t.laddr
|
return t.laddr
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoteAddr returns the remote network address.
|
// RemoteAddr returns the remote network address.
|
||||||
func (t *chanConn) RemoteAddr() net.Addr {
|
func (t *chanConn) RemoteAddr() net.Addr {
|
||||||
return t.raddr
|
return t.raddr
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetDeadline sets the read and write deadlines associated
|
// SetDeadline sets the read and write deadlines associated
|
||||||
// with the connection.
|
// with the connection.
|
||||||
func (t *chanConn) SetDeadline(deadline time.Time) error {
|
func (t *chanConn) SetDeadline(deadline time.Time) error {
|
||||||
if err := t.SetReadDeadline(deadline); err != nil {
|
if err := t.SetReadDeadline(deadline); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return t.SetWriteDeadline(deadline)
|
return t.SetWriteDeadline(deadline)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetReadDeadline sets the read deadline.
|
// SetReadDeadline sets the read deadline.
|
||||||
// A zero value for t means Read will not time out.
|
// A zero value for t means Read will not time out.
|
||||||
// After the deadline, the error from Read will implement net.Error
|
// After the deadline, the error from Read will implement net.Error
|
||||||
// with Timeout() == true.
|
// with Timeout() == true.
|
||||||
func (t *chanConn) SetReadDeadline(deadline time.Time) error {
|
func (t *chanConn) SetReadDeadline(deadline time.Time) error {
|
||||||
// for compatibility with previous version,
|
// for compatibility with previous version,
|
||||||
// the error message contains "tcpChan"
|
// the error message contains "tcpChan"
|
||||||
return errors.New("ssh: tcpChan: deadline not supported")
|
return errors.New("ssh: tcpChan: deadline not supported")
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetWriteDeadline exists to satisfy the net.Conn interface
|
// SetWriteDeadline exists to satisfy the net.Conn interface
|
||||||
// but is not implemented by this type. It always returns an error.
|
// but is not implemented by this type. It always returns an error.
|
||||||
func (t *chanConn) SetWriteDeadline(deadline time.Time) error {
|
func (t *chanConn) SetWriteDeadline(deadline time.Time) error {
|
||||||
return errors.New("ssh: tcpChan: deadline not supported")
|
return errors.New("ssh: tcpChan: deadline not supported")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,353 +1,353 @@
|
||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
// Copyright 2011 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package ssh
|
package ssh
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
)
|
)
|
||||||
|
|
||||||
// debugTransport if set, will print packet types as they go over the
|
// debugTransport if set, will print packet types as they go over the
|
||||||
// wire. No message decoding is done, to minimize the impact on timing.
|
// wire. No message decoding is done, to minimize the impact on timing.
|
||||||
const debugTransport = false
|
const debugTransport = false
|
||||||
|
|
||||||
const (
|
const (
|
||||||
gcmCipherID = "aes128-gcm@openssh.com"
|
gcmCipherID = "aes128-gcm@openssh.com"
|
||||||
aes128cbcID = "aes128-cbc"
|
aes128cbcID = "aes128-cbc"
|
||||||
tripledescbcID = "3des-cbc"
|
tripledescbcID = "3des-cbc"
|
||||||
)
|
)
|
||||||
|
|
||||||
// packetConn represents a transport that implements packet based
|
// packetConn represents a transport that implements packet based
|
||||||
// operations.
|
// operations.
|
||||||
type packetConn interface {
|
type packetConn interface {
|
||||||
// Encrypt and send a packet of data to the remote peer.
|
// Encrypt and send a packet of data to the remote peer.
|
||||||
writePacket(packet []byte) error
|
writePacket(packet []byte) error
|
||||||
|
|
||||||
// Read a packet from the connection. The read is blocking,
|
// Read a packet from the connection. The read is blocking,
|
||||||
// i.e. if error is nil, then the returned byte slice is
|
// i.e. if error is nil, then the returned byte slice is
|
||||||
// always non-empty.
|
// always non-empty.
|
||||||
readPacket() ([]byte, error)
|
readPacket() ([]byte, error)
|
||||||
|
|
||||||
// Close closes the write-side of the connection.
|
// Close closes the write-side of the connection.
|
||||||
Close() error
|
Close() error
|
||||||
}
|
}
|
||||||
|
|
||||||
// transport is the keyingTransport that implements the SSH packet
|
// transport is the keyingTransport that implements the SSH packet
|
||||||
// protocol.
|
// protocol.
|
||||||
type transport struct {
|
type transport struct {
|
||||||
reader connectionState
|
reader connectionState
|
||||||
writer connectionState
|
writer connectionState
|
||||||
|
|
||||||
bufReader *bufio.Reader
|
bufReader *bufio.Reader
|
||||||
bufWriter *bufio.Writer
|
bufWriter *bufio.Writer
|
||||||
rand io.Reader
|
rand io.Reader
|
||||||
isClient bool
|
isClient bool
|
||||||
io.Closer
|
io.Closer
|
||||||
}
|
}
|
||||||
|
|
||||||
// packetCipher represents a combination of SSH encryption/MAC
|
// packetCipher represents a combination of SSH encryption/MAC
|
||||||
// protocol. A single instance should be used for one direction only.
|
// protocol. A single instance should be used for one direction only.
|
||||||
type packetCipher interface {
|
type packetCipher interface {
|
||||||
// writeCipherPacket encrypts the packet and writes it to w. The
|
// writeCipherPacket encrypts the packet and writes it to w. The
|
||||||
// contents of the packet are generally scrambled.
|
// contents of the packet are generally scrambled.
|
||||||
writeCipherPacket(seqnum uint32, w io.Writer, rand io.Reader, packet []byte) error
|
writeCipherPacket(seqnum uint32, w io.Writer, rand io.Reader, packet []byte) error
|
||||||
|
|
||||||
// readCipherPacket reads and decrypts a packet of data. The
|
// readCipherPacket reads and decrypts a packet of data. The
|
||||||
// returned packet may be overwritten by future calls of
|
// returned packet may be overwritten by future calls of
|
||||||
// readPacket.
|
// readPacket.
|
||||||
readCipherPacket(seqnum uint32, r io.Reader) ([]byte, error)
|
readCipherPacket(seqnum uint32, r io.Reader) ([]byte, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// connectionState represents one side (read or write) of the
|
// connectionState represents one side (read or write) of the
|
||||||
// connection. This is necessary because each direction has its own
|
// connection. This is necessary because each direction has its own
|
||||||
// keys, and can even have its own algorithms
|
// keys, and can even have its own algorithms
|
||||||
type connectionState struct {
|
type connectionState struct {
|
||||||
packetCipher
|
packetCipher
|
||||||
seqNum uint32
|
seqNum uint32
|
||||||
dir direction
|
dir direction
|
||||||
pendingKeyChange chan packetCipher
|
pendingKeyChange chan packetCipher
|
||||||
}
|
}
|
||||||
|
|
||||||
// prepareKeyChange sets up key material for a keychange. The key changes in
|
// prepareKeyChange sets up key material for a keychange. The key changes in
|
||||||
// both directions are triggered by reading and writing a msgNewKey packet
|
// both directions are triggered by reading and writing a msgNewKey packet
|
||||||
// respectively.
|
// respectively.
|
||||||
func (t *transport) prepareKeyChange(algs *algorithms, kexResult *kexResult) error {
|
func (t *transport) prepareKeyChange(algs *algorithms, kexResult *kexResult) error {
|
||||||
ciph, err := newPacketCipher(t.reader.dir, algs.r, kexResult)
|
ciph, err := newPacketCipher(t.reader.dir, algs.r, kexResult)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
t.reader.pendingKeyChange <- ciph
|
t.reader.pendingKeyChange <- ciph
|
||||||
|
|
||||||
ciph, err = newPacketCipher(t.writer.dir, algs.w, kexResult)
|
ciph, err = newPacketCipher(t.writer.dir, algs.w, kexResult)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
t.writer.pendingKeyChange <- ciph
|
t.writer.pendingKeyChange <- ciph
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *transport) printPacket(p []byte, write bool) {
|
func (t *transport) printPacket(p []byte, write bool) {
|
||||||
if len(p) == 0 {
|
if len(p) == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
who := "server"
|
who := "server"
|
||||||
if t.isClient {
|
if t.isClient {
|
||||||
who = "client"
|
who = "client"
|
||||||
}
|
}
|
||||||
what := "read"
|
what := "read"
|
||||||
if write {
|
if write {
|
||||||
what = "write"
|
what = "write"
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Println(what, who, p[0])
|
log.Println(what, who, p[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read and decrypt next packet.
|
// Read and decrypt next packet.
|
||||||
func (t *transport) readPacket() (p []byte, err error) {
|
func (t *transport) readPacket() (p []byte, err error) {
|
||||||
for {
|
for {
|
||||||
p, err = t.reader.readPacket(t.bufReader)
|
p, err = t.reader.readPacket(t.bufReader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if len(p) == 0 || (p[0] != msgIgnore && p[0] != msgDebug) {
|
if len(p) == 0 || (p[0] != msgIgnore && p[0] != msgDebug) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if debugTransport {
|
if debugTransport {
|
||||||
t.printPacket(p, false)
|
t.printPacket(p, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
return p, err
|
return p, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *connectionState) readPacket(r *bufio.Reader) ([]byte, error) {
|
func (s *connectionState) readPacket(r *bufio.Reader) ([]byte, error) {
|
||||||
packet, err := s.packetCipher.readCipherPacket(s.seqNum, r)
|
packet, err := s.packetCipher.readCipherPacket(s.seqNum, r)
|
||||||
s.seqNum++
|
s.seqNum++
|
||||||
if err == nil && len(packet) == 0 {
|
if err == nil && len(packet) == 0 {
|
||||||
err = errors.New("ssh: zero length packet")
|
err = errors.New("ssh: zero length packet")
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(packet) > 0 {
|
if len(packet) > 0 {
|
||||||
switch packet[0] {
|
switch packet[0] {
|
||||||
case msgNewKeys:
|
case msgNewKeys:
|
||||||
select {
|
select {
|
||||||
case cipher := <-s.pendingKeyChange:
|
case cipher := <-s.pendingKeyChange:
|
||||||
s.packetCipher = cipher
|
s.packetCipher = cipher
|
||||||
default:
|
default:
|
||||||
return nil, errors.New("ssh: got bogus newkeys message")
|
return nil, errors.New("ssh: got bogus newkeys message")
|
||||||
}
|
}
|
||||||
|
|
||||||
case msgDisconnect:
|
case msgDisconnect:
|
||||||
// Transform a disconnect message into an
|
// Transform a disconnect message into an
|
||||||
// error. Since this is lowest level at which
|
// error. Since this is lowest level at which
|
||||||
// we interpret message types, doing it here
|
// we interpret message types, doing it here
|
||||||
// ensures that we don't have to handle it
|
// ensures that we don't have to handle it
|
||||||
// elsewhere.
|
// elsewhere.
|
||||||
var msg disconnectMsg
|
var msg disconnectMsg
|
||||||
if err := Unmarshal(packet, &msg); err != nil {
|
if err := Unmarshal(packet, &msg); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return nil, &msg
|
return nil, &msg
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The packet may point to an internal buffer, so copy the
|
// The packet may point to an internal buffer, so copy the
|
||||||
// packet out here.
|
// packet out here.
|
||||||
fresh := make([]byte, len(packet))
|
fresh := make([]byte, len(packet))
|
||||||
copy(fresh, packet)
|
copy(fresh, packet)
|
||||||
|
|
||||||
return fresh, err
|
return fresh, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *transport) writePacket(packet []byte) error {
|
func (t *transport) writePacket(packet []byte) error {
|
||||||
if debugTransport {
|
if debugTransport {
|
||||||
t.printPacket(packet, true)
|
t.printPacket(packet, true)
|
||||||
}
|
}
|
||||||
return t.writer.writePacket(t.bufWriter, t.rand, packet)
|
return t.writer.writePacket(t.bufWriter, t.rand, packet)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *connectionState) writePacket(w *bufio.Writer, rand io.Reader, packet []byte) error {
|
func (s *connectionState) writePacket(w *bufio.Writer, rand io.Reader, packet []byte) error {
|
||||||
changeKeys := len(packet) > 0 && packet[0] == msgNewKeys
|
changeKeys := len(packet) > 0 && packet[0] == msgNewKeys
|
||||||
|
|
||||||
err := s.packetCipher.writeCipherPacket(s.seqNum, w, rand, packet)
|
err := s.packetCipher.writeCipherPacket(s.seqNum, w, rand, packet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err = w.Flush(); err != nil {
|
if err = w.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
s.seqNum++
|
s.seqNum++
|
||||||
if changeKeys {
|
if changeKeys {
|
||||||
select {
|
select {
|
||||||
case cipher := <-s.pendingKeyChange:
|
case cipher := <-s.pendingKeyChange:
|
||||||
s.packetCipher = cipher
|
s.packetCipher = cipher
|
||||||
default:
|
default:
|
||||||
panic("ssh: no key material for msgNewKeys")
|
panic("ssh: no key material for msgNewKeys")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func newTransport(rwc io.ReadWriteCloser, rand io.Reader, isClient bool) *transport {
|
func newTransport(rwc io.ReadWriteCloser, rand io.Reader, isClient bool) *transport {
|
||||||
t := &transport{
|
t := &transport{
|
||||||
bufReader: bufio.NewReader(rwc),
|
bufReader: bufio.NewReader(rwc),
|
||||||
bufWriter: bufio.NewWriter(rwc),
|
bufWriter: bufio.NewWriter(rwc),
|
||||||
rand: rand,
|
rand: rand,
|
||||||
reader: connectionState{
|
reader: connectionState{
|
||||||
packetCipher: &streamPacketCipher{cipher: noneCipher{}},
|
packetCipher: &streamPacketCipher{cipher: noneCipher{}},
|
||||||
pendingKeyChange: make(chan packetCipher, 1),
|
pendingKeyChange: make(chan packetCipher, 1),
|
||||||
},
|
},
|
||||||
writer: connectionState{
|
writer: connectionState{
|
||||||
packetCipher: &streamPacketCipher{cipher: noneCipher{}},
|
packetCipher: &streamPacketCipher{cipher: noneCipher{}},
|
||||||
pendingKeyChange: make(chan packetCipher, 1),
|
pendingKeyChange: make(chan packetCipher, 1),
|
||||||
},
|
},
|
||||||
Closer: rwc,
|
Closer: rwc,
|
||||||
}
|
}
|
||||||
t.isClient = isClient
|
t.isClient = isClient
|
||||||
|
|
||||||
if isClient {
|
if isClient {
|
||||||
t.reader.dir = serverKeys
|
t.reader.dir = serverKeys
|
||||||
t.writer.dir = clientKeys
|
t.writer.dir = clientKeys
|
||||||
} else {
|
} else {
|
||||||
t.reader.dir = clientKeys
|
t.reader.dir = clientKeys
|
||||||
t.writer.dir = serverKeys
|
t.writer.dir = serverKeys
|
||||||
}
|
}
|
||||||
|
|
||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
|
|
||||||
type direction struct {
|
type direction struct {
|
||||||
ivTag []byte
|
ivTag []byte
|
||||||
keyTag []byte
|
keyTag []byte
|
||||||
macKeyTag []byte
|
macKeyTag []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
serverKeys = direction{[]byte{'B'}, []byte{'D'}, []byte{'F'}}
|
serverKeys = direction{[]byte{'B'}, []byte{'D'}, []byte{'F'}}
|
||||||
clientKeys = direction{[]byte{'A'}, []byte{'C'}, []byte{'E'}}
|
clientKeys = direction{[]byte{'A'}, []byte{'C'}, []byte{'E'}}
|
||||||
)
|
)
|
||||||
|
|
||||||
// setupKeys sets the cipher and MAC keys from kex.K, kex.H and sessionId, as
|
// setupKeys sets the cipher and MAC keys from kex.K, kex.H and sessionId, as
|
||||||
// described in RFC 4253, section 6.4. direction should either be serverKeys
|
// described in RFC 4253, section 6.4. direction should either be serverKeys
|
||||||
// (to setup server->client keys) or clientKeys (for client->server keys).
|
// (to setup server->client keys) or clientKeys (for client->server keys).
|
||||||
func newPacketCipher(d direction, algs directionAlgorithms, kex *kexResult) (packetCipher, error) {
|
func newPacketCipher(d direction, algs directionAlgorithms, kex *kexResult) (packetCipher, error) {
|
||||||
cipherMode := cipherModes[algs.Cipher]
|
cipherMode := cipherModes[algs.Cipher]
|
||||||
macMode := macModes[algs.MAC]
|
macMode := macModes[algs.MAC]
|
||||||
|
|
||||||
iv := make([]byte, cipherMode.ivSize)
|
iv := make([]byte, cipherMode.ivSize)
|
||||||
key := make([]byte, cipherMode.keySize)
|
key := make([]byte, cipherMode.keySize)
|
||||||
macKey := make([]byte, macMode.keySize)
|
macKey := make([]byte, macMode.keySize)
|
||||||
|
|
||||||
generateKeyMaterial(iv, d.ivTag, kex)
|
generateKeyMaterial(iv, d.ivTag, kex)
|
||||||
generateKeyMaterial(key, d.keyTag, kex)
|
generateKeyMaterial(key, d.keyTag, kex)
|
||||||
generateKeyMaterial(macKey, d.macKeyTag, kex)
|
generateKeyMaterial(macKey, d.macKeyTag, kex)
|
||||||
|
|
||||||
return cipherModes[algs.Cipher].create(key, iv, macKey, algs)
|
return cipherModes[algs.Cipher].create(key, iv, macKey, algs)
|
||||||
}
|
}
|
||||||
|
|
||||||
// generateKeyMaterial fills out with key material generated from tag, K, H
|
// generateKeyMaterial fills out with key material generated from tag, K, H
|
||||||
// and sessionId, as specified in RFC 4253, section 7.2.
|
// and sessionId, as specified in RFC 4253, section 7.2.
|
||||||
func generateKeyMaterial(out, tag []byte, r *kexResult) {
|
func generateKeyMaterial(out, tag []byte, r *kexResult) {
|
||||||
var digestsSoFar []byte
|
var digestsSoFar []byte
|
||||||
|
|
||||||
h := r.Hash.New()
|
h := r.Hash.New()
|
||||||
for len(out) > 0 {
|
for len(out) > 0 {
|
||||||
h.Reset()
|
h.Reset()
|
||||||
h.Write(r.K)
|
h.Write(r.K)
|
||||||
h.Write(r.H)
|
h.Write(r.H)
|
||||||
|
|
||||||
if len(digestsSoFar) == 0 {
|
if len(digestsSoFar) == 0 {
|
||||||
h.Write(tag)
|
h.Write(tag)
|
||||||
h.Write(r.SessionID)
|
h.Write(r.SessionID)
|
||||||
} else {
|
} else {
|
||||||
h.Write(digestsSoFar)
|
h.Write(digestsSoFar)
|
||||||
}
|
}
|
||||||
|
|
||||||
digest := h.Sum(nil)
|
digest := h.Sum(nil)
|
||||||
n := copy(out, digest)
|
n := copy(out, digest)
|
||||||
out = out[n:]
|
out = out[n:]
|
||||||
if len(out) > 0 {
|
if len(out) > 0 {
|
||||||
digestsSoFar = append(digestsSoFar, digest...)
|
digestsSoFar = append(digestsSoFar, digest...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const packageVersion = "SSH-2.0-Go"
|
const packageVersion = "SSH-2.0-Go"
|
||||||
|
|
||||||
// Sends and receives a version line. The versionLine string should
|
// Sends and receives a version line. The versionLine string should
|
||||||
// be US ASCII, start with "SSH-2.0-", and should not include a
|
// be US ASCII, start with "SSH-2.0-", and should not include a
|
||||||
// newline. exchangeVersions returns the other side's version line.
|
// newline. exchangeVersions returns the other side's version line.
|
||||||
func exchangeVersions(rw io.ReadWriter, versionLine []byte) (them []byte, err error) {
|
func exchangeVersions(rw io.ReadWriter, versionLine []byte) (them []byte, err error) {
|
||||||
// Contrary to the RFC, we do not ignore lines that don't
|
// Contrary to the RFC, we do not ignore lines that don't
|
||||||
// start with "SSH-2.0-" to make the library usable with
|
// start with "SSH-2.0-" to make the library usable with
|
||||||
// nonconforming servers.
|
// nonconforming servers.
|
||||||
for _, c := range versionLine {
|
for _, c := range versionLine {
|
||||||
// The spec disallows non US-ASCII chars, and
|
// The spec disallows non US-ASCII chars, and
|
||||||
// specifically forbids null chars.
|
// specifically forbids null chars.
|
||||||
if c < 32 {
|
if c < 32 {
|
||||||
return nil, errors.New("ssh: junk character in version line")
|
return nil, errors.New("ssh: junk character in version line")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if _, err = rw.Write(append(versionLine, '\r', '\n')); err != nil {
|
if _, err = rw.Write(append(versionLine, '\r', '\n')); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
them, err = readVersion(rw)
|
them, err = readVersion(rw)
|
||||||
return them, err
|
return them, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// maxVersionStringBytes is the maximum number of bytes that we'll
|
// maxVersionStringBytes is the maximum number of bytes that we'll
|
||||||
// accept as a version string. RFC 4253 section 4.2 limits this at 255
|
// accept as a version string. RFC 4253 section 4.2 limits this at 255
|
||||||
// chars
|
// chars
|
||||||
const maxVersionStringBytes = 255
|
const maxVersionStringBytes = 255
|
||||||
|
|
||||||
// Read version string as specified by RFC 4253, section 4.2.
|
// Read version string as specified by RFC 4253, section 4.2.
|
||||||
func readVersion(r io.Reader) ([]byte, error) {
|
func readVersion(r io.Reader) ([]byte, error) {
|
||||||
versionString := make([]byte, 0, 64)
|
versionString := make([]byte, 0, 64)
|
||||||
var ok bool
|
var ok bool
|
||||||
var buf [1]byte
|
var buf [1]byte
|
||||||
|
|
||||||
for length := 0; length < maxVersionStringBytes; length++ {
|
for length := 0; length < maxVersionStringBytes; length++ {
|
||||||
_, err := io.ReadFull(r, buf[:])
|
_, err := io.ReadFull(r, buf[:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
// The RFC says that the version should be terminated with \r\n
|
// The RFC says that the version should be terminated with \r\n
|
||||||
// but several SSH servers actually only send a \n.
|
// but several SSH servers actually only send a \n.
|
||||||
if buf[0] == '\n' {
|
if buf[0] == '\n' {
|
||||||
if !bytes.HasPrefix(versionString, []byte("SSH-")) {
|
if !bytes.HasPrefix(versionString, []byte("SSH-")) {
|
||||||
// RFC 4253 says we need to ignore all version string lines
|
// RFC 4253 says we need to ignore all version string lines
|
||||||
// except the one containing the SSH version (provided that
|
// except the one containing the SSH version (provided that
|
||||||
// all the lines do not exceed 255 bytes in total).
|
// all the lines do not exceed 255 bytes in total).
|
||||||
versionString = versionString[:0]
|
versionString = versionString[:0]
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
ok = true
|
ok = true
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
// non ASCII chars are disallowed, but we are lenient,
|
// non ASCII chars are disallowed, but we are lenient,
|
||||||
// since Go doesn't use null-terminated strings.
|
// since Go doesn't use null-terminated strings.
|
||||||
|
|
||||||
// The RFC allows a comment after a space, however,
|
// The RFC allows a comment after a space, however,
|
||||||
// all of it (version and comments) goes into the
|
// all of it (version and comments) goes into the
|
||||||
// session hash.
|
// session hash.
|
||||||
versionString = append(versionString, buf[0])
|
versionString = append(versionString, buf[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("ssh: overflow reading version string")
|
return nil, errors.New("ssh: overflow reading version string")
|
||||||
}
|
}
|
||||||
|
|
||||||
// There might be a '\r' on the end which we should remove.
|
// There might be a '\r' on the end which we should remove.
|
||||||
if len(versionString) > 0 && versionString[len(versionString)-1] == '\r' {
|
if len(versionString) > 0 && versionString[len(versionString)-1] == '\r' {
|
||||||
versionString = versionString[:len(versionString)-1]
|
versionString = versionString[:len(versionString)-1]
|
||||||
}
|
}
|
||||||
return versionString, nil
|
return versionString, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,71 +1,71 @@
|
||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// Package ctxhttp provides helper functions for performing context-aware HTTP requests.
|
// Package ctxhttp provides helper functions for performing context-aware HTTP requests.
|
||||||
package ctxhttp // import "golang.org/x/net/context/ctxhttp"
|
package ctxhttp // import "golang.org/x/net/context/ctxhttp"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Do sends an HTTP request with the provided http.Client and returns
|
// Do sends an HTTP request with the provided http.Client and returns
|
||||||
// an HTTP response.
|
// an HTTP response.
|
||||||
//
|
//
|
||||||
// If the client is nil, http.DefaultClient is used.
|
// If the client is nil, http.DefaultClient is used.
|
||||||
//
|
//
|
||||||
// The provided ctx must be non-nil. If it is canceled or times out,
|
// The provided ctx must be non-nil. If it is canceled or times out,
|
||||||
// ctx.Err() will be returned.
|
// ctx.Err() will be returned.
|
||||||
func Do(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) {
|
func Do(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) {
|
||||||
if client == nil {
|
if client == nil {
|
||||||
client = http.DefaultClient
|
client = http.DefaultClient
|
||||||
}
|
}
|
||||||
resp, err := client.Do(req.WithContext(ctx))
|
resp, err := client.Do(req.WithContext(ctx))
|
||||||
// If we got an error, and the context has been canceled,
|
// If we got an error, and the context has been canceled,
|
||||||
// the context's error is probably more useful.
|
// the context's error is probably more useful.
|
||||||
if err != nil {
|
if err != nil {
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
err = ctx.Err()
|
err = ctx.Err()
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get issues a GET request via the Do function.
|
// Get issues a GET request via the Do function.
|
||||||
func Get(ctx context.Context, client *http.Client, url string) (*http.Response, error) {
|
func Get(ctx context.Context, client *http.Client, url string) (*http.Response, error) {
|
||||||
req, err := http.NewRequest("GET", url, nil)
|
req, err := http.NewRequest("GET", url, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return Do(ctx, client, req)
|
return Do(ctx, client, req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Head issues a HEAD request via the Do function.
|
// Head issues a HEAD request via the Do function.
|
||||||
func Head(ctx context.Context, client *http.Client, url string) (*http.Response, error) {
|
func Head(ctx context.Context, client *http.Client, url string) (*http.Response, error) {
|
||||||
req, err := http.NewRequest("HEAD", url, nil)
|
req, err := http.NewRequest("HEAD", url, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return Do(ctx, client, req)
|
return Do(ctx, client, req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Post issues a POST request via the Do function.
|
// Post issues a POST request via the Do function.
|
||||||
func Post(ctx context.Context, client *http.Client, url string, bodyType string, body io.Reader) (*http.Response, error) {
|
func Post(ctx context.Context, client *http.Client, url string, bodyType string, body io.Reader) (*http.Response, error) {
|
||||||
req, err := http.NewRequest("POST", url, body)
|
req, err := http.NewRequest("POST", url, body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
req.Header.Set("Content-Type", bodyType)
|
req.Header.Set("Content-Type", bodyType)
|
||||||
return Do(ctx, client, req)
|
return Do(ctx, client, req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PostForm issues a POST request via the Do function.
|
// PostForm issues a POST request via the Do function.
|
||||||
func PostForm(ctx context.Context, client *http.Client, url string, data url.Values) (*http.Response, error) {
|
func PostForm(ctx context.Context, client *http.Client, url string, data url.Values) (*http.Response, error) {
|
||||||
return Post(ctx, client, url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode()))
|
return Post(ctx, client, url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode()))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,739 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
|
||||||
|
|
||||||
// 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 go1.10
|
|
||||||
|
|
||||||
// Package idna implements IDNA2008 using the compatibility processing
|
|
||||||
// defined by UTS (Unicode Technical Standard) #46, which defines a standard to
|
|
||||||
// deal with the transition from IDNA2003.
|
|
||||||
//
|
|
||||||
// IDNA2008 (Internationalized Domain Names for Applications), is defined in RFC
|
|
||||||
// 5890, RFC 5891, RFC 5892, RFC 5893 and RFC 5894.
|
|
||||||
// UTS #46 is defined in https://www.unicode.org/reports/tr46.
|
|
||||||
// See https://unicode.org/cldr/utility/idna.jsp for a visualization of the
|
|
||||||
// differences between these two standards.
|
|
||||||
package idna // import "golang.org/x/net/idna"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
"unicode/utf8"
|
|
||||||
|
|
||||||
"golang.org/x/text/secure/bidirule"
|
|
||||||
"golang.org/x/text/unicode/bidi"
|
|
||||||
"golang.org/x/text/unicode/norm"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NOTE: Unlike common practice in Go APIs, the functions will return a
|
|
||||||
// sanitized domain name in case of errors. Browsers sometimes use a partially
|
|
||||||
// evaluated string as lookup.
|
|
||||||
// TODO: the current error handling is, in my opinion, the least opinionated.
|
|
||||||
// Other strategies are also viable, though:
|
|
||||||
// Option 1) Return an empty string in case of error, but allow the user to
|
|
||||||
// specify explicitly which errors to ignore.
|
|
||||||
// Option 2) Return the partially evaluated string if it is itself a valid
|
|
||||||
// string, otherwise return the empty string in case of error.
|
|
||||||
// Option 3) Option 1 and 2.
|
|
||||||
// Option 4) Always return an empty string for now and implement Option 1 as
|
|
||||||
// needed, and document that the return string may not be empty in case of
|
|
||||||
// error in the future.
|
|
||||||
// I think Option 1 is best, but it is quite opinionated.
|
|
||||||
|
|
||||||
// ToASCII is a wrapper for Punycode.ToASCII.
|
|
||||||
func ToASCII(s string) (string, error) {
|
|
||||||
return Punycode.process(s, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ToUnicode is a wrapper for Punycode.ToUnicode.
|
|
||||||
func ToUnicode(s string) (string, error) {
|
|
||||||
return Punycode.process(s, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
// An Option configures a Profile at creation time.
|
|
||||||
type Option func(*options)
|
|
||||||
|
|
||||||
// Transitional sets a Profile to use the Transitional mapping as defined in UTS
|
|
||||||
// #46. This will cause, for example, "ß" to be mapped to "ss". Using the
|
|
||||||
// transitional mapping provides a compromise between IDNA2003 and IDNA2008
|
|
||||||
// compatibility. It is used by most browsers when resolving domain names. This
|
|
||||||
// option is only meaningful if combined with MapForLookup.
|
|
||||||
func Transitional(transitional bool) Option {
|
|
||||||
return func(o *options) { o.transitional = true }
|
|
||||||
}
|
|
||||||
|
|
||||||
// VerifyDNSLength sets whether a Profile should fail if any of the IDN parts
|
|
||||||
// are longer than allowed by the RFC.
|
|
||||||
func VerifyDNSLength(verify bool) Option {
|
|
||||||
return func(o *options) { o.verifyDNSLength = verify }
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveLeadingDots removes leading label separators. Leading runes that map to
|
|
||||||
// dots, such as U+3002 IDEOGRAPHIC FULL STOP, are removed as well.
|
|
||||||
//
|
|
||||||
// This is the behavior suggested by the UTS #46 and is adopted by some
|
|
||||||
// browsers.
|
|
||||||
func RemoveLeadingDots(remove bool) Option {
|
|
||||||
return func(o *options) { o.removeLeadingDots = remove }
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidateLabels sets whether to check the mandatory label validation criteria
|
|
||||||
// as defined in Section 5.4 of RFC 5891. This includes testing for correct use
|
|
||||||
// of hyphens ('-'), normalization, validity of runes, and the context rules.
|
|
||||||
func ValidateLabels(enable bool) Option {
|
|
||||||
return func(o *options) {
|
|
||||||
// Don't override existing mappings, but set one that at least checks
|
|
||||||
// normalization if it is not set.
|
|
||||||
if o.mapping == nil && enable {
|
|
||||||
o.mapping = normalize
|
|
||||||
}
|
|
||||||
o.trie = trie
|
|
||||||
o.validateLabels = enable
|
|
||||||
o.fromPuny = validateFromPunycode
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// StrictDomainName limits the set of permissible ASCII characters to those
|
|
||||||
// allowed in domain names as defined in RFC 1034 (A-Z, a-z, 0-9 and the
|
|
||||||
// hyphen). This is set by default for MapForLookup and ValidateForRegistration.
|
|
||||||
//
|
|
||||||
// This option is useful, for instance, for browsers that allow characters
|
|
||||||
// outside this range, for example a '_' (U+005F LOW LINE). See
|
|
||||||
// http://www.rfc-editor.org/std/std3.txt for more details This option
|
|
||||||
// corresponds to the UseSTD3ASCIIRules option in UTS #46.
|
|
||||||
func StrictDomainName(use bool) Option {
|
|
||||||
return func(o *options) {
|
|
||||||
o.trie = trie
|
|
||||||
o.useSTD3Rules = use
|
|
||||||
o.fromPuny = validateFromPunycode
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: the following options pull in tables. The tables should not be linked
|
|
||||||
// in as long as the options are not used.
|
|
||||||
|
|
||||||
// BidiRule enables the Bidi rule as defined in RFC 5893. Any application
|
|
||||||
// that relies on proper validation of labels should include this rule.
|
|
||||||
func BidiRule() Option {
|
|
||||||
return func(o *options) { o.bidirule = bidirule.ValidString }
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidateForRegistration sets validation options to verify that a given IDN is
|
|
||||||
// properly formatted for registration as defined by Section 4 of RFC 5891.
|
|
||||||
func ValidateForRegistration() Option {
|
|
||||||
return func(o *options) {
|
|
||||||
o.mapping = validateRegistration
|
|
||||||
StrictDomainName(true)(o)
|
|
||||||
ValidateLabels(true)(o)
|
|
||||||
VerifyDNSLength(true)(o)
|
|
||||||
BidiRule()(o)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MapForLookup sets validation and mapping options such that a given IDN is
|
|
||||||
// transformed for domain name lookup according to the requirements set out in
|
|
||||||
// Section 5 of RFC 5891. The mappings follow the recommendations of RFC 5894,
|
|
||||||
// RFC 5895 and UTS 46. It does not add the Bidi Rule. Use the BidiRule option
|
|
||||||
// to add this check.
|
|
||||||
//
|
|
||||||
// The mappings include normalization and mapping case, width and other
|
|
||||||
// compatibility mappings.
|
|
||||||
func MapForLookup() Option {
|
|
||||||
return func(o *options) {
|
|
||||||
o.mapping = validateAndMap
|
|
||||||
StrictDomainName(true)(o)
|
|
||||||
ValidateLabels(true)(o)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type options struct {
|
|
||||||
transitional bool
|
|
||||||
useSTD3Rules bool
|
|
||||||
validateLabels bool
|
|
||||||
verifyDNSLength bool
|
|
||||||
removeLeadingDots bool
|
|
||||||
|
|
||||||
trie *idnaTrie
|
|
||||||
|
|
||||||
// fromPuny calls validation rules when converting A-labels to U-labels.
|
|
||||||
fromPuny func(p *Profile, s string) error
|
|
||||||
|
|
||||||
// mapping implements a validation and mapping step as defined in RFC 5895
|
|
||||||
// or UTS 46, tailored to, for example, domain registration or lookup.
|
|
||||||
mapping func(p *Profile, s string) (mapped string, isBidi bool, err error)
|
|
||||||
|
|
||||||
// bidirule, if specified, checks whether s conforms to the Bidi Rule
|
|
||||||
// defined in RFC 5893.
|
|
||||||
bidirule func(s string) bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// A Profile defines the configuration of an IDNA mapper.
|
|
||||||
type Profile struct {
|
|
||||||
options
|
|
||||||
}
|
|
||||||
|
|
||||||
func apply(o *options, opts []Option) {
|
|
||||||
for _, f := range opts {
|
|
||||||
f(o)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// New creates a new Profile.
|
|
||||||
//
|
|
||||||
// With no options, the returned Profile is the most permissive and equals the
|
|
||||||
// Punycode Profile. Options can be passed to further restrict the Profile. The
|
|
||||||
// MapForLookup and ValidateForRegistration options set a collection of options,
|
|
||||||
// for lookup and registration purposes respectively, which can be tailored by
|
|
||||||
// adding more fine-grained options, where later options override earlier
|
|
||||||
// options.
|
|
||||||
func New(o ...Option) *Profile {
|
|
||||||
p := &Profile{}
|
|
||||||
apply(&p.options, o)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// ToASCII converts a domain or domain label to its ASCII form. For example,
|
|
||||||
// ToASCII("bücher.example.com") is "xn--bcher-kva.example.com", and
|
|
||||||
// ToASCII("golang") is "golang". If an error is encountered it will return
|
|
||||||
// an error and a (partially) processed result.
|
|
||||||
func (p *Profile) ToASCII(s string) (string, error) {
|
|
||||||
return p.process(s, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ToUnicode converts a domain or domain label to its Unicode form. For example,
|
|
||||||
// ToUnicode("xn--bcher-kva.example.com") is "bücher.example.com", and
|
|
||||||
// ToUnicode("golang") is "golang". If an error is encountered it will return
|
|
||||||
// an error and a (partially) processed result.
|
|
||||||
func (p *Profile) ToUnicode(s string) (string, error) {
|
|
||||||
pp := *p
|
|
||||||
pp.transitional = false
|
|
||||||
return pp.process(s, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
// String reports a string with a description of the profile for debugging
|
|
||||||
// purposes. The string format may change with different versions.
|
|
||||||
func (p *Profile) String() string {
|
|
||||||
s := ""
|
|
||||||
if p.transitional {
|
|
||||||
s = "Transitional"
|
|
||||||
} else {
|
|
||||||
s = "NonTransitional"
|
|
||||||
}
|
|
||||||
if p.useSTD3Rules {
|
|
||||||
s += ":UseSTD3Rules"
|
|
||||||
}
|
|
||||||
if p.validateLabels {
|
|
||||||
s += ":ValidateLabels"
|
|
||||||
}
|
|
||||||
if p.verifyDNSLength {
|
|
||||||
s += ":VerifyDNSLength"
|
|
||||||
}
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
// Punycode is a Profile that does raw punycode processing with a minimum
|
|
||||||
// of validation.
|
|
||||||
Punycode *Profile = punycode
|
|
||||||
|
|
||||||
// Lookup is the recommended profile for looking up domain names, according
|
|
||||||
// to Section 5 of RFC 5891. The exact configuration of this profile may
|
|
||||||
// change over time.
|
|
||||||
Lookup *Profile = lookup
|
|
||||||
|
|
||||||
// Display is the recommended profile for displaying domain names.
|
|
||||||
// The configuration of this profile may change over time.
|
|
||||||
Display *Profile = display
|
|
||||||
|
|
||||||
// Registration is the recommended profile for checking whether a given
|
|
||||||
// IDN is valid for registration, according to Section 4 of RFC 5891.
|
|
||||||
Registration *Profile = registration
|
|
||||||
|
|
||||||
punycode = &Profile{}
|
|
||||||
lookup = &Profile{options{
|
|
||||||
transitional: true,
|
|
||||||
useSTD3Rules: true,
|
|
||||||
validateLabels: true,
|
|
||||||
trie: trie,
|
|
||||||
fromPuny: validateFromPunycode,
|
|
||||||
mapping: validateAndMap,
|
|
||||||
bidirule: bidirule.ValidString,
|
|
||||||
}}
|
|
||||||
display = &Profile{options{
|
|
||||||
useSTD3Rules: true,
|
|
||||||
validateLabels: true,
|
|
||||||
trie: trie,
|
|
||||||
fromPuny: validateFromPunycode,
|
|
||||||
mapping: validateAndMap,
|
|
||||||
bidirule: bidirule.ValidString,
|
|
||||||
}}
|
|
||||||
registration = &Profile{options{
|
|
||||||
useSTD3Rules: true,
|
|
||||||
validateLabels: true,
|
|
||||||
verifyDNSLength: true,
|
|
||||||
trie: trie,
|
|
||||||
fromPuny: validateFromPunycode,
|
|
||||||
mapping: validateRegistration,
|
|
||||||
bidirule: bidirule.ValidString,
|
|
||||||
}}
|
|
||||||
|
|
||||||
// TODO: profiles
|
|
||||||
// Register: recommended for approving domain names: don't do any mappings
|
|
||||||
// but rather reject on invalid input. Bundle or block deviation characters.
|
|
||||||
)
|
|
||||||
|
|
||||||
type labelError struct{ label, code_ string }
|
|
||||||
|
|
||||||
func (e labelError) code() string { return e.code_ }
|
|
||||||
func (e labelError) Error() string {
|
|
||||||
return fmt.Sprintf("idna: invalid label %q", e.label)
|
|
||||||
}
|
|
||||||
|
|
||||||
type runeError rune
|
|
||||||
|
|
||||||
func (e runeError) code() string { return "P1" }
|
|
||||||
func (e runeError) Error() string {
|
|
||||||
return fmt.Sprintf("idna: disallowed rune %U", e)
|
|
||||||
}
|
|
||||||
|
|
||||||
// process implements the algorithm described in section 4 of UTS #46,
|
|
||||||
// see https://www.unicode.org/reports/tr46.
|
|
||||||
func (p *Profile) process(s string, toASCII bool) (string, error) {
|
|
||||||
var err error
|
|
||||||
var isBidi bool
|
|
||||||
if p.mapping != nil {
|
|
||||||
s, isBidi, err = p.mapping(p, s)
|
|
||||||
}
|
|
||||||
// Remove leading empty labels.
|
|
||||||
if p.removeLeadingDots {
|
|
||||||
for ; len(s) > 0 && s[0] == '.'; s = s[1:] {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// TODO: allow for a quick check of the tables data.
|
|
||||||
// It seems like we should only create this error on ToASCII, but the
|
|
||||||
// UTS 46 conformance tests suggests we should always check this.
|
|
||||||
if err == nil && p.verifyDNSLength && s == "" {
|
|
||||||
err = &labelError{s, "A4"}
|
|
||||||
}
|
|
||||||
labels := labelIter{orig: s}
|
|
||||||
for ; !labels.done(); labels.next() {
|
|
||||||
label := labels.label()
|
|
||||||
if label == "" {
|
|
||||||
// Empty labels are not okay. The label iterator skips the last
|
|
||||||
// label if it is empty.
|
|
||||||
if err == nil && p.verifyDNSLength {
|
|
||||||
err = &labelError{s, "A4"}
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if strings.HasPrefix(label, acePrefix) {
|
|
||||||
u, err2 := decode(label[len(acePrefix):])
|
|
||||||
if err2 != nil {
|
|
||||||
if err == nil {
|
|
||||||
err = err2
|
|
||||||
}
|
|
||||||
// Spec says keep the old label.
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
isBidi = isBidi || bidirule.DirectionString(u) != bidi.LeftToRight
|
|
||||||
labels.set(u)
|
|
||||||
if err == nil && p.validateLabels {
|
|
||||||
err = p.fromPuny(p, u)
|
|
||||||
}
|
|
||||||
if err == nil {
|
|
||||||
// This should be called on NonTransitional, according to the
|
|
||||||
// spec, but that currently does not have any effect. Use the
|
|
||||||
// original profile to preserve options.
|
|
||||||
err = p.validateLabel(u)
|
|
||||||
}
|
|
||||||
} else if err == nil {
|
|
||||||
err = p.validateLabel(label)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if isBidi && p.bidirule != nil && err == nil {
|
|
||||||
for labels.reset(); !labels.done(); labels.next() {
|
|
||||||
if !p.bidirule(labels.label()) {
|
|
||||||
err = &labelError{s, "B"}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if toASCII {
|
|
||||||
for labels.reset(); !labels.done(); labels.next() {
|
|
||||||
label := labels.label()
|
|
||||||
if !ascii(label) {
|
|
||||||
a, err2 := encode(acePrefix, label)
|
|
||||||
if err == nil {
|
|
||||||
err = err2
|
|
||||||
}
|
|
||||||
label = a
|
|
||||||
labels.set(a)
|
|
||||||
}
|
|
||||||
n := len(label)
|
|
||||||
if p.verifyDNSLength && err == nil && (n == 0 || n > 63) {
|
|
||||||
err = &labelError{label, "A4"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s = labels.result()
|
|
||||||
if toASCII && p.verifyDNSLength && err == nil {
|
|
||||||
// Compute the length of the domain name minus the root label and its dot.
|
|
||||||
n := len(s)
|
|
||||||
if n > 0 && s[n-1] == '.' {
|
|
||||||
n--
|
|
||||||
}
|
|
||||||
if len(s) < 1 || n > 253 {
|
|
||||||
err = &labelError{s, "A4"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return s, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func normalize(p *Profile, s string) (mapped string, isBidi bool, err error) {
|
|
||||||
// TODO: consider first doing a quick check to see if any of these checks
|
|
||||||
// need to be done. This will make it slower in the general case, but
|
|
||||||
// faster in the common case.
|
|
||||||
mapped = norm.NFC.String(s)
|
|
||||||
isBidi = bidirule.DirectionString(mapped) == bidi.RightToLeft
|
|
||||||
return mapped, isBidi, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func validateRegistration(p *Profile, s string) (idem string, bidi bool, err error) {
|
|
||||||
// TODO: filter need for normalization in loop below.
|
|
||||||
if !norm.NFC.IsNormalString(s) {
|
|
||||||
return s, false, &labelError{s, "V1"}
|
|
||||||
}
|
|
||||||
for i := 0; i < len(s); {
|
|
||||||
v, sz := trie.lookupString(s[i:])
|
|
||||||
if sz == 0 {
|
|
||||||
return s, bidi, runeError(utf8.RuneError)
|
|
||||||
}
|
|
||||||
bidi = bidi || info(v).isBidi(s[i:])
|
|
||||||
// Copy bytes not copied so far.
|
|
||||||
switch p.simplify(info(v).category()) {
|
|
||||||
// TODO: handle the NV8 defined in the Unicode idna data set to allow
|
|
||||||
// for strict conformance to IDNA2008.
|
|
||||||
case valid, deviation:
|
|
||||||
case disallowed, mapped, unknown, ignored:
|
|
||||||
r, _ := utf8.DecodeRuneInString(s[i:])
|
|
||||||
return s, bidi, runeError(r)
|
|
||||||
}
|
|
||||||
i += sz
|
|
||||||
}
|
|
||||||
return s, bidi, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c info) isBidi(s string) bool {
|
|
||||||
if !c.isMapped() {
|
|
||||||
return c&attributesMask == rtl
|
|
||||||
}
|
|
||||||
// TODO: also store bidi info for mapped data. This is possible, but a bit
|
|
||||||
// cumbersome and not for the common case.
|
|
||||||
p, _ := bidi.LookupString(s)
|
|
||||||
switch p.Class() {
|
|
||||||
case bidi.R, bidi.AL, bidi.AN:
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func validateAndMap(p *Profile, s string) (vm string, bidi bool, err error) {
|
|
||||||
var (
|
|
||||||
b []byte
|
|
||||||
k int
|
|
||||||
)
|
|
||||||
// combinedInfoBits contains the or-ed bits of all runes. We use this
|
|
||||||
// to derive the mayNeedNorm bit later. This may trigger normalization
|
|
||||||
// overeagerly, but it will not do so in the common case. The end result
|
|
||||||
// is another 10% saving on BenchmarkProfile for the common case.
|
|
||||||
var combinedInfoBits info
|
|
||||||
for i := 0; i < len(s); {
|
|
||||||
v, sz := trie.lookupString(s[i:])
|
|
||||||
if sz == 0 {
|
|
||||||
b = append(b, s[k:i]...)
|
|
||||||
b = append(b, "\ufffd"...)
|
|
||||||
k = len(s)
|
|
||||||
if err == nil {
|
|
||||||
err = runeError(utf8.RuneError)
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
combinedInfoBits |= info(v)
|
|
||||||
bidi = bidi || info(v).isBidi(s[i:])
|
|
||||||
start := i
|
|
||||||
i += sz
|
|
||||||
// Copy bytes not copied so far.
|
|
||||||
switch p.simplify(info(v).category()) {
|
|
||||||
case valid:
|
|
||||||
continue
|
|
||||||
case disallowed:
|
|
||||||
if err == nil {
|
|
||||||
r, _ := utf8.DecodeRuneInString(s[start:])
|
|
||||||
err = runeError(r)
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
case mapped, deviation:
|
|
||||||
b = append(b, s[k:start]...)
|
|
||||||
b = info(v).appendMapping(b, s[start:i])
|
|
||||||
case ignored:
|
|
||||||
b = append(b, s[k:start]...)
|
|
||||||
// drop the rune
|
|
||||||
case unknown:
|
|
||||||
b = append(b, s[k:start]...)
|
|
||||||
b = append(b, "\ufffd"...)
|
|
||||||
}
|
|
||||||
k = i
|
|
||||||
}
|
|
||||||
if k == 0 {
|
|
||||||
// No changes so far.
|
|
||||||
if combinedInfoBits&mayNeedNorm != 0 {
|
|
||||||
s = norm.NFC.String(s)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
b = append(b, s[k:]...)
|
|
||||||
if norm.NFC.QuickSpan(b) != len(b) {
|
|
||||||
b = norm.NFC.Bytes(b)
|
|
||||||
}
|
|
||||||
// TODO: the punycode converters require strings as input.
|
|
||||||
s = string(b)
|
|
||||||
}
|
|
||||||
return s, bidi, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// A labelIter allows iterating over domain name labels.
|
|
||||||
type labelIter struct {
|
|
||||||
orig string
|
|
||||||
slice []string
|
|
||||||
curStart int
|
|
||||||
curEnd int
|
|
||||||
i int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *labelIter) reset() {
|
|
||||||
l.curStart = 0
|
|
||||||
l.curEnd = 0
|
|
||||||
l.i = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *labelIter) done() bool {
|
|
||||||
return l.curStart >= len(l.orig)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *labelIter) result() string {
|
|
||||||
if l.slice != nil {
|
|
||||||
return strings.Join(l.slice, ".")
|
|
||||||
}
|
|
||||||
return l.orig
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *labelIter) label() string {
|
|
||||||
if l.slice != nil {
|
|
||||||
return l.slice[l.i]
|
|
||||||
}
|
|
||||||
p := strings.IndexByte(l.orig[l.curStart:], '.')
|
|
||||||
l.curEnd = l.curStart + p
|
|
||||||
if p == -1 {
|
|
||||||
l.curEnd = len(l.orig)
|
|
||||||
}
|
|
||||||
return l.orig[l.curStart:l.curEnd]
|
|
||||||
}
|
|
||||||
|
|
||||||
// next sets the value to the next label. It skips the last label if it is empty.
|
|
||||||
func (l *labelIter) next() {
|
|
||||||
l.i++
|
|
||||||
if l.slice != nil {
|
|
||||||
if l.i >= len(l.slice) || l.i == len(l.slice)-1 && l.slice[l.i] == "" {
|
|
||||||
l.curStart = len(l.orig)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
l.curStart = l.curEnd + 1
|
|
||||||
if l.curStart == len(l.orig)-1 && l.orig[l.curStart] == '.' {
|
|
||||||
l.curStart = len(l.orig)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *labelIter) set(s string) {
|
|
||||||
if l.slice == nil {
|
|
||||||
l.slice = strings.Split(l.orig, ".")
|
|
||||||
}
|
|
||||||
l.slice[l.i] = s
|
|
||||||
}
|
|
||||||
|
|
||||||
// acePrefix is the ASCII Compatible Encoding prefix.
|
|
||||||
const acePrefix = "xn--"
|
|
||||||
|
|
||||||
func (p *Profile) simplify(cat category) category {
|
|
||||||
switch cat {
|
|
||||||
case disallowedSTD3Mapped:
|
|
||||||
if p.useSTD3Rules {
|
|
||||||
cat = disallowed
|
|
||||||
} else {
|
|
||||||
cat = mapped
|
|
||||||
}
|
|
||||||
case disallowedSTD3Valid:
|
|
||||||
if p.useSTD3Rules {
|
|
||||||
cat = disallowed
|
|
||||||
} else {
|
|
||||||
cat = valid
|
|
||||||
}
|
|
||||||
case deviation:
|
|
||||||
if !p.transitional {
|
|
||||||
cat = valid
|
|
||||||
}
|
|
||||||
case validNV8, validXV8:
|
|
||||||
// TODO: handle V2008
|
|
||||||
cat = valid
|
|
||||||
}
|
|
||||||
return cat
|
|
||||||
}
|
|
||||||
|
|
||||||
func validateFromPunycode(p *Profile, s string) error {
|
|
||||||
if !norm.NFC.IsNormalString(s) {
|
|
||||||
return &labelError{s, "V1"}
|
|
||||||
}
|
|
||||||
// TODO: detect whether string may have to be normalized in the following
|
|
||||||
// loop.
|
|
||||||
for i := 0; i < len(s); {
|
|
||||||
v, sz := trie.lookupString(s[i:])
|
|
||||||
if sz == 0 {
|
|
||||||
return runeError(utf8.RuneError)
|
|
||||||
}
|
|
||||||
if c := p.simplify(info(v).category()); c != valid && c != deviation {
|
|
||||||
return &labelError{s, "V6"}
|
|
||||||
}
|
|
||||||
i += sz
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
zwnj = "\u200c"
|
|
||||||
zwj = "\u200d"
|
|
||||||
)
|
|
||||||
|
|
||||||
type joinState int8
|
|
||||||
|
|
||||||
const (
|
|
||||||
stateStart joinState = iota
|
|
||||||
stateVirama
|
|
||||||
stateBefore
|
|
||||||
stateBeforeVirama
|
|
||||||
stateAfter
|
|
||||||
stateFAIL
|
|
||||||
)
|
|
||||||
|
|
||||||
var joinStates = [][numJoinTypes]joinState{
|
|
||||||
stateStart: {
|
|
||||||
joiningL: stateBefore,
|
|
||||||
joiningD: stateBefore,
|
|
||||||
joinZWNJ: stateFAIL,
|
|
||||||
joinZWJ: stateFAIL,
|
|
||||||
joinVirama: stateVirama,
|
|
||||||
},
|
|
||||||
stateVirama: {
|
|
||||||
joiningL: stateBefore,
|
|
||||||
joiningD: stateBefore,
|
|
||||||
},
|
|
||||||
stateBefore: {
|
|
||||||
joiningL: stateBefore,
|
|
||||||
joiningD: stateBefore,
|
|
||||||
joiningT: stateBefore,
|
|
||||||
joinZWNJ: stateAfter,
|
|
||||||
joinZWJ: stateFAIL,
|
|
||||||
joinVirama: stateBeforeVirama,
|
|
||||||
},
|
|
||||||
stateBeforeVirama: {
|
|
||||||
joiningL: stateBefore,
|
|
||||||
joiningD: stateBefore,
|
|
||||||
joiningT: stateBefore,
|
|
||||||
},
|
|
||||||
stateAfter: {
|
|
||||||
joiningL: stateFAIL,
|
|
||||||
joiningD: stateBefore,
|
|
||||||
joiningT: stateAfter,
|
|
||||||
joiningR: stateStart,
|
|
||||||
joinZWNJ: stateFAIL,
|
|
||||||
joinZWJ: stateFAIL,
|
|
||||||
joinVirama: stateAfter, // no-op as we can't accept joiners here
|
|
||||||
},
|
|
||||||
stateFAIL: {
|
|
||||||
0: stateFAIL,
|
|
||||||
joiningL: stateFAIL,
|
|
||||||
joiningD: stateFAIL,
|
|
||||||
joiningT: stateFAIL,
|
|
||||||
joiningR: stateFAIL,
|
|
||||||
joinZWNJ: stateFAIL,
|
|
||||||
joinZWJ: stateFAIL,
|
|
||||||
joinVirama: stateFAIL,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
// validateLabel validates the criteria from Section 4.1. Item 1, 4, and 6 are
|
|
||||||
// already implicitly satisfied by the overall implementation.
|
|
||||||
func (p *Profile) validateLabel(s string) (err error) {
|
|
||||||
if s == "" {
|
|
||||||
if p.verifyDNSLength {
|
|
||||||
return &labelError{s, "A4"}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if !p.validateLabels {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
trie := p.trie // p.validateLabels is only set if trie is set.
|
|
||||||
if len(s) > 4 && s[2] == '-' && s[3] == '-' {
|
|
||||||
return &labelError{s, "V2"}
|
|
||||||
}
|
|
||||||
if s[0] == '-' || s[len(s)-1] == '-' {
|
|
||||||
return &labelError{s, "V3"}
|
|
||||||
}
|
|
||||||
// TODO: merge the use of this in the trie.
|
|
||||||
v, sz := trie.lookupString(s)
|
|
||||||
x := info(v)
|
|
||||||
if x.isModifier() {
|
|
||||||
return &labelError{s, "V5"}
|
|
||||||
}
|
|
||||||
// Quickly return in the absence of zero-width (non) joiners.
|
|
||||||
if strings.Index(s, zwj) == -1 && strings.Index(s, zwnj) == -1 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
st := stateStart
|
|
||||||
for i := 0; ; {
|
|
||||||
jt := x.joinType()
|
|
||||||
if s[i:i+sz] == zwj {
|
|
||||||
jt = joinZWJ
|
|
||||||
} else if s[i:i+sz] == zwnj {
|
|
||||||
jt = joinZWNJ
|
|
||||||
}
|
|
||||||
st = joinStates[st][jt]
|
|
||||||
if x.isViramaModifier() {
|
|
||||||
st = joinStates[st][joinVirama]
|
|
||||||
}
|
|
||||||
if i += sz; i == len(s) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
v, sz = trie.lookupString(s[i:])
|
|
||||||
x = info(v)
|
|
||||||
}
|
|
||||||
if st == stateFAIL || st == stateAfter {
|
|
||||||
return &labelError{s, "C"}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func ascii(s string) bool {
|
|
||||||
for i := 0; i < len(s); i++ {
|
|
||||||
if s[i] >= utf8.RuneSelf {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
|
|
@ -1469,4 +733,3 @@ func ascii(s string) bool {
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,687 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
|
||||||
|
|
||||||
// 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 !go1.10
|
|
||||||
|
|
||||||
// Package idna implements IDNA2008 using the compatibility processing
|
|
||||||
// defined by UTS (Unicode Technical Standard) #46, which defines a standard to
|
|
||||||
// deal with the transition from IDNA2003.
|
|
||||||
//
|
|
||||||
// IDNA2008 (Internationalized Domain Names for Applications), is defined in RFC
|
|
||||||
// 5890, RFC 5891, RFC 5892, RFC 5893 and RFC 5894.
|
|
||||||
// UTS #46 is defined in https://www.unicode.org/reports/tr46.
|
|
||||||
// See https://unicode.org/cldr/utility/idna.jsp for a visualization of the
|
|
||||||
// differences between these two standards.
|
|
||||||
package idna // import "golang.org/x/net/idna"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
"unicode/utf8"
|
|
||||||
|
|
||||||
"golang.org/x/text/secure/bidirule"
|
|
||||||
"golang.org/x/text/unicode/norm"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NOTE: Unlike common practice in Go APIs, the functions will return a
|
|
||||||
// sanitized domain name in case of errors. Browsers sometimes use a partially
|
|
||||||
// evaluated string as lookup.
|
|
||||||
// TODO: the current error handling is, in my opinion, the least opinionated.
|
|
||||||
// Other strategies are also viable, though:
|
|
||||||
// Option 1) Return an empty string in case of error, but allow the user to
|
|
||||||
// specify explicitly which errors to ignore.
|
|
||||||
// Option 2) Return the partially evaluated string if it is itself a valid
|
|
||||||
// string, otherwise return the empty string in case of error.
|
|
||||||
// Option 3) Option 1 and 2.
|
|
||||||
// Option 4) Always return an empty string for now and implement Option 1 as
|
|
||||||
// needed, and document that the return string may not be empty in case of
|
|
||||||
// error in the future.
|
|
||||||
// I think Option 1 is best, but it is quite opinionated.
|
|
||||||
|
|
||||||
// ToASCII is a wrapper for Punycode.ToASCII.
|
|
||||||
func ToASCII(s string) (string, error) {
|
|
||||||
return Punycode.process(s, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ToUnicode is a wrapper for Punycode.ToUnicode.
|
|
||||||
func ToUnicode(s string) (string, error) {
|
|
||||||
return Punycode.process(s, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
// An Option configures a Profile at creation time.
|
|
||||||
type Option func(*options)
|
|
||||||
|
|
||||||
// Transitional sets a Profile to use the Transitional mapping as defined in UTS
|
|
||||||
// #46. This will cause, for example, "ß" to be mapped to "ss". Using the
|
|
||||||
// transitional mapping provides a compromise between IDNA2003 and IDNA2008
|
|
||||||
// compatibility. It is used by most browsers when resolving domain names. This
|
|
||||||
// option is only meaningful if combined with MapForLookup.
|
|
||||||
func Transitional(transitional bool) Option {
|
|
||||||
return func(o *options) { o.transitional = true }
|
|
||||||
}
|
|
||||||
|
|
||||||
// VerifyDNSLength sets whether a Profile should fail if any of the IDN parts
|
|
||||||
// are longer than allowed by the RFC.
|
|
||||||
func VerifyDNSLength(verify bool) Option {
|
|
||||||
return func(o *options) { o.verifyDNSLength = verify }
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveLeadingDots removes leading label separators. Leading runes that map to
|
|
||||||
// dots, such as U+3002 IDEOGRAPHIC FULL STOP, are removed as well.
|
|
||||||
//
|
|
||||||
// This is the behavior suggested by the UTS #46 and is adopted by some
|
|
||||||
// browsers.
|
|
||||||
func RemoveLeadingDots(remove bool) Option {
|
|
||||||
return func(o *options) { o.removeLeadingDots = remove }
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidateLabels sets whether to check the mandatory label validation criteria
|
|
||||||
// as defined in Section 5.4 of RFC 5891. This includes testing for correct use
|
|
||||||
// of hyphens ('-'), normalization, validity of runes, and the context rules.
|
|
||||||
func ValidateLabels(enable bool) Option {
|
|
||||||
return func(o *options) {
|
|
||||||
// Don't override existing mappings, but set one that at least checks
|
|
||||||
// normalization if it is not set.
|
|
||||||
if o.mapping == nil && enable {
|
|
||||||
o.mapping = normalize
|
|
||||||
}
|
|
||||||
o.trie = trie
|
|
||||||
o.validateLabels = enable
|
|
||||||
o.fromPuny = validateFromPunycode
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// StrictDomainName limits the set of permissable ASCII characters to those
|
|
||||||
// allowed in domain names as defined in RFC 1034 (A-Z, a-z, 0-9 and the
|
|
||||||
// hyphen). This is set by default for MapForLookup and ValidateForRegistration.
|
|
||||||
//
|
|
||||||
// This option is useful, for instance, for browsers that allow characters
|
|
||||||
// outside this range, for example a '_' (U+005F LOW LINE). See
|
|
||||||
// http://www.rfc-editor.org/std/std3.txt for more details This option
|
|
||||||
// corresponds to the UseSTD3ASCIIRules option in UTS #46.
|
|
||||||
func StrictDomainName(use bool) Option {
|
|
||||||
return func(o *options) {
|
|
||||||
o.trie = trie
|
|
||||||
o.useSTD3Rules = use
|
|
||||||
o.fromPuny = validateFromPunycode
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: the following options pull in tables. The tables should not be linked
|
|
||||||
// in as long as the options are not used.
|
|
||||||
|
|
||||||
// BidiRule enables the Bidi rule as defined in RFC 5893. Any application
|
|
||||||
// that relies on proper validation of labels should include this rule.
|
|
||||||
func BidiRule() Option {
|
|
||||||
return func(o *options) { o.bidirule = bidirule.ValidString }
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidateForRegistration sets validation options to verify that a given IDN is
|
|
||||||
// properly formatted for registration as defined by Section 4 of RFC 5891.
|
|
||||||
func ValidateForRegistration() Option {
|
|
||||||
return func(o *options) {
|
|
||||||
o.mapping = validateRegistration
|
|
||||||
StrictDomainName(true)(o)
|
|
||||||
ValidateLabels(true)(o)
|
|
||||||
VerifyDNSLength(true)(o)
|
|
||||||
BidiRule()(o)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MapForLookup sets validation and mapping options such that a given IDN is
|
|
||||||
// transformed for domain name lookup according to the requirements set out in
|
|
||||||
// Section 5 of RFC 5891. The mappings follow the recommendations of RFC 5894,
|
|
||||||
// RFC 5895 and UTS 46. It does not add the Bidi Rule. Use the BidiRule option
|
|
||||||
// to add this check.
|
|
||||||
//
|
|
||||||
// The mappings include normalization and mapping case, width and other
|
|
||||||
// compatibility mappings.
|
|
||||||
func MapForLookup() Option {
|
|
||||||
return func(o *options) {
|
|
||||||
o.mapping = validateAndMap
|
|
||||||
StrictDomainName(true)(o)
|
|
||||||
ValidateLabels(true)(o)
|
|
||||||
RemoveLeadingDots(true)(o)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type options struct {
|
|
||||||
transitional bool
|
|
||||||
useSTD3Rules bool
|
|
||||||
validateLabels bool
|
|
||||||
verifyDNSLength bool
|
|
||||||
removeLeadingDots bool
|
|
||||||
|
|
||||||
trie *idnaTrie
|
|
||||||
|
|
||||||
// fromPuny calls validation rules when converting A-labels to U-labels.
|
|
||||||
fromPuny func(p *Profile, s string) error
|
|
||||||
|
|
||||||
// mapping implements a validation and mapping step as defined in RFC 5895
|
|
||||||
// or UTS 46, tailored to, for example, domain registration or lookup.
|
|
||||||
mapping func(p *Profile, s string) (string, error)
|
|
||||||
|
|
||||||
// bidirule, if specified, checks whether s conforms to the Bidi Rule
|
|
||||||
// defined in RFC 5893.
|
|
||||||
bidirule func(s string) bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// A Profile defines the configuration of a IDNA mapper.
|
|
||||||
type Profile struct {
|
|
||||||
options
|
|
||||||
}
|
|
||||||
|
|
||||||
func apply(o *options, opts []Option) {
|
|
||||||
for _, f := range opts {
|
|
||||||
f(o)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// New creates a new Profile.
|
|
||||||
//
|
|
||||||
// With no options, the returned Profile is the most permissive and equals the
|
|
||||||
// Punycode Profile. Options can be passed to further restrict the Profile. The
|
|
||||||
// MapForLookup and ValidateForRegistration options set a collection of options,
|
|
||||||
// for lookup and registration purposes respectively, which can be tailored by
|
|
||||||
// adding more fine-grained options, where later options override earlier
|
|
||||||
// options.
|
|
||||||
func New(o ...Option) *Profile {
|
|
||||||
p := &Profile{}
|
|
||||||
apply(&p.options, o)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// ToASCII converts a domain or domain label to its ASCII form. For example,
|
|
||||||
// ToASCII("bücher.example.com") is "xn--bcher-kva.example.com", and
|
|
||||||
// ToASCII("golang") is "golang". If an error is encountered it will return
|
|
||||||
// an error and a (partially) processed result.
|
|
||||||
func (p *Profile) ToASCII(s string) (string, error) {
|
|
||||||
return p.process(s, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ToUnicode converts a domain or domain label to its Unicode form. For example,
|
|
||||||
// ToUnicode("xn--bcher-kva.example.com") is "bücher.example.com", and
|
|
||||||
// ToUnicode("golang") is "golang". If an error is encountered it will return
|
|
||||||
// an error and a (partially) processed result.
|
|
||||||
func (p *Profile) ToUnicode(s string) (string, error) {
|
|
||||||
pp := *p
|
|
||||||
pp.transitional = false
|
|
||||||
return pp.process(s, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
// String reports a string with a description of the profile for debugging
|
|
||||||
// purposes. The string format may change with different versions.
|
|
||||||
func (p *Profile) String() string {
|
|
||||||
s := ""
|
|
||||||
if p.transitional {
|
|
||||||
s = "Transitional"
|
|
||||||
} else {
|
|
||||||
s = "NonTransitional"
|
|
||||||
}
|
|
||||||
if p.useSTD3Rules {
|
|
||||||
s += ":UseSTD3Rules"
|
|
||||||
}
|
|
||||||
if p.validateLabels {
|
|
||||||
s += ":ValidateLabels"
|
|
||||||
}
|
|
||||||
if p.verifyDNSLength {
|
|
||||||
s += ":VerifyDNSLength"
|
|
||||||
}
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
// Punycode is a Profile that does raw punycode processing with a minimum
|
|
||||||
// of validation.
|
|
||||||
Punycode *Profile = punycode
|
|
||||||
|
|
||||||
// Lookup is the recommended profile for looking up domain names, according
|
|
||||||
// to Section 5 of RFC 5891. The exact configuration of this profile may
|
|
||||||
// change over time.
|
|
||||||
Lookup *Profile = lookup
|
|
||||||
|
|
||||||
// Display is the recommended profile for displaying domain names.
|
|
||||||
// The configuration of this profile may change over time.
|
|
||||||
Display *Profile = display
|
|
||||||
|
|
||||||
// Registration is the recommended profile for checking whether a given
|
|
||||||
// IDN is valid for registration, according to Section 4 of RFC 5891.
|
|
||||||
Registration *Profile = registration
|
|
||||||
|
|
||||||
punycode = &Profile{}
|
|
||||||
lookup = &Profile{options{
|
|
||||||
transitional: true,
|
|
||||||
useSTD3Rules: true,
|
|
||||||
validateLabels: true,
|
|
||||||
removeLeadingDots: true,
|
|
||||||
trie: trie,
|
|
||||||
fromPuny: validateFromPunycode,
|
|
||||||
mapping: validateAndMap,
|
|
||||||
bidirule: bidirule.ValidString,
|
|
||||||
}}
|
|
||||||
display = &Profile{options{
|
|
||||||
useSTD3Rules: true,
|
|
||||||
validateLabels: true,
|
|
||||||
removeLeadingDots: true,
|
|
||||||
trie: trie,
|
|
||||||
fromPuny: validateFromPunycode,
|
|
||||||
mapping: validateAndMap,
|
|
||||||
bidirule: bidirule.ValidString,
|
|
||||||
}}
|
|
||||||
registration = &Profile{options{
|
|
||||||
useSTD3Rules: true,
|
|
||||||
validateLabels: true,
|
|
||||||
verifyDNSLength: true,
|
|
||||||
trie: trie,
|
|
||||||
fromPuny: validateFromPunycode,
|
|
||||||
mapping: validateRegistration,
|
|
||||||
bidirule: bidirule.ValidString,
|
|
||||||
}}
|
|
||||||
|
|
||||||
// TODO: profiles
|
|
||||||
// Register: recommended for approving domain names: don't do any mappings
|
|
||||||
// but rather reject on invalid input. Bundle or block deviation characters.
|
|
||||||
)
|
|
||||||
|
|
||||||
type labelError struct{ label, code_ string }
|
|
||||||
|
|
||||||
func (e labelError) code() string { return e.code_ }
|
|
||||||
func (e labelError) Error() string {
|
|
||||||
return fmt.Sprintf("idna: invalid label %q", e.label)
|
|
||||||
}
|
|
||||||
|
|
||||||
type runeError rune
|
|
||||||
|
|
||||||
func (e runeError) code() string { return "P1" }
|
|
||||||
func (e runeError) Error() string {
|
|
||||||
return fmt.Sprintf("idna: disallowed rune %U", e)
|
|
||||||
}
|
|
||||||
|
|
||||||
// process implements the algorithm described in section 4 of UTS #46,
|
|
||||||
// see https://www.unicode.org/reports/tr46.
|
|
||||||
func (p *Profile) process(s string, toASCII bool) (string, error) {
|
|
||||||
var err error
|
|
||||||
if p.mapping != nil {
|
|
||||||
s, err = p.mapping(p, s)
|
|
||||||
}
|
|
||||||
// Remove leading empty labels.
|
|
||||||
if p.removeLeadingDots {
|
|
||||||
for ; len(s) > 0 && s[0] == '.'; s = s[1:] {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// It seems like we should only create this error on ToASCII, but the
|
|
||||||
// UTS 46 conformance tests suggests we should always check this.
|
|
||||||
if err == nil && p.verifyDNSLength && s == "" {
|
|
||||||
err = &labelError{s, "A4"}
|
|
||||||
}
|
|
||||||
labels := labelIter{orig: s}
|
|
||||||
for ; !labels.done(); labels.next() {
|
|
||||||
label := labels.label()
|
|
||||||
if label == "" {
|
|
||||||
// Empty labels are not okay. The label iterator skips the last
|
|
||||||
// label if it is empty.
|
|
||||||
if err == nil && p.verifyDNSLength {
|
|
||||||
err = &labelError{s, "A4"}
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if strings.HasPrefix(label, acePrefix) {
|
|
||||||
u, err2 := decode(label[len(acePrefix):])
|
|
||||||
if err2 != nil {
|
|
||||||
if err == nil {
|
|
||||||
err = err2
|
|
||||||
}
|
|
||||||
// Spec says keep the old label.
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
labels.set(u)
|
|
||||||
if err == nil && p.validateLabels {
|
|
||||||
err = p.fromPuny(p, u)
|
|
||||||
}
|
|
||||||
if err == nil {
|
|
||||||
// This should be called on NonTransitional, according to the
|
|
||||||
// spec, but that currently does not have any effect. Use the
|
|
||||||
// original profile to preserve options.
|
|
||||||
err = p.validateLabel(u)
|
|
||||||
}
|
|
||||||
} else if err == nil {
|
|
||||||
err = p.validateLabel(label)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if toASCII {
|
|
||||||
for labels.reset(); !labels.done(); labels.next() {
|
|
||||||
label := labels.label()
|
|
||||||
if !ascii(label) {
|
|
||||||
a, err2 := encode(acePrefix, label)
|
|
||||||
if err == nil {
|
|
||||||
err = err2
|
|
||||||
}
|
|
||||||
label = a
|
|
||||||
labels.set(a)
|
|
||||||
}
|
|
||||||
n := len(label)
|
|
||||||
if p.verifyDNSLength && err == nil && (n == 0 || n > 63) {
|
|
||||||
err = &labelError{label, "A4"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s = labels.result()
|
|
||||||
if toASCII && p.verifyDNSLength && err == nil {
|
|
||||||
// Compute the length of the domain name minus the root label and its dot.
|
|
||||||
n := len(s)
|
|
||||||
if n > 0 && s[n-1] == '.' {
|
|
||||||
n--
|
|
||||||
}
|
|
||||||
if len(s) < 1 || n > 253 {
|
|
||||||
err = &labelError{s, "A4"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return s, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func normalize(p *Profile, s string) (string, error) {
|
|
||||||
return norm.NFC.String(s), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func validateRegistration(p *Profile, s string) (string, error) {
|
|
||||||
if !norm.NFC.IsNormalString(s) {
|
|
||||||
return s, &labelError{s, "V1"}
|
|
||||||
}
|
|
||||||
for i := 0; i < len(s); {
|
|
||||||
v, sz := trie.lookupString(s[i:])
|
|
||||||
// Copy bytes not copied so far.
|
|
||||||
switch p.simplify(info(v).category()) {
|
|
||||||
// TODO: handle the NV8 defined in the Unicode idna data set to allow
|
|
||||||
// for strict conformance to IDNA2008.
|
|
||||||
case valid, deviation:
|
|
||||||
case disallowed, mapped, unknown, ignored:
|
|
||||||
r, _ := utf8.DecodeRuneInString(s[i:])
|
|
||||||
return s, runeError(r)
|
|
||||||
}
|
|
||||||
i += sz
|
|
||||||
}
|
|
||||||
return s, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func validateAndMap(p *Profile, s string) (string, error) {
|
|
||||||
var (
|
|
||||||
err error
|
|
||||||
b []byte
|
|
||||||
k int
|
|
||||||
)
|
|
||||||
for i := 0; i < len(s); {
|
|
||||||
v, sz := trie.lookupString(s[i:])
|
|
||||||
start := i
|
|
||||||
i += sz
|
|
||||||
// Copy bytes not copied so far.
|
|
||||||
switch p.simplify(info(v).category()) {
|
|
||||||
case valid:
|
|
||||||
continue
|
|
||||||
case disallowed:
|
|
||||||
if err == nil {
|
|
||||||
r, _ := utf8.DecodeRuneInString(s[start:])
|
|
||||||
err = runeError(r)
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
case mapped, deviation:
|
|
||||||
b = append(b, s[k:start]...)
|
|
||||||
b = info(v).appendMapping(b, s[start:i])
|
|
||||||
case ignored:
|
|
||||||
b = append(b, s[k:start]...)
|
|
||||||
// drop the rune
|
|
||||||
case unknown:
|
|
||||||
b = append(b, s[k:start]...)
|
|
||||||
b = append(b, "\ufffd"...)
|
|
||||||
}
|
|
||||||
k = i
|
|
||||||
}
|
|
||||||
if k == 0 {
|
|
||||||
// No changes so far.
|
|
||||||
s = norm.NFC.String(s)
|
|
||||||
} else {
|
|
||||||
b = append(b, s[k:]...)
|
|
||||||
if norm.NFC.QuickSpan(b) != len(b) {
|
|
||||||
b = norm.NFC.Bytes(b)
|
|
||||||
}
|
|
||||||
// TODO: the punycode converters require strings as input.
|
|
||||||
s = string(b)
|
|
||||||
}
|
|
||||||
return s, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// A labelIter allows iterating over domain name labels.
|
|
||||||
type labelIter struct {
|
|
||||||
orig string
|
|
||||||
slice []string
|
|
||||||
curStart int
|
|
||||||
curEnd int
|
|
||||||
i int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *labelIter) reset() {
|
|
||||||
l.curStart = 0
|
|
||||||
l.curEnd = 0
|
|
||||||
l.i = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *labelIter) done() bool {
|
|
||||||
return l.curStart >= len(l.orig)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *labelIter) result() string {
|
|
||||||
if l.slice != nil {
|
|
||||||
return strings.Join(l.slice, ".")
|
|
||||||
}
|
|
||||||
return l.orig
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *labelIter) label() string {
|
|
||||||
if l.slice != nil {
|
|
||||||
return l.slice[l.i]
|
|
||||||
}
|
|
||||||
p := strings.IndexByte(l.orig[l.curStart:], '.')
|
|
||||||
l.curEnd = l.curStart + p
|
|
||||||
if p == -1 {
|
|
||||||
l.curEnd = len(l.orig)
|
|
||||||
}
|
|
||||||
return l.orig[l.curStart:l.curEnd]
|
|
||||||
}
|
|
||||||
|
|
||||||
// next sets the value to the next label. It skips the last label if it is empty.
|
|
||||||
func (l *labelIter) next() {
|
|
||||||
l.i++
|
|
||||||
if l.slice != nil {
|
|
||||||
if l.i >= len(l.slice) || l.i == len(l.slice)-1 && l.slice[l.i] == "" {
|
|
||||||
l.curStart = len(l.orig)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
l.curStart = l.curEnd + 1
|
|
||||||
if l.curStart == len(l.orig)-1 && l.orig[l.curStart] == '.' {
|
|
||||||
l.curStart = len(l.orig)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *labelIter) set(s string) {
|
|
||||||
if l.slice == nil {
|
|
||||||
l.slice = strings.Split(l.orig, ".")
|
|
||||||
}
|
|
||||||
l.slice[l.i] = s
|
|
||||||
}
|
|
||||||
|
|
||||||
// acePrefix is the ASCII Compatible Encoding prefix.
|
|
||||||
const acePrefix = "xn--"
|
|
||||||
|
|
||||||
func (p *Profile) simplify(cat category) category {
|
|
||||||
switch cat {
|
|
||||||
case disallowedSTD3Mapped:
|
|
||||||
if p.useSTD3Rules {
|
|
||||||
cat = disallowed
|
|
||||||
} else {
|
|
||||||
cat = mapped
|
|
||||||
}
|
|
||||||
case disallowedSTD3Valid:
|
|
||||||
if p.useSTD3Rules {
|
|
||||||
cat = disallowed
|
|
||||||
} else {
|
|
||||||
cat = valid
|
|
||||||
}
|
|
||||||
case deviation:
|
|
||||||
if !p.transitional {
|
|
||||||
cat = valid
|
|
||||||
}
|
|
||||||
case validNV8, validXV8:
|
|
||||||
// TODO: handle V2008
|
|
||||||
cat = valid
|
|
||||||
}
|
|
||||||
return cat
|
|
||||||
}
|
|
||||||
|
|
||||||
func validateFromPunycode(p *Profile, s string) error {
|
|
||||||
if !norm.NFC.IsNormalString(s) {
|
|
||||||
return &labelError{s, "V1"}
|
|
||||||
}
|
|
||||||
for i := 0; i < len(s); {
|
|
||||||
v, sz := trie.lookupString(s[i:])
|
|
||||||
if c := p.simplify(info(v).category()); c != valid && c != deviation {
|
|
||||||
return &labelError{s, "V6"}
|
|
||||||
}
|
|
||||||
i += sz
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
zwnj = "\u200c"
|
|
||||||
zwj = "\u200d"
|
|
||||||
)
|
|
||||||
|
|
||||||
type joinState int8
|
|
||||||
|
|
||||||
const (
|
|
||||||
stateStart joinState = iota
|
|
||||||
stateVirama
|
|
||||||
stateBefore
|
|
||||||
stateBeforeVirama
|
|
||||||
stateAfter
|
|
||||||
stateFAIL
|
|
||||||
)
|
|
||||||
|
|
||||||
var joinStates = [][numJoinTypes]joinState{
|
|
||||||
stateStart: {
|
|
||||||
joiningL: stateBefore,
|
|
||||||
joiningD: stateBefore,
|
|
||||||
joinZWNJ: stateFAIL,
|
|
||||||
joinZWJ: stateFAIL,
|
|
||||||
joinVirama: stateVirama,
|
|
||||||
},
|
|
||||||
stateVirama: {
|
|
||||||
joiningL: stateBefore,
|
|
||||||
joiningD: stateBefore,
|
|
||||||
},
|
|
||||||
stateBefore: {
|
|
||||||
joiningL: stateBefore,
|
|
||||||
joiningD: stateBefore,
|
|
||||||
joiningT: stateBefore,
|
|
||||||
joinZWNJ: stateAfter,
|
|
||||||
joinZWJ: stateFAIL,
|
|
||||||
joinVirama: stateBeforeVirama,
|
|
||||||
},
|
|
||||||
stateBeforeVirama: {
|
|
||||||
joiningL: stateBefore,
|
|
||||||
joiningD: stateBefore,
|
|
||||||
joiningT: stateBefore,
|
|
||||||
},
|
|
||||||
stateAfter: {
|
|
||||||
joiningL: stateFAIL,
|
|
||||||
joiningD: stateBefore,
|
|
||||||
joiningT: stateAfter,
|
|
||||||
joiningR: stateStart,
|
|
||||||
joinZWNJ: stateFAIL,
|
|
||||||
joinZWJ: stateFAIL,
|
|
||||||
joinVirama: stateAfter, // no-op as we can't accept joiners here
|
|
||||||
},
|
|
||||||
stateFAIL: {
|
|
||||||
0: stateFAIL,
|
|
||||||
joiningL: stateFAIL,
|
|
||||||
joiningD: stateFAIL,
|
|
||||||
joiningT: stateFAIL,
|
|
||||||
joiningR: stateFAIL,
|
|
||||||
joinZWNJ: stateFAIL,
|
|
||||||
joinZWJ: stateFAIL,
|
|
||||||
joinVirama: stateFAIL,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
// validateLabel validates the criteria from Section 4.1. Item 1, 4, and 6 are
|
|
||||||
// already implicitly satisfied by the overall implementation.
|
|
||||||
func (p *Profile) validateLabel(s string) error {
|
|
||||||
if s == "" {
|
|
||||||
if p.verifyDNSLength {
|
|
||||||
return &labelError{s, "A4"}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if p.bidirule != nil && !p.bidirule(s) {
|
|
||||||
return &labelError{s, "B"}
|
|
||||||
}
|
|
||||||
if !p.validateLabels {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
trie := p.trie // p.validateLabels is only set if trie is set.
|
|
||||||
if len(s) > 4 && s[2] == '-' && s[3] == '-' {
|
|
||||||
return &labelError{s, "V2"}
|
|
||||||
}
|
|
||||||
if s[0] == '-' || s[len(s)-1] == '-' {
|
|
||||||
return &labelError{s, "V3"}
|
|
||||||
}
|
|
||||||
// TODO: merge the use of this in the trie.
|
|
||||||
v, sz := trie.lookupString(s)
|
|
||||||
x := info(v)
|
|
||||||
if x.isModifier() {
|
|
||||||
return &labelError{s, "V5"}
|
|
||||||
}
|
|
||||||
// Quickly return in the absence of zero-width (non) joiners.
|
|
||||||
if strings.Index(s, zwj) == -1 && strings.Index(s, zwnj) == -1 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
st := stateStart
|
|
||||||
for i := 0; ; {
|
|
||||||
jt := x.joinType()
|
|
||||||
if s[i:i+sz] == zwj {
|
|
||||||
jt = joinZWJ
|
|
||||||
} else if s[i:i+sz] == zwnj {
|
|
||||||
jt = joinZWNJ
|
|
||||||
}
|
|
||||||
st = joinStates[st][jt]
|
|
||||||
if x.isViramaModifier() {
|
|
||||||
st = joinStates[st][joinVirama]
|
|
||||||
}
|
|
||||||
if i += sz; i == len(s) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
v, sz = trie.lookupString(s[i:])
|
|
||||||
x = info(v)
|
|
||||||
}
|
|
||||||
if st == stateFAIL || st == stateAfter {
|
|
||||||
return &labelError{s, "C"}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func ascii(s string) bool {
|
|
||||||
for i := 0; i < len(s); i++ {
|
|
||||||
if s[i] >= utf8.RuneSelf {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
|
|
@ -1365,4 +681,3 @@ func ascii(s string) bool {
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,203 +1,203 @@
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package idna
|
package idna
|
||||||
|
|
||||||
// This file implements the Punycode algorithm from RFC 3492.
|
// This file implements the Punycode algorithm from RFC 3492.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
"strings"
|
"strings"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
)
|
)
|
||||||
|
|
||||||
// These parameter values are specified in section 5.
|
// These parameter values are specified in section 5.
|
||||||
//
|
//
|
||||||
// All computation is done with int32s, so that overflow behavior is identical
|
// All computation is done with int32s, so that overflow behavior is identical
|
||||||
// regardless of whether int is 32-bit or 64-bit.
|
// regardless of whether int is 32-bit or 64-bit.
|
||||||
const (
|
const (
|
||||||
base int32 = 36
|
base int32 = 36
|
||||||
damp int32 = 700
|
damp int32 = 700
|
||||||
initialBias int32 = 72
|
initialBias int32 = 72
|
||||||
initialN int32 = 128
|
initialN int32 = 128
|
||||||
skew int32 = 38
|
skew int32 = 38
|
||||||
tmax int32 = 26
|
tmax int32 = 26
|
||||||
tmin int32 = 1
|
tmin int32 = 1
|
||||||
)
|
)
|
||||||
|
|
||||||
func punyError(s string) error { return &labelError{s, "A3"} }
|
func punyError(s string) error { return &labelError{s, "A3"} }
|
||||||
|
|
||||||
// decode decodes a string as specified in section 6.2.
|
// decode decodes a string as specified in section 6.2.
|
||||||
func decode(encoded string) (string, error) {
|
func decode(encoded string) (string, error) {
|
||||||
if encoded == "" {
|
if encoded == "" {
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
pos := 1 + strings.LastIndex(encoded, "-")
|
pos := 1 + strings.LastIndex(encoded, "-")
|
||||||
if pos == 1 {
|
if pos == 1 {
|
||||||
return "", punyError(encoded)
|
return "", punyError(encoded)
|
||||||
}
|
}
|
||||||
if pos == len(encoded) {
|
if pos == len(encoded) {
|
||||||
return encoded[:len(encoded)-1], nil
|
return encoded[:len(encoded)-1], nil
|
||||||
}
|
}
|
||||||
output := make([]rune, 0, len(encoded))
|
output := make([]rune, 0, len(encoded))
|
||||||
if pos != 0 {
|
if pos != 0 {
|
||||||
for _, r := range encoded[:pos-1] {
|
for _, r := range encoded[:pos-1] {
|
||||||
output = append(output, r)
|
output = append(output, r)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
i, n, bias := int32(0), initialN, initialBias
|
i, n, bias := int32(0), initialN, initialBias
|
||||||
for pos < len(encoded) {
|
for pos < len(encoded) {
|
||||||
oldI, w := i, int32(1)
|
oldI, w := i, int32(1)
|
||||||
for k := base; ; k += base {
|
for k := base; ; k += base {
|
||||||
if pos == len(encoded) {
|
if pos == len(encoded) {
|
||||||
return "", punyError(encoded)
|
return "", punyError(encoded)
|
||||||
}
|
}
|
||||||
digit, ok := decodeDigit(encoded[pos])
|
digit, ok := decodeDigit(encoded[pos])
|
||||||
if !ok {
|
if !ok {
|
||||||
return "", punyError(encoded)
|
return "", punyError(encoded)
|
||||||
}
|
}
|
||||||
pos++
|
pos++
|
||||||
i += digit * w
|
i += digit * w
|
||||||
if i < 0 {
|
if i < 0 {
|
||||||
return "", punyError(encoded)
|
return "", punyError(encoded)
|
||||||
}
|
}
|
||||||
t := k - bias
|
t := k - bias
|
||||||
if t < tmin {
|
if t < tmin {
|
||||||
t = tmin
|
t = tmin
|
||||||
} else if t > tmax {
|
} else if t > tmax {
|
||||||
t = tmax
|
t = tmax
|
||||||
}
|
}
|
||||||
if digit < t {
|
if digit < t {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
w *= base - t
|
w *= base - t
|
||||||
if w >= math.MaxInt32/base {
|
if w >= math.MaxInt32/base {
|
||||||
return "", punyError(encoded)
|
return "", punyError(encoded)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
x := int32(len(output) + 1)
|
x := int32(len(output) + 1)
|
||||||
bias = adapt(i-oldI, x, oldI == 0)
|
bias = adapt(i-oldI, x, oldI == 0)
|
||||||
n += i / x
|
n += i / x
|
||||||
i %= x
|
i %= x
|
||||||
if n > utf8.MaxRune || len(output) >= 1024 {
|
if n > utf8.MaxRune || len(output) >= 1024 {
|
||||||
return "", punyError(encoded)
|
return "", punyError(encoded)
|
||||||
}
|
}
|
||||||
output = append(output, 0)
|
output = append(output, 0)
|
||||||
copy(output[i+1:], output[i:])
|
copy(output[i+1:], output[i:])
|
||||||
output[i] = n
|
output[i] = n
|
||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
return string(output), nil
|
return string(output), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// encode encodes a string as specified in section 6.3 and prepends prefix to
|
// encode encodes a string as specified in section 6.3 and prepends prefix to
|
||||||
// the result.
|
// the result.
|
||||||
//
|
//
|
||||||
// The "while h < length(input)" line in the specification becomes "for
|
// The "while h < length(input)" line in the specification becomes "for
|
||||||
// remaining != 0" in the Go code, because len(s) in Go is in bytes, not runes.
|
// remaining != 0" in the Go code, because len(s) in Go is in bytes, not runes.
|
||||||
func encode(prefix, s string) (string, error) {
|
func encode(prefix, s string) (string, error) {
|
||||||
output := make([]byte, len(prefix), len(prefix)+1+2*len(s))
|
output := make([]byte, len(prefix), len(prefix)+1+2*len(s))
|
||||||
copy(output, prefix)
|
copy(output, prefix)
|
||||||
delta, n, bias := int32(0), initialN, initialBias
|
delta, n, bias := int32(0), initialN, initialBias
|
||||||
b, remaining := int32(0), int32(0)
|
b, remaining := int32(0), int32(0)
|
||||||
for _, r := range s {
|
for _, r := range s {
|
||||||
if r < 0x80 {
|
if r < 0x80 {
|
||||||
b++
|
b++
|
||||||
output = append(output, byte(r))
|
output = append(output, byte(r))
|
||||||
} else {
|
} else {
|
||||||
remaining++
|
remaining++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
h := b
|
h := b
|
||||||
if b > 0 {
|
if b > 0 {
|
||||||
output = append(output, '-')
|
output = append(output, '-')
|
||||||
}
|
}
|
||||||
for remaining != 0 {
|
for remaining != 0 {
|
||||||
m := int32(0x7fffffff)
|
m := int32(0x7fffffff)
|
||||||
for _, r := range s {
|
for _, r := range s {
|
||||||
if m > r && r >= n {
|
if m > r && r >= n {
|
||||||
m = r
|
m = r
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delta += (m - n) * (h + 1)
|
delta += (m - n) * (h + 1)
|
||||||
if delta < 0 {
|
if delta < 0 {
|
||||||
return "", punyError(s)
|
return "", punyError(s)
|
||||||
}
|
}
|
||||||
n = m
|
n = m
|
||||||
for _, r := range s {
|
for _, r := range s {
|
||||||
if r < n {
|
if r < n {
|
||||||
delta++
|
delta++
|
||||||
if delta < 0 {
|
if delta < 0 {
|
||||||
return "", punyError(s)
|
return "", punyError(s)
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if r > n {
|
if r > n {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
q := delta
|
q := delta
|
||||||
for k := base; ; k += base {
|
for k := base; ; k += base {
|
||||||
t := k - bias
|
t := k - bias
|
||||||
if t < tmin {
|
if t < tmin {
|
||||||
t = tmin
|
t = tmin
|
||||||
} else if t > tmax {
|
} else if t > tmax {
|
||||||
t = tmax
|
t = tmax
|
||||||
}
|
}
|
||||||
if q < t {
|
if q < t {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
output = append(output, encodeDigit(t+(q-t)%(base-t)))
|
output = append(output, encodeDigit(t+(q-t)%(base-t)))
|
||||||
q = (q - t) / (base - t)
|
q = (q - t) / (base - t)
|
||||||
}
|
}
|
||||||
output = append(output, encodeDigit(q))
|
output = append(output, encodeDigit(q))
|
||||||
bias = adapt(delta, h+1, h == b)
|
bias = adapt(delta, h+1, h == b)
|
||||||
delta = 0
|
delta = 0
|
||||||
h++
|
h++
|
||||||
remaining--
|
remaining--
|
||||||
}
|
}
|
||||||
delta++
|
delta++
|
||||||
n++
|
n++
|
||||||
}
|
}
|
||||||
return string(output), nil
|
return string(output), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func decodeDigit(x byte) (digit int32, ok bool) {
|
func decodeDigit(x byte) (digit int32, ok bool) {
|
||||||
switch {
|
switch {
|
||||||
case '0' <= x && x <= '9':
|
case '0' <= x && x <= '9':
|
||||||
return int32(x - ('0' - 26)), true
|
return int32(x - ('0' - 26)), true
|
||||||
case 'A' <= x && x <= 'Z':
|
case 'A' <= x && x <= 'Z':
|
||||||
return int32(x - 'A'), true
|
return int32(x - 'A'), true
|
||||||
case 'a' <= x && x <= 'z':
|
case 'a' <= x && x <= 'z':
|
||||||
return int32(x - 'a'), true
|
return int32(x - 'a'), true
|
||||||
}
|
}
|
||||||
return 0, false
|
return 0, false
|
||||||
}
|
}
|
||||||
|
|
||||||
func encodeDigit(digit int32) byte {
|
func encodeDigit(digit int32) byte {
|
||||||
switch {
|
switch {
|
||||||
case 0 <= digit && digit < 26:
|
case 0 <= digit && digit < 26:
|
||||||
return byte(digit + 'a')
|
return byte(digit + 'a')
|
||||||
case 26 <= digit && digit < 36:
|
case 26 <= digit && digit < 36:
|
||||||
return byte(digit + ('0' - 26))
|
return byte(digit + ('0' - 26))
|
||||||
}
|
}
|
||||||
panic("idna: internal error in punycode encoding")
|
panic("idna: internal error in punycode encoding")
|
||||||
}
|
}
|
||||||
|
|
||||||
// adapt is the bias adaptation function specified in section 6.1.
|
// adapt is the bias adaptation function specified in section 6.1.
|
||||||
func adapt(delta, numPoints int32, firstTime bool) int32 {
|
func adapt(delta, numPoints int32, firstTime bool) int32 {
|
||||||
if firstTime {
|
if firstTime {
|
||||||
delta /= damp
|
delta /= damp
|
||||||
} else {
|
} else {
|
||||||
delta /= 2
|
delta /= 2
|
||||||
}
|
}
|
||||||
delta += delta / numPoints
|
delta += delta / numPoints
|
||||||
k := int32(0)
|
k := int32(0)
|
||||||
for delta > ((base-tmin)*tmax)/2 {
|
for delta > ((base-tmin)*tmax)/2 {
|
||||||
delta /= base - tmin
|
delta /= base - tmin
|
||||||
k += base
|
k += base
|
||||||
}
|
}
|
||||||
return k + (base-tmin+1)*delta/(delta+skew)
|
return k + (base-tmin+1)*delta/(delta+skew)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,72 +1,72 @@
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package idna
|
package idna
|
||||||
|
|
||||||
// appendMapping appends the mapping for the respective rune. isMapped must be
|
// appendMapping appends the mapping for the respective rune. isMapped must be
|
||||||
// true. A mapping is a categorization of a rune as defined in UTS #46.
|
// true. A mapping is a categorization of a rune as defined in UTS #46.
|
||||||
func (c info) appendMapping(b []byte, s string) []byte {
|
func (c info) appendMapping(b []byte, s string) []byte {
|
||||||
index := int(c >> indexShift)
|
index := int(c >> indexShift)
|
||||||
if c&xorBit == 0 {
|
if c&xorBit == 0 {
|
||||||
s := mappings[index:]
|
s := mappings[index:]
|
||||||
return append(b, s[1:s[0]+1]...)
|
return append(b, s[1:s[0]+1]...)
|
||||||
}
|
}
|
||||||
b = append(b, s...)
|
b = append(b, s...)
|
||||||
if c&inlineXOR == inlineXOR {
|
if c&inlineXOR == inlineXOR {
|
||||||
// TODO: support and handle two-byte inline masks
|
// TODO: support and handle two-byte inline masks
|
||||||
b[len(b)-1] ^= byte(index)
|
b[len(b)-1] ^= byte(index)
|
||||||
} else {
|
} else {
|
||||||
for p := len(b) - int(xorData[index]); p < len(b); p++ {
|
for p := len(b) - int(xorData[index]); p < len(b); p++ {
|
||||||
index++
|
index++
|
||||||
b[p] ^= xorData[index]
|
b[p] ^= xorData[index]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sparse block handling code.
|
// Sparse block handling code.
|
||||||
|
|
||||||
type valueRange struct {
|
type valueRange struct {
|
||||||
value uint16 // header: value:stride
|
value uint16 // header: value:stride
|
||||||
lo, hi byte // header: lo:n
|
lo, hi byte // header: lo:n
|
||||||
}
|
}
|
||||||
|
|
||||||
type sparseBlocks struct {
|
type sparseBlocks struct {
|
||||||
values []valueRange
|
values []valueRange
|
||||||
offset []uint16
|
offset []uint16
|
||||||
}
|
}
|
||||||
|
|
||||||
var idnaSparse = sparseBlocks{
|
var idnaSparse = sparseBlocks{
|
||||||
values: idnaSparseValues[:],
|
values: idnaSparseValues[:],
|
||||||
offset: idnaSparseOffset[:],
|
offset: idnaSparseOffset[:],
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't use newIdnaTrie to avoid unconditional linking in of the table.
|
// Don't use newIdnaTrie to avoid unconditional linking in of the table.
|
||||||
var trie = &idnaTrie{}
|
var trie = &idnaTrie{}
|
||||||
|
|
||||||
// lookup determines the type of block n and looks up the value for b.
|
// lookup determines the type of block n and looks up the value for b.
|
||||||
// For n < t.cutoff, the block is a simple lookup table. Otherwise, the block
|
// For n < t.cutoff, the block is a simple lookup table. Otherwise, the block
|
||||||
// is a list of ranges with an accompanying value. Given a matching range r,
|
// is a list of ranges with an accompanying value. Given a matching range r,
|
||||||
// the value for b is by r.value + (b - r.lo) * stride.
|
// the value for b is by r.value + (b - r.lo) * stride.
|
||||||
func (t *sparseBlocks) lookup(n uint32, b byte) uint16 {
|
func (t *sparseBlocks) lookup(n uint32, b byte) uint16 {
|
||||||
offset := t.offset[n]
|
offset := t.offset[n]
|
||||||
header := t.values[offset]
|
header := t.values[offset]
|
||||||
lo := offset + 1
|
lo := offset + 1
|
||||||
hi := lo + uint16(header.lo)
|
hi := lo + uint16(header.lo)
|
||||||
for lo < hi {
|
for lo < hi {
|
||||||
m := lo + (hi-lo)/2
|
m := lo + (hi-lo)/2
|
||||||
r := t.values[m]
|
r := t.values[m]
|
||||||
if r.lo <= b && b <= r.hi {
|
if r.lo <= b && b <= r.hi {
|
||||||
return r.value + uint16(b-r.lo)*header.value
|
return r.value + uint16(b-r.lo)*header.value
|
||||||
}
|
}
|
||||||
if b < r.lo {
|
if b < r.lo {
|
||||||
hi = m
|
hi = m
|
||||||
} else {
|
} else {
|
||||||
lo = m + 1
|
lo = m + 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,119 +1,119 @@
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
package idna
|
package idna
|
||||||
|
|
||||||
// This file contains definitions for interpreting the trie value of the idna
|
// This file contains definitions for interpreting the trie value of the idna
|
||||||
// trie generated by "go run gen*.go". It is shared by both the generator
|
// trie generated by "go run gen*.go". It is shared by both the generator
|
||||||
// program and the resultant package. Sharing is achieved by the generator
|
// program and the resultant package. Sharing is achieved by the generator
|
||||||
// copying gen_trieval.go to trieval.go and changing what's above this comment.
|
// copying gen_trieval.go to trieval.go and changing what's above this comment.
|
||||||
|
|
||||||
// info holds information from the IDNA mapping table for a single rune. It is
|
// info holds information from the IDNA mapping table for a single rune. It is
|
||||||
// the value returned by a trie lookup. In most cases, all information fits in
|
// the value returned by a trie lookup. In most cases, all information fits in
|
||||||
// a 16-bit value. For mappings, this value may contain an index into a slice
|
// a 16-bit value. For mappings, this value may contain an index into a slice
|
||||||
// with the mapped string. Such mappings can consist of the actual mapped value
|
// with the mapped string. Such mappings can consist of the actual mapped value
|
||||||
// or an XOR pattern to be applied to the bytes of the UTF8 encoding of the
|
// or an XOR pattern to be applied to the bytes of the UTF8 encoding of the
|
||||||
// input rune. This technique is used by the cases packages and reduces the
|
// input rune. This technique is used by the cases packages and reduces the
|
||||||
// table size significantly.
|
// table size significantly.
|
||||||
//
|
//
|
||||||
// The per-rune values have the following format:
|
// The per-rune values have the following format:
|
||||||
//
|
//
|
||||||
// if mapped {
|
// if mapped {
|
||||||
// if inlinedXOR {
|
// if inlinedXOR {
|
||||||
// 15..13 inline XOR marker
|
// 15..13 inline XOR marker
|
||||||
// 12..11 unused
|
// 12..11 unused
|
||||||
// 10..3 inline XOR mask
|
// 10..3 inline XOR mask
|
||||||
// } else {
|
// } else {
|
||||||
// 15..3 index into xor or mapping table
|
// 15..3 index into xor or mapping table
|
||||||
// }
|
// }
|
||||||
// } else {
|
// } else {
|
||||||
// 15..14 unused
|
// 15..14 unused
|
||||||
// 13 mayNeedNorm
|
// 13 mayNeedNorm
|
||||||
// 12..11 attributes
|
// 12..11 attributes
|
||||||
// 10..8 joining type
|
// 10..8 joining type
|
||||||
// 7..3 category type
|
// 7..3 category type
|
||||||
// }
|
// }
|
||||||
// 2 use xor pattern
|
// 2 use xor pattern
|
||||||
// 1..0 mapped category
|
// 1..0 mapped category
|
||||||
//
|
//
|
||||||
// See the definitions below for a more detailed description of the various
|
// See the definitions below for a more detailed description of the various
|
||||||
// bits.
|
// bits.
|
||||||
type info uint16
|
type info uint16
|
||||||
|
|
||||||
const (
|
const (
|
||||||
catSmallMask = 0x3
|
catSmallMask = 0x3
|
||||||
catBigMask = 0xF8
|
catBigMask = 0xF8
|
||||||
indexShift = 3
|
indexShift = 3
|
||||||
xorBit = 0x4 // interpret the index as an xor pattern
|
xorBit = 0x4 // interpret the index as an xor pattern
|
||||||
inlineXOR = 0xE000 // These bits are set if the XOR pattern is inlined.
|
inlineXOR = 0xE000 // These bits are set if the XOR pattern is inlined.
|
||||||
|
|
||||||
joinShift = 8
|
joinShift = 8
|
||||||
joinMask = 0x07
|
joinMask = 0x07
|
||||||
|
|
||||||
// Attributes
|
// Attributes
|
||||||
attributesMask = 0x1800
|
attributesMask = 0x1800
|
||||||
viramaModifier = 0x1800
|
viramaModifier = 0x1800
|
||||||
modifier = 0x1000
|
modifier = 0x1000
|
||||||
rtl = 0x0800
|
rtl = 0x0800
|
||||||
|
|
||||||
mayNeedNorm = 0x2000
|
mayNeedNorm = 0x2000
|
||||||
)
|
)
|
||||||
|
|
||||||
// A category corresponds to a category defined in the IDNA mapping table.
|
// A category corresponds to a category defined in the IDNA mapping table.
|
||||||
type category uint16
|
type category uint16
|
||||||
|
|
||||||
const (
|
const (
|
||||||
unknown category = 0 // not currently defined in unicode.
|
unknown category = 0 // not currently defined in unicode.
|
||||||
mapped category = 1
|
mapped category = 1
|
||||||
disallowedSTD3Mapped category = 2
|
disallowedSTD3Mapped category = 2
|
||||||
deviation category = 3
|
deviation category = 3
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
valid category = 0x08
|
valid category = 0x08
|
||||||
validNV8 category = 0x18
|
validNV8 category = 0x18
|
||||||
validXV8 category = 0x28
|
validXV8 category = 0x28
|
||||||
disallowed category = 0x40
|
disallowed category = 0x40
|
||||||
disallowedSTD3Valid category = 0x80
|
disallowedSTD3Valid category = 0x80
|
||||||
ignored category = 0xC0
|
ignored category = 0xC0
|
||||||
)
|
)
|
||||||
|
|
||||||
// join types and additional rune information
|
// join types and additional rune information
|
||||||
const (
|
const (
|
||||||
joiningL = (iota + 1)
|
joiningL = (iota + 1)
|
||||||
joiningD
|
joiningD
|
||||||
joiningT
|
joiningT
|
||||||
joiningR
|
joiningR
|
||||||
|
|
||||||
//the following types are derived during processing
|
//the following types are derived during processing
|
||||||
joinZWJ
|
joinZWJ
|
||||||
joinZWNJ
|
joinZWNJ
|
||||||
joinVirama
|
joinVirama
|
||||||
numJoinTypes
|
numJoinTypes
|
||||||
)
|
)
|
||||||
|
|
||||||
func (c info) isMapped() bool {
|
func (c info) isMapped() bool {
|
||||||
return c&0x3 != 0
|
return c&0x3 != 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c info) category() category {
|
func (c info) category() category {
|
||||||
small := c & catSmallMask
|
small := c & catSmallMask
|
||||||
if small != 0 {
|
if small != 0 {
|
||||||
return category(small)
|
return category(small)
|
||||||
}
|
}
|
||||||
return category(c & catBigMask)
|
return category(c & catBigMask)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c info) joinType() info {
|
func (c info) joinType() info {
|
||||||
if c.isMapped() {
|
if c.isMapped() {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
return (c >> joinShift) & joinMask
|
return (c >> joinShift) & joinMask
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c info) isModifier() bool {
|
func (c info) isModifier() bool {
|
||||||
return c&(modifier|catSmallMask) == modifier
|
return c&(modifier|catSmallMask) == modifier
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c info) isViramaModifier() bool {
|
func (c info) isViramaModifier() bool {
|
||||||
return c&(attributesMask|catSmallMask) == viramaModifier
|
return c&(attributesMask|catSmallMask) == viramaModifier
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,168 +1,168 @@
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package socks
|
package socks
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
noDeadline = time.Time{}
|
noDeadline = time.Time{}
|
||||||
aLongTimeAgo = time.Unix(1, 0)
|
aLongTimeAgo = time.Unix(1, 0)
|
||||||
)
|
)
|
||||||
|
|
||||||
func (d *Dialer) connect(ctx context.Context, c net.Conn, address string) (_ net.Addr, ctxErr error) {
|
func (d *Dialer) connect(ctx context.Context, c net.Conn, address string) (_ net.Addr, ctxErr error) {
|
||||||
host, port, err := splitHostPort(address)
|
host, port, err := splitHostPort(address)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if deadline, ok := ctx.Deadline(); ok && !deadline.IsZero() {
|
if deadline, ok := ctx.Deadline(); ok && !deadline.IsZero() {
|
||||||
c.SetDeadline(deadline)
|
c.SetDeadline(deadline)
|
||||||
defer c.SetDeadline(noDeadline)
|
defer c.SetDeadline(noDeadline)
|
||||||
}
|
}
|
||||||
if ctx != context.Background() {
|
if ctx != context.Background() {
|
||||||
errCh := make(chan error, 1)
|
errCh := make(chan error, 1)
|
||||||
done := make(chan struct{})
|
done := make(chan struct{})
|
||||||
defer func() {
|
defer func() {
|
||||||
close(done)
|
close(done)
|
||||||
if ctxErr == nil {
|
if ctxErr == nil {
|
||||||
ctxErr = <-errCh
|
ctxErr = <-errCh
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
go func() {
|
go func() {
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
c.SetDeadline(aLongTimeAgo)
|
c.SetDeadline(aLongTimeAgo)
|
||||||
errCh <- ctx.Err()
|
errCh <- ctx.Err()
|
||||||
case <-done:
|
case <-done:
|
||||||
errCh <- nil
|
errCh <- nil
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
b := make([]byte, 0, 6+len(host)) // the size here is just an estimate
|
b := make([]byte, 0, 6+len(host)) // the size here is just an estimate
|
||||||
b = append(b, Version5)
|
b = append(b, Version5)
|
||||||
if len(d.AuthMethods) == 0 || d.Authenticate == nil {
|
if len(d.AuthMethods) == 0 || d.Authenticate == nil {
|
||||||
b = append(b, 1, byte(AuthMethodNotRequired))
|
b = append(b, 1, byte(AuthMethodNotRequired))
|
||||||
} else {
|
} else {
|
||||||
ams := d.AuthMethods
|
ams := d.AuthMethods
|
||||||
if len(ams) > 255 {
|
if len(ams) > 255 {
|
||||||
return nil, errors.New("too many authentication methods")
|
return nil, errors.New("too many authentication methods")
|
||||||
}
|
}
|
||||||
b = append(b, byte(len(ams)))
|
b = append(b, byte(len(ams)))
|
||||||
for _, am := range ams {
|
for _, am := range ams {
|
||||||
b = append(b, byte(am))
|
b = append(b, byte(am))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if _, ctxErr = c.Write(b); ctxErr != nil {
|
if _, ctxErr = c.Write(b); ctxErr != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, ctxErr = io.ReadFull(c, b[:2]); ctxErr != nil {
|
if _, ctxErr = io.ReadFull(c, b[:2]); ctxErr != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if b[0] != Version5 {
|
if b[0] != Version5 {
|
||||||
return nil, errors.New("unexpected protocol version " + strconv.Itoa(int(b[0])))
|
return nil, errors.New("unexpected protocol version " + strconv.Itoa(int(b[0])))
|
||||||
}
|
}
|
||||||
am := AuthMethod(b[1])
|
am := AuthMethod(b[1])
|
||||||
if am == AuthMethodNoAcceptableMethods {
|
if am == AuthMethodNoAcceptableMethods {
|
||||||
return nil, errors.New("no acceptable authentication methods")
|
return nil, errors.New("no acceptable authentication methods")
|
||||||
}
|
}
|
||||||
if d.Authenticate != nil {
|
if d.Authenticate != nil {
|
||||||
if ctxErr = d.Authenticate(ctx, c, am); ctxErr != nil {
|
if ctxErr = d.Authenticate(ctx, c, am); ctxErr != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
b = b[:0]
|
b = b[:0]
|
||||||
b = append(b, Version5, byte(d.cmd), 0)
|
b = append(b, Version5, byte(d.cmd), 0)
|
||||||
if ip := net.ParseIP(host); ip != nil {
|
if ip := net.ParseIP(host); ip != nil {
|
||||||
if ip4 := ip.To4(); ip4 != nil {
|
if ip4 := ip.To4(); ip4 != nil {
|
||||||
b = append(b, AddrTypeIPv4)
|
b = append(b, AddrTypeIPv4)
|
||||||
b = append(b, ip4...)
|
b = append(b, ip4...)
|
||||||
} else if ip6 := ip.To16(); ip6 != nil {
|
} else if ip6 := ip.To16(); ip6 != nil {
|
||||||
b = append(b, AddrTypeIPv6)
|
b = append(b, AddrTypeIPv6)
|
||||||
b = append(b, ip6...)
|
b = append(b, ip6...)
|
||||||
} else {
|
} else {
|
||||||
return nil, errors.New("unknown address type")
|
return nil, errors.New("unknown address type")
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if len(host) > 255 {
|
if len(host) > 255 {
|
||||||
return nil, errors.New("FQDN too long")
|
return nil, errors.New("FQDN too long")
|
||||||
}
|
}
|
||||||
b = append(b, AddrTypeFQDN)
|
b = append(b, AddrTypeFQDN)
|
||||||
b = append(b, byte(len(host)))
|
b = append(b, byte(len(host)))
|
||||||
b = append(b, host...)
|
b = append(b, host...)
|
||||||
}
|
}
|
||||||
b = append(b, byte(port>>8), byte(port))
|
b = append(b, byte(port>>8), byte(port))
|
||||||
if _, ctxErr = c.Write(b); ctxErr != nil {
|
if _, ctxErr = c.Write(b); ctxErr != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, ctxErr = io.ReadFull(c, b[:4]); ctxErr != nil {
|
if _, ctxErr = io.ReadFull(c, b[:4]); ctxErr != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if b[0] != Version5 {
|
if b[0] != Version5 {
|
||||||
return nil, errors.New("unexpected protocol version " + strconv.Itoa(int(b[0])))
|
return nil, errors.New("unexpected protocol version " + strconv.Itoa(int(b[0])))
|
||||||
}
|
}
|
||||||
if cmdErr := Reply(b[1]); cmdErr != StatusSucceeded {
|
if cmdErr := Reply(b[1]); cmdErr != StatusSucceeded {
|
||||||
return nil, errors.New("unknown error " + cmdErr.String())
|
return nil, errors.New("unknown error " + cmdErr.String())
|
||||||
}
|
}
|
||||||
if b[2] != 0 {
|
if b[2] != 0 {
|
||||||
return nil, errors.New("non-zero reserved field")
|
return nil, errors.New("non-zero reserved field")
|
||||||
}
|
}
|
||||||
l := 2
|
l := 2
|
||||||
var a Addr
|
var a Addr
|
||||||
switch b[3] {
|
switch b[3] {
|
||||||
case AddrTypeIPv4:
|
case AddrTypeIPv4:
|
||||||
l += net.IPv4len
|
l += net.IPv4len
|
||||||
a.IP = make(net.IP, net.IPv4len)
|
a.IP = make(net.IP, net.IPv4len)
|
||||||
case AddrTypeIPv6:
|
case AddrTypeIPv6:
|
||||||
l += net.IPv6len
|
l += net.IPv6len
|
||||||
a.IP = make(net.IP, net.IPv6len)
|
a.IP = make(net.IP, net.IPv6len)
|
||||||
case AddrTypeFQDN:
|
case AddrTypeFQDN:
|
||||||
if _, err := io.ReadFull(c, b[:1]); err != nil {
|
if _, err := io.ReadFull(c, b[:1]); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
l += int(b[0])
|
l += int(b[0])
|
||||||
default:
|
default:
|
||||||
return nil, errors.New("unknown address type " + strconv.Itoa(int(b[3])))
|
return nil, errors.New("unknown address type " + strconv.Itoa(int(b[3])))
|
||||||
}
|
}
|
||||||
if cap(b) < l {
|
if cap(b) < l {
|
||||||
b = make([]byte, l)
|
b = make([]byte, l)
|
||||||
} else {
|
} else {
|
||||||
b = b[:l]
|
b = b[:l]
|
||||||
}
|
}
|
||||||
if _, ctxErr = io.ReadFull(c, b); ctxErr != nil {
|
if _, ctxErr = io.ReadFull(c, b); ctxErr != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if a.IP != nil {
|
if a.IP != nil {
|
||||||
copy(a.IP, b)
|
copy(a.IP, b)
|
||||||
} else {
|
} else {
|
||||||
a.Name = string(b[:len(b)-2])
|
a.Name = string(b[:len(b)-2])
|
||||||
}
|
}
|
||||||
a.Port = int(b[len(b)-2])<<8 | int(b[len(b)-1])
|
a.Port = int(b[len(b)-2])<<8 | int(b[len(b)-1])
|
||||||
return &a, nil
|
return &a, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func splitHostPort(address string) (string, int, error) {
|
func splitHostPort(address string) (string, int, error) {
|
||||||
host, port, err := net.SplitHostPort(address)
|
host, port, err := net.SplitHostPort(address)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", 0, err
|
return "", 0, err
|
||||||
}
|
}
|
||||||
portnum, err := strconv.Atoi(port)
|
portnum, err := strconv.Atoi(port)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", 0, err
|
return "", 0, err
|
||||||
}
|
}
|
||||||
if 1 > portnum || portnum > 0xffff {
|
if 1 > portnum || portnum > 0xffff {
|
||||||
return "", 0, errors.New("port number out of range " + port)
|
return "", 0, errors.New("port number out of range " + port)
|
||||||
}
|
}
|
||||||
return host, portnum, nil
|
return host, portnum, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,317 +1,317 @@
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// Package socks provides a SOCKS version 5 client implementation.
|
// Package socks provides a SOCKS version 5 client implementation.
|
||||||
//
|
//
|
||||||
// SOCKS protocol version 5 is defined in RFC 1928.
|
// SOCKS protocol version 5 is defined in RFC 1928.
|
||||||
// Username/Password authentication for SOCKS version 5 is defined in
|
// Username/Password authentication for SOCKS version 5 is defined in
|
||||||
// RFC 1929.
|
// RFC 1929.
|
||||||
package socks
|
package socks
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
// A Command represents a SOCKS command.
|
// A Command represents a SOCKS command.
|
||||||
type Command int
|
type Command int
|
||||||
|
|
||||||
func (cmd Command) String() string {
|
func (cmd Command) String() string {
|
||||||
switch cmd {
|
switch cmd {
|
||||||
case CmdConnect:
|
case CmdConnect:
|
||||||
return "socks connect"
|
return "socks connect"
|
||||||
case cmdBind:
|
case cmdBind:
|
||||||
return "socks bind"
|
return "socks bind"
|
||||||
default:
|
default:
|
||||||
return "socks " + strconv.Itoa(int(cmd))
|
return "socks " + strconv.Itoa(int(cmd))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// An AuthMethod represents a SOCKS authentication method.
|
// An AuthMethod represents a SOCKS authentication method.
|
||||||
type AuthMethod int
|
type AuthMethod int
|
||||||
|
|
||||||
// A Reply represents a SOCKS command reply code.
|
// A Reply represents a SOCKS command reply code.
|
||||||
type Reply int
|
type Reply int
|
||||||
|
|
||||||
func (code Reply) String() string {
|
func (code Reply) String() string {
|
||||||
switch code {
|
switch code {
|
||||||
case StatusSucceeded:
|
case StatusSucceeded:
|
||||||
return "succeeded"
|
return "succeeded"
|
||||||
case 0x01:
|
case 0x01:
|
||||||
return "general SOCKS server failure"
|
return "general SOCKS server failure"
|
||||||
case 0x02:
|
case 0x02:
|
||||||
return "connection not allowed by ruleset"
|
return "connection not allowed by ruleset"
|
||||||
case 0x03:
|
case 0x03:
|
||||||
return "network unreachable"
|
return "network unreachable"
|
||||||
case 0x04:
|
case 0x04:
|
||||||
return "host unreachable"
|
return "host unreachable"
|
||||||
case 0x05:
|
case 0x05:
|
||||||
return "connection refused"
|
return "connection refused"
|
||||||
case 0x06:
|
case 0x06:
|
||||||
return "TTL expired"
|
return "TTL expired"
|
||||||
case 0x07:
|
case 0x07:
|
||||||
return "command not supported"
|
return "command not supported"
|
||||||
case 0x08:
|
case 0x08:
|
||||||
return "address type not supported"
|
return "address type not supported"
|
||||||
default:
|
default:
|
||||||
return "unknown code: " + strconv.Itoa(int(code))
|
return "unknown code: " + strconv.Itoa(int(code))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wire protocol constants.
|
// Wire protocol constants.
|
||||||
const (
|
const (
|
||||||
Version5 = 0x05
|
Version5 = 0x05
|
||||||
|
|
||||||
AddrTypeIPv4 = 0x01
|
AddrTypeIPv4 = 0x01
|
||||||
AddrTypeFQDN = 0x03
|
AddrTypeFQDN = 0x03
|
||||||
AddrTypeIPv6 = 0x04
|
AddrTypeIPv6 = 0x04
|
||||||
|
|
||||||
CmdConnect Command = 0x01 // establishes an active-open forward proxy connection
|
CmdConnect Command = 0x01 // establishes an active-open forward proxy connection
|
||||||
cmdBind Command = 0x02 // establishes a passive-open forward proxy connection
|
cmdBind Command = 0x02 // establishes a passive-open forward proxy connection
|
||||||
|
|
||||||
AuthMethodNotRequired AuthMethod = 0x00 // no authentication required
|
AuthMethodNotRequired AuthMethod = 0x00 // no authentication required
|
||||||
AuthMethodUsernamePassword AuthMethod = 0x02 // use username/password
|
AuthMethodUsernamePassword AuthMethod = 0x02 // use username/password
|
||||||
AuthMethodNoAcceptableMethods AuthMethod = 0xff // no acceptable authentication methods
|
AuthMethodNoAcceptableMethods AuthMethod = 0xff // no acceptable authentication methods
|
||||||
|
|
||||||
StatusSucceeded Reply = 0x00
|
StatusSucceeded Reply = 0x00
|
||||||
)
|
)
|
||||||
|
|
||||||
// An Addr represents a SOCKS-specific address.
|
// An Addr represents a SOCKS-specific address.
|
||||||
// Either Name or IP is used exclusively.
|
// Either Name or IP is used exclusively.
|
||||||
type Addr struct {
|
type Addr struct {
|
||||||
Name string // fully-qualified domain name
|
Name string // fully-qualified domain name
|
||||||
IP net.IP
|
IP net.IP
|
||||||
Port int
|
Port int
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *Addr) Network() string { return "socks" }
|
func (a *Addr) Network() string { return "socks" }
|
||||||
|
|
||||||
func (a *Addr) String() string {
|
func (a *Addr) String() string {
|
||||||
if a == nil {
|
if a == nil {
|
||||||
return "<nil>"
|
return "<nil>"
|
||||||
}
|
}
|
||||||
port := strconv.Itoa(a.Port)
|
port := strconv.Itoa(a.Port)
|
||||||
if a.IP == nil {
|
if a.IP == nil {
|
||||||
return net.JoinHostPort(a.Name, port)
|
return net.JoinHostPort(a.Name, port)
|
||||||
}
|
}
|
||||||
return net.JoinHostPort(a.IP.String(), port)
|
return net.JoinHostPort(a.IP.String(), port)
|
||||||
}
|
}
|
||||||
|
|
||||||
// A Conn represents a forward proxy connection.
|
// A Conn represents a forward proxy connection.
|
||||||
type Conn struct {
|
type Conn struct {
|
||||||
net.Conn
|
net.Conn
|
||||||
|
|
||||||
boundAddr net.Addr
|
boundAddr net.Addr
|
||||||
}
|
}
|
||||||
|
|
||||||
// BoundAddr returns the address assigned by the proxy server for
|
// BoundAddr returns the address assigned by the proxy server for
|
||||||
// connecting to the command target address from the proxy server.
|
// connecting to the command target address from the proxy server.
|
||||||
func (c *Conn) BoundAddr() net.Addr {
|
func (c *Conn) BoundAddr() net.Addr {
|
||||||
if c == nil {
|
if c == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return c.boundAddr
|
return c.boundAddr
|
||||||
}
|
}
|
||||||
|
|
||||||
// A Dialer holds SOCKS-specific options.
|
// A Dialer holds SOCKS-specific options.
|
||||||
type Dialer struct {
|
type Dialer struct {
|
||||||
cmd Command // either CmdConnect or cmdBind
|
cmd Command // either CmdConnect or cmdBind
|
||||||
proxyNetwork string // network between a proxy server and a client
|
proxyNetwork string // network between a proxy server and a client
|
||||||
proxyAddress string // proxy server address
|
proxyAddress string // proxy server address
|
||||||
|
|
||||||
// ProxyDial specifies the optional dial function for
|
// ProxyDial specifies the optional dial function for
|
||||||
// establishing the transport connection.
|
// establishing the transport connection.
|
||||||
ProxyDial func(context.Context, string, string) (net.Conn, error)
|
ProxyDial func(context.Context, string, string) (net.Conn, error)
|
||||||
|
|
||||||
// AuthMethods specifies the list of request authentication
|
// AuthMethods specifies the list of request authentication
|
||||||
// methods.
|
// methods.
|
||||||
// If empty, SOCKS client requests only AuthMethodNotRequired.
|
// If empty, SOCKS client requests only AuthMethodNotRequired.
|
||||||
AuthMethods []AuthMethod
|
AuthMethods []AuthMethod
|
||||||
|
|
||||||
// Authenticate specifies the optional authentication
|
// Authenticate specifies the optional authentication
|
||||||
// function. It must be non-nil when AuthMethods is not empty.
|
// function. It must be non-nil when AuthMethods is not empty.
|
||||||
// It must return an error when the authentication is failed.
|
// It must return an error when the authentication is failed.
|
||||||
Authenticate func(context.Context, io.ReadWriter, AuthMethod) error
|
Authenticate func(context.Context, io.ReadWriter, AuthMethod) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// DialContext connects to the provided address on the provided
|
// DialContext connects to the provided address on the provided
|
||||||
// network.
|
// network.
|
||||||
//
|
//
|
||||||
// The returned error value may be a net.OpError. When the Op field of
|
// The returned error value may be a net.OpError. When the Op field of
|
||||||
// net.OpError contains "socks", the Source field contains a proxy
|
// net.OpError contains "socks", the Source field contains a proxy
|
||||||
// server address and the Addr field contains a command target
|
// server address and the Addr field contains a command target
|
||||||
// address.
|
// address.
|
||||||
//
|
//
|
||||||
// See func Dial of the net package of standard library for a
|
// See func Dial of the net package of standard library for a
|
||||||
// description of the network and address parameters.
|
// description of the network and address parameters.
|
||||||
func (d *Dialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) {
|
func (d *Dialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) {
|
||||||
if err := d.validateTarget(network, address); err != nil {
|
if err := d.validateTarget(network, address); err != nil {
|
||||||
proxy, dst, _ := d.pathAddrs(address)
|
proxy, dst, _ := d.pathAddrs(address)
|
||||||
return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
|
return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
|
||||||
}
|
}
|
||||||
if ctx == nil {
|
if ctx == nil {
|
||||||
proxy, dst, _ := d.pathAddrs(address)
|
proxy, dst, _ := d.pathAddrs(address)
|
||||||
return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: errors.New("nil context")}
|
return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: errors.New("nil context")}
|
||||||
}
|
}
|
||||||
var err error
|
var err error
|
||||||
var c net.Conn
|
var c net.Conn
|
||||||
if d.ProxyDial != nil {
|
if d.ProxyDial != nil {
|
||||||
c, err = d.ProxyDial(ctx, d.proxyNetwork, d.proxyAddress)
|
c, err = d.ProxyDial(ctx, d.proxyNetwork, d.proxyAddress)
|
||||||
} else {
|
} else {
|
||||||
var dd net.Dialer
|
var dd net.Dialer
|
||||||
c, err = dd.DialContext(ctx, d.proxyNetwork, d.proxyAddress)
|
c, err = dd.DialContext(ctx, d.proxyNetwork, d.proxyAddress)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
proxy, dst, _ := d.pathAddrs(address)
|
proxy, dst, _ := d.pathAddrs(address)
|
||||||
return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
|
return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
|
||||||
}
|
}
|
||||||
a, err := d.connect(ctx, c, address)
|
a, err := d.connect(ctx, c, address)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.Close()
|
c.Close()
|
||||||
proxy, dst, _ := d.pathAddrs(address)
|
proxy, dst, _ := d.pathAddrs(address)
|
||||||
return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
|
return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
|
||||||
}
|
}
|
||||||
return &Conn{Conn: c, boundAddr: a}, nil
|
return &Conn{Conn: c, boundAddr: a}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// DialWithConn initiates a connection from SOCKS server to the target
|
// DialWithConn initiates a connection from SOCKS server to the target
|
||||||
// network and address using the connection c that is already
|
// network and address using the connection c that is already
|
||||||
// connected to the SOCKS server.
|
// connected to the SOCKS server.
|
||||||
//
|
//
|
||||||
// It returns the connection's local address assigned by the SOCKS
|
// It returns the connection's local address assigned by the SOCKS
|
||||||
// server.
|
// server.
|
||||||
func (d *Dialer) DialWithConn(ctx context.Context, c net.Conn, network, address string) (net.Addr, error) {
|
func (d *Dialer) DialWithConn(ctx context.Context, c net.Conn, network, address string) (net.Addr, error) {
|
||||||
if err := d.validateTarget(network, address); err != nil {
|
if err := d.validateTarget(network, address); err != nil {
|
||||||
proxy, dst, _ := d.pathAddrs(address)
|
proxy, dst, _ := d.pathAddrs(address)
|
||||||
return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
|
return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
|
||||||
}
|
}
|
||||||
if ctx == nil {
|
if ctx == nil {
|
||||||
proxy, dst, _ := d.pathAddrs(address)
|
proxy, dst, _ := d.pathAddrs(address)
|
||||||
return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: errors.New("nil context")}
|
return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: errors.New("nil context")}
|
||||||
}
|
}
|
||||||
a, err := d.connect(ctx, c, address)
|
a, err := d.connect(ctx, c, address)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
proxy, dst, _ := d.pathAddrs(address)
|
proxy, dst, _ := d.pathAddrs(address)
|
||||||
return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
|
return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
|
||||||
}
|
}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dial connects to the provided address on the provided network.
|
// Dial connects to the provided address on the provided network.
|
||||||
//
|
//
|
||||||
// Unlike DialContext, it returns a raw transport connection instead
|
// Unlike DialContext, it returns a raw transport connection instead
|
||||||
// of a forward proxy connection.
|
// of a forward proxy connection.
|
||||||
//
|
//
|
||||||
// Deprecated: Use DialContext or DialWithConn instead.
|
// Deprecated: Use DialContext or DialWithConn instead.
|
||||||
func (d *Dialer) Dial(network, address string) (net.Conn, error) {
|
func (d *Dialer) Dial(network, address string) (net.Conn, error) {
|
||||||
if err := d.validateTarget(network, address); err != nil {
|
if err := d.validateTarget(network, address); err != nil {
|
||||||
proxy, dst, _ := d.pathAddrs(address)
|
proxy, dst, _ := d.pathAddrs(address)
|
||||||
return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
|
return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
|
||||||
}
|
}
|
||||||
var err error
|
var err error
|
||||||
var c net.Conn
|
var c net.Conn
|
||||||
if d.ProxyDial != nil {
|
if d.ProxyDial != nil {
|
||||||
c, err = d.ProxyDial(context.Background(), d.proxyNetwork, d.proxyAddress)
|
c, err = d.ProxyDial(context.Background(), d.proxyNetwork, d.proxyAddress)
|
||||||
} else {
|
} else {
|
||||||
c, err = net.Dial(d.proxyNetwork, d.proxyAddress)
|
c, err = net.Dial(d.proxyNetwork, d.proxyAddress)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
proxy, dst, _ := d.pathAddrs(address)
|
proxy, dst, _ := d.pathAddrs(address)
|
||||||
return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
|
return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
|
||||||
}
|
}
|
||||||
if _, err := d.DialWithConn(context.Background(), c, network, address); err != nil {
|
if _, err := d.DialWithConn(context.Background(), c, network, address); err != nil {
|
||||||
c.Close()
|
c.Close()
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Dialer) validateTarget(network, address string) error {
|
func (d *Dialer) validateTarget(network, address string) error {
|
||||||
switch network {
|
switch network {
|
||||||
case "tcp", "tcp6", "tcp4":
|
case "tcp", "tcp6", "tcp4":
|
||||||
default:
|
default:
|
||||||
return errors.New("network not implemented")
|
return errors.New("network not implemented")
|
||||||
}
|
}
|
||||||
switch d.cmd {
|
switch d.cmd {
|
||||||
case CmdConnect, cmdBind:
|
case CmdConnect, cmdBind:
|
||||||
default:
|
default:
|
||||||
return errors.New("command not implemented")
|
return errors.New("command not implemented")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Dialer) pathAddrs(address string) (proxy, dst net.Addr, err error) {
|
func (d *Dialer) pathAddrs(address string) (proxy, dst net.Addr, err error) {
|
||||||
for i, s := range []string{d.proxyAddress, address} {
|
for i, s := range []string{d.proxyAddress, address} {
|
||||||
host, port, err := splitHostPort(s)
|
host, port, err := splitHostPort(s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
a := &Addr{Port: port}
|
a := &Addr{Port: port}
|
||||||
a.IP = net.ParseIP(host)
|
a.IP = net.ParseIP(host)
|
||||||
if a.IP == nil {
|
if a.IP == nil {
|
||||||
a.Name = host
|
a.Name = host
|
||||||
}
|
}
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
proxy = a
|
proxy = a
|
||||||
} else {
|
} else {
|
||||||
dst = a
|
dst = a
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDialer returns a new Dialer that dials through the provided
|
// NewDialer returns a new Dialer that dials through the provided
|
||||||
// proxy server's network and address.
|
// proxy server's network and address.
|
||||||
func NewDialer(network, address string) *Dialer {
|
func NewDialer(network, address string) *Dialer {
|
||||||
return &Dialer{proxyNetwork: network, proxyAddress: address, cmd: CmdConnect}
|
return &Dialer{proxyNetwork: network, proxyAddress: address, cmd: CmdConnect}
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
authUsernamePasswordVersion = 0x01
|
authUsernamePasswordVersion = 0x01
|
||||||
authStatusSucceeded = 0x00
|
authStatusSucceeded = 0x00
|
||||||
)
|
)
|
||||||
|
|
||||||
// UsernamePassword are the credentials for the username/password
|
// UsernamePassword are the credentials for the username/password
|
||||||
// authentication method.
|
// authentication method.
|
||||||
type UsernamePassword struct {
|
type UsernamePassword struct {
|
||||||
Username string
|
Username string
|
||||||
Password string
|
Password string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Authenticate authenticates a pair of username and password with the
|
// Authenticate authenticates a pair of username and password with the
|
||||||
// proxy server.
|
// proxy server.
|
||||||
func (up *UsernamePassword) Authenticate(ctx context.Context, rw io.ReadWriter, auth AuthMethod) error {
|
func (up *UsernamePassword) Authenticate(ctx context.Context, rw io.ReadWriter, auth AuthMethod) error {
|
||||||
switch auth {
|
switch auth {
|
||||||
case AuthMethodNotRequired:
|
case AuthMethodNotRequired:
|
||||||
return nil
|
return nil
|
||||||
case AuthMethodUsernamePassword:
|
case AuthMethodUsernamePassword:
|
||||||
if len(up.Username) == 0 || len(up.Username) > 255 || len(up.Password) == 0 || len(up.Password) > 255 {
|
if len(up.Username) == 0 || len(up.Username) > 255 || len(up.Password) == 0 || len(up.Password) > 255 {
|
||||||
return errors.New("invalid username/password")
|
return errors.New("invalid username/password")
|
||||||
}
|
}
|
||||||
b := []byte{authUsernamePasswordVersion}
|
b := []byte{authUsernamePasswordVersion}
|
||||||
b = append(b, byte(len(up.Username)))
|
b = append(b, byte(len(up.Username)))
|
||||||
b = append(b, up.Username...)
|
b = append(b, up.Username...)
|
||||||
b = append(b, byte(len(up.Password)))
|
b = append(b, byte(len(up.Password)))
|
||||||
b = append(b, up.Password...)
|
b = append(b, up.Password...)
|
||||||
// TODO(mikio): handle IO deadlines and cancelation if
|
// TODO(mikio): handle IO deadlines and cancelation if
|
||||||
// necessary
|
// necessary
|
||||||
if _, err := rw.Write(b); err != nil {
|
if _, err := rw.Write(b); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if _, err := io.ReadFull(rw, b[:2]); err != nil {
|
if _, err := io.ReadFull(rw, b[:2]); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if b[0] != authUsernamePasswordVersion {
|
if b[0] != authUsernamePasswordVersion {
|
||||||
return errors.New("invalid username/password version")
|
return errors.New("invalid username/password version")
|
||||||
}
|
}
|
||||||
if b[1] != authStatusSucceeded {
|
if b[1] != authStatusSucceeded {
|
||||||
return errors.New("username/password authentication failed")
|
return errors.New("username/password authentication failed")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return errors.New("unsupported authentication method " + strconv.Itoa(int(auth)))
|
return errors.New("unsupported authentication method " + strconv.Itoa(int(auth)))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,54 +1,54 @@
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package proxy
|
package proxy
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"net"
|
"net"
|
||||||
)
|
)
|
||||||
|
|
||||||
// A ContextDialer dials using a context.
|
// A ContextDialer dials using a context.
|
||||||
type ContextDialer interface {
|
type ContextDialer interface {
|
||||||
DialContext(ctx context.Context, network, address string) (net.Conn, error)
|
DialContext(ctx context.Context, network, address string) (net.Conn, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dial works like DialContext on net.Dialer but using a dialer returned by FromEnvironment.
|
// Dial works like DialContext on net.Dialer but using a dialer returned by FromEnvironment.
|
||||||
//
|
//
|
||||||
// The passed ctx is only used for returning the Conn, not the lifetime of the Conn.
|
// The passed ctx is only used for returning the Conn, not the lifetime of the Conn.
|
||||||
//
|
//
|
||||||
// Custom dialers (registered via RegisterDialerType) that do not implement ContextDialer
|
// Custom dialers (registered via RegisterDialerType) that do not implement ContextDialer
|
||||||
// can leak a goroutine for as long as it takes the underlying Dialer implementation to timeout.
|
// can leak a goroutine for as long as it takes the underlying Dialer implementation to timeout.
|
||||||
//
|
//
|
||||||
// A Conn returned from a successful Dial after the context has been cancelled will be immediately closed.
|
// A Conn returned from a successful Dial after the context has been cancelled will be immediately closed.
|
||||||
func Dial(ctx context.Context, network, address string) (net.Conn, error) {
|
func Dial(ctx context.Context, network, address string) (net.Conn, error) {
|
||||||
d := FromEnvironment()
|
d := FromEnvironment()
|
||||||
if xd, ok := d.(ContextDialer); ok {
|
if xd, ok := d.(ContextDialer); ok {
|
||||||
return xd.DialContext(ctx, network, address)
|
return xd.DialContext(ctx, network, address)
|
||||||
}
|
}
|
||||||
return dialContext(ctx, d, network, address)
|
return dialContext(ctx, d, network, address)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WARNING: this can leak a goroutine for as long as the underlying Dialer implementation takes to timeout
|
// WARNING: this can leak a goroutine for as long as the underlying Dialer implementation takes to timeout
|
||||||
// A Conn returned from a successful Dial after the context has been cancelled will be immediately closed.
|
// A Conn returned from a successful Dial after the context has been cancelled will be immediately closed.
|
||||||
func dialContext(ctx context.Context, d Dialer, network, address string) (net.Conn, error) {
|
func dialContext(ctx context.Context, d Dialer, network, address string) (net.Conn, error) {
|
||||||
var (
|
var (
|
||||||
conn net.Conn
|
conn net.Conn
|
||||||
done = make(chan struct{}, 1)
|
done = make(chan struct{}, 1)
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
go func() {
|
go func() {
|
||||||
conn, err = d.Dial(network, address)
|
conn, err = d.Dial(network, address)
|
||||||
close(done)
|
close(done)
|
||||||
if conn != nil && ctx.Err() != nil {
|
if conn != nil && ctx.Err() != nil {
|
||||||
conn.Close()
|
conn.Close()
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
err = ctx.Err()
|
err = ctx.Err()
|
||||||
case <-done:
|
case <-done:
|
||||||
}
|
}
|
||||||
return conn, err
|
return conn, err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,31 +1,31 @@
|
||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
// Copyright 2011 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package proxy
|
package proxy
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"net"
|
"net"
|
||||||
)
|
)
|
||||||
|
|
||||||
type direct struct{}
|
type direct struct{}
|
||||||
|
|
||||||
// Direct implements Dialer by making network connections directly using net.Dial or net.DialContext.
|
// Direct implements Dialer by making network connections directly using net.Dial or net.DialContext.
|
||||||
var Direct = direct{}
|
var Direct = direct{}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_ Dialer = Direct
|
_ Dialer = Direct
|
||||||
_ ContextDialer = Direct
|
_ ContextDialer = Direct
|
||||||
)
|
)
|
||||||
|
|
||||||
// Dial directly invokes net.Dial with the supplied parameters.
|
// Dial directly invokes net.Dial with the supplied parameters.
|
||||||
func (direct) Dial(network, addr string) (net.Conn, error) {
|
func (direct) Dial(network, addr string) (net.Conn, error) {
|
||||||
return net.Dial(network, addr)
|
return net.Dial(network, addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DialContext instantiates a net.Dialer and invokes its DialContext receiver with the supplied parameters.
|
// DialContext instantiates a net.Dialer and invokes its DialContext receiver with the supplied parameters.
|
||||||
func (direct) DialContext(ctx context.Context, network, addr string) (net.Conn, error) {
|
func (direct) DialContext(ctx context.Context, network, addr string) (net.Conn, error) {
|
||||||
var d net.Dialer
|
var d net.Dialer
|
||||||
return d.DialContext(ctx, network, addr)
|
return d.DialContext(ctx, network, addr)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,155 +1,155 @@
|
||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
// Copyright 2011 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package proxy
|
package proxy
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"net"
|
"net"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// A PerHost directs connections to a default Dialer unless the host name
|
// A PerHost directs connections to a default Dialer unless the host name
|
||||||
// requested matches one of a number of exceptions.
|
// requested matches one of a number of exceptions.
|
||||||
type PerHost struct {
|
type PerHost struct {
|
||||||
def, bypass Dialer
|
def, bypass Dialer
|
||||||
|
|
||||||
bypassNetworks []*net.IPNet
|
bypassNetworks []*net.IPNet
|
||||||
bypassIPs []net.IP
|
bypassIPs []net.IP
|
||||||
bypassZones []string
|
bypassZones []string
|
||||||
bypassHosts []string
|
bypassHosts []string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewPerHost returns a PerHost Dialer that directs connections to either
|
// NewPerHost returns a PerHost Dialer that directs connections to either
|
||||||
// defaultDialer or bypass, depending on whether the connection matches one of
|
// defaultDialer or bypass, depending on whether the connection matches one of
|
||||||
// the configured rules.
|
// the configured rules.
|
||||||
func NewPerHost(defaultDialer, bypass Dialer) *PerHost {
|
func NewPerHost(defaultDialer, bypass Dialer) *PerHost {
|
||||||
return &PerHost{
|
return &PerHost{
|
||||||
def: defaultDialer,
|
def: defaultDialer,
|
||||||
bypass: bypass,
|
bypass: bypass,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dial connects to the address addr on the given network through either
|
// Dial connects to the address addr on the given network through either
|
||||||
// defaultDialer or bypass.
|
// defaultDialer or bypass.
|
||||||
func (p *PerHost) Dial(network, addr string) (c net.Conn, err error) {
|
func (p *PerHost) Dial(network, addr string) (c net.Conn, err error) {
|
||||||
host, _, err := net.SplitHostPort(addr)
|
host, _, err := net.SplitHostPort(addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return p.dialerForRequest(host).Dial(network, addr)
|
return p.dialerForRequest(host).Dial(network, addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DialContext connects to the address addr on the given network through either
|
// DialContext connects to the address addr on the given network through either
|
||||||
// defaultDialer or bypass.
|
// defaultDialer or bypass.
|
||||||
func (p *PerHost) DialContext(ctx context.Context, network, addr string) (c net.Conn, err error) {
|
func (p *PerHost) DialContext(ctx context.Context, network, addr string) (c net.Conn, err error) {
|
||||||
host, _, err := net.SplitHostPort(addr)
|
host, _, err := net.SplitHostPort(addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
d := p.dialerForRequest(host)
|
d := p.dialerForRequest(host)
|
||||||
if x, ok := d.(ContextDialer); ok {
|
if x, ok := d.(ContextDialer); ok {
|
||||||
return x.DialContext(ctx, network, addr)
|
return x.DialContext(ctx, network, addr)
|
||||||
}
|
}
|
||||||
return dialContext(ctx, d, network, addr)
|
return dialContext(ctx, d, network, addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PerHost) dialerForRequest(host string) Dialer {
|
func (p *PerHost) dialerForRequest(host string) Dialer {
|
||||||
if ip := net.ParseIP(host); ip != nil {
|
if ip := net.ParseIP(host); ip != nil {
|
||||||
for _, net := range p.bypassNetworks {
|
for _, net := range p.bypassNetworks {
|
||||||
if net.Contains(ip) {
|
if net.Contains(ip) {
|
||||||
return p.bypass
|
return p.bypass
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, bypassIP := range p.bypassIPs {
|
for _, bypassIP := range p.bypassIPs {
|
||||||
if bypassIP.Equal(ip) {
|
if bypassIP.Equal(ip) {
|
||||||
return p.bypass
|
return p.bypass
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return p.def
|
return p.def
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, zone := range p.bypassZones {
|
for _, zone := range p.bypassZones {
|
||||||
if strings.HasSuffix(host, zone) {
|
if strings.HasSuffix(host, zone) {
|
||||||
return p.bypass
|
return p.bypass
|
||||||
}
|
}
|
||||||
if host == zone[1:] {
|
if host == zone[1:] {
|
||||||
// For a zone ".example.com", we match "example.com"
|
// For a zone ".example.com", we match "example.com"
|
||||||
// too.
|
// too.
|
||||||
return p.bypass
|
return p.bypass
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, bypassHost := range p.bypassHosts {
|
for _, bypassHost := range p.bypassHosts {
|
||||||
if bypassHost == host {
|
if bypassHost == host {
|
||||||
return p.bypass
|
return p.bypass
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return p.def
|
return p.def
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddFromString parses a string that contains comma-separated values
|
// AddFromString parses a string that contains comma-separated values
|
||||||
// specifying hosts that should use the bypass proxy. Each value is either an
|
// specifying hosts that should use the bypass proxy. Each value is either an
|
||||||
// IP address, a CIDR range, a zone (*.example.com) or a host name
|
// IP address, a CIDR range, a zone (*.example.com) or a host name
|
||||||
// (localhost). A best effort is made to parse the string and errors are
|
// (localhost). A best effort is made to parse the string and errors are
|
||||||
// ignored.
|
// ignored.
|
||||||
func (p *PerHost) AddFromString(s string) {
|
func (p *PerHost) AddFromString(s string) {
|
||||||
hosts := strings.Split(s, ",")
|
hosts := strings.Split(s, ",")
|
||||||
for _, host := range hosts {
|
for _, host := range hosts {
|
||||||
host = strings.TrimSpace(host)
|
host = strings.TrimSpace(host)
|
||||||
if len(host) == 0 {
|
if len(host) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if strings.Contains(host, "/") {
|
if strings.Contains(host, "/") {
|
||||||
// We assume that it's a CIDR address like 127.0.0.0/8
|
// We assume that it's a CIDR address like 127.0.0.0/8
|
||||||
if _, net, err := net.ParseCIDR(host); err == nil {
|
if _, net, err := net.ParseCIDR(host); err == nil {
|
||||||
p.AddNetwork(net)
|
p.AddNetwork(net)
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if ip := net.ParseIP(host); ip != nil {
|
if ip := net.ParseIP(host); ip != nil {
|
||||||
p.AddIP(ip)
|
p.AddIP(ip)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if strings.HasPrefix(host, "*.") {
|
if strings.HasPrefix(host, "*.") {
|
||||||
p.AddZone(host[1:])
|
p.AddZone(host[1:])
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
p.AddHost(host)
|
p.AddHost(host)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddIP specifies an IP address that will use the bypass proxy. Note that
|
// AddIP specifies an IP address that will use the bypass proxy. Note that
|
||||||
// this will only take effect if a literal IP address is dialed. A connection
|
// this will only take effect if a literal IP address is dialed. A connection
|
||||||
// to a named host will never match an IP.
|
// to a named host will never match an IP.
|
||||||
func (p *PerHost) AddIP(ip net.IP) {
|
func (p *PerHost) AddIP(ip net.IP) {
|
||||||
p.bypassIPs = append(p.bypassIPs, ip)
|
p.bypassIPs = append(p.bypassIPs, ip)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddNetwork specifies an IP range that will use the bypass proxy. Note that
|
// AddNetwork specifies an IP range that will use the bypass proxy. Note that
|
||||||
// this will only take effect if a literal IP address is dialed. A connection
|
// this will only take effect if a literal IP address is dialed. A connection
|
||||||
// to a named host will never match.
|
// to a named host will never match.
|
||||||
func (p *PerHost) AddNetwork(net *net.IPNet) {
|
func (p *PerHost) AddNetwork(net *net.IPNet) {
|
||||||
p.bypassNetworks = append(p.bypassNetworks, net)
|
p.bypassNetworks = append(p.bypassNetworks, net)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddZone specifies a DNS suffix that will use the bypass proxy. A zone of
|
// AddZone specifies a DNS suffix that will use the bypass proxy. A zone of
|
||||||
// "example.com" matches "example.com" and all of its subdomains.
|
// "example.com" matches "example.com" and all of its subdomains.
|
||||||
func (p *PerHost) AddZone(zone string) {
|
func (p *PerHost) AddZone(zone string) {
|
||||||
if strings.HasSuffix(zone, ".") {
|
if strings.HasSuffix(zone, ".") {
|
||||||
zone = zone[:len(zone)-1]
|
zone = zone[:len(zone)-1]
|
||||||
}
|
}
|
||||||
if !strings.HasPrefix(zone, ".") {
|
if !strings.HasPrefix(zone, ".") {
|
||||||
zone = "." + zone
|
zone = "." + zone
|
||||||
}
|
}
|
||||||
p.bypassZones = append(p.bypassZones, zone)
|
p.bypassZones = append(p.bypassZones, zone)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddHost specifies a host name that will use the bypass proxy.
|
// AddHost specifies a host name that will use the bypass proxy.
|
||||||
func (p *PerHost) AddHost(host string) {
|
func (p *PerHost) AddHost(host string) {
|
||||||
if strings.HasSuffix(host, ".") {
|
if strings.HasSuffix(host, ".") {
|
||||||
host = host[:len(host)-1]
|
host = host[:len(host)-1]
|
||||||
}
|
}
|
||||||
p.bypassHosts = append(p.bypassHosts, host)
|
p.bypassHosts = append(p.bypassHosts, host)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,149 +1,149 @@
|
||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
// Copyright 2011 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// Package proxy provides support for a variety of protocols to proxy network
|
// Package proxy provides support for a variety of protocols to proxy network
|
||||||
// data.
|
// data.
|
||||||
package proxy // import "golang.org/x/net/proxy"
|
package proxy // import "golang.org/x/net/proxy"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"net"
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
// A Dialer is a means to establish a connection.
|
// A Dialer is a means to establish a connection.
|
||||||
// Custom dialers should also implement ContextDialer.
|
// Custom dialers should also implement ContextDialer.
|
||||||
type Dialer interface {
|
type Dialer interface {
|
||||||
// Dial connects to the given address via the proxy.
|
// Dial connects to the given address via the proxy.
|
||||||
Dial(network, addr string) (c net.Conn, err error)
|
Dial(network, addr string) (c net.Conn, err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Auth contains authentication parameters that specific Dialers may require.
|
// Auth contains authentication parameters that specific Dialers may require.
|
||||||
type Auth struct {
|
type Auth struct {
|
||||||
User, Password string
|
User, Password string
|
||||||
}
|
}
|
||||||
|
|
||||||
// FromEnvironment returns the dialer specified by the proxy-related
|
// FromEnvironment returns the dialer specified by the proxy-related
|
||||||
// variables in the environment and makes underlying connections
|
// variables in the environment and makes underlying connections
|
||||||
// directly.
|
// directly.
|
||||||
func FromEnvironment() Dialer {
|
func FromEnvironment() Dialer {
|
||||||
return FromEnvironmentUsing(Direct)
|
return FromEnvironmentUsing(Direct)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FromEnvironmentUsing returns the dialer specify by the proxy-related
|
// FromEnvironmentUsing returns the dialer specify by the proxy-related
|
||||||
// variables in the environment and makes underlying connections
|
// variables in the environment and makes underlying connections
|
||||||
// using the provided forwarding Dialer (for instance, a *net.Dialer
|
// using the provided forwarding Dialer (for instance, a *net.Dialer
|
||||||
// with desired configuration).
|
// with desired configuration).
|
||||||
func FromEnvironmentUsing(forward Dialer) Dialer {
|
func FromEnvironmentUsing(forward Dialer) Dialer {
|
||||||
allProxy := allProxyEnv.Get()
|
allProxy := allProxyEnv.Get()
|
||||||
if len(allProxy) == 0 {
|
if len(allProxy) == 0 {
|
||||||
return forward
|
return forward
|
||||||
}
|
}
|
||||||
|
|
||||||
proxyURL, err := url.Parse(allProxy)
|
proxyURL, err := url.Parse(allProxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return forward
|
return forward
|
||||||
}
|
}
|
||||||
proxy, err := FromURL(proxyURL, forward)
|
proxy, err := FromURL(proxyURL, forward)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return forward
|
return forward
|
||||||
}
|
}
|
||||||
|
|
||||||
noProxy := noProxyEnv.Get()
|
noProxy := noProxyEnv.Get()
|
||||||
if len(noProxy) == 0 {
|
if len(noProxy) == 0 {
|
||||||
return proxy
|
return proxy
|
||||||
}
|
}
|
||||||
|
|
||||||
perHost := NewPerHost(proxy, forward)
|
perHost := NewPerHost(proxy, forward)
|
||||||
perHost.AddFromString(noProxy)
|
perHost.AddFromString(noProxy)
|
||||||
return perHost
|
return perHost
|
||||||
}
|
}
|
||||||
|
|
||||||
// proxySchemes is a map from URL schemes to a function that creates a Dialer
|
// proxySchemes is a map from URL schemes to a function that creates a Dialer
|
||||||
// from a URL with such a scheme.
|
// from a URL with such a scheme.
|
||||||
var proxySchemes map[string]func(*url.URL, Dialer) (Dialer, error)
|
var proxySchemes map[string]func(*url.URL, Dialer) (Dialer, error)
|
||||||
|
|
||||||
// RegisterDialerType takes a URL scheme and a function to generate Dialers from
|
// RegisterDialerType takes a URL scheme and a function to generate Dialers from
|
||||||
// a URL with that scheme and a forwarding Dialer. Registered schemes are used
|
// a URL with that scheme and a forwarding Dialer. Registered schemes are used
|
||||||
// by FromURL.
|
// by FromURL.
|
||||||
func RegisterDialerType(scheme string, f func(*url.URL, Dialer) (Dialer, error)) {
|
func RegisterDialerType(scheme string, f func(*url.URL, Dialer) (Dialer, error)) {
|
||||||
if proxySchemes == nil {
|
if proxySchemes == nil {
|
||||||
proxySchemes = make(map[string]func(*url.URL, Dialer) (Dialer, error))
|
proxySchemes = make(map[string]func(*url.URL, Dialer) (Dialer, error))
|
||||||
}
|
}
|
||||||
proxySchemes[scheme] = f
|
proxySchemes[scheme] = f
|
||||||
}
|
}
|
||||||
|
|
||||||
// FromURL returns a Dialer given a URL specification and an underlying
|
// FromURL returns a Dialer given a URL specification and an underlying
|
||||||
// Dialer for it to make network requests.
|
// Dialer for it to make network requests.
|
||||||
func FromURL(u *url.URL, forward Dialer) (Dialer, error) {
|
func FromURL(u *url.URL, forward Dialer) (Dialer, error) {
|
||||||
var auth *Auth
|
var auth *Auth
|
||||||
if u.User != nil {
|
if u.User != nil {
|
||||||
auth = new(Auth)
|
auth = new(Auth)
|
||||||
auth.User = u.User.Username()
|
auth.User = u.User.Username()
|
||||||
if p, ok := u.User.Password(); ok {
|
if p, ok := u.User.Password(); ok {
|
||||||
auth.Password = p
|
auth.Password = p
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch u.Scheme {
|
switch u.Scheme {
|
||||||
case "socks5", "socks5h":
|
case "socks5", "socks5h":
|
||||||
addr := u.Hostname()
|
addr := u.Hostname()
|
||||||
port := u.Port()
|
port := u.Port()
|
||||||
if port == "" {
|
if port == "" {
|
||||||
port = "1080"
|
port = "1080"
|
||||||
}
|
}
|
||||||
return SOCKS5("tcp", net.JoinHostPort(addr, port), auth, forward)
|
return SOCKS5("tcp", net.JoinHostPort(addr, port), auth, forward)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the scheme doesn't match any of the built-in schemes, see if it
|
// If the scheme doesn't match any of the built-in schemes, see if it
|
||||||
// was registered by another package.
|
// was registered by another package.
|
||||||
if proxySchemes != nil {
|
if proxySchemes != nil {
|
||||||
if f, ok := proxySchemes[u.Scheme]; ok {
|
if f, ok := proxySchemes[u.Scheme]; ok {
|
||||||
return f(u, forward)
|
return f(u, forward)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, errors.New("proxy: unknown scheme: " + u.Scheme)
|
return nil, errors.New("proxy: unknown scheme: " + u.Scheme)
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
allProxyEnv = &envOnce{
|
allProxyEnv = &envOnce{
|
||||||
names: []string{"ALL_PROXY", "all_proxy"},
|
names: []string{"ALL_PROXY", "all_proxy"},
|
||||||
}
|
}
|
||||||
noProxyEnv = &envOnce{
|
noProxyEnv = &envOnce{
|
||||||
names: []string{"NO_PROXY", "no_proxy"},
|
names: []string{"NO_PROXY", "no_proxy"},
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// envOnce looks up an environment variable (optionally by multiple
|
// envOnce looks up an environment variable (optionally by multiple
|
||||||
// names) once. It mitigates expensive lookups on some platforms
|
// names) once. It mitigates expensive lookups on some platforms
|
||||||
// (e.g. Windows).
|
// (e.g. Windows).
|
||||||
// (Borrowed from net/http/transport.go)
|
// (Borrowed from net/http/transport.go)
|
||||||
type envOnce struct {
|
type envOnce struct {
|
||||||
names []string
|
names []string
|
||||||
once sync.Once
|
once sync.Once
|
||||||
val string
|
val string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *envOnce) Get() string {
|
func (e *envOnce) Get() string {
|
||||||
e.once.Do(e.init)
|
e.once.Do(e.init)
|
||||||
return e.val
|
return e.val
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *envOnce) init() {
|
func (e *envOnce) init() {
|
||||||
for _, n := range e.names {
|
for _, n := range e.names {
|
||||||
e.val = os.Getenv(n)
|
e.val = os.Getenv(n)
|
||||||
if e.val != "" {
|
if e.val != "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// reset is used by tests
|
// reset is used by tests
|
||||||
func (e *envOnce) reset() {
|
func (e *envOnce) reset() {
|
||||||
e.once = sync.Once{}
|
e.once = sync.Once{}
|
||||||
e.val = ""
|
e.val = ""
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,42 +1,42 @@
|
||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
// Copyright 2011 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package proxy
|
package proxy
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"net"
|
"net"
|
||||||
|
|
||||||
"golang.org/x/net/internal/socks"
|
"golang.org/x/net/internal/socks"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SOCKS5 returns a Dialer that makes SOCKSv5 connections to the given
|
// SOCKS5 returns a Dialer that makes SOCKSv5 connections to the given
|
||||||
// address with an optional username and password.
|
// address with an optional username and password.
|
||||||
// See RFC 1928 and RFC 1929.
|
// See RFC 1928 and RFC 1929.
|
||||||
func SOCKS5(network, address string, auth *Auth, forward Dialer) (Dialer, error) {
|
func SOCKS5(network, address string, auth *Auth, forward Dialer) (Dialer, error) {
|
||||||
d := socks.NewDialer(network, address)
|
d := socks.NewDialer(network, address)
|
||||||
if forward != nil {
|
if forward != nil {
|
||||||
if f, ok := forward.(ContextDialer); ok {
|
if f, ok := forward.(ContextDialer); ok {
|
||||||
d.ProxyDial = func(ctx context.Context, network string, address string) (net.Conn, error) {
|
d.ProxyDial = func(ctx context.Context, network string, address string) (net.Conn, error) {
|
||||||
return f.DialContext(ctx, network, address)
|
return f.DialContext(ctx, network, address)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
d.ProxyDial = func(ctx context.Context, network string, address string) (net.Conn, error) {
|
d.ProxyDial = func(ctx context.Context, network string, address string) (net.Conn, error) {
|
||||||
return dialContext(ctx, forward, network, address)
|
return dialContext(ctx, forward, network, address)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if auth != nil {
|
if auth != nil {
|
||||||
up := socks.UsernamePassword{
|
up := socks.UsernamePassword{
|
||||||
Username: auth.User,
|
Username: auth.User,
|
||||||
Password: auth.Password,
|
Password: auth.Password,
|
||||||
}
|
}
|
||||||
d.AuthMethods = []socks.AuthMethod{
|
d.AuthMethods = []socks.AuthMethod{
|
||||||
socks.AuthMethodNotRequired,
|
socks.AuthMethodNotRequired,
|
||||||
socks.AuthMethodUsernamePassword,
|
socks.AuthMethodUsernamePassword,
|
||||||
}
|
}
|
||||||
d.Authenticate = up.Authenticate
|
d.Authenticate = up.Authenticate
|
||||||
}
|
}
|
||||||
return d, nil
|
return d, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
language: go
|
language: go
|
||||||
|
|
||||||
go:
|
go:
|
||||||
- tip
|
- tip
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- export GOPATH="$HOME/gopath"
|
- export GOPATH="$HOME/gopath"
|
||||||
- mkdir -p "$GOPATH/src/golang.org/x"
|
- mkdir -p "$GOPATH/src/golang.org/x"
|
||||||
- mv "$TRAVIS_BUILD_DIR" "$GOPATH/src/golang.org/x/oauth2"
|
- mv "$TRAVIS_BUILD_DIR" "$GOPATH/src/golang.org/x/oauth2"
|
||||||
- go get -v -t -d golang.org/x/oauth2/...
|
- go get -v -t -d golang.org/x/oauth2/...
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- go test -v golang.org/x/oauth2/...
|
- go test -v golang.org/x/oauth2/...
|
||||||
|
|
|
||||||
|
|
@ -1,26 +1,26 @@
|
||||||
# Contributing to Go
|
# Contributing to Go
|
||||||
|
|
||||||
Go is an open source project.
|
Go is an open source project.
|
||||||
|
|
||||||
It is the work of hundreds of contributors. We appreciate your help!
|
It is the work of hundreds of contributors. We appreciate your help!
|
||||||
|
|
||||||
## Filing issues
|
## Filing issues
|
||||||
|
|
||||||
When [filing an issue](https://github.com/golang/oauth2/issues), make sure to answer these five questions:
|
When [filing an issue](https://github.com/golang/oauth2/issues), make sure to answer these five questions:
|
||||||
|
|
||||||
1. What version of Go are you using (`go version`)?
|
1. What version of Go are you using (`go version`)?
|
||||||
2. What operating system and processor architecture are you using?
|
2. What operating system and processor architecture are you using?
|
||||||
3. What did you do?
|
3. What did you do?
|
||||||
4. What did you expect to see?
|
4. What did you expect to see?
|
||||||
5. What did you see instead?
|
5. What did you see instead?
|
||||||
|
|
||||||
General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker.
|
General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker.
|
||||||
The gophers there will answer or ask you to file an issue if you've tripped over a bug.
|
The gophers there will answer or ask you to file an issue if you've tripped over a bug.
|
||||||
|
|
||||||
## Contributing code
|
## Contributing code
|
||||||
|
|
||||||
Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html)
|
Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html)
|
||||||
before sending patches.
|
before sending patches.
|
||||||
|
|
||||||
Unless otherwise noted, the Go source files are distributed under
|
Unless otherwise noted, the Go source files are distributed under
|
||||||
the BSD-style license found in the LICENSE file.
|
the BSD-style license found in the LICENSE file.
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
module golang.org/x/oauth2
|
|
||||||
|
|
||||||
go 1.11
|
|
||||||
|
|
||||||
require (
|
|
||||||
cloud.google.com/go v0.34.0
|
|
||||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e
|
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 // indirect
|
|
||||||
google.golang.org/appengine v1.4.0
|
|
||||||
)
|
|
||||||
=======
|
|
||||||
module golang.org/x/oauth2
|
module golang.org/x/oauth2
|
||||||
|
|
||||||
go 1.11
|
go 1.11
|
||||||
|
|
@ -19,4 +7,3 @@ require (
|
||||||
golang.org/x/net v0.0.0-20200822124328-c89045814202
|
golang.org/x/net v0.0.0-20200822124328-c89045814202
|
||||||
google.golang.org/appengine v1.6.6
|
google.golang.org/appengine v1.6.6
|
||||||
)
|
)
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg=
|
|
||||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
|
||||||
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
|
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e h1:bRhVy7zSSasaqNksaRZiA5EEI+Ei4I1nO5Jh72wfHlg=
|
|
||||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw=
|
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
|
||||||
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
|
|
||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
|
||||||
=======
|
|
||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
||||||
|
|
@ -373,4 +359,3 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9
|
||||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||||
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
||||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,38 +1,38 @@
|
||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
// Copyright 2014 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package google
|
package google
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Set at init time by appengine_gen1.go. If nil, we're not on App Engine standard first generation (<= Go 1.9) or App Engine flexible.
|
// Set at init time by appengine_gen1.go. If nil, we're not on App Engine standard first generation (<= Go 1.9) or App Engine flexible.
|
||||||
var appengineTokenFunc func(c context.Context, scopes ...string) (token string, expiry time.Time, err error)
|
var appengineTokenFunc func(c context.Context, scopes ...string) (token string, expiry time.Time, err error)
|
||||||
|
|
||||||
// Set at init time by appengine_gen1.go. If nil, we're not on App Engine standard first generation (<= Go 1.9) or App Engine flexible.
|
// Set at init time by appengine_gen1.go. If nil, we're not on App Engine standard first generation (<= Go 1.9) or App Engine flexible.
|
||||||
var appengineAppIDFunc func(c context.Context) string
|
var appengineAppIDFunc func(c context.Context) string
|
||||||
|
|
||||||
// AppEngineTokenSource returns a token source that fetches tokens from either
|
// AppEngineTokenSource returns a token source that fetches tokens from either
|
||||||
// the current application's service account or from the metadata server,
|
// the current application's service account or from the metadata server,
|
||||||
// depending on the App Engine environment. See below for environment-specific
|
// depending on the App Engine environment. See below for environment-specific
|
||||||
// details. If you are implementing a 3-legged OAuth 2.0 flow on App Engine that
|
// details. If you are implementing a 3-legged OAuth 2.0 flow on App Engine that
|
||||||
// involves user accounts, see oauth2.Config instead.
|
// involves user accounts, see oauth2.Config instead.
|
||||||
//
|
//
|
||||||
// First generation App Engine runtimes (<= Go 1.9):
|
// First generation App Engine runtimes (<= Go 1.9):
|
||||||
// AppEngineTokenSource returns a token source that fetches tokens issued to the
|
// AppEngineTokenSource returns a token source that fetches tokens issued to the
|
||||||
// current App Engine application's service account. The provided context must have
|
// current App Engine application's service account. The provided context must have
|
||||||
// come from appengine.NewContext.
|
// come from appengine.NewContext.
|
||||||
//
|
//
|
||||||
// Second generation App Engine runtimes (>= Go 1.11) and App Engine flexible:
|
// Second generation App Engine runtimes (>= Go 1.11) and App Engine flexible:
|
||||||
// AppEngineTokenSource is DEPRECATED on second generation runtimes and on the
|
// AppEngineTokenSource is DEPRECATED on second generation runtimes and on the
|
||||||
// flexible environment. It delegates to ComputeTokenSource, and the provided
|
// flexible environment. It delegates to ComputeTokenSource, and the provided
|
||||||
// context and scopes are not used. Please use DefaultTokenSource (or ComputeTokenSource,
|
// context and scopes are not used. Please use DefaultTokenSource (or ComputeTokenSource,
|
||||||
// which DefaultTokenSource will use in this case) instead.
|
// which DefaultTokenSource will use in this case) instead.
|
||||||
func AppEngineTokenSource(ctx context.Context, scope ...string) oauth2.TokenSource {
|
func AppEngineTokenSource(ctx context.Context, scope ...string) oauth2.TokenSource {
|
||||||
return appEngineTokenSource(ctx, scope...)
|
return appEngineTokenSource(ctx, scope...)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,82 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// 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 appengine
|
|
||||||
|
|
||||||
// This file applies to App Engine first generation runtimes (<= Go 1.9).
|
|
||||||
|
|
||||||
package google
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
|
|
||||||
"golang.org/x/oauth2"
|
|
||||||
"google.golang.org/appengine"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
appengineTokenFunc = appengine.AccessToken
|
|
||||||
appengineAppIDFunc = appengine.AppID
|
|
||||||
}
|
|
||||||
|
|
||||||
// See comment on AppEngineTokenSource in appengine.go.
|
|
||||||
func appEngineTokenSource(ctx context.Context, scope ...string) oauth2.TokenSource {
|
|
||||||
scopes := append([]string{}, scope...)
|
|
||||||
sort.Strings(scopes)
|
|
||||||
return &gaeTokenSource{
|
|
||||||
ctx: ctx,
|
|
||||||
scopes: scopes,
|
|
||||||
key: strings.Join(scopes, " "),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// aeTokens helps the fetched tokens to be reused until their expiration.
|
|
||||||
var (
|
|
||||||
aeTokensMu sync.Mutex
|
|
||||||
aeTokens = make(map[string]*tokenLock) // key is space-separated scopes
|
|
||||||
)
|
|
||||||
|
|
||||||
type tokenLock struct {
|
|
||||||
mu sync.Mutex // guards t; held while fetching or updating t
|
|
||||||
t *oauth2.Token
|
|
||||||
}
|
|
||||||
|
|
||||||
type gaeTokenSource struct {
|
|
||||||
ctx context.Context
|
|
||||||
scopes []string
|
|
||||||
key string // to aeTokens map; space-separated scopes
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ts *gaeTokenSource) Token() (*oauth2.Token, error) {
|
|
||||||
aeTokensMu.Lock()
|
|
||||||
tok, ok := aeTokens[ts.key]
|
|
||||||
if !ok {
|
|
||||||
tok = &tokenLock{}
|
|
||||||
aeTokens[ts.key] = tok
|
|
||||||
}
|
|
||||||
aeTokensMu.Unlock()
|
|
||||||
|
|
||||||
tok.mu.Lock()
|
|
||||||
defer tok.mu.Unlock()
|
|
||||||
if tok.t.Valid() {
|
|
||||||
return tok.t, nil
|
|
||||||
}
|
|
||||||
access, exp, err := appengineTokenFunc(ts.ctx, ts.scopes...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
tok.t = &oauth2.Token{
|
|
||||||
AccessToken: access,
|
|
||||||
Expiry: exp,
|
|
||||||
}
|
|
||||||
return tok.t, nil
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -155,4 +76,3 @@ func (ts *gaeTokenSource) Token() (*oauth2.Token, error) {
|
||||||
}
|
}
|
||||||
return tok.t, nil
|
return tok.t, nil
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,32 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// 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 !appengine
|
|
||||||
|
|
||||||
// This file applies to App Engine second generation runtimes (>= Go 1.11) and App Engine flexible.
|
|
||||||
|
|
||||||
package google
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"log"
|
|
||||||
"sync"
|
|
||||||
|
|
||||||
"golang.org/x/oauth2"
|
|
||||||
)
|
|
||||||
|
|
||||||
var logOnce sync.Once // only spam about deprecation once
|
|
||||||
|
|
||||||
// See comment on AppEngineTokenSource in appengine.go.
|
|
||||||
func appEngineTokenSource(ctx context.Context, scope ...string) oauth2.TokenSource {
|
|
||||||
logOnce.Do(func() {
|
|
||||||
log.Print("google: AppEngineTokenSource is deprecated on App Engine standard second generation runtimes (>= Go 1.11) and App Engine flexible. Please use DefaultTokenSource or ComputeTokenSource.")
|
|
||||||
})
|
|
||||||
return ComputeTokenSource("")
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -55,4 +26,3 @@ func appEngineTokenSource(ctx context.Context, scope ...string) oauth2.TokenSour
|
||||||
})
|
})
|
||||||
return ComputeTokenSource("")
|
return ComputeTokenSource("")
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,159 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// 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 google
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"runtime"
|
|
||||||
|
|
||||||
"cloud.google.com/go/compute/metadata"
|
|
||||||
"golang.org/x/oauth2"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Credentials holds Google credentials, including "Application Default Credentials".
|
|
||||||
// For more details, see:
|
|
||||||
// https://developers.google.com/accounts/docs/application-default-credentials
|
|
||||||
type Credentials struct {
|
|
||||||
ProjectID string // may be empty
|
|
||||||
TokenSource oauth2.TokenSource
|
|
||||||
|
|
||||||
// JSON contains the raw bytes from a JSON credentials file.
|
|
||||||
// This field may be nil if authentication is provided by the
|
|
||||||
// environment and not with a credentials file, e.g. when code is
|
|
||||||
// running on Google Cloud Platform.
|
|
||||||
JSON []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
// DefaultCredentials is the old name of Credentials.
|
|
||||||
//
|
|
||||||
// Deprecated: use Credentials instead.
|
|
||||||
type DefaultCredentials = Credentials
|
|
||||||
|
|
||||||
// DefaultClient returns an HTTP Client that uses the
|
|
||||||
// DefaultTokenSource to obtain authentication credentials.
|
|
||||||
func DefaultClient(ctx context.Context, scope ...string) (*http.Client, error) {
|
|
||||||
ts, err := DefaultTokenSource(ctx, scope...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return oauth2.NewClient(ctx, ts), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DefaultTokenSource returns the token source for
|
|
||||||
// "Application Default Credentials".
|
|
||||||
// It is a shortcut for FindDefaultCredentials(ctx, scope).TokenSource.
|
|
||||||
func DefaultTokenSource(ctx context.Context, scope ...string) (oauth2.TokenSource, error) {
|
|
||||||
creds, err := FindDefaultCredentials(ctx, scope...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return creds.TokenSource, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindDefaultCredentials searches for "Application Default Credentials".
|
|
||||||
//
|
|
||||||
// It looks for credentials in the following places,
|
|
||||||
// preferring the first location found:
|
|
||||||
//
|
|
||||||
// 1. A JSON file whose path is specified by the
|
|
||||||
// GOOGLE_APPLICATION_CREDENTIALS environment variable.
|
|
||||||
// 2. A JSON file in a location known to the gcloud command-line tool.
|
|
||||||
// On Windows, this is %APPDATA%/gcloud/application_default_credentials.json.
|
|
||||||
// On other systems, $HOME/.config/gcloud/application_default_credentials.json.
|
|
||||||
// 3. On Google App Engine standard first generation runtimes (<= Go 1.9) it uses
|
|
||||||
// the appengine.AccessToken function.
|
|
||||||
// 4. On Google Compute Engine, Google App Engine standard second generation runtimes
|
|
||||||
// (>= Go 1.11), and Google App Engine flexible environment, it fetches
|
|
||||||
// credentials from the metadata server.
|
|
||||||
func FindDefaultCredentials(ctx context.Context, scopes ...string) (*Credentials, error) {
|
|
||||||
// First, try the environment variable.
|
|
||||||
const envVar = "GOOGLE_APPLICATION_CREDENTIALS"
|
|
||||||
if filename := os.Getenv(envVar); filename != "" {
|
|
||||||
creds, err := readCredentialsFile(ctx, filename, scopes)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("google: error getting credentials using %v environment variable: %v", envVar, err)
|
|
||||||
}
|
|
||||||
return creds, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Second, try a well-known file.
|
|
||||||
filename := wellKnownFile()
|
|
||||||
if creds, err := readCredentialsFile(ctx, filename, scopes); err == nil {
|
|
||||||
return creds, nil
|
|
||||||
} else if !os.IsNotExist(err) {
|
|
||||||
return nil, fmt.Errorf("google: error getting credentials using well-known file (%v): %v", filename, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Third, if we're on a Google App Engine standard first generation runtime (<= Go 1.9)
|
|
||||||
// use those credentials. App Engine standard second generation runtimes (>= Go 1.11)
|
|
||||||
// and App Engine flexible use ComputeTokenSource and the metadata server.
|
|
||||||
if appengineTokenFunc != nil {
|
|
||||||
return &DefaultCredentials{
|
|
||||||
ProjectID: appengineAppIDFunc(ctx),
|
|
||||||
TokenSource: AppEngineTokenSource(ctx, scopes...),
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fourth, if we're on Google Compute Engine, an App Engine standard second generation runtime,
|
|
||||||
// or App Engine flexible, use the metadata server.
|
|
||||||
if metadata.OnGCE() {
|
|
||||||
id, _ := metadata.ProjectID()
|
|
||||||
return &DefaultCredentials{
|
|
||||||
ProjectID: id,
|
|
||||||
TokenSource: ComputeTokenSource("", scopes...),
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// None are found; return helpful error.
|
|
||||||
const url = "https://developers.google.com/accounts/docs/application-default-credentials"
|
|
||||||
return nil, fmt.Errorf("google: could not find default credentials. See %v for more information.", url)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CredentialsFromJSON obtains Google credentials from a JSON value. The JSON can
|
|
||||||
// represent either a Google Developers Console client_credentials.json file (as in
|
|
||||||
// ConfigFromJSON) or a Google Developers service account key file (as in
|
|
||||||
// JWTConfigFromJSON).
|
|
||||||
func CredentialsFromJSON(ctx context.Context, jsonData []byte, scopes ...string) (*Credentials, error) {
|
|
||||||
var f credentialsFile
|
|
||||||
if err := json.Unmarshal(jsonData, &f); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
ts, err := f.tokenSource(ctx, append([]string(nil), scopes...))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &DefaultCredentials{
|
|
||||||
ProjectID: f.ProjectID,
|
|
||||||
TokenSource: ts,
|
|
||||||
JSON: jsonData,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func wellKnownFile() string {
|
|
||||||
const f = "application_default_credentials.json"
|
|
||||||
if runtime.GOOS == "windows" {
|
|
||||||
return filepath.Join(os.Getenv("APPDATA"), "gcloud", f)
|
|
||||||
}
|
|
||||||
return filepath.Join(guessUnixHomeDir(), ".config", "gcloud", f)
|
|
||||||
}
|
|
||||||
|
|
||||||
func readCredentialsFile(ctx context.Context, filename string, scopes []string) (*DefaultCredentials, error) {
|
|
||||||
b, err := ioutil.ReadFile(filename)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return CredentialsFromJSON(ctx, b, scopes...)
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
// Copyright 2015 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -318,4 +162,3 @@ func readCredentialsFile(ctx context.Context, filename string, scopes []string)
|
||||||
}
|
}
|
||||||
return CredentialsFromJSON(ctx, b, scopes...)
|
return CredentialsFromJSON(ctx, b, scopes...)
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,45 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// 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.
|
|
||||||
|
|
||||||
// Package google provides support for making OAuth2 authorized and authenticated
|
|
||||||
// HTTP requests to Google APIs. It supports the Web server flow, client-side
|
|
||||||
// credentials, service accounts, Google Compute Engine service accounts, and Google
|
|
||||||
// App Engine service accounts.
|
|
||||||
//
|
|
||||||
// A brief overview of the package follows. For more information, please read
|
|
||||||
// https://developers.google.com/accounts/docs/OAuth2
|
|
||||||
// and
|
|
||||||
// https://developers.google.com/accounts/docs/application-default-credentials.
|
|
||||||
//
|
|
||||||
// OAuth2 Configs
|
|
||||||
//
|
|
||||||
// Two functions in this package return golang.org/x/oauth2.Config values from Google credential
|
|
||||||
// data. Google supports two JSON formats for OAuth2 credentials: one is handled by ConfigFromJSON,
|
|
||||||
// the other by JWTConfigFromJSON. The returned Config can be used to obtain a TokenSource or
|
|
||||||
// create an http.Client.
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Credentials
|
|
||||||
//
|
|
||||||
// The Credentials type represents Google credentials, including Application Default
|
|
||||||
// Credentials.
|
|
||||||
//
|
|
||||||
// Use FindDefaultCredentials to obtain Application Default Credentials.
|
|
||||||
// FindDefaultCredentials looks in some well-known places for a credentials file, and
|
|
||||||
// will call AppEngineTokenSource or ComputeTokenSource as needed.
|
|
||||||
//
|
|
||||||
// DefaultClient and DefaultTokenSource are convenience methods. They first call FindDefaultCredentials,
|
|
||||||
// then use the credentials to construct an http.Client or an oauth2.TokenSource.
|
|
||||||
//
|
|
||||||
// Use CredentialsFromJSON to obtain credentials from either of the two JSON formats
|
|
||||||
// described in OAuth2 Configs, above. The TokenSource in the returned value is the
|
|
||||||
// same as the one obtained from the oauth2.Config returned from ConfigFromJSON or
|
|
||||||
// JWTConfigFromJSON, but the Credentials may contain additional information
|
|
||||||
// that is useful is some circumstances.
|
|
||||||
package google // import "golang.org/x/oauth2/google"
|
|
||||||
=======
|
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -119,4 +77,3 @@ package google // import "golang.org/x/oauth2/google"
|
||||||
// JWTConfigFromJSON, but the Credentials may contain additional information
|
// JWTConfigFromJSON, but the Credentials may contain additional information
|
||||||
// that is useful is some circumstances.
|
// that is useful is some circumstances.
|
||||||
package google // import "golang.org/x/oauth2/google"
|
package google // import "golang.org/x/oauth2/google"
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,214 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// 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 google
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"net/url"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"cloud.google.com/go/compute/metadata"
|
|
||||||
"golang.org/x/oauth2"
|
|
||||||
"golang.org/x/oauth2/jwt"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Endpoint is Google's OAuth 2.0 endpoint.
|
|
||||||
var Endpoint = oauth2.Endpoint{
|
|
||||||
AuthURL: "https://accounts.google.com/o/oauth2/auth",
|
|
||||||
TokenURL: "https://oauth2.googleapis.com/token",
|
|
||||||
AuthStyle: oauth2.AuthStyleInParams,
|
|
||||||
}
|
|
||||||
|
|
||||||
// JWTTokenURL is Google's OAuth 2.0 token URL to use with the JWT flow.
|
|
||||||
const JWTTokenURL = "https://oauth2.googleapis.com/token"
|
|
||||||
|
|
||||||
// ConfigFromJSON uses a Google Developers Console client_credentials.json
|
|
||||||
// file to construct a config.
|
|
||||||
// client_credentials.json can be downloaded from
|
|
||||||
// https://console.developers.google.com, under "Credentials". Download the Web
|
|
||||||
// application credentials in the JSON format and provide the contents of the
|
|
||||||
// file as jsonKey.
|
|
||||||
func ConfigFromJSON(jsonKey []byte, scope ...string) (*oauth2.Config, error) {
|
|
||||||
type cred struct {
|
|
||||||
ClientID string `json:"client_id"`
|
|
||||||
ClientSecret string `json:"client_secret"`
|
|
||||||
RedirectURIs []string `json:"redirect_uris"`
|
|
||||||
AuthURI string `json:"auth_uri"`
|
|
||||||
TokenURI string `json:"token_uri"`
|
|
||||||
}
|
|
||||||
var j struct {
|
|
||||||
Web *cred `json:"web"`
|
|
||||||
Installed *cred `json:"installed"`
|
|
||||||
}
|
|
||||||
if err := json.Unmarshal(jsonKey, &j); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var c *cred
|
|
||||||
switch {
|
|
||||||
case j.Web != nil:
|
|
||||||
c = j.Web
|
|
||||||
case j.Installed != nil:
|
|
||||||
c = j.Installed
|
|
||||||
default:
|
|
||||||
return nil, fmt.Errorf("oauth2/google: no credentials found")
|
|
||||||
}
|
|
||||||
if len(c.RedirectURIs) < 1 {
|
|
||||||
return nil, errors.New("oauth2/google: missing redirect URL in the client_credentials.json")
|
|
||||||
}
|
|
||||||
return &oauth2.Config{
|
|
||||||
ClientID: c.ClientID,
|
|
||||||
ClientSecret: c.ClientSecret,
|
|
||||||
RedirectURL: c.RedirectURIs[0],
|
|
||||||
Scopes: scope,
|
|
||||||
Endpoint: oauth2.Endpoint{
|
|
||||||
AuthURL: c.AuthURI,
|
|
||||||
TokenURL: c.TokenURI,
|
|
||||||
},
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// JWTConfigFromJSON uses a Google Developers service account JSON key file to read
|
|
||||||
// the credentials that authorize and authenticate the requests.
|
|
||||||
// Create a service account on "Credentials" for your project at
|
|
||||||
// https://console.developers.google.com to download a JSON key file.
|
|
||||||
func JWTConfigFromJSON(jsonKey []byte, scope ...string) (*jwt.Config, error) {
|
|
||||||
var f credentialsFile
|
|
||||||
if err := json.Unmarshal(jsonKey, &f); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if f.Type != serviceAccountKey {
|
|
||||||
return nil, fmt.Errorf("google: read JWT from JSON credentials: 'type' field is %q (expected %q)", f.Type, serviceAccountKey)
|
|
||||||
}
|
|
||||||
scope = append([]string(nil), scope...) // copy
|
|
||||||
return f.jwtConfig(scope), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSON key file types.
|
|
||||||
const (
|
|
||||||
serviceAccountKey = "service_account"
|
|
||||||
userCredentialsKey = "authorized_user"
|
|
||||||
)
|
|
||||||
|
|
||||||
// credentialsFile is the unmarshalled representation of a credentials file.
|
|
||||||
type credentialsFile struct {
|
|
||||||
Type string `json:"type"` // serviceAccountKey or userCredentialsKey
|
|
||||||
|
|
||||||
// Service Account fields
|
|
||||||
ClientEmail string `json:"client_email"`
|
|
||||||
PrivateKeyID string `json:"private_key_id"`
|
|
||||||
PrivateKey string `json:"private_key"`
|
|
||||||
TokenURL string `json:"token_uri"`
|
|
||||||
ProjectID string `json:"project_id"`
|
|
||||||
|
|
||||||
// User Credential fields
|
|
||||||
// (These typically come from gcloud auth.)
|
|
||||||
ClientSecret string `json:"client_secret"`
|
|
||||||
ClientID string `json:"client_id"`
|
|
||||||
RefreshToken string `json:"refresh_token"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *credentialsFile) jwtConfig(scopes []string) *jwt.Config {
|
|
||||||
cfg := &jwt.Config{
|
|
||||||
Email: f.ClientEmail,
|
|
||||||
PrivateKey: []byte(f.PrivateKey),
|
|
||||||
PrivateKeyID: f.PrivateKeyID,
|
|
||||||
Scopes: scopes,
|
|
||||||
TokenURL: f.TokenURL,
|
|
||||||
}
|
|
||||||
if cfg.TokenURL == "" {
|
|
||||||
cfg.TokenURL = JWTTokenURL
|
|
||||||
}
|
|
||||||
return cfg
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *credentialsFile) tokenSource(ctx context.Context, scopes []string) (oauth2.TokenSource, error) {
|
|
||||||
switch f.Type {
|
|
||||||
case serviceAccountKey:
|
|
||||||
cfg := f.jwtConfig(scopes)
|
|
||||||
return cfg.TokenSource(ctx), nil
|
|
||||||
case userCredentialsKey:
|
|
||||||
cfg := &oauth2.Config{
|
|
||||||
ClientID: f.ClientID,
|
|
||||||
ClientSecret: f.ClientSecret,
|
|
||||||
Scopes: scopes,
|
|
||||||
Endpoint: Endpoint,
|
|
||||||
}
|
|
||||||
tok := &oauth2.Token{RefreshToken: f.RefreshToken}
|
|
||||||
return cfg.TokenSource(ctx, tok), nil
|
|
||||||
case "":
|
|
||||||
return nil, errors.New("missing 'type' field in credentials")
|
|
||||||
default:
|
|
||||||
return nil, fmt.Errorf("unknown credential type: %q", f.Type)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ComputeTokenSource returns a token source that fetches access tokens
|
|
||||||
// from Google Compute Engine (GCE)'s metadata server. It's only valid to use
|
|
||||||
// this token source if your program is running on a GCE instance.
|
|
||||||
// If no account is specified, "default" is used.
|
|
||||||
// If no scopes are specified, a set of default scopes are automatically granted.
|
|
||||||
// Further information about retrieving access tokens from the GCE metadata
|
|
||||||
// server can be found at https://cloud.google.com/compute/docs/authentication.
|
|
||||||
func ComputeTokenSource(account string, scope ...string) oauth2.TokenSource {
|
|
||||||
return oauth2.ReuseTokenSource(nil, computeSource{account: account, scopes: scope})
|
|
||||||
}
|
|
||||||
|
|
||||||
type computeSource struct {
|
|
||||||
account string
|
|
||||||
scopes []string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cs computeSource) Token() (*oauth2.Token, error) {
|
|
||||||
if !metadata.OnGCE() {
|
|
||||||
return nil, errors.New("oauth2/google: can't get a token from the metadata service; not running on GCE")
|
|
||||||
}
|
|
||||||
acct := cs.account
|
|
||||||
if acct == "" {
|
|
||||||
acct = "default"
|
|
||||||
}
|
|
||||||
tokenURI := "instance/service-accounts/" + acct + "/token"
|
|
||||||
if len(cs.scopes) > 0 {
|
|
||||||
v := url.Values{}
|
|
||||||
v.Set("scopes", strings.Join(cs.scopes, ","))
|
|
||||||
tokenURI = tokenURI + "?" + v.Encode()
|
|
||||||
}
|
|
||||||
tokenJSON, err := metadata.Get(tokenURI)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var res struct {
|
|
||||||
AccessToken string `json:"access_token"`
|
|
||||||
ExpiresInSec int `json:"expires_in"`
|
|
||||||
TokenType string `json:"token_type"`
|
|
||||||
}
|
|
||||||
err = json.NewDecoder(strings.NewReader(tokenJSON)).Decode(&res)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("oauth2/google: invalid token JSON from metadata: %v", err)
|
|
||||||
}
|
|
||||||
if res.ExpiresInSec == 0 || res.AccessToken == "" {
|
|
||||||
return nil, fmt.Errorf("oauth2/google: incomplete token received from metadata")
|
|
||||||
}
|
|
||||||
tok := &oauth2.Token{
|
|
||||||
AccessToken: res.AccessToken,
|
|
||||||
TokenType: res.TokenType,
|
|
||||||
Expiry: time.Now().Add(time.Duration(res.ExpiresInSec) * time.Second),
|
|
||||||
}
|
|
||||||
// NOTE(cbro): add hidden metadata about where the token is from.
|
|
||||||
// This is needed for detection by client libraries to know that credentials come from the metadata server.
|
|
||||||
// This may be removed in a future version of this library.
|
|
||||||
return tok.WithExtra(map[string]interface{}{
|
|
||||||
"oauth2.google.tokenSource": "compute-metadata",
|
|
||||||
"oauth2.google.serviceAccount": acct,
|
|
||||||
}), nil
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
// Copyright 2014 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -443,4 +232,3 @@ func (cs computeSource) Token() (*oauth2.Token, error) {
|
||||||
"oauth2.google.serviceAccount": acct,
|
"oauth2.google.serviceAccount": acct,
|
||||||
}), nil
|
}), nil
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,74 +1,74 @@
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
// Copyright 2015 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package google
|
package google
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/rsa"
|
"crypto/rsa"
|
||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
"golang.org/x/oauth2/internal"
|
"golang.org/x/oauth2/internal"
|
||||||
"golang.org/x/oauth2/jws"
|
"golang.org/x/oauth2/jws"
|
||||||
)
|
)
|
||||||
|
|
||||||
// JWTAccessTokenSourceFromJSON uses a Google Developers service account JSON
|
// JWTAccessTokenSourceFromJSON uses a Google Developers service account JSON
|
||||||
// key file to read the credentials that authorize and authenticate the
|
// key file to read the credentials that authorize and authenticate the
|
||||||
// requests, and returns a TokenSource that does not use any OAuth2 flow but
|
// requests, and returns a TokenSource that does not use any OAuth2 flow but
|
||||||
// instead creates a JWT and sends that as the access token.
|
// instead creates a JWT and sends that as the access token.
|
||||||
// The audience is typically a URL that specifies the scope of the credentials.
|
// The audience is typically a URL that specifies the scope of the credentials.
|
||||||
//
|
//
|
||||||
// Note that this is not a standard OAuth flow, but rather an
|
// Note that this is not a standard OAuth flow, but rather an
|
||||||
// optimization supported by a few Google services.
|
// optimization supported by a few Google services.
|
||||||
// Unless you know otherwise, you should use JWTConfigFromJSON instead.
|
// Unless you know otherwise, you should use JWTConfigFromJSON instead.
|
||||||
func JWTAccessTokenSourceFromJSON(jsonKey []byte, audience string) (oauth2.TokenSource, error) {
|
func JWTAccessTokenSourceFromJSON(jsonKey []byte, audience string) (oauth2.TokenSource, error) {
|
||||||
cfg, err := JWTConfigFromJSON(jsonKey)
|
cfg, err := JWTConfigFromJSON(jsonKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("google: could not parse JSON key: %v", err)
|
return nil, fmt.Errorf("google: could not parse JSON key: %v", err)
|
||||||
}
|
}
|
||||||
pk, err := internal.ParseKey(cfg.PrivateKey)
|
pk, err := internal.ParseKey(cfg.PrivateKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("google: could not parse key: %v", err)
|
return nil, fmt.Errorf("google: could not parse key: %v", err)
|
||||||
}
|
}
|
||||||
ts := &jwtAccessTokenSource{
|
ts := &jwtAccessTokenSource{
|
||||||
email: cfg.Email,
|
email: cfg.Email,
|
||||||
audience: audience,
|
audience: audience,
|
||||||
pk: pk,
|
pk: pk,
|
||||||
pkID: cfg.PrivateKeyID,
|
pkID: cfg.PrivateKeyID,
|
||||||
}
|
}
|
||||||
tok, err := ts.Token()
|
tok, err := ts.Token()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return oauth2.ReuseTokenSource(tok, ts), nil
|
return oauth2.ReuseTokenSource(tok, ts), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type jwtAccessTokenSource struct {
|
type jwtAccessTokenSource struct {
|
||||||
email, audience string
|
email, audience string
|
||||||
pk *rsa.PrivateKey
|
pk *rsa.PrivateKey
|
||||||
pkID string
|
pkID string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ts *jwtAccessTokenSource) Token() (*oauth2.Token, error) {
|
func (ts *jwtAccessTokenSource) Token() (*oauth2.Token, error) {
|
||||||
iat := time.Now()
|
iat := time.Now()
|
||||||
exp := iat.Add(time.Hour)
|
exp := iat.Add(time.Hour)
|
||||||
cs := &jws.ClaimSet{
|
cs := &jws.ClaimSet{
|
||||||
Iss: ts.email,
|
Iss: ts.email,
|
||||||
Sub: ts.email,
|
Sub: ts.email,
|
||||||
Aud: ts.audience,
|
Aud: ts.audience,
|
||||||
Iat: iat.Unix(),
|
Iat: iat.Unix(),
|
||||||
Exp: exp.Unix(),
|
Exp: exp.Unix(),
|
||||||
}
|
}
|
||||||
hdr := &jws.Header{
|
hdr := &jws.Header{
|
||||||
Algorithm: "RS256",
|
Algorithm: "RS256",
|
||||||
Typ: "JWT",
|
Typ: "JWT",
|
||||||
KeyID: string(ts.pkID),
|
KeyID: string(ts.pkID),
|
||||||
}
|
}
|
||||||
msg, err := jws.Encode(hdr, cs, ts.pk)
|
msg, err := jws.Encode(hdr, cs, ts.pk)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("google: could not encode JWT: %v", err)
|
return nil, fmt.Errorf("google: could not encode JWT: %v", err)
|
||||||
}
|
}
|
||||||
return &oauth2.Token{AccessToken: msg, TokenType: "Bearer", Expiry: exp}, nil
|
return &oauth2.Token{AccessToken: msg, TokenType: "Bearer", Expiry: exp}, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,201 +1,201 @@
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
// Copyright 2015 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package google
|
package google
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"os/user"
|
"os/user"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
)
|
)
|
||||||
|
|
||||||
type sdkCredentials struct {
|
type sdkCredentials struct {
|
||||||
Data []struct {
|
Data []struct {
|
||||||
Credential struct {
|
Credential struct {
|
||||||
ClientID string `json:"client_id"`
|
ClientID string `json:"client_id"`
|
||||||
ClientSecret string `json:"client_secret"`
|
ClientSecret string `json:"client_secret"`
|
||||||
AccessToken string `json:"access_token"`
|
AccessToken string `json:"access_token"`
|
||||||
RefreshToken string `json:"refresh_token"`
|
RefreshToken string `json:"refresh_token"`
|
||||||
TokenExpiry *time.Time `json:"token_expiry"`
|
TokenExpiry *time.Time `json:"token_expiry"`
|
||||||
} `json:"credential"`
|
} `json:"credential"`
|
||||||
Key struct {
|
Key struct {
|
||||||
Account string `json:"account"`
|
Account string `json:"account"`
|
||||||
Scope string `json:"scope"`
|
Scope string `json:"scope"`
|
||||||
} `json:"key"`
|
} `json:"key"`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// An SDKConfig provides access to tokens from an account already
|
// An SDKConfig provides access to tokens from an account already
|
||||||
// authorized via the Google Cloud SDK.
|
// authorized via the Google Cloud SDK.
|
||||||
type SDKConfig struct {
|
type SDKConfig struct {
|
||||||
conf oauth2.Config
|
conf oauth2.Config
|
||||||
initialToken *oauth2.Token
|
initialToken *oauth2.Token
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSDKConfig creates an SDKConfig for the given Google Cloud SDK
|
// NewSDKConfig creates an SDKConfig for the given Google Cloud SDK
|
||||||
// account. If account is empty, the account currently active in
|
// account. If account is empty, the account currently active in
|
||||||
// Google Cloud SDK properties is used.
|
// Google Cloud SDK properties is used.
|
||||||
// Google Cloud SDK credentials must be created by running `gcloud auth`
|
// Google Cloud SDK credentials must be created by running `gcloud auth`
|
||||||
// before using this function.
|
// before using this function.
|
||||||
// The Google Cloud SDK is available at https://cloud.google.com/sdk/.
|
// The Google Cloud SDK is available at https://cloud.google.com/sdk/.
|
||||||
func NewSDKConfig(account string) (*SDKConfig, error) {
|
func NewSDKConfig(account string) (*SDKConfig, error) {
|
||||||
configPath, err := sdkConfigPath()
|
configPath, err := sdkConfigPath()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("oauth2/google: error getting SDK config path: %v", err)
|
return nil, fmt.Errorf("oauth2/google: error getting SDK config path: %v", err)
|
||||||
}
|
}
|
||||||
credentialsPath := filepath.Join(configPath, "credentials")
|
credentialsPath := filepath.Join(configPath, "credentials")
|
||||||
f, err := os.Open(credentialsPath)
|
f, err := os.Open(credentialsPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("oauth2/google: failed to load SDK credentials: %v", err)
|
return nil, fmt.Errorf("oauth2/google: failed to load SDK credentials: %v", err)
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
|
|
||||||
var c sdkCredentials
|
var c sdkCredentials
|
||||||
if err := json.NewDecoder(f).Decode(&c); err != nil {
|
if err := json.NewDecoder(f).Decode(&c); err != nil {
|
||||||
return nil, fmt.Errorf("oauth2/google: failed to decode SDK credentials from %q: %v", credentialsPath, err)
|
return nil, fmt.Errorf("oauth2/google: failed to decode SDK credentials from %q: %v", credentialsPath, err)
|
||||||
}
|
}
|
||||||
if len(c.Data) == 0 {
|
if len(c.Data) == 0 {
|
||||||
return nil, fmt.Errorf("oauth2/google: no credentials found in %q, run `gcloud auth login` to create one", credentialsPath)
|
return nil, fmt.Errorf("oauth2/google: no credentials found in %q, run `gcloud auth login` to create one", credentialsPath)
|
||||||
}
|
}
|
||||||
if account == "" {
|
if account == "" {
|
||||||
propertiesPath := filepath.Join(configPath, "properties")
|
propertiesPath := filepath.Join(configPath, "properties")
|
||||||
f, err := os.Open(propertiesPath)
|
f, err := os.Open(propertiesPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("oauth2/google: failed to load SDK properties: %v", err)
|
return nil, fmt.Errorf("oauth2/google: failed to load SDK properties: %v", err)
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
ini, err := parseINI(f)
|
ini, err := parseINI(f)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("oauth2/google: failed to parse SDK properties %q: %v", propertiesPath, err)
|
return nil, fmt.Errorf("oauth2/google: failed to parse SDK properties %q: %v", propertiesPath, err)
|
||||||
}
|
}
|
||||||
core, ok := ini["core"]
|
core, ok := ini["core"]
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf("oauth2/google: failed to find [core] section in %v", ini)
|
return nil, fmt.Errorf("oauth2/google: failed to find [core] section in %v", ini)
|
||||||
}
|
}
|
||||||
active, ok := core["account"]
|
active, ok := core["account"]
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf("oauth2/google: failed to find %q attribute in %v", "account", core)
|
return nil, fmt.Errorf("oauth2/google: failed to find %q attribute in %v", "account", core)
|
||||||
}
|
}
|
||||||
account = active
|
account = active
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, d := range c.Data {
|
for _, d := range c.Data {
|
||||||
if account == "" || d.Key.Account == account {
|
if account == "" || d.Key.Account == account {
|
||||||
if d.Credential.AccessToken == "" && d.Credential.RefreshToken == "" {
|
if d.Credential.AccessToken == "" && d.Credential.RefreshToken == "" {
|
||||||
return nil, fmt.Errorf("oauth2/google: no token available for account %q", account)
|
return nil, fmt.Errorf("oauth2/google: no token available for account %q", account)
|
||||||
}
|
}
|
||||||
var expiry time.Time
|
var expiry time.Time
|
||||||
if d.Credential.TokenExpiry != nil {
|
if d.Credential.TokenExpiry != nil {
|
||||||
expiry = *d.Credential.TokenExpiry
|
expiry = *d.Credential.TokenExpiry
|
||||||
}
|
}
|
||||||
return &SDKConfig{
|
return &SDKConfig{
|
||||||
conf: oauth2.Config{
|
conf: oauth2.Config{
|
||||||
ClientID: d.Credential.ClientID,
|
ClientID: d.Credential.ClientID,
|
||||||
ClientSecret: d.Credential.ClientSecret,
|
ClientSecret: d.Credential.ClientSecret,
|
||||||
Scopes: strings.Split(d.Key.Scope, " "),
|
Scopes: strings.Split(d.Key.Scope, " "),
|
||||||
Endpoint: Endpoint,
|
Endpoint: Endpoint,
|
||||||
RedirectURL: "oob",
|
RedirectURL: "oob",
|
||||||
},
|
},
|
||||||
initialToken: &oauth2.Token{
|
initialToken: &oauth2.Token{
|
||||||
AccessToken: d.Credential.AccessToken,
|
AccessToken: d.Credential.AccessToken,
|
||||||
RefreshToken: d.Credential.RefreshToken,
|
RefreshToken: d.Credential.RefreshToken,
|
||||||
Expiry: expiry,
|
Expiry: expiry,
|
||||||
},
|
},
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil, fmt.Errorf("oauth2/google: no such credentials for account %q", account)
|
return nil, fmt.Errorf("oauth2/google: no such credentials for account %q", account)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Client returns an HTTP client using Google Cloud SDK credentials to
|
// Client returns an HTTP client using Google Cloud SDK credentials to
|
||||||
// authorize requests. The token will auto-refresh as necessary. The
|
// authorize requests. The token will auto-refresh as necessary. The
|
||||||
// underlying http.RoundTripper will be obtained using the provided
|
// underlying http.RoundTripper will be obtained using the provided
|
||||||
// context. The returned client and its Transport should not be
|
// context. The returned client and its Transport should not be
|
||||||
// modified.
|
// modified.
|
||||||
func (c *SDKConfig) Client(ctx context.Context) *http.Client {
|
func (c *SDKConfig) Client(ctx context.Context) *http.Client {
|
||||||
return &http.Client{
|
return &http.Client{
|
||||||
Transport: &oauth2.Transport{
|
Transport: &oauth2.Transport{
|
||||||
Source: c.TokenSource(ctx),
|
Source: c.TokenSource(ctx),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TokenSource returns an oauth2.TokenSource that retrieve tokens from
|
// TokenSource returns an oauth2.TokenSource that retrieve tokens from
|
||||||
// Google Cloud SDK credentials using the provided context.
|
// Google Cloud SDK credentials using the provided context.
|
||||||
// It will returns the current access token stored in the credentials,
|
// It will returns the current access token stored in the credentials,
|
||||||
// and refresh it when it expires, but it won't update the credentials
|
// and refresh it when it expires, but it won't update the credentials
|
||||||
// with the new access token.
|
// with the new access token.
|
||||||
func (c *SDKConfig) TokenSource(ctx context.Context) oauth2.TokenSource {
|
func (c *SDKConfig) TokenSource(ctx context.Context) oauth2.TokenSource {
|
||||||
return c.conf.TokenSource(ctx, c.initialToken)
|
return c.conf.TokenSource(ctx, c.initialToken)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scopes are the OAuth 2.0 scopes the current account is authorized for.
|
// Scopes are the OAuth 2.0 scopes the current account is authorized for.
|
||||||
func (c *SDKConfig) Scopes() []string {
|
func (c *SDKConfig) Scopes() []string {
|
||||||
return c.conf.Scopes
|
return c.conf.Scopes
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseINI(ini io.Reader) (map[string]map[string]string, error) {
|
func parseINI(ini io.Reader) (map[string]map[string]string, error) {
|
||||||
result := map[string]map[string]string{
|
result := map[string]map[string]string{
|
||||||
"": {}, // root section
|
"": {}, // root section
|
||||||
}
|
}
|
||||||
scanner := bufio.NewScanner(ini)
|
scanner := bufio.NewScanner(ini)
|
||||||
currentSection := ""
|
currentSection := ""
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
line := strings.TrimSpace(scanner.Text())
|
line := strings.TrimSpace(scanner.Text())
|
||||||
if strings.HasPrefix(line, ";") {
|
if strings.HasPrefix(line, ";") {
|
||||||
// comment.
|
// comment.
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if strings.HasPrefix(line, "[") && strings.HasSuffix(line, "]") {
|
if strings.HasPrefix(line, "[") && strings.HasSuffix(line, "]") {
|
||||||
currentSection = strings.TrimSpace(line[1 : len(line)-1])
|
currentSection = strings.TrimSpace(line[1 : len(line)-1])
|
||||||
result[currentSection] = map[string]string{}
|
result[currentSection] = map[string]string{}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
parts := strings.SplitN(line, "=", 2)
|
parts := strings.SplitN(line, "=", 2)
|
||||||
if len(parts) == 2 && parts[0] != "" {
|
if len(parts) == 2 && parts[0] != "" {
|
||||||
result[currentSection][strings.TrimSpace(parts[0])] = strings.TrimSpace(parts[1])
|
result[currentSection][strings.TrimSpace(parts[0])] = strings.TrimSpace(parts[1])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err := scanner.Err(); err != nil {
|
if err := scanner.Err(); err != nil {
|
||||||
return nil, fmt.Errorf("error scanning ini: %v", err)
|
return nil, fmt.Errorf("error scanning ini: %v", err)
|
||||||
}
|
}
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// sdkConfigPath tries to guess where the gcloud config is located.
|
// sdkConfigPath tries to guess where the gcloud config is located.
|
||||||
// It can be overridden during tests.
|
// It can be overridden during tests.
|
||||||
var sdkConfigPath = func() (string, error) {
|
var sdkConfigPath = func() (string, error) {
|
||||||
if runtime.GOOS == "windows" {
|
if runtime.GOOS == "windows" {
|
||||||
return filepath.Join(os.Getenv("APPDATA"), "gcloud"), nil
|
return filepath.Join(os.Getenv("APPDATA"), "gcloud"), nil
|
||||||
}
|
}
|
||||||
homeDir := guessUnixHomeDir()
|
homeDir := guessUnixHomeDir()
|
||||||
if homeDir == "" {
|
if homeDir == "" {
|
||||||
return "", errors.New("unable to get current user home directory: os/user lookup failed; $HOME is empty")
|
return "", errors.New("unable to get current user home directory: os/user lookup failed; $HOME is empty")
|
||||||
}
|
}
|
||||||
return filepath.Join(homeDir, ".config", "gcloud"), nil
|
return filepath.Join(homeDir, ".config", "gcloud"), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func guessUnixHomeDir() string {
|
func guessUnixHomeDir() string {
|
||||||
// Prefer $HOME over user.Current due to glibc bug: golang.org/issue/13470
|
// Prefer $HOME over user.Current due to glibc bug: golang.org/issue/13470
|
||||||
if v := os.Getenv("HOME"); v != "" {
|
if v := os.Getenv("HOME"); v != "" {
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
// Else, fall back to user.Current:
|
// Else, fall back to user.Current:
|
||||||
if u, err := user.Current(); err == nil {
|
if u, err := user.Current(); err == nil {
|
||||||
return u.HomeDir
|
return u.HomeDir
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,294 +1,294 @@
|
||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
// Copyright 2014 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package internal
|
package internal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"math"
|
"math"
|
||||||
"mime"
|
"mime"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"golang.org/x/net/context/ctxhttp"
|
"golang.org/x/net/context/ctxhttp"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Token represents the credentials used to authorize
|
// Token represents the credentials used to authorize
|
||||||
// the requests to access protected resources on the OAuth 2.0
|
// the requests to access protected resources on the OAuth 2.0
|
||||||
// provider's backend.
|
// provider's backend.
|
||||||
//
|
//
|
||||||
// This type is a mirror of oauth2.Token and exists to break
|
// This type is a mirror of oauth2.Token and exists to break
|
||||||
// an otherwise-circular dependency. Other internal packages
|
// an otherwise-circular dependency. Other internal packages
|
||||||
// should convert this Token into an oauth2.Token before use.
|
// should convert this Token into an oauth2.Token before use.
|
||||||
type Token struct {
|
type Token struct {
|
||||||
// AccessToken is the token that authorizes and authenticates
|
// AccessToken is the token that authorizes and authenticates
|
||||||
// the requests.
|
// the requests.
|
||||||
AccessToken string
|
AccessToken string
|
||||||
|
|
||||||
// TokenType is the type of token.
|
// TokenType is the type of token.
|
||||||
// The Type method returns either this or "Bearer", the default.
|
// The Type method returns either this or "Bearer", the default.
|
||||||
TokenType string
|
TokenType string
|
||||||
|
|
||||||
// RefreshToken is a token that's used by the application
|
// RefreshToken is a token that's used by the application
|
||||||
// (as opposed to the user) to refresh the access token
|
// (as opposed to the user) to refresh the access token
|
||||||
// if it expires.
|
// if it expires.
|
||||||
RefreshToken string
|
RefreshToken string
|
||||||
|
|
||||||
// Expiry is the optional expiration time of the access token.
|
// Expiry is the optional expiration time of the access token.
|
||||||
//
|
//
|
||||||
// If zero, TokenSource implementations will reuse the same
|
// If zero, TokenSource implementations will reuse the same
|
||||||
// token forever and RefreshToken or equivalent
|
// token forever and RefreshToken or equivalent
|
||||||
// mechanisms for that TokenSource will not be used.
|
// mechanisms for that TokenSource will not be used.
|
||||||
Expiry time.Time
|
Expiry time.Time
|
||||||
|
|
||||||
// Raw optionally contains extra metadata from the server
|
// Raw optionally contains extra metadata from the server
|
||||||
// when updating a token.
|
// when updating a token.
|
||||||
Raw interface{}
|
Raw interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// tokenJSON is the struct representing the HTTP response from OAuth2
|
// tokenJSON is the struct representing the HTTP response from OAuth2
|
||||||
// providers returning a token in JSON form.
|
// providers returning a token in JSON form.
|
||||||
type tokenJSON struct {
|
type tokenJSON struct {
|
||||||
AccessToken string `json:"access_token"`
|
AccessToken string `json:"access_token"`
|
||||||
TokenType string `json:"token_type"`
|
TokenType string `json:"token_type"`
|
||||||
RefreshToken string `json:"refresh_token"`
|
RefreshToken string `json:"refresh_token"`
|
||||||
ExpiresIn expirationTime `json:"expires_in"` // at least PayPal returns string, while most return number
|
ExpiresIn expirationTime `json:"expires_in"` // at least PayPal returns string, while most return number
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *tokenJSON) expiry() (t time.Time) {
|
func (e *tokenJSON) expiry() (t time.Time) {
|
||||||
if v := e.ExpiresIn; v != 0 {
|
if v := e.ExpiresIn; v != 0 {
|
||||||
return time.Now().Add(time.Duration(v) * time.Second)
|
return time.Now().Add(time.Duration(v) * time.Second)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
type expirationTime int32
|
type expirationTime int32
|
||||||
|
|
||||||
func (e *expirationTime) UnmarshalJSON(b []byte) error {
|
func (e *expirationTime) UnmarshalJSON(b []byte) error {
|
||||||
if len(b) == 0 || string(b) == "null" {
|
if len(b) == 0 || string(b) == "null" {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var n json.Number
|
var n json.Number
|
||||||
err := json.Unmarshal(b, &n)
|
err := json.Unmarshal(b, &n)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
i, err := n.Int64()
|
i, err := n.Int64()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if i > math.MaxInt32 {
|
if i > math.MaxInt32 {
|
||||||
i = math.MaxInt32
|
i = math.MaxInt32
|
||||||
}
|
}
|
||||||
*e = expirationTime(i)
|
*e = expirationTime(i)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// RegisterBrokenAuthHeaderProvider previously did something. It is now a no-op.
|
// RegisterBrokenAuthHeaderProvider previously did something. It is now a no-op.
|
||||||
//
|
//
|
||||||
// Deprecated: this function no longer does anything. Caller code that
|
// Deprecated: this function no longer does anything. Caller code that
|
||||||
// wants to avoid potential extra HTTP requests made during
|
// wants to avoid potential extra HTTP requests made during
|
||||||
// auto-probing of the provider's auth style should set
|
// auto-probing of the provider's auth style should set
|
||||||
// Endpoint.AuthStyle.
|
// Endpoint.AuthStyle.
|
||||||
func RegisterBrokenAuthHeaderProvider(tokenURL string) {}
|
func RegisterBrokenAuthHeaderProvider(tokenURL string) {}
|
||||||
|
|
||||||
// AuthStyle is a copy of the golang.org/x/oauth2 package's AuthStyle type.
|
// AuthStyle is a copy of the golang.org/x/oauth2 package's AuthStyle type.
|
||||||
type AuthStyle int
|
type AuthStyle int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
AuthStyleUnknown AuthStyle = 0
|
AuthStyleUnknown AuthStyle = 0
|
||||||
AuthStyleInParams AuthStyle = 1
|
AuthStyleInParams AuthStyle = 1
|
||||||
AuthStyleInHeader AuthStyle = 2
|
AuthStyleInHeader AuthStyle = 2
|
||||||
)
|
)
|
||||||
|
|
||||||
// authStyleCache is the set of tokenURLs we've successfully used via
|
// authStyleCache is the set of tokenURLs we've successfully used via
|
||||||
// RetrieveToken and which style auth we ended up using.
|
// RetrieveToken and which style auth we ended up using.
|
||||||
// It's called a cache, but it doesn't (yet?) shrink. It's expected that
|
// It's called a cache, but it doesn't (yet?) shrink. It's expected that
|
||||||
// the set of OAuth2 servers a program contacts over time is fixed and
|
// the set of OAuth2 servers a program contacts over time is fixed and
|
||||||
// small.
|
// small.
|
||||||
var authStyleCache struct {
|
var authStyleCache struct {
|
||||||
sync.Mutex
|
sync.Mutex
|
||||||
m map[string]AuthStyle // keyed by tokenURL
|
m map[string]AuthStyle // keyed by tokenURL
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResetAuthCache resets the global authentication style cache used
|
// ResetAuthCache resets the global authentication style cache used
|
||||||
// for AuthStyleUnknown token requests.
|
// for AuthStyleUnknown token requests.
|
||||||
func ResetAuthCache() {
|
func ResetAuthCache() {
|
||||||
authStyleCache.Lock()
|
authStyleCache.Lock()
|
||||||
defer authStyleCache.Unlock()
|
defer authStyleCache.Unlock()
|
||||||
authStyleCache.m = nil
|
authStyleCache.m = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// lookupAuthStyle reports which auth style we last used with tokenURL
|
// lookupAuthStyle reports which auth style we last used with tokenURL
|
||||||
// when calling RetrieveToken and whether we have ever done so.
|
// when calling RetrieveToken and whether we have ever done so.
|
||||||
func lookupAuthStyle(tokenURL string) (style AuthStyle, ok bool) {
|
func lookupAuthStyle(tokenURL string) (style AuthStyle, ok bool) {
|
||||||
authStyleCache.Lock()
|
authStyleCache.Lock()
|
||||||
defer authStyleCache.Unlock()
|
defer authStyleCache.Unlock()
|
||||||
style, ok = authStyleCache.m[tokenURL]
|
style, ok = authStyleCache.m[tokenURL]
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// setAuthStyle adds an entry to authStyleCache, documented above.
|
// setAuthStyle adds an entry to authStyleCache, documented above.
|
||||||
func setAuthStyle(tokenURL string, v AuthStyle) {
|
func setAuthStyle(tokenURL string, v AuthStyle) {
|
||||||
authStyleCache.Lock()
|
authStyleCache.Lock()
|
||||||
defer authStyleCache.Unlock()
|
defer authStyleCache.Unlock()
|
||||||
if authStyleCache.m == nil {
|
if authStyleCache.m == nil {
|
||||||
authStyleCache.m = make(map[string]AuthStyle)
|
authStyleCache.m = make(map[string]AuthStyle)
|
||||||
}
|
}
|
||||||
authStyleCache.m[tokenURL] = v
|
authStyleCache.m[tokenURL] = v
|
||||||
}
|
}
|
||||||
|
|
||||||
// newTokenRequest returns a new *http.Request to retrieve a new token
|
// newTokenRequest returns a new *http.Request to retrieve a new token
|
||||||
// from tokenURL using the provided clientID, clientSecret, and POST
|
// from tokenURL using the provided clientID, clientSecret, and POST
|
||||||
// body parameters.
|
// body parameters.
|
||||||
//
|
//
|
||||||
// inParams is whether the clientID & clientSecret should be encoded
|
// inParams is whether the clientID & clientSecret should be encoded
|
||||||
// as the POST body. An 'inParams' value of true means to send it in
|
// as the POST body. An 'inParams' value of true means to send it in
|
||||||
// the POST body (along with any values in v); false means to send it
|
// the POST body (along with any values in v); false means to send it
|
||||||
// in the Authorization header.
|
// in the Authorization header.
|
||||||
func newTokenRequest(tokenURL, clientID, clientSecret string, v url.Values, authStyle AuthStyle) (*http.Request, error) {
|
func newTokenRequest(tokenURL, clientID, clientSecret string, v url.Values, authStyle AuthStyle) (*http.Request, error) {
|
||||||
if authStyle == AuthStyleInParams {
|
if authStyle == AuthStyleInParams {
|
||||||
v = cloneURLValues(v)
|
v = cloneURLValues(v)
|
||||||
if clientID != "" {
|
if clientID != "" {
|
||||||
v.Set("client_id", clientID)
|
v.Set("client_id", clientID)
|
||||||
}
|
}
|
||||||
if clientSecret != "" {
|
if clientSecret != "" {
|
||||||
v.Set("client_secret", clientSecret)
|
v.Set("client_secret", clientSecret)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req, err := http.NewRequest("POST", tokenURL, strings.NewReader(v.Encode()))
|
req, err := http.NewRequest("POST", tokenURL, strings.NewReader(v.Encode()))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||||
if authStyle == AuthStyleInHeader {
|
if authStyle == AuthStyleInHeader {
|
||||||
req.SetBasicAuth(url.QueryEscape(clientID), url.QueryEscape(clientSecret))
|
req.SetBasicAuth(url.QueryEscape(clientID), url.QueryEscape(clientSecret))
|
||||||
}
|
}
|
||||||
return req, nil
|
return req, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func cloneURLValues(v url.Values) url.Values {
|
func cloneURLValues(v url.Values) url.Values {
|
||||||
v2 := make(url.Values, len(v))
|
v2 := make(url.Values, len(v))
|
||||||
for k, vv := range v {
|
for k, vv := range v {
|
||||||
v2[k] = append([]string(nil), vv...)
|
v2[k] = append([]string(nil), vv...)
|
||||||
}
|
}
|
||||||
return v2
|
return v2
|
||||||
}
|
}
|
||||||
|
|
||||||
func RetrieveToken(ctx context.Context, clientID, clientSecret, tokenURL string, v url.Values, authStyle AuthStyle) (*Token, error) {
|
func RetrieveToken(ctx context.Context, clientID, clientSecret, tokenURL string, v url.Values, authStyle AuthStyle) (*Token, error) {
|
||||||
needsAuthStyleProbe := authStyle == 0
|
needsAuthStyleProbe := authStyle == 0
|
||||||
if needsAuthStyleProbe {
|
if needsAuthStyleProbe {
|
||||||
if style, ok := lookupAuthStyle(tokenURL); ok {
|
if style, ok := lookupAuthStyle(tokenURL); ok {
|
||||||
authStyle = style
|
authStyle = style
|
||||||
needsAuthStyleProbe = false
|
needsAuthStyleProbe = false
|
||||||
} else {
|
} else {
|
||||||
authStyle = AuthStyleInHeader // the first way we'll try
|
authStyle = AuthStyleInHeader // the first way we'll try
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req, err := newTokenRequest(tokenURL, clientID, clientSecret, v, authStyle)
|
req, err := newTokenRequest(tokenURL, clientID, clientSecret, v, authStyle)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
token, err := doTokenRoundTrip(ctx, req)
|
token, err := doTokenRoundTrip(ctx, req)
|
||||||
if err != nil && needsAuthStyleProbe {
|
if err != nil && needsAuthStyleProbe {
|
||||||
// If we get an error, assume the server wants the
|
// If we get an error, assume the server wants the
|
||||||
// clientID & clientSecret in a different form.
|
// clientID & clientSecret in a different form.
|
||||||
// See https://code.google.com/p/goauth2/issues/detail?id=31 for background.
|
// See https://code.google.com/p/goauth2/issues/detail?id=31 for background.
|
||||||
// In summary:
|
// In summary:
|
||||||
// - Reddit only accepts client secret in the Authorization header
|
// - Reddit only accepts client secret in the Authorization header
|
||||||
// - Dropbox accepts either it in URL param or Auth header, but not both.
|
// - Dropbox accepts either it in URL param or Auth header, but not both.
|
||||||
// - Google only accepts URL param (not spec compliant?), not Auth header
|
// - Google only accepts URL param (not spec compliant?), not Auth header
|
||||||
// - Stripe only accepts client secret in Auth header with Bearer method, not Basic
|
// - Stripe only accepts client secret in Auth header with Bearer method, not Basic
|
||||||
//
|
//
|
||||||
// We used to maintain a big table in this code of all the sites and which way
|
// We used to maintain a big table in this code of all the sites and which way
|
||||||
// they went, but maintaining it didn't scale & got annoying.
|
// they went, but maintaining it didn't scale & got annoying.
|
||||||
// So just try both ways.
|
// So just try both ways.
|
||||||
authStyle = AuthStyleInParams // the second way we'll try
|
authStyle = AuthStyleInParams // the second way we'll try
|
||||||
req, _ = newTokenRequest(tokenURL, clientID, clientSecret, v, authStyle)
|
req, _ = newTokenRequest(tokenURL, clientID, clientSecret, v, authStyle)
|
||||||
token, err = doTokenRoundTrip(ctx, req)
|
token, err = doTokenRoundTrip(ctx, req)
|
||||||
}
|
}
|
||||||
if needsAuthStyleProbe && err == nil {
|
if needsAuthStyleProbe && err == nil {
|
||||||
setAuthStyle(tokenURL, authStyle)
|
setAuthStyle(tokenURL, authStyle)
|
||||||
}
|
}
|
||||||
// Don't overwrite `RefreshToken` with an empty value
|
// Don't overwrite `RefreshToken` with an empty value
|
||||||
// if this was a token refreshing request.
|
// if this was a token refreshing request.
|
||||||
if token != nil && token.RefreshToken == "" {
|
if token != nil && token.RefreshToken == "" {
|
||||||
token.RefreshToken = v.Get("refresh_token")
|
token.RefreshToken = v.Get("refresh_token")
|
||||||
}
|
}
|
||||||
return token, err
|
return token, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func doTokenRoundTrip(ctx context.Context, req *http.Request) (*Token, error) {
|
func doTokenRoundTrip(ctx context.Context, req *http.Request) (*Token, error) {
|
||||||
r, err := ctxhttp.Do(ctx, ContextClient(ctx), req)
|
r, err := ctxhttp.Do(ctx, ContextClient(ctx), req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
body, err := ioutil.ReadAll(io.LimitReader(r.Body, 1<<20))
|
body, err := ioutil.ReadAll(io.LimitReader(r.Body, 1<<20))
|
||||||
r.Body.Close()
|
r.Body.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err)
|
return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err)
|
||||||
}
|
}
|
||||||
if code := r.StatusCode; code < 200 || code > 299 {
|
if code := r.StatusCode; code < 200 || code > 299 {
|
||||||
return nil, &RetrieveError{
|
return nil, &RetrieveError{
|
||||||
Response: r,
|
Response: r,
|
||||||
Body: body,
|
Body: body,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var token *Token
|
var token *Token
|
||||||
content, _, _ := mime.ParseMediaType(r.Header.Get("Content-Type"))
|
content, _, _ := mime.ParseMediaType(r.Header.Get("Content-Type"))
|
||||||
switch content {
|
switch content {
|
||||||
case "application/x-www-form-urlencoded", "text/plain":
|
case "application/x-www-form-urlencoded", "text/plain":
|
||||||
vals, err := url.ParseQuery(string(body))
|
vals, err := url.ParseQuery(string(body))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
token = &Token{
|
token = &Token{
|
||||||
AccessToken: vals.Get("access_token"),
|
AccessToken: vals.Get("access_token"),
|
||||||
TokenType: vals.Get("token_type"),
|
TokenType: vals.Get("token_type"),
|
||||||
RefreshToken: vals.Get("refresh_token"),
|
RefreshToken: vals.Get("refresh_token"),
|
||||||
Raw: vals,
|
Raw: vals,
|
||||||
}
|
}
|
||||||
e := vals.Get("expires_in")
|
e := vals.Get("expires_in")
|
||||||
expires, _ := strconv.Atoi(e)
|
expires, _ := strconv.Atoi(e)
|
||||||
if expires != 0 {
|
if expires != 0 {
|
||||||
token.Expiry = time.Now().Add(time.Duration(expires) * time.Second)
|
token.Expiry = time.Now().Add(time.Duration(expires) * time.Second)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
var tj tokenJSON
|
var tj tokenJSON
|
||||||
if err = json.Unmarshal(body, &tj); err != nil {
|
if err = json.Unmarshal(body, &tj); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
token = &Token{
|
token = &Token{
|
||||||
AccessToken: tj.AccessToken,
|
AccessToken: tj.AccessToken,
|
||||||
TokenType: tj.TokenType,
|
TokenType: tj.TokenType,
|
||||||
RefreshToken: tj.RefreshToken,
|
RefreshToken: tj.RefreshToken,
|
||||||
Expiry: tj.expiry(),
|
Expiry: tj.expiry(),
|
||||||
Raw: make(map[string]interface{}),
|
Raw: make(map[string]interface{}),
|
||||||
}
|
}
|
||||||
json.Unmarshal(body, &token.Raw) // no error checks for optional fields
|
json.Unmarshal(body, &token.Raw) // no error checks for optional fields
|
||||||
}
|
}
|
||||||
if token.AccessToken == "" {
|
if token.AccessToken == "" {
|
||||||
return nil, errors.New("oauth2: server response missing access_token")
|
return nil, errors.New("oauth2: server response missing access_token")
|
||||||
}
|
}
|
||||||
return token, nil
|
return token, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type RetrieveError struct {
|
type RetrieveError struct {
|
||||||
Response *http.Response
|
Response *http.Response
|
||||||
Body []byte
|
Body []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *RetrieveError) Error() string {
|
func (r *RetrieveError) Error() string {
|
||||||
return fmt.Sprintf("oauth2: cannot fetch token: %v\nResponse: %s", r.Response.Status, r.Body)
|
return fmt.Sprintf("oauth2: cannot fetch token: %v\nResponse: %s", r.Response.Status, r.Body)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,182 +1,182 @@
|
||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
// Copyright 2014 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// Package jws provides a partial implementation
|
// Package jws provides a partial implementation
|
||||||
// of JSON Web Signature encoding and decoding.
|
// of JSON Web Signature encoding and decoding.
|
||||||
// It exists to support the golang.org/x/oauth2 package.
|
// It exists to support the golang.org/x/oauth2 package.
|
||||||
//
|
//
|
||||||
// See RFC 7515.
|
// See RFC 7515.
|
||||||
//
|
//
|
||||||
// Deprecated: this package is not intended for public use and might be
|
// Deprecated: this package is not intended for public use and might be
|
||||||
// removed in the future. It exists for internal use only.
|
// removed in the future. It exists for internal use only.
|
||||||
// Please switch to another JWS package or copy this package into your own
|
// Please switch to another JWS package or copy this package into your own
|
||||||
// source tree.
|
// source tree.
|
||||||
package jws // import "golang.org/x/oauth2/jws"
|
package jws // import "golang.org/x/oauth2/jws"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"crypto"
|
"crypto"
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"crypto/rsa"
|
"crypto/rsa"
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ClaimSet contains information about the JWT signature including the
|
// ClaimSet contains information about the JWT signature including the
|
||||||
// permissions being requested (scopes), the target of the token, the issuer,
|
// permissions being requested (scopes), the target of the token, the issuer,
|
||||||
// the time the token was issued, and the lifetime of the token.
|
// the time the token was issued, and the lifetime of the token.
|
||||||
type ClaimSet struct {
|
type ClaimSet struct {
|
||||||
Iss string `json:"iss"` // email address of the client_id of the application making the access token request
|
Iss string `json:"iss"` // email address of the client_id of the application making the access token request
|
||||||
Scope string `json:"scope,omitempty"` // space-delimited list of the permissions the application requests
|
Scope string `json:"scope,omitempty"` // space-delimited list of the permissions the application requests
|
||||||
Aud string `json:"aud"` // descriptor of the intended target of the assertion (Optional).
|
Aud string `json:"aud"` // descriptor of the intended target of the assertion (Optional).
|
||||||
Exp int64 `json:"exp"` // the expiration time of the assertion (seconds since Unix epoch)
|
Exp int64 `json:"exp"` // the expiration time of the assertion (seconds since Unix epoch)
|
||||||
Iat int64 `json:"iat"` // the time the assertion was issued (seconds since Unix epoch)
|
Iat int64 `json:"iat"` // the time the assertion was issued (seconds since Unix epoch)
|
||||||
Typ string `json:"typ,omitempty"` // token type (Optional).
|
Typ string `json:"typ,omitempty"` // token type (Optional).
|
||||||
|
|
||||||
// Email for which the application is requesting delegated access (Optional).
|
// Email for which the application is requesting delegated access (Optional).
|
||||||
Sub string `json:"sub,omitempty"`
|
Sub string `json:"sub,omitempty"`
|
||||||
|
|
||||||
// The old name of Sub. Client keeps setting Prn to be
|
// The old name of Sub. Client keeps setting Prn to be
|
||||||
// complaint with legacy OAuth 2.0 providers. (Optional)
|
// complaint with legacy OAuth 2.0 providers. (Optional)
|
||||||
Prn string `json:"prn,omitempty"`
|
Prn string `json:"prn,omitempty"`
|
||||||
|
|
||||||
// See http://tools.ietf.org/html/draft-jones-json-web-token-10#section-4.3
|
// See http://tools.ietf.org/html/draft-jones-json-web-token-10#section-4.3
|
||||||
// This array is marshalled using custom code (see (c *ClaimSet) encode()).
|
// This array is marshalled using custom code (see (c *ClaimSet) encode()).
|
||||||
PrivateClaims map[string]interface{} `json:"-"`
|
PrivateClaims map[string]interface{} `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *ClaimSet) encode() (string, error) {
|
func (c *ClaimSet) encode() (string, error) {
|
||||||
// Reverting time back for machines whose time is not perfectly in sync.
|
// Reverting time back for machines whose time is not perfectly in sync.
|
||||||
// If client machine's time is in the future according
|
// If client machine's time is in the future according
|
||||||
// to Google servers, an access token will not be issued.
|
// to Google servers, an access token will not be issued.
|
||||||
now := time.Now().Add(-10 * time.Second)
|
now := time.Now().Add(-10 * time.Second)
|
||||||
if c.Iat == 0 {
|
if c.Iat == 0 {
|
||||||
c.Iat = now.Unix()
|
c.Iat = now.Unix()
|
||||||
}
|
}
|
||||||
if c.Exp == 0 {
|
if c.Exp == 0 {
|
||||||
c.Exp = now.Add(time.Hour).Unix()
|
c.Exp = now.Add(time.Hour).Unix()
|
||||||
}
|
}
|
||||||
if c.Exp < c.Iat {
|
if c.Exp < c.Iat {
|
||||||
return "", fmt.Errorf("jws: invalid Exp = %v; must be later than Iat = %v", c.Exp, c.Iat)
|
return "", fmt.Errorf("jws: invalid Exp = %v; must be later than Iat = %v", c.Exp, c.Iat)
|
||||||
}
|
}
|
||||||
|
|
||||||
b, err := json.Marshal(c)
|
b, err := json.Marshal(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(c.PrivateClaims) == 0 {
|
if len(c.PrivateClaims) == 0 {
|
||||||
return base64.RawURLEncoding.EncodeToString(b), nil
|
return base64.RawURLEncoding.EncodeToString(b), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Marshal private claim set and then append it to b.
|
// Marshal private claim set and then append it to b.
|
||||||
prv, err := json.Marshal(c.PrivateClaims)
|
prv, err := json.Marshal(c.PrivateClaims)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("jws: invalid map of private claims %v", c.PrivateClaims)
|
return "", fmt.Errorf("jws: invalid map of private claims %v", c.PrivateClaims)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Concatenate public and private claim JSON objects.
|
// Concatenate public and private claim JSON objects.
|
||||||
if !bytes.HasSuffix(b, []byte{'}'}) {
|
if !bytes.HasSuffix(b, []byte{'}'}) {
|
||||||
return "", fmt.Errorf("jws: invalid JSON %s", b)
|
return "", fmt.Errorf("jws: invalid JSON %s", b)
|
||||||
}
|
}
|
||||||
if !bytes.HasPrefix(prv, []byte{'{'}) {
|
if !bytes.HasPrefix(prv, []byte{'{'}) {
|
||||||
return "", fmt.Errorf("jws: invalid JSON %s", prv)
|
return "", fmt.Errorf("jws: invalid JSON %s", prv)
|
||||||
}
|
}
|
||||||
b[len(b)-1] = ',' // Replace closing curly brace with a comma.
|
b[len(b)-1] = ',' // Replace closing curly brace with a comma.
|
||||||
b = append(b, prv[1:]...) // Append private claims.
|
b = append(b, prv[1:]...) // Append private claims.
|
||||||
return base64.RawURLEncoding.EncodeToString(b), nil
|
return base64.RawURLEncoding.EncodeToString(b), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Header represents the header for the signed JWS payloads.
|
// Header represents the header for the signed JWS payloads.
|
||||||
type Header struct {
|
type Header struct {
|
||||||
// The algorithm used for signature.
|
// The algorithm used for signature.
|
||||||
Algorithm string `json:"alg"`
|
Algorithm string `json:"alg"`
|
||||||
|
|
||||||
// Represents the token type.
|
// Represents the token type.
|
||||||
Typ string `json:"typ"`
|
Typ string `json:"typ"`
|
||||||
|
|
||||||
// The optional hint of which key is being used.
|
// The optional hint of which key is being used.
|
||||||
KeyID string `json:"kid,omitempty"`
|
KeyID string `json:"kid,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Header) encode() (string, error) {
|
func (h *Header) encode() (string, error) {
|
||||||
b, err := json.Marshal(h)
|
b, err := json.Marshal(h)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
return base64.RawURLEncoding.EncodeToString(b), nil
|
return base64.RawURLEncoding.EncodeToString(b), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode decodes a claim set from a JWS payload.
|
// Decode decodes a claim set from a JWS payload.
|
||||||
func Decode(payload string) (*ClaimSet, error) {
|
func Decode(payload string) (*ClaimSet, error) {
|
||||||
// decode returned id token to get expiry
|
// decode returned id token to get expiry
|
||||||
s := strings.Split(payload, ".")
|
s := strings.Split(payload, ".")
|
||||||
if len(s) < 2 {
|
if len(s) < 2 {
|
||||||
// TODO(jbd): Provide more context about the error.
|
// TODO(jbd): Provide more context about the error.
|
||||||
return nil, errors.New("jws: invalid token received")
|
return nil, errors.New("jws: invalid token received")
|
||||||
}
|
}
|
||||||
decoded, err := base64.RawURLEncoding.DecodeString(s[1])
|
decoded, err := base64.RawURLEncoding.DecodeString(s[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
c := &ClaimSet{}
|
c := &ClaimSet{}
|
||||||
err = json.NewDecoder(bytes.NewBuffer(decoded)).Decode(c)
|
err = json.NewDecoder(bytes.NewBuffer(decoded)).Decode(c)
|
||||||
return c, err
|
return c, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Signer returns a signature for the given data.
|
// Signer returns a signature for the given data.
|
||||||
type Signer func(data []byte) (sig []byte, err error)
|
type Signer func(data []byte) (sig []byte, err error)
|
||||||
|
|
||||||
// EncodeWithSigner encodes a header and claim set with the provided signer.
|
// EncodeWithSigner encodes a header and claim set with the provided signer.
|
||||||
func EncodeWithSigner(header *Header, c *ClaimSet, sg Signer) (string, error) {
|
func EncodeWithSigner(header *Header, c *ClaimSet, sg Signer) (string, error) {
|
||||||
head, err := header.encode()
|
head, err := header.encode()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
cs, err := c.encode()
|
cs, err := c.encode()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
ss := fmt.Sprintf("%s.%s", head, cs)
|
ss := fmt.Sprintf("%s.%s", head, cs)
|
||||||
sig, err := sg([]byte(ss))
|
sig, err := sg([]byte(ss))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
return fmt.Sprintf("%s.%s", ss, base64.RawURLEncoding.EncodeToString(sig)), nil
|
return fmt.Sprintf("%s.%s", ss, base64.RawURLEncoding.EncodeToString(sig)), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Encode encodes a signed JWS with provided header and claim set.
|
// Encode encodes a signed JWS with provided header and claim set.
|
||||||
// This invokes EncodeWithSigner using crypto/rsa.SignPKCS1v15 with the given RSA private key.
|
// This invokes EncodeWithSigner using crypto/rsa.SignPKCS1v15 with the given RSA private key.
|
||||||
func Encode(header *Header, c *ClaimSet, key *rsa.PrivateKey) (string, error) {
|
func Encode(header *Header, c *ClaimSet, key *rsa.PrivateKey) (string, error) {
|
||||||
sg := func(data []byte) (sig []byte, err error) {
|
sg := func(data []byte) (sig []byte, err error) {
|
||||||
h := sha256.New()
|
h := sha256.New()
|
||||||
h.Write(data)
|
h.Write(data)
|
||||||
return rsa.SignPKCS1v15(rand.Reader, key, crypto.SHA256, h.Sum(nil))
|
return rsa.SignPKCS1v15(rand.Reader, key, crypto.SHA256, h.Sum(nil))
|
||||||
}
|
}
|
||||||
return EncodeWithSigner(header, c, sg)
|
return EncodeWithSigner(header, c, sg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify tests whether the provided JWT token's signature was produced by the private key
|
// Verify tests whether the provided JWT token's signature was produced by the private key
|
||||||
// associated with the supplied public key.
|
// associated with the supplied public key.
|
||||||
func Verify(token string, key *rsa.PublicKey) error {
|
func Verify(token string, key *rsa.PublicKey) error {
|
||||||
parts := strings.Split(token, ".")
|
parts := strings.Split(token, ".")
|
||||||
if len(parts) != 3 {
|
if len(parts) != 3 {
|
||||||
return errors.New("jws: invalid token received, token must have 3 parts")
|
return errors.New("jws: invalid token received, token must have 3 parts")
|
||||||
}
|
}
|
||||||
|
|
||||||
signedContent := parts[0] + "." + parts[1]
|
signedContent := parts[0] + "." + parts[1]
|
||||||
signatureString, err := base64.RawURLEncoding.DecodeString(parts[2])
|
signatureString, err := base64.RawURLEncoding.DecodeString(parts[2])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
h := sha256.New()
|
h := sha256.New()
|
||||||
h.Write([]byte(signedContent))
|
h.Write([]byte(signedContent))
|
||||||
return rsa.VerifyPKCS1v15(key, crypto.SHA256, h.Sum(nil), []byte(signatureString))
|
return rsa.VerifyPKCS1v15(key, crypto.SHA256, h.Sum(nil), []byte(signatureString))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,185 +1,185 @@
|
||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
// Copyright 2014 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// Package jwt implements the OAuth 2.0 JSON Web Token flow, commonly
|
// Package jwt implements the OAuth 2.0 JSON Web Token flow, commonly
|
||||||
// known as "two-legged OAuth 2.0".
|
// known as "two-legged OAuth 2.0".
|
||||||
//
|
//
|
||||||
// See: https://tools.ietf.org/html/draft-ietf-oauth-jwt-bearer-12
|
// See: https://tools.ietf.org/html/draft-ietf-oauth-jwt-bearer-12
|
||||||
package jwt
|
package jwt
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
"golang.org/x/oauth2/internal"
|
"golang.org/x/oauth2/internal"
|
||||||
"golang.org/x/oauth2/jws"
|
"golang.org/x/oauth2/jws"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
defaultGrantType = "urn:ietf:params:oauth:grant-type:jwt-bearer"
|
defaultGrantType = "urn:ietf:params:oauth:grant-type:jwt-bearer"
|
||||||
defaultHeader = &jws.Header{Algorithm: "RS256", Typ: "JWT"}
|
defaultHeader = &jws.Header{Algorithm: "RS256", Typ: "JWT"}
|
||||||
)
|
)
|
||||||
|
|
||||||
// Config is the configuration for using JWT to fetch tokens,
|
// Config is the configuration for using JWT to fetch tokens,
|
||||||
// commonly known as "two-legged OAuth 2.0".
|
// commonly known as "two-legged OAuth 2.0".
|
||||||
type Config struct {
|
type Config struct {
|
||||||
// Email is the OAuth client identifier used when communicating with
|
// Email is the OAuth client identifier used when communicating with
|
||||||
// the configured OAuth provider.
|
// the configured OAuth provider.
|
||||||
Email string
|
Email string
|
||||||
|
|
||||||
// PrivateKey contains the contents of an RSA private key or the
|
// PrivateKey contains the contents of an RSA private key or the
|
||||||
// contents of a PEM file that contains a private key. The provided
|
// contents of a PEM file that contains a private key. The provided
|
||||||
// private key is used to sign JWT payloads.
|
// private key is used to sign JWT payloads.
|
||||||
// PEM containers with a passphrase are not supported.
|
// PEM containers with a passphrase are not supported.
|
||||||
// Use the following command to convert a PKCS 12 file into a PEM.
|
// Use the following command to convert a PKCS 12 file into a PEM.
|
||||||
//
|
//
|
||||||
// $ openssl pkcs12 -in key.p12 -out key.pem -nodes
|
// $ openssl pkcs12 -in key.p12 -out key.pem -nodes
|
||||||
//
|
//
|
||||||
PrivateKey []byte
|
PrivateKey []byte
|
||||||
|
|
||||||
// PrivateKeyID contains an optional hint indicating which key is being
|
// PrivateKeyID contains an optional hint indicating which key is being
|
||||||
// used.
|
// used.
|
||||||
PrivateKeyID string
|
PrivateKeyID string
|
||||||
|
|
||||||
// Subject is the optional user to impersonate.
|
// Subject is the optional user to impersonate.
|
||||||
Subject string
|
Subject string
|
||||||
|
|
||||||
// Scopes optionally specifies a list of requested permission scopes.
|
// Scopes optionally specifies a list of requested permission scopes.
|
||||||
Scopes []string
|
Scopes []string
|
||||||
|
|
||||||
// TokenURL is the endpoint required to complete the 2-legged JWT flow.
|
// TokenURL is the endpoint required to complete the 2-legged JWT flow.
|
||||||
TokenURL string
|
TokenURL string
|
||||||
|
|
||||||
// Expires optionally specifies how long the token is valid for.
|
// Expires optionally specifies how long the token is valid for.
|
||||||
Expires time.Duration
|
Expires time.Duration
|
||||||
|
|
||||||
// Audience optionally specifies the intended audience of the
|
// Audience optionally specifies the intended audience of the
|
||||||
// request. If empty, the value of TokenURL is used as the
|
// request. If empty, the value of TokenURL is used as the
|
||||||
// intended audience.
|
// intended audience.
|
||||||
Audience string
|
Audience string
|
||||||
|
|
||||||
// PrivateClaims optionally specifies custom private claims in the JWT.
|
// PrivateClaims optionally specifies custom private claims in the JWT.
|
||||||
// See http://tools.ietf.org/html/draft-jones-json-web-token-10#section-4.3
|
// See http://tools.ietf.org/html/draft-jones-json-web-token-10#section-4.3
|
||||||
PrivateClaims map[string]interface{}
|
PrivateClaims map[string]interface{}
|
||||||
|
|
||||||
// UseIDToken optionally specifies whether ID token should be used instead
|
// UseIDToken optionally specifies whether ID token should be used instead
|
||||||
// of access token when the server returns both.
|
// of access token when the server returns both.
|
||||||
UseIDToken bool
|
UseIDToken bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// TokenSource returns a JWT TokenSource using the configuration
|
// TokenSource returns a JWT TokenSource using the configuration
|
||||||
// in c and the HTTP client from the provided context.
|
// in c and the HTTP client from the provided context.
|
||||||
func (c *Config) TokenSource(ctx context.Context) oauth2.TokenSource {
|
func (c *Config) TokenSource(ctx context.Context) oauth2.TokenSource {
|
||||||
return oauth2.ReuseTokenSource(nil, jwtSource{ctx, c})
|
return oauth2.ReuseTokenSource(nil, jwtSource{ctx, c})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Client returns an HTTP client wrapping the context's
|
// Client returns an HTTP client wrapping the context's
|
||||||
// HTTP transport and adding Authorization headers with tokens
|
// HTTP transport and adding Authorization headers with tokens
|
||||||
// obtained from c.
|
// obtained from c.
|
||||||
//
|
//
|
||||||
// The returned client and its Transport should not be modified.
|
// The returned client and its Transport should not be modified.
|
||||||
func (c *Config) Client(ctx context.Context) *http.Client {
|
func (c *Config) Client(ctx context.Context) *http.Client {
|
||||||
return oauth2.NewClient(ctx, c.TokenSource(ctx))
|
return oauth2.NewClient(ctx, c.TokenSource(ctx))
|
||||||
}
|
}
|
||||||
|
|
||||||
// jwtSource is a source that always does a signed JWT request for a token.
|
// jwtSource is a source that always does a signed JWT request for a token.
|
||||||
// It should typically be wrapped with a reuseTokenSource.
|
// It should typically be wrapped with a reuseTokenSource.
|
||||||
type jwtSource struct {
|
type jwtSource struct {
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
conf *Config
|
conf *Config
|
||||||
}
|
}
|
||||||
|
|
||||||
func (js jwtSource) Token() (*oauth2.Token, error) {
|
func (js jwtSource) Token() (*oauth2.Token, error) {
|
||||||
pk, err := internal.ParseKey(js.conf.PrivateKey)
|
pk, err := internal.ParseKey(js.conf.PrivateKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
hc := oauth2.NewClient(js.ctx, nil)
|
hc := oauth2.NewClient(js.ctx, nil)
|
||||||
claimSet := &jws.ClaimSet{
|
claimSet := &jws.ClaimSet{
|
||||||
Iss: js.conf.Email,
|
Iss: js.conf.Email,
|
||||||
Scope: strings.Join(js.conf.Scopes, " "),
|
Scope: strings.Join(js.conf.Scopes, " "),
|
||||||
Aud: js.conf.TokenURL,
|
Aud: js.conf.TokenURL,
|
||||||
PrivateClaims: js.conf.PrivateClaims,
|
PrivateClaims: js.conf.PrivateClaims,
|
||||||
}
|
}
|
||||||
if subject := js.conf.Subject; subject != "" {
|
if subject := js.conf.Subject; subject != "" {
|
||||||
claimSet.Sub = subject
|
claimSet.Sub = subject
|
||||||
// prn is the old name of sub. Keep setting it
|
// prn is the old name of sub. Keep setting it
|
||||||
// to be compatible with legacy OAuth 2.0 providers.
|
// to be compatible with legacy OAuth 2.0 providers.
|
||||||
claimSet.Prn = subject
|
claimSet.Prn = subject
|
||||||
}
|
}
|
||||||
if t := js.conf.Expires; t > 0 {
|
if t := js.conf.Expires; t > 0 {
|
||||||
claimSet.Exp = time.Now().Add(t).Unix()
|
claimSet.Exp = time.Now().Add(t).Unix()
|
||||||
}
|
}
|
||||||
if aud := js.conf.Audience; aud != "" {
|
if aud := js.conf.Audience; aud != "" {
|
||||||
claimSet.Aud = aud
|
claimSet.Aud = aud
|
||||||
}
|
}
|
||||||
h := *defaultHeader
|
h := *defaultHeader
|
||||||
h.KeyID = js.conf.PrivateKeyID
|
h.KeyID = js.conf.PrivateKeyID
|
||||||
payload, err := jws.Encode(&h, claimSet, pk)
|
payload, err := jws.Encode(&h, claimSet, pk)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
v := url.Values{}
|
v := url.Values{}
|
||||||
v.Set("grant_type", defaultGrantType)
|
v.Set("grant_type", defaultGrantType)
|
||||||
v.Set("assertion", payload)
|
v.Set("assertion", payload)
|
||||||
resp, err := hc.PostForm(js.conf.TokenURL, v)
|
resp, err := hc.PostForm(js.conf.TokenURL, v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err)
|
return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
body, err := ioutil.ReadAll(io.LimitReader(resp.Body, 1<<20))
|
body, err := ioutil.ReadAll(io.LimitReader(resp.Body, 1<<20))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err)
|
return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err)
|
||||||
}
|
}
|
||||||
if c := resp.StatusCode; c < 200 || c > 299 {
|
if c := resp.StatusCode; c < 200 || c > 299 {
|
||||||
return nil, &oauth2.RetrieveError{
|
return nil, &oauth2.RetrieveError{
|
||||||
Response: resp,
|
Response: resp,
|
||||||
Body: body,
|
Body: body,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// tokenRes is the JSON response body.
|
// tokenRes is the JSON response body.
|
||||||
var tokenRes struct {
|
var tokenRes struct {
|
||||||
AccessToken string `json:"access_token"`
|
AccessToken string `json:"access_token"`
|
||||||
TokenType string `json:"token_type"`
|
TokenType string `json:"token_type"`
|
||||||
IDToken string `json:"id_token"`
|
IDToken string `json:"id_token"`
|
||||||
ExpiresIn int64 `json:"expires_in"` // relative seconds from now
|
ExpiresIn int64 `json:"expires_in"` // relative seconds from now
|
||||||
}
|
}
|
||||||
if err := json.Unmarshal(body, &tokenRes); err != nil {
|
if err := json.Unmarshal(body, &tokenRes); err != nil {
|
||||||
return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err)
|
return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err)
|
||||||
}
|
}
|
||||||
token := &oauth2.Token{
|
token := &oauth2.Token{
|
||||||
AccessToken: tokenRes.AccessToken,
|
AccessToken: tokenRes.AccessToken,
|
||||||
TokenType: tokenRes.TokenType,
|
TokenType: tokenRes.TokenType,
|
||||||
}
|
}
|
||||||
raw := make(map[string]interface{})
|
raw := make(map[string]interface{})
|
||||||
json.Unmarshal(body, &raw) // no error checks for optional fields
|
json.Unmarshal(body, &raw) // no error checks for optional fields
|
||||||
token = token.WithExtra(raw)
|
token = token.WithExtra(raw)
|
||||||
|
|
||||||
if secs := tokenRes.ExpiresIn; secs > 0 {
|
if secs := tokenRes.ExpiresIn; secs > 0 {
|
||||||
token.Expiry = time.Now().Add(time.Duration(secs) * time.Second)
|
token.Expiry = time.Now().Add(time.Duration(secs) * time.Second)
|
||||||
}
|
}
|
||||||
if v := tokenRes.IDToken; v != "" {
|
if v := tokenRes.IDToken; v != "" {
|
||||||
// decode returned id token to get expiry
|
// decode returned id token to get expiry
|
||||||
claimSet, err := jws.Decode(v)
|
claimSet, err := jws.Decode(v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("oauth2: error decoding JWT token: %v", err)
|
return nil, fmt.Errorf("oauth2: error decoding JWT token: %v", err)
|
||||||
}
|
}
|
||||||
token.Expiry = time.Unix(claimSet.Exp, 0)
|
token.Expiry = time.Unix(claimSet.Exp, 0)
|
||||||
}
|
}
|
||||||
if js.conf.UseIDToken {
|
if js.conf.UseIDToken {
|
||||||
if tokenRes.IDToken == "" {
|
if tokenRes.IDToken == "" {
|
||||||
return nil, fmt.Errorf("oauth2: response doesn't have JWT token")
|
return nil, fmt.Errorf("oauth2: response doesn't have JWT token")
|
||||||
}
|
}
|
||||||
token.AccessToken = tokenRes.IDToken
|
token.AccessToken = tokenRes.IDToken
|
||||||
}
|
}
|
||||||
return token, nil
|
return token, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,381 +1,381 @@
|
||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
// Copyright 2014 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// Package oauth2 provides support for making
|
// Package oauth2 provides support for making
|
||||||
// OAuth2 authorized and authenticated HTTP requests,
|
// OAuth2 authorized and authenticated HTTP requests,
|
||||||
// as specified in RFC 6749.
|
// as specified in RFC 6749.
|
||||||
// It can additionally grant authorization with Bearer JWT.
|
// It can additionally grant authorization with Bearer JWT.
|
||||||
package oauth2 // import "golang.org/x/oauth2"
|
package oauth2 // import "golang.org/x/oauth2"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"golang.org/x/oauth2/internal"
|
"golang.org/x/oauth2/internal"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NoContext is the default context you should supply if not using
|
// NoContext is the default context you should supply if not using
|
||||||
// your own context.Context (see https://golang.org/x/net/context).
|
// your own context.Context (see https://golang.org/x/net/context).
|
||||||
//
|
//
|
||||||
// Deprecated: Use context.Background() or context.TODO() instead.
|
// Deprecated: Use context.Background() or context.TODO() instead.
|
||||||
var NoContext = context.TODO()
|
var NoContext = context.TODO()
|
||||||
|
|
||||||
// RegisterBrokenAuthHeaderProvider previously did something. It is now a no-op.
|
// RegisterBrokenAuthHeaderProvider previously did something. It is now a no-op.
|
||||||
//
|
//
|
||||||
// Deprecated: this function no longer does anything. Caller code that
|
// Deprecated: this function no longer does anything. Caller code that
|
||||||
// wants to avoid potential extra HTTP requests made during
|
// wants to avoid potential extra HTTP requests made during
|
||||||
// auto-probing of the provider's auth style should set
|
// auto-probing of the provider's auth style should set
|
||||||
// Endpoint.AuthStyle.
|
// Endpoint.AuthStyle.
|
||||||
func RegisterBrokenAuthHeaderProvider(tokenURL string) {}
|
func RegisterBrokenAuthHeaderProvider(tokenURL string) {}
|
||||||
|
|
||||||
// Config describes a typical 3-legged OAuth2 flow, with both the
|
// Config describes a typical 3-legged OAuth2 flow, with both the
|
||||||
// client application information and the server's endpoint URLs.
|
// client application information and the server's endpoint URLs.
|
||||||
// For the client credentials 2-legged OAuth2 flow, see the clientcredentials
|
// For the client credentials 2-legged OAuth2 flow, see the clientcredentials
|
||||||
// package (https://golang.org/x/oauth2/clientcredentials).
|
// package (https://golang.org/x/oauth2/clientcredentials).
|
||||||
type Config struct {
|
type Config struct {
|
||||||
// ClientID is the application's ID.
|
// ClientID is the application's ID.
|
||||||
ClientID string
|
ClientID string
|
||||||
|
|
||||||
// ClientSecret is the application's secret.
|
// ClientSecret is the application's secret.
|
||||||
ClientSecret string
|
ClientSecret string
|
||||||
|
|
||||||
// Endpoint contains the resource server's token endpoint
|
// Endpoint contains the resource server's token endpoint
|
||||||
// URLs. These are constants specific to each server and are
|
// URLs. These are constants specific to each server and are
|
||||||
// often available via site-specific packages, such as
|
// often available via site-specific packages, such as
|
||||||
// google.Endpoint or github.Endpoint.
|
// google.Endpoint or github.Endpoint.
|
||||||
Endpoint Endpoint
|
Endpoint Endpoint
|
||||||
|
|
||||||
// RedirectURL is the URL to redirect users going through
|
// RedirectURL is the URL to redirect users going through
|
||||||
// the OAuth flow, after the resource owner's URLs.
|
// the OAuth flow, after the resource owner's URLs.
|
||||||
RedirectURL string
|
RedirectURL string
|
||||||
|
|
||||||
// Scope specifies optional requested permissions.
|
// Scope specifies optional requested permissions.
|
||||||
Scopes []string
|
Scopes []string
|
||||||
}
|
}
|
||||||
|
|
||||||
// A TokenSource is anything that can return a token.
|
// A TokenSource is anything that can return a token.
|
||||||
type TokenSource interface {
|
type TokenSource interface {
|
||||||
// Token returns a token or an error.
|
// Token returns a token or an error.
|
||||||
// Token must be safe for concurrent use by multiple goroutines.
|
// Token must be safe for concurrent use by multiple goroutines.
|
||||||
// The returned Token must not be modified.
|
// The returned Token must not be modified.
|
||||||
Token() (*Token, error)
|
Token() (*Token, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Endpoint represents an OAuth 2.0 provider's authorization and token
|
// Endpoint represents an OAuth 2.0 provider's authorization and token
|
||||||
// endpoint URLs.
|
// endpoint URLs.
|
||||||
type Endpoint struct {
|
type Endpoint struct {
|
||||||
AuthURL string
|
AuthURL string
|
||||||
TokenURL string
|
TokenURL string
|
||||||
|
|
||||||
// AuthStyle optionally specifies how the endpoint wants the
|
// AuthStyle optionally specifies how the endpoint wants the
|
||||||
// client ID & client secret sent. The zero value means to
|
// client ID & client secret sent. The zero value means to
|
||||||
// auto-detect.
|
// auto-detect.
|
||||||
AuthStyle AuthStyle
|
AuthStyle AuthStyle
|
||||||
}
|
}
|
||||||
|
|
||||||
// AuthStyle represents how requests for tokens are authenticated
|
// AuthStyle represents how requests for tokens are authenticated
|
||||||
// to the server.
|
// to the server.
|
||||||
type AuthStyle int
|
type AuthStyle int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// AuthStyleAutoDetect means to auto-detect which authentication
|
// AuthStyleAutoDetect means to auto-detect which authentication
|
||||||
// style the provider wants by trying both ways and caching
|
// style the provider wants by trying both ways and caching
|
||||||
// the successful way for the future.
|
// the successful way for the future.
|
||||||
AuthStyleAutoDetect AuthStyle = 0
|
AuthStyleAutoDetect AuthStyle = 0
|
||||||
|
|
||||||
// AuthStyleInParams sends the "client_id" and "client_secret"
|
// AuthStyleInParams sends the "client_id" and "client_secret"
|
||||||
// in the POST body as application/x-www-form-urlencoded parameters.
|
// in the POST body as application/x-www-form-urlencoded parameters.
|
||||||
AuthStyleInParams AuthStyle = 1
|
AuthStyleInParams AuthStyle = 1
|
||||||
|
|
||||||
// AuthStyleInHeader sends the client_id and client_password
|
// AuthStyleInHeader sends the client_id and client_password
|
||||||
// using HTTP Basic Authorization. This is an optional style
|
// using HTTP Basic Authorization. This is an optional style
|
||||||
// described in the OAuth2 RFC 6749 section 2.3.1.
|
// described in the OAuth2 RFC 6749 section 2.3.1.
|
||||||
AuthStyleInHeader AuthStyle = 2
|
AuthStyleInHeader AuthStyle = 2
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// AccessTypeOnline and AccessTypeOffline are options passed
|
// AccessTypeOnline and AccessTypeOffline are options passed
|
||||||
// to the Options.AuthCodeURL method. They modify the
|
// to the Options.AuthCodeURL method. They modify the
|
||||||
// "access_type" field that gets sent in the URL returned by
|
// "access_type" field that gets sent in the URL returned by
|
||||||
// AuthCodeURL.
|
// AuthCodeURL.
|
||||||
//
|
//
|
||||||
// Online is the default if neither is specified. If your
|
// Online is the default if neither is specified. If your
|
||||||
// application needs to refresh access tokens when the user
|
// application needs to refresh access tokens when the user
|
||||||
// is not present at the browser, then use offline. This will
|
// is not present at the browser, then use offline. This will
|
||||||
// result in your application obtaining a refresh token the
|
// result in your application obtaining a refresh token the
|
||||||
// first time your application exchanges an authorization
|
// first time your application exchanges an authorization
|
||||||
// code for a user.
|
// code for a user.
|
||||||
AccessTypeOnline AuthCodeOption = SetAuthURLParam("access_type", "online")
|
AccessTypeOnline AuthCodeOption = SetAuthURLParam("access_type", "online")
|
||||||
AccessTypeOffline AuthCodeOption = SetAuthURLParam("access_type", "offline")
|
AccessTypeOffline AuthCodeOption = SetAuthURLParam("access_type", "offline")
|
||||||
|
|
||||||
// ApprovalForce forces the users to view the consent dialog
|
// ApprovalForce forces the users to view the consent dialog
|
||||||
// and confirm the permissions request at the URL returned
|
// and confirm the permissions request at the URL returned
|
||||||
// from AuthCodeURL, even if they've already done so.
|
// from AuthCodeURL, even if they've already done so.
|
||||||
ApprovalForce AuthCodeOption = SetAuthURLParam("prompt", "consent")
|
ApprovalForce AuthCodeOption = SetAuthURLParam("prompt", "consent")
|
||||||
)
|
)
|
||||||
|
|
||||||
// An AuthCodeOption is passed to Config.AuthCodeURL.
|
// An AuthCodeOption is passed to Config.AuthCodeURL.
|
||||||
type AuthCodeOption interface {
|
type AuthCodeOption interface {
|
||||||
setValue(url.Values)
|
setValue(url.Values)
|
||||||
}
|
}
|
||||||
|
|
||||||
type setParam struct{ k, v string }
|
type setParam struct{ k, v string }
|
||||||
|
|
||||||
func (p setParam) setValue(m url.Values) { m.Set(p.k, p.v) }
|
func (p setParam) setValue(m url.Values) { m.Set(p.k, p.v) }
|
||||||
|
|
||||||
// SetAuthURLParam builds an AuthCodeOption which passes key/value parameters
|
// SetAuthURLParam builds an AuthCodeOption which passes key/value parameters
|
||||||
// to a provider's authorization endpoint.
|
// to a provider's authorization endpoint.
|
||||||
func SetAuthURLParam(key, value string) AuthCodeOption {
|
func SetAuthURLParam(key, value string) AuthCodeOption {
|
||||||
return setParam{key, value}
|
return setParam{key, value}
|
||||||
}
|
}
|
||||||
|
|
||||||
// AuthCodeURL returns a URL to OAuth 2.0 provider's consent page
|
// AuthCodeURL returns a URL to OAuth 2.0 provider's consent page
|
||||||
// that asks for permissions for the required scopes explicitly.
|
// that asks for permissions for the required scopes explicitly.
|
||||||
//
|
//
|
||||||
// State is a token to protect the user from CSRF attacks. You must
|
// State is a token to protect the user from CSRF attacks. You must
|
||||||
// always provide a non-empty string and validate that it matches the
|
// always provide a non-empty string and validate that it matches the
|
||||||
// the state query parameter on your redirect callback.
|
// the state query parameter on your redirect callback.
|
||||||
// See http://tools.ietf.org/html/rfc6749#section-10.12 for more info.
|
// See http://tools.ietf.org/html/rfc6749#section-10.12 for more info.
|
||||||
//
|
//
|
||||||
// Opts may include AccessTypeOnline or AccessTypeOffline, as well
|
// Opts may include AccessTypeOnline or AccessTypeOffline, as well
|
||||||
// as ApprovalForce.
|
// as ApprovalForce.
|
||||||
// It can also be used to pass the PKCE challenge.
|
// It can also be used to pass the PKCE challenge.
|
||||||
// See https://www.oauth.com/oauth2-servers/pkce/ for more info.
|
// See https://www.oauth.com/oauth2-servers/pkce/ for more info.
|
||||||
func (c *Config) AuthCodeURL(state string, opts ...AuthCodeOption) string {
|
func (c *Config) AuthCodeURL(state string, opts ...AuthCodeOption) string {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
buf.WriteString(c.Endpoint.AuthURL)
|
buf.WriteString(c.Endpoint.AuthURL)
|
||||||
v := url.Values{
|
v := url.Values{
|
||||||
"response_type": {"code"},
|
"response_type": {"code"},
|
||||||
"client_id": {c.ClientID},
|
"client_id": {c.ClientID},
|
||||||
}
|
}
|
||||||
if c.RedirectURL != "" {
|
if c.RedirectURL != "" {
|
||||||
v.Set("redirect_uri", c.RedirectURL)
|
v.Set("redirect_uri", c.RedirectURL)
|
||||||
}
|
}
|
||||||
if len(c.Scopes) > 0 {
|
if len(c.Scopes) > 0 {
|
||||||
v.Set("scope", strings.Join(c.Scopes, " "))
|
v.Set("scope", strings.Join(c.Scopes, " "))
|
||||||
}
|
}
|
||||||
if state != "" {
|
if state != "" {
|
||||||
// TODO(light): Docs say never to omit state; don't allow empty.
|
// TODO(light): Docs say never to omit state; don't allow empty.
|
||||||
v.Set("state", state)
|
v.Set("state", state)
|
||||||
}
|
}
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
opt.setValue(v)
|
opt.setValue(v)
|
||||||
}
|
}
|
||||||
if strings.Contains(c.Endpoint.AuthURL, "?") {
|
if strings.Contains(c.Endpoint.AuthURL, "?") {
|
||||||
buf.WriteByte('&')
|
buf.WriteByte('&')
|
||||||
} else {
|
} else {
|
||||||
buf.WriteByte('?')
|
buf.WriteByte('?')
|
||||||
}
|
}
|
||||||
buf.WriteString(v.Encode())
|
buf.WriteString(v.Encode())
|
||||||
return buf.String()
|
return buf.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
// PasswordCredentialsToken converts a resource owner username and password
|
// PasswordCredentialsToken converts a resource owner username and password
|
||||||
// pair into a token.
|
// pair into a token.
|
||||||
//
|
//
|
||||||
// Per the RFC, this grant type should only be used "when there is a high
|
// Per the RFC, this grant type should only be used "when there is a high
|
||||||
// degree of trust between the resource owner and the client (e.g., the client
|
// degree of trust between the resource owner and the client (e.g., the client
|
||||||
// is part of the device operating system or a highly privileged application),
|
// is part of the device operating system or a highly privileged application),
|
||||||
// and when other authorization grant types are not available."
|
// and when other authorization grant types are not available."
|
||||||
// See https://tools.ietf.org/html/rfc6749#section-4.3 for more info.
|
// See https://tools.ietf.org/html/rfc6749#section-4.3 for more info.
|
||||||
//
|
//
|
||||||
// The provided context optionally controls which HTTP client is used. See the HTTPClient variable.
|
// The provided context optionally controls which HTTP client is used. See the HTTPClient variable.
|
||||||
func (c *Config) PasswordCredentialsToken(ctx context.Context, username, password string) (*Token, error) {
|
func (c *Config) PasswordCredentialsToken(ctx context.Context, username, password string) (*Token, error) {
|
||||||
v := url.Values{
|
v := url.Values{
|
||||||
"grant_type": {"password"},
|
"grant_type": {"password"},
|
||||||
"username": {username},
|
"username": {username},
|
||||||
"password": {password},
|
"password": {password},
|
||||||
}
|
}
|
||||||
if len(c.Scopes) > 0 {
|
if len(c.Scopes) > 0 {
|
||||||
v.Set("scope", strings.Join(c.Scopes, " "))
|
v.Set("scope", strings.Join(c.Scopes, " "))
|
||||||
}
|
}
|
||||||
return retrieveToken(ctx, c, v)
|
return retrieveToken(ctx, c, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Exchange converts an authorization code into a token.
|
// Exchange converts an authorization code into a token.
|
||||||
//
|
//
|
||||||
// It is used after a resource provider redirects the user back
|
// It is used after a resource provider redirects the user back
|
||||||
// to the Redirect URI (the URL obtained from AuthCodeURL).
|
// to the Redirect URI (the URL obtained from AuthCodeURL).
|
||||||
//
|
//
|
||||||
// The provided context optionally controls which HTTP client is used. See the HTTPClient variable.
|
// The provided context optionally controls which HTTP client is used. See the HTTPClient variable.
|
||||||
//
|
//
|
||||||
// The code will be in the *http.Request.FormValue("code"). Before
|
// The code will be in the *http.Request.FormValue("code"). Before
|
||||||
// calling Exchange, be sure to validate FormValue("state").
|
// calling Exchange, be sure to validate FormValue("state").
|
||||||
//
|
//
|
||||||
// Opts may include the PKCE verifier code if previously used in AuthCodeURL.
|
// Opts may include the PKCE verifier code if previously used in AuthCodeURL.
|
||||||
// See https://www.oauth.com/oauth2-servers/pkce/ for more info.
|
// See https://www.oauth.com/oauth2-servers/pkce/ for more info.
|
||||||
func (c *Config) Exchange(ctx context.Context, code string, opts ...AuthCodeOption) (*Token, error) {
|
func (c *Config) Exchange(ctx context.Context, code string, opts ...AuthCodeOption) (*Token, error) {
|
||||||
v := url.Values{
|
v := url.Values{
|
||||||
"grant_type": {"authorization_code"},
|
"grant_type": {"authorization_code"},
|
||||||
"code": {code},
|
"code": {code},
|
||||||
}
|
}
|
||||||
if c.RedirectURL != "" {
|
if c.RedirectURL != "" {
|
||||||
v.Set("redirect_uri", c.RedirectURL)
|
v.Set("redirect_uri", c.RedirectURL)
|
||||||
}
|
}
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
opt.setValue(v)
|
opt.setValue(v)
|
||||||
}
|
}
|
||||||
return retrieveToken(ctx, c, v)
|
return retrieveToken(ctx, c, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Client returns an HTTP client using the provided token.
|
// Client returns an HTTP client using the provided token.
|
||||||
// The token will auto-refresh as necessary. The underlying
|
// The token will auto-refresh as necessary. The underlying
|
||||||
// HTTP transport will be obtained using the provided context.
|
// HTTP transport will be obtained using the provided context.
|
||||||
// The returned client and its Transport should not be modified.
|
// The returned client and its Transport should not be modified.
|
||||||
func (c *Config) Client(ctx context.Context, t *Token) *http.Client {
|
func (c *Config) Client(ctx context.Context, t *Token) *http.Client {
|
||||||
return NewClient(ctx, c.TokenSource(ctx, t))
|
return NewClient(ctx, c.TokenSource(ctx, t))
|
||||||
}
|
}
|
||||||
|
|
||||||
// TokenSource returns a TokenSource that returns t until t expires,
|
// TokenSource returns a TokenSource that returns t until t expires,
|
||||||
// automatically refreshing it as necessary using the provided context.
|
// automatically refreshing it as necessary using the provided context.
|
||||||
//
|
//
|
||||||
// Most users will use Config.Client instead.
|
// Most users will use Config.Client instead.
|
||||||
func (c *Config) TokenSource(ctx context.Context, t *Token) TokenSource {
|
func (c *Config) TokenSource(ctx context.Context, t *Token) TokenSource {
|
||||||
tkr := &tokenRefresher{
|
tkr := &tokenRefresher{
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
conf: c,
|
conf: c,
|
||||||
}
|
}
|
||||||
if t != nil {
|
if t != nil {
|
||||||
tkr.refreshToken = t.RefreshToken
|
tkr.refreshToken = t.RefreshToken
|
||||||
}
|
}
|
||||||
return &reuseTokenSource{
|
return &reuseTokenSource{
|
||||||
t: t,
|
t: t,
|
||||||
new: tkr,
|
new: tkr,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// tokenRefresher is a TokenSource that makes "grant_type"=="refresh_token"
|
// tokenRefresher is a TokenSource that makes "grant_type"=="refresh_token"
|
||||||
// HTTP requests to renew a token using a RefreshToken.
|
// HTTP requests to renew a token using a RefreshToken.
|
||||||
type tokenRefresher struct {
|
type tokenRefresher struct {
|
||||||
ctx context.Context // used to get HTTP requests
|
ctx context.Context // used to get HTTP requests
|
||||||
conf *Config
|
conf *Config
|
||||||
refreshToken string
|
refreshToken string
|
||||||
}
|
}
|
||||||
|
|
||||||
// WARNING: Token is not safe for concurrent access, as it
|
// WARNING: Token is not safe for concurrent access, as it
|
||||||
// updates the tokenRefresher's refreshToken field.
|
// updates the tokenRefresher's refreshToken field.
|
||||||
// Within this package, it is used by reuseTokenSource which
|
// Within this package, it is used by reuseTokenSource which
|
||||||
// synchronizes calls to this method with its own mutex.
|
// synchronizes calls to this method with its own mutex.
|
||||||
func (tf *tokenRefresher) Token() (*Token, error) {
|
func (tf *tokenRefresher) Token() (*Token, error) {
|
||||||
if tf.refreshToken == "" {
|
if tf.refreshToken == "" {
|
||||||
return nil, errors.New("oauth2: token expired and refresh token is not set")
|
return nil, errors.New("oauth2: token expired and refresh token is not set")
|
||||||
}
|
}
|
||||||
|
|
||||||
tk, err := retrieveToken(tf.ctx, tf.conf, url.Values{
|
tk, err := retrieveToken(tf.ctx, tf.conf, url.Values{
|
||||||
"grant_type": {"refresh_token"},
|
"grant_type": {"refresh_token"},
|
||||||
"refresh_token": {tf.refreshToken},
|
"refresh_token": {tf.refreshToken},
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if tf.refreshToken != tk.RefreshToken {
|
if tf.refreshToken != tk.RefreshToken {
|
||||||
tf.refreshToken = tk.RefreshToken
|
tf.refreshToken = tk.RefreshToken
|
||||||
}
|
}
|
||||||
return tk, err
|
return tk, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// reuseTokenSource is a TokenSource that holds a single token in memory
|
// reuseTokenSource is a TokenSource that holds a single token in memory
|
||||||
// and validates its expiry before each call to retrieve it with
|
// and validates its expiry before each call to retrieve it with
|
||||||
// Token. If it's expired, it will be auto-refreshed using the
|
// Token. If it's expired, it will be auto-refreshed using the
|
||||||
// new TokenSource.
|
// new TokenSource.
|
||||||
type reuseTokenSource struct {
|
type reuseTokenSource struct {
|
||||||
new TokenSource // called when t is expired.
|
new TokenSource // called when t is expired.
|
||||||
|
|
||||||
mu sync.Mutex // guards t
|
mu sync.Mutex // guards t
|
||||||
t *Token
|
t *Token
|
||||||
}
|
}
|
||||||
|
|
||||||
// Token returns the current token if it's still valid, else will
|
// Token returns the current token if it's still valid, else will
|
||||||
// refresh the current token (using r.Context for HTTP client
|
// refresh the current token (using r.Context for HTTP client
|
||||||
// information) and return the new one.
|
// information) and return the new one.
|
||||||
func (s *reuseTokenSource) Token() (*Token, error) {
|
func (s *reuseTokenSource) Token() (*Token, error) {
|
||||||
s.mu.Lock()
|
s.mu.Lock()
|
||||||
defer s.mu.Unlock()
|
defer s.mu.Unlock()
|
||||||
if s.t.Valid() {
|
if s.t.Valid() {
|
||||||
return s.t, nil
|
return s.t, nil
|
||||||
}
|
}
|
||||||
t, err := s.new.Token()
|
t, err := s.new.Token()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
s.t = t
|
s.t = t
|
||||||
return t, nil
|
return t, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// StaticTokenSource returns a TokenSource that always returns the same token.
|
// StaticTokenSource returns a TokenSource that always returns the same token.
|
||||||
// Because the provided token t is never refreshed, StaticTokenSource is only
|
// Because the provided token t is never refreshed, StaticTokenSource is only
|
||||||
// useful for tokens that never expire.
|
// useful for tokens that never expire.
|
||||||
func StaticTokenSource(t *Token) TokenSource {
|
func StaticTokenSource(t *Token) TokenSource {
|
||||||
return staticTokenSource{t}
|
return staticTokenSource{t}
|
||||||
}
|
}
|
||||||
|
|
||||||
// staticTokenSource is a TokenSource that always returns the same Token.
|
// staticTokenSource is a TokenSource that always returns the same Token.
|
||||||
type staticTokenSource struct {
|
type staticTokenSource struct {
|
||||||
t *Token
|
t *Token
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s staticTokenSource) Token() (*Token, error) {
|
func (s staticTokenSource) Token() (*Token, error) {
|
||||||
return s.t, nil
|
return s.t, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// HTTPClient is the context key to use with golang.org/x/net/context's
|
// HTTPClient is the context key to use with golang.org/x/net/context's
|
||||||
// WithValue function to associate an *http.Client value with a context.
|
// WithValue function to associate an *http.Client value with a context.
|
||||||
var HTTPClient internal.ContextKey
|
var HTTPClient internal.ContextKey
|
||||||
|
|
||||||
// NewClient creates an *http.Client from a Context and TokenSource.
|
// NewClient creates an *http.Client from a Context and TokenSource.
|
||||||
// The returned client is not valid beyond the lifetime of the context.
|
// The returned client is not valid beyond the lifetime of the context.
|
||||||
//
|
//
|
||||||
// Note that if a custom *http.Client is provided via the Context it
|
// Note that if a custom *http.Client is provided via the Context it
|
||||||
// is used only for token acquisition and is not used to configure the
|
// is used only for token acquisition and is not used to configure the
|
||||||
// *http.Client returned from NewClient.
|
// *http.Client returned from NewClient.
|
||||||
//
|
//
|
||||||
// As a special case, if src is nil, a non-OAuth2 client is returned
|
// As a special case, if src is nil, a non-OAuth2 client is returned
|
||||||
// using the provided context. This exists to support related OAuth2
|
// using the provided context. This exists to support related OAuth2
|
||||||
// packages.
|
// packages.
|
||||||
func NewClient(ctx context.Context, src TokenSource) *http.Client {
|
func NewClient(ctx context.Context, src TokenSource) *http.Client {
|
||||||
if src == nil {
|
if src == nil {
|
||||||
return internal.ContextClient(ctx)
|
return internal.ContextClient(ctx)
|
||||||
}
|
}
|
||||||
return &http.Client{
|
return &http.Client{
|
||||||
Transport: &Transport{
|
Transport: &Transport{
|
||||||
Base: internal.ContextClient(ctx).Transport,
|
Base: internal.ContextClient(ctx).Transport,
|
||||||
Source: ReuseTokenSource(nil, src),
|
Source: ReuseTokenSource(nil, src),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReuseTokenSource returns a TokenSource which repeatedly returns the
|
// ReuseTokenSource returns a TokenSource which repeatedly returns the
|
||||||
// same token as long as it's valid, starting with t.
|
// same token as long as it's valid, starting with t.
|
||||||
// When its cached token is invalid, a new token is obtained from src.
|
// When its cached token is invalid, a new token is obtained from src.
|
||||||
//
|
//
|
||||||
// ReuseTokenSource is typically used to reuse tokens from a cache
|
// ReuseTokenSource is typically used to reuse tokens from a cache
|
||||||
// (such as a file on disk) between runs of a program, rather than
|
// (such as a file on disk) between runs of a program, rather than
|
||||||
// obtaining new tokens unnecessarily.
|
// obtaining new tokens unnecessarily.
|
||||||
//
|
//
|
||||||
// The initial token t may be nil, in which case the TokenSource is
|
// The initial token t may be nil, in which case the TokenSource is
|
||||||
// wrapped in a caching version if it isn't one already. This also
|
// wrapped in a caching version if it isn't one already. This also
|
||||||
// means it's always safe to wrap ReuseTokenSource around any other
|
// means it's always safe to wrap ReuseTokenSource around any other
|
||||||
// TokenSource without adverse effects.
|
// TokenSource without adverse effects.
|
||||||
func ReuseTokenSource(t *Token, src TokenSource) TokenSource {
|
func ReuseTokenSource(t *Token, src TokenSource) TokenSource {
|
||||||
// Don't wrap a reuseTokenSource in itself. That would work,
|
// Don't wrap a reuseTokenSource in itself. That would work,
|
||||||
// but cause an unnecessary number of mutex operations.
|
// but cause an unnecessary number of mutex operations.
|
||||||
// Just build the equivalent one.
|
// Just build the equivalent one.
|
||||||
if rt, ok := src.(*reuseTokenSource); ok {
|
if rt, ok := src.(*reuseTokenSource); ok {
|
||||||
if t == nil {
|
if t == nil {
|
||||||
// Just use it directly.
|
// Just use it directly.
|
||||||
return rt
|
return rt
|
||||||
}
|
}
|
||||||
src = rt.new
|
src = rt.new
|
||||||
}
|
}
|
||||||
return &reuseTokenSource{
|
return &reuseTokenSource{
|
||||||
t: t,
|
t: t,
|
||||||
new: src,
|
new: src,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,178 +1,178 @@
|
||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
// Copyright 2014 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package oauth2
|
package oauth2
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"golang.org/x/oauth2/internal"
|
"golang.org/x/oauth2/internal"
|
||||||
)
|
)
|
||||||
|
|
||||||
// expiryDelta determines how earlier a token should be considered
|
// expiryDelta determines how earlier a token should be considered
|
||||||
// expired than its actual expiration time. It is used to avoid late
|
// expired than its actual expiration time. It is used to avoid late
|
||||||
// expirations due to client-server time mismatches.
|
// expirations due to client-server time mismatches.
|
||||||
const expiryDelta = 10 * time.Second
|
const expiryDelta = 10 * time.Second
|
||||||
|
|
||||||
// Token represents the credentials used to authorize
|
// Token represents the credentials used to authorize
|
||||||
// the requests to access protected resources on the OAuth 2.0
|
// the requests to access protected resources on the OAuth 2.0
|
||||||
// provider's backend.
|
// provider's backend.
|
||||||
//
|
//
|
||||||
// Most users of this package should not access fields of Token
|
// Most users of this package should not access fields of Token
|
||||||
// directly. They're exported mostly for use by related packages
|
// directly. They're exported mostly for use by related packages
|
||||||
// implementing derivative OAuth2 flows.
|
// implementing derivative OAuth2 flows.
|
||||||
type Token struct {
|
type Token struct {
|
||||||
// AccessToken is the token that authorizes and authenticates
|
// AccessToken is the token that authorizes and authenticates
|
||||||
// the requests.
|
// the requests.
|
||||||
AccessToken string `json:"access_token"`
|
AccessToken string `json:"access_token"`
|
||||||
|
|
||||||
// TokenType is the type of token.
|
// TokenType is the type of token.
|
||||||
// The Type method returns either this or "Bearer", the default.
|
// The Type method returns either this or "Bearer", the default.
|
||||||
TokenType string `json:"token_type,omitempty"`
|
TokenType string `json:"token_type,omitempty"`
|
||||||
|
|
||||||
// RefreshToken is a token that's used by the application
|
// RefreshToken is a token that's used by the application
|
||||||
// (as opposed to the user) to refresh the access token
|
// (as opposed to the user) to refresh the access token
|
||||||
// if it expires.
|
// if it expires.
|
||||||
RefreshToken string `json:"refresh_token,omitempty"`
|
RefreshToken string `json:"refresh_token,omitempty"`
|
||||||
|
|
||||||
// Expiry is the optional expiration time of the access token.
|
// Expiry is the optional expiration time of the access token.
|
||||||
//
|
//
|
||||||
// If zero, TokenSource implementations will reuse the same
|
// If zero, TokenSource implementations will reuse the same
|
||||||
// token forever and RefreshToken or equivalent
|
// token forever and RefreshToken or equivalent
|
||||||
// mechanisms for that TokenSource will not be used.
|
// mechanisms for that TokenSource will not be used.
|
||||||
Expiry time.Time `json:"expiry,omitempty"`
|
Expiry time.Time `json:"expiry,omitempty"`
|
||||||
|
|
||||||
// raw optionally contains extra metadata from the server
|
// raw optionally contains extra metadata from the server
|
||||||
// when updating a token.
|
// when updating a token.
|
||||||
raw interface{}
|
raw interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Type returns t.TokenType if non-empty, else "Bearer".
|
// Type returns t.TokenType if non-empty, else "Bearer".
|
||||||
func (t *Token) Type() string {
|
func (t *Token) Type() string {
|
||||||
if strings.EqualFold(t.TokenType, "bearer") {
|
if strings.EqualFold(t.TokenType, "bearer") {
|
||||||
return "Bearer"
|
return "Bearer"
|
||||||
}
|
}
|
||||||
if strings.EqualFold(t.TokenType, "mac") {
|
if strings.EqualFold(t.TokenType, "mac") {
|
||||||
return "MAC"
|
return "MAC"
|
||||||
}
|
}
|
||||||
if strings.EqualFold(t.TokenType, "basic") {
|
if strings.EqualFold(t.TokenType, "basic") {
|
||||||
return "Basic"
|
return "Basic"
|
||||||
}
|
}
|
||||||
if t.TokenType != "" {
|
if t.TokenType != "" {
|
||||||
return t.TokenType
|
return t.TokenType
|
||||||
}
|
}
|
||||||
return "Bearer"
|
return "Bearer"
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetAuthHeader sets the Authorization header to r using the access
|
// SetAuthHeader sets the Authorization header to r using the access
|
||||||
// token in t.
|
// token in t.
|
||||||
//
|
//
|
||||||
// This method is unnecessary when using Transport or an HTTP Client
|
// This method is unnecessary when using Transport or an HTTP Client
|
||||||
// returned by this package.
|
// returned by this package.
|
||||||
func (t *Token) SetAuthHeader(r *http.Request) {
|
func (t *Token) SetAuthHeader(r *http.Request) {
|
||||||
r.Header.Set("Authorization", t.Type()+" "+t.AccessToken)
|
r.Header.Set("Authorization", t.Type()+" "+t.AccessToken)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithExtra returns a new Token that's a clone of t, but using the
|
// WithExtra returns a new Token that's a clone of t, but using the
|
||||||
// provided raw extra map. This is only intended for use by packages
|
// provided raw extra map. This is only intended for use by packages
|
||||||
// implementing derivative OAuth2 flows.
|
// implementing derivative OAuth2 flows.
|
||||||
func (t *Token) WithExtra(extra interface{}) *Token {
|
func (t *Token) WithExtra(extra interface{}) *Token {
|
||||||
t2 := new(Token)
|
t2 := new(Token)
|
||||||
*t2 = *t
|
*t2 = *t
|
||||||
t2.raw = extra
|
t2.raw = extra
|
||||||
return t2
|
return t2
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extra returns an extra field.
|
// Extra returns an extra field.
|
||||||
// Extra fields are key-value pairs returned by the server as a
|
// Extra fields are key-value pairs returned by the server as a
|
||||||
// part of the token retrieval response.
|
// part of the token retrieval response.
|
||||||
func (t *Token) Extra(key string) interface{} {
|
func (t *Token) Extra(key string) interface{} {
|
||||||
if raw, ok := t.raw.(map[string]interface{}); ok {
|
if raw, ok := t.raw.(map[string]interface{}); ok {
|
||||||
return raw[key]
|
return raw[key]
|
||||||
}
|
}
|
||||||
|
|
||||||
vals, ok := t.raw.(url.Values)
|
vals, ok := t.raw.(url.Values)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
v := vals.Get(key)
|
v := vals.Get(key)
|
||||||
switch s := strings.TrimSpace(v); strings.Count(s, ".") {
|
switch s := strings.TrimSpace(v); strings.Count(s, ".") {
|
||||||
case 0: // Contains no "."; try to parse as int
|
case 0: // Contains no "."; try to parse as int
|
||||||
if i, err := strconv.ParseInt(s, 10, 64); err == nil {
|
if i, err := strconv.ParseInt(s, 10, 64); err == nil {
|
||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
case 1: // Contains a single "."; try to parse as float
|
case 1: // Contains a single "."; try to parse as float
|
||||||
if f, err := strconv.ParseFloat(s, 64); err == nil {
|
if f, err := strconv.ParseFloat(s, 64); err == nil {
|
||||||
return f
|
return f
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
// timeNow is time.Now but pulled out as a variable for tests.
|
// timeNow is time.Now but pulled out as a variable for tests.
|
||||||
var timeNow = time.Now
|
var timeNow = time.Now
|
||||||
|
|
||||||
// expired reports whether the token is expired.
|
// expired reports whether the token is expired.
|
||||||
// t must be non-nil.
|
// t must be non-nil.
|
||||||
func (t *Token) expired() bool {
|
func (t *Token) expired() bool {
|
||||||
if t.Expiry.IsZero() {
|
if t.Expiry.IsZero() {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return t.Expiry.Round(0).Add(-expiryDelta).Before(timeNow())
|
return t.Expiry.Round(0).Add(-expiryDelta).Before(timeNow())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Valid reports whether t is non-nil, has an AccessToken, and is not expired.
|
// Valid reports whether t is non-nil, has an AccessToken, and is not expired.
|
||||||
func (t *Token) Valid() bool {
|
func (t *Token) Valid() bool {
|
||||||
return t != nil && t.AccessToken != "" && !t.expired()
|
return t != nil && t.AccessToken != "" && !t.expired()
|
||||||
}
|
}
|
||||||
|
|
||||||
// tokenFromInternal maps an *internal.Token struct into
|
// tokenFromInternal maps an *internal.Token struct into
|
||||||
// a *Token struct.
|
// a *Token struct.
|
||||||
func tokenFromInternal(t *internal.Token) *Token {
|
func tokenFromInternal(t *internal.Token) *Token {
|
||||||
if t == nil {
|
if t == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return &Token{
|
return &Token{
|
||||||
AccessToken: t.AccessToken,
|
AccessToken: t.AccessToken,
|
||||||
TokenType: t.TokenType,
|
TokenType: t.TokenType,
|
||||||
RefreshToken: t.RefreshToken,
|
RefreshToken: t.RefreshToken,
|
||||||
Expiry: t.Expiry,
|
Expiry: t.Expiry,
|
||||||
raw: t.Raw,
|
raw: t.Raw,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// retrieveToken takes a *Config and uses that to retrieve an *internal.Token.
|
// retrieveToken takes a *Config and uses that to retrieve an *internal.Token.
|
||||||
// This token is then mapped from *internal.Token into an *oauth2.Token which is returned along
|
// This token is then mapped from *internal.Token into an *oauth2.Token which is returned along
|
||||||
// with an error..
|
// with an error..
|
||||||
func retrieveToken(ctx context.Context, c *Config, v url.Values) (*Token, error) {
|
func retrieveToken(ctx context.Context, c *Config, v url.Values) (*Token, error) {
|
||||||
tk, err := internal.RetrieveToken(ctx, c.ClientID, c.ClientSecret, c.Endpoint.TokenURL, v, internal.AuthStyle(c.Endpoint.AuthStyle))
|
tk, err := internal.RetrieveToken(ctx, c.ClientID, c.ClientSecret, c.Endpoint.TokenURL, v, internal.AuthStyle(c.Endpoint.AuthStyle))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if rErr, ok := err.(*internal.RetrieveError); ok {
|
if rErr, ok := err.(*internal.RetrieveError); ok {
|
||||||
return nil, (*RetrieveError)(rErr)
|
return nil, (*RetrieveError)(rErr)
|
||||||
}
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return tokenFromInternal(tk), nil
|
return tokenFromInternal(tk), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// RetrieveError is the error returned when the token endpoint returns a
|
// RetrieveError is the error returned when the token endpoint returns a
|
||||||
// non-2XX HTTP status code.
|
// non-2XX HTTP status code.
|
||||||
type RetrieveError struct {
|
type RetrieveError struct {
|
||||||
Response *http.Response
|
Response *http.Response
|
||||||
// Body is the body that was consumed by reading Response.Body.
|
// Body is the body that was consumed by reading Response.Body.
|
||||||
// It may be truncated.
|
// It may be truncated.
|
||||||
Body []byte
|
Body []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *RetrieveError) Error() string {
|
func (r *RetrieveError) Error() string {
|
||||||
return fmt.Sprintf("oauth2: cannot fetch token: %v\nResponse: %s", r.Response.Status, r.Body)
|
return fmt.Sprintf("oauth2: cannot fetch token: %v\nResponse: %s", r.Response.Status, r.Body)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System calls for ppc64, AIX are implemented in runtime/syscall_aix.go
|
|
||||||
//
|
|
||||||
|
|
||||||
TEXT ·syscall6(SB),NOSPLIT,$0-88
|
|
||||||
JMP syscall·syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·rawSyscall6(SB),NOSPLIT,$0-88
|
|
||||||
JMP syscall·rawSyscall6(SB)
|
|
||||||
=======
|
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -34,4 +15,3 @@ TEXT ·syscall6(SB),NOSPLIT,$0-88
|
||||||
|
|
||||||
TEXT ·rawSyscall6(SB),NOSPLIT,$0-88
|
TEXT ·rawSyscall6(SB),NOSPLIT,$0-88
|
||||||
JMP syscall·rawSyscall6(SB)
|
JMP syscall·rawSyscall6(SB)
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,26 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Copyright 2019 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 cpu
|
|
||||||
|
|
||||||
// haveAsmFunctions reports whether the other functions in this file can
|
|
||||||
// be safely called.
|
|
||||||
func haveAsmFunctions() bool { return true }
|
|
||||||
|
|
||||||
// The following feature detection functions are defined in cpu_s390x.s.
|
|
||||||
// They are likely to be expensive to call so the results should be cached.
|
|
||||||
func stfle() facilityList
|
|
||||||
func kmQuery() queryResult
|
|
||||||
func kmcQuery() queryResult
|
|
||||||
func kmctrQuery() queryResult
|
|
||||||
func kmaQuery() queryResult
|
|
||||||
func kimdQuery() queryResult
|
|
||||||
func klmdQuery() queryResult
|
|
||||||
=======
|
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -43,4 +20,3 @@ func kmctrQuery() queryResult
|
||||||
func kmaQuery() queryResult
|
func kmaQuery() queryResult
|
||||||
func kimdQuery() queryResult
|
func kimdQuery() queryResult
|
||||||
func klmdQuery() queryResult
|
func klmdQuery() queryResult
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// 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 386 amd64 amd64p32
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
package cpu
|
|
||||||
|
|
||||||
// cpuid is implemented in cpu_x86.s for gc compiler
|
|
||||||
// and in cpu_gccgo.c for gccgo.
|
|
||||||
func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32)
|
|
||||||
|
|
||||||
// xgetbv with ecx = 0 is implemented in cpu_x86.s for gc compiler
|
|
||||||
// and in cpu_gccgo.c for gccgo.
|
|
||||||
func xgetbv() (eax, edx uint32)
|
|
||||||
=======
|
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -33,4 +15,3 @@ func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32)
|
||||||
// xgetbv with ecx = 0 is implemented in cpu_x86.s for gc compiler
|
// xgetbv with ecx = 0 is implemented in cpu_x86.s for gc compiler
|
||||||
// and in cpu_gccgo.c for gccgo.
|
// and in cpu_gccgo.c for gccgo.
|
||||||
func xgetbv() (eax, edx uint32)
|
func xgetbv() (eax, edx uint32)
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,27 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Copyright 2019 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 cpu
|
|
||||||
|
|
||||||
// haveAsmFunctions reports whether the other functions in this file can
|
|
||||||
// be safely called.
|
|
||||||
func haveAsmFunctions() bool { return false }
|
|
||||||
|
|
||||||
// TODO(mundaym): the following feature detection functions are currently
|
|
||||||
// stubs. See https://golang.org/cl/162887 for how to fix this.
|
|
||||||
// They are likely to be expensive to call so the results should be cached.
|
|
||||||
func stfle() facilityList { panic("not implemented for gccgo") }
|
|
||||||
func kmQuery() queryResult { panic("not implemented for gccgo") }
|
|
||||||
func kmcQuery() queryResult { panic("not implemented for gccgo") }
|
|
||||||
func kmctrQuery() queryResult { panic("not implemented for gccgo") }
|
|
||||||
func kmaQuery() queryResult { panic("not implemented for gccgo") }
|
|
||||||
func kimdQuery() queryResult { panic("not implemented for gccgo") }
|
|
||||||
func klmdQuery() queryResult { panic("not implemented for gccgo") }
|
|
||||||
=======
|
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -45,4 +21,3 @@ func kmctrQuery() queryResult { panic("not implemented for gccgo") }
|
||||||
func kmaQuery() queryResult { panic("not implemented for gccgo") }
|
func kmaQuery() queryResult { panic("not implemented for gccgo") }
|
||||||
func kimdQuery() queryResult { panic("not implemented for gccgo") }
|
func kimdQuery() queryResult { panic("not implemented for gccgo") }
|
||||||
func klmdQuery() queryResult { panic("not implemented for gccgo") }
|
func klmdQuery() queryResult { panic("not implemented for gccgo") }
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,38 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// 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 ppc64 ppc64le
|
|
||||||
|
|
||||||
package cpu
|
|
||||||
|
|
||||||
const cacheLineSize = 128
|
|
||||||
|
|
||||||
// HWCAP/HWCAP2 bits. These are exposed by the kernel.
|
|
||||||
const (
|
|
||||||
// ISA Level
|
|
||||||
_PPC_FEATURE2_ARCH_2_07 = 0x80000000
|
|
||||||
_PPC_FEATURE2_ARCH_3_00 = 0x00800000
|
|
||||||
|
|
||||||
// CPU features
|
|
||||||
_PPC_FEATURE2_DARN = 0x00200000
|
|
||||||
_PPC_FEATURE2_SCV = 0x00100000
|
|
||||||
)
|
|
||||||
|
|
||||||
func doinit() {
|
|
||||||
// HWCAP2 feature bits
|
|
||||||
PPC64.IsPOWER8 = isSet(hwCap2, _PPC_FEATURE2_ARCH_2_07)
|
|
||||||
PPC64.IsPOWER9 = isSet(hwCap2, _PPC_FEATURE2_ARCH_3_00)
|
|
||||||
PPC64.HasDARN = isSet(hwCap2, _PPC_FEATURE2_DARN)
|
|
||||||
PPC64.HasSCV = isSet(hwCap2, _PPC_FEATURE2_SCV)
|
|
||||||
}
|
|
||||||
|
|
||||||
func isSet(hwc uint, value uint) bool {
|
|
||||||
return hwc&value != 0
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -65,4 +30,3 @@ func doinit() {
|
||||||
func isSet(hwc uint, value uint) bool {
|
func isSet(hwc uint, value uint) bool {
|
||||||
return hwc&value != 0
|
return hwc&value != 0
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,166 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Copyright 2019 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 cpu
|
|
||||||
|
|
||||||
const cacheLineSize = 256
|
|
||||||
|
|
||||||
const (
|
|
||||||
// bit mask values from /usr/include/bits/hwcap.h
|
|
||||||
hwcap_ZARCH = 2
|
|
||||||
hwcap_STFLE = 4
|
|
||||||
hwcap_MSA = 8
|
|
||||||
hwcap_LDISP = 16
|
|
||||||
hwcap_EIMM = 32
|
|
||||||
hwcap_DFP = 64
|
|
||||||
hwcap_ETF3EH = 256
|
|
||||||
hwcap_VX = 2048
|
|
||||||
hwcap_VXE = 8192
|
|
||||||
)
|
|
||||||
|
|
||||||
// bitIsSet reports whether the bit at index is set. The bit index
|
|
||||||
// is in big endian order, so bit index 0 is the leftmost bit.
|
|
||||||
func bitIsSet(bits []uint64, index uint) bool {
|
|
||||||
return bits[index/64]&((1<<63)>>(index%64)) != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// function is the code for the named cryptographic function.
|
|
||||||
type function uint8
|
|
||||||
|
|
||||||
const (
|
|
||||||
// KM{,A,C,CTR} function codes
|
|
||||||
aes128 function = 18 // AES-128
|
|
||||||
aes192 function = 19 // AES-192
|
|
||||||
aes256 function = 20 // AES-256
|
|
||||||
|
|
||||||
// K{I,L}MD function codes
|
|
||||||
sha1 function = 1 // SHA-1
|
|
||||||
sha256 function = 2 // SHA-256
|
|
||||||
sha512 function = 3 // SHA-512
|
|
||||||
sha3_224 function = 32 // SHA3-224
|
|
||||||
sha3_256 function = 33 // SHA3-256
|
|
||||||
sha3_384 function = 34 // SHA3-384
|
|
||||||
sha3_512 function = 35 // SHA3-512
|
|
||||||
shake128 function = 36 // SHAKE-128
|
|
||||||
shake256 function = 37 // SHAKE-256
|
|
||||||
|
|
||||||
// KLMD function codes
|
|
||||||
ghash function = 65 // GHASH
|
|
||||||
)
|
|
||||||
|
|
||||||
// queryResult contains the result of a Query function
|
|
||||||
// call. Bits are numbered in big endian order so the
|
|
||||||
// leftmost bit (the MSB) is at index 0.
|
|
||||||
type queryResult struct {
|
|
||||||
bits [2]uint64
|
|
||||||
}
|
|
||||||
|
|
||||||
// Has reports whether the given functions are present.
|
|
||||||
func (q *queryResult) Has(fns ...function) bool {
|
|
||||||
if len(fns) == 0 {
|
|
||||||
panic("no function codes provided")
|
|
||||||
}
|
|
||||||
for _, f := range fns {
|
|
||||||
if !bitIsSet(q.bits[:], uint(f)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// facility is a bit index for the named facility.
|
|
||||||
type facility uint8
|
|
||||||
|
|
||||||
const (
|
|
||||||
// cryptography facilities
|
|
||||||
msa4 facility = 77 // message-security-assist extension 4
|
|
||||||
msa8 facility = 146 // message-security-assist extension 8
|
|
||||||
)
|
|
||||||
|
|
||||||
// facilityList contains the result of an STFLE call.
|
|
||||||
// Bits are numbered in big endian order so the
|
|
||||||
// leftmost bit (the MSB) is at index 0.
|
|
||||||
type facilityList struct {
|
|
||||||
bits [4]uint64
|
|
||||||
}
|
|
||||||
|
|
||||||
// Has reports whether the given facilities are present.
|
|
||||||
func (s *facilityList) Has(fs ...facility) bool {
|
|
||||||
if len(fs) == 0 {
|
|
||||||
panic("no facility bits provided")
|
|
||||||
}
|
|
||||||
for _, f := range fs {
|
|
||||||
if !bitIsSet(s.bits[:], uint(f)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func doinit() {
|
|
||||||
// test HWCAP bit vector
|
|
||||||
has := func(featureMask uint) bool {
|
|
||||||
return hwCap&featureMask == featureMask
|
|
||||||
}
|
|
||||||
|
|
||||||
// mandatory
|
|
||||||
S390X.HasZARCH = has(hwcap_ZARCH)
|
|
||||||
|
|
||||||
// optional
|
|
||||||
S390X.HasSTFLE = has(hwcap_STFLE)
|
|
||||||
S390X.HasLDISP = has(hwcap_LDISP)
|
|
||||||
S390X.HasEIMM = has(hwcap_EIMM)
|
|
||||||
S390X.HasETF3EH = has(hwcap_ETF3EH)
|
|
||||||
S390X.HasDFP = has(hwcap_DFP)
|
|
||||||
S390X.HasMSA = has(hwcap_MSA)
|
|
||||||
S390X.HasVX = has(hwcap_VX)
|
|
||||||
if S390X.HasVX {
|
|
||||||
S390X.HasVXE = has(hwcap_VXE)
|
|
||||||
}
|
|
||||||
|
|
||||||
// We need implementations of stfle, km and so on
|
|
||||||
// to detect cryptographic features.
|
|
||||||
if !haveAsmFunctions() {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// optional cryptographic functions
|
|
||||||
if S390X.HasMSA {
|
|
||||||
aes := []function{aes128, aes192, aes256}
|
|
||||||
|
|
||||||
// cipher message
|
|
||||||
km, kmc := kmQuery(), kmcQuery()
|
|
||||||
S390X.HasAES = km.Has(aes...)
|
|
||||||
S390X.HasAESCBC = kmc.Has(aes...)
|
|
||||||
if S390X.HasSTFLE {
|
|
||||||
facilities := stfle()
|
|
||||||
if facilities.Has(msa4) {
|
|
||||||
kmctr := kmctrQuery()
|
|
||||||
S390X.HasAESCTR = kmctr.Has(aes...)
|
|
||||||
}
|
|
||||||
if facilities.Has(msa8) {
|
|
||||||
kma := kmaQuery()
|
|
||||||
S390X.HasAESGCM = kma.Has(aes...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// compute message digest
|
|
||||||
kimd := kimdQuery() // intermediate (no padding)
|
|
||||||
klmd := klmdQuery() // last (padding)
|
|
||||||
S390X.HasSHA1 = kimd.Has(sha1) && klmd.Has(sha1)
|
|
||||||
S390X.HasSHA256 = kimd.Has(sha256) && klmd.Has(sha256)
|
|
||||||
S390X.HasSHA512 = kimd.Has(sha512) && klmd.Has(sha512)
|
|
||||||
S390X.HasGHASH = kimd.Has(ghash) // KLMD-GHASH does not exist
|
|
||||||
sha3 := []function{
|
|
||||||
sha3_224, sha3_256, sha3_384, sha3_512,
|
|
||||||
shake128, shake256,
|
|
||||||
}
|
|
||||||
S390X.HasSHA3 = kimd.Has(sha3...) && klmd.Has(sha3...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -201,4 +38,3 @@ func initS390Xbase() {
|
||||||
S390X.HasVXE = has(hwcap_VXE)
|
S390X.HasVXE = has(hwcap_VXE)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,62 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Copyright 2019 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"
|
|
||||||
|
|
||||||
// func stfle() facilityList
|
|
||||||
TEXT ·stfle(SB), NOSPLIT|NOFRAME, $0-32
|
|
||||||
MOVD $ret+0(FP), R1
|
|
||||||
MOVD $3, R0 // last doubleword index to store
|
|
||||||
XC $32, (R1), (R1) // clear 4 doublewords (32 bytes)
|
|
||||||
WORD $0xb2b01000 // store facility list extended (STFLE)
|
|
||||||
RET
|
|
||||||
|
|
||||||
// func kmQuery() queryResult
|
|
||||||
TEXT ·kmQuery(SB), NOSPLIT|NOFRAME, $0-16
|
|
||||||
MOVD $0, R0 // set function code to 0 (KM-Query)
|
|
||||||
MOVD $ret+0(FP), R1 // address of 16-byte return value
|
|
||||||
WORD $0xB92E0024 // cipher message (KM)
|
|
||||||
RET
|
|
||||||
|
|
||||||
// func kmcQuery() queryResult
|
|
||||||
TEXT ·kmcQuery(SB), NOSPLIT|NOFRAME, $0-16
|
|
||||||
MOVD $0, R0 // set function code to 0 (KMC-Query)
|
|
||||||
MOVD $ret+0(FP), R1 // address of 16-byte return value
|
|
||||||
WORD $0xB92F0024 // cipher message with chaining (KMC)
|
|
||||||
RET
|
|
||||||
|
|
||||||
// func kmctrQuery() queryResult
|
|
||||||
TEXT ·kmctrQuery(SB), NOSPLIT|NOFRAME, $0-16
|
|
||||||
MOVD $0, R0 // set function code to 0 (KMCTR-Query)
|
|
||||||
MOVD $ret+0(FP), R1 // address of 16-byte return value
|
|
||||||
WORD $0xB92D4024 // cipher message with counter (KMCTR)
|
|
||||||
RET
|
|
||||||
|
|
||||||
// func kmaQuery() queryResult
|
|
||||||
TEXT ·kmaQuery(SB), NOSPLIT|NOFRAME, $0-16
|
|
||||||
MOVD $0, R0 // set function code to 0 (KMA-Query)
|
|
||||||
MOVD $ret+0(FP), R1 // address of 16-byte return value
|
|
||||||
WORD $0xb9296024 // cipher message with authentication (KMA)
|
|
||||||
RET
|
|
||||||
|
|
||||||
// func kimdQuery() queryResult
|
|
||||||
TEXT ·kimdQuery(SB), NOSPLIT|NOFRAME, $0-16
|
|
||||||
MOVD $0, R0 // set function code to 0 (KIMD-Query)
|
|
||||||
MOVD $ret+0(FP), R1 // address of 16-byte return value
|
|
||||||
WORD $0xB93E0024 // compute intermediate message digest (KIMD)
|
|
||||||
RET
|
|
||||||
|
|
||||||
// func klmdQuery() queryResult
|
|
||||||
TEXT ·klmdQuery(SB), NOSPLIT|NOFRAME, $0-16
|
|
||||||
MOVD $0, R0 // set function code to 0 (KLMD-Query)
|
|
||||||
MOVD $ret+0(FP), R1 // address of 16-byte return value
|
|
||||||
WORD $0xB93F0024 // compute last message digest (KLMD)
|
|
||||||
RET
|
|
||||||
=======
|
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -114,4 +55,3 @@ TEXT ·klmdQuery(SB), NOSPLIT|NOFRAME, $0-16
|
||||||
MOVD $ret+0(FP), R1 // address of 16-byte return value
|
MOVD $ret+0(FP), R1 // address of 16-byte return value
|
||||||
WORD $0xB93F0024 // compute last message digest (KLMD)
|
WORD $0xB93F0024 // compute last message digest (KLMD)
|
||||||
RET
|
RET
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,64 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// 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 386 amd64 amd64p32
|
|
||||||
|
|
||||||
package cpu
|
|
||||||
|
|
||||||
const cacheLineSize = 64
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
Initialized = true
|
|
||||||
|
|
||||||
maxID, _, _, _ := cpuid(0, 0)
|
|
||||||
|
|
||||||
if maxID < 1 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
_, _, ecx1, edx1 := cpuid(1, 0)
|
|
||||||
X86.HasSSE2 = isSet(26, edx1)
|
|
||||||
|
|
||||||
X86.HasSSE3 = isSet(0, ecx1)
|
|
||||||
X86.HasPCLMULQDQ = isSet(1, ecx1)
|
|
||||||
X86.HasSSSE3 = isSet(9, ecx1)
|
|
||||||
X86.HasFMA = isSet(12, ecx1)
|
|
||||||
X86.HasSSE41 = isSet(19, ecx1)
|
|
||||||
X86.HasSSE42 = isSet(20, ecx1)
|
|
||||||
X86.HasPOPCNT = isSet(23, ecx1)
|
|
||||||
X86.HasAES = isSet(25, ecx1)
|
|
||||||
X86.HasOSXSAVE = isSet(27, ecx1)
|
|
||||||
X86.HasRDRAND = isSet(30, ecx1)
|
|
||||||
|
|
||||||
osSupportsAVX := false
|
|
||||||
// For XGETBV, OSXSAVE bit is required and sufficient.
|
|
||||||
if X86.HasOSXSAVE {
|
|
||||||
eax, _ := xgetbv()
|
|
||||||
// Check if XMM and YMM registers have OS support.
|
|
||||||
osSupportsAVX = isSet(1, eax) && isSet(2, eax)
|
|
||||||
}
|
|
||||||
|
|
||||||
X86.HasAVX = isSet(28, ecx1) && osSupportsAVX
|
|
||||||
|
|
||||||
if maxID < 7 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
_, ebx7, _, _ := cpuid(7, 0)
|
|
||||||
X86.HasBMI1 = isSet(3, ebx7)
|
|
||||||
X86.HasAVX2 = isSet(5, ebx7) && osSupportsAVX
|
|
||||||
X86.HasBMI2 = isSet(8, ebx7)
|
|
||||||
X86.HasERMS = isSet(9, ebx7)
|
|
||||||
X86.HasRDSEED = isSet(18, ebx7)
|
|
||||||
X86.HasADX = isSet(19, ebx7)
|
|
||||||
}
|
|
||||||
|
|
||||||
func isSet(bitpos uint, value uint32) bool {
|
|
||||||
return value&(1<<bitpos) != 0
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -195,4 +134,3 @@ func archInit() {
|
||||||
func isSet(bitpos uint, value uint32) bool {
|
func isSet(bitpos uint, value uint32) bool {
|
||||||
return value&(1<<bitpos) != 0
|
return value&(1<<bitpos) != 0
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,32 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// 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 386 amd64 amd64p32
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
// func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32)
|
|
||||||
TEXT ·cpuid(SB), NOSPLIT, $0-24
|
|
||||||
MOVL eaxArg+0(FP), AX
|
|
||||||
MOVL ecxArg+4(FP), CX
|
|
||||||
CPUID
|
|
||||||
MOVL AX, eax+8(FP)
|
|
||||||
MOVL BX, ebx+12(FP)
|
|
||||||
MOVL CX, ecx+16(FP)
|
|
||||||
MOVL DX, edx+20(FP)
|
|
||||||
RET
|
|
||||||
|
|
||||||
// func xgetbv() (eax, edx uint32)
|
|
||||||
TEXT ·xgetbv(SB),NOSPLIT,$0-8
|
|
||||||
MOVL $0, CX
|
|
||||||
XGETBV
|
|
||||||
MOVL AX, eax+0(FP)
|
|
||||||
MOVL DX, edx+4(FP)
|
|
||||||
RET
|
|
||||||
=======
|
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -54,4 +25,3 @@ TEXT ·xgetbv(SB),NOSPLIT,$0-8
|
||||||
MOVL AX, eax+0(FP)
|
MOVL AX, eax+0(FP)
|
||||||
MOVL DX, edx+4(FP)
|
MOVL DX, edx+4(FP)
|
||||||
RET
|
RET
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,41 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Copyright 2019 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.
|
|
||||||
|
|
||||||
// Minimal copy of x/sys/unix so the cpu package can make a
|
|
||||||
// system call on AIX without depending on x/sys/unix.
|
|
||||||
// (See golang.org/issue/32102)
|
|
||||||
|
|
||||||
// +build aix,ppc64
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
package cpu
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
//go:cgo_import_dynamic libc_getsystemcfg getsystemcfg "libc.a/shr_64.o"
|
|
||||||
|
|
||||||
//go:linkname libc_getsystemcfg libc_getsystemcfg
|
|
||||||
|
|
||||||
type syscallFunc uintptr
|
|
||||||
|
|
||||||
var libc_getsystemcfg syscallFunc
|
|
||||||
|
|
||||||
type errno = syscall.Errno
|
|
||||||
|
|
||||||
// Implemented in runtime/syscall_aix.go.
|
|
||||||
func rawSyscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err errno)
|
|
||||||
func syscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err errno)
|
|
||||||
|
|
||||||
func callgetsystemcfg(label int) (r1 uintptr, e1 errno) {
|
|
||||||
r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_getsystemcfg)), 1, uintptr(label), 0, 0, 0, 0, 0)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -72,4 +34,3 @@ func callgetsystemcfg(label int) (r1 uintptr, e1 errno) {
|
||||||
r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_getsystemcfg)), 1, uintptr(label), 0, 0, 0, 0, 0)
|
r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_getsystemcfg)), 1, uintptr(label), 0, 0, 0, 0, 0)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,2 @@
|
||||||
_obj/
|
_obj/
|
||||||
unix.test
|
unix.test
|
||||||
|
|
|
||||||
|
|
@ -1,86 +1,86 @@
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// CPU affinity functions
|
// CPU affinity functions
|
||||||
|
|
||||||
package unix
|
package unix
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"math/bits"
|
"math/bits"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
const cpuSetSize = _CPU_SETSIZE / _NCPUBITS
|
const cpuSetSize = _CPU_SETSIZE / _NCPUBITS
|
||||||
|
|
||||||
// CPUSet represents a CPU affinity mask.
|
// CPUSet represents a CPU affinity mask.
|
||||||
type CPUSet [cpuSetSize]cpuMask
|
type CPUSet [cpuSetSize]cpuMask
|
||||||
|
|
||||||
func schedAffinity(trap uintptr, pid int, set *CPUSet) error {
|
func schedAffinity(trap uintptr, pid int, set *CPUSet) error {
|
||||||
_, _, e := RawSyscall(trap, uintptr(pid), uintptr(unsafe.Sizeof(*set)), uintptr(unsafe.Pointer(set)))
|
_, _, e := RawSyscall(trap, uintptr(pid), uintptr(unsafe.Sizeof(*set)), uintptr(unsafe.Pointer(set)))
|
||||||
if e != 0 {
|
if e != 0 {
|
||||||
return errnoErr(e)
|
return errnoErr(e)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// SchedGetaffinity gets the CPU affinity mask of the thread specified by pid.
|
// SchedGetaffinity gets the CPU affinity mask of the thread specified by pid.
|
||||||
// If pid is 0 the calling thread is used.
|
// If pid is 0 the calling thread is used.
|
||||||
func SchedGetaffinity(pid int, set *CPUSet) error {
|
func SchedGetaffinity(pid int, set *CPUSet) error {
|
||||||
return schedAffinity(SYS_SCHED_GETAFFINITY, pid, set)
|
return schedAffinity(SYS_SCHED_GETAFFINITY, pid, set)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SchedSetaffinity sets the CPU affinity mask of the thread specified by pid.
|
// SchedSetaffinity sets the CPU affinity mask of the thread specified by pid.
|
||||||
// If pid is 0 the calling thread is used.
|
// If pid is 0 the calling thread is used.
|
||||||
func SchedSetaffinity(pid int, set *CPUSet) error {
|
func SchedSetaffinity(pid int, set *CPUSet) error {
|
||||||
return schedAffinity(SYS_SCHED_SETAFFINITY, pid, set)
|
return schedAffinity(SYS_SCHED_SETAFFINITY, pid, set)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Zero clears the set s, so that it contains no CPUs.
|
// Zero clears the set s, so that it contains no CPUs.
|
||||||
func (s *CPUSet) Zero() {
|
func (s *CPUSet) Zero() {
|
||||||
for i := range s {
|
for i := range s {
|
||||||
s[i] = 0
|
s[i] = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func cpuBitsIndex(cpu int) int {
|
func cpuBitsIndex(cpu int) int {
|
||||||
return cpu / _NCPUBITS
|
return cpu / _NCPUBITS
|
||||||
}
|
}
|
||||||
|
|
||||||
func cpuBitsMask(cpu int) cpuMask {
|
func cpuBitsMask(cpu int) cpuMask {
|
||||||
return cpuMask(1 << (uint(cpu) % _NCPUBITS))
|
return cpuMask(1 << (uint(cpu) % _NCPUBITS))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set adds cpu to the set s.
|
// Set adds cpu to the set s.
|
||||||
func (s *CPUSet) Set(cpu int) {
|
func (s *CPUSet) Set(cpu int) {
|
||||||
i := cpuBitsIndex(cpu)
|
i := cpuBitsIndex(cpu)
|
||||||
if i < len(s) {
|
if i < len(s) {
|
||||||
s[i] |= cpuBitsMask(cpu)
|
s[i] |= cpuBitsMask(cpu)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear removes cpu from the set s.
|
// Clear removes cpu from the set s.
|
||||||
func (s *CPUSet) Clear(cpu int) {
|
func (s *CPUSet) Clear(cpu int) {
|
||||||
i := cpuBitsIndex(cpu)
|
i := cpuBitsIndex(cpu)
|
||||||
if i < len(s) {
|
if i < len(s) {
|
||||||
s[i] &^= cpuBitsMask(cpu)
|
s[i] &^= cpuBitsMask(cpu)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsSet reports whether cpu is in the set s.
|
// IsSet reports whether cpu is in the set s.
|
||||||
func (s *CPUSet) IsSet(cpu int) bool {
|
func (s *CPUSet) IsSet(cpu int) bool {
|
||||||
i := cpuBitsIndex(cpu)
|
i := cpuBitsIndex(cpu)
|
||||||
if i < len(s) {
|
if i < len(s) {
|
||||||
return s[i]&cpuBitsMask(cpu) != 0
|
return s[i]&cpuBitsMask(cpu) != 0
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// Count returns the number of CPUs in the set s.
|
// Count returns the number of CPUs in the set s.
|
||||||
func (s *CPUSet) Count() int {
|
func (s *CPUSet) Count() int {
|
||||||
c := 0
|
c := 0
|
||||||
for _, b := range s {
|
for _, b := range s {
|
||||||
c += bits.OnesCount64(uint64(b))
|
c += bits.OnesCount64(uint64(b))
|
||||||
}
|
}
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,29 +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 !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for ARM64, 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,49 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// 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 ·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 ·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
|
|
||||||
=======
|
|
||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
// Copyright 2014 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -88,4 +42,3 @@ TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48
|
||||||
MOVD R3, r1+32(FP)
|
MOVD R3, r1+32(FP)
|
||||||
MOVD R4, r2+40(FP)
|
MOVD R4, r2+40(FP)
|
||||||
RET
|
RET
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
// Copyright 2019 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 ARM64, NetBSD
|
|
||||||
//
|
|
||||||
|
|
||||||
// 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 2019 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 arm64, 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,107 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import "unsafe"
|
|
||||||
|
|
||||||
// readInt returns the size-bytes unsigned integer in native byte order at offset off.
|
|
||||||
func readInt(b []byte, off, size uintptr) (u uint64, ok bool) {
|
|
||||||
if len(b) < int(off+size) {
|
|
||||||
return 0, false
|
|
||||||
}
|
|
||||||
if isBigEndian {
|
|
||||||
return readIntBE(b[off:], size), true
|
|
||||||
}
|
|
||||||
return readIntLE(b[off:], size), true
|
|
||||||
}
|
|
||||||
|
|
||||||
func readIntBE(b []byte, size uintptr) uint64 {
|
|
||||||
switch size {
|
|
||||||
case 1:
|
|
||||||
return uint64(b[0])
|
|
||||||
case 2:
|
|
||||||
_ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
|
|
||||||
return uint64(b[1]) | uint64(b[0])<<8
|
|
||||||
case 4:
|
|
||||||
_ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
|
|
||||||
return uint64(b[3]) | uint64(b[2])<<8 | uint64(b[1])<<16 | uint64(b[0])<<24
|
|
||||||
case 8:
|
|
||||||
_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
|
|
||||||
return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 |
|
|
||||||
uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56
|
|
||||||
default:
|
|
||||||
panic("syscall: readInt with unsupported size")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func readIntLE(b []byte, size uintptr) uint64 {
|
|
||||||
switch size {
|
|
||||||
case 1:
|
|
||||||
return uint64(b[0])
|
|
||||||
case 2:
|
|
||||||
_ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
|
|
||||||
return uint64(b[0]) | uint64(b[1])<<8
|
|
||||||
case 4:
|
|
||||||
_ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
|
|
||||||
return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24
|
|
||||||
case 8:
|
|
||||||
_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
|
|
||||||
return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |
|
|
||||||
uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
|
|
||||||
default:
|
|
||||||
panic("syscall: readInt with unsupported size")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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) {
|
|
||||||
origlen := len(buf)
|
|
||||||
count = 0
|
|
||||||
for max != 0 && len(buf) > 0 {
|
|
||||||
reclen, ok := direntReclen(buf)
|
|
||||||
if !ok || reclen > uint64(len(buf)) {
|
|
||||||
return origlen, count, names
|
|
||||||
}
|
|
||||||
rec := buf[:reclen]
|
|
||||||
buf = buf[reclen:]
|
|
||||||
ino, ok := direntIno(rec)
|
|
||||||
if !ok {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if ino == 0 { // File absent in directory.
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
const namoff = uint64(unsafe.Offsetof(Dirent{}.Name))
|
|
||||||
namlen, ok := direntNamlen(rec)
|
|
||||||
if !ok || namoff+namlen > uint64(len(rec)) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
name := rec[namoff : namoff+namlen]
|
|
||||||
for i, c := range name {
|
|
||||||
if c == 0 {
|
|
||||||
name = name[:i]
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Check for useless names before allocating a string.
|
|
||||||
if string(name) == "." || string(name) == ".." {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
max--
|
|
||||||
count++
|
|
||||||
names = append(names, string(name))
|
|
||||||
}
|
|
||||||
return origlen - len(buf), count, names
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -205,4 +101,3 @@ func ParseDirent(buf []byte, max int, names []string) (consumed int, count int,
|
||||||
}
|
}
|
||||||
return origlen - len(buf), count, names
|
return origlen - len(buf), count, names
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// 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 riscv64
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
const isBigEndian = false
|
|
||||||
=======
|
|
||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -19,4 +8,3 @@ const isBigEndian = false
|
||||||
package unix
|
package unix
|
||||||
|
|
||||||
const isBigEndian = false
|
const isBigEndian = false
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Copyright 2019 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 "unsafe"
|
|
||||||
|
|
||||||
// FcntlInt performs a fcntl syscall on fd with the provided command and argument.
|
|
||||||
func FcntlInt(fd uintptr, cmd, arg int) (int, error) {
|
|
||||||
return fcntl(int(fd), cmd, arg)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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 {
|
|
||||||
_, err := fcntl(int(fd), cmd, int(uintptr(unsafe.Pointer(lk))))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -42,4 +22,3 @@ func FcntlFstore(fd uintptr, cmd int, fstore *Fstore_t) error {
|
||||||
_, err := fcntl(int(fd), cmd, int(uintptr(unsafe.Pointer(fstore))))
|
_, err := fcntl(int(fd), cmd, int(uintptr(unsafe.Pointer(fstore))))
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,70 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"runtime"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
// 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))
|
|
||||||
}
|
|
||||||
|
|
||||||
// IoctlSetWinsize performs an ioctl on fd with a *Winsize argument.
|
|
||||||
//
|
|
||||||
// To change fd's window size, the req argument should be TIOCSWINSZ.
|
|
||||||
func IoctlSetWinsize(fd int, req uint, value *Winsize) error {
|
|
||||||
// TODO: if we get the chance, remove the req parameter and
|
|
||||||
// hardcode TIOCSWINSZ.
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
|
||||||
runtime.KeepAlive(value)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// IoctlSetTermios performs an ioctl on fd with a *Termios.
|
|
||||||
//
|
|
||||||
// The req value will usually be TCSETA or TIOCSETA.
|
|
||||||
func IoctlSetTermios(fd int, req uint, value *Termios) error {
|
|
||||||
// TODO: if we get the chance, remove the req parameter.
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
|
||||||
runtime.KeepAlive(value)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// IoctlGetInt performs an ioctl operation which gets an integer value
|
|
||||||
// from fd, using the specified request number.
|
|
||||||
//
|
|
||||||
// A few ioctl requests use the return value as an output parameter;
|
|
||||||
// for those, IoctlRetInt should be used instead of this function.
|
|
||||||
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
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -140,4 +73,3 @@ func IoctlGetTermios(fd int, req uint) (*Termios, error) {
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
||||||
return &value, err
|
return &value, err
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,163 +1,163 @@
|
||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package unix
|
package unix
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Pledge implements the pledge syscall.
|
// Pledge implements the pledge syscall.
|
||||||
//
|
//
|
||||||
// The pledge syscall does not accept execpromises on OpenBSD releases
|
// The pledge syscall does not accept execpromises on OpenBSD releases
|
||||||
// before 6.3.
|
// before 6.3.
|
||||||
//
|
//
|
||||||
// execpromises must be empty when Pledge is called on OpenBSD
|
// execpromises must be empty when Pledge is called on OpenBSD
|
||||||
// releases predating 6.3, otherwise an error will be returned.
|
// releases predating 6.3, otherwise an error will be returned.
|
||||||
//
|
//
|
||||||
// For more information see pledge(2).
|
// For more information see pledge(2).
|
||||||
func Pledge(promises, execpromises string) error {
|
func Pledge(promises, execpromises string) error {
|
||||||
maj, min, err := majmin()
|
maj, min, err := majmin()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = pledgeAvailable(maj, min, execpromises)
|
err = pledgeAvailable(maj, min, execpromises)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
pptr, err := syscall.BytePtrFromString(promises)
|
pptr, err := syscall.BytePtrFromString(promises)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// This variable will hold either a nil unsafe.Pointer or
|
// This variable will hold either a nil unsafe.Pointer or
|
||||||
// an unsafe.Pointer to a string (execpromises).
|
// an unsafe.Pointer to a string (execpromises).
|
||||||
var expr unsafe.Pointer
|
var expr unsafe.Pointer
|
||||||
|
|
||||||
// If we're running on OpenBSD > 6.2, pass execpromises to the syscall.
|
// If we're running on OpenBSD > 6.2, pass execpromises to the syscall.
|
||||||
if maj > 6 || (maj == 6 && min > 2) {
|
if maj > 6 || (maj == 6 && min > 2) {
|
||||||
exptr, err := syscall.BytePtrFromString(execpromises)
|
exptr, err := syscall.BytePtrFromString(execpromises)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
expr = unsafe.Pointer(exptr)
|
expr = unsafe.Pointer(exptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)), uintptr(expr), 0)
|
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)), uintptr(expr), 0)
|
||||||
if e != 0 {
|
if e != 0 {
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// PledgePromises implements the pledge syscall.
|
// PledgePromises implements the pledge syscall.
|
||||||
//
|
//
|
||||||
// This changes the promises and leaves the execpromises untouched.
|
// This changes the promises and leaves the execpromises untouched.
|
||||||
//
|
//
|
||||||
// For more information see pledge(2).
|
// For more information see pledge(2).
|
||||||
func PledgePromises(promises string) error {
|
func PledgePromises(promises string) error {
|
||||||
maj, min, err := majmin()
|
maj, min, err := majmin()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = pledgeAvailable(maj, min, "")
|
err = pledgeAvailable(maj, min, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// This variable holds the execpromises and is always nil.
|
// This variable holds the execpromises and is always nil.
|
||||||
var expr unsafe.Pointer
|
var expr unsafe.Pointer
|
||||||
|
|
||||||
pptr, err := syscall.BytePtrFromString(promises)
|
pptr, err := syscall.BytePtrFromString(promises)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)), uintptr(expr), 0)
|
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)), uintptr(expr), 0)
|
||||||
if e != 0 {
|
if e != 0 {
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// PledgeExecpromises implements the pledge syscall.
|
// PledgeExecpromises implements the pledge syscall.
|
||||||
//
|
//
|
||||||
// This changes the execpromises and leaves the promises untouched.
|
// This changes the execpromises and leaves the promises untouched.
|
||||||
//
|
//
|
||||||
// For more information see pledge(2).
|
// For more information see pledge(2).
|
||||||
func PledgeExecpromises(execpromises string) error {
|
func PledgeExecpromises(execpromises string) error {
|
||||||
maj, min, err := majmin()
|
maj, min, err := majmin()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = pledgeAvailable(maj, min, execpromises)
|
err = pledgeAvailable(maj, min, execpromises)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// This variable holds the promises and is always nil.
|
// This variable holds the promises and is always nil.
|
||||||
var pptr unsafe.Pointer
|
var pptr unsafe.Pointer
|
||||||
|
|
||||||
exptr, err := syscall.BytePtrFromString(execpromises)
|
exptr, err := syscall.BytePtrFromString(execpromises)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(pptr), uintptr(unsafe.Pointer(exptr)), 0)
|
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(pptr), uintptr(unsafe.Pointer(exptr)), 0)
|
||||||
if e != 0 {
|
if e != 0 {
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// majmin returns major and minor version number for an OpenBSD system.
|
// majmin returns major and minor version number for an OpenBSD system.
|
||||||
func majmin() (major int, minor int, err error) {
|
func majmin() (major int, minor int, err error) {
|
||||||
var v Utsname
|
var v Utsname
|
||||||
err = Uname(&v)
|
err = Uname(&v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
major, err = strconv.Atoi(string(v.Release[0]))
|
major, err = strconv.Atoi(string(v.Release[0]))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = errors.New("cannot parse major version number returned by uname")
|
err = errors.New("cannot parse major version number returned by uname")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
minor, err = strconv.Atoi(string(v.Release[2]))
|
minor, err = strconv.Atoi(string(v.Release[2]))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = errors.New("cannot parse minor version number returned by uname")
|
err = errors.New("cannot parse minor version number returned by uname")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// pledgeAvailable checks for availability of the pledge(2) syscall
|
// pledgeAvailable checks for availability of the pledge(2) syscall
|
||||||
// based on the running OpenBSD version.
|
// based on the running OpenBSD version.
|
||||||
func pledgeAvailable(maj, min int, execpromises string) error {
|
func pledgeAvailable(maj, min int, execpromises string) error {
|
||||||
// If OpenBSD <= 5.9, pledge is not available.
|
// If OpenBSD <= 5.9, pledge is not available.
|
||||||
if (maj == 5 && min != 9) || maj < 5 {
|
if (maj == 5 && min != 9) || maj < 5 {
|
||||||
return fmt.Errorf("pledge syscall is not available on OpenBSD %d.%d", maj, min)
|
return fmt.Errorf("pledge syscall is not available on OpenBSD %d.%d", maj, min)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If OpenBSD <= 6.2 and execpromises is not empty,
|
// If OpenBSD <= 6.2 and execpromises is not empty,
|
||||||
// return an error - execpromises is not available before 6.3
|
// return an error - execpromises is not available before 6.3
|
||||||
if (maj < 6 || (maj == 6 && min <= 2)) && execpromises != "" {
|
if (maj < 6 || (maj == 6 && min <= 2)) && execpromises != "" {
|
||||||
return fmt.Errorf("cannot use execpromises on OpenBSD %d.%d", maj, min)
|
return fmt.Errorf("cannot use execpromises on OpenBSD %d.%d", maj, min)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build aix dragonfly freebsd linux netbsd openbsd
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
// ReadDirent reads directory entries from fd and writes them into buf.
|
|
||||||
func ReadDirent(fd int, buf []byte) (n int, err error) {
|
|
||||||
return Getdents(fd, buf)
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -25,4 +11,3 @@ package unix
|
||||||
func ReadDirent(fd int, buf []byte) (n int, err error) {
|
func ReadDirent(fd int, buf []byte) (n int, err error) {
|
||||||
return Getdents(fd, buf)
|
return Getdents(fd, buf)
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,24 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Copyright 2019 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
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import "unsafe"
|
|
||||||
|
|
||||||
// ReadDirent reads directory entries from fd and writes them into buf.
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -39,4 +18,3 @@ func ReadDirent(fd int, buf []byte) (n int, err error) {
|
||||||
var base = (*uintptr)(unsafe.Pointer(new(uint64)))
|
var base = (*uintptr)(unsafe.Pointer(new(uint64)))
|
||||||
return Getdirentries(fd, buf, base)
|
return Getdirentries(fd, buf, base)
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,58 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build aix darwin dragonfly freebsd linux 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.
|
|
||||||
var _zero uintptr
|
|
||||||
=======
|
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -148,4 +93,3 @@ func BytePtrToString(p *byte) string {
|
||||||
|
|
||||||
// Single-word zero for use when we need a valid pointer to 0 bytes.
|
// Single-word zero for use when we need a valid pointer to 0 bytes.
|
||||||
var _zero uintptr
|
var _zero uintptr
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,541 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build aix
|
|
||||||
|
|
||||||
// Aix system calls.
|
|
||||||
// This file is compiled as ordinary Go code,
|
|
||||||
// but it is also input to mksyscall,
|
|
||||||
// which parses the //sys lines and generates system call stubs.
|
|
||||||
// Note that sometimes we use a lowercase //sys name and
|
|
||||||
// wrap it in our own nicer implementation.
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import "unsafe"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Wrapped
|
|
||||||
*/
|
|
||||||
|
|
||||||
//sys utimes(path string, times *[2]Timeval) (err error)
|
|
||||||
func Utimes(path string, tv []Timeval) error {
|
|
||||||
if len(tv) != 2 {
|
|
||||||
return EINVAL
|
|
||||||
}
|
|
||||||
return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys utimensat(dirfd int, path string, times *[2]Timespec, flag int) (err error)
|
|
||||||
func UtimesNano(path string, ts []Timespec) error {
|
|
||||||
if len(ts) != 2 {
|
|
||||||
return EINVAL
|
|
||||||
}
|
|
||||||
return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error {
|
|
||||||
if ts == nil {
|
|
||||||
return utimensat(dirfd, path, nil, flags)
|
|
||||||
}
|
|
||||||
if len(ts) != 2 {
|
|
||||||
return EINVAL
|
|
||||||
}
|
|
||||||
return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) {
|
|
||||||
if sa.Port < 0 || sa.Port > 0xFFFF {
|
|
||||||
return nil, 0, EINVAL
|
|
||||||
}
|
|
||||||
sa.raw.Family = AF_INET
|
|
||||||
p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
|
|
||||||
p[0] = byte(sa.Port >> 8)
|
|
||||||
p[1] = byte(sa.Port)
|
|
||||||
for i := 0; i < len(sa.Addr); i++ {
|
|
||||||
sa.raw.Addr[i] = sa.Addr[i]
|
|
||||||
}
|
|
||||||
return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) {
|
|
||||||
if sa.Port < 0 || sa.Port > 0xFFFF {
|
|
||||||
return nil, 0, EINVAL
|
|
||||||
}
|
|
||||||
sa.raw.Family = AF_INET6
|
|
||||||
p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
|
|
||||||
p[0] = byte(sa.Port >> 8)
|
|
||||||
p[1] = byte(sa.Port)
|
|
||||||
sa.raw.Scope_id = sa.ZoneId
|
|
||||||
for i := 0; i < len(sa.Addr); i++ {
|
|
||||||
sa.raw.Addr[i] = sa.Addr[i]
|
|
||||||
}
|
|
||||||
return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) {
|
|
||||||
name := sa.Name
|
|
||||||
n := len(name)
|
|
||||||
if n > len(sa.raw.Path) {
|
|
||||||
return nil, 0, EINVAL
|
|
||||||
}
|
|
||||||
if n == len(sa.raw.Path) && name[0] != '@' {
|
|
||||||
return nil, 0, EINVAL
|
|
||||||
}
|
|
||||||
sa.raw.Family = AF_UNIX
|
|
||||||
for i := 0; i < n; i++ {
|
|
||||||
sa.raw.Path[i] = uint8(name[i])
|
|
||||||
}
|
|
||||||
// length is family (uint16), name, NUL.
|
|
||||||
sl := _Socklen(2)
|
|
||||||
if n > 0 {
|
|
||||||
sl += _Socklen(n) + 1
|
|
||||||
}
|
|
||||||
if sa.raw.Path[0] == '@' {
|
|
||||||
sa.raw.Path[0] = 0
|
|
||||||
// Don't count trailing NUL for abstract address.
|
|
||||||
sl--
|
|
||||||
}
|
|
||||||
|
|
||||||
return unsafe.Pointer(&sa.raw), sl, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func Getsockname(fd int) (sa Sockaddr, err error) {
|
|
||||||
var rsa RawSockaddrAny
|
|
||||||
var len _Socklen = SizeofSockaddrAny
|
|
||||||
if err = getsockname(fd, &rsa, &len); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return anyToSockaddr(fd, &rsa)
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys getcwd(buf []byte) (err error)
|
|
||||||
|
|
||||||
const ImplementsGetwd = true
|
|
||||||
|
|
||||||
func Getwd() (ret string, err error) {
|
|
||||||
for len := uint64(4096); ; len *= 2 {
|
|
||||||
b := make([]byte, len)
|
|
||||||
err := getcwd(b)
|
|
||||||
if err == nil {
|
|
||||||
i := 0
|
|
||||||
for b[i] != 0 {
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
return string(b[0:i]), nil
|
|
||||||
}
|
|
||||||
if err != ERANGE {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func Getcwd(buf []byte) (n int, err error) {
|
|
||||||
err = getcwd(buf)
|
|
||||||
if err == nil {
|
|
||||||
i := 0
|
|
||||||
for buf[i] != 0 {
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
n = i + 1
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Getgroups() (gids []int, err error) {
|
|
||||||
n, err := getgroups(0, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if n == 0 {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sanity check group count. Max is 16 on BSD.
|
|
||||||
if n < 0 || n > 1000 {
|
|
||||||
return nil, EINVAL
|
|
||||||
}
|
|
||||||
|
|
||||||
a := make([]_Gid_t, n)
|
|
||||||
n, err = getgroups(n, &a[0])
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
gids = make([]int, n)
|
|
||||||
for i, v := range a[0:n] {
|
|
||||||
gids[i] = int(v)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Setgroups(gids []int) (err error) {
|
|
||||||
if len(gids) == 0 {
|
|
||||||
return setgroups(0, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
a := make([]_Gid_t, len(gids))
|
|
||||||
for i, v := range gids {
|
|
||||||
a[i] = _Gid_t(v)
|
|
||||||
}
|
|
||||||
return setgroups(len(a), &a[0])
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Socket
|
|
||||||
*/
|
|
||||||
|
|
||||||
//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
|
|
||||||
|
|
||||||
func Accept(fd int) (nfd int, sa Sockaddr, err error) {
|
|
||||||
var rsa RawSockaddrAny
|
|
||||||
var len _Socklen = SizeofSockaddrAny
|
|
||||||
nfd, err = accept(fd, &rsa, &len)
|
|
||||||
if nfd == -1 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
sa, err = anyToSockaddr(fd, &rsa)
|
|
||||||
if err != nil {
|
|
||||||
Close(nfd)
|
|
||||||
nfd = 0
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
|
|
||||||
// Recvmsg not implemented on AIX
|
|
||||||
sa := new(SockaddrUnix)
|
|
||||||
return -1, -1, -1, sa, ENOSYS
|
|
||||||
}
|
|
||||||
|
|
||||||
func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
|
|
||||||
_, err = SendmsgN(fd, p, oob, to, flags)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
|
|
||||||
// SendmsgN not implemented on AIX
|
|
||||||
return -1, ENOSYS
|
|
||||||
}
|
|
||||||
|
|
||||||
func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
|
|
||||||
switch rsa.Addr.Family {
|
|
||||||
|
|
||||||
case AF_UNIX:
|
|
||||||
pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
|
|
||||||
sa := new(SockaddrUnix)
|
|
||||||
|
|
||||||
// Some versions of AIX have a bug in getsockname (see IV78655).
|
|
||||||
// We can't rely on sa.Len being set correctly.
|
|
||||||
n := SizeofSockaddrUnix - 3 // subtract leading Family, Len, terminating NUL.
|
|
||||||
for i := 0; i < n; i++ {
|
|
||||||
if pp.Path[i] == 0 {
|
|
||||||
n = i
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
|
|
||||||
sa.Name = string(bytes)
|
|
||||||
return sa, nil
|
|
||||||
|
|
||||||
case AF_INET:
|
|
||||||
pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
|
|
||||||
sa := new(SockaddrInet4)
|
|
||||||
p := (*[2]byte)(unsafe.Pointer(&pp.Port))
|
|
||||||
sa.Port = int(p[0])<<8 + int(p[1])
|
|
||||||
for i := 0; i < len(sa.Addr); i++ {
|
|
||||||
sa.Addr[i] = pp.Addr[i]
|
|
||||||
}
|
|
||||||
return sa, nil
|
|
||||||
|
|
||||||
case AF_INET6:
|
|
||||||
pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
|
|
||||||
sa := new(SockaddrInet6)
|
|
||||||
p := (*[2]byte)(unsafe.Pointer(&pp.Port))
|
|
||||||
sa.Port = int(p[0])<<8 + int(p[1])
|
|
||||||
sa.ZoneId = pp.Scope_id
|
|
||||||
for i := 0; i < len(sa.Addr); i++ {
|
|
||||||
sa.Addr[i] = pp.Addr[i]
|
|
||||||
}
|
|
||||||
return sa, nil
|
|
||||||
}
|
|
||||||
return nil, EAFNOSUPPORT
|
|
||||||
}
|
|
||||||
|
|
||||||
func Gettimeofday(tv *Timeval) (err error) {
|
|
||||||
err = gettimeofday(tv, nil)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
|
|
||||||
if raceenabled {
|
|
||||||
raceReleaseMerge(unsafe.Pointer(&ioSync))
|
|
||||||
}
|
|
||||||
return sendfile(outfd, infd, offset, count)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
|
|
||||||
return -1, ENOSYS
|
|
||||||
}
|
|
||||||
|
|
||||||
func direntIno(buf []byte) (uint64, bool) {
|
|
||||||
return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))
|
|
||||||
}
|
|
||||||
|
|
||||||
func direntReclen(buf []byte) (uint64, bool) {
|
|
||||||
return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
|
|
||||||
}
|
|
||||||
|
|
||||||
func direntNamlen(buf []byte) (uint64, bool) {
|
|
||||||
reclen, ok := direntReclen(buf)
|
|
||||||
if !ok {
|
|
||||||
return 0, false
|
|
||||||
}
|
|
||||||
return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys getdirent(fd int, buf []byte) (n int, err error)
|
|
||||||
func Getdents(fd int, buf []byte) (n int, err error) {
|
|
||||||
return getdirent(fd, buf)
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys wait4(pid Pid_t, status *_C_int, options int, rusage *Rusage) (wpid Pid_t, err error)
|
|
||||||
func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
|
|
||||||
var status _C_int
|
|
||||||
var r Pid_t
|
|
||||||
err = ERESTART
|
|
||||||
// AIX wait4 may return with ERESTART errno, while the processus is still
|
|
||||||
// active.
|
|
||||||
for err == ERESTART {
|
|
||||||
r, err = wait4(Pid_t(pid), &status, options, rusage)
|
|
||||||
}
|
|
||||||
wpid = int(r)
|
|
||||||
if wstatus != nil {
|
|
||||||
*wstatus = WaitStatus(status)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Wait
|
|
||||||
*/
|
|
||||||
|
|
||||||
type WaitStatus uint32
|
|
||||||
|
|
||||||
func (w WaitStatus) Stopped() bool { return w&0x40 != 0 }
|
|
||||||
func (w WaitStatus) StopSignal() Signal {
|
|
||||||
if !w.Stopped() {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
return Signal(w>>8) & 0xFF
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w WaitStatus) Exited() bool { return w&0xFF == 0 }
|
|
||||||
func (w WaitStatus) ExitStatus() int {
|
|
||||||
if !w.Exited() {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
return int((w >> 8) & 0xFF)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w WaitStatus) Signaled() bool { return w&0x40 == 0 && w&0xFF != 0 }
|
|
||||||
func (w WaitStatus) Signal() Signal {
|
|
||||||
if !w.Signaled() {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
return Signal(w>>16) & 0xFF
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w WaitStatus) Continued() bool { return w&0x01000000 != 0 }
|
|
||||||
|
|
||||||
func (w WaitStatus) CoreDump() bool { return w&0x80 == 0x80 }
|
|
||||||
|
|
||||||
func (w WaitStatus) TrapCause() int { return -1 }
|
|
||||||
|
|
||||||
//sys ioctl(fd int, req uint, arg uintptr) (err error)
|
|
||||||
|
|
||||||
// fcntl must never be called with cmd=F_DUP2FD because it doesn't work on AIX
|
|
||||||
// There is no way to create a custom fcntl and to keep //sys fcntl easily,
|
|
||||||
// Therefore, the programmer must call dup2 instead of fcntl in this case.
|
|
||||||
|
|
||||||
// FcntlInt performs a fcntl syscall on fd with the provided command and argument.
|
|
||||||
//sys FcntlInt(fd uintptr, cmd int, arg int) (r int,err error) = fcntl
|
|
||||||
|
|
||||||
// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command.
|
|
||||||
//sys FcntlFlock(fd uintptr, cmd int, lk *Flock_t) (err error) = fcntl
|
|
||||||
|
|
||||||
//sys fcntl(fd int, cmd int, arg int) (val int, err error)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Direct access
|
|
||||||
*/
|
|
||||||
|
|
||||||
//sys Acct(path string) (err error)
|
|
||||||
//sys Chdir(path string) (err error)
|
|
||||||
//sys Chroot(path string) (err error)
|
|
||||||
//sys Close(fd int) (err error)
|
|
||||||
//sys Dup(oldfd int) (fd int, err error)
|
|
||||||
//sys Exit(code int)
|
|
||||||
//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error)
|
|
||||||
//sys Fchdir(fd int) (err error)
|
|
||||||
//sys Fchmod(fd int, mode uint32) (err error)
|
|
||||||
//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
|
|
||||||
//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error)
|
|
||||||
//sys Fdatasync(fd int) (err error)
|
|
||||||
//sys Fsync(fd int) (err error)
|
|
||||||
// readdir_r
|
|
||||||
//sysnb Getpgid(pid int) (pgid int, err error)
|
|
||||||
|
|
||||||
//sys Getpgrp() (pid int)
|
|
||||||
|
|
||||||
//sysnb Getpid() (pid int)
|
|
||||||
//sysnb Getppid() (ppid int)
|
|
||||||
//sys Getpriority(which int, who int) (prio int, err error)
|
|
||||||
//sysnb Getrusage(who int, rusage *Rusage) (err error)
|
|
||||||
//sysnb Getsid(pid int) (sid int, err error)
|
|
||||||
//sysnb Kill(pid int, sig Signal) (err error)
|
|
||||||
//sys Klogctl(typ int, buf []byte) (n int, err error) = syslog
|
|
||||||
//sys Mkdir(dirfd int, path string, mode uint32) (err error)
|
|
||||||
//sys Mkdirat(dirfd int, path string, mode uint32) (err error)
|
|
||||||
//sys Mkfifo(path string, mode uint32) (err error)
|
|
||||||
//sys Mknod(path string, mode uint32, dev int) (err error)
|
|
||||||
//sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error)
|
|
||||||
//sys Nanosleep(time *Timespec, leftover *Timespec) (err error)
|
|
||||||
//sys Open(path string, mode int, perm uint32) (fd int, err error) = open64
|
|
||||||
//sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
|
|
||||||
//sys read(fd int, p []byte) (n int, err error)
|
|
||||||
//sys Readlink(path string, buf []byte) (n int, err error)
|
|
||||||
//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
|
|
||||||
//sys Setdomainname(p []byte) (err error)
|
|
||||||
//sys Sethostname(p []byte) (err error)
|
|
||||||
//sysnb Setpgid(pid int, pgid int) (err error)
|
|
||||||
//sysnb Setsid() (pid int, err error)
|
|
||||||
//sysnb Settimeofday(tv *Timeval) (err error)
|
|
||||||
|
|
||||||
//sys Setuid(uid int) (err error)
|
|
||||||
//sys Setgid(uid int) (err error)
|
|
||||||
|
|
||||||
//sys Setpriority(which int, who int, prio int) (err error)
|
|
||||||
//sys Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error)
|
|
||||||
//sys Sync()
|
|
||||||
//sysnb Times(tms *Tms) (ticks uintptr, err error)
|
|
||||||
//sysnb Umask(mask int) (oldmask int)
|
|
||||||
//sysnb Uname(buf *Utsname) (err error)
|
|
||||||
//sys Unlink(path string) (err error)
|
|
||||||
//sys Unlinkat(dirfd int, path string, flags int) (err error)
|
|
||||||
//sys Ustat(dev int, ubuf *Ustat_t) (err error)
|
|
||||||
//sys write(fd int, p []byte) (n int, err error)
|
|
||||||
//sys readlen(fd int, p *byte, np int) (n int, err error) = read
|
|
||||||
//sys writelen(fd int, p *byte, np int) (n int, err error) = write
|
|
||||||
|
|
||||||
//sys Dup2(oldfd int, newfd int) (err error)
|
|
||||||
//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = posix_fadvise64
|
|
||||||
//sys Fchown(fd int, uid int, gid int) (err error)
|
|
||||||
//sys fstat(fd int, stat *Stat_t) (err error)
|
|
||||||
//sys fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = fstatat
|
|
||||||
//sys Fstatfs(fd int, buf *Statfs_t) (err error)
|
|
||||||
//sys Ftruncate(fd int, length int64) (err error)
|
|
||||||
//sysnb Getegid() (egid int)
|
|
||||||
//sysnb Geteuid() (euid int)
|
|
||||||
//sysnb Getgid() (gid int)
|
|
||||||
//sysnb Getuid() (uid int)
|
|
||||||
//sys Lchown(path string, uid int, gid int) (err error)
|
|
||||||
//sys Listen(s int, n int) (err error)
|
|
||||||
//sys lstat(path string, stat *Stat_t) (err error)
|
|
||||||
//sys Pause() (err error)
|
|
||||||
//sys Pread(fd int, p []byte, offset int64) (n int, err error) = pread64
|
|
||||||
//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = pwrite64
|
|
||||||
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
|
|
||||||
//sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error)
|
|
||||||
//sysnb Setregid(rgid int, egid int) (err error)
|
|
||||||
//sysnb Setreuid(ruid int, euid int) (err error)
|
|
||||||
//sys Shutdown(fd int, how int) (err error)
|
|
||||||
//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
|
|
||||||
//sys stat(path string, statptr *Stat_t) (err error)
|
|
||||||
//sys Statfs(path string, buf *Statfs_t) (err error)
|
|
||||||
//sys Truncate(path string, length int64) (err error)
|
|
||||||
|
|
||||||
//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
|
|
||||||
//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
|
|
||||||
//sysnb getgroups(n int, list *_Gid_t) (nn int, err error)
|
|
||||||
//sysnb setgroups(n int, list *_Gid_t) (err error)
|
|
||||||
//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
|
|
||||||
//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
|
|
||||||
//sysnb socket(domain int, typ int, proto int) (fd int, err error)
|
|
||||||
//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)
|
|
||||||
//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
|
|
||||||
//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
|
|
||||||
//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
|
|
||||||
//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
|
|
||||||
|
|
||||||
// In order to use msghdr structure with Control, Controllen, nrecvmsg and nsendmsg must be used.
|
|
||||||
//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = nrecvmsg
|
|
||||||
//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = nsendmsg
|
|
||||||
|
|
||||||
//sys munmap(addr uintptr, length uintptr) (err error)
|
|
||||||
|
|
||||||
var mapper = &mmapper{
|
|
||||||
active: make(map[*byte][]byte),
|
|
||||||
mmap: mmap,
|
|
||||||
munmap: munmap,
|
|
||||||
}
|
|
||||||
|
|
||||||
func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
|
|
||||||
return mapper.Mmap(fd, offset, length, prot, flags)
|
|
||||||
}
|
|
||||||
|
|
||||||
func Munmap(b []byte) (err error) {
|
|
||||||
return mapper.Munmap(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys Madvise(b []byte, advice int) (err error)
|
|
||||||
//sys Mprotect(b []byte, prot int) (err error)
|
|
||||||
//sys Mlock(b []byte) (err error)
|
|
||||||
//sys Mlockall(flags int) (err error)
|
|
||||||
//sys Msync(b []byte, flags int) (err error)
|
|
||||||
//sys Munlock(b []byte) (err error)
|
|
||||||
//sys Munlockall() (err error)
|
|
||||||
|
|
||||||
//sysnb pipe(p *[2]_C_int) (err error)
|
|
||||||
|
|
||||||
func Pipe(p []int) (err error) {
|
|
||||||
if len(p) != 2 {
|
|
||||||
return EINVAL
|
|
||||||
}
|
|
||||||
var pp [2]_C_int
|
|
||||||
err = pipe(&pp)
|
|
||||||
p[0] = int(pp[0])
|
|
||||||
p[1] = int(pp[1])
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error)
|
|
||||||
|
|
||||||
func Poll(fds []PollFd, timeout int) (n int, err error) {
|
|
||||||
if len(fds) == 0 {
|
|
||||||
return poll(nil, 0, timeout)
|
|
||||||
}
|
|
||||||
return poll(&fds[0], len(fds), timeout)
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys gettimeofday(tv *Timeval, tzp *Timezone) (err error)
|
|
||||||
//sysnb Time(t *Time_t) (tt Time_t, err error)
|
|
||||||
//sys Utime(path string, buf *Utimbuf) (err error)
|
|
||||||
|
|
||||||
//sys Getsystemcfg(label int) (n uint64)
|
|
||||||
|
|
||||||
//sys umount(target string) (err error)
|
|
||||||
func Unmount(target string, flags int) (err error) {
|
|
||||||
if flags != 0 {
|
|
||||||
// AIX doesn't have any flags for umount.
|
|
||||||
return ENOSYS
|
|
||||||
}
|
|
||||||
return umount(target)
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -1089,4 +551,3 @@ func Unmount(target string, flags int) (err error) {
|
||||||
}
|
}
|
||||||
return umount(target)
|
return umount(target)
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,59 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build aix
|
|
||||||
// +build ppc
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) = getrlimit64
|
|
||||||
//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) = setrlimit64
|
|
||||||
//sys Seek(fd int, offset int64, whence int) (off int64, err error) = lseek64
|
|
||||||
|
|
||||||
//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)
|
|
||||||
|
|
||||||
func setTimespec(sec, nsec int64) Timespec {
|
|
||||||
return Timespec{Sec: int32(sec), Nsec: int32(nsec)}
|
|
||||||
}
|
|
||||||
|
|
||||||
func setTimeval(sec, usec int64) Timeval {
|
|
||||||
return Timeval{Sec: int32(sec), Usec: int32(usec)}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iov *Iovec) SetLen(length int) {
|
|
||||||
iov.Len = uint32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (msghdr *Msghdr) SetControllen(length int) {
|
|
||||||
msghdr.Controllen = uint32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (msghdr *Msghdr) SetIovlen(length int) {
|
|
||||||
msghdr.Iovlen = int32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
|
||||||
cmsg.Len = uint32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func Fstat(fd int, stat *Stat_t) error {
|
|
||||||
return fstat(fd, stat)
|
|
||||||
}
|
|
||||||
|
|
||||||
func Fstatat(dirfd int, path string, stat *Stat_t, flags int) error {
|
|
||||||
return fstatat(dirfd, path, stat, flags)
|
|
||||||
}
|
|
||||||
|
|
||||||
func Lstat(path string, stat *Stat_t) error {
|
|
||||||
return lstat(path, stat)
|
|
||||||
}
|
|
||||||
|
|
||||||
func Stat(path string, statptr *Stat_t) error {
|
|
||||||
return stat(path, statptr)
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -108,4 +52,3 @@ func Lstat(path string, stat *Stat_t) error {
|
||||||
func Stat(path string, statptr *Stat_t) error {
|
func Stat(path string, statptr *Stat_t) error {
|
||||||
return stat(path, statptr)
|
return stat(path, statptr)
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,90 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build aix
|
|
||||||
// +build ppc64
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
//sysnb Getrlimit(resource int, rlim *Rlimit) (err error)
|
|
||||||
//sysnb Setrlimit(resource int, rlim *Rlimit) (err error)
|
|
||||||
//sys Seek(fd int, offset int64, whence int) (off int64, err error) = lseek
|
|
||||||
|
|
||||||
//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) = mmap64
|
|
||||||
|
|
||||||
func setTimespec(sec, nsec int64) Timespec {
|
|
||||||
return Timespec{Sec: sec, Nsec: nsec}
|
|
||||||
}
|
|
||||||
|
|
||||||
func setTimeval(sec, usec int64) Timeval {
|
|
||||||
return Timeval{Sec: int64(sec), Usec: int32(usec)}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iov *Iovec) SetLen(length int) {
|
|
||||||
iov.Len = uint64(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (msghdr *Msghdr) SetControllen(length int) {
|
|
||||||
msghdr.Controllen = uint32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (msghdr *Msghdr) SetIovlen(length int) {
|
|
||||||
msghdr.Iovlen = int32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
|
||||||
cmsg.Len = uint32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
// In order to only have Timespec structure, type of Stat_t's fields
|
|
||||||
// Atim, Mtim and Ctim is changed from StTimespec to Timespec during
|
|
||||||
// ztypes generation.
|
|
||||||
// On ppc64, Timespec.Nsec is an int64 while StTimespec.Nsec is an
|
|
||||||
// int32, so the fields' value must be modified.
|
|
||||||
func fixStatTimFields(stat *Stat_t) {
|
|
||||||
stat.Atim.Nsec >>= 32
|
|
||||||
stat.Mtim.Nsec >>= 32
|
|
||||||
stat.Ctim.Nsec >>= 32
|
|
||||||
}
|
|
||||||
|
|
||||||
func Fstat(fd int, stat *Stat_t) error {
|
|
||||||
err := fstat(fd, stat)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
fixStatTimFields(stat)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func Fstatat(dirfd int, path string, stat *Stat_t, flags int) error {
|
|
||||||
err := fstatat(dirfd, path, stat, flags)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
fixStatTimFields(stat)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func Lstat(path string, stat *Stat_t) error {
|
|
||||||
err := lstat(path, stat)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
fixStatTimFields(stat)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func Stat(path string, statptr *Stat_t) error {
|
|
||||||
err := stat(path, statptr)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
fixStatTimFields(statptr)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -170,4 +83,3 @@ func Stat(path string, statptr *Stat_t) error {
|
||||||
fixStatTimFields(statptr)
|
fixStatTimFields(statptr)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,61 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// 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 (msghdr *Msghdr) SetIovlen(length int) {
|
|
||||||
msghdr.Iovlen = int32(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)
|
|
||||||
=======
|
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -113,4 +55,3 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
|
||||||
}
|
}
|
||||||
|
|
||||||
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,42 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// 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 (msghdr *Msghdr) SetIovlen(length int) {
|
|
||||||
msghdr.Iovlen = int32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
|
||||||
cmsg.Len = uint32(length)
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -75,4 +36,3 @@ func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,42 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// 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 (msghdr *Msghdr) SetIovlen(length int) {
|
|
||||||
msghdr.Iovlen = int32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
|
||||||
cmsg.Len = uint32(length)
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -75,4 +36,3 @@ func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,42 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// 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 (msghdr *Msghdr) SetIovlen(length int) {
|
|
||||||
msghdr.Iovlen = int32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
|
||||||
cmsg.Len = uint32(length)
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2013 The Go Authors. All rights reserved.
|
// Copyright 2013 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -75,4 +36,3 @@ func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,42 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Copyright 2019 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,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 (msghdr *Msghdr) SetIovlen(length int) {
|
|
||||||
msghdr.Iovlen = int32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
|
||||||
cmsg.Len = uint32(length)
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -75,4 +36,3 @@ func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,46 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// 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 (msghdr *Msghdr) SetIovlen(length int) {
|
|
||||||
msghdr.Iovlen = uint32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
|
||||||
cmsg.Len = uint32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
|
|
||||||
// of openbsd/386 the syscall is called sysctl instead of __sysctl.
|
|
||||||
const SYS___SYSCTL = SYS_SYSCTL
|
|
||||||
=======
|
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -83,4 +40,3 @@ func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
|
// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
|
||||||
// of openbsd/386 the syscall is called sysctl instead of __sysctl.
|
// of openbsd/386 the syscall is called sysctl instead of __sysctl.
|
||||||
const SYS___SYSCTL = SYS_SYSCTL
|
const SYS___SYSCTL = SYS_SYSCTL
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,46 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// 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,openbsd
|
|
||||||
|
|
||||||
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: 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 (msghdr *Msghdr) SetIovlen(length int) {
|
|
||||||
msghdr.Iovlen = uint32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
|
||||||
cmsg.Len = uint32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
|
|
||||||
// of openbsd/amd64 the syscall is called sysctl instead of __sysctl.
|
|
||||||
const SYS___SYSCTL = SYS_SYSCTL
|
|
||||||
=======
|
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -83,4 +40,3 @@ func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
|
// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
|
||||||
// of openbsd/amd64 the syscall is called sysctl instead of __sysctl.
|
// of openbsd/amd64 the syscall is called sysctl instead of __sysctl.
|
||||||
const SYS___SYSCTL = SYS_SYSCTL
|
const SYS___SYSCTL = SYS_SYSCTL
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,46 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build arm,openbsd
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
func setTimespec(sec, nsec int64) Timespec {
|
|
||||||
return Timespec{Sec: sec, Nsec: int32(nsec)}
|
|
||||||
}
|
|
||||||
|
|
||||||
func setTimeval(sec, usec int64) Timeval {
|
|
||||||
return Timeval{Sec: sec, Usec: int32(usec)}
|
|
||||||
}
|
|
||||||
|
|
||||||
func SetKevent(k *Kevent_t, fd, mode, flags int) {
|
|
||||||
k.Ident = uint32(fd)
|
|
||||||
k.Filter = int16(mode)
|
|
||||||
k.Flags = uint16(flags)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iov *Iovec) SetLen(length int) {
|
|
||||||
iov.Len = uint32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (msghdr *Msghdr) SetControllen(length int) {
|
|
||||||
msghdr.Controllen = uint32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (msghdr *Msghdr) SetIovlen(length int) {
|
|
||||||
msghdr.Iovlen = uint32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
|
||||||
cmsg.Len = uint32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
|
|
||||||
// of openbsd/arm the syscall is called sysctl instead of __sysctl.
|
|
||||||
const SYS___SYSCTL = SYS_SYSCTL
|
|
||||||
=======
|
|
||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
// Copyright 2017 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -83,4 +40,3 @@ func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
|
// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
|
||||||
// of openbsd/arm the syscall is called sysctl instead of __sysctl.
|
// of openbsd/arm the syscall is called sysctl instead of __sysctl.
|
||||||
const SYS___SYSCTL = SYS_SYSCTL
|
const SYS___SYSCTL = SYS_SYSCTL
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,46 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Copyright 2019 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,openbsd
|
|
||||||
|
|
||||||
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: 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 (msghdr *Msghdr) SetIovlen(length int) {
|
|
||||||
msghdr.Iovlen = uint32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
|
||||||
cmsg.Len = uint32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
|
|
||||||
// of openbsd/amd64 the syscall is called sysctl instead of __sysctl.
|
|
||||||
const SYS___SYSCTL = SYS_SYSCTL
|
|
||||||
=======
|
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -83,4 +40,3 @@ func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
|
// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
|
||||||
// of openbsd/amd64 the syscall is called sysctl instead of __sysctl.
|
// of openbsd/amd64 the syscall is called sysctl instead of __sysctl.
|
||||||
const SYS___SYSCTL = SYS_SYSCTL
|
const SYS___SYSCTL = SYS_SYSCTL
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,32 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// 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,solaris
|
|
||||||
|
|
||||||
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: usec}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iov *Iovec) SetLen(length int) {
|
|
||||||
iov.Len = uint64(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (msghdr *Msghdr) SetIovlen(length int) {
|
|
||||||
msghdr.Iovlen = int32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
|
||||||
cmsg.Len = uint32(length)
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -55,4 +26,3 @@ func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,20 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build darwin dragonfly freebsd linux netbsd openbsd solaris
|
|
||||||
// +build !gccgo,!ppc64le,!ppc64
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import "syscall"
|
|
||||||
|
|
||||||
func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
|
||||||
func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
|
||||||
func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
|
||||||
func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
|
||||||
=======
|
|
||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -33,4 +16,3 @@ func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
||||||
func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
||||||
func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
||||||
func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,29 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// 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 ppc64le ppc64
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import "syscall"
|
|
||||||
|
|
||||||
func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) {
|
|
||||||
return syscall.Syscall(trap, a1, a2, a3)
|
|
||||||
}
|
|
||||||
func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) {
|
|
||||||
return syscall.Syscall6(trap, a1, a2, a3, a4, a5, a6)
|
|
||||||
}
|
|
||||||
func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) {
|
|
||||||
return syscall.RawSyscall(trap, a1, a2, a3)
|
|
||||||
}
|
|
||||||
func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) {
|
|
||||||
return syscall.RawSyscall6(trap, a1, a2, a3, a4, a5, a6)
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -49,4 +23,3 @@ func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) {
|
||||||
func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) {
|
func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) {
|
||||||
return syscall.RawSyscall6(trap, a1, a2, a3, a4, a5, a6)
|
return syscall.RawSyscall6(trap, a1, a2, a3, a4, a5, a6)
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,42 +1,42 @@
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package unix
|
package unix
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Unveil implements the unveil syscall.
|
// Unveil implements the unveil syscall.
|
||||||
// For more information see unveil(2).
|
// For more information see unveil(2).
|
||||||
// Note that the special case of blocking further
|
// Note that the special case of blocking further
|
||||||
// unveil calls is handled by UnveilBlock.
|
// unveil calls is handled by UnveilBlock.
|
||||||
func Unveil(path string, flags string) error {
|
func Unveil(path string, flags string) error {
|
||||||
pathPtr, err := syscall.BytePtrFromString(path)
|
pathPtr, err := syscall.BytePtrFromString(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
flagsPtr, err := syscall.BytePtrFromString(flags)
|
flagsPtr, err := syscall.BytePtrFromString(flags)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_, _, e := syscall.Syscall(SYS_UNVEIL, uintptr(unsafe.Pointer(pathPtr)), uintptr(unsafe.Pointer(flagsPtr)), 0)
|
_, _, e := syscall.Syscall(SYS_UNVEIL, uintptr(unsafe.Pointer(pathPtr)), uintptr(unsafe.Pointer(flagsPtr)), 0)
|
||||||
if e != 0 {
|
if e != 0 {
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnveilBlock blocks future unveil calls.
|
// UnveilBlock blocks future unveil calls.
|
||||||
// For more information see unveil(2).
|
// For more information see unveil(2).
|
||||||
func UnveilBlock() error {
|
func UnveilBlock() error {
|
||||||
// Both pointers must be nil.
|
// Both pointers must be nil.
|
||||||
var pathUnsafe, flagsUnsafe unsafe.Pointer
|
var pathUnsafe, flagsUnsafe unsafe.Pointer
|
||||||
_, _, e := syscall.Syscall(SYS_UNVEIL, uintptr(pathUnsafe), uintptr(flagsUnsafe), 0)
|
_, _, e := syscall.Syscall(SYS_UNVEIL, uintptr(pathUnsafe), uintptr(flagsUnsafe), 0)
|
||||||
if e != 0 {
|
if e != 0 {
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,245 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// 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 freebsd netbsd
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
// 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 and NetBSD implement their 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) {
|
|
||||||
var d unsafe.Pointer
|
|
||||||
if len(data) > 0 {
|
|
||||||
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) {
|
|
||||||
var d unsafe.Pointer
|
|
||||||
if len(data) > 0 {
|
|
||||||
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) {
|
|
||||||
var d unsafe.Pointer
|
|
||||||
if len(data) > 0 {
|
|
||||||
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
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
@ -481,4 +239,3 @@ func Llistxattr(link string, dest []byte) (sz int, err error) {
|
||||||
|
|
||||||
return s, nil
|
return s, nil
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,280 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// go run mksysctl_openbsd.go
|
|
||||||
// Code generated by the command above; DO NOT EDIT.
|
|
||||||
|
|
||||||
// +build arm64,openbsd
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
type mibentry struct {
|
|
||||||
ctlname string
|
|
||||||
ctloid []_C_int
|
|
||||||
}
|
|
||||||
|
|
||||||
var sysctlMib = []mibentry{
|
|
||||||
{"ddb.console", []_C_int{9, 6}},
|
|
||||||
{"ddb.log", []_C_int{9, 7}},
|
|
||||||
{"ddb.max_line", []_C_int{9, 3}},
|
|
||||||
{"ddb.max_width", []_C_int{9, 2}},
|
|
||||||
{"ddb.panic", []_C_int{9, 5}},
|
|
||||||
{"ddb.profile", []_C_int{9, 9}},
|
|
||||||
{"ddb.radix", []_C_int{9, 1}},
|
|
||||||
{"ddb.tab_stop_width", []_C_int{9, 4}},
|
|
||||||
{"ddb.trigger", []_C_int{9, 8}},
|
|
||||||
{"fs.posix.setuid", []_C_int{3, 1, 1}},
|
|
||||||
{"hw.allowpowerdown", []_C_int{6, 22}},
|
|
||||||
{"hw.byteorder", []_C_int{6, 4}},
|
|
||||||
{"hw.cpuspeed", []_C_int{6, 12}},
|
|
||||||
{"hw.diskcount", []_C_int{6, 10}},
|
|
||||||
{"hw.disknames", []_C_int{6, 8}},
|
|
||||||
{"hw.diskstats", []_C_int{6, 9}},
|
|
||||||
{"hw.machine", []_C_int{6, 1}},
|
|
||||||
{"hw.model", []_C_int{6, 2}},
|
|
||||||
{"hw.ncpu", []_C_int{6, 3}},
|
|
||||||
{"hw.ncpufound", []_C_int{6, 21}},
|
|
||||||
{"hw.ncpuonline", []_C_int{6, 25}},
|
|
||||||
{"hw.pagesize", []_C_int{6, 7}},
|
|
||||||
{"hw.perfpolicy", []_C_int{6, 23}},
|
|
||||||
{"hw.physmem", []_C_int{6, 19}},
|
|
||||||
{"hw.product", []_C_int{6, 15}},
|
|
||||||
{"hw.serialno", []_C_int{6, 17}},
|
|
||||||
{"hw.setperf", []_C_int{6, 13}},
|
|
||||||
{"hw.smt", []_C_int{6, 24}},
|
|
||||||
{"hw.usermem", []_C_int{6, 20}},
|
|
||||||
{"hw.uuid", []_C_int{6, 18}},
|
|
||||||
{"hw.vendor", []_C_int{6, 14}},
|
|
||||||
{"hw.version", []_C_int{6, 16}},
|
|
||||||
{"kern.allowkmem", []_C_int{1, 52}},
|
|
||||||
{"kern.argmax", []_C_int{1, 8}},
|
|
||||||
{"kern.audio", []_C_int{1, 84}},
|
|
||||||
{"kern.boottime", []_C_int{1, 21}},
|
|
||||||
{"kern.bufcachepercent", []_C_int{1, 72}},
|
|
||||||
{"kern.ccpu", []_C_int{1, 45}},
|
|
||||||
{"kern.clockrate", []_C_int{1, 12}},
|
|
||||||
{"kern.consdev", []_C_int{1, 75}},
|
|
||||||
{"kern.cp_time", []_C_int{1, 40}},
|
|
||||||
{"kern.cp_time2", []_C_int{1, 71}},
|
|
||||||
{"kern.cpustats", []_C_int{1, 85}},
|
|
||||||
{"kern.domainname", []_C_int{1, 22}},
|
|
||||||
{"kern.file", []_C_int{1, 73}},
|
|
||||||
{"kern.forkstat", []_C_int{1, 42}},
|
|
||||||
{"kern.fscale", []_C_int{1, 46}},
|
|
||||||
{"kern.fsync", []_C_int{1, 33}},
|
|
||||||
{"kern.global_ptrace", []_C_int{1, 81}},
|
|
||||||
{"kern.hostid", []_C_int{1, 11}},
|
|
||||||
{"kern.hostname", []_C_int{1, 10}},
|
|
||||||
{"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}},
|
|
||||||
{"kern.job_control", []_C_int{1, 19}},
|
|
||||||
{"kern.malloc.buckets", []_C_int{1, 39, 1}},
|
|
||||||
{"kern.malloc.kmemnames", []_C_int{1, 39, 3}},
|
|
||||||
{"kern.maxclusters", []_C_int{1, 67}},
|
|
||||||
{"kern.maxfiles", []_C_int{1, 7}},
|
|
||||||
{"kern.maxlocksperuid", []_C_int{1, 70}},
|
|
||||||
{"kern.maxpartitions", []_C_int{1, 23}},
|
|
||||||
{"kern.maxproc", []_C_int{1, 6}},
|
|
||||||
{"kern.maxthread", []_C_int{1, 25}},
|
|
||||||
{"kern.maxvnodes", []_C_int{1, 5}},
|
|
||||||
{"kern.mbstat", []_C_int{1, 59}},
|
|
||||||
{"kern.msgbuf", []_C_int{1, 48}},
|
|
||||||
{"kern.msgbufsize", []_C_int{1, 38}},
|
|
||||||
{"kern.nchstats", []_C_int{1, 41}},
|
|
||||||
{"kern.netlivelocks", []_C_int{1, 76}},
|
|
||||||
{"kern.nfiles", []_C_int{1, 56}},
|
|
||||||
{"kern.ngroups", []_C_int{1, 18}},
|
|
||||||
{"kern.nosuidcoredump", []_C_int{1, 32}},
|
|
||||||
{"kern.nprocs", []_C_int{1, 47}},
|
|
||||||
{"kern.nselcoll", []_C_int{1, 43}},
|
|
||||||
{"kern.nthreads", []_C_int{1, 26}},
|
|
||||||
{"kern.numvnodes", []_C_int{1, 58}},
|
|
||||||
{"kern.osrelease", []_C_int{1, 2}},
|
|
||||||
{"kern.osrevision", []_C_int{1, 3}},
|
|
||||||
{"kern.ostype", []_C_int{1, 1}},
|
|
||||||
{"kern.osversion", []_C_int{1, 27}},
|
|
||||||
{"kern.pool_debug", []_C_int{1, 77}},
|
|
||||||
{"kern.posix1version", []_C_int{1, 17}},
|
|
||||||
{"kern.proc", []_C_int{1, 66}},
|
|
||||||
{"kern.rawpartition", []_C_int{1, 24}},
|
|
||||||
{"kern.saved_ids", []_C_int{1, 20}},
|
|
||||||
{"kern.securelevel", []_C_int{1, 9}},
|
|
||||||
{"kern.seminfo", []_C_int{1, 61}},
|
|
||||||
{"kern.shminfo", []_C_int{1, 62}},
|
|
||||||
{"kern.somaxconn", []_C_int{1, 28}},
|
|
||||||
{"kern.sominconn", []_C_int{1, 29}},
|
|
||||||
{"kern.splassert", []_C_int{1, 54}},
|
|
||||||
{"kern.stackgap_random", []_C_int{1, 50}},
|
|
||||||
{"kern.sysvipc_info", []_C_int{1, 51}},
|
|
||||||
{"kern.sysvmsg", []_C_int{1, 34}},
|
|
||||||
{"kern.sysvsem", []_C_int{1, 35}},
|
|
||||||
{"kern.sysvshm", []_C_int{1, 36}},
|
|
||||||
{"kern.timecounter.choice", []_C_int{1, 69, 4}},
|
|
||||||
{"kern.timecounter.hardware", []_C_int{1, 69, 3}},
|
|
||||||
{"kern.timecounter.tick", []_C_int{1, 69, 1}},
|
|
||||||
{"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}},
|
|
||||||
{"kern.tty.tk_cancc", []_C_int{1, 44, 4}},
|
|
||||||
{"kern.tty.tk_nin", []_C_int{1, 44, 1}},
|
|
||||||
{"kern.tty.tk_nout", []_C_int{1, 44, 2}},
|
|
||||||
{"kern.tty.tk_rawcc", []_C_int{1, 44, 3}},
|
|
||||||
{"kern.tty.ttyinfo", []_C_int{1, 44, 5}},
|
|
||||||
{"kern.ttycount", []_C_int{1, 57}},
|
|
||||||
{"kern.version", []_C_int{1, 4}},
|
|
||||||
{"kern.watchdog.auto", []_C_int{1, 64, 2}},
|
|
||||||
{"kern.watchdog.period", []_C_int{1, 64, 1}},
|
|
||||||
{"kern.witnesswatch", []_C_int{1, 53}},
|
|
||||||
{"kern.wxabort", []_C_int{1, 74}},
|
|
||||||
{"net.bpf.bufsize", []_C_int{4, 31, 1}},
|
|
||||||
{"net.bpf.maxbufsize", []_C_int{4, 31, 2}},
|
|
||||||
{"net.inet.ah.enable", []_C_int{4, 2, 51, 1}},
|
|
||||||
{"net.inet.ah.stats", []_C_int{4, 2, 51, 2}},
|
|
||||||
{"net.inet.carp.allow", []_C_int{4, 2, 112, 1}},
|
|
||||||
{"net.inet.carp.log", []_C_int{4, 2, 112, 3}},
|
|
||||||
{"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}},
|
|
||||||
{"net.inet.carp.stats", []_C_int{4, 2, 112, 4}},
|
|
||||||
{"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}},
|
|
||||||
{"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}},
|
|
||||||
{"net.inet.divert.stats", []_C_int{4, 2, 258, 3}},
|
|
||||||
{"net.inet.esp.enable", []_C_int{4, 2, 50, 1}},
|
|
||||||
{"net.inet.esp.stats", []_C_int{4, 2, 50, 4}},
|
|
||||||
{"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}},
|
|
||||||
{"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}},
|
|
||||||
{"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}},
|
|
||||||
{"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}},
|
|
||||||
{"net.inet.gre.allow", []_C_int{4, 2, 47, 1}},
|
|
||||||
{"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}},
|
|
||||||
{"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}},
|
|
||||||
{"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}},
|
|
||||||
{"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}},
|
|
||||||
{"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}},
|
|
||||||
{"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}},
|
|
||||||
{"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}},
|
|
||||||
{"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}},
|
|
||||||
{"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}},
|
|
||||||
{"net.inet.ip.arpdown", []_C_int{4, 2, 0, 40}},
|
|
||||||
{"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}},
|
|
||||||
{"net.inet.ip.arptimeout", []_C_int{4, 2, 0, 39}},
|
|
||||||
{"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}},
|
|
||||||
{"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}},
|
|
||||||
{"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}},
|
|
||||||
{"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}},
|
|
||||||
{"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}},
|
|
||||||
{"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}},
|
|
||||||
{"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}},
|
|
||||||
{"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}},
|
|
||||||
{"net.inet.ip.mrtmfc", []_C_int{4, 2, 0, 37}},
|
|
||||||
{"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}},
|
|
||||||
{"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}},
|
|
||||||
{"net.inet.ip.mrtvif", []_C_int{4, 2, 0, 38}},
|
|
||||||
{"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}},
|
|
||||||
{"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}},
|
|
||||||
{"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}},
|
|
||||||
{"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}},
|
|
||||||
{"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}},
|
|
||||||
{"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}},
|
|
||||||
{"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}},
|
|
||||||
{"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}},
|
|
||||||
{"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}},
|
|
||||||
{"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}},
|
|
||||||
{"net.inet.ip.stats", []_C_int{4, 2, 0, 33}},
|
|
||||||
{"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}},
|
|
||||||
{"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}},
|
|
||||||
{"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}},
|
|
||||||
{"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}},
|
|
||||||
{"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}},
|
|
||||||
{"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}},
|
|
||||||
{"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}},
|
|
||||||
{"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}},
|
|
||||||
{"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}},
|
|
||||||
{"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}},
|
|
||||||
{"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}},
|
|
||||||
{"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}},
|
|
||||||
{"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}},
|
|
||||||
{"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}},
|
|
||||||
{"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}},
|
|
||||||
{"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}},
|
|
||||||
{"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}},
|
|
||||||
{"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}},
|
|
||||||
{"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}},
|
|
||||||
{"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}},
|
|
||||||
{"net.inet.tcp.rootonly", []_C_int{4, 2, 6, 24}},
|
|
||||||
{"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}},
|
|
||||||
{"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}},
|
|
||||||
{"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}},
|
|
||||||
{"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}},
|
|
||||||
{"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}},
|
|
||||||
{"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}},
|
|
||||||
{"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}},
|
|
||||||
{"net.inet.tcp.synhashsize", []_C_int{4, 2, 6, 25}},
|
|
||||||
{"net.inet.tcp.synuselimit", []_C_int{4, 2, 6, 23}},
|
|
||||||
{"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}},
|
|
||||||
{"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}},
|
|
||||||
{"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}},
|
|
||||||
{"net.inet.udp.rootonly", []_C_int{4, 2, 17, 6}},
|
|
||||||
{"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}},
|
|
||||||
{"net.inet.udp.stats", []_C_int{4, 2, 17, 5}},
|
|
||||||
{"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}},
|
|
||||||
{"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}},
|
|
||||||
{"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}},
|
|
||||||
{"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}},
|
|
||||||
{"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}},
|
|
||||||
{"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}},
|
|
||||||
{"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}},
|
|
||||||
{"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}},
|
|
||||||
{"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}},
|
|
||||||
{"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}},
|
|
||||||
{"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}},
|
|
||||||
{"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}},
|
|
||||||
{"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}},
|
|
||||||
{"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}},
|
|
||||||
{"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}},
|
|
||||||
{"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}},
|
|
||||||
{"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}},
|
|
||||||
{"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}},
|
|
||||||
{"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}},
|
|
||||||
{"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}},
|
|
||||||
{"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}},
|
|
||||||
{"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}},
|
|
||||||
{"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}},
|
|
||||||
{"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}},
|
|
||||||
{"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}},
|
|
||||||
{"net.inet6.ip6.mrtmfc", []_C_int{4, 24, 17, 53}},
|
|
||||||
{"net.inet6.ip6.mrtmif", []_C_int{4, 24, 17, 52}},
|
|
||||||
{"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}},
|
|
||||||
{"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}},
|
|
||||||
{"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}},
|
|
||||||
{"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}},
|
|
||||||
{"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}},
|
|
||||||
{"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}},
|
|
||||||
{"net.inet6.ip6.soiikey", []_C_int{4, 24, 17, 54}},
|
|
||||||
{"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}},
|
|
||||||
{"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}},
|
|
||||||
{"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}},
|
|
||||||
{"net.key.sadb_dump", []_C_int{4, 30, 1}},
|
|
||||||
{"net.key.spd_dump", []_C_int{4, 30, 2}},
|
|
||||||
{"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}},
|
|
||||||
{"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}},
|
|
||||||
{"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}},
|
|
||||||
{"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}},
|
|
||||||
{"net.mpls.mapttl_ip", []_C_int{4, 33, 5}},
|
|
||||||
{"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}},
|
|
||||||
{"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}},
|
|
||||||
{"net.mpls.ttl", []_C_int{4, 33, 2}},
|
|
||||||
{"net.pflow.stats", []_C_int{4, 34, 1}},
|
|
||||||
{"net.pipex.enable", []_C_int{4, 35, 1}},
|
|
||||||
{"vm.anonmin", []_C_int{2, 7}},
|
|
||||||
{"vm.loadavg", []_C_int{2, 2}},
|
|
||||||
{"vm.malloc_conf", []_C_int{2, 12}},
|
|
||||||
{"vm.maxslp", []_C_int{2, 10}},
|
|
||||||
{"vm.nkmempages", []_C_int{2, 6}},
|
|
||||||
{"vm.psstrings", []_C_int{2, 3}},
|
|
||||||
{"vm.swapencrypt.enable", []_C_int{2, 5, 0}},
|
|
||||||
{"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}},
|
|
||||||
{"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}},
|
|
||||||
{"vm.uspace", []_C_int{2, 11}},
|
|
||||||
{"vm.uvmexp", []_C_int{2, 4}},
|
|
||||||
{"vm.vmmeter", []_C_int{2, 1}},
|
|
||||||
{"vm.vnodemin", []_C_int{2, 9}},
|
|
||||||
{"vm.vtextmin", []_C_int{2, 8}},
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
// go run mksysctl_openbsd.go
|
// go run mksysctl_openbsd.go
|
||||||
// Code generated by the command above; DO NOT EDIT.
|
// Code generated by the command above; DO NOT EDIT.
|
||||||
|
|
||||||
|
|
@ -551,4 +274,3 @@ var sysctlMib = []mibentry{
|
||||||
{"vm.vnodemin", []_C_int{2, 9}},
|
{"vm.vnodemin", []_C_int{2, 9}},
|
||||||
{"vm.vtextmin", []_C_int{2, 8}},
|
{"vm.vtextmin", []_C_int{2, 8}},
|
||||||
}
|
}
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,441 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// go run mksysnum.go /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/sys/syscall.h
|
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
|
||||||
|
|
||||||
// +build 386,darwin
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
const (
|
|
||||||
SYS_SYSCALL = 0
|
|
||||||
SYS_EXIT = 1
|
|
||||||
SYS_FORK = 2
|
|
||||||
SYS_READ = 3
|
|
||||||
SYS_WRITE = 4
|
|
||||||
SYS_OPEN = 5
|
|
||||||
SYS_CLOSE = 6
|
|
||||||
SYS_WAIT4 = 7
|
|
||||||
SYS_LINK = 9
|
|
||||||
SYS_UNLINK = 10
|
|
||||||
SYS_CHDIR = 12
|
|
||||||
SYS_FCHDIR = 13
|
|
||||||
SYS_MKNOD = 14
|
|
||||||
SYS_CHMOD = 15
|
|
||||||
SYS_CHOWN = 16
|
|
||||||
SYS_GETFSSTAT = 18
|
|
||||||
SYS_GETPID = 20
|
|
||||||
SYS_SETUID = 23
|
|
||||||
SYS_GETUID = 24
|
|
||||||
SYS_GETEUID = 25
|
|
||||||
SYS_PTRACE = 26
|
|
||||||
SYS_RECVMSG = 27
|
|
||||||
SYS_SENDMSG = 28
|
|
||||||
SYS_RECVFROM = 29
|
|
||||||
SYS_ACCEPT = 30
|
|
||||||
SYS_GETPEERNAME = 31
|
|
||||||
SYS_GETSOCKNAME = 32
|
|
||||||
SYS_ACCESS = 33
|
|
||||||
SYS_CHFLAGS = 34
|
|
||||||
SYS_FCHFLAGS = 35
|
|
||||||
SYS_SYNC = 36
|
|
||||||
SYS_KILL = 37
|
|
||||||
SYS_GETPPID = 39
|
|
||||||
SYS_DUP = 41
|
|
||||||
SYS_PIPE = 42
|
|
||||||
SYS_GETEGID = 43
|
|
||||||
SYS_SIGACTION = 46
|
|
||||||
SYS_GETGID = 47
|
|
||||||
SYS_SIGPROCMASK = 48
|
|
||||||
SYS_GETLOGIN = 49
|
|
||||||
SYS_SETLOGIN = 50
|
|
||||||
SYS_ACCT = 51
|
|
||||||
SYS_SIGPENDING = 52
|
|
||||||
SYS_SIGALTSTACK = 53
|
|
||||||
SYS_IOCTL = 54
|
|
||||||
SYS_REBOOT = 55
|
|
||||||
SYS_REVOKE = 56
|
|
||||||
SYS_SYMLINK = 57
|
|
||||||
SYS_READLINK = 58
|
|
||||||
SYS_EXECVE = 59
|
|
||||||
SYS_UMASK = 60
|
|
||||||
SYS_CHROOT = 61
|
|
||||||
SYS_MSYNC = 65
|
|
||||||
SYS_VFORK = 66
|
|
||||||
SYS_MUNMAP = 73
|
|
||||||
SYS_MPROTECT = 74
|
|
||||||
SYS_MADVISE = 75
|
|
||||||
SYS_MINCORE = 78
|
|
||||||
SYS_GETGROUPS = 79
|
|
||||||
SYS_SETGROUPS = 80
|
|
||||||
SYS_GETPGRP = 81
|
|
||||||
SYS_SETPGID = 82
|
|
||||||
SYS_SETITIMER = 83
|
|
||||||
SYS_SWAPON = 85
|
|
||||||
SYS_GETITIMER = 86
|
|
||||||
SYS_GETDTABLESIZE = 89
|
|
||||||
SYS_DUP2 = 90
|
|
||||||
SYS_FCNTL = 92
|
|
||||||
SYS_SELECT = 93
|
|
||||||
SYS_FSYNC = 95
|
|
||||||
SYS_SETPRIORITY = 96
|
|
||||||
SYS_SOCKET = 97
|
|
||||||
SYS_CONNECT = 98
|
|
||||||
SYS_GETPRIORITY = 100
|
|
||||||
SYS_BIND = 104
|
|
||||||
SYS_SETSOCKOPT = 105
|
|
||||||
SYS_LISTEN = 106
|
|
||||||
SYS_SIGSUSPEND = 111
|
|
||||||
SYS_GETTIMEOFDAY = 116
|
|
||||||
SYS_GETRUSAGE = 117
|
|
||||||
SYS_GETSOCKOPT = 118
|
|
||||||
SYS_READV = 120
|
|
||||||
SYS_WRITEV = 121
|
|
||||||
SYS_SETTIMEOFDAY = 122
|
|
||||||
SYS_FCHOWN = 123
|
|
||||||
SYS_FCHMOD = 124
|
|
||||||
SYS_SETREUID = 126
|
|
||||||
SYS_SETREGID = 127
|
|
||||||
SYS_RENAME = 128
|
|
||||||
SYS_FLOCK = 131
|
|
||||||
SYS_MKFIFO = 132
|
|
||||||
SYS_SENDTO = 133
|
|
||||||
SYS_SHUTDOWN = 134
|
|
||||||
SYS_SOCKETPAIR = 135
|
|
||||||
SYS_MKDIR = 136
|
|
||||||
SYS_RMDIR = 137
|
|
||||||
SYS_UTIMES = 138
|
|
||||||
SYS_FUTIMES = 139
|
|
||||||
SYS_ADJTIME = 140
|
|
||||||
SYS_GETHOSTUUID = 142
|
|
||||||
SYS_SETSID = 147
|
|
||||||
SYS_GETPGID = 151
|
|
||||||
SYS_SETPRIVEXEC = 152
|
|
||||||
SYS_PREAD = 153
|
|
||||||
SYS_PWRITE = 154
|
|
||||||
SYS_NFSSVC = 155
|
|
||||||
SYS_STATFS = 157
|
|
||||||
SYS_FSTATFS = 158
|
|
||||||
SYS_UNMOUNT = 159
|
|
||||||
SYS_GETFH = 161
|
|
||||||
SYS_QUOTACTL = 165
|
|
||||||
SYS_MOUNT = 167
|
|
||||||
SYS_CSOPS = 169
|
|
||||||
SYS_CSOPS_AUDITTOKEN = 170
|
|
||||||
SYS_WAITID = 173
|
|
||||||
SYS_KDEBUG_TYPEFILTER = 177
|
|
||||||
SYS_KDEBUG_TRACE_STRING = 178
|
|
||||||
SYS_KDEBUG_TRACE64 = 179
|
|
||||||
SYS_KDEBUG_TRACE = 180
|
|
||||||
SYS_SETGID = 181
|
|
||||||
SYS_SETEGID = 182
|
|
||||||
SYS_SETEUID = 183
|
|
||||||
SYS_SIGRETURN = 184
|
|
||||||
SYS_THREAD_SELFCOUNTS = 186
|
|
||||||
SYS_FDATASYNC = 187
|
|
||||||
SYS_STAT = 188
|
|
||||||
SYS_FSTAT = 189
|
|
||||||
SYS_LSTAT = 190
|
|
||||||
SYS_PATHCONF = 191
|
|
||||||
SYS_FPATHCONF = 192
|
|
||||||
SYS_GETRLIMIT = 194
|
|
||||||
SYS_SETRLIMIT = 195
|
|
||||||
SYS_GETDIRENTRIES = 196
|
|
||||||
SYS_MMAP = 197
|
|
||||||
SYS_LSEEK = 199
|
|
||||||
SYS_TRUNCATE = 200
|
|
||||||
SYS_FTRUNCATE = 201
|
|
||||||
SYS_SYSCTL = 202
|
|
||||||
SYS_MLOCK = 203
|
|
||||||
SYS_MUNLOCK = 204
|
|
||||||
SYS_UNDELETE = 205
|
|
||||||
SYS_OPEN_DPROTECTED_NP = 216
|
|
||||||
SYS_GETATTRLIST = 220
|
|
||||||
SYS_SETATTRLIST = 221
|
|
||||||
SYS_GETDIRENTRIESATTR = 222
|
|
||||||
SYS_EXCHANGEDATA = 223
|
|
||||||
SYS_SEARCHFS = 225
|
|
||||||
SYS_DELETE = 226
|
|
||||||
SYS_COPYFILE = 227
|
|
||||||
SYS_FGETATTRLIST = 228
|
|
||||||
SYS_FSETATTRLIST = 229
|
|
||||||
SYS_POLL = 230
|
|
||||||
SYS_WATCHEVENT = 231
|
|
||||||
SYS_WAITEVENT = 232
|
|
||||||
SYS_MODWATCH = 233
|
|
||||||
SYS_GETXATTR = 234
|
|
||||||
SYS_FGETXATTR = 235
|
|
||||||
SYS_SETXATTR = 236
|
|
||||||
SYS_FSETXATTR = 237
|
|
||||||
SYS_REMOVEXATTR = 238
|
|
||||||
SYS_FREMOVEXATTR = 239
|
|
||||||
SYS_LISTXATTR = 240
|
|
||||||
SYS_FLISTXATTR = 241
|
|
||||||
SYS_FSCTL = 242
|
|
||||||
SYS_INITGROUPS = 243
|
|
||||||
SYS_POSIX_SPAWN = 244
|
|
||||||
SYS_FFSCTL = 245
|
|
||||||
SYS_NFSCLNT = 247
|
|
||||||
SYS_FHOPEN = 248
|
|
||||||
SYS_MINHERIT = 250
|
|
||||||
SYS_SEMSYS = 251
|
|
||||||
SYS_MSGSYS = 252
|
|
||||||
SYS_SHMSYS = 253
|
|
||||||
SYS_SEMCTL = 254
|
|
||||||
SYS_SEMGET = 255
|
|
||||||
SYS_SEMOP = 256
|
|
||||||
SYS_MSGCTL = 258
|
|
||||||
SYS_MSGGET = 259
|
|
||||||
SYS_MSGSND = 260
|
|
||||||
SYS_MSGRCV = 261
|
|
||||||
SYS_SHMAT = 262
|
|
||||||
SYS_SHMCTL = 263
|
|
||||||
SYS_SHMDT = 264
|
|
||||||
SYS_SHMGET = 265
|
|
||||||
SYS_SHM_OPEN = 266
|
|
||||||
SYS_SHM_UNLINK = 267
|
|
||||||
SYS_SEM_OPEN = 268
|
|
||||||
SYS_SEM_CLOSE = 269
|
|
||||||
SYS_SEM_UNLINK = 270
|
|
||||||
SYS_SEM_WAIT = 271
|
|
||||||
SYS_SEM_TRYWAIT = 272
|
|
||||||
SYS_SEM_POST = 273
|
|
||||||
SYS_SYSCTLBYNAME = 274
|
|
||||||
SYS_OPEN_EXTENDED = 277
|
|
||||||
SYS_UMASK_EXTENDED = 278
|
|
||||||
SYS_STAT_EXTENDED = 279
|
|
||||||
SYS_LSTAT_EXTENDED = 280
|
|
||||||
SYS_FSTAT_EXTENDED = 281
|
|
||||||
SYS_CHMOD_EXTENDED = 282
|
|
||||||
SYS_FCHMOD_EXTENDED = 283
|
|
||||||
SYS_ACCESS_EXTENDED = 284
|
|
||||||
SYS_SETTID = 285
|
|
||||||
SYS_GETTID = 286
|
|
||||||
SYS_SETSGROUPS = 287
|
|
||||||
SYS_GETSGROUPS = 288
|
|
||||||
SYS_SETWGROUPS = 289
|
|
||||||
SYS_GETWGROUPS = 290
|
|
||||||
SYS_MKFIFO_EXTENDED = 291
|
|
||||||
SYS_MKDIR_EXTENDED = 292
|
|
||||||
SYS_IDENTITYSVC = 293
|
|
||||||
SYS_SHARED_REGION_CHECK_NP = 294
|
|
||||||
SYS_VM_PRESSURE_MONITOR = 296
|
|
||||||
SYS_PSYNCH_RW_LONGRDLOCK = 297
|
|
||||||
SYS_PSYNCH_RW_YIELDWRLOCK = 298
|
|
||||||
SYS_PSYNCH_RW_DOWNGRADE = 299
|
|
||||||
SYS_PSYNCH_RW_UPGRADE = 300
|
|
||||||
SYS_PSYNCH_MUTEXWAIT = 301
|
|
||||||
SYS_PSYNCH_MUTEXDROP = 302
|
|
||||||
SYS_PSYNCH_CVBROAD = 303
|
|
||||||
SYS_PSYNCH_CVSIGNAL = 304
|
|
||||||
SYS_PSYNCH_CVWAIT = 305
|
|
||||||
SYS_PSYNCH_RW_RDLOCK = 306
|
|
||||||
SYS_PSYNCH_RW_WRLOCK = 307
|
|
||||||
SYS_PSYNCH_RW_UNLOCK = 308
|
|
||||||
SYS_PSYNCH_RW_UNLOCK2 = 309
|
|
||||||
SYS_GETSID = 310
|
|
||||||
SYS_SETTID_WITH_PID = 311
|
|
||||||
SYS_PSYNCH_CVCLRPREPOST = 312
|
|
||||||
SYS_AIO_FSYNC = 313
|
|
||||||
SYS_AIO_RETURN = 314
|
|
||||||
SYS_AIO_SUSPEND = 315
|
|
||||||
SYS_AIO_CANCEL = 316
|
|
||||||
SYS_AIO_ERROR = 317
|
|
||||||
SYS_AIO_READ = 318
|
|
||||||
SYS_AIO_WRITE = 319
|
|
||||||
SYS_LIO_LISTIO = 320
|
|
||||||
SYS_IOPOLICYSYS = 322
|
|
||||||
SYS_PROCESS_POLICY = 323
|
|
||||||
SYS_MLOCKALL = 324
|
|
||||||
SYS_MUNLOCKALL = 325
|
|
||||||
SYS_ISSETUGID = 327
|
|
||||||
SYS___PTHREAD_KILL = 328
|
|
||||||
SYS___PTHREAD_SIGMASK = 329
|
|
||||||
SYS___SIGWAIT = 330
|
|
||||||
SYS___DISABLE_THREADSIGNAL = 331
|
|
||||||
SYS___PTHREAD_MARKCANCEL = 332
|
|
||||||
SYS___PTHREAD_CANCELED = 333
|
|
||||||
SYS___SEMWAIT_SIGNAL = 334
|
|
||||||
SYS_PROC_INFO = 336
|
|
||||||
SYS_SENDFILE = 337
|
|
||||||
SYS_STAT64 = 338
|
|
||||||
SYS_FSTAT64 = 339
|
|
||||||
SYS_LSTAT64 = 340
|
|
||||||
SYS_STAT64_EXTENDED = 341
|
|
||||||
SYS_LSTAT64_EXTENDED = 342
|
|
||||||
SYS_FSTAT64_EXTENDED = 343
|
|
||||||
SYS_GETDIRENTRIES64 = 344
|
|
||||||
SYS_STATFS64 = 345
|
|
||||||
SYS_FSTATFS64 = 346
|
|
||||||
SYS_GETFSSTAT64 = 347
|
|
||||||
SYS___PTHREAD_CHDIR = 348
|
|
||||||
SYS___PTHREAD_FCHDIR = 349
|
|
||||||
SYS_AUDIT = 350
|
|
||||||
SYS_AUDITON = 351
|
|
||||||
SYS_GETAUID = 353
|
|
||||||
SYS_SETAUID = 354
|
|
||||||
SYS_GETAUDIT_ADDR = 357
|
|
||||||
SYS_SETAUDIT_ADDR = 358
|
|
||||||
SYS_AUDITCTL = 359
|
|
||||||
SYS_BSDTHREAD_CREATE = 360
|
|
||||||
SYS_BSDTHREAD_TERMINATE = 361
|
|
||||||
SYS_KQUEUE = 362
|
|
||||||
SYS_KEVENT = 363
|
|
||||||
SYS_LCHOWN = 364
|
|
||||||
SYS_BSDTHREAD_REGISTER = 366
|
|
||||||
SYS_WORKQ_OPEN = 367
|
|
||||||
SYS_WORKQ_KERNRETURN = 368
|
|
||||||
SYS_KEVENT64 = 369
|
|
||||||
SYS___OLD_SEMWAIT_SIGNAL = 370
|
|
||||||
SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371
|
|
||||||
SYS_THREAD_SELFID = 372
|
|
||||||
SYS_LEDGER = 373
|
|
||||||
SYS_KEVENT_QOS = 374
|
|
||||||
SYS_KEVENT_ID = 375
|
|
||||||
SYS___MAC_EXECVE = 380
|
|
||||||
SYS___MAC_SYSCALL = 381
|
|
||||||
SYS___MAC_GET_FILE = 382
|
|
||||||
SYS___MAC_SET_FILE = 383
|
|
||||||
SYS___MAC_GET_LINK = 384
|
|
||||||
SYS___MAC_SET_LINK = 385
|
|
||||||
SYS___MAC_GET_PROC = 386
|
|
||||||
SYS___MAC_SET_PROC = 387
|
|
||||||
SYS___MAC_GET_FD = 388
|
|
||||||
SYS___MAC_SET_FD = 389
|
|
||||||
SYS___MAC_GET_PID = 390
|
|
||||||
SYS_PSELECT = 394
|
|
||||||
SYS_PSELECT_NOCANCEL = 395
|
|
||||||
SYS_READ_NOCANCEL = 396
|
|
||||||
SYS_WRITE_NOCANCEL = 397
|
|
||||||
SYS_OPEN_NOCANCEL = 398
|
|
||||||
SYS_CLOSE_NOCANCEL = 399
|
|
||||||
SYS_WAIT4_NOCANCEL = 400
|
|
||||||
SYS_RECVMSG_NOCANCEL = 401
|
|
||||||
SYS_SENDMSG_NOCANCEL = 402
|
|
||||||
SYS_RECVFROM_NOCANCEL = 403
|
|
||||||
SYS_ACCEPT_NOCANCEL = 404
|
|
||||||
SYS_MSYNC_NOCANCEL = 405
|
|
||||||
SYS_FCNTL_NOCANCEL = 406
|
|
||||||
SYS_SELECT_NOCANCEL = 407
|
|
||||||
SYS_FSYNC_NOCANCEL = 408
|
|
||||||
SYS_CONNECT_NOCANCEL = 409
|
|
||||||
SYS_SIGSUSPEND_NOCANCEL = 410
|
|
||||||
SYS_READV_NOCANCEL = 411
|
|
||||||
SYS_WRITEV_NOCANCEL = 412
|
|
||||||
SYS_SENDTO_NOCANCEL = 413
|
|
||||||
SYS_PREAD_NOCANCEL = 414
|
|
||||||
SYS_PWRITE_NOCANCEL = 415
|
|
||||||
SYS_WAITID_NOCANCEL = 416
|
|
||||||
SYS_POLL_NOCANCEL = 417
|
|
||||||
SYS_MSGSND_NOCANCEL = 418
|
|
||||||
SYS_MSGRCV_NOCANCEL = 419
|
|
||||||
SYS_SEM_WAIT_NOCANCEL = 420
|
|
||||||
SYS_AIO_SUSPEND_NOCANCEL = 421
|
|
||||||
SYS___SIGWAIT_NOCANCEL = 422
|
|
||||||
SYS___SEMWAIT_SIGNAL_NOCANCEL = 423
|
|
||||||
SYS___MAC_MOUNT = 424
|
|
||||||
SYS___MAC_GET_MOUNT = 425
|
|
||||||
SYS___MAC_GETFSSTAT = 426
|
|
||||||
SYS_FSGETPATH = 427
|
|
||||||
SYS_AUDIT_SESSION_SELF = 428
|
|
||||||
SYS_AUDIT_SESSION_JOIN = 429
|
|
||||||
SYS_FILEPORT_MAKEPORT = 430
|
|
||||||
SYS_FILEPORT_MAKEFD = 431
|
|
||||||
SYS_AUDIT_SESSION_PORT = 432
|
|
||||||
SYS_PID_SUSPEND = 433
|
|
||||||
SYS_PID_RESUME = 434
|
|
||||||
SYS_PID_HIBERNATE = 435
|
|
||||||
SYS_PID_SHUTDOWN_SOCKETS = 436
|
|
||||||
SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438
|
|
||||||
SYS_KAS_INFO = 439
|
|
||||||
SYS_MEMORYSTATUS_CONTROL = 440
|
|
||||||
SYS_GUARDED_OPEN_NP = 441
|
|
||||||
SYS_GUARDED_CLOSE_NP = 442
|
|
||||||
SYS_GUARDED_KQUEUE_NP = 443
|
|
||||||
SYS_CHANGE_FDGUARD_NP = 444
|
|
||||||
SYS_USRCTL = 445
|
|
||||||
SYS_PROC_RLIMIT_CONTROL = 446
|
|
||||||
SYS_CONNECTX = 447
|
|
||||||
SYS_DISCONNECTX = 448
|
|
||||||
SYS_PEELOFF = 449
|
|
||||||
SYS_SOCKET_DELEGATE = 450
|
|
||||||
SYS_TELEMETRY = 451
|
|
||||||
SYS_PROC_UUID_POLICY = 452
|
|
||||||
SYS_MEMORYSTATUS_GET_LEVEL = 453
|
|
||||||
SYS_SYSTEM_OVERRIDE = 454
|
|
||||||
SYS_VFS_PURGE = 455
|
|
||||||
SYS_SFI_CTL = 456
|
|
||||||
SYS_SFI_PIDCTL = 457
|
|
||||||
SYS_COALITION = 458
|
|
||||||
SYS_COALITION_INFO = 459
|
|
||||||
SYS_NECP_MATCH_POLICY = 460
|
|
||||||
SYS_GETATTRLISTBULK = 461
|
|
||||||
SYS_CLONEFILEAT = 462
|
|
||||||
SYS_OPENAT = 463
|
|
||||||
SYS_OPENAT_NOCANCEL = 464
|
|
||||||
SYS_RENAMEAT = 465
|
|
||||||
SYS_FACCESSAT = 466
|
|
||||||
SYS_FCHMODAT = 467
|
|
||||||
SYS_FCHOWNAT = 468
|
|
||||||
SYS_FSTATAT = 469
|
|
||||||
SYS_FSTATAT64 = 470
|
|
||||||
SYS_LINKAT = 471
|
|
||||||
SYS_UNLINKAT = 472
|
|
||||||
SYS_READLINKAT = 473
|
|
||||||
SYS_SYMLINKAT = 474
|
|
||||||
SYS_MKDIRAT = 475
|
|
||||||
SYS_GETATTRLISTAT = 476
|
|
||||||
SYS_PROC_TRACE_LOG = 477
|
|
||||||
SYS_BSDTHREAD_CTL = 478
|
|
||||||
SYS_OPENBYID_NP = 479
|
|
||||||
SYS_RECVMSG_X = 480
|
|
||||||
SYS_SENDMSG_X = 481
|
|
||||||
SYS_THREAD_SELFUSAGE = 482
|
|
||||||
SYS_CSRCTL = 483
|
|
||||||
SYS_GUARDED_OPEN_DPROTECTED_NP = 484
|
|
||||||
SYS_GUARDED_WRITE_NP = 485
|
|
||||||
SYS_GUARDED_PWRITE_NP = 486
|
|
||||||
SYS_GUARDED_WRITEV_NP = 487
|
|
||||||
SYS_RENAMEATX_NP = 488
|
|
||||||
SYS_MREMAP_ENCRYPTED = 489
|
|
||||||
SYS_NETAGENT_TRIGGER = 490
|
|
||||||
SYS_STACK_SNAPSHOT_WITH_CONFIG = 491
|
|
||||||
SYS_MICROSTACKSHOT = 492
|
|
||||||
SYS_GRAB_PGO_DATA = 493
|
|
||||||
SYS_PERSONA = 494
|
|
||||||
SYS_WORK_INTERVAL_CTL = 499
|
|
||||||
SYS_GETENTROPY = 500
|
|
||||||
SYS_NECP_OPEN = 501
|
|
||||||
SYS_NECP_CLIENT_ACTION = 502
|
|
||||||
SYS___NEXUS_OPEN = 503
|
|
||||||
SYS___NEXUS_REGISTER = 504
|
|
||||||
SYS___NEXUS_DEREGISTER = 505
|
|
||||||
SYS___NEXUS_CREATE = 506
|
|
||||||
SYS___NEXUS_DESTROY = 507
|
|
||||||
SYS___NEXUS_GET_OPT = 508
|
|
||||||
SYS___NEXUS_SET_OPT = 509
|
|
||||||
SYS___CHANNEL_OPEN = 510
|
|
||||||
SYS___CHANNEL_GET_INFO = 511
|
|
||||||
SYS___CHANNEL_SYNC = 512
|
|
||||||
SYS___CHANNEL_GET_OPT = 513
|
|
||||||
SYS___CHANNEL_SET_OPT = 514
|
|
||||||
SYS_ULOCK_WAIT = 515
|
|
||||||
SYS_ULOCK_WAKE = 516
|
|
||||||
SYS_FCLONEFILEAT = 517
|
|
||||||
SYS_FS_SNAPSHOT = 518
|
|
||||||
SYS_TERMINATE_WITH_PAYLOAD = 520
|
|
||||||
SYS_ABORT_WITH_PAYLOAD = 521
|
|
||||||
SYS_NECP_SESSION_OPEN = 522
|
|
||||||
SYS_NECP_SESSION_ACTION = 523
|
|
||||||
SYS_SETATTRLISTAT = 524
|
|
||||||
SYS_NET_QOS_GUIDELINE = 525
|
|
||||||
SYS_FMOUNT = 526
|
|
||||||
SYS_NTP_ADJTIME = 527
|
|
||||||
SYS_NTP_GETTIME = 528
|
|
||||||
SYS_OS_FAULT_WITH_PAYLOAD = 529
|
|
||||||
SYS_MAXSYSCALL = 530
|
|
||||||
SYS_INVALID = 63
|
|
||||||
)
|
|
||||||
=======
|
|
||||||
// go run mksysnum.go /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/sys/syscall.h
|
// go run mksysnum.go /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/sys/syscall.h
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
|
|
@ -874,4 +436,3 @@ const (
|
||||||
SYS_MAXSYSCALL = 530
|
SYS_MAXSYSCALL = 530
|
||||||
SYS_INVALID = 63
|
SYS_INVALID = 63
|
||||||
)
|
)
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,443 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// go run mksysnum.go /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/sys/syscall.h
|
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
|
||||||
|
|
||||||
// +build amd64,darwin
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
const (
|
|
||||||
SYS_SYSCALL = 0
|
|
||||||
SYS_EXIT = 1
|
|
||||||
SYS_FORK = 2
|
|
||||||
SYS_READ = 3
|
|
||||||
SYS_WRITE = 4
|
|
||||||
SYS_OPEN = 5
|
|
||||||
SYS_CLOSE = 6
|
|
||||||
SYS_WAIT4 = 7
|
|
||||||
SYS_LINK = 9
|
|
||||||
SYS_UNLINK = 10
|
|
||||||
SYS_CHDIR = 12
|
|
||||||
SYS_FCHDIR = 13
|
|
||||||
SYS_MKNOD = 14
|
|
||||||
SYS_CHMOD = 15
|
|
||||||
SYS_CHOWN = 16
|
|
||||||
SYS_GETFSSTAT = 18
|
|
||||||
SYS_GETPID = 20
|
|
||||||
SYS_SETUID = 23
|
|
||||||
SYS_GETUID = 24
|
|
||||||
SYS_GETEUID = 25
|
|
||||||
SYS_PTRACE = 26
|
|
||||||
SYS_RECVMSG = 27
|
|
||||||
SYS_SENDMSG = 28
|
|
||||||
SYS_RECVFROM = 29
|
|
||||||
SYS_ACCEPT = 30
|
|
||||||
SYS_GETPEERNAME = 31
|
|
||||||
SYS_GETSOCKNAME = 32
|
|
||||||
SYS_ACCESS = 33
|
|
||||||
SYS_CHFLAGS = 34
|
|
||||||
SYS_FCHFLAGS = 35
|
|
||||||
SYS_SYNC = 36
|
|
||||||
SYS_KILL = 37
|
|
||||||
SYS_GETPPID = 39
|
|
||||||
SYS_DUP = 41
|
|
||||||
SYS_PIPE = 42
|
|
||||||
SYS_GETEGID = 43
|
|
||||||
SYS_SIGACTION = 46
|
|
||||||
SYS_GETGID = 47
|
|
||||||
SYS_SIGPROCMASK = 48
|
|
||||||
SYS_GETLOGIN = 49
|
|
||||||
SYS_SETLOGIN = 50
|
|
||||||
SYS_ACCT = 51
|
|
||||||
SYS_SIGPENDING = 52
|
|
||||||
SYS_SIGALTSTACK = 53
|
|
||||||
SYS_IOCTL = 54
|
|
||||||
SYS_REBOOT = 55
|
|
||||||
SYS_REVOKE = 56
|
|
||||||
SYS_SYMLINK = 57
|
|
||||||
SYS_READLINK = 58
|
|
||||||
SYS_EXECVE = 59
|
|
||||||
SYS_UMASK = 60
|
|
||||||
SYS_CHROOT = 61
|
|
||||||
SYS_MSYNC = 65
|
|
||||||
SYS_VFORK = 66
|
|
||||||
SYS_MUNMAP = 73
|
|
||||||
SYS_MPROTECT = 74
|
|
||||||
SYS_MADVISE = 75
|
|
||||||
SYS_MINCORE = 78
|
|
||||||
SYS_GETGROUPS = 79
|
|
||||||
SYS_SETGROUPS = 80
|
|
||||||
SYS_GETPGRP = 81
|
|
||||||
SYS_SETPGID = 82
|
|
||||||
SYS_SETITIMER = 83
|
|
||||||
SYS_SWAPON = 85
|
|
||||||
SYS_GETITIMER = 86
|
|
||||||
SYS_GETDTABLESIZE = 89
|
|
||||||
SYS_DUP2 = 90
|
|
||||||
SYS_FCNTL = 92
|
|
||||||
SYS_SELECT = 93
|
|
||||||
SYS_FSYNC = 95
|
|
||||||
SYS_SETPRIORITY = 96
|
|
||||||
SYS_SOCKET = 97
|
|
||||||
SYS_CONNECT = 98
|
|
||||||
SYS_GETPRIORITY = 100
|
|
||||||
SYS_BIND = 104
|
|
||||||
SYS_SETSOCKOPT = 105
|
|
||||||
SYS_LISTEN = 106
|
|
||||||
SYS_SIGSUSPEND = 111
|
|
||||||
SYS_GETTIMEOFDAY = 116
|
|
||||||
SYS_GETRUSAGE = 117
|
|
||||||
SYS_GETSOCKOPT = 118
|
|
||||||
SYS_READV = 120
|
|
||||||
SYS_WRITEV = 121
|
|
||||||
SYS_SETTIMEOFDAY = 122
|
|
||||||
SYS_FCHOWN = 123
|
|
||||||
SYS_FCHMOD = 124
|
|
||||||
SYS_SETREUID = 126
|
|
||||||
SYS_SETREGID = 127
|
|
||||||
SYS_RENAME = 128
|
|
||||||
SYS_FLOCK = 131
|
|
||||||
SYS_MKFIFO = 132
|
|
||||||
SYS_SENDTO = 133
|
|
||||||
SYS_SHUTDOWN = 134
|
|
||||||
SYS_SOCKETPAIR = 135
|
|
||||||
SYS_MKDIR = 136
|
|
||||||
SYS_RMDIR = 137
|
|
||||||
SYS_UTIMES = 138
|
|
||||||
SYS_FUTIMES = 139
|
|
||||||
SYS_ADJTIME = 140
|
|
||||||
SYS_GETHOSTUUID = 142
|
|
||||||
SYS_SETSID = 147
|
|
||||||
SYS_GETPGID = 151
|
|
||||||
SYS_SETPRIVEXEC = 152
|
|
||||||
SYS_PREAD = 153
|
|
||||||
SYS_PWRITE = 154
|
|
||||||
SYS_NFSSVC = 155
|
|
||||||
SYS_STATFS = 157
|
|
||||||
SYS_FSTATFS = 158
|
|
||||||
SYS_UNMOUNT = 159
|
|
||||||
SYS_GETFH = 161
|
|
||||||
SYS_QUOTACTL = 165
|
|
||||||
SYS_MOUNT = 167
|
|
||||||
SYS_CSOPS = 169
|
|
||||||
SYS_CSOPS_AUDITTOKEN = 170
|
|
||||||
SYS_WAITID = 173
|
|
||||||
SYS_KDEBUG_TYPEFILTER = 177
|
|
||||||
SYS_KDEBUG_TRACE_STRING = 178
|
|
||||||
SYS_KDEBUG_TRACE64 = 179
|
|
||||||
SYS_KDEBUG_TRACE = 180
|
|
||||||
SYS_SETGID = 181
|
|
||||||
SYS_SETEGID = 182
|
|
||||||
SYS_SETEUID = 183
|
|
||||||
SYS_SIGRETURN = 184
|
|
||||||
SYS_THREAD_SELFCOUNTS = 186
|
|
||||||
SYS_FDATASYNC = 187
|
|
||||||
SYS_STAT = 188
|
|
||||||
SYS_FSTAT = 189
|
|
||||||
SYS_LSTAT = 190
|
|
||||||
SYS_PATHCONF = 191
|
|
||||||
SYS_FPATHCONF = 192
|
|
||||||
SYS_GETRLIMIT = 194
|
|
||||||
SYS_SETRLIMIT = 195
|
|
||||||
SYS_GETDIRENTRIES = 196
|
|
||||||
SYS_MMAP = 197
|
|
||||||
SYS_LSEEK = 199
|
|
||||||
SYS_TRUNCATE = 200
|
|
||||||
SYS_FTRUNCATE = 201
|
|
||||||
SYS_SYSCTL = 202
|
|
||||||
SYS_MLOCK = 203
|
|
||||||
SYS_MUNLOCK = 204
|
|
||||||
SYS_UNDELETE = 205
|
|
||||||
SYS_OPEN_DPROTECTED_NP = 216
|
|
||||||
SYS_GETATTRLIST = 220
|
|
||||||
SYS_SETATTRLIST = 221
|
|
||||||
SYS_GETDIRENTRIESATTR = 222
|
|
||||||
SYS_EXCHANGEDATA = 223
|
|
||||||
SYS_SEARCHFS = 225
|
|
||||||
SYS_DELETE = 226
|
|
||||||
SYS_COPYFILE = 227
|
|
||||||
SYS_FGETATTRLIST = 228
|
|
||||||
SYS_FSETATTRLIST = 229
|
|
||||||
SYS_POLL = 230
|
|
||||||
SYS_WATCHEVENT = 231
|
|
||||||
SYS_WAITEVENT = 232
|
|
||||||
SYS_MODWATCH = 233
|
|
||||||
SYS_GETXATTR = 234
|
|
||||||
SYS_FGETXATTR = 235
|
|
||||||
SYS_SETXATTR = 236
|
|
||||||
SYS_FSETXATTR = 237
|
|
||||||
SYS_REMOVEXATTR = 238
|
|
||||||
SYS_FREMOVEXATTR = 239
|
|
||||||
SYS_LISTXATTR = 240
|
|
||||||
SYS_FLISTXATTR = 241
|
|
||||||
SYS_FSCTL = 242
|
|
||||||
SYS_INITGROUPS = 243
|
|
||||||
SYS_POSIX_SPAWN = 244
|
|
||||||
SYS_FFSCTL = 245
|
|
||||||
SYS_NFSCLNT = 247
|
|
||||||
SYS_FHOPEN = 248
|
|
||||||
SYS_MINHERIT = 250
|
|
||||||
SYS_SEMSYS = 251
|
|
||||||
SYS_MSGSYS = 252
|
|
||||||
SYS_SHMSYS = 253
|
|
||||||
SYS_SEMCTL = 254
|
|
||||||
SYS_SEMGET = 255
|
|
||||||
SYS_SEMOP = 256
|
|
||||||
SYS_MSGCTL = 258
|
|
||||||
SYS_MSGGET = 259
|
|
||||||
SYS_MSGSND = 260
|
|
||||||
SYS_MSGRCV = 261
|
|
||||||
SYS_SHMAT = 262
|
|
||||||
SYS_SHMCTL = 263
|
|
||||||
SYS_SHMDT = 264
|
|
||||||
SYS_SHMGET = 265
|
|
||||||
SYS_SHM_OPEN = 266
|
|
||||||
SYS_SHM_UNLINK = 267
|
|
||||||
SYS_SEM_OPEN = 268
|
|
||||||
SYS_SEM_CLOSE = 269
|
|
||||||
SYS_SEM_UNLINK = 270
|
|
||||||
SYS_SEM_WAIT = 271
|
|
||||||
SYS_SEM_TRYWAIT = 272
|
|
||||||
SYS_SEM_POST = 273
|
|
||||||
SYS_SYSCTLBYNAME = 274
|
|
||||||
SYS_OPEN_EXTENDED = 277
|
|
||||||
SYS_UMASK_EXTENDED = 278
|
|
||||||
SYS_STAT_EXTENDED = 279
|
|
||||||
SYS_LSTAT_EXTENDED = 280
|
|
||||||
SYS_FSTAT_EXTENDED = 281
|
|
||||||
SYS_CHMOD_EXTENDED = 282
|
|
||||||
SYS_FCHMOD_EXTENDED = 283
|
|
||||||
SYS_ACCESS_EXTENDED = 284
|
|
||||||
SYS_SETTID = 285
|
|
||||||
SYS_GETTID = 286
|
|
||||||
SYS_SETSGROUPS = 287
|
|
||||||
SYS_GETSGROUPS = 288
|
|
||||||
SYS_SETWGROUPS = 289
|
|
||||||
SYS_GETWGROUPS = 290
|
|
||||||
SYS_MKFIFO_EXTENDED = 291
|
|
||||||
SYS_MKDIR_EXTENDED = 292
|
|
||||||
SYS_IDENTITYSVC = 293
|
|
||||||
SYS_SHARED_REGION_CHECK_NP = 294
|
|
||||||
SYS_VM_PRESSURE_MONITOR = 296
|
|
||||||
SYS_PSYNCH_RW_LONGRDLOCK = 297
|
|
||||||
SYS_PSYNCH_RW_YIELDWRLOCK = 298
|
|
||||||
SYS_PSYNCH_RW_DOWNGRADE = 299
|
|
||||||
SYS_PSYNCH_RW_UPGRADE = 300
|
|
||||||
SYS_PSYNCH_MUTEXWAIT = 301
|
|
||||||
SYS_PSYNCH_MUTEXDROP = 302
|
|
||||||
SYS_PSYNCH_CVBROAD = 303
|
|
||||||
SYS_PSYNCH_CVSIGNAL = 304
|
|
||||||
SYS_PSYNCH_CVWAIT = 305
|
|
||||||
SYS_PSYNCH_RW_RDLOCK = 306
|
|
||||||
SYS_PSYNCH_RW_WRLOCK = 307
|
|
||||||
SYS_PSYNCH_RW_UNLOCK = 308
|
|
||||||
SYS_PSYNCH_RW_UNLOCK2 = 309
|
|
||||||
SYS_GETSID = 310
|
|
||||||
SYS_SETTID_WITH_PID = 311
|
|
||||||
SYS_PSYNCH_CVCLRPREPOST = 312
|
|
||||||
SYS_AIO_FSYNC = 313
|
|
||||||
SYS_AIO_RETURN = 314
|
|
||||||
SYS_AIO_SUSPEND = 315
|
|
||||||
SYS_AIO_CANCEL = 316
|
|
||||||
SYS_AIO_ERROR = 317
|
|
||||||
SYS_AIO_READ = 318
|
|
||||||
SYS_AIO_WRITE = 319
|
|
||||||
SYS_LIO_LISTIO = 320
|
|
||||||
SYS_IOPOLICYSYS = 322
|
|
||||||
SYS_PROCESS_POLICY = 323
|
|
||||||
SYS_MLOCKALL = 324
|
|
||||||
SYS_MUNLOCKALL = 325
|
|
||||||
SYS_ISSETUGID = 327
|
|
||||||
SYS___PTHREAD_KILL = 328
|
|
||||||
SYS___PTHREAD_SIGMASK = 329
|
|
||||||
SYS___SIGWAIT = 330
|
|
||||||
SYS___DISABLE_THREADSIGNAL = 331
|
|
||||||
SYS___PTHREAD_MARKCANCEL = 332
|
|
||||||
SYS___PTHREAD_CANCELED = 333
|
|
||||||
SYS___SEMWAIT_SIGNAL = 334
|
|
||||||
SYS_PROC_INFO = 336
|
|
||||||
SYS_SENDFILE = 337
|
|
||||||
SYS_STAT64 = 338
|
|
||||||
SYS_FSTAT64 = 339
|
|
||||||
SYS_LSTAT64 = 340
|
|
||||||
SYS_STAT64_EXTENDED = 341
|
|
||||||
SYS_LSTAT64_EXTENDED = 342
|
|
||||||
SYS_FSTAT64_EXTENDED = 343
|
|
||||||
SYS_GETDIRENTRIES64 = 344
|
|
||||||
SYS_STATFS64 = 345
|
|
||||||
SYS_FSTATFS64 = 346
|
|
||||||
SYS_GETFSSTAT64 = 347
|
|
||||||
SYS___PTHREAD_CHDIR = 348
|
|
||||||
SYS___PTHREAD_FCHDIR = 349
|
|
||||||
SYS_AUDIT = 350
|
|
||||||
SYS_AUDITON = 351
|
|
||||||
SYS_GETAUID = 353
|
|
||||||
SYS_SETAUID = 354
|
|
||||||
SYS_GETAUDIT_ADDR = 357
|
|
||||||
SYS_SETAUDIT_ADDR = 358
|
|
||||||
SYS_AUDITCTL = 359
|
|
||||||
SYS_BSDTHREAD_CREATE = 360
|
|
||||||
SYS_BSDTHREAD_TERMINATE = 361
|
|
||||||
SYS_KQUEUE = 362
|
|
||||||
SYS_KEVENT = 363
|
|
||||||
SYS_LCHOWN = 364
|
|
||||||
SYS_BSDTHREAD_REGISTER = 366
|
|
||||||
SYS_WORKQ_OPEN = 367
|
|
||||||
SYS_WORKQ_KERNRETURN = 368
|
|
||||||
SYS_KEVENT64 = 369
|
|
||||||
SYS___OLD_SEMWAIT_SIGNAL = 370
|
|
||||||
SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371
|
|
||||||
SYS_THREAD_SELFID = 372
|
|
||||||
SYS_LEDGER = 373
|
|
||||||
SYS_KEVENT_QOS = 374
|
|
||||||
SYS_KEVENT_ID = 375
|
|
||||||
SYS___MAC_EXECVE = 380
|
|
||||||
SYS___MAC_SYSCALL = 381
|
|
||||||
SYS___MAC_GET_FILE = 382
|
|
||||||
SYS___MAC_SET_FILE = 383
|
|
||||||
SYS___MAC_GET_LINK = 384
|
|
||||||
SYS___MAC_SET_LINK = 385
|
|
||||||
SYS___MAC_GET_PROC = 386
|
|
||||||
SYS___MAC_SET_PROC = 387
|
|
||||||
SYS___MAC_GET_FD = 388
|
|
||||||
SYS___MAC_SET_FD = 389
|
|
||||||
SYS___MAC_GET_PID = 390
|
|
||||||
SYS_PSELECT = 394
|
|
||||||
SYS_PSELECT_NOCANCEL = 395
|
|
||||||
SYS_READ_NOCANCEL = 396
|
|
||||||
SYS_WRITE_NOCANCEL = 397
|
|
||||||
SYS_OPEN_NOCANCEL = 398
|
|
||||||
SYS_CLOSE_NOCANCEL = 399
|
|
||||||
SYS_WAIT4_NOCANCEL = 400
|
|
||||||
SYS_RECVMSG_NOCANCEL = 401
|
|
||||||
SYS_SENDMSG_NOCANCEL = 402
|
|
||||||
SYS_RECVFROM_NOCANCEL = 403
|
|
||||||
SYS_ACCEPT_NOCANCEL = 404
|
|
||||||
SYS_MSYNC_NOCANCEL = 405
|
|
||||||
SYS_FCNTL_NOCANCEL = 406
|
|
||||||
SYS_SELECT_NOCANCEL = 407
|
|
||||||
SYS_FSYNC_NOCANCEL = 408
|
|
||||||
SYS_CONNECT_NOCANCEL = 409
|
|
||||||
SYS_SIGSUSPEND_NOCANCEL = 410
|
|
||||||
SYS_READV_NOCANCEL = 411
|
|
||||||
SYS_WRITEV_NOCANCEL = 412
|
|
||||||
SYS_SENDTO_NOCANCEL = 413
|
|
||||||
SYS_PREAD_NOCANCEL = 414
|
|
||||||
SYS_PWRITE_NOCANCEL = 415
|
|
||||||
SYS_WAITID_NOCANCEL = 416
|
|
||||||
SYS_POLL_NOCANCEL = 417
|
|
||||||
SYS_MSGSND_NOCANCEL = 418
|
|
||||||
SYS_MSGRCV_NOCANCEL = 419
|
|
||||||
SYS_SEM_WAIT_NOCANCEL = 420
|
|
||||||
SYS_AIO_SUSPEND_NOCANCEL = 421
|
|
||||||
SYS___SIGWAIT_NOCANCEL = 422
|
|
||||||
SYS___SEMWAIT_SIGNAL_NOCANCEL = 423
|
|
||||||
SYS___MAC_MOUNT = 424
|
|
||||||
SYS___MAC_GET_MOUNT = 425
|
|
||||||
SYS___MAC_GETFSSTAT = 426
|
|
||||||
SYS_FSGETPATH = 427
|
|
||||||
SYS_AUDIT_SESSION_SELF = 428
|
|
||||||
SYS_AUDIT_SESSION_JOIN = 429
|
|
||||||
SYS_FILEPORT_MAKEPORT = 430
|
|
||||||
SYS_FILEPORT_MAKEFD = 431
|
|
||||||
SYS_AUDIT_SESSION_PORT = 432
|
|
||||||
SYS_PID_SUSPEND = 433
|
|
||||||
SYS_PID_RESUME = 434
|
|
||||||
SYS_PID_HIBERNATE = 435
|
|
||||||
SYS_PID_SHUTDOWN_SOCKETS = 436
|
|
||||||
SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438
|
|
||||||
SYS_KAS_INFO = 439
|
|
||||||
SYS_MEMORYSTATUS_CONTROL = 440
|
|
||||||
SYS_GUARDED_OPEN_NP = 441
|
|
||||||
SYS_GUARDED_CLOSE_NP = 442
|
|
||||||
SYS_GUARDED_KQUEUE_NP = 443
|
|
||||||
SYS_CHANGE_FDGUARD_NP = 444
|
|
||||||
SYS_USRCTL = 445
|
|
||||||
SYS_PROC_RLIMIT_CONTROL = 446
|
|
||||||
SYS_CONNECTX = 447
|
|
||||||
SYS_DISCONNECTX = 448
|
|
||||||
SYS_PEELOFF = 449
|
|
||||||
SYS_SOCKET_DELEGATE = 450
|
|
||||||
SYS_TELEMETRY = 451
|
|
||||||
SYS_PROC_UUID_POLICY = 452
|
|
||||||
SYS_MEMORYSTATUS_GET_LEVEL = 453
|
|
||||||
SYS_SYSTEM_OVERRIDE = 454
|
|
||||||
SYS_VFS_PURGE = 455
|
|
||||||
SYS_SFI_CTL = 456
|
|
||||||
SYS_SFI_PIDCTL = 457
|
|
||||||
SYS_COALITION = 458
|
|
||||||
SYS_COALITION_INFO = 459
|
|
||||||
SYS_NECP_MATCH_POLICY = 460
|
|
||||||
SYS_GETATTRLISTBULK = 461
|
|
||||||
SYS_CLONEFILEAT = 462
|
|
||||||
SYS_OPENAT = 463
|
|
||||||
SYS_OPENAT_NOCANCEL = 464
|
|
||||||
SYS_RENAMEAT = 465
|
|
||||||
SYS_FACCESSAT = 466
|
|
||||||
SYS_FCHMODAT = 467
|
|
||||||
SYS_FCHOWNAT = 468
|
|
||||||
SYS_FSTATAT = 469
|
|
||||||
SYS_FSTATAT64 = 470
|
|
||||||
SYS_LINKAT = 471
|
|
||||||
SYS_UNLINKAT = 472
|
|
||||||
SYS_READLINKAT = 473
|
|
||||||
SYS_SYMLINKAT = 474
|
|
||||||
SYS_MKDIRAT = 475
|
|
||||||
SYS_GETATTRLISTAT = 476
|
|
||||||
SYS_PROC_TRACE_LOG = 477
|
|
||||||
SYS_BSDTHREAD_CTL = 478
|
|
||||||
SYS_OPENBYID_NP = 479
|
|
||||||
SYS_RECVMSG_X = 480
|
|
||||||
SYS_SENDMSG_X = 481
|
|
||||||
SYS_THREAD_SELFUSAGE = 482
|
|
||||||
SYS_CSRCTL = 483
|
|
||||||
SYS_GUARDED_OPEN_DPROTECTED_NP = 484
|
|
||||||
SYS_GUARDED_WRITE_NP = 485
|
|
||||||
SYS_GUARDED_PWRITE_NP = 486
|
|
||||||
SYS_GUARDED_WRITEV_NP = 487
|
|
||||||
SYS_RENAMEATX_NP = 488
|
|
||||||
SYS_MREMAP_ENCRYPTED = 489
|
|
||||||
SYS_NETAGENT_TRIGGER = 490
|
|
||||||
SYS_STACK_SNAPSHOT_WITH_CONFIG = 491
|
|
||||||
SYS_MICROSTACKSHOT = 492
|
|
||||||
SYS_GRAB_PGO_DATA = 493
|
|
||||||
SYS_PERSONA = 494
|
|
||||||
SYS_WORK_INTERVAL_CTL = 499
|
|
||||||
SYS_GETENTROPY = 500
|
|
||||||
SYS_NECP_OPEN = 501
|
|
||||||
SYS_NECP_CLIENT_ACTION = 502
|
|
||||||
SYS___NEXUS_OPEN = 503
|
|
||||||
SYS___NEXUS_REGISTER = 504
|
|
||||||
SYS___NEXUS_DEREGISTER = 505
|
|
||||||
SYS___NEXUS_CREATE = 506
|
|
||||||
SYS___NEXUS_DESTROY = 507
|
|
||||||
SYS___NEXUS_GET_OPT = 508
|
|
||||||
SYS___NEXUS_SET_OPT = 509
|
|
||||||
SYS___CHANNEL_OPEN = 510
|
|
||||||
SYS___CHANNEL_GET_INFO = 511
|
|
||||||
SYS___CHANNEL_SYNC = 512
|
|
||||||
SYS___CHANNEL_GET_OPT = 513
|
|
||||||
SYS___CHANNEL_SET_OPT = 514
|
|
||||||
SYS_ULOCK_WAIT = 515
|
|
||||||
SYS_ULOCK_WAKE = 516
|
|
||||||
SYS_FCLONEFILEAT = 517
|
|
||||||
SYS_FS_SNAPSHOT = 518
|
|
||||||
SYS_TERMINATE_WITH_PAYLOAD = 520
|
|
||||||
SYS_ABORT_WITH_PAYLOAD = 521
|
|
||||||
SYS_NECP_SESSION_OPEN = 522
|
|
||||||
SYS_NECP_SESSION_ACTION = 523
|
|
||||||
SYS_SETATTRLISTAT = 524
|
|
||||||
SYS_NET_QOS_GUIDELINE = 525
|
|
||||||
SYS_FMOUNT = 526
|
|
||||||
SYS_NTP_ADJTIME = 527
|
|
||||||
SYS_NTP_GETTIME = 528
|
|
||||||
SYS_OS_FAULT_WITH_PAYLOAD = 529
|
|
||||||
SYS_KQUEUE_WORKLOOP_CTL = 530
|
|
||||||
SYS___MACH_BRIDGE_REMOTE_TIME = 531
|
|
||||||
SYS_MAXSYSCALL = 532
|
|
||||||
SYS_INVALID = 63
|
|
||||||
)
|
|
||||||
=======
|
|
||||||
// go run mksysnum.go /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/sys/syscall.h
|
// go run mksysnum.go /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/sys/syscall.h
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
|
|
@ -878,4 +438,3 @@ const (
|
||||||
SYS_MAXSYSCALL = 532
|
SYS_MAXSYSCALL = 532
|
||||||
SYS_INVALID = 63
|
SYS_INVALID = 63
|
||||||
)
|
)
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,441 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// go run mksysnum.go /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h
|
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
|
||||||
|
|
||||||
// +build arm,darwin
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
const (
|
|
||||||
SYS_SYSCALL = 0
|
|
||||||
SYS_EXIT = 1
|
|
||||||
SYS_FORK = 2
|
|
||||||
SYS_READ = 3
|
|
||||||
SYS_WRITE = 4
|
|
||||||
SYS_OPEN = 5
|
|
||||||
SYS_CLOSE = 6
|
|
||||||
SYS_WAIT4 = 7
|
|
||||||
SYS_LINK = 9
|
|
||||||
SYS_UNLINK = 10
|
|
||||||
SYS_CHDIR = 12
|
|
||||||
SYS_FCHDIR = 13
|
|
||||||
SYS_MKNOD = 14
|
|
||||||
SYS_CHMOD = 15
|
|
||||||
SYS_CHOWN = 16
|
|
||||||
SYS_GETFSSTAT = 18
|
|
||||||
SYS_GETPID = 20
|
|
||||||
SYS_SETUID = 23
|
|
||||||
SYS_GETUID = 24
|
|
||||||
SYS_GETEUID = 25
|
|
||||||
SYS_PTRACE = 26
|
|
||||||
SYS_RECVMSG = 27
|
|
||||||
SYS_SENDMSG = 28
|
|
||||||
SYS_RECVFROM = 29
|
|
||||||
SYS_ACCEPT = 30
|
|
||||||
SYS_GETPEERNAME = 31
|
|
||||||
SYS_GETSOCKNAME = 32
|
|
||||||
SYS_ACCESS = 33
|
|
||||||
SYS_CHFLAGS = 34
|
|
||||||
SYS_FCHFLAGS = 35
|
|
||||||
SYS_SYNC = 36
|
|
||||||
SYS_KILL = 37
|
|
||||||
SYS_GETPPID = 39
|
|
||||||
SYS_DUP = 41
|
|
||||||
SYS_PIPE = 42
|
|
||||||
SYS_GETEGID = 43
|
|
||||||
SYS_SIGACTION = 46
|
|
||||||
SYS_GETGID = 47
|
|
||||||
SYS_SIGPROCMASK = 48
|
|
||||||
SYS_GETLOGIN = 49
|
|
||||||
SYS_SETLOGIN = 50
|
|
||||||
SYS_ACCT = 51
|
|
||||||
SYS_SIGPENDING = 52
|
|
||||||
SYS_SIGALTSTACK = 53
|
|
||||||
SYS_IOCTL = 54
|
|
||||||
SYS_REBOOT = 55
|
|
||||||
SYS_REVOKE = 56
|
|
||||||
SYS_SYMLINK = 57
|
|
||||||
SYS_READLINK = 58
|
|
||||||
SYS_EXECVE = 59
|
|
||||||
SYS_UMASK = 60
|
|
||||||
SYS_CHROOT = 61
|
|
||||||
SYS_MSYNC = 65
|
|
||||||
SYS_VFORK = 66
|
|
||||||
SYS_MUNMAP = 73
|
|
||||||
SYS_MPROTECT = 74
|
|
||||||
SYS_MADVISE = 75
|
|
||||||
SYS_MINCORE = 78
|
|
||||||
SYS_GETGROUPS = 79
|
|
||||||
SYS_SETGROUPS = 80
|
|
||||||
SYS_GETPGRP = 81
|
|
||||||
SYS_SETPGID = 82
|
|
||||||
SYS_SETITIMER = 83
|
|
||||||
SYS_SWAPON = 85
|
|
||||||
SYS_GETITIMER = 86
|
|
||||||
SYS_GETDTABLESIZE = 89
|
|
||||||
SYS_DUP2 = 90
|
|
||||||
SYS_FCNTL = 92
|
|
||||||
SYS_SELECT = 93
|
|
||||||
SYS_FSYNC = 95
|
|
||||||
SYS_SETPRIORITY = 96
|
|
||||||
SYS_SOCKET = 97
|
|
||||||
SYS_CONNECT = 98
|
|
||||||
SYS_GETPRIORITY = 100
|
|
||||||
SYS_BIND = 104
|
|
||||||
SYS_SETSOCKOPT = 105
|
|
||||||
SYS_LISTEN = 106
|
|
||||||
SYS_SIGSUSPEND = 111
|
|
||||||
SYS_GETTIMEOFDAY = 116
|
|
||||||
SYS_GETRUSAGE = 117
|
|
||||||
SYS_GETSOCKOPT = 118
|
|
||||||
SYS_READV = 120
|
|
||||||
SYS_WRITEV = 121
|
|
||||||
SYS_SETTIMEOFDAY = 122
|
|
||||||
SYS_FCHOWN = 123
|
|
||||||
SYS_FCHMOD = 124
|
|
||||||
SYS_SETREUID = 126
|
|
||||||
SYS_SETREGID = 127
|
|
||||||
SYS_RENAME = 128
|
|
||||||
SYS_FLOCK = 131
|
|
||||||
SYS_MKFIFO = 132
|
|
||||||
SYS_SENDTO = 133
|
|
||||||
SYS_SHUTDOWN = 134
|
|
||||||
SYS_SOCKETPAIR = 135
|
|
||||||
SYS_MKDIR = 136
|
|
||||||
SYS_RMDIR = 137
|
|
||||||
SYS_UTIMES = 138
|
|
||||||
SYS_FUTIMES = 139
|
|
||||||
SYS_ADJTIME = 140
|
|
||||||
SYS_GETHOSTUUID = 142
|
|
||||||
SYS_SETSID = 147
|
|
||||||
SYS_GETPGID = 151
|
|
||||||
SYS_SETPRIVEXEC = 152
|
|
||||||
SYS_PREAD = 153
|
|
||||||
SYS_PWRITE = 154
|
|
||||||
SYS_NFSSVC = 155
|
|
||||||
SYS_STATFS = 157
|
|
||||||
SYS_FSTATFS = 158
|
|
||||||
SYS_UNMOUNT = 159
|
|
||||||
SYS_GETFH = 161
|
|
||||||
SYS_QUOTACTL = 165
|
|
||||||
SYS_MOUNT = 167
|
|
||||||
SYS_CSOPS = 169
|
|
||||||
SYS_CSOPS_AUDITTOKEN = 170
|
|
||||||
SYS_WAITID = 173
|
|
||||||
SYS_KDEBUG_TYPEFILTER = 177
|
|
||||||
SYS_KDEBUG_TRACE_STRING = 178
|
|
||||||
SYS_KDEBUG_TRACE64 = 179
|
|
||||||
SYS_KDEBUG_TRACE = 180
|
|
||||||
SYS_SETGID = 181
|
|
||||||
SYS_SETEGID = 182
|
|
||||||
SYS_SETEUID = 183
|
|
||||||
SYS_SIGRETURN = 184
|
|
||||||
SYS_THREAD_SELFCOUNTS = 186
|
|
||||||
SYS_FDATASYNC = 187
|
|
||||||
SYS_STAT = 188
|
|
||||||
SYS_FSTAT = 189
|
|
||||||
SYS_LSTAT = 190
|
|
||||||
SYS_PATHCONF = 191
|
|
||||||
SYS_FPATHCONF = 192
|
|
||||||
SYS_GETRLIMIT = 194
|
|
||||||
SYS_SETRLIMIT = 195
|
|
||||||
SYS_GETDIRENTRIES = 196
|
|
||||||
SYS_MMAP = 197
|
|
||||||
SYS_LSEEK = 199
|
|
||||||
SYS_TRUNCATE = 200
|
|
||||||
SYS_FTRUNCATE = 201
|
|
||||||
SYS_SYSCTL = 202
|
|
||||||
SYS_MLOCK = 203
|
|
||||||
SYS_MUNLOCK = 204
|
|
||||||
SYS_UNDELETE = 205
|
|
||||||
SYS_OPEN_DPROTECTED_NP = 216
|
|
||||||
SYS_GETATTRLIST = 220
|
|
||||||
SYS_SETATTRLIST = 221
|
|
||||||
SYS_GETDIRENTRIESATTR = 222
|
|
||||||
SYS_EXCHANGEDATA = 223
|
|
||||||
SYS_SEARCHFS = 225
|
|
||||||
SYS_DELETE = 226
|
|
||||||
SYS_COPYFILE = 227
|
|
||||||
SYS_FGETATTRLIST = 228
|
|
||||||
SYS_FSETATTRLIST = 229
|
|
||||||
SYS_POLL = 230
|
|
||||||
SYS_WATCHEVENT = 231
|
|
||||||
SYS_WAITEVENT = 232
|
|
||||||
SYS_MODWATCH = 233
|
|
||||||
SYS_GETXATTR = 234
|
|
||||||
SYS_FGETXATTR = 235
|
|
||||||
SYS_SETXATTR = 236
|
|
||||||
SYS_FSETXATTR = 237
|
|
||||||
SYS_REMOVEXATTR = 238
|
|
||||||
SYS_FREMOVEXATTR = 239
|
|
||||||
SYS_LISTXATTR = 240
|
|
||||||
SYS_FLISTXATTR = 241
|
|
||||||
SYS_FSCTL = 242
|
|
||||||
SYS_INITGROUPS = 243
|
|
||||||
SYS_POSIX_SPAWN = 244
|
|
||||||
SYS_FFSCTL = 245
|
|
||||||
SYS_NFSCLNT = 247
|
|
||||||
SYS_FHOPEN = 248
|
|
||||||
SYS_MINHERIT = 250
|
|
||||||
SYS_SEMSYS = 251
|
|
||||||
SYS_MSGSYS = 252
|
|
||||||
SYS_SHMSYS = 253
|
|
||||||
SYS_SEMCTL = 254
|
|
||||||
SYS_SEMGET = 255
|
|
||||||
SYS_SEMOP = 256
|
|
||||||
SYS_MSGCTL = 258
|
|
||||||
SYS_MSGGET = 259
|
|
||||||
SYS_MSGSND = 260
|
|
||||||
SYS_MSGRCV = 261
|
|
||||||
SYS_SHMAT = 262
|
|
||||||
SYS_SHMCTL = 263
|
|
||||||
SYS_SHMDT = 264
|
|
||||||
SYS_SHMGET = 265
|
|
||||||
SYS_SHM_OPEN = 266
|
|
||||||
SYS_SHM_UNLINK = 267
|
|
||||||
SYS_SEM_OPEN = 268
|
|
||||||
SYS_SEM_CLOSE = 269
|
|
||||||
SYS_SEM_UNLINK = 270
|
|
||||||
SYS_SEM_WAIT = 271
|
|
||||||
SYS_SEM_TRYWAIT = 272
|
|
||||||
SYS_SEM_POST = 273
|
|
||||||
SYS_SYSCTLBYNAME = 274
|
|
||||||
SYS_OPEN_EXTENDED = 277
|
|
||||||
SYS_UMASK_EXTENDED = 278
|
|
||||||
SYS_STAT_EXTENDED = 279
|
|
||||||
SYS_LSTAT_EXTENDED = 280
|
|
||||||
SYS_FSTAT_EXTENDED = 281
|
|
||||||
SYS_CHMOD_EXTENDED = 282
|
|
||||||
SYS_FCHMOD_EXTENDED = 283
|
|
||||||
SYS_ACCESS_EXTENDED = 284
|
|
||||||
SYS_SETTID = 285
|
|
||||||
SYS_GETTID = 286
|
|
||||||
SYS_SETSGROUPS = 287
|
|
||||||
SYS_GETSGROUPS = 288
|
|
||||||
SYS_SETWGROUPS = 289
|
|
||||||
SYS_GETWGROUPS = 290
|
|
||||||
SYS_MKFIFO_EXTENDED = 291
|
|
||||||
SYS_MKDIR_EXTENDED = 292
|
|
||||||
SYS_IDENTITYSVC = 293
|
|
||||||
SYS_SHARED_REGION_CHECK_NP = 294
|
|
||||||
SYS_VM_PRESSURE_MONITOR = 296
|
|
||||||
SYS_PSYNCH_RW_LONGRDLOCK = 297
|
|
||||||
SYS_PSYNCH_RW_YIELDWRLOCK = 298
|
|
||||||
SYS_PSYNCH_RW_DOWNGRADE = 299
|
|
||||||
SYS_PSYNCH_RW_UPGRADE = 300
|
|
||||||
SYS_PSYNCH_MUTEXWAIT = 301
|
|
||||||
SYS_PSYNCH_MUTEXDROP = 302
|
|
||||||
SYS_PSYNCH_CVBROAD = 303
|
|
||||||
SYS_PSYNCH_CVSIGNAL = 304
|
|
||||||
SYS_PSYNCH_CVWAIT = 305
|
|
||||||
SYS_PSYNCH_RW_RDLOCK = 306
|
|
||||||
SYS_PSYNCH_RW_WRLOCK = 307
|
|
||||||
SYS_PSYNCH_RW_UNLOCK = 308
|
|
||||||
SYS_PSYNCH_RW_UNLOCK2 = 309
|
|
||||||
SYS_GETSID = 310
|
|
||||||
SYS_SETTID_WITH_PID = 311
|
|
||||||
SYS_PSYNCH_CVCLRPREPOST = 312
|
|
||||||
SYS_AIO_FSYNC = 313
|
|
||||||
SYS_AIO_RETURN = 314
|
|
||||||
SYS_AIO_SUSPEND = 315
|
|
||||||
SYS_AIO_CANCEL = 316
|
|
||||||
SYS_AIO_ERROR = 317
|
|
||||||
SYS_AIO_READ = 318
|
|
||||||
SYS_AIO_WRITE = 319
|
|
||||||
SYS_LIO_LISTIO = 320
|
|
||||||
SYS_IOPOLICYSYS = 322
|
|
||||||
SYS_PROCESS_POLICY = 323
|
|
||||||
SYS_MLOCKALL = 324
|
|
||||||
SYS_MUNLOCKALL = 325
|
|
||||||
SYS_ISSETUGID = 327
|
|
||||||
SYS___PTHREAD_KILL = 328
|
|
||||||
SYS___PTHREAD_SIGMASK = 329
|
|
||||||
SYS___SIGWAIT = 330
|
|
||||||
SYS___DISABLE_THREADSIGNAL = 331
|
|
||||||
SYS___PTHREAD_MARKCANCEL = 332
|
|
||||||
SYS___PTHREAD_CANCELED = 333
|
|
||||||
SYS___SEMWAIT_SIGNAL = 334
|
|
||||||
SYS_PROC_INFO = 336
|
|
||||||
SYS_SENDFILE = 337
|
|
||||||
SYS_STAT64 = 338
|
|
||||||
SYS_FSTAT64 = 339
|
|
||||||
SYS_LSTAT64 = 340
|
|
||||||
SYS_STAT64_EXTENDED = 341
|
|
||||||
SYS_LSTAT64_EXTENDED = 342
|
|
||||||
SYS_FSTAT64_EXTENDED = 343
|
|
||||||
SYS_GETDIRENTRIES64 = 344
|
|
||||||
SYS_STATFS64 = 345
|
|
||||||
SYS_FSTATFS64 = 346
|
|
||||||
SYS_GETFSSTAT64 = 347
|
|
||||||
SYS___PTHREAD_CHDIR = 348
|
|
||||||
SYS___PTHREAD_FCHDIR = 349
|
|
||||||
SYS_AUDIT = 350
|
|
||||||
SYS_AUDITON = 351
|
|
||||||
SYS_GETAUID = 353
|
|
||||||
SYS_SETAUID = 354
|
|
||||||
SYS_GETAUDIT_ADDR = 357
|
|
||||||
SYS_SETAUDIT_ADDR = 358
|
|
||||||
SYS_AUDITCTL = 359
|
|
||||||
SYS_BSDTHREAD_CREATE = 360
|
|
||||||
SYS_BSDTHREAD_TERMINATE = 361
|
|
||||||
SYS_KQUEUE = 362
|
|
||||||
SYS_KEVENT = 363
|
|
||||||
SYS_LCHOWN = 364
|
|
||||||
SYS_BSDTHREAD_REGISTER = 366
|
|
||||||
SYS_WORKQ_OPEN = 367
|
|
||||||
SYS_WORKQ_KERNRETURN = 368
|
|
||||||
SYS_KEVENT64 = 369
|
|
||||||
SYS___OLD_SEMWAIT_SIGNAL = 370
|
|
||||||
SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371
|
|
||||||
SYS_THREAD_SELFID = 372
|
|
||||||
SYS_LEDGER = 373
|
|
||||||
SYS_KEVENT_QOS = 374
|
|
||||||
SYS_KEVENT_ID = 375
|
|
||||||
SYS___MAC_EXECVE = 380
|
|
||||||
SYS___MAC_SYSCALL = 381
|
|
||||||
SYS___MAC_GET_FILE = 382
|
|
||||||
SYS___MAC_SET_FILE = 383
|
|
||||||
SYS___MAC_GET_LINK = 384
|
|
||||||
SYS___MAC_SET_LINK = 385
|
|
||||||
SYS___MAC_GET_PROC = 386
|
|
||||||
SYS___MAC_SET_PROC = 387
|
|
||||||
SYS___MAC_GET_FD = 388
|
|
||||||
SYS___MAC_SET_FD = 389
|
|
||||||
SYS___MAC_GET_PID = 390
|
|
||||||
SYS_PSELECT = 394
|
|
||||||
SYS_PSELECT_NOCANCEL = 395
|
|
||||||
SYS_READ_NOCANCEL = 396
|
|
||||||
SYS_WRITE_NOCANCEL = 397
|
|
||||||
SYS_OPEN_NOCANCEL = 398
|
|
||||||
SYS_CLOSE_NOCANCEL = 399
|
|
||||||
SYS_WAIT4_NOCANCEL = 400
|
|
||||||
SYS_RECVMSG_NOCANCEL = 401
|
|
||||||
SYS_SENDMSG_NOCANCEL = 402
|
|
||||||
SYS_RECVFROM_NOCANCEL = 403
|
|
||||||
SYS_ACCEPT_NOCANCEL = 404
|
|
||||||
SYS_MSYNC_NOCANCEL = 405
|
|
||||||
SYS_FCNTL_NOCANCEL = 406
|
|
||||||
SYS_SELECT_NOCANCEL = 407
|
|
||||||
SYS_FSYNC_NOCANCEL = 408
|
|
||||||
SYS_CONNECT_NOCANCEL = 409
|
|
||||||
SYS_SIGSUSPEND_NOCANCEL = 410
|
|
||||||
SYS_READV_NOCANCEL = 411
|
|
||||||
SYS_WRITEV_NOCANCEL = 412
|
|
||||||
SYS_SENDTO_NOCANCEL = 413
|
|
||||||
SYS_PREAD_NOCANCEL = 414
|
|
||||||
SYS_PWRITE_NOCANCEL = 415
|
|
||||||
SYS_WAITID_NOCANCEL = 416
|
|
||||||
SYS_POLL_NOCANCEL = 417
|
|
||||||
SYS_MSGSND_NOCANCEL = 418
|
|
||||||
SYS_MSGRCV_NOCANCEL = 419
|
|
||||||
SYS_SEM_WAIT_NOCANCEL = 420
|
|
||||||
SYS_AIO_SUSPEND_NOCANCEL = 421
|
|
||||||
SYS___SIGWAIT_NOCANCEL = 422
|
|
||||||
SYS___SEMWAIT_SIGNAL_NOCANCEL = 423
|
|
||||||
SYS___MAC_MOUNT = 424
|
|
||||||
SYS___MAC_GET_MOUNT = 425
|
|
||||||
SYS___MAC_GETFSSTAT = 426
|
|
||||||
SYS_FSGETPATH = 427
|
|
||||||
SYS_AUDIT_SESSION_SELF = 428
|
|
||||||
SYS_AUDIT_SESSION_JOIN = 429
|
|
||||||
SYS_FILEPORT_MAKEPORT = 430
|
|
||||||
SYS_FILEPORT_MAKEFD = 431
|
|
||||||
SYS_AUDIT_SESSION_PORT = 432
|
|
||||||
SYS_PID_SUSPEND = 433
|
|
||||||
SYS_PID_RESUME = 434
|
|
||||||
SYS_PID_HIBERNATE = 435
|
|
||||||
SYS_PID_SHUTDOWN_SOCKETS = 436
|
|
||||||
SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438
|
|
||||||
SYS_KAS_INFO = 439
|
|
||||||
SYS_MEMORYSTATUS_CONTROL = 440
|
|
||||||
SYS_GUARDED_OPEN_NP = 441
|
|
||||||
SYS_GUARDED_CLOSE_NP = 442
|
|
||||||
SYS_GUARDED_KQUEUE_NP = 443
|
|
||||||
SYS_CHANGE_FDGUARD_NP = 444
|
|
||||||
SYS_USRCTL = 445
|
|
||||||
SYS_PROC_RLIMIT_CONTROL = 446
|
|
||||||
SYS_CONNECTX = 447
|
|
||||||
SYS_DISCONNECTX = 448
|
|
||||||
SYS_PEELOFF = 449
|
|
||||||
SYS_SOCKET_DELEGATE = 450
|
|
||||||
SYS_TELEMETRY = 451
|
|
||||||
SYS_PROC_UUID_POLICY = 452
|
|
||||||
SYS_MEMORYSTATUS_GET_LEVEL = 453
|
|
||||||
SYS_SYSTEM_OVERRIDE = 454
|
|
||||||
SYS_VFS_PURGE = 455
|
|
||||||
SYS_SFI_CTL = 456
|
|
||||||
SYS_SFI_PIDCTL = 457
|
|
||||||
SYS_COALITION = 458
|
|
||||||
SYS_COALITION_INFO = 459
|
|
||||||
SYS_NECP_MATCH_POLICY = 460
|
|
||||||
SYS_GETATTRLISTBULK = 461
|
|
||||||
SYS_CLONEFILEAT = 462
|
|
||||||
SYS_OPENAT = 463
|
|
||||||
SYS_OPENAT_NOCANCEL = 464
|
|
||||||
SYS_RENAMEAT = 465
|
|
||||||
SYS_FACCESSAT = 466
|
|
||||||
SYS_FCHMODAT = 467
|
|
||||||
SYS_FCHOWNAT = 468
|
|
||||||
SYS_FSTATAT = 469
|
|
||||||
SYS_FSTATAT64 = 470
|
|
||||||
SYS_LINKAT = 471
|
|
||||||
SYS_UNLINKAT = 472
|
|
||||||
SYS_READLINKAT = 473
|
|
||||||
SYS_SYMLINKAT = 474
|
|
||||||
SYS_MKDIRAT = 475
|
|
||||||
SYS_GETATTRLISTAT = 476
|
|
||||||
SYS_PROC_TRACE_LOG = 477
|
|
||||||
SYS_BSDTHREAD_CTL = 478
|
|
||||||
SYS_OPENBYID_NP = 479
|
|
||||||
SYS_RECVMSG_X = 480
|
|
||||||
SYS_SENDMSG_X = 481
|
|
||||||
SYS_THREAD_SELFUSAGE = 482
|
|
||||||
SYS_CSRCTL = 483
|
|
||||||
SYS_GUARDED_OPEN_DPROTECTED_NP = 484
|
|
||||||
SYS_GUARDED_WRITE_NP = 485
|
|
||||||
SYS_GUARDED_PWRITE_NP = 486
|
|
||||||
SYS_GUARDED_WRITEV_NP = 487
|
|
||||||
SYS_RENAMEATX_NP = 488
|
|
||||||
SYS_MREMAP_ENCRYPTED = 489
|
|
||||||
SYS_NETAGENT_TRIGGER = 490
|
|
||||||
SYS_STACK_SNAPSHOT_WITH_CONFIG = 491
|
|
||||||
SYS_MICROSTACKSHOT = 492
|
|
||||||
SYS_GRAB_PGO_DATA = 493
|
|
||||||
SYS_PERSONA = 494
|
|
||||||
SYS_WORK_INTERVAL_CTL = 499
|
|
||||||
SYS_GETENTROPY = 500
|
|
||||||
SYS_NECP_OPEN = 501
|
|
||||||
SYS_NECP_CLIENT_ACTION = 502
|
|
||||||
SYS___NEXUS_OPEN = 503
|
|
||||||
SYS___NEXUS_REGISTER = 504
|
|
||||||
SYS___NEXUS_DEREGISTER = 505
|
|
||||||
SYS___NEXUS_CREATE = 506
|
|
||||||
SYS___NEXUS_DESTROY = 507
|
|
||||||
SYS___NEXUS_GET_OPT = 508
|
|
||||||
SYS___NEXUS_SET_OPT = 509
|
|
||||||
SYS___CHANNEL_OPEN = 510
|
|
||||||
SYS___CHANNEL_GET_INFO = 511
|
|
||||||
SYS___CHANNEL_SYNC = 512
|
|
||||||
SYS___CHANNEL_GET_OPT = 513
|
|
||||||
SYS___CHANNEL_SET_OPT = 514
|
|
||||||
SYS_ULOCK_WAIT = 515
|
|
||||||
SYS_ULOCK_WAKE = 516
|
|
||||||
SYS_FCLONEFILEAT = 517
|
|
||||||
SYS_FS_SNAPSHOT = 518
|
|
||||||
SYS_TERMINATE_WITH_PAYLOAD = 520
|
|
||||||
SYS_ABORT_WITH_PAYLOAD = 521
|
|
||||||
SYS_NECP_SESSION_OPEN = 522
|
|
||||||
SYS_NECP_SESSION_ACTION = 523
|
|
||||||
SYS_SETATTRLISTAT = 524
|
|
||||||
SYS_NET_QOS_GUIDELINE = 525
|
|
||||||
SYS_FMOUNT = 526
|
|
||||||
SYS_NTP_ADJTIME = 527
|
|
||||||
SYS_NTP_GETTIME = 528
|
|
||||||
SYS_OS_FAULT_WITH_PAYLOAD = 529
|
|
||||||
SYS_MAXSYSCALL = 530
|
|
||||||
SYS_INVALID = 63
|
|
||||||
)
|
|
||||||
=======
|
|
||||||
// go run mksysnum.go /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h
|
// go run mksysnum.go /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
|
|
@ -874,4 +436,3 @@ const (
|
||||||
SYS_MAXSYSCALL = 530
|
SYS_MAXSYSCALL = 530
|
||||||
SYS_INVALID = 63
|
SYS_INVALID = 63
|
||||||
)
|
)
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,441 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// go run mksysnum.go /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h
|
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
|
||||||
|
|
||||||
// +build arm64,darwin
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
const (
|
|
||||||
SYS_SYSCALL = 0
|
|
||||||
SYS_EXIT = 1
|
|
||||||
SYS_FORK = 2
|
|
||||||
SYS_READ = 3
|
|
||||||
SYS_WRITE = 4
|
|
||||||
SYS_OPEN = 5
|
|
||||||
SYS_CLOSE = 6
|
|
||||||
SYS_WAIT4 = 7
|
|
||||||
SYS_LINK = 9
|
|
||||||
SYS_UNLINK = 10
|
|
||||||
SYS_CHDIR = 12
|
|
||||||
SYS_FCHDIR = 13
|
|
||||||
SYS_MKNOD = 14
|
|
||||||
SYS_CHMOD = 15
|
|
||||||
SYS_CHOWN = 16
|
|
||||||
SYS_GETFSSTAT = 18
|
|
||||||
SYS_GETPID = 20
|
|
||||||
SYS_SETUID = 23
|
|
||||||
SYS_GETUID = 24
|
|
||||||
SYS_GETEUID = 25
|
|
||||||
SYS_PTRACE = 26
|
|
||||||
SYS_RECVMSG = 27
|
|
||||||
SYS_SENDMSG = 28
|
|
||||||
SYS_RECVFROM = 29
|
|
||||||
SYS_ACCEPT = 30
|
|
||||||
SYS_GETPEERNAME = 31
|
|
||||||
SYS_GETSOCKNAME = 32
|
|
||||||
SYS_ACCESS = 33
|
|
||||||
SYS_CHFLAGS = 34
|
|
||||||
SYS_FCHFLAGS = 35
|
|
||||||
SYS_SYNC = 36
|
|
||||||
SYS_KILL = 37
|
|
||||||
SYS_GETPPID = 39
|
|
||||||
SYS_DUP = 41
|
|
||||||
SYS_PIPE = 42
|
|
||||||
SYS_GETEGID = 43
|
|
||||||
SYS_SIGACTION = 46
|
|
||||||
SYS_GETGID = 47
|
|
||||||
SYS_SIGPROCMASK = 48
|
|
||||||
SYS_GETLOGIN = 49
|
|
||||||
SYS_SETLOGIN = 50
|
|
||||||
SYS_ACCT = 51
|
|
||||||
SYS_SIGPENDING = 52
|
|
||||||
SYS_SIGALTSTACK = 53
|
|
||||||
SYS_IOCTL = 54
|
|
||||||
SYS_REBOOT = 55
|
|
||||||
SYS_REVOKE = 56
|
|
||||||
SYS_SYMLINK = 57
|
|
||||||
SYS_READLINK = 58
|
|
||||||
SYS_EXECVE = 59
|
|
||||||
SYS_UMASK = 60
|
|
||||||
SYS_CHROOT = 61
|
|
||||||
SYS_MSYNC = 65
|
|
||||||
SYS_VFORK = 66
|
|
||||||
SYS_MUNMAP = 73
|
|
||||||
SYS_MPROTECT = 74
|
|
||||||
SYS_MADVISE = 75
|
|
||||||
SYS_MINCORE = 78
|
|
||||||
SYS_GETGROUPS = 79
|
|
||||||
SYS_SETGROUPS = 80
|
|
||||||
SYS_GETPGRP = 81
|
|
||||||
SYS_SETPGID = 82
|
|
||||||
SYS_SETITIMER = 83
|
|
||||||
SYS_SWAPON = 85
|
|
||||||
SYS_GETITIMER = 86
|
|
||||||
SYS_GETDTABLESIZE = 89
|
|
||||||
SYS_DUP2 = 90
|
|
||||||
SYS_FCNTL = 92
|
|
||||||
SYS_SELECT = 93
|
|
||||||
SYS_FSYNC = 95
|
|
||||||
SYS_SETPRIORITY = 96
|
|
||||||
SYS_SOCKET = 97
|
|
||||||
SYS_CONNECT = 98
|
|
||||||
SYS_GETPRIORITY = 100
|
|
||||||
SYS_BIND = 104
|
|
||||||
SYS_SETSOCKOPT = 105
|
|
||||||
SYS_LISTEN = 106
|
|
||||||
SYS_SIGSUSPEND = 111
|
|
||||||
SYS_GETTIMEOFDAY = 116
|
|
||||||
SYS_GETRUSAGE = 117
|
|
||||||
SYS_GETSOCKOPT = 118
|
|
||||||
SYS_READV = 120
|
|
||||||
SYS_WRITEV = 121
|
|
||||||
SYS_SETTIMEOFDAY = 122
|
|
||||||
SYS_FCHOWN = 123
|
|
||||||
SYS_FCHMOD = 124
|
|
||||||
SYS_SETREUID = 126
|
|
||||||
SYS_SETREGID = 127
|
|
||||||
SYS_RENAME = 128
|
|
||||||
SYS_FLOCK = 131
|
|
||||||
SYS_MKFIFO = 132
|
|
||||||
SYS_SENDTO = 133
|
|
||||||
SYS_SHUTDOWN = 134
|
|
||||||
SYS_SOCKETPAIR = 135
|
|
||||||
SYS_MKDIR = 136
|
|
||||||
SYS_RMDIR = 137
|
|
||||||
SYS_UTIMES = 138
|
|
||||||
SYS_FUTIMES = 139
|
|
||||||
SYS_ADJTIME = 140
|
|
||||||
SYS_GETHOSTUUID = 142
|
|
||||||
SYS_SETSID = 147
|
|
||||||
SYS_GETPGID = 151
|
|
||||||
SYS_SETPRIVEXEC = 152
|
|
||||||
SYS_PREAD = 153
|
|
||||||
SYS_PWRITE = 154
|
|
||||||
SYS_NFSSVC = 155
|
|
||||||
SYS_STATFS = 157
|
|
||||||
SYS_FSTATFS = 158
|
|
||||||
SYS_UNMOUNT = 159
|
|
||||||
SYS_GETFH = 161
|
|
||||||
SYS_QUOTACTL = 165
|
|
||||||
SYS_MOUNT = 167
|
|
||||||
SYS_CSOPS = 169
|
|
||||||
SYS_CSOPS_AUDITTOKEN = 170
|
|
||||||
SYS_WAITID = 173
|
|
||||||
SYS_KDEBUG_TYPEFILTER = 177
|
|
||||||
SYS_KDEBUG_TRACE_STRING = 178
|
|
||||||
SYS_KDEBUG_TRACE64 = 179
|
|
||||||
SYS_KDEBUG_TRACE = 180
|
|
||||||
SYS_SETGID = 181
|
|
||||||
SYS_SETEGID = 182
|
|
||||||
SYS_SETEUID = 183
|
|
||||||
SYS_SIGRETURN = 184
|
|
||||||
SYS_THREAD_SELFCOUNTS = 186
|
|
||||||
SYS_FDATASYNC = 187
|
|
||||||
SYS_STAT = 188
|
|
||||||
SYS_FSTAT = 189
|
|
||||||
SYS_LSTAT = 190
|
|
||||||
SYS_PATHCONF = 191
|
|
||||||
SYS_FPATHCONF = 192
|
|
||||||
SYS_GETRLIMIT = 194
|
|
||||||
SYS_SETRLIMIT = 195
|
|
||||||
SYS_GETDIRENTRIES = 196
|
|
||||||
SYS_MMAP = 197
|
|
||||||
SYS_LSEEK = 199
|
|
||||||
SYS_TRUNCATE = 200
|
|
||||||
SYS_FTRUNCATE = 201
|
|
||||||
SYS_SYSCTL = 202
|
|
||||||
SYS_MLOCK = 203
|
|
||||||
SYS_MUNLOCK = 204
|
|
||||||
SYS_UNDELETE = 205
|
|
||||||
SYS_OPEN_DPROTECTED_NP = 216
|
|
||||||
SYS_GETATTRLIST = 220
|
|
||||||
SYS_SETATTRLIST = 221
|
|
||||||
SYS_GETDIRENTRIESATTR = 222
|
|
||||||
SYS_EXCHANGEDATA = 223
|
|
||||||
SYS_SEARCHFS = 225
|
|
||||||
SYS_DELETE = 226
|
|
||||||
SYS_COPYFILE = 227
|
|
||||||
SYS_FGETATTRLIST = 228
|
|
||||||
SYS_FSETATTRLIST = 229
|
|
||||||
SYS_POLL = 230
|
|
||||||
SYS_WATCHEVENT = 231
|
|
||||||
SYS_WAITEVENT = 232
|
|
||||||
SYS_MODWATCH = 233
|
|
||||||
SYS_GETXATTR = 234
|
|
||||||
SYS_FGETXATTR = 235
|
|
||||||
SYS_SETXATTR = 236
|
|
||||||
SYS_FSETXATTR = 237
|
|
||||||
SYS_REMOVEXATTR = 238
|
|
||||||
SYS_FREMOVEXATTR = 239
|
|
||||||
SYS_LISTXATTR = 240
|
|
||||||
SYS_FLISTXATTR = 241
|
|
||||||
SYS_FSCTL = 242
|
|
||||||
SYS_INITGROUPS = 243
|
|
||||||
SYS_POSIX_SPAWN = 244
|
|
||||||
SYS_FFSCTL = 245
|
|
||||||
SYS_NFSCLNT = 247
|
|
||||||
SYS_FHOPEN = 248
|
|
||||||
SYS_MINHERIT = 250
|
|
||||||
SYS_SEMSYS = 251
|
|
||||||
SYS_MSGSYS = 252
|
|
||||||
SYS_SHMSYS = 253
|
|
||||||
SYS_SEMCTL = 254
|
|
||||||
SYS_SEMGET = 255
|
|
||||||
SYS_SEMOP = 256
|
|
||||||
SYS_MSGCTL = 258
|
|
||||||
SYS_MSGGET = 259
|
|
||||||
SYS_MSGSND = 260
|
|
||||||
SYS_MSGRCV = 261
|
|
||||||
SYS_SHMAT = 262
|
|
||||||
SYS_SHMCTL = 263
|
|
||||||
SYS_SHMDT = 264
|
|
||||||
SYS_SHMGET = 265
|
|
||||||
SYS_SHM_OPEN = 266
|
|
||||||
SYS_SHM_UNLINK = 267
|
|
||||||
SYS_SEM_OPEN = 268
|
|
||||||
SYS_SEM_CLOSE = 269
|
|
||||||
SYS_SEM_UNLINK = 270
|
|
||||||
SYS_SEM_WAIT = 271
|
|
||||||
SYS_SEM_TRYWAIT = 272
|
|
||||||
SYS_SEM_POST = 273
|
|
||||||
SYS_SYSCTLBYNAME = 274
|
|
||||||
SYS_OPEN_EXTENDED = 277
|
|
||||||
SYS_UMASK_EXTENDED = 278
|
|
||||||
SYS_STAT_EXTENDED = 279
|
|
||||||
SYS_LSTAT_EXTENDED = 280
|
|
||||||
SYS_FSTAT_EXTENDED = 281
|
|
||||||
SYS_CHMOD_EXTENDED = 282
|
|
||||||
SYS_FCHMOD_EXTENDED = 283
|
|
||||||
SYS_ACCESS_EXTENDED = 284
|
|
||||||
SYS_SETTID = 285
|
|
||||||
SYS_GETTID = 286
|
|
||||||
SYS_SETSGROUPS = 287
|
|
||||||
SYS_GETSGROUPS = 288
|
|
||||||
SYS_SETWGROUPS = 289
|
|
||||||
SYS_GETWGROUPS = 290
|
|
||||||
SYS_MKFIFO_EXTENDED = 291
|
|
||||||
SYS_MKDIR_EXTENDED = 292
|
|
||||||
SYS_IDENTITYSVC = 293
|
|
||||||
SYS_SHARED_REGION_CHECK_NP = 294
|
|
||||||
SYS_VM_PRESSURE_MONITOR = 296
|
|
||||||
SYS_PSYNCH_RW_LONGRDLOCK = 297
|
|
||||||
SYS_PSYNCH_RW_YIELDWRLOCK = 298
|
|
||||||
SYS_PSYNCH_RW_DOWNGRADE = 299
|
|
||||||
SYS_PSYNCH_RW_UPGRADE = 300
|
|
||||||
SYS_PSYNCH_MUTEXWAIT = 301
|
|
||||||
SYS_PSYNCH_MUTEXDROP = 302
|
|
||||||
SYS_PSYNCH_CVBROAD = 303
|
|
||||||
SYS_PSYNCH_CVSIGNAL = 304
|
|
||||||
SYS_PSYNCH_CVWAIT = 305
|
|
||||||
SYS_PSYNCH_RW_RDLOCK = 306
|
|
||||||
SYS_PSYNCH_RW_WRLOCK = 307
|
|
||||||
SYS_PSYNCH_RW_UNLOCK = 308
|
|
||||||
SYS_PSYNCH_RW_UNLOCK2 = 309
|
|
||||||
SYS_GETSID = 310
|
|
||||||
SYS_SETTID_WITH_PID = 311
|
|
||||||
SYS_PSYNCH_CVCLRPREPOST = 312
|
|
||||||
SYS_AIO_FSYNC = 313
|
|
||||||
SYS_AIO_RETURN = 314
|
|
||||||
SYS_AIO_SUSPEND = 315
|
|
||||||
SYS_AIO_CANCEL = 316
|
|
||||||
SYS_AIO_ERROR = 317
|
|
||||||
SYS_AIO_READ = 318
|
|
||||||
SYS_AIO_WRITE = 319
|
|
||||||
SYS_LIO_LISTIO = 320
|
|
||||||
SYS_IOPOLICYSYS = 322
|
|
||||||
SYS_PROCESS_POLICY = 323
|
|
||||||
SYS_MLOCKALL = 324
|
|
||||||
SYS_MUNLOCKALL = 325
|
|
||||||
SYS_ISSETUGID = 327
|
|
||||||
SYS___PTHREAD_KILL = 328
|
|
||||||
SYS___PTHREAD_SIGMASK = 329
|
|
||||||
SYS___SIGWAIT = 330
|
|
||||||
SYS___DISABLE_THREADSIGNAL = 331
|
|
||||||
SYS___PTHREAD_MARKCANCEL = 332
|
|
||||||
SYS___PTHREAD_CANCELED = 333
|
|
||||||
SYS___SEMWAIT_SIGNAL = 334
|
|
||||||
SYS_PROC_INFO = 336
|
|
||||||
SYS_SENDFILE = 337
|
|
||||||
SYS_STAT64 = 338
|
|
||||||
SYS_FSTAT64 = 339
|
|
||||||
SYS_LSTAT64 = 340
|
|
||||||
SYS_STAT64_EXTENDED = 341
|
|
||||||
SYS_LSTAT64_EXTENDED = 342
|
|
||||||
SYS_FSTAT64_EXTENDED = 343
|
|
||||||
SYS_GETDIRENTRIES64 = 344
|
|
||||||
SYS_STATFS64 = 345
|
|
||||||
SYS_FSTATFS64 = 346
|
|
||||||
SYS_GETFSSTAT64 = 347
|
|
||||||
SYS___PTHREAD_CHDIR = 348
|
|
||||||
SYS___PTHREAD_FCHDIR = 349
|
|
||||||
SYS_AUDIT = 350
|
|
||||||
SYS_AUDITON = 351
|
|
||||||
SYS_GETAUID = 353
|
|
||||||
SYS_SETAUID = 354
|
|
||||||
SYS_GETAUDIT_ADDR = 357
|
|
||||||
SYS_SETAUDIT_ADDR = 358
|
|
||||||
SYS_AUDITCTL = 359
|
|
||||||
SYS_BSDTHREAD_CREATE = 360
|
|
||||||
SYS_BSDTHREAD_TERMINATE = 361
|
|
||||||
SYS_KQUEUE = 362
|
|
||||||
SYS_KEVENT = 363
|
|
||||||
SYS_LCHOWN = 364
|
|
||||||
SYS_BSDTHREAD_REGISTER = 366
|
|
||||||
SYS_WORKQ_OPEN = 367
|
|
||||||
SYS_WORKQ_KERNRETURN = 368
|
|
||||||
SYS_KEVENT64 = 369
|
|
||||||
SYS___OLD_SEMWAIT_SIGNAL = 370
|
|
||||||
SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371
|
|
||||||
SYS_THREAD_SELFID = 372
|
|
||||||
SYS_LEDGER = 373
|
|
||||||
SYS_KEVENT_QOS = 374
|
|
||||||
SYS_KEVENT_ID = 375
|
|
||||||
SYS___MAC_EXECVE = 380
|
|
||||||
SYS___MAC_SYSCALL = 381
|
|
||||||
SYS___MAC_GET_FILE = 382
|
|
||||||
SYS___MAC_SET_FILE = 383
|
|
||||||
SYS___MAC_GET_LINK = 384
|
|
||||||
SYS___MAC_SET_LINK = 385
|
|
||||||
SYS___MAC_GET_PROC = 386
|
|
||||||
SYS___MAC_SET_PROC = 387
|
|
||||||
SYS___MAC_GET_FD = 388
|
|
||||||
SYS___MAC_SET_FD = 389
|
|
||||||
SYS___MAC_GET_PID = 390
|
|
||||||
SYS_PSELECT = 394
|
|
||||||
SYS_PSELECT_NOCANCEL = 395
|
|
||||||
SYS_READ_NOCANCEL = 396
|
|
||||||
SYS_WRITE_NOCANCEL = 397
|
|
||||||
SYS_OPEN_NOCANCEL = 398
|
|
||||||
SYS_CLOSE_NOCANCEL = 399
|
|
||||||
SYS_WAIT4_NOCANCEL = 400
|
|
||||||
SYS_RECVMSG_NOCANCEL = 401
|
|
||||||
SYS_SENDMSG_NOCANCEL = 402
|
|
||||||
SYS_RECVFROM_NOCANCEL = 403
|
|
||||||
SYS_ACCEPT_NOCANCEL = 404
|
|
||||||
SYS_MSYNC_NOCANCEL = 405
|
|
||||||
SYS_FCNTL_NOCANCEL = 406
|
|
||||||
SYS_SELECT_NOCANCEL = 407
|
|
||||||
SYS_FSYNC_NOCANCEL = 408
|
|
||||||
SYS_CONNECT_NOCANCEL = 409
|
|
||||||
SYS_SIGSUSPEND_NOCANCEL = 410
|
|
||||||
SYS_READV_NOCANCEL = 411
|
|
||||||
SYS_WRITEV_NOCANCEL = 412
|
|
||||||
SYS_SENDTO_NOCANCEL = 413
|
|
||||||
SYS_PREAD_NOCANCEL = 414
|
|
||||||
SYS_PWRITE_NOCANCEL = 415
|
|
||||||
SYS_WAITID_NOCANCEL = 416
|
|
||||||
SYS_POLL_NOCANCEL = 417
|
|
||||||
SYS_MSGSND_NOCANCEL = 418
|
|
||||||
SYS_MSGRCV_NOCANCEL = 419
|
|
||||||
SYS_SEM_WAIT_NOCANCEL = 420
|
|
||||||
SYS_AIO_SUSPEND_NOCANCEL = 421
|
|
||||||
SYS___SIGWAIT_NOCANCEL = 422
|
|
||||||
SYS___SEMWAIT_SIGNAL_NOCANCEL = 423
|
|
||||||
SYS___MAC_MOUNT = 424
|
|
||||||
SYS___MAC_GET_MOUNT = 425
|
|
||||||
SYS___MAC_GETFSSTAT = 426
|
|
||||||
SYS_FSGETPATH = 427
|
|
||||||
SYS_AUDIT_SESSION_SELF = 428
|
|
||||||
SYS_AUDIT_SESSION_JOIN = 429
|
|
||||||
SYS_FILEPORT_MAKEPORT = 430
|
|
||||||
SYS_FILEPORT_MAKEFD = 431
|
|
||||||
SYS_AUDIT_SESSION_PORT = 432
|
|
||||||
SYS_PID_SUSPEND = 433
|
|
||||||
SYS_PID_RESUME = 434
|
|
||||||
SYS_PID_HIBERNATE = 435
|
|
||||||
SYS_PID_SHUTDOWN_SOCKETS = 436
|
|
||||||
SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438
|
|
||||||
SYS_KAS_INFO = 439
|
|
||||||
SYS_MEMORYSTATUS_CONTROL = 440
|
|
||||||
SYS_GUARDED_OPEN_NP = 441
|
|
||||||
SYS_GUARDED_CLOSE_NP = 442
|
|
||||||
SYS_GUARDED_KQUEUE_NP = 443
|
|
||||||
SYS_CHANGE_FDGUARD_NP = 444
|
|
||||||
SYS_USRCTL = 445
|
|
||||||
SYS_PROC_RLIMIT_CONTROL = 446
|
|
||||||
SYS_CONNECTX = 447
|
|
||||||
SYS_DISCONNECTX = 448
|
|
||||||
SYS_PEELOFF = 449
|
|
||||||
SYS_SOCKET_DELEGATE = 450
|
|
||||||
SYS_TELEMETRY = 451
|
|
||||||
SYS_PROC_UUID_POLICY = 452
|
|
||||||
SYS_MEMORYSTATUS_GET_LEVEL = 453
|
|
||||||
SYS_SYSTEM_OVERRIDE = 454
|
|
||||||
SYS_VFS_PURGE = 455
|
|
||||||
SYS_SFI_CTL = 456
|
|
||||||
SYS_SFI_PIDCTL = 457
|
|
||||||
SYS_COALITION = 458
|
|
||||||
SYS_COALITION_INFO = 459
|
|
||||||
SYS_NECP_MATCH_POLICY = 460
|
|
||||||
SYS_GETATTRLISTBULK = 461
|
|
||||||
SYS_CLONEFILEAT = 462
|
|
||||||
SYS_OPENAT = 463
|
|
||||||
SYS_OPENAT_NOCANCEL = 464
|
|
||||||
SYS_RENAMEAT = 465
|
|
||||||
SYS_FACCESSAT = 466
|
|
||||||
SYS_FCHMODAT = 467
|
|
||||||
SYS_FCHOWNAT = 468
|
|
||||||
SYS_FSTATAT = 469
|
|
||||||
SYS_FSTATAT64 = 470
|
|
||||||
SYS_LINKAT = 471
|
|
||||||
SYS_UNLINKAT = 472
|
|
||||||
SYS_READLINKAT = 473
|
|
||||||
SYS_SYMLINKAT = 474
|
|
||||||
SYS_MKDIRAT = 475
|
|
||||||
SYS_GETATTRLISTAT = 476
|
|
||||||
SYS_PROC_TRACE_LOG = 477
|
|
||||||
SYS_BSDTHREAD_CTL = 478
|
|
||||||
SYS_OPENBYID_NP = 479
|
|
||||||
SYS_RECVMSG_X = 480
|
|
||||||
SYS_SENDMSG_X = 481
|
|
||||||
SYS_THREAD_SELFUSAGE = 482
|
|
||||||
SYS_CSRCTL = 483
|
|
||||||
SYS_GUARDED_OPEN_DPROTECTED_NP = 484
|
|
||||||
SYS_GUARDED_WRITE_NP = 485
|
|
||||||
SYS_GUARDED_PWRITE_NP = 486
|
|
||||||
SYS_GUARDED_WRITEV_NP = 487
|
|
||||||
SYS_RENAMEATX_NP = 488
|
|
||||||
SYS_MREMAP_ENCRYPTED = 489
|
|
||||||
SYS_NETAGENT_TRIGGER = 490
|
|
||||||
SYS_STACK_SNAPSHOT_WITH_CONFIG = 491
|
|
||||||
SYS_MICROSTACKSHOT = 492
|
|
||||||
SYS_GRAB_PGO_DATA = 493
|
|
||||||
SYS_PERSONA = 494
|
|
||||||
SYS_WORK_INTERVAL_CTL = 499
|
|
||||||
SYS_GETENTROPY = 500
|
|
||||||
SYS_NECP_OPEN = 501
|
|
||||||
SYS_NECP_CLIENT_ACTION = 502
|
|
||||||
SYS___NEXUS_OPEN = 503
|
|
||||||
SYS___NEXUS_REGISTER = 504
|
|
||||||
SYS___NEXUS_DEREGISTER = 505
|
|
||||||
SYS___NEXUS_CREATE = 506
|
|
||||||
SYS___NEXUS_DESTROY = 507
|
|
||||||
SYS___NEXUS_GET_OPT = 508
|
|
||||||
SYS___NEXUS_SET_OPT = 509
|
|
||||||
SYS___CHANNEL_OPEN = 510
|
|
||||||
SYS___CHANNEL_GET_INFO = 511
|
|
||||||
SYS___CHANNEL_SYNC = 512
|
|
||||||
SYS___CHANNEL_GET_OPT = 513
|
|
||||||
SYS___CHANNEL_SET_OPT = 514
|
|
||||||
SYS_ULOCK_WAIT = 515
|
|
||||||
SYS_ULOCK_WAKE = 516
|
|
||||||
SYS_FCLONEFILEAT = 517
|
|
||||||
SYS_FS_SNAPSHOT = 518
|
|
||||||
SYS_TERMINATE_WITH_PAYLOAD = 520
|
|
||||||
SYS_ABORT_WITH_PAYLOAD = 521
|
|
||||||
SYS_NECP_SESSION_OPEN = 522
|
|
||||||
SYS_NECP_SESSION_ACTION = 523
|
|
||||||
SYS_SETATTRLISTAT = 524
|
|
||||||
SYS_NET_QOS_GUIDELINE = 525
|
|
||||||
SYS_FMOUNT = 526
|
|
||||||
SYS_NTP_ADJTIME = 527
|
|
||||||
SYS_NTP_GETTIME = 528
|
|
||||||
SYS_OS_FAULT_WITH_PAYLOAD = 529
|
|
||||||
SYS_MAXSYSCALL = 530
|
|
||||||
SYS_INVALID = 63
|
|
||||||
)
|
|
||||||
=======
|
|
||||||
// go run mksysnum.go /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h
|
// go run mksysnum.go /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
|
|
@ -874,4 +436,3 @@ const (
|
||||||
SYS_MAXSYSCALL = 530
|
SYS_MAXSYSCALL = 530
|
||||||
SYS_INVALID = 63
|
SYS_INVALID = 63
|
||||||
)
|
)
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,320 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// go run mksysnum.go https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master
|
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
|
||||||
|
|
||||||
// +build amd64,dragonfly
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
const (
|
|
||||||
// SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int
|
|
||||||
SYS_EXIT = 1 // { void exit(int rval); }
|
|
||||||
SYS_FORK = 2 // { int fork(void); }
|
|
||||||
SYS_READ = 3 // { ssize_t read(int fd, void *buf, size_t nbyte); }
|
|
||||||
SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, size_t nbyte); }
|
|
||||||
SYS_OPEN = 5 // { int open(char *path, int flags, int mode); }
|
|
||||||
SYS_CLOSE = 6 // { int close(int fd); }
|
|
||||||
SYS_WAIT4 = 7 // { int wait4(int pid, int *status, int options, struct rusage *rusage); } wait4 wait_args int
|
|
||||||
SYS_LINK = 9 // { int link(char *path, char *link); }
|
|
||||||
SYS_UNLINK = 10 // { int unlink(char *path); }
|
|
||||||
SYS_CHDIR = 12 // { int chdir(char *path); }
|
|
||||||
SYS_FCHDIR = 13 // { int fchdir(int fd); }
|
|
||||||
SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); }
|
|
||||||
SYS_CHMOD = 15 // { int chmod(char *path, int mode); }
|
|
||||||
SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); }
|
|
||||||
SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int
|
|
||||||
SYS_GETFSSTAT = 18 // { int getfsstat(struct statfs *buf, long bufsize, int flags); }
|
|
||||||
SYS_GETPID = 20 // { pid_t getpid(void); }
|
|
||||||
SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, caddr_t data); }
|
|
||||||
SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); }
|
|
||||||
SYS_SETUID = 23 // { int setuid(uid_t uid); }
|
|
||||||
SYS_GETUID = 24 // { uid_t getuid(void); }
|
|
||||||
SYS_GETEUID = 25 // { uid_t geteuid(void); }
|
|
||||||
SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, caddr_t addr, int data); }
|
|
||||||
SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, int flags); }
|
|
||||||
SYS_SENDMSG = 28 // { int sendmsg(int s, caddr_t msg, int flags); }
|
|
||||||
SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, size_t len, int flags, caddr_t from, int *fromlenaddr); }
|
|
||||||
SYS_ACCEPT = 30 // { int accept(int s, caddr_t name, int *anamelen); }
|
|
||||||
SYS_GETPEERNAME = 31 // { int getpeername(int fdes, caddr_t asa, int *alen); }
|
|
||||||
SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, caddr_t asa, int *alen); }
|
|
||||||
SYS_ACCESS = 33 // { int access(char *path, int flags); }
|
|
||||||
SYS_CHFLAGS = 34 // { int chflags(char *path, int flags); }
|
|
||||||
SYS_FCHFLAGS = 35 // { int fchflags(int fd, int flags); }
|
|
||||||
SYS_SYNC = 36 // { int sync(void); }
|
|
||||||
SYS_KILL = 37 // { int kill(int pid, int signum); }
|
|
||||||
SYS_GETPPID = 39 // { pid_t getppid(void); }
|
|
||||||
SYS_DUP = 41 // { int dup(int fd); }
|
|
||||||
SYS_PIPE = 42 // { int pipe(void); }
|
|
||||||
SYS_GETEGID = 43 // { gid_t getegid(void); }
|
|
||||||
SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, size_t offset, u_int scale); }
|
|
||||||
SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, int pid); }
|
|
||||||
SYS_GETGID = 47 // { gid_t getgid(void); }
|
|
||||||
SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int namelen); }
|
|
||||||
SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); }
|
|
||||||
SYS_ACCT = 51 // { int acct(char *path); }
|
|
||||||
SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, stack_t *oss); }
|
|
||||||
SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, caddr_t data); }
|
|
||||||
SYS_REBOOT = 55 // { int reboot(int opt); }
|
|
||||||
SYS_REVOKE = 56 // { int revoke(char *path); }
|
|
||||||
SYS_SYMLINK = 57 // { int symlink(char *path, char *link); }
|
|
||||||
SYS_READLINK = 58 // { int readlink(char *path, char *buf, int count); }
|
|
||||||
SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); }
|
|
||||||
SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args int
|
|
||||||
SYS_CHROOT = 61 // { int chroot(char *path); }
|
|
||||||
SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); }
|
|
||||||
SYS_VFORK = 66 // { pid_t vfork(void); }
|
|
||||||
SYS_SBRK = 69 // { int sbrk(int incr); }
|
|
||||||
SYS_SSTK = 70 // { int sstk(int incr); }
|
|
||||||
SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); }
|
|
||||||
SYS_MPROTECT = 74 // { int mprotect(void *addr, size_t len, int prot); }
|
|
||||||
SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); }
|
|
||||||
SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, char *vec); }
|
|
||||||
SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); }
|
|
||||||
SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, gid_t *gidset); }
|
|
||||||
SYS_GETPGRP = 81 // { int getpgrp(void); }
|
|
||||||
SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); }
|
|
||||||
SYS_SETITIMER = 83 // { int setitimer(u_int which, struct itimerval *itv, struct itimerval *oitv); }
|
|
||||||
SYS_SWAPON = 85 // { int swapon(char *name); }
|
|
||||||
SYS_GETITIMER = 86 // { int getitimer(u_int which, struct itimerval *itv); }
|
|
||||||
SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); }
|
|
||||||
SYS_DUP2 = 90 // { int dup2(int from, int to); }
|
|
||||||
SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); }
|
|
||||||
SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); }
|
|
||||||
SYS_FSYNC = 95 // { int fsync(int fd); }
|
|
||||||
SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, int prio); }
|
|
||||||
SYS_SOCKET = 97 // { int socket(int domain, int type, int protocol); }
|
|
||||||
SYS_CONNECT = 98 // { int connect(int s, caddr_t name, int namelen); }
|
|
||||||
SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); }
|
|
||||||
SYS_BIND = 104 // { int bind(int s, caddr_t name, int namelen); }
|
|
||||||
SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, caddr_t val, int valsize); }
|
|
||||||
SYS_LISTEN = 106 // { int listen(int s, int backlog); }
|
|
||||||
SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, struct timezone *tzp); }
|
|
||||||
SYS_GETRUSAGE = 117 // { int getrusage(int who, struct rusage *rusage); }
|
|
||||||
SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, caddr_t val, int *avalsize); }
|
|
||||||
SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, u_int iovcnt); }
|
|
||||||
SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, u_int iovcnt); }
|
|
||||||
SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, struct timezone *tzp); }
|
|
||||||
SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); }
|
|
||||||
SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); }
|
|
||||||
SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); }
|
|
||||||
SYS_SETREGID = 127 // { int setregid(int rgid, int egid); }
|
|
||||||
SYS_RENAME = 128 // { int rename(char *from, char *to); }
|
|
||||||
SYS_FLOCK = 131 // { int flock(int fd, int how); }
|
|
||||||
SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); }
|
|
||||||
SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, int flags, caddr_t to, int tolen); }
|
|
||||||
SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); }
|
|
||||||
SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, int protocol, int *rsv); }
|
|
||||||
SYS_MKDIR = 136 // { int mkdir(char *path, int mode); }
|
|
||||||
SYS_RMDIR = 137 // { int rmdir(char *path); }
|
|
||||||
SYS_UTIMES = 138 // { int utimes(char *path, struct timeval *tptr); }
|
|
||||||
SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, struct timeval *olddelta); }
|
|
||||||
SYS_SETSID = 147 // { int setsid(void); }
|
|
||||||
SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, caddr_t arg); }
|
|
||||||
SYS_STATFS = 157 // { int statfs(char *path, struct statfs *buf); }
|
|
||||||
SYS_FSTATFS = 158 // { int fstatfs(int fd, struct statfs *buf); }
|
|
||||||
SYS_GETFH = 161 // { int getfh(char *fname, struct fhandle *fhp); }
|
|
||||||
SYS_GETDOMAINNAME = 162 // { int getdomainname(char *domainname, int len); }
|
|
||||||
SYS_SETDOMAINNAME = 163 // { int setdomainname(char *domainname, int len); }
|
|
||||||
SYS_UNAME = 164 // { int uname(struct utsname *name); }
|
|
||||||
SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); }
|
|
||||||
SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, struct rtprio *rtp); }
|
|
||||||
SYS_EXTPREAD = 173 // { ssize_t extpread(int fd, void *buf, size_t nbyte, int flags, off_t offset); }
|
|
||||||
SYS_EXTPWRITE = 174 // { ssize_t extpwrite(int fd, const void *buf, size_t nbyte, int flags, off_t offset); }
|
|
||||||
SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); }
|
|
||||||
SYS_SETGID = 181 // { int setgid(gid_t gid); }
|
|
||||||
SYS_SETEGID = 182 // { int setegid(gid_t egid); }
|
|
||||||
SYS_SETEUID = 183 // { int seteuid(uid_t euid); }
|
|
||||||
SYS_PATHCONF = 191 // { int pathconf(char *path, int name); }
|
|
||||||
SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); }
|
|
||||||
SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int
|
|
||||||
SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int
|
|
||||||
SYS_MMAP = 197 // { caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, int pad, off_t pos); }
|
|
||||||
// SYS_NOSYS = 198; // { int nosys(void); } __syscall __syscall_args int
|
|
||||||
SYS_LSEEK = 199 // { off_t lseek(int fd, int pad, off_t offset, int whence); }
|
|
||||||
SYS_TRUNCATE = 200 // { int truncate(char *path, int pad, off_t length); }
|
|
||||||
SYS_FTRUNCATE = 201 // { int ftruncate(int fd, int pad, off_t length); }
|
|
||||||
SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int
|
|
||||||
SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); }
|
|
||||||
SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); }
|
|
||||||
SYS_UNDELETE = 205 // { int undelete(char *path); }
|
|
||||||
SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); }
|
|
||||||
SYS_GETPGID = 207 // { int getpgid(pid_t pid); }
|
|
||||||
SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, int timeout); }
|
|
||||||
SYS___SEMCTL = 220 // { int __semctl(int semid, int semnum, int cmd, union semun *arg); }
|
|
||||||
SYS_SEMGET = 221 // { int semget(key_t key, int nsems, int semflg); }
|
|
||||||
SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, u_int nsops); }
|
|
||||||
SYS_MSGCTL = 224 // { int msgctl(int msqid, int cmd, struct msqid_ds *buf); }
|
|
||||||
SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); }
|
|
||||||
SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); }
|
|
||||||
SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); }
|
|
||||||
SYS_SHMAT = 228 // { caddr_t shmat(int shmid, const void *shmaddr, int shmflg); }
|
|
||||||
SYS_SHMCTL = 229 // { int shmctl(int shmid, int cmd, struct shmid_ds *buf); }
|
|
||||||
SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); }
|
|
||||||
SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); }
|
|
||||||
SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, struct timespec *tp); }
|
|
||||||
SYS_CLOCK_SETTIME = 233 // { int clock_settime(clockid_t clock_id, const struct timespec *tp); }
|
|
||||||
SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, struct timespec *tp); }
|
|
||||||
SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); }
|
|
||||||
SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); }
|
|
||||||
SYS_RFORK = 251 // { int rfork(int flags); }
|
|
||||||
SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, int timeout); }
|
|
||||||
SYS_ISSETUGID = 253 // { int issetugid(void); }
|
|
||||||
SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); }
|
|
||||||
SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); }
|
|
||||||
SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); }
|
|
||||||
SYS_EXTPREADV = 289 // { ssize_t extpreadv(int fd, struct iovec *iovp, u_int iovcnt, int flags, off_t offset); }
|
|
||||||
SYS_EXTPWRITEV = 290 // { ssize_t extpwritev(int fd, struct iovec *iovp,u_int iovcnt, int flags, off_t offset); }
|
|
||||||
SYS_FHSTATFS = 297 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); }
|
|
||||||
SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); }
|
|
||||||
SYS_MODNEXT = 300 // { int modnext(int modid); }
|
|
||||||
SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat* stat); }
|
|
||||||
SYS_MODFNEXT = 302 // { int modfnext(int modid); }
|
|
||||||
SYS_MODFIND = 303 // { int modfind(const char *name); }
|
|
||||||
SYS_KLDLOAD = 304 // { int kldload(const char *file); }
|
|
||||||
SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); }
|
|
||||||
SYS_KLDFIND = 306 // { int kldfind(const char *file); }
|
|
||||||
SYS_KLDNEXT = 307 // { int kldnext(int fileid); }
|
|
||||||
SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); }
|
|
||||||
SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); }
|
|
||||||
SYS_GETSID = 310 // { int getsid(pid_t pid); }
|
|
||||||
SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); }
|
|
||||||
SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); }
|
|
||||||
SYS_AIO_RETURN = 314 // { int aio_return(struct aiocb *aiocbp); }
|
|
||||||
SYS_AIO_SUSPEND = 315 // { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); }
|
|
||||||
SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); }
|
|
||||||
SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); }
|
|
||||||
SYS_AIO_READ = 318 // { int aio_read(struct aiocb *aiocbp); }
|
|
||||||
SYS_AIO_WRITE = 319 // { int aio_write(struct aiocb *aiocbp); }
|
|
||||||
SYS_LIO_LISTIO = 320 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); }
|
|
||||||
SYS_YIELD = 321 // { int yield(void); }
|
|
||||||
SYS_MLOCKALL = 324 // { int mlockall(int how); }
|
|
||||||
SYS_MUNLOCKALL = 325 // { int munlockall(void); }
|
|
||||||
SYS___GETCWD = 326 // { int __getcwd(u_char *buf, u_int buflen); }
|
|
||||||
SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); }
|
|
||||||
SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); }
|
|
||||||
SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); }
|
|
||||||
SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); }
|
|
||||||
SYS_SCHED_YIELD = 331 // { int sched_yield (void); }
|
|
||||||
SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); }
|
|
||||||
SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); }
|
|
||||||
SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, struct timespec *interval); }
|
|
||||||
SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); }
|
|
||||||
SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, void *data); }
|
|
||||||
SYS_JAIL = 338 // { int jail(struct jail *jail); }
|
|
||||||
SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, const sigset_t *set, sigset_t *oset); }
|
|
||||||
SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); }
|
|
||||||
SYS_SIGACTION = 342 // { int sigaction(int sig, const struct sigaction *act, struct sigaction *oact); }
|
|
||||||
SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); }
|
|
||||||
SYS_SIGRETURN = 344 // { int sigreturn(ucontext_t *sigcntxp); }
|
|
||||||
SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set,siginfo_t *info, const struct timespec *timeout); }
|
|
||||||
SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set,siginfo_t *info); }
|
|
||||||
SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, acl_type_t type); }
|
|
||||||
SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, acl_type_t type); }
|
|
||||||
SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); }
|
|
||||||
SYS_EXTATTR_SET_FILE = 356 // { int extattr_set_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_GET_FILE = 357 // { int extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); }
|
|
||||||
SYS_AIO_WAITCOMPLETE = 359 // { int aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); }
|
|
||||||
SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); }
|
|
||||||
SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); }
|
|
||||||
SYS_KQUEUE = 362 // { int kqueue(void); }
|
|
||||||
SYS_KEVENT = 363 // { int kevent(int fd, const struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); }
|
|
||||||
SYS_KENV = 390 // { int kenv(int what, const char *name, char *value, int len); }
|
|
||||||
SYS_LCHFLAGS = 391 // { int lchflags(char *path, int flags); }
|
|
||||||
SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); }
|
|
||||||
SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); }
|
|
||||||
SYS_VARSYM_SET = 450 // { int varsym_set(int level, const char *name, const char *data); }
|
|
||||||
SYS_VARSYM_GET = 451 // { int varsym_get(int mask, const char *wild, char *buf, int bufsize); }
|
|
||||||
SYS_VARSYM_LIST = 452 // { int varsym_list(int level, char *buf, int maxsize, int *marker); }
|
|
||||||
SYS_EXEC_SYS_REGISTER = 465 // { int exec_sys_register(void *entry); }
|
|
||||||
SYS_EXEC_SYS_UNREGISTER = 466 // { int exec_sys_unregister(int id); }
|
|
||||||
SYS_SYS_CHECKPOINT = 467 // { int sys_checkpoint(int type, int fd, pid_t pid, int retval); }
|
|
||||||
SYS_MOUNTCTL = 468 // { int mountctl(const char *path, int op, int fd, const void *ctl, int ctllen, void *buf, int buflen); }
|
|
||||||
SYS_UMTX_SLEEP = 469 // { int umtx_sleep(volatile const int *ptr, int value, int timeout); }
|
|
||||||
SYS_UMTX_WAKEUP = 470 // { int umtx_wakeup(volatile const int *ptr, int count); }
|
|
||||||
SYS_JAIL_ATTACH = 471 // { int jail_attach(int jid); }
|
|
||||||
SYS_SET_TLS_AREA = 472 // { int set_tls_area(int which, struct tls_info *info, size_t infosize); }
|
|
||||||
SYS_GET_TLS_AREA = 473 // { int get_tls_area(int which, struct tls_info *info, size_t infosize); }
|
|
||||||
SYS_CLOSEFROM = 474 // { int closefrom(int fd); }
|
|
||||||
SYS_STAT = 475 // { int stat(const char *path, struct stat *ub); }
|
|
||||||
SYS_FSTAT = 476 // { int fstat(int fd, struct stat *sb); }
|
|
||||||
SYS_LSTAT = 477 // { int lstat(const char *path, struct stat *ub); }
|
|
||||||
SYS_FHSTAT = 478 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); }
|
|
||||||
SYS_GETDIRENTRIES = 479 // { int getdirentries(int fd, char *buf, u_int count, long *basep); }
|
|
||||||
SYS_GETDENTS = 480 // { int getdents(int fd, char *buf, size_t count); }
|
|
||||||
SYS_USCHED_SET = 481 // { int usched_set(pid_t pid, int cmd, void *data, int bytes); }
|
|
||||||
SYS_EXTACCEPT = 482 // { int extaccept(int s, int flags, caddr_t name, int *anamelen); }
|
|
||||||
SYS_EXTCONNECT = 483 // { int extconnect(int s, int flags, caddr_t name, int namelen); }
|
|
||||||
SYS_MCONTROL = 485 // { int mcontrol(void *addr, size_t len, int behav, off_t value); }
|
|
||||||
SYS_VMSPACE_CREATE = 486 // { int vmspace_create(void *id, int type, void *data); }
|
|
||||||
SYS_VMSPACE_DESTROY = 487 // { int vmspace_destroy(void *id); }
|
|
||||||
SYS_VMSPACE_CTL = 488 // { int vmspace_ctl(void *id, int cmd, struct trapframe *tframe, struct vextframe *vframe); }
|
|
||||||
SYS_VMSPACE_MMAP = 489 // { int vmspace_mmap(void *id, void *addr, size_t len, int prot, int flags, int fd, off_t offset); }
|
|
||||||
SYS_VMSPACE_MUNMAP = 490 // { int vmspace_munmap(void *id, void *addr, size_t len); }
|
|
||||||
SYS_VMSPACE_MCONTROL = 491 // { int vmspace_mcontrol(void *id, void *addr, size_t len, int behav, off_t value); }
|
|
||||||
SYS_VMSPACE_PREAD = 492 // { ssize_t vmspace_pread(void *id, void *buf, size_t nbyte, int flags, off_t offset); }
|
|
||||||
SYS_VMSPACE_PWRITE = 493 // { ssize_t vmspace_pwrite(void *id, const void *buf, size_t nbyte, int flags, off_t offset); }
|
|
||||||
SYS_EXTEXIT = 494 // { void extexit(int how, int status, void *addr); }
|
|
||||||
SYS_LWP_CREATE = 495 // { int lwp_create(struct lwp_params *params); }
|
|
||||||
SYS_LWP_GETTID = 496 // { lwpid_t lwp_gettid(void); }
|
|
||||||
SYS_LWP_KILL = 497 // { int lwp_kill(pid_t pid, lwpid_t tid, int signum); }
|
|
||||||
SYS_LWP_RTPRIO = 498 // { int lwp_rtprio(int function, pid_t pid, lwpid_t tid, struct rtprio *rtp); }
|
|
||||||
SYS_PSELECT = 499 // { int pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *sigmask); }
|
|
||||||
SYS_STATVFS = 500 // { int statvfs(const char *path, struct statvfs *buf); }
|
|
||||||
SYS_FSTATVFS = 501 // { int fstatvfs(int fd, struct statvfs *buf); }
|
|
||||||
SYS_FHSTATVFS = 502 // { int fhstatvfs(const struct fhandle *u_fhp, struct statvfs *buf); }
|
|
||||||
SYS_GETVFSSTAT = 503 // { int getvfsstat(struct statfs *buf, struct statvfs *vbuf, long vbufsize, int flags); }
|
|
||||||
SYS_OPENAT = 504 // { int openat(int fd, char *path, int flags, int mode); }
|
|
||||||
SYS_FSTATAT = 505 // { int fstatat(int fd, char *path, struct stat *sb, int flags); }
|
|
||||||
SYS_FCHMODAT = 506 // { int fchmodat(int fd, char *path, int mode, int flags); }
|
|
||||||
SYS_FCHOWNAT = 507 // { int fchownat(int fd, char *path, int uid, int gid, int flags); }
|
|
||||||
SYS_UNLINKAT = 508 // { int unlinkat(int fd, char *path, int flags); }
|
|
||||||
SYS_FACCESSAT = 509 // { int faccessat(int fd, char *path, int amode, int flags); }
|
|
||||||
SYS_MQ_OPEN = 510 // { mqd_t mq_open(const char * name, int oflag, mode_t mode, struct mq_attr *attr); }
|
|
||||||
SYS_MQ_CLOSE = 511 // { int mq_close(mqd_t mqdes); }
|
|
||||||
SYS_MQ_UNLINK = 512 // { int mq_unlink(const char *name); }
|
|
||||||
SYS_MQ_GETATTR = 513 // { int mq_getattr(mqd_t mqdes, struct mq_attr *mqstat); }
|
|
||||||
SYS_MQ_SETATTR = 514 // { int mq_setattr(mqd_t mqdes, const struct mq_attr *mqstat, struct mq_attr *omqstat); }
|
|
||||||
SYS_MQ_NOTIFY = 515 // { int mq_notify(mqd_t mqdes, const struct sigevent *notification); }
|
|
||||||
SYS_MQ_SEND = 516 // { int mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio); }
|
|
||||||
SYS_MQ_RECEIVE = 517 // { ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio); }
|
|
||||||
SYS_MQ_TIMEDSEND = 518 // { int mq_timedsend(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio, const struct timespec *abs_timeout); }
|
|
||||||
SYS_MQ_TIMEDRECEIVE = 519 // { ssize_t mq_timedreceive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); }
|
|
||||||
SYS_IOPRIO_SET = 520 // { int ioprio_set(int which, int who, int prio); }
|
|
||||||
SYS_IOPRIO_GET = 521 // { int ioprio_get(int which, int who); }
|
|
||||||
SYS_CHROOT_KERNEL = 522 // { int chroot_kernel(char *path); }
|
|
||||||
SYS_RENAMEAT = 523 // { int renameat(int oldfd, char *old, int newfd, char *new); }
|
|
||||||
SYS_MKDIRAT = 524 // { int mkdirat(int fd, char *path, mode_t mode); }
|
|
||||||
SYS_MKFIFOAT = 525 // { int mkfifoat(int fd, char *path, mode_t mode); }
|
|
||||||
SYS_MKNODAT = 526 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); }
|
|
||||||
SYS_READLINKAT = 527 // { int readlinkat(int fd, char *path, char *buf, size_t bufsize); }
|
|
||||||
SYS_SYMLINKAT = 528 // { int symlinkat(char *path1, int fd, char *path2); }
|
|
||||||
SYS_SWAPOFF = 529 // { int swapoff(char *name); }
|
|
||||||
SYS_VQUOTACTL = 530 // { int vquotactl(const char *path, struct plistref *pref); }
|
|
||||||
SYS_LINKAT = 531 // { int linkat(int fd1, char *path1, int fd2, char *path2, int flags); }
|
|
||||||
SYS_EACCESS = 532 // { int eaccess(char *path, int flags); }
|
|
||||||
SYS_LPATHCONF = 533 // { int lpathconf(char *path, int name); }
|
|
||||||
SYS_VMM_GUEST_CTL = 534 // { int vmm_guest_ctl(int op, struct vmm_guest_options *options); }
|
|
||||||
SYS_VMM_GUEST_SYNC_ADDR = 535 // { int vmm_guest_sync_addr(long *dstaddr, long *srcaddr); }
|
|
||||||
SYS_PROCCTL = 536 // { int procctl(idtype_t idtype, id_t id, int cmd, void *data); }
|
|
||||||
SYS_CHFLAGSAT = 537 // { int chflagsat(int fd, const char *path, int flags, int atflags);}
|
|
||||||
SYS_PIPE2 = 538 // { int pipe2(int *fildes, int flags); }
|
|
||||||
SYS_UTIMENSAT = 539 // { int utimensat(int fd, const char *path, const struct timespec *ts, int flags); }
|
|
||||||
SYS_FUTIMENS = 540 // { int futimens(int fd, const struct timespec *ts); }
|
|
||||||
SYS_ACCEPT4 = 541 // { int accept4(int s, caddr_t name, int *anamelen, int flags); }
|
|
||||||
SYS_LWP_SETNAME = 542 // { int lwp_setname(lwpid_t tid, const char *name); }
|
|
||||||
SYS_PPOLL = 543 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *sigmask); }
|
|
||||||
SYS_LWP_SETAFFINITY = 544 // { int lwp_setaffinity(pid_t pid, lwpid_t tid, const cpumask_t *mask); }
|
|
||||||
SYS_LWP_GETAFFINITY = 545 // { int lwp_getaffinity(pid_t pid, lwpid_t tid, cpumask_t *mask); }
|
|
||||||
SYS_LWP_CREATE2 = 546 // { int lwp_create2(struct lwp_params *params, const cpumask_t *mask); }
|
|
||||||
)
|
|
||||||
=======
|
|
||||||
// go run mksysnum.go https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master
|
// go run mksysnum.go https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
|
|
@ -632,4 +315,3 @@ const (
|
||||||
SYS_GETRANDOM = 550 // { ssize_t getrandom(void *buf, size_t len, unsigned flags); }
|
SYS_GETRANDOM = 550 // { ssize_t getrandom(void *buf, size_t len, unsigned flags); }
|
||||||
SYS___REALPATH = 551 // { ssize_t __realpath(const char *path, char *buf, size_t len); }
|
SYS___REALPATH = 551 // { ssize_t __realpath(const char *path, char *buf, size_t len); }
|
||||||
)
|
)
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,401 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master
|
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
|
||||||
|
|
||||||
// +build 386,freebsd
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
const (
|
|
||||||
// SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int
|
|
||||||
SYS_EXIT = 1 // { void sys_exit(int rval); } exit sys_exit_args void
|
|
||||||
SYS_FORK = 2 // { int fork(void); }
|
|
||||||
SYS_READ = 3 // { ssize_t read(int fd, void *buf, size_t nbyte); }
|
|
||||||
SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, size_t nbyte); }
|
|
||||||
SYS_OPEN = 5 // { int open(char *path, int flags, int mode); }
|
|
||||||
SYS_CLOSE = 6 // { int close(int fd); }
|
|
||||||
SYS_WAIT4 = 7 // { int wait4(int pid, int *status, int options, struct rusage *rusage); }
|
|
||||||
SYS_LINK = 9 // { int link(char *path, char *link); }
|
|
||||||
SYS_UNLINK = 10 // { int unlink(char *path); }
|
|
||||||
SYS_CHDIR = 12 // { int chdir(char *path); }
|
|
||||||
SYS_FCHDIR = 13 // { int fchdir(int fd); }
|
|
||||||
SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); }
|
|
||||||
SYS_CHMOD = 15 // { int chmod(char *path, int mode); }
|
|
||||||
SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); }
|
|
||||||
SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int
|
|
||||||
SYS_GETPID = 20 // { pid_t getpid(void); }
|
|
||||||
SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, caddr_t data); }
|
|
||||||
SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); }
|
|
||||||
SYS_SETUID = 23 // { int setuid(uid_t uid); }
|
|
||||||
SYS_GETUID = 24 // { uid_t getuid(void); }
|
|
||||||
SYS_GETEUID = 25 // { uid_t geteuid(void); }
|
|
||||||
SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, caddr_t addr, int data); }
|
|
||||||
SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, int flags); }
|
|
||||||
SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, int flags); }
|
|
||||||
SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, size_t len, int flags, struct sockaddr * __restrict from, __socklen_t * __restrict fromlenaddr); }
|
|
||||||
SYS_ACCEPT = 30 // { int accept(int s, struct sockaddr * __restrict name, __socklen_t * __restrict anamelen); }
|
|
||||||
SYS_GETPEERNAME = 31 // { int getpeername(int fdes, struct sockaddr * __restrict asa, __socklen_t * __restrict alen); }
|
|
||||||
SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, struct sockaddr * __restrict asa, __socklen_t * __restrict alen); }
|
|
||||||
SYS_ACCESS = 33 // { int access(char *path, int amode); }
|
|
||||||
SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); }
|
|
||||||
SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); }
|
|
||||||
SYS_SYNC = 36 // { int sync(void); }
|
|
||||||
SYS_KILL = 37 // { int kill(int pid, int signum); }
|
|
||||||
SYS_GETPPID = 39 // { pid_t getppid(void); }
|
|
||||||
SYS_DUP = 41 // { int dup(u_int fd); }
|
|
||||||
SYS_PIPE = 42 // { int pipe(void); }
|
|
||||||
SYS_GETEGID = 43 // { gid_t getegid(void); }
|
|
||||||
SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, size_t offset, u_int scale); }
|
|
||||||
SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, int pid); }
|
|
||||||
SYS_GETGID = 47 // { gid_t getgid(void); }
|
|
||||||
SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int namelen); }
|
|
||||||
SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); }
|
|
||||||
SYS_ACCT = 51 // { int acct(char *path); }
|
|
||||||
SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, stack_t *oss); }
|
|
||||||
SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, caddr_t data); }
|
|
||||||
SYS_REBOOT = 55 // { int reboot(int opt); }
|
|
||||||
SYS_REVOKE = 56 // { int revoke(char *path); }
|
|
||||||
SYS_SYMLINK = 57 // { int symlink(char *path, char *link); }
|
|
||||||
SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, size_t count); }
|
|
||||||
SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); }
|
|
||||||
SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args int
|
|
||||||
SYS_CHROOT = 61 // { int chroot(char *path); }
|
|
||||||
SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); }
|
|
||||||
SYS_VFORK = 66 // { int vfork(void); }
|
|
||||||
SYS_SBRK = 69 // { int sbrk(int incr); }
|
|
||||||
SYS_SSTK = 70 // { int sstk(int incr); }
|
|
||||||
SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise ovadvise_args int
|
|
||||||
SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); }
|
|
||||||
SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, int prot); }
|
|
||||||
SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); }
|
|
||||||
SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, char *vec); }
|
|
||||||
SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); }
|
|
||||||
SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, gid_t *gidset); }
|
|
||||||
SYS_GETPGRP = 81 // { int getpgrp(void); }
|
|
||||||
SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); }
|
|
||||||
SYS_SETITIMER = 83 // { int setitimer(u_int which, struct itimerval *itv, struct itimerval *oitv); }
|
|
||||||
SYS_SWAPON = 85 // { int swapon(char *name); }
|
|
||||||
SYS_GETITIMER = 86 // { int getitimer(u_int which, struct itimerval *itv); }
|
|
||||||
SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); }
|
|
||||||
SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); }
|
|
||||||
SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); }
|
|
||||||
SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); }
|
|
||||||
SYS_FSYNC = 95 // { int fsync(int fd); }
|
|
||||||
SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, int prio); }
|
|
||||||
SYS_SOCKET = 97 // { int socket(int domain, int type, int protocol); }
|
|
||||||
SYS_CONNECT = 98 // { int connect(int s, caddr_t name, int namelen); }
|
|
||||||
SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); }
|
|
||||||
SYS_BIND = 104 // { int bind(int s, caddr_t name, int namelen); }
|
|
||||||
SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, caddr_t val, int valsize); }
|
|
||||||
SYS_LISTEN = 106 // { int listen(int s, int backlog); }
|
|
||||||
SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, struct timezone *tzp); }
|
|
||||||
SYS_GETRUSAGE = 117 // { int getrusage(int who, struct rusage *rusage); }
|
|
||||||
SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, caddr_t val, int *avalsize); }
|
|
||||||
SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, u_int iovcnt); }
|
|
||||||
SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, u_int iovcnt); }
|
|
||||||
SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, struct timezone *tzp); }
|
|
||||||
SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); }
|
|
||||||
SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); }
|
|
||||||
SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); }
|
|
||||||
SYS_SETREGID = 127 // { int setregid(int rgid, int egid); }
|
|
||||||
SYS_RENAME = 128 // { int rename(char *from, char *to); }
|
|
||||||
SYS_FLOCK = 131 // { int flock(int fd, int how); }
|
|
||||||
SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); }
|
|
||||||
SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, int flags, caddr_t to, int tolen); }
|
|
||||||
SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); }
|
|
||||||
SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, int protocol, int *rsv); }
|
|
||||||
SYS_MKDIR = 136 // { int mkdir(char *path, int mode); }
|
|
||||||
SYS_RMDIR = 137 // { int rmdir(char *path); }
|
|
||||||
SYS_UTIMES = 138 // { int utimes(char *path, struct timeval *tptr); }
|
|
||||||
SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, struct timeval *olddelta); }
|
|
||||||
SYS_SETSID = 147 // { int setsid(void); }
|
|
||||||
SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, caddr_t arg); }
|
|
||||||
SYS_NLM_SYSCALL = 154 // { int nlm_syscall(int debug_level, int grace_period, int addr_count, char **addrs); }
|
|
||||||
SYS_NFSSVC = 155 // { int nfssvc(int flag, caddr_t argp); }
|
|
||||||
SYS_LGETFH = 160 // { int lgetfh(char *fname, struct fhandle *fhp); }
|
|
||||||
SYS_GETFH = 161 // { int getfh(char *fname, struct fhandle *fhp); }
|
|
||||||
SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); }
|
|
||||||
SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, struct rtprio *rtp); }
|
|
||||||
SYS_SEMSYS = 169 // { int semsys(int which, int a2, int a3, int a4, int a5); }
|
|
||||||
SYS_MSGSYS = 170 // { int msgsys(int which, int a2, int a3, int a4, int a5, int a6); }
|
|
||||||
SYS_SHMSYS = 171 // { int shmsys(int which, int a2, int a3, int a4); }
|
|
||||||
SYS_SETFIB = 175 // { int setfib(int fibnum); }
|
|
||||||
SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); }
|
|
||||||
SYS_SETGID = 181 // { int setgid(gid_t gid); }
|
|
||||||
SYS_SETEGID = 182 // { int setegid(gid_t egid); }
|
|
||||||
SYS_SETEUID = 183 // { int seteuid(uid_t euid); }
|
|
||||||
SYS_STAT = 188 // { int stat(char *path, struct stat *ub); }
|
|
||||||
SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); }
|
|
||||||
SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); }
|
|
||||||
SYS_PATHCONF = 191 // { int pathconf(char *path, int name); }
|
|
||||||
SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); }
|
|
||||||
SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int
|
|
||||||
SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int
|
|
||||||
SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, u_int count, long *basep); }
|
|
||||||
SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int
|
|
||||||
SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); }
|
|
||||||
SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); }
|
|
||||||
SYS_UNDELETE = 205 // { int undelete(char *path); }
|
|
||||||
SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); }
|
|
||||||
SYS_GETPGID = 207 // { int getpgid(pid_t pid); }
|
|
||||||
SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, int timeout); }
|
|
||||||
SYS_SEMGET = 221 // { int semget(key_t key, int nsems, int semflg); }
|
|
||||||
SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, size_t nsops); }
|
|
||||||
SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); }
|
|
||||||
SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); }
|
|
||||||
SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); }
|
|
||||||
SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, int shmflg); }
|
|
||||||
SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); }
|
|
||||||
SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); }
|
|
||||||
SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, struct timespec *tp); }
|
|
||||||
SYS_CLOCK_SETTIME = 233 // { int clock_settime( clockid_t clock_id, const struct timespec *tp); }
|
|
||||||
SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, struct timespec *tp); }
|
|
||||||
SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, struct sigevent *evp, int *timerid); }
|
|
||||||
SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); }
|
|
||||||
SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); }
|
|
||||||
SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct itimerspec *value); }
|
|
||||||
SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); }
|
|
||||||
SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); }
|
|
||||||
SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); }
|
|
||||||
SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( struct ffclock_estimate *cest); }
|
|
||||||
SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( struct ffclock_estimate *cest); }
|
|
||||||
SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); }
|
|
||||||
SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,int which, clockid_t *clock_id); }
|
|
||||||
SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); }
|
|
||||||
SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); }
|
|
||||||
SYS_RFORK = 251 // { int rfork(int flags); }
|
|
||||||
SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, int timeout); }
|
|
||||||
SYS_ISSETUGID = 253 // { int issetugid(void); }
|
|
||||||
SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); }
|
|
||||||
SYS_AIO_READ = 255 // { int aio_read(struct aiocb *aiocbp); }
|
|
||||||
SYS_AIO_WRITE = 256 // { int aio_write(struct aiocb *aiocbp); }
|
|
||||||
SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); }
|
|
||||||
SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, size_t count); }
|
|
||||||
SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); }
|
|
||||||
SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); }
|
|
||||||
SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); }
|
|
||||||
SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); }
|
|
||||||
SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); }
|
|
||||||
SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); }
|
|
||||||
SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); }
|
|
||||||
SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); }
|
|
||||||
SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); }
|
|
||||||
SYS_MODNEXT = 300 // { int modnext(int modid); }
|
|
||||||
SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat *stat); }
|
|
||||||
SYS_MODFNEXT = 302 // { int modfnext(int modid); }
|
|
||||||
SYS_MODFIND = 303 // { int modfind(const char *name); }
|
|
||||||
SYS_KLDLOAD = 304 // { int kldload(const char *file); }
|
|
||||||
SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); }
|
|
||||||
SYS_KLDFIND = 306 // { int kldfind(const char *file); }
|
|
||||||
SYS_KLDNEXT = 307 // { int kldnext(int fileid); }
|
|
||||||
SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); }
|
|
||||||
SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); }
|
|
||||||
SYS_GETSID = 310 // { int getsid(pid_t pid); }
|
|
||||||
SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); }
|
|
||||||
SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); }
|
|
||||||
SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); }
|
|
||||||
SYS_AIO_SUSPEND = 315 // { int aio_suspend( struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); }
|
|
||||||
SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); }
|
|
||||||
SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); }
|
|
||||||
SYS_YIELD = 321 // { int yield(void); }
|
|
||||||
SYS_MLOCKALL = 324 // { int mlockall(int how); }
|
|
||||||
SYS_MUNLOCKALL = 325 // { int munlockall(void); }
|
|
||||||
SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); }
|
|
||||||
SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); }
|
|
||||||
SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); }
|
|
||||||
SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); }
|
|
||||||
SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); }
|
|
||||||
SYS_SCHED_YIELD = 331 // { int sched_yield (void); }
|
|
||||||
SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); }
|
|
||||||
SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); }
|
|
||||||
SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, struct timespec *interval); }
|
|
||||||
SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); }
|
|
||||||
SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, void *data); }
|
|
||||||
SYS_JAIL = 338 // { int jail(struct jail *jail); }
|
|
||||||
SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, const sigset_t *set, sigset_t *oset); }
|
|
||||||
SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); }
|
|
||||||
SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); }
|
|
||||||
SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, siginfo_t *info, const struct timespec *timeout); }
|
|
||||||
SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, siginfo_t *info); }
|
|
||||||
SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, acl_type_t type); }
|
|
||||||
SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, acl_type_t type); }
|
|
||||||
SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); }
|
|
||||||
SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); }
|
|
||||||
SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); }
|
|
||||||
SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); }
|
|
||||||
SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); }
|
|
||||||
SYS_KQUEUE = 362 // { int kqueue(void); }
|
|
||||||
SYS_KEVENT = 363 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); }
|
|
||||||
SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, int attrnamespace, const char *attrname); }
|
|
||||||
SYS___SETUGID = 374 // { int __setugid(int flag); }
|
|
||||||
SYS_EACCESS = 376 // { int eaccess(char *path, int amode); }
|
|
||||||
SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, unsigned int iovcnt, int flags); }
|
|
||||||
SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); }
|
|
||||||
SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); }
|
|
||||||
SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, struct mac *mac_p); }
|
|
||||||
SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, struct mac *mac_p); }
|
|
||||||
SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, struct mac *mac_p); }
|
|
||||||
SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, struct mac *mac_p); }
|
|
||||||
SYS_KENV = 390 // { int kenv(int what, const char *name, char *value, int len); }
|
|
||||||
SYS_LCHFLAGS = 391 // { int lchflags(const char *path, u_long flags); }
|
|
||||||
SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); }
|
|
||||||
SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); }
|
|
||||||
SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); }
|
|
||||||
SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int mode); }
|
|
||||||
SYS_STATFS = 396 // { int statfs(char *path, struct statfs *buf); }
|
|
||||||
SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); }
|
|
||||||
SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); }
|
|
||||||
SYS_KSEM_CLOSE = 400 // { int ksem_close(semid_t id); }
|
|
||||||
SYS_KSEM_POST = 401 // { int ksem_post(semid_t id); }
|
|
||||||
SYS_KSEM_WAIT = 402 // { int ksem_wait(semid_t id); }
|
|
||||||
SYS_KSEM_TRYWAIT = 403 // { int ksem_trywait(semid_t id); }
|
|
||||||
SYS_KSEM_INIT = 404 // { int ksem_init(semid_t *idp, unsigned int value); }
|
|
||||||
SYS_KSEM_OPEN = 405 // { int ksem_open(semid_t *idp, const char *name, int oflag, mode_t mode, unsigned int value); }
|
|
||||||
SYS_KSEM_UNLINK = 406 // { int ksem_unlink(const char *name); }
|
|
||||||
SYS_KSEM_GETVALUE = 407 // { int ksem_getvalue(semid_t id, int *val); }
|
|
||||||
SYS_KSEM_DESTROY = 408 // { int ksem_destroy(semid_t id); }
|
|
||||||
SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, struct mac *mac_p); }
|
|
||||||
SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, struct mac *mac_p); }
|
|
||||||
SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, struct mac *mac_p); }
|
|
||||||
SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( const char *path, int attrnamespace, const char *attrname); }
|
|
||||||
SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, char **envv, struct mac *mac_p); }
|
|
||||||
SYS_SIGACTION = 416 // { int sigaction(int sig, const struct sigaction *act, struct sigaction *oact); }
|
|
||||||
SYS_SIGRETURN = 417 // { int sigreturn( const struct __ucontext *sigcntxp); }
|
|
||||||
SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); }
|
|
||||||
SYS_SETCONTEXT = 422 // { int setcontext( const struct __ucontext *ucp); }
|
|
||||||
SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, const struct __ucontext *ucp); }
|
|
||||||
SYS_SWAPOFF = 424 // { int swapoff(const char *name); }
|
|
||||||
SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, acl_type_t type); }
|
|
||||||
SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, int *sig); }
|
|
||||||
SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, int flags); }
|
|
||||||
SYS_THR_EXIT = 431 // { void thr_exit(long *state); }
|
|
||||||
SYS_THR_SELF = 432 // { int thr_self(long *id); }
|
|
||||||
SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); }
|
|
||||||
SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); }
|
|
||||||
SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( const char *path, int attrnamespace, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( const char *path, int attrnamespace, void *data, size_t nbytes); }
|
|
||||||
SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, const struct timespec *abstime); }
|
|
||||||
SYS_THR_SUSPEND = 442 // { int thr_suspend( const struct timespec *timeout); }
|
|
||||||
SYS_THR_WAKE = 443 // { int thr_wake(long id); }
|
|
||||||
SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); }
|
|
||||||
SYS_AUDIT = 445 // { int audit(const void *record, u_int length); }
|
|
||||||
SYS_AUDITON = 446 // { int auditon(int cmd, void *data, u_int length); }
|
|
||||||
SYS_GETAUID = 447 // { int getauid(uid_t *auid); }
|
|
||||||
SYS_SETAUID = 448 // { int setauid(uid_t *auid); }
|
|
||||||
SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); }
|
|
||||||
SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); }
|
|
||||||
SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); }
|
|
||||||
SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); }
|
|
||||||
SYS_AUDITCTL = 453 // { int auditctl(char *path); }
|
|
||||||
SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, u_long val, void *uaddr1, void *uaddr2); }
|
|
||||||
SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, int param_size); }
|
|
||||||
SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); }
|
|
||||||
SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, mode_t mode, const struct mq_attr *attr); }
|
|
||||||
SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); }
|
|
||||||
SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); }
|
|
||||||
SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len,unsigned msg_prio, const struct timespec *abs_timeout);}
|
|
||||||
SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); }
|
|
||||||
SYS_KMQ_UNLINK = 462 // { int kmq_unlink(const char *path); }
|
|
||||||
SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); }
|
|
||||||
SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); }
|
|
||||||
SYS_AIO_FSYNC = 465 // { int aio_fsync(int op, struct aiocb *aiocbp); }
|
|
||||||
SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, lwpid_t lwpid, struct rtprio *rtp); }
|
|
||||||
SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); }
|
|
||||||
SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); }
|
|
||||||
SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); }
|
|
||||||
SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr * from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); }
|
|
||||||
SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset); }
|
|
||||||
SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset); }
|
|
||||||
SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, off_t pos); }
|
|
||||||
SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, int whence); }
|
|
||||||
SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); }
|
|
||||||
SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); }
|
|
||||||
SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); }
|
|
||||||
SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, mode_t mode); }
|
|
||||||
SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); }
|
|
||||||
SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); }
|
|
||||||
SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, cpusetid_t setid); }
|
|
||||||
SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, cpuwhich_t which, id_t id, cpusetid_t *setid); }
|
|
||||||
SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, cpuwhich_t which, id_t id, size_t cpusetsize, cpuset_t *mask); }
|
|
||||||
SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, cpuwhich_t which, id_t id, size_t cpusetsize, const cpuset_t *mask); }
|
|
||||||
SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, int flag); }
|
|
||||||
SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, int flag); }
|
|
||||||
SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, gid_t gid, int flag); }
|
|
||||||
SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, char **envv); }
|
|
||||||
SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, struct stat *buf, int flag); }
|
|
||||||
SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, struct timeval *times); }
|
|
||||||
SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, char *path2, int flag); }
|
|
||||||
SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); }
|
|
||||||
SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); }
|
|
||||||
SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); }
|
|
||||||
SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, mode_t mode); }
|
|
||||||
SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, size_t bufsize); }
|
|
||||||
SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, char *new); }
|
|
||||||
SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, char *path2); }
|
|
||||||
SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); }
|
|
||||||
SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); }
|
|
||||||
SYS_GSSD_SYSCALL = 505 // { int gssd_syscall(char *path); }
|
|
||||||
SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, unsigned int iovcnt, int flags); }
|
|
||||||
SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, unsigned int iovcnt, int flags); }
|
|
||||||
SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); }
|
|
||||||
SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); }
|
|
||||||
SYS___SEMCTL = 510 // { int __semctl(int semid, int semnum, int cmd, union semun *arg); }
|
|
||||||
SYS_MSGCTL = 511 // { int msgctl(int msqid, int cmd, struct msqid_ds *buf); }
|
|
||||||
SYS_SHMCTL = 512 // { int shmctl(int shmid, int cmd, struct shmid_ds *buf); }
|
|
||||||
SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); }
|
|
||||||
SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, int fd, cap_rights_t *rightsp); }
|
|
||||||
SYS_CAP_ENTER = 516 // { int cap_enter(void); }
|
|
||||||
SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); }
|
|
||||||
SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); }
|
|
||||||
SYS_PDKILL = 519 // { int pdkill(int fd, int signum); }
|
|
||||||
SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); }
|
|
||||||
SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *sm); }
|
|
||||||
SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, size_t namelen); }
|
|
||||||
SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); }
|
|
||||||
SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); }
|
|
||||||
SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); }
|
|
||||||
SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); }
|
|
||||||
SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); }
|
|
||||||
SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); }
|
|
||||||
SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, off_t offset, off_t len); }
|
|
||||||
SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, off_t len, int advice); }
|
|
||||||
SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, int *status, int options, struct __wrusage *wrusage, siginfo_t *info); }
|
|
||||||
SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, cap_rights_t *rightsp); }
|
|
||||||
SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, const u_long *cmds, size_t ncmds); }
|
|
||||||
SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, u_long *cmds, size_t maxcmds); }
|
|
||||||
SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, uint32_t fcntlrights); }
|
|
||||||
SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, uint32_t *fcntlrightsp); }
|
|
||||||
SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, int namelen); }
|
|
||||||
SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, int namelen); }
|
|
||||||
SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, u_long flags, int atflag); }
|
|
||||||
SYS_ACCEPT4 = 541 // { int accept4(int s, struct sockaddr * __restrict name, __socklen_t * __restrict anamelen, int flags); }
|
|
||||||
SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); }
|
|
||||||
SYS_AIO_MLOCK = 543 // { int aio_mlock(struct aiocb *aiocbp); }
|
|
||||||
SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, int com, void *data); }
|
|
||||||
SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); }
|
|
||||||
SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); }
|
|
||||||
SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); }
|
|
||||||
SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, id_t id, struct vm_domain_policy_entry *policy); }
|
|
||||||
SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); }
|
|
||||||
SYS_FDATASYNC = 550 // { int fdatasync(int fd); }
|
|
||||||
)
|
|
||||||
=======
|
|
||||||
// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master
|
// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
|
|
@ -793,4 +395,3 @@ const (
|
||||||
SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); }
|
SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); }
|
||||||
SYS_FDATASYNC = 550 // { int fdatasync(int fd); }
|
SYS_FDATASYNC = 550 // { int fdatasync(int fd); }
|
||||||
)
|
)
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,401 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master
|
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
|
||||||
|
|
||||||
// +build amd64,freebsd
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
const (
|
|
||||||
// SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int
|
|
||||||
SYS_EXIT = 1 // { void sys_exit(int rval); } exit sys_exit_args void
|
|
||||||
SYS_FORK = 2 // { int fork(void); }
|
|
||||||
SYS_READ = 3 // { ssize_t read(int fd, void *buf, size_t nbyte); }
|
|
||||||
SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, size_t nbyte); }
|
|
||||||
SYS_OPEN = 5 // { int open(char *path, int flags, int mode); }
|
|
||||||
SYS_CLOSE = 6 // { int close(int fd); }
|
|
||||||
SYS_WAIT4 = 7 // { int wait4(int pid, int *status, int options, struct rusage *rusage); }
|
|
||||||
SYS_LINK = 9 // { int link(char *path, char *link); }
|
|
||||||
SYS_UNLINK = 10 // { int unlink(char *path); }
|
|
||||||
SYS_CHDIR = 12 // { int chdir(char *path); }
|
|
||||||
SYS_FCHDIR = 13 // { int fchdir(int fd); }
|
|
||||||
SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); }
|
|
||||||
SYS_CHMOD = 15 // { int chmod(char *path, int mode); }
|
|
||||||
SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); }
|
|
||||||
SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int
|
|
||||||
SYS_GETPID = 20 // { pid_t getpid(void); }
|
|
||||||
SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, caddr_t data); }
|
|
||||||
SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); }
|
|
||||||
SYS_SETUID = 23 // { int setuid(uid_t uid); }
|
|
||||||
SYS_GETUID = 24 // { uid_t getuid(void); }
|
|
||||||
SYS_GETEUID = 25 // { uid_t geteuid(void); }
|
|
||||||
SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, caddr_t addr, int data); }
|
|
||||||
SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, int flags); }
|
|
||||||
SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, int flags); }
|
|
||||||
SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, size_t len, int flags, struct sockaddr * __restrict from, __socklen_t * __restrict fromlenaddr); }
|
|
||||||
SYS_ACCEPT = 30 // { int accept(int s, struct sockaddr * __restrict name, __socklen_t * __restrict anamelen); }
|
|
||||||
SYS_GETPEERNAME = 31 // { int getpeername(int fdes, struct sockaddr * __restrict asa, __socklen_t * __restrict alen); }
|
|
||||||
SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, struct sockaddr * __restrict asa, __socklen_t * __restrict alen); }
|
|
||||||
SYS_ACCESS = 33 // { int access(char *path, int amode); }
|
|
||||||
SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); }
|
|
||||||
SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); }
|
|
||||||
SYS_SYNC = 36 // { int sync(void); }
|
|
||||||
SYS_KILL = 37 // { int kill(int pid, int signum); }
|
|
||||||
SYS_GETPPID = 39 // { pid_t getppid(void); }
|
|
||||||
SYS_DUP = 41 // { int dup(u_int fd); }
|
|
||||||
SYS_PIPE = 42 // { int pipe(void); }
|
|
||||||
SYS_GETEGID = 43 // { gid_t getegid(void); }
|
|
||||||
SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, size_t offset, u_int scale); }
|
|
||||||
SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, int pid); }
|
|
||||||
SYS_GETGID = 47 // { gid_t getgid(void); }
|
|
||||||
SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int namelen); }
|
|
||||||
SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); }
|
|
||||||
SYS_ACCT = 51 // { int acct(char *path); }
|
|
||||||
SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, stack_t *oss); }
|
|
||||||
SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, caddr_t data); }
|
|
||||||
SYS_REBOOT = 55 // { int reboot(int opt); }
|
|
||||||
SYS_REVOKE = 56 // { int revoke(char *path); }
|
|
||||||
SYS_SYMLINK = 57 // { int symlink(char *path, char *link); }
|
|
||||||
SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, size_t count); }
|
|
||||||
SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); }
|
|
||||||
SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args int
|
|
||||||
SYS_CHROOT = 61 // { int chroot(char *path); }
|
|
||||||
SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); }
|
|
||||||
SYS_VFORK = 66 // { int vfork(void); }
|
|
||||||
SYS_SBRK = 69 // { int sbrk(int incr); }
|
|
||||||
SYS_SSTK = 70 // { int sstk(int incr); }
|
|
||||||
SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise ovadvise_args int
|
|
||||||
SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); }
|
|
||||||
SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, int prot); }
|
|
||||||
SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); }
|
|
||||||
SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, char *vec); }
|
|
||||||
SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); }
|
|
||||||
SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, gid_t *gidset); }
|
|
||||||
SYS_GETPGRP = 81 // { int getpgrp(void); }
|
|
||||||
SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); }
|
|
||||||
SYS_SETITIMER = 83 // { int setitimer(u_int which, struct itimerval *itv, struct itimerval *oitv); }
|
|
||||||
SYS_SWAPON = 85 // { int swapon(char *name); }
|
|
||||||
SYS_GETITIMER = 86 // { int getitimer(u_int which, struct itimerval *itv); }
|
|
||||||
SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); }
|
|
||||||
SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); }
|
|
||||||
SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); }
|
|
||||||
SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); }
|
|
||||||
SYS_FSYNC = 95 // { int fsync(int fd); }
|
|
||||||
SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, int prio); }
|
|
||||||
SYS_SOCKET = 97 // { int socket(int domain, int type, int protocol); }
|
|
||||||
SYS_CONNECT = 98 // { int connect(int s, caddr_t name, int namelen); }
|
|
||||||
SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); }
|
|
||||||
SYS_BIND = 104 // { int bind(int s, caddr_t name, int namelen); }
|
|
||||||
SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, caddr_t val, int valsize); }
|
|
||||||
SYS_LISTEN = 106 // { int listen(int s, int backlog); }
|
|
||||||
SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, struct timezone *tzp); }
|
|
||||||
SYS_GETRUSAGE = 117 // { int getrusage(int who, struct rusage *rusage); }
|
|
||||||
SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, caddr_t val, int *avalsize); }
|
|
||||||
SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, u_int iovcnt); }
|
|
||||||
SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, u_int iovcnt); }
|
|
||||||
SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, struct timezone *tzp); }
|
|
||||||
SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); }
|
|
||||||
SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); }
|
|
||||||
SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); }
|
|
||||||
SYS_SETREGID = 127 // { int setregid(int rgid, int egid); }
|
|
||||||
SYS_RENAME = 128 // { int rename(char *from, char *to); }
|
|
||||||
SYS_FLOCK = 131 // { int flock(int fd, int how); }
|
|
||||||
SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); }
|
|
||||||
SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, int flags, caddr_t to, int tolen); }
|
|
||||||
SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); }
|
|
||||||
SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, int protocol, int *rsv); }
|
|
||||||
SYS_MKDIR = 136 // { int mkdir(char *path, int mode); }
|
|
||||||
SYS_RMDIR = 137 // { int rmdir(char *path); }
|
|
||||||
SYS_UTIMES = 138 // { int utimes(char *path, struct timeval *tptr); }
|
|
||||||
SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, struct timeval *olddelta); }
|
|
||||||
SYS_SETSID = 147 // { int setsid(void); }
|
|
||||||
SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, caddr_t arg); }
|
|
||||||
SYS_NLM_SYSCALL = 154 // { int nlm_syscall(int debug_level, int grace_period, int addr_count, char **addrs); }
|
|
||||||
SYS_NFSSVC = 155 // { int nfssvc(int flag, caddr_t argp); }
|
|
||||||
SYS_LGETFH = 160 // { int lgetfh(char *fname, struct fhandle *fhp); }
|
|
||||||
SYS_GETFH = 161 // { int getfh(char *fname, struct fhandle *fhp); }
|
|
||||||
SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); }
|
|
||||||
SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, struct rtprio *rtp); }
|
|
||||||
SYS_SEMSYS = 169 // { int semsys(int which, int a2, int a3, int a4, int a5); }
|
|
||||||
SYS_MSGSYS = 170 // { int msgsys(int which, int a2, int a3, int a4, int a5, int a6); }
|
|
||||||
SYS_SHMSYS = 171 // { int shmsys(int which, int a2, int a3, int a4); }
|
|
||||||
SYS_SETFIB = 175 // { int setfib(int fibnum); }
|
|
||||||
SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); }
|
|
||||||
SYS_SETGID = 181 // { int setgid(gid_t gid); }
|
|
||||||
SYS_SETEGID = 182 // { int setegid(gid_t egid); }
|
|
||||||
SYS_SETEUID = 183 // { int seteuid(uid_t euid); }
|
|
||||||
SYS_STAT = 188 // { int stat(char *path, struct stat *ub); }
|
|
||||||
SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); }
|
|
||||||
SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); }
|
|
||||||
SYS_PATHCONF = 191 // { int pathconf(char *path, int name); }
|
|
||||||
SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); }
|
|
||||||
SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int
|
|
||||||
SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int
|
|
||||||
SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, u_int count, long *basep); }
|
|
||||||
SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int
|
|
||||||
SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); }
|
|
||||||
SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); }
|
|
||||||
SYS_UNDELETE = 205 // { int undelete(char *path); }
|
|
||||||
SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); }
|
|
||||||
SYS_GETPGID = 207 // { int getpgid(pid_t pid); }
|
|
||||||
SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, int timeout); }
|
|
||||||
SYS_SEMGET = 221 // { int semget(key_t key, int nsems, int semflg); }
|
|
||||||
SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, size_t nsops); }
|
|
||||||
SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); }
|
|
||||||
SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); }
|
|
||||||
SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); }
|
|
||||||
SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, int shmflg); }
|
|
||||||
SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); }
|
|
||||||
SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); }
|
|
||||||
SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, struct timespec *tp); }
|
|
||||||
SYS_CLOCK_SETTIME = 233 // { int clock_settime( clockid_t clock_id, const struct timespec *tp); }
|
|
||||||
SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, struct timespec *tp); }
|
|
||||||
SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, struct sigevent *evp, int *timerid); }
|
|
||||||
SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); }
|
|
||||||
SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); }
|
|
||||||
SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct itimerspec *value); }
|
|
||||||
SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); }
|
|
||||||
SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); }
|
|
||||||
SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); }
|
|
||||||
SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( struct ffclock_estimate *cest); }
|
|
||||||
SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( struct ffclock_estimate *cest); }
|
|
||||||
SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); }
|
|
||||||
SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,int which, clockid_t *clock_id); }
|
|
||||||
SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); }
|
|
||||||
SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); }
|
|
||||||
SYS_RFORK = 251 // { int rfork(int flags); }
|
|
||||||
SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, int timeout); }
|
|
||||||
SYS_ISSETUGID = 253 // { int issetugid(void); }
|
|
||||||
SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); }
|
|
||||||
SYS_AIO_READ = 255 // { int aio_read(struct aiocb *aiocbp); }
|
|
||||||
SYS_AIO_WRITE = 256 // { int aio_write(struct aiocb *aiocbp); }
|
|
||||||
SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); }
|
|
||||||
SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, size_t count); }
|
|
||||||
SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); }
|
|
||||||
SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); }
|
|
||||||
SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); }
|
|
||||||
SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); }
|
|
||||||
SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); }
|
|
||||||
SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); }
|
|
||||||
SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); }
|
|
||||||
SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); }
|
|
||||||
SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); }
|
|
||||||
SYS_MODNEXT = 300 // { int modnext(int modid); }
|
|
||||||
SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat *stat); }
|
|
||||||
SYS_MODFNEXT = 302 // { int modfnext(int modid); }
|
|
||||||
SYS_MODFIND = 303 // { int modfind(const char *name); }
|
|
||||||
SYS_KLDLOAD = 304 // { int kldload(const char *file); }
|
|
||||||
SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); }
|
|
||||||
SYS_KLDFIND = 306 // { int kldfind(const char *file); }
|
|
||||||
SYS_KLDNEXT = 307 // { int kldnext(int fileid); }
|
|
||||||
SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); }
|
|
||||||
SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); }
|
|
||||||
SYS_GETSID = 310 // { int getsid(pid_t pid); }
|
|
||||||
SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); }
|
|
||||||
SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); }
|
|
||||||
SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); }
|
|
||||||
SYS_AIO_SUSPEND = 315 // { int aio_suspend( struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); }
|
|
||||||
SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); }
|
|
||||||
SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); }
|
|
||||||
SYS_YIELD = 321 // { int yield(void); }
|
|
||||||
SYS_MLOCKALL = 324 // { int mlockall(int how); }
|
|
||||||
SYS_MUNLOCKALL = 325 // { int munlockall(void); }
|
|
||||||
SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); }
|
|
||||||
SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); }
|
|
||||||
SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); }
|
|
||||||
SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); }
|
|
||||||
SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); }
|
|
||||||
SYS_SCHED_YIELD = 331 // { int sched_yield (void); }
|
|
||||||
SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); }
|
|
||||||
SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); }
|
|
||||||
SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, struct timespec *interval); }
|
|
||||||
SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); }
|
|
||||||
SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, void *data); }
|
|
||||||
SYS_JAIL = 338 // { int jail(struct jail *jail); }
|
|
||||||
SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, const sigset_t *set, sigset_t *oset); }
|
|
||||||
SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); }
|
|
||||||
SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); }
|
|
||||||
SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, siginfo_t *info, const struct timespec *timeout); }
|
|
||||||
SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, siginfo_t *info); }
|
|
||||||
SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, acl_type_t type); }
|
|
||||||
SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, acl_type_t type); }
|
|
||||||
SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); }
|
|
||||||
SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); }
|
|
||||||
SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); }
|
|
||||||
SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); }
|
|
||||||
SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); }
|
|
||||||
SYS_KQUEUE = 362 // { int kqueue(void); }
|
|
||||||
SYS_KEVENT = 363 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); }
|
|
||||||
SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, int attrnamespace, const char *attrname); }
|
|
||||||
SYS___SETUGID = 374 // { int __setugid(int flag); }
|
|
||||||
SYS_EACCESS = 376 // { int eaccess(char *path, int amode); }
|
|
||||||
SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, unsigned int iovcnt, int flags); }
|
|
||||||
SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); }
|
|
||||||
SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); }
|
|
||||||
SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, struct mac *mac_p); }
|
|
||||||
SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, struct mac *mac_p); }
|
|
||||||
SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, struct mac *mac_p); }
|
|
||||||
SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, struct mac *mac_p); }
|
|
||||||
SYS_KENV = 390 // { int kenv(int what, const char *name, char *value, int len); }
|
|
||||||
SYS_LCHFLAGS = 391 // { int lchflags(const char *path, u_long flags); }
|
|
||||||
SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); }
|
|
||||||
SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); }
|
|
||||||
SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); }
|
|
||||||
SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int mode); }
|
|
||||||
SYS_STATFS = 396 // { int statfs(char *path, struct statfs *buf); }
|
|
||||||
SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); }
|
|
||||||
SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); }
|
|
||||||
SYS_KSEM_CLOSE = 400 // { int ksem_close(semid_t id); }
|
|
||||||
SYS_KSEM_POST = 401 // { int ksem_post(semid_t id); }
|
|
||||||
SYS_KSEM_WAIT = 402 // { int ksem_wait(semid_t id); }
|
|
||||||
SYS_KSEM_TRYWAIT = 403 // { int ksem_trywait(semid_t id); }
|
|
||||||
SYS_KSEM_INIT = 404 // { int ksem_init(semid_t *idp, unsigned int value); }
|
|
||||||
SYS_KSEM_OPEN = 405 // { int ksem_open(semid_t *idp, const char *name, int oflag, mode_t mode, unsigned int value); }
|
|
||||||
SYS_KSEM_UNLINK = 406 // { int ksem_unlink(const char *name); }
|
|
||||||
SYS_KSEM_GETVALUE = 407 // { int ksem_getvalue(semid_t id, int *val); }
|
|
||||||
SYS_KSEM_DESTROY = 408 // { int ksem_destroy(semid_t id); }
|
|
||||||
SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, struct mac *mac_p); }
|
|
||||||
SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, struct mac *mac_p); }
|
|
||||||
SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, struct mac *mac_p); }
|
|
||||||
SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( const char *path, int attrnamespace, const char *attrname); }
|
|
||||||
SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, char **envv, struct mac *mac_p); }
|
|
||||||
SYS_SIGACTION = 416 // { int sigaction(int sig, const struct sigaction *act, struct sigaction *oact); }
|
|
||||||
SYS_SIGRETURN = 417 // { int sigreturn( const struct __ucontext *sigcntxp); }
|
|
||||||
SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); }
|
|
||||||
SYS_SETCONTEXT = 422 // { int setcontext( const struct __ucontext *ucp); }
|
|
||||||
SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, const struct __ucontext *ucp); }
|
|
||||||
SYS_SWAPOFF = 424 // { int swapoff(const char *name); }
|
|
||||||
SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, acl_type_t type); }
|
|
||||||
SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, int *sig); }
|
|
||||||
SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, int flags); }
|
|
||||||
SYS_THR_EXIT = 431 // { void thr_exit(long *state); }
|
|
||||||
SYS_THR_SELF = 432 // { int thr_self(long *id); }
|
|
||||||
SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); }
|
|
||||||
SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); }
|
|
||||||
SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( const char *path, int attrnamespace, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( const char *path, int attrnamespace, void *data, size_t nbytes); }
|
|
||||||
SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, const struct timespec *abstime); }
|
|
||||||
SYS_THR_SUSPEND = 442 // { int thr_suspend( const struct timespec *timeout); }
|
|
||||||
SYS_THR_WAKE = 443 // { int thr_wake(long id); }
|
|
||||||
SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); }
|
|
||||||
SYS_AUDIT = 445 // { int audit(const void *record, u_int length); }
|
|
||||||
SYS_AUDITON = 446 // { int auditon(int cmd, void *data, u_int length); }
|
|
||||||
SYS_GETAUID = 447 // { int getauid(uid_t *auid); }
|
|
||||||
SYS_SETAUID = 448 // { int setauid(uid_t *auid); }
|
|
||||||
SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); }
|
|
||||||
SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); }
|
|
||||||
SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); }
|
|
||||||
SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); }
|
|
||||||
SYS_AUDITCTL = 453 // { int auditctl(char *path); }
|
|
||||||
SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, u_long val, void *uaddr1, void *uaddr2); }
|
|
||||||
SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, int param_size); }
|
|
||||||
SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); }
|
|
||||||
SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, mode_t mode, const struct mq_attr *attr); }
|
|
||||||
SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); }
|
|
||||||
SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); }
|
|
||||||
SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len,unsigned msg_prio, const struct timespec *abs_timeout);}
|
|
||||||
SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); }
|
|
||||||
SYS_KMQ_UNLINK = 462 // { int kmq_unlink(const char *path); }
|
|
||||||
SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); }
|
|
||||||
SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); }
|
|
||||||
SYS_AIO_FSYNC = 465 // { int aio_fsync(int op, struct aiocb *aiocbp); }
|
|
||||||
SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, lwpid_t lwpid, struct rtprio *rtp); }
|
|
||||||
SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); }
|
|
||||||
SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); }
|
|
||||||
SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); }
|
|
||||||
SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr * from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); }
|
|
||||||
SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset); }
|
|
||||||
SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset); }
|
|
||||||
SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, off_t pos); }
|
|
||||||
SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, int whence); }
|
|
||||||
SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); }
|
|
||||||
SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); }
|
|
||||||
SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); }
|
|
||||||
SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, mode_t mode); }
|
|
||||||
SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); }
|
|
||||||
SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); }
|
|
||||||
SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, cpusetid_t setid); }
|
|
||||||
SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, cpuwhich_t which, id_t id, cpusetid_t *setid); }
|
|
||||||
SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, cpuwhich_t which, id_t id, size_t cpusetsize, cpuset_t *mask); }
|
|
||||||
SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, cpuwhich_t which, id_t id, size_t cpusetsize, const cpuset_t *mask); }
|
|
||||||
SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, int flag); }
|
|
||||||
SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, int flag); }
|
|
||||||
SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, gid_t gid, int flag); }
|
|
||||||
SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, char **envv); }
|
|
||||||
SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, struct stat *buf, int flag); }
|
|
||||||
SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, struct timeval *times); }
|
|
||||||
SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, char *path2, int flag); }
|
|
||||||
SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); }
|
|
||||||
SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); }
|
|
||||||
SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); }
|
|
||||||
SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, mode_t mode); }
|
|
||||||
SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, size_t bufsize); }
|
|
||||||
SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, char *new); }
|
|
||||||
SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, char *path2); }
|
|
||||||
SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); }
|
|
||||||
SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); }
|
|
||||||
SYS_GSSD_SYSCALL = 505 // { int gssd_syscall(char *path); }
|
|
||||||
SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, unsigned int iovcnt, int flags); }
|
|
||||||
SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, unsigned int iovcnt, int flags); }
|
|
||||||
SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); }
|
|
||||||
SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); }
|
|
||||||
SYS___SEMCTL = 510 // { int __semctl(int semid, int semnum, int cmd, union semun *arg); }
|
|
||||||
SYS_MSGCTL = 511 // { int msgctl(int msqid, int cmd, struct msqid_ds *buf); }
|
|
||||||
SYS_SHMCTL = 512 // { int shmctl(int shmid, int cmd, struct shmid_ds *buf); }
|
|
||||||
SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); }
|
|
||||||
SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, int fd, cap_rights_t *rightsp); }
|
|
||||||
SYS_CAP_ENTER = 516 // { int cap_enter(void); }
|
|
||||||
SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); }
|
|
||||||
SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); }
|
|
||||||
SYS_PDKILL = 519 // { int pdkill(int fd, int signum); }
|
|
||||||
SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); }
|
|
||||||
SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *sm); }
|
|
||||||
SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, size_t namelen); }
|
|
||||||
SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); }
|
|
||||||
SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); }
|
|
||||||
SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); }
|
|
||||||
SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); }
|
|
||||||
SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); }
|
|
||||||
SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); }
|
|
||||||
SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, off_t offset, off_t len); }
|
|
||||||
SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, off_t len, int advice); }
|
|
||||||
SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, int *status, int options, struct __wrusage *wrusage, siginfo_t *info); }
|
|
||||||
SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, cap_rights_t *rightsp); }
|
|
||||||
SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, const u_long *cmds, size_t ncmds); }
|
|
||||||
SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, u_long *cmds, size_t maxcmds); }
|
|
||||||
SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, uint32_t fcntlrights); }
|
|
||||||
SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, uint32_t *fcntlrightsp); }
|
|
||||||
SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, int namelen); }
|
|
||||||
SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, int namelen); }
|
|
||||||
SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, u_long flags, int atflag); }
|
|
||||||
SYS_ACCEPT4 = 541 // { int accept4(int s, struct sockaddr * __restrict name, __socklen_t * __restrict anamelen, int flags); }
|
|
||||||
SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); }
|
|
||||||
SYS_AIO_MLOCK = 543 // { int aio_mlock(struct aiocb *aiocbp); }
|
|
||||||
SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, int com, void *data); }
|
|
||||||
SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); }
|
|
||||||
SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); }
|
|
||||||
SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); }
|
|
||||||
SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, id_t id, struct vm_domain_policy_entry *policy); }
|
|
||||||
SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); }
|
|
||||||
SYS_FDATASYNC = 550 // { int fdatasync(int fd); }
|
|
||||||
)
|
|
||||||
=======
|
|
||||||
// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master
|
// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
|
|
@ -793,4 +395,3 @@ const (
|
||||||
SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); }
|
SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); }
|
||||||
SYS_FDATASYNC = 550 // { int fdatasync(int fd); }
|
SYS_FDATASYNC = 550 // { int fdatasync(int fd); }
|
||||||
)
|
)
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,401 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master
|
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
|
||||||
|
|
||||||
// +build arm,freebsd
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
const (
|
|
||||||
// SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int
|
|
||||||
SYS_EXIT = 1 // { void sys_exit(int rval); } exit sys_exit_args void
|
|
||||||
SYS_FORK = 2 // { int fork(void); }
|
|
||||||
SYS_READ = 3 // { ssize_t read(int fd, void *buf, size_t nbyte); }
|
|
||||||
SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, size_t nbyte); }
|
|
||||||
SYS_OPEN = 5 // { int open(char *path, int flags, int mode); }
|
|
||||||
SYS_CLOSE = 6 // { int close(int fd); }
|
|
||||||
SYS_WAIT4 = 7 // { int wait4(int pid, int *status, int options, struct rusage *rusage); }
|
|
||||||
SYS_LINK = 9 // { int link(char *path, char *link); }
|
|
||||||
SYS_UNLINK = 10 // { int unlink(char *path); }
|
|
||||||
SYS_CHDIR = 12 // { int chdir(char *path); }
|
|
||||||
SYS_FCHDIR = 13 // { int fchdir(int fd); }
|
|
||||||
SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); }
|
|
||||||
SYS_CHMOD = 15 // { int chmod(char *path, int mode); }
|
|
||||||
SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); }
|
|
||||||
SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int
|
|
||||||
SYS_GETPID = 20 // { pid_t getpid(void); }
|
|
||||||
SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, caddr_t data); }
|
|
||||||
SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); }
|
|
||||||
SYS_SETUID = 23 // { int setuid(uid_t uid); }
|
|
||||||
SYS_GETUID = 24 // { uid_t getuid(void); }
|
|
||||||
SYS_GETEUID = 25 // { uid_t geteuid(void); }
|
|
||||||
SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, caddr_t addr, int data); }
|
|
||||||
SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, int flags); }
|
|
||||||
SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, int flags); }
|
|
||||||
SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, size_t len, int flags, struct sockaddr * __restrict from, __socklen_t * __restrict fromlenaddr); }
|
|
||||||
SYS_ACCEPT = 30 // { int accept(int s, struct sockaddr * __restrict name, __socklen_t * __restrict anamelen); }
|
|
||||||
SYS_GETPEERNAME = 31 // { int getpeername(int fdes, struct sockaddr * __restrict asa, __socklen_t * __restrict alen); }
|
|
||||||
SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, struct sockaddr * __restrict asa, __socklen_t * __restrict alen); }
|
|
||||||
SYS_ACCESS = 33 // { int access(char *path, int amode); }
|
|
||||||
SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); }
|
|
||||||
SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); }
|
|
||||||
SYS_SYNC = 36 // { int sync(void); }
|
|
||||||
SYS_KILL = 37 // { int kill(int pid, int signum); }
|
|
||||||
SYS_GETPPID = 39 // { pid_t getppid(void); }
|
|
||||||
SYS_DUP = 41 // { int dup(u_int fd); }
|
|
||||||
SYS_PIPE = 42 // { int pipe(void); }
|
|
||||||
SYS_GETEGID = 43 // { gid_t getegid(void); }
|
|
||||||
SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, size_t offset, u_int scale); }
|
|
||||||
SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, int pid); }
|
|
||||||
SYS_GETGID = 47 // { gid_t getgid(void); }
|
|
||||||
SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int namelen); }
|
|
||||||
SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); }
|
|
||||||
SYS_ACCT = 51 // { int acct(char *path); }
|
|
||||||
SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, stack_t *oss); }
|
|
||||||
SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, caddr_t data); }
|
|
||||||
SYS_REBOOT = 55 // { int reboot(int opt); }
|
|
||||||
SYS_REVOKE = 56 // { int revoke(char *path); }
|
|
||||||
SYS_SYMLINK = 57 // { int symlink(char *path, char *link); }
|
|
||||||
SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, size_t count); }
|
|
||||||
SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); }
|
|
||||||
SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args int
|
|
||||||
SYS_CHROOT = 61 // { int chroot(char *path); }
|
|
||||||
SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); }
|
|
||||||
SYS_VFORK = 66 // { int vfork(void); }
|
|
||||||
SYS_SBRK = 69 // { int sbrk(int incr); }
|
|
||||||
SYS_SSTK = 70 // { int sstk(int incr); }
|
|
||||||
SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise ovadvise_args int
|
|
||||||
SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); }
|
|
||||||
SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, int prot); }
|
|
||||||
SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); }
|
|
||||||
SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, char *vec); }
|
|
||||||
SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); }
|
|
||||||
SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, gid_t *gidset); }
|
|
||||||
SYS_GETPGRP = 81 // { int getpgrp(void); }
|
|
||||||
SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); }
|
|
||||||
SYS_SETITIMER = 83 // { int setitimer(u_int which, struct itimerval *itv, struct itimerval *oitv); }
|
|
||||||
SYS_SWAPON = 85 // { int swapon(char *name); }
|
|
||||||
SYS_GETITIMER = 86 // { int getitimer(u_int which, struct itimerval *itv); }
|
|
||||||
SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); }
|
|
||||||
SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); }
|
|
||||||
SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); }
|
|
||||||
SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); }
|
|
||||||
SYS_FSYNC = 95 // { int fsync(int fd); }
|
|
||||||
SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, int prio); }
|
|
||||||
SYS_SOCKET = 97 // { int socket(int domain, int type, int protocol); }
|
|
||||||
SYS_CONNECT = 98 // { int connect(int s, caddr_t name, int namelen); }
|
|
||||||
SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); }
|
|
||||||
SYS_BIND = 104 // { int bind(int s, caddr_t name, int namelen); }
|
|
||||||
SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, caddr_t val, int valsize); }
|
|
||||||
SYS_LISTEN = 106 // { int listen(int s, int backlog); }
|
|
||||||
SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, struct timezone *tzp); }
|
|
||||||
SYS_GETRUSAGE = 117 // { int getrusage(int who, struct rusage *rusage); }
|
|
||||||
SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, caddr_t val, int *avalsize); }
|
|
||||||
SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, u_int iovcnt); }
|
|
||||||
SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, u_int iovcnt); }
|
|
||||||
SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, struct timezone *tzp); }
|
|
||||||
SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); }
|
|
||||||
SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); }
|
|
||||||
SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); }
|
|
||||||
SYS_SETREGID = 127 // { int setregid(int rgid, int egid); }
|
|
||||||
SYS_RENAME = 128 // { int rename(char *from, char *to); }
|
|
||||||
SYS_FLOCK = 131 // { int flock(int fd, int how); }
|
|
||||||
SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); }
|
|
||||||
SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, int flags, caddr_t to, int tolen); }
|
|
||||||
SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); }
|
|
||||||
SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, int protocol, int *rsv); }
|
|
||||||
SYS_MKDIR = 136 // { int mkdir(char *path, int mode); }
|
|
||||||
SYS_RMDIR = 137 // { int rmdir(char *path); }
|
|
||||||
SYS_UTIMES = 138 // { int utimes(char *path, struct timeval *tptr); }
|
|
||||||
SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, struct timeval *olddelta); }
|
|
||||||
SYS_SETSID = 147 // { int setsid(void); }
|
|
||||||
SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, caddr_t arg); }
|
|
||||||
SYS_NLM_SYSCALL = 154 // { int nlm_syscall(int debug_level, int grace_period, int addr_count, char **addrs); }
|
|
||||||
SYS_NFSSVC = 155 // { int nfssvc(int flag, caddr_t argp); }
|
|
||||||
SYS_LGETFH = 160 // { int lgetfh(char *fname, struct fhandle *fhp); }
|
|
||||||
SYS_GETFH = 161 // { int getfh(char *fname, struct fhandle *fhp); }
|
|
||||||
SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); }
|
|
||||||
SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, struct rtprio *rtp); }
|
|
||||||
SYS_SEMSYS = 169 // { int semsys(int which, int a2, int a3, int a4, int a5); }
|
|
||||||
SYS_MSGSYS = 170 // { int msgsys(int which, int a2, int a3, int a4, int a5, int a6); }
|
|
||||||
SYS_SHMSYS = 171 // { int shmsys(int which, int a2, int a3, int a4); }
|
|
||||||
SYS_SETFIB = 175 // { int setfib(int fibnum); }
|
|
||||||
SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); }
|
|
||||||
SYS_SETGID = 181 // { int setgid(gid_t gid); }
|
|
||||||
SYS_SETEGID = 182 // { int setegid(gid_t egid); }
|
|
||||||
SYS_SETEUID = 183 // { int seteuid(uid_t euid); }
|
|
||||||
SYS_STAT = 188 // { int stat(char *path, struct stat *ub); }
|
|
||||||
SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); }
|
|
||||||
SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); }
|
|
||||||
SYS_PATHCONF = 191 // { int pathconf(char *path, int name); }
|
|
||||||
SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); }
|
|
||||||
SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int
|
|
||||||
SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int
|
|
||||||
SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, u_int count, long *basep); }
|
|
||||||
SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int
|
|
||||||
SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); }
|
|
||||||
SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); }
|
|
||||||
SYS_UNDELETE = 205 // { int undelete(char *path); }
|
|
||||||
SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); }
|
|
||||||
SYS_GETPGID = 207 // { int getpgid(pid_t pid); }
|
|
||||||
SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, int timeout); }
|
|
||||||
SYS_SEMGET = 221 // { int semget(key_t key, int nsems, int semflg); }
|
|
||||||
SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, size_t nsops); }
|
|
||||||
SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); }
|
|
||||||
SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); }
|
|
||||||
SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); }
|
|
||||||
SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, int shmflg); }
|
|
||||||
SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); }
|
|
||||||
SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); }
|
|
||||||
SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, struct timespec *tp); }
|
|
||||||
SYS_CLOCK_SETTIME = 233 // { int clock_settime( clockid_t clock_id, const struct timespec *tp); }
|
|
||||||
SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, struct timespec *tp); }
|
|
||||||
SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, struct sigevent *evp, int *timerid); }
|
|
||||||
SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); }
|
|
||||||
SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); }
|
|
||||||
SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct itimerspec *value); }
|
|
||||||
SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); }
|
|
||||||
SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); }
|
|
||||||
SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); }
|
|
||||||
SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( struct ffclock_estimate *cest); }
|
|
||||||
SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( struct ffclock_estimate *cest); }
|
|
||||||
SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); }
|
|
||||||
SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,int which, clockid_t *clock_id); }
|
|
||||||
SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); }
|
|
||||||
SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); }
|
|
||||||
SYS_RFORK = 251 // { int rfork(int flags); }
|
|
||||||
SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, int timeout); }
|
|
||||||
SYS_ISSETUGID = 253 // { int issetugid(void); }
|
|
||||||
SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); }
|
|
||||||
SYS_AIO_READ = 255 // { int aio_read(struct aiocb *aiocbp); }
|
|
||||||
SYS_AIO_WRITE = 256 // { int aio_write(struct aiocb *aiocbp); }
|
|
||||||
SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); }
|
|
||||||
SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, size_t count); }
|
|
||||||
SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); }
|
|
||||||
SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); }
|
|
||||||
SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); }
|
|
||||||
SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); }
|
|
||||||
SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); }
|
|
||||||
SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); }
|
|
||||||
SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); }
|
|
||||||
SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); }
|
|
||||||
SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); }
|
|
||||||
SYS_MODNEXT = 300 // { int modnext(int modid); }
|
|
||||||
SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat *stat); }
|
|
||||||
SYS_MODFNEXT = 302 // { int modfnext(int modid); }
|
|
||||||
SYS_MODFIND = 303 // { int modfind(const char *name); }
|
|
||||||
SYS_KLDLOAD = 304 // { int kldload(const char *file); }
|
|
||||||
SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); }
|
|
||||||
SYS_KLDFIND = 306 // { int kldfind(const char *file); }
|
|
||||||
SYS_KLDNEXT = 307 // { int kldnext(int fileid); }
|
|
||||||
SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); }
|
|
||||||
SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); }
|
|
||||||
SYS_GETSID = 310 // { int getsid(pid_t pid); }
|
|
||||||
SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); }
|
|
||||||
SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); }
|
|
||||||
SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); }
|
|
||||||
SYS_AIO_SUSPEND = 315 // { int aio_suspend( struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); }
|
|
||||||
SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); }
|
|
||||||
SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); }
|
|
||||||
SYS_YIELD = 321 // { int yield(void); }
|
|
||||||
SYS_MLOCKALL = 324 // { int mlockall(int how); }
|
|
||||||
SYS_MUNLOCKALL = 325 // { int munlockall(void); }
|
|
||||||
SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); }
|
|
||||||
SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); }
|
|
||||||
SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); }
|
|
||||||
SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); }
|
|
||||||
SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); }
|
|
||||||
SYS_SCHED_YIELD = 331 // { int sched_yield (void); }
|
|
||||||
SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); }
|
|
||||||
SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); }
|
|
||||||
SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, struct timespec *interval); }
|
|
||||||
SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); }
|
|
||||||
SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, void *data); }
|
|
||||||
SYS_JAIL = 338 // { int jail(struct jail *jail); }
|
|
||||||
SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, const sigset_t *set, sigset_t *oset); }
|
|
||||||
SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); }
|
|
||||||
SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); }
|
|
||||||
SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, siginfo_t *info, const struct timespec *timeout); }
|
|
||||||
SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, siginfo_t *info); }
|
|
||||||
SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, acl_type_t type); }
|
|
||||||
SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, acl_type_t type); }
|
|
||||||
SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); }
|
|
||||||
SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); }
|
|
||||||
SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); }
|
|
||||||
SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); }
|
|
||||||
SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); }
|
|
||||||
SYS_KQUEUE = 362 // { int kqueue(void); }
|
|
||||||
SYS_KEVENT = 363 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); }
|
|
||||||
SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, int attrnamespace, const char *attrname); }
|
|
||||||
SYS___SETUGID = 374 // { int __setugid(int flag); }
|
|
||||||
SYS_EACCESS = 376 // { int eaccess(char *path, int amode); }
|
|
||||||
SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, unsigned int iovcnt, int flags); }
|
|
||||||
SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); }
|
|
||||||
SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); }
|
|
||||||
SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, struct mac *mac_p); }
|
|
||||||
SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, struct mac *mac_p); }
|
|
||||||
SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, struct mac *mac_p); }
|
|
||||||
SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, struct mac *mac_p); }
|
|
||||||
SYS_KENV = 390 // { int kenv(int what, const char *name, char *value, int len); }
|
|
||||||
SYS_LCHFLAGS = 391 // { int lchflags(const char *path, u_long flags); }
|
|
||||||
SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); }
|
|
||||||
SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); }
|
|
||||||
SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); }
|
|
||||||
SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int mode); }
|
|
||||||
SYS_STATFS = 396 // { int statfs(char *path, struct statfs *buf); }
|
|
||||||
SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); }
|
|
||||||
SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); }
|
|
||||||
SYS_KSEM_CLOSE = 400 // { int ksem_close(semid_t id); }
|
|
||||||
SYS_KSEM_POST = 401 // { int ksem_post(semid_t id); }
|
|
||||||
SYS_KSEM_WAIT = 402 // { int ksem_wait(semid_t id); }
|
|
||||||
SYS_KSEM_TRYWAIT = 403 // { int ksem_trywait(semid_t id); }
|
|
||||||
SYS_KSEM_INIT = 404 // { int ksem_init(semid_t *idp, unsigned int value); }
|
|
||||||
SYS_KSEM_OPEN = 405 // { int ksem_open(semid_t *idp, const char *name, int oflag, mode_t mode, unsigned int value); }
|
|
||||||
SYS_KSEM_UNLINK = 406 // { int ksem_unlink(const char *name); }
|
|
||||||
SYS_KSEM_GETVALUE = 407 // { int ksem_getvalue(semid_t id, int *val); }
|
|
||||||
SYS_KSEM_DESTROY = 408 // { int ksem_destroy(semid_t id); }
|
|
||||||
SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, struct mac *mac_p); }
|
|
||||||
SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, struct mac *mac_p); }
|
|
||||||
SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, struct mac *mac_p); }
|
|
||||||
SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( const char *path, int attrnamespace, const char *attrname); }
|
|
||||||
SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, char **envv, struct mac *mac_p); }
|
|
||||||
SYS_SIGACTION = 416 // { int sigaction(int sig, const struct sigaction *act, struct sigaction *oact); }
|
|
||||||
SYS_SIGRETURN = 417 // { int sigreturn( const struct __ucontext *sigcntxp); }
|
|
||||||
SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); }
|
|
||||||
SYS_SETCONTEXT = 422 // { int setcontext( const struct __ucontext *ucp); }
|
|
||||||
SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, const struct __ucontext *ucp); }
|
|
||||||
SYS_SWAPOFF = 424 // { int swapoff(const char *name); }
|
|
||||||
SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, acl_type_t type); }
|
|
||||||
SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, int *sig); }
|
|
||||||
SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, int flags); }
|
|
||||||
SYS_THR_EXIT = 431 // { void thr_exit(long *state); }
|
|
||||||
SYS_THR_SELF = 432 // { int thr_self(long *id); }
|
|
||||||
SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); }
|
|
||||||
SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); }
|
|
||||||
SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( const char *path, int attrnamespace, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( const char *path, int attrnamespace, void *data, size_t nbytes); }
|
|
||||||
SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, const struct timespec *abstime); }
|
|
||||||
SYS_THR_SUSPEND = 442 // { int thr_suspend( const struct timespec *timeout); }
|
|
||||||
SYS_THR_WAKE = 443 // { int thr_wake(long id); }
|
|
||||||
SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); }
|
|
||||||
SYS_AUDIT = 445 // { int audit(const void *record, u_int length); }
|
|
||||||
SYS_AUDITON = 446 // { int auditon(int cmd, void *data, u_int length); }
|
|
||||||
SYS_GETAUID = 447 // { int getauid(uid_t *auid); }
|
|
||||||
SYS_SETAUID = 448 // { int setauid(uid_t *auid); }
|
|
||||||
SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); }
|
|
||||||
SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); }
|
|
||||||
SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); }
|
|
||||||
SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); }
|
|
||||||
SYS_AUDITCTL = 453 // { int auditctl(char *path); }
|
|
||||||
SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, u_long val, void *uaddr1, void *uaddr2); }
|
|
||||||
SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, int param_size); }
|
|
||||||
SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); }
|
|
||||||
SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, mode_t mode, const struct mq_attr *attr); }
|
|
||||||
SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); }
|
|
||||||
SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); }
|
|
||||||
SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len,unsigned msg_prio, const struct timespec *abs_timeout);}
|
|
||||||
SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); }
|
|
||||||
SYS_KMQ_UNLINK = 462 // { int kmq_unlink(const char *path); }
|
|
||||||
SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); }
|
|
||||||
SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); }
|
|
||||||
SYS_AIO_FSYNC = 465 // { int aio_fsync(int op, struct aiocb *aiocbp); }
|
|
||||||
SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, lwpid_t lwpid, struct rtprio *rtp); }
|
|
||||||
SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); }
|
|
||||||
SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); }
|
|
||||||
SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); }
|
|
||||||
SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr * from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); }
|
|
||||||
SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset); }
|
|
||||||
SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset); }
|
|
||||||
SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, off_t pos); }
|
|
||||||
SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, int whence); }
|
|
||||||
SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); }
|
|
||||||
SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); }
|
|
||||||
SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); }
|
|
||||||
SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, mode_t mode); }
|
|
||||||
SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); }
|
|
||||||
SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); }
|
|
||||||
SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, cpusetid_t setid); }
|
|
||||||
SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, cpuwhich_t which, id_t id, cpusetid_t *setid); }
|
|
||||||
SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, cpuwhich_t which, id_t id, size_t cpusetsize, cpuset_t *mask); }
|
|
||||||
SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, cpuwhich_t which, id_t id, size_t cpusetsize, const cpuset_t *mask); }
|
|
||||||
SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, int flag); }
|
|
||||||
SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, int flag); }
|
|
||||||
SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, gid_t gid, int flag); }
|
|
||||||
SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, char **envv); }
|
|
||||||
SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, struct stat *buf, int flag); }
|
|
||||||
SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, struct timeval *times); }
|
|
||||||
SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, char *path2, int flag); }
|
|
||||||
SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); }
|
|
||||||
SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); }
|
|
||||||
SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); }
|
|
||||||
SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, mode_t mode); }
|
|
||||||
SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, size_t bufsize); }
|
|
||||||
SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, char *new); }
|
|
||||||
SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, char *path2); }
|
|
||||||
SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); }
|
|
||||||
SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); }
|
|
||||||
SYS_GSSD_SYSCALL = 505 // { int gssd_syscall(char *path); }
|
|
||||||
SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, unsigned int iovcnt, int flags); }
|
|
||||||
SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, unsigned int iovcnt, int flags); }
|
|
||||||
SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); }
|
|
||||||
SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); }
|
|
||||||
SYS___SEMCTL = 510 // { int __semctl(int semid, int semnum, int cmd, union semun *arg); }
|
|
||||||
SYS_MSGCTL = 511 // { int msgctl(int msqid, int cmd, struct msqid_ds *buf); }
|
|
||||||
SYS_SHMCTL = 512 // { int shmctl(int shmid, int cmd, struct shmid_ds *buf); }
|
|
||||||
SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); }
|
|
||||||
SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, int fd, cap_rights_t *rightsp); }
|
|
||||||
SYS_CAP_ENTER = 516 // { int cap_enter(void); }
|
|
||||||
SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); }
|
|
||||||
SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); }
|
|
||||||
SYS_PDKILL = 519 // { int pdkill(int fd, int signum); }
|
|
||||||
SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); }
|
|
||||||
SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *sm); }
|
|
||||||
SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, size_t namelen); }
|
|
||||||
SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); }
|
|
||||||
SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); }
|
|
||||||
SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); }
|
|
||||||
SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); }
|
|
||||||
SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); }
|
|
||||||
SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); }
|
|
||||||
SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, off_t offset, off_t len); }
|
|
||||||
SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, off_t len, int advice); }
|
|
||||||
SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, int *status, int options, struct __wrusage *wrusage, siginfo_t *info); }
|
|
||||||
SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, cap_rights_t *rightsp); }
|
|
||||||
SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, const u_long *cmds, size_t ncmds); }
|
|
||||||
SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, u_long *cmds, size_t maxcmds); }
|
|
||||||
SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, uint32_t fcntlrights); }
|
|
||||||
SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, uint32_t *fcntlrightsp); }
|
|
||||||
SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, int namelen); }
|
|
||||||
SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, int namelen); }
|
|
||||||
SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, u_long flags, int atflag); }
|
|
||||||
SYS_ACCEPT4 = 541 // { int accept4(int s, struct sockaddr * __restrict name, __socklen_t * __restrict anamelen, int flags); }
|
|
||||||
SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); }
|
|
||||||
SYS_AIO_MLOCK = 543 // { int aio_mlock(struct aiocb *aiocbp); }
|
|
||||||
SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, int com, void *data); }
|
|
||||||
SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); }
|
|
||||||
SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); }
|
|
||||||
SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); }
|
|
||||||
SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, id_t id, struct vm_domain_policy_entry *policy); }
|
|
||||||
SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); }
|
|
||||||
SYS_FDATASYNC = 550 // { int fdatasync(int fd); }
|
|
||||||
)
|
|
||||||
=======
|
|
||||||
// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master
|
// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
|
|
@ -793,4 +395,3 @@ const (
|
||||||
SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); }
|
SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); }
|
||||||
SYS_FDATASYNC = 550 // { int fdatasync(int fd); }
|
SYS_FDATASYNC = 550 // { int fdatasync(int fd); }
|
||||||
)
|
)
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,401 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master
|
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
|
||||||
|
|
||||||
// +build arm64,freebsd
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
const (
|
|
||||||
// SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int
|
|
||||||
SYS_EXIT = 1 // { void sys_exit(int rval); } exit sys_exit_args void
|
|
||||||
SYS_FORK = 2 // { int fork(void); }
|
|
||||||
SYS_READ = 3 // { ssize_t read(int fd, void *buf, size_t nbyte); }
|
|
||||||
SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, size_t nbyte); }
|
|
||||||
SYS_OPEN = 5 // { int open(char *path, int flags, int mode); }
|
|
||||||
SYS_CLOSE = 6 // { int close(int fd); }
|
|
||||||
SYS_WAIT4 = 7 // { int wait4(int pid, int *status, int options, struct rusage *rusage); }
|
|
||||||
SYS_LINK = 9 // { int link(char *path, char *link); }
|
|
||||||
SYS_UNLINK = 10 // { int unlink(char *path); }
|
|
||||||
SYS_CHDIR = 12 // { int chdir(char *path); }
|
|
||||||
SYS_FCHDIR = 13 // { int fchdir(int fd); }
|
|
||||||
SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); }
|
|
||||||
SYS_CHMOD = 15 // { int chmod(char *path, int mode); }
|
|
||||||
SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); }
|
|
||||||
SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int
|
|
||||||
SYS_GETPID = 20 // { pid_t getpid(void); }
|
|
||||||
SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, caddr_t data); }
|
|
||||||
SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); }
|
|
||||||
SYS_SETUID = 23 // { int setuid(uid_t uid); }
|
|
||||||
SYS_GETUID = 24 // { uid_t getuid(void); }
|
|
||||||
SYS_GETEUID = 25 // { uid_t geteuid(void); }
|
|
||||||
SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, caddr_t addr, int data); }
|
|
||||||
SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, int flags); }
|
|
||||||
SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, int flags); }
|
|
||||||
SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, size_t len, int flags, struct sockaddr * __restrict from, __socklen_t * __restrict fromlenaddr); }
|
|
||||||
SYS_ACCEPT = 30 // { int accept(int s, struct sockaddr * __restrict name, __socklen_t * __restrict anamelen); }
|
|
||||||
SYS_GETPEERNAME = 31 // { int getpeername(int fdes, struct sockaddr * __restrict asa, __socklen_t * __restrict alen); }
|
|
||||||
SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, struct sockaddr * __restrict asa, __socklen_t * __restrict alen); }
|
|
||||||
SYS_ACCESS = 33 // { int access(char *path, int amode); }
|
|
||||||
SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); }
|
|
||||||
SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); }
|
|
||||||
SYS_SYNC = 36 // { int sync(void); }
|
|
||||||
SYS_KILL = 37 // { int kill(int pid, int signum); }
|
|
||||||
SYS_GETPPID = 39 // { pid_t getppid(void); }
|
|
||||||
SYS_DUP = 41 // { int dup(u_int fd); }
|
|
||||||
SYS_PIPE = 42 // { int pipe(void); }
|
|
||||||
SYS_GETEGID = 43 // { gid_t getegid(void); }
|
|
||||||
SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, size_t offset, u_int scale); }
|
|
||||||
SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, int pid); }
|
|
||||||
SYS_GETGID = 47 // { gid_t getgid(void); }
|
|
||||||
SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int namelen); }
|
|
||||||
SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); }
|
|
||||||
SYS_ACCT = 51 // { int acct(char *path); }
|
|
||||||
SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, stack_t *oss); }
|
|
||||||
SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, caddr_t data); }
|
|
||||||
SYS_REBOOT = 55 // { int reboot(int opt); }
|
|
||||||
SYS_REVOKE = 56 // { int revoke(char *path); }
|
|
||||||
SYS_SYMLINK = 57 // { int symlink(char *path, char *link); }
|
|
||||||
SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, size_t count); }
|
|
||||||
SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); }
|
|
||||||
SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args int
|
|
||||||
SYS_CHROOT = 61 // { int chroot(char *path); }
|
|
||||||
SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); }
|
|
||||||
SYS_VFORK = 66 // { int vfork(void); }
|
|
||||||
SYS_SBRK = 69 // { int sbrk(int incr); }
|
|
||||||
SYS_SSTK = 70 // { int sstk(int incr); }
|
|
||||||
SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise ovadvise_args int
|
|
||||||
SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); }
|
|
||||||
SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, int prot); }
|
|
||||||
SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); }
|
|
||||||
SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, char *vec); }
|
|
||||||
SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); }
|
|
||||||
SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, gid_t *gidset); }
|
|
||||||
SYS_GETPGRP = 81 // { int getpgrp(void); }
|
|
||||||
SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); }
|
|
||||||
SYS_SETITIMER = 83 // { int setitimer(u_int which, struct itimerval *itv, struct itimerval *oitv); }
|
|
||||||
SYS_SWAPON = 85 // { int swapon(char *name); }
|
|
||||||
SYS_GETITIMER = 86 // { int getitimer(u_int which, struct itimerval *itv); }
|
|
||||||
SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); }
|
|
||||||
SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); }
|
|
||||||
SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); }
|
|
||||||
SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); }
|
|
||||||
SYS_FSYNC = 95 // { int fsync(int fd); }
|
|
||||||
SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, int prio); }
|
|
||||||
SYS_SOCKET = 97 // { int socket(int domain, int type, int protocol); }
|
|
||||||
SYS_CONNECT = 98 // { int connect(int s, caddr_t name, int namelen); }
|
|
||||||
SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); }
|
|
||||||
SYS_BIND = 104 // { int bind(int s, caddr_t name, int namelen); }
|
|
||||||
SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, caddr_t val, int valsize); }
|
|
||||||
SYS_LISTEN = 106 // { int listen(int s, int backlog); }
|
|
||||||
SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, struct timezone *tzp); }
|
|
||||||
SYS_GETRUSAGE = 117 // { int getrusage(int who, struct rusage *rusage); }
|
|
||||||
SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, caddr_t val, int *avalsize); }
|
|
||||||
SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, u_int iovcnt); }
|
|
||||||
SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, u_int iovcnt); }
|
|
||||||
SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, struct timezone *tzp); }
|
|
||||||
SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); }
|
|
||||||
SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); }
|
|
||||||
SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); }
|
|
||||||
SYS_SETREGID = 127 // { int setregid(int rgid, int egid); }
|
|
||||||
SYS_RENAME = 128 // { int rename(char *from, char *to); }
|
|
||||||
SYS_FLOCK = 131 // { int flock(int fd, int how); }
|
|
||||||
SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); }
|
|
||||||
SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, int flags, caddr_t to, int tolen); }
|
|
||||||
SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); }
|
|
||||||
SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, int protocol, int *rsv); }
|
|
||||||
SYS_MKDIR = 136 // { int mkdir(char *path, int mode); }
|
|
||||||
SYS_RMDIR = 137 // { int rmdir(char *path); }
|
|
||||||
SYS_UTIMES = 138 // { int utimes(char *path, struct timeval *tptr); }
|
|
||||||
SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, struct timeval *olddelta); }
|
|
||||||
SYS_SETSID = 147 // { int setsid(void); }
|
|
||||||
SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, caddr_t arg); }
|
|
||||||
SYS_NLM_SYSCALL = 154 // { int nlm_syscall(int debug_level, int grace_period, int addr_count, char **addrs); }
|
|
||||||
SYS_NFSSVC = 155 // { int nfssvc(int flag, caddr_t argp); }
|
|
||||||
SYS_LGETFH = 160 // { int lgetfh(char *fname, struct fhandle *fhp); }
|
|
||||||
SYS_GETFH = 161 // { int getfh(char *fname, struct fhandle *fhp); }
|
|
||||||
SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); }
|
|
||||||
SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, struct rtprio *rtp); }
|
|
||||||
SYS_SEMSYS = 169 // { int semsys(int which, int a2, int a3, int a4, int a5); }
|
|
||||||
SYS_MSGSYS = 170 // { int msgsys(int which, int a2, int a3, int a4, int a5, int a6); }
|
|
||||||
SYS_SHMSYS = 171 // { int shmsys(int which, int a2, int a3, int a4); }
|
|
||||||
SYS_SETFIB = 175 // { int setfib(int fibnum); }
|
|
||||||
SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); }
|
|
||||||
SYS_SETGID = 181 // { int setgid(gid_t gid); }
|
|
||||||
SYS_SETEGID = 182 // { int setegid(gid_t egid); }
|
|
||||||
SYS_SETEUID = 183 // { int seteuid(uid_t euid); }
|
|
||||||
SYS_STAT = 188 // { int stat(char *path, struct stat *ub); }
|
|
||||||
SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); }
|
|
||||||
SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); }
|
|
||||||
SYS_PATHCONF = 191 // { int pathconf(char *path, int name); }
|
|
||||||
SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); }
|
|
||||||
SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int
|
|
||||||
SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int
|
|
||||||
SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, u_int count, long *basep); }
|
|
||||||
SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int
|
|
||||||
SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); }
|
|
||||||
SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); }
|
|
||||||
SYS_UNDELETE = 205 // { int undelete(char *path); }
|
|
||||||
SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); }
|
|
||||||
SYS_GETPGID = 207 // { int getpgid(pid_t pid); }
|
|
||||||
SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, int timeout); }
|
|
||||||
SYS_SEMGET = 221 // { int semget(key_t key, int nsems, int semflg); }
|
|
||||||
SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, size_t nsops); }
|
|
||||||
SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); }
|
|
||||||
SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); }
|
|
||||||
SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); }
|
|
||||||
SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, int shmflg); }
|
|
||||||
SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); }
|
|
||||||
SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); }
|
|
||||||
SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, struct timespec *tp); }
|
|
||||||
SYS_CLOCK_SETTIME = 233 // { int clock_settime( clockid_t clock_id, const struct timespec *tp); }
|
|
||||||
SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, struct timespec *tp); }
|
|
||||||
SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, struct sigevent *evp, int *timerid); }
|
|
||||||
SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); }
|
|
||||||
SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); }
|
|
||||||
SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct itimerspec *value); }
|
|
||||||
SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); }
|
|
||||||
SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); }
|
|
||||||
SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); }
|
|
||||||
SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( struct ffclock_estimate *cest); }
|
|
||||||
SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( struct ffclock_estimate *cest); }
|
|
||||||
SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); }
|
|
||||||
SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,int which, clockid_t *clock_id); }
|
|
||||||
SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); }
|
|
||||||
SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); }
|
|
||||||
SYS_RFORK = 251 // { int rfork(int flags); }
|
|
||||||
SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, int timeout); }
|
|
||||||
SYS_ISSETUGID = 253 // { int issetugid(void); }
|
|
||||||
SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); }
|
|
||||||
SYS_AIO_READ = 255 // { int aio_read(struct aiocb *aiocbp); }
|
|
||||||
SYS_AIO_WRITE = 256 // { int aio_write(struct aiocb *aiocbp); }
|
|
||||||
SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); }
|
|
||||||
SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, size_t count); }
|
|
||||||
SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); }
|
|
||||||
SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); }
|
|
||||||
SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); }
|
|
||||||
SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); }
|
|
||||||
SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); }
|
|
||||||
SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); }
|
|
||||||
SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); }
|
|
||||||
SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); }
|
|
||||||
SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); }
|
|
||||||
SYS_MODNEXT = 300 // { int modnext(int modid); }
|
|
||||||
SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat *stat); }
|
|
||||||
SYS_MODFNEXT = 302 // { int modfnext(int modid); }
|
|
||||||
SYS_MODFIND = 303 // { int modfind(const char *name); }
|
|
||||||
SYS_KLDLOAD = 304 // { int kldload(const char *file); }
|
|
||||||
SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); }
|
|
||||||
SYS_KLDFIND = 306 // { int kldfind(const char *file); }
|
|
||||||
SYS_KLDNEXT = 307 // { int kldnext(int fileid); }
|
|
||||||
SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); }
|
|
||||||
SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); }
|
|
||||||
SYS_GETSID = 310 // { int getsid(pid_t pid); }
|
|
||||||
SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); }
|
|
||||||
SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); }
|
|
||||||
SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); }
|
|
||||||
SYS_AIO_SUSPEND = 315 // { int aio_suspend( struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); }
|
|
||||||
SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); }
|
|
||||||
SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); }
|
|
||||||
SYS_YIELD = 321 // { int yield(void); }
|
|
||||||
SYS_MLOCKALL = 324 // { int mlockall(int how); }
|
|
||||||
SYS_MUNLOCKALL = 325 // { int munlockall(void); }
|
|
||||||
SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); }
|
|
||||||
SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); }
|
|
||||||
SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); }
|
|
||||||
SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); }
|
|
||||||
SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); }
|
|
||||||
SYS_SCHED_YIELD = 331 // { int sched_yield (void); }
|
|
||||||
SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); }
|
|
||||||
SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); }
|
|
||||||
SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, struct timespec *interval); }
|
|
||||||
SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); }
|
|
||||||
SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, void *data); }
|
|
||||||
SYS_JAIL = 338 // { int jail(struct jail *jail); }
|
|
||||||
SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, const sigset_t *set, sigset_t *oset); }
|
|
||||||
SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); }
|
|
||||||
SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); }
|
|
||||||
SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, siginfo_t *info, const struct timespec *timeout); }
|
|
||||||
SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, siginfo_t *info); }
|
|
||||||
SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, acl_type_t type); }
|
|
||||||
SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, acl_type_t type); }
|
|
||||||
SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); }
|
|
||||||
SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); }
|
|
||||||
SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); }
|
|
||||||
SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); }
|
|
||||||
SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); }
|
|
||||||
SYS_KQUEUE = 362 // { int kqueue(void); }
|
|
||||||
SYS_KEVENT = 363 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); }
|
|
||||||
SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, int attrnamespace, const char *attrname); }
|
|
||||||
SYS___SETUGID = 374 // { int __setugid(int flag); }
|
|
||||||
SYS_EACCESS = 376 // { int eaccess(char *path, int amode); }
|
|
||||||
SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, unsigned int iovcnt, int flags); }
|
|
||||||
SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); }
|
|
||||||
SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); }
|
|
||||||
SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, struct mac *mac_p); }
|
|
||||||
SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, struct mac *mac_p); }
|
|
||||||
SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, struct mac *mac_p); }
|
|
||||||
SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, struct mac *mac_p); }
|
|
||||||
SYS_KENV = 390 // { int kenv(int what, const char *name, char *value, int len); }
|
|
||||||
SYS_LCHFLAGS = 391 // { int lchflags(const char *path, u_long flags); }
|
|
||||||
SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); }
|
|
||||||
SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); }
|
|
||||||
SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); }
|
|
||||||
SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int mode); }
|
|
||||||
SYS_STATFS = 396 // { int statfs(char *path, struct statfs *buf); }
|
|
||||||
SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); }
|
|
||||||
SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); }
|
|
||||||
SYS_KSEM_CLOSE = 400 // { int ksem_close(semid_t id); }
|
|
||||||
SYS_KSEM_POST = 401 // { int ksem_post(semid_t id); }
|
|
||||||
SYS_KSEM_WAIT = 402 // { int ksem_wait(semid_t id); }
|
|
||||||
SYS_KSEM_TRYWAIT = 403 // { int ksem_trywait(semid_t id); }
|
|
||||||
SYS_KSEM_INIT = 404 // { int ksem_init(semid_t *idp, unsigned int value); }
|
|
||||||
SYS_KSEM_OPEN = 405 // { int ksem_open(semid_t *idp, const char *name, int oflag, mode_t mode, unsigned int value); }
|
|
||||||
SYS_KSEM_UNLINK = 406 // { int ksem_unlink(const char *name); }
|
|
||||||
SYS_KSEM_GETVALUE = 407 // { int ksem_getvalue(semid_t id, int *val); }
|
|
||||||
SYS_KSEM_DESTROY = 408 // { int ksem_destroy(semid_t id); }
|
|
||||||
SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, struct mac *mac_p); }
|
|
||||||
SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, struct mac *mac_p); }
|
|
||||||
SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, struct mac *mac_p); }
|
|
||||||
SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( const char *path, int attrnamespace, const char *attrname); }
|
|
||||||
SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, char **envv, struct mac *mac_p); }
|
|
||||||
SYS_SIGACTION = 416 // { int sigaction(int sig, const struct sigaction *act, struct sigaction *oact); }
|
|
||||||
SYS_SIGRETURN = 417 // { int sigreturn( const struct __ucontext *sigcntxp); }
|
|
||||||
SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); }
|
|
||||||
SYS_SETCONTEXT = 422 // { int setcontext( const struct __ucontext *ucp); }
|
|
||||||
SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, const struct __ucontext *ucp); }
|
|
||||||
SYS_SWAPOFF = 424 // { int swapoff(const char *name); }
|
|
||||||
SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, acl_type_t type); }
|
|
||||||
SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, acl_type_t type, struct acl *aclp); }
|
|
||||||
SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, int *sig); }
|
|
||||||
SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, int flags); }
|
|
||||||
SYS_THR_EXIT = 431 // { void thr_exit(long *state); }
|
|
||||||
SYS_THR_SELF = 432 // { int thr_self(long *id); }
|
|
||||||
SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); }
|
|
||||||
SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); }
|
|
||||||
SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( const char *path, int attrnamespace, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( const char *path, int attrnamespace, void *data, size_t nbytes); }
|
|
||||||
SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, const struct timespec *abstime); }
|
|
||||||
SYS_THR_SUSPEND = 442 // { int thr_suspend( const struct timespec *timeout); }
|
|
||||||
SYS_THR_WAKE = 443 // { int thr_wake(long id); }
|
|
||||||
SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); }
|
|
||||||
SYS_AUDIT = 445 // { int audit(const void *record, u_int length); }
|
|
||||||
SYS_AUDITON = 446 // { int auditon(int cmd, void *data, u_int length); }
|
|
||||||
SYS_GETAUID = 447 // { int getauid(uid_t *auid); }
|
|
||||||
SYS_SETAUID = 448 // { int setauid(uid_t *auid); }
|
|
||||||
SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); }
|
|
||||||
SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); }
|
|
||||||
SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); }
|
|
||||||
SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); }
|
|
||||||
SYS_AUDITCTL = 453 // { int auditctl(char *path); }
|
|
||||||
SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, u_long val, void *uaddr1, void *uaddr2); }
|
|
||||||
SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, int param_size); }
|
|
||||||
SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); }
|
|
||||||
SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, mode_t mode, const struct mq_attr *attr); }
|
|
||||||
SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); }
|
|
||||||
SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); }
|
|
||||||
SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len,unsigned msg_prio, const struct timespec *abs_timeout);}
|
|
||||||
SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); }
|
|
||||||
SYS_KMQ_UNLINK = 462 // { int kmq_unlink(const char *path); }
|
|
||||||
SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); }
|
|
||||||
SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); }
|
|
||||||
SYS_AIO_FSYNC = 465 // { int aio_fsync(int op, struct aiocb *aiocbp); }
|
|
||||||
SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, lwpid_t lwpid, struct rtprio *rtp); }
|
|
||||||
SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); }
|
|
||||||
SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); }
|
|
||||||
SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); }
|
|
||||||
SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr * from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); }
|
|
||||||
SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset); }
|
|
||||||
SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset); }
|
|
||||||
SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, off_t pos); }
|
|
||||||
SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, int whence); }
|
|
||||||
SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); }
|
|
||||||
SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); }
|
|
||||||
SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); }
|
|
||||||
SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, mode_t mode); }
|
|
||||||
SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); }
|
|
||||||
SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); }
|
|
||||||
SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, cpusetid_t setid); }
|
|
||||||
SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, cpuwhich_t which, id_t id, cpusetid_t *setid); }
|
|
||||||
SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, cpuwhich_t which, id_t id, size_t cpusetsize, cpuset_t *mask); }
|
|
||||||
SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, cpuwhich_t which, id_t id, size_t cpusetsize, const cpuset_t *mask); }
|
|
||||||
SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, int flag); }
|
|
||||||
SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, int flag); }
|
|
||||||
SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, gid_t gid, int flag); }
|
|
||||||
SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, char **envv); }
|
|
||||||
SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, struct stat *buf, int flag); }
|
|
||||||
SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, struct timeval *times); }
|
|
||||||
SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, char *path2, int flag); }
|
|
||||||
SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); }
|
|
||||||
SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); }
|
|
||||||
SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); }
|
|
||||||
SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, mode_t mode); }
|
|
||||||
SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, size_t bufsize); }
|
|
||||||
SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, char *new); }
|
|
||||||
SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, char *path2); }
|
|
||||||
SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); }
|
|
||||||
SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); }
|
|
||||||
SYS_GSSD_SYSCALL = 505 // { int gssd_syscall(char *path); }
|
|
||||||
SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, unsigned int iovcnt, int flags); }
|
|
||||||
SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, unsigned int iovcnt, int flags); }
|
|
||||||
SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); }
|
|
||||||
SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); }
|
|
||||||
SYS___SEMCTL = 510 // { int __semctl(int semid, int semnum, int cmd, union semun *arg); }
|
|
||||||
SYS_MSGCTL = 511 // { int msgctl(int msqid, int cmd, struct msqid_ds *buf); }
|
|
||||||
SYS_SHMCTL = 512 // { int shmctl(int shmid, int cmd, struct shmid_ds *buf); }
|
|
||||||
SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); }
|
|
||||||
SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, int fd, cap_rights_t *rightsp); }
|
|
||||||
SYS_CAP_ENTER = 516 // { int cap_enter(void); }
|
|
||||||
SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); }
|
|
||||||
SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); }
|
|
||||||
SYS_PDKILL = 519 // { int pdkill(int fd, int signum); }
|
|
||||||
SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); }
|
|
||||||
SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *sm); }
|
|
||||||
SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, size_t namelen); }
|
|
||||||
SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); }
|
|
||||||
SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); }
|
|
||||||
SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); }
|
|
||||||
SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); }
|
|
||||||
SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); }
|
|
||||||
SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); }
|
|
||||||
SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, off_t offset, off_t len); }
|
|
||||||
SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, off_t len, int advice); }
|
|
||||||
SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, int *status, int options, struct __wrusage *wrusage, siginfo_t *info); }
|
|
||||||
SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, cap_rights_t *rightsp); }
|
|
||||||
SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, const u_long *cmds, size_t ncmds); }
|
|
||||||
SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, u_long *cmds, size_t maxcmds); }
|
|
||||||
SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, uint32_t fcntlrights); }
|
|
||||||
SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, uint32_t *fcntlrightsp); }
|
|
||||||
SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, int namelen); }
|
|
||||||
SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, int namelen); }
|
|
||||||
SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, u_long flags, int atflag); }
|
|
||||||
SYS_ACCEPT4 = 541 // { int accept4(int s, struct sockaddr * __restrict name, __socklen_t * __restrict anamelen, int flags); }
|
|
||||||
SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); }
|
|
||||||
SYS_AIO_MLOCK = 543 // { int aio_mlock(struct aiocb *aiocbp); }
|
|
||||||
SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, int com, void *data); }
|
|
||||||
SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); }
|
|
||||||
SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); }
|
|
||||||
SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); }
|
|
||||||
SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, id_t id, struct vm_domain_policy_entry *policy); }
|
|
||||||
SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); }
|
|
||||||
SYS_FDATASYNC = 550 // { int fdatasync(int fd); }
|
|
||||||
)
|
|
||||||
=======
|
|
||||||
// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master
|
// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
|
|
@ -793,4 +395,3 @@ const (
|
||||||
SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); }
|
SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); }
|
||||||
SYS_FDATASYNC = 550 // { int fdatasync(int fd); }
|
SYS_FDATASYNC = 550 // { int fdatasync(int fd); }
|
||||||
)
|
)
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,279 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// go run mksysnum.go http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master
|
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
|
||||||
|
|
||||||
// +build 386,netbsd
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
const (
|
|
||||||
SYS_EXIT = 1 // { void|sys||exit(int rval); }
|
|
||||||
SYS_FORK = 2 // { int|sys||fork(void); }
|
|
||||||
SYS_READ = 3 // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); }
|
|
||||||
SYS_WRITE = 4 // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); }
|
|
||||||
SYS_OPEN = 5 // { int|sys||open(const char *path, int flags, ... mode_t mode); }
|
|
||||||
SYS_CLOSE = 6 // { int|sys||close(int fd); }
|
|
||||||
SYS_LINK = 9 // { int|sys||link(const char *path, const char *link); }
|
|
||||||
SYS_UNLINK = 10 // { int|sys||unlink(const char *path); }
|
|
||||||
SYS_CHDIR = 12 // { int|sys||chdir(const char *path); }
|
|
||||||
SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); }
|
|
||||||
SYS_CHMOD = 15 // { int|sys||chmod(const char *path, mode_t mode); }
|
|
||||||
SYS_CHOWN = 16 // { int|sys||chown(const char *path, uid_t uid, gid_t gid); }
|
|
||||||
SYS_BREAK = 17 // { int|sys||obreak(char *nsize); }
|
|
||||||
SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); }
|
|
||||||
SYS_UNMOUNT = 22 // { int|sys||unmount(const char *path, int flags); }
|
|
||||||
SYS_SETUID = 23 // { int|sys||setuid(uid_t uid); }
|
|
||||||
SYS_GETUID = 24 // { uid_t|sys||getuid_with_euid(void); }
|
|
||||||
SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); }
|
|
||||||
SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); }
|
|
||||||
SYS_RECVMSG = 27 // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); }
|
|
||||||
SYS_SENDMSG = 28 // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); }
|
|
||||||
SYS_RECVFROM = 29 // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); }
|
|
||||||
SYS_ACCEPT = 30 // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); }
|
|
||||||
SYS_GETPEERNAME = 31 // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); }
|
|
||||||
SYS_GETSOCKNAME = 32 // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); }
|
|
||||||
SYS_ACCESS = 33 // { int|sys||access(const char *path, int flags); }
|
|
||||||
SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); }
|
|
||||||
SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); }
|
|
||||||
SYS_SYNC = 36 // { void|sys||sync(void); }
|
|
||||||
SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); }
|
|
||||||
SYS_GETPPID = 39 // { pid_t|sys||getppid(void); }
|
|
||||||
SYS_DUP = 41 // { int|sys||dup(int fd); }
|
|
||||||
SYS_PIPE = 42 // { int|sys||pipe(void); }
|
|
||||||
SYS_GETEGID = 43 // { gid_t|sys||getegid(void); }
|
|
||||||
SYS_PROFIL = 44 // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); }
|
|
||||||
SYS_KTRACE = 45 // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); }
|
|
||||||
SYS_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); }
|
|
||||||
SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); }
|
|
||||||
SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); }
|
|
||||||
SYS_ACCT = 51 // { int|sys||acct(const char *path); }
|
|
||||||
SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); }
|
|
||||||
SYS_REVOKE = 56 // { int|sys||revoke(const char *path); }
|
|
||||||
SYS_SYMLINK = 57 // { int|sys||symlink(const char *path, const char *link); }
|
|
||||||
SYS_READLINK = 58 // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); }
|
|
||||||
SYS_EXECVE = 59 // { int|sys||execve(const char *path, char * const *argp, char * const *envp); }
|
|
||||||
SYS_UMASK = 60 // { mode_t|sys||umask(mode_t newmask); }
|
|
||||||
SYS_CHROOT = 61 // { int|sys||chroot(const char *path); }
|
|
||||||
SYS_VFORK = 66 // { int|sys||vfork(void); }
|
|
||||||
SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); }
|
|
||||||
SYS_SSTK = 70 // { int|sys||sstk(int incr); }
|
|
||||||
SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); }
|
|
||||||
SYS_MUNMAP = 73 // { int|sys||munmap(void *addr, size_t len); }
|
|
||||||
SYS_MPROTECT = 74 // { int|sys||mprotect(void *addr, size_t len, int prot); }
|
|
||||||
SYS_MADVISE = 75 // { int|sys||madvise(void *addr, size_t len, int behav); }
|
|
||||||
SYS_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); }
|
|
||||||
SYS_GETGROUPS = 79 // { int|sys||getgroups(int gidsetsize, gid_t *gidset); }
|
|
||||||
SYS_SETGROUPS = 80 // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); }
|
|
||||||
SYS_GETPGRP = 81 // { int|sys||getpgrp(void); }
|
|
||||||
SYS_SETPGID = 82 // { int|sys||setpgid(pid_t pid, pid_t pgid); }
|
|
||||||
SYS_DUP2 = 90 // { int|sys||dup2(int from, int to); }
|
|
||||||
SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); }
|
|
||||||
SYS_FSYNC = 95 // { int|sys||fsync(int fd); }
|
|
||||||
SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); }
|
|
||||||
SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); }
|
|
||||||
SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); }
|
|
||||||
SYS_BIND = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); }
|
|
||||||
SYS_SETSOCKOPT = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); }
|
|
||||||
SYS_LISTEN = 106 // { int|sys||listen(int s, int backlog); }
|
|
||||||
SYS_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); }
|
|
||||||
SYS_READV = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); }
|
|
||||||
SYS_WRITEV = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); }
|
|
||||||
SYS_FCHOWN = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); }
|
|
||||||
SYS_FCHMOD = 124 // { int|sys||fchmod(int fd, mode_t mode); }
|
|
||||||
SYS_SETREUID = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); }
|
|
||||||
SYS_SETREGID = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); }
|
|
||||||
SYS_RENAME = 128 // { int|sys||rename(const char *from, const char *to); }
|
|
||||||
SYS_FLOCK = 131 // { int|sys||flock(int fd, int how); }
|
|
||||||
SYS_MKFIFO = 132 // { int|sys||mkfifo(const char *path, mode_t mode); }
|
|
||||||
SYS_SENDTO = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); }
|
|
||||||
SYS_SHUTDOWN = 134 // { int|sys||shutdown(int s, int how); }
|
|
||||||
SYS_SOCKETPAIR = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); }
|
|
||||||
SYS_MKDIR = 136 // { int|sys||mkdir(const char *path, mode_t mode); }
|
|
||||||
SYS_RMDIR = 137 // { int|sys||rmdir(const char *path); }
|
|
||||||
SYS_SETSID = 147 // { int|sys||setsid(void); }
|
|
||||||
SYS_SYSARCH = 165 // { int|sys||sysarch(int op, void *parms); }
|
|
||||||
SYS_PREAD = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); }
|
|
||||||
SYS_PWRITE = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); }
|
|
||||||
SYS_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); }
|
|
||||||
SYS_SETGID = 181 // { int|sys||setgid(gid_t gid); }
|
|
||||||
SYS_SETEGID = 182 // { int|sys||setegid(gid_t egid); }
|
|
||||||
SYS_SETEUID = 183 // { int|sys||seteuid(uid_t euid); }
|
|
||||||
SYS_PATHCONF = 191 // { long|sys||pathconf(const char *path, int name); }
|
|
||||||
SYS_FPATHCONF = 192 // { long|sys||fpathconf(int fd, int name); }
|
|
||||||
SYS_GETRLIMIT = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); }
|
|
||||||
SYS_SETRLIMIT = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); }
|
|
||||||
SYS_MMAP = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); }
|
|
||||||
SYS_LSEEK = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); }
|
|
||||||
SYS_TRUNCATE = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); }
|
|
||||||
SYS_FTRUNCATE = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); }
|
|
||||||
SYS___SYSCTL = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); }
|
|
||||||
SYS_MLOCK = 203 // { int|sys||mlock(const void *addr, size_t len); }
|
|
||||||
SYS_MUNLOCK = 204 // { int|sys||munlock(const void *addr, size_t len); }
|
|
||||||
SYS_UNDELETE = 205 // { int|sys||undelete(const char *path); }
|
|
||||||
SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); }
|
|
||||||
SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); }
|
|
||||||
SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); }
|
|
||||||
SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); }
|
|
||||||
SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); }
|
|
||||||
SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); }
|
|
||||||
SYS_MSGGET = 225 // { int|sys||msgget(key_t key, int msgflg); }
|
|
||||||
SYS_MSGSND = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); }
|
|
||||||
SYS_MSGRCV = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); }
|
|
||||||
SYS_SHMAT = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); }
|
|
||||||
SYS_SHMDT = 230 // { int|sys||shmdt(const void *shmaddr); }
|
|
||||||
SYS_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); }
|
|
||||||
SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); }
|
|
||||||
SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); }
|
|
||||||
SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); }
|
|
||||||
SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); }
|
|
||||||
SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); }
|
|
||||||
SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); }
|
|
||||||
SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); }
|
|
||||||
SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); }
|
|
||||||
SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); }
|
|
||||||
SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); }
|
|
||||||
SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); }
|
|
||||||
SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); }
|
|
||||||
SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); }
|
|
||||||
SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); }
|
|
||||||
SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); }
|
|
||||||
SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); }
|
|
||||||
SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); }
|
|
||||||
SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); }
|
|
||||||
SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); }
|
|
||||||
SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); }
|
|
||||||
SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); }
|
|
||||||
SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); }
|
|
||||||
SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); }
|
|
||||||
SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); }
|
|
||||||
SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); }
|
|
||||||
SYS_ISSETUGID = 305 // { int|sys||issetugid(void); }
|
|
||||||
SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); }
|
|
||||||
SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); }
|
|
||||||
SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); }
|
|
||||||
SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); }
|
|
||||||
SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); }
|
|
||||||
SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); }
|
|
||||||
SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); }
|
|
||||||
SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); }
|
|
||||||
SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); }
|
|
||||||
SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); }
|
|
||||||
SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); }
|
|
||||||
SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); }
|
|
||||||
SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); }
|
|
||||||
SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); }
|
|
||||||
SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); }
|
|
||||||
SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); }
|
|
||||||
SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); }
|
|
||||||
SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); }
|
|
||||||
SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); }
|
|
||||||
SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); }
|
|
||||||
SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); }
|
|
||||||
SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); }
|
|
||||||
SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); }
|
|
||||||
SYS_KQUEUE = 344 // { int|sys||kqueue(void); }
|
|
||||||
SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); }
|
|
||||||
SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); }
|
|
||||||
SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); }
|
|
||||||
SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); }
|
|
||||||
SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); }
|
|
||||||
SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); }
|
|
||||||
SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); }
|
|
||||||
SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); }
|
|
||||||
SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); }
|
|
||||||
SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); }
|
|
||||||
SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); }
|
|
||||||
SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); }
|
|
||||||
SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); }
|
|
||||||
SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); }
|
|
||||||
SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); }
|
|
||||||
SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); }
|
|
||||||
SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); }
|
|
||||||
SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); }
|
|
||||||
SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); }
|
|
||||||
SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); }
|
|
||||||
SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); }
|
|
||||||
SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); }
|
|
||||||
SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); }
|
|
||||||
SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); }
|
|
||||||
SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); }
|
|
||||||
SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); }
|
|
||||||
SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); }
|
|
||||||
SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); }
|
|
||||||
SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); }
|
|
||||||
SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); }
|
|
||||||
SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); }
|
|
||||||
SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); }
|
|
||||||
SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); }
|
|
||||||
SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); }
|
|
||||||
SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); }
|
|
||||||
SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); }
|
|
||||||
SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); }
|
|
||||||
SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); }
|
|
||||||
SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); }
|
|
||||||
SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); }
|
|
||||||
SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); }
|
|
||||||
SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); }
|
|
||||||
SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); }
|
|
||||||
SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); }
|
|
||||||
SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); }
|
|
||||||
SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); }
|
|
||||||
SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); }
|
|
||||||
SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); }
|
|
||||||
SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); }
|
|
||||||
SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); }
|
|
||||||
SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); }
|
|
||||||
SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); }
|
|
||||||
SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); }
|
|
||||||
SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); }
|
|
||||||
SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); }
|
|
||||||
SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); }
|
|
||||||
SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); }
|
|
||||||
SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); }
|
|
||||||
SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); }
|
|
||||||
SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); }
|
|
||||||
SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); }
|
|
||||||
SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); }
|
|
||||||
SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); }
|
|
||||||
SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); }
|
|
||||||
SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); }
|
|
||||||
SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); }
|
|
||||||
SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); }
|
|
||||||
SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); }
|
|
||||||
SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); }
|
|
||||||
SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); }
|
|
||||||
SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); }
|
|
||||||
SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); }
|
|
||||||
SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); }
|
|
||||||
SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); }
|
|
||||||
SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); }
|
|
||||||
SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); }
|
|
||||||
SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); }
|
|
||||||
SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); }
|
|
||||||
SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); }
|
|
||||||
SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); }
|
|
||||||
SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); }
|
|
||||||
SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); }
|
|
||||||
SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); }
|
|
||||||
SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); }
|
|
||||||
SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); }
|
|
||||||
SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); }
|
|
||||||
SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); }
|
|
||||||
SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); }
|
|
||||||
SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); }
|
|
||||||
SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); }
|
|
||||||
SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); }
|
|
||||||
SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); }
|
|
||||||
)
|
|
||||||
=======
|
|
||||||
// go run mksysnum.go http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master
|
// go run mksysnum.go http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
|
|
@ -549,4 +273,3 @@ const (
|
||||||
SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); }
|
SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); }
|
||||||
SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); }
|
SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); }
|
||||||
)
|
)
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
|
|
@ -1,279 +1,3 @@
|
||||||
<<<<<<< HEAD
|
|
||||||
// go run mksysnum.go http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master
|
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
|
||||||
|
|
||||||
// +build amd64,netbsd
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
const (
|
|
||||||
SYS_EXIT = 1 // { void|sys||exit(int rval); }
|
|
||||||
SYS_FORK = 2 // { int|sys||fork(void); }
|
|
||||||
SYS_READ = 3 // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); }
|
|
||||||
SYS_WRITE = 4 // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); }
|
|
||||||
SYS_OPEN = 5 // { int|sys||open(const char *path, int flags, ... mode_t mode); }
|
|
||||||
SYS_CLOSE = 6 // { int|sys||close(int fd); }
|
|
||||||
SYS_LINK = 9 // { int|sys||link(const char *path, const char *link); }
|
|
||||||
SYS_UNLINK = 10 // { int|sys||unlink(const char *path); }
|
|
||||||
SYS_CHDIR = 12 // { int|sys||chdir(const char *path); }
|
|
||||||
SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); }
|
|
||||||
SYS_CHMOD = 15 // { int|sys||chmod(const char *path, mode_t mode); }
|
|
||||||
SYS_CHOWN = 16 // { int|sys||chown(const char *path, uid_t uid, gid_t gid); }
|
|
||||||
SYS_BREAK = 17 // { int|sys||obreak(char *nsize); }
|
|
||||||
SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); }
|
|
||||||
SYS_UNMOUNT = 22 // { int|sys||unmount(const char *path, int flags); }
|
|
||||||
SYS_SETUID = 23 // { int|sys||setuid(uid_t uid); }
|
|
||||||
SYS_GETUID = 24 // { uid_t|sys||getuid_with_euid(void); }
|
|
||||||
SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); }
|
|
||||||
SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); }
|
|
||||||
SYS_RECVMSG = 27 // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); }
|
|
||||||
SYS_SENDMSG = 28 // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); }
|
|
||||||
SYS_RECVFROM = 29 // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); }
|
|
||||||
SYS_ACCEPT = 30 // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); }
|
|
||||||
SYS_GETPEERNAME = 31 // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); }
|
|
||||||
SYS_GETSOCKNAME = 32 // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); }
|
|
||||||
SYS_ACCESS = 33 // { int|sys||access(const char *path, int flags); }
|
|
||||||
SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); }
|
|
||||||
SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); }
|
|
||||||
SYS_SYNC = 36 // { void|sys||sync(void); }
|
|
||||||
SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); }
|
|
||||||
SYS_GETPPID = 39 // { pid_t|sys||getppid(void); }
|
|
||||||
SYS_DUP = 41 // { int|sys||dup(int fd); }
|
|
||||||
SYS_PIPE = 42 // { int|sys||pipe(void); }
|
|
||||||
SYS_GETEGID = 43 // { gid_t|sys||getegid(void); }
|
|
||||||
SYS_PROFIL = 44 // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); }
|
|
||||||
SYS_KTRACE = 45 // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); }
|
|
||||||
SYS_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); }
|
|
||||||
SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); }
|
|
||||||
SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); }
|
|
||||||
SYS_ACCT = 51 // { int|sys||acct(const char *path); }
|
|
||||||
SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); }
|
|
||||||
SYS_REVOKE = 56 // { int|sys||revoke(const char *path); }
|
|
||||||
SYS_SYMLINK = 57 // { int|sys||symlink(const char *path, const char *link); }
|
|
||||||
SYS_READLINK = 58 // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); }
|
|
||||||
SYS_EXECVE = 59 // { int|sys||execve(const char *path, char * const *argp, char * const *envp); }
|
|
||||||
SYS_UMASK = 60 // { mode_t|sys||umask(mode_t newmask); }
|
|
||||||
SYS_CHROOT = 61 // { int|sys||chroot(const char *path); }
|
|
||||||
SYS_VFORK = 66 // { int|sys||vfork(void); }
|
|
||||||
SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); }
|
|
||||||
SYS_SSTK = 70 // { int|sys||sstk(int incr); }
|
|
||||||
SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); }
|
|
||||||
SYS_MUNMAP = 73 // { int|sys||munmap(void *addr, size_t len); }
|
|
||||||
SYS_MPROTECT = 74 // { int|sys||mprotect(void *addr, size_t len, int prot); }
|
|
||||||
SYS_MADVISE = 75 // { int|sys||madvise(void *addr, size_t len, int behav); }
|
|
||||||
SYS_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); }
|
|
||||||
SYS_GETGROUPS = 79 // { int|sys||getgroups(int gidsetsize, gid_t *gidset); }
|
|
||||||
SYS_SETGROUPS = 80 // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); }
|
|
||||||
SYS_GETPGRP = 81 // { int|sys||getpgrp(void); }
|
|
||||||
SYS_SETPGID = 82 // { int|sys||setpgid(pid_t pid, pid_t pgid); }
|
|
||||||
SYS_DUP2 = 90 // { int|sys||dup2(int from, int to); }
|
|
||||||
SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); }
|
|
||||||
SYS_FSYNC = 95 // { int|sys||fsync(int fd); }
|
|
||||||
SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); }
|
|
||||||
SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); }
|
|
||||||
SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); }
|
|
||||||
SYS_BIND = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); }
|
|
||||||
SYS_SETSOCKOPT = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); }
|
|
||||||
SYS_LISTEN = 106 // { int|sys||listen(int s, int backlog); }
|
|
||||||
SYS_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); }
|
|
||||||
SYS_READV = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); }
|
|
||||||
SYS_WRITEV = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); }
|
|
||||||
SYS_FCHOWN = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); }
|
|
||||||
SYS_FCHMOD = 124 // { int|sys||fchmod(int fd, mode_t mode); }
|
|
||||||
SYS_SETREUID = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); }
|
|
||||||
SYS_SETREGID = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); }
|
|
||||||
SYS_RENAME = 128 // { int|sys||rename(const char *from, const char *to); }
|
|
||||||
SYS_FLOCK = 131 // { int|sys||flock(int fd, int how); }
|
|
||||||
SYS_MKFIFO = 132 // { int|sys||mkfifo(const char *path, mode_t mode); }
|
|
||||||
SYS_SENDTO = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); }
|
|
||||||
SYS_SHUTDOWN = 134 // { int|sys||shutdown(int s, int how); }
|
|
||||||
SYS_SOCKETPAIR = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); }
|
|
||||||
SYS_MKDIR = 136 // { int|sys||mkdir(const char *path, mode_t mode); }
|
|
||||||
SYS_RMDIR = 137 // { int|sys||rmdir(const char *path); }
|
|
||||||
SYS_SETSID = 147 // { int|sys||setsid(void); }
|
|
||||||
SYS_SYSARCH = 165 // { int|sys||sysarch(int op, void *parms); }
|
|
||||||
SYS_PREAD = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); }
|
|
||||||
SYS_PWRITE = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); }
|
|
||||||
SYS_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); }
|
|
||||||
SYS_SETGID = 181 // { int|sys||setgid(gid_t gid); }
|
|
||||||
SYS_SETEGID = 182 // { int|sys||setegid(gid_t egid); }
|
|
||||||
SYS_SETEUID = 183 // { int|sys||seteuid(uid_t euid); }
|
|
||||||
SYS_PATHCONF = 191 // { long|sys||pathconf(const char *path, int name); }
|
|
||||||
SYS_FPATHCONF = 192 // { long|sys||fpathconf(int fd, int name); }
|
|
||||||
SYS_GETRLIMIT = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); }
|
|
||||||
SYS_SETRLIMIT = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); }
|
|
||||||
SYS_MMAP = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); }
|
|
||||||
SYS_LSEEK = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); }
|
|
||||||
SYS_TRUNCATE = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); }
|
|
||||||
SYS_FTRUNCATE = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); }
|
|
||||||
SYS___SYSCTL = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); }
|
|
||||||
SYS_MLOCK = 203 // { int|sys||mlock(const void *addr, size_t len); }
|
|
||||||
SYS_MUNLOCK = 204 // { int|sys||munlock(const void *addr, size_t len); }
|
|
||||||
SYS_UNDELETE = 205 // { int|sys||undelete(const char *path); }
|
|
||||||
SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); }
|
|
||||||
SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); }
|
|
||||||
SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); }
|
|
||||||
SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); }
|
|
||||||
SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); }
|
|
||||||
SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); }
|
|
||||||
SYS_MSGGET = 225 // { int|sys||msgget(key_t key, int msgflg); }
|
|
||||||
SYS_MSGSND = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); }
|
|
||||||
SYS_MSGRCV = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); }
|
|
||||||
SYS_SHMAT = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); }
|
|
||||||
SYS_SHMDT = 230 // { int|sys||shmdt(const void *shmaddr); }
|
|
||||||
SYS_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); }
|
|
||||||
SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); }
|
|
||||||
SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); }
|
|
||||||
SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); }
|
|
||||||
SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); }
|
|
||||||
SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); }
|
|
||||||
SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); }
|
|
||||||
SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); }
|
|
||||||
SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); }
|
|
||||||
SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); }
|
|
||||||
SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); }
|
|
||||||
SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); }
|
|
||||||
SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); }
|
|
||||||
SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); }
|
|
||||||
SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); }
|
|
||||||
SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); }
|
|
||||||
SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); }
|
|
||||||
SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); }
|
|
||||||
SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); }
|
|
||||||
SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); }
|
|
||||||
SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); }
|
|
||||||
SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); }
|
|
||||||
SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); }
|
|
||||||
SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); }
|
|
||||||
SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); }
|
|
||||||
SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); }
|
|
||||||
SYS_ISSETUGID = 305 // { int|sys||issetugid(void); }
|
|
||||||
SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); }
|
|
||||||
SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); }
|
|
||||||
SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); }
|
|
||||||
SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); }
|
|
||||||
SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); }
|
|
||||||
SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); }
|
|
||||||
SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); }
|
|
||||||
SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); }
|
|
||||||
SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); }
|
|
||||||
SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); }
|
|
||||||
SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); }
|
|
||||||
SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); }
|
|
||||||
SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); }
|
|
||||||
SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); }
|
|
||||||
SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); }
|
|
||||||
SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); }
|
|
||||||
SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); }
|
|
||||||
SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); }
|
|
||||||
SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); }
|
|
||||||
SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); }
|
|
||||||
SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); }
|
|
||||||
SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); }
|
|
||||||
SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); }
|
|
||||||
SYS_KQUEUE = 344 // { int|sys||kqueue(void); }
|
|
||||||
SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); }
|
|
||||||
SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); }
|
|
||||||
SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); }
|
|
||||||
SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); }
|
|
||||||
SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); }
|
|
||||||
SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); }
|
|
||||||
SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); }
|
|
||||||
SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); }
|
|
||||||
SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); }
|
|
||||||
SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); }
|
|
||||||
SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); }
|
|
||||||
SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); }
|
|
||||||
SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); }
|
|
||||||
SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); }
|
|
||||||
SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); }
|
|
||||||
SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); }
|
|
||||||
SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); }
|
|
||||||
SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); }
|
|
||||||
SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); }
|
|
||||||
SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); }
|
|
||||||
SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); }
|
|
||||||
SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); }
|
|
||||||
SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); }
|
|
||||||
SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); }
|
|
||||||
SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); }
|
|
||||||
SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); }
|
|
||||||
SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); }
|
|
||||||
SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); }
|
|
||||||
SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); }
|
|
||||||
SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); }
|
|
||||||
SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); }
|
|
||||||
SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); }
|
|
||||||
SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); }
|
|
||||||
SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); }
|
|
||||||
SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); }
|
|
||||||
SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); }
|
|
||||||
SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); }
|
|
||||||
SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); }
|
|
||||||
SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); }
|
|
||||||
SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); }
|
|
||||||
SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); }
|
|
||||||
SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); }
|
|
||||||
SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); }
|
|
||||||
SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); }
|
|
||||||
SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); }
|
|
||||||
SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); }
|
|
||||||
SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); }
|
|
||||||
SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); }
|
|
||||||
SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); }
|
|
||||||
SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); }
|
|
||||||
SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); }
|
|
||||||
SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); }
|
|
||||||
SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); }
|
|
||||||
SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); }
|
|
||||||
SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); }
|
|
||||||
SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); }
|
|
||||||
SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); }
|
|
||||||
SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); }
|
|
||||||
SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); }
|
|
||||||
SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); }
|
|
||||||
SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); }
|
|
||||||
SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); }
|
|
||||||
SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); }
|
|
||||||
SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); }
|
|
||||||
SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); }
|
|
||||||
SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); }
|
|
||||||
SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); }
|
|
||||||
SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); }
|
|
||||||
SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); }
|
|
||||||
SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); }
|
|
||||||
SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); }
|
|
||||||
SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); }
|
|
||||||
SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); }
|
|
||||||
SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); }
|
|
||||||
SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); }
|
|
||||||
SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); }
|
|
||||||
SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); }
|
|
||||||
SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); }
|
|
||||||
SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); }
|
|
||||||
SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); }
|
|
||||||
SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); }
|
|
||||||
SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); }
|
|
||||||
SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); }
|
|
||||||
SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); }
|
|
||||||
SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); }
|
|
||||||
SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); }
|
|
||||||
SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); }
|
|
||||||
SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); }
|
|
||||||
SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); }
|
|
||||||
SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); }
|
|
||||||
SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); }
|
|
||||||
SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); }
|
|
||||||
SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); }
|
|
||||||
)
|
|
||||||
=======
|
|
||||||
// go run mksysnum.go http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master
|
// go run mksysnum.go http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
|
|
@ -549,4 +273,3 @@ const (
|
||||||
SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); }
|
SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); }
|
||||||
SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); }
|
SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); }
|
||||||
)
|
)
|
||||||
>>>>>>> 524b7b6f08cdc08fed2a34c8f872ad0d17dda891
|
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue