go.mod,vendor: use go modules, update
This commit is contained in:
		
							parent
							
								
									429297d66f
								
							
						
					
					
						commit
						33760e0990
					
				| 
						 | 
					@ -0,0 +1,23 @@
 | 
				
			||||||
 | 
					on: [push, pull_request]
 | 
				
			||||||
 | 
					name: Test
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  test:
 | 
				
			||||||
 | 
					    strategy:
 | 
				
			||||||
 | 
					      matrix:
 | 
				
			||||||
 | 
					        go-version: [1.19.x]
 | 
				
			||||||
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					    - name: Install Go
 | 
				
			||||||
 | 
					      uses: actions/setup-go@v3
 | 
				
			||||||
 | 
					      with:
 | 
				
			||||||
 | 
					        go-version: ${{ matrix.go-version }}
 | 
				
			||||||
 | 
					    - uses: actions/checkout@v3
 | 
				
			||||||
 | 
					      with:
 | 
				
			||||||
 | 
					         path: './src/github.com/kevinburke/chroma-markdown'
 | 
				
			||||||
 | 
					    # staticcheck needs this for GOPATH
 | 
				
			||||||
 | 
					    - run: |
 | 
				
			||||||
 | 
					        echo "GOPATH=$GITHUB_WORKSPACE" >> $GITHUB_ENV
 | 
				
			||||||
 | 
					        echo "PATH=$GITHUB_WORKSPACE/bin:$PATH" >> $GITHUB_ENV
 | 
				
			||||||
 | 
					    - name: Run tests
 | 
				
			||||||
 | 
					      run: make test
 | 
				
			||||||
 | 
					      working-directory: './src/github.com/kevinburke/chroma-markdown'
 | 
				
			||||||
| 
						 | 
					@ -1,75 +0,0 @@
 | 
				
			||||||
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[[projects]]
 | 
					 | 
				
			||||||
  digest = "1:1ac38c116b56bcb0729b224191e3d2bc86883cd0b82d02c3ea0b006db395de91"
 | 
					 | 
				
			||||||
  name = "github.com/alecthomas/chroma"
 | 
					 | 
				
			||||||
  packages = [
 | 
					 | 
				
			||||||
    ".",
 | 
					 | 
				
			||||||
    "formatters/html",
 | 
					 | 
				
			||||||
    "lexers",
 | 
					 | 
				
			||||||
    "lexers/a",
 | 
					 | 
				
			||||||
    "lexers/b",
 | 
					 | 
				
			||||||
    "lexers/c",
 | 
					 | 
				
			||||||
    "lexers/circular",
 | 
					 | 
				
			||||||
    "lexers/d",
 | 
					 | 
				
			||||||
    "lexers/e",
 | 
					 | 
				
			||||||
    "lexers/f",
 | 
					 | 
				
			||||||
    "lexers/g",
 | 
					 | 
				
			||||||
    "lexers/h",
 | 
					 | 
				
			||||||
    "lexers/i",
 | 
					 | 
				
			||||||
    "lexers/internal",
 | 
					 | 
				
			||||||
    "lexers/j",
 | 
					 | 
				
			||||||
    "lexers/k",
 | 
					 | 
				
			||||||
    "lexers/l",
 | 
					 | 
				
			||||||
    "lexers/m",
 | 
					 | 
				
			||||||
    "lexers/n",
 | 
					 | 
				
			||||||
    "lexers/o",
 | 
					 | 
				
			||||||
    "lexers/p",
 | 
					 | 
				
			||||||
    "lexers/q",
 | 
					 | 
				
			||||||
    "lexers/r",
 | 
					 | 
				
			||||||
    "lexers/s",
 | 
					 | 
				
			||||||
    "lexers/t",
 | 
					 | 
				
			||||||
    "lexers/v",
 | 
					 | 
				
			||||||
    "lexers/w",
 | 
					 | 
				
			||||||
    "lexers/x",
 | 
					 | 
				
			||||||
    "lexers/y",
 | 
					 | 
				
			||||||
    "lexers/z",
 | 
					 | 
				
			||||||
    "styles",
 | 
					 | 
				
			||||||
  ]
 | 
					 | 
				
			||||||
  pruneopts = "UT"
 | 
					 | 
				
			||||||
  revision = "v0.9.4"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[[projects]]
 | 
					 | 
				
			||||||
  digest = "1:1d760033af7697966e33f900ddd0e68bfa2637b50fa25e7384e45f73f54e3276"
 | 
					 | 
				
			||||||
  name = "github.com/dlclark/regexp2"
 | 
					 | 
				
			||||||
  packages = [
 | 
					 | 
				
			||||||
    ".",
 | 
					 | 
				
			||||||
    "syntax",
 | 
					 | 
				
			||||||
  ]
 | 
					 | 
				
			||||||
  pruneopts = "UT"
 | 
					 | 
				
			||||||
  revision = "v1.4.0"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[[projects]]
 | 
					 | 
				
			||||||
  branch = "master"
 | 
					 | 
				
			||||||
  digest = "1:b1e96c96cf2bfb86229921c95c15c34b56dbaffac891ee24c365ac527aaf5b80"
 | 
					 | 
				
			||||||
  name = "golang.org/x/sys"
 | 
					 | 
				
			||||||
  packages = [
 | 
					 | 
				
			||||||
    "internal/unsafeheader",
 | 
					 | 
				
			||||||
    "unix",
 | 
					 | 
				
			||||||
  ]
 | 
					 | 
				
			||||||
  pruneopts = "UT"
 | 
					 | 
				
			||||||
  revision = "da31bd327af904dd4721b4eefa7c505bb3afd214"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[solve-meta]
 | 
					 | 
				
			||||||
  analyzer-name = "dep"
 | 
					 | 
				
			||||||
  analyzer-version = 1
 | 
					 | 
				
			||||||
  input-imports = [
 | 
					 | 
				
			||||||
    "github.com/alecthomas/chroma",
 | 
					 | 
				
			||||||
    "github.com/alecthomas/chroma/formatters/html",
 | 
					 | 
				
			||||||
    "github.com/alecthomas/chroma/lexers",
 | 
					 | 
				
			||||||
    "github.com/alecthomas/chroma/styles",
 | 
					 | 
				
			||||||
    "golang.org/x/sys/unix",
 | 
					 | 
				
			||||||
  ]
 | 
					 | 
				
			||||||
  solver-name = "gps-cdcl"
 | 
					 | 
				
			||||||
  solver-version = 1
 | 
					 | 
				
			||||||
							
								
								
									
										15
									
								
								Gopkg.toml
								
								
								
								
							
							
						
						
									
										15
									
								
								Gopkg.toml
								
								
								
								
							| 
						 | 
					@ -1,15 +0,0 @@
 | 
				
			||||||
[prune]
 | 
					 | 
				
			||||||
  unused-packages = true
 | 
					 | 
				
			||||||
  go-tests = true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[[constraint]]
 | 
					 | 
				
			||||||
  name = "github.com/alecthomas/chroma"
 | 
					 | 
				
			||||||
  revision = "v0.9.4"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[[override]]
 | 
					 | 
				
			||||||
  name = "github.com/dlclark/regexp2"
 | 
					 | 
				
			||||||
  revision = "v1.4.0"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[[constraint]]
 | 
					 | 
				
			||||||
  name = "golang.org/x/sys"
 | 
					 | 
				
			||||||
  branch = "master"
 | 
					 | 
				
			||||||
							
								
								
									
										11
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										11
									
								
								Makefile
								
								
								
								
							| 
						 | 
					@ -3,15 +3,14 @@ RELEASE := $(GOPATH)/bin/github-release
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UNAME := $(shell uname)
 | 
					UNAME := $(shell uname)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(STATICCHECK):
 | 
					 | 
				
			||||||
	go get honnef.co/go/tools/cmd/staticcheck
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
vet: $(STATICCHECK)
 | 
					vet:
 | 
				
			||||||
	go list ./... | grep -v vendor | xargs go vet
 | 
						go vet ./...
 | 
				
			||||||
	go list ./... | grep -v vendor | xargs $(STATICCHECK)
 | 
						go install honnef.co/go/tools/cmd/staticcheck@latest
 | 
				
			||||||
 | 
						staticcheck ./...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test: vet
 | 
					test: vet
 | 
				
			||||||
	go list ./... | grep -v vendor | xargs go test
 | 
						go test ./...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(RELEASE): test
 | 
					$(RELEASE): test
 | 
				
			||||||
	go get -u github.com/aktau/github-release
 | 
						go get -u github.com/aktau/github-release
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					module github.com/kevinburke/chroma-markdown
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go 1.20
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require (
 | 
				
			||||||
 | 
						github.com/alecthomas/chroma v0.10.0
 | 
				
			||||||
 | 
						golang.org/x/sys v0.4.0
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require github.com/dlclark/regexp2 v1.8.0 // indirect
 | 
				
			||||||
| 
						 | 
					@ -1,14 +1,18 @@
 | 
				
			||||||
 | 
					github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek=
 | 
				
			||||||
 | 
					github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
					github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
					github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
					github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
				
			||||||
github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E=
 | 
					 | 
				
			||||||
github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
 | 
					github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
 | 
				
			||||||
 | 
					github.com/dlclark/regexp2 v1.8.0 h1:rJD5HeGIT/2b5CDk63FVCwZA3qgYElfg+oQK7uH5pfE=
 | 
				
			||||||
 | 
					github.com/dlclark/regexp2 v1.8.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
 | 
				
			||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
					github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
				
			||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
					github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
				
			||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
					github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
				
			||||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
 | 
					github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
 | 
				
			||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 | 
					github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 | 
				
			||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 | 
					golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
				
			||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
				
			||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
 | 
					gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
 | 
				
			||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
					gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
				
			||||||
| 
						 | 
					@ -12,7 +12,7 @@ tokentype_string.go: types.go
 | 
				
			||||||
 | 
					
 | 
				
			||||||
chromad:
 | 
					chromad:
 | 
				
			||||||
	rm -f chromad
 | 
						rm -f chromad
 | 
				
			||||||
	(export CGOENABLED=0 GOOS=linux ; cd ./cmd/chromad && go build -ldflags="-X 'main.version=$(VERSION)'" -o ../../chromad .)
 | 
						(export CGOENABLED=0 GOOS=linux GOARCH=amd64; cd ./cmd/chromad && go build -ldflags="-X 'main.version=$(VERSION)'" -o ../../chromad .)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
upload: chromad
 | 
					upload: chromad
 | 
				
			||||||
	scp chromad root@swapoff.org: && \
 | 
						scp chromad root@swapoff.org: && \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,7 +37,7 @@ translators for Pygments lexers and styles.
 | 
				
			||||||
Prefix | Language
 | 
					Prefix | Language
 | 
				
			||||||
:----: | --------
 | 
					:----: | --------
 | 
				
			||||||
A | ABAP, ABNF, ActionScript, ActionScript 3, Ada, Angular2, ANTLR, ApacheConf, APL, AppleScript, Arduino, Awk
 | 
					A | ABAP, ABNF, ActionScript, ActionScript 3, Ada, Angular2, ANTLR, ApacheConf, APL, AppleScript, Arduino, Awk
 | 
				
			||||||
B | Ballerina, Base Makefile, Bash, Batchfile, BibTeX, BlitzBasic, BNF, Brainfuck
 | 
					B | Ballerina, Base Makefile, Bash, Batchfile, BibTeX, Bicep, BlitzBasic, BNF, Brainfuck
 | 
				
			||||||
C | C, C#, C++, Caddyfile, Caddyfile Directives, Cap'n Proto, Cassandra CQL, Ceylon, CFEngine3, cfstatement, ChaiScript, Cheetah, Clojure, CMake, COBOL, CoffeeScript, Common Lisp, Coq, Crystal, CSS, Cython
 | 
					C | C, C#, C++, Caddyfile, Caddyfile Directives, Cap'n Proto, Cassandra CQL, Ceylon, CFEngine3, cfstatement, ChaiScript, Cheetah, Clojure, CMake, COBOL, CoffeeScript, Common Lisp, Coq, Crystal, CSS, Cython
 | 
				
			||||||
D | D, Dart, Diff, Django/Jinja, Docker, DTD, Dylan
 | 
					D | D, Dart, Diff, Django/Jinja, Docker, DTD, Dylan
 | 
				
			||||||
E | EBNF, Elixir, Elm, EmacsLisp, Erlang
 | 
					E | EBNF, Elixir, Elm, EmacsLisp, Erlang
 | 
				
			||||||
| 
						 | 
					@ -50,7 +50,7 @@ K | Kotlin
 | 
				
			||||||
L | Lighttpd configuration file, LLVM, Lua
 | 
					L | Lighttpd configuration file, LLVM, Lua
 | 
				
			||||||
M | Mako, markdown, Mason, Mathematica, Matlab, MiniZinc, MLIR, Modula-2, MonkeyC, MorrowindScript, Myghty, MySQL
 | 
					M | Mako, markdown, Mason, Mathematica, Matlab, MiniZinc, MLIR, Modula-2, MonkeyC, MorrowindScript, Myghty, MySQL
 | 
				
			||||||
N | NASM, Newspeak, Nginx configuration file, Nim, Nix
 | 
					N | NASM, Newspeak, Nginx configuration file, Nim, Nix
 | 
				
			||||||
O | Objective-C, OCaml, Octave, OnesEnterprise, OpenSCAD, Org Mode
 | 
					O | Objective-C, OCaml, Octave, OnesEnterprise, OpenEdge ABL, OpenSCAD, Org Mode
 | 
				
			||||||
P | PacmanConf, Perl, PHP, PHTML, Pig, PkgConfig, PL/pgSQL, plaintext, Pony, PostgreSQL SQL dialect, PostScript, POVRay, PowerShell, Prolog, PromQL, Protocol Buffer, Puppet, Python 2, Python
 | 
					P | PacmanConf, Perl, PHP, PHTML, Pig, PkgConfig, PL/pgSQL, plaintext, Pony, PostgreSQL SQL dialect, PostScript, POVRay, PowerShell, Prolog, PromQL, Protocol Buffer, Puppet, Python 2, Python
 | 
				
			||||||
Q | QBasic
 | 
					Q | QBasic
 | 
				
			||||||
R | R, Racket, Ragel, Raku, react, ReasonML, reg, reStructuredText, Rexx, Ruby, Rust
 | 
					R | R, Racket, Ragel, Raku, react, ReasonML, reg, reStructuredText, Rexx, Ruby, Rust
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1 +0,0 @@
 | 
				
			||||||
hermit
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1 +0,0 @@
 | 
				
			||||||
hermit
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1 +0,0 @@
 | 
				
			||||||
hermit
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1 +0,0 @@
 | 
				
			||||||
.go-1.16.3.pkg
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1 +0,0 @@
 | 
				
			||||||
.go-1.16.3.pkg
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1 +0,0 @@
 | 
				
			||||||
.golangci-lint-1.37.0.pkg
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1 +0,0 @@
 | 
				
			||||||
.goreleaser-0.182.1.pkg
 | 
					 | 
				
			||||||
| 
						 | 
					@ -46,6 +46,13 @@ func WithPreWrapper(wrapper PreWrapper) Option {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WrapLongLines wraps long lines.
 | 
				
			||||||
 | 
					func WrapLongLines(b bool) Option {
 | 
				
			||||||
 | 
						return func(f *Formatter) {
 | 
				
			||||||
 | 
							f.wrapLongLines = b
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// WithLineNumbers formats output with line numbers.
 | 
					// WithLineNumbers formats output with line numbers.
 | 
				
			||||||
func WithLineNumbers(b bool) Option {
 | 
					func WithLineNumbers(b bool) Option {
 | 
				
			||||||
	return func(f *Formatter) {
 | 
						return func(f *Formatter) {
 | 
				
			||||||
| 
						 | 
					@ -131,10 +138,18 @@ var (
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	defaultPreWrapper = preWrapper{
 | 
						defaultPreWrapper = preWrapper{
 | 
				
			||||||
		start: func(code bool, styleAttr string) string {
 | 
							start: func(code bool, styleAttr string) string {
 | 
				
			||||||
 | 
								if code {
 | 
				
			||||||
 | 
									return fmt.Sprintf(`<pre tabindex="0"%s><code>`, styleAttr)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			return fmt.Sprintf(`<pre tabindex="0"%s>`, styleAttr)
 | 
								return fmt.Sprintf(`<pre tabindex="0"%s>`, styleAttr)
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		end: func(code bool) string {
 | 
							end: func(code bool) string {
 | 
				
			||||||
			return "</pre>"
 | 
								if code {
 | 
				
			||||||
 | 
									return `</code></pre>`
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								return `</pre>`
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
| 
						 | 
					@ -147,6 +162,7 @@ type Formatter struct {
 | 
				
			||||||
	allClasses          bool
 | 
						allClasses          bool
 | 
				
			||||||
	preWrapper          PreWrapper
 | 
						preWrapper          PreWrapper
 | 
				
			||||||
	tabWidth            int
 | 
						tabWidth            int
 | 
				
			||||||
 | 
						wrapLongLines       bool
 | 
				
			||||||
	lineNumbers         bool
 | 
						lineNumbers         bool
 | 
				
			||||||
	lineNumbersInTable  bool
 | 
						lineNumbersInTable  bool
 | 
				
			||||||
	linkableLineNumbers bool
 | 
						linkableLineNumbers bool
 | 
				
			||||||
| 
						 | 
					@ -197,10 +213,10 @@ func (f *Formatter) writeHTML(w io.Writer, style *chroma.Style, tokens []chroma.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if wrapInTable {
 | 
						if wrapInTable {
 | 
				
			||||||
		// List line numbers in its own <td>
 | 
							// List line numbers in its own <td>
 | 
				
			||||||
		fmt.Fprintf(w, "<div%s>\n", f.styleAttr(css, chroma.Background))
 | 
							fmt.Fprintf(w, "<div%s>\n", f.styleAttr(css, chroma.PreWrapper))
 | 
				
			||||||
		fmt.Fprintf(w, "<table%s><tr>", f.styleAttr(css, chroma.LineTable))
 | 
							fmt.Fprintf(w, "<table%s><tr>", f.styleAttr(css, chroma.LineTable))
 | 
				
			||||||
		fmt.Fprintf(w, "<td%s>\n", f.styleAttr(css, chroma.LineTableTD))
 | 
							fmt.Fprintf(w, "<td%s>\n", f.styleAttr(css, chroma.LineTableTD))
 | 
				
			||||||
		fmt.Fprintf(w, f.preWrapper.Start(false, f.styleAttr(css, chroma.Background)))
 | 
							fmt.Fprintf(w, f.preWrapper.Start(false, f.styleAttr(css, chroma.PreWrapper)))
 | 
				
			||||||
		for index := range lines {
 | 
							for index := range lines {
 | 
				
			||||||
			line := f.baseLineNumber + index
 | 
								line := f.baseLineNumber + index
 | 
				
			||||||
			highlight, next := f.shouldHighlight(highlightIndex, line)
 | 
								highlight, next := f.shouldHighlight(highlightIndex, line)
 | 
				
			||||||
| 
						 | 
					@ -222,7 +238,7 @@ func (f *Formatter) writeHTML(w io.Writer, style *chroma.Style, tokens []chroma.
 | 
				
			||||||
		fmt.Fprintf(w, "<td%s>\n", f.styleAttr(css, chroma.LineTableTD, "width:100%"))
 | 
							fmt.Fprintf(w, "<td%s>\n", f.styleAttr(css, chroma.LineTableTD, "width:100%"))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fmt.Fprintf(w, f.preWrapper.Start(true, f.styleAttr(css, chroma.Background)))
 | 
						fmt.Fprintf(w, f.preWrapper.Start(true, f.styleAttr(css, chroma.PreWrapper)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	highlightIndex = 0
 | 
						highlightIndex = 0
 | 
				
			||||||
	for index, tokens := range lines {
 | 
						for index, tokens := range lines {
 | 
				
			||||||
| 
						 | 
					@ -232,14 +248,28 @@ func (f *Formatter) writeHTML(w io.Writer, style *chroma.Style, tokens []chroma.
 | 
				
			||||||
		if next {
 | 
							if next {
 | 
				
			||||||
			highlightIndex++
 | 
								highlightIndex++
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Start of Line
 | 
				
			||||||
 | 
							fmt.Fprint(w, `<span`)
 | 
				
			||||||
		if highlight {
 | 
							if highlight {
 | 
				
			||||||
			fmt.Fprintf(w, "<span%s>", f.styleAttr(css, chroma.LineHighlight))
 | 
								// Line + LineHighlight
 | 
				
			||||||
 | 
								if f.Classes {
 | 
				
			||||||
 | 
									fmt.Fprintf(w, ` class="%s %s"`, f.class(chroma.Line), f.class(chroma.LineHighlight))
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									fmt.Fprintf(w, ` style="%s %s"`, css[chroma.Line], css[chroma.LineHighlight])
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								fmt.Fprint(w, `>`)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								fmt.Fprintf(w, "%s>", f.styleAttr(css, chroma.Line))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Line number
 | 
				
			||||||
		if f.lineNumbers && !wrapInTable {
 | 
							if f.lineNumbers && !wrapInTable {
 | 
				
			||||||
			fmt.Fprintf(w, "<span%s%s>%s</span>", f.styleAttr(css, chroma.LineNumbers), f.lineIDAttribute(line), f.lineTitleWithLinkIfNeeded(lineDigits, line))
 | 
								fmt.Fprintf(w, "<span%s%s>%s</span>", f.styleAttr(css, chroma.LineNumbers), f.lineIDAttribute(line), f.lineTitleWithLinkIfNeeded(lineDigits, line))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							fmt.Fprintf(w, `<span%s>`, f.styleAttr(css, chroma.CodeLine))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for _, token := range tokens {
 | 
							for _, token := range tokens {
 | 
				
			||||||
			html := html.EscapeString(token.String())
 | 
								html := html.EscapeString(token.String())
 | 
				
			||||||
			attr := f.styleAttr(css, token.Type)
 | 
								attr := f.styleAttr(css, token.Type)
 | 
				
			||||||
| 
						 | 
					@ -248,9 +278,10 @@ func (f *Formatter) writeHTML(w io.Writer, style *chroma.Style, tokens []chroma.
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			fmt.Fprint(w, html)
 | 
								fmt.Fprint(w, html)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if highlight {
 | 
					
 | 
				
			||||||
			fmt.Fprintf(w, "</span>")
 | 
							fmt.Fprint(w, `</span>`) // End of CodeLine
 | 
				
			||||||
		}
 | 
					
 | 
				
			||||||
 | 
							fmt.Fprint(w, `</span>`) // End of Line
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fmt.Fprintf(w, f.preWrapper.End(true))
 | 
						fmt.Fprintf(w, f.preWrapper.End(true))
 | 
				
			||||||
| 
						 | 
					@ -351,7 +382,11 @@ func (f *Formatter) tabWidthStyle() string {
 | 
				
			||||||
func (f *Formatter) WriteCSS(w io.Writer, style *chroma.Style) error {
 | 
					func (f *Formatter) WriteCSS(w io.Writer, style *chroma.Style) error {
 | 
				
			||||||
	css := f.styleToCSS(style)
 | 
						css := f.styleToCSS(style)
 | 
				
			||||||
	// Special-case background as it is mapped to the outer ".chroma" class.
 | 
						// Special-case background as it is mapped to the outer ".chroma" class.
 | 
				
			||||||
	if _, err := fmt.Fprintf(w, "/* %s */ .%schroma { %s }\n", chroma.Background, f.prefix, css[chroma.Background]); err != nil {
 | 
						if _, err := fmt.Fprintf(w, "/* %s */ .%sbg { %s }\n", chroma.Background, f.prefix, css[chroma.Background]); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// Special-case PreWrapper as it is the ".chroma" class.
 | 
				
			||||||
 | 
						if _, err := fmt.Fprintf(w, "/* %s */ .%schroma { %s }\n", chroma.PreWrapper, f.prefix, css[chroma.PreWrapper]); err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Special-case code column of table to expand width.
 | 
						// Special-case code column of table to expand width.
 | 
				
			||||||
| 
						 | 
					@ -375,7 +410,8 @@ func (f *Formatter) WriteCSS(w io.Writer, style *chroma.Style) error {
 | 
				
			||||||
	sort.Ints(tts)
 | 
						sort.Ints(tts)
 | 
				
			||||||
	for _, ti := range tts {
 | 
						for _, ti := range tts {
 | 
				
			||||||
		tt := chroma.TokenType(ti)
 | 
							tt := chroma.TokenType(ti)
 | 
				
			||||||
		if tt == chroma.Background {
 | 
							switch tt {
 | 
				
			||||||
 | 
							case chroma.Background, chroma.PreWrapper:
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		class := f.class(tt)
 | 
							class := f.class(tt)
 | 
				
			||||||
| 
						 | 
					@ -405,12 +441,21 @@ func (f *Formatter) styleToCSS(style *chroma.Style) map[chroma.TokenType]string
 | 
				
			||||||
		classes[t] = StyleEntryToCSS(entry)
 | 
							classes[t] = StyleEntryToCSS(entry)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	classes[chroma.Background] += f.tabWidthStyle()
 | 
						classes[chroma.Background] += f.tabWidthStyle()
 | 
				
			||||||
	lineNumbersStyle := "margin-right: 0.4em; padding: 0 0.4em 0 0.4em;"
 | 
						classes[chroma.PreWrapper] += classes[chroma.Background] + `;`
 | 
				
			||||||
 | 
						// Make PreWrapper a grid to show highlight style with full width.
 | 
				
			||||||
 | 
						if len(f.highlightRanges) > 0 {
 | 
				
			||||||
 | 
							classes[chroma.PreWrapper] += `display: grid;`
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// Make PreWrapper wrap long lines.
 | 
				
			||||||
 | 
						if f.wrapLongLines {
 | 
				
			||||||
 | 
							classes[chroma.PreWrapper] += `white-space: pre-wrap; word-break: break-word;`
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						lineNumbersStyle := `white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;`
 | 
				
			||||||
	// All rules begin with default rules followed by user provided rules
 | 
						// All rules begin with default rules followed by user provided rules
 | 
				
			||||||
 | 
						classes[chroma.Line] = `display: flex;` + classes[chroma.Line]
 | 
				
			||||||
	classes[chroma.LineNumbers] = lineNumbersStyle + classes[chroma.LineNumbers]
 | 
						classes[chroma.LineNumbers] = lineNumbersStyle + classes[chroma.LineNumbers]
 | 
				
			||||||
	classes[chroma.LineNumbersTable] = lineNumbersStyle + classes[chroma.LineNumbersTable]
 | 
						classes[chroma.LineNumbersTable] = lineNumbersStyle + classes[chroma.LineNumbersTable]
 | 
				
			||||||
	classes[chroma.LineHighlight] = "display: block; width: 100%;" + classes[chroma.LineHighlight]
 | 
						classes[chroma.LineTable] = "border-spacing: 0; padding: 0; margin: 0; border: 0;" + classes[chroma.LineTable]
 | 
				
			||||||
	classes[chroma.LineTable] = "border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block;" + classes[chroma.LineTable]
 | 
					 | 
				
			||||||
	classes[chroma.LineTableTD] = "vertical-align: top; padding: 0; margin: 0; border: 0;" + classes[chroma.LineTableTD]
 | 
						classes[chroma.LineTableTD] = "vertical-align: top; padding: 0; margin: 0; border: 0;" + classes[chroma.LineTableTD]
 | 
				
			||||||
	return classes
 | 
						return classes
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,9 +0,0 @@
 | 
				
			||||||
module github.com/alecthomas/chroma
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
go 1.13
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
require (
 | 
					 | 
				
			||||||
	github.com/davecgh/go-spew v1.1.1 // indirect
 | 
					 | 
				
			||||||
	github.com/dlclark/regexp2 v1.4.0
 | 
					 | 
				
			||||||
	github.com/stretchr/testify v1.7.0
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,7 @@ var BashSession = internal.Register(MustNewLazyLexer(
 | 
				
			||||||
func bashsessionRules() Rules {
 | 
					func bashsessionRules() Rules {
 | 
				
			||||||
	return Rules{
 | 
						return Rules{
 | 
				
			||||||
		"root": {
 | 
							"root": {
 | 
				
			||||||
			{`(^[#$%>]\s*)(.*\n?)`, ByGroups(GenericPrompt, Using(Bash)), nil},
 | 
								{`^((?:\[[^]]+@[^]]+\]\s?)?[#$%>])(\s*)(.*\n?)`, ByGroups(GenericPrompt, Text, Using(Bash)), nil},
 | 
				
			||||||
			{`^.+\n?`, GenericOutput, nil},
 | 
								{`^.+\n?`, GenericOutput, nil},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,112 @@
 | 
				
			||||||
 | 
					package b
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						. "github.com/alecthomas/chroma" // nolint
 | 
				
			||||||
 | 
						"github.com/alecthomas/chroma/lexers/internal"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Bicep lexer.
 | 
				
			||||||
 | 
					var Bicep = internal.Register(MustNewLazyLexer(
 | 
				
			||||||
 | 
						&Config{
 | 
				
			||||||
 | 
							Name:      "Bicep",
 | 
				
			||||||
 | 
							Aliases:   []string{"bicep"},
 | 
				
			||||||
 | 
							Filenames: []string{"*.bicep"},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						bicepRules,
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func bicepRules() Rules {
 | 
				
			||||||
 | 
						bicepFunctions := []string{
 | 
				
			||||||
 | 
							"any",
 | 
				
			||||||
 | 
							"array",
 | 
				
			||||||
 | 
							"concat",
 | 
				
			||||||
 | 
							"contains",
 | 
				
			||||||
 | 
							"empty",
 | 
				
			||||||
 | 
							"first",
 | 
				
			||||||
 | 
							"intersection",
 | 
				
			||||||
 | 
							"items",
 | 
				
			||||||
 | 
							"last",
 | 
				
			||||||
 | 
							"length",
 | 
				
			||||||
 | 
							"min",
 | 
				
			||||||
 | 
							"max",
 | 
				
			||||||
 | 
							"range",
 | 
				
			||||||
 | 
							"skip",
 | 
				
			||||||
 | 
							"take",
 | 
				
			||||||
 | 
							"union",
 | 
				
			||||||
 | 
							"dateTimeAdd",
 | 
				
			||||||
 | 
							"utcNow",
 | 
				
			||||||
 | 
							"deployment",
 | 
				
			||||||
 | 
							"environment",
 | 
				
			||||||
 | 
							"loadFileAsBase64",
 | 
				
			||||||
 | 
							"loadTextContent",
 | 
				
			||||||
 | 
							"int",
 | 
				
			||||||
 | 
							"json",
 | 
				
			||||||
 | 
							"extensionResourceId",
 | 
				
			||||||
 | 
							"getSecret",
 | 
				
			||||||
 | 
							"list",
 | 
				
			||||||
 | 
							"listKeys",
 | 
				
			||||||
 | 
							"listKeyValue",
 | 
				
			||||||
 | 
							"listAccountSas",
 | 
				
			||||||
 | 
							"listSecrets",
 | 
				
			||||||
 | 
							"pickZones",
 | 
				
			||||||
 | 
							"reference",
 | 
				
			||||||
 | 
							"resourceId",
 | 
				
			||||||
 | 
							"subscriptionResourceId",
 | 
				
			||||||
 | 
							"tenantResourceId",
 | 
				
			||||||
 | 
							"managementGroup",
 | 
				
			||||||
 | 
							"resourceGroup",
 | 
				
			||||||
 | 
							"subscription",
 | 
				
			||||||
 | 
							"tenant",
 | 
				
			||||||
 | 
							"base64",
 | 
				
			||||||
 | 
							"base64ToJson",
 | 
				
			||||||
 | 
							"base64ToString",
 | 
				
			||||||
 | 
							"dataUri",
 | 
				
			||||||
 | 
							"dataUriToString",
 | 
				
			||||||
 | 
							"endsWith",
 | 
				
			||||||
 | 
							"format",
 | 
				
			||||||
 | 
							"guid",
 | 
				
			||||||
 | 
							"indexOf",
 | 
				
			||||||
 | 
							"lastIndexOf",
 | 
				
			||||||
 | 
							"length",
 | 
				
			||||||
 | 
							"newGuid",
 | 
				
			||||||
 | 
							"padLeft",
 | 
				
			||||||
 | 
							"replace",
 | 
				
			||||||
 | 
							"split",
 | 
				
			||||||
 | 
							"startsWith",
 | 
				
			||||||
 | 
							"string",
 | 
				
			||||||
 | 
							"substring",
 | 
				
			||||||
 | 
							"toLower",
 | 
				
			||||||
 | 
							"toUpper",
 | 
				
			||||||
 | 
							"trim",
 | 
				
			||||||
 | 
							"uniqueString",
 | 
				
			||||||
 | 
							"uri",
 | 
				
			||||||
 | 
							"uriComponent",
 | 
				
			||||||
 | 
							"uriComponentToString",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return Rules{
 | 
				
			||||||
 | 
							"root": {
 | 
				
			||||||
 | 
								{`//[^\n\r]+`, CommentSingle, nil},
 | 
				
			||||||
 | 
								{`/\*.*?\*/`, CommentMultiline, nil},
 | 
				
			||||||
 | 
								{`([']?\w+[']?)(:)`, ByGroups(NameProperty, Punctuation), nil},
 | 
				
			||||||
 | 
								{`\b('(resourceGroup|subscription|managementGroup|tenant)')\b`, KeywordNamespace, nil},
 | 
				
			||||||
 | 
								{`'[\w\$\{\(\)\}\.]{1,}?'`, LiteralStringInterpol, nil},
 | 
				
			||||||
 | 
								{`('''|').*?('''|')`, LiteralString, nil},
 | 
				
			||||||
 | 
								{`\b(allowed|batchSize|description|maxLength|maxValue|metadata|minLength|minValue|secure)\b`, NameDecorator, nil},
 | 
				
			||||||
 | 
								{`\b(az|sys)\.`, NameNamespace, nil},
 | 
				
			||||||
 | 
								{`\b(` + strings.Join(bicepFunctions, "|") + `)\b`, NameFunction, nil},
 | 
				
			||||||
 | 
								// https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/bicep-functions-logical
 | 
				
			||||||
 | 
								{`\b(bool)(\()`, ByGroups(NameFunction, Punctuation), nil},
 | 
				
			||||||
 | 
								{`\b(for|if|in)\b`, Keyword, nil},
 | 
				
			||||||
 | 
								{`\b(module|output|param|resource|var)\b`, KeywordDeclaration, nil},
 | 
				
			||||||
 | 
								{`\b(array|bool|int|object|string)\b`, KeywordType, nil},
 | 
				
			||||||
 | 
								// https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/operators
 | 
				
			||||||
 | 
								{`(>=|>|<=|<|==|!=|=~|!~|::|&&|\?\?|!|-|%|\*|\/|\+)`, Operator, nil},
 | 
				
			||||||
 | 
								{`[\(\)\[\]\.:\?{}@=]`, Punctuation, nil},
 | 
				
			||||||
 | 
								{`[\w_-]+`, Text, nil},
 | 
				
			||||||
 | 
								{`\s+`, TextWhitespace, nil},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -24,7 +24,8 @@ func cSharpRules() Rules {
 | 
				
			||||||
			{`^\s*\[.*?\]`, NameAttribute, nil},
 | 
								{`^\s*\[.*?\]`, NameAttribute, nil},
 | 
				
			||||||
			{`[^\S\n]+`, Text, nil},
 | 
								{`[^\S\n]+`, Text, nil},
 | 
				
			||||||
			{`\\\n`, Text, nil},
 | 
								{`\\\n`, Text, nil},
 | 
				
			||||||
			{`//.*?\n`, CommentSingle, nil},
 | 
								{`///[^\n\r]+`, CommentSpecial, nil},
 | 
				
			||||||
 | 
								{`//[^\n\r]+`, CommentSingle, nil},
 | 
				
			||||||
			{`/[*].*?[*]/`, CommentMultiline, nil},
 | 
								{`/[*].*?[*]/`, CommentMultiline, nil},
 | 
				
			||||||
			{`\n`, Text, nil},
 | 
								{`\n`, Text, nil},
 | 
				
			||||||
			{`[~!%^&*()+=|\[\]:;,.<>/?-]`, Punctuation, nil},
 | 
								{`[~!%^&*()+=|\[\]:;,.<>/?-]`, Punctuation, nil},
 | 
				
			||||||
| 
						 | 
					@ -34,12 +35,12 @@ func cSharpRules() Rules {
 | 
				
			||||||
			{`"(\\\\|\\"|[^"\n])*["\n]`, LiteralString, nil},
 | 
								{`"(\\\\|\\"|[^"\n])*["\n]`, LiteralString, nil},
 | 
				
			||||||
			{`'\\.'|'[^\\]'`, LiteralStringChar, nil},
 | 
								{`'\\.'|'[^\\]'`, LiteralStringChar, nil},
 | 
				
			||||||
			{`0[xX][0-9a-fA-F]+[Ll]?|[0-9_](\.[0-9]*)?([eE][+-]?[0-9]+)?[flFLdD]?`, LiteralNumber, nil},
 | 
								{`0[xX][0-9a-fA-F]+[Ll]?|[0-9_](\.[0-9]*)?([eE][+-]?[0-9]+)?[flFLdD]?`, LiteralNumber, nil},
 | 
				
			||||||
			{`#[ \t]*(if|endif|else|elif|define|undef|line|error|warning|region|endregion|pragma)\b.*?\n`, CommentPreproc, nil},
 | 
								{`#[ \t]*(if|endif|else|elif|define|undef|line|error|warning|region|endregion|pragma|nullable)\b[^\n\r]+`, CommentPreproc, nil},
 | 
				
			||||||
			{`\b(extern)(\s+)(alias)\b`, ByGroups(Keyword, Text, Keyword), nil},
 | 
								{`\b(extern)(\s+)(alias)\b`, ByGroups(Keyword, Text, Keyword), nil},
 | 
				
			||||||
			{`(abstract|as|async|await|base|break|by|case|catch|checked|const|continue|default|delegate|do|else|enum|event|explicit|extern|false|finally|fixed|for|foreach|goto|if|implicit|in|interface|internal|is|let|lock|new|null|on|operator|out|override|params|private|protected|public|readonly|ref|return|sealed|sizeof|stackalloc|static|switch|this|throw|true|try|typeof|unchecked|unsafe|virtual|void|while|get|set|new|partial|yield|add|remove|value|alias|ascending|descending|from|group|into|orderby|select|thenby|where|join|equals)\b`, Keyword, nil},
 | 
								{`(abstract|as|async|await|base|break|by|case|catch|checked|const|continue|default|delegate|do|else|enum|event|explicit|extern|false|finally|fixed|for|foreach|goto|if|implicit|in|init|internal|is|let|lock|new|null|on|operator|out|override|params|private|protected|public|readonly|ref|return|sealed|sizeof|stackalloc|static|switch|this|throw|true|try|typeof|unchecked|unsafe|virtual|void|while|get|set|new|partial|yield|add|remove|value|alias|ascending|descending|from|group|into|orderby|select|thenby|where|join|equals)\b`, Keyword, nil},
 | 
				
			||||||
			{`(global)(::)`, ByGroups(Keyword, Punctuation), nil},
 | 
								{`(global)(::)`, ByGroups(Keyword, Punctuation), nil},
 | 
				
			||||||
			{`(bool|byte|char|decimal|double|dynamic|float|int|long|object|sbyte|short|string|uint|ulong|ushort|var)\b\??`, KeywordType, nil},
 | 
								{`(bool|byte|char|decimal|double|dynamic|float|int|long|object|sbyte|short|string|uint|ulong|ushort|var)\b\??`, KeywordType, nil},
 | 
				
			||||||
			{`(class|struct)(\s+)`, ByGroups(Keyword, Text), Push("class")},
 | 
								{`(class|struct|record|interface)(\s+)`, ByGroups(Keyword, Text), Push("class")},
 | 
				
			||||||
			{`(namespace|using)(\s+)`, ByGroups(Keyword, Text), Push("namespace")},
 | 
								{`(namespace|using)(\s+)`, ByGroups(Keyword, Text), Push("namespace")},
 | 
				
			||||||
			{`@?[_a-zA-Z]\w*`, Name, nil},
 | 
								{`@?[_a-zA-Z]\w*`, Name, nil},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@ var Kotlin = internal.Register(MustNewLazyLexer(
 | 
				
			||||||
))
 | 
					))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func kotlinRules() Rules {
 | 
					func kotlinRules() Rules {
 | 
				
			||||||
	const kotlinIdentifier = "(?:[_\\p{L}][\\p{L}\\p{N}]*|`@?[_\\p{L}][\\p{L}\\p{N}]+)"
 | 
						const kotlinIdentifier = "(?:[_\\p{L}][\\p{L}\\p{N}]*|`@?[_\\p{L}][\\p{L}\\p{N}]+`)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return Rules{
 | 
						return Rules{
 | 
				
			||||||
		"root": {
 | 
							"root": {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| 
						 | 
					@ -0,0 +1,76 @@
 | 
				
			||||||
 | 
					package p
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						. "github.com/alecthomas/chroma" // nolint
 | 
				
			||||||
 | 
						"github.com/alecthomas/chroma/lexers/internal"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// nolint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Lexer for the Plutus Core Languages (version 2.1)
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// including both Typed- and Untyped- versions
 | 
				
			||||||
 | 
					// based on “Formal Specification of the Plutus Core Language (version 2.1)”, published 6th April 2021:
 | 
				
			||||||
 | 
					// https://hydra.iohk.io/build/8205579/download/1/plutus-core-specification.pdf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var PlutusCoreLang = internal.Register(MustNewLazyLexer(
 | 
				
			||||||
 | 
						&Config{
 | 
				
			||||||
 | 
							Name:      "Plutus Core",
 | 
				
			||||||
 | 
							Aliases:   []string{"plutus-core", "plc"},
 | 
				
			||||||
 | 
							Filenames: []string{"*.plc"},
 | 
				
			||||||
 | 
							MimeTypes: []string{"text/x-plutus-core", "application/x-plutus-core"},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						plutusCoreRules,
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func plutusCoreRules() Rules {
 | 
				
			||||||
 | 
						return Rules{
 | 
				
			||||||
 | 
							"root": {
 | 
				
			||||||
 | 
								{`\s+`, Text, nil},
 | 
				
			||||||
 | 
								{`(\(|\))`, Punctuation, nil},
 | 
				
			||||||
 | 
								{`(\[|\])`, Punctuation, nil},
 | 
				
			||||||
 | 
								{`({|})`, Punctuation, nil},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Constants. Figure 1.
 | 
				
			||||||
 | 
								// For version, see handling of (program ...) below.
 | 
				
			||||||
 | 
								{`([+-]?\d+)`, LiteralNumberInteger, nil},
 | 
				
			||||||
 | 
								{`(#([a-fA-F0-9][a-fA-F0-9])+)`, LiteralString, nil},
 | 
				
			||||||
 | 
								{`(\(\))`, NameConstant, nil},
 | 
				
			||||||
 | 
								{`(True|False)`, NameConstant, nil},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Keywords. Figures 2 and 15.
 | 
				
			||||||
 | 
								// Special handling for program because it is followed by a version.
 | 
				
			||||||
 | 
								{`(con |abs |iwrap |unwrap |lam |builtin |delay |force |error)`, Keyword, nil},
 | 
				
			||||||
 | 
								{`(fun |all |ifix |lam |con )`, Keyword, nil},
 | 
				
			||||||
 | 
								{`(type|fun )`, Keyword, nil},
 | 
				
			||||||
 | 
								{`(program )(\S+)`, ByGroups(Keyword, LiteralString), nil},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Built-in Types. Figure 12.
 | 
				
			||||||
 | 
								{`(unit|bool|integer|bytestring|string)`, KeywordType, nil},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Built-ins Functions. Figure 14 but, more importantly, implementation:
 | 
				
			||||||
 | 
								// https://github.com/input-output-hk/plutus/blob/6d759c4/plutus-core/plutus-core/src/PlutusCore/Default/Builtins.hs#L42-L111
 | 
				
			||||||
 | 
								{`(addInteger |subtractInteger |multiplyInteger |divideInteger |quotientInteger |remainderInteger |modInteger |equalsInteger |lessThanInteger |lessThanEqualsInteger )`, NameBuiltin, nil},
 | 
				
			||||||
 | 
								{`(appendByteString |consByteString |sliceByteString |lengthOfByteString |indexByteString |equalsByteString |lessThanByteString |lessThanEqualsByteString )`, NameBuiltin, nil},
 | 
				
			||||||
 | 
								{`(sha2_256 |sha3_256 |blake2b_256 |verifySignature )`, NameBuiltin, nil},
 | 
				
			||||||
 | 
								{`(appendString |equalsString |encodeUtf8 |decodeUtf8 )`, NameBuiltin, nil},
 | 
				
			||||||
 | 
								{`(ifThenElse )`, NameBuiltin, nil},
 | 
				
			||||||
 | 
								{`(chooseUnit )`, NameBuiltin, nil},
 | 
				
			||||||
 | 
								{`(trace )`, NameBuiltin, nil},
 | 
				
			||||||
 | 
								{`(fstPair |sndPair )`, NameBuiltin, nil},
 | 
				
			||||||
 | 
								{`(chooseList |mkCons |headList |tailList |nullList )`, NameBuiltin, nil},
 | 
				
			||||||
 | 
								{`(chooseData |constrData |mapData |listData |iData |bData |unConstrData |unMapData |unListData |unIData |unBData |equalsData )`, NameBuiltin, nil},
 | 
				
			||||||
 | 
								{`(mkPairData |mkNilData |mkNilPairData )`, NameBuiltin, nil},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Name. Figure 1.
 | 
				
			||||||
 | 
								{`([a-zA-Z][a-zA-Z0-9_']*)`, Name, nil},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Unicode String. Not in the specification.
 | 
				
			||||||
 | 
								{`"`, LiteralStringDouble, Push("string")},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							"string": {
 | 
				
			||||||
 | 
								{`[^\\"]+`, LiteralStringDouble, nil},
 | 
				
			||||||
 | 
								{`"`, LiteralStringDouble, Pop(1)},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -30,7 +30,7 @@ func schemeLangRules() Rules {
 | 
				
			||||||
			{`-?\d+`, LiteralNumberInteger, nil},
 | 
								{`-?\d+`, LiteralNumberInteger, nil},
 | 
				
			||||||
			{`"(\\\\|\\"|[^"])*"`, LiteralString, nil},
 | 
								{`"(\\\\|\\"|[^"])*"`, LiteralString, nil},
 | 
				
			||||||
			{`'[\w!$%&*+,/:<=>?@^~|-]+`, LiteralStringSymbol, nil},
 | 
								{`'[\w!$%&*+,/:<=>?@^~|-]+`, LiteralStringSymbol, nil},
 | 
				
			||||||
			{`#\\([()/'\"._!§$%& ?=+-]|[a-zA-Z0-9]+)`, LiteralStringChar, nil},
 | 
								{`#\\(alarm|backspace|delete|esc|linefeed|newline|page|return|space|tab|vtab|x[0-9a-zA-Z]{1,5}|.)`, LiteralStringChar, nil},
 | 
				
			||||||
			{`(#t|#f)`, NameConstant, nil},
 | 
								{`(#t|#f)`, NameConstant, nil},
 | 
				
			||||||
			{"('|#|`|,@|,|\\.)", Operator, nil},
 | 
								{"('|#|`|,@|,|\\.)", Operator, nil},
 | 
				
			||||||
			{`(lambda |define |if |else |cond |and |or |case |let |let\* |letrec |begin |do |delay |set\! |\=\> |quote |quasiquote |unquote |unquote\-splicing |define\-syntax |let\-syntax |letrec\-syntax |syntax\-rules )`, Keyword, nil},
 | 
								{`(lambda |define |if |else |cond |and |or |case |let |let\* |letrec |begin |do |delay |set\! |\=\> |quote |quasiquote |unquote |unquote\-splicing |define\-syntax |let\-syntax |letrec\-syntax |syntax\-rules )`, Keyword, nil},
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,7 +10,7 @@ var XML = internal.Register(MustNewLazyLexer(
 | 
				
			||||||
	&Config{
 | 
						&Config{
 | 
				
			||||||
		Name:      "XML",
 | 
							Name:      "XML",
 | 
				
			||||||
		Aliases:   []string{"xml"},
 | 
							Aliases:   []string{"xml"},
 | 
				
			||||||
		Filenames: []string{"*.xml", "*.xsl", "*.rss", "*.xslt", "*.xsd", "*.wsdl", "*.wsf", "*.svg"},
 | 
							Filenames: []string{"*.xml", "*.xsl", "*.rss", "*.xslt", "*.xsd", "*.wsdl", "*.wsf", "*.svg", "*.csproj", "*.vcxproj", "*.fsproj"},
 | 
				
			||||||
		MimeTypes: []string{"text/xml", "application/xml", "image/svg+xml", "application/rss+xml", "application/atom+xml"},
 | 
							MimeTypes: []string{"text/xml", "application/xml", "image/svg+xml", "application/rss+xml", "application/atom+xml"},
 | 
				
			||||||
		DotAll:    true,
 | 
							DotAll:    true,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,53 @@
 | 
				
			||||||
 | 
					package z
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						. "github.com/alecthomas/chroma" // nolint
 | 
				
			||||||
 | 
						"github.com/alecthomas/chroma/lexers/internal"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Zed lexer.
 | 
				
			||||||
 | 
					var Zed = internal.Register(MustNewLazyLexer(
 | 
				
			||||||
 | 
						&Config{
 | 
				
			||||||
 | 
							Name:      "Zed",
 | 
				
			||||||
 | 
							Aliases:   []string{"zed"},
 | 
				
			||||||
 | 
							Filenames: []string{"*.zed"},
 | 
				
			||||||
 | 
							MimeTypes: []string{"text/zed"},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						zedRules,
 | 
				
			||||||
 | 
					).SetAnalyser(func(text string) float32 {
 | 
				
			||||||
 | 
						if strings.Contains(text, "definition ") && strings.Contains(text, "relation ") && strings.Contains(text, "permission ") {
 | 
				
			||||||
 | 
							return 0.9
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if strings.Contains(text, "definition ") {
 | 
				
			||||||
 | 
							return 0.5
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if strings.Contains(text, "relation ") {
 | 
				
			||||||
 | 
							return 0.5
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if strings.Contains(text, "permission ") {
 | 
				
			||||||
 | 
							return 0.25
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return 0.0
 | 
				
			||||||
 | 
					}))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func zedRules() Rules {
 | 
				
			||||||
 | 
						return Rules{
 | 
				
			||||||
 | 
							"root": {
 | 
				
			||||||
 | 
								{`\n`, TextWhitespace, nil},
 | 
				
			||||||
 | 
								{`\s+`, TextWhitespace, nil},
 | 
				
			||||||
 | 
								{`//.*?\n`, CommentSingle, nil},
 | 
				
			||||||
 | 
								{`/(\\\n)?[*][\w\W]*?[*](\\\n)?/`, CommentMultiline, nil},
 | 
				
			||||||
 | 
								{`/(\\\n)?[*][\w\W]*`, CommentMultiline, nil},
 | 
				
			||||||
 | 
								{Words(``, `\b`, `definition`), KeywordType, nil},
 | 
				
			||||||
 | 
								{Words(``, `\b`, `relation`), KeywordNamespace, nil},
 | 
				
			||||||
 | 
								{Words(``, `\b`, `permission`), KeywordDeclaration, nil},
 | 
				
			||||||
 | 
								{`[a-zA-Z_]\w*/`, NameNamespace, nil},
 | 
				
			||||||
 | 
								{`[a-zA-Z_]\w*`, Name, nil},
 | 
				
			||||||
 | 
								{`#[a-zA-Z_]\w*`, NameVariable, nil},
 | 
				
			||||||
 | 
								{`[+%=><|^!?/\-*&~:]`, Operator, nil},
 | 
				
			||||||
 | 
								{`[{}()\[\],.;]`, Punctuation, nil},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,52 @@
 | 
				
			||||||
 | 
					// Copyright 2018 Alethea Katherine Flowers
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					// you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					// You may obtain a copy of the License at
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					// distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					// See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					// limitations under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package styles
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/alecthomas/chroma"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WitchHazel Style
 | 
				
			||||||
 | 
					var WitchHazel = Register(chroma.MustNewStyle("witchhazel", chroma.StyleEntries{
 | 
				
			||||||
 | 
						chroma.Text:              "#F8F8F2",
 | 
				
			||||||
 | 
						chroma.Whitespace:        "#A8757B",
 | 
				
			||||||
 | 
						chroma.Error:             "#960050 bg:#1e0010",
 | 
				
			||||||
 | 
						chroma.Comment:           "#b0bec5",
 | 
				
			||||||
 | 
						chroma.Keyword:           "#C2FFDF",
 | 
				
			||||||
 | 
						chroma.KeywordNamespace:  "#FFB8D1",
 | 
				
			||||||
 | 
						chroma.Operator:          "#FFB8D1",
 | 
				
			||||||
 | 
						chroma.Punctuation:       "#F8F8F2",
 | 
				
			||||||
 | 
						chroma.Name:              "#F8F8F2",
 | 
				
			||||||
 | 
						chroma.NameAttribute:     "#ceb1ff",
 | 
				
			||||||
 | 
						chroma.NameBuiltinPseudo: "#80cbc4",
 | 
				
			||||||
 | 
						chroma.NameClass:         "#ceb1ff",
 | 
				
			||||||
 | 
						chroma.NameConstant:      "#C5A3FF",
 | 
				
			||||||
 | 
						chroma.NameDecorator:     "#ceb1ff",
 | 
				
			||||||
 | 
						chroma.NameException:     "#ceb1ff",
 | 
				
			||||||
 | 
						chroma.NameFunction:      "#ceb1ff",
 | 
				
			||||||
 | 
						chroma.NameProperty:      "#F8F8F2",
 | 
				
			||||||
 | 
						chroma.NameTag:           "#FFB8D1",
 | 
				
			||||||
 | 
						chroma.NameVariable:      "#F8F8F2",
 | 
				
			||||||
 | 
						chroma.Number:            "#C5A3FF",
 | 
				
			||||||
 | 
						chroma.Literal:           "#ae81ff",
 | 
				
			||||||
 | 
						chroma.LiteralDate:       "#e6db74",
 | 
				
			||||||
 | 
						chroma.String:            "#1bc5e0",
 | 
				
			||||||
 | 
						chroma.GenericDeleted:    "#f92672",
 | 
				
			||||||
 | 
						chroma.GenericEmph:       "italic",
 | 
				
			||||||
 | 
						chroma.GenericInserted:   "#a6e22e",
 | 
				
			||||||
 | 
						chroma.GenericStrong:     "bold",
 | 
				
			||||||
 | 
						chroma.GenericSubheading: "#75715e",
 | 
				
			||||||
 | 
						chroma.Background:        " bg:#433e56",
 | 
				
			||||||
 | 
					}))
 | 
				
			||||||
| 
						 | 
					@ -21,7 +21,7 @@ var (
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Xcode dark style
 | 
					// Xcode dark style
 | 
				
			||||||
var XcodeDark = Register(chroma.MustNewStyle("xcode-dark", chroma.StyleEntries{
 | 
					var XcodeDark = Register(chroma.MustNewStyle("xcode-dark", chroma.StyleEntries{
 | 
				
			||||||
	chroma.Background: plainText + " bg: " + background,
 | 
						chroma.Background: plainText + " bg:" + background,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	chroma.Comment:          comments,
 | 
						chroma.Comment:          comments,
 | 
				
			||||||
	chroma.CommentMultiline: comments,
 | 
						chroma.CommentMultiline: comments,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,14 +9,17 @@ func _() {
 | 
				
			||||||
	// Re-run the stringer command to generate them again.
 | 
						// Re-run the stringer command to generate them again.
 | 
				
			||||||
	var x [1]struct{}
 | 
						var x [1]struct{}
 | 
				
			||||||
	_ = x[Background - -1]
 | 
						_ = x[Background - -1]
 | 
				
			||||||
	_ = x[LineNumbers - -2]
 | 
						_ = x[PreWrapper - -2]
 | 
				
			||||||
	_ = x[LineNumbersTable - -3]
 | 
						_ = x[Line - -3]
 | 
				
			||||||
	_ = x[LineHighlight - -4]
 | 
						_ = x[LineNumbers - -4]
 | 
				
			||||||
	_ = x[LineTable - -5]
 | 
						_ = x[LineNumbersTable - -5]
 | 
				
			||||||
	_ = x[LineTableTD - -6]
 | 
						_ = x[LineHighlight - -6]
 | 
				
			||||||
	_ = x[Error - -7]
 | 
						_ = x[LineTable - -7]
 | 
				
			||||||
	_ = x[Other - -8]
 | 
						_ = x[LineTableTD - -8]
 | 
				
			||||||
	_ = x[None - -9]
 | 
						_ = x[CodeLine - -9]
 | 
				
			||||||
 | 
						_ = x[Error - -10]
 | 
				
			||||||
 | 
						_ = x[Other - -11]
 | 
				
			||||||
 | 
						_ = x[None - -12]
 | 
				
			||||||
	_ = x[EOFType-0]
 | 
						_ = x[EOFType-0]
 | 
				
			||||||
	_ = x[Keyword-1000]
 | 
						_ = x[Keyword-1000]
 | 
				
			||||||
	_ = x[KeywordConstant-1001]
 | 
						_ = x[KeywordConstant-1001]
 | 
				
			||||||
| 
						 | 
					@ -105,104 +108,107 @@ func _() {
 | 
				
			||||||
	_ = x[TextPunctuation-8003]
 | 
						_ = x[TextPunctuation-8003]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const _TokenType_name = "NoneOtherErrorLineTableTDLineTableLineHighlightLineNumbersTableLineNumbersBackgroundEOFTypeKeywordKeywordConstantKeywordDeclarationKeywordNamespaceKeywordPseudoKeywordReservedKeywordTypeNameNameAttributeNameBuiltinNameBuiltinPseudoNameClassNameConstantNameDecoratorNameEntityNameExceptionNameFunctionNameFunctionMagicNameKeywordNameLabelNameNamespaceNameOperatorNameOtherNamePseudoNamePropertyNameTagNameVariableNameVariableAnonymousNameVariableClassNameVariableGlobalNameVariableInstanceNameVariableMagicLiteralLiteralDateLiteralOtherLiteralStringLiteralStringAffixLiteralStringAtomLiteralStringBacktickLiteralStringBooleanLiteralStringCharLiteralStringDelimiterLiteralStringDocLiteralStringDoubleLiteralStringEscapeLiteralStringHeredocLiteralStringInterpolLiteralStringNameLiteralStringOtherLiteralStringRegexLiteralStringSingleLiteralStringSymbolLiteralNumberLiteralNumberBinLiteralNumberFloatLiteralNumberHexLiteralNumberIntegerLiteralNumberIntegerLongLiteralNumberOctOperatorOperatorWordPunctuationCommentCommentHashbangCommentMultilineCommentSingleCommentSpecialCommentPreprocCommentPreprocFileGenericGenericDeletedGenericEmphGenericErrorGenericHeadingGenericInsertedGenericOutputGenericPromptGenericStrongGenericSubheadingGenericTracebackGenericUnderlineTextTextWhitespaceTextSymbolTextPunctuation"
 | 
					const _TokenType_name = "NoneOtherErrorCodeLineLineTableTDLineTableLineHighlightLineNumbersTableLineNumbersLinePreWrapperBackgroundEOFTypeKeywordKeywordConstantKeywordDeclarationKeywordNamespaceKeywordPseudoKeywordReservedKeywordTypeNameNameAttributeNameBuiltinNameBuiltinPseudoNameClassNameConstantNameDecoratorNameEntityNameExceptionNameFunctionNameFunctionMagicNameKeywordNameLabelNameNamespaceNameOperatorNameOtherNamePseudoNamePropertyNameTagNameVariableNameVariableAnonymousNameVariableClassNameVariableGlobalNameVariableInstanceNameVariableMagicLiteralLiteralDateLiteralOtherLiteralStringLiteralStringAffixLiteralStringAtomLiteralStringBacktickLiteralStringBooleanLiteralStringCharLiteralStringDelimiterLiteralStringDocLiteralStringDoubleLiteralStringEscapeLiteralStringHeredocLiteralStringInterpolLiteralStringNameLiteralStringOtherLiteralStringRegexLiteralStringSingleLiteralStringSymbolLiteralNumberLiteralNumberBinLiteralNumberFloatLiteralNumberHexLiteralNumberIntegerLiteralNumberIntegerLongLiteralNumberOctOperatorOperatorWordPunctuationCommentCommentHashbangCommentMultilineCommentSingleCommentSpecialCommentPreprocCommentPreprocFileGenericGenericDeletedGenericEmphGenericErrorGenericHeadingGenericInsertedGenericOutputGenericPromptGenericStrongGenericSubheadingGenericTracebackGenericUnderlineTextTextWhitespaceTextSymbolTextPunctuation"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _TokenType_map = map[TokenType]string{
 | 
					var _TokenType_map = map[TokenType]string{
 | 
				
			||||||
	-9:   _TokenType_name[0:4],
 | 
						-12:  _TokenType_name[0:4],
 | 
				
			||||||
	-8:   _TokenType_name[4:9],
 | 
						-11:  _TokenType_name[4:9],
 | 
				
			||||||
	-7:   _TokenType_name[9:14],
 | 
						-10:  _TokenType_name[9:14],
 | 
				
			||||||
	-6:   _TokenType_name[14:25],
 | 
						-9:   _TokenType_name[14:22],
 | 
				
			||||||
	-5:   _TokenType_name[25:34],
 | 
						-8:   _TokenType_name[22:33],
 | 
				
			||||||
	-4:   _TokenType_name[34:47],
 | 
						-7:   _TokenType_name[33:42],
 | 
				
			||||||
	-3:   _TokenType_name[47:63],
 | 
						-6:   _TokenType_name[42:55],
 | 
				
			||||||
	-2:   _TokenType_name[63:74],
 | 
						-5:   _TokenType_name[55:71],
 | 
				
			||||||
	-1:   _TokenType_name[74:84],
 | 
						-4:   _TokenType_name[71:82],
 | 
				
			||||||
	0:    _TokenType_name[84:91],
 | 
						-3:   _TokenType_name[82:86],
 | 
				
			||||||
	1000: _TokenType_name[91:98],
 | 
						-2:   _TokenType_name[86:96],
 | 
				
			||||||
	1001: _TokenType_name[98:113],
 | 
						-1:   _TokenType_name[96:106],
 | 
				
			||||||
	1002: _TokenType_name[113:131],
 | 
						0:    _TokenType_name[106:113],
 | 
				
			||||||
	1003: _TokenType_name[131:147],
 | 
						1000: _TokenType_name[113:120],
 | 
				
			||||||
	1004: _TokenType_name[147:160],
 | 
						1001: _TokenType_name[120:135],
 | 
				
			||||||
	1005: _TokenType_name[160:175],
 | 
						1002: _TokenType_name[135:153],
 | 
				
			||||||
	1006: _TokenType_name[175:186],
 | 
						1003: _TokenType_name[153:169],
 | 
				
			||||||
	2000: _TokenType_name[186:190],
 | 
						1004: _TokenType_name[169:182],
 | 
				
			||||||
	2001: _TokenType_name[190:203],
 | 
						1005: _TokenType_name[182:197],
 | 
				
			||||||
	2002: _TokenType_name[203:214],
 | 
						1006: _TokenType_name[197:208],
 | 
				
			||||||
	2003: _TokenType_name[214:231],
 | 
						2000: _TokenType_name[208:212],
 | 
				
			||||||
	2004: _TokenType_name[231:240],
 | 
						2001: _TokenType_name[212:225],
 | 
				
			||||||
	2005: _TokenType_name[240:252],
 | 
						2002: _TokenType_name[225:236],
 | 
				
			||||||
	2006: _TokenType_name[252:265],
 | 
						2003: _TokenType_name[236:253],
 | 
				
			||||||
	2007: _TokenType_name[265:275],
 | 
						2004: _TokenType_name[253:262],
 | 
				
			||||||
	2008: _TokenType_name[275:288],
 | 
						2005: _TokenType_name[262:274],
 | 
				
			||||||
	2009: _TokenType_name[288:300],
 | 
						2006: _TokenType_name[274:287],
 | 
				
			||||||
	2010: _TokenType_name[300:317],
 | 
						2007: _TokenType_name[287:297],
 | 
				
			||||||
	2011: _TokenType_name[317:328],
 | 
						2008: _TokenType_name[297:310],
 | 
				
			||||||
	2012: _TokenType_name[328:337],
 | 
						2009: _TokenType_name[310:322],
 | 
				
			||||||
	2013: _TokenType_name[337:350],
 | 
						2010: _TokenType_name[322:339],
 | 
				
			||||||
	2014: _TokenType_name[350:362],
 | 
						2011: _TokenType_name[339:350],
 | 
				
			||||||
	2015: _TokenType_name[362:371],
 | 
						2012: _TokenType_name[350:359],
 | 
				
			||||||
	2016: _TokenType_name[371:381],
 | 
						2013: _TokenType_name[359:372],
 | 
				
			||||||
	2017: _TokenType_name[381:393],
 | 
						2014: _TokenType_name[372:384],
 | 
				
			||||||
	2018: _TokenType_name[393:400],
 | 
						2015: _TokenType_name[384:393],
 | 
				
			||||||
	2019: _TokenType_name[400:412],
 | 
						2016: _TokenType_name[393:403],
 | 
				
			||||||
	2020: _TokenType_name[412:433],
 | 
						2017: _TokenType_name[403:415],
 | 
				
			||||||
	2021: _TokenType_name[433:450],
 | 
						2018: _TokenType_name[415:422],
 | 
				
			||||||
	2022: _TokenType_name[450:468],
 | 
						2019: _TokenType_name[422:434],
 | 
				
			||||||
	2023: _TokenType_name[468:488],
 | 
						2020: _TokenType_name[434:455],
 | 
				
			||||||
	2024: _TokenType_name[488:505],
 | 
						2021: _TokenType_name[455:472],
 | 
				
			||||||
	3000: _TokenType_name[505:512],
 | 
						2022: _TokenType_name[472:490],
 | 
				
			||||||
	3001: _TokenType_name[512:523],
 | 
						2023: _TokenType_name[490:510],
 | 
				
			||||||
	3002: _TokenType_name[523:535],
 | 
						2024: _TokenType_name[510:527],
 | 
				
			||||||
	3100: _TokenType_name[535:548],
 | 
						3000: _TokenType_name[527:534],
 | 
				
			||||||
	3101: _TokenType_name[548:566],
 | 
						3001: _TokenType_name[534:545],
 | 
				
			||||||
	3102: _TokenType_name[566:583],
 | 
						3002: _TokenType_name[545:557],
 | 
				
			||||||
	3103: _TokenType_name[583:604],
 | 
						3100: _TokenType_name[557:570],
 | 
				
			||||||
	3104: _TokenType_name[604:624],
 | 
						3101: _TokenType_name[570:588],
 | 
				
			||||||
	3105: _TokenType_name[624:641],
 | 
						3102: _TokenType_name[588:605],
 | 
				
			||||||
	3106: _TokenType_name[641:663],
 | 
						3103: _TokenType_name[605:626],
 | 
				
			||||||
	3107: _TokenType_name[663:679],
 | 
						3104: _TokenType_name[626:646],
 | 
				
			||||||
	3108: _TokenType_name[679:698],
 | 
						3105: _TokenType_name[646:663],
 | 
				
			||||||
	3109: _TokenType_name[698:717],
 | 
						3106: _TokenType_name[663:685],
 | 
				
			||||||
	3110: _TokenType_name[717:737],
 | 
						3107: _TokenType_name[685:701],
 | 
				
			||||||
	3111: _TokenType_name[737:758],
 | 
						3108: _TokenType_name[701:720],
 | 
				
			||||||
	3112: _TokenType_name[758:775],
 | 
						3109: _TokenType_name[720:739],
 | 
				
			||||||
	3113: _TokenType_name[775:793],
 | 
						3110: _TokenType_name[739:759],
 | 
				
			||||||
	3114: _TokenType_name[793:811],
 | 
						3111: _TokenType_name[759:780],
 | 
				
			||||||
	3115: _TokenType_name[811:830],
 | 
						3112: _TokenType_name[780:797],
 | 
				
			||||||
	3116: _TokenType_name[830:849],
 | 
						3113: _TokenType_name[797:815],
 | 
				
			||||||
	3200: _TokenType_name[849:862],
 | 
						3114: _TokenType_name[815:833],
 | 
				
			||||||
	3201: _TokenType_name[862:878],
 | 
						3115: _TokenType_name[833:852],
 | 
				
			||||||
	3202: _TokenType_name[878:896],
 | 
						3116: _TokenType_name[852:871],
 | 
				
			||||||
	3203: _TokenType_name[896:912],
 | 
						3200: _TokenType_name[871:884],
 | 
				
			||||||
	3204: _TokenType_name[912:932],
 | 
						3201: _TokenType_name[884:900],
 | 
				
			||||||
	3205: _TokenType_name[932:956],
 | 
						3202: _TokenType_name[900:918],
 | 
				
			||||||
	3206: _TokenType_name[956:972],
 | 
						3203: _TokenType_name[918:934],
 | 
				
			||||||
	4000: _TokenType_name[972:980],
 | 
						3204: _TokenType_name[934:954],
 | 
				
			||||||
	4001: _TokenType_name[980:992],
 | 
						3205: _TokenType_name[954:978],
 | 
				
			||||||
	5000: _TokenType_name[992:1003],
 | 
						3206: _TokenType_name[978:994],
 | 
				
			||||||
	6000: _TokenType_name[1003:1010],
 | 
						4000: _TokenType_name[994:1002],
 | 
				
			||||||
	6001: _TokenType_name[1010:1025],
 | 
						4001: _TokenType_name[1002:1014],
 | 
				
			||||||
	6002: _TokenType_name[1025:1041],
 | 
						5000: _TokenType_name[1014:1025],
 | 
				
			||||||
	6003: _TokenType_name[1041:1054],
 | 
						6000: _TokenType_name[1025:1032],
 | 
				
			||||||
	6004: _TokenType_name[1054:1068],
 | 
						6001: _TokenType_name[1032:1047],
 | 
				
			||||||
	6100: _TokenType_name[1068:1082],
 | 
						6002: _TokenType_name[1047:1063],
 | 
				
			||||||
	6101: _TokenType_name[1082:1100],
 | 
						6003: _TokenType_name[1063:1076],
 | 
				
			||||||
	7000: _TokenType_name[1100:1107],
 | 
						6004: _TokenType_name[1076:1090],
 | 
				
			||||||
	7001: _TokenType_name[1107:1121],
 | 
						6100: _TokenType_name[1090:1104],
 | 
				
			||||||
	7002: _TokenType_name[1121:1132],
 | 
						6101: _TokenType_name[1104:1122],
 | 
				
			||||||
	7003: _TokenType_name[1132:1144],
 | 
						7000: _TokenType_name[1122:1129],
 | 
				
			||||||
	7004: _TokenType_name[1144:1158],
 | 
						7001: _TokenType_name[1129:1143],
 | 
				
			||||||
	7005: _TokenType_name[1158:1173],
 | 
						7002: _TokenType_name[1143:1154],
 | 
				
			||||||
	7006: _TokenType_name[1173:1186],
 | 
						7003: _TokenType_name[1154:1166],
 | 
				
			||||||
	7007: _TokenType_name[1186:1199],
 | 
						7004: _TokenType_name[1166:1180],
 | 
				
			||||||
	7008: _TokenType_name[1199:1212],
 | 
						7005: _TokenType_name[1180:1195],
 | 
				
			||||||
	7009: _TokenType_name[1212:1229],
 | 
						7006: _TokenType_name[1195:1208],
 | 
				
			||||||
	7010: _TokenType_name[1229:1245],
 | 
						7007: _TokenType_name[1208:1221],
 | 
				
			||||||
	7011: _TokenType_name[1245:1261],
 | 
						7008: _TokenType_name[1221:1234],
 | 
				
			||||||
	8000: _TokenType_name[1261:1265],
 | 
						7009: _TokenType_name[1234:1251],
 | 
				
			||||||
	8001: _TokenType_name[1265:1279],
 | 
						7010: _TokenType_name[1251:1267],
 | 
				
			||||||
	8002: _TokenType_name[1279:1289],
 | 
						7011: _TokenType_name[1267:1283],
 | 
				
			||||||
	8003: _TokenType_name[1289:1304],
 | 
						8000: _TokenType_name[1283:1287],
 | 
				
			||||||
 | 
						8001: _TokenType_name[1287:1301],
 | 
				
			||||||
 | 
						8002: _TokenType_name[1301:1311],
 | 
				
			||||||
 | 
						8003: _TokenType_name[1311:1326],
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (i TokenType) String() string {
 | 
					func (i TokenType) String() string {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,6 +38,10 @@ func (t *TokenType) UnmarshalJSON(data []byte) error {
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	// Default background style.
 | 
						// Default background style.
 | 
				
			||||||
	Background TokenType = -1 - iota
 | 
						Background TokenType = -1 - iota
 | 
				
			||||||
 | 
						// PreWrapper style.
 | 
				
			||||||
 | 
						PreWrapper
 | 
				
			||||||
 | 
						// Line style.
 | 
				
			||||||
 | 
						Line
 | 
				
			||||||
	// Line numbers in output.
 | 
						// Line numbers in output.
 | 
				
			||||||
	LineNumbers
 | 
						LineNumbers
 | 
				
			||||||
	// Line numbers in output when in table.
 | 
						// Line numbers in output when in table.
 | 
				
			||||||
| 
						 | 
					@ -48,6 +52,8 @@ const (
 | 
				
			||||||
	LineTable
 | 
						LineTable
 | 
				
			||||||
	// Line numbers table TD wrapper style.
 | 
						// Line numbers table TD wrapper style.
 | 
				
			||||||
	LineTableTD
 | 
						LineTableTD
 | 
				
			||||||
 | 
						// Code line wrapper style.
 | 
				
			||||||
 | 
						CodeLine
 | 
				
			||||||
	// Input that could not be tokenised.
 | 
						// Input that could not be tokenised.
 | 
				
			||||||
	Error
 | 
						Error
 | 
				
			||||||
	// Other is used by the Delegate lexer to indicate which tokens should be handled by the delegate.
 | 
						// Other is used by the Delegate lexer to indicate which tokens should be handled by the delegate.
 | 
				
			||||||
| 
						 | 
					@ -219,12 +225,15 @@ const (
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	StandardTypes = map[TokenType]string{
 | 
						StandardTypes = map[TokenType]string{
 | 
				
			||||||
		Background:       "chroma",
 | 
							Background:       "bg",
 | 
				
			||||||
 | 
							PreWrapper:       "chroma",
 | 
				
			||||||
 | 
							Line:             "line",
 | 
				
			||||||
		LineNumbers:      "ln",
 | 
							LineNumbers:      "ln",
 | 
				
			||||||
		LineNumbersTable: "lnt",
 | 
							LineNumbersTable: "lnt",
 | 
				
			||||||
		LineHighlight:    "hl",
 | 
							LineHighlight:    "hl",
 | 
				
			||||||
		LineTable:        "lntable",
 | 
							LineTable:        "lntable",
 | 
				
			||||||
		LineTableTD:      "lntd",
 | 
							LineTableTD:      "lntd",
 | 
				
			||||||
 | 
							CodeLine:         "cl",
 | 
				
			||||||
		Text:             "",
 | 
							Text:             "",
 | 
				
			||||||
		Whitespace:       "w",
 | 
							Whitespace:       "w",
 | 
				
			||||||
		Error:            "err",
 | 
							Error:            "err",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,7 @@
 | 
				
			||||||
language: go
 | 
					language: go
 | 
				
			||||||
 | 
					arch:
 | 
				
			||||||
 | 
					  - AMD64
 | 
				
			||||||
 | 
					  - ppc64le
 | 
				
			||||||
go:
 | 
					go:
 | 
				
			||||||
  - 1.9
 | 
					  - 1.9
 | 
				
			||||||
  - tip
 | 
					  - tip
 | 
				
			||||||
| 
						 | 
					@ -39,6 +39,24 @@ Group 0 is embedded in the Match.  Group 0 is an automatically-assigned group th
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The __last__ capture is embedded in each group, so `g.String()` will return the same thing as `g.Capture.String()` and  `g.Captures[len(g.Captures)-1].String()`.
 | 
					The __last__ capture is embedded in each group, so `g.String()` will return the same thing as `g.Capture.String()` and  `g.Captures[len(g.Captures)-1].String()`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If you want to find multiple matches from a single input string you should use the `FindNextMatch` method.  For example, to implement a function similar to `regexp.FindAllString`:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```go
 | 
				
			||||||
 | 
					func regexp2FindAllString(re *regexp2.Regexp, s string) []string {
 | 
				
			||||||
 | 
						var matches []string
 | 
				
			||||||
 | 
						m, _ := re.FindStringMatch(s)
 | 
				
			||||||
 | 
						for m != nil {
 | 
				
			||||||
 | 
							matches = append(matches, m.String())
 | 
				
			||||||
 | 
							m, _ = re.FindNextMatch(m)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return matches
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`FindNextMatch` is optmized so that it re-uses the underlying string/rune slice.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The internals of `regexp2` always operate on `[]rune` so `Index` and `Length` data in a `Match` always reference a position in `rune`s rather than `byte`s (even if the input was given as a string). This is a dramatic difference between `regexp` and `regexp2`.  It's advisable to use the provided `String()` methods to avoid having to work with indices.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Compare `regexp` and `regexp2`
 | 
					## Compare `regexp` and `regexp2`
 | 
				
			||||||
| Category | regexp | regexp2 |
 | 
					| Category | regexp | regexp2 |
 | 
				
			||||||
| --- | --- | --- |
 | 
					| --- | --- | --- |
 | 
				
			||||||
| 
						 | 
					@ -62,6 +80,8 @@ The default behavior of `regexp2` is to match the .NET regexp engine, however th
 | 
				
			||||||
* add support for named ascii character classes (e.g. `[[:foo:]]`)
 | 
					* add support for named ascii character classes (e.g. `[[:foo:]]`)
 | 
				
			||||||
* add support for python-style capture groups (e.g. `(P<name>re)`)
 | 
					* add support for python-style capture groups (e.g. `(P<name>re)`)
 | 
				
			||||||
* change singleline behavior for `$` to only match end of string (like RE2) (see [#24](https://github.com/dlclark/regexp2/issues/24))
 | 
					* change singleline behavior for `$` to only match end of string (like RE2) (see [#24](https://github.com/dlclark/regexp2/issues/24))
 | 
				
			||||||
 | 
					* change the character classes `\d` `\s` and `\w` to match the same characters as RE2. NOTE: if you also use the `ECMAScript` option then this will change the `\s` character class to match ECMAScript instead of RE2.  ECMAScript allows more whitespace characters in `\s` than RE2 (but still fewer than the the default behavior).
 | 
				
			||||||
 | 
					* allow character escape sequences to have defaults. For example, by default `\_` isn't a known character escape and will fail to compile, but in RE2 mode it will match the literal character `_`
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
```go
 | 
					```go
 | 
				
			||||||
re := regexp2.MustCompile(`Your RE2-compatible pattern`, regexp2.RE2)
 | 
					re := regexp2.MustCompile(`Your RE2-compatible pattern`, regexp2.RE2)
 | 
				
			||||||
| 
						 | 
					@ -72,6 +92,48 @@ if isMatch, _ := re.MatchString(`Something to match`); isMatch {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This feature is a work in progress and I'm open to ideas for more things to put here (maybe more relaxed character escaping rules?).
 | 
					This feature is a work in progress and I'm open to ideas for more things to put here (maybe more relaxed character escaping rules?).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Catastrophic Backtracking and Timeouts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`regexp2` supports features that can lead to catastrophic backtracking.
 | 
				
			||||||
 | 
					`Regexp.MatchTimeout` can be set to to limit the impact of such behavior; the
 | 
				
			||||||
 | 
					match will fail with an error after approximately MatchTimeout. No timeout
 | 
				
			||||||
 | 
					checks are done by default.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Timeout checking is not free. The current timeout checking implementation starts
 | 
				
			||||||
 | 
					a background worker that updates a clock value approximately once every 100
 | 
				
			||||||
 | 
					milliseconds. The matching code compares this value against the precomputed
 | 
				
			||||||
 | 
					deadline for the match. The performance impact is as follows.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.  A match with a timeout runs almost as fast as a match without a timeout.
 | 
				
			||||||
 | 
					2.  If any live matches have a timeout, there will be a background CPU load
 | 
				
			||||||
 | 
					    (`~0.15%` currently on a modern machine). This load will remain constant
 | 
				
			||||||
 | 
					    regardless of the number of matches done including matches done in parallel.
 | 
				
			||||||
 | 
					3.  If no live matches are using a timeout, the background load will remain
 | 
				
			||||||
 | 
					    until the longest deadline (match timeout + the time when the match started)
 | 
				
			||||||
 | 
					    is reached. E.g., if you set a timeout of one minute the load will persist
 | 
				
			||||||
 | 
					    for approximately a minute even if the match finishes quickly.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Some alternative implementations were considered and ruled out. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.  **time.Now()** - This was the initial timeout implementation. It called `time.Now()`
 | 
				
			||||||
 | 
					    and compared the result to the deadline approximately once every 1000 matching steps.
 | 
				
			||||||
 | 
					    Adding a timeout to a simple match increased the cost from ~45ns to ~3000ns).
 | 
				
			||||||
 | 
					2.  **time.AfterFunc** - This approach entails using `time.AfterFunc` to set an `expired`
 | 
				
			||||||
 | 
					    atomic boolean value. However it increases the cost of handling a simple match 
 | 
				
			||||||
 | 
					    with a timeout from ~45ns to ~360ns and was therefore ruled out.
 | 
				
			||||||
 | 
					3.  **counter** - In this approach an atomic variable tracks the number of live matches
 | 
				
			||||||
 | 
					    with timeouts. The background clock stops when the counter hits zero. The benefit
 | 
				
			||||||
 | 
					    of this approach is that the background load will stop more quickly (after the
 | 
				
			||||||
 | 
					    last match has finished as opposed to waiting until the deadline for the last
 | 
				
			||||||
 | 
					    match). However this approach requires more atomic variable updates and has poorer
 | 
				
			||||||
 | 
					    performance when multiple matches are executed concurrently. (The cost of a
 | 
				
			||||||
 | 
					    single match jumps from ~45ns to ~65ns, and the cost of running matches on
 | 
				
			||||||
 | 
					    all 12 available CPUs jumps from ~400ns to ~730ns).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## ECMAScript compatibility mode
 | 
				
			||||||
 | 
					In this mode the engine provides compatibility with the [regex engine](https://tc39.es/ecma262/multipage/text-processing.html#sec-regexp-regular-expression-objects) described in the ECMAScript specification.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Additionally a Unicode mode is provided which allows parsing of `\u{CodePoint}` syntax that is only when both are provided.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Library features that I'm still working on
 | 
					## Library features that I'm still working on
 | 
				
			||||||
- Regex split
 | 
					- Regex split
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,104 @@
 | 
				
			||||||
 | 
					package regexp2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"sync"
 | 
				
			||||||
 | 
						"sync/atomic"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// fasttime holds a time value (ticks since clock initialization)
 | 
				
			||||||
 | 
					type fasttime int64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// fastclock provides a fast clock implementation.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// A background goroutine periodically stores the current time
 | 
				
			||||||
 | 
					// into an atomic variable.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// A deadline can be quickly checked for expiration by comparing
 | 
				
			||||||
 | 
					// its value to the clock stored in the atomic variable.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// The goroutine automatically stops once clockEnd is reached.
 | 
				
			||||||
 | 
					// (clockEnd covers the largest deadline seen so far + some
 | 
				
			||||||
 | 
					// extra time). This ensures that if regexp2 with timeouts
 | 
				
			||||||
 | 
					// stops being used we will stop background work.
 | 
				
			||||||
 | 
					type fastclock struct {
 | 
				
			||||||
 | 
						// current and clockEnd can be read via atomic loads.
 | 
				
			||||||
 | 
						// Reads and writes of other fields require mu to be held.
 | 
				
			||||||
 | 
						mu sync.Mutex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						start    time.Time  // Time corresponding to fasttime(0)
 | 
				
			||||||
 | 
						current  atomicTime // Current time (approximate)
 | 
				
			||||||
 | 
						clockEnd atomicTime // When clock updater is supposed to stop (>= any existing deadline)
 | 
				
			||||||
 | 
						running  bool       // Is a clock updater running?
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var fast fastclock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// reached returns true if current time is at or past t.
 | 
				
			||||||
 | 
					func (t fasttime) reached() bool {
 | 
				
			||||||
 | 
						return fast.current.read() >= t
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// makeDeadline returns a time that is approximately time.Now().Add(d)
 | 
				
			||||||
 | 
					func makeDeadline(d time.Duration) fasttime {
 | 
				
			||||||
 | 
						// Increase the deadline since the clock we are reading may be
 | 
				
			||||||
 | 
						// just about to tick forwards.
 | 
				
			||||||
 | 
						end := fast.current.read() + durationToTicks(d+clockPeriod)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Start or extend clock if necessary.
 | 
				
			||||||
 | 
						if end > fast.clockEnd.read() {
 | 
				
			||||||
 | 
							extendClock(end)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return end
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// extendClock ensures that clock is live and will run until at least end.
 | 
				
			||||||
 | 
					func extendClock(end fasttime) {
 | 
				
			||||||
 | 
						fast.mu.Lock()
 | 
				
			||||||
 | 
						defer fast.mu.Unlock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if fast.start.IsZero() {
 | 
				
			||||||
 | 
							fast.start = time.Now()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Extend the running time to cover end as well as a bit of slop.
 | 
				
			||||||
 | 
						if shutdown := end + durationToTicks(time.Second); shutdown > fast.clockEnd.read() {
 | 
				
			||||||
 | 
							fast.clockEnd.write(shutdown)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Start clock if necessary
 | 
				
			||||||
 | 
						if !fast.running {
 | 
				
			||||||
 | 
							fast.running = true
 | 
				
			||||||
 | 
							go runClock()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func durationToTicks(d time.Duration) fasttime {
 | 
				
			||||||
 | 
						// Downscale nanoseconds to approximately a millisecond so that we can avoid
 | 
				
			||||||
 | 
						// overflow even if the caller passes in math.MaxInt64.
 | 
				
			||||||
 | 
						return fasttime(d) >> 20
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// clockPeriod is the approximate interval between updates of approximateClock.
 | 
				
			||||||
 | 
					const clockPeriod = 100 * time.Millisecond
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func runClock() {
 | 
				
			||||||
 | 
						fast.mu.Lock()
 | 
				
			||||||
 | 
						defer fast.mu.Unlock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for fast.current.read() <= fast.clockEnd.read() {
 | 
				
			||||||
 | 
							// Unlock while sleeping.
 | 
				
			||||||
 | 
							fast.mu.Unlock()
 | 
				
			||||||
 | 
							time.Sleep(clockPeriod)
 | 
				
			||||||
 | 
							fast.mu.Lock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							newTime := durationToTicks(time.Since(fast.start))
 | 
				
			||||||
 | 
							fast.current.write(newTime)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						fast.running = false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type atomicTime struct{ v int64 } // Should change to atomic.Int64 when we can use go 1.19
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (t *atomicTime) read() fasttime   { return fasttime(atomic.LoadInt64(&t.v)) }
 | 
				
			||||||
 | 
					func (t *atomicTime) write(v fasttime) { atomic.StoreInt64(&t.v, int64(v)) }
 | 
				
			||||||
| 
						 | 
					@ -24,7 +24,11 @@ var DefaultMatchTimeout = time.Duration(math.MaxInt64)
 | 
				
			||||||
// Regexp is the representation of a compiled regular expression.
 | 
					// Regexp is the representation of a compiled regular expression.
 | 
				
			||||||
// A Regexp is safe for concurrent use by multiple goroutines.
 | 
					// A Regexp is safe for concurrent use by multiple goroutines.
 | 
				
			||||||
type Regexp struct {
 | 
					type Regexp struct {
 | 
				
			||||||
	//timeout when trying to find matches
 | 
						// A match will time out if it takes (approximately) more than
 | 
				
			||||||
 | 
						// MatchTimeout. This is a safety check in case the match
 | 
				
			||||||
 | 
						// encounters catastrophic backtracking.  The default value
 | 
				
			||||||
 | 
						// (DefaultMatchTimeout) causes all time out checking to be
 | 
				
			||||||
 | 
						// suppressed.
 | 
				
			||||||
	MatchTimeout time.Duration
 | 
						MatchTimeout time.Duration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// read-only after Compile
 | 
						// read-only after Compile
 | 
				
			||||||
| 
						 | 
					@ -121,6 +125,7 @@ const (
 | 
				
			||||||
	Debug                                = 0x0080 // "d"
 | 
						Debug                                = 0x0080 // "d"
 | 
				
			||||||
	ECMAScript                           = 0x0100 // "e"
 | 
						ECMAScript                           = 0x0100 // "e"
 | 
				
			||||||
	RE2                                  = 0x0200 // RE2 (regexp package) compatibility mode
 | 
						RE2                                  = 0x0200 // RE2 (regexp package) compatibility mode
 | 
				
			||||||
 | 
						Unicode                              = 0x0400 // "u"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (re *Regexp) RightToLeft() bool {
 | 
					func (re *Regexp) RightToLeft() bool {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -60,8 +60,7 @@ type runner struct {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ignoreTimeout bool
 | 
						ignoreTimeout bool
 | 
				
			||||||
	timeout       time.Duration // timeout in milliseconds (needed for actual)
 | 
						timeout       time.Duration // timeout in milliseconds (needed for actual)
 | 
				
			||||||
	timeoutChecksToSkip int
 | 
						deadline      fasttime
 | 
				
			||||||
	timeoutAt           time.Time
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	operator        syntax.InstOp
 | 
						operator        syntax.InstOp
 | 
				
			||||||
	codepos         int
 | 
						codepos         int
 | 
				
			||||||
| 
						 | 
					@ -1551,39 +1550,15 @@ func (r *runner) isECMABoundary(index, startpos, endpos int) bool {
 | 
				
			||||||
		(index < endpos && syntax.IsECMAWordChar(r.runtext[index]))
 | 
							(index < endpos && syntax.IsECMAWordChar(r.runtext[index]))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// this seems like a comment to justify randomly picking 1000 :-P
 | 
					 | 
				
			||||||
// We have determined this value in a series of experiments where x86 retail
 | 
					 | 
				
			||||||
// builds (ono-lab-optimized) were run on different pattern/input pairs. Larger values
 | 
					 | 
				
			||||||
// of TimeoutCheckFrequency did not tend to increase performance; smaller values
 | 
					 | 
				
			||||||
// of TimeoutCheckFrequency tended to slow down the execution.
 | 
					 | 
				
			||||||
const timeoutCheckFrequency int = 1000
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (r *runner) startTimeoutWatch() {
 | 
					func (r *runner) startTimeoutWatch() {
 | 
				
			||||||
	if r.ignoreTimeout {
 | 
						if r.ignoreTimeout {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						r.deadline = makeDeadline(r.timeout)
 | 
				
			||||||
	r.timeoutChecksToSkip = timeoutCheckFrequency
 | 
					 | 
				
			||||||
	r.timeoutAt = time.Now().Add(r.timeout)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (r *runner) checkTimeout() error {
 | 
					func (r *runner) checkTimeout() error {
 | 
				
			||||||
	if r.ignoreTimeout {
 | 
						if r.ignoreTimeout || !r.deadline.reached() {
 | 
				
			||||||
		return nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	r.timeoutChecksToSkip--
 | 
					 | 
				
			||||||
	if r.timeoutChecksToSkip != 0 {
 | 
					 | 
				
			||||||
		return nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	r.timeoutChecksToSkip = timeoutCheckFrequency
 | 
					 | 
				
			||||||
	return r.doCheckTimeout()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (r *runner) doCheckTimeout() error {
 | 
					 | 
				
			||||||
	current := time.Now()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if current.Before(r.timeoutAt) {
 | 
					 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,6 +37,8 @@ var (
 | 
				
			||||||
	ecmaSpace = []rune{0x0009, 0x000e, 0x0020, 0x0021, 0x00a0, 0x00a1, 0x1680, 0x1681, 0x2000, 0x200b, 0x2028, 0x202a, 0x202f, 0x2030, 0x205f, 0x2060, 0x3000, 0x3001, 0xfeff, 0xff00}
 | 
						ecmaSpace = []rune{0x0009, 0x000e, 0x0020, 0x0021, 0x00a0, 0x00a1, 0x1680, 0x1681, 0x2000, 0x200b, 0x2028, 0x202a, 0x202f, 0x2030, 0x205f, 0x2060, 0x3000, 0x3001, 0xfeff, 0xff00}
 | 
				
			||||||
	ecmaWord  = []rune{0x0030, 0x003a, 0x0041, 0x005b, 0x005f, 0x0060, 0x0061, 0x007b}
 | 
						ecmaWord  = []rune{0x0030, 0x003a, 0x0041, 0x005b, 0x005f, 0x0060, 0x0061, 0x007b}
 | 
				
			||||||
	ecmaDigit = []rune{0x0030, 0x003a}
 | 
						ecmaDigit = []rune{0x0030, 0x003a}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						re2Space = []rune{0x0009, 0x000b, 0x000c, 0x000e, 0x0020, 0x0021}
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
| 
						 | 
					@ -56,6 +58,9 @@ var (
 | 
				
			||||||
	NotSpaceClass = getCharSetFromCategoryString(true, false, spaceCategoryText)
 | 
						NotSpaceClass = getCharSetFromCategoryString(true, false, spaceCategoryText)
 | 
				
			||||||
	DigitClass    = getCharSetFromCategoryString(false, false, "Nd")
 | 
						DigitClass    = getCharSetFromCategoryString(false, false, "Nd")
 | 
				
			||||||
	NotDigitClass = getCharSetFromCategoryString(false, true, "Nd")
 | 
						NotDigitClass = getCharSetFromCategoryString(false, true, "Nd")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						RE2SpaceClass    = getCharSetFromOldString(re2Space, false)
 | 
				
			||||||
 | 
						NotRE2SpaceClass = getCharSetFromOldString(re2Space, true)
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var unicodeCategories = func() map[string]*unicode.RangeTable {
 | 
					var unicodeCategories = func() map[string]*unicode.RangeTable {
 | 
				
			||||||
| 
						 | 
					@ -401,13 +406,19 @@ func (c *CharSet) addChar(ch rune) {
 | 
				
			||||||
	c.addRange(ch, ch)
 | 
						c.addRange(ch, ch)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *CharSet) addSpace(ecma, negate bool) {
 | 
					func (c *CharSet) addSpace(ecma, re2, negate bool) {
 | 
				
			||||||
	if ecma {
 | 
						if ecma {
 | 
				
			||||||
		if negate {
 | 
							if negate {
 | 
				
			||||||
			c.addRanges(NotECMASpaceClass().ranges)
 | 
								c.addRanges(NotECMASpaceClass().ranges)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			c.addRanges(ECMASpaceClass().ranges)
 | 
								c.addRanges(ECMASpaceClass().ranges)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						} else if re2 {
 | 
				
			||||||
 | 
							if negate {
 | 
				
			||||||
 | 
								c.addRanges(NotRE2SpaceClass().ranges)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								c.addRanges(RE2SpaceClass().ranges)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		c.addCategories(category{cat: spaceCategoryText, negate: negate})
 | 
							c.addCategories(category{cat: spaceCategoryText, negate: negate})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -563,7 +574,7 @@ func (c *CharSet) addNamedASCII(name string, negate bool) bool {
 | 
				
			||||||
	case "punct": //[!-/:-@[-`{-~]
 | 
						case "punct": //[!-/:-@[-`{-~]
 | 
				
			||||||
		rs = []singleRange{singleRange{'!', '/'}, singleRange{':', '@'}, singleRange{'[', '`'}, singleRange{'{', '~'}}
 | 
							rs = []singleRange{singleRange{'!', '/'}, singleRange{':', '@'}, singleRange{'[', '`'}, singleRange{'{', '~'}}
 | 
				
			||||||
	case "space":
 | 
						case "space":
 | 
				
			||||||
		c.addSpace(true, negate)
 | 
							c.addSpace(true, false, negate)
 | 
				
			||||||
	case "upper":
 | 
						case "upper":
 | 
				
			||||||
		rs = []singleRange{singleRange{'A', 'Z'}}
 | 
							rs = []singleRange{singleRange{'A', 'Z'}}
 | 
				
			||||||
	case "word":
 | 
						case "word":
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,6 +22,7 @@ const (
 | 
				
			||||||
	Debug                                = 0x0080 // "d"
 | 
						Debug                                = 0x0080 // "d"
 | 
				
			||||||
	ECMAScript                           = 0x0100 // "e"
 | 
						ECMAScript                           = 0x0100 // "e"
 | 
				
			||||||
	RE2                                  = 0x0200 // RE2 compat mode
 | 
						RE2                                  = 0x0200 // RE2 compat mode
 | 
				
			||||||
 | 
						Unicode                              = 0x0400 // "u"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func optionFromCode(ch rune) RegexOptions {
 | 
					func optionFromCode(ch rune) RegexOptions {
 | 
				
			||||||
| 
						 | 
					@ -43,6 +44,8 @@ func optionFromCode(ch rune) RegexOptions {
 | 
				
			||||||
		return Debug
 | 
							return Debug
 | 
				
			||||||
	case 'e', 'E':
 | 
						case 'e', 'E':
 | 
				
			||||||
		return ECMAScript
 | 
							return ECMAScript
 | 
				
			||||||
 | 
						case 'u', 'U':
 | 
				
			||||||
 | 
							return Unicode
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		return 0
 | 
							return 0
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -104,7 +107,7 @@ const (
 | 
				
			||||||
	ErrBadClassInCharRange        = "cannot include class \\%v in character range"
 | 
						ErrBadClassInCharRange        = "cannot include class \\%v in character range"
 | 
				
			||||||
	ErrUnterminatedBracket        = "unterminated [] set"
 | 
						ErrUnterminatedBracket        = "unterminated [] set"
 | 
				
			||||||
	ErrSubtractionMustBeLast      = "a subtraction must be the last element in a character class"
 | 
						ErrSubtractionMustBeLast      = "a subtraction must be the last element in a character class"
 | 
				
			||||||
	ErrReversedCharRange          = "[x-y] range in reverse order"
 | 
						ErrReversedCharRange          = "[%c-%c] range in reverse order"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (e ErrorCode) String() string {
 | 
					func (e ErrorCode) String() string {
 | 
				
			||||||
| 
						 | 
					@ -1121,14 +1124,14 @@ func (p *parser) scanBackslash(scanOnly bool) (*regexNode, error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case 'w':
 | 
						case 'w':
 | 
				
			||||||
		p.moveRight(1)
 | 
							p.moveRight(1)
 | 
				
			||||||
		if p.useOptionE() {
 | 
							if p.useOptionE() || p.useRE2() {
 | 
				
			||||||
			return newRegexNodeSet(ntSet, p.options, ECMAWordClass()), nil
 | 
								return newRegexNodeSet(ntSet, p.options, ECMAWordClass()), nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return newRegexNodeSet(ntSet, p.options, WordClass()), nil
 | 
							return newRegexNodeSet(ntSet, p.options, WordClass()), nil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case 'W':
 | 
						case 'W':
 | 
				
			||||||
		p.moveRight(1)
 | 
							p.moveRight(1)
 | 
				
			||||||
		if p.useOptionE() {
 | 
							if p.useOptionE() || p.useRE2() {
 | 
				
			||||||
			return newRegexNodeSet(ntSet, p.options, NotECMAWordClass()), nil
 | 
								return newRegexNodeSet(ntSet, p.options, NotECMAWordClass()), nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return newRegexNodeSet(ntSet, p.options, NotWordClass()), nil
 | 
							return newRegexNodeSet(ntSet, p.options, NotWordClass()), nil
 | 
				
			||||||
| 
						 | 
					@ -1137,6 +1140,8 @@ func (p *parser) scanBackslash(scanOnly bool) (*regexNode, error) {
 | 
				
			||||||
		p.moveRight(1)
 | 
							p.moveRight(1)
 | 
				
			||||||
		if p.useOptionE() {
 | 
							if p.useOptionE() {
 | 
				
			||||||
			return newRegexNodeSet(ntSet, p.options, ECMASpaceClass()), nil
 | 
								return newRegexNodeSet(ntSet, p.options, ECMASpaceClass()), nil
 | 
				
			||||||
 | 
							} else if p.useRE2() {
 | 
				
			||||||
 | 
								return newRegexNodeSet(ntSet, p.options, RE2SpaceClass()), nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return newRegexNodeSet(ntSet, p.options, SpaceClass()), nil
 | 
							return newRegexNodeSet(ntSet, p.options, SpaceClass()), nil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1144,19 +1149,21 @@ func (p *parser) scanBackslash(scanOnly bool) (*regexNode, error) {
 | 
				
			||||||
		p.moveRight(1)
 | 
							p.moveRight(1)
 | 
				
			||||||
		if p.useOptionE() {
 | 
							if p.useOptionE() {
 | 
				
			||||||
			return newRegexNodeSet(ntSet, p.options, NotECMASpaceClass()), nil
 | 
								return newRegexNodeSet(ntSet, p.options, NotECMASpaceClass()), nil
 | 
				
			||||||
 | 
							} else if p.useRE2() {
 | 
				
			||||||
 | 
								return newRegexNodeSet(ntSet, p.options, NotRE2SpaceClass()), nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return newRegexNodeSet(ntSet, p.options, NotSpaceClass()), nil
 | 
							return newRegexNodeSet(ntSet, p.options, NotSpaceClass()), nil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case 'd':
 | 
						case 'd':
 | 
				
			||||||
		p.moveRight(1)
 | 
							p.moveRight(1)
 | 
				
			||||||
		if p.useOptionE() {
 | 
							if p.useOptionE() || p.useRE2() {
 | 
				
			||||||
			return newRegexNodeSet(ntSet, p.options, ECMADigitClass()), nil
 | 
								return newRegexNodeSet(ntSet, p.options, ECMADigitClass()), nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return newRegexNodeSet(ntSet, p.options, DigitClass()), nil
 | 
							return newRegexNodeSet(ntSet, p.options, DigitClass()), nil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case 'D':
 | 
						case 'D':
 | 
				
			||||||
		p.moveRight(1)
 | 
							p.moveRight(1)
 | 
				
			||||||
		if p.useOptionE() {
 | 
							if p.useOptionE() || p.useRE2() {
 | 
				
			||||||
			return newRegexNodeSet(ntSet, p.options, NotECMADigitClass()), nil
 | 
								return newRegexNodeSet(ntSet, p.options, NotECMADigitClass()), nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return newRegexNodeSet(ntSet, p.options, NotDigitClass()), nil
 | 
							return newRegexNodeSet(ntSet, p.options, NotDigitClass()), nil
 | 
				
			||||||
| 
						 | 
					@ -1186,19 +1193,24 @@ func (p *parser) scanBasicBackslash(scanOnly bool) (*regexNode, error) {
 | 
				
			||||||
		return nil, p.getErr(ErrIllegalEndEscape)
 | 
							return nil, p.getErr(ErrIllegalEndEscape)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	angled := false
 | 
						angled := false
 | 
				
			||||||
 | 
						k := false
 | 
				
			||||||
	close := '\x00'
 | 
						close := '\x00'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	backpos := p.textpos()
 | 
						backpos := p.textpos()
 | 
				
			||||||
	ch := p.rightChar(0)
 | 
						ch := p.rightChar(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// allow \k<foo> instead of \<foo>, which is now deprecated
 | 
						// Allow \k<foo> instead of \<foo>, which is now deprecated.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ch == 'k' {
 | 
						// According to ECMAScript specification, \k<name> is only parsed as a named group reference if
 | 
				
			||||||
 | 
						// there is at least one group name in the regexp.
 | 
				
			||||||
 | 
						// See https://www.ecma-international.org/ecma-262/#sec-isvalidregularexpressionliteral, step 7.
 | 
				
			||||||
 | 
						// Note, during the first (scanOnly) run we may not have all group names scanned, but that's ok.
 | 
				
			||||||
 | 
						if ch == 'k' && (!p.useOptionE() || len(p.capnames) > 0) {
 | 
				
			||||||
		if p.charsRight() >= 2 {
 | 
							if p.charsRight() >= 2 {
 | 
				
			||||||
			p.moveRight(1)
 | 
								p.moveRight(1)
 | 
				
			||||||
			ch = p.moveRightGetChar()
 | 
								ch = p.moveRightGetChar()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if ch == '<' || ch == '\'' {
 | 
								if ch == '<' || (!p.useOptionE() && ch == '\'') { // No support for \k'name' in ECMAScript
 | 
				
			||||||
				angled = true
 | 
									angled = true
 | 
				
			||||||
				if ch == '\'' {
 | 
									if ch == '\'' {
 | 
				
			||||||
					close = '\''
 | 
										close = '\''
 | 
				
			||||||
| 
						 | 
					@ -1213,8 +1225,9 @@ func (p *parser) scanBasicBackslash(scanOnly bool) (*regexNode, error) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ch = p.rightChar(0)
 | 
							ch = p.rightChar(0)
 | 
				
			||||||
 | 
							k = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	} else if (ch == '<' || ch == '\'') && p.charsRight() > 1 { // Note angle without \g
 | 
						} else if !p.useOptionE() && (ch == '<' || ch == '\'') && p.charsRight() > 1 { // Note angle without \g
 | 
				
			||||||
		angled = true
 | 
							angled = true
 | 
				
			||||||
		if ch == '\'' {
 | 
							if ch == '\'' {
 | 
				
			||||||
			close = '\''
 | 
								close = '\''
 | 
				
			||||||
| 
						 | 
					@ -1257,14 +1270,23 @@ func (p *parser) scanBasicBackslash(scanOnly bool) (*regexNode, error) {
 | 
				
			||||||
			return nil, p.getErr(ErrUndefinedBackRef, capnum)
 | 
								return nil, p.getErr(ErrUndefinedBackRef, capnum)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	} else if angled && IsWordChar(ch) {
 | 
						} else if angled {
 | 
				
			||||||
		capname := p.scanCapname()
 | 
							capname := p.scanCapname()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if p.charsRight() > 0 && p.moveRightGetChar() == close {
 | 
							if capname != "" && p.charsRight() > 0 && p.moveRightGetChar() == close {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if scanOnly {
 | 
				
			||||||
 | 
									return nil, nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if p.isCaptureName(capname) {
 | 
								if p.isCaptureName(capname) {
 | 
				
			||||||
				return newRegexNodeM(ntRef, p.options, p.captureSlotFromName(capname)), nil
 | 
									return newRegexNodeM(ntRef, p.options, p.captureSlotFromName(capname)), nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			return nil, p.getErr(ErrUndefinedNameRef, capname)
 | 
								return nil, p.getErr(ErrUndefinedNameRef, capname)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								if k {
 | 
				
			||||||
 | 
									return nil, p.getErr(ErrMalformedNameRef)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1276,6 +1298,10 @@ func (p *parser) scanBasicBackslash(scanOnly bool) (*regexNode, error) {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if scanOnly {
 | 
				
			||||||
 | 
							return nil, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if p.useOptionI() {
 | 
						if p.useOptionI() {
 | 
				
			||||||
		ch = unicode.ToLower(ch)
 | 
							ch = unicode.ToLower(ch)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -1443,7 +1469,7 @@ func (p *parser) scanCharSet(caseInsensitive, scanOnly bool) (*CharSet, error) {
 | 
				
			||||||
					if inRange {
 | 
										if inRange {
 | 
				
			||||||
						return nil, p.getErr(ErrBadClassInCharRange, ch)
 | 
											return nil, p.getErr(ErrBadClassInCharRange, ch)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					cc.addDigit(p.useOptionE(), ch == 'D', p.patternRaw)
 | 
										cc.addDigit(p.useOptionE() || p.useRE2(), ch == 'D', p.patternRaw)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1452,7 +1478,7 @@ func (p *parser) scanCharSet(caseInsensitive, scanOnly bool) (*CharSet, error) {
 | 
				
			||||||
					if inRange {
 | 
										if inRange {
 | 
				
			||||||
						return nil, p.getErr(ErrBadClassInCharRange, ch)
 | 
											return nil, p.getErr(ErrBadClassInCharRange, ch)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					cc.addSpace(p.useOptionE(), ch == 'S')
 | 
										cc.addSpace(p.useOptionE(), p.useRE2(), ch == 'S')
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1462,7 +1488,7 @@ func (p *parser) scanCharSet(caseInsensitive, scanOnly bool) (*CharSet, error) {
 | 
				
			||||||
						return nil, p.getErr(ErrBadClassInCharRange, ch)
 | 
											return nil, p.getErr(ErrBadClassInCharRange, ch)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					cc.addWord(p.useOptionE(), ch == 'W')
 | 
										cc.addWord(p.useOptionE() || p.useRE2(), ch == 'W')
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1548,7 +1574,7 @@ func (p *parser) scanCharSet(caseInsensitive, scanOnly bool) (*CharSet, error) {
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					// a regular range, like a-z
 | 
										// a regular range, like a-z
 | 
				
			||||||
					if chPrev > ch {
 | 
										if chPrev > ch {
 | 
				
			||||||
						return nil, p.getErr(ErrReversedCharRange)
 | 
											return nil, p.getErr(ErrReversedCharRange, chPrev, ch)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					cc.addRange(chPrev, ch)
 | 
										cc.addRange(chPrev, ch)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
| 
						 | 
					@ -1672,7 +1698,13 @@ func (p *parser) scanCharEscape() (r rune, err error) {
 | 
				
			||||||
			r, err = p.scanHex(2)
 | 
								r, err = p.scanHex(2)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	case 'u':
 | 
						case 'u':
 | 
				
			||||||
 | 
							// ECMAscript suppot \u{HEX} only if `u` is also set
 | 
				
			||||||
 | 
							if p.useOptionE() && p.useOptionU() && p.charsRight() > 0 && p.rightChar(0) == '{' {
 | 
				
			||||||
 | 
								p.moveRight(1)
 | 
				
			||||||
 | 
								return p.scanHexUntilBrace()
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
			r, err = p.scanHex(4)
 | 
								r, err = p.scanHex(4)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	case 'a':
 | 
						case 'a':
 | 
				
			||||||
		return '\u0007', nil
 | 
							return '\u0007', nil
 | 
				
			||||||
	case 'b':
 | 
						case 'b':
 | 
				
			||||||
| 
						 | 
					@ -1692,7 +1724,7 @@ func (p *parser) scanCharEscape() (r rune, err error) {
 | 
				
			||||||
	case 'c':
 | 
						case 'c':
 | 
				
			||||||
		r, err = p.scanControl()
 | 
							r, err = p.scanControl()
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		if !p.useOptionE() && IsWordChar(ch) {
 | 
							if !p.useOptionE() && !p.useRE2() && IsWordChar(ch) {
 | 
				
			||||||
			return 0, p.getErr(ErrUnrecognizedEscape, string(ch))
 | 
								return 0, p.getErr(ErrUnrecognizedEscape, string(ch))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return ch, nil
 | 
							return ch, nil
 | 
				
			||||||
| 
						 | 
					@ -1949,6 +1981,11 @@ func (p *parser) useRE2() bool {
 | 
				
			||||||
	return (p.options & RE2) != 0
 | 
						return (p.options & RE2) != 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// True if U option enabling ECMAScript's Unicode behavior on.
 | 
				
			||||||
 | 
					func (p *parser) useOptionU() bool {
 | 
				
			||||||
 | 
						return (p.options & Unicode) != 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// True if options stack is empty.
 | 
					// True if options stack is empty.
 | 
				
			||||||
func (p *parser) emptyOptionsStack() bool {
 | 
					func (p *parser) emptyOptionsStack() bool {
 | 
				
			||||||
	return len(p.optionsStack) == 0
 | 
						return len(p.optionsStack) == 0
 | 
				
			||||||
| 
						 | 
					@ -2044,7 +2081,8 @@ func (p *parser) addToConcatenate(pos, cch int, isReplacement bool) {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if cch > 1 {
 | 
						if cch > 1 {
 | 
				
			||||||
		str := p.pattern[pos : pos+cch]
 | 
							str := make([]rune, cch)
 | 
				
			||||||
 | 
							copy(str, p.pattern[pos:pos+cch])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if p.useOptionI() && !isReplacement {
 | 
							if p.useOptionI() && !isReplacement {
 | 
				
			||||||
			// We do the ToLower character by character for consistency.  With surrogate chars, doing
 | 
								// We do the ToLower character by character for consistency.  With surrogate chars, doing
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -712,7 +712,7 @@ func (b *BmPrefix) Scan(text []rune, index, beglimit, endlimit int) int {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if chTest != b.pattern[match] {
 | 
									if chTest != b.pattern[match] {
 | 
				
			||||||
					advance = b.positive[match]
 | 
										advance = b.positive[match]
 | 
				
			||||||
					if (chTest & 0xFF80) == 0 {
 | 
										if chTest < 128 {
 | 
				
			||||||
						test2 = (match - startmatch) + b.negativeASCII[chTest]
 | 
											test2 = (match - startmatch) + b.negativeASCII[chTest]
 | 
				
			||||||
					} else if chTest < 0xffff && len(b.negativeUnicode) > 0 {
 | 
										} else if chTest < 0xffff && len(b.negativeUnicode) > 0 {
 | 
				
			||||||
						unicodeLookup = b.negativeUnicode[chTest>>8]
 | 
											unicodeLookup = b.negativeUnicode[chTest>>8]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +0,0 @@
 | 
				
			||||||
# This source code refers to The Go Authors for copyright purposes.
 | 
					 | 
				
			||||||
# The master list of authors is in the main Go distribution,
 | 
					 | 
				
			||||||
# visible at http://tip.golang.org/AUTHORS.
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,3 +0,0 @@
 | 
				
			||||||
# This source code was written by the Go contributors.
 | 
					 | 
				
			||||||
# The master list of contributors is in the main Go distribution,
 | 
					 | 
				
			||||||
# visible at http://tip.golang.org/CONTRIBUTORS.
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,30 +0,0 @@
 | 
				
			||||||
// Copyright 2020 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 unsafeheader contains header declarations for the Go runtime's
 | 
					 | 
				
			||||||
// slice and string implementations.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// This package allows x/sys to use types equivalent to
 | 
					 | 
				
			||||||
// reflect.SliceHeader and reflect.StringHeader without introducing
 | 
					 | 
				
			||||||
// a dependency on the (relatively heavy) "reflect" package.
 | 
					 | 
				
			||||||
package unsafeheader
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"unsafe"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Slice is the runtime representation of a slice.
 | 
					 | 
				
			||||||
// It cannot be used safely or portably and its representation may change in a later release.
 | 
					 | 
				
			||||||
type Slice struct {
 | 
					 | 
				
			||||||
	Data unsafe.Pointer
 | 
					 | 
				
			||||||
	Len  int
 | 
					 | 
				
			||||||
	Cap  int
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// String is the runtime representation of a string.
 | 
					 | 
				
			||||||
// It cannot be used safely or portably and its representation may change in a later release.
 | 
					 | 
				
			||||||
type String struct {
 | 
					 | 
				
			||||||
	Data unsafe.Pointer
 | 
					 | 
				
			||||||
	Len  int
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,31 @@
 | 
				
			||||||
 | 
					// Copyright 2022 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:build (darwin || freebsd || netbsd || openbsd) && gc
 | 
				
			||||||
 | 
					// +build darwin freebsd netbsd openbsd
 | 
				
			||||||
 | 
					// +build gc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System call support for ppc64, BSD
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 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)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					// Copyright 2021 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:build (darwin || freebsd || netbsd || openbsd) && gc
 | 
				
			||||||
 | 
					// +build darwin freebsd netbsd openbsd
 | 
				
			||||||
 | 
					// +build gc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// System call support for RISCV64 BSD
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 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)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,54 @@
 | 
				
			||||||
 | 
					// Copyright 2022 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:build linux && loong64 && gc
 | 
				
			||||||
 | 
					// +build linux
 | 
				
			||||||
 | 
					// +build loong64
 | 
				
			||||||
 | 
					// +build gc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·Syscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						JMP	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·Syscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						JMP	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·SyscallNoError(SB),NOSPLIT,$0-48
 | 
				
			||||||
 | 
						JAL	runtime·entersyscall(SB)
 | 
				
			||||||
 | 
						MOVV	a1+8(FP), R4
 | 
				
			||||||
 | 
						MOVV	a2+16(FP), R5
 | 
				
			||||||
 | 
						MOVV	a3+24(FP), R6
 | 
				
			||||||
 | 
						MOVV	R0, R7
 | 
				
			||||||
 | 
						MOVV	R0, R8
 | 
				
			||||||
 | 
						MOVV	R0, R9
 | 
				
			||||||
 | 
						MOVV	trap+0(FP), R11	// syscall entry
 | 
				
			||||||
 | 
						SYSCALL
 | 
				
			||||||
 | 
						MOVV	R4, r1+32(FP)
 | 
				
			||||||
 | 
						MOVV	R0, r2+40(FP)	// r2 is not used. Always set to 0
 | 
				
			||||||
 | 
						JAL	runtime·exitsyscall(SB)
 | 
				
			||||||
 | 
						RET
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·RawSyscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48
 | 
				
			||||||
 | 
						MOVV	a1+8(FP), R4
 | 
				
			||||||
 | 
						MOVV	a2+16(FP), R5
 | 
				
			||||||
 | 
						MOVV	a3+24(FP), R6
 | 
				
			||||||
 | 
						MOVV	R0, R7
 | 
				
			||||||
 | 
						MOVV	R0, R8
 | 
				
			||||||
 | 
						MOVV	R0, R9
 | 
				
			||||||
 | 
						MOVV	trap+0(FP), R11	// syscall entry
 | 
				
			||||||
 | 
						SYSCALL
 | 
				
			||||||
 | 
						MOVV	R4, r1+32(FP)
 | 
				
			||||||
 | 
						MOVV	R0, r2+40(FP)	// r2 is not used. Always set to 0
 | 
				
			||||||
 | 
						RET
 | 
				
			||||||
| 
						 | 
					@ -2,8 +2,8 @@
 | 
				
			||||||
// 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
 | 
					//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos
 | 
				
			||||||
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
 | 
					// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package unix
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,8 +2,8 @@
 | 
				
			||||||
// 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.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
//go:build 386 || amd64 || amd64p32 || alpha || arm || arm64 || mipsle || mips64le || mips64p32le || nios2 || ppc64le || riscv || riscv64 || sh
 | 
					//go:build 386 || amd64 || amd64p32 || alpha || arm || arm64 || loong64 || mipsle || mips64le || mips64p32le || nios2 || ppc64le || riscv || riscv64 || sh
 | 
				
			||||||
// +build 386 amd64 amd64p32 alpha arm arm64 mipsle mips64le mips64p32le nios2 ppc64le riscv riscv64 sh
 | 
					// +build 386 amd64 amd64p32 alpha arm arm64 loong64 mipsle mips64le mips64p32le nios2 ppc64le riscv riscv64 sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package unix
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,233 +0,0 @@
 | 
				
			||||||
// Copyright 2017 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep
 | 
					 | 
				
			||||||
// them here for backwards compatibility.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package unix
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	DLT_HHDLC                         = 0x79
 | 
					 | 
				
			||||||
	IFF_SMART                         = 0x20
 | 
					 | 
				
			||||||
	IFT_1822                          = 0x2
 | 
					 | 
				
			||||||
	IFT_A12MPPSWITCH                  = 0x82
 | 
					 | 
				
			||||||
	IFT_AAL2                          = 0xbb
 | 
					 | 
				
			||||||
	IFT_AAL5                          = 0x31
 | 
					 | 
				
			||||||
	IFT_ADSL                          = 0x5e
 | 
					 | 
				
			||||||
	IFT_AFLANE8023                    = 0x3b
 | 
					 | 
				
			||||||
	IFT_AFLANE8025                    = 0x3c
 | 
					 | 
				
			||||||
	IFT_ARAP                          = 0x58
 | 
					 | 
				
			||||||
	IFT_ARCNET                        = 0x23
 | 
					 | 
				
			||||||
	IFT_ARCNETPLUS                    = 0x24
 | 
					 | 
				
			||||||
	IFT_ASYNC                         = 0x54
 | 
					 | 
				
			||||||
	IFT_ATM                           = 0x25
 | 
					 | 
				
			||||||
	IFT_ATMDXI                        = 0x69
 | 
					 | 
				
			||||||
	IFT_ATMFUNI                       = 0x6a
 | 
					 | 
				
			||||||
	IFT_ATMIMA                        = 0x6b
 | 
					 | 
				
			||||||
	IFT_ATMLOGICAL                    = 0x50
 | 
					 | 
				
			||||||
	IFT_ATMRADIO                      = 0xbd
 | 
					 | 
				
			||||||
	IFT_ATMSUBINTERFACE               = 0x86
 | 
					 | 
				
			||||||
	IFT_ATMVCIENDPT                   = 0xc2
 | 
					 | 
				
			||||||
	IFT_ATMVIRTUAL                    = 0x95
 | 
					 | 
				
			||||||
	IFT_BGPPOLICYACCOUNTING           = 0xa2
 | 
					 | 
				
			||||||
	IFT_BSC                           = 0x53
 | 
					 | 
				
			||||||
	IFT_CCTEMUL                       = 0x3d
 | 
					 | 
				
			||||||
	IFT_CEPT                          = 0x13
 | 
					 | 
				
			||||||
	IFT_CES                           = 0x85
 | 
					 | 
				
			||||||
	IFT_CHANNEL                       = 0x46
 | 
					 | 
				
			||||||
	IFT_CNR                           = 0x55
 | 
					 | 
				
			||||||
	IFT_COFFEE                        = 0x84
 | 
					 | 
				
			||||||
	IFT_COMPOSITELINK                 = 0x9b
 | 
					 | 
				
			||||||
	IFT_DCN                           = 0x8d
 | 
					 | 
				
			||||||
	IFT_DIGITALPOWERLINE              = 0x8a
 | 
					 | 
				
			||||||
	IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba
 | 
					 | 
				
			||||||
	IFT_DLSW                          = 0x4a
 | 
					 | 
				
			||||||
	IFT_DOCSCABLEDOWNSTREAM           = 0x80
 | 
					 | 
				
			||||||
	IFT_DOCSCABLEMACLAYER             = 0x7f
 | 
					 | 
				
			||||||
	IFT_DOCSCABLEUPSTREAM             = 0x81
 | 
					 | 
				
			||||||
	IFT_DS0                           = 0x51
 | 
					 | 
				
			||||||
	IFT_DS0BUNDLE                     = 0x52
 | 
					 | 
				
			||||||
	IFT_DS1FDL                        = 0xaa
 | 
					 | 
				
			||||||
	IFT_DS3                           = 0x1e
 | 
					 | 
				
			||||||
	IFT_DTM                           = 0x8c
 | 
					 | 
				
			||||||
	IFT_DVBASILN                      = 0xac
 | 
					 | 
				
			||||||
	IFT_DVBASIOUT                     = 0xad
 | 
					 | 
				
			||||||
	IFT_DVBRCCDOWNSTREAM              = 0x93
 | 
					 | 
				
			||||||
	IFT_DVBRCCMACLAYER                = 0x92
 | 
					 | 
				
			||||||
	IFT_DVBRCCUPSTREAM                = 0x94
 | 
					 | 
				
			||||||
	IFT_ENC                           = 0xf4
 | 
					 | 
				
			||||||
	IFT_EON                           = 0x19
 | 
					 | 
				
			||||||
	IFT_EPLRS                         = 0x57
 | 
					 | 
				
			||||||
	IFT_ESCON                         = 0x49
 | 
					 | 
				
			||||||
	IFT_ETHER                         = 0x6
 | 
					 | 
				
			||||||
	IFT_FAITH                         = 0xf2
 | 
					 | 
				
			||||||
	IFT_FAST                          = 0x7d
 | 
					 | 
				
			||||||
	IFT_FASTETHER                     = 0x3e
 | 
					 | 
				
			||||||
	IFT_FASTETHERFX                   = 0x45
 | 
					 | 
				
			||||||
	IFT_FDDI                          = 0xf
 | 
					 | 
				
			||||||
	IFT_FIBRECHANNEL                  = 0x38
 | 
					 | 
				
			||||||
	IFT_FRAMERELAYINTERCONNECT        = 0x3a
 | 
					 | 
				
			||||||
	IFT_FRAMERELAYMPI                 = 0x5c
 | 
					 | 
				
			||||||
	IFT_FRDLCIENDPT                   = 0xc1
 | 
					 | 
				
			||||||
	IFT_FRELAY                        = 0x20
 | 
					 | 
				
			||||||
	IFT_FRELAYDCE                     = 0x2c
 | 
					 | 
				
			||||||
	IFT_FRF16MFRBUNDLE                = 0xa3
 | 
					 | 
				
			||||||
	IFT_FRFORWARD                     = 0x9e
 | 
					 | 
				
			||||||
	IFT_G703AT2MB                     = 0x43
 | 
					 | 
				
			||||||
	IFT_G703AT64K                     = 0x42
 | 
					 | 
				
			||||||
	IFT_GIF                           = 0xf0
 | 
					 | 
				
			||||||
	IFT_GIGABITETHERNET               = 0x75
 | 
					 | 
				
			||||||
	IFT_GR303IDT                      = 0xb2
 | 
					 | 
				
			||||||
	IFT_GR303RDT                      = 0xb1
 | 
					 | 
				
			||||||
	IFT_H323GATEKEEPER                = 0xa4
 | 
					 | 
				
			||||||
	IFT_H323PROXY                     = 0xa5
 | 
					 | 
				
			||||||
	IFT_HDH1822                       = 0x3
 | 
					 | 
				
			||||||
	IFT_HDLC                          = 0x76
 | 
					 | 
				
			||||||
	IFT_HDSL2                         = 0xa8
 | 
					 | 
				
			||||||
	IFT_HIPERLAN2                     = 0xb7
 | 
					 | 
				
			||||||
	IFT_HIPPI                         = 0x2f
 | 
					 | 
				
			||||||
	IFT_HIPPIINTERFACE                = 0x39
 | 
					 | 
				
			||||||
	IFT_HOSTPAD                       = 0x5a
 | 
					 | 
				
			||||||
	IFT_HSSI                          = 0x2e
 | 
					 | 
				
			||||||
	IFT_HY                            = 0xe
 | 
					 | 
				
			||||||
	IFT_IBM370PARCHAN                 = 0x48
 | 
					 | 
				
			||||||
	IFT_IDSL                          = 0x9a
 | 
					 | 
				
			||||||
	IFT_IEEE80211                     = 0x47
 | 
					 | 
				
			||||||
	IFT_IEEE80212                     = 0x37
 | 
					 | 
				
			||||||
	IFT_IEEE8023ADLAG                 = 0xa1
 | 
					 | 
				
			||||||
	IFT_IFGSN                         = 0x91
 | 
					 | 
				
			||||||
	IFT_IMT                           = 0xbe
 | 
					 | 
				
			||||||
	IFT_INTERLEAVE                    = 0x7c
 | 
					 | 
				
			||||||
	IFT_IP                            = 0x7e
 | 
					 | 
				
			||||||
	IFT_IPFORWARD                     = 0x8e
 | 
					 | 
				
			||||||
	IFT_IPOVERATM                     = 0x72
 | 
					 | 
				
			||||||
	IFT_IPOVERCDLC                    = 0x6d
 | 
					 | 
				
			||||||
	IFT_IPOVERCLAW                    = 0x6e
 | 
					 | 
				
			||||||
	IFT_IPSWITCH                      = 0x4e
 | 
					 | 
				
			||||||
	IFT_IPXIP                         = 0xf9
 | 
					 | 
				
			||||||
	IFT_ISDN                          = 0x3f
 | 
					 | 
				
			||||||
	IFT_ISDNBASIC                     = 0x14
 | 
					 | 
				
			||||||
	IFT_ISDNPRIMARY                   = 0x15
 | 
					 | 
				
			||||||
	IFT_ISDNS                         = 0x4b
 | 
					 | 
				
			||||||
	IFT_ISDNU                         = 0x4c
 | 
					 | 
				
			||||||
	IFT_ISO88022LLC                   = 0x29
 | 
					 | 
				
			||||||
	IFT_ISO88023                      = 0x7
 | 
					 | 
				
			||||||
	IFT_ISO88024                      = 0x8
 | 
					 | 
				
			||||||
	IFT_ISO88025                      = 0x9
 | 
					 | 
				
			||||||
	IFT_ISO88025CRFPINT               = 0x62
 | 
					 | 
				
			||||||
	IFT_ISO88025DTR                   = 0x56
 | 
					 | 
				
			||||||
	IFT_ISO88025FIBER                 = 0x73
 | 
					 | 
				
			||||||
	IFT_ISO88026                      = 0xa
 | 
					 | 
				
			||||||
	IFT_ISUP                          = 0xb3
 | 
					 | 
				
			||||||
	IFT_L3IPXVLAN                     = 0x89
 | 
					 | 
				
			||||||
	IFT_LAPB                          = 0x10
 | 
					 | 
				
			||||||
	IFT_LAPD                          = 0x4d
 | 
					 | 
				
			||||||
	IFT_LAPF                          = 0x77
 | 
					 | 
				
			||||||
	IFT_LOCALTALK                     = 0x2a
 | 
					 | 
				
			||||||
	IFT_LOOP                          = 0x18
 | 
					 | 
				
			||||||
	IFT_MEDIAMAILOVERIP               = 0x8b
 | 
					 | 
				
			||||||
	IFT_MFSIGLINK                     = 0xa7
 | 
					 | 
				
			||||||
	IFT_MIOX25                        = 0x26
 | 
					 | 
				
			||||||
	IFT_MODEM                         = 0x30
 | 
					 | 
				
			||||||
	IFT_MPC                           = 0x71
 | 
					 | 
				
			||||||
	IFT_MPLS                          = 0xa6
 | 
					 | 
				
			||||||
	IFT_MPLSTUNNEL                    = 0x96
 | 
					 | 
				
			||||||
	IFT_MSDSL                         = 0x8f
 | 
					 | 
				
			||||||
	IFT_MVL                           = 0xbf
 | 
					 | 
				
			||||||
	IFT_MYRINET                       = 0x63
 | 
					 | 
				
			||||||
	IFT_NFAS                          = 0xaf
 | 
					 | 
				
			||||||
	IFT_NSIP                          = 0x1b
 | 
					 | 
				
			||||||
	IFT_OPTICALCHANNEL                = 0xc3
 | 
					 | 
				
			||||||
	IFT_OPTICALTRANSPORT              = 0xc4
 | 
					 | 
				
			||||||
	IFT_OTHER                         = 0x1
 | 
					 | 
				
			||||||
	IFT_P10                           = 0xc
 | 
					 | 
				
			||||||
	IFT_P80                           = 0xd
 | 
					 | 
				
			||||||
	IFT_PARA                          = 0x22
 | 
					 | 
				
			||||||
	IFT_PFLOG                         = 0xf6
 | 
					 | 
				
			||||||
	IFT_PFSYNC                        = 0xf7
 | 
					 | 
				
			||||||
	IFT_PLC                           = 0xae
 | 
					 | 
				
			||||||
	IFT_POS                           = 0xab
 | 
					 | 
				
			||||||
	IFT_PPPMULTILINKBUNDLE            = 0x6c
 | 
					 | 
				
			||||||
	IFT_PROPBWAP2MP                   = 0xb8
 | 
					 | 
				
			||||||
	IFT_PROPCNLS                      = 0x59
 | 
					 | 
				
			||||||
	IFT_PROPDOCSWIRELESSDOWNSTREAM    = 0xb5
 | 
					 | 
				
			||||||
	IFT_PROPDOCSWIRELESSMACLAYER      = 0xb4
 | 
					 | 
				
			||||||
	IFT_PROPDOCSWIRELESSUPSTREAM      = 0xb6
 | 
					 | 
				
			||||||
	IFT_PROPMUX                       = 0x36
 | 
					 | 
				
			||||||
	IFT_PROPWIRELESSP2P               = 0x9d
 | 
					 | 
				
			||||||
	IFT_PTPSERIAL                     = 0x16
 | 
					 | 
				
			||||||
	IFT_PVC                           = 0xf1
 | 
					 | 
				
			||||||
	IFT_QLLC                          = 0x44
 | 
					 | 
				
			||||||
	IFT_RADIOMAC                      = 0xbc
 | 
					 | 
				
			||||||
	IFT_RADSL                         = 0x5f
 | 
					 | 
				
			||||||
	IFT_REACHDSL                      = 0xc0
 | 
					 | 
				
			||||||
	IFT_RFC1483                       = 0x9f
 | 
					 | 
				
			||||||
	IFT_RS232                         = 0x21
 | 
					 | 
				
			||||||
	IFT_RSRB                          = 0x4f
 | 
					 | 
				
			||||||
	IFT_SDLC                          = 0x11
 | 
					 | 
				
			||||||
	IFT_SDSL                          = 0x60
 | 
					 | 
				
			||||||
	IFT_SHDSL                         = 0xa9
 | 
					 | 
				
			||||||
	IFT_SIP                           = 0x1f
 | 
					 | 
				
			||||||
	IFT_SLIP                          = 0x1c
 | 
					 | 
				
			||||||
	IFT_SMDSDXI                       = 0x2b
 | 
					 | 
				
			||||||
	IFT_SMDSICIP                      = 0x34
 | 
					 | 
				
			||||||
	IFT_SONET                         = 0x27
 | 
					 | 
				
			||||||
	IFT_SONETOVERHEADCHANNEL          = 0xb9
 | 
					 | 
				
			||||||
	IFT_SONETPATH                     = 0x32
 | 
					 | 
				
			||||||
	IFT_SONETVT                       = 0x33
 | 
					 | 
				
			||||||
	IFT_SRP                           = 0x97
 | 
					 | 
				
			||||||
	IFT_SS7SIGLINK                    = 0x9c
 | 
					 | 
				
			||||||
	IFT_STACKTOSTACK                  = 0x6f
 | 
					 | 
				
			||||||
	IFT_STARLAN                       = 0xb
 | 
					 | 
				
			||||||
	IFT_STF                           = 0xd7
 | 
					 | 
				
			||||||
	IFT_T1                            = 0x12
 | 
					 | 
				
			||||||
	IFT_TDLC                          = 0x74
 | 
					 | 
				
			||||||
	IFT_TERMPAD                       = 0x5b
 | 
					 | 
				
			||||||
	IFT_TR008                         = 0xb0
 | 
					 | 
				
			||||||
	IFT_TRANSPHDLC                    = 0x7b
 | 
					 | 
				
			||||||
	IFT_TUNNEL                        = 0x83
 | 
					 | 
				
			||||||
	IFT_ULTRA                         = 0x1d
 | 
					 | 
				
			||||||
	IFT_USB                           = 0xa0
 | 
					 | 
				
			||||||
	IFT_V11                           = 0x40
 | 
					 | 
				
			||||||
	IFT_V35                           = 0x2d
 | 
					 | 
				
			||||||
	IFT_V36                           = 0x41
 | 
					 | 
				
			||||||
	IFT_V37                           = 0x78
 | 
					 | 
				
			||||||
	IFT_VDSL                          = 0x61
 | 
					 | 
				
			||||||
	IFT_VIRTUALIPADDRESS              = 0x70
 | 
					 | 
				
			||||||
	IFT_VOICEEM                       = 0x64
 | 
					 | 
				
			||||||
	IFT_VOICEENCAP                    = 0x67
 | 
					 | 
				
			||||||
	IFT_VOICEFXO                      = 0x65
 | 
					 | 
				
			||||||
	IFT_VOICEFXS                      = 0x66
 | 
					 | 
				
			||||||
	IFT_VOICEOVERATM                  = 0x98
 | 
					 | 
				
			||||||
	IFT_VOICEOVERFRAMERELAY           = 0x99
 | 
					 | 
				
			||||||
	IFT_VOICEOVERIP                   = 0x68
 | 
					 | 
				
			||||||
	IFT_X213                          = 0x5d
 | 
					 | 
				
			||||||
	IFT_X25                           = 0x5
 | 
					 | 
				
			||||||
	IFT_X25DDN                        = 0x4
 | 
					 | 
				
			||||||
	IFT_X25HUNTGROUP                  = 0x7a
 | 
					 | 
				
			||||||
	IFT_X25MLP                        = 0x79
 | 
					 | 
				
			||||||
	IFT_X25PLE                        = 0x28
 | 
					 | 
				
			||||||
	IFT_XETHER                        = 0x1a
 | 
					 | 
				
			||||||
	IPPROTO_MAXID                     = 0x34
 | 
					 | 
				
			||||||
	IPV6_FAITH                        = 0x1d
 | 
					 | 
				
			||||||
	IPV6_MIN_MEMBERSHIPS              = 0x1f
 | 
					 | 
				
			||||||
	IP_FAITH                          = 0x16
 | 
					 | 
				
			||||||
	IP_MAX_SOURCE_FILTER              = 0x400
 | 
					 | 
				
			||||||
	IP_MIN_MEMBERSHIPS                = 0x1f
 | 
					 | 
				
			||||||
	MAP_NORESERVE                     = 0x40
 | 
					 | 
				
			||||||
	MAP_RENAME                        = 0x20
 | 
					 | 
				
			||||||
	NET_RT_MAXID                      = 0x6
 | 
					 | 
				
			||||||
	RTF_PRCLONING                     = 0x10000
 | 
					 | 
				
			||||||
	RTM_OLDADD                        = 0x9
 | 
					 | 
				
			||||||
	RTM_OLDDEL                        = 0xa
 | 
					 | 
				
			||||||
	RT_CACHING_CONTEXT                = 0x1
 | 
					 | 
				
			||||||
	RT_NORTREF                        = 0x2
 | 
					 | 
				
			||||||
	SIOCADDRT                         = 0x8030720a
 | 
					 | 
				
			||||||
	SIOCALIFADDR                      = 0x8118691b
 | 
					 | 
				
			||||||
	SIOCDELRT                         = 0x8030720b
 | 
					 | 
				
			||||||
	SIOCDLIFADDR                      = 0x8118691d
 | 
					 | 
				
			||||||
	SIOCGLIFADDR                      = 0xc118691c
 | 
					 | 
				
			||||||
	SIOCGLIFPHYADDR                   = 0xc118694b
 | 
					 | 
				
			||||||
	SIOCSLIFPHYADDR                   = 0x8118694a
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,233 +0,0 @@
 | 
				
			||||||
// Copyright 2017 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep
 | 
					 | 
				
			||||||
// them here for backwards compatibility.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package unix
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	DLT_HHDLC                         = 0x79
 | 
					 | 
				
			||||||
	IFF_SMART                         = 0x20
 | 
					 | 
				
			||||||
	IFT_1822                          = 0x2
 | 
					 | 
				
			||||||
	IFT_A12MPPSWITCH                  = 0x82
 | 
					 | 
				
			||||||
	IFT_AAL2                          = 0xbb
 | 
					 | 
				
			||||||
	IFT_AAL5                          = 0x31
 | 
					 | 
				
			||||||
	IFT_ADSL                          = 0x5e
 | 
					 | 
				
			||||||
	IFT_AFLANE8023                    = 0x3b
 | 
					 | 
				
			||||||
	IFT_AFLANE8025                    = 0x3c
 | 
					 | 
				
			||||||
	IFT_ARAP                          = 0x58
 | 
					 | 
				
			||||||
	IFT_ARCNET                        = 0x23
 | 
					 | 
				
			||||||
	IFT_ARCNETPLUS                    = 0x24
 | 
					 | 
				
			||||||
	IFT_ASYNC                         = 0x54
 | 
					 | 
				
			||||||
	IFT_ATM                           = 0x25
 | 
					 | 
				
			||||||
	IFT_ATMDXI                        = 0x69
 | 
					 | 
				
			||||||
	IFT_ATMFUNI                       = 0x6a
 | 
					 | 
				
			||||||
	IFT_ATMIMA                        = 0x6b
 | 
					 | 
				
			||||||
	IFT_ATMLOGICAL                    = 0x50
 | 
					 | 
				
			||||||
	IFT_ATMRADIO                      = 0xbd
 | 
					 | 
				
			||||||
	IFT_ATMSUBINTERFACE               = 0x86
 | 
					 | 
				
			||||||
	IFT_ATMVCIENDPT                   = 0xc2
 | 
					 | 
				
			||||||
	IFT_ATMVIRTUAL                    = 0x95
 | 
					 | 
				
			||||||
	IFT_BGPPOLICYACCOUNTING           = 0xa2
 | 
					 | 
				
			||||||
	IFT_BSC                           = 0x53
 | 
					 | 
				
			||||||
	IFT_CCTEMUL                       = 0x3d
 | 
					 | 
				
			||||||
	IFT_CEPT                          = 0x13
 | 
					 | 
				
			||||||
	IFT_CES                           = 0x85
 | 
					 | 
				
			||||||
	IFT_CHANNEL                       = 0x46
 | 
					 | 
				
			||||||
	IFT_CNR                           = 0x55
 | 
					 | 
				
			||||||
	IFT_COFFEE                        = 0x84
 | 
					 | 
				
			||||||
	IFT_COMPOSITELINK                 = 0x9b
 | 
					 | 
				
			||||||
	IFT_DCN                           = 0x8d
 | 
					 | 
				
			||||||
	IFT_DIGITALPOWERLINE              = 0x8a
 | 
					 | 
				
			||||||
	IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba
 | 
					 | 
				
			||||||
	IFT_DLSW                          = 0x4a
 | 
					 | 
				
			||||||
	IFT_DOCSCABLEDOWNSTREAM           = 0x80
 | 
					 | 
				
			||||||
	IFT_DOCSCABLEMACLAYER             = 0x7f
 | 
					 | 
				
			||||||
	IFT_DOCSCABLEUPSTREAM             = 0x81
 | 
					 | 
				
			||||||
	IFT_DS0                           = 0x51
 | 
					 | 
				
			||||||
	IFT_DS0BUNDLE                     = 0x52
 | 
					 | 
				
			||||||
	IFT_DS1FDL                        = 0xaa
 | 
					 | 
				
			||||||
	IFT_DS3                           = 0x1e
 | 
					 | 
				
			||||||
	IFT_DTM                           = 0x8c
 | 
					 | 
				
			||||||
	IFT_DVBASILN                      = 0xac
 | 
					 | 
				
			||||||
	IFT_DVBASIOUT                     = 0xad
 | 
					 | 
				
			||||||
	IFT_DVBRCCDOWNSTREAM              = 0x93
 | 
					 | 
				
			||||||
	IFT_DVBRCCMACLAYER                = 0x92
 | 
					 | 
				
			||||||
	IFT_DVBRCCUPSTREAM                = 0x94
 | 
					 | 
				
			||||||
	IFT_ENC                           = 0xf4
 | 
					 | 
				
			||||||
	IFT_EON                           = 0x19
 | 
					 | 
				
			||||||
	IFT_EPLRS                         = 0x57
 | 
					 | 
				
			||||||
	IFT_ESCON                         = 0x49
 | 
					 | 
				
			||||||
	IFT_ETHER                         = 0x6
 | 
					 | 
				
			||||||
	IFT_FAITH                         = 0xf2
 | 
					 | 
				
			||||||
	IFT_FAST                          = 0x7d
 | 
					 | 
				
			||||||
	IFT_FASTETHER                     = 0x3e
 | 
					 | 
				
			||||||
	IFT_FASTETHERFX                   = 0x45
 | 
					 | 
				
			||||||
	IFT_FDDI                          = 0xf
 | 
					 | 
				
			||||||
	IFT_FIBRECHANNEL                  = 0x38
 | 
					 | 
				
			||||||
	IFT_FRAMERELAYINTERCONNECT        = 0x3a
 | 
					 | 
				
			||||||
	IFT_FRAMERELAYMPI                 = 0x5c
 | 
					 | 
				
			||||||
	IFT_FRDLCIENDPT                   = 0xc1
 | 
					 | 
				
			||||||
	IFT_FRELAY                        = 0x20
 | 
					 | 
				
			||||||
	IFT_FRELAYDCE                     = 0x2c
 | 
					 | 
				
			||||||
	IFT_FRF16MFRBUNDLE                = 0xa3
 | 
					 | 
				
			||||||
	IFT_FRFORWARD                     = 0x9e
 | 
					 | 
				
			||||||
	IFT_G703AT2MB                     = 0x43
 | 
					 | 
				
			||||||
	IFT_G703AT64K                     = 0x42
 | 
					 | 
				
			||||||
	IFT_GIF                           = 0xf0
 | 
					 | 
				
			||||||
	IFT_GIGABITETHERNET               = 0x75
 | 
					 | 
				
			||||||
	IFT_GR303IDT                      = 0xb2
 | 
					 | 
				
			||||||
	IFT_GR303RDT                      = 0xb1
 | 
					 | 
				
			||||||
	IFT_H323GATEKEEPER                = 0xa4
 | 
					 | 
				
			||||||
	IFT_H323PROXY                     = 0xa5
 | 
					 | 
				
			||||||
	IFT_HDH1822                       = 0x3
 | 
					 | 
				
			||||||
	IFT_HDLC                          = 0x76
 | 
					 | 
				
			||||||
	IFT_HDSL2                         = 0xa8
 | 
					 | 
				
			||||||
	IFT_HIPERLAN2                     = 0xb7
 | 
					 | 
				
			||||||
	IFT_HIPPI                         = 0x2f
 | 
					 | 
				
			||||||
	IFT_HIPPIINTERFACE                = 0x39
 | 
					 | 
				
			||||||
	IFT_HOSTPAD                       = 0x5a
 | 
					 | 
				
			||||||
	IFT_HSSI                          = 0x2e
 | 
					 | 
				
			||||||
	IFT_HY                            = 0xe
 | 
					 | 
				
			||||||
	IFT_IBM370PARCHAN                 = 0x48
 | 
					 | 
				
			||||||
	IFT_IDSL                          = 0x9a
 | 
					 | 
				
			||||||
	IFT_IEEE80211                     = 0x47
 | 
					 | 
				
			||||||
	IFT_IEEE80212                     = 0x37
 | 
					 | 
				
			||||||
	IFT_IEEE8023ADLAG                 = 0xa1
 | 
					 | 
				
			||||||
	IFT_IFGSN                         = 0x91
 | 
					 | 
				
			||||||
	IFT_IMT                           = 0xbe
 | 
					 | 
				
			||||||
	IFT_INTERLEAVE                    = 0x7c
 | 
					 | 
				
			||||||
	IFT_IP                            = 0x7e
 | 
					 | 
				
			||||||
	IFT_IPFORWARD                     = 0x8e
 | 
					 | 
				
			||||||
	IFT_IPOVERATM                     = 0x72
 | 
					 | 
				
			||||||
	IFT_IPOVERCDLC                    = 0x6d
 | 
					 | 
				
			||||||
	IFT_IPOVERCLAW                    = 0x6e
 | 
					 | 
				
			||||||
	IFT_IPSWITCH                      = 0x4e
 | 
					 | 
				
			||||||
	IFT_IPXIP                         = 0xf9
 | 
					 | 
				
			||||||
	IFT_ISDN                          = 0x3f
 | 
					 | 
				
			||||||
	IFT_ISDNBASIC                     = 0x14
 | 
					 | 
				
			||||||
	IFT_ISDNPRIMARY                   = 0x15
 | 
					 | 
				
			||||||
	IFT_ISDNS                         = 0x4b
 | 
					 | 
				
			||||||
	IFT_ISDNU                         = 0x4c
 | 
					 | 
				
			||||||
	IFT_ISO88022LLC                   = 0x29
 | 
					 | 
				
			||||||
	IFT_ISO88023                      = 0x7
 | 
					 | 
				
			||||||
	IFT_ISO88024                      = 0x8
 | 
					 | 
				
			||||||
	IFT_ISO88025                      = 0x9
 | 
					 | 
				
			||||||
	IFT_ISO88025CRFPINT               = 0x62
 | 
					 | 
				
			||||||
	IFT_ISO88025DTR                   = 0x56
 | 
					 | 
				
			||||||
	IFT_ISO88025FIBER                 = 0x73
 | 
					 | 
				
			||||||
	IFT_ISO88026                      = 0xa
 | 
					 | 
				
			||||||
	IFT_ISUP                          = 0xb3
 | 
					 | 
				
			||||||
	IFT_L3IPXVLAN                     = 0x89
 | 
					 | 
				
			||||||
	IFT_LAPB                          = 0x10
 | 
					 | 
				
			||||||
	IFT_LAPD                          = 0x4d
 | 
					 | 
				
			||||||
	IFT_LAPF                          = 0x77
 | 
					 | 
				
			||||||
	IFT_LOCALTALK                     = 0x2a
 | 
					 | 
				
			||||||
	IFT_LOOP                          = 0x18
 | 
					 | 
				
			||||||
	IFT_MEDIAMAILOVERIP               = 0x8b
 | 
					 | 
				
			||||||
	IFT_MFSIGLINK                     = 0xa7
 | 
					 | 
				
			||||||
	IFT_MIOX25                        = 0x26
 | 
					 | 
				
			||||||
	IFT_MODEM                         = 0x30
 | 
					 | 
				
			||||||
	IFT_MPC                           = 0x71
 | 
					 | 
				
			||||||
	IFT_MPLS                          = 0xa6
 | 
					 | 
				
			||||||
	IFT_MPLSTUNNEL                    = 0x96
 | 
					 | 
				
			||||||
	IFT_MSDSL                         = 0x8f
 | 
					 | 
				
			||||||
	IFT_MVL                           = 0xbf
 | 
					 | 
				
			||||||
	IFT_MYRINET                       = 0x63
 | 
					 | 
				
			||||||
	IFT_NFAS                          = 0xaf
 | 
					 | 
				
			||||||
	IFT_NSIP                          = 0x1b
 | 
					 | 
				
			||||||
	IFT_OPTICALCHANNEL                = 0xc3
 | 
					 | 
				
			||||||
	IFT_OPTICALTRANSPORT              = 0xc4
 | 
					 | 
				
			||||||
	IFT_OTHER                         = 0x1
 | 
					 | 
				
			||||||
	IFT_P10                           = 0xc
 | 
					 | 
				
			||||||
	IFT_P80                           = 0xd
 | 
					 | 
				
			||||||
	IFT_PARA                          = 0x22
 | 
					 | 
				
			||||||
	IFT_PFLOG                         = 0xf6
 | 
					 | 
				
			||||||
	IFT_PFSYNC                        = 0xf7
 | 
					 | 
				
			||||||
	IFT_PLC                           = 0xae
 | 
					 | 
				
			||||||
	IFT_POS                           = 0xab
 | 
					 | 
				
			||||||
	IFT_PPPMULTILINKBUNDLE            = 0x6c
 | 
					 | 
				
			||||||
	IFT_PROPBWAP2MP                   = 0xb8
 | 
					 | 
				
			||||||
	IFT_PROPCNLS                      = 0x59
 | 
					 | 
				
			||||||
	IFT_PROPDOCSWIRELESSDOWNSTREAM    = 0xb5
 | 
					 | 
				
			||||||
	IFT_PROPDOCSWIRELESSMACLAYER      = 0xb4
 | 
					 | 
				
			||||||
	IFT_PROPDOCSWIRELESSUPSTREAM      = 0xb6
 | 
					 | 
				
			||||||
	IFT_PROPMUX                       = 0x36
 | 
					 | 
				
			||||||
	IFT_PROPWIRELESSP2P               = 0x9d
 | 
					 | 
				
			||||||
	IFT_PTPSERIAL                     = 0x16
 | 
					 | 
				
			||||||
	IFT_PVC                           = 0xf1
 | 
					 | 
				
			||||||
	IFT_QLLC                          = 0x44
 | 
					 | 
				
			||||||
	IFT_RADIOMAC                      = 0xbc
 | 
					 | 
				
			||||||
	IFT_RADSL                         = 0x5f
 | 
					 | 
				
			||||||
	IFT_REACHDSL                      = 0xc0
 | 
					 | 
				
			||||||
	IFT_RFC1483                       = 0x9f
 | 
					 | 
				
			||||||
	IFT_RS232                         = 0x21
 | 
					 | 
				
			||||||
	IFT_RSRB                          = 0x4f
 | 
					 | 
				
			||||||
	IFT_SDLC                          = 0x11
 | 
					 | 
				
			||||||
	IFT_SDSL                          = 0x60
 | 
					 | 
				
			||||||
	IFT_SHDSL                         = 0xa9
 | 
					 | 
				
			||||||
	IFT_SIP                           = 0x1f
 | 
					 | 
				
			||||||
	IFT_SLIP                          = 0x1c
 | 
					 | 
				
			||||||
	IFT_SMDSDXI                       = 0x2b
 | 
					 | 
				
			||||||
	IFT_SMDSICIP                      = 0x34
 | 
					 | 
				
			||||||
	IFT_SONET                         = 0x27
 | 
					 | 
				
			||||||
	IFT_SONETOVERHEADCHANNEL          = 0xb9
 | 
					 | 
				
			||||||
	IFT_SONETPATH                     = 0x32
 | 
					 | 
				
			||||||
	IFT_SONETVT                       = 0x33
 | 
					 | 
				
			||||||
	IFT_SRP                           = 0x97
 | 
					 | 
				
			||||||
	IFT_SS7SIGLINK                    = 0x9c
 | 
					 | 
				
			||||||
	IFT_STACKTOSTACK                  = 0x6f
 | 
					 | 
				
			||||||
	IFT_STARLAN                       = 0xb
 | 
					 | 
				
			||||||
	IFT_STF                           = 0xd7
 | 
					 | 
				
			||||||
	IFT_T1                            = 0x12
 | 
					 | 
				
			||||||
	IFT_TDLC                          = 0x74
 | 
					 | 
				
			||||||
	IFT_TERMPAD                       = 0x5b
 | 
					 | 
				
			||||||
	IFT_TR008                         = 0xb0
 | 
					 | 
				
			||||||
	IFT_TRANSPHDLC                    = 0x7b
 | 
					 | 
				
			||||||
	IFT_TUNNEL                        = 0x83
 | 
					 | 
				
			||||||
	IFT_ULTRA                         = 0x1d
 | 
					 | 
				
			||||||
	IFT_USB                           = 0xa0
 | 
					 | 
				
			||||||
	IFT_V11                           = 0x40
 | 
					 | 
				
			||||||
	IFT_V35                           = 0x2d
 | 
					 | 
				
			||||||
	IFT_V36                           = 0x41
 | 
					 | 
				
			||||||
	IFT_V37                           = 0x78
 | 
					 | 
				
			||||||
	IFT_VDSL                          = 0x61
 | 
					 | 
				
			||||||
	IFT_VIRTUALIPADDRESS              = 0x70
 | 
					 | 
				
			||||||
	IFT_VOICEEM                       = 0x64
 | 
					 | 
				
			||||||
	IFT_VOICEENCAP                    = 0x67
 | 
					 | 
				
			||||||
	IFT_VOICEFXO                      = 0x65
 | 
					 | 
				
			||||||
	IFT_VOICEFXS                      = 0x66
 | 
					 | 
				
			||||||
	IFT_VOICEOVERATM                  = 0x98
 | 
					 | 
				
			||||||
	IFT_VOICEOVERFRAMERELAY           = 0x99
 | 
					 | 
				
			||||||
	IFT_VOICEOVERIP                   = 0x68
 | 
					 | 
				
			||||||
	IFT_X213                          = 0x5d
 | 
					 | 
				
			||||||
	IFT_X25                           = 0x5
 | 
					 | 
				
			||||||
	IFT_X25DDN                        = 0x4
 | 
					 | 
				
			||||||
	IFT_X25HUNTGROUP                  = 0x7a
 | 
					 | 
				
			||||||
	IFT_X25MLP                        = 0x79
 | 
					 | 
				
			||||||
	IFT_X25PLE                        = 0x28
 | 
					 | 
				
			||||||
	IFT_XETHER                        = 0x1a
 | 
					 | 
				
			||||||
	IPPROTO_MAXID                     = 0x34
 | 
					 | 
				
			||||||
	IPV6_FAITH                        = 0x1d
 | 
					 | 
				
			||||||
	IPV6_MIN_MEMBERSHIPS              = 0x1f
 | 
					 | 
				
			||||||
	IP_FAITH                          = 0x16
 | 
					 | 
				
			||||||
	IP_MAX_SOURCE_FILTER              = 0x400
 | 
					 | 
				
			||||||
	IP_MIN_MEMBERSHIPS                = 0x1f
 | 
					 | 
				
			||||||
	MAP_NORESERVE                     = 0x40
 | 
					 | 
				
			||||||
	MAP_RENAME                        = 0x20
 | 
					 | 
				
			||||||
	NET_RT_MAXID                      = 0x6
 | 
					 | 
				
			||||||
	RTF_PRCLONING                     = 0x10000
 | 
					 | 
				
			||||||
	RTM_OLDADD                        = 0x9
 | 
					 | 
				
			||||||
	RTM_OLDDEL                        = 0xa
 | 
					 | 
				
			||||||
	RT_CACHING_CONTEXT                = 0x1
 | 
					 | 
				
			||||||
	RT_NORTREF                        = 0x2
 | 
					 | 
				
			||||||
	SIOCADDRT                         = 0x8040720a
 | 
					 | 
				
			||||||
	SIOCALIFADDR                      = 0x8118691b
 | 
					 | 
				
			||||||
	SIOCDELRT                         = 0x8040720b
 | 
					 | 
				
			||||||
	SIOCDLIFADDR                      = 0x8118691d
 | 
					 | 
				
			||||||
	SIOCGLIFADDR                      = 0xc118691c
 | 
					 | 
				
			||||||
	SIOCGLIFPHYADDR                   = 0xc118694b
 | 
					 | 
				
			||||||
	SIOCSLIFPHYADDR                   = 0x8118694a
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,226 +0,0 @@
 | 
				
			||||||
// Copyright 2017 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package unix
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	IFT_1822                          = 0x2
 | 
					 | 
				
			||||||
	IFT_A12MPPSWITCH                  = 0x82
 | 
					 | 
				
			||||||
	IFT_AAL2                          = 0xbb
 | 
					 | 
				
			||||||
	IFT_AAL5                          = 0x31
 | 
					 | 
				
			||||||
	IFT_ADSL                          = 0x5e
 | 
					 | 
				
			||||||
	IFT_AFLANE8023                    = 0x3b
 | 
					 | 
				
			||||||
	IFT_AFLANE8025                    = 0x3c
 | 
					 | 
				
			||||||
	IFT_ARAP                          = 0x58
 | 
					 | 
				
			||||||
	IFT_ARCNET                        = 0x23
 | 
					 | 
				
			||||||
	IFT_ARCNETPLUS                    = 0x24
 | 
					 | 
				
			||||||
	IFT_ASYNC                         = 0x54
 | 
					 | 
				
			||||||
	IFT_ATM                           = 0x25
 | 
					 | 
				
			||||||
	IFT_ATMDXI                        = 0x69
 | 
					 | 
				
			||||||
	IFT_ATMFUNI                       = 0x6a
 | 
					 | 
				
			||||||
	IFT_ATMIMA                        = 0x6b
 | 
					 | 
				
			||||||
	IFT_ATMLOGICAL                    = 0x50
 | 
					 | 
				
			||||||
	IFT_ATMRADIO                      = 0xbd
 | 
					 | 
				
			||||||
	IFT_ATMSUBINTERFACE               = 0x86
 | 
					 | 
				
			||||||
	IFT_ATMVCIENDPT                   = 0xc2
 | 
					 | 
				
			||||||
	IFT_ATMVIRTUAL                    = 0x95
 | 
					 | 
				
			||||||
	IFT_BGPPOLICYACCOUNTING           = 0xa2
 | 
					 | 
				
			||||||
	IFT_BSC                           = 0x53
 | 
					 | 
				
			||||||
	IFT_CCTEMUL                       = 0x3d
 | 
					 | 
				
			||||||
	IFT_CEPT                          = 0x13
 | 
					 | 
				
			||||||
	IFT_CES                           = 0x85
 | 
					 | 
				
			||||||
	IFT_CHANNEL                       = 0x46
 | 
					 | 
				
			||||||
	IFT_CNR                           = 0x55
 | 
					 | 
				
			||||||
	IFT_COFFEE                        = 0x84
 | 
					 | 
				
			||||||
	IFT_COMPOSITELINK                 = 0x9b
 | 
					 | 
				
			||||||
	IFT_DCN                           = 0x8d
 | 
					 | 
				
			||||||
	IFT_DIGITALPOWERLINE              = 0x8a
 | 
					 | 
				
			||||||
	IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba
 | 
					 | 
				
			||||||
	IFT_DLSW                          = 0x4a
 | 
					 | 
				
			||||||
	IFT_DOCSCABLEDOWNSTREAM           = 0x80
 | 
					 | 
				
			||||||
	IFT_DOCSCABLEMACLAYER             = 0x7f
 | 
					 | 
				
			||||||
	IFT_DOCSCABLEUPSTREAM             = 0x81
 | 
					 | 
				
			||||||
	IFT_DS0                           = 0x51
 | 
					 | 
				
			||||||
	IFT_DS0BUNDLE                     = 0x52
 | 
					 | 
				
			||||||
	IFT_DS1FDL                        = 0xaa
 | 
					 | 
				
			||||||
	IFT_DS3                           = 0x1e
 | 
					 | 
				
			||||||
	IFT_DTM                           = 0x8c
 | 
					 | 
				
			||||||
	IFT_DVBASILN                      = 0xac
 | 
					 | 
				
			||||||
	IFT_DVBASIOUT                     = 0xad
 | 
					 | 
				
			||||||
	IFT_DVBRCCDOWNSTREAM              = 0x93
 | 
					 | 
				
			||||||
	IFT_DVBRCCMACLAYER                = 0x92
 | 
					 | 
				
			||||||
	IFT_DVBRCCUPSTREAM                = 0x94
 | 
					 | 
				
			||||||
	IFT_ENC                           = 0xf4
 | 
					 | 
				
			||||||
	IFT_EON                           = 0x19
 | 
					 | 
				
			||||||
	IFT_EPLRS                         = 0x57
 | 
					 | 
				
			||||||
	IFT_ESCON                         = 0x49
 | 
					 | 
				
			||||||
	IFT_ETHER                         = 0x6
 | 
					 | 
				
			||||||
	IFT_FAST                          = 0x7d
 | 
					 | 
				
			||||||
	IFT_FASTETHER                     = 0x3e
 | 
					 | 
				
			||||||
	IFT_FASTETHERFX                   = 0x45
 | 
					 | 
				
			||||||
	IFT_FDDI                          = 0xf
 | 
					 | 
				
			||||||
	IFT_FIBRECHANNEL                  = 0x38
 | 
					 | 
				
			||||||
	IFT_FRAMERELAYINTERCONNECT        = 0x3a
 | 
					 | 
				
			||||||
	IFT_FRAMERELAYMPI                 = 0x5c
 | 
					 | 
				
			||||||
	IFT_FRDLCIENDPT                   = 0xc1
 | 
					 | 
				
			||||||
	IFT_FRELAY                        = 0x20
 | 
					 | 
				
			||||||
	IFT_FRELAYDCE                     = 0x2c
 | 
					 | 
				
			||||||
	IFT_FRF16MFRBUNDLE                = 0xa3
 | 
					 | 
				
			||||||
	IFT_FRFORWARD                     = 0x9e
 | 
					 | 
				
			||||||
	IFT_G703AT2MB                     = 0x43
 | 
					 | 
				
			||||||
	IFT_G703AT64K                     = 0x42
 | 
					 | 
				
			||||||
	IFT_GIF                           = 0xf0
 | 
					 | 
				
			||||||
	IFT_GIGABITETHERNET               = 0x75
 | 
					 | 
				
			||||||
	IFT_GR303IDT                      = 0xb2
 | 
					 | 
				
			||||||
	IFT_GR303RDT                      = 0xb1
 | 
					 | 
				
			||||||
	IFT_H323GATEKEEPER                = 0xa4
 | 
					 | 
				
			||||||
	IFT_H323PROXY                     = 0xa5
 | 
					 | 
				
			||||||
	IFT_HDH1822                       = 0x3
 | 
					 | 
				
			||||||
	IFT_HDLC                          = 0x76
 | 
					 | 
				
			||||||
	IFT_HDSL2                         = 0xa8
 | 
					 | 
				
			||||||
	IFT_HIPERLAN2                     = 0xb7
 | 
					 | 
				
			||||||
	IFT_HIPPI                         = 0x2f
 | 
					 | 
				
			||||||
	IFT_HIPPIINTERFACE                = 0x39
 | 
					 | 
				
			||||||
	IFT_HOSTPAD                       = 0x5a
 | 
					 | 
				
			||||||
	IFT_HSSI                          = 0x2e
 | 
					 | 
				
			||||||
	IFT_HY                            = 0xe
 | 
					 | 
				
			||||||
	IFT_IBM370PARCHAN                 = 0x48
 | 
					 | 
				
			||||||
	IFT_IDSL                          = 0x9a
 | 
					 | 
				
			||||||
	IFT_IEEE80211                     = 0x47
 | 
					 | 
				
			||||||
	IFT_IEEE80212                     = 0x37
 | 
					 | 
				
			||||||
	IFT_IEEE8023ADLAG                 = 0xa1
 | 
					 | 
				
			||||||
	IFT_IFGSN                         = 0x91
 | 
					 | 
				
			||||||
	IFT_IMT                           = 0xbe
 | 
					 | 
				
			||||||
	IFT_INTERLEAVE                    = 0x7c
 | 
					 | 
				
			||||||
	IFT_IP                            = 0x7e
 | 
					 | 
				
			||||||
	IFT_IPFORWARD                     = 0x8e
 | 
					 | 
				
			||||||
	IFT_IPOVERATM                     = 0x72
 | 
					 | 
				
			||||||
	IFT_IPOVERCDLC                    = 0x6d
 | 
					 | 
				
			||||||
	IFT_IPOVERCLAW                    = 0x6e
 | 
					 | 
				
			||||||
	IFT_IPSWITCH                      = 0x4e
 | 
					 | 
				
			||||||
	IFT_ISDN                          = 0x3f
 | 
					 | 
				
			||||||
	IFT_ISDNBASIC                     = 0x14
 | 
					 | 
				
			||||||
	IFT_ISDNPRIMARY                   = 0x15
 | 
					 | 
				
			||||||
	IFT_ISDNS                         = 0x4b
 | 
					 | 
				
			||||||
	IFT_ISDNU                         = 0x4c
 | 
					 | 
				
			||||||
	IFT_ISO88022LLC                   = 0x29
 | 
					 | 
				
			||||||
	IFT_ISO88023                      = 0x7
 | 
					 | 
				
			||||||
	IFT_ISO88024                      = 0x8
 | 
					 | 
				
			||||||
	IFT_ISO88025                      = 0x9
 | 
					 | 
				
			||||||
	IFT_ISO88025CRFPINT               = 0x62
 | 
					 | 
				
			||||||
	IFT_ISO88025DTR                   = 0x56
 | 
					 | 
				
			||||||
	IFT_ISO88025FIBER                 = 0x73
 | 
					 | 
				
			||||||
	IFT_ISO88026                      = 0xa
 | 
					 | 
				
			||||||
	IFT_ISUP                          = 0xb3
 | 
					 | 
				
			||||||
	IFT_L3IPXVLAN                     = 0x89
 | 
					 | 
				
			||||||
	IFT_LAPB                          = 0x10
 | 
					 | 
				
			||||||
	IFT_LAPD                          = 0x4d
 | 
					 | 
				
			||||||
	IFT_LAPF                          = 0x77
 | 
					 | 
				
			||||||
	IFT_LOCALTALK                     = 0x2a
 | 
					 | 
				
			||||||
	IFT_LOOP                          = 0x18
 | 
					 | 
				
			||||||
	IFT_MEDIAMAILOVERIP               = 0x8b
 | 
					 | 
				
			||||||
	IFT_MFSIGLINK                     = 0xa7
 | 
					 | 
				
			||||||
	IFT_MIOX25                        = 0x26
 | 
					 | 
				
			||||||
	IFT_MODEM                         = 0x30
 | 
					 | 
				
			||||||
	IFT_MPC                           = 0x71
 | 
					 | 
				
			||||||
	IFT_MPLS                          = 0xa6
 | 
					 | 
				
			||||||
	IFT_MPLSTUNNEL                    = 0x96
 | 
					 | 
				
			||||||
	IFT_MSDSL                         = 0x8f
 | 
					 | 
				
			||||||
	IFT_MVL                           = 0xbf
 | 
					 | 
				
			||||||
	IFT_MYRINET                       = 0x63
 | 
					 | 
				
			||||||
	IFT_NFAS                          = 0xaf
 | 
					 | 
				
			||||||
	IFT_NSIP                          = 0x1b
 | 
					 | 
				
			||||||
	IFT_OPTICALCHANNEL                = 0xc3
 | 
					 | 
				
			||||||
	IFT_OPTICALTRANSPORT              = 0xc4
 | 
					 | 
				
			||||||
	IFT_OTHER                         = 0x1
 | 
					 | 
				
			||||||
	IFT_P10                           = 0xc
 | 
					 | 
				
			||||||
	IFT_P80                           = 0xd
 | 
					 | 
				
			||||||
	IFT_PARA                          = 0x22
 | 
					 | 
				
			||||||
	IFT_PFLOG                         = 0xf6
 | 
					 | 
				
			||||||
	IFT_PFSYNC                        = 0xf7
 | 
					 | 
				
			||||||
	IFT_PLC                           = 0xae
 | 
					 | 
				
			||||||
	IFT_POS                           = 0xab
 | 
					 | 
				
			||||||
	IFT_PPPMULTILINKBUNDLE            = 0x6c
 | 
					 | 
				
			||||||
	IFT_PROPBWAP2MP                   = 0xb8
 | 
					 | 
				
			||||||
	IFT_PROPCNLS                      = 0x59
 | 
					 | 
				
			||||||
	IFT_PROPDOCSWIRELESSDOWNSTREAM    = 0xb5
 | 
					 | 
				
			||||||
	IFT_PROPDOCSWIRELESSMACLAYER      = 0xb4
 | 
					 | 
				
			||||||
	IFT_PROPDOCSWIRELESSUPSTREAM      = 0xb6
 | 
					 | 
				
			||||||
	IFT_PROPMUX                       = 0x36
 | 
					 | 
				
			||||||
	IFT_PROPWIRELESSP2P               = 0x9d
 | 
					 | 
				
			||||||
	IFT_PTPSERIAL                     = 0x16
 | 
					 | 
				
			||||||
	IFT_PVC                           = 0xf1
 | 
					 | 
				
			||||||
	IFT_QLLC                          = 0x44
 | 
					 | 
				
			||||||
	IFT_RADIOMAC                      = 0xbc
 | 
					 | 
				
			||||||
	IFT_RADSL                         = 0x5f
 | 
					 | 
				
			||||||
	IFT_REACHDSL                      = 0xc0
 | 
					 | 
				
			||||||
	IFT_RFC1483                       = 0x9f
 | 
					 | 
				
			||||||
	IFT_RS232                         = 0x21
 | 
					 | 
				
			||||||
	IFT_RSRB                          = 0x4f
 | 
					 | 
				
			||||||
	IFT_SDLC                          = 0x11
 | 
					 | 
				
			||||||
	IFT_SDSL                          = 0x60
 | 
					 | 
				
			||||||
	IFT_SHDSL                         = 0xa9
 | 
					 | 
				
			||||||
	IFT_SIP                           = 0x1f
 | 
					 | 
				
			||||||
	IFT_SLIP                          = 0x1c
 | 
					 | 
				
			||||||
	IFT_SMDSDXI                       = 0x2b
 | 
					 | 
				
			||||||
	IFT_SMDSICIP                      = 0x34
 | 
					 | 
				
			||||||
	IFT_SONET                         = 0x27
 | 
					 | 
				
			||||||
	IFT_SONETOVERHEADCHANNEL          = 0xb9
 | 
					 | 
				
			||||||
	IFT_SONETPATH                     = 0x32
 | 
					 | 
				
			||||||
	IFT_SONETVT                       = 0x33
 | 
					 | 
				
			||||||
	IFT_SRP                           = 0x97
 | 
					 | 
				
			||||||
	IFT_SS7SIGLINK                    = 0x9c
 | 
					 | 
				
			||||||
	IFT_STACKTOSTACK                  = 0x6f
 | 
					 | 
				
			||||||
	IFT_STARLAN                       = 0xb
 | 
					 | 
				
			||||||
	IFT_STF                           = 0xd7
 | 
					 | 
				
			||||||
	IFT_T1                            = 0x12
 | 
					 | 
				
			||||||
	IFT_TDLC                          = 0x74
 | 
					 | 
				
			||||||
	IFT_TERMPAD                       = 0x5b
 | 
					 | 
				
			||||||
	IFT_TR008                         = 0xb0
 | 
					 | 
				
			||||||
	IFT_TRANSPHDLC                    = 0x7b
 | 
					 | 
				
			||||||
	IFT_TUNNEL                        = 0x83
 | 
					 | 
				
			||||||
	IFT_ULTRA                         = 0x1d
 | 
					 | 
				
			||||||
	IFT_USB                           = 0xa0
 | 
					 | 
				
			||||||
	IFT_V11                           = 0x40
 | 
					 | 
				
			||||||
	IFT_V35                           = 0x2d
 | 
					 | 
				
			||||||
	IFT_V36                           = 0x41
 | 
					 | 
				
			||||||
	IFT_V37                           = 0x78
 | 
					 | 
				
			||||||
	IFT_VDSL                          = 0x61
 | 
					 | 
				
			||||||
	IFT_VIRTUALIPADDRESS              = 0x70
 | 
					 | 
				
			||||||
	IFT_VOICEEM                       = 0x64
 | 
					 | 
				
			||||||
	IFT_VOICEENCAP                    = 0x67
 | 
					 | 
				
			||||||
	IFT_VOICEFXO                      = 0x65
 | 
					 | 
				
			||||||
	IFT_VOICEFXS                      = 0x66
 | 
					 | 
				
			||||||
	IFT_VOICEOVERATM                  = 0x98
 | 
					 | 
				
			||||||
	IFT_VOICEOVERFRAMERELAY           = 0x99
 | 
					 | 
				
			||||||
	IFT_VOICEOVERIP                   = 0x68
 | 
					 | 
				
			||||||
	IFT_X213                          = 0x5d
 | 
					 | 
				
			||||||
	IFT_X25                           = 0x5
 | 
					 | 
				
			||||||
	IFT_X25DDN                        = 0x4
 | 
					 | 
				
			||||||
	IFT_X25HUNTGROUP                  = 0x7a
 | 
					 | 
				
			||||||
	IFT_X25MLP                        = 0x79
 | 
					 | 
				
			||||||
	IFT_X25PLE                        = 0x28
 | 
					 | 
				
			||||||
	IFT_XETHER                        = 0x1a
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// missing constants on FreeBSD-11.1-RELEASE, copied from old values in ztypes_freebsd_arm.go
 | 
					 | 
				
			||||||
	IFF_SMART       = 0x20
 | 
					 | 
				
			||||||
	IFT_FAITH       = 0xf2
 | 
					 | 
				
			||||||
	IFT_IPXIP       = 0xf9
 | 
					 | 
				
			||||||
	IPPROTO_MAXID   = 0x34
 | 
					 | 
				
			||||||
	IPV6_FAITH      = 0x1d
 | 
					 | 
				
			||||||
	IP_FAITH        = 0x16
 | 
					 | 
				
			||||||
	MAP_NORESERVE   = 0x40
 | 
					 | 
				
			||||||
	MAP_RENAME      = 0x20
 | 
					 | 
				
			||||||
	NET_RT_MAXID    = 0x6
 | 
					 | 
				
			||||||
	RTF_PRCLONING   = 0x10000
 | 
					 | 
				
			||||||
	RTM_OLDADD      = 0x9
 | 
					 | 
				
			||||||
	RTM_OLDDEL      = 0xa
 | 
					 | 
				
			||||||
	SIOCADDRT       = 0x8030720a
 | 
					 | 
				
			||||||
	SIOCALIFADDR    = 0x8118691b
 | 
					 | 
				
			||||||
	SIOCDELRT       = 0x8030720b
 | 
					 | 
				
			||||||
	SIOCDLIFADDR    = 0x8118691d
 | 
					 | 
				
			||||||
	SIOCGLIFADDR    = 0xc118691c
 | 
					 | 
				
			||||||
	SIOCGLIFPHYADDR = 0xc118694b
 | 
					 | 
				
			||||||
	SIOCSLIFPHYADDR = 0x8118694a
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,17 +0,0 @@
 | 
				
			||||||
// Copyright 2020 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep
 | 
					 | 
				
			||||||
// them here for backwards compatibility.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package unix
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	DLT_HHDLC            = 0x79
 | 
					 | 
				
			||||||
	IPV6_MIN_MEMBERSHIPS = 0x1f
 | 
					 | 
				
			||||||
	IP_MAX_SOURCE_FILTER = 0x400
 | 
					 | 
				
			||||||
	IP_MIN_MEMBERSHIPS   = 0x1f
 | 
					 | 
				
			||||||
	RT_CACHING_CONTEXT   = 0x1
 | 
					 | 
				
			||||||
	RT_NORTREF           = 0x2
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -2,8 +2,8 @@
 | 
				
			||||||
// 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//go:build gccgo && !aix
 | 
					//go:build gccgo && !aix && !hurd
 | 
				
			||||||
// +build gccgo,!aix
 | 
					// +build gccgo,!aix,!hurd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package unix
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,8 +2,8 @@
 | 
				
			||||||
// 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// +build gccgo
 | 
					// +build gccgo,!hurd
 | 
				
			||||||
// +build !aix
 | 
					// +build !aix,!hurd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <errno.h>
 | 
					#include <errno.h>
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,6 @@
 | 
				
			||||||
package unix
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"bytes"
 | 
					 | 
				
			||||||
	"unsafe"
 | 
						"unsafe"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,13 +44,7 @@ func NewIfreq(name string) (*Ifreq, error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Name returns the interface name associated with the Ifreq.
 | 
					// Name returns the interface name associated with the Ifreq.
 | 
				
			||||||
func (ifr *Ifreq) Name() string {
 | 
					func (ifr *Ifreq) Name() string {
 | 
				
			||||||
	// BytePtrToString requires a NULL terminator or the program may crash. If
 | 
						return ByteSliceToString(ifr.raw.Ifrn[:])
 | 
				
			||||||
	// one is not present, just return the empty string.
 | 
					 | 
				
			||||||
	if !bytes.Contains(ifr.raw.Ifrn[:], []byte{0x00}) {
 | 
					 | 
				
			||||||
		return ""
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return BytePtrToString(&ifr.raw.Ifrn[0])
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// According to netdevice(7), only AF_INET addresses are returned for numerous
 | 
					// According to netdevice(7), only AF_INET addresses are returned for numerous
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,8 +2,8 @@
 | 
				
			||||||
// 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
 | 
					//go:build aix || darwin || dragonfly || freebsd || hurd || linux || netbsd || openbsd || solaris
 | 
				
			||||||
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
 | 
					// +build aix darwin dragonfly freebsd hurd linux netbsd openbsd solaris
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package unix
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,9 +4,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package unix
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import "unsafe"
 | 
				
			||||||
	"unsafe"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IoctlRetInt performs an ioctl operation specified by req on a device
 | 
					// IoctlRetInt performs an ioctl operation specified by req on a device
 | 
				
			||||||
// associated with opened file descriptor fd, and returns a non-negative
 | 
					// associated with opened file descriptor fd, and returns a non-negative
 | 
				
			||||||
| 
						 | 
					@ -194,3 +192,42 @@ func ioctlIfreqData(fd int, req uint, value *ifreqData) error {
 | 
				
			||||||
	// identical so pass *IfreqData directly.
 | 
						// identical so pass *IfreqData directly.
 | 
				
			||||||
	return ioctlPtr(fd, req, unsafe.Pointer(value))
 | 
						return ioctlPtr(fd, req, unsafe.Pointer(value))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IoctlKCMClone attaches a new file descriptor to a multiplexor by cloning an
 | 
				
			||||||
 | 
					// existing KCM socket, returning a structure containing the file descriptor of
 | 
				
			||||||
 | 
					// the new socket.
 | 
				
			||||||
 | 
					func IoctlKCMClone(fd int) (*KCMClone, error) {
 | 
				
			||||||
 | 
						var info KCMClone
 | 
				
			||||||
 | 
						if err := ioctlPtr(fd, SIOCKCMCLONE, unsafe.Pointer(&info)); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &info, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IoctlKCMAttach attaches a TCP socket and associated BPF program file
 | 
				
			||||||
 | 
					// descriptor to a multiplexor.
 | 
				
			||||||
 | 
					func IoctlKCMAttach(fd int, info KCMAttach) error {
 | 
				
			||||||
 | 
						return ioctlPtr(fd, SIOCKCMATTACH, unsafe.Pointer(&info))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IoctlKCMUnattach unattaches a TCP socket file descriptor from a multiplexor.
 | 
				
			||||||
 | 
					func IoctlKCMUnattach(fd int, info KCMUnattach) error {
 | 
				
			||||||
 | 
						return ioctlPtr(fd, SIOCKCMUNATTACH, unsafe.Pointer(&info))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IoctlLoopGetStatus64 gets the status of the loop device associated with the
 | 
				
			||||||
 | 
					// file descriptor fd using the LOOP_GET_STATUS64 operation.
 | 
				
			||||||
 | 
					func IoctlLoopGetStatus64(fd int) (*LoopInfo64, error) {
 | 
				
			||||||
 | 
						var value LoopInfo64
 | 
				
			||||||
 | 
						if err := ioctlPtr(fd, LOOP_GET_STATUS64, unsafe.Pointer(&value)); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &value, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IoctlLoopSetStatus64 sets the status of the loop device associated with the
 | 
				
			||||||
 | 
					// file descriptor fd using the LOOP_SET_STATUS64 operation.
 | 
				
			||||||
 | 
					func IoctlLoopSetStatus64(fd int, value *LoopInfo64) error {
 | 
				
			||||||
 | 
						return ioctlPtr(fd, LOOP_SET_STATUS64, unsafe.Pointer(value))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -73,12 +73,12 @@ aix_ppc64)
 | 
				
			||||||
darwin_amd64)
 | 
					darwin_amd64)
 | 
				
			||||||
	mkerrors="$mkerrors -m64"
 | 
						mkerrors="$mkerrors -m64"
 | 
				
			||||||
	mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
	mkasm="go run mkasm_darwin.go"
 | 
						mkasm="go run mkasm.go"
 | 
				
			||||||
	;;
 | 
						;;
 | 
				
			||||||
darwin_arm64)
 | 
					darwin_arm64)
 | 
				
			||||||
	mkerrors="$mkerrors -m64"
 | 
						mkerrors="$mkerrors -m64"
 | 
				
			||||||
	mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
	mkasm="go run mkasm_darwin.go"
 | 
						mkasm="go run mkasm.go"
 | 
				
			||||||
	;;
 | 
						;;
 | 
				
			||||||
dragonfly_amd64)
 | 
					dragonfly_amd64)
 | 
				
			||||||
	mkerrors="$mkerrors -m64"
 | 
						mkerrors="$mkerrors -m64"
 | 
				
			||||||
| 
						 | 
					@ -89,25 +89,30 @@ dragonfly_amd64)
 | 
				
			||||||
freebsd_386)
 | 
					freebsd_386)
 | 
				
			||||||
	mkerrors="$mkerrors -m32"
 | 
						mkerrors="$mkerrors -m32"
 | 
				
			||||||
	mksyscall="go run mksyscall.go -l32"
 | 
						mksyscall="go run mksyscall.go -l32"
 | 
				
			||||||
	mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'"
 | 
						mksysnum="go run mksysnum.go 'https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12'"
 | 
				
			||||||
	mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
	;;
 | 
						;;
 | 
				
			||||||
freebsd_amd64)
 | 
					freebsd_amd64)
 | 
				
			||||||
	mkerrors="$mkerrors -m64"
 | 
						mkerrors="$mkerrors -m64"
 | 
				
			||||||
	mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'"
 | 
						mksysnum="go run mksysnum.go 'https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12'"
 | 
				
			||||||
	mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
	;;
 | 
						;;
 | 
				
			||||||
freebsd_arm)
 | 
					freebsd_arm)
 | 
				
			||||||
	mkerrors="$mkerrors"
 | 
						mkerrors="$mkerrors"
 | 
				
			||||||
	mksyscall="go run mksyscall.go -l32 -arm"
 | 
						mksyscall="go run mksyscall.go -l32 -arm"
 | 
				
			||||||
	mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'"
 | 
						mksysnum="go run mksysnum.go 'https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12'"
 | 
				
			||||||
	# Let the type of C char be signed for making the bare syscall
 | 
						# Let the type of C char be signed for making the bare syscall
 | 
				
			||||||
	# API consistent across platforms.
 | 
						# API consistent across platforms.
 | 
				
			||||||
	mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
 | 
				
			||||||
	;;
 | 
						;;
 | 
				
			||||||
freebsd_arm64)
 | 
					freebsd_arm64)
 | 
				
			||||||
	mkerrors="$mkerrors -m64"
 | 
						mkerrors="$mkerrors -m64"
 | 
				
			||||||
	mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'"
 | 
						mksysnum="go run mksysnum.go 'https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12'"
 | 
				
			||||||
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					freebsd_riscv64)
 | 
				
			||||||
 | 
						mkerrors="$mkerrors -m64"
 | 
				
			||||||
 | 
						mksysnum="go run mksysnum.go 'https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12'"
 | 
				
			||||||
	mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
 | 
				
			||||||
	;;
 | 
						;;
 | 
				
			||||||
netbsd_386)
 | 
					netbsd_386)
 | 
				
			||||||
| 
						 | 
					@ -137,42 +142,60 @@ netbsd_arm64)
 | 
				
			||||||
	mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
	;;
 | 
						;;
 | 
				
			||||||
openbsd_386)
 | 
					openbsd_386)
 | 
				
			||||||
 | 
						mkasm="go run mkasm.go"
 | 
				
			||||||
	mkerrors="$mkerrors -m32"
 | 
						mkerrors="$mkerrors -m32"
 | 
				
			||||||
	mksyscall="go run mksyscall.go -l32 -openbsd"
 | 
						mksyscall="go run mksyscall.go -l32 -openbsd -libc"
 | 
				
			||||||
	mksysctl="go run mksysctl_openbsd.go"
 | 
						mksysctl="go run mksysctl_openbsd.go"
 | 
				
			||||||
	mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'"
 | 
					 | 
				
			||||||
	mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
	;;
 | 
						;;
 | 
				
			||||||
openbsd_amd64)
 | 
					openbsd_amd64)
 | 
				
			||||||
 | 
						mkasm="go run mkasm.go"
 | 
				
			||||||
	mkerrors="$mkerrors -m64"
 | 
						mkerrors="$mkerrors -m64"
 | 
				
			||||||
	mksyscall="go run mksyscall.go -openbsd"
 | 
						mksyscall="go run mksyscall.go -openbsd -libc"
 | 
				
			||||||
	mksysctl="go run mksysctl_openbsd.go"
 | 
						mksysctl="go run mksysctl_openbsd.go"
 | 
				
			||||||
	mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'"
 | 
					 | 
				
			||||||
	mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
	;;
 | 
						;;
 | 
				
			||||||
openbsd_arm)
 | 
					openbsd_arm)
 | 
				
			||||||
 | 
						mkasm="go run mkasm.go"
 | 
				
			||||||
	mkerrors="$mkerrors"
 | 
						mkerrors="$mkerrors"
 | 
				
			||||||
	mksyscall="go run mksyscall.go -l32 -openbsd -arm"
 | 
						mksyscall="go run mksyscall.go -l32 -openbsd -arm -libc"
 | 
				
			||||||
	mksysctl="go run mksysctl_openbsd.go"
 | 
						mksysctl="go run mksysctl_openbsd.go"
 | 
				
			||||||
	mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'"
 | 
					 | 
				
			||||||
	# Let the type of C char be signed for making the bare syscall
 | 
						# Let the type of C char be signed for making the bare syscall
 | 
				
			||||||
	# API consistent across platforms.
 | 
						# API consistent across platforms.
 | 
				
			||||||
	mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
 | 
				
			||||||
	;;
 | 
						;;
 | 
				
			||||||
openbsd_arm64)
 | 
					openbsd_arm64)
 | 
				
			||||||
 | 
						mkasm="go run mkasm.go"
 | 
				
			||||||
	mkerrors="$mkerrors -m64"
 | 
						mkerrors="$mkerrors -m64"
 | 
				
			||||||
	mksyscall="go run mksyscall.go -openbsd"
 | 
						mksyscall="go run mksyscall.go -openbsd -libc"
 | 
				
			||||||
	mksysctl="go run mksysctl_openbsd.go"
 | 
						mksysctl="go run mksysctl_openbsd.go"
 | 
				
			||||||
	mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'"
 | 
					 | 
				
			||||||
	# Let the type of C char be signed for making the bare syscall
 | 
						# Let the type of C char be signed for making the bare syscall
 | 
				
			||||||
	# API consistent across platforms.
 | 
						# API consistent across platforms.
 | 
				
			||||||
	mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
 | 
				
			||||||
	;;
 | 
						;;
 | 
				
			||||||
openbsd_mips64)
 | 
					openbsd_mips64)
 | 
				
			||||||
 | 
						mkasm="go run mkasm.go"
 | 
				
			||||||
	mkerrors="$mkerrors -m64"
 | 
						mkerrors="$mkerrors -m64"
 | 
				
			||||||
	mksyscall="go run mksyscall.go -openbsd"
 | 
						mksyscall="go run mksyscall.go -openbsd -libc"
 | 
				
			||||||
 | 
						mksysctl="go run mksysctl_openbsd.go"
 | 
				
			||||||
 | 
						# Let the type of C char be signed for making the bare syscall
 | 
				
			||||||
 | 
						# API consistent across platforms.
 | 
				
			||||||
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					openbsd_ppc64)
 | 
				
			||||||
 | 
						mkasm="go run mkasm.go"
 | 
				
			||||||
 | 
						mkerrors="$mkerrors -m64"
 | 
				
			||||||
 | 
						mksyscall="go run mksyscall.go -openbsd -libc"
 | 
				
			||||||
 | 
						mksysctl="go run mksysctl_openbsd.go"
 | 
				
			||||||
 | 
						# Let the type of C char be signed for making the bare syscall
 | 
				
			||||||
 | 
						# API consistent across platforms.
 | 
				
			||||||
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					openbsd_riscv64)
 | 
				
			||||||
 | 
						mkasm="go run mkasm.go"
 | 
				
			||||||
 | 
						mkerrors="$mkerrors -m64"
 | 
				
			||||||
 | 
						mksyscall="go run mksyscall.go -openbsd -libc"
 | 
				
			||||||
	mksysctl="go run mksysctl_openbsd.go"
 | 
						mksysctl="go run mksysctl_openbsd.go"
 | 
				
			||||||
	mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'"
 | 
					 | 
				
			||||||
	# Let the type of C char be signed for making the bare syscall
 | 
						# Let the type of C char be signed for making the bare syscall
 | 
				
			||||||
	# API consistent across platforms.
 | 
						# API consistent across platforms.
 | 
				
			||||||
	mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
 | 
				
			||||||
| 
						 | 
					@ -209,11 +232,6 @@ esac
 | 
				
			||||||
			if [ "$GOOSARCH" == "aix_ppc64" ]; then
 | 
								if [ "$GOOSARCH" == "aix_ppc64" ]; then
 | 
				
			||||||
				# aix/ppc64 script generates files instead of writing to stdin.
 | 
									# aix/ppc64 script generates files instead of writing to stdin.
 | 
				
			||||||
				echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in && gofmt -w zsyscall_$GOOSARCH.go && gofmt -w zsyscall_"$GOOSARCH"_gccgo.go && gofmt -w zsyscall_"$GOOSARCH"_gc.go " ;
 | 
									echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in && gofmt -w zsyscall_$GOOSARCH.go && gofmt -w zsyscall_"$GOOSARCH"_gccgo.go && gofmt -w zsyscall_"$GOOSARCH"_gc.go " ;
 | 
				
			||||||
			elif [ "$GOOS" == "darwin" ]; then
 | 
					 | 
				
			||||||
			        # 1.12 and later, syscalls via libSystem
 | 
					 | 
				
			||||||
				echo "$mksyscall -tags $GOOS,$GOARCH,go1.12 $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go";
 | 
					 | 
				
			||||||
				# 1.13 and later, syscalls via libSystem (including syscallPtr)
 | 
					 | 
				
			||||||
				echo "$mksyscall -tags $GOOS,$GOARCH,go1.13 syscall_darwin.1_13.go |gofmt >zsyscall_$GOOSARCH.1_13.go";
 | 
					 | 
				
			||||||
			elif [ "$GOOS" == "illumos" ]; then
 | 
								elif [ "$GOOS" == "illumos" ]; then
 | 
				
			||||||
			        # illumos code generation requires a --illumos switch
 | 
								        # illumos code generation requires a --illumos switch
 | 
				
			||||||
			        echo "$mksyscall -illumos -tags illumos,$GOARCH syscall_illumos.go |gofmt > zsyscall_illumos_$GOARCH.go";
 | 
								        echo "$mksyscall -illumos -tags illumos,$GOARCH syscall_illumos.go |gofmt > zsyscall_illumos_$GOARCH.go";
 | 
				
			||||||
| 
						 | 
					@ -227,5 +245,5 @@ esac
 | 
				
			||||||
	if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi
 | 
						if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi
 | 
				
			||||||
	if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi
 | 
						if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi
 | 
				
			||||||
	if [ -n "$mktypes" ]; then echo "$mktypes types_$GOOS.go | go run mkpost.go > ztypes_$GOOSARCH.go"; fi
 | 
						if [ -n "$mktypes" ]; then echo "$mktypes types_$GOOS.go | go run mkpost.go > ztypes_$GOOSARCH.go"; fi
 | 
				
			||||||
	if [ -n "$mkasm" ]; then echo "$mkasm $GOARCH"; fi
 | 
						if [ -n "$mkasm" ]; then echo "$mkasm $GOOS $GOARCH"; fi
 | 
				
			||||||
) | $run
 | 
					) | $run
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,136 +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.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build ignore
 | 
					 | 
				
			||||||
// +build ignore
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// mkasm_darwin.go generates assembly trampolines to call libSystem routines from Go.
 | 
					 | 
				
			||||||
//This program must be run after mksyscall.go.
 | 
					 | 
				
			||||||
package main
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"bytes"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"io/ioutil"
 | 
					 | 
				
			||||||
	"log"
 | 
					 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"sort"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const ptrsize = 8 // Pointer size. All supported platforms are 64-bit.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func writeASMFile(in string, fileName string, buildTags string) map[string]bool {
 | 
					 | 
				
			||||||
	trampolines := map[string]bool{}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var out bytes.Buffer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	fmt.Fprintf(&out, "// go run mkasm_darwin.go %s\n", strings.Join(os.Args[1:], " "))
 | 
					 | 
				
			||||||
	fmt.Fprintf(&out, "// Code generated by the command above; DO NOT EDIT.\n")
 | 
					 | 
				
			||||||
	fmt.Fprintf(&out, "\n")
 | 
					 | 
				
			||||||
	fmt.Fprintf(&out, "//go:build %s\n", buildTags)
 | 
					 | 
				
			||||||
	fmt.Fprintf(&out, "// +build %s\n", buildTags)
 | 
					 | 
				
			||||||
	fmt.Fprintf(&out, "\n")
 | 
					 | 
				
			||||||
	fmt.Fprintf(&out, "#include \"textflag.h\"\n")
 | 
					 | 
				
			||||||
	for _, line := range strings.Split(in, "\n") {
 | 
					 | 
				
			||||||
		const prefix = "var "
 | 
					 | 
				
			||||||
		const suffix = "_trampoline_addr uintptr"
 | 
					 | 
				
			||||||
		if !strings.HasPrefix(line, prefix) || !strings.HasSuffix(line, suffix) {
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		fn := strings.TrimSuffix(strings.TrimPrefix(line, prefix), suffix)
 | 
					 | 
				
			||||||
		if !trampolines[fn] {
 | 
					 | 
				
			||||||
			trampolines[fn] = true
 | 
					 | 
				
			||||||
			fmt.Fprintf(&out, "\nTEXT %s_trampoline<>(SB),NOSPLIT,$0-0\n", fn)
 | 
					 | 
				
			||||||
			fmt.Fprintf(&out, "\tJMP\t%s(SB)\n\n", fn)
 | 
					 | 
				
			||||||
			fmt.Fprintf(&out, "GLOBL\t·%s_trampoline_addr(SB), RODATA, $%d\n", fn, ptrsize)
 | 
					 | 
				
			||||||
			fmt.Fprintf(&out, "DATA\t·%s_trampoline_addr(SB)/%d, $%s_trampoline<>(SB)\n", fn, ptrsize, fn)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	err := ioutil.WriteFile(fileName, out.Bytes(), 0644)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		log.Fatalf("can't write %s: %s", fileName, err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return trampolines
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const darwinTestTemplate = `// go run mkasm_darwin.go %s
 | 
					 | 
				
			||||||
// Code generated by the command above; DO NOT EDIT.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build darwin && go1.12
 | 
					 | 
				
			||||||
// +build darwin,go1.12
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package unix
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// All the _trampoline functions in zsyscall_darwin_%s.s.
 | 
					 | 
				
			||||||
var darwinTests = [...]darwinTest{
 | 
					 | 
				
			||||||
%s}
 | 
					 | 
				
			||||||
`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func writeDarwinTest(trampolines map[string]bool, fileName, arch string) {
 | 
					 | 
				
			||||||
	// sort trampolines
 | 
					 | 
				
			||||||
	sorted := make([]string, len(trampolines))
 | 
					 | 
				
			||||||
	i := 0
 | 
					 | 
				
			||||||
	for trampoline := range trampolines {
 | 
					 | 
				
			||||||
		sorted[i] = trampoline
 | 
					 | 
				
			||||||
		i++
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	sort.Slice(sorted, func(i, j int) bool { return sorted[i] < sorted[j] })
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var out bytes.Buffer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	const prefix = "libc_"
 | 
					 | 
				
			||||||
	for _, trampoline := range sorted {
 | 
					 | 
				
			||||||
		fmt.Fprintf(&out, fmt.Sprintf("\t{%q, %s_trampoline_addr},\n", strings.TrimPrefix(trampoline, prefix), trampoline))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	lines := out.String()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	out.Reset()
 | 
					 | 
				
			||||||
	fmt.Fprintf(&out, darwinTestTemplate, strings.Join(os.Args[1:], " "), arch, lines)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	err := ioutil.WriteFile(fileName, out.Bytes(), 0644)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		log.Fatalf("can't write %s: %s", fileName, err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func main() {
 | 
					 | 
				
			||||||
	in1, err := ioutil.ReadFile("syscall_darwin.go")
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		log.Fatalf("can't open syscall_darwin.go: %s", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	arch := os.Args[1]
 | 
					 | 
				
			||||||
	in2, err := ioutil.ReadFile(fmt.Sprintf("syscall_darwin_%s.go", arch))
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		log.Fatalf("can't open syscall_darwin_%s.go: %s", arch, err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	in3, err := ioutil.ReadFile(fmt.Sprintf("zsyscall_darwin_%s.go", arch))
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		log.Fatalf("can't open zsyscall_darwin_%s.go: %s", arch, err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	in := string(in1) + string(in2) + string(in3)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	trampolines := writeASMFile(in, fmt.Sprintf("zsyscall_darwin_%s.s", arch), "go1.12")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	in1, err = ioutil.ReadFile("syscall_darwin.1_13.go")
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		log.Fatalf("can't open syscall_darwin.1_13.go: %s", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	in2, err = ioutil.ReadFile(fmt.Sprintf("zsyscall_darwin_%s.1_13.go", arch))
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		log.Fatalf("can't open zsyscall_darwin_%s.1_13.go: %s", arch, err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	in = string(in1) + string(in2)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	trampolines2 := writeASMFile(in, fmt.Sprintf("zsyscall_darwin_%s.1_13.s", arch), "go1.13")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// merge trampolines
 | 
					 | 
				
			||||||
	for trampoline := range trampolines2 {
 | 
					 | 
				
			||||||
		trampolines[trampoline] = true
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	writeDarwinTest(trampolines, fmt.Sprintf("darwin_%s_test.go", arch), arch)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -128,6 +128,7 @@ includes_FreeBSD='
 | 
				
			||||||
#include <sys/mount.h>
 | 
					#include <sys/mount.h>
 | 
				
			||||||
#include <sys/wait.h>
 | 
					#include <sys/wait.h>
 | 
				
			||||||
#include <sys/ioctl.h>
 | 
					#include <sys/ioctl.h>
 | 
				
			||||||
 | 
					#include <sys/ptrace.h>
 | 
				
			||||||
#include <net/bpf.h>
 | 
					#include <net/bpf.h>
 | 
				
			||||||
#include <net/if.h>
 | 
					#include <net/if.h>
 | 
				
			||||||
#include <net/if_types.h>
 | 
					#include <net/if_types.h>
 | 
				
			||||||
| 
						 | 
					@ -202,9 +203,11 @@ struct ltchars {
 | 
				
			||||||
#include <sys/timerfd.h>
 | 
					#include <sys/timerfd.h>
 | 
				
			||||||
#include <sys/uio.h>
 | 
					#include <sys/uio.h>
 | 
				
			||||||
#include <sys/xattr.h>
 | 
					#include <sys/xattr.h>
 | 
				
			||||||
 | 
					#include <linux/audit.h>
 | 
				
			||||||
#include <linux/bpf.h>
 | 
					#include <linux/bpf.h>
 | 
				
			||||||
#include <linux/can.h>
 | 
					#include <linux/can.h>
 | 
				
			||||||
#include <linux/can/error.h>
 | 
					#include <linux/can/error.h>
 | 
				
			||||||
 | 
					#include <linux/can/netlink.h>
 | 
				
			||||||
#include <linux/can/raw.h>
 | 
					#include <linux/can/raw.h>
 | 
				
			||||||
#include <linux/capability.h>
 | 
					#include <linux/capability.h>
 | 
				
			||||||
#include <linux/cryptouser.h>
 | 
					#include <linux/cryptouser.h>
 | 
				
			||||||
| 
						 | 
					@ -214,6 +217,7 @@ struct ltchars {
 | 
				
			||||||
#include <linux/ethtool_netlink.h>
 | 
					#include <linux/ethtool_netlink.h>
 | 
				
			||||||
#include <linux/falloc.h>
 | 
					#include <linux/falloc.h>
 | 
				
			||||||
#include <linux/fanotify.h>
 | 
					#include <linux/fanotify.h>
 | 
				
			||||||
 | 
					#include <linux/fib_rules.h>
 | 
				
			||||||
#include <linux/filter.h>
 | 
					#include <linux/filter.h>
 | 
				
			||||||
#include <linux/fs.h>
 | 
					#include <linux/fs.h>
 | 
				
			||||||
#include <linux/fscrypt.h>
 | 
					#include <linux/fscrypt.h>
 | 
				
			||||||
| 
						 | 
					@ -231,6 +235,7 @@ struct ltchars {
 | 
				
			||||||
#include <linux/if_packet.h>
 | 
					#include <linux/if_packet.h>
 | 
				
			||||||
#include <linux/if_xdp.h>
 | 
					#include <linux/if_xdp.h>
 | 
				
			||||||
#include <linux/input.h>
 | 
					#include <linux/input.h>
 | 
				
			||||||
 | 
					#include <linux/kcm.h>
 | 
				
			||||||
#include <linux/kexec.h>
 | 
					#include <linux/kexec.h>
 | 
				
			||||||
#include <linux/keyctl.h>
 | 
					#include <linux/keyctl.h>
 | 
				
			||||||
#include <linux/landlock.h>
 | 
					#include <linux/landlock.h>
 | 
				
			||||||
| 
						 | 
					@ -292,6 +297,10 @@ struct ltchars {
 | 
				
			||||||
#define SOL_NETLINK	270
 | 
					#define SOL_NETLINK	270
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SOL_SMC
 | 
				
			||||||
 | 
					#define SOL_SMC 286
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef SOL_BLUETOOTH
 | 
					#ifdef SOL_BLUETOOTH
 | 
				
			||||||
// SPARC includes this in /usr/include/sparc64-linux-gnu/bits/socket.h
 | 
					// SPARC includes this in /usr/include/sparc64-linux-gnu/bits/socket.h
 | 
				
			||||||
// but it is already in bluetooth_linux.go
 | 
					// but it is already in bluetooth_linux.go
 | 
				
			||||||
| 
						 | 
					@ -503,6 +512,7 @@ ccflags="$@"
 | 
				
			||||||
		$2 ~ /^O?XTABS$/ ||
 | 
							$2 ~ /^O?XTABS$/ ||
 | 
				
			||||||
		$2 ~ /^TC[IO](ON|OFF)$/ ||
 | 
							$2 ~ /^TC[IO](ON|OFF)$/ ||
 | 
				
			||||||
		$2 ~ /^IN_/ ||
 | 
							$2 ~ /^IN_/ ||
 | 
				
			||||||
 | 
							$2 ~ /^KCM/ ||
 | 
				
			||||||
		$2 ~ /^LANDLOCK_/ ||
 | 
							$2 ~ /^LANDLOCK_/ ||
 | 
				
			||||||
		$2 ~ /^LOCK_(SH|EX|NB|UN)$/ ||
 | 
							$2 ~ /^LOCK_(SH|EX|NB|UN)$/ ||
 | 
				
			||||||
		$2 ~ /^LO_(KEY|NAME)_SIZE$/ ||
 | 
							$2 ~ /^LO_(KEY|NAME)_SIZE$/ ||
 | 
				
			||||||
| 
						 | 
					@ -525,7 +535,7 @@ ccflags="$@"
 | 
				
			||||||
		$2 ~ /^(MS|MNT|MOUNT|UMOUNT)_/ ||
 | 
							$2 ~ /^(MS|MNT|MOUNT|UMOUNT)_/ ||
 | 
				
			||||||
		$2 ~ /^NS_GET_/ ||
 | 
							$2 ~ /^NS_GET_/ ||
 | 
				
			||||||
		$2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ ||
 | 
							$2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ ||
 | 
				
			||||||
		$2 ~ /^(O|F|[ES]?FD|NAME|S|PTRACE|PT|TFD)_/ ||
 | 
							$2 ~ /^(O|F|[ES]?FD|NAME|S|PTRACE|PT|PIOD|TFD)_/ ||
 | 
				
			||||||
		$2 ~ /^KEXEC_/ ||
 | 
							$2 ~ /^KEXEC_/ ||
 | 
				
			||||||
		$2 ~ /^LINUX_REBOOT_CMD_/ ||
 | 
							$2 ~ /^LINUX_REBOOT_CMD_/ ||
 | 
				
			||||||
		$2 ~ /^LINUX_REBOOT_MAGIC[12]$/ ||
 | 
							$2 ~ /^LINUX_REBOOT_MAGIC[12]$/ ||
 | 
				
			||||||
| 
						 | 
					@ -549,6 +559,7 @@ ccflags="$@"
 | 
				
			||||||
		$2 ~ /^CLONE_[A-Z_]+/ ||
 | 
							$2 ~ /^CLONE_[A-Z_]+/ ||
 | 
				
			||||||
		$2 !~ /^(BPF_TIMEVAL|BPF_FIB_LOOKUP_[A-Z]+)$/ &&
 | 
							$2 !~ /^(BPF_TIMEVAL|BPF_FIB_LOOKUP_[A-Z]+)$/ &&
 | 
				
			||||||
		$2 ~ /^(BPF|DLT)_/ ||
 | 
							$2 ~ /^(BPF|DLT)_/ ||
 | 
				
			||||||
 | 
							$2 ~ /^AUDIT_/ ||
 | 
				
			||||||
		$2 ~ /^(CLOCK|TIMER)_/ ||
 | 
							$2 ~ /^(CLOCK|TIMER)_/ ||
 | 
				
			||||||
		$2 ~ /^CAN_/ ||
 | 
							$2 ~ /^CAN_/ ||
 | 
				
			||||||
		$2 ~ /^CAP_/ ||
 | 
							$2 ~ /^CAP_/ ||
 | 
				
			||||||
| 
						 | 
					@ -571,7 +582,6 @@ ccflags="$@"
 | 
				
			||||||
		$2 ~ /^SEEK_/ ||
 | 
							$2 ~ /^SEEK_/ ||
 | 
				
			||||||
		$2 ~ /^SPLICE_/ ||
 | 
							$2 ~ /^SPLICE_/ ||
 | 
				
			||||||
		$2 ~ /^SYNC_FILE_RANGE_/ ||
 | 
							$2 ~ /^SYNC_FILE_RANGE_/ ||
 | 
				
			||||||
		$2 !~ /^AUDIT_RECORD_MAGIC/ &&
 | 
					 | 
				
			||||||
		$2 !~ /IOC_MAGIC/ &&
 | 
							$2 !~ /IOC_MAGIC/ &&
 | 
				
			||||||
		$2 ~ /^[A-Z][A-Z0-9_]+_MAGIC2?$/ ||
 | 
							$2 ~ /^[A-Z][A-Z0-9_]+_MAGIC2?$/ ||
 | 
				
			||||||
		$2 ~ /^(VM|VMADDR)_/ ||
 | 
							$2 ~ /^(VM|VMADDR)_/ ||
 | 
				
			||||||
| 
						 | 
					@ -597,8 +607,10 @@ ccflags="$@"
 | 
				
			||||||
		$2 ~ /^DEVLINK_/ ||
 | 
							$2 ~ /^DEVLINK_/ ||
 | 
				
			||||||
		$2 ~ /^ETHTOOL_/ ||
 | 
							$2 ~ /^ETHTOOL_/ ||
 | 
				
			||||||
		$2 ~ /^LWTUNNEL_IP/ ||
 | 
							$2 ~ /^LWTUNNEL_IP/ ||
 | 
				
			||||||
 | 
							$2 ~ /^ITIMER_/ ||
 | 
				
			||||||
		$2 !~ "WMESGLEN" &&
 | 
							$2 !~ "WMESGLEN" &&
 | 
				
			||||||
		$2 ~ /^W[A-Z0-9]+$/ ||
 | 
							$2 ~ /^W[A-Z0-9]+$/ ||
 | 
				
			||||||
 | 
							$2 ~ /^P_/ ||
 | 
				
			||||||
		$2 ~/^PPPIOC/ ||
 | 
							$2 ~/^PPPIOC/ ||
 | 
				
			||||||
		$2 ~ /^FAN_|FANOTIFY_/ ||
 | 
							$2 ~ /^FAN_|FANOTIFY_/ ||
 | 
				
			||||||
		$2 == "HID_MAX_DESCRIPTOR_SIZE" ||
 | 
							$2 == "HID_MAX_DESCRIPTOR_SIZE" ||
 | 
				
			||||||
| 
						 | 
					@ -608,6 +620,7 @@ ccflags="$@"
 | 
				
			||||||
		$2 ~ /^OTP/ ||
 | 
							$2 ~ /^OTP/ ||
 | 
				
			||||||
		$2 ~ /^MEM/ ||
 | 
							$2 ~ /^MEM/ ||
 | 
				
			||||||
		$2 ~ /^WG/ ||
 | 
							$2 ~ /^WG/ ||
 | 
				
			||||||
 | 
							$2 ~ /^FIB_RULE_/ ||
 | 
				
			||||||
		$2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)}
 | 
							$2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)}
 | 
				
			||||||
		$2 ~ /^__WCOREFLAG$/ {next}
 | 
							$2 ~ /^__WCOREFLAG$/ {next}
 | 
				
			||||||
		$2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)}
 | 
							$2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)}
 | 
				
			||||||
| 
						 | 
					@ -629,7 +642,7 @@ errors=$(
 | 
				
			||||||
signals=$(
 | 
					signals=$(
 | 
				
			||||||
	echo '#include <signal.h>' | $CC -x c - -E -dM $ccflags |
 | 
						echo '#include <signal.h>' | $CC -x c - -E -dM $ccflags |
 | 
				
			||||||
	awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print $2 }' |
 | 
						awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print $2 }' |
 | 
				
			||||||
	egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT|SIGMAX64)' |
 | 
						grep -v 'SIGSTKSIZE\|SIGSTKSZ\|SIGRT\|SIGMAX64' |
 | 
				
			||||||
	sort
 | 
						sort
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -639,7 +652,7 @@ echo '#include <errno.h>' | $CC -x c - -E -dM $ccflags |
 | 
				
			||||||
	sort >_error.grep
 | 
						sort >_error.grep
 | 
				
			||||||
echo '#include <signal.h>' | $CC -x c - -E -dM $ccflags |
 | 
					echo '#include <signal.h>' | $CC -x c - -E -dM $ccflags |
 | 
				
			||||||
	awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print "^\t" $2 "[ \t]*=" }' |
 | 
						awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print "^\t" $2 "[ \t]*=" }' |
 | 
				
			||||||
	egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT|SIGMAX64)' |
 | 
						grep -v 'SIGSTKSIZE\|SIGSTKSZ\|SIGRT\|SIGMAX64' |
 | 
				
			||||||
	sort >_signal.grep
 | 
						sort >_signal.grep
 | 
				
			||||||
 | 
					
 | 
				
			||||||
echo '// mkerrors.sh' "$@"
 | 
					echo '// mkerrors.sh' "$@"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,180 +0,0 @@
 | 
				
			||||||
// Copyright 2016 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build ignore
 | 
					 | 
				
			||||||
// +build ignore
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// mkpost processes the output of cgo -godefs to
 | 
					 | 
				
			||||||
// modify the generated types. It is used to clean up
 | 
					 | 
				
			||||||
// the sys API in an architecture specific manner.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// mkpost is run after cgo -godefs; see README.md.
 | 
					 | 
				
			||||||
package main
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"bytes"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"go/format"
 | 
					 | 
				
			||||||
	"io/ioutil"
 | 
					 | 
				
			||||||
	"log"
 | 
					 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"regexp"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func main() {
 | 
					 | 
				
			||||||
	// Get the OS and architecture (using GOARCH_TARGET if it exists)
 | 
					 | 
				
			||||||
	goos := os.Getenv("GOOS")
 | 
					 | 
				
			||||||
	goarch := os.Getenv("GOARCH_TARGET")
 | 
					 | 
				
			||||||
	if goarch == "" {
 | 
					 | 
				
			||||||
		goarch = os.Getenv("GOARCH")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// Check that we are using the Docker-based build system if we should be.
 | 
					 | 
				
			||||||
	if goos == "linux" {
 | 
					 | 
				
			||||||
		if os.Getenv("GOLANG_SYS_BUILD") != "docker" {
 | 
					 | 
				
			||||||
			os.Stderr.WriteString("In the Docker-based build system, mkpost should not be called directly.\n")
 | 
					 | 
				
			||||||
			os.Stderr.WriteString("See README.md\n")
 | 
					 | 
				
			||||||
			os.Exit(1)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	b, err := ioutil.ReadAll(os.Stdin)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		log.Fatal(err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if goos == "aix" {
 | 
					 | 
				
			||||||
		// Replace type of Atim, Mtim and Ctim by Timespec in Stat_t
 | 
					 | 
				
			||||||
		// to avoid having both StTimespec and Timespec.
 | 
					 | 
				
			||||||
		sttimespec := regexp.MustCompile(`_Ctype_struct_st_timespec`)
 | 
					 | 
				
			||||||
		b = sttimespec.ReplaceAll(b, []byte("Timespec"))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if goos == "darwin" {
 | 
					 | 
				
			||||||
		// KinfoProc contains various pointers to objects stored
 | 
					 | 
				
			||||||
		// in kernel space. Replace these by uintptr to prevent
 | 
					 | 
				
			||||||
		// accidental dereferencing.
 | 
					 | 
				
			||||||
		kinfoProcPointerRegex := regexp.MustCompile(`\*_Ctype_struct_(pgrp|proc|session|sigacts|ucred|user|vnode)`)
 | 
					 | 
				
			||||||
		b = kinfoProcPointerRegex.ReplaceAll(b, []byte("uintptr"))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// ExternProc contains a p_un member that in kernel
 | 
					 | 
				
			||||||
		// space stores a pair of pointers and in user space
 | 
					 | 
				
			||||||
		// stores the process creation time. We only care about
 | 
					 | 
				
			||||||
		// the process creation time.
 | 
					 | 
				
			||||||
		externProcStarttimeRegex := regexp.MustCompile(`P_un\s*\[\d+\]byte`)
 | 
					 | 
				
			||||||
		b = externProcStarttimeRegex.ReplaceAll(b, []byte("P_starttime Timeval"))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Convert [n]int8 to [n]byte in Eproc and ExternProc members to
 | 
					 | 
				
			||||||
		// simplify conversion to string.
 | 
					 | 
				
			||||||
		convertEprocRegex := regexp.MustCompile(`(P_comm|Wmesg|Login)(\s+)\[(\d+)\]int8`)
 | 
					 | 
				
			||||||
		b = convertEprocRegex.ReplaceAll(b, []byte("$1$2[$3]byte"))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Intentionally export __val fields in Fsid and Sigset_t
 | 
					 | 
				
			||||||
	valRegex := regexp.MustCompile(`type (Fsid|Sigset_t) struct {(\s+)X__(bits|val)(\s+\S+\s+)}`)
 | 
					 | 
				
			||||||
	b = valRegex.ReplaceAll(b, []byte("type $1 struct {${2}Val$4}"))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Intentionally export __fds_bits field in FdSet
 | 
					 | 
				
			||||||
	fdSetRegex := regexp.MustCompile(`type (FdSet) struct {(\s+)X__fds_bits(\s+\S+\s+)}`)
 | 
					 | 
				
			||||||
	b = fdSetRegex.ReplaceAll(b, []byte("type $1 struct {${2}Bits$3}"))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Intentionally export __icmp6_filt field in icmpv6_filter
 | 
					 | 
				
			||||||
	icmpV6Regex := regexp.MustCompile(`type (ICMPv6Filter) struct {(\s+)X__icmp6_filt(\s+\S+\s+)}`)
 | 
					 | 
				
			||||||
	b = icmpV6Regex.ReplaceAll(b, []byte("type $1 struct {${2}Filt$3}"))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// If we have empty Ptrace structs, we should delete them. Only s390x emits
 | 
					 | 
				
			||||||
	// nonempty Ptrace structs.
 | 
					 | 
				
			||||||
	ptraceRexexp := regexp.MustCompile(`type Ptrace((Psw|Fpregs|Per) struct {\s*})`)
 | 
					 | 
				
			||||||
	b = ptraceRexexp.ReplaceAll(b, nil)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Replace the control_regs union with a blank identifier for now.
 | 
					 | 
				
			||||||
	controlRegsRegex := regexp.MustCompile(`(Control_regs)\s+\[0\]uint64`)
 | 
					 | 
				
			||||||
	b = controlRegsRegex.ReplaceAll(b, []byte("_ [0]uint64"))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Remove fields that are added by glibc
 | 
					 | 
				
			||||||
	// Note that this is unstable as the identifers are private.
 | 
					 | 
				
			||||||
	removeFieldsRegex := regexp.MustCompile(`X__glibc\S*`)
 | 
					 | 
				
			||||||
	b = removeFieldsRegex.ReplaceAll(b, []byte("_"))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Convert [65]int8 to [65]byte in Utsname members to simplify
 | 
					 | 
				
			||||||
	// conversion to string; see golang.org/issue/20753
 | 
					 | 
				
			||||||
	convertUtsnameRegex := regexp.MustCompile(`((Sys|Node|Domain)name|Release|Version|Machine)(\s+)\[(\d+)\]u?int8`)
 | 
					 | 
				
			||||||
	b = convertUtsnameRegex.ReplaceAll(b, []byte("$1$3[$4]byte"))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Convert [n]int8 to [n]byte in Statvfs_t members to simplify
 | 
					 | 
				
			||||||
	// conversion to string.
 | 
					 | 
				
			||||||
	convertStatvfsRegex := regexp.MustCompile(`((Fstype|Mnton|Mntfrom)name)(\s+)\[(\d+)\]int8`)
 | 
					 | 
				
			||||||
	b = convertStatvfsRegex.ReplaceAll(b, []byte("$1$3[$4]byte"))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Convert []int8 to []byte in device mapper ioctl interface
 | 
					 | 
				
			||||||
	convertDmIoctlNames := regexp.MustCompile(`(Name|Uuid|Target_type|Data)(\s+)\[(\d+)\]u?int8`)
 | 
					 | 
				
			||||||
	dmIoctlTypes := regexp.MustCompile(`type Dm(\S+) struct {[^}]*}`)
 | 
					 | 
				
			||||||
	dmStructs := dmIoctlTypes.FindAll(b, -1)
 | 
					 | 
				
			||||||
	for _, s := range dmStructs {
 | 
					 | 
				
			||||||
		newNames := convertDmIoctlNames.ReplaceAll(s, []byte("$1$2[$3]byte"))
 | 
					 | 
				
			||||||
		b = bytes.Replace(b, s, newNames, 1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Convert []int8 to []byte in EthtoolDrvinfo
 | 
					 | 
				
			||||||
	convertEthtoolDrvinfoNames := regexp.MustCompile(`(Driver|Version|Fw_version|Bus_info|Erom_version|Reserved2)(\s+)\[(\d+)\]u?int8`)
 | 
					 | 
				
			||||||
	ethtoolDrvinfoTypes := regexp.MustCompile(`type EthtoolDrvinfo struct {[^}]*}`)
 | 
					 | 
				
			||||||
	ethtoolDrvinfoStructs := ethtoolDrvinfoTypes.FindAll(b, -1)
 | 
					 | 
				
			||||||
	for _, s := range ethtoolDrvinfoStructs {
 | 
					 | 
				
			||||||
		newNames := convertEthtoolDrvinfoNames.ReplaceAll(s, []byte("$1$2[$3]byte"))
 | 
					 | 
				
			||||||
		b = bytes.Replace(b, s, newNames, 1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Convert []int8 to []byte in ctl_info ioctl interface
 | 
					 | 
				
			||||||
	convertCtlInfoName := regexp.MustCompile(`(Name)(\s+)\[(\d+)\]int8`)
 | 
					 | 
				
			||||||
	ctlInfoType := regexp.MustCompile(`type CtlInfo struct {[^}]*}`)
 | 
					 | 
				
			||||||
	ctlInfoStructs := ctlInfoType.FindAll(b, -1)
 | 
					 | 
				
			||||||
	for _, s := range ctlInfoStructs {
 | 
					 | 
				
			||||||
		newNames := convertCtlInfoName.ReplaceAll(s, []byte("$1$2[$3]byte"))
 | 
					 | 
				
			||||||
		b = bytes.Replace(b, s, newNames, 1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Convert [1024]int8 to [1024]byte in Ptmget members
 | 
					 | 
				
			||||||
	convertPtmget := regexp.MustCompile(`([SC]n)(\s+)\[(\d+)\]u?int8`)
 | 
					 | 
				
			||||||
	b = convertPtmget.ReplaceAll(b, []byte("$1[$3]byte"))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Remove spare fields (e.g. in Statx_t)
 | 
					 | 
				
			||||||
	spareFieldsRegex := regexp.MustCompile(`X__spare\S*`)
 | 
					 | 
				
			||||||
	b = spareFieldsRegex.ReplaceAll(b, []byte("_"))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Remove cgo padding fields
 | 
					 | 
				
			||||||
	removePaddingFieldsRegex := regexp.MustCompile(`Pad_cgo_\d+`)
 | 
					 | 
				
			||||||
	b = removePaddingFieldsRegex.ReplaceAll(b, []byte("_"))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Remove padding, hidden, or unused fields
 | 
					 | 
				
			||||||
	removeFieldsRegex = regexp.MustCompile(`\b(X_\S+|Padding)`)
 | 
					 | 
				
			||||||
	b = removeFieldsRegex.ReplaceAll(b, []byte("_"))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Remove the first line of warning from cgo
 | 
					 | 
				
			||||||
	b = b[bytes.IndexByte(b, '\n')+1:]
 | 
					 | 
				
			||||||
	// Modify the command in the header to include:
 | 
					 | 
				
			||||||
	//  mkpost, our own warning, and a build tag.
 | 
					 | 
				
			||||||
	replacement := fmt.Sprintf(`$1 | go run mkpost.go
 | 
					 | 
				
			||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build %s && %s
 | 
					 | 
				
			||||||
// +build %s,%s`, goarch, goos, goarch, goos)
 | 
					 | 
				
			||||||
	cgoCommandRegex := regexp.MustCompile(`(cgo -godefs .*)`)
 | 
					 | 
				
			||||||
	b = cgoCommandRegex.ReplaceAll(b, []byte(replacement))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Rename Stat_t time fields
 | 
					 | 
				
			||||||
	if goos == "freebsd" && goarch == "386" {
 | 
					 | 
				
			||||||
		// Hide Stat_t.[AMCB]tim_ext fields
 | 
					 | 
				
			||||||
		renameStatTimeExtFieldsRegex := regexp.MustCompile(`[AMCB]tim_ext`)
 | 
					 | 
				
			||||||
		b = renameStatTimeExtFieldsRegex.ReplaceAll(b, []byte("_"))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	renameStatTimeFieldsRegex := regexp.MustCompile(`([AMCB])(?:irth)?time?(?:spec)?\s+(Timespec|StTimespec)`)
 | 
					 | 
				
			||||||
	b = renameStatTimeFieldsRegex.ReplaceAll(b, []byte("${1}tim ${2}"))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// gofmt
 | 
					 | 
				
			||||||
	b, err = format.Source(b)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		log.Fatal(err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	os.Stdout.Write(b)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,399 +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.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build ignore
 | 
					 | 
				
			||||||
// +build ignore
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
This program reads a file containing function prototypes
 | 
					 | 
				
			||||||
(like syscall_darwin.go) and generates system call bodies.
 | 
					 | 
				
			||||||
The prototypes are marked by lines beginning with "//sys"
 | 
					 | 
				
			||||||
and read like func declarations if //sys is replaced by func, but:
 | 
					 | 
				
			||||||
	* The parameter lists must give a name for each argument.
 | 
					 | 
				
			||||||
	  This includes return parameters.
 | 
					 | 
				
			||||||
	* The parameter lists must give a type for each argument:
 | 
					 | 
				
			||||||
	  the (x, y, z int) shorthand is not allowed.
 | 
					 | 
				
			||||||
	* If the return parameter is an error number, it must be named errno.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
A line beginning with //sysnb is like //sys, except that the
 | 
					 | 
				
			||||||
goroutine will not be suspended during the execution of the system
 | 
					 | 
				
			||||||
call.  This must only be used for system calls which can never
 | 
					 | 
				
			||||||
block, as otherwise the system call could cause all goroutines to
 | 
					 | 
				
			||||||
hang.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
package main
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"bufio"
 | 
					 | 
				
			||||||
	"flag"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"regexp"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var (
 | 
					 | 
				
			||||||
	b32       = flag.Bool("b32", false, "32bit big-endian")
 | 
					 | 
				
			||||||
	l32       = flag.Bool("l32", false, "32bit little-endian")
 | 
					 | 
				
			||||||
	plan9     = flag.Bool("plan9", false, "plan9")
 | 
					 | 
				
			||||||
	openbsd   = flag.Bool("openbsd", false, "openbsd")
 | 
					 | 
				
			||||||
	netbsd    = flag.Bool("netbsd", false, "netbsd")
 | 
					 | 
				
			||||||
	dragonfly = flag.Bool("dragonfly", false, "dragonfly")
 | 
					 | 
				
			||||||
	arm       = flag.Bool("arm", false, "arm") // 64-bit value should use (even, odd)-pair
 | 
					 | 
				
			||||||
	tags      = flag.String("tags", "", "build tags")
 | 
					 | 
				
			||||||
	filename  = flag.String("output", "", "output file name (standard output if omitted)")
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// cmdLine returns this programs's commandline arguments
 | 
					 | 
				
			||||||
func cmdLine() string {
 | 
					 | 
				
			||||||
	return "go run mksyscall.go " + strings.Join(os.Args[1:], " ")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// goBuildTags returns build tags in the go:build format.
 | 
					 | 
				
			||||||
func goBuildTags() string {
 | 
					 | 
				
			||||||
	return strings.ReplaceAll(*tags, ",", " && ")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// plusBuildTags returns build tags in the +build format.
 | 
					 | 
				
			||||||
func plusBuildTags() string {
 | 
					 | 
				
			||||||
	return *tags
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Param is function parameter
 | 
					 | 
				
			||||||
type Param struct {
 | 
					 | 
				
			||||||
	Name string
 | 
					 | 
				
			||||||
	Type string
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// usage prints the program usage
 | 
					 | 
				
			||||||
func usage() {
 | 
					 | 
				
			||||||
	fmt.Fprintf(os.Stderr, "usage: go run mksyscall.go [-b32 | -l32] [-tags x,y] [file ...]\n")
 | 
					 | 
				
			||||||
	os.Exit(1)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// parseParamList parses parameter list and returns a slice of parameters
 | 
					 | 
				
			||||||
func parseParamList(list string) []string {
 | 
					 | 
				
			||||||
	list = strings.TrimSpace(list)
 | 
					 | 
				
			||||||
	if list == "" {
 | 
					 | 
				
			||||||
		return []string{}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return regexp.MustCompile(`\s*,\s*`).Split(list, -1)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// parseParam splits a parameter into name and type
 | 
					 | 
				
			||||||
func parseParam(p string) Param {
 | 
					 | 
				
			||||||
	ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p)
 | 
					 | 
				
			||||||
	if ps == nil {
 | 
					 | 
				
			||||||
		fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p)
 | 
					 | 
				
			||||||
		os.Exit(1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return Param{ps[1], ps[2]}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func main() {
 | 
					 | 
				
			||||||
	goos := os.Getenv("GOOS_TARGET")
 | 
					 | 
				
			||||||
	if goos == "" {
 | 
					 | 
				
			||||||
		goos = os.Getenv("GOOS")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if goos == "" {
 | 
					 | 
				
			||||||
		fmt.Fprintln(os.Stderr, "GOOS not defined in environment")
 | 
					 | 
				
			||||||
		os.Exit(1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Check that we are using the Docker-based build system if we should
 | 
					 | 
				
			||||||
	if goos == "linux" {
 | 
					 | 
				
			||||||
		if os.Getenv("GOLANG_SYS_BUILD") != "docker" {
 | 
					 | 
				
			||||||
			fmt.Fprintf(os.Stderr, "In the Docker-based build system, mksyscall should not be called directly.\n")
 | 
					 | 
				
			||||||
			fmt.Fprintf(os.Stderr, "See README.md\n")
 | 
					 | 
				
			||||||
			os.Exit(1)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	flag.Usage = usage
 | 
					 | 
				
			||||||
	flag.Parse()
 | 
					 | 
				
			||||||
	if len(flag.Args()) <= 0 {
 | 
					 | 
				
			||||||
		fmt.Fprintf(os.Stderr, "no files to parse provided\n")
 | 
					 | 
				
			||||||
		usage()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	endianness := ""
 | 
					 | 
				
			||||||
	if *b32 {
 | 
					 | 
				
			||||||
		endianness = "big-endian"
 | 
					 | 
				
			||||||
	} else if *l32 {
 | 
					 | 
				
			||||||
		endianness = "little-endian"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	libc := false
 | 
					 | 
				
			||||||
	if goos == "darwin" {
 | 
					 | 
				
			||||||
		libc = true
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	trampolines := map[string]bool{}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	text := ""
 | 
					 | 
				
			||||||
	for _, path := range flag.Args() {
 | 
					 | 
				
			||||||
		file, err := os.Open(path)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			fmt.Fprintf(os.Stderr, err.Error())
 | 
					 | 
				
			||||||
			os.Exit(1)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		s := bufio.NewScanner(file)
 | 
					 | 
				
			||||||
		for s.Scan() {
 | 
					 | 
				
			||||||
			t := s.Text()
 | 
					 | 
				
			||||||
			nonblock := regexp.MustCompile(`^\/\/sysnb\t`).FindStringSubmatch(t)
 | 
					 | 
				
			||||||
			if regexp.MustCompile(`^\/\/sys\t`).FindStringSubmatch(t) == nil && nonblock == nil {
 | 
					 | 
				
			||||||
				continue
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Line must be of the form
 | 
					 | 
				
			||||||
			//	func Open(path string, mode int, perm int) (fd int, errno error)
 | 
					 | 
				
			||||||
			// Split into name, in params, out params.
 | 
					 | 
				
			||||||
			f := regexp.MustCompile(`^\/\/sys(nb)?\t(\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*((?i)SYS_[A-Z0-9_]+))?$`).FindStringSubmatch(t)
 | 
					 | 
				
			||||||
			if f == nil {
 | 
					 | 
				
			||||||
				fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t)
 | 
					 | 
				
			||||||
				os.Exit(1)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			funct, inps, outps, sysname := f[2], f[3], f[4], f[5]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Split argument lists on comma.
 | 
					 | 
				
			||||||
			in := parseParamList(inps)
 | 
					 | 
				
			||||||
			out := parseParamList(outps)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Try in vain to keep people from editing this file.
 | 
					 | 
				
			||||||
			// The theory is that they jump into the middle of the file
 | 
					 | 
				
			||||||
			// without reading the header.
 | 
					 | 
				
			||||||
			text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Go function header.
 | 
					 | 
				
			||||||
			outDecl := ""
 | 
					 | 
				
			||||||
			if len(out) > 0 {
 | 
					 | 
				
			||||||
				outDecl = fmt.Sprintf(" (%s)", strings.Join(out, ", "))
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outDecl)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Check if err return available
 | 
					 | 
				
			||||||
			errvar := ""
 | 
					 | 
				
			||||||
			for _, param := range out {
 | 
					 | 
				
			||||||
				p := parseParam(param)
 | 
					 | 
				
			||||||
				if p.Type == "error" {
 | 
					 | 
				
			||||||
					errvar = p.Name
 | 
					 | 
				
			||||||
					break
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Prepare arguments to Syscall.
 | 
					 | 
				
			||||||
			var args []string
 | 
					 | 
				
			||||||
			n := 0
 | 
					 | 
				
			||||||
			for _, param := range in {
 | 
					 | 
				
			||||||
				p := parseParam(param)
 | 
					 | 
				
			||||||
				if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil {
 | 
					 | 
				
			||||||
					args = append(args, "uintptr(unsafe.Pointer("+p.Name+"))")
 | 
					 | 
				
			||||||
				} else if p.Type == "string" && errvar != "" {
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\tvar _p%d *byte\n", n)
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\t_p%d, %s = BytePtrFromString(%s)\n", n, errvar, p.Name)
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar)
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n))
 | 
					 | 
				
			||||||
					n++
 | 
					 | 
				
			||||||
				} else if p.Type == "string" {
 | 
					 | 
				
			||||||
					fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n")
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\tvar _p%d *byte\n", n)
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\t_p%d, _ = BytePtrFromString(%s)\n", n, p.Name)
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n))
 | 
					 | 
				
			||||||
					n++
 | 
					 | 
				
			||||||
				} else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil {
 | 
					 | 
				
			||||||
					// Convert slice into pointer, length.
 | 
					 | 
				
			||||||
					// Have to be careful not to take address of &a[0] if len == 0:
 | 
					 | 
				
			||||||
					// pass dummy pointer in that case.
 | 
					 | 
				
			||||||
					// Used to pass nil, but some OSes or simulators reject write(fd, nil, 0).
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\tvar _p%d unsafe.Pointer\n", n)
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = unsafe.Pointer(&%s[0])\n\t}", p.Name, n, p.Name)
 | 
					 | 
				
			||||||
					text += fmt.Sprintf(" else {\n\t\t_p%d = unsafe.Pointer(&_zero)\n\t}\n", n)
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("uintptr(_p%d)", n), fmt.Sprintf("uintptr(len(%s))", p.Name))
 | 
					 | 
				
			||||||
					n++
 | 
					 | 
				
			||||||
				} else if p.Type == "int64" && (*openbsd || *netbsd) {
 | 
					 | 
				
			||||||
					args = append(args, "0")
 | 
					 | 
				
			||||||
					if endianness == "big-endian" {
 | 
					 | 
				
			||||||
						args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name))
 | 
					 | 
				
			||||||
					} else if endianness == "little-endian" {
 | 
					 | 
				
			||||||
						args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name))
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						args = append(args, fmt.Sprintf("uintptr(%s)", p.Name))
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} else if p.Type == "int64" && *dragonfly {
 | 
					 | 
				
			||||||
					if regexp.MustCompile(`^(?i)extp(read|write)`).FindStringSubmatch(funct) == nil {
 | 
					 | 
				
			||||||
						args = append(args, "0")
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					if endianness == "big-endian" {
 | 
					 | 
				
			||||||
						args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name))
 | 
					 | 
				
			||||||
					} else if endianness == "little-endian" {
 | 
					 | 
				
			||||||
						args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name))
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						args = append(args, fmt.Sprintf("uintptr(%s)", p.Name))
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} else if (p.Type == "int64" || p.Type == "uint64") && endianness != "" {
 | 
					 | 
				
			||||||
					if len(args)%2 == 1 && *arm {
 | 
					 | 
				
			||||||
						// arm abi specifies 64-bit argument uses
 | 
					 | 
				
			||||||
						// (even, odd) pair
 | 
					 | 
				
			||||||
						args = append(args, "0")
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					if endianness == "big-endian" {
 | 
					 | 
				
			||||||
						args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name))
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name))
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("uintptr(%s)", p.Name))
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Determine which form to use; pad args with zeros.
 | 
					 | 
				
			||||||
			asm := "Syscall"
 | 
					 | 
				
			||||||
			if nonblock != nil {
 | 
					 | 
				
			||||||
				if errvar == "" && goos == "linux" {
 | 
					 | 
				
			||||||
					asm = "RawSyscallNoError"
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					asm = "RawSyscall"
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				if errvar == "" && goos == "linux" {
 | 
					 | 
				
			||||||
					asm = "SyscallNoError"
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if len(args) <= 3 {
 | 
					 | 
				
			||||||
				for len(args) < 3 {
 | 
					 | 
				
			||||||
					args = append(args, "0")
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else if len(args) <= 6 {
 | 
					 | 
				
			||||||
				asm += "6"
 | 
					 | 
				
			||||||
				for len(args) < 6 {
 | 
					 | 
				
			||||||
					args = append(args, "0")
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else if len(args) <= 9 {
 | 
					 | 
				
			||||||
				asm += "9"
 | 
					 | 
				
			||||||
				for len(args) < 9 {
 | 
					 | 
				
			||||||
					args = append(args, "0")
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				fmt.Fprintf(os.Stderr, "%s:%s too many arguments to system call\n", path, funct)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// System call number.
 | 
					 | 
				
			||||||
			if sysname == "" {
 | 
					 | 
				
			||||||
				sysname = "SYS_" + funct
 | 
					 | 
				
			||||||
				sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`)
 | 
					 | 
				
			||||||
				sysname = strings.ToUpper(sysname)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			var libcFn string
 | 
					 | 
				
			||||||
			if libc {
 | 
					 | 
				
			||||||
				asm = "syscall_" + strings.ToLower(asm[:1]) + asm[1:] // internal syscall call
 | 
					 | 
				
			||||||
				sysname = strings.TrimPrefix(sysname, "SYS_")         // remove SYS_
 | 
					 | 
				
			||||||
				sysname = strings.ToLower(sysname)                    // lowercase
 | 
					 | 
				
			||||||
				libcFn = sysname
 | 
					 | 
				
			||||||
				sysname = "libc_" + sysname + "_trampoline_addr"
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Actual call.
 | 
					 | 
				
			||||||
			arglist := strings.Join(args, ", ")
 | 
					 | 
				
			||||||
			call := fmt.Sprintf("%s(%s, %s)", asm, sysname, arglist)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Assign return values.
 | 
					 | 
				
			||||||
			body := ""
 | 
					 | 
				
			||||||
			ret := []string{"_", "_", "_"}
 | 
					 | 
				
			||||||
			doErrno := false
 | 
					 | 
				
			||||||
			for i := 0; i < len(out); i++ {
 | 
					 | 
				
			||||||
				p := parseParam(out[i])
 | 
					 | 
				
			||||||
				reg := ""
 | 
					 | 
				
			||||||
				if p.Name == "err" && !*plan9 {
 | 
					 | 
				
			||||||
					reg = "e1"
 | 
					 | 
				
			||||||
					ret[2] = reg
 | 
					 | 
				
			||||||
					doErrno = true
 | 
					 | 
				
			||||||
				} else if p.Name == "err" && *plan9 {
 | 
					 | 
				
			||||||
					ret[0] = "r0"
 | 
					 | 
				
			||||||
					ret[2] = "e1"
 | 
					 | 
				
			||||||
					break
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					reg = fmt.Sprintf("r%d", i)
 | 
					 | 
				
			||||||
					ret[i] = reg
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if p.Type == "bool" {
 | 
					 | 
				
			||||||
					reg = fmt.Sprintf("%s != 0", reg)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if p.Type == "int64" && endianness != "" {
 | 
					 | 
				
			||||||
					// 64-bit number in r1:r0 or r0:r1.
 | 
					 | 
				
			||||||
					if i+2 > len(out) {
 | 
					 | 
				
			||||||
						fmt.Fprintf(os.Stderr, "%s:%s not enough registers for int64 return\n", path, funct)
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					if endianness == "big-endian" {
 | 
					 | 
				
			||||||
						reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i, i+1)
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i+1, i)
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					ret[i] = fmt.Sprintf("r%d", i)
 | 
					 | 
				
			||||||
					ret[i+1] = fmt.Sprintf("r%d", i+1)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if reg != "e1" || *plan9 {
 | 
					 | 
				
			||||||
					body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if ret[0] == "_" && ret[1] == "_" && ret[2] == "_" {
 | 
					 | 
				
			||||||
				text += fmt.Sprintf("\t%s\n", call)
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				if errvar == "" && goos == "linux" {
 | 
					 | 
				
			||||||
					// raw syscall without error on Linux, see golang.org/issue/22924
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\t%s, %s := %s\n", ret[0], ret[1], call)
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\t%s, %s, %s := %s\n", ret[0], ret[1], ret[2], call)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			text += body
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if *plan9 && ret[2] == "e1" {
 | 
					 | 
				
			||||||
				text += "\tif int32(r0) == -1 {\n"
 | 
					 | 
				
			||||||
				text += "\t\terr = e1\n"
 | 
					 | 
				
			||||||
				text += "\t}\n"
 | 
					 | 
				
			||||||
			} else if doErrno {
 | 
					 | 
				
			||||||
				text += "\tif e1 != 0 {\n"
 | 
					 | 
				
			||||||
				text += "\t\terr = errnoErr(e1)\n"
 | 
					 | 
				
			||||||
				text += "\t}\n"
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			text += "\treturn\n"
 | 
					 | 
				
			||||||
			text += "}\n\n"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if libc && !trampolines[libcFn] {
 | 
					 | 
				
			||||||
				// some system calls share a trampoline, like read and readlen.
 | 
					 | 
				
			||||||
				trampolines[libcFn] = true
 | 
					 | 
				
			||||||
				// Declare assembly trampoline address.
 | 
					 | 
				
			||||||
				text += fmt.Sprintf("var libc_%s_trampoline_addr uintptr\n\n", libcFn)
 | 
					 | 
				
			||||||
				// Assembly trampoline calls the libc_* function, which this magic
 | 
					 | 
				
			||||||
				// redirects to use the function from libSystem.
 | 
					 | 
				
			||||||
				text += fmt.Sprintf("//go:cgo_import_dynamic libc_%s %s \"/usr/lib/libSystem.B.dylib\"\n", libcFn, libcFn)
 | 
					 | 
				
			||||||
				text += "\n"
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if err := s.Err(); err != nil {
 | 
					 | 
				
			||||||
			fmt.Fprintf(os.Stderr, err.Error())
 | 
					 | 
				
			||||||
			os.Exit(1)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		file.Close()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	fmt.Printf(srcTemplate, cmdLine(), goBuildTags(), plusBuildTags(), text)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const srcTemplate = `// %s
 | 
					 | 
				
			||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build %s
 | 
					 | 
				
			||||||
// +build %s
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package unix
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"syscall"
 | 
					 | 
				
			||||||
	"unsafe"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var _ syscall.Errno
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%s
 | 
					 | 
				
			||||||
`
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,420 +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.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build ignore
 | 
					 | 
				
			||||||
// +build ignore
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
This program reads a file containing function prototypes
 | 
					 | 
				
			||||||
(like syscall_aix.go) and generates system call bodies.
 | 
					 | 
				
			||||||
The prototypes are marked by lines beginning with "//sys"
 | 
					 | 
				
			||||||
and read like func declarations if //sys is replaced by func, but:
 | 
					 | 
				
			||||||
	* The parameter lists must give a name for each argument.
 | 
					 | 
				
			||||||
	  This includes return parameters.
 | 
					 | 
				
			||||||
	* The parameter lists must give a type for each argument:
 | 
					 | 
				
			||||||
	  the (x, y, z int) shorthand is not allowed.
 | 
					 | 
				
			||||||
	* If the return parameter is an error number, it must be named err.
 | 
					 | 
				
			||||||
	* If go func name needs to be different than its libc name,
 | 
					 | 
				
			||||||
	* or the function is not in libc, name could be specified
 | 
					 | 
				
			||||||
	* at the end, after "=" sign, like
 | 
					 | 
				
			||||||
	  //sys	getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
package main
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"bufio"
 | 
					 | 
				
			||||||
	"flag"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"regexp"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var (
 | 
					 | 
				
			||||||
	b32  = flag.Bool("b32", false, "32bit big-endian")
 | 
					 | 
				
			||||||
	l32  = flag.Bool("l32", false, "32bit little-endian")
 | 
					 | 
				
			||||||
	aix  = flag.Bool("aix", false, "aix")
 | 
					 | 
				
			||||||
	tags = flag.String("tags", "", "build tags")
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// cmdLine returns this programs's commandline arguments
 | 
					 | 
				
			||||||
func cmdLine() string {
 | 
					 | 
				
			||||||
	return "go run mksyscall_aix_ppc.go " + strings.Join(os.Args[1:], " ")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// goBuildTags returns build tags in the go:build format.
 | 
					 | 
				
			||||||
func goBuildTags() string {
 | 
					 | 
				
			||||||
	return strings.ReplaceAll(*tags, ",", " && ")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// plusBuildTags returns build tags in the +build format.
 | 
					 | 
				
			||||||
func plusBuildTags() string {
 | 
					 | 
				
			||||||
	return *tags
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Param is function parameter
 | 
					 | 
				
			||||||
type Param struct {
 | 
					 | 
				
			||||||
	Name string
 | 
					 | 
				
			||||||
	Type string
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// usage prints the program usage
 | 
					 | 
				
			||||||
func usage() {
 | 
					 | 
				
			||||||
	fmt.Fprintf(os.Stderr, "usage: go run mksyscall_aix_ppc.go [-b32 | -l32] [-tags x,y] [file ...]\n")
 | 
					 | 
				
			||||||
	os.Exit(1)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// parseParamList parses parameter list and returns a slice of parameters
 | 
					 | 
				
			||||||
func parseParamList(list string) []string {
 | 
					 | 
				
			||||||
	list = strings.TrimSpace(list)
 | 
					 | 
				
			||||||
	if list == "" {
 | 
					 | 
				
			||||||
		return []string{}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return regexp.MustCompile(`\s*,\s*`).Split(list, -1)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// parseParam splits a parameter into name and type
 | 
					 | 
				
			||||||
func parseParam(p string) Param {
 | 
					 | 
				
			||||||
	ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p)
 | 
					 | 
				
			||||||
	if ps == nil {
 | 
					 | 
				
			||||||
		fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p)
 | 
					 | 
				
			||||||
		os.Exit(1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return Param{ps[1], ps[2]}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func main() {
 | 
					 | 
				
			||||||
	flag.Usage = usage
 | 
					 | 
				
			||||||
	flag.Parse()
 | 
					 | 
				
			||||||
	if len(flag.Args()) <= 0 {
 | 
					 | 
				
			||||||
		fmt.Fprintf(os.Stderr, "no files to parse provided\n")
 | 
					 | 
				
			||||||
		usage()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	endianness := ""
 | 
					 | 
				
			||||||
	if *b32 {
 | 
					 | 
				
			||||||
		endianness = "big-endian"
 | 
					 | 
				
			||||||
	} else if *l32 {
 | 
					 | 
				
			||||||
		endianness = "little-endian"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	pack := ""
 | 
					 | 
				
			||||||
	text := ""
 | 
					 | 
				
			||||||
	cExtern := "/*\n#include <stdint.h>\n#include <stddef.h>\n"
 | 
					 | 
				
			||||||
	for _, path := range flag.Args() {
 | 
					 | 
				
			||||||
		file, err := os.Open(path)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			fmt.Fprintf(os.Stderr, err.Error())
 | 
					 | 
				
			||||||
			os.Exit(1)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		s := bufio.NewScanner(file)
 | 
					 | 
				
			||||||
		for s.Scan() {
 | 
					 | 
				
			||||||
			t := s.Text()
 | 
					 | 
				
			||||||
			if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" {
 | 
					 | 
				
			||||||
				pack = p[1]
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			nonblock := regexp.MustCompile(`^\/\/sysnb\t`).FindStringSubmatch(t)
 | 
					 | 
				
			||||||
			if regexp.MustCompile(`^\/\/sys\t`).FindStringSubmatch(t) == nil && nonblock == nil {
 | 
					 | 
				
			||||||
				continue
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Line must be of the form
 | 
					 | 
				
			||||||
			//	func Open(path string, mode int, perm int) (fd int, err error)
 | 
					 | 
				
			||||||
			// Split into name, in params, out params.
 | 
					 | 
				
			||||||
			f := regexp.MustCompile(`^\/\/sys(nb)?\t(\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t)
 | 
					 | 
				
			||||||
			if f == nil {
 | 
					 | 
				
			||||||
				fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t)
 | 
					 | 
				
			||||||
				os.Exit(1)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Split argument lists on comma.
 | 
					 | 
				
			||||||
			in := parseParamList(inps)
 | 
					 | 
				
			||||||
			out := parseParamList(outps)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			inps = strings.Join(in, ", ")
 | 
					 | 
				
			||||||
			outps = strings.Join(out, ", ")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Try in vain to keep people from editing this file.
 | 
					 | 
				
			||||||
			// The theory is that they jump into the middle of the file
 | 
					 | 
				
			||||||
			// without reading the header.
 | 
					 | 
				
			||||||
			text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Check if value return, err return available
 | 
					 | 
				
			||||||
			errvar := ""
 | 
					 | 
				
			||||||
			retvar := ""
 | 
					 | 
				
			||||||
			rettype := ""
 | 
					 | 
				
			||||||
			for _, param := range out {
 | 
					 | 
				
			||||||
				p := parseParam(param)
 | 
					 | 
				
			||||||
				if p.Type == "error" {
 | 
					 | 
				
			||||||
					errvar = p.Name
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					retvar = p.Name
 | 
					 | 
				
			||||||
					rettype = p.Type
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// System call name.
 | 
					 | 
				
			||||||
			if sysname == "" {
 | 
					 | 
				
			||||||
				sysname = funct
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`)
 | 
					 | 
				
			||||||
			sysname = strings.ToLower(sysname) // All libc functions are lowercase.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			cRettype := ""
 | 
					 | 
				
			||||||
			if rettype == "unsafe.Pointer" {
 | 
					 | 
				
			||||||
				cRettype = "uintptr_t"
 | 
					 | 
				
			||||||
			} else if rettype == "uintptr" {
 | 
					 | 
				
			||||||
				cRettype = "uintptr_t"
 | 
					 | 
				
			||||||
			} else if regexp.MustCompile(`^_`).FindStringSubmatch(rettype) != nil {
 | 
					 | 
				
			||||||
				cRettype = "uintptr_t"
 | 
					 | 
				
			||||||
			} else if rettype == "int" {
 | 
					 | 
				
			||||||
				cRettype = "int"
 | 
					 | 
				
			||||||
			} else if rettype == "int32" {
 | 
					 | 
				
			||||||
				cRettype = "int"
 | 
					 | 
				
			||||||
			} else if rettype == "int64" {
 | 
					 | 
				
			||||||
				cRettype = "long long"
 | 
					 | 
				
			||||||
			} else if rettype == "uint32" {
 | 
					 | 
				
			||||||
				cRettype = "unsigned int"
 | 
					 | 
				
			||||||
			} else if rettype == "uint64" {
 | 
					 | 
				
			||||||
				cRettype = "unsigned long long"
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				cRettype = "int"
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if sysname == "exit" {
 | 
					 | 
				
			||||||
				cRettype = "void"
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Change p.Types to c
 | 
					 | 
				
			||||||
			var cIn []string
 | 
					 | 
				
			||||||
			for _, param := range in {
 | 
					 | 
				
			||||||
				p := parseParam(param)
 | 
					 | 
				
			||||||
				if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "uintptr_t")
 | 
					 | 
				
			||||||
				} else if p.Type == "string" {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "uintptr_t")
 | 
					 | 
				
			||||||
				} else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "uintptr_t", "size_t")
 | 
					 | 
				
			||||||
				} else if p.Type == "unsafe.Pointer" {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "uintptr_t")
 | 
					 | 
				
			||||||
				} else if p.Type == "uintptr" {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "uintptr_t")
 | 
					 | 
				
			||||||
				} else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "uintptr_t")
 | 
					 | 
				
			||||||
				} else if p.Type == "int" {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "int")
 | 
					 | 
				
			||||||
				} else if p.Type == "int32" {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "int")
 | 
					 | 
				
			||||||
				} else if p.Type == "int64" {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "long long")
 | 
					 | 
				
			||||||
				} else if p.Type == "uint32" {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "unsigned int")
 | 
					 | 
				
			||||||
				} else if p.Type == "uint64" {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "unsigned long long")
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "int")
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if funct != "fcntl" && funct != "FcntlInt" && funct != "readlen" && funct != "writelen" {
 | 
					 | 
				
			||||||
				if sysname == "select" {
 | 
					 | 
				
			||||||
					// select is a keyword of Go. Its name is
 | 
					 | 
				
			||||||
					// changed to c_select.
 | 
					 | 
				
			||||||
					cExtern += "#define c_select select\n"
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				// Imports of system calls from libc
 | 
					 | 
				
			||||||
				cExtern += fmt.Sprintf("%s %s", cRettype, sysname)
 | 
					 | 
				
			||||||
				cIn := strings.Join(cIn, ", ")
 | 
					 | 
				
			||||||
				cExtern += fmt.Sprintf("(%s);\n", cIn)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// So file name.
 | 
					 | 
				
			||||||
			if *aix {
 | 
					 | 
				
			||||||
				if modname == "" {
 | 
					 | 
				
			||||||
					modname = "libc.a/shr_64.o"
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					fmt.Fprintf(os.Stderr, "%s: only syscall using libc are available\n", funct)
 | 
					 | 
				
			||||||
					os.Exit(1)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			strconvfunc := "C.CString"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Go function header.
 | 
					 | 
				
			||||||
			if outps != "" {
 | 
					 | 
				
			||||||
				outps = fmt.Sprintf(" (%s)", outps)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if text != "" {
 | 
					 | 
				
			||||||
				text += "\n"
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outps)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Prepare arguments to Syscall.
 | 
					 | 
				
			||||||
			var args []string
 | 
					 | 
				
			||||||
			n := 0
 | 
					 | 
				
			||||||
			argN := 0
 | 
					 | 
				
			||||||
			for _, param := range in {
 | 
					 | 
				
			||||||
				p := parseParam(param)
 | 
					 | 
				
			||||||
				if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil {
 | 
					 | 
				
			||||||
					args = append(args, "C.uintptr_t(uintptr(unsafe.Pointer("+p.Name+")))")
 | 
					 | 
				
			||||||
				} else if p.Type == "string" && errvar != "" {
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\t_p%d := uintptr(unsafe.Pointer(%s(%s)))\n", n, strconvfunc, p.Name)
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("C.uintptr_t(_p%d)", n))
 | 
					 | 
				
			||||||
					n++
 | 
					 | 
				
			||||||
				} else if p.Type == "string" {
 | 
					 | 
				
			||||||
					fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n")
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\t_p%d := uintptr(unsafe.Pointer(%s(%s)))\n", n, strconvfunc, p.Name)
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("C.uintptr_t(_p%d)", n))
 | 
					 | 
				
			||||||
					n++
 | 
					 | 
				
			||||||
				} else if m := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); m != nil {
 | 
					 | 
				
			||||||
					// Convert slice into pointer, length.
 | 
					 | 
				
			||||||
					// Have to be careful not to take address of &a[0] if len == 0:
 | 
					 | 
				
			||||||
					// pass nil in that case.
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\tvar _p%d *%s\n", n, m[1])
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name)
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(unsafe.Pointer(_p%d)))", n))
 | 
					 | 
				
			||||||
					n++
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\tvar _p%d int\n", n)
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\t_p%d = len(%s)\n", n, p.Name)
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("C.size_t(_p%d)", n))
 | 
					 | 
				
			||||||
					n++
 | 
					 | 
				
			||||||
				} else if p.Type == "int64" && endianness != "" {
 | 
					 | 
				
			||||||
					if endianness == "big-endian" {
 | 
					 | 
				
			||||||
						args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name))
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name))
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					n++
 | 
					 | 
				
			||||||
				} else if p.Type == "bool" {
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\tvar _p%d uint32\n", n)
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\tif %s {\n\t\t_p%d = 1\n\t} else {\n\t\t_p%d = 0\n\t}\n", p.Name, n, n)
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("_p%d", n))
 | 
					 | 
				
			||||||
				} else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil {
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(%s))", p.Name))
 | 
					 | 
				
			||||||
				} else if p.Type == "unsafe.Pointer" {
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(%s))", p.Name))
 | 
					 | 
				
			||||||
				} else if p.Type == "int" {
 | 
					 | 
				
			||||||
					if (argN == 2) && ((funct == "readlen") || (funct == "writelen")) {
 | 
					 | 
				
			||||||
						args = append(args, fmt.Sprintf("C.size_t(%s)", p.Name))
 | 
					 | 
				
			||||||
					} else if argN == 0 && funct == "fcntl" {
 | 
					 | 
				
			||||||
						args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name))
 | 
					 | 
				
			||||||
					} else if (argN == 2) && ((funct == "fcntl") || (funct == "FcntlInt")) {
 | 
					 | 
				
			||||||
						args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name))
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						args = append(args, fmt.Sprintf("C.int(%s)", p.Name))
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} else if p.Type == "int32" {
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("C.int(%s)", p.Name))
 | 
					 | 
				
			||||||
				} else if p.Type == "int64" {
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("C.longlong(%s)", p.Name))
 | 
					 | 
				
			||||||
				} else if p.Type == "uint32" {
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("C.uint(%s)", p.Name))
 | 
					 | 
				
			||||||
				} else if p.Type == "uint64" {
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("C.ulonglong(%s)", p.Name))
 | 
					 | 
				
			||||||
				} else if p.Type == "uintptr" {
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name))
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("C.int(%s)", p.Name))
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				argN++
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Actual call.
 | 
					 | 
				
			||||||
			arglist := strings.Join(args, ", ")
 | 
					 | 
				
			||||||
			call := ""
 | 
					 | 
				
			||||||
			if sysname == "exit" {
 | 
					 | 
				
			||||||
				if errvar != "" {
 | 
					 | 
				
			||||||
					call += "er :="
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					call += ""
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else if errvar != "" {
 | 
					 | 
				
			||||||
				call += "r0,er :="
 | 
					 | 
				
			||||||
			} else if retvar != "" {
 | 
					 | 
				
			||||||
				call += "r0,_ :="
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				call += ""
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if sysname == "select" {
 | 
					 | 
				
			||||||
				// select is a keyword of Go. Its name is
 | 
					 | 
				
			||||||
				// changed to c_select.
 | 
					 | 
				
			||||||
				call += fmt.Sprintf("C.c_%s(%s)", sysname, arglist)
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				call += fmt.Sprintf("C.%s(%s)", sysname, arglist)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Assign return values.
 | 
					 | 
				
			||||||
			body := ""
 | 
					 | 
				
			||||||
			for i := 0; i < len(out); i++ {
 | 
					 | 
				
			||||||
				p := parseParam(out[i])
 | 
					 | 
				
			||||||
				reg := ""
 | 
					 | 
				
			||||||
				if p.Name == "err" {
 | 
					 | 
				
			||||||
					reg = "e1"
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					reg = "r0"
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if reg != "e1" {
 | 
					 | 
				
			||||||
					body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// verify return
 | 
					 | 
				
			||||||
			if sysname != "exit" && errvar != "" {
 | 
					 | 
				
			||||||
				if regexp.MustCompile(`^uintptr`).FindStringSubmatch(cRettype) != nil {
 | 
					 | 
				
			||||||
					body += "\tif (uintptr(r0) ==^uintptr(0) && er != nil) {\n"
 | 
					 | 
				
			||||||
					body += fmt.Sprintf("\t\t%s = er\n", errvar)
 | 
					 | 
				
			||||||
					body += "\t}\n"
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					body += "\tif (r0 ==-1 && er != nil) {\n"
 | 
					 | 
				
			||||||
					body += fmt.Sprintf("\t\t%s = er\n", errvar)
 | 
					 | 
				
			||||||
					body += "\t}\n"
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else if errvar != "" {
 | 
					 | 
				
			||||||
				body += "\tif (er != nil) {\n"
 | 
					 | 
				
			||||||
				body += fmt.Sprintf("\t\t%s = er\n", errvar)
 | 
					 | 
				
			||||||
				body += "\t}\n"
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			text += fmt.Sprintf("\t%s\n", call)
 | 
					 | 
				
			||||||
			text += body
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			text += "\treturn\n"
 | 
					 | 
				
			||||||
			text += "}\n"
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if err := s.Err(); err != nil {
 | 
					 | 
				
			||||||
			fmt.Fprintf(os.Stderr, err.Error())
 | 
					 | 
				
			||||||
			os.Exit(1)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		file.Close()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	imp := ""
 | 
					 | 
				
			||||||
	if pack != "unix" {
 | 
					 | 
				
			||||||
		imp = "import \"golang.org/x/sys/unix\"\n"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	fmt.Printf(srcTemplate, cmdLine(), goBuildTags(), plusBuildTags(), pack, cExtern, imp, text)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const srcTemplate = `// %s
 | 
					 | 
				
			||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build %s
 | 
					 | 
				
			||||||
// +build %s
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package %s
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%s
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
import "C"
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"unsafe"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%s
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%s
 | 
					 | 
				
			||||||
`
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,619 +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.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build ignore
 | 
					 | 
				
			||||||
// +build ignore
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
This program reads a file containing function prototypes
 | 
					 | 
				
			||||||
(like syscall_aix.go) and generates system call bodies.
 | 
					 | 
				
			||||||
The prototypes are marked by lines beginning with "//sys"
 | 
					 | 
				
			||||||
and read like func declarations if //sys is replaced by func, but:
 | 
					 | 
				
			||||||
	* The parameter lists must give a name for each argument.
 | 
					 | 
				
			||||||
	  This includes return parameters.
 | 
					 | 
				
			||||||
	* The parameter lists must give a type for each argument:
 | 
					 | 
				
			||||||
	  the (x, y, z int) shorthand is not allowed.
 | 
					 | 
				
			||||||
	* If the return parameter is an error number, it must be named err.
 | 
					 | 
				
			||||||
	* If go func name needs to be different than its libc name,
 | 
					 | 
				
			||||||
	* or the function is not in libc, name could be specified
 | 
					 | 
				
			||||||
	* at the end, after "=" sign, like
 | 
					 | 
				
			||||||
	  //sys	getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
This program will generate three files and handle both gc and gccgo implementation:
 | 
					 | 
				
			||||||
  - zsyscall_aix_ppc64.go: the common part of each implementation (error handler, pointer creation)
 | 
					 | 
				
			||||||
  - zsyscall_aix_ppc64_gc.go: gc part with //go_cgo_import_dynamic and a call to syscall6
 | 
					 | 
				
			||||||
  - zsyscall_aix_ppc64_gccgo.go: gccgo part with C function and conversion to C type.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 The generated code looks like this
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
zsyscall_aix_ppc64.go
 | 
					 | 
				
			||||||
func asyscall(...) (n int, err error) {
 | 
					 | 
				
			||||||
	 // Pointer Creation
 | 
					 | 
				
			||||||
	 r1, e1 := callasyscall(...)
 | 
					 | 
				
			||||||
	 // Type Conversion
 | 
					 | 
				
			||||||
	 // Error Handler
 | 
					 | 
				
			||||||
	 return
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
zsyscall_aix_ppc64_gc.go
 | 
					 | 
				
			||||||
//go:cgo_import_dynamic libc_asyscall asyscall "libc.a/shr_64.o"
 | 
					 | 
				
			||||||
//go:linkname libc_asyscall libc_asyscall
 | 
					 | 
				
			||||||
var asyscall syscallFunc
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func callasyscall(...) (r1 uintptr, e1 Errno) {
 | 
					 | 
				
			||||||
	 r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_asyscall)), "nb_args", ... )
 | 
					 | 
				
			||||||
	 return
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
zsyscall_aix_ppc64_ggcgo.go
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// int asyscall(...)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import "C"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func callasyscall(...) (r1 uintptr, e1 Errno) {
 | 
					 | 
				
			||||||
	 r1 = uintptr(C.asyscall(...))
 | 
					 | 
				
			||||||
	 e1 = syscall.GetErrno()
 | 
					 | 
				
			||||||
	 return
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package main
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"bufio"
 | 
					 | 
				
			||||||
	"flag"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"io/ioutil"
 | 
					 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"regexp"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var (
 | 
					 | 
				
			||||||
	b32  = flag.Bool("b32", false, "32bit big-endian")
 | 
					 | 
				
			||||||
	l32  = flag.Bool("l32", false, "32bit little-endian")
 | 
					 | 
				
			||||||
	aix  = flag.Bool("aix", false, "aix")
 | 
					 | 
				
			||||||
	tags = flag.String("tags", "", "build tags")
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// cmdLine returns this programs's commandline arguments
 | 
					 | 
				
			||||||
func cmdLine() string {
 | 
					 | 
				
			||||||
	return "go run mksyscall_aix_ppc64.go " + strings.Join(os.Args[1:], " ")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// goBuildTags returns build tags in the go:build format.
 | 
					 | 
				
			||||||
func goBuildTags() string {
 | 
					 | 
				
			||||||
	return strings.ReplaceAll(*tags, ",", " && ")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// plusBuildTags returns build tags in the +build format.
 | 
					 | 
				
			||||||
func plusBuildTags() string {
 | 
					 | 
				
			||||||
	return *tags
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Param is function parameter
 | 
					 | 
				
			||||||
type Param struct {
 | 
					 | 
				
			||||||
	Name string
 | 
					 | 
				
			||||||
	Type string
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// usage prints the program usage
 | 
					 | 
				
			||||||
func usage() {
 | 
					 | 
				
			||||||
	fmt.Fprintf(os.Stderr, "usage: go run mksyscall_aix_ppc64.go [-b32 | -l32] [-tags x,y] [file ...]\n")
 | 
					 | 
				
			||||||
	os.Exit(1)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// parseParamList parses parameter list and returns a slice of parameters
 | 
					 | 
				
			||||||
func parseParamList(list string) []string {
 | 
					 | 
				
			||||||
	list = strings.TrimSpace(list)
 | 
					 | 
				
			||||||
	if list == "" {
 | 
					 | 
				
			||||||
		return []string{}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return regexp.MustCompile(`\s*,\s*`).Split(list, -1)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// parseParam splits a parameter into name and type
 | 
					 | 
				
			||||||
func parseParam(p string) Param {
 | 
					 | 
				
			||||||
	ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p)
 | 
					 | 
				
			||||||
	if ps == nil {
 | 
					 | 
				
			||||||
		fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p)
 | 
					 | 
				
			||||||
		os.Exit(1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return Param{ps[1], ps[2]}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func main() {
 | 
					 | 
				
			||||||
	flag.Usage = usage
 | 
					 | 
				
			||||||
	flag.Parse()
 | 
					 | 
				
			||||||
	if len(flag.Args()) <= 0 {
 | 
					 | 
				
			||||||
		fmt.Fprintf(os.Stderr, "no files to parse provided\n")
 | 
					 | 
				
			||||||
		usage()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	endianness := ""
 | 
					 | 
				
			||||||
	if *b32 {
 | 
					 | 
				
			||||||
		endianness = "big-endian"
 | 
					 | 
				
			||||||
	} else if *l32 {
 | 
					 | 
				
			||||||
		endianness = "little-endian"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	pack := ""
 | 
					 | 
				
			||||||
	// GCCGO
 | 
					 | 
				
			||||||
	textgccgo := ""
 | 
					 | 
				
			||||||
	cExtern := "/*\n#include <stdint.h>\n"
 | 
					 | 
				
			||||||
	// GC
 | 
					 | 
				
			||||||
	textgc := ""
 | 
					 | 
				
			||||||
	dynimports := ""
 | 
					 | 
				
			||||||
	linknames := ""
 | 
					 | 
				
			||||||
	var vars []string
 | 
					 | 
				
			||||||
	// COMMON
 | 
					 | 
				
			||||||
	textcommon := ""
 | 
					 | 
				
			||||||
	for _, path := range flag.Args() {
 | 
					 | 
				
			||||||
		file, err := os.Open(path)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			fmt.Fprintf(os.Stderr, err.Error())
 | 
					 | 
				
			||||||
			os.Exit(1)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		s := bufio.NewScanner(file)
 | 
					 | 
				
			||||||
		for s.Scan() {
 | 
					 | 
				
			||||||
			t := s.Text()
 | 
					 | 
				
			||||||
			if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" {
 | 
					 | 
				
			||||||
				pack = p[1]
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			nonblock := regexp.MustCompile(`^\/\/sysnb\t`).FindStringSubmatch(t)
 | 
					 | 
				
			||||||
			if regexp.MustCompile(`^\/\/sys\t`).FindStringSubmatch(t) == nil && nonblock == nil {
 | 
					 | 
				
			||||||
				continue
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Line must be of the form
 | 
					 | 
				
			||||||
			//	func Open(path string, mode int, perm int) (fd int, err error)
 | 
					 | 
				
			||||||
			// Split into name, in params, out params.
 | 
					 | 
				
			||||||
			f := regexp.MustCompile(`^\/\/sys(nb)?\t(\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t)
 | 
					 | 
				
			||||||
			if f == nil {
 | 
					 | 
				
			||||||
				fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t)
 | 
					 | 
				
			||||||
				os.Exit(1)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Split argument lists on comma.
 | 
					 | 
				
			||||||
			in := parseParamList(inps)
 | 
					 | 
				
			||||||
			out := parseParamList(outps)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			inps = strings.Join(in, ", ")
 | 
					 | 
				
			||||||
			outps = strings.Join(out, ", ")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if sysname == "" {
 | 
					 | 
				
			||||||
				sysname = funct
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			onlyCommon := false
 | 
					 | 
				
			||||||
			if funct == "readlen" || funct == "writelen" || funct == "FcntlInt" || funct == "FcntlFlock" {
 | 
					 | 
				
			||||||
				// This function call another syscall which is already implemented.
 | 
					 | 
				
			||||||
				// Therefore, the gc and gccgo part must not be generated.
 | 
					 | 
				
			||||||
				onlyCommon = true
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Try in vain to keep people from editing this file.
 | 
					 | 
				
			||||||
			// The theory is that they jump into the middle of the file
 | 
					 | 
				
			||||||
			// without reading the header.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			textcommon += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"
 | 
					 | 
				
			||||||
			if !onlyCommon {
 | 
					 | 
				
			||||||
				textgccgo += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"
 | 
					 | 
				
			||||||
				textgc += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Check if value return, err return available
 | 
					 | 
				
			||||||
			errvar := ""
 | 
					 | 
				
			||||||
			rettype := ""
 | 
					 | 
				
			||||||
			for _, param := range out {
 | 
					 | 
				
			||||||
				p := parseParam(param)
 | 
					 | 
				
			||||||
				if p.Type == "error" {
 | 
					 | 
				
			||||||
					errvar = p.Name
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					rettype = p.Type
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`)
 | 
					 | 
				
			||||||
			sysname = strings.ToLower(sysname) // All libc functions are lowercase.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// GCCGO Prototype return type
 | 
					 | 
				
			||||||
			cRettype := ""
 | 
					 | 
				
			||||||
			if rettype == "unsafe.Pointer" {
 | 
					 | 
				
			||||||
				cRettype = "uintptr_t"
 | 
					 | 
				
			||||||
			} else if rettype == "uintptr" {
 | 
					 | 
				
			||||||
				cRettype = "uintptr_t"
 | 
					 | 
				
			||||||
			} else if regexp.MustCompile(`^_`).FindStringSubmatch(rettype) != nil {
 | 
					 | 
				
			||||||
				cRettype = "uintptr_t"
 | 
					 | 
				
			||||||
			} else if rettype == "int" {
 | 
					 | 
				
			||||||
				cRettype = "int"
 | 
					 | 
				
			||||||
			} else if rettype == "int32" {
 | 
					 | 
				
			||||||
				cRettype = "int"
 | 
					 | 
				
			||||||
			} else if rettype == "int64" {
 | 
					 | 
				
			||||||
				cRettype = "long long"
 | 
					 | 
				
			||||||
			} else if rettype == "uint32" {
 | 
					 | 
				
			||||||
				cRettype = "unsigned int"
 | 
					 | 
				
			||||||
			} else if rettype == "uint64" {
 | 
					 | 
				
			||||||
				cRettype = "unsigned long long"
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				cRettype = "int"
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if sysname == "exit" {
 | 
					 | 
				
			||||||
				cRettype = "void"
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// GCCGO Prototype arguments type
 | 
					 | 
				
			||||||
			var cIn []string
 | 
					 | 
				
			||||||
			for i, param := range in {
 | 
					 | 
				
			||||||
				p := parseParam(param)
 | 
					 | 
				
			||||||
				if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "uintptr_t")
 | 
					 | 
				
			||||||
				} else if p.Type == "string" {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "uintptr_t")
 | 
					 | 
				
			||||||
				} else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "uintptr_t", "size_t")
 | 
					 | 
				
			||||||
				} else if p.Type == "unsafe.Pointer" {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "uintptr_t")
 | 
					 | 
				
			||||||
				} else if p.Type == "uintptr" {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "uintptr_t")
 | 
					 | 
				
			||||||
				} else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "uintptr_t")
 | 
					 | 
				
			||||||
				} else if p.Type == "int" {
 | 
					 | 
				
			||||||
					if (i == 0 || i == 2) && funct == "fcntl" {
 | 
					 | 
				
			||||||
						// These fcntl arguments needs to be uintptr to be able to call FcntlInt and FcntlFlock
 | 
					 | 
				
			||||||
						cIn = append(cIn, "uintptr_t")
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						cIn = append(cIn, "int")
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				} else if p.Type == "int32" {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "int")
 | 
					 | 
				
			||||||
				} else if p.Type == "int64" {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "long long")
 | 
					 | 
				
			||||||
				} else if p.Type == "uint32" {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "unsigned int")
 | 
					 | 
				
			||||||
				} else if p.Type == "uint64" {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "unsigned long long")
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					cIn = append(cIn, "int")
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if !onlyCommon {
 | 
					 | 
				
			||||||
				// GCCGO Prototype Generation
 | 
					 | 
				
			||||||
				// Imports of system calls from libc
 | 
					 | 
				
			||||||
				if sysname == "select" {
 | 
					 | 
				
			||||||
					// select is a keyword of Go. Its name is
 | 
					 | 
				
			||||||
					// changed to c_select.
 | 
					 | 
				
			||||||
					cExtern += "#define c_select select\n"
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				cExtern += fmt.Sprintf("%s %s", cRettype, sysname)
 | 
					 | 
				
			||||||
				cIn := strings.Join(cIn, ", ")
 | 
					 | 
				
			||||||
				cExtern += fmt.Sprintf("(%s);\n", cIn)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			// GC Library name
 | 
					 | 
				
			||||||
			if modname == "" {
 | 
					 | 
				
			||||||
				modname = "libc.a/shr_64.o"
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				fmt.Fprintf(os.Stderr, "%s: only syscall using libc are available\n", funct)
 | 
					 | 
				
			||||||
				os.Exit(1)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			sysvarname := fmt.Sprintf("libc_%s", sysname)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if !onlyCommon {
 | 
					 | 
				
			||||||
				// GC Runtime import of function to allow cross-platform builds.
 | 
					 | 
				
			||||||
				dynimports += fmt.Sprintf("//go:cgo_import_dynamic %s %s \"%s\"\n", sysvarname, sysname, modname)
 | 
					 | 
				
			||||||
				// GC Link symbol to proc address variable.
 | 
					 | 
				
			||||||
				linknames += fmt.Sprintf("//go:linkname %s %s\n", sysvarname, sysvarname)
 | 
					 | 
				
			||||||
				// GC Library proc address variable.
 | 
					 | 
				
			||||||
				vars = append(vars, sysvarname)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			strconvfunc := "BytePtrFromString"
 | 
					 | 
				
			||||||
			strconvtype := "*byte"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Go function header.
 | 
					 | 
				
			||||||
			if outps != "" {
 | 
					 | 
				
			||||||
				outps = fmt.Sprintf(" (%s)", outps)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if textcommon != "" {
 | 
					 | 
				
			||||||
				textcommon += "\n"
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			textcommon += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outps)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Prepare arguments tocall.
 | 
					 | 
				
			||||||
			var argscommon []string // Arguments in the common part
 | 
					 | 
				
			||||||
			var argscall []string   // Arguments for call prototype
 | 
					 | 
				
			||||||
			var argsgc []string     // Arguments for gc call (with syscall6)
 | 
					 | 
				
			||||||
			var argsgccgo []string  // Arguments for gccgo call (with C.name_of_syscall)
 | 
					 | 
				
			||||||
			n := 0
 | 
					 | 
				
			||||||
			argN := 0
 | 
					 | 
				
			||||||
			for _, param := range in {
 | 
					 | 
				
			||||||
				p := parseParam(param)
 | 
					 | 
				
			||||||
				if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil {
 | 
					 | 
				
			||||||
					argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(%s))", p.Name))
 | 
					 | 
				
			||||||
					argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name))
 | 
					 | 
				
			||||||
					argsgc = append(argsgc, p.Name)
 | 
					 | 
				
			||||||
					argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name))
 | 
					 | 
				
			||||||
				} else if p.Type == "string" && errvar != "" {
 | 
					 | 
				
			||||||
					textcommon += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype)
 | 
					 | 
				
			||||||
					textcommon += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name)
 | 
					 | 
				
			||||||
					textcommon += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n))
 | 
					 | 
				
			||||||
					argscall = append(argscall, fmt.Sprintf("_p%d uintptr ", n))
 | 
					 | 
				
			||||||
					argsgc = append(argsgc, fmt.Sprintf("_p%d", n))
 | 
					 | 
				
			||||||
					argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n))
 | 
					 | 
				
			||||||
					n++
 | 
					 | 
				
			||||||
				} else if p.Type == "string" {
 | 
					 | 
				
			||||||
					fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n")
 | 
					 | 
				
			||||||
					textcommon += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype)
 | 
					 | 
				
			||||||
					textcommon += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name)
 | 
					 | 
				
			||||||
					textcommon += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n))
 | 
					 | 
				
			||||||
					argscall = append(argscall, fmt.Sprintf("_p%d uintptr", n))
 | 
					 | 
				
			||||||
					argsgc = append(argsgc, fmt.Sprintf("_p%d", n))
 | 
					 | 
				
			||||||
					argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n))
 | 
					 | 
				
			||||||
					n++
 | 
					 | 
				
			||||||
				} else if m := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); m != nil {
 | 
					 | 
				
			||||||
					// Convert slice into pointer, length.
 | 
					 | 
				
			||||||
					// Have to be careful not to take address of &a[0] if len == 0:
 | 
					 | 
				
			||||||
					// pass nil in that case.
 | 
					 | 
				
			||||||
					textcommon += fmt.Sprintf("\tvar _p%d *%s\n", n, m[1])
 | 
					 | 
				
			||||||
					textcommon += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name)
 | 
					 | 
				
			||||||
					argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n), fmt.Sprintf("len(%s)", p.Name))
 | 
					 | 
				
			||||||
					argscall = append(argscall, fmt.Sprintf("_p%d uintptr", n), fmt.Sprintf("_lenp%d int", n))
 | 
					 | 
				
			||||||
					argsgc = append(argsgc, fmt.Sprintf("_p%d", n), fmt.Sprintf("uintptr(_lenp%d)", n))
 | 
					 | 
				
			||||||
					argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n), fmt.Sprintf("C.size_t(_lenp%d)", n))
 | 
					 | 
				
			||||||
					n++
 | 
					 | 
				
			||||||
				} else if p.Type == "int64" && endianness != "" {
 | 
					 | 
				
			||||||
					fmt.Fprintf(os.Stderr, path+":"+funct+" uses int64 with 32 bits mode. Case not yet implemented\n")
 | 
					 | 
				
			||||||
				} else if p.Type == "bool" {
 | 
					 | 
				
			||||||
					fmt.Fprintf(os.Stderr, path+":"+funct+" uses bool. Case not yet implemented\n")
 | 
					 | 
				
			||||||
				} else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil || p.Type == "unsafe.Pointer" {
 | 
					 | 
				
			||||||
					argscommon = append(argscommon, fmt.Sprintf("uintptr(%s)", p.Name))
 | 
					 | 
				
			||||||
					argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name))
 | 
					 | 
				
			||||||
					argsgc = append(argsgc, p.Name)
 | 
					 | 
				
			||||||
					argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name))
 | 
					 | 
				
			||||||
				} else if p.Type == "int" {
 | 
					 | 
				
			||||||
					if (argN == 0 || argN == 2) && ((funct == "fcntl") || (funct == "FcntlInt") || (funct == "FcntlFlock")) {
 | 
					 | 
				
			||||||
						// These fcntl arguments need to be uintptr to be able to call FcntlInt and FcntlFlock
 | 
					 | 
				
			||||||
						argscommon = append(argscommon, fmt.Sprintf("uintptr(%s)", p.Name))
 | 
					 | 
				
			||||||
						argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name))
 | 
					 | 
				
			||||||
						argsgc = append(argsgc, p.Name)
 | 
					 | 
				
			||||||
						argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						argscommon = append(argscommon, p.Name)
 | 
					 | 
				
			||||||
						argscall = append(argscall, fmt.Sprintf("%s int", p.Name))
 | 
					 | 
				
			||||||
						argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name))
 | 
					 | 
				
			||||||
						argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name))
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} else if p.Type == "int32" {
 | 
					 | 
				
			||||||
					argscommon = append(argscommon, p.Name)
 | 
					 | 
				
			||||||
					argscall = append(argscall, fmt.Sprintf("%s int32", p.Name))
 | 
					 | 
				
			||||||
					argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name))
 | 
					 | 
				
			||||||
					argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name))
 | 
					 | 
				
			||||||
				} else if p.Type == "int64" {
 | 
					 | 
				
			||||||
					argscommon = append(argscommon, p.Name)
 | 
					 | 
				
			||||||
					argscall = append(argscall, fmt.Sprintf("%s int64", p.Name))
 | 
					 | 
				
			||||||
					argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name))
 | 
					 | 
				
			||||||
					argsgccgo = append(argsgccgo, fmt.Sprintf("C.longlong(%s)", p.Name))
 | 
					 | 
				
			||||||
				} else if p.Type == "uint32" {
 | 
					 | 
				
			||||||
					argscommon = append(argscommon, p.Name)
 | 
					 | 
				
			||||||
					argscall = append(argscall, fmt.Sprintf("%s uint32", p.Name))
 | 
					 | 
				
			||||||
					argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name))
 | 
					 | 
				
			||||||
					argsgccgo = append(argsgccgo, fmt.Sprintf("C.uint(%s)", p.Name))
 | 
					 | 
				
			||||||
				} else if p.Type == "uint64" {
 | 
					 | 
				
			||||||
					argscommon = append(argscommon, p.Name)
 | 
					 | 
				
			||||||
					argscall = append(argscall, fmt.Sprintf("%s uint64", p.Name))
 | 
					 | 
				
			||||||
					argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name))
 | 
					 | 
				
			||||||
					argsgccgo = append(argsgccgo, fmt.Sprintf("C.ulonglong(%s)", p.Name))
 | 
					 | 
				
			||||||
				} else if p.Type == "uintptr" {
 | 
					 | 
				
			||||||
					argscommon = append(argscommon, p.Name)
 | 
					 | 
				
			||||||
					argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name))
 | 
					 | 
				
			||||||
					argsgc = append(argsgc, p.Name)
 | 
					 | 
				
			||||||
					argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name))
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					argscommon = append(argscommon, fmt.Sprintf("int(%s)", p.Name))
 | 
					 | 
				
			||||||
					argscall = append(argscall, fmt.Sprintf("%s int", p.Name))
 | 
					 | 
				
			||||||
					argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name))
 | 
					 | 
				
			||||||
					argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name))
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				argN++
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			nargs := len(argsgc)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// COMMON function generation
 | 
					 | 
				
			||||||
			argscommonlist := strings.Join(argscommon, ", ")
 | 
					 | 
				
			||||||
			callcommon := fmt.Sprintf("call%s(%s)", sysname, argscommonlist)
 | 
					 | 
				
			||||||
			ret := []string{"_", "_"}
 | 
					 | 
				
			||||||
			body := ""
 | 
					 | 
				
			||||||
			doErrno := false
 | 
					 | 
				
			||||||
			for i := 0; i < len(out); i++ {
 | 
					 | 
				
			||||||
				p := parseParam(out[i])
 | 
					 | 
				
			||||||
				reg := ""
 | 
					 | 
				
			||||||
				if p.Name == "err" {
 | 
					 | 
				
			||||||
					reg = "e1"
 | 
					 | 
				
			||||||
					ret[1] = reg
 | 
					 | 
				
			||||||
					doErrno = true
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					reg = "r0"
 | 
					 | 
				
			||||||
					ret[0] = reg
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if p.Type == "bool" {
 | 
					 | 
				
			||||||
					reg = fmt.Sprintf("%s != 0", reg)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if reg != "e1" {
 | 
					 | 
				
			||||||
					body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if ret[0] == "_" && ret[1] == "_" {
 | 
					 | 
				
			||||||
				textcommon += fmt.Sprintf("\t%s\n", callcommon)
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				textcommon += fmt.Sprintf("\t%s, %s := %s\n", ret[0], ret[1], callcommon)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			textcommon += body
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if doErrno {
 | 
					 | 
				
			||||||
				textcommon += "\tif e1 != 0 {\n"
 | 
					 | 
				
			||||||
				textcommon += "\t\terr = errnoErr(e1)\n"
 | 
					 | 
				
			||||||
				textcommon += "\t}\n"
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			textcommon += "\treturn\n"
 | 
					 | 
				
			||||||
			textcommon += "}\n"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if onlyCommon {
 | 
					 | 
				
			||||||
				continue
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// CALL Prototype
 | 
					 | 
				
			||||||
			callProto := fmt.Sprintf("func call%s(%s) (r1 uintptr, e1 Errno) {\n", sysname, strings.Join(argscall, ", "))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// GC function generation
 | 
					 | 
				
			||||||
			asm := "syscall6"
 | 
					 | 
				
			||||||
			if nonblock != nil {
 | 
					 | 
				
			||||||
				asm = "rawSyscall6"
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if len(argsgc) <= 6 {
 | 
					 | 
				
			||||||
				for len(argsgc) < 6 {
 | 
					 | 
				
			||||||
					argsgc = append(argsgc, "0")
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				fmt.Fprintf(os.Stderr, "%s: too many arguments to system call", funct)
 | 
					 | 
				
			||||||
				os.Exit(1)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			argsgclist := strings.Join(argsgc, ", ")
 | 
					 | 
				
			||||||
			callgc := fmt.Sprintf("%s(uintptr(unsafe.Pointer(&%s)), %d, %s)", asm, sysvarname, nargs, argsgclist)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			textgc += callProto
 | 
					 | 
				
			||||||
			textgc += fmt.Sprintf("\tr1, _, e1 = %s\n", callgc)
 | 
					 | 
				
			||||||
			textgc += "\treturn\n}\n"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// GCCGO function generation
 | 
					 | 
				
			||||||
			argsgccgolist := strings.Join(argsgccgo, ", ")
 | 
					 | 
				
			||||||
			var callgccgo string
 | 
					 | 
				
			||||||
			if sysname == "select" {
 | 
					 | 
				
			||||||
				// select is a keyword of Go. Its name is
 | 
					 | 
				
			||||||
				// changed to c_select.
 | 
					 | 
				
			||||||
				callgccgo = fmt.Sprintf("C.c_%s(%s)", sysname, argsgccgolist)
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				callgccgo = fmt.Sprintf("C.%s(%s)", sysname, argsgccgolist)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			textgccgo += callProto
 | 
					 | 
				
			||||||
			textgccgo += fmt.Sprintf("\tr1 = uintptr(%s)\n", callgccgo)
 | 
					 | 
				
			||||||
			textgccgo += "\te1 = syscall.GetErrno()\n"
 | 
					 | 
				
			||||||
			textgccgo += "\treturn\n}\n"
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if err := s.Err(); err != nil {
 | 
					 | 
				
			||||||
			fmt.Fprintf(os.Stderr, err.Error())
 | 
					 | 
				
			||||||
			os.Exit(1)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		file.Close()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	imp := ""
 | 
					 | 
				
			||||||
	if pack != "unix" {
 | 
					 | 
				
			||||||
		imp = "import \"golang.org/x/sys/unix\"\n"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Print zsyscall_aix_ppc64.go
 | 
					 | 
				
			||||||
	err := ioutil.WriteFile("zsyscall_aix_ppc64.go",
 | 
					 | 
				
			||||||
		[]byte(fmt.Sprintf(srcTemplate1, cmdLine(), goBuildTags(), plusBuildTags(), pack, imp, textcommon)),
 | 
					 | 
				
			||||||
		0644)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		fmt.Fprintf(os.Stderr, err.Error())
 | 
					 | 
				
			||||||
		os.Exit(1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Print zsyscall_aix_ppc64_gc.go
 | 
					 | 
				
			||||||
	vardecls := "\t" + strings.Join(vars, ",\n\t")
 | 
					 | 
				
			||||||
	vardecls += " syscallFunc"
 | 
					 | 
				
			||||||
	err = ioutil.WriteFile("zsyscall_aix_ppc64_gc.go",
 | 
					 | 
				
			||||||
		[]byte(fmt.Sprintf(srcTemplate2, cmdLine(), goBuildTags(), plusBuildTags(), pack, imp, dynimports, linknames, vardecls, textgc)),
 | 
					 | 
				
			||||||
		0644)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		fmt.Fprintf(os.Stderr, err.Error())
 | 
					 | 
				
			||||||
		os.Exit(1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Print zsyscall_aix_ppc64_gccgo.go
 | 
					 | 
				
			||||||
	err = ioutil.WriteFile("zsyscall_aix_ppc64_gccgo.go",
 | 
					 | 
				
			||||||
		[]byte(fmt.Sprintf(srcTemplate3, cmdLine(), goBuildTags(), plusBuildTags(), pack, cExtern, imp, textgccgo)),
 | 
					 | 
				
			||||||
		0644)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		fmt.Fprintf(os.Stderr, err.Error())
 | 
					 | 
				
			||||||
		os.Exit(1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const srcTemplate1 = `// %s
 | 
					 | 
				
			||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build %s
 | 
					 | 
				
			||||||
// +build %s
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package %s
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"unsafe"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%s
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%s
 | 
					 | 
				
			||||||
`
 | 
					 | 
				
			||||||
const srcTemplate2 = `// %s
 | 
					 | 
				
			||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build %s && gc
 | 
					 | 
				
			||||||
// +build %s,gc
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package %s
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"unsafe"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
%s
 | 
					 | 
				
			||||||
%s
 | 
					 | 
				
			||||||
%s
 | 
					 | 
				
			||||||
type syscallFunc uintptr
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var (
 | 
					 | 
				
			||||||
%s
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 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)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%s
 | 
					 | 
				
			||||||
`
 | 
					 | 
				
			||||||
const srcTemplate3 = `// %s
 | 
					 | 
				
			||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build %s && gccgo
 | 
					 | 
				
			||||||
// +build %s,gccgo
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package %s
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%s
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
import "C"
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"syscall"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%s
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%s
 | 
					 | 
				
			||||||
`
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,346 +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.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build ignore
 | 
					 | 
				
			||||||
// +build ignore
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 This program reads a file containing function prototypes
 | 
					 | 
				
			||||||
 (like syscall_solaris.go) and generates system call bodies.
 | 
					 | 
				
			||||||
 The prototypes are marked by lines beginning with "//sys"
 | 
					 | 
				
			||||||
 and read like func declarations if //sys is replaced by func, but:
 | 
					 | 
				
			||||||
	* The parameter lists must give a name for each argument.
 | 
					 | 
				
			||||||
	  This includes return parameters.
 | 
					 | 
				
			||||||
	* The parameter lists must give a type for each argument:
 | 
					 | 
				
			||||||
	  the (x, y, z int) shorthand is not allowed.
 | 
					 | 
				
			||||||
	* If the return parameter is an error number, it must be named err.
 | 
					 | 
				
			||||||
	* If go func name needs to be different than its libc name,
 | 
					 | 
				
			||||||
	* or the function is not in libc, name could be specified
 | 
					 | 
				
			||||||
	* at the end, after "=" sign, like
 | 
					 | 
				
			||||||
	  //sys	getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package main
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"bufio"
 | 
					 | 
				
			||||||
	"flag"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"regexp"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var (
 | 
					 | 
				
			||||||
	b32     = flag.Bool("b32", false, "32bit big-endian")
 | 
					 | 
				
			||||||
	l32     = flag.Bool("l32", false, "32bit little-endian")
 | 
					 | 
				
			||||||
	tags    = flag.String("tags", "", "build tags")
 | 
					 | 
				
			||||||
	illumos = flag.Bool("illumos", false, "illumos specific code generation")
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// cmdLine returns this programs's commandline arguments
 | 
					 | 
				
			||||||
func cmdLine() string {
 | 
					 | 
				
			||||||
	return "go run mksyscall_solaris.go " + strings.Join(os.Args[1:], " ")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// goBuildTags returns build tags in the go:build format.
 | 
					 | 
				
			||||||
func goBuildTags() string {
 | 
					 | 
				
			||||||
	return strings.ReplaceAll(*tags, ",", " && ")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// plusBuildTags returns build tags in the +build format.
 | 
					 | 
				
			||||||
func plusBuildTags() string {
 | 
					 | 
				
			||||||
	return *tags
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Param is function parameter
 | 
					 | 
				
			||||||
type Param struct {
 | 
					 | 
				
			||||||
	Name string
 | 
					 | 
				
			||||||
	Type string
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// usage prints the program usage
 | 
					 | 
				
			||||||
func usage() {
 | 
					 | 
				
			||||||
	fmt.Fprintf(os.Stderr, "usage: go run mksyscall_solaris.go [-b32 | -l32] [-tags x,y] [file ...]\n")
 | 
					 | 
				
			||||||
	os.Exit(1)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// parseParamList parses parameter list and returns a slice of parameters
 | 
					 | 
				
			||||||
func parseParamList(list string) []string {
 | 
					 | 
				
			||||||
	list = strings.TrimSpace(list)
 | 
					 | 
				
			||||||
	if list == "" {
 | 
					 | 
				
			||||||
		return []string{}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return regexp.MustCompile(`\s*,\s*`).Split(list, -1)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// parseParam splits a parameter into name and type
 | 
					 | 
				
			||||||
func parseParam(p string) Param {
 | 
					 | 
				
			||||||
	ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p)
 | 
					 | 
				
			||||||
	if ps == nil {
 | 
					 | 
				
			||||||
		fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p)
 | 
					 | 
				
			||||||
		os.Exit(1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return Param{ps[1], ps[2]}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func main() {
 | 
					 | 
				
			||||||
	flag.Usage = usage
 | 
					 | 
				
			||||||
	flag.Parse()
 | 
					 | 
				
			||||||
	if len(flag.Args()) <= 0 {
 | 
					 | 
				
			||||||
		fmt.Fprintf(os.Stderr, "no files to parse provided\n")
 | 
					 | 
				
			||||||
		usage()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	endianness := ""
 | 
					 | 
				
			||||||
	if *b32 {
 | 
					 | 
				
			||||||
		endianness = "big-endian"
 | 
					 | 
				
			||||||
	} else if *l32 {
 | 
					 | 
				
			||||||
		endianness = "little-endian"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	pack := ""
 | 
					 | 
				
			||||||
	text := ""
 | 
					 | 
				
			||||||
	dynimports := ""
 | 
					 | 
				
			||||||
	linknames := ""
 | 
					 | 
				
			||||||
	var vars []string
 | 
					 | 
				
			||||||
	for _, path := range flag.Args() {
 | 
					 | 
				
			||||||
		file, err := os.Open(path)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			fmt.Fprintf(os.Stderr, err.Error())
 | 
					 | 
				
			||||||
			os.Exit(1)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		s := bufio.NewScanner(file)
 | 
					 | 
				
			||||||
		for s.Scan() {
 | 
					 | 
				
			||||||
			t := s.Text()
 | 
					 | 
				
			||||||
			if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" {
 | 
					 | 
				
			||||||
				pack = p[1]
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			nonblock := regexp.MustCompile(`^\/\/sysnb\t`).FindStringSubmatch(t)
 | 
					 | 
				
			||||||
			if regexp.MustCompile(`^\/\/sys\t`).FindStringSubmatch(t) == nil && nonblock == nil {
 | 
					 | 
				
			||||||
				continue
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Line must be of the form
 | 
					 | 
				
			||||||
			//	func Open(path string, mode int, perm int) (fd int, err error)
 | 
					 | 
				
			||||||
			// Split into name, in params, out params.
 | 
					 | 
				
			||||||
			f := regexp.MustCompile(`^\/\/sys(nb)?\t(\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t)
 | 
					 | 
				
			||||||
			if f == nil {
 | 
					 | 
				
			||||||
				fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t)
 | 
					 | 
				
			||||||
				os.Exit(1)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Split argument lists on comma.
 | 
					 | 
				
			||||||
			in := parseParamList(inps)
 | 
					 | 
				
			||||||
			out := parseParamList(outps)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			inps = strings.Join(in, ", ")
 | 
					 | 
				
			||||||
			outps = strings.Join(out, ", ")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Try in vain to keep people from editing this file.
 | 
					 | 
				
			||||||
			// The theory is that they jump into the middle of the file
 | 
					 | 
				
			||||||
			// without reading the header.
 | 
					 | 
				
			||||||
			text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// So file name.
 | 
					 | 
				
			||||||
			if modname == "" {
 | 
					 | 
				
			||||||
				modname = "libc"
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// System call name.
 | 
					 | 
				
			||||||
			if sysname == "" {
 | 
					 | 
				
			||||||
				sysname = funct
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// System call pointer variable name.
 | 
					 | 
				
			||||||
			sysvarname := fmt.Sprintf("proc%s", sysname)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			strconvfunc := "BytePtrFromString"
 | 
					 | 
				
			||||||
			strconvtype := "*byte"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			sysname = strings.ToLower(sysname) // All libc functions are lowercase.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Runtime import of function to allow cross-platform builds.
 | 
					 | 
				
			||||||
			dynimports += fmt.Sprintf("//go:cgo_import_dynamic libc_%s %s \"%s.so\"\n", sysname, sysname, modname)
 | 
					 | 
				
			||||||
			// Link symbol to proc address variable.
 | 
					 | 
				
			||||||
			linknames += fmt.Sprintf("//go:linkname %s libc_%s\n", sysvarname, sysname)
 | 
					 | 
				
			||||||
			// Library proc address variable.
 | 
					 | 
				
			||||||
			vars = append(vars, sysvarname)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Go function header.
 | 
					 | 
				
			||||||
			outlist := strings.Join(out, ", ")
 | 
					 | 
				
			||||||
			if outlist != "" {
 | 
					 | 
				
			||||||
				outlist = fmt.Sprintf(" (%s)", outlist)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if text != "" {
 | 
					 | 
				
			||||||
				text += "\n"
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outlist)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Check if err return available
 | 
					 | 
				
			||||||
			errvar := ""
 | 
					 | 
				
			||||||
			for _, param := range out {
 | 
					 | 
				
			||||||
				p := parseParam(param)
 | 
					 | 
				
			||||||
				if p.Type == "error" {
 | 
					 | 
				
			||||||
					errvar = p.Name
 | 
					 | 
				
			||||||
					continue
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Prepare arguments to Syscall.
 | 
					 | 
				
			||||||
			var args []string
 | 
					 | 
				
			||||||
			n := 0
 | 
					 | 
				
			||||||
			for _, param := range in {
 | 
					 | 
				
			||||||
				p := parseParam(param)
 | 
					 | 
				
			||||||
				if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil {
 | 
					 | 
				
			||||||
					args = append(args, "uintptr(unsafe.Pointer("+p.Name+"))")
 | 
					 | 
				
			||||||
				} else if p.Type == "string" && errvar != "" {
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype)
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name)
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar)
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n))
 | 
					 | 
				
			||||||
					n++
 | 
					 | 
				
			||||||
				} else if p.Type == "string" {
 | 
					 | 
				
			||||||
					fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n")
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype)
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\t_p%d, _ = %s(%s)\n", n, strconvfunc, p.Name)
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n))
 | 
					 | 
				
			||||||
					n++
 | 
					 | 
				
			||||||
				} else if s := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); s != nil {
 | 
					 | 
				
			||||||
					// Convert slice into pointer, length.
 | 
					 | 
				
			||||||
					// Have to be careful not to take address of &a[0] if len == 0:
 | 
					 | 
				
			||||||
					// pass nil in that case.
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\tvar _p%d *%s\n", n, s[1])
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name)
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n), fmt.Sprintf("uintptr(len(%s))", p.Name))
 | 
					 | 
				
			||||||
					n++
 | 
					 | 
				
			||||||
				} else if p.Type == "int64" && endianness != "" {
 | 
					 | 
				
			||||||
					if endianness == "big-endian" {
 | 
					 | 
				
			||||||
						args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name))
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name))
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} else if p.Type == "bool" {
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\tvar _p%d uint32\n", n)
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("\tif %s {\n\t\t_p%d = 1\n\t} else {\n\t\t_p%d = 0\n\t}\n", p.Name, n, n)
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("uintptr(_p%d)", n))
 | 
					 | 
				
			||||||
					n++
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					args = append(args, fmt.Sprintf("uintptr(%s)", p.Name))
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			nargs := len(args)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Determine which form to use; pad args with zeros.
 | 
					 | 
				
			||||||
			asm := "sysvicall6"
 | 
					 | 
				
			||||||
			if nonblock != nil {
 | 
					 | 
				
			||||||
				asm = "rawSysvicall6"
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if len(args) <= 6 {
 | 
					 | 
				
			||||||
				for len(args) < 6 {
 | 
					 | 
				
			||||||
					args = append(args, "0")
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				fmt.Fprintf(os.Stderr, "%s: too many arguments to system call\n", path)
 | 
					 | 
				
			||||||
				os.Exit(1)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Actual call.
 | 
					 | 
				
			||||||
			arglist := strings.Join(args, ", ")
 | 
					 | 
				
			||||||
			call := fmt.Sprintf("%s(uintptr(unsafe.Pointer(&%s)), %d, %s)", asm, sysvarname, nargs, arglist)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Assign return values.
 | 
					 | 
				
			||||||
			body := ""
 | 
					 | 
				
			||||||
			ret := []string{"_", "_", "_"}
 | 
					 | 
				
			||||||
			doErrno := false
 | 
					 | 
				
			||||||
			for i := 0; i < len(out); i++ {
 | 
					 | 
				
			||||||
				p := parseParam(out[i])
 | 
					 | 
				
			||||||
				reg := ""
 | 
					 | 
				
			||||||
				if p.Name == "err" {
 | 
					 | 
				
			||||||
					reg = "e1"
 | 
					 | 
				
			||||||
					ret[2] = reg
 | 
					 | 
				
			||||||
					doErrno = true
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					reg = fmt.Sprintf("r%d", i)
 | 
					 | 
				
			||||||
					ret[i] = reg
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if p.Type == "bool" {
 | 
					 | 
				
			||||||
					reg = fmt.Sprintf("%d != 0", reg)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if p.Type == "int64" && endianness != "" {
 | 
					 | 
				
			||||||
					// 64-bit number in r1:r0 or r0:r1.
 | 
					 | 
				
			||||||
					if i+2 > len(out) {
 | 
					 | 
				
			||||||
						fmt.Fprintf(os.Stderr, "%s: not enough registers for int64 return\n", path)
 | 
					 | 
				
			||||||
						os.Exit(1)
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					if endianness == "big-endian" {
 | 
					 | 
				
			||||||
						reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i, i+1)
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i+1, i)
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					ret[i] = fmt.Sprintf("r%d", i)
 | 
					 | 
				
			||||||
					ret[i+1] = fmt.Sprintf("r%d", i+1)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if reg != "e1" {
 | 
					 | 
				
			||||||
					body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if ret[0] == "_" && ret[1] == "_" && ret[2] == "_" {
 | 
					 | 
				
			||||||
				text += fmt.Sprintf("\t%s\n", call)
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				text += fmt.Sprintf("\t%s, %s, %s := %s\n", ret[0], ret[1], ret[2], call)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			text += body
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if doErrno {
 | 
					 | 
				
			||||||
				text += "\tif e1 != 0 {\n"
 | 
					 | 
				
			||||||
				text += "\t\terr = e1\n"
 | 
					 | 
				
			||||||
				text += "\t}\n"
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			text += "\treturn\n"
 | 
					 | 
				
			||||||
			text += "}\n"
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if err := s.Err(); err != nil {
 | 
					 | 
				
			||||||
			fmt.Fprintf(os.Stderr, err.Error())
 | 
					 | 
				
			||||||
			os.Exit(1)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		file.Close()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	imp := ""
 | 
					 | 
				
			||||||
	if pack != "unix" {
 | 
					 | 
				
			||||||
		imp = "import \"golang.org/x/sys/unix\"\n"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	syscallimp := ""
 | 
					 | 
				
			||||||
	if !*illumos {
 | 
					 | 
				
			||||||
		syscallimp = "\"syscall\""
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	vardecls := "\t" + strings.Join(vars, ",\n\t")
 | 
					 | 
				
			||||||
	vardecls += " syscallFunc"
 | 
					 | 
				
			||||||
	fmt.Printf(srcTemplate, cmdLine(), goBuildTags(), plusBuildTags(), pack, syscallimp, imp, dynimports, linknames, vardecls, text)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const srcTemplate = `// %s
 | 
					 | 
				
			||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build %s
 | 
					 | 
				
			||||||
// +build %s
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package %s
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
        "unsafe"
 | 
					 | 
				
			||||||
        %s
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
%s
 | 
					 | 
				
			||||||
%s
 | 
					 | 
				
			||||||
%s
 | 
					 | 
				
			||||||
var (
 | 
					 | 
				
			||||||
%s	
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%s
 | 
					 | 
				
			||||||
`
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,358 +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.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build ignore
 | 
					 | 
				
			||||||
// +build ignore
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Parse the header files for OpenBSD and generate a Go usable sysctl MIB.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Build a MIB with each entry being an array containing the level, type and
 | 
					 | 
				
			||||||
// a hash that will contain additional entries if the current entry is a node.
 | 
					 | 
				
			||||||
// We then walk this MIB and create a flattened sysctl name to OID hash.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package main
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"bufio"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"path/filepath"
 | 
					 | 
				
			||||||
	"regexp"
 | 
					 | 
				
			||||||
	"sort"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var (
 | 
					 | 
				
			||||||
	goos, goarch string
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// cmdLine returns this programs's commandline arguments.
 | 
					 | 
				
			||||||
func cmdLine() string {
 | 
					 | 
				
			||||||
	return "go run mksysctl_openbsd.go " + strings.Join(os.Args[1:], " ")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// goBuildTags returns build tags in the go:build format.
 | 
					 | 
				
			||||||
func goBuildTags() string {
 | 
					 | 
				
			||||||
	return fmt.Sprintf("%s && %s", goarch, goos)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// plusBuildTags returns build tags in the +build format.
 | 
					 | 
				
			||||||
func plusBuildTags() string {
 | 
					 | 
				
			||||||
	return fmt.Sprintf("%s,%s", goarch, goos)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// reMatch performs regular expression match and stores the substring slice to value pointed by m.
 | 
					 | 
				
			||||||
func reMatch(re *regexp.Regexp, str string, m *[]string) bool {
 | 
					 | 
				
			||||||
	*m = re.FindStringSubmatch(str)
 | 
					 | 
				
			||||||
	if *m != nil {
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return false
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type nodeElement struct {
 | 
					 | 
				
			||||||
	n  int
 | 
					 | 
				
			||||||
	t  string
 | 
					 | 
				
			||||||
	pE *map[string]nodeElement
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var (
 | 
					 | 
				
			||||||
	debugEnabled bool
 | 
					 | 
				
			||||||
	mib          map[string]nodeElement
 | 
					 | 
				
			||||||
	node         *map[string]nodeElement
 | 
					 | 
				
			||||||
	nodeMap      map[string]string
 | 
					 | 
				
			||||||
	sysCtl       []string
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var (
 | 
					 | 
				
			||||||
	ctlNames1RE = regexp.MustCompile(`^#define\s+(CTL_NAMES)\s+{`)
 | 
					 | 
				
			||||||
	ctlNames2RE = regexp.MustCompile(`^#define\s+(CTL_(.*)_NAMES)\s+{`)
 | 
					 | 
				
			||||||
	ctlNames3RE = regexp.MustCompile(`^#define\s+((.*)CTL_NAMES)\s+{`)
 | 
					 | 
				
			||||||
	netInetRE   = regexp.MustCompile(`^netinet/`)
 | 
					 | 
				
			||||||
	netInet6RE  = regexp.MustCompile(`^netinet6/`)
 | 
					 | 
				
			||||||
	netRE       = regexp.MustCompile(`^net/`)
 | 
					 | 
				
			||||||
	bracesRE    = regexp.MustCompile(`{.*}`)
 | 
					 | 
				
			||||||
	ctlTypeRE   = regexp.MustCompile(`{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}`)
 | 
					 | 
				
			||||||
	fsNetKernRE = regexp.MustCompile(`^(fs|net|kern)_`)
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func debug(s string) {
 | 
					 | 
				
			||||||
	if debugEnabled {
 | 
					 | 
				
			||||||
		fmt.Fprintln(os.Stderr, s)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Walk the MIB and build a sysctl name to OID mapping.
 | 
					 | 
				
			||||||
func buildSysctl(pNode *map[string]nodeElement, name string, oid []int) {
 | 
					 | 
				
			||||||
	lNode := pNode // local copy of pointer to node
 | 
					 | 
				
			||||||
	var keys []string
 | 
					 | 
				
			||||||
	for k := range *lNode {
 | 
					 | 
				
			||||||
		keys = append(keys, k)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	sort.Strings(keys)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for _, key := range keys {
 | 
					 | 
				
			||||||
		nodename := name
 | 
					 | 
				
			||||||
		if name != "" {
 | 
					 | 
				
			||||||
			nodename += "."
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		nodename += key
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		nodeoid := append(oid, (*pNode)[key].n)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (*pNode)[key].t == `CTLTYPE_NODE` {
 | 
					 | 
				
			||||||
			if _, ok := nodeMap[nodename]; ok {
 | 
					 | 
				
			||||||
				lNode = &mib
 | 
					 | 
				
			||||||
				ctlName := nodeMap[nodename]
 | 
					 | 
				
			||||||
				for _, part := range strings.Split(ctlName, ".") {
 | 
					 | 
				
			||||||
					lNode = ((*lNode)[part]).pE
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				lNode = (*pNode)[key].pE
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			buildSysctl(lNode, nodename, nodeoid)
 | 
					 | 
				
			||||||
		} else if (*pNode)[key].t != "" {
 | 
					 | 
				
			||||||
			oidStr := []string{}
 | 
					 | 
				
			||||||
			for j := range nodeoid {
 | 
					 | 
				
			||||||
				oidStr = append(oidStr, fmt.Sprintf("%d", nodeoid[j]))
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			text := "\t{ \"" + nodename + "\", []_C_int{ " + strings.Join(oidStr, ", ") + " } }, \n"
 | 
					 | 
				
			||||||
			sysCtl = append(sysCtl, text)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func main() {
 | 
					 | 
				
			||||||
	// Get the OS (using GOOS_TARGET if it exist)
 | 
					 | 
				
			||||||
	goos = os.Getenv("GOOS_TARGET")
 | 
					 | 
				
			||||||
	if goos == "" {
 | 
					 | 
				
			||||||
		goos = os.Getenv("GOOS")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// Get the architecture (using GOARCH_TARGET if it exists)
 | 
					 | 
				
			||||||
	goarch = os.Getenv("GOARCH_TARGET")
 | 
					 | 
				
			||||||
	if goarch == "" {
 | 
					 | 
				
			||||||
		goarch = os.Getenv("GOARCH")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// Check if GOOS and GOARCH environment variables are defined
 | 
					 | 
				
			||||||
	if goarch == "" || goos == "" {
 | 
					 | 
				
			||||||
		fmt.Fprintf(os.Stderr, "GOARCH or GOOS not defined in environment\n")
 | 
					 | 
				
			||||||
		os.Exit(1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	mib = make(map[string]nodeElement)
 | 
					 | 
				
			||||||
	headers := [...]string{
 | 
					 | 
				
			||||||
		`sys/sysctl.h`,
 | 
					 | 
				
			||||||
		`sys/socket.h`,
 | 
					 | 
				
			||||||
		`sys/tty.h`,
 | 
					 | 
				
			||||||
		`sys/malloc.h`,
 | 
					 | 
				
			||||||
		`sys/mount.h`,
 | 
					 | 
				
			||||||
		`sys/namei.h`,
 | 
					 | 
				
			||||||
		`sys/sem.h`,
 | 
					 | 
				
			||||||
		`sys/shm.h`,
 | 
					 | 
				
			||||||
		`sys/vmmeter.h`,
 | 
					 | 
				
			||||||
		`uvm/uvmexp.h`,
 | 
					 | 
				
			||||||
		`uvm/uvm_param.h`,
 | 
					 | 
				
			||||||
		`uvm/uvm_swap_encrypt.h`,
 | 
					 | 
				
			||||||
		`ddb/db_var.h`,
 | 
					 | 
				
			||||||
		`net/if.h`,
 | 
					 | 
				
			||||||
		`net/if_pfsync.h`,
 | 
					 | 
				
			||||||
		`net/pipex.h`,
 | 
					 | 
				
			||||||
		`netinet/in.h`,
 | 
					 | 
				
			||||||
		`netinet/icmp_var.h`,
 | 
					 | 
				
			||||||
		`netinet/igmp_var.h`,
 | 
					 | 
				
			||||||
		`netinet/ip_ah.h`,
 | 
					 | 
				
			||||||
		`netinet/ip_carp.h`,
 | 
					 | 
				
			||||||
		`netinet/ip_divert.h`,
 | 
					 | 
				
			||||||
		`netinet/ip_esp.h`,
 | 
					 | 
				
			||||||
		`netinet/ip_ether.h`,
 | 
					 | 
				
			||||||
		`netinet/ip_gre.h`,
 | 
					 | 
				
			||||||
		`netinet/ip_ipcomp.h`,
 | 
					 | 
				
			||||||
		`netinet/ip_ipip.h`,
 | 
					 | 
				
			||||||
		`netinet/tcp_var.h`,
 | 
					 | 
				
			||||||
		`netinet/udp_var.h`,
 | 
					 | 
				
			||||||
		`netinet6/in6.h`,
 | 
					 | 
				
			||||||
		`netinet6/ip6_divert.h`,
 | 
					 | 
				
			||||||
		`netinet/icmp6.h`,
 | 
					 | 
				
			||||||
		`netmpls/mpls.h`,
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ctls := [...]string{
 | 
					 | 
				
			||||||
		`kern`,
 | 
					 | 
				
			||||||
		`vm`,
 | 
					 | 
				
			||||||
		`fs`,
 | 
					 | 
				
			||||||
		`net`,
 | 
					 | 
				
			||||||
		//debug			/* Special handling required */
 | 
					 | 
				
			||||||
		`hw`,
 | 
					 | 
				
			||||||
		//machdep		/* Arch specific */
 | 
					 | 
				
			||||||
		`user`,
 | 
					 | 
				
			||||||
		`ddb`,
 | 
					 | 
				
			||||||
		//vfs			/* Special handling required */
 | 
					 | 
				
			||||||
		`fs.posix`,
 | 
					 | 
				
			||||||
		`kern.forkstat`,
 | 
					 | 
				
			||||||
		`kern.intrcnt`,
 | 
					 | 
				
			||||||
		`kern.malloc`,
 | 
					 | 
				
			||||||
		`kern.nchstats`,
 | 
					 | 
				
			||||||
		`kern.seminfo`,
 | 
					 | 
				
			||||||
		`kern.shminfo`,
 | 
					 | 
				
			||||||
		`kern.timecounter`,
 | 
					 | 
				
			||||||
		`kern.tty`,
 | 
					 | 
				
			||||||
		`kern.watchdog`,
 | 
					 | 
				
			||||||
		`net.bpf`,
 | 
					 | 
				
			||||||
		`net.ifq`,
 | 
					 | 
				
			||||||
		`net.inet`,
 | 
					 | 
				
			||||||
		`net.inet.ah`,
 | 
					 | 
				
			||||||
		`net.inet.carp`,
 | 
					 | 
				
			||||||
		`net.inet.divert`,
 | 
					 | 
				
			||||||
		`net.inet.esp`,
 | 
					 | 
				
			||||||
		`net.inet.etherip`,
 | 
					 | 
				
			||||||
		`net.inet.gre`,
 | 
					 | 
				
			||||||
		`net.inet.icmp`,
 | 
					 | 
				
			||||||
		`net.inet.igmp`,
 | 
					 | 
				
			||||||
		`net.inet.ip`,
 | 
					 | 
				
			||||||
		`net.inet.ip.ifq`,
 | 
					 | 
				
			||||||
		`net.inet.ipcomp`,
 | 
					 | 
				
			||||||
		`net.inet.ipip`,
 | 
					 | 
				
			||||||
		`net.inet.mobileip`,
 | 
					 | 
				
			||||||
		`net.inet.pfsync`,
 | 
					 | 
				
			||||||
		`net.inet.tcp`,
 | 
					 | 
				
			||||||
		`net.inet.udp`,
 | 
					 | 
				
			||||||
		`net.inet6`,
 | 
					 | 
				
			||||||
		`net.inet6.divert`,
 | 
					 | 
				
			||||||
		`net.inet6.ip6`,
 | 
					 | 
				
			||||||
		`net.inet6.icmp6`,
 | 
					 | 
				
			||||||
		`net.inet6.tcp6`,
 | 
					 | 
				
			||||||
		`net.inet6.udp6`,
 | 
					 | 
				
			||||||
		`net.mpls`,
 | 
					 | 
				
			||||||
		`net.mpls.ifq`,
 | 
					 | 
				
			||||||
		`net.key`,
 | 
					 | 
				
			||||||
		`net.pflow`,
 | 
					 | 
				
			||||||
		`net.pfsync`,
 | 
					 | 
				
			||||||
		`net.pipex`,
 | 
					 | 
				
			||||||
		`net.rt`,
 | 
					 | 
				
			||||||
		`vm.swapencrypt`,
 | 
					 | 
				
			||||||
		//vfsgenctl		/* Special handling required */
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Node name "fixups"
 | 
					 | 
				
			||||||
	ctlMap := map[string]string{
 | 
					 | 
				
			||||||
		"ipproto":             "net.inet",
 | 
					 | 
				
			||||||
		"net.inet.ipproto":    "net.inet",
 | 
					 | 
				
			||||||
		"net.inet6.ipv6proto": "net.inet6",
 | 
					 | 
				
			||||||
		"net.inet6.ipv6":      "net.inet6.ip6",
 | 
					 | 
				
			||||||
		"net.inet.icmpv6":     "net.inet6.icmp6",
 | 
					 | 
				
			||||||
		"net.inet6.divert6":   "net.inet6.divert",
 | 
					 | 
				
			||||||
		"net.inet6.tcp6":      "net.inet.tcp",
 | 
					 | 
				
			||||||
		"net.inet6.udp6":      "net.inet.udp",
 | 
					 | 
				
			||||||
		"mpls":                "net.mpls",
 | 
					 | 
				
			||||||
		"swpenc":              "vm.swapencrypt",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Node mappings
 | 
					 | 
				
			||||||
	nodeMap = map[string]string{
 | 
					 | 
				
			||||||
		"net.inet.ip.ifq": "net.ifq",
 | 
					 | 
				
			||||||
		"net.inet.pfsync": "net.pfsync",
 | 
					 | 
				
			||||||
		"net.mpls.ifq":    "net.ifq",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	mCtls := make(map[string]bool)
 | 
					 | 
				
			||||||
	for _, ctl := range ctls {
 | 
					 | 
				
			||||||
		mCtls[ctl] = true
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for _, header := range headers {
 | 
					 | 
				
			||||||
		debug("Processing " + header)
 | 
					 | 
				
			||||||
		file, err := os.Open(filepath.Join("/usr/include", header))
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			fmt.Fprintf(os.Stderr, "%v\n", err)
 | 
					 | 
				
			||||||
			os.Exit(1)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		s := bufio.NewScanner(file)
 | 
					 | 
				
			||||||
		for s.Scan() {
 | 
					 | 
				
			||||||
			var sub []string
 | 
					 | 
				
			||||||
			if reMatch(ctlNames1RE, s.Text(), &sub) ||
 | 
					 | 
				
			||||||
				reMatch(ctlNames2RE, s.Text(), &sub) ||
 | 
					 | 
				
			||||||
				reMatch(ctlNames3RE, s.Text(), &sub) {
 | 
					 | 
				
			||||||
				if sub[1] == `CTL_NAMES` {
 | 
					 | 
				
			||||||
					// Top level.
 | 
					 | 
				
			||||||
					node = &mib
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					// Node.
 | 
					 | 
				
			||||||
					nodename := strings.ToLower(sub[2])
 | 
					 | 
				
			||||||
					ctlName := ""
 | 
					 | 
				
			||||||
					if reMatch(netInetRE, header, &sub) {
 | 
					 | 
				
			||||||
						ctlName = "net.inet." + nodename
 | 
					 | 
				
			||||||
					} else if reMatch(netInet6RE, header, &sub) {
 | 
					 | 
				
			||||||
						ctlName = "net.inet6." + nodename
 | 
					 | 
				
			||||||
					} else if reMatch(netRE, header, &sub) {
 | 
					 | 
				
			||||||
						ctlName = "net." + nodename
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						ctlName = nodename
 | 
					 | 
				
			||||||
						ctlName = fsNetKernRE.ReplaceAllString(ctlName, `$1.`)
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					if val, ok := ctlMap[ctlName]; ok {
 | 
					 | 
				
			||||||
						ctlName = val
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					if _, ok := mCtls[ctlName]; !ok {
 | 
					 | 
				
			||||||
						debug("Ignoring " + ctlName + "...")
 | 
					 | 
				
			||||||
						continue
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					// Walk down from the top of the MIB.
 | 
					 | 
				
			||||||
					node = &mib
 | 
					 | 
				
			||||||
					for _, part := range strings.Split(ctlName, ".") {
 | 
					 | 
				
			||||||
						if _, ok := (*node)[part]; !ok {
 | 
					 | 
				
			||||||
							debug("Missing node " + part)
 | 
					 | 
				
			||||||
							(*node)[part] = nodeElement{n: 0, t: "", pE: &map[string]nodeElement{}}
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
						node = (*node)[part].pE
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				// Populate current node with entries.
 | 
					 | 
				
			||||||
				i := -1
 | 
					 | 
				
			||||||
				for !strings.HasPrefix(s.Text(), "}") {
 | 
					 | 
				
			||||||
					s.Scan()
 | 
					 | 
				
			||||||
					if reMatch(bracesRE, s.Text(), &sub) {
 | 
					 | 
				
			||||||
						i++
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					if !reMatch(ctlTypeRE, s.Text(), &sub) {
 | 
					 | 
				
			||||||
						continue
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					(*node)[sub[1]] = nodeElement{n: i, t: sub[2], pE: &map[string]nodeElement{}}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		err = s.Err()
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			fmt.Fprintf(os.Stderr, "%v\n", err)
 | 
					 | 
				
			||||||
			os.Exit(1)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		file.Close()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	buildSysctl(&mib, "", []int{})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	sort.Strings(sysCtl)
 | 
					 | 
				
			||||||
	text := strings.Join(sysCtl, "")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	fmt.Printf(srcTemplate, cmdLine(), goBuildTags(), plusBuildTags(), text)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const srcTemplate = `// %s
 | 
					 | 
				
			||||||
// Code generated by the command above; DO NOT EDIT.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build %s
 | 
					 | 
				
			||||||
// +build %s
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package unix
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type mibentry struct {
 | 
					 | 
				
			||||||
	ctlname string
 | 
					 | 
				
			||||||
	ctloid []_C_int
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var sysctlMib = []mibentry {
 | 
					 | 
				
			||||||
%s
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
`
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,190 +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.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build ignore
 | 
					 | 
				
			||||||
// +build ignore
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Generate system call table for DragonFly, NetBSD,
 | 
					 | 
				
			||||||
// FreeBSD or OpenBSD from master list (for example,
 | 
					 | 
				
			||||||
// /usr/src/sys/kern/syscalls.master or sys/syscall.h).
 | 
					 | 
				
			||||||
package main
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"bufio"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"io"
 | 
					 | 
				
			||||||
	"io/ioutil"
 | 
					 | 
				
			||||||
	"net/http"
 | 
					 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"regexp"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var (
 | 
					 | 
				
			||||||
	goos, goarch string
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// cmdLine returns this programs's commandline arguments
 | 
					 | 
				
			||||||
func cmdLine() string {
 | 
					 | 
				
			||||||
	return "go run mksysnum.go " + strings.Join(os.Args[1:], " ")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// goBuildTags returns build tags in the go:build format.
 | 
					 | 
				
			||||||
func goBuildTags() string {
 | 
					 | 
				
			||||||
	return fmt.Sprintf("%s && %s", goarch, goos)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// plusBuildTags returns build tags in the +build format.
 | 
					 | 
				
			||||||
func plusBuildTags() string {
 | 
					 | 
				
			||||||
	return fmt.Sprintf("%s,%s", goarch, goos)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func checkErr(err error) {
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		fmt.Fprintf(os.Stderr, "%v\n", err)
 | 
					 | 
				
			||||||
		os.Exit(1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// source string and substring slice for regexp
 | 
					 | 
				
			||||||
type re struct {
 | 
					 | 
				
			||||||
	str string   // source string
 | 
					 | 
				
			||||||
	sub []string // matched sub-string
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Match performs regular expression match
 | 
					 | 
				
			||||||
func (r *re) Match(exp string) bool {
 | 
					 | 
				
			||||||
	r.sub = regexp.MustCompile(exp).FindStringSubmatch(r.str)
 | 
					 | 
				
			||||||
	if r.sub != nil {
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return false
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// fetchFile fetches a text file from URL
 | 
					 | 
				
			||||||
func fetchFile(URL string) io.Reader {
 | 
					 | 
				
			||||||
	resp, err := http.Get(URL)
 | 
					 | 
				
			||||||
	checkErr(err)
 | 
					 | 
				
			||||||
	defer resp.Body.Close()
 | 
					 | 
				
			||||||
	body, err := ioutil.ReadAll(resp.Body)
 | 
					 | 
				
			||||||
	checkErr(err)
 | 
					 | 
				
			||||||
	return strings.NewReader(string(body))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// readFile reads a text file from path
 | 
					 | 
				
			||||||
func readFile(path string) io.Reader {
 | 
					 | 
				
			||||||
	file, err := os.Open(os.Args[1])
 | 
					 | 
				
			||||||
	checkErr(err)
 | 
					 | 
				
			||||||
	return file
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func format(name, num, proto string) string {
 | 
					 | 
				
			||||||
	name = strings.ToUpper(name)
 | 
					 | 
				
			||||||
	// There are multiple entries for enosys and nosys, so comment them out.
 | 
					 | 
				
			||||||
	nm := re{str: name}
 | 
					 | 
				
			||||||
	if nm.Match(`^SYS_E?NOSYS$`) {
 | 
					 | 
				
			||||||
		name = fmt.Sprintf("// %s", name)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if name == `SYS_SYS_EXIT` {
 | 
					 | 
				
			||||||
		name = `SYS_EXIT`
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return fmt.Sprintf("	%s = %s;  // %s\n", name, num, proto)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func main() {
 | 
					 | 
				
			||||||
	// Get the OS (using GOOS_TARGET if it exist)
 | 
					 | 
				
			||||||
	goos = os.Getenv("GOOS_TARGET")
 | 
					 | 
				
			||||||
	if goos == "" {
 | 
					 | 
				
			||||||
		goos = os.Getenv("GOOS")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// Get the architecture (using GOARCH_TARGET if it exists)
 | 
					 | 
				
			||||||
	goarch = os.Getenv("GOARCH_TARGET")
 | 
					 | 
				
			||||||
	if goarch == "" {
 | 
					 | 
				
			||||||
		goarch = os.Getenv("GOARCH")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// Check if GOOS and GOARCH environment variables are defined
 | 
					 | 
				
			||||||
	if goarch == "" || goos == "" {
 | 
					 | 
				
			||||||
		fmt.Fprintf(os.Stderr, "GOARCH or GOOS not defined in environment\n")
 | 
					 | 
				
			||||||
		os.Exit(1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	file := strings.TrimSpace(os.Args[1])
 | 
					 | 
				
			||||||
	var syscalls io.Reader
 | 
					 | 
				
			||||||
	if strings.HasPrefix(file, "https://") || strings.HasPrefix(file, "http://") {
 | 
					 | 
				
			||||||
		// Download syscalls.master file
 | 
					 | 
				
			||||||
		syscalls = fetchFile(file)
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		syscalls = readFile(file)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var text, line string
 | 
					 | 
				
			||||||
	s := bufio.NewScanner(syscalls)
 | 
					 | 
				
			||||||
	for s.Scan() {
 | 
					 | 
				
			||||||
		t := re{str: line}
 | 
					 | 
				
			||||||
		if t.Match(`^(.*)\\$`) {
 | 
					 | 
				
			||||||
			// Handle continuation
 | 
					 | 
				
			||||||
			line = t.sub[1]
 | 
					 | 
				
			||||||
			line += strings.TrimLeft(s.Text(), " \t")
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			// New line
 | 
					 | 
				
			||||||
			line = s.Text()
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		t = re{str: line}
 | 
					 | 
				
			||||||
		if t.Match(`\\$`) {
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		t = re{str: line}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		switch goos {
 | 
					 | 
				
			||||||
		case "dragonfly":
 | 
					 | 
				
			||||||
			if t.Match(`^([0-9]+)\s+STD\s+({ \S+\s+(\w+).*)$`) {
 | 
					 | 
				
			||||||
				num, proto := t.sub[1], t.sub[2]
 | 
					 | 
				
			||||||
				name := fmt.Sprintf("SYS_%s", t.sub[3])
 | 
					 | 
				
			||||||
				text += format(name, num, proto)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		case "freebsd":
 | 
					 | 
				
			||||||
			if t.Match(`^([0-9]+)\s+\S+\s+(?:(?:NO)?STD|COMPAT10)\s+({ \S+\s+(\w+).*)$`) {
 | 
					 | 
				
			||||||
				num, proto := t.sub[1], t.sub[2]
 | 
					 | 
				
			||||||
				name := fmt.Sprintf("SYS_%s", t.sub[3])
 | 
					 | 
				
			||||||
				text += format(name, num, proto)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		case "openbsd":
 | 
					 | 
				
			||||||
			if t.Match(`^([0-9]+)\s+STD\s+(NOLOCK\s+)?({ \S+\s+\*?(\w+).*)$`) {
 | 
					 | 
				
			||||||
				num, proto, name := t.sub[1], t.sub[3], t.sub[4]
 | 
					 | 
				
			||||||
				text += format(name, num, proto)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		case "netbsd":
 | 
					 | 
				
			||||||
			if t.Match(`^([0-9]+)\s+((STD)|(NOERR))\s+(RUMP\s+)?({\s+\S+\s*\*?\s*\|(\S+)\|(\S*)\|(\w+).*\s+})(\s+(\S+))?$`) {
 | 
					 | 
				
			||||||
				num, proto, compat := t.sub[1], t.sub[6], t.sub[8]
 | 
					 | 
				
			||||||
				name := t.sub[7] + "_" + t.sub[9]
 | 
					 | 
				
			||||||
				if t.sub[11] != "" {
 | 
					 | 
				
			||||||
					name = t.sub[7] + "_" + t.sub[11]
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				name = strings.ToUpper(name)
 | 
					 | 
				
			||||||
				if compat == "" || compat == "13" || compat == "30" || compat == "50" {
 | 
					 | 
				
			||||||
					text += fmt.Sprintf("	%s = %s;  // %s\n", name, num, proto)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			fmt.Fprintf(os.Stderr, "unrecognized GOOS=%s\n", goos)
 | 
					 | 
				
			||||||
			os.Exit(1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	err := s.Err()
 | 
					 | 
				
			||||||
	checkErr(err)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	fmt.Printf(template, cmdLine(), goBuildTags(), plusBuildTags(), text)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const template = `// %s
 | 
					 | 
				
			||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build %s
 | 
					 | 
				
			||||||
// +build %s
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package unix
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const(
 | 
					 | 
				
			||||||
%s)`
 | 
					 | 
				
			||||||
| 
						 | 
					@ -52,6 +52,20 @@ func ParseSocketControlMessage(b []byte) ([]SocketControlMessage, error) {
 | 
				
			||||||
	return msgs, nil
 | 
						return msgs, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ParseOneSocketControlMessage parses a single socket control message from b, returning the message header,
 | 
				
			||||||
 | 
					// message data (a slice of b), and the remainder of b after that single message.
 | 
				
			||||||
 | 
					// When there are no remaining messages, len(remainder) == 0.
 | 
				
			||||||
 | 
					func ParseOneSocketControlMessage(b []byte) (hdr Cmsghdr, data []byte, remainder []byte, err error) {
 | 
				
			||||||
 | 
						h, dbuf, err := socketControlMessageHeaderAndData(b)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return Cmsghdr{}, nil, nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if i := cmsgAlignOf(int(h.Len)); i < len(b) {
 | 
				
			||||||
 | 
							remainder = b[i:]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return *h, dbuf, remainder, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func socketControlMessageHeaderAndData(b []byte) (*Cmsghdr, []byte, error) {
 | 
					func socketControlMessageHeaderAndData(b []byte) (*Cmsghdr, []byte, error) {
 | 
				
			||||||
	h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
 | 
						h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
 | 
				
			||||||
	if h.Len < SizeofCmsghdr || uint64(h.Len) > uint64(len(b)) {
 | 
						if h.Len < SizeofCmsghdr || uint64(h.Len) > uint64(len(b)) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,27 +0,0 @@
 | 
				
			||||||
// Copyright 2009 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
 | 
					 | 
				
			||||||
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package unix
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func itoa(val int) string { // do it here rather than with fmt to avoid dependency
 | 
					 | 
				
			||||||
	if val < 0 {
 | 
					 | 
				
			||||||
		return "-" + uitoa(uint(-val))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return uitoa(uint(val))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func uitoa(val uint) string {
 | 
					 | 
				
			||||||
	var buf [32]byte // big enough for int64
 | 
					 | 
				
			||||||
	i := len(buf) - 1
 | 
					 | 
				
			||||||
	for val >= 10 {
 | 
					 | 
				
			||||||
		buf[i] = byte(val%10 + '0')
 | 
					 | 
				
			||||||
		i--
 | 
					 | 
				
			||||||
		val /= 10
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	buf[i] = byte(val + '0')
 | 
					 | 
				
			||||||
	return string(buf[i:])
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -29,8 +29,6 @@ import (
 | 
				
			||||||
	"bytes"
 | 
						"bytes"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"unsafe"
 | 
						"unsafe"
 | 
				
			||||||
 | 
					 | 
				
			||||||
	"golang.org/x/sys/internal/unsafeheader"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ByteSliceFromString returns a NUL-terminated slice of bytes
 | 
					// ByteSliceFromString returns a NUL-terminated slice of bytes
 | 
				
			||||||
| 
						 | 
					@ -82,13 +80,7 @@ func BytePtrToString(p *byte) string {
 | 
				
			||||||
		ptr = unsafe.Pointer(uintptr(ptr) + 1)
 | 
							ptr = unsafe.Pointer(uintptr(ptr) + 1)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var s []byte
 | 
						return string(unsafe.Slice(p, n))
 | 
				
			||||||
	h := (*unsafeheader.Slice)(unsafe.Pointer(&s))
 | 
					 | 
				
			||||||
	h.Data = unsafe.Pointer(p)
 | 
					 | 
				
			||||||
	h.Len = n
 | 
					 | 
				
			||||||
	h.Cap = n
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return string(s)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 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.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,6 +37,7 @@ func Creat(path string, mode uint32) (fd int, err error) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	utimes(path string, times *[2]Timeval) (err error)
 | 
					//sys	utimes(path string, times *[2]Timeval) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Utimes(path string, tv []Timeval) error {
 | 
					func Utimes(path string, tv []Timeval) error {
 | 
				
			||||||
	if len(tv) != 2 {
 | 
						if len(tv) != 2 {
 | 
				
			||||||
		return EINVAL
 | 
							return EINVAL
 | 
				
			||||||
| 
						 | 
					@ -45,6 +46,7 @@ func Utimes(path string, tv []Timeval) error {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	utimensat(dirfd int, path string, times *[2]Timespec, flag int) (err error)
 | 
					//sys	utimensat(dirfd int, path string, times *[2]Timespec, flag int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func UtimesNano(path string, ts []Timespec) error {
 | 
					func UtimesNano(path string, ts []Timespec) error {
 | 
				
			||||||
	if len(ts) != 2 {
 | 
						if len(ts) != 2 {
 | 
				
			||||||
		return EINVAL
 | 
							return EINVAL
 | 
				
			||||||
| 
						 | 
					@ -215,20 +217,63 @@ func Accept(fd int) (nfd int, sa Sockaddr, err error) {
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
 | 
					func recvmsgRaw(fd int, iov []Iovec, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) {
 | 
				
			||||||
	// Recvmsg not implemented on AIX
 | 
						var msg Msghdr
 | 
				
			||||||
	sa := new(SockaddrUnix)
 | 
						msg.Name = (*byte)(unsafe.Pointer(rsa))
 | 
				
			||||||
	return -1, -1, -1, sa, ENOSYS
 | 
						msg.Namelen = uint32(SizeofSockaddrAny)
 | 
				
			||||||
}
 | 
						var dummy byte
 | 
				
			||||||
 | 
						if len(oob) > 0 {
 | 
				
			||||||
func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
 | 
							// receive at least one normal byte
 | 
				
			||||||
	_, err = SendmsgN(fd, p, oob, to, flags)
 | 
							if emptyIovecs(iov) {
 | 
				
			||||||
 | 
								var iova [1]Iovec
 | 
				
			||||||
 | 
								iova[0].Base = &dummy
 | 
				
			||||||
 | 
								iova[0].SetLen(1)
 | 
				
			||||||
 | 
								iov = iova[:]
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
 | 
				
			||||||
 | 
							msg.SetControllen(len(oob))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(iov) > 0 {
 | 
				
			||||||
 | 
							msg.Iov = &iov[0]
 | 
				
			||||||
 | 
							msg.SetIovlen(len(iov))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if n, err = recvmsg(fd, &msg, flags); n == -1 {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						oobn = int(msg.Controllen)
 | 
				
			||||||
 | 
						recvflags = int(msg.Flags)
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
 | 
					func sendmsgN(fd int, iov []Iovec, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) {
 | 
				
			||||||
	// SendmsgN not implemented on AIX
 | 
						var msg Msghdr
 | 
				
			||||||
	return -1, ENOSYS
 | 
						msg.Name = (*byte)(unsafe.Pointer(ptr))
 | 
				
			||||||
 | 
						msg.Namelen = uint32(salen)
 | 
				
			||||||
 | 
						var dummy byte
 | 
				
			||||||
 | 
						var empty bool
 | 
				
			||||||
 | 
						if len(oob) > 0 {
 | 
				
			||||||
 | 
							// send at least one normal byte
 | 
				
			||||||
 | 
							empty = emptyIovecs(iov)
 | 
				
			||||||
 | 
							if empty {
 | 
				
			||||||
 | 
								var iova [1]Iovec
 | 
				
			||||||
 | 
								iova[0].Base = &dummy
 | 
				
			||||||
 | 
								iova[0].SetLen(1)
 | 
				
			||||||
 | 
								iov = iova[:]
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
 | 
				
			||||||
 | 
							msg.SetControllen(len(oob))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(iov) > 0 {
 | 
				
			||||||
 | 
							msg.Iov = &iov[0]
 | 
				
			||||||
 | 
							msg.SetIovlen(len(iov))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if n, err = sendmsg(fd, &msg, flags); err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(oob) > 0 && empty {
 | 
				
			||||||
 | 
							n = 0
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return n, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
 | 
					func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
 | 
				
			||||||
| 
						 | 
					@ -306,11 +351,13 @@ func direntNamlen(buf []byte) (uint64, bool) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	getdirent(fd int, buf []byte) (n int, err error)
 | 
					//sys	getdirent(fd int, buf []byte) (n int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Getdents(fd int, buf []byte) (n int, err error) {
 | 
					func Getdents(fd int, buf []byte) (n int, err error) {
 | 
				
			||||||
	return getdirent(fd, buf)
 | 
						return getdirent(fd, buf)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	wait4(pid Pid_t, status *_C_int, options int, rusage *Rusage) (wpid Pid_t, err error)
 | 
					//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) {
 | 
					func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
 | 
				
			||||||
	var status _C_int
 | 
						var status _C_int
 | 
				
			||||||
	var r Pid_t
 | 
						var r Pid_t
 | 
				
			||||||
| 
						 | 
					@ -378,6 +425,7 @@ func (w WaitStatus) TrapCause() int { return -1 }
 | 
				
			||||||
//sys	fcntl(fd int, cmd int, arg int) (val int, err error)
 | 
					//sys	fcntl(fd int, cmd int, arg int) (val int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	fsyncRange(fd int, how int, start int64, length int64) (err error) = fsync_range
 | 
					//sys	fsyncRange(fd int, how int, start int64, length int64) (err error) = fsync_range
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Fsync(fd int) error {
 | 
					func Fsync(fd int) error {
 | 
				
			||||||
	return fsyncRange(fd, O_SYNC, 0, 0)
 | 
						return fsyncRange(fd, O_SYNC, 0, 0)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -458,8 +506,8 @@ func Fsync(fd int) error {
 | 
				
			||||||
//sys	Listen(s int, n int) (err error)
 | 
					//sys	Listen(s int, n int) (err error)
 | 
				
			||||||
//sys	lstat(path string, stat *Stat_t) (err error)
 | 
					//sys	lstat(path string, stat *Stat_t) (err error)
 | 
				
			||||||
//sys	Pause() (err error)
 | 
					//sys	Pause() (err error)
 | 
				
			||||||
//sys	Pread(fd int, p []byte, offset int64) (n int, err error) = pread64
 | 
					//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	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	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)
 | 
					//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	Setregid(rgid int, egid int) (err error)
 | 
				
			||||||
| 
						 | 
					@ -542,6 +590,7 @@ func Poll(fds []PollFd, timeout int) (n int, err error) {
 | 
				
			||||||
//sys	Getsystemcfg(label int) (n uint64)
 | 
					//sys	Getsystemcfg(label int) (n uint64)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	umount(target string) (err error)
 | 
					//sys	umount(target string) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Unmount(target string, flags int) (err error) {
 | 
					func Unmount(target string, flags int) (err error) {
 | 
				
			||||||
	if flags != 0 {
 | 
						if flags != 0 {
 | 
				
			||||||
		// AIX doesn't have any flags for umount.
 | 
							// AIX doesn't have any flags for umount.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -325,80 +325,62 @@ func GetsockoptString(fd, level, opt int) (string, error) {
 | 
				
			||||||
//sys	sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
 | 
					//sys	sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
//sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
					//sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
 | 
					func recvmsgRaw(fd int, iov []Iovec, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) {
 | 
				
			||||||
	var msg Msghdr
 | 
						var msg Msghdr
 | 
				
			||||||
	var rsa RawSockaddrAny
 | 
						msg.Name = (*byte)(unsafe.Pointer(rsa))
 | 
				
			||||||
	msg.Name = (*byte)(unsafe.Pointer(&rsa))
 | 
					 | 
				
			||||||
	msg.Namelen = uint32(SizeofSockaddrAny)
 | 
						msg.Namelen = uint32(SizeofSockaddrAny)
 | 
				
			||||||
	var iov Iovec
 | 
					 | 
				
			||||||
	if len(p) > 0 {
 | 
					 | 
				
			||||||
		iov.Base = (*byte)(unsafe.Pointer(&p[0]))
 | 
					 | 
				
			||||||
		iov.SetLen(len(p))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	var dummy byte
 | 
						var dummy byte
 | 
				
			||||||
	if len(oob) > 0 {
 | 
						if len(oob) > 0 {
 | 
				
			||||||
		// receive at least one normal byte
 | 
							// receive at least one normal byte
 | 
				
			||||||
		if len(p) == 0 {
 | 
							if emptyIovecs(iov) {
 | 
				
			||||||
			iov.Base = &dummy
 | 
								var iova [1]Iovec
 | 
				
			||||||
			iov.SetLen(1)
 | 
								iova[0].Base = &dummy
 | 
				
			||||||
 | 
								iova[0].SetLen(1)
 | 
				
			||||||
 | 
								iov = iova[:]
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
 | 
							msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
 | 
				
			||||||
		msg.SetControllen(len(oob))
 | 
							msg.SetControllen(len(oob))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	msg.Iov = &iov
 | 
						if len(iov) > 0 {
 | 
				
			||||||
	msg.Iovlen = 1
 | 
							msg.Iov = &iov[0]
 | 
				
			||||||
 | 
							msg.SetIovlen(len(iov))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if n, err = recvmsg(fd, &msg, flags); err != nil {
 | 
						if n, err = recvmsg(fd, &msg, flags); err != nil {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	oobn = int(msg.Controllen)
 | 
						oobn = int(msg.Controllen)
 | 
				
			||||||
	recvflags = int(msg.Flags)
 | 
						recvflags = int(msg.Flags)
 | 
				
			||||||
	// source address is only specified if the socket is unconnected
 | 
					 | 
				
			||||||
	if rsa.Addr.Family != AF_UNSPEC {
 | 
					 | 
				
			||||||
		from, err = anyToSockaddr(fd, &rsa)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
					//sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
 | 
					func sendmsgN(fd int, iov []Iovec, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) {
 | 
				
			||||||
	_, err = SendmsgN(fd, p, oob, to, flags)
 | 
					 | 
				
			||||||
	return
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
 | 
					 | 
				
			||||||
	var ptr unsafe.Pointer
 | 
					 | 
				
			||||||
	var salen _Socklen
 | 
					 | 
				
			||||||
	if to != nil {
 | 
					 | 
				
			||||||
		ptr, salen, err = to.sockaddr()
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return 0, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	var msg Msghdr
 | 
						var msg Msghdr
 | 
				
			||||||
	msg.Name = (*byte)(unsafe.Pointer(ptr))
 | 
						msg.Name = (*byte)(unsafe.Pointer(ptr))
 | 
				
			||||||
	msg.Namelen = uint32(salen)
 | 
						msg.Namelen = uint32(salen)
 | 
				
			||||||
	var iov Iovec
 | 
					 | 
				
			||||||
	if len(p) > 0 {
 | 
					 | 
				
			||||||
		iov.Base = (*byte)(unsafe.Pointer(&p[0]))
 | 
					 | 
				
			||||||
		iov.SetLen(len(p))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	var dummy byte
 | 
						var dummy byte
 | 
				
			||||||
 | 
						var empty bool
 | 
				
			||||||
	if len(oob) > 0 {
 | 
						if len(oob) > 0 {
 | 
				
			||||||
		// send at least one normal byte
 | 
							// send at least one normal byte
 | 
				
			||||||
		if len(p) == 0 {
 | 
							empty = emptyIovecs(iov)
 | 
				
			||||||
			iov.Base = &dummy
 | 
							if empty {
 | 
				
			||||||
			iov.SetLen(1)
 | 
								var iova [1]Iovec
 | 
				
			||||||
 | 
								iova[0].Base = &dummy
 | 
				
			||||||
 | 
								iova[0].SetLen(1)
 | 
				
			||||||
 | 
								iov = iova[:]
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
 | 
							msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
 | 
				
			||||||
		msg.SetControllen(len(oob))
 | 
							msg.SetControllen(len(oob))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	msg.Iov = &iov
 | 
						if len(iov) > 0 {
 | 
				
			||||||
	msg.Iovlen = 1
 | 
							msg.Iov = &iov[0]
 | 
				
			||||||
 | 
							msg.SetIovlen(len(iov))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if n, err = sendmsg(fd, &msg, flags); err != nil {
 | 
						if n, err = sendmsg(fd, &msg, flags); err != nil {
 | 
				
			||||||
		return 0, err
 | 
							return 0, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if len(oob) > 0 && len(p) == 0 {
 | 
						if len(oob) > 0 && empty {
 | 
				
			||||||
		n = 0
 | 
							n = 0
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return n, nil
 | 
						return n, nil
 | 
				
			||||||
| 
						 | 
					@ -571,12 +553,7 @@ func UtimesNano(path string, ts []Timespec) error {
 | 
				
			||||||
	if len(ts) != 2 {
 | 
						if len(ts) != 2 {
 | 
				
			||||||
		return EINVAL
 | 
							return EINVAL
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Darwin setattrlist can set nanosecond timestamps
 | 
						err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
 | 
				
			||||||
	err := setattrlistTimes(path, ts, 0)
 | 
					 | 
				
			||||||
	if err != ENOSYS {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	err = utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
 | 
					 | 
				
			||||||
	if err != ENOSYS {
 | 
						if err != ENOSYS {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -596,10 +573,6 @@ func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error {
 | 
				
			||||||
	if len(ts) != 2 {
 | 
						if len(ts) != 2 {
 | 
				
			||||||
		return EINVAL
 | 
							return EINVAL
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	err := setattrlistTimes(path, ts, flags)
 | 
					 | 
				
			||||||
	if err != ENOSYS {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags)
 | 
						return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,32 +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.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build darwin && go1.12 && !go1.13
 | 
					 | 
				
			||||||
// +build darwin,go1.12,!go1.13
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package unix
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"unsafe"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const _SYS_GETDIRENTRIES64 = 344
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
 | 
					 | 
				
			||||||
	// To implement this using libSystem we'd need syscall_syscallPtr for
 | 
					 | 
				
			||||||
	// fdopendir. However, syscallPtr was only added in Go 1.13, so we fall
 | 
					 | 
				
			||||||
	// back to raw syscalls for this func on Go 1.12.
 | 
					 | 
				
			||||||
	var p unsafe.Pointer
 | 
					 | 
				
			||||||
	if len(buf) > 0 {
 | 
					 | 
				
			||||||
		p = unsafe.Pointer(&buf[0])
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		p = unsafe.Pointer(&_zero)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	r0, _, e1 := Syscall6(_SYS_GETDIRENTRIES64, uintptr(fd), uintptr(p), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0)
 | 
					 | 
				
			||||||
	n = int(r0)
 | 
					 | 
				
			||||||
	if e1 != 0 {
 | 
					 | 
				
			||||||
		return n, errnoErr(e1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return n, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,108 +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.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:build darwin && go1.13
 | 
					 | 
				
			||||||
// +build darwin,go1.13
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package unix
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"unsafe"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"golang.org/x/sys/internal/unsafeheader"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//sys	closedir(dir uintptr) (err error)
 | 
					 | 
				
			||||||
//sys	readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func fdopendir(fd int) (dir uintptr, err error) {
 | 
					 | 
				
			||||||
	r0, _, e1 := syscall_syscallPtr(libc_fdopendir_trampoline_addr, uintptr(fd), 0, 0)
 | 
					 | 
				
			||||||
	dir = uintptr(r0)
 | 
					 | 
				
			||||||
	if e1 != 0 {
 | 
					 | 
				
			||||||
		err = errnoErr(e1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var libc_fdopendir_trampoline_addr uintptr
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//go:cgo_import_dynamic libc_fdopendir fdopendir "/usr/lib/libSystem.B.dylib"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
 | 
					 | 
				
			||||||
	// Simulate Getdirentries using fdopendir/readdir_r/closedir.
 | 
					 | 
				
			||||||
	// We store the number of entries to skip in the seek
 | 
					 | 
				
			||||||
	// offset of fd. See issue #31368.
 | 
					 | 
				
			||||||
	// It's not the full required semantics, but should handle the case
 | 
					 | 
				
			||||||
	// of calling Getdirentries or ReadDirent repeatedly.
 | 
					 | 
				
			||||||
	// It won't handle assigning the results of lseek to *basep, or handle
 | 
					 | 
				
			||||||
	// the directory being edited underfoot.
 | 
					 | 
				
			||||||
	skip, err := Seek(fd, 0, 1 /* SEEK_CUR */)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return 0, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// We need to duplicate the incoming file descriptor
 | 
					 | 
				
			||||||
	// because the caller expects to retain control of it, but
 | 
					 | 
				
			||||||
	// fdopendir expects to take control of its argument.
 | 
					 | 
				
			||||||
	// Just Dup'ing the file descriptor is not enough, as the
 | 
					 | 
				
			||||||
	// result shares underlying state. Use Openat to make a really
 | 
					 | 
				
			||||||
	// new file descriptor referring to the same directory.
 | 
					 | 
				
			||||||
	fd2, err := Openat(fd, ".", O_RDONLY, 0)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return 0, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	d, err := fdopendir(fd2)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		Close(fd2)
 | 
					 | 
				
			||||||
		return 0, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	defer closedir(d)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var cnt int64
 | 
					 | 
				
			||||||
	for {
 | 
					 | 
				
			||||||
		var entry Dirent
 | 
					 | 
				
			||||||
		var entryp *Dirent
 | 
					 | 
				
			||||||
		e := readdir_r(d, &entry, &entryp)
 | 
					 | 
				
			||||||
		if e != 0 {
 | 
					 | 
				
			||||||
			return n, errnoErr(e)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if entryp == nil {
 | 
					 | 
				
			||||||
			break
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if skip > 0 {
 | 
					 | 
				
			||||||
			skip--
 | 
					 | 
				
			||||||
			cnt++
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		reclen := int(entry.Reclen)
 | 
					 | 
				
			||||||
		if reclen > len(buf) {
 | 
					 | 
				
			||||||
			// Not enough room. Return for now.
 | 
					 | 
				
			||||||
			// The counter will let us know where we should start up again.
 | 
					 | 
				
			||||||
			// Note: this strategy for suspending in the middle and
 | 
					 | 
				
			||||||
			// restarting is O(n^2) in the length of the directory. Oh well.
 | 
					 | 
				
			||||||
			break
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Copy entry into return buffer.
 | 
					 | 
				
			||||||
		var s []byte
 | 
					 | 
				
			||||||
		hdr := (*unsafeheader.Slice)(unsafe.Pointer(&s))
 | 
					 | 
				
			||||||
		hdr.Data = unsafe.Pointer(&entry)
 | 
					 | 
				
			||||||
		hdr.Cap = reclen
 | 
					 | 
				
			||||||
		hdr.Len = reclen
 | 
					 | 
				
			||||||
		copy(buf, s)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		buf = buf[reclen:]
 | 
					 | 
				
			||||||
		n += reclen
 | 
					 | 
				
			||||||
		cnt++
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// Set the seek offset of the input fd to record
 | 
					 | 
				
			||||||
	// how many files we've already returned.
 | 
					 | 
				
			||||||
	_, err = Seek(fd, cnt, 0 /* SEEK_SET */)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return n, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return n, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -19,6 +19,96 @@ import (
 | 
				
			||||||
	"unsafe"
 | 
						"unsafe"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	closedir(dir uintptr) (err error)
 | 
				
			||||||
 | 
					//sys	readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func fdopendir(fd int) (dir uintptr, err error) {
 | 
				
			||||||
 | 
						r0, _, e1 := syscall_syscallPtr(libc_fdopendir_trampoline_addr, uintptr(fd), 0, 0)
 | 
				
			||||||
 | 
						dir = uintptr(r0)
 | 
				
			||||||
 | 
						if e1 != 0 {
 | 
				
			||||||
 | 
							err = errnoErr(e1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var libc_fdopendir_trampoline_addr uintptr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:cgo_import_dynamic libc_fdopendir fdopendir "/usr/lib/libSystem.B.dylib"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
 | 
				
			||||||
 | 
						// Simulate Getdirentries using fdopendir/readdir_r/closedir.
 | 
				
			||||||
 | 
						// We store the number of entries to skip in the seek
 | 
				
			||||||
 | 
						// offset of fd. See issue #31368.
 | 
				
			||||||
 | 
						// It's not the full required semantics, but should handle the case
 | 
				
			||||||
 | 
						// of calling Getdirentries or ReadDirent repeatedly.
 | 
				
			||||||
 | 
						// It won't handle assigning the results of lseek to *basep, or handle
 | 
				
			||||||
 | 
						// the directory being edited underfoot.
 | 
				
			||||||
 | 
						skip, err := Seek(fd, 0, 1 /* SEEK_CUR */)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// We need to duplicate the incoming file descriptor
 | 
				
			||||||
 | 
						// because the caller expects to retain control of it, but
 | 
				
			||||||
 | 
						// fdopendir expects to take control of its argument.
 | 
				
			||||||
 | 
						// Just Dup'ing the file descriptor is not enough, as the
 | 
				
			||||||
 | 
						// result shares underlying state. Use Openat to make a really
 | 
				
			||||||
 | 
						// new file descriptor referring to the same directory.
 | 
				
			||||||
 | 
						fd2, err := Openat(fd, ".", O_RDONLY, 0)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						d, err := fdopendir(fd2)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							Close(fd2)
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer closedir(d)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var cnt int64
 | 
				
			||||||
 | 
						for {
 | 
				
			||||||
 | 
							var entry Dirent
 | 
				
			||||||
 | 
							var entryp *Dirent
 | 
				
			||||||
 | 
							e := readdir_r(d, &entry, &entryp)
 | 
				
			||||||
 | 
							if e != 0 {
 | 
				
			||||||
 | 
								return n, errnoErr(e)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if entryp == nil {
 | 
				
			||||||
 | 
								break
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if skip > 0 {
 | 
				
			||||||
 | 
								skip--
 | 
				
			||||||
 | 
								cnt++
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							reclen := int(entry.Reclen)
 | 
				
			||||||
 | 
							if reclen > len(buf) {
 | 
				
			||||||
 | 
								// Not enough room. Return for now.
 | 
				
			||||||
 | 
								// The counter will let us know where we should start up again.
 | 
				
			||||||
 | 
								// Note: this strategy for suspending in the middle and
 | 
				
			||||||
 | 
								// restarting is O(n^2) in the length of the directory. Oh well.
 | 
				
			||||||
 | 
								break
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Copy entry into return buffer.
 | 
				
			||||||
 | 
							s := unsafe.Slice((*byte)(unsafe.Pointer(&entry)), reclen)
 | 
				
			||||||
 | 
							copy(buf, s)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							buf = buf[reclen:]
 | 
				
			||||||
 | 
							n += reclen
 | 
				
			||||||
 | 
							cnt++
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// Set the seek offset of the input fd to record
 | 
				
			||||||
 | 
						// how many files we've already returned.
 | 
				
			||||||
 | 
						_, err = Seek(fd, cnt, 0 /* SEEK_SET */)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return n, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return n, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets.
 | 
					// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets.
 | 
				
			||||||
type SockaddrDatalink struct {
 | 
					type SockaddrDatalink struct {
 | 
				
			||||||
	Len    uint8
 | 
						Len    uint8
 | 
				
			||||||
| 
						 | 
					@ -141,16 +231,6 @@ func direntNamlen(buf []byte) (uint64, bool) {
 | 
				
			||||||
func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) }
 | 
					func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) }
 | 
				
			||||||
func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) }
 | 
					func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type attrList struct {
 | 
					 | 
				
			||||||
	bitmapCount uint16
 | 
					 | 
				
			||||||
	_           uint16
 | 
					 | 
				
			||||||
	CommonAttr  uint32
 | 
					 | 
				
			||||||
	VolAttr     uint32
 | 
					 | 
				
			||||||
	DirAttr     uint32
 | 
					 | 
				
			||||||
	FileAttr    uint32
 | 
					 | 
				
			||||||
	Forkattr    uint32
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//sysnb	pipe(p *[2]int32) (err error)
 | 
					//sysnb	pipe(p *[2]int32) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Pipe(p []int) (err error) {
 | 
					func Pipe(p []int) (err error) {
 | 
				
			||||||
| 
						 | 
					@ -282,36 +362,7 @@ func Flistxattr(fd int, dest []byte) (sz int, err error) {
 | 
				
			||||||
	return flistxattr(fd, xattrPointer(dest), len(dest), 0)
 | 
						return flistxattr(fd, xattrPointer(dest), len(dest), 0)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func setattrlistTimes(path string, times []Timespec, flags int) error {
 | 
					//sys	utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error)
 | 
				
			||||||
	_p0, err := BytePtrFromString(path)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var attrList attrList
 | 
					 | 
				
			||||||
	attrList.bitmapCount = ATTR_BIT_MAP_COUNT
 | 
					 | 
				
			||||||
	attrList.CommonAttr = ATTR_CMN_MODTIME | ATTR_CMN_ACCTIME
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// order is mtime, atime: the opposite of Chtimes
 | 
					 | 
				
			||||||
	attributes := [2]Timespec{times[1], times[0]}
 | 
					 | 
				
			||||||
	options := 0
 | 
					 | 
				
			||||||
	if flags&AT_SYMLINK_NOFOLLOW != 0 {
 | 
					 | 
				
			||||||
		options |= FSOPT_NOFOLLOW
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return setattrlist(
 | 
					 | 
				
			||||||
		_p0,
 | 
					 | 
				
			||||||
		unsafe.Pointer(&attrList),
 | 
					 | 
				
			||||||
		unsafe.Pointer(&attributes),
 | 
					 | 
				
			||||||
		unsafe.Sizeof(attributes),
 | 
					 | 
				
			||||||
		options)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//sys	setattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func utimensat(dirfd int, path string, times *[2]Timespec, flags int) error {
 | 
					 | 
				
			||||||
	// Darwin doesn't support SYS_UTIMENSAT
 | 
					 | 
				
			||||||
	return ENOSYS
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Wrapped
 | 
					 * Wrapped
 | 
				
			||||||
| 
						 | 
					@ -432,6 +483,13 @@ func GetsockoptXucred(fd, level, opt int) (*Xucred, error) {
 | 
				
			||||||
	return x, err
 | 
						return x, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func GetsockoptTCPConnectionInfo(fd, level, opt int) (*TCPConnectionInfo, error) {
 | 
				
			||||||
 | 
						var value TCPConnectionInfo
 | 
				
			||||||
 | 
						vallen := _Socklen(SizeofTCPConnectionInfo)
 | 
				
			||||||
 | 
						err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
 | 
				
			||||||
 | 
						return &value, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func SysctlKinfoProc(name string, args ...int) (*KinfoProc, error) {
 | 
					func SysctlKinfoProc(name string, args ...int) (*KinfoProc, error) {
 | 
				
			||||||
	mib, err := sysctlmib(name, args...)
 | 
						mib, err := sysctlmib(name, args...)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
| 
						 | 
					@ -543,11 +601,12 @@ func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) {
 | 
				
			||||||
//sys	Mkdirat(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	Mkfifo(path string, mode uint32) (err error)
 | 
				
			||||||
//sys	Mknod(path string, mode uint32, dev int) (err error)
 | 
					//sys	Mknod(path string, mode uint32, dev int) (err error)
 | 
				
			||||||
 | 
					//sys	Mount(fsType string, dir string, flags int, data unsafe.Pointer) (err error)
 | 
				
			||||||
//sys	Open(path string, mode int, perm uint32) (fd int, err error)
 | 
					//sys	Open(path string, mode int, perm uint32) (fd int, err error)
 | 
				
			||||||
//sys	Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error)
 | 
					//sys	Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error)
 | 
				
			||||||
//sys	Pathconf(path string, name int) (val int, err error)
 | 
					//sys	Pathconf(path string, name int) (val int, err error)
 | 
				
			||||||
//sys	Pread(fd int, p []byte, offset int64) (n int, err error)
 | 
					//sys	pread(fd int, p []byte, offset int64) (n int, err error)
 | 
				
			||||||
//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error)
 | 
					//sys	pwrite(fd int, p []byte, offset int64) (n int, err error)
 | 
				
			||||||
//sys	read(fd int, p []byte) (n int, err error)
 | 
					//sys	read(fd int, p []byte) (n int, err error)
 | 
				
			||||||
//sys	Readlink(path string, buf []byte) (n int, err error)
 | 
					//sys	Readlink(path string, buf []byte) (n int, err error)
 | 
				
			||||||
//sys	Readlinkat(dirfd int, path string, buf []byte) (n int, err error)
 | 
					//sys	Readlinkat(dirfd int, path string, buf []byte) (n int, err error)
 | 
				
			||||||
| 
						 | 
					@ -611,7 +670,6 @@ func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) {
 | 
				
			||||||
// Nfssvc
 | 
					// Nfssvc
 | 
				
			||||||
// Getfh
 | 
					// Getfh
 | 
				
			||||||
// Quotactl
 | 
					// Quotactl
 | 
				
			||||||
// Mount
 | 
					 | 
				
			||||||
// Csops
 | 
					// Csops
 | 
				
			||||||
// Waitid
 | 
					// Waitid
 | 
				
			||||||
// Add_profil
 | 
					// Add_profil
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -125,12 +125,14 @@ func Pipe2(p []int, flags int) (err error) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	extpread(fd int, p []byte, flags int, offset int64) (n int, err error)
 | 
					//sys	extpread(fd int, p []byte, flags int, offset int64) (n int, err error)
 | 
				
			||||||
func Pread(fd int, p []byte, offset int64) (n int, err error) {
 | 
					
 | 
				
			||||||
 | 
					func pread(fd int, p []byte, offset int64) (n int, err error) {
 | 
				
			||||||
	return extpread(fd, p, 0, offset)
 | 
						return extpread(fd, p, 0, offset)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error)
 | 
					//sys	extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error)
 | 
				
			||||||
func Pwrite(fd int, p []byte, offset int64) (n int, err error) {
 | 
					
 | 
				
			||||||
 | 
					func pwrite(fd int, p []byte, offset int64) (n int, err error) {
 | 
				
			||||||
	return extpwrite(fd, p, 0, offset)
 | 
						return extpwrite(fd, p, 0, offset)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -169,11 +171,6 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func setattrlistTimes(path string, times []Timespec, flags int) error {
 | 
					 | 
				
			||||||
	// used on Darwin for UtimesNano
 | 
					 | 
				
			||||||
	return ENOSYS
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//sys	ioctl(fd int, req uint, arg uintptr) (err error)
 | 
					//sys	ioctl(fd int, req uint, arg uintptr) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL
 | 
					//sys	sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL
 | 
				
			||||||
| 
						 | 
					@ -258,6 +255,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
 | 
				
			||||||
//sys	Chmod(path string, mode uint32) (err error)
 | 
					//sys	Chmod(path string, mode uint32) (err error)
 | 
				
			||||||
//sys	Chown(path string, uid int, gid int) (err error)
 | 
					//sys	Chown(path string, uid int, gid int) (err error)
 | 
				
			||||||
//sys	Chroot(path string) (err error)
 | 
					//sys	Chroot(path string) (err error)
 | 
				
			||||||
 | 
					//sys	ClockGettime(clockid int32, time *Timespec) (err error)
 | 
				
			||||||
//sys	Close(fd int) (err error)
 | 
					//sys	Close(fd int) (err error)
 | 
				
			||||||
//sys	Dup(fd int) (nfd int, err error)
 | 
					//sys	Dup(fd int) (nfd int, err error)
 | 
				
			||||||
//sys	Dup2(from int, to int) (err error)
 | 
					//sys	Dup2(from int, to int) (err error)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,25 +17,12 @@ import (
 | 
				
			||||||
	"unsafe"
 | 
						"unsafe"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	SYS_FSTAT_FREEBSD12         = 551 // { int fstat(int fd, _Out_ struct stat *sb); }
 | 
					 | 
				
			||||||
	SYS_FSTATAT_FREEBSD12       = 552 // { int fstatat(int fd, _In_z_ char *path, \
 | 
					 | 
				
			||||||
	SYS_GETDIRENTRIES_FREEBSD12 = 554 // { ssize_t getdirentries(int fd, \
 | 
					 | 
				
			||||||
	SYS_STATFS_FREEBSD12        = 555 // { int statfs(_In_z_ char *path, \
 | 
					 | 
				
			||||||
	SYS_FSTATFS_FREEBSD12       = 556 // { int fstatfs(int fd, \
 | 
					 | 
				
			||||||
	SYS_GETFSSTAT_FREEBSD12     = 557 // { int getfsstat( \
 | 
					 | 
				
			||||||
	SYS_MKNODAT_FREEBSD12       = 559 // { int mknodat(int fd, _In_z_ char *path, \
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// See https://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-handbook/versions.html.
 | 
					// See https://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-handbook/versions.html.
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	osreldateOnce sync.Once
 | 
						osreldateOnce sync.Once
 | 
				
			||||||
	osreldate     uint32
 | 
						osreldate     uint32
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// INO64_FIRST from /usr/src/lib/libc/sys/compat-ino64.h
 | 
					 | 
				
			||||||
const _ino64First = 1200031
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func supportsABI(ver uint32) bool {
 | 
					func supportsABI(ver uint32) bool {
 | 
				
			||||||
	osreldateOnce.Do(func() { osreldate, _ = SysctlUint32("kern.osreldate") })
 | 
						osreldateOnce.Do(func() { osreldate, _ = SysctlUint32("kern.osreldate") })
 | 
				
			||||||
	return osreldate >= ver
 | 
						return osreldate >= ver
 | 
				
			||||||
| 
						 | 
					@ -161,44 +148,19 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		_p0     unsafe.Pointer
 | 
							_p0     unsafe.Pointer
 | 
				
			||||||
		bufsize uintptr
 | 
							bufsize uintptr
 | 
				
			||||||
		oldBuf       []statfs_freebsd11_t
 | 
					 | 
				
			||||||
		needsConvert bool
 | 
					 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if len(buf) > 0 {
 | 
						if len(buf) > 0 {
 | 
				
			||||||
		if supportsABI(_ino64First) {
 | 
					 | 
				
			||||||
		_p0 = unsafe.Pointer(&buf[0])
 | 
							_p0 = unsafe.Pointer(&buf[0])
 | 
				
			||||||
		bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf))
 | 
							bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf))
 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			n := len(buf)
 | 
					 | 
				
			||||||
			oldBuf = make([]statfs_freebsd11_t, n)
 | 
					 | 
				
			||||||
			_p0 = unsafe.Pointer(&oldBuf[0])
 | 
					 | 
				
			||||||
			bufsize = unsafe.Sizeof(statfs_freebsd11_t{}) * uintptr(n)
 | 
					 | 
				
			||||||
			needsConvert = true
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	}
 | 
						r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags))
 | 
				
			||||||
	var sysno uintptr = SYS_GETFSSTAT
 | 
					 | 
				
			||||||
	if supportsABI(_ino64First) {
 | 
					 | 
				
			||||||
		sysno = SYS_GETFSSTAT_FREEBSD12
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	r0, _, e1 := Syscall(sysno, uintptr(_p0), bufsize, uintptr(flags))
 | 
					 | 
				
			||||||
	n = int(r0)
 | 
						n = int(r0)
 | 
				
			||||||
	if e1 != 0 {
 | 
						if e1 != 0 {
 | 
				
			||||||
		err = e1
 | 
							err = e1
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if e1 == 0 && needsConvert {
 | 
					 | 
				
			||||||
		for i := range oldBuf {
 | 
					 | 
				
			||||||
			buf[i].convertFrom(&oldBuf[i])
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func setattrlistTimes(path string, times []Timespec, flags int) error {
 | 
					 | 
				
			||||||
	// used on Darwin for UtimesNano
 | 
					 | 
				
			||||||
	return ENOSYS
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//sys	ioctl(fd int, req uint, arg uintptr) (err error)
 | 
					//sys	ioctl(fd int, req uint, arg uintptr) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL
 | 
					//sys	sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL
 | 
				
			||||||
| 
						 | 
					@ -250,87 +212,11 @@ func Uname(uname *Utsname) error {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Stat(path string, st *Stat_t) (err error) {
 | 
					func Stat(path string, st *Stat_t) (err error) {
 | 
				
			||||||
	var oldStat stat_freebsd11_t
 | 
						return Fstatat(AT_FDCWD, path, st, 0)
 | 
				
			||||||
	if supportsABI(_ino64First) {
 | 
					 | 
				
			||||||
		return fstatat_freebsd12(AT_FDCWD, path, st, 0)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	err = stat(path, &oldStat)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	st.convertFrom(&oldStat)
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Lstat(path string, st *Stat_t) (err error) {
 | 
					func Lstat(path string, st *Stat_t) (err error) {
 | 
				
			||||||
	var oldStat stat_freebsd11_t
 | 
						return Fstatat(AT_FDCWD, path, st, AT_SYMLINK_NOFOLLOW)
 | 
				
			||||||
	if supportsABI(_ino64First) {
 | 
					 | 
				
			||||||
		return fstatat_freebsd12(AT_FDCWD, path, st, AT_SYMLINK_NOFOLLOW)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	err = lstat(path, &oldStat)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	st.convertFrom(&oldStat)
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func Fstat(fd int, st *Stat_t) (err error) {
 | 
					 | 
				
			||||||
	var oldStat stat_freebsd11_t
 | 
					 | 
				
			||||||
	if supportsABI(_ino64First) {
 | 
					 | 
				
			||||||
		return fstat_freebsd12(fd, st)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	err = fstat(fd, &oldStat)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	st.convertFrom(&oldStat)
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func Fstatat(fd int, path string, st *Stat_t, flags int) (err error) {
 | 
					 | 
				
			||||||
	var oldStat stat_freebsd11_t
 | 
					 | 
				
			||||||
	if supportsABI(_ino64First) {
 | 
					 | 
				
			||||||
		return fstatat_freebsd12(fd, path, st, flags)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	err = fstatat(fd, path, &oldStat, flags)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	st.convertFrom(&oldStat)
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func Statfs(path string, st *Statfs_t) (err error) {
 | 
					 | 
				
			||||||
	var oldStatfs statfs_freebsd11_t
 | 
					 | 
				
			||||||
	if supportsABI(_ino64First) {
 | 
					 | 
				
			||||||
		return statfs_freebsd12(path, st)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	err = statfs(path, &oldStatfs)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	st.convertFrom(&oldStatfs)
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func Fstatfs(fd int, st *Statfs_t) (err error) {
 | 
					 | 
				
			||||||
	var oldStatfs statfs_freebsd11_t
 | 
					 | 
				
			||||||
	if supportsABI(_ino64First) {
 | 
					 | 
				
			||||||
		return fstatfs_freebsd12(fd, st)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	err = fstatfs(fd, &oldStatfs)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	st.convertFrom(&oldStatfs)
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Getdents(fd int, buf []byte) (n int, err error) {
 | 
					func Getdents(fd int, buf []byte) (n int, err error) {
 | 
				
			||||||
| 
						 | 
					@ -338,14 +224,13 @@ func Getdents(fd int, buf []byte) (n int, err error) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
 | 
					func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
 | 
				
			||||||
	if supportsABI(_ino64First) {
 | 
					 | 
				
			||||||
	if basep == nil || unsafe.Sizeof(*basep) == 8 {
 | 
						if basep == nil || unsafe.Sizeof(*basep) == 8 {
 | 
				
			||||||
			return getdirentries_freebsd12(fd, buf, (*uint64)(unsafe.Pointer(basep)))
 | 
							return getdirentries(fd, buf, (*uint64)(unsafe.Pointer(basep)))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
		// The freebsd12 syscall needs a 64-bit base. On 32-bit machines
 | 
						// The syscall needs a 64-bit base. On 32-bit machines
 | 
				
			||||||
	// we can't just use the basep passed in. See #32498.
 | 
						// we can't just use the basep passed in. See #32498.
 | 
				
			||||||
	var base uint64 = uint64(*basep)
 | 
						var base uint64 = uint64(*basep)
 | 
				
			||||||
		n, err = getdirentries_freebsd12(fd, buf, &base)
 | 
						n, err = getdirentries(fd, buf, &base)
 | 
				
			||||||
	*basep = uintptr(base)
 | 
						*basep = uintptr(base)
 | 
				
			||||||
	if base>>32 != 0 {
 | 
						if base>>32 != 0 {
 | 
				
			||||||
		// We can't stuff the base back into a uintptr, so any
 | 
							// We can't stuff the base back into a uintptr, so any
 | 
				
			||||||
| 
						 | 
					@ -354,146 +239,10 @@ func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
 | 
				
			||||||
		err = EIO
 | 
							err = EIO
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// The old syscall entries are smaller than the new. Use 1/4 of the original
 | 
					 | 
				
			||||||
	// buffer size rounded up to DIRBLKSIZ (see /usr/src/lib/libc/sys/getdirentries.c).
 | 
					 | 
				
			||||||
	oldBufLen := roundup(len(buf)/4, _dirblksiz)
 | 
					 | 
				
			||||||
	oldBuf := make([]byte, oldBufLen)
 | 
					 | 
				
			||||||
	n, err = getdirentries(fd, oldBuf, basep)
 | 
					 | 
				
			||||||
	if err == nil && n > 0 {
 | 
					 | 
				
			||||||
		n = convertFromDirents11(buf, oldBuf[:n])
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Mknod(path string, mode uint32, dev uint64) (err error) {
 | 
					func Mknod(path string, mode uint32, dev uint64) (err error) {
 | 
				
			||||||
	var oldDev int
 | 
						return Mknodat(AT_FDCWD, path, mode, dev)
 | 
				
			||||||
	if supportsABI(_ino64First) {
 | 
					 | 
				
			||||||
		return mknodat_freebsd12(AT_FDCWD, path, mode, dev)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	oldDev = int(dev)
 | 
					 | 
				
			||||||
	return mknod(path, mode, oldDev)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func Mknodat(fd int, path string, mode uint32, dev uint64) (err error) {
 | 
					 | 
				
			||||||
	var oldDev int
 | 
					 | 
				
			||||||
	if supportsABI(_ino64First) {
 | 
					 | 
				
			||||||
		return mknodat_freebsd12(fd, path, mode, dev)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	oldDev = int(dev)
 | 
					 | 
				
			||||||
	return mknodat(fd, path, mode, oldDev)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// round x to the nearest multiple of y, larger or equal to x.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// from /usr/include/sys/param.h Macros for counting and rounding.
 | 
					 | 
				
			||||||
// #define roundup(x, y)   ((((x)+((y)-1))/(y))*(y))
 | 
					 | 
				
			||||||
func roundup(x, y int) int {
 | 
					 | 
				
			||||||
	return ((x + y - 1) / y) * y
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (s *Stat_t) convertFrom(old *stat_freebsd11_t) {
 | 
					 | 
				
			||||||
	*s = Stat_t{
 | 
					 | 
				
			||||||
		Dev:     uint64(old.Dev),
 | 
					 | 
				
			||||||
		Ino:     uint64(old.Ino),
 | 
					 | 
				
			||||||
		Nlink:   uint64(old.Nlink),
 | 
					 | 
				
			||||||
		Mode:    old.Mode,
 | 
					 | 
				
			||||||
		Uid:     old.Uid,
 | 
					 | 
				
			||||||
		Gid:     old.Gid,
 | 
					 | 
				
			||||||
		Rdev:    uint64(old.Rdev),
 | 
					 | 
				
			||||||
		Atim:    old.Atim,
 | 
					 | 
				
			||||||
		Mtim:    old.Mtim,
 | 
					 | 
				
			||||||
		Ctim:    old.Ctim,
 | 
					 | 
				
			||||||
		Btim:    old.Btim,
 | 
					 | 
				
			||||||
		Size:    old.Size,
 | 
					 | 
				
			||||||
		Blocks:  old.Blocks,
 | 
					 | 
				
			||||||
		Blksize: old.Blksize,
 | 
					 | 
				
			||||||
		Flags:   old.Flags,
 | 
					 | 
				
			||||||
		Gen:     uint64(old.Gen),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (s *Statfs_t) convertFrom(old *statfs_freebsd11_t) {
 | 
					 | 
				
			||||||
	*s = Statfs_t{
 | 
					 | 
				
			||||||
		Version:     _statfsVersion,
 | 
					 | 
				
			||||||
		Type:        old.Type,
 | 
					 | 
				
			||||||
		Flags:       old.Flags,
 | 
					 | 
				
			||||||
		Bsize:       old.Bsize,
 | 
					 | 
				
			||||||
		Iosize:      old.Iosize,
 | 
					 | 
				
			||||||
		Blocks:      old.Blocks,
 | 
					 | 
				
			||||||
		Bfree:       old.Bfree,
 | 
					 | 
				
			||||||
		Bavail:      old.Bavail,
 | 
					 | 
				
			||||||
		Files:       old.Files,
 | 
					 | 
				
			||||||
		Ffree:       old.Ffree,
 | 
					 | 
				
			||||||
		Syncwrites:  old.Syncwrites,
 | 
					 | 
				
			||||||
		Asyncwrites: old.Asyncwrites,
 | 
					 | 
				
			||||||
		Syncreads:   old.Syncreads,
 | 
					 | 
				
			||||||
		Asyncreads:  old.Asyncreads,
 | 
					 | 
				
			||||||
		// Spare
 | 
					 | 
				
			||||||
		Namemax: old.Namemax,
 | 
					 | 
				
			||||||
		Owner:   old.Owner,
 | 
					 | 
				
			||||||
		Fsid:    old.Fsid,
 | 
					 | 
				
			||||||
		// Charspare
 | 
					 | 
				
			||||||
		// Fstypename
 | 
					 | 
				
			||||||
		// Mntfromname
 | 
					 | 
				
			||||||
		// Mntonname
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	sl := old.Fstypename[:]
 | 
					 | 
				
			||||||
	n := clen(*(*[]byte)(unsafe.Pointer(&sl)))
 | 
					 | 
				
			||||||
	copy(s.Fstypename[:], old.Fstypename[:n])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	sl = old.Mntfromname[:]
 | 
					 | 
				
			||||||
	n = clen(*(*[]byte)(unsafe.Pointer(&sl)))
 | 
					 | 
				
			||||||
	copy(s.Mntfromname[:], old.Mntfromname[:n])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	sl = old.Mntonname[:]
 | 
					 | 
				
			||||||
	n = clen(*(*[]byte)(unsafe.Pointer(&sl)))
 | 
					 | 
				
			||||||
	copy(s.Mntonname[:], old.Mntonname[:n])
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func convertFromDirents11(buf []byte, old []byte) int {
 | 
					 | 
				
			||||||
	const (
 | 
					 | 
				
			||||||
		fixedSize    = int(unsafe.Offsetof(Dirent{}.Name))
 | 
					 | 
				
			||||||
		oldFixedSize = int(unsafe.Offsetof(dirent_freebsd11{}.Name))
 | 
					 | 
				
			||||||
	)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	dstPos := 0
 | 
					 | 
				
			||||||
	srcPos := 0
 | 
					 | 
				
			||||||
	for dstPos+fixedSize < len(buf) && srcPos+oldFixedSize < len(old) {
 | 
					 | 
				
			||||||
		var dstDirent Dirent
 | 
					 | 
				
			||||||
		var srcDirent dirent_freebsd11
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// If multiple direntries are written, sometimes when we reach the final one,
 | 
					 | 
				
			||||||
		// we may have cap of old less than size of dirent_freebsd11.
 | 
					 | 
				
			||||||
		copy((*[unsafe.Sizeof(srcDirent)]byte)(unsafe.Pointer(&srcDirent))[:], old[srcPos:])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		reclen := roundup(fixedSize+int(srcDirent.Namlen)+1, 8)
 | 
					 | 
				
			||||||
		if dstPos+reclen > len(buf) {
 | 
					 | 
				
			||||||
			break
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		dstDirent.Fileno = uint64(srcDirent.Fileno)
 | 
					 | 
				
			||||||
		dstDirent.Off = 0
 | 
					 | 
				
			||||||
		dstDirent.Reclen = uint16(reclen)
 | 
					 | 
				
			||||||
		dstDirent.Type = srcDirent.Type
 | 
					 | 
				
			||||||
		dstDirent.Pad0 = 0
 | 
					 | 
				
			||||||
		dstDirent.Namlen = uint16(srcDirent.Namlen)
 | 
					 | 
				
			||||||
		dstDirent.Pad1 = 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		copy(dstDirent.Name[:], srcDirent.Name[:srcDirent.Namlen])
 | 
					 | 
				
			||||||
		copy(buf[dstPos:], (*[unsafe.Sizeof(dstDirent)]byte)(unsafe.Pointer(&dstDirent))[:])
 | 
					 | 
				
			||||||
		padding := buf[dstPos+fixedSize+int(dstDirent.Namlen) : dstPos+reclen]
 | 
					 | 
				
			||||||
		for i := range padding {
 | 
					 | 
				
			||||||
			padding[i] = 0
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		dstPos += int(dstDirent.Reclen)
 | 
					 | 
				
			||||||
		srcPos += int(srcDirent.Reclen)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return dstPos
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 | 
					func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 | 
				
			||||||
| 
						 | 
					@ -506,31 +255,31 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
 | 
				
			||||||
//sys	ptrace(request int, pid int, addr uintptr, data int) (err error)
 | 
					//sys	ptrace(request int, pid int, addr uintptr, data int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func PtraceAttach(pid int) (err error) {
 | 
					func PtraceAttach(pid int) (err error) {
 | 
				
			||||||
	return ptrace(PTRACE_ATTACH, pid, 0, 0)
 | 
						return ptrace(PT_ATTACH, pid, 0, 0)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func PtraceCont(pid int, signal int) (err error) {
 | 
					func PtraceCont(pid int, signal int) (err error) {
 | 
				
			||||||
	return ptrace(PTRACE_CONT, pid, 1, signal)
 | 
						return ptrace(PT_CONTINUE, pid, 1, signal)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func PtraceDetach(pid int) (err error) {
 | 
					func PtraceDetach(pid int) (err error) {
 | 
				
			||||||
	return ptrace(PTRACE_DETACH, pid, 1, 0)
 | 
						return ptrace(PT_DETACH, pid, 1, 0)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func PtraceGetFpRegs(pid int, fpregsout *FpReg) (err error) {
 | 
					func PtraceGetFpRegs(pid int, fpregsout *FpReg) (err error) {
 | 
				
			||||||
	return ptrace(PTRACE_GETFPREGS, pid, uintptr(unsafe.Pointer(fpregsout)), 0)
 | 
						return ptrace(PT_GETFPREGS, pid, uintptr(unsafe.Pointer(fpregsout)), 0)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func PtraceGetRegs(pid int, regsout *Reg) (err error) {
 | 
					func PtraceGetRegs(pid int, regsout *Reg) (err error) {
 | 
				
			||||||
	return ptrace(PTRACE_GETREGS, pid, uintptr(unsafe.Pointer(regsout)), 0)
 | 
						return ptrace(PT_GETREGS, pid, uintptr(unsafe.Pointer(regsout)), 0)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func PtraceLwpEvents(pid int, enable int) (err error) {
 | 
					func PtraceLwpEvents(pid int, enable int) (err error) {
 | 
				
			||||||
	return ptrace(PTRACE_LWPEVENTS, pid, 0, enable)
 | 
						return ptrace(PT_LWP_EVENTS, pid, 0, enable)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func PtraceLwpInfo(pid int, info uintptr) (err error) {
 | 
					func PtraceLwpInfo(pid int, info uintptr) (err error) {
 | 
				
			||||||
	return ptrace(PTRACE_LWPINFO, pid, info, int(unsafe.Sizeof(PtraceLwpInfoStruct{})))
 | 
						return ptrace(PT_LWPINFO, pid, info, int(unsafe.Sizeof(PtraceLwpInfoStruct{})))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) {
 | 
					func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) {
 | 
				
			||||||
| 
						 | 
					@ -550,11 +299,11 @@ func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func PtraceSetRegs(pid int, regs *Reg) (err error) {
 | 
					func PtraceSetRegs(pid int, regs *Reg) (err error) {
 | 
				
			||||||
	return ptrace(PTRACE_SETREGS, pid, uintptr(unsafe.Pointer(regs)), 0)
 | 
						return ptrace(PT_SETREGS, pid, uintptr(unsafe.Pointer(regs)), 0)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func PtraceSingleStep(pid int) (err error) {
 | 
					func PtraceSingleStep(pid int) (err error) {
 | 
				
			||||||
	return ptrace(PTRACE_SINGLESTEP, pid, 1, 0)
 | 
						return ptrace(PT_STEP, pid, 1, 0)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -570,6 +319,7 @@ func PtraceSingleStep(pid int) (err error) {
 | 
				
			||||||
//sys	Chmod(path string, mode uint32) (err error)
 | 
					//sys	Chmod(path string, mode uint32) (err error)
 | 
				
			||||||
//sys	Chown(path string, uid int, gid int) (err error)
 | 
					//sys	Chown(path string, uid int, gid int) (err error)
 | 
				
			||||||
//sys	Chroot(path string) (err error)
 | 
					//sys	Chroot(path string) (err error)
 | 
				
			||||||
 | 
					//sys	ClockGettime(clockid int32, time *Timespec) (err error)
 | 
				
			||||||
//sys	Close(fd int) (err error)
 | 
					//sys	Close(fd int) (err error)
 | 
				
			||||||
//sys	Dup(fd int) (nfd int, err error)
 | 
					//sys	Dup(fd int) (nfd int, err error)
 | 
				
			||||||
//sys	Dup2(from int, to int) (err error)
 | 
					//sys	Dup2(from int, to int) (err error)
 | 
				
			||||||
| 
						 | 
					@ -596,16 +346,12 @@ func PtraceSingleStep(pid int) (err error) {
 | 
				
			||||||
//sys	Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error)
 | 
					//sys	Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error)
 | 
				
			||||||
//sys	Flock(fd int, how int) (err error)
 | 
					//sys	Flock(fd int, how int) (err error)
 | 
				
			||||||
//sys	Fpathconf(fd int, name int) (val int, err error)
 | 
					//sys	Fpathconf(fd int, name int) (val int, err error)
 | 
				
			||||||
//sys	fstat(fd int, stat *stat_freebsd11_t) (err error)
 | 
					//sys	Fstat(fd int, stat *Stat_t) (err error)
 | 
				
			||||||
//sys	fstat_freebsd12(fd int, stat *Stat_t) (err error)
 | 
					//sys	Fstatat(fd int, path string, stat *Stat_t, flags int) (err error)
 | 
				
			||||||
//sys	fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error)
 | 
					//sys	Fstatfs(fd int, stat *Statfs_t) (err error)
 | 
				
			||||||
//sys	fstatat_freebsd12(fd int, path string, stat *Stat_t, flags int) (err error)
 | 
					 | 
				
			||||||
//sys	fstatfs(fd int, stat *statfs_freebsd11_t) (err error)
 | 
					 | 
				
			||||||
//sys	fstatfs_freebsd12(fd int, stat *Statfs_t) (err error)
 | 
					 | 
				
			||||||
//sys	Fsync(fd int) (err error)
 | 
					//sys	Fsync(fd int) (err error)
 | 
				
			||||||
//sys	Ftruncate(fd int, length int64) (err error)
 | 
					//sys	Ftruncate(fd int, length int64) (err error)
 | 
				
			||||||
//sys	getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error)
 | 
					//sys	getdirentries(fd int, buf []byte, basep *uint64) (n int, err error)
 | 
				
			||||||
//sys	getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error)
 | 
					 | 
				
			||||||
//sys	Getdtablesize() (size int)
 | 
					//sys	Getdtablesize() (size int)
 | 
				
			||||||
//sysnb	Getegid() (egid int)
 | 
					//sysnb	Getegid() (egid int)
 | 
				
			||||||
//sysnb	Geteuid() (uid int)
 | 
					//sysnb	Geteuid() (uid int)
 | 
				
			||||||
| 
						 | 
					@ -627,19 +373,16 @@ func PtraceSingleStep(pid int) (err error) {
 | 
				
			||||||
//sys	Link(path string, link string) (err error)
 | 
					//sys	Link(path string, link string) (err error)
 | 
				
			||||||
//sys	Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error)
 | 
					//sys	Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error)
 | 
				
			||||||
//sys	Listen(s int, backlog int) (err error)
 | 
					//sys	Listen(s int, backlog int) (err error)
 | 
				
			||||||
//sys	lstat(path string, stat *stat_freebsd11_t) (err error)
 | 
					 | 
				
			||||||
//sys	Mkdir(path string, mode uint32) (err error)
 | 
					//sys	Mkdir(path string, mode uint32) (err error)
 | 
				
			||||||
//sys	Mkdirat(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	Mkfifo(path string, mode uint32) (err error)
 | 
				
			||||||
//sys	mknod(path string, mode uint32, dev int) (err error)
 | 
					//sys	Mknodat(fd int, path string, mode uint32, dev uint64) (err error)
 | 
				
			||||||
//sys	mknodat(fd int, path string, mode uint32, dev int) (err error)
 | 
					 | 
				
			||||||
//sys	mknodat_freebsd12(fd int, path string, mode uint32, dev uint64) (err error)
 | 
					 | 
				
			||||||
//sys	Nanosleep(time *Timespec, leftover *Timespec) (err error)
 | 
					//sys	Nanosleep(time *Timespec, leftover *Timespec) (err error)
 | 
				
			||||||
//sys	Open(path string, mode int, perm uint32) (fd int, err error)
 | 
					//sys	Open(path string, mode int, perm uint32) (fd int, err error)
 | 
				
			||||||
//sys	Openat(fdat int, path string, mode int, perm uint32) (fd int, err error)
 | 
					//sys	Openat(fdat int, path string, mode int, perm uint32) (fd int, err error)
 | 
				
			||||||
//sys	Pathconf(path string, name int) (val int, err error)
 | 
					//sys	Pathconf(path string, name int) (val int, err error)
 | 
				
			||||||
//sys	Pread(fd int, p []byte, offset int64) (n int, err error)
 | 
					//sys	pread(fd int, p []byte, offset int64) (n int, err error)
 | 
				
			||||||
//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error)
 | 
					//sys	pwrite(fd int, p []byte, offset int64) (n int, err error)
 | 
				
			||||||
//sys	read(fd int, p []byte) (n int, err error)
 | 
					//sys	read(fd int, p []byte) (n int, err error)
 | 
				
			||||||
//sys	Readlink(path string, buf []byte) (n int, err error)
 | 
					//sys	Readlink(path string, buf []byte) (n int, err error)
 | 
				
			||||||
//sys	Readlinkat(dirfd int, path string, buf []byte) (n int, err error)
 | 
					//sys	Readlinkat(dirfd int, path string, buf []byte) (n int, err error)
 | 
				
			||||||
| 
						 | 
					@ -663,9 +406,7 @@ func PtraceSingleStep(pid int) (err error) {
 | 
				
			||||||
//sysnb	Setsid() (pid int, err error)
 | 
					//sysnb	Setsid() (pid int, err error)
 | 
				
			||||||
//sysnb	Settimeofday(tp *Timeval) (err error)
 | 
					//sysnb	Settimeofday(tp *Timeval) (err error)
 | 
				
			||||||
//sysnb	Setuid(uid int) (err error)
 | 
					//sysnb	Setuid(uid int) (err error)
 | 
				
			||||||
//sys	stat(path string, stat *stat_freebsd11_t) (err error)
 | 
					//sys	Statfs(path string, stat *Statfs_t) (err error)
 | 
				
			||||||
//sys	statfs(path string, stat *statfs_freebsd11_t) (err error)
 | 
					 | 
				
			||||||
//sys	statfs_freebsd12(path string, stat *Statfs_t) (err error)
 | 
					 | 
				
			||||||
//sys	Symlink(path string, link string) (err error)
 | 
					//sys	Symlink(path string, link string) (err error)
 | 
				
			||||||
//sys	Symlinkat(oldpath string, newdirfd int, newpath string) (err error)
 | 
					//sys	Symlinkat(oldpath string, newdirfd int, newpath string) (err error)
 | 
				
			||||||
//sys	Sync() (err error)
 | 
					//sys	Sync() (err error)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,11 +57,11 @@ 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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func PtraceGetFsBase(pid int, fsbase *int64) (err error) {
 | 
					func PtraceGetFsBase(pid int, fsbase *int64) (err error) {
 | 
				
			||||||
	return ptrace(PTRACE_GETFSBASE, pid, uintptr(unsafe.Pointer(fsbase)), 0)
 | 
						return ptrace(PT_GETFSBASE, pid, uintptr(unsafe.Pointer(fsbase)), 0)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
 | 
					func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
 | 
				
			||||||
	ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint32(countin)}
 | 
						ioDesc := PtraceIoDesc{Op: int32(req), Offs: uintptr(unsafe.Pointer(addr)), Addr: uintptr(unsafe.Pointer(&out[0])), Len: uint32(countin)}
 | 
				
			||||||
	err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
 | 
						err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
 | 
				
			||||||
	return int(ioDesc.Len), err
 | 
						return int(ioDesc.Len), err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,11 +57,11 @@ 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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func PtraceGetFsBase(pid int, fsbase *int64) (err error) {
 | 
					func PtraceGetFsBase(pid int, fsbase *int64) (err error) {
 | 
				
			||||||
	return ptrace(PTRACE_GETFSBASE, pid, uintptr(unsafe.Pointer(fsbase)), 0)
 | 
						return ptrace(PT_GETFSBASE, pid, uintptr(unsafe.Pointer(fsbase)), 0)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
 | 
					func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
 | 
				
			||||||
	ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint64(countin)}
 | 
						ioDesc := PtraceIoDesc{Op: int32(req), Offs: uintptr(unsafe.Pointer(addr)), Addr: uintptr(unsafe.Pointer(&out[0])), Len: uint64(countin)}
 | 
				
			||||||
	err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
 | 
						err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
 | 
				
			||||||
	return int(ioDesc.Len), err
 | 
						return int(ioDesc.Len), err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,7 +57,7 @@ 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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
 | 
					func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
 | 
				
			||||||
	ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint32(countin)}
 | 
						ioDesc := PtraceIoDesc{Op: int32(req), Offs: uintptr(unsafe.Pointer(addr)), Addr: uintptr(unsafe.Pointer(&out[0])), Len: uint32(countin)}
 | 
				
			||||||
	err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
 | 
						err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
 | 
				
			||||||
	return int(ioDesc.Len), err
 | 
						return int(ioDesc.Len), err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,7 +57,7 @@ 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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
 | 
					func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
 | 
				
			||||||
	ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint64(countin)}
 | 
						ioDesc := PtraceIoDesc{Op: int32(req), Offs: uintptr(unsafe.Pointer(addr)), Addr: uintptr(unsafe.Pointer(&out[0])), Len: uint64(countin)}
 | 
				
			||||||
	err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
 | 
						err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
 | 
				
			||||||
	return int(ioDesc.Len), err
 | 
						return int(ioDesc.Len), err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,63 @@
 | 
				
			||||||
 | 
					// Copyright 2022 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:build riscv64 && freebsd
 | 
				
			||||||
 | 
					// +build riscv64,freebsd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func setTimespec(sec, nsec int64) Timespec {
 | 
				
			||||||
 | 
						return Timespec{Sec: sec, Nsec: nsec}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func setTimeval(sec, usec int64) Timeval {
 | 
				
			||||||
 | 
						return Timeval{Sec: sec, Usec: usec}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetKevent(k *Kevent_t, fd, mode, flags int) {
 | 
				
			||||||
 | 
						k.Ident = uint64(fd)
 | 
				
			||||||
 | 
						k.Filter = int16(mode)
 | 
				
			||||||
 | 
						k.Flags = uint16(flags)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
 | 
				
			||||||
 | 
						ioDesc := PtraceIoDesc{Op: int32(req), Offs: uintptr(unsafe.Pointer(addr)), Addr: uintptr(unsafe.Pointer(&out[0])), Len: uint64(countin)}
 | 
				
			||||||
 | 
						err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
 | 
				
			||||||
 | 
						return int(ioDesc.Len), err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					// Copyright 2022 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:build hurd
 | 
				
			||||||
 | 
					// +build hurd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					int ioctl(int, unsigned long int, uintptr_t);
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					import "C"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func ioctl(fd int, req uint, arg uintptr) (err error) {
 | 
				
			||||||
 | 
						r0, er := C.ioctl(C.int(fd), C.ulong(req), C.uintptr_t(arg))
 | 
				
			||||||
 | 
						if r0 == -1 && er != nil {
 | 
				
			||||||
 | 
							err = er
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					// Copyright 2022 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:build 386 && hurd
 | 
				
			||||||
 | 
					// +build 386,hurd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						TIOCGETA = 0x62251713
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Winsize struct {
 | 
				
			||||||
 | 
						Row    uint16
 | 
				
			||||||
 | 
						Col    uint16
 | 
				
			||||||
 | 
						Xpixel uint16
 | 
				
			||||||
 | 
						Ypixel uint16
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Termios struct {
 | 
				
			||||||
 | 
						Iflag  uint32
 | 
				
			||||||
 | 
						Oflag  uint32
 | 
				
			||||||
 | 
						Cflag  uint32
 | 
				
			||||||
 | 
						Lflag  uint32
 | 
				
			||||||
 | 
						Cc     [20]uint8
 | 
				
			||||||
 | 
						Ispeed int32
 | 
				
			||||||
 | 
						Ospeed int32
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -10,8 +10,6 @@
 | 
				
			||||||
package unix
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"runtime"
 | 
					 | 
				
			||||||
	"unsafe"
 | 
						"unsafe"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,10 +18,9 @@ func bytes2iovec(bs [][]byte) []Iovec {
 | 
				
			||||||
	for i, b := range bs {
 | 
						for i, b := range bs {
 | 
				
			||||||
		iovecs[i].SetLen(len(b))
 | 
							iovecs[i].SetLen(len(b))
 | 
				
			||||||
		if len(b) > 0 {
 | 
							if len(b) > 0 {
 | 
				
			||||||
			// somehow Iovec.Base on illumos is (*int8), not (*byte)
 | 
								iovecs[i].Base = &b[0]
 | 
				
			||||||
			iovecs[i].Base = (*int8)(unsafe.Pointer(&b[0]))
 | 
					 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			iovecs[i].Base = (*int8)(unsafe.Pointer(&_zero))
 | 
								iovecs[i].Base = (*byte)(unsafe.Pointer(&_zero))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return iovecs
 | 
						return iovecs
 | 
				
			||||||
| 
						 | 
					@ -80,107 +77,3 @@ func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
//sys	putmsg(fd int, clptr *strbuf, dataptr *strbuf, flags int) (err error)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func Putmsg(fd int, cl []byte, data []byte, flags int) (err error) {
 | 
					 | 
				
			||||||
	var clp, datap *strbuf
 | 
					 | 
				
			||||||
	if len(cl) > 0 {
 | 
					 | 
				
			||||||
		clp = &strbuf{
 | 
					 | 
				
			||||||
			Len: int32(len(cl)),
 | 
					 | 
				
			||||||
			Buf: (*int8)(unsafe.Pointer(&cl[0])),
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if len(data) > 0 {
 | 
					 | 
				
			||||||
		datap = &strbuf{
 | 
					 | 
				
			||||||
			Len: int32(len(data)),
 | 
					 | 
				
			||||||
			Buf: (*int8)(unsafe.Pointer(&data[0])),
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return putmsg(fd, clp, datap, flags)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//sys	getmsg(fd int, clptr *strbuf, dataptr *strbuf, flags *int) (err error)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func Getmsg(fd int, cl []byte, data []byte) (retCl []byte, retData []byte, flags int, err error) {
 | 
					 | 
				
			||||||
	var clp, datap *strbuf
 | 
					 | 
				
			||||||
	if len(cl) > 0 {
 | 
					 | 
				
			||||||
		clp = &strbuf{
 | 
					 | 
				
			||||||
			Maxlen: int32(len(cl)),
 | 
					 | 
				
			||||||
			Buf:    (*int8)(unsafe.Pointer(&cl[0])),
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if len(data) > 0 {
 | 
					 | 
				
			||||||
		datap = &strbuf{
 | 
					 | 
				
			||||||
			Maxlen: int32(len(data)),
 | 
					 | 
				
			||||||
			Buf:    (*int8)(unsafe.Pointer(&data[0])),
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if err = getmsg(fd, clp, datap, &flags); err != nil {
 | 
					 | 
				
			||||||
		return nil, nil, 0, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if len(cl) > 0 {
 | 
					 | 
				
			||||||
		retCl = cl[:clp.Len]
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if len(data) > 0 {
 | 
					 | 
				
			||||||
		retData = data[:datap.Len]
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return retCl, retData, flags, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func IoctlSetIntRetInt(fd int, req uint, arg int) (int, error) {
 | 
					 | 
				
			||||||
	return ioctlRet(fd, req, uintptr(arg))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func IoctlSetString(fd int, req uint, val string) error {
 | 
					 | 
				
			||||||
	bs := make([]byte, len(val)+1)
 | 
					 | 
				
			||||||
	copy(bs[:len(bs)-1], val)
 | 
					 | 
				
			||||||
	err := ioctl(fd, req, uintptr(unsafe.Pointer(&bs[0])))
 | 
					 | 
				
			||||||
	runtime.KeepAlive(&bs[0])
 | 
					 | 
				
			||||||
	return err
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Lifreq Helpers
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (l *Lifreq) SetName(name string) error {
 | 
					 | 
				
			||||||
	if len(name) >= len(l.Name) {
 | 
					 | 
				
			||||||
		return fmt.Errorf("name cannot be more than %d characters", len(l.Name)-1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i := range name {
 | 
					 | 
				
			||||||
		l.Name[i] = int8(name[i])
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (l *Lifreq) SetLifruInt(d int) {
 | 
					 | 
				
			||||||
	*(*int)(unsafe.Pointer(&l.Lifru[0])) = d
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (l *Lifreq) GetLifruInt() int {
 | 
					 | 
				
			||||||
	return *(*int)(unsafe.Pointer(&l.Lifru[0]))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (l *Lifreq) SetLifruUint(d uint) {
 | 
					 | 
				
			||||||
	*(*uint)(unsafe.Pointer(&l.Lifru[0])) = d
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (l *Lifreq) GetLifruUint() uint {
 | 
					 | 
				
			||||||
	return *(*uint)(unsafe.Pointer(&l.Lifru[0]))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func IoctlLifreq(fd int, req uint, l *Lifreq) error {
 | 
					 | 
				
			||||||
	return ioctl(fd, req, uintptr(unsafe.Pointer(l)))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Strioctl Helpers
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (s *Strioctl) SetInt(i int) {
 | 
					 | 
				
			||||||
	s.Len = int32(unsafe.Sizeof(i))
 | 
					 | 
				
			||||||
	s.Dp = (*int8)(unsafe.Pointer(&i))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func IoctlSetStrioctlRetInt(fd int, req uint, s *Strioctl) (int, error) {
 | 
					 | 
				
			||||||
	return ioctlRet(fd, req, uintptr(unsafe.Pointer(s)))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,7 +13,9 @@ package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/binary"
 | 
						"encoding/binary"
 | 
				
			||||||
 | 
						"strconv"
 | 
				
			||||||
	"syscall"
 | 
						"syscall"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
	"unsafe"
 | 
						"unsafe"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -232,7 +234,7 @@ func Futimesat(dirfd int, path string, tv []Timeval) error {
 | 
				
			||||||
func Futimes(fd int, tv []Timeval) (err error) {
 | 
					func Futimes(fd int, tv []Timeval) (err error) {
 | 
				
			||||||
	// Believe it or not, this is the best we can do on Linux
 | 
						// Believe it or not, this is the best we can do on Linux
 | 
				
			||||||
	// (and is what glibc does).
 | 
						// (and is what glibc does).
 | 
				
			||||||
	return Utimes("/proc/self/fd/"+itoa(fd), tv)
 | 
						return Utimes("/proc/self/fd/"+strconv.Itoa(fd), tv)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const ImplementsGetwd = true
 | 
					const ImplementsGetwd = true
 | 
				
			||||||
| 
						 | 
					@ -249,6 +251,13 @@ func Getwd() (wd string, err error) {
 | 
				
			||||||
	if n < 1 || n > len(buf) || buf[n-1] != 0 {
 | 
						if n < 1 || n > len(buf) || buf[n-1] != 0 {
 | 
				
			||||||
		return "", EINVAL
 | 
							return "", EINVAL
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						// In some cases, Linux can return a path that starts with the
 | 
				
			||||||
 | 
						// "(unreachable)" prefix, which can potentially be a valid relative
 | 
				
			||||||
 | 
						// path. To work around that, return ENOENT if path is not absolute.
 | 
				
			||||||
 | 
						if buf[0] != '/' {
 | 
				
			||||||
 | 
							return "", ENOENT
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return string(buf[0 : n-1]), nil
 | 
						return string(buf[0 : n-1]), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -358,6 +367,8 @@ func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int,
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	Waitid(idType int, id int, info *Siginfo, options int, rusage *Rusage) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Mkfifo(path string, mode uint32) error {
 | 
					func Mkfifo(path string, mode uint32) error {
 | 
				
			||||||
	return Mknod(path, mode|S_IFIFO, 0)
 | 
						return Mknod(path, mode|S_IFIFO, 0)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1489,19 +1500,13 @@ func KeyctlRestrictKeyring(ringid int, keyType string, restriction string) error
 | 
				
			||||||
//sys	keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) = SYS_KEYCTL
 | 
					//sys	keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) = SYS_KEYCTL
 | 
				
			||||||
//sys	keyctlRestrictKeyring(cmd int, arg2 int) (err error) = SYS_KEYCTL
 | 
					//sys	keyctlRestrictKeyring(cmd int, arg2 int) (err error) = SYS_KEYCTL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
 | 
					func recvmsgRaw(fd int, iov []Iovec, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) {
 | 
				
			||||||
	var msg Msghdr
 | 
						var msg Msghdr
 | 
				
			||||||
	var rsa RawSockaddrAny
 | 
						msg.Name = (*byte)(unsafe.Pointer(rsa))
 | 
				
			||||||
	msg.Name = (*byte)(unsafe.Pointer(&rsa))
 | 
					 | 
				
			||||||
	msg.Namelen = uint32(SizeofSockaddrAny)
 | 
						msg.Namelen = uint32(SizeofSockaddrAny)
 | 
				
			||||||
	var iov Iovec
 | 
					 | 
				
			||||||
	if len(p) > 0 {
 | 
					 | 
				
			||||||
		iov.Base = &p[0]
 | 
					 | 
				
			||||||
		iov.SetLen(len(p))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	var dummy byte
 | 
						var dummy byte
 | 
				
			||||||
	if len(oob) > 0 {
 | 
						if len(oob) > 0 {
 | 
				
			||||||
		if len(p) == 0 {
 | 
							if emptyIovecs(iov) {
 | 
				
			||||||
			var sockType int
 | 
								var sockType int
 | 
				
			||||||
			sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)
 | 
								sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
| 
						 | 
					@ -1509,53 +1514,36 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			// receive at least one normal byte
 | 
								// receive at least one normal byte
 | 
				
			||||||
			if sockType != SOCK_DGRAM {
 | 
								if sockType != SOCK_DGRAM {
 | 
				
			||||||
				iov.Base = &dummy
 | 
									var iova [1]Iovec
 | 
				
			||||||
				iov.SetLen(1)
 | 
									iova[0].Base = &dummy
 | 
				
			||||||
 | 
									iova[0].SetLen(1)
 | 
				
			||||||
 | 
									iov = iova[:]
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		msg.Control = &oob[0]
 | 
							msg.Control = &oob[0]
 | 
				
			||||||
		msg.SetControllen(len(oob))
 | 
							msg.SetControllen(len(oob))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	msg.Iov = &iov
 | 
						if len(iov) > 0 {
 | 
				
			||||||
	msg.Iovlen = 1
 | 
							msg.Iov = &iov[0]
 | 
				
			||||||
 | 
							msg.SetIovlen(len(iov))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if n, err = recvmsg(fd, &msg, flags); err != nil {
 | 
						if n, err = recvmsg(fd, &msg, flags); err != nil {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	oobn = int(msg.Controllen)
 | 
						oobn = int(msg.Controllen)
 | 
				
			||||||
	recvflags = int(msg.Flags)
 | 
						recvflags = int(msg.Flags)
 | 
				
			||||||
	// source address is only specified if the socket is unconnected
 | 
					 | 
				
			||||||
	if rsa.Addr.Family != AF_UNSPEC {
 | 
					 | 
				
			||||||
		from, err = anyToSockaddr(fd, &rsa)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
 | 
					func sendmsgN(fd int, iov []Iovec, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) {
 | 
				
			||||||
	_, err = SendmsgN(fd, p, oob, to, flags)
 | 
					 | 
				
			||||||
	return
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
 | 
					 | 
				
			||||||
	var ptr unsafe.Pointer
 | 
					 | 
				
			||||||
	var salen _Socklen
 | 
					 | 
				
			||||||
	if to != nil {
 | 
					 | 
				
			||||||
		var err error
 | 
					 | 
				
			||||||
		ptr, salen, err = to.sockaddr()
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return 0, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	var msg Msghdr
 | 
						var msg Msghdr
 | 
				
			||||||
	msg.Name = (*byte)(ptr)
 | 
						msg.Name = (*byte)(ptr)
 | 
				
			||||||
	msg.Namelen = uint32(salen)
 | 
						msg.Namelen = uint32(salen)
 | 
				
			||||||
	var iov Iovec
 | 
					 | 
				
			||||||
	if len(p) > 0 {
 | 
					 | 
				
			||||||
		iov.Base = &p[0]
 | 
					 | 
				
			||||||
		iov.SetLen(len(p))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	var dummy byte
 | 
						var dummy byte
 | 
				
			||||||
 | 
						var empty bool
 | 
				
			||||||
	if len(oob) > 0 {
 | 
						if len(oob) > 0 {
 | 
				
			||||||
		if len(p) == 0 {
 | 
							empty = emptyIovecs(iov)
 | 
				
			||||||
 | 
							if empty {
 | 
				
			||||||
			var sockType int
 | 
								var sockType int
 | 
				
			||||||
			sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)
 | 
								sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
| 
						 | 
					@ -1563,19 +1551,23 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			// send at least one normal byte
 | 
								// send at least one normal byte
 | 
				
			||||||
			if sockType != SOCK_DGRAM {
 | 
								if sockType != SOCK_DGRAM {
 | 
				
			||||||
				iov.Base = &dummy
 | 
									var iova [1]Iovec
 | 
				
			||||||
				iov.SetLen(1)
 | 
									iova[0].Base = &dummy
 | 
				
			||||||
 | 
									iova[0].SetLen(1)
 | 
				
			||||||
 | 
									iov = iova[:]
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		msg.Control = &oob[0]
 | 
							msg.Control = &oob[0]
 | 
				
			||||||
		msg.SetControllen(len(oob))
 | 
							msg.SetControllen(len(oob))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	msg.Iov = &iov
 | 
						if len(iov) > 0 {
 | 
				
			||||||
	msg.Iovlen = 1
 | 
							msg.Iov = &iov[0]
 | 
				
			||||||
 | 
							msg.SetIovlen(len(iov))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if n, err = sendmsg(fd, &msg, flags); err != nil {
 | 
						if n, err = sendmsg(fd, &msg, flags); err != nil {
 | 
				
			||||||
		return 0, err
 | 
							return 0, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if len(oob) > 0 && len(p) == 0 {
 | 
						if len(oob) > 0 && empty {
 | 
				
			||||||
		n = 0
 | 
							n = 0
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return n, nil
 | 
						return n, nil
 | 
				
			||||||
| 
						 | 
					@ -1838,6 +1830,9 @@ func Dup2(oldfd, newfd int) error {
 | 
				
			||||||
//sys	Fremovexattr(fd int, attr string) (err error)
 | 
					//sys	Fremovexattr(fd int, attr string) (err error)
 | 
				
			||||||
//sys	Fsetxattr(fd int, attr string, dest []byte, flags int) (err error)
 | 
					//sys	Fsetxattr(fd int, attr string, dest []byte, flags int) (err error)
 | 
				
			||||||
//sys	Fsync(fd int) (err error)
 | 
					//sys	Fsync(fd int) (err error)
 | 
				
			||||||
 | 
					//sys	Fsmount(fd int, flags int, mountAttrs int) (fsfd int, err error)
 | 
				
			||||||
 | 
					//sys	Fsopen(fsName string, flags int) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	Fspick(dirfd int, pathName string, flags int) (fd int, err error)
 | 
				
			||||||
//sys	Getdents(fd int, buf []byte) (n int, err error) = SYS_GETDENTS64
 | 
					//sys	Getdents(fd int, buf []byte) (n int, err error) = SYS_GETDENTS64
 | 
				
			||||||
//sysnb	Getpgid(pid int) (pgid int, err error)
 | 
					//sysnb	Getpgid(pid int) (pgid int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1868,7 +1863,9 @@ func Getpgrp() (pid int) {
 | 
				
			||||||
//sys	MemfdCreate(name string, flags int) (fd int, err error)
 | 
					//sys	MemfdCreate(name string, flags int) (fd int, err error)
 | 
				
			||||||
//sys	Mkdirat(dirfd int, path string, mode uint32) (err error)
 | 
					//sys	Mkdirat(dirfd int, path string, mode uint32) (err error)
 | 
				
			||||||
//sys	Mknodat(dirfd int, path string, mode uint32, dev int) (err error)
 | 
					//sys	Mknodat(dirfd int, path string, mode uint32, dev int) (err error)
 | 
				
			||||||
 | 
					//sys	MoveMount(fromDirfd int, fromPathName string, toDirfd int, toPathName string, flags int) (err error)
 | 
				
			||||||
//sys	Nanosleep(time *Timespec, leftover *Timespec) (err error)
 | 
					//sys	Nanosleep(time *Timespec, leftover *Timespec) (err error)
 | 
				
			||||||
 | 
					//sys	OpenTree(dfd int, fileName string, flags uint) (r int, err error)
 | 
				
			||||||
//sys	PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error)
 | 
					//sys	PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error)
 | 
				
			||||||
//sys	PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT
 | 
					//sys	PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT
 | 
				
			||||||
//sysnb	Prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64
 | 
					//sysnb	Prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64
 | 
				
			||||||
| 
						 | 
					@ -1896,17 +1893,28 @@ func PrctlRetInt(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uint
 | 
				
			||||||
	return int(ret), nil
 | 
						return int(ret), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// issue 1435.
 | 
					 | 
				
			||||||
// On linux Setuid and Setgid only affects the current thread, not the process.
 | 
					 | 
				
			||||||
// This does not match what most callers expect so we must return an error
 | 
					 | 
				
			||||||
// here rather than letting the caller think that the call succeeded.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func Setuid(uid int) (err error) {
 | 
					func Setuid(uid int) (err error) {
 | 
				
			||||||
	return EOPNOTSUPP
 | 
						return syscall.Setuid(uid)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Setgid(uid int) (err error) {
 | 
					func Setgid(gid int) (err error) {
 | 
				
			||||||
	return EOPNOTSUPP
 | 
						return syscall.Setgid(gid)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Setreuid(ruid, euid int) (err error) {
 | 
				
			||||||
 | 
						return syscall.Setreuid(ruid, euid)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Setregid(rgid, egid int) (err error) {
 | 
				
			||||||
 | 
						return syscall.Setregid(rgid, egid)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Setresuid(ruid, euid, suid int) (err error) {
 | 
				
			||||||
 | 
						return syscall.Setresuid(ruid, euid, suid)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Setresgid(rgid, egid, sgid int) (err error) {
 | 
				
			||||||
 | 
						return syscall.Setresgid(rgid, egid, sgid)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SetfsgidRetGid sets fsgid for current thread and returns previous fsgid set.
 | 
					// SetfsgidRetGid sets fsgid for current thread and returns previous fsgid set.
 | 
				
			||||||
| 
						 | 
					@ -1965,36 +1973,46 @@ func Signalfd(fd int, sigmask *Sigset_t, flags int) (newfd int, err error) {
 | 
				
			||||||
//sys	preadv2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) = SYS_PREADV2
 | 
					//sys	preadv2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) = SYS_PREADV2
 | 
				
			||||||
//sys	pwritev2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) = SYS_PWRITEV2
 | 
					//sys	pwritev2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) = SYS_PWRITEV2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func bytes2iovec(bs [][]byte) []Iovec {
 | 
					// minIovec is the size of the small initial allocation used by
 | 
				
			||||||
	iovecs := make([]Iovec, len(bs))
 | 
					// Readv, Writev, etc.
 | 
				
			||||||
	for i, b := range bs {
 | 
					//
 | 
				
			||||||
		iovecs[i].SetLen(len(b))
 | 
					// This small allocation gets stack allocated, which lets the
 | 
				
			||||||
 | 
					// common use case of len(iovs) <= minIovs avoid more expensive
 | 
				
			||||||
 | 
					// heap allocations.
 | 
				
			||||||
 | 
					const minIovec = 8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// appendBytes converts bs to Iovecs and appends them to vecs.
 | 
				
			||||||
 | 
					func appendBytes(vecs []Iovec, bs [][]byte) []Iovec {
 | 
				
			||||||
 | 
						for _, b := range bs {
 | 
				
			||||||
 | 
							var v Iovec
 | 
				
			||||||
 | 
							v.SetLen(len(b))
 | 
				
			||||||
		if len(b) > 0 {
 | 
							if len(b) > 0 {
 | 
				
			||||||
			iovecs[i].Base = &b[0]
 | 
								v.Base = &b[0]
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			iovecs[i].Base = (*byte)(unsafe.Pointer(&_zero))
 | 
								v.Base = (*byte)(unsafe.Pointer(&_zero))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							vecs = append(vecs, v)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return iovecs
 | 
						return vecs
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// offs2lohi splits offs into its lower and upper unsigned long. On 64-bit
 | 
					// offs2lohi splits offs into its low and high order bits.
 | 
				
			||||||
// systems, hi will always be 0. On 32-bit systems, offs will be split in half.
 | 
					 | 
				
			||||||
// preadv/pwritev chose this calling convention so they don't need to add a
 | 
					 | 
				
			||||||
// padding-register for alignment on ARM.
 | 
					 | 
				
			||||||
func offs2lohi(offs int64) (lo, hi uintptr) {
 | 
					func offs2lohi(offs int64) (lo, hi uintptr) {
 | 
				
			||||||
	return uintptr(offs), uintptr(uint64(offs) >> SizeofLong)
 | 
						const longBits = SizeofLong * 8
 | 
				
			||||||
 | 
						return uintptr(offs), uintptr(uint64(offs) >> longBits)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Readv(fd int, iovs [][]byte) (n int, err error) {
 | 
					func Readv(fd int, iovs [][]byte) (n int, err error) {
 | 
				
			||||||
	iovecs := bytes2iovec(iovs)
 | 
						iovecs := make([]Iovec, 0, minIovec)
 | 
				
			||||||
 | 
						iovecs = appendBytes(iovecs, iovs)
 | 
				
			||||||
	n, err = readv(fd, iovecs)
 | 
						n, err = readv(fd, iovecs)
 | 
				
			||||||
	readvRacedetect(iovecs, n, err)
 | 
						readvRacedetect(iovecs, n, err)
 | 
				
			||||||
	return n, err
 | 
						return n, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Preadv(fd int, iovs [][]byte, offset int64) (n int, err error) {
 | 
					func Preadv(fd int, iovs [][]byte, offset int64) (n int, err error) {
 | 
				
			||||||
	iovecs := bytes2iovec(iovs)
 | 
						iovecs := make([]Iovec, 0, minIovec)
 | 
				
			||||||
 | 
						iovecs = appendBytes(iovecs, iovs)
 | 
				
			||||||
	lo, hi := offs2lohi(offset)
 | 
						lo, hi := offs2lohi(offset)
 | 
				
			||||||
	n, err = preadv(fd, iovecs, lo, hi)
 | 
						n, err = preadv(fd, iovecs, lo, hi)
 | 
				
			||||||
	readvRacedetect(iovecs, n, err)
 | 
						readvRacedetect(iovecs, n, err)
 | 
				
			||||||
| 
						 | 
					@ -2002,7 +2020,8 @@ func Preadv(fd int, iovs [][]byte, offset int64) (n int, err error) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Preadv2(fd int, iovs [][]byte, offset int64, flags int) (n int, err error) {
 | 
					func Preadv2(fd int, iovs [][]byte, offset int64, flags int) (n int, err error) {
 | 
				
			||||||
	iovecs := bytes2iovec(iovs)
 | 
						iovecs := make([]Iovec, 0, minIovec)
 | 
				
			||||||
 | 
						iovecs = appendBytes(iovecs, iovs)
 | 
				
			||||||
	lo, hi := offs2lohi(offset)
 | 
						lo, hi := offs2lohi(offset)
 | 
				
			||||||
	n, err = preadv2(fd, iovecs, lo, hi, flags)
 | 
						n, err = preadv2(fd, iovecs, lo, hi, flags)
 | 
				
			||||||
	readvRacedetect(iovecs, n, err)
 | 
						readvRacedetect(iovecs, n, err)
 | 
				
			||||||
| 
						 | 
					@ -2029,7 +2048,8 @@ func readvRacedetect(iovecs []Iovec, n int, err error) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Writev(fd int, iovs [][]byte) (n int, err error) {
 | 
					func Writev(fd int, iovs [][]byte) (n int, err error) {
 | 
				
			||||||
	iovecs := bytes2iovec(iovs)
 | 
						iovecs := make([]Iovec, 0, minIovec)
 | 
				
			||||||
 | 
						iovecs = appendBytes(iovecs, iovs)
 | 
				
			||||||
	if raceenabled {
 | 
						if raceenabled {
 | 
				
			||||||
		raceReleaseMerge(unsafe.Pointer(&ioSync))
 | 
							raceReleaseMerge(unsafe.Pointer(&ioSync))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -2039,7 +2059,8 @@ func Writev(fd int, iovs [][]byte) (n int, err error) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Pwritev(fd int, iovs [][]byte, offset int64) (n int, err error) {
 | 
					func Pwritev(fd int, iovs [][]byte, offset int64) (n int, err error) {
 | 
				
			||||||
	iovecs := bytes2iovec(iovs)
 | 
						iovecs := make([]Iovec, 0, minIovec)
 | 
				
			||||||
 | 
						iovecs = appendBytes(iovecs, iovs)
 | 
				
			||||||
	if raceenabled {
 | 
						if raceenabled {
 | 
				
			||||||
		raceReleaseMerge(unsafe.Pointer(&ioSync))
 | 
							raceReleaseMerge(unsafe.Pointer(&ioSync))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -2050,7 +2071,8 @@ func Pwritev(fd int, iovs [][]byte, offset int64) (n int, err error) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Pwritev2(fd int, iovs [][]byte, offset int64, flags int) (n int, err error) {
 | 
					func Pwritev2(fd int, iovs [][]byte, offset int64, flags int) (n int, err error) {
 | 
				
			||||||
	iovecs := bytes2iovec(iovs)
 | 
						iovecs := make([]Iovec, 0, minIovec)
 | 
				
			||||||
 | 
						iovecs = appendBytes(iovecs, iovs)
 | 
				
			||||||
	if raceenabled {
 | 
						if raceenabled {
 | 
				
			||||||
		raceReleaseMerge(unsafe.Pointer(&ioSync))
 | 
							raceReleaseMerge(unsafe.Pointer(&ioSync))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -2193,7 +2215,7 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {
 | 
				
			||||||
			gid = Getgid()
 | 
								gid = Getgid()
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if uint32(gid) == st.Gid || isGroupMember(gid) {
 | 
							if uint32(gid) == st.Gid || isGroupMember(int(st.Gid)) {
 | 
				
			||||||
			fmode = (st.Mode >> 3) & 7
 | 
								fmode = (st.Mode >> 3) & 7
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			fmode = st.Mode & 7
 | 
								fmode = st.Mode & 7
 | 
				
			||||||
| 
						 | 
					@ -2245,7 +2267,7 @@ func (fh *FileHandle) Bytes() []byte {
 | 
				
			||||||
	if n == 0 {
 | 
						if n == 0 {
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return (*[1 << 30]byte)(unsafe.Pointer(uintptr(unsafe.Pointer(&fh.fileHandle.Type)) + 4))[:n:n]
 | 
						return unsafe.Slice((*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(&fh.fileHandle.Type))+4)), n)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NameToHandleAt wraps the name_to_handle_at system call; it obtains
 | 
					// NameToHandleAt wraps the name_to_handle_at system call; it obtains
 | 
				
			||||||
| 
						 | 
					@ -2308,17 +2330,73 @@ type RemoteIovec struct {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	PidfdOpen(pid int, flags int) (fd int, err error) = SYS_PIDFD_OPEN
 | 
					//sys	PidfdOpen(pid int, flags int) (fd int, err error) = SYS_PIDFD_OPEN
 | 
				
			||||||
//sys	PidfdGetfd(pidfd int, targetfd int, flags int) (fd int, err error) = SYS_PIDFD_GETFD
 | 
					//sys	PidfdGetfd(pidfd int, targetfd int, flags int) (fd int, err error) = SYS_PIDFD_GETFD
 | 
				
			||||||
 | 
					//sys	PidfdSendSignal(pidfd int, sig Signal, info *Siginfo, flags int) (err error) = SYS_PIDFD_SEND_SIGNAL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	shmat(id int, addr uintptr, flag int) (ret uintptr, err error)
 | 
					//sys	shmat(id int, addr uintptr, flag int) (ret uintptr, err error)
 | 
				
			||||||
//sys	shmctl(id int, cmd int, buf *SysvShmDesc) (result int, err error)
 | 
					//sys	shmctl(id int, cmd int, buf *SysvShmDesc) (result int, err error)
 | 
				
			||||||
//sys	shmdt(addr uintptr) (err error)
 | 
					//sys	shmdt(addr uintptr) (err error)
 | 
				
			||||||
//sys	shmget(key int, size int, flag int) (id int, err error)
 | 
					//sys	shmget(key int, size int, flag int) (id int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	getitimer(which int, currValue *Itimerval) (err error)
 | 
				
			||||||
 | 
					//sys	setitimer(which int, newValue *Itimerval, oldValue *Itimerval) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MakeItimerval creates an Itimerval from interval and value durations.
 | 
				
			||||||
 | 
					func MakeItimerval(interval, value time.Duration) Itimerval {
 | 
				
			||||||
 | 
						return Itimerval{
 | 
				
			||||||
 | 
							Interval: NsecToTimeval(interval.Nanoseconds()),
 | 
				
			||||||
 | 
							Value:    NsecToTimeval(value.Nanoseconds()),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// A value which may be passed to the which parameter for Getitimer and
 | 
				
			||||||
 | 
					// Setitimer.
 | 
				
			||||||
 | 
					type ItimerWhich int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Possible which values for Getitimer and Setitimer.
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						ItimerReal    ItimerWhich = ITIMER_REAL
 | 
				
			||||||
 | 
						ItimerVirtual ItimerWhich = ITIMER_VIRTUAL
 | 
				
			||||||
 | 
						ItimerProf    ItimerWhich = ITIMER_PROF
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Getitimer wraps getitimer(2) to return the current value of the timer
 | 
				
			||||||
 | 
					// specified by which.
 | 
				
			||||||
 | 
					func Getitimer(which ItimerWhich) (Itimerval, error) {
 | 
				
			||||||
 | 
						var it Itimerval
 | 
				
			||||||
 | 
						if err := getitimer(int(which), &it); err != nil {
 | 
				
			||||||
 | 
							return Itimerval{}, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return it, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Setitimer wraps setitimer(2) to arm or disarm the timer specified by which.
 | 
				
			||||||
 | 
					// It returns the previous value of the timer.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// If the Itimerval argument is the zero value, the timer will be disarmed.
 | 
				
			||||||
 | 
					func Setitimer(which ItimerWhich, it Itimerval) (Itimerval, error) {
 | 
				
			||||||
 | 
						var prev Itimerval
 | 
				
			||||||
 | 
						if err := setitimer(int(which), &it, &prev); err != nil {
 | 
				
			||||||
 | 
							return Itimerval{}, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return prev, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb	rtSigprocmask(how int, set *Sigset_t, oldset *Sigset_t, sigsetsize uintptr) (err error) = SYS_RT_SIGPROCMASK
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func PthreadSigmask(how int, set, oldset *Sigset_t) error {
 | 
				
			||||||
 | 
						if oldset != nil {
 | 
				
			||||||
 | 
							// Explicitly clear in case Sigset_t is larger than _C__NSIG.
 | 
				
			||||||
 | 
							*oldset = Sigset_t{}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return rtSigprocmask(how, set, oldset, _C__NSIG/8)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Unimplemented
 | 
					 * Unimplemented
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
// AfsSyscall
 | 
					// AfsSyscall
 | 
				
			||||||
// Alarm
 | 
					 | 
				
			||||||
// ArchPrctl
 | 
					// ArchPrctl
 | 
				
			||||||
// Brk
 | 
					// Brk
 | 
				
			||||||
// ClockNanosleep
 | 
					// ClockNanosleep
 | 
				
			||||||
| 
						 | 
					@ -2334,7 +2412,6 @@ type RemoteIovec struct {
 | 
				
			||||||
// GetMempolicy
 | 
					// GetMempolicy
 | 
				
			||||||
// GetRobustList
 | 
					// GetRobustList
 | 
				
			||||||
// GetThreadArea
 | 
					// GetThreadArea
 | 
				
			||||||
// Getitimer
 | 
					 | 
				
			||||||
// Getpmsg
 | 
					// Getpmsg
 | 
				
			||||||
// IoCancel
 | 
					// IoCancel
 | 
				
			||||||
// IoDestroy
 | 
					// IoDestroy
 | 
				
			||||||
| 
						 | 
					@ -2374,7 +2451,6 @@ type RemoteIovec struct {
 | 
				
			||||||
// RestartSyscall
 | 
					// RestartSyscall
 | 
				
			||||||
// RtSigaction
 | 
					// RtSigaction
 | 
				
			||||||
// RtSigpending
 | 
					// RtSigpending
 | 
				
			||||||
// RtSigprocmask
 | 
					 | 
				
			||||||
// RtSigqueueinfo
 | 
					// RtSigqueueinfo
 | 
				
			||||||
// RtSigreturn
 | 
					// RtSigreturn
 | 
				
			||||||
// RtSigsuspend
 | 
					// RtSigsuspend
 | 
				
			||||||
| 
						 | 
					@ -2412,5 +2488,4 @@ type RemoteIovec struct {
 | 
				
			||||||
// Vfork
 | 
					// Vfork
 | 
				
			||||||
// Vhangup
 | 
					// Vhangup
 | 
				
			||||||
// Vserver
 | 
					// Vserver
 | 
				
			||||||
// Waitid
 | 
					 | 
				
			||||||
// _Sysctl
 | 
					// _Sysctl
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,16 +35,12 @@ func setTimeval(sec, usec int64) Timeval {
 | 
				
			||||||
//sys	Iopl(level int) (err error)
 | 
					//sys	Iopl(level int) (err error)
 | 
				
			||||||
//sys	Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32
 | 
					//sys	Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32
 | 
				
			||||||
//sys	Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
 | 
					//sys	Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
 | 
				
			||||||
//sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
					//sys	pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
					//sys	pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 | 
					//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 | 
				
			||||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
 | 
					//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
 | 
				
			||||||
//sys	setfsgid(gid int) (prev int, err error) = SYS_SETFSGID32
 | 
					//sys	setfsgid(gid int) (prev int, err error) = SYS_SETFSGID32
 | 
				
			||||||
//sys	setfsuid(uid int) (prev int, err error) = SYS_SETFSUID32
 | 
					//sys	setfsuid(uid int) (prev int, err error) = SYS_SETFSUID32
 | 
				
			||||||
//sysnb	Setregid(rgid int, egid int) (err error) = SYS_SETREGID32
 | 
					 | 
				
			||||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32
 | 
					 | 
				
			||||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32
 | 
					 | 
				
			||||||
//sysnb	Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32
 | 
					 | 
				
			||||||
//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
 | 
					//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
 | 
				
			||||||
//sys	Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
 | 
					//sys	Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
 | 
				
			||||||
//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 | 
					//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 | 
				
			||||||
| 
						 | 
					@ -173,14 +169,6 @@ const (
 | 
				
			||||||
	_SENDMMSG    = 20
 | 
						_SENDMMSG    = 20
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {
 | 
					 | 
				
			||||||
	fd, e := socketcall(_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)
 | 
					 | 
				
			||||||
	if e != 0 {
 | 
					 | 
				
			||||||
		err = e
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {
 | 
					func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {
 | 
				
			||||||
	fd, e := socketcall(_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)
 | 
						fd, e := socketcall(_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)
 | 
				
			||||||
	if e != 0 {
 | 
						if e != 0 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,14 @@
 | 
				
			||||||
 | 
					// Copyright 2022 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:build linux && (386 || amd64 || mips || mipsle || mips64 || mipsle || ppc64 || ppc64le || ppc || s390x || sparc64)
 | 
				
			||||||
 | 
					// +build linux
 | 
				
			||||||
 | 
					// +build 386 amd64 mips mipsle mips64 mipsle ppc64 ppc64le ppc s390x sparc64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SYS_ALARM is not defined on arm or riscv, but is available for other GOARCH
 | 
				
			||||||
 | 
					// values.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	Alarm(seconds uint) (remaining uint, err error)
 | 
				
			||||||
| 
						 | 
					@ -28,9 +28,10 @@ func Lstat(path string, stat *Stat_t) (err error) {
 | 
				
			||||||
	return Fstatat(AT_FDCWD, path, stat, AT_SYMLINK_NOFOLLOW)
 | 
						return Fstatat(AT_FDCWD, path, stat, AT_SYMLINK_NOFOLLOW)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	MemfdSecret(flags int) (fd int, err error)
 | 
				
			||||||
//sys	Pause() (err error)
 | 
					//sys	Pause() (err error)
 | 
				
			||||||
//sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
					//sys	pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
					//sys	pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 | 
					//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 | 
				
			||||||
//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
					//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,11 +46,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err
 | 
				
			||||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
					//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
				
			||||||
//sys	setfsgid(gid int) (prev int, err error)
 | 
					//sys	setfsgid(gid int) (prev int, err error)
 | 
				
			||||||
//sys	setfsuid(uid int) (prev int, err error)
 | 
					//sys	setfsuid(uid int) (prev int, err error)
 | 
				
			||||||
//sysnb	Setregid(rgid int, egid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
					//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
				
			||||||
//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
					 | 
				
			||||||
//sys	Shutdown(fd int, how 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	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -62,7 +59,6 @@ func Stat(path string, stat *Stat_t) (err error) {
 | 
				
			||||||
//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 | 
					//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 | 
				
			||||||
//sys	Truncate(path string, length int64) (err error)
 | 
					//sys	Truncate(path string, length int64) (err error)
 | 
				
			||||||
//sys	Ustat(dev int, ubuf *Ustat_t) (err error)
 | 
					//sys	Ustat(dev int, ubuf *Ustat_t) (err error)
 | 
				
			||||||
//sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
 | 
					 | 
				
			||||||
//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
					//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
				
			||||||
//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
					//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
					//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,7 +27,6 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 | 
				
			||||||
	return newoffset, nil
 | 
						return newoffset, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
 | 
					 | 
				
			||||||
//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
					//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
				
			||||||
//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
					//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
					//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
| 
						 | 
					@ -63,10 +62,6 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 | 
				
			||||||
//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
 | 
					//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
 | 
				
			||||||
//sys	setfsgid(gid int) (prev int, err error) = SYS_SETFSGID32
 | 
					//sys	setfsgid(gid int) (prev int, err error) = SYS_SETFSGID32
 | 
				
			||||||
//sys	setfsuid(uid int) (prev int, err error) = SYS_SETFSUID32
 | 
					//sys	setfsuid(uid int) (prev int, err error) = SYS_SETFSUID32
 | 
				
			||||||
//sysnb	Setregid(rgid int, egid int) (err error) = SYS_SETREGID32
 | 
					 | 
				
			||||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32
 | 
					 | 
				
			||||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32
 | 
					 | 
				
			||||||
//sysnb	Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32
 | 
					 | 
				
			||||||
//sys	Shutdown(fd int, how int) (err error)
 | 
					//sys	Shutdown(fd int, how int) (err error)
 | 
				
			||||||
//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
 | 
					//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
 | 
				
			||||||
//sys	Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
 | 
					//sys	Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
 | 
				
			||||||
| 
						 | 
					@ -97,8 +92,8 @@ func Utime(path string, buf *Utimbuf) error {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	utimes(path string, times *[2]Timeval) (err error)
 | 
					//sys	utimes(path string, times *[2]Timeval) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
					//sys	pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
					//sys	pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
//sys	Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
 | 
					//sys	Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
 | 
				
			||||||
//sys	Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64
 | 
					//sys	Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,8 +22,9 @@ import "unsafe"
 | 
				
			||||||
//sysnb	getrlimit(resource int, rlim *Rlimit) (err error)
 | 
					//sysnb	getrlimit(resource int, rlim *Rlimit) (err error)
 | 
				
			||||||
//sysnb	Getuid() (uid int)
 | 
					//sysnb	Getuid() (uid int)
 | 
				
			||||||
//sys	Listen(s int, n int) (err error)
 | 
					//sys	Listen(s int, n int) (err error)
 | 
				
			||||||
//sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
					//sys	MemfdSecret(flags int) (fd int, err error)
 | 
				
			||||||
//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
					//sys	pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
 | 
					//sys	pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 | 
					//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 | 
				
			||||||
//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
					//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,11 +39,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err
 | 
				
			||||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
					//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
				
			||||||
//sys	setfsgid(gid int) (prev int, err error)
 | 
					//sys	setfsgid(gid int) (prev int, err error)
 | 
				
			||||||
//sys	setfsuid(uid int) (prev int, err error)
 | 
					//sys	setfsuid(uid int) (prev int, err error)
 | 
				
			||||||
//sysnb	Setregid(rgid int, egid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	setrlimit(resource int, rlim *Rlimit) (err error)
 | 
					//sysnb	setrlimit(resource int, rlim *Rlimit) (err error)
 | 
				
			||||||
//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
					 | 
				
			||||||
//sys	Shutdown(fd int, how 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	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -66,7 +63,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) {
 | 
				
			||||||
	return ENOSYS
 | 
						return ENOSYS
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
 | 
					 | 
				
			||||||
//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
					//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
				
			||||||
//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
					//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
					//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,222 @@
 | 
				
			||||||
 | 
					// Copyright 2022 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:build loong64 && linux
 | 
				
			||||||
 | 
					// +build loong64,linux
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "unsafe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT
 | 
				
			||||||
 | 
					//sys	Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64
 | 
				
			||||||
 | 
					//sys	Fchown(fd int, uid int, gid int) (err error)
 | 
				
			||||||
 | 
					//sys	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	Listen(s int, n int) (err error)
 | 
				
			||||||
 | 
					//sys	pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
 | 
					//sys	pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
 | 
					//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
 | 
				
			||||||
 | 
						var ts *Timespec
 | 
				
			||||||
 | 
						if timeout != nil {
 | 
				
			||||||
 | 
							ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return Pselect(nfd, r, w, e, ts, nil)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
				
			||||||
 | 
					//sys	setfsgid(gid int) (prev int, err error)
 | 
				
			||||||
 | 
					//sys	setfsuid(uid int) (prev int, err error)
 | 
				
			||||||
 | 
					//sys	Shutdown(fd int, how int) (err error)
 | 
				
			||||||
 | 
					//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func timespecFromStatxTimestamp(x StatxTimestamp) Timespec {
 | 
				
			||||||
 | 
						return Timespec{
 | 
				
			||||||
 | 
							Sec:  x.Sec,
 | 
				
			||||||
 | 
							Nsec: int64(x.Nsec),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Fstatat(fd int, path string, stat *Stat_t, flags int) error {
 | 
				
			||||||
 | 
						var r Statx_t
 | 
				
			||||||
 | 
						// Do it the glibc way, add AT_NO_AUTOMOUNT.
 | 
				
			||||||
 | 
						if err := Statx(fd, path, AT_NO_AUTOMOUNT|flags, STATX_BASIC_STATS, &r); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						stat.Dev = Mkdev(r.Dev_major, r.Dev_minor)
 | 
				
			||||||
 | 
						stat.Ino = r.Ino
 | 
				
			||||||
 | 
						stat.Mode = uint32(r.Mode)
 | 
				
			||||||
 | 
						stat.Nlink = r.Nlink
 | 
				
			||||||
 | 
						stat.Uid = r.Uid
 | 
				
			||||||
 | 
						stat.Gid = r.Gid
 | 
				
			||||||
 | 
						stat.Rdev = Mkdev(r.Rdev_major, r.Rdev_minor)
 | 
				
			||||||
 | 
						// hope we don't get to process files so large to overflow these size
 | 
				
			||||||
 | 
						// fields...
 | 
				
			||||||
 | 
						stat.Size = int64(r.Size)
 | 
				
			||||||
 | 
						stat.Blksize = int32(r.Blksize)
 | 
				
			||||||
 | 
						stat.Blocks = int64(r.Blocks)
 | 
				
			||||||
 | 
						stat.Atim = timespecFromStatxTimestamp(r.Atime)
 | 
				
			||||||
 | 
						stat.Mtim = timespecFromStatxTimestamp(r.Mtime)
 | 
				
			||||||
 | 
						stat.Ctim = timespecFromStatxTimestamp(r.Ctime)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Fstat(fd int, stat *Stat_t) (err error) {
 | 
				
			||||||
 | 
						return Fstatat(fd, "", stat, AT_EMPTY_PATH)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Stat(path string, stat *Stat_t) (err error) {
 | 
				
			||||||
 | 
						return Fstatat(AT_FDCWD, path, stat, 0)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Lchown(path string, uid int, gid int) (err error) {
 | 
				
			||||||
 | 
						return Fchownat(AT_FDCWD, path, uid, gid, AT_SYMLINK_NOFOLLOW)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Lstat(path string, stat *Stat_t) (err error) {
 | 
				
			||||||
 | 
						return Fstatat(AT_FDCWD, path, stat, AT_SYMLINK_NOFOLLOW)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	Statfs(path string, buf *Statfs_t) (err error)
 | 
				
			||||||
 | 
					//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 | 
				
			||||||
 | 
					//sys	Truncate(path string, length int64) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Ustat(dev int, ubuf *Ustat_t) (err error) {
 | 
				
			||||||
 | 
						return ENOSYS
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sysnb	getgroups(n int, list *_Gid_t) (nn int, err error)
 | 
				
			||||||
 | 
					//sysnb	setgroups(n int, list *_Gid_t) (err error)
 | 
				
			||||||
 | 
					//sys	getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
 | 
				
			||||||
 | 
					//sysnb	socket(domain int, typ int, proto int) (fd int, err error)
 | 
				
			||||||
 | 
					//sysnb	socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)
 | 
				
			||||||
 | 
					//sysnb	getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sysnb	getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
 | 
				
			||||||
 | 
					//sys	sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb	Gettimeofday(tv *Timeval) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func setTimespec(sec, nsec int64) Timespec {
 | 
				
			||||||
 | 
						return Timespec{Sec: sec, Nsec: nsec}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func setTimeval(sec, usec int64) Timeval {
 | 
				
			||||||
 | 
						return Timeval{Sec: sec, Usec: usec}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getrlimit(resource int, rlim *Rlimit) (err error) {
 | 
				
			||||||
 | 
						err = Prlimit(0, resource, nil, rlim)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Setrlimit(resource int, rlim *Rlimit) (err error) {
 | 
				
			||||||
 | 
						err = Prlimit(0, resource, rlim, nil)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func futimesat(dirfd int, path string, tv *[2]Timeval) (err error) {
 | 
				
			||||||
 | 
						if tv == nil {
 | 
				
			||||||
 | 
							return utimensat(dirfd, path, nil, 0)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ts := []Timespec{
 | 
				
			||||||
 | 
							NsecToTimespec(TimevalToNsec(tv[0])),
 | 
				
			||||||
 | 
							NsecToTimespec(TimevalToNsec(tv[1])),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Time(t *Time_t) (Time_t, error) {
 | 
				
			||||||
 | 
						var tv Timeval
 | 
				
			||||||
 | 
						err := Gettimeofday(&tv)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if t != nil {
 | 
				
			||||||
 | 
							*t = Time_t(tv.Sec)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return Time_t(tv.Sec), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Utime(path string, buf *Utimbuf) error {
 | 
				
			||||||
 | 
						tv := []Timeval{
 | 
				
			||||||
 | 
							{Sec: buf.Actime},
 | 
				
			||||||
 | 
							{Sec: buf.Modtime},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return Utimes(path, tv)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func utimes(path string, tv *[2]Timeval) (err error) {
 | 
				
			||||||
 | 
						if tv == nil {
 | 
				
			||||||
 | 
							return utimensat(AT_FDCWD, path, nil, 0)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ts := []Timespec{
 | 
				
			||||||
 | 
							NsecToTimespec(TimevalToNsec(tv[0])),
 | 
				
			||||||
 | 
							NsecToTimespec(TimevalToNsec(tv[1])),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *PtraceRegs) PC() uint64 { return r.Era }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *PtraceRegs) SetPC(era uint64) { r.Era = era }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetIovlen(length int) {
 | 
				
			||||||
 | 
						msghdr.Iovlen = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (rsa *RawSockaddrNFCLLCP) SetServiceNameLen(length int) {
 | 
				
			||||||
 | 
						rsa.Service_name_len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pause() error {
 | 
				
			||||||
 | 
						_, err := ppoll(nil, 0, nil, nil)
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) {
 | 
				
			||||||
 | 
						return Renameat2(olddirfd, oldpath, newdirfd, newpath, 0)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error {
 | 
				
			||||||
 | 
						cmdlineLen := len(cmdline)
 | 
				
			||||||
 | 
						if cmdlineLen > 0 {
 | 
				
			||||||
 | 
							// Account for the additional NULL byte added by
 | 
				
			||||||
 | 
							// BytePtrFromString in kexecFileLoad. The kexec_file_load
 | 
				
			||||||
 | 
							// syscall expects a NULL-terminated string.
 | 
				
			||||||
 | 
							cmdlineLen++
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -21,8 +21,8 @@ package unix
 | 
				
			||||||
//sys	Lchown(path string, uid int, gid int) (err error)
 | 
					//sys	Lchown(path string, uid int, gid int) (err error)
 | 
				
			||||||
//sys	Listen(s int, n int) (err error)
 | 
					//sys	Listen(s int, n int) (err error)
 | 
				
			||||||
//sys	Pause() (err error)
 | 
					//sys	Pause() (err error)
 | 
				
			||||||
//sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
					//sys	pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
					//sys	pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 | 
					//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 | 
				
			||||||
//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
					//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,18 +37,13 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err
 | 
				
			||||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
					//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
				
			||||||
//sys	setfsgid(gid int) (prev int, err error)
 | 
					//sys	setfsgid(gid int) (prev int, err error)
 | 
				
			||||||
//sys	setfsuid(uid int) (prev int, err error)
 | 
					//sys	setfsuid(uid int) (prev int, err error)
 | 
				
			||||||
//sysnb	Setregid(rgid int, egid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
					//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
				
			||||||
//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
					 | 
				
			||||||
//sys	Shutdown(fd int, how 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	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
				
			||||||
//sys	Statfs(path string, buf *Statfs_t) (err error)
 | 
					//sys	Statfs(path string, buf *Statfs_t) (err error)
 | 
				
			||||||
//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 | 
					//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 | 
				
			||||||
//sys	Truncate(path string, length int64) (err error)
 | 
					//sys	Truncate(path string, length int64) (err error)
 | 
				
			||||||
//sys	Ustat(dev int, ubuf *Ustat_t) (err error)
 | 
					//sys	Ustat(dev int, ubuf *Ustat_t) (err error)
 | 
				
			||||||
//sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
 | 
					 | 
				
			||||||
//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
					//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
				
			||||||
//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
					//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
					//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,23 +25,18 @@ func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr,
 | 
				
			||||||
//sysnb	Getuid() (uid int)
 | 
					//sysnb	Getuid() (uid int)
 | 
				
			||||||
//sys	Lchown(path string, uid int, gid int) (err error)
 | 
					//sys	Lchown(path string, uid int, gid int) (err error)
 | 
				
			||||||
//sys	Listen(s int, n int) (err error)
 | 
					//sys	Listen(s int, n int) (err error)
 | 
				
			||||||
//sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
					//sys	pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
					//sys	pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 | 
					//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 | 
				
			||||||
//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
 | 
					//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
 | 
				
			||||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
 | 
					//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
 | 
				
			||||||
//sys	setfsgid(gid int) (prev int, err error)
 | 
					//sys	setfsgid(gid int) (prev int, err error)
 | 
				
			||||||
//sys	setfsuid(uid int) (prev int, err error)
 | 
					//sys	setfsuid(uid int) (prev int, err error)
 | 
				
			||||||
//sysnb	Setregid(rgid int, egid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
					 | 
				
			||||||
//sys	Shutdown(fd int, how int) (err error)
 | 
					//sys	Shutdown(fd int, how int) (err error)
 | 
				
			||||||
//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
 | 
					//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
 | 
				
			||||||
//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 | 
					//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 | 
				
			||||||
//sys	Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
 | 
					//sys	Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
 | 
				
			||||||
//sys	Ustat(dev int, ubuf *Ustat_t) (err error)
 | 
					//sys	Ustat(dev int, ubuf *Ustat_t) (err error)
 | 
				
			||||||
//sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
 | 
					 | 
				
			||||||
//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
					//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
				
			||||||
//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
					//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
					//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,23 +27,18 @@ import (
 | 
				
			||||||
//sys	Listen(s int, n int) (err error)
 | 
					//sys	Listen(s int, n int) (err error)
 | 
				
			||||||
//sys	Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
 | 
					//sys	Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
 | 
				
			||||||
//sys	Pause() (err error)
 | 
					//sys	Pause() (err error)
 | 
				
			||||||
//sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
					//sys	pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
					//sys	pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 | 
					//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 | 
				
			||||||
//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
 | 
					//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
 | 
				
			||||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
 | 
					//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
 | 
				
			||||||
//sys	setfsgid(gid int) (prev int, err error)
 | 
					//sys	setfsgid(gid int) (prev int, err error)
 | 
				
			||||||
//sys	setfsuid(uid int) (prev int, err error)
 | 
					//sys	setfsuid(uid int) (prev int, err error)
 | 
				
			||||||
//sysnb	Setregid(rgid int, egid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
					 | 
				
			||||||
//sys	Shutdown(fd int, how int) (err error)
 | 
					//sys	Shutdown(fd int, how int) (err error)
 | 
				
			||||||
//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
 | 
					//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
 | 
				
			||||||
//sys	Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
 | 
					//sys	Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
 | 
				
			||||||
//sys	Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
 | 
					//sys	Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
 | 
				
			||||||
//sys	Ustat(dev int, ubuf *Ustat_t) (err error)
 | 
					//sys	Ustat(dev int, ubuf *Ustat_t) (err error)
 | 
				
			||||||
//sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
 | 
					 | 
				
			||||||
//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
					//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
				
			||||||
//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
					//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
					//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,26 +26,21 @@ package unix
 | 
				
			||||||
//sys	Listen(s int, n int) (err error)
 | 
					//sys	Listen(s int, n int) (err error)
 | 
				
			||||||
//sys	Lstat(path string, stat *Stat_t) (err error)
 | 
					//sys	Lstat(path string, stat *Stat_t) (err error)
 | 
				
			||||||
//sys	Pause() (err error)
 | 
					//sys	Pause() (err error)
 | 
				
			||||||
//sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
					//sys	pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
					//sys	pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 | 
					//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 | 
				
			||||||
//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
					//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
				
			||||||
//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
 | 
					//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
 | 
				
			||||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
					//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
				
			||||||
//sys	setfsgid(gid int) (prev int, err error)
 | 
					//sys	setfsgid(gid int) (prev int, err error)
 | 
				
			||||||
//sys	setfsuid(uid int) (prev int, err error)
 | 
					//sys	setfsuid(uid int) (prev int, err error)
 | 
				
			||||||
//sysnb	Setregid(rgid int, egid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
					//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
				
			||||||
//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
					 | 
				
			||||||
//sys	Shutdown(fd int, how 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	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
				
			||||||
//sys	Stat(path string, stat *Stat_t) (err error)
 | 
					//sys	Stat(path string, stat *Stat_t) (err error)
 | 
				
			||||||
//sys	Statfs(path string, buf *Statfs_t) (err error)
 | 
					//sys	Statfs(path string, buf *Statfs_t) (err error)
 | 
				
			||||||
//sys	Truncate(path string, length int64) (err error)
 | 
					//sys	Truncate(path string, length int64) (err error)
 | 
				
			||||||
//sys	Ustat(dev int, ubuf *Ustat_t) (err error)
 | 
					//sys	Ustat(dev int, ubuf *Ustat_t) (err error)
 | 
				
			||||||
//sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
 | 
					 | 
				
			||||||
//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
					//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
				
			||||||
//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
					//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
					//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,8 +22,9 @@ import "unsafe"
 | 
				
			||||||
//sysnb	Getrlimit(resource int, rlim *Rlimit) (err error)
 | 
					//sysnb	Getrlimit(resource int, rlim *Rlimit) (err error)
 | 
				
			||||||
//sysnb	Getuid() (uid int)
 | 
					//sysnb	Getuid() (uid int)
 | 
				
			||||||
//sys	Listen(s int, n int) (err error)
 | 
					//sys	Listen(s int, n int) (err error)
 | 
				
			||||||
//sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
					//sys	MemfdSecret(flags int) (fd int, err error)
 | 
				
			||||||
//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
					//sys	pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
 | 
					//sys	pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
					//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
 | 
					func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
 | 
				
			||||||
| 
						 | 
					@ -37,11 +38,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err
 | 
				
			||||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
					//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
				
			||||||
//sys	setfsgid(gid int) (prev int, err error)
 | 
					//sys	setfsgid(gid int) (prev int, err error)
 | 
				
			||||||
//sys	setfsuid(uid int) (prev int, err error)
 | 
					//sys	setfsuid(uid int) (prev int, err error)
 | 
				
			||||||
//sysnb	Setregid(rgid int, egid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
					//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
				
			||||||
//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
					 | 
				
			||||||
//sys	Shutdown(fd int, how 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	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -65,7 +62,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) {
 | 
				
			||||||
	return ENOSYS
 | 
						return ENOSYS
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
 | 
					 | 
				
			||||||
//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
					//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
				
			||||||
//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
					//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
					//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,19 +26,15 @@ import (
 | 
				
			||||||
//sys	Lchown(path string, uid int, gid int) (err error)
 | 
					//sys	Lchown(path string, uid int, gid int) (err error)
 | 
				
			||||||
//sys	Lstat(path string, stat *Stat_t) (err error)
 | 
					//sys	Lstat(path string, stat *Stat_t) (err error)
 | 
				
			||||||
//sys	Pause() (err error)
 | 
					//sys	Pause() (err error)
 | 
				
			||||||
//sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
					//sys	pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
					//sys	pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 | 
					//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 | 
				
			||||||
//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
					//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
				
			||||||
//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
 | 
					//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
 | 
				
			||||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
					//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
				
			||||||
//sys	setfsgid(gid int) (prev int, err error)
 | 
					//sys	setfsgid(gid int) (prev int, err error)
 | 
				
			||||||
//sys	setfsuid(uid int) (prev int, err error)
 | 
					//sys	setfsuid(uid int) (prev int, err error)
 | 
				
			||||||
//sysnb	Setregid(rgid int, egid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
					//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
				
			||||||
//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
					 | 
				
			||||||
//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
					//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
				
			||||||
//sys	Stat(path string, stat *Stat_t) (err error)
 | 
					//sys	Stat(path string, stat *Stat_t) (err error)
 | 
				
			||||||
//sys	Statfs(path string, buf *Statfs_t) (err error)
 | 
					//sys	Statfs(path string, buf *Statfs_t) (err error)
 | 
				
			||||||
| 
						 | 
					@ -145,15 +141,6 @@ const (
 | 
				
			||||||
	netSendMMsg    = 20
 | 
						netSendMMsg    = 20
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (int, error) {
 | 
					 | 
				
			||||||
	args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))}
 | 
					 | 
				
			||||||
	fd, _, err := Syscall(SYS_SOCKETCALL, netAccept, uintptr(unsafe.Pointer(&args)), 0)
 | 
					 | 
				
			||||||
	if err != 0 {
 | 
					 | 
				
			||||||
		return 0, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return int(fd), nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (int, error) {
 | 
					func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (int, error) {
 | 
				
			||||||
	args := [4]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags)}
 | 
						args := [4]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags)}
 | 
				
			||||||
	fd, _, err := Syscall(SYS_SOCKETCALL, netAccept4, uintptr(unsafe.Pointer(&args)), 0)
 | 
						fd, _, err := Syscall(SYS_SOCKETCALL, netAccept4, uintptr(unsafe.Pointer(&args)), 0)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,26 +23,21 @@ package unix
 | 
				
			||||||
//sys	Listen(s int, n int) (err error)
 | 
					//sys	Listen(s int, n int) (err error)
 | 
				
			||||||
//sys	Lstat(path string, stat *Stat_t) (err error)
 | 
					//sys	Lstat(path string, stat *Stat_t) (err error)
 | 
				
			||||||
//sys	Pause() (err error)
 | 
					//sys	Pause() (err error)
 | 
				
			||||||
//sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
					//sys	pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
					//sys	pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 | 
					//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 | 
				
			||||||
//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
					//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
				
			||||||
//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
 | 
					//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
 | 
				
			||||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
					//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
				
			||||||
//sys	setfsgid(gid int) (prev int, err error)
 | 
					//sys	setfsgid(gid int) (prev int, err error)
 | 
				
			||||||
//sys	setfsuid(uid int) (prev int, err error)
 | 
					//sys	setfsuid(uid int) (prev int, err error)
 | 
				
			||||||
//sysnb	Setregid(rgid int, egid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
					 | 
				
			||||||
//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
					//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
				
			||||||
//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
					 | 
				
			||||||
//sys	Shutdown(fd int, how 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	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
				
			||||||
//sys	Stat(path string, stat *Stat_t) (err error)
 | 
					//sys	Stat(path string, stat *Stat_t) (err error)
 | 
				
			||||||
//sys	Statfs(path string, buf *Statfs_t) (err error)
 | 
					//sys	Statfs(path string, buf *Statfs_t) (err error)
 | 
				
			||||||
//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 | 
					//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 | 
				
			||||||
//sys	Truncate(path string, length int64) (err error)
 | 
					//sys	Truncate(path string, length int64) (err error)
 | 
				
			||||||
//sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
 | 
					 | 
				
			||||||
//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
					//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
				
			||||||
//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
					//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
					//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -110,6 +110,20 @@ func direntNamlen(buf []byte) (uint64, bool) {
 | 
				
			||||||
	return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
 | 
						return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SysctlUvmexp(name string) (*Uvmexp, error) {
 | 
				
			||||||
 | 
						mib, err := sysctlmib(name)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						n := uintptr(SizeofUvmexp)
 | 
				
			||||||
 | 
						var u Uvmexp
 | 
				
			||||||
 | 
						if err := sysctl(mib, (*byte)(unsafe.Pointer(&u)), &n, nil, 0); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &u, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Pipe(p []int) (err error) {
 | 
					func Pipe(p []int) (err error) {
 | 
				
			||||||
	return Pipe2(p, 0)
 | 
						return Pipe2(p, 0)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -163,11 +177,6 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
 | 
				
			||||||
	return -1, ENOSYS
 | 
						return -1, ENOSYS
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func setattrlistTimes(path string, times []Timespec, flags int) error {
 | 
					 | 
				
			||||||
	// used on Darwin for UtimesNano
 | 
					 | 
				
			||||||
	return ENOSYS
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//sys	ioctl(fd int, req uint, arg uintptr) (err error)
 | 
					//sys	ioctl(fd int, req uint, arg uintptr) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL
 | 
					//sys	sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL
 | 
				
			||||||
| 
						 | 
					@ -250,6 +259,7 @@ func Statvfs(path string, buf *Statvfs_t) (err error) {
 | 
				
			||||||
//sys	Chmod(path string, mode uint32) (err error)
 | 
					//sys	Chmod(path string, mode uint32) (err error)
 | 
				
			||||||
//sys	Chown(path string, uid int, gid int) (err error)
 | 
					//sys	Chown(path string, uid int, gid int) (err error)
 | 
				
			||||||
//sys	Chroot(path string) (err error)
 | 
					//sys	Chroot(path string) (err error)
 | 
				
			||||||
 | 
					//sys	ClockGettime(clockid int32, time *Timespec) (err error)
 | 
				
			||||||
//sys	Close(fd int) (err error)
 | 
					//sys	Close(fd int) (err error)
 | 
				
			||||||
//sys	Dup(fd int) (nfd int, err error)
 | 
					//sys	Dup(fd int) (nfd int, err error)
 | 
				
			||||||
//sys	Dup2(from int, to int) (err error)
 | 
					//sys	Dup2(from int, to int) (err error)
 | 
				
			||||||
| 
						 | 
					@ -313,8 +323,8 @@ func Statvfs(path string, buf *Statvfs_t) (err error) {
 | 
				
			||||||
//sys	Open(path string, mode int, perm uint32) (fd int, err error)
 | 
					//sys	Open(path string, mode int, perm uint32) (fd int, err error)
 | 
				
			||||||
//sys	Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error)
 | 
					//sys	Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error)
 | 
				
			||||||
//sys	Pathconf(path string, name int) (val int, err error)
 | 
					//sys	Pathconf(path string, name int) (val int, err error)
 | 
				
			||||||
//sys	Pread(fd int, p []byte, offset int64) (n int, err error)
 | 
					//sys	pread(fd int, p []byte, offset int64) (n int, err error)
 | 
				
			||||||
//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error)
 | 
					//sys	pwrite(fd int, p []byte, offset int64) (n int, err error)
 | 
				
			||||||
//sys	read(fd int, p []byte) (n int, err error)
 | 
					//sys	read(fd int, p []byte) (n int, err error)
 | 
				
			||||||
//sys	Readlink(path string, buf []byte) (n int, err error)
 | 
					//sys	Readlink(path string, buf []byte) (n int, err error)
 | 
				
			||||||
//sys	Readlinkat(dirfd int, path string, buf []byte) (n int, err error)
 | 
					//sys	Readlinkat(dirfd int, path string, buf []byte) (n int, err error)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -81,6 +81,7 @@ func Pipe(p []int) (err error) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sysnb	pipe2(p *[2]_C_int, flags int) (err error)
 | 
					//sysnb	pipe2(p *[2]_C_int, flags int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Pipe2(p []int, flags int) error {
 | 
					func Pipe2(p []int, flags int) error {
 | 
				
			||||||
	if len(p) != 2 {
 | 
						if len(p) != 2 {
 | 
				
			||||||
		return EINVAL
 | 
							return EINVAL
 | 
				
			||||||
| 
						 | 
					@ -95,6 +96,7 @@ func Pipe2(p []int, flags int) error {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	Getdents(fd int, buf []byte) (n int, err error)
 | 
					//sys	Getdents(fd int, buf []byte) (n int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
 | 
					func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
 | 
				
			||||||
	n, err = Getdents(fd, buf)
 | 
						n, err = Getdents(fd, buf)
 | 
				
			||||||
	if err != nil || basep == nil {
 | 
						if err != nil || basep == nil {
 | 
				
			||||||
| 
						 | 
					@ -149,11 +151,6 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func setattrlistTimes(path string, times []Timespec, flags int) error {
 | 
					 | 
				
			||||||
	// used on Darwin for UtimesNano
 | 
					 | 
				
			||||||
	return ENOSYS
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//sys	ioctl(fd int, req uint, arg uintptr) (err error)
 | 
					//sys	ioctl(fd int, req uint, arg uintptr) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//sys	sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL
 | 
					//sys	sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL
 | 
				
			||||||
| 
						 | 
					@ -223,6 +220,7 @@ func Uname(uname *Utsname) error {
 | 
				
			||||||
//sys	Chmod(path string, mode uint32) (err error)
 | 
					//sys	Chmod(path string, mode uint32) (err error)
 | 
				
			||||||
//sys	Chown(path string, uid int, gid int) (err error)
 | 
					//sys	Chown(path string, uid int, gid int) (err error)
 | 
				
			||||||
//sys	Chroot(path string) (err error)
 | 
					//sys	Chroot(path string) (err error)
 | 
				
			||||||
 | 
					//sys	ClockGettime(clockid int32, time *Timespec) (err error)
 | 
				
			||||||
//sys	Close(fd int) (err error)
 | 
					//sys	Close(fd int) (err error)
 | 
				
			||||||
//sys	Dup(fd int) (nfd int, err error)
 | 
					//sys	Dup(fd int) (nfd int, err error)
 | 
				
			||||||
//sys	Dup2(from int, to int) (err error)
 | 
					//sys	Dup2(from int, to int) (err error)
 | 
				
			||||||
| 
						 | 
					@ -274,8 +272,8 @@ func Uname(uname *Utsname) error {
 | 
				
			||||||
//sys	Open(path string, mode int, perm uint32) (fd int, err error)
 | 
					//sys	Open(path string, mode int, perm uint32) (fd int, err error)
 | 
				
			||||||
//sys	Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error)
 | 
					//sys	Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error)
 | 
				
			||||||
//sys	Pathconf(path string, name int) (val int, err error)
 | 
					//sys	Pathconf(path string, name int) (val int, err error)
 | 
				
			||||||
//sys	Pread(fd int, p []byte, offset int64) (n int, err error)
 | 
					//sys	pread(fd int, p []byte, offset int64) (n int, err error)
 | 
				
			||||||
//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error)
 | 
					//sys	pwrite(fd int, p []byte, offset int64) (n int, err error)
 | 
				
			||||||
//sys	read(fd int, p []byte) (n int, err error)
 | 
					//sys	read(fd int, p []byte) (n int, err error)
 | 
				
			||||||
//sys	Readlink(path string, buf []byte) (n int, err error)
 | 
					//sys	Readlink(path string, buf []byte) (n int, err error)
 | 
				
			||||||
//sys	Readlinkat(dirfd int, path string, buf []byte) (n int, err error)
 | 
					//sys	Readlinkat(dirfd int, path string, buf []byte) (n int, err error)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue